[{"data":1,"prerenderedAt":1235},["ShallowReactive",2],{"navigation-landing-en":3,"navigation-nuxt-auto-en":180,"navigation-nuxt-protokit-en":338,"/docs/nuxt-protokit/schemas/connections-en":444,"/docs/nuxt-protokit/schemas/connections-surround-en":1230},[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":1225},{"id":446,"title":447,"body":448,"description":1223,"extension":1224,"links":1225,"meta":1226,"navigation":1227,"ogImage":1225,"path":375,"seo":1228,"stem":376,"__hash__":1229},"nuxt_protokit/0.docs/4.nuxt-protokit/2.schemas/5.connections.md","Connections (Produces & Consumes)",{"type":449,"value":450,"toc":1208},"minimark",[451,456,465,470,481,525,532,610,613,634,640,698,705,728,735,741,985,992,996,1001,1014,1020,1032,1036,1043,1047,1050,1056,1059,1063,1070,1204],[452,453,455],"h1",{"id":454},"connections-produces-consumes","Connections — Produces & Consumes",[457,458,459,460,464],"p",{},"Tools rarely exist in isolation. A cost estimator produces a monthly burn figure that a runway calculator needs. A scoring tool produces aggregated ratings that a summary dashboard needs. The ",[461,462,463],"strong",{},"produces/consumes"," system wires these tools together reactively and offline-safely.",[466,467,469],"h2",{"id":468},"how-it-works","How it works",[471,472,477],"pre",{"className":473,"code":475,"language":476},[474],"language-text","┌───────────────────────────┐   outputs:costs Y.Map   ┌──────────────────────────┐\n│  cost-estimator schema    │  ─────────────────────► │  runway schema           │\n│                           │                         │                          │\n│  produces:                │                         │  consumes:               │\n│    monthly: derived.total │                         │    upstreamCost:         │\n│                           │                         │      'cost-estimator.monthly'│\n└───────────────────────────┘                         └──────────────────────────┘\n","text",[478,479,475],"code",{"__ignoreMap":480},"",[482,483,484,499,508,518],"ol",{},[485,486,487,488,491,492,495,496],"li",{},"The upstream tool's ",[478,489,490],{},"useProtoOutputs"," writes ",[478,493,494],{},"{ monthly: 12400 }"," into ",[478,497,498],{},"Y.Map 'outputs:cost-estimator'",[485,500,501,502,504,505],{},"The downstream tool's ",[478,503,490],{}," reads from that map and exposes it as ",[478,506,507],{},"connections.upstreamCost",[485,509,510,511,514,515],{},"Downstream ",[478,512,513],{},"derived"," functions receive ",[478,516,517],{},"ctx.connections.upstreamCost = 12400",[485,519,520,521,524],{},"When both tools share a ",[478,522,523],{},"Y.Doc",", this happens instantly and works fully offline",[466,526,528,529],{"id":527},"declaring-produces","Declaring ",[478,530,531],{},"produces",[471,533,537],{"className":534,"code":535,"language":536,"meta":480,"style":480},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","// cost-estimator schema\nproduces: {\n  monthly: 'derived.monthlyTotal',     // key → dot-path in compute context\n  annual:  'derived.annualTotal',\n}\n","typescript",[478,538,539,548,561,585,604],{"__ignoreMap":480},[540,541,544],"span",{"class":542,"line":543},"line",1,[540,545,547],{"class":546},"sHwdD","// cost-estimator schema\n",[540,549,551,554,558],{"class":542,"line":550},2,[540,552,531],{"class":553},"sBMFI",[540,555,557],{"class":556},"sMK4o",":",[540,559,560],{"class":556}," {\n",[540,562,564,567,569,572,576,579,582],{"class":542,"line":563},3,[540,565,566],{"class":553},"  monthly",[540,568,557],{"class":556},[540,570,571],{"class":556}," '",[540,573,575],{"class":574},"sfazB","derived.monthlyTotal",[540,577,578],{"class":556},"'",[540,580,581],{"class":556},",",[540,583,584],{"class":546},"     // key → dot-path in compute context\n",[540,586,588,591,593,596,599,601],{"class":542,"line":587},4,[540,589,590],{"class":553},"  annual",[540,592,557],{"class":556},[540,594,595],{"class":556},"  '",[540,597,598],{"class":574},"derived.annualTotal",[540,600,578],{"class":556},[540,602,603],{"class":556},",\n",[540,605,607],{"class":542,"line":606},5,[540,608,609],{"class":556},"}\n",[457,611,612],{},"Supported path prefixes:",[614,615,616,622,628],"ul",{},[485,617,618,621],{},[478,619,620],{},"'derived.keyName'"," — a computed derived value",[485,623,624,627],{},[478,625,626],{},"'fields.keyName'"," — a raw field value",[485,629,630,633],{},[478,631,632],{},"'collections.keyName'"," — an entire collection items array",[466,635,528,637],{"id":636},"declaring-consumes",[478,638,639],{},"consumes",[471,641,643],{"className":534,"code":642,"language":536,"meta":480,"style":480},"// runway schema\nconsumes: {\n  upstreamCost:   'cost-estimator.monthly',  // localAlias: 'sourceKey.producedKey'\n  upstreamAnnual: 'cost-estimator.annual',\n}\n",[478,644,645,650,658,678,694],{"__ignoreMap":480},[540,646,647],{"class":542,"line":543},[540,648,649],{"class":546},"// runway schema\n",[540,651,652,654,656],{"class":542,"line":550},[540,653,639],{"class":553},[540,655,557],{"class":556},[540,657,560],{"class":556},[540,659,660,663,665,668,671,673,675],{"class":542,"line":563},[540,661,662],{"class":553},"  upstreamCost",[540,664,557],{"class":556},[540,666,667],{"class":556},"   '",[540,669,670],{"class":574},"cost-estimator.monthly",[540,672,578],{"class":556},[540,674,581],{"class":556},[540,676,677],{"class":546},"  // localAlias: 'sourceKey.producedKey'\n",[540,679,680,683,685,687,690,692],{"class":542,"line":587},[540,681,682],{"class":553},"  upstreamAnnual",[540,684,557],{"class":556},[540,686,571],{"class":556},[540,688,689],{"class":574},"cost-estimator.annual",[540,691,578],{"class":556},[540,693,603],{"class":556},[540,695,696],{"class":542,"line":606},[540,697,609],{"class":556},[457,699,700,701,704],{},"Format: ",[478,702,703],{},"'sourceTool.sourceKey'"," where:",[614,706,707,719],{},[485,708,709,712,713,716,717],{},[478,710,711],{},"sourceTool"," — the ",[478,714,715],{},"key"," of the schema that declared ",[478,718,531],{},[485,720,721,724,725,727],{},[478,722,723],{},"sourceKey"," — the key inside that schema's ",[478,726,531],{}," map",[457,729,730,731,734],{},"Consumed values appear in ",[478,732,733],{},"ctx.connections"," under the local alias.",[466,736,738,739],{"id":737},"using-connections-in-derived","Using connections in ",[478,740,513],{},[471,742,744],{"className":534,"code":743,"language":536,"meta":480,"style":480},"// runway schema\nderived: {\n  effectiveMonthlyCost: {\n    compute: ({ fields, connections }) =>\n      // Use upstream value when available, fall back to local field\n      connections.upstreamCost ?? fields.localMonthlyCost,\n  },\n  runwayMonths: {\n    compute: ({ fields, derived }) =>\n      derived.effectiveMonthlyCost > 0\n        ? Math.floor(fields.availableFunds / derived.effectiveMonthlyCost)\n        : Infinity,\n    format: { type: 'number', decimals: 0, suffix: ' months' },\n  },\n}\n",[478,745,746,750,758,767,793,798,823,829,839,859,877,916,925,975,980],{"__ignoreMap":480},[540,747,748],{"class":542,"line":543},[540,749,649],{"class":546},[540,751,752,754,756],{"class":542,"line":550},[540,753,513],{"class":553},[540,755,557],{"class":556},[540,757,560],{"class":556},[540,759,760,763,765],{"class":542,"line":563},[540,761,762],{"class":553},"  effectiveMonthlyCost",[540,764,557],{"class":556},[540,766,560],{"class":556},[540,768,769,772,774,777,781,783,786,789],{"class":542,"line":587},[540,770,771],{"class":553},"    compute",[540,773,557],{"class":556},[540,775,776],{"class":556}," ({",[540,778,780],{"class":779},"sHdIc"," fields",[540,782,581],{"class":556},[540,784,785],{"class":779}," connections",[540,787,788],{"class":556}," })",[540,790,792],{"class":791},"spNyl"," =>\n",[540,794,795],{"class":542,"line":606},[540,796,797],{"class":546},"      // Use upstream value when available, fall back to local field\n",[540,799,801,805,808,811,814,816,818,821],{"class":542,"line":800},6,[540,802,804],{"class":803},"sTEyZ","      connections",[540,806,807],{"class":556},".",[540,809,810],{"class":803},"upstreamCost",[540,812,813],{"class":556}," ??",[540,815,780],{"class":803},[540,817,807],{"class":556},[540,819,820],{"class":803},"localMonthlyCost",[540,822,603],{"class":556},[540,824,826],{"class":542,"line":825},7,[540,827,828],{"class":556},"  },\n",[540,830,832,835,837],{"class":542,"line":831},8,[540,833,834],{"class":553},"  runwayMonths",[540,836,557],{"class":556},[540,838,560],{"class":556},[540,840,842,844,846,848,850,852,855,857],{"class":542,"line":841},9,[540,843,771],{"class":553},[540,845,557],{"class":556},[540,847,776],{"class":556},[540,849,780],{"class":779},[540,851,581],{"class":556},[540,853,854],{"class":779}," derived",[540,856,788],{"class":556},[540,858,792],{"class":791},[540,860,862,865,867,870,873],{"class":542,"line":861},10,[540,863,864],{"class":803},"      derived",[540,866,807],{"class":556},[540,868,869],{"class":803},"effectiveMonthlyCost",[540,871,872],{"class":556}," >",[540,874,876],{"class":875},"sbssI"," 0\n",[540,878,880,883,886,888,892,896,899,901,904,907,909,911,913],{"class":542,"line":879},11,[540,881,882],{"class":556},"        ?",[540,884,885],{"class":803}," Math",[540,887,807],{"class":556},[540,889,891],{"class":890},"s2Zo4","floor",[540,893,895],{"class":894},"swJcz","(",[540,897,898],{"class":803},"fields",[540,900,807],{"class":556},[540,902,903],{"class":803},"availableFunds",[540,905,906],{"class":556}," /",[540,908,854],{"class":803},[540,910,807],{"class":556},[540,912,869],{"class":803},[540,914,915],{"class":894},")\n",[540,917,919,922],{"class":542,"line":918},12,[540,920,921],{"class":556},"        :",[540,923,924],{"class":556}," Infinity,\n",[540,926,928,931,933,936,939,941,943,946,948,950,953,955,958,960,963,965,967,970,972],{"class":542,"line":927},13,[540,929,930],{"class":553},"    format",[540,932,557],{"class":556},[540,934,935],{"class":556}," {",[540,937,938],{"class":553}," type",[540,940,557],{"class":556},[540,942,571],{"class":556},[540,944,945],{"class":574},"number",[540,947,578],{"class":556},[540,949,581],{"class":556},[540,951,952],{"class":553}," decimals",[540,954,557],{"class":556},[540,956,957],{"class":875}," 0",[540,959,581],{"class":556},[540,961,962],{"class":553}," suffix",[540,964,557],{"class":556},[540,966,571],{"class":556},[540,968,969],{"class":574}," months",[540,971,578],{"class":556},[540,973,974],{"class":556}," },\n",[540,976,978],{"class":542,"line":977},14,[540,979,828],{"class":556},[540,981,983],{"class":542,"line":982},15,[540,984,609],{"class":556},[457,986,987,988,991],{},"Always guard against ",[478,989,990],{},"undefined"," connections — the upstream tool may not have run yet or may have no data.",[466,993,995],{"id":994},"same-doc-vs-cross-doc","Same-doc vs cross-doc",[997,998,1000],"h3",{"id":999},"same-ydoc-recommended","Same Y.Doc (recommended)",[457,1002,1003,1004,1006,1007,1009,1010,1013],{},"When all connected tools share a single ",[478,1005,523],{},", the produces/consumes flow is instant and fully offline-capable. ",[478,1008,490],{}," reads and writes ",[478,1011,1012],{},"Y.Map"," entries in the shared document.",[471,1015,1018],{"className":1016,"code":1017,"language":476},[474],"Y.Doc \"my-workspace-xyz\"\n├── Y.Map \"fields:cost-estimator\"     ← cost-estimator fields\n├── Y.Map \"outputs:cost-estimator\"    ← cost-estimator produces\n├── Y.Map \"fields:runway\"             ← runway fields\n└── Y.Map \"outputs:runway\"            ← runway produces\n",[478,1019,1017],{"__ignoreMap":480},[457,1021,1022,1023,1026,1027,1029,1030,807],{},"To share a Y.Doc across tools, pass the same ",[478,1024,1025],{},"doc"," object to each ",[478,1028,388],{}," call or use a common Pinia store that manages the shared ",[478,1031,523],{},[997,1033,1035],{"id":1034},"cross-doc-legacy-watcher","Cross-doc (legacy watcher)",[457,1037,1038,1039,1042],{},"When tools have separate documents, ",[478,1040,1041],{},"useProtoConnections"," observes the source document and copies values reactively. This requires both documents to be open simultaneously. For offline use, prefer the same-doc pattern.",[466,1044,1046],{"id":1045},"example-connection-graph","Example connection graph",[457,1048,1049],{},"A project management toolkit might have:",[471,1051,1054],{"className":1052,"code":1053,"language":476},[474],"time-tracker  ──produces──► cost-estimator    (hourly totals)\ncost-estimator ──produces──► runway            (monthly burn)\ncost-estimator ──produces──► profitability     (monthly burn)\nrevenue-model  ──produces──► profitability     (monthly revenue)\nprofitability  ──produces──► investor-summary  (margin, breakeven)\n",[478,1055,1053],{"__ignoreMap":480},[457,1057,1058],{},"Each tool is independently useful. The connections make them greater than the sum of their parts — and the whole graph works offline.",[466,1060,1062],{"id":1061},"building-a-connection-map","Building a connection map",[457,1064,1065,1066,1069],{},"If you have many tools, use ",[478,1067,1068],{},"buildConnectionMap"," to auto-generate the graph from schema declarations:",[471,1071,1073],{"className":534,"code":1072,"language":536,"meta":480,"style":480},"import { buildConnectionMap } from '~/utils/connectionMap'\nimport { allSchemas } from '~/schemas'\n\nconst map = buildConnectionMap(allSchemas)\n\nconst upstream   = getUpstreamTools('runway', map)    // ['cost-estimator']\nconst downstream = getDownstreamTools('cost-estimator', map) // ['runway', 'profitability']\n",[478,1074,1075,1100,1120,1126,1142,1146,1175],{"__ignoreMap":480},[540,1076,1077,1081,1083,1086,1089,1092,1094,1097],{"class":542,"line":543},[540,1078,1080],{"class":1079},"s7zQu","import",[540,1082,935],{"class":556},[540,1084,1085],{"class":803}," buildConnectionMap",[540,1087,1088],{"class":556}," }",[540,1090,1091],{"class":1079}," from",[540,1093,571],{"class":556},[540,1095,1096],{"class":574},"~/utils/connectionMap",[540,1098,1099],{"class":556},"'\n",[540,1101,1102,1104,1106,1109,1111,1113,1115,1118],{"class":542,"line":550},[540,1103,1080],{"class":1079},[540,1105,935],{"class":556},[540,1107,1108],{"class":803}," allSchemas",[540,1110,1088],{"class":556},[540,1112,1091],{"class":1079},[540,1114,571],{"class":556},[540,1116,1117],{"class":574},"~/schemas",[540,1119,1099],{"class":556},[540,1121,1122],{"class":542,"line":563},[540,1123,1125],{"emptyLinePlaceholder":1124},true,"\n",[540,1127,1128,1131,1134,1137,1139],{"class":542,"line":587},[540,1129,1130],{"class":791},"const",[540,1132,1133],{"class":803}," map ",[540,1135,1136],{"class":556},"=",[540,1138,1085],{"class":890},[540,1140,1141],{"class":803},"(allSchemas)\n",[540,1143,1144],{"class":542,"line":606},[540,1145,1125],{"emptyLinePlaceholder":1124},[540,1147,1148,1150,1153,1155,1158,1160,1162,1165,1167,1169,1172],{"class":542,"line":800},[540,1149,1130],{"class":791},[540,1151,1152],{"class":803}," upstream   ",[540,1154,1136],{"class":556},[540,1156,1157],{"class":890}," getUpstreamTools",[540,1159,895],{"class":803},[540,1161,578],{"class":556},[540,1163,1164],{"class":574},"runway",[540,1166,578],{"class":556},[540,1168,581],{"class":556},[540,1170,1171],{"class":803}," map)    ",[540,1173,1174],{"class":546},"// ['cost-estimator']\n",[540,1176,1177,1179,1182,1184,1187,1189,1191,1194,1196,1198,1201],{"class":542,"line":825},[540,1178,1130],{"class":791},[540,1180,1181],{"class":803}," downstream ",[540,1183,1136],{"class":556},[540,1185,1186],{"class":890}," getDownstreamTools",[540,1188,895],{"class":803},[540,1190,578],{"class":556},[540,1192,1193],{"class":574},"cost-estimator",[540,1195,578],{"class":556},[540,1197,581],{"class":556},[540,1199,1200],{"class":803}," map) ",[540,1202,1203],{"class":546},"// ['runway', 'profitability']\n",[1205,1206,1207],"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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .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 .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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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}",{"title":480,"searchDepth":550,"depth":550,"links":1209},[1210,1211,1213,1215,1217,1221,1222],{"id":468,"depth":550,"text":469},{"id":527,"depth":550,"text":1212},"Declaring produces",{"id":636,"depth":550,"text":1214},"Declaring consumes",{"id":737,"depth":550,"text":1216},"Using connections in derived",{"id":994,"depth":550,"text":995,"children":1218},[1219,1220],{"id":999,"depth":563,"text":1000},{"id":1034,"depth":563,"text":1035},{"id":1045,"depth":550,"text":1046},{"id":1061,"depth":550,"text":1062},"The produces/consumes system lets tools share computed data without tight coupling, forming a reactive data graph across your entire application.","md",null,{},{"title":374},{"title":447,"description":1223},"EkmvHacunubO4cTaPzAhQmuAcfJun09I6YzKlbSZ_ow",[1231,1233],{"title":370,"path":371,"stem":372,"description":1232,"children":-1},"Derived values are pure functions computed reactively from field values, other derived values, upstream connections, and collection items.",{"title":378,"path":379,"stem":380,"description":1234,"children":-1},"Built-in visualization types (progress, bar chart, comparison table, feature matrix, timeline) and custom dashboard layouts with tabs, rows, and columns.",1772977476266]