[{"data":1,"prerenderedAt":2169},["ShallowReactive",2],{"navigation_docs_en":3,"-en-reference-extensions-manifest":445,"-en-reference-extensions-manifest-surround":2164},[4,30,72,132,260,436],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"\u002Fen\u002Fgetting-started","en\u002F1.getting-started",[10,15,20,25],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fen\u002Fgetting-started\u002Fintroduction","en\u002F1.getting-started\u002F2.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Quickstart","\u002Fen\u002Fgetting-started\u002Finstallation","en\u002F1.getting-started\u002F3.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Use Cases","\u002Fen\u002Fgetting-started\u002Fuse-cases","en\u002F1.getting-started\u002F4.use-cases","i-lucide-layers",{"title":26,"path":27,"stem":28,"icon":29},"Concepts","\u002Fen\u002Fgetting-started\u002Fconcepts","en\u002F1.getting-started\u002F5.concepts","i-lucide-book",{"title":26,"path":31,"stem":32,"children":33,"page":6},"\u002Fen\u002Fconcepts","en\u002F2.concepts",[34,38,43,48,53,58,63,68],{"title":35,"path":36,"stem":37,"icon":14},"Organization","\u002Fen\u002Fconcepts\u002Forganization","en\u002F2.concepts\u002F1.organization",{"title":39,"path":40,"stem":41,"icon":42},"Data Model","\u002Fen\u002Fconcepts\u002Fdata-model","en\u002F2.concepts\u002F2.data-model","i-lucide-database",{"title":44,"path":45,"stem":46,"icon":47},"Access Control","\u002Fen\u002Fconcepts\u002Faccess-permissions","en\u002F2.concepts\u002F3.access-permissions","i-lucide-user-key",{"title":49,"path":50,"stem":51,"icon":52},"Audit Logs","\u002Fen\u002Fconcepts\u002Faudit-logs","en\u002F2.concepts\u002F4.audit-logs","i-lucide-scroll-text",{"title":54,"path":55,"stem":56,"icon":57},"Introspection","\u002Fen\u002Fconcepts\u002Fintrospection","en\u002F2.concepts\u002F6.introspection","i-lucide-database-search",{"title":59,"path":60,"stem":61,"icon":62},"Query Engine","\u002Fen\u002Fconcepts\u002Fquery-engine","en\u002F2.concepts\u002F7.query-engine","i-lucide-workflow",{"title":64,"path":65,"stem":66,"icon":67},"AI","\u002Fen\u002Fconcepts\u002Fai","en\u002F2.concepts\u002F8.ai","i-lucide-sparkles",{"title":69,"path":70,"stem":71,"icon":42},"Caching","\u002Fen\u002Fconcepts\u002Fcaching","en\u002F2.concepts\u002F9.caching",{"title":73,"path":74,"stem":75,"children":76,"page":6},"Guides","\u002Fen\u002Fguides","en\u002F4.guides",[77,82,87,92,97,102,107,112],{"title":78,"path":79,"stem":80,"icon":81},"REST API Quickstart","\u002Fen\u002Fguides\u002Frest-api","en\u002F4.guides\u002F1.rest-api","i-lucide-plug",{"title":83,"path":84,"stem":85,"icon":86},"SDK Quickstart","\u002Fen\u002Fguides\u002Fsdk","en\u002F4.guides\u002F2.sdk","i-lucide-terminal",{"title":88,"path":89,"stem":90,"icon":91},"Configure SSO","\u002Fen\u002Fguides\u002Fconfigure-sso","en\u002F4.guides\u002F3.configure-sso","i-lucide-key-round",{"title":93,"path":94,"stem":95,"icon":96},"Configure MCP","\u002Fen\u002Fguides\u002Fmcp","en\u002F4.guides\u002F4.mcp","i-lucide-brain-cog",{"title":98,"path":99,"stem":100,"icon":101},"Customize Content Space","\u002Fen\u002Fguides\u002Fcustomize-content-space","en\u002F4.guides\u002F5.customize-content-space","i-lucide-columns-3-cog",{"title":103,"path":104,"stem":105,"icon":106},"Build an Application with AI Assistance","\u002Fen\u002Fguides\u002Fbuild-an-application","en\u002F4.guides\u002F6.build-an-application","i-lucide-route",{"title":108,"path":109,"stem":110,"icon":111},"Horizontal Scaling","\u002Fen\u002Fguides\u002Fhorizontal-scaling","en\u002F4.guides\u002F7.horizontal-scaling","i-lucide-network",{"title":113,"icon":114,"path":115,"stem":116,"children":117,"page":6},"Data Connectors","i-lucide-cable","\u002Fen\u002Fguides\u002Fdata-connectors","en\u002F4.guides\u002F8.data-connectors",[118,122,127],{"title":16,"path":119,"stem":120,"icon":121},"\u002Fen\u002Fguides\u002Fdata-connectors\u002Fquickstart","en\u002F4.guides\u002F8.data-connectors\u002F1.quickstart","i-lucide-rocket",{"title":123,"path":124,"stem":125,"icon":126},"Build a Stripe Connector","\u002Fen\u002Fguides\u002Fdata-connectors\u002Fstripe","en\u002F4.guides\u002F8.data-connectors\u002F2.stripe","i-lucide-hammer",{"title":128,"path":129,"stem":130,"icon":131},"Build with AI Agents","\u002Fen\u002Fguides\u002Fdata-connectors\u002Fai-agents","en\u002F4.guides\u002F8.data-connectors\u002F3.ai-agents","i-lucide-bot",{"title":133,"path":134,"stem":135,"children":136,"page":6},"Developer","\u002Fen\u002Fdeveloper","en\u002F5.developer",[137,191,215,220],{"title":138,"path":139,"stem":140,"children":141,"page":6},"Data Access","\u002Fen\u002Fdeveloper\u002Fapi","en\u002F5.developer\u002F1.api",[142,147,152,157,162,167,172,177,182,186],{"title":143,"path":144,"stem":145,"icon":146},"Overview","\u002Fen\u002Fdeveloper\u002Fapi\u002Foverview","en\u002F5.developer\u002F1.api\u002F1.overview","i-lucide-globe",{"title":148,"path":149,"stem":150,"icon":151},"Errors","\u002Fen\u002Fdeveloper\u002Fapi\u002Ferrors","en\u002F5.developer\u002F1.api\u002F10.errors","i-lucide-alert-triangle",{"title":153,"path":154,"stem":155,"icon":156},"Authentication","\u002Fen\u002Fdeveloper\u002Fapi\u002Fauthentication","en\u002F5.developer\u002F1.api\u002F2.authentication","i-lucide-lock",{"title":158,"path":159,"stem":160,"icon":161},"Reading Data","\u002Fen\u002Fdeveloper\u002Fapi\u002Freading-data","en\u002F5.developer\u002F1.api\u002F3.reading-data","i-lucide-book-open",{"title":163,"path":164,"stem":165,"icon":166},"Writing Data","\u002Fen\u002Fdeveloper\u002Fapi\u002Fwriting-data","en\u002F5.developer\u002F1.api\u002F4.writing-data","i-lucide-pencil",{"title":168,"path":169,"stem":170,"icon":171},"Filtering","\u002Fen\u002Fdeveloper\u002Fapi\u002Ffiltering","en\u002F5.developer\u002F1.api\u002F5.filtering","i-lucide-filter",{"title":173,"path":174,"stem":175,"icon":176},"Field Selection","\u002Fen\u002Fdeveloper\u002Fapi\u002Ffield-selection","en\u002F5.developer\u002F1.api\u002F6.field-selection","i-lucide-list-checks",{"title":178,"path":179,"stem":180,"icon":181},"Sorting & Pagination","\u002Fen\u002Fdeveloper\u002Fapi\u002Fsorting-pagination","en\u002F5.developer\u002F1.api\u002F7.sorting-pagination","i-lucide-arrow-up-down",{"title":183,"path":184,"stem":185,"icon":111},"Relational Data","\u002Fen\u002Fdeveloper\u002Fapi\u002Frelational-data","en\u002F5.developer\u002F1.api\u002F8.relational-data",{"title":187,"path":188,"stem":189,"icon":190},"Files & Assets","\u002Fen\u002Fdeveloper\u002Fapi\u002Ffiles","en\u002F5.developer\u002F1.api\u002F9.files","i-lucide-file-up",{"title":192,"path":193,"stem":194,"children":195,"page":6},"Client SDK","\u002Fen\u002Fdeveloper\u002Fsdk","en\u002F5.developer\u002F2.sdk",[196,200,205,210],{"title":197,"path":198,"stem":199,"icon":19},"Installation","\u002Fen\u002Fdeveloper\u002Fsdk\u002Finstallation","en\u002F5.developer\u002F2.sdk\u002F1.installation",{"title":201,"path":202,"stem":203,"icon":204},"Client Setup","\u002Fen\u002Fdeveloper\u002Fsdk\u002Fclient-setup","en\u002F5.developer\u002F2.sdk\u002F2.client-setup","i-lucide-settings",{"title":206,"path":207,"stem":208,"icon":209},"Type System","\u002Fen\u002Fdeveloper\u002Fsdk\u002Ftype-system","en\u002F5.developer\u002F2.sdk\u002F3.type-system","i-lucide-braces",{"title":211,"path":212,"stem":213,"icon":214},"Advanced","\u002Fen\u002Fdeveloper\u002Fsdk\u002Fadvanced","en\u002F5.developer\u002F2.sdk\u002F5.advanced","i-lucide-puzzle",{"title":216,"path":217,"stem":218,"icon":219},"Application Users","\u002Fen\u002Fdeveloper\u002Fapplication-users","en\u002F5.developer\u002F3.application-users","i-lucide-users",{"title":221,"path":222,"stem":223,"children":224,"icon":214},"Extensions","\u002Fen\u002Fdeveloper\u002Fextensions","en\u002F5.developer\u002F3.extensions\u002Findex",[225,226,231],{"title":143,"path":222,"stem":223,"icon":214},{"title":227,"path":228,"stem":229,"icon":230},"Install and Manage Extensions","\u002Fen\u002Fdeveloper\u002Fextensions\u002Finstall","en\u002F5.developer\u002F3.extensions\u002F1.install","i-lucide-package-plus",{"title":113,"path":232,"stem":233,"children":234,"icon":114},"\u002Fen\u002Fdeveloper\u002Fextensions\u002Fdata-connectors","en\u002F5.developer\u002F3.extensions\u002F2.data-connectors\u002Findex",[235,236,241,245,250,255],{"title":143,"path":232,"stem":233,"icon":114},{"title":237,"path":238,"stem":239,"icon":240},"How Data Connectors Run","\u002Fen\u002Fdeveloper\u002Fextensions\u002Fdata-connectors\u002Fruntime","en\u002F5.developer\u002F3.extensions\u002F2.data-connectors\u002F2.runtime","i-lucide-cpu",{"title":242,"path":243,"stem":244,"icon":42},"Data Sources","\u002Fen\u002Fdeveloper\u002Fextensions\u002Fdata-connectors\u002Fdata-sources","en\u002F5.developer\u002F3.extensions\u002F2.data-connectors\u002F3.data-sources",{"title":246,"path":247,"stem":248,"icon":249},"Map an External Data Source","\u002Fen\u002Fdeveloper\u002Fextensions\u002Fdata-connectors\u002Fdata-source-mapping","en\u002F5.developer\u002F3.extensions\u002F2.data-connectors\u002F4.data-source-mapping","i-lucide-map",{"title":251,"path":252,"stem":253,"icon":254},"Handle Errors","\u002Fen\u002Fdeveloper\u002Fextensions\u002Fdata-connectors\u002Ferrors","en\u002F5.developer\u002F3.extensions\u002F2.data-connectors\u002F5.errors","i-lucide-shield-alert",{"title":256,"path":257,"stem":258,"icon":259},"Test a Data Connector","\u002Fen\u002Fdeveloper\u002Fextensions\u002Fdata-connectors\u002Ftesting","en\u002F5.developer\u002F3.extensions\u002F2.data-connectors\u002F6.testing","i-lucide-flask-conical",{"title":261,"path":262,"stem":263,"children":264,"page":6},"Reference","\u002Fen\u002Freference","en\u002F6.reference",[265,269,274,279,295,299,304,340,369,374],{"title":266,"path":267,"stem":268,"icon":204},"Configuration","\u002Fen\u002Freference\u002Fenvironment-variables","en\u002F6.reference\u002F1.environment-variables",{"title":270,"path":271,"stem":272,"icon":273},"System Requirements","\u002Fen\u002Freference\u002Fsystem-requirements","en\u002F6.reference\u002F2.system-requirements","i-lucide-server",{"title":275,"path":276,"stem":277,"icon":278},"Licensing","\u002Fen\u002Freference\u002Flicensing","en\u002F6.reference\u002F3.licensing","i-lucide-gem",{"title":280,"path":281,"stem":282,"children":283,"icon":81},"Connectors","\u002Fen\u002Freference\u002Fconnectors","en\u002F6.reference\u002F4.connectors\u002Findex",[284,285,290],{"title":280,"path":281,"stem":282,"icon":81},{"title":286,"path":287,"stem":288,"icon":289},"PostgreSQL and Supabase","\u002Fen\u002Freference\u002Fconnectors\u002Fpostgresql-supabase","en\u002F6.reference\u002F4.connectors\u002F1.postgresql-supabase","i-simple-icons-postgresql",{"title":291,"path":292,"stem":293,"icon":294},"MySQL and MariaDB","\u002Fen\u002Freference\u002Fconnectors\u002Fmysql-mariadb","en\u002F6.reference\u002F4.connectors\u002F2.mysql-mariadb","i-simple-icons-mysql",{"title":296,"path":297,"stem":298,"icon":209},"Data Types Representation","\u002Fen\u002Freference\u002Fdata-types","en\u002F6.reference\u002F5.data-types",{"title":300,"path":301,"stem":302,"icon":303},"Permissions Reference","\u002Fen\u002Freference\u002Fpermissions","en\u002F6.reference\u002F6.permissions","i-lucide-shield",{"title":305,"path":306,"stem":307,"children":308,"page":6},"API Reference","\u002Fen\u002Freference\u002Fapi-reference","en\u002F6.reference\u002F7.api-reference",[309,313,318],{"title":310,"path":311,"stem":312,"icon":273},"System Endpoints","\u002Fen\u002Freference\u002Fapi-reference\u002Fsystem-endpoints","en\u002F6.reference\u002F7.api-reference\u002F1.system-endpoints",{"title":314,"path":315,"stem":316,"icon":317},"OpenAPI Spec","\u002Fen\u002Freference\u002Fapi-reference\u002Fopenapi-spec","en\u002F6.reference\u002F7.api-reference\u002F2.openapi-spec","i-lucide-file-code",{"title":319,"path":320,"stem":321,"children":322,"icon":324},"Schema Migration","\u002Fen\u002Freference\u002Fapi-reference\u002Fschema-migration","en\u002F6.reference\u002F7.api-reference\u002F3.schema-migration\u002Findex",[323,325,330,335],{"title":319,"path":320,"stem":321,"icon":324},"i-lucide-database-zap",{"title":326,"path":327,"stem":328,"icon":329},"Apply Migrations","\u002Fen\u002Freference\u002Fapi-reference\u002Fschema-migration\u002Fapply-migrations","en\u002F6.reference\u002F7.api-reference\u002F3.schema-migration\u002F1.apply-migrations","i-lucide-upload",{"title":331,"path":332,"stem":333,"icon":334},"Import Changes","\u002Fen\u002Freference\u002Fapi-reference\u002Fschema-migration\u002Fimport-changes","en\u002F6.reference\u002F7.api-reference\u002F3.schema-migration\u002F2.import-changes","i-lucide-refresh-cw",{"title":336,"path":337,"stem":338,"icon":339},"Operation Reference","\u002Fen\u002Freference\u002Fapi-reference\u002Fschema-migration\u002Foperation-reference","en\u002F6.reference\u002F7.api-reference\u002F3.schema-migration\u002F3.operation-reference","i-lucide-list-tree",{"title":341,"path":342,"stem":343,"children":344,"page":6},"Design Considerations","\u002Fen\u002Freference\u002Fdesign-considerations","en\u002F6.reference\u002F8.design-considerations",[345,349,354,359,364],{"title":143,"path":346,"stem":347,"icon":348},"\u002Fen\u002Freference\u002Fdesign-considerations\u002Foverview","en\u002F6.reference\u002F8.design-considerations\u002F1.overview","i-lucide-compass",{"title":350,"path":351,"stem":352,"icon":353},"Instance Configuration","\u002Fen\u002Freference\u002Fdesign-considerations\u002Finstance-configuration-related-problems","en\u002F6.reference\u002F8.design-considerations\u002F3.instance-configuration-related-problems","i-lucide-wrench",{"title":355,"path":356,"stem":357,"icon":358},"Overly Permissive Public Access","\u002Fen\u002Freference\u002Fdesign-considerations\u002Foverly-permissive","en\u002F6.reference\u002F8.design-considerations\u002F4.overly-permissive","i-lucide-shield-off",{"title":360,"path":361,"stem":362,"icon":363},"No Aggregates","\u002Fen\u002Freference\u002Fdesign-considerations\u002Fno-aggregates","en\u002F6.reference\u002F8.design-considerations\u002F5.no-aggregates","i-lucide-sigma",{"title":365,"path":366,"stem":367,"icon":368},"Cross-Data-Source Referential Integrity","\u002Fen\u002Freference\u002Fdesign-considerations\u002Fcross-data-source-referential-integrity","en\u002F6.reference\u002F8.design-considerations\u002F6.cross-data-source-referential-integrity","i-lucide-unlink",{"title":370,"path":371,"stem":372,"icon":373},"CLI","\u002Fen\u002Freference\u002Fcli","en\u002F6.reference\u002F9.cli","i-lucide-square-terminal",{"title":221,"path":375,"stem":376,"children":377,"page":6},"\u002Fen\u002Freference\u002Fextensions","en\u002F6.reference\u002F9.extensions",[378,383,386,405],{"title":379,"path":380,"stem":381,"icon":382},"Extension Config and Manifest","\u002Fen\u002Freference\u002Fextensions\u002Fmanifest","en\u002F6.reference\u002F9.extensions\u002F1.manifest","i-lucide-file-json",{"title":370,"path":384,"stem":385,"icon":86},"\u002Fen\u002Freference\u002Fextensions\u002Fcli","en\u002F6.reference\u002F9.extensions\u002F2.cli",{"title":387,"path":388,"stem":389,"children":390,"page":6},"Extension Kit","\u002Fen\u002Freference\u002Fextensions\u002Fextension-kit","en\u002F6.reference\u002F9.extensions\u002F3.extension-kit",[391,395,400],{"title":392,"path":393,"stem":394,"icon":81},"Data Connector","\u002Fen\u002Freference\u002Fextensions\u002Fextension-kit\u002Fdata-connector","en\u002F6.reference\u002F9.extensions\u002F3.extension-kit\u002F1.data-connector",{"title":396,"path":397,"stem":398,"icon":399},"Protocol","\u002Fen\u002Freference\u002Fextensions\u002Fextension-kit\u002Fprotocol","en\u002F6.reference\u002F9.extensions\u002F3.extension-kit\u002F2.protocol","i-lucide-arrow-left-right",{"title":401,"path":402,"stem":403,"icon":404},"Schema Helpers","\u002Fen\u002Freference\u002Fextensions\u002Fextension-kit\u002Fexperimental","en\u002F6.reference\u002F9.extensions\u002F3.extension-kit\u002F3.experimental","i-lucide-blocks",{"title":113,"path":406,"stem":407,"children":408,"page":6},"\u002Fen\u002Freference\u002Fextensions\u002Fdata-connectors","en\u002F6.reference\u002F9.extensions\u002F4.data-connectors",[409,413,417,421,426,431],{"title":410,"path":411,"stem":412,"icon":81},"Data Connector API","\u002Fen\u002Freference\u002Fextensions\u002Fdata-connectors\u002Fapi","en\u002F6.reference\u002F9.extensions\u002F4.data-connectors\u002F1.api",{"title":414,"path":415,"stem":416,"icon":176},"Operations and Operators","\u002Fen\u002Freference\u002Fextensions\u002Fdata-connectors\u002Foperations","en\u002F6.reference\u002F9.extensions\u002F4.data-connectors\u002F2.operations",{"title":148,"path":418,"stem":419,"icon":420},"\u002Fen\u002Freference\u002Fextensions\u002Fdata-connectors\u002Ferrors","en\u002F6.reference\u002F9.extensions\u002F4.data-connectors\u002F3.errors","i-lucide-triangle-alert",{"title":422,"path":423,"stem":424,"icon":425},"Runtime Limits","\u002Fen\u002Freference\u002Fextensions\u002Fdata-connectors\u002Flimits","en\u002F6.reference\u002F9.extensions\u002F4.data-connectors\u002F4.limits","i-lucide-gauge",{"title":427,"path":428,"stem":429,"icon":430},"Limitations","\u002Fen\u002Freference\u002Fextensions\u002Fdata-connectors\u002Flimitations","en\u002F6.reference\u002F9.extensions\u002F4.data-connectors\u002F5.limitations","i-lucide-ban",{"title":432,"path":433,"stem":434,"icon":435},"Network Permissions","\u002Fen\u002Freference\u002Fextensions\u002Fdata-connectors\u002Fpermissions","en\u002F6.reference\u002F9.extensions\u002F4.data-connectors\u002F6.permissions","i-lucide-shield-check",{"title":437,"icon":121,"path":438,"stem":439,"children":440,"page":6},"Release Notes","\u002Fen\u002Frelease-notes","en\u002F7.release-notes",[441],{"title":442,"path":443,"stem":444,"icon":121},"Changelog","\u002Fen\u002Frelease-notes\u002Fchangelog","en\u002F7.release-notes\u002F1.changelog",{"id":446,"title":379,"body":447,"description":2157,"extension":2158,"links":2159,"meta":2160,"navigation":2161,"path":380,"seo":2162,"stem":381,"__hash__":2163},"docs_en\u002Fen\u002F6.reference\u002F9.extensions\u002F1.manifest.md",{"type":448,"value":449,"toc":2144},"minimark",[450,453,457,486,563,570,576,580,593,841,855,859,862,1049,1052,1064,1101,1106,1110,1117,1134,1235,1238,1242,1254,1353,1356,1359,1369,1430,1437,1451,1455,1466,1530,1538,1629,1705,1713,1720,1729,1738,1751,1755,1767,1775,1800,1803,2000,2003,2043,2047,2064,2075,2081,2088,2099,2111,2115,2140],[451,452],"preview",{},[454,455,143],"h2",{"id":456},"overview",[458,459,460,461,465,466,469,470,473,474,478,479,473,482,485],"p",{},"An ",[462,463,464],"strong",{},"extension"," is a package that adds capabilities to your Monospace ",[462,467,468],{},"instance"," (a running Monospace deployment). It has two JSON files. You write the ",[462,471,472],{},"extension config"," (",[475,476,477],"code",{},"extension.config.json",") in your project. The CLI builds it into the ",[462,480,481],{},"manifest",[475,483,484],{},"manifest.json","), which is the file your instance reads.",[487,488,489,506],"table",{},[490,491,492],"thead",{},[493,494,495,498,502],"tr",{},[496,497],"th",{},[496,499,500],{},[475,501,477],{},[496,503,504],{},[475,505,484],{},[507,508,509,523,534,550],"tbody",{},[493,510,511,515,518],{},[512,513,514],"td",{},"Written by",[512,516,517],{},"You",[512,519,520],{},[475,521,522],{},"monospace extension build",[493,524,525,528,531],{},[512,526,527],{},"Lives in",[512,529,530],{},"Your project root",[512,532,533],{},"The built extension directory",[493,535,536,541,544],{},[512,537,538],{},[475,539,540],{},"manifestVersion",[512,542,543],{},"Not allowed",[512,545,546,547],{},"Required, always ",[475,548,549],{},"1",[493,551,552,557,560],{},[512,553,554],{},[475,555,556],{},"$schema",[512,558,559],{},"Optional, for editor validation",[512,561,562],{},"Not allowed; the instance rejects it",[458,564,565,566,569],{},"Both files share every other field and the same JSON Schema rules. Unknown fields are rejected at every level of both files. Omit optional fields instead of setting them to ",[475,567,568],{},"null",".",[458,571,572,573,575],{},"The instance checks more than the schema when it loads a manifest. Some values pass the schema and ",[475,574,522],{}," but reject the extension at load time. Each entry type's reference lists its own load-time checks.",[454,577,579],{"id":578},"write-the-extension-config","Write the Extension Config",[458,581,582,583,588,589,592],{},"This extension config belongs to a data connector extension for the Art Institute of Chicago API and declares its one entry. It is the config the ",[584,585,587],"a",{"href":586},"\u002Fguides\u002Fdata-connectors\u002Fquickstart","Data Connector Quickstart"," builds. Every field inside the entry except ",[475,590,591],{},"type"," is defined by the data connector entry type:",[594,595,600],"pre",{"className":596,"code":597,"filename":477,"language":598,"meta":599,"style":599},"language-json shiki shiki-themes monospace-light monospace-light monospace-dark","{\n    \"$schema\": \".\u002Fnode_modules\u002F@monospace\u002Fcli\u002Fschemas\u002Fextension.config.schema.json\",\n    \"entries\": [\n        {\n            \"engine\": {\n                \"entrypoint\": \".\u002Fsrc\u002Fdata-connectors\u002Fartic\u002Findex.ts\",\n                \"permissions\": [\n                    { \"permission\": \"net:api.artic.edu\", \"reason\": \"Read artworks and artists from the Art Institute of Chicago API\" }\n                ]\n            },\n            \"icon\": \"lucide:landmark\",\n            \"id\": \"example\u002Fartic-connector\",\n            \"name\": \"Art Institute of Chicago\",\n            \"type\": \"dataConnector\",\n            \"version\": \"0.1.0\"\n        }\n    ],\n    \"icon\": \"lucide:landmark\",\n    \"id\": \"example\u002Fartic\",\n    \"name\": \"Art Institute of Chicago\",\n    \"version\": \"0.1.0\"\n}\n","json","",[475,601,602,611,628,637,643,652,665,673,701,707,713,726,739,752,765,776,782,788,800,813,825,835],{"__ignoreMap":599},[603,604,607],"span",{"class":605,"line":606},"line",1,[603,608,610],{"class":609},"sTMul","{\n",[603,612,614,618,621,625],{"class":605,"line":613},2,[603,615,617],{"class":616},"snHjA","    \"$schema\"",[603,619,620],{"class":609},": ",[603,622,624],{"class":623},"suKVh","\".\u002Fnode_modules\u002F@monospace\u002Fcli\u002Fschemas\u002Fextension.config.schema.json\"",[603,626,627],{"class":609},",\n",[603,629,631,634],{"class":605,"line":630},3,[603,632,633],{"class":616},"    \"entries\"",[603,635,636],{"class":609},": [\n",[603,638,640],{"class":605,"line":639},4,[603,641,642],{"class":609},"        {\n",[603,644,646,649],{"class":605,"line":645},5,[603,647,648],{"class":616},"            \"engine\"",[603,650,651],{"class":609},": {\n",[603,653,655,658,660,663],{"class":605,"line":654},6,[603,656,657],{"class":616},"                \"entrypoint\"",[603,659,620],{"class":609},[603,661,662],{"class":623},"\".\u002Fsrc\u002Fdata-connectors\u002Fartic\u002Findex.ts\"",[603,664,627],{"class":609},[603,666,668,671],{"class":605,"line":667},7,[603,669,670],{"class":616},"                \"permissions\"",[603,672,636],{"class":609},[603,674,676,679,682,684,687,690,693,695,698],{"class":605,"line":675},8,[603,677,678],{"class":609},"                    { ",[603,680,681],{"class":616},"\"permission\"",[603,683,620],{"class":609},[603,685,686],{"class":623},"\"net:api.artic.edu\"",[603,688,689],{"class":609},", ",[603,691,692],{"class":616},"\"reason\"",[603,694,620],{"class":609},[603,696,697],{"class":623},"\"Read artworks and artists from the Art Institute of Chicago API\"",[603,699,700],{"class":609}," }\n",[603,702,704],{"class":605,"line":703},9,[603,705,706],{"class":609},"                ]\n",[603,708,710],{"class":605,"line":709},10,[603,711,712],{"class":609},"            },\n",[603,714,716,719,721,724],{"class":605,"line":715},11,[603,717,718],{"class":616},"            \"icon\"",[603,720,620],{"class":609},[603,722,723],{"class":623},"\"lucide:landmark\"",[603,725,627],{"class":609},[603,727,729,732,734,737],{"class":605,"line":728},12,[603,730,731],{"class":616},"            \"id\"",[603,733,620],{"class":609},[603,735,736],{"class":623},"\"example\u002Fartic-connector\"",[603,738,627],{"class":609},[603,740,742,745,747,750],{"class":605,"line":741},13,[603,743,744],{"class":616},"            \"name\"",[603,746,620],{"class":609},[603,748,749],{"class":623},"\"Art Institute of Chicago\"",[603,751,627],{"class":609},[603,753,755,758,760,763],{"class":605,"line":754},14,[603,756,757],{"class":616},"            \"type\"",[603,759,620],{"class":609},[603,761,762],{"class":623},"\"dataConnector\"",[603,764,627],{"class":609},[603,766,768,771,773],{"class":605,"line":767},15,[603,769,770],{"class":616},"            \"version\"",[603,772,620],{"class":609},[603,774,775],{"class":623},"\"0.1.0\"\n",[603,777,779],{"class":605,"line":778},16,[603,780,781],{"class":609},"        }\n",[603,783,785],{"class":605,"line":784},17,[603,786,787],{"class":609},"    ],\n",[603,789,791,794,796,798],{"class":605,"line":790},18,[603,792,793],{"class":616},"    \"icon\"",[603,795,620],{"class":609},[603,797,723],{"class":623},[603,799,627],{"class":609},[603,801,803,806,808,811],{"class":605,"line":802},19,[603,804,805],{"class":616},"    \"id\"",[603,807,620],{"class":609},[603,809,810],{"class":623},"\"example\u002Fartic\"",[603,812,627],{"class":609},[603,814,816,819,821,823],{"class":605,"line":815},20,[603,817,818],{"class":616},"    \"name\"",[603,820,620],{"class":609},[603,822,749],{"class":623},[603,824,627],{"class":609},[603,826,828,831,833],{"class":605,"line":827},21,[603,829,830],{"class":616},"    \"version\"",[603,832,620],{"class":609},[603,834,775],{"class":623},[603,836,838],{"class":605,"line":837},22,[603,839,840],{"class":609},"}\n",[458,842,843,844,846,847,850,851,854],{},"The ",[475,845,556],{}," path resolves to the JSON Schema that ships with ",[475,848,849],{},"@monospace\u002Fcli",", so your editor validates the file as you type. ",[475,852,853],{},"monospace extension create"," writes this line for you.",[454,856,858],{"id":857},"extension-fields","Extension Fields",[458,860,861],{},"These fields sit at the root of both files and apply to every extension, whatever its entries are.",[487,863,864,880],{},[490,865,866],{},[493,867,868,871,874,877],{},[496,869,870],{},"Field",[496,872,873],{},"Type",[496,875,876],{},"Required",[496,878,879],{},"Rules",[507,881,882,902,920,934,949,967,983,999,1018,1031],{},[493,883,884,889,892,895],{},[512,885,886],{},[475,887,888],{},"id",[512,890,891],{},"string",[512,893,894],{},"Yes",[512,896,897,898],{},"The extension's identifier, in ",[584,899,901],{"href":900},"#id-format","id format",[493,903,904,909,911,913],{},[512,905,906],{},[475,907,908],{},"version",[512,910,891],{},[512,912,894],{},[512,914,915,916],{},"The extension's release, in ",[584,917,919],{"href":918},"#version-format","version format",[493,921,922,927,929,931],{},[512,923,924],{},[475,925,926],{},"name",[512,928,891],{},[512,930,894],{},[512,932,933],{},"Display name. Must contain at least one non-whitespace character",[493,935,936,941,943,946],{},[512,937,938],{},[475,939,940],{},"description",[512,942,891],{},[512,944,945],{},"No",[512,947,948],{},"Display description",[493,950,951,956,958,960],{},[512,952,953],{},[475,954,955],{},"icon",[512,957,891],{},[512,959,945],{},[512,961,962,963],{},"Icon name. See ",[584,964,966],{"href":965},"#icons","Icons",[493,968,969,974,976,978],{},[512,970,971],{},[475,972,973],{},"iconForeground",[512,975,891],{},[512,977,945],{},[512,979,980,981],{},"Glyph color of a one-color icon. See ",[584,982,966],{"href":965},[493,984,985,990,992,994],{},[512,986,987],{},[475,988,989],{},"iconBackground",[512,991,891],{},[512,993,945],{},[512,995,996,997],{},"Tile color behind the icon. See ",[584,998,966],{"href":965},[493,1000,1001,1006,1009,1011],{},[512,1002,1003],{},[475,1004,1005],{},"entries",[512,1007,1008],{},"array",[512,1010,894],{},[512,1012,1013,1014],{},"At least one entry. See ",[584,1015,1017],{"href":1016},"#entry-types","Entry Types",[493,1019,1020,1024,1026,1028],{},[512,1021,1022],{},[475,1023,556],{},[512,1025,891],{},[512,1027,945],{},[512,1029,1030],{},"Extension config only. Editor schema location; the build removes it",[493,1032,1033,1037,1040,1043],{},[512,1034,1035],{},[475,1036,540],{},[512,1038,1039],{},"number",[512,1041,1042],{},"Manifest only",[512,1044,1045,1046,1048],{},"Always ",[475,1047,549],{},". Versions the manifest format, not your extension",[454,1050,1017],{"id":1051},"entry-types",[458,1053,460,1054,1057,1058,1060,1061,1063],{},[462,1055,1056],{},"entry"," is one capability your extension contributes. Its ",[475,1059,591],{}," decides which other fields the entry has and what its code must do. The instance and the build reject any ",[475,1062,591],{}," not listed here.",[487,1065,1066,1080],{},[490,1067,1068],{},[493,1069,1070,1074,1077],{},[496,1071,1072],{},[475,1073,591],{},[496,1075,1076],{},"Entry",[496,1078,1079],{},"Fields and code contract",[507,1081,1082],{},[493,1083,1084,1089,1096],{},[512,1085,1086],{},[475,1087,1088],{},"dataConnector",[512,1090,1091,1092],{},"A data connector: code that exposes an external data source as ",[584,1093,1095],{"href":1094},"\u002Fconcepts\u002Fdata-model#collections","collections",[512,1097,1098],{},[584,1099,410],{"href":1100},"\u002Freference\u002Fextensions\u002Fdata-connectors\u002Fapi#declare-the-entry",[458,1102,1103,1105],{},[475,1104,1088],{}," is the only entry type today. Each entry type's reference defines the entry's other fields, how the instance runs it, and what it may access.",[454,1107,1109],{"id":1108},"id-format","Id Format",[458,1111,1112,1113,1116],{},"Extension and entry ids use the same format, ",[475,1114,1115],{},"namespace\u002Fname",":",[1118,1119,1120,1128,1131],"ul",{},[1121,1122,1123,1124,1127],"li",{},"Exactly one ",[475,1125,1126],{},"\u002F"," separating two segments.",[1121,1129,1130],{},"Each segment uses lowercase ASCII letters and digits, with single hyphens between groups.",[1121,1132,1133],{},"No leading, trailing or repeated hyphens, no uppercase, no underscores, no whitespace.",[487,1135,1136,1149],{},[490,1137,1138],{},[493,1139,1140,1143,1146],{},[496,1141,1142],{},"Id",[496,1144,1145],{},"Valid",[496,1147,1148],{},"Reason",[507,1150,1151,1162,1173,1185,1197,1209,1221],{},[493,1152,1153,1158,1160],{},[512,1154,1155],{},[475,1156,1157],{},"acme\u002Fart-institute",[512,1159,894],{},[512,1161],{},[493,1163,1164,1169,1171],{},[512,1165,1166],{},[475,1167,1168],{},"123\u002F456",[512,1170,894],{},[512,1172],{},[493,1174,1175,1180,1182],{},[512,1176,1177],{},[475,1178,1179],{},"art-institute",[512,1181,945],{},[512,1183,1184],{},"No namespace",[493,1186,1187,1192,1194],{},[512,1188,1189],{},[475,1190,1191],{},"Acme\u002Fart-institute",[512,1193,945],{},[512,1195,1196],{},"Uppercase",[493,1198,1199,1204,1206],{},[512,1200,1201],{},[475,1202,1203],{},"acme\u002Fart--institute",[512,1205,945],{},[512,1207,1208],{},"Repeated hyphen",[493,1210,1211,1216,1218],{},[512,1212,1213],{},[475,1214,1215],{},"acme\u002Fart_institute",[512,1217,945],{},[512,1219,1220],{},"Underscore",[493,1222,1223,1228,1230],{},[512,1224,1225],{},[475,1226,1227],{},"acme\u002Fart\u002Finstitute",[512,1229,945],{},[512,1231,1232,1233],{},"More than one ",[475,1234,1126],{},[458,1236,1237],{},"Entry ids are global across the instance. When two installed entries share an id, the instance loads the first one and skips the other with a warning. Two extensions with the same extension id follow the same rule. The instance scans extension directories in sorted order and skips the later one.",[454,1239,1241],{"id":1240},"version-format","Version Format",[458,1243,1244,1246,1247,1253],{},[475,1245,908],{}," takes an exact ",[584,1248,1252],{"href":1249,"rel":1250},"https:\u002F\u002Fsemver.org\u002Fspec\u002Fv2.0.0.html",[1251],"nofollow","SemVer 2.0.0"," version. Prerelease and build metadata are allowed.",[487,1255,1256,1267],{},[490,1257,1258],{},[493,1259,1260,1263,1265],{},[496,1261,1262],{},"Version",[496,1264,1145],{},[496,1266,1148],{},[507,1268,1269,1280,1291,1302,1317,1329,1341],{},[493,1270,1271,1276,1278],{},[512,1272,1273],{},[475,1274,1275],{},"0.1.0",[512,1277,894],{},[512,1279],{},[493,1281,1282,1287,1289],{},[512,1283,1284],{},[475,1285,1286],{},"2.3.0-beta.1+build.7",[512,1288,894],{},[512,1290],{},[493,1292,1293,1298,1300],{},[512,1294,1295],{},[475,1296,1297],{},"1.0.0+001",[512,1299,894],{},[512,1301],{},[493,1303,1304,1312,1314],{},[512,1305,1306,689,1309],{},[475,1307,1308],{},"^1.0.0",[475,1310,1311],{},"latest",[512,1313,945],{},[512,1315,1316],{},"Ranges and tags are rejected",[493,1318,1319,1324,1326],{},[512,1320,1321],{},[475,1322,1323],{},"1.0",[512,1325,945],{},[512,1327,1328],{},"Incomplete",[493,1330,1331,1336,1338],{},[512,1332,1333],{},[475,1334,1335],{},"01.0.0",[512,1337,945],{},[512,1339,1340],{},"Leading zero",[493,1342,1343,1348,1350],{},[512,1344,1345],{},[475,1346,1347],{},"1.0.0-01",[512,1349,945],{},[512,1351,1352],{},"Leading zero in a numeric prerelease",[458,1354,1355],{},"The instance doesn't compare versions. Overwriting an installed extension with a lower version downgrades it without complaint.",[454,1357,966],{"id":1358},"icons",[458,1360,1361,689,1363,1365,1366,1368],{},[475,1362,955],{},[475,1364,973],{}," and ",[475,1367,989],{}," are free-form strings in both files. The extension and each entry set their own. Studio renders them as follows:",[487,1370,1371,1380],{},[490,1372,1373],{},[493,1374,1375,1377],{},[496,1376,870],{},[496,1378,1379],{},"Rendered as",[507,1381,1382,1404,1417],{},[493,1383,1384,1388],{},[512,1385,1386],{},[475,1387,955],{},[512,1389,460,1390,1395,1396,1399,1400,1403],{},[584,1391,1394],{"href":1392,"rel":1393},"https:\u002F\u002Ficon-sets.iconify.design\u002F",[1251],"Iconify"," name in ",[475,1397,1398],{},"prefix:name"," form (e.g., ",[475,1401,1402],{},"lucide:landmark",")",[493,1405,1406,1410],{},[512,1407,1408],{},[475,1409,973],{},[512,1411,1412,1413,1416],{},"The color of a one-color icon's glyph (e.g., ",[475,1414,1415],{},"#ffffff","). A full-color logo keeps its own colors and ignores it. Without it, the glyph is white on a filled tile and a muted neutral otherwise",[493,1418,1419,1423],{},[512,1420,1421],{},[475,1422,989],{},[512,1424,1425,1426,1429],{},"The color of the tile behind the icon (e.g., ",[475,1427,1428],{},"#8b5cf6","). Without it, the tile uses the theme's neutral surface",[458,1431,1432,1433,1436],{},"Studio ignores a color value it can't parse. Both files reject ",[475,1434,1435],{},"iconColor"," as an unknown field.",[458,1438,1439,1440,1443,1444,1445,1448,1449,569],{},"Lucide icons (",[475,1441,1442],{},"lucide:*",") ship with Studio. "," Studio's extension list shows ",[475,1446,1447],{},"lucide:blocks"," for an extension without ",[475,1450,955],{},[454,1452,1454],{"id":1453},"capabilities","Capabilities",[458,1456,1457,1458,1461,1462,1465],{},"A data connector entry declares its ",[462,1459,1460],{},"query capabilities"," in ",[475,1463,1464],{},"engine.capabilities.query",". Each value is a promise about what the connector's answers to writes carry, on every collection of every data source that uses the entry:",[487,1467,1468,1478],{},[490,1469,1470],{},[493,1471,1472,1475],{},[496,1473,1474],{},"Value",[496,1476,1477],{},"The connector promises",[507,1479,1480,1497,1514],{},[493,1481,1482,1487],{},[512,1483,1484],{},[475,1485,1486],{},"insertReturning",[512,1488,1489,1490,1493,1494],{},"The answer to ",[475,1491,1492],{},"create"," carries the created items, each with every field in the request's ",[475,1495,1496],{},"select",[493,1498,1499,1504],{},[512,1500,1501],{},[475,1502,1503],{},"updateReturning",[512,1505,1506,1507,1365,1510,1513],{},"The answers to ",[475,1508,1509],{},"updateMany",[475,1511,1512],{},"updateOne"," carry the updated items that way",[493,1515,1516,1521],{},[512,1517,1518],{},[475,1519,1520],{},"deleteReturning",[512,1522,1506,1523,1365,1526,1529],{},[475,1524,1525],{},"deleteMany",[475,1527,1528],{},"deleteOne"," carry the deleted items that way",[458,1531,1532,1533,1537],{},"The Stripe connector from ",[584,1534,1536],{"href":1535},"\u002Fguides\u002Fdata-connectors\u002Fstripe","Build a Stripe Data Connector"," answers every write with the items it wrote. Creates and updates answer the objects Stripe returns, and deletes answer the items read before deleting. Its entry declares all three:",[594,1539,1542],{"className":596,"code":1540,"filename":1541,"language":598,"meta":599,"style":599},"{\n    \"capabilities\": { \"query\": [\"insertReturning\", \"updateReturning\", \"deleteReturning\"] },\n    \"entrypoint\": \".\u002Fsrc\u002Fdata-connectors\u002Fstripe\u002Findex.ts\",\n    \"permissions\": [\n        { \"permission\": \"net:api.stripe.com\", \"reason\": \"Read and write customers, products and prices through the Stripe API\" }\n    ]\n}\n","engine in extension.config.json",[475,1543,1544,1548,1578,1590,1597,1620,1625],{"__ignoreMap":599},[603,1545,1546],{"class":605,"line":606},[603,1547,610],{"class":609},[603,1549,1550,1553,1556,1559,1562,1565,1567,1570,1572,1575],{"class":605,"line":613},[603,1551,1552],{"class":616},"    \"capabilities\"",[603,1554,1555],{"class":609},": { ",[603,1557,1558],{"class":616},"\"query\"",[603,1560,1561],{"class":609},": [",[603,1563,1564],{"class":623},"\"insertReturning\"",[603,1566,689],{"class":609},[603,1568,1569],{"class":623},"\"updateReturning\"",[603,1571,689],{"class":609},[603,1573,1574],{"class":623},"\"deleteReturning\"",[603,1576,1577],{"class":609},"] },\n",[603,1579,1580,1583,1585,1588],{"class":605,"line":630},[603,1581,1582],{"class":616},"    \"entrypoint\"",[603,1584,620],{"class":609},[603,1586,1587],{"class":623},"\".\u002Fsrc\u002Fdata-connectors\u002Fstripe\u002Findex.ts\"",[603,1589,627],{"class":609},[603,1591,1592,1595],{"class":605,"line":639},[603,1593,1594],{"class":616},"    \"permissions\"",[603,1596,636],{"class":609},[603,1598,1599,1602,1604,1606,1609,1611,1613,1615,1618],{"class":605,"line":645},[603,1600,1601],{"class":609},"        { ",[603,1603,681],{"class":616},[603,1605,620],{"class":609},[603,1607,1608],{"class":623},"\"net:api.stripe.com\"",[603,1610,689],{"class":609},[603,1612,692],{"class":616},[603,1614,620],{"class":609},[603,1616,1617],{"class":623},"\"Read and write customers, products and prices through the Stripe API\"",[603,1619,700],{"class":609},[603,1621,1622],{"class":605,"line":654},[603,1623,1624],{"class":609},"    ]\n",[603,1626,1627],{"class":605,"line":667},[603,1628,840],{"class":609},[487,1630,1631,1641],{},[490,1632,1633],{},[493,1634,1635,1638],{},[496,1636,1637],{},"Rule",[496,1639,1640],{},"Detail",[507,1642,1643,1660,1682,1690],{},[493,1644,1645,1648],{},[512,1646,1647],{},"Shape",[512,1649,1650,1652,1653,1656,1657,1659],{},[475,1651,1453],{}," is an object whose only key is ",[475,1654,1655],{},"query",". ",[475,1658,1655],{}," is an array of unique values from the table above, in any order",[493,1661,1662,1665],{},[512,1663,1664],{},"Absent",[512,1666,1667,1668,689,1670,1365,1673,1676,1677,1679,1680],{},"An absent ",[475,1669,1453],{},[475,1671,1672],{},"\"capabilities\": {}",[475,1674,1675],{},"\"query\": []"," all declare no capability. ",[475,1678,853],{}," scaffolds an entry without ",[475,1681,1453],{},[493,1683,1684,1687],{},[512,1685,1686],{},"Read-only connectors",[512,1688,1689],{},"Declare nothing. The capabilities only change how Engine writes",[493,1691,1692,1695],{},[512,1693,1694],{},"In the manifest",[512,1696,1697,1698,1701,1702,1704],{},"The build copies ",[475,1699,1700],{},"engine.capabilities"," into ",[475,1703,484],{}," unchanged",[458,1706,1707,1708,1712],{},"Without a capability, Engine gets the written items through extra calls of its own, and the collection's declaration must carry them. ",[584,1709,1711],{"href":1710},"\u002Freference\u002Fextensions\u002Fdata-connectors\u002Foperations#declare-query-capabilities","Declare Query Capabilities"," lists those calls and the rules they add.",[458,1714,1715,1716,569],{},"Engine reads the capabilities when it builds a workspace. A restart loads a build with new capabilities directly. With automatic reloading on, loading a build whose capabilities differ deactivates the data sources that use the entry until the instance restarts or the workspace is rebuilt. See ",[584,1717,1719],{"href":1718},"\u002Fdeveloper\u002Fextensions\u002Fdata-connectors\u002Fdata-sources#update-data-sources-after-an-extension-update","Update Data Sources After an Extension Update",[458,1721,1722,1724,1725,1728],{},[475,1723,522],{}," rejects any other value or key before it writes anything. A value outside the three, including the same name in PascalCase (",[475,1726,1727],{},"InsertReturning","), fails with:",[594,1730,1736],{"className":1731,"code":1733,"filename":1734,"language":1735,"meta":599},[1732],"language-text","error: extension.config.json does not match the extension contract:\n  \u002Fentries\u002F0\u002Fengine\u002Fcapabilities\u002Fquery\u002F0 must be one of \"insertReturning\", \"updateReturning\", \"deleteReturning\"\n  Nothing was changed.\n  fix: Correct each field listed above. Unknown fields are rejected.\n","terminal","text",[475,1737,1733],{"__ignoreMap":599},[458,1739,1740,1741,1743,1744,1747,1748,569],{},"An unknown key next to ",[475,1742,1655],{}," fails with ",[475,1745,1746],{},"\u002Fentries\u002F0\u002Fengine\u002Fcapabilities has an unknown field \"schema\"",", and a value listed twice with ",[475,1749,1750],{},"\u002Fentries\u002F0\u002Fengine\u002Fcapabilities\u002Fquery must NOT have duplicate items (items ## 0 and 1 are identical)",[454,1752,1754],{"id":1753},"build-the-manifest","Build the Manifest",[458,1756,1757,1759,1760,1762,1763,1766],{},[475,1758,522],{}," validates the extension config, bundles each entry, and writes ",[475,1761,484],{},". See ",[584,1764,370],{"href":1765},"\u002Freference\u002Fextensions\u002Fcli"," for flags and errors.",[458,1768,1769,1770,1116],{},"The build changes three things and copies everything else unchanged, including an entry's ",[584,1771,1773],{"href":1772},"#capabilities",[475,1774,1700],{},[1776,1777,1778,1783,1790],"ol",{},[1121,1779,1780,1781,569],{},"Removes ",[475,1782,556],{},[1121,1784,1785,1786,1789],{},"Adds ",[475,1787,1788],{},"\"manifestVersion\": 1"," after the other fields.",[1121,1791,1792,1793,1796,1797,569],{},"Points each entry at its built code. For a data connector entry, ",[475,1794,1795],{},"engine.entrypoint"," becomes the built file, named ",[475,1798,1799],{},"\u003Centry id>.js",[458,1801,1802],{},"The extension config above builds into this manifest, with the config's key order:",[594,1804,1807],{"className":596,"code":1805,"filename":1806,"language":598,"meta":599,"style":599},"{\n    \"entries\": [\n        {\n            \"engine\": {\n                \"entrypoint\": \"example\u002Fartic-connector.js\",\n                \"permissions\": [\n                    {\n                        \"permission\": \"net:api.artic.edu\",\n                        \"reason\": \"Read artworks and artists from the Art Institute of Chicago API\"\n                    }\n                ]\n            },\n            \"icon\": \"lucide:landmark\",\n            \"id\": \"example\u002Fartic-connector\",\n            \"name\": \"Art Institute of Chicago\",\n            \"type\": \"dataConnector\",\n            \"version\": \"0.1.0\"\n        }\n    ],\n    \"icon\": \"lucide:landmark\",\n    \"id\": \"example\u002Fartic\",\n    \"name\": \"Art Institute of Chicago\",\n    \"version\": \"0.1.0\",\n    \"manifestVersion\": 1\n}\n","dist\u002Fmanifest.json",[475,1808,1809,1813,1819,1823,1829,1840,1846,1851,1862,1872,1877,1881,1885,1895,1905,1915,1925,1933,1937,1941,1951,1961,1971,1983,1995],{"__ignoreMap":599},[603,1810,1811],{"class":605,"line":606},[603,1812,610],{"class":609},[603,1814,1815,1817],{"class":605,"line":613},[603,1816,633],{"class":616},[603,1818,636],{"class":609},[603,1820,1821],{"class":605,"line":630},[603,1822,642],{"class":609},[603,1824,1825,1827],{"class":605,"line":639},[603,1826,648],{"class":616},[603,1828,651],{"class":609},[603,1830,1831,1833,1835,1838],{"class":605,"line":645},[603,1832,657],{"class":616},[603,1834,620],{"class":609},[603,1836,1837],{"class":623},"\"example\u002Fartic-connector.js\"",[603,1839,627],{"class":609},[603,1841,1842,1844],{"class":605,"line":654},[603,1843,670],{"class":616},[603,1845,636],{"class":609},[603,1847,1848],{"class":605,"line":667},[603,1849,1850],{"class":609},"                    {\n",[603,1852,1853,1856,1858,1860],{"class":605,"line":675},[603,1854,1855],{"class":616},"                        \"permission\"",[603,1857,620],{"class":609},[603,1859,686],{"class":623},[603,1861,627],{"class":609},[603,1863,1864,1867,1869],{"class":605,"line":703},[603,1865,1866],{"class":616},"                        \"reason\"",[603,1868,620],{"class":609},[603,1870,1871],{"class":623},"\"Read artworks and artists from the Art Institute of Chicago API\"\n",[603,1873,1874],{"class":605,"line":709},[603,1875,1876],{"class":609},"                    }\n",[603,1878,1879],{"class":605,"line":715},[603,1880,706],{"class":609},[603,1882,1883],{"class":605,"line":728},[603,1884,712],{"class":609},[603,1886,1887,1889,1891,1893],{"class":605,"line":741},[603,1888,718],{"class":616},[603,1890,620],{"class":609},[603,1892,723],{"class":623},[603,1894,627],{"class":609},[603,1896,1897,1899,1901,1903],{"class":605,"line":754},[603,1898,731],{"class":616},[603,1900,620],{"class":609},[603,1902,736],{"class":623},[603,1904,627],{"class":609},[603,1906,1907,1909,1911,1913],{"class":605,"line":767},[603,1908,744],{"class":616},[603,1910,620],{"class":609},[603,1912,749],{"class":623},[603,1914,627],{"class":609},[603,1916,1917,1919,1921,1923],{"class":605,"line":778},[603,1918,757],{"class":616},[603,1920,620],{"class":609},[603,1922,762],{"class":623},[603,1924,627],{"class":609},[603,1926,1927,1929,1931],{"class":605,"line":784},[603,1928,770],{"class":616},[603,1930,620],{"class":609},[603,1932,775],{"class":623},[603,1934,1935],{"class":605,"line":790},[603,1936,781],{"class":609},[603,1938,1939],{"class":605,"line":802},[603,1940,787],{"class":609},[603,1942,1943,1945,1947,1949],{"class":605,"line":815},[603,1944,793],{"class":616},[603,1946,620],{"class":609},[603,1948,723],{"class":623},[603,1950,627],{"class":609},[603,1952,1953,1955,1957,1959],{"class":605,"line":827},[603,1954,805],{"class":616},[603,1956,620],{"class":609},[603,1958,810],{"class":623},[603,1960,627],{"class":609},[603,1962,1963,1965,1967,1969],{"class":605,"line":837},[603,1964,818],{"class":616},[603,1966,620],{"class":609},[603,1968,749],{"class":623},[603,1970,627],{"class":609},[603,1972,1974,1976,1978,1981],{"class":605,"line":1973},23,[603,1975,830],{"class":616},[603,1977,620],{"class":609},[603,1979,1980],{"class":623},"\"0.1.0\"",[603,1982,627],{"class":609},[603,1984,1986,1989,1991],{"class":605,"line":1985},24,[603,1987,1988],{"class":616},"    \"manifestVersion\"",[603,1990,620],{"class":609},[603,1992,1994],{"class":1993},"ssBNi","1\n",[603,1996,1998],{"class":605,"line":1997},25,[603,1999,840],{"class":609},[458,2001,2002],{},"The build also rejects what the schema alone can't catch:",[487,2004,2005,2015],{},[490,2006,2007],{},[493,2008,2009,2012],{},[496,2010,2011],{},"Problem",[496,2013,2014],{},"Result",[507,2016,2017,2025,2035],{},[493,2018,2019,2022],{},[512,2020,2021],{},"A key repeated in the same JSON object",[512,2023,2024],{},"The build fails and names the key and line",[493,2026,2027,2032],{},[512,2028,2029,2030],{},"Two entries with the same ",[475,2031,888],{},[512,2033,2034],{},"The build fails",[493,2036,2037,2040],{},[512,2038,2039],{},"Comments or trailing commas",[512,2041,2042],{},"The build fails; the file must be plain JSON",[454,2044,2046],{"id":2045},"install-directory-layout","Install Directory Layout",[458,2048,2049,2050,2055,2056,2059,2060,2063],{},"Your instance loads extensions from the directory set by ",[2051,2052],"env-var",{"name":2053,"section":2054},"extensions__install_location","extensions",". It defaults to ",[475,2057,2058],{},".\u002Fextensions",", relative to the instance's working directory. See ",[584,2061,227],{"href":2062},"\u002Fdeveloper\u002Fextensions\u002Finstall"," for how to place extensions there.",[458,2065,2066,2067,2070,2071,569],{},"A running instance picks up changed files on its next start. With ",[2051,2068],{"name":2069,"section":2054},"extensions__auto_reload"," on, it reloads them automatically once the files stop changing. Auto-reload is off by default and needs the install directory to exist when the instance starts. See ",[584,2072,2074],{"href":2073},"\u002Fdeveloper\u002Fextensions\u002Finstall#reload-extensions-automatically","Reload Extensions Automatically",[458,2076,2077,2078,2080],{},"Each extension is one top-level directory with ",[475,2079,484],{}," at its root:",[594,2082,2086],{"className":2083,"code":2084,"filename":2085,"language":1735,"meta":599},[1732],"extensions\u002F\n└── example__artic\u002F\n    ├── manifest.json\n    └── example\u002F\n        └── artic-connector.js\n","extensions\u002F",[475,2087,2084],{"__ignoreMap":599},[458,2089,2090,2091,2094,2095,2098],{},"The instance reads every top-level directory and ignores the directory name. It skips top-level symlinks, so place a real directory there, not a link to your build output. ",[475,2092,2093],{},"monospace extension build --install-to"," names the directory ",[475,2096,2097],{},"\u003Cnamespace>__\u003Cname>"," after the extension id.",[458,2100,2101,2102,2106,2107,569],{},"The instance skips an extension whose manifest fails validation, logs a warning, and loads the others. On a reload, an installed extension whose manifest has become invalid is treated as removed. For what that means for data connectors, see ",[584,2103,2105],{"href":2104},"\u002Fdeveloper\u002Fextensions\u002Fdata-connectors\u002Fdata-sources#before-you-remove-an-extension","Before You Remove an Extension",". Each entry type adds its own checks on the files an entry points to. For data connectors, see ",[584,2108,2110],{"href":2109},"\u002Freference\u002Fextensions\u002Fdata-connectors\u002Fapi#entrypoint-rules","Entrypoint Rules",[454,2112,2114],{"id":2113},"see-also","See Also",[1118,2116,2117,2127,2132],{},[1121,2118,2119,620,2121,1365,2124],{},[584,2120,370],{"href":1765},[475,2122,2123],{},"extension create",[475,2125,2126],{},"extension build",[1121,2128,2129,2131],{},[584,2130,227],{"href":2062},": place, reload and remove extensions",[1121,2133,2134,2136,2137,2139],{},[584,2135,410],{"href":1100},": the fields and code contract of a ",[475,2138,1088],{}," entry",[2141,2142,2143],"style",{},"html pre.shiki code .sTMul, html code.shiki .sTMul{--shiki-light:#1F2937;--shiki-default:#1F2937;--shiki-dark:#94A3B8}html pre.shiki code .snHjA, html code.shiki .snHjA{--shiki-light:#124BC4;--shiki-default:#124BC4;--shiki-dark:#5B8EF4}html pre.shiki code .suKVh, html code.shiki .suKVh{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#F8FAFC}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 .ssBNi, html code.shiki .ssBNi{--shiki-light:#1659E9;--shiki-default:#1659E9;--shiki-dark:#94B3F5}",{"title":599,"searchDepth":613,"depth":613,"links":2145},[2146,2147,2148,2149,2150,2151,2152,2153,2154,2155,2156],{"id":456,"depth":613,"text":143},{"id":578,"depth":613,"text":579},{"id":857,"depth":613,"text":858},{"id":1051,"depth":613,"text":1017},{"id":1108,"depth":613,"text":1109},{"id":1240,"depth":613,"text":1241},{"id":1358,"depth":613,"text":966},{"id":1453,"depth":613,"text":1454},{"id":1753,"depth":613,"text":1754},{"id":2045,"depth":613,"text":2046},{"id":2113,"depth":613,"text":2114},"Reference for extension.config.json, the manifest.json the CLI builds from it, and the install directory layout.","md",null,{},{"icon":382},{"title":379,"description":2157},"wvNL8ntJJhJ63SIc9Upz4M0ANPPUFEDmecRVqR3mc0o",[2165,2167],{"title":370,"path":371,"stem":372,"description":2166,"icon":373,"children":-1},"Reference for the Monospace CLI — its commands, flags, target and credential resolution, JSON output, and exit codes.",{"title":370,"path":384,"stem":385,"description":2168,"icon":86,"children":-1},"Reference for the monospace extension create and monospace extension build commands, their flags, output and exit codes.",1790840088765]