[{"data":1,"prerenderedAt":3554},["ShallowReactive",2],{"navigation-landing-en":3,"navigation-nuxt-auto-en":180,"navigation-nuxt-protokit-en":338,"/docs/nuxt-protokit/advanced/building-a-toolkit-en":444,"/docs/nuxt-protokit/advanced/building-a-toolkit-surround-en":3549},[4,8,13,28,41,51,64,77,94,110,134,150,157,172],{"title":5,"path":6,"stem":7},"Overview","/docs/landing","0.docs/1.landing/001.index",{"title":9,"path":10,"stem":11,"badge":12},"Built-in Features","/docs/landing/built-in-features","0.docs/1.landing/002.built-in-features","New",{"title":14,"path":15,"stem":16,"children":17,"icon":27},"Content Foundation","/docs/landing/content","0.docs/1.landing/02.content/1.index",[18,19,23],{"title":5,"path":15,"stem":16},{"title":20,"path":21,"stem":22},"Details","/docs/landing/content/details","0.docs/1.landing/02.content/2.details",{"title":24,"path":25,"stem":26},"Technical","/docs/landing/content/technical","0.docs/1.landing/02.content/4.technical","i-heroicons-document-text",{"title":29,"path":30,"stem":31,"children":32,"icon":40},"Regional Content","/docs/landing/regional","0.docs/1.landing/03.regional/1.index",[33,34,37],{"title":5,"path":30,"stem":31},{"title":20,"path":35,"stem":36},"/docs/landing/regional/details","0.docs/1.landing/03.regional/2.details",{"title":24,"path":38,"stem":39},"/docs/landing/regional/technical","0.docs/1.landing/03.regional/4.technical","i-heroicons-globe-alt",{"title":42,"path":43,"stem":44,"children":45,"icon":50},"Multi-language","/docs/landing/multilang","0.docs/1.landing/04.multilang/1.index",[46,47],{"title":5,"path":43,"stem":44},{"title":20,"path":48,"stem":49},"/docs/landing/multilang/details","0.docs/1.landing/04.multilang/2.details","i-heroicons-language",{"title":52,"path":53,"stem":54,"children":55,"icon":63},"Blog","/docs/landing/blog","0.docs/1.landing/05.blog/1.index",[56,57,60],{"title":5,"path":53,"stem":54},{"title":20,"path":58,"stem":59},"/docs/landing/blog/details","0.docs/1.landing/05.blog/2.details",{"title":24,"path":61,"stem":62},"/docs/landing/blog/technical","0.docs/1.landing/05.blog/4.technical","i-heroicons-pencil-square",{"title":65,"path":66,"stem":67,"children":68,"icon":76},"Documentation","/docs/landing/docs","0.docs/1.landing/06.docs/1.index",[69,70,73],{"title":5,"path":66,"stem":67},{"title":20,"path":71,"stem":72},"/docs/landing/docs/details","0.docs/1.landing/06.docs/2.details",{"title":24,"path":74,"stem":75},"/docs/landing/docs/technical","0.docs/1.landing/06.docs/4.technical","i-heroicons-book-open",{"title":78,"path":79,"stem":80,"children":81,"icon":93},"Forms","/docs/landing/forms","0.docs/1.landing/07.forms/1.index",[82,83,86,90],{"title":5,"path":79,"stem":80},{"title":20,"path":84,"stem":85},"/docs/landing/forms/details","0.docs/1.landing/07.forms/2.details",{"title":87,"path":88,"stem":89},"Admin","/docs/landing/forms/admin","0.docs/1.landing/07.forms/3.admin",{"title":24,"path":91,"stem":92},"/docs/landing/forms/technical","0.docs/1.landing/07.forms/4.technical","i-heroicons-clipboard-document-list",{"title":95,"path":96,"stem":97,"children":98,"icon":109},"Email","/docs/landing/email","0.docs/1.landing/08.email/1.index",[99,100,103,106],{"title":5,"path":96,"stem":97},{"title":20,"path":101,"stem":102},"/docs/landing/email/details","0.docs/1.landing/08.email/2.details",{"title":87,"path":104,"stem":105},"/docs/landing/email/admin","0.docs/1.landing/08.email/3.admin",{"title":24,"path":107,"stem":108},"/docs/landing/email/technical","0.docs/1.landing/08.email/4.technical","i-heroicons-envelope",{"title":111,"path":112,"stem":113,"children":114,"icon":133},"Feedback Platform","/docs/landing/feedback","0.docs/1.landing/09.feedback/1.index",[115,116,119,122,125,129],{"title":5,"path":112,"stem":113},{"title":20,"path":117,"stem":118},"/docs/landing/feedback/details","0.docs/1.landing/09.feedback/2.details",{"title":87,"path":120,"stem":121},"/docs/landing/feedback/admin","0.docs/1.landing/09.feedback/3.admin",{"title":24,"path":123,"stem":124},"/docs/landing/feedback/technical","0.docs/1.landing/09.feedback/4.technical",{"title":126,"path":127,"stem":128},"Compare vs SaaS","/docs/landing/feedback/compare","0.docs/1.landing/09.feedback/5.compare",{"title":130,"path":131,"stem":132},"FAQ","/docs/landing/feedback/faq","0.docs/1.landing/09.feedback/6.faq","i-heroicons-chat-bubble-left-right",{"title":135,"path":136,"stem":137,"children":138,"icon":149},"Storage","/docs/landing/storage","0.docs/1.landing/10.storage/1.index",[139,140,143,146],{"title":5,"path":136,"stem":137},{"title":20,"path":141,"stem":142},"/docs/landing/storage/details","0.docs/1.landing/10.storage/2.details",{"title":87,"path":144,"stem":145},"/docs/landing/storage/admin","0.docs/1.landing/10.storage/3.admin",{"title":24,"path":147,"stem":148},"/docs/landing/storage/technical","0.docs/1.landing/10.storage/4.technical","i-heroicons-circle-stack",{"title":151,"path":152,"stem":153,"children":154,"icon":156},"Offline First","/docs/landing/offline-first","0.docs/1.landing/11.offline-first/1.index",[155],{"title":151,"path":152,"stem":153},"i-heroicons-users",{"title":158,"path":159,"stem":160,"children":161,"icon":156},"Yjs Sync","/docs/landing/yjs-sync","0.docs/1.landing/12.yjs-sync/1.index",[162,163,166,169],{"title":5,"path":159,"stem":160},{"title":20,"path":164,"stem":165},"/docs/landing/yjs-sync/details","0.docs/1.landing/12.yjs-sync/2.details",{"title":87,"path":167,"stem":168},"/docs/landing/yjs-sync/admin","0.docs/1.landing/12.yjs-sync/3.admin",{"title":24,"path":170,"stem":171},"/docs/landing/yjs-sync/technical","0.docs/1.landing/12.yjs-sync/4.technical",{"title":173,"path":174,"stem":175,"children":176,"badge":178,"icon":179},"Newsletter","/docs/landing/newsletter","0.docs/1.landing/13.newsletter/index",[177],{"title":173,"path":174,"stem":175,"badge":178},"Coming Soon","i-lucide-send",[181,184,202,298],{"title":5,"path":182,"stem":183},"/docs/nuxt-auto","0.docs/3.nuxt-auto/index",{"title":185,"path":186,"stem":187,"children":188,"page":201},"Getting Started","/docs/nuxt-auto/getting-started","0.docs/3.nuxt-auto/1.getting-started",[189,193,197],{"title":190,"path":191,"stem":192},"Introduction","/docs/nuxt-auto/getting-started/introduction","0.docs/3.nuxt-auto/1.getting-started/1.introduction",{"title":194,"path":195,"stem":196},"Installation","/docs/nuxt-auto/getting-started/installation","0.docs/3.nuxt-auto/1.getting-started/2.installation",{"title":198,"path":199,"stem":200},"Quick Start","/docs/nuxt-auto/getting-started/quick-start","0.docs/3.nuxt-auto/1.getting-started/3.quick-start",false,{"title":203,"path":204,"stem":205,"children":206,"page":201},"Auto API","/docs/nuxt-auto/auto-api","0.docs/3.nuxt-auto/2.auto-api",[207,210,214,218,222,226,230,234,238,242,246,250,254,258,262,266,270,274,278,282,286,290,294],{"title":185,"path":208,"stem":209},"/docs/nuxt-auto/auto-api/getting-started","0.docs/3.nuxt-auto/2.auto-api/1.getting-started",{"title":211,"path":212,"stem":213},"Aggregations","/docs/nuxt-auto/auto-api/aggregations","0.docs/3.nuxt-auto/2.auto-api/10.aggregations",{"title":215,"path":216,"stem":217},"Lifecycle Hooks","/docs/nuxt-auto/auto-api/lifecycle-hooks","0.docs/3.nuxt-auto/2.auto-api/11.lifecycle-hooks",{"title":219,"path":220,"stem":221},"Many-to-Many (M2M) Relationships","/docs/nuxt-auto/auto-api/m2m-relationships","0.docs/3.nuxt-auto/2.auto-api/12.m2m-relationships",{"title":223,"path":224,"stem":225},"Plugin System","/docs/nuxt-auto/auto-api/plugin-system","0.docs/3.nuxt-auto/2.auto-api/13.plugin-system",{"title":227,"path":228,"stem":229},"Database Adapters","/docs/nuxt-auto/auto-api/database-adapters","0.docs/3.nuxt-auto/2.auto-api/14.database-adapters",{"title":231,"path":232,"stem":233},"Custom Endpoints","/docs/nuxt-auto/auto-api/custom-endpoints","0.docs/3.nuxt-auto/2.auto-api/15.custom-endpoints",{"title":235,"path":236,"stem":237},"Multi-Tenancy","/docs/nuxt-auto/auto-api/multi-tenancy","0.docs/3.nuxt-auto/2.auto-api/16.multi-tenancy",{"title":239,"path":240,"stem":241},"Validation","/docs/nuxt-auto/auto-api/validation","0.docs/3.nuxt-auto/2.auto-api/2.validation",{"title":243,"path":244,"stem":245},"Rate Limiting","/docs/nuxt-auto/auto-api/rate-limiting","0.docs/3.nuxt-auto/2.auto-api/20.rate-limiting",{"title":247,"path":248,"stem":249},"Request Metadata Plugin","/docs/nuxt-auto/auto-api/request-metadata","0.docs/3.nuxt-auto/2.auto-api/21.request-metadata",{"title":251,"path":252,"stem":253},"Plugin Catalog","/docs/nuxt-auto/auto-api/plugin-catalog","0.docs/3.nuxt-auto/2.auto-api/22.plugin-catalog",{"title":255,"path":256,"stem":257},"Handler Overrides","/docs/nuxt-auto/auto-api/handler-overrides","0.docs/3.nuxt-auto/2.auto-api/3.handler-overrides",{"title":259,"path":260,"stem":261},"Cloudflare D1","/docs/nuxt-auto/auto-api/cloudflare-d1","0.docs/3.nuxt-auto/2.auto-api/30.cloudflare-d1",{"title":263,"path":264,"stem":265},"SQLite to D1 Migration","/docs/nuxt-auto/auto-api/migration-sqlite-d1","0.docs/3.nuxt-auto/2.auto-api/31.migration-sqlite-d1",{"title":267,"path":268,"stem":269},"Frontend Composables","/docs/nuxt-auto/auto-api/frontend-composables","0.docs/3.nuxt-auto/2.auto-api/32.frontend-composables",{"title":271,"path":272,"stem":273},"Testing","/docs/nuxt-auto/auto-api/testing","0.docs/3.nuxt-auto/2.auto-api/33.testing",{"title":275,"path":276,"stem":277},"Pagination","/docs/nuxt-auto/auto-api/pagination","0.docs/3.nuxt-auto/2.auto-api/4.pagination",{"title":279,"path":280,"stem":281},"Soft Deletes","/docs/nuxt-auto/auto-api/soft-deletes","0.docs/3.nuxt-auto/2.auto-api/5.soft-deletes",{"title":283,"path":284,"stem":285},"Authentication & Authorization","/docs/nuxt-auto/auto-api/authentication-authorization","0.docs/3.nuxt-auto/2.auto-api/6.authentication-authorization",{"title":287,"path":288,"stem":289},"Better-Auth Integration","/docs/nuxt-auto/auto-api/better-auth","0.docs/3.nuxt-auto/2.auto-api/7.better-auth",{"title":291,"path":292,"stem":293},"Nested Relations","/docs/nuxt-auto/auto-api/nested-relationships","0.docs/3.nuxt-auto/2.auto-api/8.nested-relationships",{"title":295,"path":296,"stem":297},"Bulk Operations","/docs/nuxt-auto/auto-api/bulk-operations","0.docs/3.nuxt-auto/2.auto-api/9.bulk-operations",{"title":299,"path":300,"stem":301,"children":302,"page":201},"Auto Admin","/docs/nuxt-auto/auto-admin","0.docs/3.nuxt-auto/3.auto-admin",[303,306,310,314,318,322,326,330,334],{"title":185,"path":304,"stem":305},"/docs/nuxt-auto/auto-admin/getting-started","0.docs/3.nuxt-auto/3.auto-admin/1.getting-started",{"title":307,"path":308,"stem":309},"Configuration & Theming","/docs/nuxt-auto/auto-admin/configuration-theming","0.docs/3.nuxt-auto/3.auto-admin/2.configuration-theming",{"title":311,"path":312,"stem":313},"Resource Configuration","/docs/nuxt-auto/auto-admin/resource-configuration","0.docs/3.nuxt-auto/3.auto-admin/3.resource-configuration",{"title":315,"path":316,"stem":317},"Form Fields & Widgets","/docs/nuxt-auto/auto-admin/form-fields-widgets","0.docs/3.nuxt-auto/3.auto-admin/4.form-fields-widgets",{"title":319,"path":320,"stem":321},"Permissions","/docs/nuxt-auto/auto-admin/permissions","0.docs/3.nuxt-auto/3.auto-admin/5.permissions",{"title":323,"path":324,"stem":325},"Custom Pages","/docs/nuxt-auto/auto-admin/custom-pages","0.docs/3.nuxt-auto/3.auto-admin/6.custom-pages",{"title":327,"path":328,"stem":329},"M2M Relationships","/docs/nuxt-auto/auto-admin/m2m-relationships","0.docs/3.nuxt-auto/3.auto-admin/7.m2m-relationships",{"title":331,"path":332,"stem":333},"Custom Actions","/docs/nuxt-auto/auto-admin/custom-actions","0.docs/3.nuxt-auto/3.auto-admin/8.custom-actions",{"title":335,"path":336,"stem":337},"Composables","/docs/nuxt-auto/auto-admin/composables","0.docs/3.nuxt-auto/3.auto-admin/9.composables",[339,342,355,382,400,415,425],{"title":5,"path":340,"stem":341},"/docs/nuxt-protokit","0.docs/4.nuxt-protokit/index",{"title":185,"path":343,"stem":344,"children":345,"icon":354},"/docs/nuxt-protokit/getting-started","0.docs/4.nuxt-protokit/1.getting-started/1.index",[346,347,351],{"title":190,"path":343,"stem":344},{"title":348,"path":349,"stem":350},"Core Concepts","/docs/nuxt-protokit/getting-started/concepts","0.docs/4.nuxt-protokit/1.getting-started/2.concepts",{"title":198,"path":352,"stem":353},"/docs/nuxt-protokit/getting-started/quick-start","0.docs/4.nuxt-protokit/1.getting-started/3.quick-start","i-lucide-rocket",{"title":356,"path":357,"stem":358,"children":359,"icon":381},"Schemas","/docs/nuxt-protokit/schemas","0.docs/4.nuxt-protokit/2.schemas/1.index",[360,361,365,369,373,377],{"title":5,"path":357,"stem":358},{"title":362,"path":363,"stem":364},"Field Types","/docs/nuxt-protokit/schemas/fields","0.docs/4.nuxt-protokit/2.schemas/2.fields",{"title":366,"path":367,"stem":368},"Collections","/docs/nuxt-protokit/schemas/collections","0.docs/4.nuxt-protokit/2.schemas/3.collections",{"title":370,"path":371,"stem":372},"Derived & Computed","/docs/nuxt-protokit/schemas/derived-computed","0.docs/4.nuxt-protokit/2.schemas/4.derived-computed",{"title":374,"path":375,"stem":376},"Connections","/docs/nuxt-protokit/schemas/connections","0.docs/4.nuxt-protokit/2.schemas/5.connections",{"title":378,"path":379,"stem":380},"Visualizations & Layouts","/docs/nuxt-protokit/schemas/visualizations","0.docs/4.nuxt-protokit/2.schemas/6.visualizations","i-lucide-file-code",{"title":335,"path":383,"stem":384,"children":385,"icon":399},"/docs/nuxt-protokit/composables","0.docs/4.nuxt-protokit/3.composables/1.index",[386,387,391,395],{"title":5,"path":383,"stem":384},{"title":388,"path":389,"stem":390},"usePrototype","/docs/nuxt-protokit/composables/use-prototype","0.docs/4.nuxt-protokit/3.composables/2.use-prototype",{"title":392,"path":393,"stem":394},"useProtoDoc","/docs/nuxt-protokit/composables/use-proto-doc","0.docs/4.nuxt-protokit/3.composables/3.use-proto-doc",{"title":396,"path":397,"stem":398},"useProtoCollection","/docs/nuxt-protokit/composables/use-proto-collection","0.docs/4.nuxt-protokit/3.composables/4.use-proto-collection","i-lucide-layers",{"title":401,"path":402,"stem":403,"children":404,"icon":414},"Components","/docs/nuxt-protokit/components","0.docs/4.nuxt-protokit/4.components/1.index",[405,406,410],{"title":5,"path":402,"stem":403},{"title":407,"path":408,"stem":409},"ProtoTool","/docs/nuxt-protokit/components/proto-tool","0.docs/4.nuxt-protokit/4.components/2.proto-tool",{"title":411,"path":412,"stem":413},"ProtoCrudModal","/docs/nuxt-protokit/components/proto-crud-modal","0.docs/4.nuxt-protokit/4.components/3.proto-crud-modal","i-lucide-puzzle",{"title":151,"path":416,"stem":417,"children":418,"icon":424},"/docs/nuxt-protokit/offline-first","0.docs/4.nuxt-protokit/5.offline-first/1.index",[419,420],{"title":151,"path":416,"stem":417},{"title":421,"path":422,"stem":423},"Corruption Recovery","/docs/nuxt-protokit/offline-first/corruption-recovery","0.docs/4.nuxt-protokit/5.offline-first/2.corruption-recovery","i-lucide-wifi-off",{"title":426,"icon":427,"path":428,"stem":429,"children":430},"Advanced","i-lucide-graduation-cap","/docs/nuxt-protokit/advanced","0.docs/4.nuxt-protokit/6.advanced/1.index",[431,432,436,440],{"title":5,"path":428,"stem":429},{"title":433,"path":434,"stem":435},"Multi-Tool Apps","/docs/nuxt-protokit/advanced/building-a-toolkit","0.docs/4.nuxt-protokit/6.advanced/1.building-a-toolkit",{"title":437,"path":438,"stem":439},"Schema Patterns","/docs/nuxt-protokit/advanced/custom-schema-patterns","0.docs/4.nuxt-protokit/6.advanced/2.custom-schema-patterns",{"title":441,"path":442,"stem":443},"Custom Fields & Viz","/docs/nuxt-protokit/advanced/extensibility","0.docs/4.nuxt-protokit/6.advanced/3.extensibility",{"page":445,"fallbackPage":3544},{"id":446,"title":447,"body":448,"description":3542,"extension":3543,"links":3544,"meta":3545,"navigation":3546,"ogImage":3544,"path":434,"seo":3547,"stem":435,"__hash__":3548},"nuxt_protokit/0.docs/4.nuxt-protokit/6.advanced/1.building-a-toolkit.md","Building a Multi-Tool Application",{"type":449,"value":450,"toc":3530},"minimark",[451,455,459,464,467,478,482,490,918,921,944,958,962,965,1707,1710,1714,1724,1849,1852,1998,2002,2008,2179,2183,2186,2286,2289,2310,2314,2317,2711,2714,2718,2956,2959,2983,2987,2990,3419,3422,3426,3429,3526],[452,453,447],"h1",{"id":454},"building-a-multi-tool-application",[456,457,458],"p",{},"protokit is designed to scale from a single embedded calculator to a suite of dozens of interconnected tools. This page covers the patterns that make large-scale applications manageable.",[460,461,463],"h2",{"id":462},"architecture-overview","Architecture overview",[456,465,466],{},"A typical multi-tool application has:",[468,469,474],"pre",{"className":470,"code":472,"language":473},[471],"language-text","┌─────────────────────────────────────────────────────┐\n│  Workspace page: /workspace/:id/:tool               │\n├──────────────────────┬──────────────────────────────┤\n│  Sidebar             │  Tool area                   │\n│  ─ Tool list         │  ─ ProtoTool (or custom UI)  │\n│  ─ Status indicators │  ─ Connection indicators     │\n│  ─ Stage groupings   │  ─ Status controls           │\n└──────────────────────┴──────────────────────────────┘\n         │                           │\n         ▼                           ▼\n  Workspace list store         Workspace store\n  ─ workspace CRUD             ─ ONE shared Y.Doc\n  ─ tool status tracking       ─ getToolMap(toolKey)\n  ─ metadata                   ─ metaMap\n","text",[475,476,472],"code",{"__ignoreMap":477},"",[460,479,481],{"id":480},"one-ydoc-per-workspace","One Y.Doc per workspace",[456,483,484,485,489],{},"The most important architectural decision: ",[486,487,488],"strong",{},"all tools within one workspace share a single Y.Doc",".",[468,491,495],{"className":492,"code":493,"language":494,"meta":477,"style":477},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","// workspaceStore.ts — factory, one Pinia store per workspace ID\nexport const useWorkspaceStore = (workspaceId: string) =>\n  defineStore(`workspace-${workspaceId}`, () => {\n    const { doc, isReady } = useProtoDoc(`workspace-${workspaceId}`)\n\n    // Each tool gets its own Y.Map namespace\n    function getToolMap(toolKey: string): Y.Map\u003Cany> {\n      return doc.getMap(`fields:${toolKey}`)\n    }\n\n    // Workspace-level metadata\n    const metaMap = doc.getMap('meta')\n\n    function updateMeta(updates: Record\u003Cstring, any>) {\n      doc.transact(() => {\n        Object.entries(updates).forEach(([k, v]) => metaMap.set(k, v))\n      })\n    }\n\n    return { doc, isReady, getToolMap, updateMeta }\n  })()\n","typescript",[475,496,497,506,545,582,624,631,637,677,705,711,716,722,750,755,788,808,866,874,879,884,909],{"__ignoreMap":477},[498,499,502],"span",{"class":500,"line":501},"line",1,[498,503,505],{"class":504},"sHwdD","// workspaceStore.ts — factory, one Pinia store per workspace ID\n",[498,507,509,513,517,521,525,528,532,535,539,542],{"class":500,"line":508},2,[498,510,512],{"class":511},"s7zQu","export",[498,514,516],{"class":515},"spNyl"," const",[498,518,520],{"class":519},"sTEyZ"," useWorkspaceStore ",[498,522,524],{"class":523},"sMK4o","=",[498,526,527],{"class":523}," (",[498,529,531],{"class":530},"sHdIc","workspaceId",[498,533,534],{"class":523},":",[498,536,538],{"class":537},"sBMFI"," string",[498,540,541],{"class":523},")",[498,543,544],{"class":515}," =>\n",[498,546,548,552,555,558,562,565,567,570,573,576,579],{"class":500,"line":547},3,[498,549,551],{"class":550},"s2Zo4","  defineStore",[498,553,554],{"class":519},"(",[498,556,557],{"class":523},"`",[498,559,561],{"class":560},"sfazB","workspace-",[498,563,564],{"class":523},"${",[498,566,531],{"class":519},[498,568,569],{"class":523},"}`",[498,571,572],{"class":523},",",[498,574,575],{"class":523}," ()",[498,577,578],{"class":515}," =>",[498,580,581],{"class":523}," {\n",[498,583,585,588,591,594,596,599,602,605,608,611,613,615,617,619,621],{"class":500,"line":584},4,[498,586,587],{"class":515},"    const",[498,589,590],{"class":523}," {",[498,592,593],{"class":519}," doc",[498,595,572],{"class":523},[498,597,598],{"class":519}," isReady",[498,600,601],{"class":523}," }",[498,603,604],{"class":523}," =",[498,606,607],{"class":550}," useProtoDoc",[498,609,554],{"class":610},"swJcz",[498,612,557],{"class":523},[498,614,561],{"class":560},[498,616,564],{"class":523},[498,618,531],{"class":519},[498,620,569],{"class":523},[498,622,623],{"class":610},")\n",[498,625,627],{"class":500,"line":626},5,[498,628,630],{"emptyLinePlaceholder":629},true,"\n",[498,632,634],{"class":500,"line":633},6,[498,635,636],{"class":504},"    // Each tool gets its own Y.Map namespace\n",[498,638,640,643,646,648,651,653,655,658,661,663,666,669,672,675],{"class":500,"line":639},7,[498,641,642],{"class":515},"    function",[498,644,645],{"class":550}," getToolMap",[498,647,554],{"class":523},[498,649,650],{"class":530},"toolKey",[498,652,534],{"class":523},[498,654,538],{"class":537},[498,656,657],{"class":523},"):",[498,659,660],{"class":537}," Y",[498,662,489],{"class":523},[498,664,665],{"class":537},"Map",[498,667,668],{"class":523},"\u003C",[498,670,671],{"class":537},"any",[498,673,674],{"class":523},">",[498,676,581],{"class":523},[498,678,680,683,685,687,690,692,694,697,699,701,703],{"class":500,"line":679},8,[498,681,682],{"class":511},"      return",[498,684,593],{"class":519},[498,686,489],{"class":523},[498,688,689],{"class":550},"getMap",[498,691,554],{"class":610},[498,693,557],{"class":523},[498,695,696],{"class":560},"fields:",[498,698,564],{"class":523},[498,700,650],{"class":519},[498,702,569],{"class":523},[498,704,623],{"class":610},[498,706,708],{"class":500,"line":707},9,[498,709,710],{"class":523},"    }\n",[498,712,714],{"class":500,"line":713},10,[498,715,630],{"emptyLinePlaceholder":629},[498,717,719],{"class":500,"line":718},11,[498,720,721],{"class":504},"    // Workspace-level metadata\n",[498,723,725,727,730,732,734,736,738,740,743,746,748],{"class":500,"line":724},12,[498,726,587],{"class":515},[498,728,729],{"class":519}," metaMap",[498,731,604],{"class":523},[498,733,593],{"class":519},[498,735,489],{"class":523},[498,737,689],{"class":550},[498,739,554],{"class":610},[498,741,742],{"class":523},"'",[498,744,745],{"class":560},"meta",[498,747,742],{"class":523},[498,749,623],{"class":610},[498,751,753],{"class":500,"line":752},13,[498,754,630],{"emptyLinePlaceholder":629},[498,756,758,760,763,765,768,770,773,775,778,780,783,786],{"class":500,"line":757},14,[498,759,642],{"class":515},[498,761,762],{"class":550}," updateMeta",[498,764,554],{"class":523},[498,766,767],{"class":530},"updates",[498,769,534],{"class":523},[498,771,772],{"class":537}," Record",[498,774,668],{"class":523},[498,776,777],{"class":537},"string",[498,779,572],{"class":523},[498,781,782],{"class":537}," any",[498,784,785],{"class":523},">)",[498,787,581],{"class":523},[498,789,791,794,796,799,801,804,806],{"class":500,"line":790},15,[498,792,793],{"class":519},"      doc",[498,795,489],{"class":523},[498,797,798],{"class":550},"transact",[498,800,554],{"class":610},[498,802,803],{"class":523},"()",[498,805,578],{"class":515},[498,807,581],{"class":523},[498,809,811,814,816,819,821,823,825,827,830,832,835,838,840,843,846,848,850,852,855,857,859,861,863],{"class":500,"line":810},16,[498,812,813],{"class":519},"        Object",[498,815,489],{"class":523},[498,817,818],{"class":550},"entries",[498,820,554],{"class":610},[498,822,767],{"class":519},[498,824,541],{"class":610},[498,826,489],{"class":523},[498,828,829],{"class":550},"forEach",[498,831,554],{"class":610},[498,833,834],{"class":523},"([",[498,836,837],{"class":530},"k",[498,839,572],{"class":523},[498,841,842],{"class":530}," v",[498,844,845],{"class":523},"])",[498,847,578],{"class":515},[498,849,729],{"class":519},[498,851,489],{"class":523},[498,853,854],{"class":550},"set",[498,856,554],{"class":610},[498,858,837],{"class":519},[498,860,572],{"class":523},[498,862,842],{"class":519},[498,864,865],{"class":610},"))\n",[498,867,869,872],{"class":500,"line":868},17,[498,870,871],{"class":523},"      }",[498,873,623],{"class":610},[498,875,877],{"class":500,"line":876},18,[498,878,710],{"class":523},[498,880,882],{"class":500,"line":881},19,[498,883,630],{"emptyLinePlaceholder":629},[498,885,887,890,892,894,896,898,900,902,904,906],{"class":500,"line":886},20,[498,888,889],{"class":511},"    return",[498,891,590],{"class":523},[498,893,593],{"class":519},[498,895,572],{"class":523},[498,897,598],{"class":519},[498,899,572],{"class":523},[498,901,645],{"class":519},[498,903,572],{"class":523},[498,905,762],{"class":519},[498,907,908],{"class":523}," }\n",[498,910,912,915],{"class":500,"line":911},21,[498,913,914],{"class":523},"  }",[498,916,917],{"class":519},")()\n",[456,919,920],{},"Benefits:",[922,923,924,935,938,941],"ul",{},[925,926,927,930,931,934],"li",{},[475,928,929],{},"produces","/",[475,932,933],{},"consumes"," work instantly and offline — no cross-document wiring needed",[925,936,937],{},"One IndexedDB store per workspace instead of one per tool",[925,939,940],{},"One server sync stream per workspace",[925,942,943],{},"Corruption recovery covers the entire workspace at once",[456,945,946,947,950,951,950,954,957],{},"Each tool's data lives in its own namespace: ",[475,948,949],{},"fields:estimator",", ",[475,952,953],{},"fields:tracker",[475,955,956],{},"collection:tasks:items",", etc.",[460,959,961],{"id":960},"the-workspace-list-store","The workspace list store",[456,963,964],{},"A separate store manages the list of all workspaces — names, icons, tool statuses:",[468,966,968],{"className":492,"code":967,"language":494,"meta":477,"style":477},"// workspaceListStore.ts — singleton\nexport const useWorkspaceListStore = defineStore('workspace-list', () => {\n  const { doc, isReady } = useProtoDoc('workspace-list')\n  const workspacesMap = doc.getMap('workspaces')\n\n  function createWorkspace(input: { name: string; icon?: string }): string {\n    const id = crypto.randomUUID()\n    doc.transact(() => {\n      workspacesMap.set(id, { id, name: input.name, icon: input.icon, createdAt: Date.now() })\n    })\n    return id\n  }\n\n  function markToolStatus(workspaceId: string, toolKey: string, status: 'not-started' | 'in-progress' | 'done') {\n    const ws = workspacesMap.get(workspaceId)\n    if (!ws) return\n    const toolsUsed = new Set\u003Cstring>(ws.toolsUsed ?? [])\n    const toolsInProgress = new Set\u003Cstring>(ws.toolsInProgress ?? [])\n    if (status === 'done')        { toolsUsed.add(toolKey); toolsInProgress.delete(toolKey) }\n    if (status === 'in-progress') { toolsInProgress.add(toolKey); toolsUsed.delete(toolKey) }\n    if (status === 'not-started') { toolsUsed.delete(toolKey); toolsInProgress.delete(toolKey) }\n    workspacesMap.set(workspaceId, { ...ws, toolsUsed: [...toolsUsed], toolsInProgress: [...toolsInProgress] })\n  }\n\n  const workspaces = computed(() => [...workspacesMap.values()] as Workspace[])\n\n  return { workspaces, isReady, createWorkspace, markToolStatus }\n})\n",[475,969,970,975,1006,1035,1061,1065,1107,1127,1144,1214,1221,1228,1233,1237,1299,1321,1340,1376,1408,1463,1511,1559,1618,1623,1628,1671,1676,1700],{"__ignoreMap":477},[498,971,972],{"class":500,"line":501},[498,973,974],{"class":504},"// workspaceListStore.ts — singleton\n",[498,976,977,979,981,984,986,989,991,993,996,998,1000,1002,1004],{"class":500,"line":508},[498,978,512],{"class":511},[498,980,516],{"class":515},[498,982,983],{"class":519}," useWorkspaceListStore ",[498,985,524],{"class":523},[498,987,988],{"class":550}," defineStore",[498,990,554],{"class":519},[498,992,742],{"class":523},[498,994,995],{"class":560},"workspace-list",[498,997,742],{"class":523},[498,999,572],{"class":523},[498,1001,575],{"class":523},[498,1003,578],{"class":515},[498,1005,581],{"class":523},[498,1007,1008,1011,1013,1015,1017,1019,1021,1023,1025,1027,1029,1031,1033],{"class":500,"line":547},[498,1009,1010],{"class":515},"  const",[498,1012,590],{"class":523},[498,1014,593],{"class":519},[498,1016,572],{"class":523},[498,1018,598],{"class":519},[498,1020,601],{"class":523},[498,1022,604],{"class":523},[498,1024,607],{"class":550},[498,1026,554],{"class":610},[498,1028,742],{"class":523},[498,1030,995],{"class":560},[498,1032,742],{"class":523},[498,1034,623],{"class":610},[498,1036,1037,1039,1042,1044,1046,1048,1050,1052,1054,1057,1059],{"class":500,"line":584},[498,1038,1010],{"class":515},[498,1040,1041],{"class":519}," workspacesMap",[498,1043,604],{"class":523},[498,1045,593],{"class":519},[498,1047,489],{"class":523},[498,1049,689],{"class":550},[498,1051,554],{"class":610},[498,1053,742],{"class":523},[498,1055,1056],{"class":560},"workspaces",[498,1058,742],{"class":523},[498,1060,623],{"class":610},[498,1062,1063],{"class":500,"line":626},[498,1064,630],{"emptyLinePlaceholder":629},[498,1066,1067,1070,1073,1075,1078,1080,1082,1085,1087,1089,1092,1095,1098,1100,1103,1105],{"class":500,"line":633},[498,1068,1069],{"class":515},"  function",[498,1071,1072],{"class":550}," createWorkspace",[498,1074,554],{"class":523},[498,1076,1077],{"class":530},"input",[498,1079,534],{"class":523},[498,1081,590],{"class":523},[498,1083,1084],{"class":610}," name",[498,1086,534],{"class":523},[498,1088,538],{"class":537},[498,1090,1091],{"class":523},";",[498,1093,1094],{"class":610}," icon",[498,1096,1097],{"class":523},"?:",[498,1099,538],{"class":537},[498,1101,1102],{"class":523}," }):",[498,1104,538],{"class":537},[498,1106,581],{"class":523},[498,1108,1109,1111,1114,1116,1119,1121,1124],{"class":500,"line":639},[498,1110,587],{"class":515},[498,1112,1113],{"class":519}," id",[498,1115,604],{"class":523},[498,1117,1118],{"class":519}," crypto",[498,1120,489],{"class":523},[498,1122,1123],{"class":550},"randomUUID",[498,1125,1126],{"class":610},"()\n",[498,1128,1129,1132,1134,1136,1138,1140,1142],{"class":500,"line":679},[498,1130,1131],{"class":519},"    doc",[498,1133,489],{"class":523},[498,1135,798],{"class":550},[498,1137,554],{"class":610},[498,1139,803],{"class":523},[498,1141,578],{"class":515},[498,1143,581],{"class":523},[498,1145,1146,1149,1151,1153,1155,1158,1160,1162,1164,1166,1168,1170,1173,1175,1178,1180,1182,1184,1186,1188,1191,1193,1196,1198,1201,1203,1206,1209,1212],{"class":500,"line":707},[498,1147,1148],{"class":519},"      workspacesMap",[498,1150,489],{"class":523},[498,1152,854],{"class":550},[498,1154,554],{"class":610},[498,1156,1157],{"class":519},"id",[498,1159,572],{"class":523},[498,1161,590],{"class":523},[498,1163,1113],{"class":519},[498,1165,572],{"class":523},[498,1167,1084],{"class":610},[498,1169,534],{"class":523},[498,1171,1172],{"class":519}," input",[498,1174,489],{"class":523},[498,1176,1177],{"class":519},"name",[498,1179,572],{"class":523},[498,1181,1094],{"class":610},[498,1183,534],{"class":523},[498,1185,1172],{"class":519},[498,1187,489],{"class":523},[498,1189,1190],{"class":519},"icon",[498,1192,572],{"class":523},[498,1194,1195],{"class":610}," createdAt",[498,1197,534],{"class":523},[498,1199,1200],{"class":519}," Date",[498,1202,489],{"class":523},[498,1204,1205],{"class":550},"now",[498,1207,1208],{"class":610},"() ",[498,1210,1211],{"class":523},"}",[498,1213,623],{"class":610},[498,1215,1216,1219],{"class":500,"line":713},[498,1217,1218],{"class":523},"    }",[498,1220,623],{"class":610},[498,1222,1223,1225],{"class":500,"line":718},[498,1224,889],{"class":511},[498,1226,1227],{"class":519}," id\n",[498,1229,1230],{"class":500,"line":724},[498,1231,1232],{"class":523},"  }\n",[498,1234,1235],{"class":500,"line":752},[498,1236,630],{"emptyLinePlaceholder":629},[498,1238,1239,1241,1244,1246,1248,1250,1252,1254,1257,1259,1261,1263,1266,1268,1271,1274,1276,1279,1281,1284,1286,1288,1290,1293,1295,1297],{"class":500,"line":757},[498,1240,1069],{"class":515},[498,1242,1243],{"class":550}," markToolStatus",[498,1245,554],{"class":523},[498,1247,531],{"class":530},[498,1249,534],{"class":523},[498,1251,538],{"class":537},[498,1253,572],{"class":523},[498,1255,1256],{"class":530}," toolKey",[498,1258,534],{"class":523},[498,1260,538],{"class":537},[498,1262,572],{"class":523},[498,1264,1265],{"class":530}," status",[498,1267,534],{"class":523},[498,1269,1270],{"class":523}," '",[498,1272,1273],{"class":560},"not-started",[498,1275,742],{"class":523},[498,1277,1278],{"class":523}," |",[498,1280,1270],{"class":523},[498,1282,1283],{"class":560},"in-progress",[498,1285,742],{"class":523},[498,1287,1278],{"class":523},[498,1289,1270],{"class":523},[498,1291,1292],{"class":560},"done",[498,1294,742],{"class":523},[498,1296,541],{"class":523},[498,1298,581],{"class":523},[498,1300,1301,1303,1306,1308,1310,1312,1315,1317,1319],{"class":500,"line":790},[498,1302,587],{"class":515},[498,1304,1305],{"class":519}," ws",[498,1307,604],{"class":523},[498,1309,1041],{"class":519},[498,1311,489],{"class":523},[498,1313,1314],{"class":550},"get",[498,1316,554],{"class":610},[498,1318,531],{"class":519},[498,1320,623],{"class":610},[498,1322,1323,1326,1328,1331,1334,1337],{"class":500,"line":810},[498,1324,1325],{"class":511},"    if",[498,1327,527],{"class":610},[498,1329,1330],{"class":523},"!",[498,1332,1333],{"class":519},"ws",[498,1335,1336],{"class":610},") ",[498,1338,1339],{"class":511},"return\n",[498,1341,1342,1344,1347,1349,1352,1355,1357,1359,1361,1363,1365,1367,1370,1373],{"class":500,"line":868},[498,1343,587],{"class":515},[498,1345,1346],{"class":519}," toolsUsed",[498,1348,604],{"class":523},[498,1350,1351],{"class":523}," new",[498,1353,1354],{"class":550}," Set",[498,1356,668],{"class":523},[498,1358,777],{"class":537},[498,1360,674],{"class":523},[498,1362,554],{"class":610},[498,1364,1333],{"class":519},[498,1366,489],{"class":523},[498,1368,1369],{"class":519},"toolsUsed",[498,1371,1372],{"class":523}," ??",[498,1374,1375],{"class":610}," [])\n",[498,1377,1378,1380,1383,1385,1387,1389,1391,1393,1395,1397,1399,1401,1404,1406],{"class":500,"line":876},[498,1379,587],{"class":515},[498,1381,1382],{"class":519}," toolsInProgress",[498,1384,604],{"class":523},[498,1386,1351],{"class":523},[498,1388,1354],{"class":550},[498,1390,668],{"class":523},[498,1392,777],{"class":537},[498,1394,674],{"class":523},[498,1396,554],{"class":610},[498,1398,1333],{"class":519},[498,1400,489],{"class":523},[498,1402,1403],{"class":519},"toolsInProgress",[498,1405,1372],{"class":523},[498,1407,1375],{"class":610},[498,1409,1410,1412,1414,1417,1420,1422,1424,1426,1429,1432,1434,1436,1439,1441,1443,1445,1447,1449,1451,1454,1456,1458,1460],{"class":500,"line":881},[498,1411,1325],{"class":511},[498,1413,527],{"class":610},[498,1415,1416],{"class":519},"status",[498,1418,1419],{"class":523}," ===",[498,1421,1270],{"class":523},[498,1423,1292],{"class":560},[498,1425,742],{"class":523},[498,1427,1428],{"class":610},")        ",[498,1430,1431],{"class":523},"{",[498,1433,1346],{"class":519},[498,1435,489],{"class":523},[498,1437,1438],{"class":550},"add",[498,1440,554],{"class":610},[498,1442,650],{"class":519},[498,1444,541],{"class":610},[498,1446,1091],{"class":523},[498,1448,1382],{"class":519},[498,1450,489],{"class":523},[498,1452,1453],{"class":550},"delete",[498,1455,554],{"class":610},[498,1457,650],{"class":519},[498,1459,1336],{"class":610},[498,1461,1462],{"class":523},"}\n",[498,1464,1465,1467,1469,1471,1473,1475,1477,1479,1481,1483,1485,1487,1489,1491,1493,1495,1497,1499,1501,1503,1505,1507,1509],{"class":500,"line":886},[498,1466,1325],{"class":511},[498,1468,527],{"class":610},[498,1470,1416],{"class":519},[498,1472,1419],{"class":523},[498,1474,1270],{"class":523},[498,1476,1283],{"class":560},[498,1478,742],{"class":523},[498,1480,1336],{"class":610},[498,1482,1431],{"class":523},[498,1484,1382],{"class":519},[498,1486,489],{"class":523},[498,1488,1438],{"class":550},[498,1490,554],{"class":610},[498,1492,650],{"class":519},[498,1494,541],{"class":610},[498,1496,1091],{"class":523},[498,1498,1346],{"class":519},[498,1500,489],{"class":523},[498,1502,1453],{"class":550},[498,1504,554],{"class":610},[498,1506,650],{"class":519},[498,1508,1336],{"class":610},[498,1510,1462],{"class":523},[498,1512,1513,1515,1517,1519,1521,1523,1525,1527,1529,1531,1533,1535,1537,1539,1541,1543,1545,1547,1549,1551,1553,1555,1557],{"class":500,"line":911},[498,1514,1325],{"class":511},[498,1516,527],{"class":610},[498,1518,1416],{"class":519},[498,1520,1419],{"class":523},[498,1522,1270],{"class":523},[498,1524,1273],{"class":560},[498,1526,742],{"class":523},[498,1528,1336],{"class":610},[498,1530,1431],{"class":523},[498,1532,1346],{"class":519},[498,1534,489],{"class":523},[498,1536,1453],{"class":550},[498,1538,554],{"class":610},[498,1540,650],{"class":519},[498,1542,541],{"class":610},[498,1544,1091],{"class":523},[498,1546,1382],{"class":519},[498,1548,489],{"class":523},[498,1550,1453],{"class":550},[498,1552,554],{"class":610},[498,1554,650],{"class":519},[498,1556,1336],{"class":610},[498,1558,1462],{"class":523},[498,1560,1562,1565,1567,1569,1571,1573,1575,1577,1580,1582,1584,1586,1588,1591,1594,1596,1599,1601,1603,1605,1607,1609,1611,1614,1616],{"class":500,"line":1561},22,[498,1563,1564],{"class":519},"    workspacesMap",[498,1566,489],{"class":523},[498,1568,854],{"class":550},[498,1570,554],{"class":610},[498,1572,531],{"class":519},[498,1574,572],{"class":523},[498,1576,590],{"class":523},[498,1578,1579],{"class":523}," ...",[498,1581,1333],{"class":519},[498,1583,572],{"class":523},[498,1585,1346],{"class":610},[498,1587,534],{"class":523},[498,1589,1590],{"class":610}," [",[498,1592,1593],{"class":523},"...",[498,1595,1369],{"class":519},[498,1597,1598],{"class":610},"]",[498,1600,572],{"class":523},[498,1602,1382],{"class":610},[498,1604,534],{"class":523},[498,1606,1590],{"class":610},[498,1608,1593],{"class":523},[498,1610,1403],{"class":519},[498,1612,1613],{"class":610},"] ",[498,1615,1211],{"class":523},[498,1617,623],{"class":610},[498,1619,1621],{"class":500,"line":1620},23,[498,1622,1232],{"class":523},[498,1624,1626],{"class":500,"line":1625},24,[498,1627,630],{"emptyLinePlaceholder":629},[498,1629,1631,1633,1636,1638,1641,1643,1645,1647,1649,1651,1654,1656,1659,1662,1665,1668],{"class":500,"line":1630},25,[498,1632,1010],{"class":515},[498,1634,1635],{"class":519}," workspaces",[498,1637,604],{"class":523},[498,1639,1640],{"class":550}," computed",[498,1642,554],{"class":610},[498,1644,803],{"class":523},[498,1646,578],{"class":515},[498,1648,1590],{"class":610},[498,1650,1593],{"class":523},[498,1652,1653],{"class":519},"workspacesMap",[498,1655,489],{"class":523},[498,1657,1658],{"class":550},"values",[498,1660,1661],{"class":610},"()] ",[498,1663,1664],{"class":511},"as",[498,1666,1667],{"class":537}," Workspace",[498,1669,1670],{"class":610},"[])\n",[498,1672,1674],{"class":500,"line":1673},26,[498,1675,630],{"emptyLinePlaceholder":629},[498,1677,1679,1682,1684,1686,1688,1690,1692,1694,1696,1698],{"class":500,"line":1678},27,[498,1680,1681],{"class":511},"  return",[498,1683,590],{"class":523},[498,1685,1635],{"class":519},[498,1687,572],{"class":523},[498,1689,598],{"class":519},[498,1691,572],{"class":523},[498,1693,1072],{"class":519},[498,1695,572],{"class":523},[498,1697,1243],{"class":519},[498,1699,908],{"class":523},[498,1701,1703,1705],{"class":500,"line":1702},28,[498,1704,1211],{"class":523},[498,1706,623],{"class":519},[456,1708,1709],{},"This is also a Y.js document — workspace list changes persist offline.",[460,1711,1713],{"id":1712},"tool-routing","Tool routing",[456,1715,1716,1717,1720,1721,534],{},"Register pages dynamically in ",[475,1718,1719],{},"module.ts"," or ",[475,1722,1723],{},"nuxt.config.ts",[468,1725,1727],{"className":492,"code":1726,"language":494,"meta":477,"style":477},"// In a Nuxt module's setup():\nnuxt.hook('pages:extend', (pages) => {\n  pages.push({\n    name: 'workspace-tool',\n    path: '/workspace/:id/:tool',\n    file: resolve('./runtime/pages/workspace/[id]/[tool].vue'),\n  })\n})\n",[475,1728,1729,1734,1766,1781,1798,1814,1837,1843],{"__ignoreMap":477},[498,1730,1731],{"class":500,"line":501},[498,1732,1733],{"class":504},"// In a Nuxt module's setup():\n",[498,1735,1736,1739,1741,1744,1746,1748,1751,1753,1755,1757,1760,1762,1764],{"class":500,"line":508},[498,1737,1738],{"class":519},"nuxt",[498,1740,489],{"class":523},[498,1742,1743],{"class":550},"hook",[498,1745,554],{"class":519},[498,1747,742],{"class":523},[498,1749,1750],{"class":560},"pages:extend",[498,1752,742],{"class":523},[498,1754,572],{"class":523},[498,1756,527],{"class":523},[498,1758,1759],{"class":530},"pages",[498,1761,541],{"class":523},[498,1763,578],{"class":515},[498,1765,581],{"class":523},[498,1767,1768,1771,1773,1776,1778],{"class":500,"line":547},[498,1769,1770],{"class":519},"  pages",[498,1772,489],{"class":523},[498,1774,1775],{"class":550},"push",[498,1777,554],{"class":610},[498,1779,1780],{"class":523},"{\n",[498,1782,1783,1786,1788,1790,1793,1795],{"class":500,"line":584},[498,1784,1785],{"class":610},"    name",[498,1787,534],{"class":523},[498,1789,1270],{"class":523},[498,1791,1792],{"class":560},"workspace-tool",[498,1794,742],{"class":523},[498,1796,1797],{"class":523},",\n",[498,1799,1800,1803,1805,1807,1810,1812],{"class":500,"line":626},[498,1801,1802],{"class":610},"    path",[498,1804,534],{"class":523},[498,1806,1270],{"class":523},[498,1808,1809],{"class":560},"/workspace/:id/:tool",[498,1811,742],{"class":523},[498,1813,1797],{"class":523},[498,1815,1816,1819,1821,1824,1826,1828,1831,1833,1835],{"class":500,"line":633},[498,1817,1818],{"class":610},"    file",[498,1820,534],{"class":523},[498,1822,1823],{"class":550}," resolve",[498,1825,554],{"class":610},[498,1827,742],{"class":523},[498,1829,1830],{"class":560},"./runtime/pages/workspace/[id]/[tool].vue",[498,1832,742],{"class":523},[498,1834,541],{"class":610},[498,1836,1797],{"class":523},[498,1838,1839,1841],{"class":500,"line":639},[498,1840,914],{"class":523},[498,1842,623],{"class":610},[498,1844,1845,1847],{"class":500,"line":679},[498,1846,1211],{"class":523},[498,1848,623],{"class":519},[456,1850,1851],{},"In the route page:",[468,1853,1855],{"className":492,"code":1854,"language":494,"meta":477,"style":477},"// [tool].vue\nconst route = useRoute()\nconst workspaceId = route.params.id as string\nconst toolKey = route.params.tool as string\n\nconst schema = getPrototype(toolKey)      // from useProtoRegistry\nconst workspaceStore = useWorkspaceStore(workspaceId)\n\n// Provide the shared doc to child tools\nprovide('workspace-doc', workspaceStore.doc)\n",[475,1856,1857,1862,1877,1904,1928,1932,1950,1965,1969,1974],{"__ignoreMap":477},[498,1858,1859],{"class":500,"line":501},[498,1860,1861],{"class":504},"// [tool].vue\n",[498,1863,1864,1867,1870,1872,1875],{"class":500,"line":508},[498,1865,1866],{"class":515},"const",[498,1868,1869],{"class":519}," route ",[498,1871,524],{"class":523},[498,1873,1874],{"class":550}," useRoute",[498,1876,1126],{"class":519},[498,1878,1879,1881,1884,1886,1889,1891,1894,1896,1899,1901],{"class":500,"line":547},[498,1880,1866],{"class":515},[498,1882,1883],{"class":519}," workspaceId ",[498,1885,524],{"class":523},[498,1887,1888],{"class":519}," route",[498,1890,489],{"class":523},[498,1892,1893],{"class":519},"params",[498,1895,489],{"class":523},[498,1897,1898],{"class":519},"id ",[498,1900,1664],{"class":511},[498,1902,1903],{"class":537}," string\n",[498,1905,1906,1908,1911,1913,1915,1917,1919,1921,1924,1926],{"class":500,"line":584},[498,1907,1866],{"class":515},[498,1909,1910],{"class":519}," toolKey ",[498,1912,524],{"class":523},[498,1914,1888],{"class":519},[498,1916,489],{"class":523},[498,1918,1893],{"class":519},[498,1920,489],{"class":523},[498,1922,1923],{"class":519},"tool ",[498,1925,1664],{"class":511},[498,1927,1903],{"class":537},[498,1929,1930],{"class":500,"line":626},[498,1931,630],{"emptyLinePlaceholder":629},[498,1933,1934,1936,1939,1941,1944,1947],{"class":500,"line":633},[498,1935,1866],{"class":515},[498,1937,1938],{"class":519}," schema ",[498,1940,524],{"class":523},[498,1942,1943],{"class":550}," getPrototype",[498,1945,1946],{"class":519},"(toolKey)      ",[498,1948,1949],{"class":504},"// from useProtoRegistry\n",[498,1951,1952,1954,1957,1959,1962],{"class":500,"line":639},[498,1953,1866],{"class":515},[498,1955,1956],{"class":519}," workspaceStore ",[498,1958,524],{"class":523},[498,1960,1961],{"class":550}," useWorkspaceStore",[498,1963,1964],{"class":519},"(workspaceId)\n",[498,1966,1967],{"class":500,"line":679},[498,1968,630],{"emptyLinePlaceholder":629},[498,1970,1971],{"class":500,"line":707},[498,1972,1973],{"class":504},"// Provide the shared doc to child tools\n",[498,1975,1976,1979,1981,1983,1986,1988,1990,1993,1995],{"class":500,"line":713},[498,1977,1978],{"class":550},"provide",[498,1980,554],{"class":519},[498,1982,742],{"class":523},[498,1984,1985],{"class":560},"workspace-doc",[498,1987,742],{"class":523},[498,1989,572],{"class":523},[498,1991,1992],{"class":519}," workspaceStore",[498,1994,489],{"class":523},[498,1996,1997],{"class":519},"doc)\n",[460,1999,2001],{"id":2000},"scoping-tools-to-a-shared-doc","Scoping tools to a shared doc",[456,2003,2004,2005,2007],{},"When using ",[475,2006,388],{}," with a shared document, pass the scoped Y.Map directly:",[468,2009,2011],{"className":492,"code":2010,"language":494,"meta":477,"style":477},"// In SomeToolWrapper.vue\nconst workspaceDoc = inject('workspace-doc') as Y.Doc\n\n// Instead of creating a new Y.Doc, use the shared one\nconst fieldsMap = workspaceDoc.getMap(`fields:${toolKey}`)\nconst { state, derived } = useProtoMap(fieldsMap, schema.fields)\n\n// Collections also scope to the shared doc\nconst tasks = useProtoCollection(workspaceDoc, `collection:${toolKey}:tasks`, schema.collections.tasks)\n",[475,2012,2013,2018,2049,2053,2058,2088,2122,2126,2131],{"__ignoreMap":477},[498,2014,2015],{"class":500,"line":501},[498,2016,2017],{"class":504},"// In SomeToolWrapper.vue\n",[498,2019,2020,2022,2025,2027,2030,2032,2034,2036,2038,2040,2042,2044,2046],{"class":500,"line":508},[498,2021,1866],{"class":515},[498,2023,2024],{"class":519}," workspaceDoc ",[498,2026,524],{"class":523},[498,2028,2029],{"class":550}," inject",[498,2031,554],{"class":519},[498,2033,742],{"class":523},[498,2035,1985],{"class":560},[498,2037,742],{"class":523},[498,2039,1336],{"class":519},[498,2041,1664],{"class":511},[498,2043,660],{"class":537},[498,2045,489],{"class":523},[498,2047,2048],{"class":537},"Doc\n",[498,2050,2051],{"class":500,"line":547},[498,2052,630],{"emptyLinePlaceholder":629},[498,2054,2055],{"class":500,"line":584},[498,2056,2057],{"class":504},"// Instead of creating a new Y.Doc, use the shared one\n",[498,2059,2060,2062,2065,2067,2070,2072,2074,2076,2078,2080,2082,2084,2086],{"class":500,"line":626},[498,2061,1866],{"class":515},[498,2063,2064],{"class":519}," fieldsMap ",[498,2066,524],{"class":523},[498,2068,2069],{"class":519}," workspaceDoc",[498,2071,489],{"class":523},[498,2073,689],{"class":550},[498,2075,554],{"class":519},[498,2077,557],{"class":523},[498,2079,696],{"class":560},[498,2081,564],{"class":523},[498,2083,650],{"class":519},[498,2085,569],{"class":523},[498,2087,623],{"class":519},[498,2089,2090,2092,2094,2097,2099,2102,2104,2106,2109,2112,2114,2117,2119],{"class":500,"line":633},[498,2091,1866],{"class":515},[498,2093,590],{"class":523},[498,2095,2096],{"class":519}," state",[498,2098,572],{"class":523},[498,2100,2101],{"class":519}," derived ",[498,2103,1211],{"class":523},[498,2105,604],{"class":523},[498,2107,2108],{"class":550}," useProtoMap",[498,2110,2111],{"class":519},"(fieldsMap",[498,2113,572],{"class":523},[498,2115,2116],{"class":519}," schema",[498,2118,489],{"class":523},[498,2120,2121],{"class":519},"fields)\n",[498,2123,2124],{"class":500,"line":639},[498,2125,630],{"emptyLinePlaceholder":629},[498,2127,2128],{"class":500,"line":679},[498,2129,2130],{"class":504},"// Collections also scope to the shared doc\n",[498,2132,2133,2135,2138,2140,2143,2146,2148,2151,2154,2156,2158,2160,2163,2165,2167,2169,2171,2174,2176],{"class":500,"line":707},[498,2134,1866],{"class":515},[498,2136,2137],{"class":519}," tasks ",[498,2139,524],{"class":523},[498,2141,2142],{"class":550}," useProtoCollection",[498,2144,2145],{"class":519},"(workspaceDoc",[498,2147,572],{"class":523},[498,2149,2150],{"class":523}," `",[498,2152,2153],{"class":560},"collection:",[498,2155,564],{"class":523},[498,2157,650],{"class":519},[498,2159,1211],{"class":523},[498,2161,2162],{"class":560},":tasks",[498,2164,557],{"class":523},[498,2166,572],{"class":523},[498,2168,2116],{"class":519},[498,2170,489],{"class":523},[498,2172,2173],{"class":519},"collections",[498,2175,489],{"class":523},[498,2177,2178],{"class":519},"tasks)\n",[460,2180,2182],{"id":2181},"schema-registry","Schema registry",[456,2184,2185],{},"Register all your tool schemas at startup:",[468,2187,2189],{"className":492,"code":2188,"language":494,"meta":477,"style":477},"// plugins/register-schemas.ts\nimport { estimatorSchema }  from '~/schemas/estimator'\nimport { trackerSchema }    from '~/schemas/tracker'\nimport { dashboardSchema }  from '~/schemas/dashboard'\n\nregisterPrototype(estimatorSchema)\nregisterPrototype(trackerSchema)\nregisterPrototype(dashboardSchema)\n",[475,2190,2191,2196,2219,2240,2260,2264,2272,2279],{"__ignoreMap":477},[498,2192,2193],{"class":500,"line":501},[498,2194,2195],{"class":504},"// plugins/register-schemas.ts\n",[498,2197,2198,2201,2203,2206,2208,2211,2213,2216],{"class":500,"line":508},[498,2199,2200],{"class":511},"import",[498,2202,590],{"class":523},[498,2204,2205],{"class":519}," estimatorSchema",[498,2207,601],{"class":523},[498,2209,2210],{"class":511},"  from",[498,2212,1270],{"class":523},[498,2214,2215],{"class":560},"~/schemas/estimator",[498,2217,2218],{"class":523},"'\n",[498,2220,2221,2223,2225,2228,2230,2233,2235,2238],{"class":500,"line":547},[498,2222,2200],{"class":511},[498,2224,590],{"class":523},[498,2226,2227],{"class":519}," trackerSchema",[498,2229,601],{"class":523},[498,2231,2232],{"class":511},"    from",[498,2234,1270],{"class":523},[498,2236,2237],{"class":560},"~/schemas/tracker",[498,2239,2218],{"class":523},[498,2241,2242,2244,2246,2249,2251,2253,2255,2258],{"class":500,"line":584},[498,2243,2200],{"class":511},[498,2245,590],{"class":523},[498,2247,2248],{"class":519}," dashboardSchema",[498,2250,601],{"class":523},[498,2252,2210],{"class":511},[498,2254,1270],{"class":523},[498,2256,2257],{"class":560},"~/schemas/dashboard",[498,2259,2218],{"class":523},[498,2261,2262],{"class":500,"line":626},[498,2263,630],{"emptyLinePlaceholder":629},[498,2265,2266,2269],{"class":500,"line":633},[498,2267,2268],{"class":550},"registerPrototype",[498,2270,2271],{"class":519},"(estimatorSchema)\n",[498,2273,2274,2276],{"class":500,"line":639},[498,2275,2268],{"class":550},[498,2277,2278],{"class":519},"(trackerSchema)\n",[498,2280,2281,2283],{"class":500,"line":679},[498,2282,2268],{"class":550},[498,2284,2285],{"class":519},"(dashboardSchema)\n",[456,2287,2288],{},"Then look up schemas by key anywhere:",[468,2290,2292],{"className":492,"code":2291,"language":494,"meta":477,"style":477},"const schema = getPrototype(toolKey)  // returns PrototypeSchema | undefined\n",[475,2293,2294],{"__ignoreMap":477},[498,2295,2296,2298,2300,2302,2304,2307],{"class":500,"line":501},[498,2297,1866],{"class":515},[498,2299,1938],{"class":519},[498,2301,524],{"class":523},[498,2303,1943],{"class":550},[498,2305,2306],{"class":519},"(toolKey)  ",[498,2308,2309],{"class":504},"// returns PrototypeSchema | undefined\n",[460,2311,2313],{"id":2312},"tool-grouping-and-stages","Tool grouping and stages",[456,2315,2316],{},"Organize tools into logical groups (stages, phases, categories) in a config object:",[468,2318,2320],{"className":492,"code":2319,"language":494,"meta":477,"style":477},"// utils/toolGroups.ts\nexport const TOOL_GROUPS = [\n  {\n    key: 'plan',\n    label: 'Planning',\n    icon: 'i-lucide-map',\n    tools: [\n      { key: 'estimator',  label: 'Cost Estimator', priority: 'high' },\n      { key: 'timeline',   label: 'Timeline',        priority: 'medium' },\n      { key: 'risk-matrix', label: 'Risk Matrix',    priority: 'low' },\n    ],\n  },\n  {\n    key: 'track',\n    label: 'Tracking',\n    icon: 'i-lucide-activity',\n    tools: [\n      { key: 'task-tracker', label: 'Task Tracker',  priority: 'high' },\n      { key: 'burn-rate',    label: 'Burn Rate',     priority: 'medium' },\n    ],\n  },\n]\n",[475,2321,2322,2327,2341,2346,2362,2378,2394,2403,2451,2496,2541,2548,2553,2557,2572,2587,2602,2610,2653,2696,2702,2706],{"__ignoreMap":477},[498,2323,2324],{"class":500,"line":501},[498,2325,2326],{"class":504},"// utils/toolGroups.ts\n",[498,2328,2329,2331,2333,2336,2338],{"class":500,"line":508},[498,2330,512],{"class":511},[498,2332,516],{"class":515},[498,2334,2335],{"class":519}," TOOL_GROUPS ",[498,2337,524],{"class":523},[498,2339,2340],{"class":519}," [\n",[498,2342,2343],{"class":500,"line":547},[498,2344,2345],{"class":523},"  {\n",[498,2347,2348,2351,2353,2355,2358,2360],{"class":500,"line":584},[498,2349,2350],{"class":610},"    key",[498,2352,534],{"class":523},[498,2354,1270],{"class":523},[498,2356,2357],{"class":560},"plan",[498,2359,742],{"class":523},[498,2361,1797],{"class":523},[498,2363,2364,2367,2369,2371,2374,2376],{"class":500,"line":626},[498,2365,2366],{"class":610},"    label",[498,2368,534],{"class":523},[498,2370,1270],{"class":523},[498,2372,2373],{"class":560},"Planning",[498,2375,742],{"class":523},[498,2377,1797],{"class":523},[498,2379,2380,2383,2385,2387,2390,2392],{"class":500,"line":633},[498,2381,2382],{"class":610},"    icon",[498,2384,534],{"class":523},[498,2386,1270],{"class":523},[498,2388,2389],{"class":560},"i-lucide-map",[498,2391,742],{"class":523},[498,2393,1797],{"class":523},[498,2395,2396,2399,2401],{"class":500,"line":639},[498,2397,2398],{"class":610},"    tools",[498,2400,534],{"class":523},[498,2402,2340],{"class":519},[498,2404,2405,2408,2411,2413,2415,2418,2420,2422,2425,2427,2429,2432,2434,2436,2439,2441,2443,2446,2448],{"class":500,"line":679},[498,2406,2407],{"class":523},"      {",[498,2409,2410],{"class":610}," key",[498,2412,534],{"class":523},[498,2414,1270],{"class":523},[498,2416,2417],{"class":560},"estimator",[498,2419,742],{"class":523},[498,2421,572],{"class":523},[498,2423,2424],{"class":610},"  label",[498,2426,534],{"class":523},[498,2428,1270],{"class":523},[498,2430,2431],{"class":560},"Cost Estimator",[498,2433,742],{"class":523},[498,2435,572],{"class":523},[498,2437,2438],{"class":610}," priority",[498,2440,534],{"class":523},[498,2442,1270],{"class":523},[498,2444,2445],{"class":560},"high",[498,2447,742],{"class":523},[498,2449,2450],{"class":523}," },\n",[498,2452,2453,2455,2457,2459,2461,2464,2466,2468,2471,2473,2475,2478,2480,2482,2485,2487,2489,2492,2494],{"class":500,"line":707},[498,2454,2407],{"class":523},[498,2456,2410],{"class":610},[498,2458,534],{"class":523},[498,2460,1270],{"class":523},[498,2462,2463],{"class":560},"timeline",[498,2465,742],{"class":523},[498,2467,572],{"class":523},[498,2469,2470],{"class":610},"   label",[498,2472,534],{"class":523},[498,2474,1270],{"class":523},[498,2476,2477],{"class":560},"Timeline",[498,2479,742],{"class":523},[498,2481,572],{"class":523},[498,2483,2484],{"class":610},"        priority",[498,2486,534],{"class":523},[498,2488,1270],{"class":523},[498,2490,2491],{"class":560},"medium",[498,2493,742],{"class":523},[498,2495,2450],{"class":523},[498,2497,2498,2500,2502,2504,2506,2509,2511,2513,2516,2518,2520,2523,2525,2527,2530,2532,2534,2537,2539],{"class":500,"line":713},[498,2499,2407],{"class":523},[498,2501,2410],{"class":610},[498,2503,534],{"class":523},[498,2505,1270],{"class":523},[498,2507,2508],{"class":560},"risk-matrix",[498,2510,742],{"class":523},[498,2512,572],{"class":523},[498,2514,2515],{"class":610}," label",[498,2517,534],{"class":523},[498,2519,1270],{"class":523},[498,2521,2522],{"class":560},"Risk Matrix",[498,2524,742],{"class":523},[498,2526,572],{"class":523},[498,2528,2529],{"class":610},"    priority",[498,2531,534],{"class":523},[498,2533,1270],{"class":523},[498,2535,2536],{"class":560},"low",[498,2538,742],{"class":523},[498,2540,2450],{"class":523},[498,2542,2543,2546],{"class":500,"line":718},[498,2544,2545],{"class":519},"    ]",[498,2547,1797],{"class":523},[498,2549,2550],{"class":500,"line":724},[498,2551,2552],{"class":523},"  },\n",[498,2554,2555],{"class":500,"line":752},[498,2556,2345],{"class":523},[498,2558,2559,2561,2563,2565,2568,2570],{"class":500,"line":757},[498,2560,2350],{"class":610},[498,2562,534],{"class":523},[498,2564,1270],{"class":523},[498,2566,2567],{"class":560},"track",[498,2569,742],{"class":523},[498,2571,1797],{"class":523},[498,2573,2574,2576,2578,2580,2583,2585],{"class":500,"line":790},[498,2575,2366],{"class":610},[498,2577,534],{"class":523},[498,2579,1270],{"class":523},[498,2581,2582],{"class":560},"Tracking",[498,2584,742],{"class":523},[498,2586,1797],{"class":523},[498,2588,2589,2591,2593,2595,2598,2600],{"class":500,"line":810},[498,2590,2382],{"class":610},[498,2592,534],{"class":523},[498,2594,1270],{"class":523},[498,2596,2597],{"class":560},"i-lucide-activity",[498,2599,742],{"class":523},[498,2601,1797],{"class":523},[498,2603,2604,2606,2608],{"class":500,"line":868},[498,2605,2398],{"class":610},[498,2607,534],{"class":523},[498,2609,2340],{"class":519},[498,2611,2612,2614,2616,2618,2620,2623,2625,2627,2629,2631,2633,2636,2638,2640,2643,2645,2647,2649,2651],{"class":500,"line":876},[498,2613,2407],{"class":523},[498,2615,2410],{"class":610},[498,2617,534],{"class":523},[498,2619,1270],{"class":523},[498,2621,2622],{"class":560},"task-tracker",[498,2624,742],{"class":523},[498,2626,572],{"class":523},[498,2628,2515],{"class":610},[498,2630,534],{"class":523},[498,2632,1270],{"class":523},[498,2634,2635],{"class":560},"Task Tracker",[498,2637,742],{"class":523},[498,2639,572],{"class":523},[498,2641,2642],{"class":610},"  priority",[498,2644,534],{"class":523},[498,2646,1270],{"class":523},[498,2648,2445],{"class":560},[498,2650,742],{"class":523},[498,2652,2450],{"class":523},[498,2654,2655,2657,2659,2661,2663,2666,2668,2670,2672,2674,2676,2679,2681,2683,2686,2688,2690,2692,2694],{"class":500,"line":881},[498,2656,2407],{"class":523},[498,2658,2410],{"class":610},[498,2660,534],{"class":523},[498,2662,1270],{"class":523},[498,2664,2665],{"class":560},"burn-rate",[498,2667,742],{"class":523},[498,2669,572],{"class":523},[498,2671,2366],{"class":610},[498,2673,534],{"class":523},[498,2675,1270],{"class":523},[498,2677,2678],{"class":560},"Burn Rate",[498,2680,742],{"class":523},[498,2682,572],{"class":523},[498,2684,2685],{"class":610},"     priority",[498,2687,534],{"class":523},[498,2689,1270],{"class":523},[498,2691,2491],{"class":560},[498,2693,742],{"class":523},[498,2695,2450],{"class":523},[498,2697,2698,2700],{"class":500,"line":886},[498,2699,2545],{"class":519},[498,2701,1797],{"class":523},[498,2703,2704],{"class":500,"line":911},[498,2705,2552],{"class":523},[498,2707,2708],{"class":500,"line":1561},[498,2709,2710],{"class":519},"]\n",[456,2712,2713],{},"Use this config to render the sidebar and to validate route params.",[460,2715,2717],{"id":2716},"status-tracking","Status tracking",[468,2719,2721],{"className":492,"code":2720,"language":494,"meta":477,"style":477},"const workspaceListStore = useWorkspaceListStore()\n\n// Auto-mark in-progress on first visit\nonMounted(() => {\n  const workspace = workspaceListStore.workspaces.find(w => w.id === workspaceId)\n  const alreadyStarted = workspace?.toolsUsed?.includes(toolKey) ||\n                         workspace?.toolsInProgress?.includes(toolKey)\n  if (!alreadyStarted) {\n    workspaceListStore.markToolStatus(workspaceId, toolKey, 'in-progress')\n  }\n})\n\n// \"Mark done\" action\nfunction markDone() {\n  workspaceListStore.markToolStatus(workspaceId, toolKey, 'done')\n}\n",[475,2722,2723,2737,2741,2746,2759,2801,2831,2850,2866,2894,2898,2904,2908,2913,2925,2952],{"__ignoreMap":477},[498,2724,2725,2727,2730,2732,2735],{"class":500,"line":501},[498,2726,1866],{"class":515},[498,2728,2729],{"class":519}," workspaceListStore ",[498,2731,524],{"class":523},[498,2733,2734],{"class":550}," useWorkspaceListStore",[498,2736,1126],{"class":519},[498,2738,2739],{"class":500,"line":508},[498,2740,630],{"emptyLinePlaceholder":629},[498,2742,2743],{"class":500,"line":547},[498,2744,2745],{"class":504},"// Auto-mark in-progress on first visit\n",[498,2747,2748,2751,2753,2755,2757],{"class":500,"line":584},[498,2749,2750],{"class":550},"onMounted",[498,2752,554],{"class":519},[498,2754,803],{"class":523},[498,2756,578],{"class":515},[498,2758,581],{"class":523},[498,2760,2761,2763,2766,2768,2771,2773,2775,2777,2780,2782,2785,2787,2790,2792,2794,2796,2799],{"class":500,"line":626},[498,2762,1010],{"class":515},[498,2764,2765],{"class":519}," workspace",[498,2767,604],{"class":523},[498,2769,2770],{"class":519}," workspaceListStore",[498,2772,489],{"class":523},[498,2774,1056],{"class":519},[498,2776,489],{"class":523},[498,2778,2779],{"class":550},"find",[498,2781,554],{"class":610},[498,2783,2784],{"class":530},"w",[498,2786,578],{"class":515},[498,2788,2789],{"class":519}," w",[498,2791,489],{"class":523},[498,2793,1157],{"class":519},[498,2795,1419],{"class":523},[498,2797,2798],{"class":519}," workspaceId",[498,2800,623],{"class":610},[498,2802,2803,2805,2808,2810,2812,2815,2817,2819,2822,2824,2826,2828],{"class":500,"line":633},[498,2804,1010],{"class":515},[498,2806,2807],{"class":519}," alreadyStarted",[498,2809,604],{"class":523},[498,2811,2765],{"class":519},[498,2813,2814],{"class":523},"?.",[498,2816,1369],{"class":519},[498,2818,2814],{"class":523},[498,2820,2821],{"class":550},"includes",[498,2823,554],{"class":610},[498,2825,650],{"class":519},[498,2827,1336],{"class":610},[498,2829,2830],{"class":523},"||\n",[498,2832,2833,2836,2838,2840,2842,2844,2846,2848],{"class":500,"line":639},[498,2834,2835],{"class":519},"                         workspace",[498,2837,2814],{"class":523},[498,2839,1403],{"class":519},[498,2841,2814],{"class":523},[498,2843,2821],{"class":550},[498,2845,554],{"class":610},[498,2847,650],{"class":519},[498,2849,623],{"class":610},[498,2851,2852,2855,2857,2859,2862,2864],{"class":500,"line":679},[498,2853,2854],{"class":511},"  if",[498,2856,527],{"class":610},[498,2858,1330],{"class":523},[498,2860,2861],{"class":519},"alreadyStarted",[498,2863,1336],{"class":610},[498,2865,1780],{"class":523},[498,2867,2868,2871,2873,2876,2878,2880,2882,2884,2886,2888,2890,2892],{"class":500,"line":707},[498,2869,2870],{"class":519},"    workspaceListStore",[498,2872,489],{"class":523},[498,2874,2875],{"class":550},"markToolStatus",[498,2877,554],{"class":610},[498,2879,531],{"class":519},[498,2881,572],{"class":523},[498,2883,1256],{"class":519},[498,2885,572],{"class":523},[498,2887,1270],{"class":523},[498,2889,1283],{"class":560},[498,2891,742],{"class":523},[498,2893,623],{"class":610},[498,2895,2896],{"class":500,"line":713},[498,2897,1232],{"class":523},[498,2899,2900,2902],{"class":500,"line":718},[498,2901,1211],{"class":523},[498,2903,623],{"class":519},[498,2905,2906],{"class":500,"line":724},[498,2907,630],{"emptyLinePlaceholder":629},[498,2909,2910],{"class":500,"line":752},[498,2911,2912],{"class":504},"// \"Mark done\" action\n",[498,2914,2915,2918,2921,2923],{"class":500,"line":757},[498,2916,2917],{"class":515},"function",[498,2919,2920],{"class":550}," markDone",[498,2922,803],{"class":523},[498,2924,581],{"class":523},[498,2926,2927,2930,2932,2934,2936,2938,2940,2942,2944,2946,2948,2950],{"class":500,"line":790},[498,2928,2929],{"class":519},"  workspaceListStore",[498,2931,489],{"class":523},[498,2933,2875],{"class":550},[498,2935,554],{"class":610},[498,2937,531],{"class":519},[498,2939,572],{"class":523},[498,2941,1256],{"class":519},[498,2943,572],{"class":523},[498,2945,1270],{"class":523},[498,2947,1292],{"class":560},[498,2949,742],{"class":523},[498,2951,623],{"class":610},[498,2953,2954],{"class":500,"line":810},[498,2955,1462],{"class":523},[456,2957,2958],{},"In the sidebar, read these sets to show completion indicators:",[922,2960,2961,2971,2980],{},[925,2962,2963,2966,2967,2970],{},[475,2964,2965],{},"toolsUsed.includes(key)"," → ",[475,2968,2969],{},"i-lucide-check-circle"," (done)",[925,2972,2973,2966,2976,2979],{},[475,2974,2975],{},"toolsInProgress.includes(key)",[475,2977,2978],{},"i-lucide-clock"," (in progress)",[925,2981,2982],{},"neither → default dot",[460,2984,2986],{"id":2985},"connection-indicators-ui","Connection indicators UI",[456,2988,2989],{},"Show the user which tools are feeding data in and which tools need linking:",[468,2991,2993],{"className":492,"code":2992,"language":494,"meta":477,"style":477},"// useSomeConnections.ts\nfunction useToolConnections(workspaceDoc: Y.Doc, toolKey: string) {\n  const schema = getPrototype(toolKey)\n  if (!schema?.consumes) return { active: [], missing: [] }\n\n  const active  = ref\u003Cstring[]>([])\n  const missing = ref\u003Cstring[]>([])\n\n  watchEffect(() => {\n    const found: string[] = []\n    const needed: string[] = []\n    for (const [alias, path] of Object.entries(schema.consumes!)) {\n      const [sourceKey] = path.split('.')\n      const outputMap = workspaceDoc.getMap(`outputs:${sourceKey}`)\n      // Check if source has produced any data\n      if (outputMap.size > 0) found.push(sourceKey)\n      else needed.push(sourceKey)\n    }\n    active.value  = found\n    missing.value = needed\n  })\n\n  return { active, missing }\n}\n",[475,2994,2995,3000,3033,3049,3091,3095,3119,3139,3143,3156,3175,3192,3238,3269,3299,3304,3341,3358,3362,3377,3391,3397,3401,3415],{"__ignoreMap":477},[498,2996,2997],{"class":500,"line":501},[498,2998,2999],{"class":504},"// useSomeConnections.ts\n",[498,3001,3002,3004,3007,3009,3012,3014,3016,3018,3021,3023,3025,3027,3029,3031],{"class":500,"line":508},[498,3003,2917],{"class":515},[498,3005,3006],{"class":550}," useToolConnections",[498,3008,554],{"class":523},[498,3010,3011],{"class":530},"workspaceDoc",[498,3013,534],{"class":523},[498,3015,660],{"class":537},[498,3017,489],{"class":523},[498,3019,3020],{"class":537},"Doc",[498,3022,572],{"class":523},[498,3024,1256],{"class":530},[498,3026,534],{"class":523},[498,3028,538],{"class":537},[498,3030,541],{"class":523},[498,3032,581],{"class":523},[498,3034,3035,3037,3039,3041,3043,3045,3047],{"class":500,"line":547},[498,3036,1010],{"class":515},[498,3038,2116],{"class":519},[498,3040,604],{"class":523},[498,3042,1943],{"class":550},[498,3044,554],{"class":610},[498,3046,650],{"class":519},[498,3048,623],{"class":610},[498,3050,3051,3053,3055,3057,3060,3062,3064,3066,3069,3071,3074,3076,3079,3081,3084,3086,3089],{"class":500,"line":584},[498,3052,2854],{"class":511},[498,3054,527],{"class":610},[498,3056,1330],{"class":523},[498,3058,3059],{"class":519},"schema",[498,3061,2814],{"class":523},[498,3063,933],{"class":519},[498,3065,1336],{"class":610},[498,3067,3068],{"class":511},"return",[498,3070,590],{"class":523},[498,3072,3073],{"class":610}," active",[498,3075,534],{"class":523},[498,3077,3078],{"class":610}," []",[498,3080,572],{"class":523},[498,3082,3083],{"class":610}," missing",[498,3085,534],{"class":523},[498,3087,3088],{"class":610}," [] ",[498,3090,1462],{"class":523},[498,3092,3093],{"class":500,"line":626},[498,3094,630],{"emptyLinePlaceholder":629},[498,3096,3097,3099,3101,3104,3107,3109,3111,3114,3116],{"class":500,"line":633},[498,3098,1010],{"class":515},[498,3100,3073],{"class":519},[498,3102,3103],{"class":523},"  =",[498,3105,3106],{"class":550}," ref",[498,3108,668],{"class":523},[498,3110,777],{"class":537},[498,3112,3113],{"class":610},"[]",[498,3115,674],{"class":523},[498,3117,3118],{"class":610},"([])\n",[498,3120,3121,3123,3125,3127,3129,3131,3133,3135,3137],{"class":500,"line":639},[498,3122,1010],{"class":515},[498,3124,3083],{"class":519},[498,3126,604],{"class":523},[498,3128,3106],{"class":550},[498,3130,668],{"class":523},[498,3132,777],{"class":537},[498,3134,3113],{"class":610},[498,3136,674],{"class":523},[498,3138,3118],{"class":610},[498,3140,3141],{"class":500,"line":679},[498,3142,630],{"emptyLinePlaceholder":629},[498,3144,3145,3148,3150,3152,3154],{"class":500,"line":707},[498,3146,3147],{"class":550},"  watchEffect",[498,3149,554],{"class":610},[498,3151,803],{"class":523},[498,3153,578],{"class":515},[498,3155,581],{"class":523},[498,3157,3158,3160,3163,3165,3167,3170,3172],{"class":500,"line":713},[498,3159,587],{"class":515},[498,3161,3162],{"class":519}," found",[498,3164,534],{"class":523},[498,3166,538],{"class":537},[498,3168,3169],{"class":610},"[] ",[498,3171,524],{"class":523},[498,3173,3174],{"class":610}," []\n",[498,3176,3177,3179,3182,3184,3186,3188,3190],{"class":500,"line":718},[498,3178,587],{"class":515},[498,3180,3181],{"class":519}," needed",[498,3183,534],{"class":523},[498,3185,538],{"class":537},[498,3187,3169],{"class":610},[498,3189,524],{"class":523},[498,3191,3174],{"class":610},[498,3193,3194,3197,3199,3201,3203,3206,3208,3211,3213,3216,3219,3221,3223,3225,3227,3229,3231,3233,3236],{"class":500,"line":724},[498,3195,3196],{"class":511},"    for",[498,3198,527],{"class":610},[498,3200,1866],{"class":515},[498,3202,1590],{"class":523},[498,3204,3205],{"class":519},"alias",[498,3207,572],{"class":523},[498,3209,3210],{"class":519}," path",[498,3212,1598],{"class":523},[498,3214,3215],{"class":523}," of",[498,3217,3218],{"class":519}," Object",[498,3220,489],{"class":523},[498,3222,818],{"class":550},[498,3224,554],{"class":610},[498,3226,3059],{"class":519},[498,3228,489],{"class":523},[498,3230,933],{"class":519},[498,3232,1330],{"class":523},[498,3234,3235],{"class":610},")) ",[498,3237,1780],{"class":523},[498,3239,3240,3243,3245,3248,3250,3252,3254,3256,3259,3261,3263,3265,3267],{"class":500,"line":752},[498,3241,3242],{"class":515},"      const",[498,3244,1590],{"class":523},[498,3246,3247],{"class":519},"sourceKey",[498,3249,1598],{"class":523},[498,3251,604],{"class":523},[498,3253,3210],{"class":519},[498,3255,489],{"class":523},[498,3257,3258],{"class":550},"split",[498,3260,554],{"class":610},[498,3262,742],{"class":523},[498,3264,489],{"class":560},[498,3266,742],{"class":523},[498,3268,623],{"class":610},[498,3270,3271,3273,3276,3278,3280,3282,3284,3286,3288,3291,3293,3295,3297],{"class":500,"line":757},[498,3272,3242],{"class":515},[498,3274,3275],{"class":519}," outputMap",[498,3277,604],{"class":523},[498,3279,2069],{"class":519},[498,3281,489],{"class":523},[498,3283,689],{"class":550},[498,3285,554],{"class":610},[498,3287,557],{"class":523},[498,3289,3290],{"class":560},"outputs:",[498,3292,564],{"class":523},[498,3294,3247],{"class":519},[498,3296,569],{"class":523},[498,3298,623],{"class":610},[498,3300,3301],{"class":500,"line":790},[498,3302,3303],{"class":504},"      // Check if source has produced any data\n",[498,3305,3306,3309,3311,3314,3316,3319,3322,3326,3328,3331,3333,3335,3337,3339],{"class":500,"line":810},[498,3307,3308],{"class":511},"      if",[498,3310,527],{"class":610},[498,3312,3313],{"class":519},"outputMap",[498,3315,489],{"class":523},[498,3317,3318],{"class":519},"size",[498,3320,3321],{"class":523}," >",[498,3323,3325],{"class":3324},"sbssI"," 0",[498,3327,1336],{"class":610},[498,3329,3330],{"class":519},"found",[498,3332,489],{"class":523},[498,3334,1775],{"class":550},[498,3336,554],{"class":610},[498,3338,3247],{"class":519},[498,3340,623],{"class":610},[498,3342,3343,3346,3348,3350,3352,3354,3356],{"class":500,"line":868},[498,3344,3345],{"class":511},"      else",[498,3347,3181],{"class":519},[498,3349,489],{"class":523},[498,3351,1775],{"class":550},[498,3353,554],{"class":610},[498,3355,3247],{"class":519},[498,3357,623],{"class":610},[498,3359,3360],{"class":500,"line":876},[498,3361,710],{"class":523},[498,3363,3364,3367,3369,3372,3374],{"class":500,"line":881},[498,3365,3366],{"class":519},"    active",[498,3368,489],{"class":523},[498,3370,3371],{"class":519},"value",[498,3373,3103],{"class":523},[498,3375,3376],{"class":519}," found\n",[498,3378,3379,3382,3384,3386,3388],{"class":500,"line":886},[498,3380,3381],{"class":519},"    missing",[498,3383,489],{"class":523},[498,3385,3371],{"class":519},[498,3387,604],{"class":523},[498,3389,3390],{"class":519}," needed\n",[498,3392,3393,3395],{"class":500,"line":911},[498,3394,914],{"class":523},[498,3396,623],{"class":610},[498,3398,3399],{"class":500,"line":1561},[498,3400,630],{"emptyLinePlaceholder":629},[498,3402,3403,3405,3407,3409,3411,3413],{"class":500,"line":1620},[498,3404,1681],{"class":511},[498,3406,590],{"class":523},[498,3408,3073],{"class":519},[498,3410,572],{"class":523},[498,3412,3083],{"class":519},[498,3414,908],{"class":523},[498,3416,3417],{"class":500,"line":1625},[498,3418,1462],{"class":523},[456,3420,3421],{},"Render \"Data flowing in from Cost Estimator\" banners for active connections and \"Link Timeline tool to unlock schedule data\" prompts for missing ones.",[460,3423,3425],{"id":3424},"minimal-viable-implementation-checklist","Minimal viable implementation checklist",[456,3427,3428],{},"To build a multi-tool workspace app with protokit:",[922,3430,3433,3447,3456,3467,3476,3482,3490,3499,3508,3514],{"className":3431},[3432],"contains-task-list",[925,3434,3437,3440,3441,3443,3444],{"className":3435},[3436],"task-list-item",[1077,3438],{"disabled":629,"type":3439},"checkbox"," ",[475,3442,392],{}," + Pinia store for the shared workspace ",[475,3445,3446],{},"Y.Doc",[925,3448,3450,3440,3452,3455],{"className":3449},[3436],[1077,3451],{"disabled":629,"type":3439},[475,3453,3454],{},"getToolMap(toolKey)"," helper for namespaced Y.Map access",[925,3457,3459,3461,3462,950,3465],{"className":3458},[3436],[1077,3460],{"disabled":629,"type":3439}," Workspace list store with ",[475,3463,3464],{},"createWorkspace",[475,3466,2875],{},[925,3468,3470,3472,3473,3475],{"className":3469},[3436],[1077,3471],{"disabled":629,"type":3439}," Schema registry (",[475,3474,2268],{}," in a plugin)",[925,3477,3479,3481],{"className":3478},[3436],[1077,3480],{"disabled":629,"type":3439}," Tool groups config for sidebar rendering",[925,3483,3485,3487,3488],{"className":3484},[3436],[1077,3486],{"disabled":629,"type":3439}," Dynamic route ",[475,3489,1809],{},[925,3491,3493,3440,3495,3498],{"className":3492},[3436],[1077,3494],{"disabled":629,"type":3439},[475,3496,3497],{},"provide('workspace-doc', doc)"," in the route page",[925,3500,3502,3440,3504,3507],{"className":3501},[3436],[1077,3503],{"disabled":629,"type":3439},[475,3505,3506],{},"inject('workspace-doc')"," in each tool wrapper component",[925,3509,3511,3513],{"className":3510},[3436],[1077,3512],{"disabled":629,"type":3439}," Connection indicator composable for upstream/downstream status",[925,3515,3517,3440,3519,3522,3523],{"className":3516},[3436],[1077,3518],{"disabled":629,"type":3439},[475,3520,3521],{},"ProtoCorruptionModal"," mounted globally in ",[475,3524,3525],{},"app.vue",[3527,3528,3529],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":477,"searchDepth":508,"depth":508,"links":3531},[3532,3533,3534,3535,3536,3537,3538,3539,3540,3541],{"id":462,"depth":508,"text":463},{"id":480,"depth":508,"text":481},{"id":960,"depth":508,"text":961},{"id":1712,"depth":508,"text":1713},{"id":2000,"depth":508,"text":2001},{"id":2181,"depth":508,"text":2182},{"id":2312,"depth":508,"text":2313},{"id":2716,"depth":508,"text":2717},{"id":2985,"depth":508,"text":2986},{"id":3424,"depth":508,"text":3425},"Patterns for building multi-tool applications with protokit — shared Y.js documents, workspace-scoped stores, staged navigation, and the produces/consumes data pipeline.","md",null,{},{"title":433},{"title":447,"description":3542},"g-6EcFUzq4bEYqEVchVoccM1SwkeMAZAeiKuGPYlM2M",[3550,3552],{"title":5,"path":428,"stem":429,"description":3551,"children":-1},"Advanced patterns for Nuxt Protokit — custom schemas, building reusable toolkits, and extensibility.",{"title":437,"path":438,"stem":439,"description":3553,"children":-1},"Real-world schema patterns — multi-threshold badges, null-safe connections, collection-driven charts, linked question responses, tab layouts with badges, and action toolbars.",1772977477621]