@omniharmonic/openspace-cli 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/README.md +11 -1
  2. package/dist/{agents-md-2DTXWUZQ.js → agents-md-3W4PIY4N.js} +2 -2
  3. package/dist/bin.js +2 -2
  4. package/dist/chunk-6NIIOHOX.js +39190 -0
  5. package/dist/chunk-6NIIOHOX.js.map +1 -0
  6. package/dist/{chunk-3F6TAUAT.js → chunk-7I6IJI6Z.js} +9184 -874
  7. package/dist/chunk-7I6IJI6Z.js.map +1 -0
  8. package/dist/index.d.ts +2 -0
  9. package/dist/index.js +2 -2
  10. package/dist/starter/site/AGENTS.md +11 -4
  11. package/dist/templates/beacon/content/collections/events/_collection.json +13 -0
  12. package/dist/templates/beacon/content/collections/events/keeper-training-november.mdoc +14 -0
  13. package/dist/templates/beacon/content/collections/events/planting-day-harbour-ward.mdoc +14 -0
  14. package/dist/templates/beacon/content/collections/events/planting-day-linden-north.mdoc +14 -0
  15. package/dist/templates/beacon/content/collections/news/2026-09-12-heat-map-2026.mdoc +13 -0
  16. package/dist/templates/beacon/content/collections/news/2026-09-30-school-gardens-harvest.mdoc +13 -0
  17. package/dist/templates/beacon/content/collections/news/2026-10-14-planting-season-begins.mdoc +13 -0
  18. package/dist/templates/beacon/content/collections/news/_collection.json +16 -0
  19. package/dist/templates/beacon/content/pages/about.json +572 -0
  20. package/dist/templates/beacon/content/pages/contact.json +260 -0
  21. package/dist/templates/beacon/content/pages/donate.json +406 -0
  22. package/dist/templates/beacon/content/pages/get-involved.json +412 -0
  23. package/dist/templates/beacon/content/pages/home.json +701 -0
  24. package/dist/templates/beacon/content/pages/our-work.json +855 -0
  25. package/dist/templates/beacon/content/site.json +363 -0
  26. package/dist/templates/beacon/content/styles.json +17 -0
  27. package/dist/templates/beacon/media/LICENSES.json +163 -0
  28. package/dist/templates/beacon/openspace.json +21 -0
  29. package/dist/templates/beacon/template.json +113 -0
  30. package/dist/templates/commons/content/pages/{members.json → directory.json} +15 -15
  31. package/dist/templates/commons/content/pages/home.json +1 -1
  32. package/dist/templates/commons/content/site.json +2 -2
  33. package/dist/templates/commons/template.json +2 -2
  34. package/dist/templates/darkroom/content/collections/work/_collection.json +13 -0
  35. package/dist/templates/darkroom/content/collections/work/after-hours.mdoc +28 -0
  36. package/dist/templates/darkroom/content/collections/work/dry-season.mdoc +28 -0
  37. package/dist/templates/darkroom/content/collections/work/faces-of-the-guild.mdoc +28 -0
  38. package/dist/templates/darkroom/content/collections/work/two-weddings.mdoc +28 -0
  39. package/dist/templates/darkroom/content/collections/work/white-lines.mdoc +28 -0
  40. package/dist/templates/darkroom/content/pages/about.json +449 -0
  41. package/dist/templates/darkroom/content/pages/contact.json +185 -0
  42. package/dist/templates/darkroom/content/pages/home.json +636 -0
  43. package/dist/templates/darkroom/content/pages/services.json +636 -0
  44. package/dist/templates/darkroom/content/site.json +264 -0
  45. package/dist/templates/darkroom/content/styles.json +17 -0
  46. package/dist/templates/darkroom/media/LICENSES.json +284 -0
  47. package/dist/templates/darkroom/openspace.json +21 -0
  48. package/dist/templates/darkroom/template.json +103 -0
  49. package/dist/templates/encore/content/pages/home.json +86 -0
  50. package/dist/templates/encore/media/LICENSES.json +22 -0
  51. package/dist/templates/field-notes/content/pages/home.json +94 -0
  52. package/dist/templates/fixwell/content/pages/about.json +508 -0
  53. package/dist/templates/fixwell/content/pages/contact.json +321 -0
  54. package/dist/templates/fixwell/content/pages/home.json +888 -0
  55. package/dist/templates/fixwell/content/pages/pricing.json +467 -0
  56. package/dist/templates/fixwell/content/pages/services.json +648 -0
  57. package/dist/templates/fixwell/content/site.json +293 -0
  58. package/dist/templates/fixwell/content/styles.json +17 -0
  59. package/dist/templates/fixwell/media/LICENSES.json +119 -0
  60. package/dist/templates/fixwell/openspace.json +21 -0
  61. package/dist/templates/fixwell/template.json +108 -0
  62. package/dist/templates/folio/content/collections/projects/_collection.json +13 -0
  63. package/dist/templates/folio/content/collections/projects/field-notes-app.mdoc +28 -0
  64. package/dist/templates/folio/content/collections/projects/harbour-health-dashboards.mdoc +28 -0
  65. package/dist/templates/folio/content/collections/projects/open-budget.mdoc +28 -0
  66. package/dist/templates/folio/content/collections/projects/transit-times.mdoc +28 -0
  67. package/dist/templates/folio/content/collections/writing/2026-08-30-designing-for-night-shifts.mdoc +9 -0
  68. package/dist/templates/folio/content/collections/writing/2026-09-20-testing-with-real-data.mdoc +9 -0
  69. package/dist/templates/folio/content/collections/writing/2026-10-12-one-honest-number.mdoc +9 -0
  70. package/dist/templates/folio/content/collections/writing/_collection.json +16 -0
  71. package/dist/templates/folio/content/pages/about.json +366 -0
  72. package/dist/templates/folio/content/pages/contact.json +218 -0
  73. package/dist/templates/folio/content/pages/experience.json +552 -0
  74. package/dist/templates/folio/content/pages/home.json +410 -0
  75. package/dist/templates/folio/content/site.json +186 -0
  76. package/dist/templates/folio/content/styles.json +17 -0
  77. package/dist/templates/folio/media/LICENSES.json +229 -0
  78. package/dist/templates/folio/openspace.json +21 -0
  79. package/dist/templates/folio/template.json +103 -0
  80. package/dist/templates/gather/content/collections/fringe/_collection.json +13 -0
  81. package/dist/templates/gather/content/collections/fringe/library-open-studio.mdoc +14 -0
  82. package/dist/templates/gather/content/collections/fringe/morning-run.mdoc +14 -0
  83. package/dist/templates/gather/content/collections/fringe/plain-language-pub-quiz.mdoc +14 -0
  84. package/dist/templates/gather/content/pages/about.json +435 -0
  85. package/dist/templates/gather/content/pages/contact.json +196 -0
  86. package/dist/templates/gather/content/pages/home.json +527 -0
  87. package/dist/templates/gather/content/pages/programme.json +449 -0
  88. package/dist/templates/gather/content/pages/speakers.json +225 -0
  89. package/dist/templates/gather/content/pages/tickets.json +495 -0
  90. package/dist/templates/gather/content/pages/venue.json +382 -0
  91. package/dist/templates/gather/content/site.json +222 -0
  92. package/dist/templates/gather/content/styles.json +17 -0
  93. package/dist/templates/gather/media/LICENSES.json +185 -0
  94. package/dist/templates/gather/openspace.json +21 -0
  95. package/dist/templates/gather/template.json +118 -0
  96. package/dist/templates/inkwell/content/collections/essays/2026-09-17-notebooks.mdoc +13 -0
  97. package/dist/templates/inkwell/content/collections/essays/2026-10-01-kitchen-radio.mdoc +13 -0
  98. package/dist/templates/inkwell/content/collections/essays/2026-10-15-the-same-mile.mdoc +13 -0
  99. package/dist/templates/inkwell/content/collections/essays/_collection.json +21 -0
  100. package/dist/templates/inkwell/content/pages/about.json +281 -0
  101. package/dist/templates/inkwell/content/pages/books.json +459 -0
  102. package/dist/templates/inkwell/content/pages/contact.json +201 -0
  103. package/dist/templates/inkwell/content/pages/home.json +457 -0
  104. package/dist/templates/inkwell/content/pages/speaking.json +522 -0
  105. package/dist/templates/inkwell/content/site.json +222 -0
  106. package/dist/templates/inkwell/content/styles.json +17 -0
  107. package/dist/templates/inkwell/media/LICENSES.json +119 -0
  108. package/dist/templates/inkwell/openspace.json +21 -0
  109. package/dist/templates/inkwell/template.json +108 -0
  110. package/dist/templates/keystone/content/collections/notes/2026-09-17-hard-conversations.mdoc +11 -0
  111. package/dist/templates/keystone/content/collections/notes/2026-10-01-weekly-rhythm.mdoc +11 -0
  112. package/dist/templates/keystone/content/collections/notes/2026-10-15-the-first-manager.mdoc +11 -0
  113. package/dist/templates/keystone/content/collections/notes/_collection.json +21 -0
  114. package/dist/templates/keystone/content/pages/about.json +371 -0
  115. package/dist/templates/keystone/content/pages/contact.json +207 -0
  116. package/dist/templates/keystone/content/pages/home.json +815 -0
  117. package/dist/templates/keystone/content/pages/results.json +396 -0
  118. package/dist/templates/keystone/content/pages/work-with-me.json +477 -0
  119. package/dist/templates/keystone/content/site.json +224 -0
  120. package/dist/templates/keystone/content/styles.json +17 -0
  121. package/dist/templates/keystone/media/LICENSES.json +75 -0
  122. package/dist/templates/keystone/openspace.json +21 -0
  123. package/dist/templates/keystone/template.json +108 -0
  124. package/dist/templates/ledger/content/pages/home.json +62 -0
  125. package/dist/templates/orbit/content/collections/changelog/2026-09-21-faster-attachments.mdoc +11 -0
  126. package/dist/templates/orbit/content/collections/changelog/2026-10-05-snooze-until-reply.mdoc +11 -0
  127. package/dist/templates/orbit/content/collections/changelog/2026-10-19-help-centre-search.mdoc +13 -0
  128. package/dist/templates/orbit/content/collections/changelog/_collection.json +39 -0
  129. package/dist/templates/orbit/content/pages/about.json +396 -0
  130. package/dist/templates/orbit/content/pages/contact.json +195 -0
  131. package/dist/templates/orbit/content/pages/features.json +603 -0
  132. package/dist/templates/orbit/content/pages/home.json +1273 -0
  133. package/dist/templates/orbit/content/pages/pricing.json +608 -0
  134. package/dist/templates/orbit/content/site.json +368 -0
  135. package/dist/templates/orbit/content/styles.json +17 -0
  136. package/dist/templates/orbit/media/LICENSES.json +141 -0
  137. package/dist/templates/orbit/openspace.json +21 -0
  138. package/dist/templates/orbit/template.json +108 -0
  139. package/package.json +9 -7
  140. package/dist/chunk-3F6TAUAT.js.map +0 -1
  141. package/dist/chunk-R3SYHQ5J.js +0 -17420
  142. package/dist/chunk-R3SYHQ5J.js.map +0 -1
  143. /package/dist/{agents-md-2DTXWUZQ.js.map → agents-md-3W4PIY4N.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/nodes/identity.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/visit.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/doc/directives.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/doc/anchors.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/doc/applyReviver.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/nodes/toJS.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/nodes/Node.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/nodes/Alias.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/nodes/Scalar.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/doc/createNode.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/nodes/Collection.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/stringify/stringifyComment.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/stringify/foldFlowLines.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/stringify/stringifyString.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/stringify/stringify.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/stringify/stringifyPair.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/log.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/schema/yaml-1.1/merge.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/nodes/addPairToJSMap.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/nodes/Pair.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/stringify/stringifyCollection.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/nodes/YAMLMap.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/schema/common/map.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/nodes/YAMLSeq.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/schema/common/seq.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/schema/common/string.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/schema/common/null.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/schema/core/bool.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/stringify/stringifyNumber.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/schema/core/float.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/schema/core/int.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/schema/core/schema.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/schema/json/schema.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/schema/yaml-1.1/binary.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/schema/yaml-1.1/pairs.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/schema/yaml-1.1/omap.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/schema/yaml-1.1/bool.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/schema/yaml-1.1/float.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/schema/yaml-1.1/int.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/schema/yaml-1.1/set.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/schema/yaml-1.1/schema.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/schema/tags.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/schema/Schema.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/stringify/stringifyDocument.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/doc/Document.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/errors.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/compose/resolve-props.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/compose/util-contains-newline.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/compose/util-flow-indent-check.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/compose/util-map-includes.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/compose/resolve-block-map.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/compose/resolve-block-seq.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/compose/resolve-end.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/compose/resolve-flow-collection.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/compose/compose-collection.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/compose/resolve-block-scalar.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/compose/resolve-flow-scalar.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/compose/compose-scalar.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/compose/util-empty-scalar-position.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/compose/compose-node.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/compose/compose-doc.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/compose/composer.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/parse/cst-scalar.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/parse/cst-stringify.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/parse/cst-visit.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/parse/cst.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/parse/lexer.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/parse/line-counter.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/parse/parser.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/public-api.js","../../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/index.js","../src/io.ts","../src/check.ts","../../schema/src/links.ts","../../schema/src/secrets.ts","../../theme/src/palettes.ts","../../site-kit/src/content/index.ts","../../site-kit/src/content/files.ts","../src/program.ts","../src/agents.ts","../src/dev.ts","../src/semver.ts","../src/eject.ts","../src/gated-sync.ts","../src/mcp/index.ts","../../../node_modules/.pnpm/immer@11.2.9/node_modules/immer/src/utils/env.ts","../../../node_modules/.pnpm/immer@11.2.9/node_modules/immer/src/utils/errors.ts","../../../node_modules/.pnpm/immer@11.2.9/node_modules/immer/src/utils/common.ts","../../../node_modules/.pnpm/immer@11.2.9/node_modules/immer/src/utils/plugins.ts","../../../node_modules/.pnpm/immer@11.2.9/node_modules/immer/src/core/scope.ts","../../../node_modules/.pnpm/immer@11.2.9/node_modules/immer/src/core/finalize.ts","../../../node_modules/.pnpm/immer@11.2.9/node_modules/immer/src/core/proxy.ts","../../../node_modules/.pnpm/immer@11.2.9/node_modules/immer/src/core/immerClass.ts","../../../node_modules/.pnpm/immer@11.2.9/node_modules/immer/src/core/current.ts","../../../node_modules/.pnpm/immer@11.2.9/node_modules/immer/src/plugins/patches.ts","../../../node_modules/.pnpm/immer@11.2.9/node_modules/immer/src/plugins/mapset.ts","../../../node_modules/.pnpm/immer@11.2.9/node_modules/immer/src/plugins/arrayMethods.ts","../../../node_modules/.pnpm/immer@11.2.9/node_modules/immer/src/immer.ts","../../ops/src/ops.ts","../../ops/src/doc.ts","../../ops/src/paths.ts","../../ops/src/apply.ts","../../ops/src/diff.ts","../../ops/src/validate.ts","../../ops/src/roles.ts","../../ops/src/summarize.ts","../../mcp-tools/src/errors.ts","../../mcp-tools/src/context.ts","../../mcp-tools/src/guidance.ts","../../mcp-tools/src/images.ts","../../mcp-tools/src/markdown.ts","../../mcp-tools/src/prompts.ts","../../mcp-tools/src/render.ts","../../mcp-tools/src/resources.ts","../../mcp-tools/src/server.ts","../../lint/src/content.ts","../../lint/src/issue.ts","../../lint/src/links.ts","../../lint/src/mobile.ts","../../lint/src/photo-contrast.ts","../../lint/src/design-check.ts","../../lint/src/seo.ts","../../mcp-tools/src/templates.ts","../../mcp-tools/src/tool.ts","../../mcp-tools/src/tools/read.ts","../../mcp-tools/src/tools/design.ts","../../mcp-tools/src/tools/edit.ts","../../mcp-tools/src/tools/pages.ts","../../mcp-tools/src/tools/publish.ts","../../mcp-tools/src/tools/index.ts","../src/mcp/file-store.ts","../src/mcp/git.ts","../src/mcp/preview-server.ts","../src/mcp/screenshot.ts","../src/migrate.ts","../src/new.ts","../../../templates/starter/src/index.ts","../src/repo-root.ts"],"sourcesContent":["'use strict';\n\nconst ALIAS = Symbol.for('yaml.alias');\nconst DOC = Symbol.for('yaml.document');\nconst MAP = Symbol.for('yaml.map');\nconst PAIR = Symbol.for('yaml.pair');\nconst SCALAR = Symbol.for('yaml.scalar');\nconst SEQ = Symbol.for('yaml.seq');\nconst NODE_TYPE = Symbol.for('yaml.node.type');\nconst isAlias = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === ALIAS;\nconst isDocument = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === DOC;\nconst isMap = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === MAP;\nconst isPair = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === PAIR;\nconst isScalar = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === SCALAR;\nconst isSeq = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === SEQ;\nfunction isCollection(node) {\n if (node && typeof node === 'object')\n switch (node[NODE_TYPE]) {\n case MAP:\n case SEQ:\n return true;\n }\n return false;\n}\nfunction isNode(node) {\n if (node && typeof node === 'object')\n switch (node[NODE_TYPE]) {\n case ALIAS:\n case MAP:\n case SCALAR:\n case SEQ:\n return true;\n }\n return false;\n}\nconst hasAnchor = (node) => (isScalar(node) || isCollection(node)) && !!node.anchor;\n\nexports.ALIAS = ALIAS;\nexports.DOC = DOC;\nexports.MAP = MAP;\nexports.NODE_TYPE = NODE_TYPE;\nexports.PAIR = PAIR;\nexports.SCALAR = SCALAR;\nexports.SEQ = SEQ;\nexports.hasAnchor = hasAnchor;\nexports.isAlias = isAlias;\nexports.isCollection = isCollection;\nexports.isDocument = isDocument;\nexports.isMap = isMap;\nexports.isNode = isNode;\nexports.isPair = isPair;\nexports.isScalar = isScalar;\nexports.isSeq = isSeq;\n","'use strict';\n\nvar identity = require('./nodes/identity.js');\n\nconst BREAK = Symbol('break visit');\nconst SKIP = Symbol('skip children');\nconst REMOVE = Symbol('remove node');\n/**\n * Apply a visitor to an AST node or document.\n *\n * Walks through the tree (depth-first) starting from `node`, calling a\n * `visitor` function with three arguments:\n * - `key`: For sequence values and map `Pair`, the node's index in the\n * collection. Within a `Pair`, `'key'` or `'value'`, correspondingly.\n * `null` for the root node.\n * - `node`: The current node.\n * - `path`: The ancestry of the current node.\n *\n * The return value of the visitor may be used to control the traversal:\n * - `undefined` (default): Do nothing and continue\n * - `visit.SKIP`: Do not visit the children of this node, continue with next\n * sibling\n * - `visit.BREAK`: Terminate traversal completely\n * - `visit.REMOVE`: Remove the current node, then continue with the next one\n * - `Node`: Replace the current node, then continue by visiting it\n * - `number`: While iterating the items of a sequence or map, set the index\n * of the next step. This is useful especially if the index of the current\n * node has changed.\n *\n * If `visitor` is a single function, it will be called with all values\n * encountered in the tree, including e.g. `null` values. Alternatively,\n * separate visitor functions may be defined for each `Map`, `Pair`, `Seq`,\n * `Alias` and `Scalar` node. To define the same visitor function for more than\n * one node type, use the `Collection` (map and seq), `Value` (map, seq & scalar)\n * and `Node` (alias, map, seq & scalar) targets. Of all these, only the most\n * specific defined one will be used for each node.\n */\nfunction visit(node, visitor) {\n const visitor_ = initVisitor(visitor);\n if (identity.isDocument(node)) {\n const cd = visit_(null, node.contents, visitor_, Object.freeze([node]));\n if (cd === REMOVE)\n node.contents = null;\n }\n else\n visit_(null, node, visitor_, Object.freeze([]));\n}\n// Without the `as symbol` casts, TS declares these in the `visit`\n// namespace using `var`, but then complains about that because\n// `unique symbol` must be `const`.\n/** Terminate visit traversal completely */\nvisit.BREAK = BREAK;\n/** Do not visit the children of the current node */\nvisit.SKIP = SKIP;\n/** Remove the current node */\nvisit.REMOVE = REMOVE;\nfunction visit_(key, node, visitor, path) {\n const ctrl = callVisitor(key, node, visitor, path);\n if (identity.isNode(ctrl) || identity.isPair(ctrl)) {\n replaceNode(key, path, ctrl);\n return visit_(key, ctrl, visitor, path);\n }\n if (typeof ctrl !== 'symbol') {\n if (identity.isCollection(node)) {\n path = Object.freeze(path.concat(node));\n for (let i = 0; i < node.items.length; ++i) {\n const ci = visit_(i, node.items[i], visitor, path);\n if (typeof ci === 'number')\n i = ci - 1;\n else if (ci === BREAK)\n return BREAK;\n else if (ci === REMOVE) {\n node.items.splice(i, 1);\n i -= 1;\n }\n }\n }\n else if (identity.isPair(node)) {\n path = Object.freeze(path.concat(node));\n const ck = visit_('key', node.key, visitor, path);\n if (ck === BREAK)\n return BREAK;\n else if (ck === REMOVE)\n node.key = null;\n const cv = visit_('value', node.value, visitor, path);\n if (cv === BREAK)\n return BREAK;\n else if (cv === REMOVE)\n node.value = null;\n }\n }\n return ctrl;\n}\n/**\n * Apply an async visitor to an AST node or document.\n *\n * Walks through the tree (depth-first) starting from `node`, calling a\n * `visitor` function with three arguments:\n * - `key`: For sequence values and map `Pair`, the node's index in the\n * collection. Within a `Pair`, `'key'` or `'value'`, correspondingly.\n * `null` for the root node.\n * - `node`: The current node.\n * - `path`: The ancestry of the current node.\n *\n * The return value of the visitor may be used to control the traversal:\n * - `Promise`: Must resolve to one of the following values\n * - `undefined` (default): Do nothing and continue\n * - `visit.SKIP`: Do not visit the children of this node, continue with next\n * sibling\n * - `visit.BREAK`: Terminate traversal completely\n * - `visit.REMOVE`: Remove the current node, then continue with the next one\n * - `Node`: Replace the current node, then continue by visiting it\n * - `number`: While iterating the items of a sequence or map, set the index\n * of the next step. This is useful especially if the index of the current\n * node has changed.\n *\n * If `visitor` is a single function, it will be called with all values\n * encountered in the tree, including e.g. `null` values. Alternatively,\n * separate visitor functions may be defined for each `Map`, `Pair`, `Seq`,\n * `Alias` and `Scalar` node. To define the same visitor function for more than\n * one node type, use the `Collection` (map and seq), `Value` (map, seq & scalar)\n * and `Node` (alias, map, seq & scalar) targets. Of all these, only the most\n * specific defined one will be used for each node.\n */\nasync function visitAsync(node, visitor) {\n const visitor_ = initVisitor(visitor);\n if (identity.isDocument(node)) {\n const cd = await visitAsync_(null, node.contents, visitor_, Object.freeze([node]));\n if (cd === REMOVE)\n node.contents = null;\n }\n else\n await visitAsync_(null, node, visitor_, Object.freeze([]));\n}\n// Without the `as symbol` casts, TS declares these in the `visit`\n// namespace using `var`, but then complains about that because\n// `unique symbol` must be `const`.\n/** Terminate visit traversal completely */\nvisitAsync.BREAK = BREAK;\n/** Do not visit the children of the current node */\nvisitAsync.SKIP = SKIP;\n/** Remove the current node */\nvisitAsync.REMOVE = REMOVE;\nasync function visitAsync_(key, node, visitor, path) {\n const ctrl = await callVisitor(key, node, visitor, path);\n if (identity.isNode(ctrl) || identity.isPair(ctrl)) {\n replaceNode(key, path, ctrl);\n return visitAsync_(key, ctrl, visitor, path);\n }\n if (typeof ctrl !== 'symbol') {\n if (identity.isCollection(node)) {\n path = Object.freeze(path.concat(node));\n for (let i = 0; i < node.items.length; ++i) {\n const ci = await visitAsync_(i, node.items[i], visitor, path);\n if (typeof ci === 'number')\n i = ci - 1;\n else if (ci === BREAK)\n return BREAK;\n else if (ci === REMOVE) {\n node.items.splice(i, 1);\n i -= 1;\n }\n }\n }\n else if (identity.isPair(node)) {\n path = Object.freeze(path.concat(node));\n const ck = await visitAsync_('key', node.key, visitor, path);\n if (ck === BREAK)\n return BREAK;\n else if (ck === REMOVE)\n node.key = null;\n const cv = await visitAsync_('value', node.value, visitor, path);\n if (cv === BREAK)\n return BREAK;\n else if (cv === REMOVE)\n node.value = null;\n }\n }\n return ctrl;\n}\nfunction initVisitor(visitor) {\n if (typeof visitor === 'object' &&\n (visitor.Collection || visitor.Node || visitor.Value)) {\n return Object.assign({\n Alias: visitor.Node,\n Map: visitor.Node,\n Scalar: visitor.Node,\n Seq: visitor.Node\n }, visitor.Value && {\n Map: visitor.Value,\n Scalar: visitor.Value,\n Seq: visitor.Value\n }, visitor.Collection && {\n Map: visitor.Collection,\n Seq: visitor.Collection\n }, visitor);\n }\n return visitor;\n}\nfunction callVisitor(key, node, visitor, path) {\n if (typeof visitor === 'function')\n return visitor(key, node, path);\n if (identity.isMap(node))\n return visitor.Map?.(key, node, path);\n if (identity.isSeq(node))\n return visitor.Seq?.(key, node, path);\n if (identity.isPair(node))\n return visitor.Pair?.(key, node, path);\n if (identity.isScalar(node))\n return visitor.Scalar?.(key, node, path);\n if (identity.isAlias(node))\n return visitor.Alias?.(key, node, path);\n return undefined;\n}\nfunction replaceNode(key, path, node) {\n const parent = path[path.length - 1];\n if (identity.isCollection(parent)) {\n parent.items[key] = node;\n }\n else if (identity.isPair(parent)) {\n if (key === 'key')\n parent.key = node;\n else\n parent.value = node;\n }\n else if (identity.isDocument(parent)) {\n parent.contents = node;\n }\n else {\n const pt = identity.isAlias(parent) ? 'alias' : 'scalar';\n throw new Error(`Cannot replace node with ${pt} parent`);\n }\n}\n\nexports.visit = visit;\nexports.visitAsync = visitAsync;\n","'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar visit = require('../visit.js');\n\nconst escapeChars = {\n '!': '%21',\n ',': '%2C',\n '[': '%5B',\n ']': '%5D',\n '{': '%7B',\n '}': '%7D'\n};\nconst escapeTagName = (tn) => tn.replace(/[!,[\\]{}]/g, ch => escapeChars[ch]);\nclass Directives {\n constructor(yaml, tags) {\n /**\n * The directives-end/doc-start marker `---`. If `null`, a marker may still be\n * included in the document's stringified representation.\n */\n this.docStart = null;\n /** The doc-end marker `...`. */\n this.docEnd = false;\n this.yaml = Object.assign({}, Directives.defaultYaml, yaml);\n this.tags = Object.assign({}, Directives.defaultTags, tags);\n }\n clone() {\n const copy = new Directives(this.yaml, this.tags);\n copy.docStart = this.docStart;\n return copy;\n }\n /**\n * During parsing, get a Directives instance for the current document and\n * update the stream state according to the current version's spec.\n */\n atDocument() {\n const res = new Directives(this.yaml, this.tags);\n switch (this.yaml.version) {\n case '1.1':\n this.atNextDocument = true;\n break;\n case '1.2':\n this.atNextDocument = false;\n this.yaml = {\n explicit: Directives.defaultYaml.explicit,\n version: '1.2'\n };\n this.tags = Object.assign({}, Directives.defaultTags);\n break;\n }\n return res;\n }\n /**\n * @param onError - May be called even if the action was successful\n * @returns `true` on success\n */\n add(line, onError) {\n if (this.atNextDocument) {\n this.yaml = { explicit: Directives.defaultYaml.explicit, version: '1.1' };\n this.tags = Object.assign({}, Directives.defaultTags);\n this.atNextDocument = false;\n }\n const parts = line.trim().split(/[ \\t]+/);\n const name = parts.shift();\n switch (name) {\n case '%TAG': {\n if (parts.length !== 2) {\n onError(0, '%TAG directive should contain exactly two parts');\n if (parts.length < 2)\n return false;\n }\n const [handle, prefix] = parts;\n this.tags[handle] = prefix;\n return true;\n }\n case '%YAML': {\n this.yaml.explicit = true;\n if (parts.length !== 1) {\n onError(0, '%YAML directive should contain exactly one part');\n return false;\n }\n const [version] = parts;\n if (version === '1.1' || version === '1.2') {\n this.yaml.version = version;\n return true;\n }\n else {\n const isValid = /^\\d+\\.\\d+$/.test(version);\n onError(6, `Unsupported YAML version ${version}`, isValid);\n return false;\n }\n }\n default:\n onError(0, `Unknown directive ${name}`, true);\n return false;\n }\n }\n /**\n * Resolves a tag, matching handles to those defined in %TAG directives.\n *\n * @returns Resolved tag, which may also be the non-specific tag `'!'` or a\n * `'!local'` tag, or `null` if unresolvable.\n */\n tagName(source, onError) {\n if (source === '!')\n return '!'; // non-specific tag\n if (source[0] !== '!') {\n onError(`Not a valid tag: ${source}`);\n return null;\n }\n if (source[1] === '<') {\n const verbatim = source.slice(2, -1);\n if (verbatim === '!' || verbatim === '!!') {\n onError(`Verbatim tags aren't resolved, so ${source} is invalid.`);\n return null;\n }\n if (source[source.length - 1] !== '>')\n onError('Verbatim tags must end with a >');\n return verbatim;\n }\n const [, handle, suffix] = source.match(/^(.*!)([^!]*)$/s);\n if (!suffix)\n onError(`The ${source} tag has no suffix`);\n const prefix = this.tags[handle];\n if (prefix) {\n try {\n return prefix + decodeURIComponent(suffix);\n }\n catch (error) {\n onError(String(error));\n return null;\n }\n }\n if (handle === '!')\n return source; // local tag\n onError(`Could not resolve tag: ${source}`);\n return null;\n }\n /**\n * Given a fully resolved tag, returns its printable string form,\n * taking into account current tag prefixes and defaults.\n */\n tagString(tag) {\n for (const [handle, prefix] of Object.entries(this.tags)) {\n if (tag.startsWith(prefix))\n return handle + escapeTagName(tag.substring(prefix.length));\n }\n return tag[0] === '!' ? tag : `!<${tag}>`;\n }\n toString(doc) {\n const lines = this.yaml.explicit\n ? [`%YAML ${this.yaml.version || '1.2'}`]\n : [];\n const tagEntries = Object.entries(this.tags);\n let tagNames;\n if (doc && tagEntries.length > 0 && identity.isNode(doc.contents)) {\n const tags = {};\n visit.visit(doc.contents, (_key, node) => {\n if (identity.isNode(node) && node.tag)\n tags[node.tag] = true;\n });\n tagNames = Object.keys(tags);\n }\n else\n tagNames = [];\n for (const [handle, prefix] of tagEntries) {\n if (handle === '!!' && prefix === 'tag:yaml.org,2002:')\n continue;\n if (!doc || tagNames.some(tn => tn.startsWith(prefix)))\n lines.push(`%TAG ${handle} ${prefix}`);\n }\n return lines.join('\\n');\n }\n}\nDirectives.defaultYaml = { explicit: false, version: '1.2' };\nDirectives.defaultTags = { '!!': 'tag:yaml.org,2002:' };\n\nexports.Directives = Directives;\n","'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar visit = require('../visit.js');\n\n/**\n * Verify that the input string is a valid anchor.\n *\n * Will throw on errors.\n */\nfunction anchorIsValid(anchor) {\n if (/[\\x00-\\x19\\s,[\\]{}]/.test(anchor)) {\n const sa = JSON.stringify(anchor);\n const msg = `Anchor must not contain whitespace or control characters: ${sa}`;\n throw new Error(msg);\n }\n return true;\n}\nfunction anchorNames(root) {\n const anchors = new Set();\n visit.visit(root, {\n Value(_key, node) {\n if (node.anchor)\n anchors.add(node.anchor);\n }\n });\n return anchors;\n}\n/** Find a new anchor name with the given `prefix` and a one-indexed suffix. */\nfunction findNewAnchor(prefix, exclude) {\n for (let i = 1; true; ++i) {\n const name = `${prefix}${i}`;\n if (!exclude.has(name))\n return name;\n }\n}\nfunction createNodeAnchors(doc, prefix) {\n const aliasObjects = [];\n const sourceObjects = new Map();\n let prevAnchors = null;\n return {\n onAnchor: (source) => {\n aliasObjects.push(source);\n prevAnchors ?? (prevAnchors = anchorNames(doc));\n const anchor = findNewAnchor(prefix, prevAnchors);\n prevAnchors.add(anchor);\n return anchor;\n },\n /**\n * With circular references, the source node is only resolved after all\n * of its child nodes are. This is why anchors are set only after all of\n * the nodes have been created.\n */\n setAnchors: () => {\n for (const source of aliasObjects) {\n const ref = sourceObjects.get(source);\n if (typeof ref === 'object' &&\n ref.anchor &&\n (identity.isScalar(ref.node) || identity.isCollection(ref.node))) {\n ref.node.anchor = ref.anchor;\n }\n else {\n const error = new Error('Failed to resolve repeated object (this should not happen)');\n error.source = source;\n throw error;\n }\n }\n },\n sourceObjects\n };\n}\n\nexports.anchorIsValid = anchorIsValid;\nexports.anchorNames = anchorNames;\nexports.createNodeAnchors = createNodeAnchors;\nexports.findNewAnchor = findNewAnchor;\n","'use strict';\n\n/**\n * Applies the JSON.parse reviver algorithm as defined in the ECMA-262 spec,\n * in section 24.5.1.1 \"Runtime Semantics: InternalizeJSONProperty\" of the\n * 2021 edition: https://tc39.es/ecma262/#sec-json.parse\n *\n * Includes extensions for handling Map and Set objects.\n */\nfunction applyReviver(reviver, obj, key, val) {\n if (val && typeof val === 'object') {\n if (Array.isArray(val)) {\n for (let i = 0, len = val.length; i < len; ++i) {\n const v0 = val[i];\n const v1 = applyReviver(reviver, val, String(i), v0);\n // eslint-disable-next-line @typescript-eslint/no-array-delete\n if (v1 === undefined)\n delete val[i];\n else if (v1 !== v0)\n val[i] = v1;\n }\n }\n else if (val instanceof Map) {\n for (const k of Array.from(val.keys())) {\n const v0 = val.get(k);\n const v1 = applyReviver(reviver, val, k, v0);\n if (v1 === undefined)\n val.delete(k);\n else if (v1 !== v0)\n val.set(k, v1);\n }\n }\n else if (val instanceof Set) {\n for (const v0 of Array.from(val)) {\n const v1 = applyReviver(reviver, val, v0, v0);\n if (v1 === undefined)\n val.delete(v0);\n else if (v1 !== v0) {\n val.delete(v0);\n val.add(v1);\n }\n }\n }\n else {\n for (const [k, v0] of Object.entries(val)) {\n const v1 = applyReviver(reviver, val, k, v0);\n if (v1 === undefined)\n delete val[k];\n else if (v1 !== v0)\n val[k] = v1;\n }\n }\n }\n return reviver.call(obj, key, val);\n}\n\nexports.applyReviver = applyReviver;\n","'use strict';\n\nvar identity = require('./identity.js');\n\n/**\n * Recursively convert any node or its contents to native JavaScript\n *\n * @param value - The input value\n * @param arg - If `value` defines a `toJSON()` method, use this\n * as its first argument\n * @param ctx - Conversion context, originally set in Document#toJS(). If\n * `{ keep: true }` is not set, output should be suitable for JSON\n * stringification.\n */\nfunction toJS(value, arg, ctx) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n if (Array.isArray(value))\n return value.map((v, i) => toJS(v, String(i), ctx));\n if (value && typeof value.toJSON === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n if (!ctx || !identity.hasAnchor(value))\n return value.toJSON(arg, ctx);\n const data = { aliasCount: 0, count: 1, res: undefined };\n ctx.anchors.set(value, data);\n ctx.onCreate = res => {\n data.res = res;\n delete ctx.onCreate;\n };\n const res = value.toJSON(arg, ctx);\n if (ctx.onCreate)\n ctx.onCreate(res);\n return res;\n }\n if (typeof value === 'bigint' && !ctx?.keep)\n return Number(value);\n return value;\n}\n\nexports.toJS = toJS;\n","'use strict';\n\nvar applyReviver = require('../doc/applyReviver.js');\nvar identity = require('./identity.js');\nvar toJS = require('./toJS.js');\n\nclass NodeBase {\n constructor(type) {\n Object.defineProperty(this, identity.NODE_TYPE, { value: type });\n }\n /** Create a copy of this node. */\n clone() {\n const copy = Object.create(Object.getPrototypeOf(this), Object.getOwnPropertyDescriptors(this));\n if (this.range)\n copy.range = this.range.slice();\n return copy;\n }\n /** A plain JavaScript representation of this node. */\n toJS(doc, { mapAsMap, maxAliasCount, onAnchor, reviver } = {}) {\n if (!identity.isDocument(doc))\n throw new TypeError('A document argument is required');\n const ctx = {\n anchors: new Map(),\n doc,\n keep: true,\n mapAsMap: mapAsMap === true,\n mapKeyWarned: false,\n maxAliasCount: typeof maxAliasCount === 'number' ? maxAliasCount : 100\n };\n const res = toJS.toJS(this, '', ctx);\n if (typeof onAnchor === 'function')\n for (const { count, res } of ctx.anchors.values())\n onAnchor(res, count);\n return typeof reviver === 'function'\n ? applyReviver.applyReviver(reviver, { '': res }, '', res)\n : res;\n }\n}\n\nexports.NodeBase = NodeBase;\n","'use strict';\n\nvar anchors = require('../doc/anchors.js');\nvar visit = require('../visit.js');\nvar identity = require('./identity.js');\nvar Node = require('./Node.js');\nvar toJS = require('./toJS.js');\n\nclass Alias extends Node.NodeBase {\n constructor(source) {\n super(identity.ALIAS);\n this.source = source;\n Object.defineProperty(this, 'tag', {\n set() {\n throw new Error('Alias nodes cannot have tags');\n }\n });\n }\n /**\n * Resolve the value of this alias within `doc`, finding the last\n * instance of the `source` anchor before this node.\n */\n resolve(doc, ctx) {\n if (ctx?.maxAliasCount === 0)\n throw new ReferenceError('Alias resolution is disabled');\n let nodes;\n if (ctx?.aliasResolveCache) {\n nodes = ctx.aliasResolveCache;\n }\n else {\n nodes = [];\n visit.visit(doc, {\n Node: (_key, node) => {\n if (identity.isAlias(node) || identity.hasAnchor(node))\n nodes.push(node);\n }\n });\n if (ctx)\n ctx.aliasResolveCache = nodes;\n }\n let found = undefined;\n for (const node of nodes) {\n if (node === this)\n break;\n if (node.anchor === this.source)\n found = node;\n }\n if (found && ctx) {\n const { anchors, doc, maxAliasCount } = ctx;\n let data = anchors.get(found);\n if (!data) {\n // Resolve anchors for Node.prototype.toJS()\n toJS.toJS(found, null, ctx);\n data = anchors.get(found);\n }\n /* istanbul ignore if */\n if (data?.res === undefined) {\n const msg = 'This should not happen: Alias anchor was not resolved?';\n throw new ReferenceError(msg);\n }\n if (maxAliasCount >= 0) {\n data.count += 1;\n if (data.aliasCount === 0)\n data.aliasCount = getAliasCount(doc, found, anchors);\n if (data.count * data.aliasCount > maxAliasCount) {\n const msg = 'Excessive alias count indicates a resource exhaustion attack';\n throw new ReferenceError(msg);\n }\n }\n }\n return found;\n }\n toJSON(_arg, ctx) {\n if (!ctx)\n return { source: this.source };\n const source = this.resolve(ctx.doc, ctx);\n if (!source) {\n const msg = `Unresolved alias (the anchor must be set before the alias): ${this.source}`;\n throw new ReferenceError(msg);\n }\n return ctx.anchors.get(source).res;\n }\n toString(ctx, _onComment, _onChompKeep) {\n const src = `*${this.source}`;\n if (ctx) {\n anchors.anchorIsValid(this.source);\n if (ctx.options.verifyAliasOrder && !ctx.anchors.has(this.source)) {\n const msg = `Unresolved alias (the anchor must be set before the alias): ${this.source}`;\n throw new Error(msg);\n }\n if (ctx.implicitKey)\n return `${src} `;\n }\n return src;\n }\n}\nfunction getAliasCount(doc, node, anchors) {\n if (identity.isAlias(node)) {\n const source = node.resolve(doc);\n const anchor = anchors && source && anchors.get(source);\n return anchor ? anchor.count * anchor.aliasCount : 0;\n }\n else if (identity.isCollection(node)) {\n let count = 0;\n for (const item of node.items) {\n const c = getAliasCount(doc, item, anchors);\n if (c > count)\n count = c;\n }\n return count;\n }\n else if (identity.isPair(node)) {\n const kc = getAliasCount(doc, node.key, anchors);\n const vc = getAliasCount(doc, node.value, anchors);\n return Math.max(kc, vc);\n }\n return 1;\n}\n\nexports.Alias = Alias;\n","'use strict';\n\nvar identity = require('./identity.js');\nvar Node = require('./Node.js');\nvar toJS = require('./toJS.js');\n\nconst isScalarValue = (value) => !value || (typeof value !== 'function' && typeof value !== 'object');\nclass Scalar extends Node.NodeBase {\n constructor(value) {\n super(identity.SCALAR);\n this.value = value;\n }\n toJSON(arg, ctx) {\n return ctx?.keep ? this.value : toJS.toJS(this.value, arg, ctx);\n }\n toString() {\n return String(this.value);\n }\n}\nScalar.BLOCK_FOLDED = 'BLOCK_FOLDED';\nScalar.BLOCK_LITERAL = 'BLOCK_LITERAL';\nScalar.PLAIN = 'PLAIN';\nScalar.QUOTE_DOUBLE = 'QUOTE_DOUBLE';\nScalar.QUOTE_SINGLE = 'QUOTE_SINGLE';\n\nexports.Scalar = Scalar;\nexports.isScalarValue = isScalarValue;\n","'use strict';\n\nvar Alias = require('../nodes/Alias.js');\nvar identity = require('../nodes/identity.js');\nvar Scalar = require('../nodes/Scalar.js');\n\nconst defaultTagPrefix = 'tag:yaml.org,2002:';\nfunction findTagObject(value, tagName, tags) {\n if (tagName) {\n const match = tags.filter(t => t.tag === tagName);\n const tagObj = match.find(t => !t.format) ?? match[0];\n if (!tagObj)\n throw new Error(`Tag ${tagName} not found`);\n return tagObj;\n }\n return tags.find(t => t.identify?.(value) && !t.format);\n}\nfunction createNode(value, tagName, ctx) {\n if (identity.isDocument(value))\n value = value.contents;\n if (identity.isNode(value))\n return value;\n if (identity.isPair(value)) {\n const map = ctx.schema[identity.MAP].createNode?.(ctx.schema, null, ctx);\n map.items.push(value);\n return map;\n }\n if (value instanceof String ||\n value instanceof Number ||\n value instanceof Boolean ||\n (typeof BigInt !== 'undefined' && value instanceof BigInt) // not supported everywhere\n ) {\n // https://tc39.es/ecma262/#sec-serializejsonproperty\n value = value.valueOf();\n }\n const { aliasDuplicateObjects, onAnchor, onTagObj, schema, sourceObjects } = ctx;\n // Detect duplicate references to the same object & use Alias nodes for all\n // after first. The `ref` wrapper allows for circular references to resolve.\n let ref = undefined;\n if (aliasDuplicateObjects && value && typeof value === 'object') {\n ref = sourceObjects.get(value);\n if (ref) {\n ref.anchor ?? (ref.anchor = onAnchor(value));\n return new Alias.Alias(ref.anchor);\n }\n else {\n ref = { anchor: null, node: null };\n sourceObjects.set(value, ref);\n }\n }\n if (tagName?.startsWith('!!'))\n tagName = defaultTagPrefix + tagName.slice(2);\n let tagObj = findTagObject(value, tagName, schema.tags);\n if (!tagObj) {\n if (value && typeof value.toJSON === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n value = value.toJSON();\n }\n if (!value || typeof value !== 'object') {\n const node = new Scalar.Scalar(value);\n if (ref)\n ref.node = node;\n return node;\n }\n tagObj =\n value instanceof Map\n ? schema[identity.MAP]\n : Symbol.iterator in Object(value)\n ? schema[identity.SEQ]\n : schema[identity.MAP];\n }\n if (onTagObj) {\n onTagObj(tagObj);\n delete ctx.onTagObj;\n }\n const node = tagObj?.createNode\n ? tagObj.createNode(ctx.schema, value, ctx)\n : typeof tagObj?.nodeClass?.from === 'function'\n ? tagObj.nodeClass.from(ctx.schema, value, ctx)\n : new Scalar.Scalar(value);\n if (tagName)\n node.tag = tagName;\n else if (!tagObj.default)\n node.tag = tagObj.tag;\n if (ref)\n ref.node = node;\n return node;\n}\n\nexports.createNode = createNode;\n","'use strict';\n\nvar createNode = require('../doc/createNode.js');\nvar identity = require('./identity.js');\nvar Node = require('./Node.js');\n\nfunction collectionFromPath(schema, path, value) {\n let v = value;\n for (let i = path.length - 1; i >= 0; --i) {\n const k = path[i];\n if (typeof k === 'number' && Number.isInteger(k) && k >= 0) {\n const a = [];\n a[k] = v;\n v = a;\n }\n else {\n v = new Map([[k, v]]);\n }\n }\n return createNode.createNode(v, undefined, {\n aliasDuplicateObjects: false,\n keepUndefined: false,\n onAnchor: () => {\n throw new Error('This should not happen, please report a bug.');\n },\n schema,\n sourceObjects: new Map()\n });\n}\n// Type guard is intentionally a little wrong so as to be more useful,\n// as it does not cover untypable empty non-string iterables (e.g. []).\nconst isEmptyPath = (path) => path == null ||\n (typeof path === 'object' && !!path[Symbol.iterator]().next().done);\nclass Collection extends Node.NodeBase {\n constructor(type, schema) {\n super(type);\n Object.defineProperty(this, 'schema', {\n value: schema,\n configurable: true,\n enumerable: false,\n writable: true\n });\n }\n /**\n * Create a copy of this collection.\n *\n * @param schema - If defined, overwrites the original's schema\n */\n clone(schema) {\n const copy = Object.create(Object.getPrototypeOf(this), Object.getOwnPropertyDescriptors(this));\n if (schema)\n copy.schema = schema;\n copy.items = copy.items.map(it => identity.isNode(it) || identity.isPair(it) ? it.clone(schema) : it);\n if (this.range)\n copy.range = this.range.slice();\n return copy;\n }\n /**\n * Adds a value to the collection. For `!!map` and `!!omap` the value must\n * be a Pair instance or a `{ key, value }` object, which may not have a key\n * that already exists in the map.\n */\n addIn(path, value) {\n if (isEmptyPath(path))\n this.add(value);\n else {\n const [key, ...rest] = path;\n const node = this.get(key, true);\n if (identity.isCollection(node))\n node.addIn(rest, value);\n else if (node === undefined && this.schema)\n this.set(key, collectionFromPath(this.schema, rest, value));\n else\n throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`);\n }\n }\n /**\n * Removes a value from the collection.\n * @returns `true` if the item was found and removed.\n */\n deleteIn(path) {\n const [key, ...rest] = path;\n if (rest.length === 0)\n return this.delete(key);\n const node = this.get(key, true);\n if (identity.isCollection(node))\n return node.deleteIn(rest);\n else\n throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`);\n }\n /**\n * Returns item at `key`, or `undefined` if not found. By default unwraps\n * scalar values from their surrounding node; to disable set `keepScalar` to\n * `true` (collections are always returned intact).\n */\n getIn(path, keepScalar) {\n const [key, ...rest] = path;\n const node = this.get(key, true);\n if (rest.length === 0)\n return !keepScalar && identity.isScalar(node) ? node.value : node;\n else\n return identity.isCollection(node) ? node.getIn(rest, keepScalar) : undefined;\n }\n hasAllNullValues(allowScalar) {\n return this.items.every(node => {\n if (!identity.isPair(node))\n return false;\n const n = node.value;\n return (n == null ||\n (allowScalar &&\n identity.isScalar(n) &&\n n.value == null &&\n !n.commentBefore &&\n !n.comment &&\n !n.tag));\n });\n }\n /**\n * Checks if the collection includes a value with the key `key`.\n */\n hasIn(path) {\n const [key, ...rest] = path;\n if (rest.length === 0)\n return this.has(key);\n const node = this.get(key, true);\n return identity.isCollection(node) ? node.hasIn(rest) : false;\n }\n /**\n * Sets a value in this collection. For `!!set`, `value` needs to be a\n * boolean to add/remove the item from the set.\n */\n setIn(path, value) {\n const [key, ...rest] = path;\n if (rest.length === 0) {\n this.set(key, value);\n }\n else {\n const node = this.get(key, true);\n if (identity.isCollection(node))\n node.setIn(rest, value);\n else if (node === undefined && this.schema)\n this.set(key, collectionFromPath(this.schema, rest, value));\n else\n throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`);\n }\n }\n}\n\nexports.Collection = Collection;\nexports.collectionFromPath = collectionFromPath;\nexports.isEmptyPath = isEmptyPath;\n","'use strict';\n\n/**\n * Stringifies a comment.\n *\n * Empty comment lines are left empty,\n * lines consisting of a single space are replaced by `#`,\n * and all other lines are prefixed with a `#`.\n */\nconst stringifyComment = (str) => str.replace(/^(?!$)(?: $)?/gm, '#');\nfunction indentComment(comment, indent) {\n if (/^\\n+$/.test(comment))\n return comment.substring(1);\n return indent ? comment.replace(/^(?! *$)/gm, indent) : comment;\n}\nconst lineComment = (str, indent, comment) => str.endsWith('\\n')\n ? indentComment(comment, indent)\n : comment.includes('\\n')\n ? '\\n' + indentComment(comment, indent)\n : (str.endsWith(' ') ? '' : ' ') + comment;\n\nexports.indentComment = indentComment;\nexports.lineComment = lineComment;\nexports.stringifyComment = stringifyComment;\n","'use strict';\n\nconst FOLD_FLOW = 'flow';\nconst FOLD_BLOCK = 'block';\nconst FOLD_QUOTED = 'quoted';\n/**\n * Tries to keep input at up to `lineWidth` characters, splitting only on spaces\n * not followed by newlines or spaces unless `mode` is `'quoted'`. Lines are\n * terminated with `\\n` and started with `indent`.\n */\nfunction foldFlowLines(text, indent, mode = 'flow', { indentAtStart, lineWidth = 80, minContentWidth = 20, onFold, onOverflow } = {}) {\n if (!lineWidth || lineWidth < 0)\n return text;\n if (lineWidth < minContentWidth)\n minContentWidth = 0;\n const endStep = Math.max(1 + minContentWidth, 1 + lineWidth - indent.length);\n if (text.length <= endStep)\n return text;\n const folds = [];\n const escapedFolds = {};\n let end = lineWidth - indent.length;\n if (typeof indentAtStart === 'number') {\n if (indentAtStart > lineWidth - Math.max(2, minContentWidth))\n folds.push(0);\n else\n end = lineWidth - indentAtStart;\n }\n let split = undefined;\n let prev = undefined;\n let overflow = false;\n let i = -1;\n let escStart = -1;\n let escEnd = -1;\n if (mode === FOLD_BLOCK) {\n i = consumeMoreIndentedLines(text, i, indent.length);\n if (i !== -1)\n end = i + endStep;\n }\n for (let ch; (ch = text[(i += 1)]);) {\n if (mode === FOLD_QUOTED && ch === '\\\\') {\n escStart = i;\n switch (text[i + 1]) {\n case 'x':\n i += 3;\n break;\n case 'u':\n i += 5;\n break;\n case 'U':\n i += 9;\n break;\n default:\n i += 1;\n }\n escEnd = i;\n }\n if (ch === '\\n') {\n if (mode === FOLD_BLOCK)\n i = consumeMoreIndentedLines(text, i, indent.length);\n end = i + indent.length + endStep;\n split = undefined;\n }\n else {\n if (ch === ' ' &&\n prev &&\n prev !== ' ' &&\n prev !== '\\n' &&\n prev !== '\\t') {\n // space surrounded by non-space can be replaced with newline + indent\n const next = text[i + 1];\n if (next && next !== ' ' && next !== '\\n' && next !== '\\t')\n split = i;\n }\n if (i >= end) {\n if (split) {\n folds.push(split);\n end = split + endStep;\n split = undefined;\n }\n else if (mode === FOLD_QUOTED) {\n // white-space collected at end may stretch past lineWidth\n while (prev === ' ' || prev === '\\t') {\n prev = ch;\n ch = text[(i += 1)];\n overflow = true;\n }\n // Account for newline escape, but don't break preceding escape\n const j = i > escEnd + 1 ? i - 2 : escStart - 1;\n // Bail out if lineWidth & minContentWidth are shorter than an escape string\n if (escapedFolds[j])\n return text;\n folds.push(j);\n escapedFolds[j] = true;\n end = j + endStep;\n split = undefined;\n }\n else {\n overflow = true;\n }\n }\n }\n prev = ch;\n }\n if (overflow && onOverflow)\n onOverflow();\n if (folds.length === 0)\n return text;\n if (onFold)\n onFold();\n let res = text.slice(0, folds[0]);\n for (let i = 0; i < folds.length; ++i) {\n const fold = folds[i];\n const end = folds[i + 1] || text.length;\n if (fold === 0)\n res = `\\n${indent}${text.slice(0, end)}`;\n else {\n if (mode === FOLD_QUOTED && escapedFolds[fold])\n res += `${text[fold]}\\\\`;\n res += `\\n${indent}${text.slice(fold + 1, end)}`;\n }\n }\n return res;\n}\n/**\n * Presumes `i + 1` is at the start of a line\n * @returns index of last newline in more-indented block\n */\nfunction consumeMoreIndentedLines(text, i, indent) {\n let end = i;\n let start = i + 1;\n let ch = text[start];\n while (ch === ' ' || ch === '\\t') {\n if (i < start + indent) {\n ch = text[++i];\n }\n else {\n do {\n ch = text[++i];\n } while (ch && ch !== '\\n');\n end = i;\n start = i + 1;\n ch = text[start];\n }\n }\n return end;\n}\n\nexports.FOLD_BLOCK = FOLD_BLOCK;\nexports.FOLD_FLOW = FOLD_FLOW;\nexports.FOLD_QUOTED = FOLD_QUOTED;\nexports.foldFlowLines = foldFlowLines;\n","'use strict';\n\nvar Scalar = require('../nodes/Scalar.js');\nvar foldFlowLines = require('./foldFlowLines.js');\n\nconst getFoldOptions = (ctx, isBlock) => ({\n indentAtStart: isBlock ? ctx.indent.length : ctx.indentAtStart,\n lineWidth: ctx.options.lineWidth,\n minContentWidth: ctx.options.minContentWidth\n});\n// Also checks for lines starting with %, as parsing the output as YAML 1.1 will\n// presume that's starting a new document.\nconst containsDocumentMarker = (str) => /^(%|---|\\.\\.\\.)/m.test(str);\nfunction lineLengthOverLimit(str, lineWidth, indentLength) {\n if (!lineWidth || lineWidth < 0)\n return false;\n const limit = lineWidth - indentLength;\n const strLen = str.length;\n if (strLen <= limit)\n return false;\n for (let i = 0, start = 0; i < strLen; ++i) {\n if (str[i] === '\\n') {\n if (i - start > limit)\n return true;\n start = i + 1;\n if (strLen - start <= limit)\n return false;\n }\n }\n return true;\n}\nfunction doubleQuotedString(value, ctx) {\n const json = JSON.stringify(value);\n if (ctx.options.doubleQuotedAsJSON)\n return json;\n const { implicitKey } = ctx;\n const minMultiLineLength = ctx.options.doubleQuotedMinMultiLineLength;\n const indent = ctx.indent || (containsDocumentMarker(value) ? ' ' : '');\n let str = '';\n let start = 0;\n for (let i = 0, ch = json[i]; ch; ch = json[++i]) {\n if (ch === ' ' && json[i + 1] === '\\\\' && json[i + 2] === 'n') {\n // space before newline needs to be escaped to not be folded\n str += json.slice(start, i) + '\\\\ ';\n i += 1;\n start = i;\n ch = '\\\\';\n }\n if (ch === '\\\\')\n switch (json[i + 1]) {\n case 'u':\n {\n str += json.slice(start, i);\n const code = json.substr(i + 2, 4);\n switch (code) {\n case '0000':\n str += '\\\\0';\n break;\n case '0007':\n str += '\\\\a';\n break;\n case '000b':\n str += '\\\\v';\n break;\n case '001b':\n str += '\\\\e';\n break;\n case '0085':\n str += '\\\\N';\n break;\n case '00a0':\n str += '\\\\_';\n break;\n case '2028':\n str += '\\\\L';\n break;\n case '2029':\n str += '\\\\P';\n break;\n default:\n if (code.substr(0, 2) === '00')\n str += '\\\\x' + code.substr(2);\n else\n str += json.substr(i, 6);\n }\n i += 5;\n start = i + 1;\n }\n break;\n case 'n':\n if (implicitKey ||\n json[i + 2] === '\"' ||\n json.length < minMultiLineLength) {\n i += 1;\n }\n else {\n // folding will eat first newline\n str += json.slice(start, i) + '\\n\\n';\n while (json[i + 2] === '\\\\' &&\n json[i + 3] === 'n' &&\n json[i + 4] !== '\"') {\n str += '\\n';\n i += 2;\n }\n str += indent;\n // space after newline needs to be escaped to not be folded\n if (json[i + 2] === ' ')\n str += '\\\\';\n i += 1;\n start = i + 1;\n }\n break;\n default:\n i += 1;\n }\n }\n str = start ? str + json.slice(start) : json;\n return implicitKey\n ? str\n : foldFlowLines.foldFlowLines(str, indent, foldFlowLines.FOLD_QUOTED, getFoldOptions(ctx, false));\n}\nfunction singleQuotedString(value, ctx) {\n if (ctx.options.singleQuote === false ||\n (ctx.implicitKey && value.includes('\\n')) ||\n /[ \\t]\\n|\\n[ \\t]/.test(value) // single quoted string can't have leading or trailing whitespace around newline\n )\n return doubleQuotedString(value, ctx);\n const indent = ctx.indent || (containsDocumentMarker(value) ? ' ' : '');\n const res = \"'\" + value.replace(/'/g, \"''\").replace(/\\n+/g, `$&\\n${indent}`) + \"'\";\n return ctx.implicitKey\n ? res\n : foldFlowLines.foldFlowLines(res, indent, foldFlowLines.FOLD_FLOW, getFoldOptions(ctx, false));\n}\nfunction quotedString(value, ctx) {\n const { singleQuote } = ctx.options;\n let qs;\n if (singleQuote === false)\n qs = doubleQuotedString;\n else {\n const hasDouble = value.includes('\"');\n const hasSingle = value.includes(\"'\");\n if (hasDouble && !hasSingle)\n qs = singleQuotedString;\n else if (hasSingle && !hasDouble)\n qs = doubleQuotedString;\n else\n qs = singleQuote ? singleQuotedString : doubleQuotedString;\n }\n return qs(value, ctx);\n}\n// The negative lookbehind avoids a polynomial search,\n// but isn't supported yet on Safari: https://caniuse.com/js-regexp-lookbehind\nlet blockEndNewlines;\ntry {\n blockEndNewlines = new RegExp('(^|(?<!\\n))\\n+(?!\\n|$)', 'g');\n}\ncatch {\n blockEndNewlines = /\\n+(?!\\n|$)/g;\n}\nfunction blockString({ comment, type, value }, ctx, onComment, onChompKeep) {\n const { blockQuote, commentString, lineWidth } = ctx.options;\n // 1. Block can't end in whitespace unless the last line is non-empty.\n // 2. Strings consisting of only whitespace are best rendered explicitly.\n if (!blockQuote || /\\n[\\t ]+$/.test(value)) {\n return quotedString(value, ctx);\n }\n const indent = ctx.indent ||\n (ctx.forceBlockIndent || containsDocumentMarker(value) ? ' ' : '');\n const literal = blockQuote === 'literal'\n ? true\n : blockQuote === 'folded' || type === Scalar.Scalar.BLOCK_FOLDED\n ? false\n : type === Scalar.Scalar.BLOCK_LITERAL\n ? true\n : !lineLengthOverLimit(value, lineWidth, indent.length);\n if (!value)\n return literal ? '|\\n' : '>\\n';\n // determine chomping from whitespace at value end\n let chomp;\n let endStart;\n for (endStart = value.length; endStart > 0; --endStart) {\n const ch = value[endStart - 1];\n if (ch !== '\\n' && ch !== '\\t' && ch !== ' ')\n break;\n }\n let end = value.substring(endStart);\n const endNlPos = end.indexOf('\\n');\n if (endNlPos === -1) {\n chomp = '-'; // strip\n }\n else if (value === end || endNlPos !== end.length - 1) {\n chomp = '+'; // keep\n if (onChompKeep)\n onChompKeep();\n }\n else {\n chomp = ''; // clip\n }\n if (end) {\n value = value.slice(0, -end.length);\n if (end[end.length - 1] === '\\n')\n end = end.slice(0, -1);\n end = end.replace(blockEndNewlines, `$&${indent}`);\n }\n // determine indent indicator from whitespace at value start\n let startWithSpace = false;\n let startEnd;\n let startNlPos = -1;\n for (startEnd = 0; startEnd < value.length; ++startEnd) {\n const ch = value[startEnd];\n if (ch === ' ')\n startWithSpace = true;\n else if (ch === '\\n')\n startNlPos = startEnd;\n else\n break;\n }\n let start = value.substring(0, startNlPos < startEnd ? startNlPos + 1 : startEnd);\n if (start) {\n value = value.substring(start.length);\n start = start.replace(/\\n+/g, `$&${indent}`);\n }\n const indentSize = indent ? '2' : '1'; // root is at -1\n // Leading | or > is added later\n let header = (startWithSpace ? indentSize : '') + chomp;\n if (comment) {\n header += ' ' + commentString(comment.replace(/ ?[\\r\\n]+/g, ' '));\n if (onComment)\n onComment();\n }\n if (!literal) {\n const foldedValue = value\n .replace(/\\n+/g, '\\n$&')\n .replace(/(?:^|\\n)([\\t ].*)(?:([\\n\\t ]*)\\n(?![\\n\\t ]))?/g, '$1$2') // more-indented lines aren't folded\n // ^ more-ind. ^ empty ^ capture next empty lines only at end of indent\n .replace(/\\n+/g, `$&${indent}`);\n let literalFallback = false;\n const foldOptions = getFoldOptions(ctx, true);\n if (blockQuote !== 'folded' && type !== Scalar.Scalar.BLOCK_FOLDED) {\n foldOptions.onOverflow = () => {\n literalFallback = true;\n };\n }\n const body = foldFlowLines.foldFlowLines(`${start}${foldedValue}${end}`, indent, foldFlowLines.FOLD_BLOCK, foldOptions);\n if (!literalFallback)\n return `>${header}\\n${indent}${body}`;\n }\n value = value.replace(/\\n+/g, `$&${indent}`);\n return `|${header}\\n${indent}${start}${value}${end}`;\n}\nfunction plainString(item, ctx, onComment, onChompKeep) {\n const { type, value } = item;\n const { actualString, implicitKey, indent, indentStep, inFlow } = ctx;\n if ((implicitKey && value.includes('\\n')) ||\n (inFlow && /[[\\]{},]/.test(value))) {\n return quotedString(value, ctx);\n }\n if (/^[\\n\\t ,[\\]{}#&*!|>'\"%@`]|^[?-]$|^[?-][ \\t]|[\\n:][ \\t]|[ \\t]\\n|[\\n\\t ]#|[\\n\\t :]$/.test(value)) {\n // not allowed:\n // - '-' or '?'\n // - start with an indicator character (except [?:-]) or /[?-] /\n // - '\\n ', ': ' or ' \\n' anywhere\n // - '#' not preceded by a non-space char\n // - end with ' ' or ':'\n return implicitKey || inFlow || !value.includes('\\n')\n ? quotedString(value, ctx)\n : blockString(item, ctx, onComment, onChompKeep);\n }\n if (!implicitKey &&\n !inFlow &&\n type !== Scalar.Scalar.PLAIN &&\n value.includes('\\n')) {\n // Where allowed & type not set explicitly, prefer block style for multiline strings\n return blockString(item, ctx, onComment, onChompKeep);\n }\n if (containsDocumentMarker(value)) {\n if (indent === '') {\n ctx.forceBlockIndent = true;\n return blockString(item, ctx, onComment, onChompKeep);\n }\n else if (implicitKey && indent === indentStep) {\n return quotedString(value, ctx);\n }\n }\n const str = value.replace(/\\n+/g, `$&\\n${indent}`);\n // Verify that output will be parsed as a string, as e.g. plain numbers and\n // booleans get parsed with those types in v1.2 (e.g. '42', 'true' & '0.9e-3'),\n // and others in v1.1.\n if (actualString) {\n const test = (tag) => tag.default && tag.tag !== 'tag:yaml.org,2002:str' && tag.test?.test(str);\n const { compat, tags } = ctx.doc.schema;\n if (tags.some(test) || compat?.some(test))\n return quotedString(value, ctx);\n }\n return implicitKey\n ? str\n : foldFlowLines.foldFlowLines(str, indent, foldFlowLines.FOLD_FLOW, getFoldOptions(ctx, false));\n}\nfunction stringifyString(item, ctx, onComment, onChompKeep) {\n const { implicitKey, inFlow } = ctx;\n const ss = typeof item.value === 'string'\n ? item\n : Object.assign({}, item, { value: String(item.value) });\n let { type } = item;\n if (type !== Scalar.Scalar.QUOTE_DOUBLE) {\n // force double quotes on control characters & unpaired surrogates\n if (/[\\x00-\\x08\\x0b-\\x1f\\x7f-\\x9f\\u{D800}-\\u{DFFF}]/u.test(ss.value))\n type = Scalar.Scalar.QUOTE_DOUBLE;\n }\n const _stringify = (_type) => {\n switch (_type) {\n case Scalar.Scalar.BLOCK_FOLDED:\n case Scalar.Scalar.BLOCK_LITERAL:\n return implicitKey || inFlow\n ? quotedString(ss.value, ctx) // blocks are not valid inside flow containers\n : blockString(ss, ctx, onComment, onChompKeep);\n case Scalar.Scalar.QUOTE_DOUBLE:\n return doubleQuotedString(ss.value, ctx);\n case Scalar.Scalar.QUOTE_SINGLE:\n return singleQuotedString(ss.value, ctx);\n case Scalar.Scalar.PLAIN:\n return plainString(ss, ctx, onComment, onChompKeep);\n default:\n return null;\n }\n };\n let res = _stringify(type);\n if (res === null) {\n const { defaultKeyType, defaultStringType } = ctx.options;\n const t = (implicitKey && defaultKeyType) || defaultStringType;\n res = _stringify(t);\n if (res === null)\n throw new Error(`Unsupported default string type ${t}`);\n }\n return res;\n}\n\nexports.stringifyString = stringifyString;\n","'use strict';\n\nvar anchors = require('../doc/anchors.js');\nvar identity = require('../nodes/identity.js');\nvar stringifyComment = require('./stringifyComment.js');\nvar stringifyString = require('./stringifyString.js');\n\nfunction createStringifyContext(doc, options) {\n const opt = Object.assign({\n blockQuote: true,\n commentString: stringifyComment.stringifyComment,\n defaultKeyType: null,\n defaultStringType: 'PLAIN',\n directives: null,\n doubleQuotedAsJSON: false,\n doubleQuotedMinMultiLineLength: 40,\n falseStr: 'false',\n flowCollectionPadding: true,\n indentSeq: true,\n lineWidth: 80,\n minContentWidth: 20,\n nullStr: 'null',\n simpleKeys: false,\n singleQuote: null,\n trailingComma: false,\n trueStr: 'true',\n verifyAliasOrder: true\n }, doc.schema.toStringOptions, options);\n let inFlow;\n switch (opt.collectionStyle) {\n case 'block':\n inFlow = false;\n break;\n case 'flow':\n inFlow = true;\n break;\n default:\n inFlow = null;\n }\n return {\n anchors: new Set(),\n doc,\n flowCollectionPadding: opt.flowCollectionPadding ? ' ' : '',\n indent: '',\n indentStep: typeof opt.indent === 'number' ? ' '.repeat(opt.indent) : ' ',\n inFlow,\n options: opt\n };\n}\nfunction getTagObject(tags, item) {\n if (item.tag) {\n const match = tags.filter(t => t.tag === item.tag);\n if (match.length > 0)\n return match.find(t => t.format === item.format) ?? match[0];\n }\n let tagObj = undefined;\n let obj;\n if (identity.isScalar(item)) {\n obj = item.value;\n let match = tags.filter(t => t.identify?.(obj));\n if (match.length > 1) {\n const testMatch = match.filter(t => t.test);\n if (testMatch.length > 0)\n match = testMatch;\n }\n tagObj =\n match.find(t => t.format === item.format) ?? match.find(t => !t.format);\n }\n else {\n obj = item;\n tagObj = tags.find(t => t.nodeClass && obj instanceof t.nodeClass);\n }\n if (!tagObj) {\n const name = obj?.constructor?.name ?? (obj === null ? 'null' : typeof obj);\n throw new Error(`Tag not resolved for ${name} value`);\n }\n return tagObj;\n}\n// needs to be called before value stringifier to allow for circular anchor refs\nfunction stringifyProps(node, tagObj, { anchors: anchors$1, doc }) {\n if (!doc.directives)\n return '';\n const props = [];\n const anchor = (identity.isScalar(node) || identity.isCollection(node)) && node.anchor;\n if (anchor && anchors.anchorIsValid(anchor)) {\n anchors$1.add(anchor);\n props.push(`&${anchor}`);\n }\n const tag = node.tag ?? (tagObj.default ? null : tagObj.tag);\n if (tag)\n props.push(doc.directives.tagString(tag));\n return props.join(' ');\n}\nfunction stringify(item, ctx, onComment, onChompKeep) {\n if (identity.isPair(item))\n return item.toString(ctx, onComment, onChompKeep);\n if (identity.isAlias(item)) {\n if (ctx.doc.directives)\n return item.toString(ctx);\n if (ctx.resolvedAliases?.has(item)) {\n throw new TypeError(`Cannot stringify circular structure without alias nodes`);\n }\n else {\n if (ctx.resolvedAliases)\n ctx.resolvedAliases.add(item);\n else\n ctx.resolvedAliases = new Set([item]);\n item = item.resolve(ctx.doc);\n }\n }\n let tagObj = undefined;\n const node = identity.isNode(item)\n ? item\n : ctx.doc.createNode(item, { onTagObj: o => (tagObj = o) });\n tagObj ?? (tagObj = getTagObject(ctx.doc.schema.tags, node));\n const props = stringifyProps(node, tagObj, ctx);\n if (props.length > 0)\n ctx.indentAtStart = (ctx.indentAtStart ?? 0) + props.length + 1;\n const str = typeof tagObj.stringify === 'function'\n ? tagObj.stringify(node, ctx, onComment, onChompKeep)\n : identity.isScalar(node)\n ? stringifyString.stringifyString(node, ctx, onComment, onChompKeep)\n : node.toString(ctx, onComment, onChompKeep);\n if (!props)\n return str;\n return identity.isScalar(node) || str[0] === '{' || str[0] === '['\n ? `${props} ${str}`\n : `${props}\\n${ctx.indent}${str}`;\n}\n\nexports.createStringifyContext = createStringifyContext;\nexports.stringify = stringify;\n","'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar Scalar = require('../nodes/Scalar.js');\nvar stringify = require('./stringify.js');\nvar stringifyComment = require('./stringifyComment.js');\n\nfunction stringifyPair({ key, value }, ctx, onComment, onChompKeep) {\n const { allNullValues, doc, indent, indentStep, options: { commentString, indentSeq, simpleKeys } } = ctx;\n let keyComment = (identity.isNode(key) && key.comment) || null;\n if (simpleKeys) {\n if (keyComment) {\n throw new Error('With simple keys, key nodes cannot have comments');\n }\n if (identity.isCollection(key) || (!identity.isNode(key) && typeof key === 'object')) {\n const msg = 'With simple keys, collection cannot be used as a key value';\n throw new Error(msg);\n }\n }\n let explicitKey = !simpleKeys &&\n (!key ||\n (keyComment && value == null && !ctx.inFlow) ||\n identity.isCollection(key) ||\n (identity.isScalar(key)\n ? key.type === Scalar.Scalar.BLOCK_FOLDED || key.type === Scalar.Scalar.BLOCK_LITERAL\n : typeof key === 'object'));\n ctx = Object.assign({}, ctx, {\n allNullValues: false,\n implicitKey: !explicitKey && (simpleKeys || !allNullValues),\n indent: indent + indentStep\n });\n let keyCommentDone = false;\n let chompKeep = false;\n let str = stringify.stringify(key, ctx, () => (keyCommentDone = true), () => (chompKeep = true));\n if (!explicitKey && !ctx.inFlow && str.length > 1024) {\n if (simpleKeys)\n throw new Error('With simple keys, single line scalar must not span more than 1024 characters');\n explicitKey = true;\n }\n if (ctx.inFlow) {\n if (allNullValues || value == null) {\n if (keyCommentDone && onComment)\n onComment();\n return str === '' ? '?' : explicitKey ? `? ${str}` : str;\n }\n }\n else if ((allNullValues && !simpleKeys) || (value == null && explicitKey)) {\n str = `? ${str}`;\n if (keyComment && !keyCommentDone) {\n str += stringifyComment.lineComment(str, ctx.indent, commentString(keyComment));\n }\n else if (chompKeep && onChompKeep)\n onChompKeep();\n return str;\n }\n if (keyCommentDone)\n keyComment = null;\n if (explicitKey) {\n if (keyComment)\n str += stringifyComment.lineComment(str, ctx.indent, commentString(keyComment));\n str = `? ${str}\\n${indent}:`;\n }\n else {\n str = `${str}:`;\n if (keyComment)\n str += stringifyComment.lineComment(str, ctx.indent, commentString(keyComment));\n }\n let vsb, vcb, valueComment;\n if (identity.isNode(value)) {\n vsb = !!value.spaceBefore;\n vcb = value.commentBefore;\n valueComment = value.comment;\n }\n else {\n vsb = false;\n vcb = null;\n valueComment = null;\n if (value && typeof value === 'object')\n value = doc.createNode(value);\n }\n ctx.implicitKey = false;\n if (!explicitKey && !keyComment && identity.isScalar(value))\n ctx.indentAtStart = str.length + 1;\n chompKeep = false;\n if (!indentSeq &&\n indentStep.length >= 2 &&\n !ctx.inFlow &&\n !explicitKey &&\n identity.isSeq(value) &&\n !value.flow &&\n !value.tag &&\n !value.anchor) {\n // If indentSeq === false, consider '- ' as part of indentation where possible\n ctx.indent = ctx.indent.substring(2);\n }\n let valueCommentDone = false;\n const valueStr = stringify.stringify(value, ctx, () => (valueCommentDone = true), () => (chompKeep = true));\n let ws = ' ';\n if (keyComment || vsb || vcb) {\n ws = vsb ? '\\n' : '';\n if (vcb) {\n const cs = commentString(vcb);\n ws += `\\n${stringifyComment.indentComment(cs, ctx.indent)}`;\n }\n if (valueStr === '' && !ctx.inFlow) {\n if (ws === '\\n' && valueComment)\n ws = '\\n\\n';\n }\n else {\n ws += `\\n${ctx.indent}`;\n }\n }\n else if (!explicitKey && identity.isCollection(value)) {\n const vs0 = valueStr[0];\n const nl0 = valueStr.indexOf('\\n');\n const hasNewline = nl0 !== -1;\n const flow = ctx.inFlow ?? value.flow ?? value.items.length === 0;\n if (hasNewline || !flow) {\n let hasPropsLine = false;\n if (hasNewline && (vs0 === '&' || vs0 === '!')) {\n let sp0 = valueStr.indexOf(' ');\n if (vs0 === '&' &&\n sp0 !== -1 &&\n sp0 < nl0 &&\n valueStr[sp0 + 1] === '!') {\n sp0 = valueStr.indexOf(' ', sp0 + 1);\n }\n if (sp0 === -1 || nl0 < sp0)\n hasPropsLine = true;\n }\n if (!hasPropsLine)\n ws = `\\n${ctx.indent}`;\n }\n }\n else if (valueStr === '' || valueStr[0] === '\\n') {\n ws = '';\n }\n str += ws + valueStr;\n if (ctx.inFlow) {\n if (valueCommentDone && onComment)\n onComment();\n }\n else if (valueComment && !valueCommentDone) {\n str += stringifyComment.lineComment(str, ctx.indent, commentString(valueComment));\n }\n else if (chompKeep && onChompKeep) {\n onChompKeep();\n }\n return str;\n}\n\nexports.stringifyPair = stringifyPair;\n","'use strict';\n\nvar node_process = require('process');\n\nfunction debug(logLevel, ...messages) {\n if (logLevel === 'debug')\n console.log(...messages);\n}\nfunction warn(logLevel, warning) {\n if (logLevel === 'debug' || logLevel === 'warn') {\n if (typeof node_process.emitWarning === 'function')\n node_process.emitWarning(warning);\n else\n console.warn(warning);\n }\n}\n\nexports.debug = debug;\nexports.warn = warn;\n","'use strict';\n\nvar identity = require('../../nodes/identity.js');\nvar Scalar = require('../../nodes/Scalar.js');\n\n// If the value associated with a merge key is a single mapping node, each of\n// its key/value pairs is inserted into the current mapping, unless the key\n// already exists in it. If the value associated with the merge key is a\n// sequence, then this sequence is expected to contain mapping nodes and each\n// of these nodes is merged in turn according to its order in the sequence.\n// Keys in mapping nodes earlier in the sequence override keys specified in\n// later mapping nodes. -- http://yaml.org/type/merge.html\nconst MERGE_KEY = '<<';\nconst merge = {\n identify: value => value === MERGE_KEY ||\n (typeof value === 'symbol' && value.description === MERGE_KEY),\n default: 'key',\n tag: 'tag:yaml.org,2002:merge',\n test: /^<<$/,\n resolve: () => Object.assign(new Scalar.Scalar(Symbol(MERGE_KEY)), {\n addToJSMap: addMergeToJSMap\n }),\n stringify: () => MERGE_KEY\n};\nconst isMergeKey = (ctx, key) => (merge.identify(key) ||\n (identity.isScalar(key) &&\n (!key.type || key.type === Scalar.Scalar.PLAIN) &&\n merge.identify(key.value))) &&\n ctx?.doc.schema.tags.some(tag => tag.tag === merge.tag && tag.default);\nfunction addMergeToJSMap(ctx, map, value) {\n const source = resolveAliasValue(ctx, value);\n if (identity.isSeq(source))\n for (const it of source.items)\n mergeValue(ctx, map, it);\n else if (Array.isArray(source))\n for (const it of source)\n mergeValue(ctx, map, it);\n else\n mergeValue(ctx, map, source);\n}\nfunction mergeValue(ctx, map, value) {\n const source = resolveAliasValue(ctx, value);\n if (!identity.isMap(source))\n throw new Error('Merge sources must be maps or map aliases');\n const srcMap = source.toJSON(null, ctx, Map);\n for (const [key, value] of srcMap) {\n if (map instanceof Map) {\n if (!map.has(key))\n map.set(key, value);\n }\n else if (map instanceof Set) {\n map.add(key);\n }\n else if (!Object.prototype.hasOwnProperty.call(map, key)) {\n Object.defineProperty(map, key, {\n value,\n writable: true,\n enumerable: true,\n configurable: true\n });\n }\n }\n return map;\n}\nfunction resolveAliasValue(ctx, value) {\n return ctx && identity.isAlias(value) ? value.resolve(ctx.doc, ctx) : value;\n}\n\nexports.addMergeToJSMap = addMergeToJSMap;\nexports.isMergeKey = isMergeKey;\nexports.merge = merge;\n","'use strict';\n\nvar log = require('../log.js');\nvar merge = require('../schema/yaml-1.1/merge.js');\nvar stringify = require('../stringify/stringify.js');\nvar identity = require('./identity.js');\nvar toJS = require('./toJS.js');\n\nfunction addPairToJSMap(ctx, map, { key, value }) {\n if (identity.isNode(key) && key.addToJSMap)\n key.addToJSMap(ctx, map, value);\n // TODO: Should drop this special case for bare << handling\n else if (merge.isMergeKey(ctx, key))\n merge.addMergeToJSMap(ctx, map, value);\n else {\n const jsKey = toJS.toJS(key, '', ctx);\n if (map instanceof Map) {\n map.set(jsKey, toJS.toJS(value, jsKey, ctx));\n }\n else if (map instanceof Set) {\n map.add(jsKey);\n }\n else {\n const stringKey = stringifyKey(key, jsKey, ctx);\n const jsValue = toJS.toJS(value, stringKey, ctx);\n if (stringKey in map)\n Object.defineProperty(map, stringKey, {\n value: jsValue,\n writable: true,\n enumerable: true,\n configurable: true\n });\n else\n map[stringKey] = jsValue;\n }\n }\n return map;\n}\nfunction stringifyKey(key, jsKey, ctx) {\n if (jsKey === null)\n return '';\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n if (typeof jsKey !== 'object')\n return String(jsKey);\n if (identity.isNode(key) && ctx?.doc) {\n const strCtx = stringify.createStringifyContext(ctx.doc, {});\n strCtx.anchors = new Set();\n for (const node of ctx.anchors.keys())\n strCtx.anchors.add(node.anchor);\n strCtx.inFlow = true;\n strCtx.inStringifyKey = true;\n const strKey = key.toString(strCtx);\n if (!ctx.mapKeyWarned) {\n let jsonStr = JSON.stringify(strKey);\n if (jsonStr.length > 40)\n jsonStr = jsonStr.substring(0, 36) + '...\"';\n log.warn(ctx.doc.options.logLevel, `Keys with collection values will be stringified due to JS Object restrictions: ${jsonStr}. Set mapAsMap: true to use object keys.`);\n ctx.mapKeyWarned = true;\n }\n return strKey;\n }\n return JSON.stringify(jsKey);\n}\n\nexports.addPairToJSMap = addPairToJSMap;\n","'use strict';\n\nvar createNode = require('../doc/createNode.js');\nvar stringifyPair = require('../stringify/stringifyPair.js');\nvar addPairToJSMap = require('./addPairToJSMap.js');\nvar identity = require('./identity.js');\n\nfunction createPair(key, value, ctx) {\n const k = createNode.createNode(key, undefined, ctx);\n const v = createNode.createNode(value, undefined, ctx);\n return new Pair(k, v);\n}\nclass Pair {\n constructor(key, value = null) {\n Object.defineProperty(this, identity.NODE_TYPE, { value: identity.PAIR });\n this.key = key;\n this.value = value;\n }\n clone(schema) {\n let { key, value } = this;\n if (identity.isNode(key))\n key = key.clone(schema);\n if (identity.isNode(value))\n value = value.clone(schema);\n return new Pair(key, value);\n }\n toJSON(_, ctx) {\n const pair = ctx?.mapAsMap ? new Map() : {};\n return addPairToJSMap.addPairToJSMap(ctx, pair, this);\n }\n toString(ctx, onComment, onChompKeep) {\n return ctx?.doc\n ? stringifyPair.stringifyPair(this, ctx, onComment, onChompKeep)\n : JSON.stringify(this);\n }\n}\n\nexports.Pair = Pair;\nexports.createPair = createPair;\n","'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar stringify = require('./stringify.js');\nvar stringifyComment = require('./stringifyComment.js');\n\nfunction stringifyCollection(collection, ctx, options) {\n const flow = ctx.inFlow ?? collection.flow;\n const stringify = flow ? stringifyFlowCollection : stringifyBlockCollection;\n return stringify(collection, ctx, options);\n}\nfunction stringifyBlockCollection({ comment, items }, ctx, { blockItemPrefix, flowChars, itemIndent, onChompKeep, onComment }) {\n const { indent, options: { commentString } } = ctx;\n const itemCtx = Object.assign({}, ctx, { indent: itemIndent, type: null });\n let chompKeep = false; // flag for the preceding node's status\n const lines = [];\n for (let i = 0; i < items.length; ++i) {\n const item = items[i];\n let comment = null;\n if (identity.isNode(item)) {\n if (!chompKeep && item.spaceBefore)\n lines.push('');\n addCommentBefore(ctx, lines, item.commentBefore, chompKeep);\n if (item.comment)\n comment = item.comment;\n }\n else if (identity.isPair(item)) {\n const ik = identity.isNode(item.key) ? item.key : null;\n if (ik) {\n if (!chompKeep && ik.spaceBefore)\n lines.push('');\n addCommentBefore(ctx, lines, ik.commentBefore, chompKeep);\n }\n }\n chompKeep = false;\n let str = stringify.stringify(item, itemCtx, () => (comment = null), () => (chompKeep = true));\n if (comment)\n str += stringifyComment.lineComment(str, itemIndent, commentString(comment));\n if (chompKeep && comment)\n chompKeep = false;\n lines.push(blockItemPrefix + str);\n }\n let str;\n if (lines.length === 0) {\n str = flowChars.start + flowChars.end;\n }\n else {\n str = lines[0];\n for (let i = 1; i < lines.length; ++i) {\n const line = lines[i];\n str += line ? `\\n${indent}${line}` : '\\n';\n }\n }\n if (comment) {\n str += '\\n' + stringifyComment.indentComment(commentString(comment), indent);\n if (onComment)\n onComment();\n }\n else if (chompKeep && onChompKeep)\n onChompKeep();\n return str;\n}\nfunction stringifyFlowCollection({ items }, ctx, { flowChars, itemIndent }) {\n const { indent, indentStep, flowCollectionPadding: fcPadding, options: { commentString } } = ctx;\n itemIndent += indentStep;\n const itemCtx = Object.assign({}, ctx, {\n indent: itemIndent,\n inFlow: true,\n type: null\n });\n let reqNewline = false;\n let linesAtValue = 0;\n const lines = [];\n for (let i = 0; i < items.length; ++i) {\n const item = items[i];\n let comment = null;\n if (identity.isNode(item)) {\n if (item.spaceBefore)\n lines.push('');\n addCommentBefore(ctx, lines, item.commentBefore, false);\n if (item.comment)\n comment = item.comment;\n }\n else if (identity.isPair(item)) {\n const ik = identity.isNode(item.key) ? item.key : null;\n if (ik) {\n if (ik.spaceBefore)\n lines.push('');\n addCommentBefore(ctx, lines, ik.commentBefore, false);\n if (ik.comment)\n reqNewline = true;\n }\n const iv = identity.isNode(item.value) ? item.value : null;\n if (iv) {\n if (iv.comment)\n comment = iv.comment;\n if (iv.commentBefore)\n reqNewline = true;\n }\n else if (item.value == null && ik?.comment) {\n comment = ik.comment;\n }\n }\n if (comment)\n reqNewline = true;\n let str = stringify.stringify(item, itemCtx, () => (comment = null));\n reqNewline || (reqNewline = lines.length > linesAtValue || str.includes('\\n'));\n if (i < items.length - 1) {\n str += ',';\n }\n else if (ctx.options.trailingComma) {\n if (ctx.options.lineWidth > 0) {\n reqNewline || (reqNewline = lines.reduce((sum, line) => sum + line.length + 2, 2) +\n (str.length + 2) >\n ctx.options.lineWidth);\n }\n if (reqNewline) {\n str += ',';\n }\n }\n if (comment)\n str += stringifyComment.lineComment(str, itemIndent, commentString(comment));\n lines.push(str);\n linesAtValue = lines.length;\n }\n const { start, end } = flowChars;\n if (lines.length === 0) {\n return start + end;\n }\n else {\n if (!reqNewline) {\n const len = lines.reduce((sum, line) => sum + line.length + 2, 2);\n reqNewline = ctx.options.lineWidth > 0 && len > ctx.options.lineWidth;\n }\n if (reqNewline) {\n let str = start;\n for (const line of lines)\n str += line ? `\\n${indentStep}${indent}${line}` : '\\n';\n return `${str}\\n${indent}${end}`;\n }\n else {\n return `${start}${fcPadding}${lines.join(' ')}${fcPadding}${end}`;\n }\n }\n}\nfunction addCommentBefore({ indent, options: { commentString } }, lines, comment, chompKeep) {\n if (comment && chompKeep)\n comment = comment.replace(/^\\n+/, '');\n if (comment) {\n const ic = stringifyComment.indentComment(commentString(comment), indent);\n lines.push(ic.trimStart()); // Avoid double indent on first line\n }\n}\n\nexports.stringifyCollection = stringifyCollection;\n","'use strict';\n\nvar stringifyCollection = require('../stringify/stringifyCollection.js');\nvar addPairToJSMap = require('./addPairToJSMap.js');\nvar Collection = require('./Collection.js');\nvar identity = require('./identity.js');\nvar Pair = require('./Pair.js');\nvar Scalar = require('./Scalar.js');\n\nfunction findPair(items, key) {\n const k = identity.isScalar(key) ? key.value : key;\n for (const it of items) {\n if (identity.isPair(it)) {\n if (it.key === key || it.key === k)\n return it;\n if (identity.isScalar(it.key) && it.key.value === k)\n return it;\n }\n }\n return undefined;\n}\nclass YAMLMap extends Collection.Collection {\n static get tagName() {\n return 'tag:yaml.org,2002:map';\n }\n constructor(schema) {\n super(identity.MAP, schema);\n this.items = [];\n }\n /**\n * A generic collection parsing method that can be extended\n * to other node classes that inherit from YAMLMap\n */\n static from(schema, obj, ctx) {\n const { keepUndefined, replacer } = ctx;\n const map = new this(schema);\n const add = (key, value) => {\n if (typeof replacer === 'function')\n value = replacer.call(obj, key, value);\n else if (Array.isArray(replacer) && !replacer.includes(key))\n return;\n if (value !== undefined || keepUndefined)\n map.items.push(Pair.createPair(key, value, ctx));\n };\n if (obj instanceof Map) {\n for (const [key, value] of obj)\n add(key, value);\n }\n else if (obj && typeof obj === 'object') {\n for (const key of Object.keys(obj))\n add(key, obj[key]);\n }\n if (typeof schema.sortMapEntries === 'function') {\n map.items.sort(schema.sortMapEntries);\n }\n return map;\n }\n /**\n * Adds a value to the collection.\n *\n * @param overwrite - If not set `true`, using a key that is already in the\n * collection will throw. Otherwise, overwrites the previous value.\n */\n add(pair, overwrite) {\n let _pair;\n if (identity.isPair(pair))\n _pair = pair;\n else if (!pair || typeof pair !== 'object' || !('key' in pair)) {\n // In TypeScript, this never happens.\n _pair = new Pair.Pair(pair, pair?.value);\n }\n else\n _pair = new Pair.Pair(pair.key, pair.value);\n const prev = findPair(this.items, _pair.key);\n const sortEntries = this.schema?.sortMapEntries;\n if (prev) {\n if (!overwrite)\n throw new Error(`Key ${_pair.key} already set`);\n // For scalars, keep the old node & its comments and anchors\n if (identity.isScalar(prev.value) && Scalar.isScalarValue(_pair.value))\n prev.value.value = _pair.value;\n else\n prev.value = _pair.value;\n }\n else if (sortEntries) {\n const i = this.items.findIndex(item => sortEntries(_pair, item) < 0);\n if (i === -1)\n this.items.push(_pair);\n else\n this.items.splice(i, 0, _pair);\n }\n else {\n this.items.push(_pair);\n }\n }\n delete(key) {\n const it = findPair(this.items, key);\n if (!it)\n return false;\n const del = this.items.splice(this.items.indexOf(it), 1);\n return del.length > 0;\n }\n get(key, keepScalar) {\n const it = findPair(this.items, key);\n const node = it?.value;\n return (!keepScalar && identity.isScalar(node) ? node.value : node) ?? undefined;\n }\n has(key) {\n return !!findPair(this.items, key);\n }\n set(key, value) {\n this.add(new Pair.Pair(key, value), true);\n }\n /**\n * @param ctx - Conversion context, originally set in Document#toJS()\n * @param {Class} Type - If set, forces the returned collection type\n * @returns Instance of Type, Map, or Object\n */\n toJSON(_, ctx, Type) {\n const map = Type ? new Type() : ctx?.mapAsMap ? new Map() : {};\n if (ctx?.onCreate)\n ctx.onCreate(map);\n for (const item of this.items)\n addPairToJSMap.addPairToJSMap(ctx, map, item);\n return map;\n }\n toString(ctx, onComment, onChompKeep) {\n if (!ctx)\n return JSON.stringify(this);\n for (const item of this.items) {\n if (!identity.isPair(item))\n throw new Error(`Map items must all be pairs; found ${JSON.stringify(item)} instead`);\n }\n if (!ctx.allNullValues && this.hasAllNullValues(false))\n ctx = Object.assign({}, ctx, { allNullValues: true });\n return stringifyCollection.stringifyCollection(this, ctx, {\n blockItemPrefix: '',\n flowChars: { start: '{', end: '}' },\n itemIndent: ctx.indent || '',\n onChompKeep,\n onComment\n });\n }\n}\n\nexports.YAMLMap = YAMLMap;\nexports.findPair = findPair;\n","'use strict';\n\nvar identity = require('../../nodes/identity.js');\nvar YAMLMap = require('../../nodes/YAMLMap.js');\n\nconst map = {\n collection: 'map',\n default: true,\n nodeClass: YAMLMap.YAMLMap,\n tag: 'tag:yaml.org,2002:map',\n resolve(map, onError) {\n if (!identity.isMap(map))\n onError('Expected a mapping for this tag');\n return map;\n },\n createNode: (schema, obj, ctx) => YAMLMap.YAMLMap.from(schema, obj, ctx)\n};\n\nexports.map = map;\n","'use strict';\n\nvar createNode = require('../doc/createNode.js');\nvar stringifyCollection = require('../stringify/stringifyCollection.js');\nvar Collection = require('./Collection.js');\nvar identity = require('./identity.js');\nvar Scalar = require('./Scalar.js');\nvar toJS = require('./toJS.js');\n\nclass YAMLSeq extends Collection.Collection {\n static get tagName() {\n return 'tag:yaml.org,2002:seq';\n }\n constructor(schema) {\n super(identity.SEQ, schema);\n this.items = [];\n }\n add(value) {\n this.items.push(value);\n }\n /**\n * Removes a value from the collection.\n *\n * `key` must contain a representation of an integer for this to succeed.\n * It may be wrapped in a `Scalar`.\n *\n * @returns `true` if the item was found and removed.\n */\n delete(key) {\n const idx = asItemIndex(key);\n if (typeof idx !== 'number')\n return false;\n const del = this.items.splice(idx, 1);\n return del.length > 0;\n }\n get(key, keepScalar) {\n const idx = asItemIndex(key);\n if (typeof idx !== 'number')\n return undefined;\n const it = this.items[idx];\n return !keepScalar && identity.isScalar(it) ? it.value : it;\n }\n /**\n * Checks if the collection includes a value with the key `key`.\n *\n * `key` must contain a representation of an integer for this to succeed.\n * It may be wrapped in a `Scalar`.\n */\n has(key) {\n const idx = asItemIndex(key);\n return typeof idx === 'number' && idx < this.items.length;\n }\n /**\n * Sets a value in this collection. For `!!set`, `value` needs to be a\n * boolean to add/remove the item from the set.\n *\n * If `key` does not contain a representation of an integer, this will throw.\n * It may be wrapped in a `Scalar`.\n */\n set(key, value) {\n const idx = asItemIndex(key);\n if (typeof idx !== 'number')\n throw new Error(`Expected a valid index, not ${key}.`);\n const prev = this.items[idx];\n if (identity.isScalar(prev) && Scalar.isScalarValue(value))\n prev.value = value;\n else\n this.items[idx] = value;\n }\n toJSON(_, ctx) {\n const seq = [];\n if (ctx?.onCreate)\n ctx.onCreate(seq);\n let i = 0;\n for (const item of this.items)\n seq.push(toJS.toJS(item, String(i++), ctx));\n return seq;\n }\n toString(ctx, onComment, onChompKeep) {\n if (!ctx)\n return JSON.stringify(this);\n return stringifyCollection.stringifyCollection(this, ctx, {\n blockItemPrefix: '- ',\n flowChars: { start: '[', end: ']' },\n itemIndent: (ctx.indent || '') + ' ',\n onChompKeep,\n onComment\n });\n }\n static from(schema, obj, ctx) {\n const { replacer } = ctx;\n const seq = new this(schema);\n if (obj && Symbol.iterator in Object(obj)) {\n let i = 0;\n for (let it of obj) {\n if (typeof replacer === 'function') {\n const key = obj instanceof Set ? it : String(i++);\n it = replacer.call(obj, key, it);\n }\n seq.items.push(createNode.createNode(it, undefined, ctx));\n }\n }\n return seq;\n }\n}\nfunction asItemIndex(key) {\n let idx = identity.isScalar(key) ? key.value : key;\n if (idx && typeof idx === 'string')\n idx = Number(idx);\n return typeof idx === 'number' && Number.isInteger(idx) && idx >= 0\n ? idx\n : null;\n}\n\nexports.YAMLSeq = YAMLSeq;\n","'use strict';\n\nvar identity = require('../../nodes/identity.js');\nvar YAMLSeq = require('../../nodes/YAMLSeq.js');\n\nconst seq = {\n collection: 'seq',\n default: true,\n nodeClass: YAMLSeq.YAMLSeq,\n tag: 'tag:yaml.org,2002:seq',\n resolve(seq, onError) {\n if (!identity.isSeq(seq))\n onError('Expected a sequence for this tag');\n return seq;\n },\n createNode: (schema, obj, ctx) => YAMLSeq.YAMLSeq.from(schema, obj, ctx)\n};\n\nexports.seq = seq;\n","'use strict';\n\nvar stringifyString = require('../../stringify/stringifyString.js');\n\nconst string = {\n identify: value => typeof value === 'string',\n default: true,\n tag: 'tag:yaml.org,2002:str',\n resolve: str => str,\n stringify(item, ctx, onComment, onChompKeep) {\n ctx = Object.assign({ actualString: true }, ctx);\n return stringifyString.stringifyString(item, ctx, onComment, onChompKeep);\n }\n};\n\nexports.string = string;\n","'use strict';\n\nvar Scalar = require('../../nodes/Scalar.js');\n\nconst nullTag = {\n identify: value => value == null,\n createNode: () => new Scalar.Scalar(null),\n default: true,\n tag: 'tag:yaml.org,2002:null',\n test: /^(?:~|[Nn]ull|NULL)?$/,\n resolve: () => new Scalar.Scalar(null),\n stringify: ({ source }, ctx) => typeof source === 'string' && nullTag.test.test(source)\n ? source\n : ctx.options.nullStr\n};\n\nexports.nullTag = nullTag;\n","'use strict';\n\nvar Scalar = require('../../nodes/Scalar.js');\n\nconst boolTag = {\n identify: value => typeof value === 'boolean',\n default: true,\n tag: 'tag:yaml.org,2002:bool',\n test: /^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/,\n resolve: str => new Scalar.Scalar(str[0] === 't' || str[0] === 'T'),\n stringify({ source, value }, ctx) {\n if (source && boolTag.test.test(source)) {\n const sv = source[0] === 't' || source[0] === 'T';\n if (value === sv)\n return source;\n }\n return value ? ctx.options.trueStr : ctx.options.falseStr;\n }\n};\n\nexports.boolTag = boolTag;\n","'use strict';\n\nfunction stringifyNumber({ format, minFractionDigits, tag, value }) {\n if (typeof value === 'bigint')\n return String(value);\n const num = typeof value === 'number' ? value : Number(value);\n if (!isFinite(num))\n return isNaN(num) ? '.nan' : num < 0 ? '-.inf' : '.inf';\n let n = Object.is(value, -0) ? '-0' : JSON.stringify(value);\n if (!format &&\n minFractionDigits &&\n (!tag || tag === 'tag:yaml.org,2002:float') &&\n /^-?\\d/.test(n) &&\n !n.includes('e')) {\n let i = n.indexOf('.');\n if (i < 0) {\n i = n.length;\n n += '.';\n }\n let d = minFractionDigits - (n.length - i - 1);\n while (d-- > 0)\n n += '0';\n }\n return n;\n}\n\nexports.stringifyNumber = stringifyNumber;\n","'use strict';\n\nvar Scalar = require('../../nodes/Scalar.js');\nvar stringifyNumber = require('../../stringify/stringifyNumber.js');\n\nconst floatNaN = {\n identify: value => typeof value === 'number',\n default: true,\n tag: 'tag:yaml.org,2002:float',\n test: /^(?:[-+]?\\.(?:inf|Inf|INF)|\\.nan|\\.NaN|\\.NAN)$/,\n resolve: str => str.slice(-3).toLowerCase() === 'nan'\n ? NaN\n : str[0] === '-'\n ? Number.NEGATIVE_INFINITY\n : Number.POSITIVE_INFINITY,\n stringify: stringifyNumber.stringifyNumber\n};\nconst floatExp = {\n identify: value => typeof value === 'number',\n default: true,\n tag: 'tag:yaml.org,2002:float',\n format: 'EXP',\n test: /^[-+]?(?:\\.[0-9]+|[0-9]+(?:\\.[0-9]*)?)[eE][-+]?[0-9]+$/,\n resolve: str => parseFloat(str),\n stringify(node) {\n const num = Number(node.value);\n return isFinite(num) ? num.toExponential() : stringifyNumber.stringifyNumber(node);\n }\n};\nconst float = {\n identify: value => typeof value === 'number',\n default: true,\n tag: 'tag:yaml.org,2002:float',\n test: /^[-+]?(?:\\.[0-9]+|[0-9]+\\.[0-9]*)$/,\n resolve(str) {\n const node = new Scalar.Scalar(parseFloat(str));\n const dot = str.indexOf('.');\n if (dot !== -1 && str[str.length - 1] === '0')\n node.minFractionDigits = str.length - dot - 1;\n return node;\n },\n stringify: stringifyNumber.stringifyNumber\n};\n\nexports.float = float;\nexports.floatExp = floatExp;\nexports.floatNaN = floatNaN;\n","'use strict';\n\nvar stringifyNumber = require('../../stringify/stringifyNumber.js');\n\nconst intIdentify = (value) => typeof value === 'bigint' || Number.isInteger(value);\nconst intResolve = (str, offset, radix, { intAsBigInt }) => (intAsBigInt ? BigInt(str) : parseInt(str.substring(offset), radix));\nfunction intStringify(node, radix, prefix) {\n const { value } = node;\n if (intIdentify(value) && value >= 0)\n return prefix + value.toString(radix);\n return stringifyNumber.stringifyNumber(node);\n}\nconst intOct = {\n identify: value => intIdentify(value) && value >= 0,\n default: true,\n tag: 'tag:yaml.org,2002:int',\n format: 'OCT',\n test: /^0o[0-7]+$/,\n resolve: (str, _onError, opt) => intResolve(str, 2, 8, opt),\n stringify: node => intStringify(node, 8, '0o')\n};\nconst int = {\n identify: intIdentify,\n default: true,\n tag: 'tag:yaml.org,2002:int',\n test: /^[-+]?[0-9]+$/,\n resolve: (str, _onError, opt) => intResolve(str, 0, 10, opt),\n stringify: stringifyNumber.stringifyNumber\n};\nconst intHex = {\n identify: value => intIdentify(value) && value >= 0,\n default: true,\n tag: 'tag:yaml.org,2002:int',\n format: 'HEX',\n test: /^0x[0-9a-fA-F]+$/,\n resolve: (str, _onError, opt) => intResolve(str, 2, 16, opt),\n stringify: node => intStringify(node, 16, '0x')\n};\n\nexports.int = int;\nexports.intHex = intHex;\nexports.intOct = intOct;\n","'use strict';\n\nvar map = require('../common/map.js');\nvar _null = require('../common/null.js');\nvar seq = require('../common/seq.js');\nvar string = require('../common/string.js');\nvar bool = require('./bool.js');\nvar float = require('./float.js');\nvar int = require('./int.js');\n\nconst schema = [\n map.map,\n seq.seq,\n string.string,\n _null.nullTag,\n bool.boolTag,\n int.intOct,\n int.int,\n int.intHex,\n float.floatNaN,\n float.floatExp,\n float.float\n];\n\nexports.schema = schema;\n","'use strict';\n\nvar Scalar = require('../../nodes/Scalar.js');\nvar map = require('../common/map.js');\nvar seq = require('../common/seq.js');\n\nfunction intIdentify(value) {\n return typeof value === 'bigint' || Number.isInteger(value);\n}\nconst stringifyJSON = ({ value }) => JSON.stringify(value);\nconst jsonScalars = [\n {\n identify: value => typeof value === 'string',\n default: true,\n tag: 'tag:yaml.org,2002:str',\n resolve: str => str,\n stringify: stringifyJSON\n },\n {\n identify: value => value == null,\n createNode: () => new Scalar.Scalar(null),\n default: true,\n tag: 'tag:yaml.org,2002:null',\n test: /^null$/,\n resolve: () => null,\n stringify: stringifyJSON\n },\n {\n identify: value => typeof value === 'boolean',\n default: true,\n tag: 'tag:yaml.org,2002:bool',\n test: /^true$|^false$/,\n resolve: str => str === 'true',\n stringify: stringifyJSON\n },\n {\n identify: intIdentify,\n default: true,\n tag: 'tag:yaml.org,2002:int',\n test: /^-?(?:0|[1-9][0-9]*)$/,\n resolve: (str, _onError, { intAsBigInt }) => intAsBigInt ? BigInt(str) : parseInt(str, 10),\n stringify: ({ value }) => intIdentify(value) ? value.toString() : JSON.stringify(value)\n },\n {\n identify: value => typeof value === 'number',\n default: true,\n tag: 'tag:yaml.org,2002:float',\n test: /^-?(?:0|[1-9][0-9]*)(?:\\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/,\n resolve: str => parseFloat(str),\n stringify: stringifyJSON\n }\n];\nconst jsonError = {\n default: true,\n tag: '',\n test: /^/,\n resolve(str, onError) {\n onError(`Unresolved plain scalar ${JSON.stringify(str)}`);\n return str;\n }\n};\nconst schema = [map.map, seq.seq].concat(jsonScalars, jsonError);\n\nexports.schema = schema;\n","'use strict';\n\nvar node_buffer = require('buffer');\nvar Scalar = require('../../nodes/Scalar.js');\nvar stringifyString = require('../../stringify/stringifyString.js');\n\nconst binary = {\n identify: value => value instanceof Uint8Array, // Buffer inherits from Uint8Array\n default: false,\n tag: 'tag:yaml.org,2002:binary',\n /**\n * Returns a Buffer in node and an Uint8Array in browsers\n *\n * To use the resulting buffer as an image, you'll want to do something like:\n *\n * const blob = new Blob([buffer], { type: 'image/jpeg' })\n * document.querySelector('#photo').src = URL.createObjectURL(blob)\n */\n resolve(src, onError) {\n if (typeof node_buffer.Buffer === 'function') {\n return node_buffer.Buffer.from(src, 'base64');\n }\n else if (typeof atob === 'function') {\n // On IE 11, atob() can't handle newlines\n const str = atob(src.replace(/[\\n\\r]/g, ''));\n const buffer = new Uint8Array(str.length);\n for (let i = 0; i < str.length; ++i)\n buffer[i] = str.charCodeAt(i);\n return buffer;\n }\n else {\n onError('This environment does not support reading binary tags; either Buffer or atob is required');\n return src;\n }\n },\n stringify({ comment, type, value }, ctx, onComment, onChompKeep) {\n if (!value)\n return '';\n const buf = value; // checked earlier by binary.identify()\n let str;\n if (typeof node_buffer.Buffer === 'function') {\n str =\n buf instanceof node_buffer.Buffer\n ? buf.toString('base64')\n : node_buffer.Buffer.from(buf.buffer).toString('base64');\n }\n else if (typeof btoa === 'function') {\n let s = '';\n for (let i = 0; i < buf.length; ++i)\n s += String.fromCharCode(buf[i]);\n str = btoa(s);\n }\n else {\n throw new Error('This environment does not support writing binary tags; either Buffer or btoa is required');\n }\n type ?? (type = Scalar.Scalar.BLOCK_LITERAL);\n if (type !== Scalar.Scalar.QUOTE_DOUBLE) {\n const lineWidth = Math.max(ctx.options.lineWidth - ctx.indent.length, ctx.options.minContentWidth);\n const n = Math.ceil(str.length / lineWidth);\n const lines = new Array(n);\n for (let i = 0, o = 0; i < n; ++i, o += lineWidth) {\n lines[i] = str.substr(o, lineWidth);\n }\n str = lines.join(type === Scalar.Scalar.BLOCK_LITERAL ? '\\n' : ' ');\n }\n return stringifyString.stringifyString({ comment, type, value: str }, ctx, onComment, onChompKeep);\n }\n};\n\nexports.binary = binary;\n","'use strict';\n\nvar identity = require('../../nodes/identity.js');\nvar Pair = require('../../nodes/Pair.js');\nvar Scalar = require('../../nodes/Scalar.js');\nvar YAMLSeq = require('../../nodes/YAMLSeq.js');\n\nfunction resolvePairs(seq, onError) {\n if (identity.isSeq(seq)) {\n for (let i = 0; i < seq.items.length; ++i) {\n let item = seq.items[i];\n if (identity.isPair(item))\n continue;\n else if (identity.isMap(item)) {\n if (item.items.length > 1)\n onError('Each pair must have its own sequence indicator');\n const pair = item.items[0] || new Pair.Pair(new Scalar.Scalar(null));\n if (item.commentBefore)\n pair.key.commentBefore = pair.key.commentBefore\n ? `${item.commentBefore}\\n${pair.key.commentBefore}`\n : item.commentBefore;\n if (item.comment) {\n const cn = pair.value ?? pair.key;\n cn.comment = cn.comment\n ? `${item.comment}\\n${cn.comment}`\n : item.comment;\n }\n item = pair;\n }\n seq.items[i] = identity.isPair(item) ? item : new Pair.Pair(item);\n }\n }\n else\n onError('Expected a sequence for this tag');\n return seq;\n}\nfunction createPairs(schema, iterable, ctx) {\n const { replacer } = ctx;\n const pairs = new YAMLSeq.YAMLSeq(schema);\n pairs.tag = 'tag:yaml.org,2002:pairs';\n let i = 0;\n if (iterable && Symbol.iterator in Object(iterable))\n for (let it of iterable) {\n if (typeof replacer === 'function')\n it = replacer.call(iterable, String(i++), it);\n let key, value;\n if (Array.isArray(it)) {\n if (it.length === 2) {\n key = it[0];\n value = it[1];\n }\n else\n throw new TypeError(`Expected [key, value] tuple: ${it}`);\n }\n else if (it && it instanceof Object) {\n const keys = Object.keys(it);\n if (keys.length === 1) {\n key = keys[0];\n value = it[key];\n }\n else {\n throw new TypeError(`Expected tuple with one key, not ${keys.length} keys`);\n }\n }\n else {\n key = it;\n }\n pairs.items.push(Pair.createPair(key, value, ctx));\n }\n return pairs;\n}\nconst pairs = {\n collection: 'seq',\n default: false,\n tag: 'tag:yaml.org,2002:pairs',\n resolve: resolvePairs,\n createNode: createPairs\n};\n\nexports.createPairs = createPairs;\nexports.pairs = pairs;\nexports.resolvePairs = resolvePairs;\n","'use strict';\n\nvar identity = require('../../nodes/identity.js');\nvar toJS = require('../../nodes/toJS.js');\nvar YAMLMap = require('../../nodes/YAMLMap.js');\nvar YAMLSeq = require('../../nodes/YAMLSeq.js');\nvar pairs = require('./pairs.js');\n\nclass YAMLOMap extends YAMLSeq.YAMLSeq {\n constructor() {\n super();\n this.add = YAMLMap.YAMLMap.prototype.add.bind(this);\n this.delete = YAMLMap.YAMLMap.prototype.delete.bind(this);\n this.get = YAMLMap.YAMLMap.prototype.get.bind(this);\n this.has = YAMLMap.YAMLMap.prototype.has.bind(this);\n this.set = YAMLMap.YAMLMap.prototype.set.bind(this);\n this.tag = YAMLOMap.tag;\n }\n /**\n * If `ctx` is given, the return type is actually `Map<unknown, unknown>`,\n * but TypeScript won't allow widening the signature of a child method.\n */\n toJSON(_, ctx) {\n if (!ctx)\n return super.toJSON(_);\n const map = new Map();\n if (ctx?.onCreate)\n ctx.onCreate(map);\n for (const pair of this.items) {\n let key, value;\n if (identity.isPair(pair)) {\n key = toJS.toJS(pair.key, '', ctx);\n value = toJS.toJS(pair.value, key, ctx);\n }\n else {\n key = toJS.toJS(pair, '', ctx);\n }\n if (map.has(key))\n throw new Error('Ordered maps must not include duplicate keys');\n map.set(key, value);\n }\n return map;\n }\n static from(schema, iterable, ctx) {\n const pairs$1 = pairs.createPairs(schema, iterable, ctx);\n const omap = new this();\n omap.items = pairs$1.items;\n return omap;\n }\n}\nYAMLOMap.tag = 'tag:yaml.org,2002:omap';\nconst omap = {\n collection: 'seq',\n identify: value => value instanceof Map,\n nodeClass: YAMLOMap,\n default: false,\n tag: 'tag:yaml.org,2002:omap',\n resolve(seq, onError) {\n const pairs$1 = pairs.resolvePairs(seq, onError);\n const seenKeys = [];\n for (const { key } of pairs$1.items) {\n if (identity.isScalar(key)) {\n if (seenKeys.includes(key.value)) {\n onError(`Ordered maps must not include duplicate keys: ${key.value}`);\n }\n else {\n seenKeys.push(key.value);\n }\n }\n }\n return Object.assign(new YAMLOMap(), pairs$1);\n },\n createNode: (schema, iterable, ctx) => YAMLOMap.from(schema, iterable, ctx)\n};\n\nexports.YAMLOMap = YAMLOMap;\nexports.omap = omap;\n","'use strict';\n\nvar Scalar = require('../../nodes/Scalar.js');\n\nfunction boolStringify({ value, source }, ctx) {\n const boolObj = value ? trueTag : falseTag;\n if (source && boolObj.test.test(source))\n return source;\n return value ? ctx.options.trueStr : ctx.options.falseStr;\n}\nconst trueTag = {\n identify: value => value === true,\n default: true,\n tag: 'tag:yaml.org,2002:bool',\n test: /^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/,\n resolve: () => new Scalar.Scalar(true),\n stringify: boolStringify\n};\nconst falseTag = {\n identify: value => value === false,\n default: true,\n tag: 'tag:yaml.org,2002:bool',\n test: /^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/,\n resolve: () => new Scalar.Scalar(false),\n stringify: boolStringify\n};\n\nexports.falseTag = falseTag;\nexports.trueTag = trueTag;\n","'use strict';\n\nvar Scalar = require('../../nodes/Scalar.js');\nvar stringifyNumber = require('../../stringify/stringifyNumber.js');\n\nconst floatNaN = {\n identify: value => typeof value === 'number',\n default: true,\n tag: 'tag:yaml.org,2002:float',\n test: /^(?:[-+]?\\.(?:inf|Inf|INF)|\\.nan|\\.NaN|\\.NAN)$/,\n resolve: (str) => str.slice(-3).toLowerCase() === 'nan'\n ? NaN\n : str[0] === '-'\n ? Number.NEGATIVE_INFINITY\n : Number.POSITIVE_INFINITY,\n stringify: stringifyNumber.stringifyNumber\n};\nconst floatExp = {\n identify: value => typeof value === 'number',\n default: true,\n tag: 'tag:yaml.org,2002:float',\n format: 'EXP',\n test: /^[-+]?(?:[0-9][0-9_]*)?(?:\\.[0-9_]*)?[eE][-+]?[0-9]+$/,\n resolve: (str) => parseFloat(str.replace(/_/g, '')),\n stringify(node) {\n const num = Number(node.value);\n return isFinite(num) ? num.toExponential() : stringifyNumber.stringifyNumber(node);\n }\n};\nconst float = {\n identify: value => typeof value === 'number',\n default: true,\n tag: 'tag:yaml.org,2002:float',\n test: /^[-+]?(?:[0-9][0-9_]*)?\\.[0-9_]*$/,\n resolve(str) {\n const node = new Scalar.Scalar(parseFloat(str.replace(/_/g, '')));\n const dot = str.indexOf('.');\n if (dot !== -1) {\n const f = str.substring(dot + 1).replace(/_/g, '');\n if (f[f.length - 1] === '0')\n node.minFractionDigits = f.length;\n }\n return node;\n },\n stringify: stringifyNumber.stringifyNumber\n};\n\nexports.float = float;\nexports.floatExp = floatExp;\nexports.floatNaN = floatNaN;\n","'use strict';\n\nvar stringifyNumber = require('../../stringify/stringifyNumber.js');\n\nconst intIdentify = (value) => typeof value === 'bigint' || Number.isInteger(value);\nfunction intResolve(str, offset, radix, { intAsBigInt }) {\n const sign = str[0];\n if (sign === '-' || sign === '+')\n offset += 1;\n str = str.substring(offset).replace(/_/g, '');\n if (intAsBigInt) {\n switch (radix) {\n case 2:\n str = `0b${str}`;\n break;\n case 8:\n str = `0o${str}`;\n break;\n case 16:\n str = `0x${str}`;\n break;\n }\n const n = BigInt(str);\n return sign === '-' ? BigInt(-1) * n : n;\n }\n const n = parseInt(str, radix);\n return sign === '-' ? -1 * n : n;\n}\nfunction intStringify(node, radix, prefix) {\n const { value } = node;\n if (intIdentify(value)) {\n const str = value.toString(radix);\n return value < 0 ? '-' + prefix + str.substr(1) : prefix + str;\n }\n return stringifyNumber.stringifyNumber(node);\n}\nconst intBin = {\n identify: intIdentify,\n default: true,\n tag: 'tag:yaml.org,2002:int',\n format: 'BIN',\n test: /^[-+]?0b[0-1_]+$/,\n resolve: (str, _onError, opt) => intResolve(str, 2, 2, opt),\n stringify: node => intStringify(node, 2, '0b')\n};\nconst intOct = {\n identify: intIdentify,\n default: true,\n tag: 'tag:yaml.org,2002:int',\n format: 'OCT',\n test: /^[-+]?0[0-7_]+$/,\n resolve: (str, _onError, opt) => intResolve(str, 1, 8, opt),\n stringify: node => intStringify(node, 8, '0')\n};\nconst int = {\n identify: intIdentify,\n default: true,\n tag: 'tag:yaml.org,2002:int',\n test: /^[-+]?[0-9][0-9_]*$/,\n resolve: (str, _onError, opt) => intResolve(str, 0, 10, opt),\n stringify: stringifyNumber.stringifyNumber\n};\nconst intHex = {\n identify: intIdentify,\n default: true,\n tag: 'tag:yaml.org,2002:int',\n format: 'HEX',\n test: /^[-+]?0x[0-9a-fA-F_]+$/,\n resolve: (str, _onError, opt) => intResolve(str, 2, 16, opt),\n stringify: node => intStringify(node, 16, '0x')\n};\n\nexports.int = int;\nexports.intBin = intBin;\nexports.intHex = intHex;\nexports.intOct = intOct;\n","'use strict';\n\nvar identity = require('../../nodes/identity.js');\nvar Pair = require('../../nodes/Pair.js');\nvar YAMLMap = require('../../nodes/YAMLMap.js');\n\nclass YAMLSet extends YAMLMap.YAMLMap {\n constructor(schema) {\n super(schema);\n this.tag = YAMLSet.tag;\n }\n add(key) {\n let pair;\n if (identity.isPair(key))\n pair = key;\n else if (key &&\n typeof key === 'object' &&\n 'key' in key &&\n 'value' in key &&\n key.value === null)\n pair = new Pair.Pair(key.key, null);\n else\n pair = new Pair.Pair(key, null);\n const prev = YAMLMap.findPair(this.items, pair.key);\n if (!prev)\n this.items.push(pair);\n }\n /**\n * If `keepPair` is `true`, returns the Pair matching `key`.\n * Otherwise, returns the value of that Pair's key.\n */\n get(key, keepPair) {\n const pair = YAMLMap.findPair(this.items, key);\n return !keepPair && identity.isPair(pair)\n ? identity.isScalar(pair.key)\n ? pair.key.value\n : pair.key\n : pair;\n }\n set(key, value) {\n if (typeof value !== 'boolean')\n throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof value}`);\n const prev = YAMLMap.findPair(this.items, key);\n if (prev && !value) {\n this.items.splice(this.items.indexOf(prev), 1);\n }\n else if (!prev && value) {\n this.items.push(new Pair.Pair(key));\n }\n }\n toJSON(_, ctx) {\n return super.toJSON(_, ctx, Set);\n }\n toString(ctx, onComment, onChompKeep) {\n if (!ctx)\n return JSON.stringify(this);\n if (this.hasAllNullValues(true))\n return super.toString(Object.assign({}, ctx, { allNullValues: true }), onComment, onChompKeep);\n else\n throw new Error('Set items must all have null values');\n }\n static from(schema, iterable, ctx) {\n const { replacer } = ctx;\n const set = new this(schema);\n if (iterable && Symbol.iterator in Object(iterable))\n for (let value of iterable) {\n if (typeof replacer === 'function')\n value = replacer.call(iterable, value, value);\n set.items.push(Pair.createPair(value, null, ctx));\n }\n return set;\n }\n}\nYAMLSet.tag = 'tag:yaml.org,2002:set';\nconst set = {\n collection: 'map',\n identify: value => value instanceof Set,\n nodeClass: YAMLSet,\n default: false,\n tag: 'tag:yaml.org,2002:set',\n createNode: (schema, iterable, ctx) => YAMLSet.from(schema, iterable, ctx),\n resolve(map, onError) {\n if (identity.isMap(map)) {\n if (map.hasAllNullValues(true))\n return Object.assign(new YAMLSet(), map);\n else\n onError('Set items must all have null values');\n }\n else\n onError('Expected a mapping for this tag');\n return map;\n }\n};\n\nexports.YAMLSet = YAMLSet;\nexports.set = set;\n","'use strict';\n\nvar stringifyNumber = require('../../stringify/stringifyNumber.js');\n\n/** Internal types handle bigint as number, because TS can't figure it out. */\nfunction parseSexagesimal(str, asBigInt) {\n const sign = str[0];\n const parts = sign === '-' || sign === '+' ? str.substring(1) : str;\n const num = (n) => asBigInt ? BigInt(n) : Number(n);\n const res = parts\n .replace(/_/g, '')\n .split(':')\n .reduce((res, p) => res * num(60) + num(p), num(0));\n return (sign === '-' ? num(-1) * res : res);\n}\n/**\n * hhhh:mm:ss.sss\n *\n * Internal types handle bigint as number, because TS can't figure it out.\n */\nfunction stringifySexagesimal(node) {\n let { value } = node;\n let num = (n) => n;\n if (typeof value === 'bigint')\n num = n => BigInt(n);\n else if (isNaN(value) || !isFinite(value))\n return stringifyNumber.stringifyNumber(node);\n let sign = '';\n if (value < 0) {\n sign = '-';\n value *= num(-1);\n }\n const _60 = num(60);\n const parts = [value % _60]; // seconds, including ms\n if (value < 60) {\n parts.unshift(0); // at least one : is required\n }\n else {\n value = (value - parts[0]) / _60;\n parts.unshift(value % _60); // minutes\n if (value >= 60) {\n value = (value - parts[0]) / _60;\n parts.unshift(value); // hours\n }\n }\n return (sign +\n parts\n .map(n => String(n).padStart(2, '0'))\n .join(':')\n .replace(/000000\\d*$/, '') // % 60 may introduce error\n );\n}\nconst intTime = {\n identify: value => typeof value === 'bigint' || Number.isInteger(value),\n default: true,\n tag: 'tag:yaml.org,2002:int',\n format: 'TIME',\n test: /^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+$/,\n resolve: (str, _onError, { intAsBigInt }) => parseSexagesimal(str, intAsBigInt),\n stringify: stringifySexagesimal\n};\nconst floatTime = {\n identify: value => typeof value === 'number',\n default: true,\n tag: 'tag:yaml.org,2002:float',\n format: 'TIME',\n test: /^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*$/,\n resolve: str => parseSexagesimal(str, false),\n stringify: stringifySexagesimal\n};\nconst timestamp = {\n identify: value => value instanceof Date,\n default: true,\n tag: 'tag:yaml.org,2002:timestamp',\n // If the time zone is omitted, the timestamp is assumed to be specified in UTC. The time part\n // may be omitted altogether, resulting in a date format. In such a case, the time part is\n // assumed to be 00:00:00Z (start of day, UTC).\n test: RegExp('^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})' + // YYYY-Mm-Dd\n '(?:' + // time is optional\n '(?:t|T|[ \\\\t]+)' + // t | T | whitespace\n '([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\\\.[0-9]+)?)' + // Hh:Mm:Ss(.ss)?\n '(?:[ \\\\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?' + // Z | +5 | -03:30\n ')?$'),\n resolve(str) {\n const match = str.match(timestamp.test);\n if (!match)\n throw new Error('!!timestamp expects a date, starting with yyyy-mm-dd');\n const [, year, month, day, hour, minute, second] = match.map(Number);\n const millisec = match[7] ? Number((match[7] + '00').substr(1, 3)) : 0;\n let date = Date.UTC(year, month - 1, day, hour || 0, minute || 0, second || 0, millisec);\n const tz = match[8];\n if (tz && tz !== 'Z') {\n let d = parseSexagesimal(tz, false);\n if (Math.abs(d) < 30)\n d *= 60;\n date -= 60000 * d;\n }\n return new Date(date);\n },\n stringify: ({ value }) => value?.toISOString().replace(/(T00:00:00)?\\.000Z$/, '') ?? ''\n};\n\nexports.floatTime = floatTime;\nexports.intTime = intTime;\nexports.timestamp = timestamp;\n","'use strict';\n\nvar map = require('../common/map.js');\nvar _null = require('../common/null.js');\nvar seq = require('../common/seq.js');\nvar string = require('../common/string.js');\nvar binary = require('./binary.js');\nvar bool = require('./bool.js');\nvar float = require('./float.js');\nvar int = require('./int.js');\nvar merge = require('./merge.js');\nvar omap = require('./omap.js');\nvar pairs = require('./pairs.js');\nvar set = require('./set.js');\nvar timestamp = require('./timestamp.js');\n\nconst schema = [\n map.map,\n seq.seq,\n string.string,\n _null.nullTag,\n bool.trueTag,\n bool.falseTag,\n int.intBin,\n int.intOct,\n int.int,\n int.intHex,\n float.floatNaN,\n float.floatExp,\n float.float,\n binary.binary,\n merge.merge,\n omap.omap,\n pairs.pairs,\n set.set,\n timestamp.intTime,\n timestamp.floatTime,\n timestamp.timestamp\n];\n\nexports.schema = schema;\n","'use strict';\n\nvar map = require('./common/map.js');\nvar _null = require('./common/null.js');\nvar seq = require('./common/seq.js');\nvar string = require('./common/string.js');\nvar bool = require('./core/bool.js');\nvar float = require('./core/float.js');\nvar int = require('./core/int.js');\nvar schema = require('./core/schema.js');\nvar schema$1 = require('./json/schema.js');\nvar binary = require('./yaml-1.1/binary.js');\nvar merge = require('./yaml-1.1/merge.js');\nvar omap = require('./yaml-1.1/omap.js');\nvar pairs = require('./yaml-1.1/pairs.js');\nvar schema$2 = require('./yaml-1.1/schema.js');\nvar set = require('./yaml-1.1/set.js');\nvar timestamp = require('./yaml-1.1/timestamp.js');\n\nconst schemas = new Map([\n ['core', schema.schema],\n ['failsafe', [map.map, seq.seq, string.string]],\n ['json', schema$1.schema],\n ['yaml11', schema$2.schema],\n ['yaml-1.1', schema$2.schema]\n]);\nconst tagsByName = {\n binary: binary.binary,\n bool: bool.boolTag,\n float: float.float,\n floatExp: float.floatExp,\n floatNaN: float.floatNaN,\n floatTime: timestamp.floatTime,\n int: int.int,\n intHex: int.intHex,\n intOct: int.intOct,\n intTime: timestamp.intTime,\n map: map.map,\n merge: merge.merge,\n null: _null.nullTag,\n omap: omap.omap,\n pairs: pairs.pairs,\n seq: seq.seq,\n set: set.set,\n timestamp: timestamp.timestamp\n};\nconst coreKnownTags = {\n 'tag:yaml.org,2002:binary': binary.binary,\n 'tag:yaml.org,2002:merge': merge.merge,\n 'tag:yaml.org,2002:omap': omap.omap,\n 'tag:yaml.org,2002:pairs': pairs.pairs,\n 'tag:yaml.org,2002:set': set.set,\n 'tag:yaml.org,2002:timestamp': timestamp.timestamp\n};\nfunction getTags(customTags, schemaName, addMergeTag) {\n const schemaTags = schemas.get(schemaName);\n if (schemaTags && !customTags) {\n return addMergeTag && !schemaTags.includes(merge.merge)\n ? schemaTags.concat(merge.merge)\n : schemaTags.slice();\n }\n let tags = schemaTags;\n if (!tags) {\n if (Array.isArray(customTags))\n tags = [];\n else {\n const keys = Array.from(schemas.keys())\n .filter(key => key !== 'yaml11')\n .map(key => JSON.stringify(key))\n .join(', ');\n throw new Error(`Unknown schema \"${schemaName}\"; use one of ${keys} or define customTags array`);\n }\n }\n if (Array.isArray(customTags)) {\n for (const tag of customTags)\n tags = tags.concat(tag);\n }\n else if (typeof customTags === 'function') {\n tags = customTags(tags.slice());\n }\n if (addMergeTag)\n tags = tags.concat(merge.merge);\n return tags.reduce((tags, tag) => {\n const tagObj = typeof tag === 'string' ? tagsByName[tag] : tag;\n if (!tagObj) {\n const tagName = JSON.stringify(tag);\n const keys = Object.keys(tagsByName)\n .map(key => JSON.stringify(key))\n .join(', ');\n throw new Error(`Unknown custom tag ${tagName}; use one of ${keys}`);\n }\n if (!tags.includes(tagObj))\n tags.push(tagObj);\n return tags;\n }, []);\n}\n\nexports.coreKnownTags = coreKnownTags;\nexports.getTags = getTags;\n","'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar map = require('./common/map.js');\nvar seq = require('./common/seq.js');\nvar string = require('./common/string.js');\nvar tags = require('./tags.js');\n\nconst sortMapEntriesByKey = (a, b) => a.key < b.key ? -1 : a.key > b.key ? 1 : 0;\nclass Schema {\n constructor({ compat, customTags, merge, resolveKnownTags, schema, sortMapEntries, toStringDefaults }) {\n this.compat = Array.isArray(compat)\n ? tags.getTags(compat, 'compat')\n : compat\n ? tags.getTags(null, compat)\n : null;\n this.name = (typeof schema === 'string' && schema) || 'core';\n this.knownTags = resolveKnownTags ? tags.coreKnownTags : {};\n this.tags = tags.getTags(customTags, this.name, merge);\n this.toStringOptions = toStringDefaults ?? null;\n Object.defineProperty(this, identity.MAP, { value: map.map });\n Object.defineProperty(this, identity.SCALAR, { value: string.string });\n Object.defineProperty(this, identity.SEQ, { value: seq.seq });\n // Used by createMap()\n this.sortMapEntries =\n typeof sortMapEntries === 'function'\n ? sortMapEntries\n : sortMapEntries === true\n ? sortMapEntriesByKey\n : null;\n }\n clone() {\n const copy = Object.create(Schema.prototype, Object.getOwnPropertyDescriptors(this));\n copy.tags = this.tags.slice();\n return copy;\n }\n}\n\nexports.Schema = Schema;\n","'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar stringify = require('./stringify.js');\nvar stringifyComment = require('./stringifyComment.js');\n\nfunction stringifyDocument(doc, options) {\n const lines = [];\n let hasDirectives = options.directives === true;\n if (options.directives !== false && doc.directives) {\n const dir = doc.directives.toString(doc);\n if (dir) {\n lines.push(dir);\n hasDirectives = true;\n }\n else if (doc.directives.docStart)\n hasDirectives = true;\n }\n if (hasDirectives)\n lines.push('---');\n const ctx = stringify.createStringifyContext(doc, options);\n const { commentString } = ctx.options;\n if (doc.commentBefore) {\n if (lines.length !== 1)\n lines.unshift('');\n const cs = commentString(doc.commentBefore);\n lines.unshift(stringifyComment.indentComment(cs, ''));\n }\n let chompKeep = false;\n let contentComment = null;\n if (doc.contents) {\n if (identity.isNode(doc.contents)) {\n if (doc.contents.spaceBefore && hasDirectives)\n lines.push('');\n if (doc.contents.commentBefore) {\n const cs = commentString(doc.contents.commentBefore);\n lines.push(stringifyComment.indentComment(cs, ''));\n }\n // top-level block scalars need to be indented if followed by a comment\n ctx.forceBlockIndent = !!doc.comment;\n contentComment = doc.contents.comment;\n }\n const onChompKeep = contentComment ? undefined : () => (chompKeep = true);\n let body = stringify.stringify(doc.contents, ctx, () => (contentComment = null), onChompKeep);\n if (contentComment)\n body += stringifyComment.lineComment(body, '', commentString(contentComment));\n if ((body[0] === '|' || body[0] === '>') &&\n lines[lines.length - 1] === '---') {\n // Top-level block scalars with a preceding doc marker ought to use the\n // same line for their header.\n lines[lines.length - 1] = `--- ${body}`;\n }\n else\n lines.push(body);\n }\n else {\n lines.push(stringify.stringify(doc.contents, ctx));\n }\n if (doc.directives?.docEnd) {\n if (doc.comment) {\n const cs = commentString(doc.comment);\n if (cs.includes('\\n')) {\n lines.push('...');\n lines.push(stringifyComment.indentComment(cs, ''));\n }\n else {\n lines.push(`... ${cs}`);\n }\n }\n else {\n lines.push('...');\n }\n }\n else {\n let dc = doc.comment;\n if (dc && chompKeep)\n dc = dc.replace(/^\\n+/, '');\n if (dc) {\n if ((!chompKeep || contentComment) && lines[lines.length - 1] !== '')\n lines.push('');\n lines.push(stringifyComment.indentComment(commentString(dc), ''));\n }\n }\n return lines.join('\\n') + '\\n';\n}\n\nexports.stringifyDocument = stringifyDocument;\n","'use strict';\n\nvar Alias = require('../nodes/Alias.js');\nvar Collection = require('../nodes/Collection.js');\nvar identity = require('../nodes/identity.js');\nvar Pair = require('../nodes/Pair.js');\nvar toJS = require('../nodes/toJS.js');\nvar Schema = require('../schema/Schema.js');\nvar stringifyDocument = require('../stringify/stringifyDocument.js');\nvar anchors = require('./anchors.js');\nvar applyReviver = require('./applyReviver.js');\nvar createNode = require('./createNode.js');\nvar directives = require('./directives.js');\n\nclass Document {\n constructor(value, replacer, options) {\n /** A comment before this Document */\n this.commentBefore = null;\n /** A comment immediately after this Document */\n this.comment = null;\n /** Errors encountered during parsing. */\n this.errors = [];\n /** Warnings encountered during parsing. */\n this.warnings = [];\n Object.defineProperty(this, identity.NODE_TYPE, { value: identity.DOC });\n let _replacer = null;\n if (typeof replacer === 'function' || Array.isArray(replacer)) {\n _replacer = replacer;\n }\n else if (options === undefined && replacer) {\n options = replacer;\n replacer = undefined;\n }\n const opt = Object.assign({\n intAsBigInt: false,\n keepSourceTokens: false,\n logLevel: 'warn',\n prettyErrors: true,\n strict: true,\n stringKeys: false,\n uniqueKeys: true,\n version: '1.2'\n }, options);\n this.options = opt;\n let { version } = opt;\n if (options?._directives) {\n this.directives = options._directives.atDocument();\n if (this.directives.yaml.explicit)\n version = this.directives.yaml.version;\n }\n else\n this.directives = new directives.Directives({ version });\n this.setSchema(version, options);\n // @ts-expect-error We can't really know that this matches Contents.\n this.contents =\n value === undefined ? null : this.createNode(value, _replacer, options);\n }\n /**\n * Create a deep copy of this Document and its contents.\n *\n * Custom Node values that inherit from `Object` still refer to their original instances.\n */\n clone() {\n const copy = Object.create(Document.prototype, {\n [identity.NODE_TYPE]: { value: identity.DOC }\n });\n copy.commentBefore = this.commentBefore;\n copy.comment = this.comment;\n copy.errors = this.errors.slice();\n copy.warnings = this.warnings.slice();\n copy.options = Object.assign({}, this.options);\n if (this.directives)\n copy.directives = this.directives.clone();\n copy.schema = this.schema.clone();\n // @ts-expect-error We can't really know that this matches Contents.\n copy.contents = identity.isNode(this.contents)\n ? this.contents.clone(copy.schema)\n : this.contents;\n if (this.range)\n copy.range = this.range.slice();\n return copy;\n }\n /** Adds a value to the document. */\n add(value) {\n if (assertCollection(this.contents))\n this.contents.add(value);\n }\n /** Adds a value to the document. */\n addIn(path, value) {\n if (assertCollection(this.contents))\n this.contents.addIn(path, value);\n }\n /**\n * Create a new `Alias` node, ensuring that the target `node` has the required anchor.\n *\n * If `node` already has an anchor, `name` is ignored.\n * Otherwise, the `node.anchor` value will be set to `name`,\n * or if an anchor with that name is already present in the document,\n * `name` will be used as a prefix for a new unique anchor.\n * If `name` is undefined, the generated anchor will use 'a' as a prefix.\n */\n createAlias(node, name) {\n if (!node.anchor) {\n const prev = anchors.anchorNames(this);\n node.anchor =\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n !name || prev.has(name) ? anchors.findNewAnchor(name || 'a', prev) : name;\n }\n return new Alias.Alias(node.anchor);\n }\n createNode(value, replacer, options) {\n let _replacer = undefined;\n if (typeof replacer === 'function') {\n value = replacer.call({ '': value }, '', value);\n _replacer = replacer;\n }\n else if (Array.isArray(replacer)) {\n const keyToStr = (v) => typeof v === 'number' || v instanceof String || v instanceof Number;\n const asStr = replacer.filter(keyToStr).map(String);\n if (asStr.length > 0)\n replacer = replacer.concat(asStr);\n _replacer = replacer;\n }\n else if (options === undefined && replacer) {\n options = replacer;\n replacer = undefined;\n }\n const { aliasDuplicateObjects, anchorPrefix, flow, keepUndefined, onTagObj, tag } = options ?? {};\n const { onAnchor, setAnchors, sourceObjects } = anchors.createNodeAnchors(this, \n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n anchorPrefix || 'a');\n const ctx = {\n aliasDuplicateObjects: aliasDuplicateObjects ?? true,\n keepUndefined: keepUndefined ?? false,\n onAnchor,\n onTagObj,\n replacer: _replacer,\n schema: this.schema,\n sourceObjects\n };\n const node = createNode.createNode(value, tag, ctx);\n if (flow && identity.isCollection(node))\n node.flow = true;\n setAnchors();\n return node;\n }\n /**\n * Convert a key and a value into a `Pair` using the current schema,\n * recursively wrapping all values as `Scalar` or `Collection` nodes.\n */\n createPair(key, value, options = {}) {\n const k = this.createNode(key, null, options);\n const v = this.createNode(value, null, options);\n return new Pair.Pair(k, v);\n }\n /**\n * Removes a value from the document.\n * @returns `true` if the item was found and removed.\n */\n delete(key) {\n return assertCollection(this.contents) ? this.contents.delete(key) : false;\n }\n /**\n * Removes a value from the document.\n * @returns `true` if the item was found and removed.\n */\n deleteIn(path) {\n if (Collection.isEmptyPath(path)) {\n if (this.contents == null)\n return false;\n // @ts-expect-error Presumed impossible if Strict extends false\n this.contents = null;\n return true;\n }\n return assertCollection(this.contents)\n ? this.contents.deleteIn(path)\n : false;\n }\n /**\n * Returns item at `key`, or `undefined` if not found. By default unwraps\n * scalar values from their surrounding node; to disable set `keepScalar` to\n * `true` (collections are always returned intact).\n */\n get(key, keepScalar) {\n return identity.isCollection(this.contents)\n ? this.contents.get(key, keepScalar)\n : undefined;\n }\n /**\n * Returns item at `path`, or `undefined` if not found. By default unwraps\n * scalar values from their surrounding node; to disable set `keepScalar` to\n * `true` (collections are always returned intact).\n */\n getIn(path, keepScalar) {\n if (Collection.isEmptyPath(path))\n return !keepScalar && identity.isScalar(this.contents)\n ? this.contents.value\n : this.contents;\n return identity.isCollection(this.contents)\n ? this.contents.getIn(path, keepScalar)\n : undefined;\n }\n /**\n * Checks if the document includes a value with the key `key`.\n */\n has(key) {\n return identity.isCollection(this.contents) ? this.contents.has(key) : false;\n }\n /**\n * Checks if the document includes a value at `path`.\n */\n hasIn(path) {\n if (Collection.isEmptyPath(path))\n return this.contents !== undefined;\n return identity.isCollection(this.contents) ? this.contents.hasIn(path) : false;\n }\n /**\n * Sets a value in this document. For `!!set`, `value` needs to be a\n * boolean to add/remove the item from the set.\n */\n set(key, value) {\n if (this.contents == null) {\n // @ts-expect-error We can't really know that this matches Contents.\n this.contents = Collection.collectionFromPath(this.schema, [key], value);\n }\n else if (assertCollection(this.contents)) {\n this.contents.set(key, value);\n }\n }\n /**\n * Sets a value in this document. For `!!set`, `value` needs to be a\n * boolean to add/remove the item from the set.\n */\n setIn(path, value) {\n if (Collection.isEmptyPath(path)) {\n // @ts-expect-error We can't really know that this matches Contents.\n this.contents = value;\n }\n else if (this.contents == null) {\n // @ts-expect-error We can't really know that this matches Contents.\n this.contents = Collection.collectionFromPath(this.schema, Array.from(path), value);\n }\n else if (assertCollection(this.contents)) {\n this.contents.setIn(path, value);\n }\n }\n /**\n * Change the YAML version and schema used by the document.\n * A `null` version disables support for directives, explicit tags, anchors, and aliases.\n * It also requires the `schema` option to be given as a `Schema` instance value.\n *\n * Overrides all previously set schema options.\n */\n setSchema(version, options = {}) {\n if (typeof version === 'number')\n version = String(version);\n let opt;\n switch (version) {\n case '1.1':\n if (this.directives)\n this.directives.yaml.version = '1.1';\n else\n this.directives = new directives.Directives({ version: '1.1' });\n opt = { resolveKnownTags: false, schema: 'yaml-1.1' };\n break;\n case '1.2':\n case 'next':\n if (this.directives)\n this.directives.yaml.version = version;\n else\n this.directives = new directives.Directives({ version });\n opt = { resolveKnownTags: true, schema: 'core' };\n break;\n case null:\n if (this.directives)\n delete this.directives;\n opt = null;\n break;\n default: {\n const sv = JSON.stringify(version);\n throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${sv}`);\n }\n }\n // Not using `instanceof Schema` to allow for duck typing\n if (options.schema instanceof Object)\n this.schema = options.schema;\n else if (opt)\n this.schema = new Schema.Schema(Object.assign(opt, options));\n else\n throw new Error(`With a null YAML version, the { schema: Schema } option is required`);\n }\n // json & jsonArg are only used from toJSON()\n toJS({ json, jsonArg, mapAsMap, maxAliasCount, onAnchor, reviver } = {}) {\n const ctx = {\n anchors: new Map(),\n doc: this,\n keep: !json,\n mapAsMap: mapAsMap === true,\n mapKeyWarned: false,\n maxAliasCount: typeof maxAliasCount === 'number' ? maxAliasCount : 100\n };\n const res = toJS.toJS(this.contents, jsonArg ?? '', ctx);\n if (typeof onAnchor === 'function')\n for (const { count, res } of ctx.anchors.values())\n onAnchor(res, count);\n return typeof reviver === 'function'\n ? applyReviver.applyReviver(reviver, { '': res }, '', res)\n : res;\n }\n /**\n * A JSON representation of the document `contents`.\n *\n * @param jsonArg Used by `JSON.stringify` to indicate the array index or\n * property name.\n */\n toJSON(jsonArg, onAnchor) {\n return this.toJS({ json: true, jsonArg, mapAsMap: false, onAnchor });\n }\n /** A YAML representation of the document. */\n toString(options = {}) {\n if (this.errors.length > 0)\n throw new Error('Document with errors cannot be stringified');\n if ('indent' in options &&\n (!Number.isInteger(options.indent) || Number(options.indent) <= 0)) {\n const s = JSON.stringify(options.indent);\n throw new Error(`\"indent\" option must be a positive integer, not ${s}`);\n }\n return stringifyDocument.stringifyDocument(this, options);\n }\n}\nfunction assertCollection(contents) {\n if (identity.isCollection(contents))\n return true;\n throw new Error('Expected a YAML collection as document contents');\n}\n\nexports.Document = Document;\n","'use strict';\n\nclass YAMLError extends Error {\n constructor(name, pos, code, message) {\n super();\n this.name = name;\n this.code = code;\n this.message = message;\n this.pos = pos;\n }\n}\nclass YAMLParseError extends YAMLError {\n constructor(pos, code, message) {\n super('YAMLParseError', pos, code, message);\n }\n}\nclass YAMLWarning extends YAMLError {\n constructor(pos, code, message) {\n super('YAMLWarning', pos, code, message);\n }\n}\nconst prettifyError = (src, lc) => (error) => {\n if (error.pos[0] === -1)\n return;\n error.linePos = error.pos.map(pos => lc.linePos(pos));\n const { line, col } = error.linePos[0];\n error.message += ` at line ${line}, column ${col}`;\n let ci = col - 1;\n let lineStr = src\n .substring(lc.lineStarts[line - 1], lc.lineStarts[line])\n .replace(/[\\n\\r]+$/, '');\n // Trim to max 80 chars, keeping col position near the middle\n if (ci >= 60 && lineStr.length > 80) {\n const trimStart = Math.min(ci - 39, lineStr.length - 79);\n lineStr = '…' + lineStr.substring(trimStart);\n ci -= trimStart - 1;\n }\n if (lineStr.length > 80)\n lineStr = lineStr.substring(0, 79) + '…';\n // Include previous line in context if pointing at line start\n if (line > 1 && /^ *$/.test(lineStr.substring(0, ci))) {\n // Regexp won't match if start is trimmed\n let prev = src.substring(lc.lineStarts[line - 2], lc.lineStarts[line - 1]);\n if (prev.length > 80)\n prev = prev.substring(0, 79) + '…\\n';\n lineStr = prev + lineStr;\n }\n if (/[^ ]/.test(lineStr)) {\n let count = 1;\n const end = error.linePos[1];\n if (end?.line === line && end.col > col) {\n count = Math.max(1, Math.min(end.col - col, 80 - ci));\n }\n const pointer = ' '.repeat(ci) + '^'.repeat(count);\n error.message += `:\\n\\n${lineStr}\\n${pointer}\\n`;\n }\n};\n\nexports.YAMLError = YAMLError;\nexports.YAMLParseError = YAMLParseError;\nexports.YAMLWarning = YAMLWarning;\nexports.prettifyError = prettifyError;\n","'use strict';\n\nfunction resolveProps(tokens, { flow, indicator, next, offset, onError, parentIndent, startOnNewline }) {\n let spaceBefore = false;\n let atNewline = startOnNewline;\n let hasSpace = startOnNewline;\n let comment = '';\n let commentSep = '';\n let hasNewline = false;\n let reqSpace = false;\n let tab = null;\n let anchor = null;\n let tag = null;\n let newlineAfterProp = null;\n let comma = null;\n let found = null;\n let start = null;\n for (const token of tokens) {\n if (reqSpace) {\n if (token.type !== 'space' &&\n token.type !== 'newline' &&\n token.type !== 'comma')\n onError(token.offset, 'MISSING_CHAR', 'Tags and anchors must be separated from the next token by white space');\n reqSpace = false;\n }\n if (tab) {\n if (atNewline && token.type !== 'comment' && token.type !== 'newline') {\n onError(tab, 'TAB_AS_INDENT', 'Tabs are not allowed as indentation');\n }\n tab = null;\n }\n switch (token.type) {\n case 'space':\n // At the doc level, tabs at line start may be parsed\n // as leading white space rather than indentation.\n // In a flow collection, only the parser handles indent.\n if (!flow &&\n (indicator !== 'doc-start' || next?.type !== 'flow-collection') &&\n token.source.includes('\\t')) {\n tab = token;\n }\n hasSpace = true;\n break;\n case 'comment': {\n if (!hasSpace)\n onError(token, 'MISSING_CHAR', 'Comments must be separated from other tokens by white space characters');\n const cb = token.source.substring(1) || ' ';\n if (!comment)\n comment = cb;\n else\n comment += commentSep + cb;\n commentSep = '';\n atNewline = false;\n break;\n }\n case 'newline':\n if (atNewline) {\n if (comment)\n comment += token.source;\n else if (!found || indicator !== 'seq-item-ind')\n spaceBefore = true;\n }\n else\n commentSep += token.source;\n atNewline = true;\n hasNewline = true;\n if (anchor || tag)\n newlineAfterProp = token;\n hasSpace = true;\n break;\n case 'anchor':\n if (anchor)\n onError(token, 'MULTIPLE_ANCHORS', 'A node can have at most one anchor');\n if (token.source.endsWith(':'))\n onError(token.offset + token.source.length - 1, 'BAD_ALIAS', 'Anchor ending in : is ambiguous', true);\n anchor = token;\n start ?? (start = token.offset);\n atNewline = false;\n hasSpace = false;\n reqSpace = true;\n break;\n case 'tag': {\n if (tag)\n onError(token, 'MULTIPLE_TAGS', 'A node can have at most one tag');\n tag = token;\n start ?? (start = token.offset);\n atNewline = false;\n hasSpace = false;\n reqSpace = true;\n break;\n }\n case indicator:\n // Could here handle preceding comments differently\n if (anchor || tag)\n onError(token, 'BAD_PROP_ORDER', `Anchors and tags must be after the ${token.source} indicator`);\n if (found)\n onError(token, 'UNEXPECTED_TOKEN', `Unexpected ${token.source} in ${flow ?? 'collection'}`);\n found = token;\n atNewline =\n indicator === 'seq-item-ind' || indicator === 'explicit-key-ind';\n hasSpace = false;\n break;\n case 'comma':\n if (flow) {\n if (comma)\n onError(token, 'UNEXPECTED_TOKEN', `Unexpected , in ${flow}`);\n comma = token;\n atNewline = false;\n hasSpace = false;\n break;\n }\n // else fallthrough\n default:\n onError(token, 'UNEXPECTED_TOKEN', `Unexpected ${token.type} token`);\n atNewline = false;\n hasSpace = false;\n }\n }\n const last = tokens[tokens.length - 1];\n const end = last ? last.offset + last.source.length : offset;\n if (reqSpace &&\n next &&\n next.type !== 'space' &&\n next.type !== 'newline' &&\n next.type !== 'comma' &&\n (next.type !== 'scalar' || next.source !== '')) {\n onError(next.offset, 'MISSING_CHAR', 'Tags and anchors must be separated from the next token by white space');\n }\n if (tab &&\n ((atNewline && tab.indent <= parentIndent) ||\n next?.type === 'block-map' ||\n next?.type === 'block-seq'))\n onError(tab, 'TAB_AS_INDENT', 'Tabs are not allowed as indentation');\n return {\n comma,\n found,\n spaceBefore,\n comment,\n hasNewline,\n anchor,\n tag,\n newlineAfterProp,\n end,\n start: start ?? end\n };\n}\n\nexports.resolveProps = resolveProps;\n","'use strict';\n\nfunction containsNewline(key) {\n if (!key)\n return null;\n switch (key.type) {\n case 'alias':\n case 'scalar':\n case 'double-quoted-scalar':\n case 'single-quoted-scalar':\n if (key.source.includes('\\n'))\n return true;\n if (key.end)\n for (const st of key.end)\n if (st.type === 'newline')\n return true;\n return false;\n case 'flow-collection':\n for (const it of key.items) {\n for (const st of it.start)\n if (st.type === 'newline')\n return true;\n if (it.sep)\n for (const st of it.sep)\n if (st.type === 'newline')\n return true;\n if (containsNewline(it.key) || containsNewline(it.value))\n return true;\n }\n return false;\n default:\n return true;\n }\n}\n\nexports.containsNewline = containsNewline;\n","'use strict';\n\nvar utilContainsNewline = require('./util-contains-newline.js');\n\nfunction flowIndentCheck(indent, fc, onError) {\n if (fc?.type === 'flow-collection') {\n const end = fc.end[0];\n if (end.indent === indent &&\n (end.source === ']' || end.source === '}') &&\n utilContainsNewline.containsNewline(fc)) {\n const msg = 'Flow end indicator should be more indented than parent';\n onError(end, 'BAD_INDENT', msg, true);\n }\n }\n}\n\nexports.flowIndentCheck = flowIndentCheck;\n","'use strict';\n\nvar identity = require('../nodes/identity.js');\n\nfunction mapIncludes(ctx, items, search) {\n const { uniqueKeys } = ctx.options;\n if (uniqueKeys === false)\n return false;\n const isEqual = typeof uniqueKeys === 'function'\n ? uniqueKeys\n : (a, b) => a === b || (identity.isScalar(a) && identity.isScalar(b) && a.value === b.value);\n return items.some(pair => isEqual(pair.key, search));\n}\n\nexports.mapIncludes = mapIncludes;\n","'use strict';\n\nvar Pair = require('../nodes/Pair.js');\nvar YAMLMap = require('../nodes/YAMLMap.js');\nvar resolveProps = require('./resolve-props.js');\nvar utilContainsNewline = require('./util-contains-newline.js');\nvar utilFlowIndentCheck = require('./util-flow-indent-check.js');\nvar utilMapIncludes = require('./util-map-includes.js');\n\nconst startColMsg = 'All mapping items must start at the same column';\nfunction resolveBlockMap({ composeNode, composeEmptyNode }, ctx, bm, onError, tag) {\n const NodeClass = tag?.nodeClass ?? YAMLMap.YAMLMap;\n const map = new NodeClass(ctx.schema);\n if (ctx.atRoot)\n ctx.atRoot = false;\n let offset = bm.offset;\n let commentEnd = null;\n for (const collItem of bm.items) {\n const { start, key, sep, value } = collItem;\n // key properties\n const keyProps = resolveProps.resolveProps(start, {\n indicator: 'explicit-key-ind',\n next: key ?? sep?.[0],\n offset,\n onError,\n parentIndent: bm.indent,\n startOnNewline: true\n });\n const implicitKey = !keyProps.found;\n if (implicitKey) {\n if (key) {\n if (key.type === 'block-seq')\n onError(offset, 'BLOCK_AS_IMPLICIT_KEY', 'A block sequence may not be used as an implicit map key');\n else if ('indent' in key && key.indent !== bm.indent)\n onError(offset, 'BAD_INDENT', startColMsg);\n }\n if (!keyProps.anchor && !keyProps.tag && !sep) {\n commentEnd = keyProps.end;\n if (keyProps.comment) {\n if (map.comment)\n map.comment += '\\n' + keyProps.comment;\n else\n map.comment = keyProps.comment;\n }\n continue;\n }\n if (keyProps.newlineAfterProp || utilContainsNewline.containsNewline(key)) {\n onError(key ?? start[start.length - 1], 'MULTILINE_IMPLICIT_KEY', 'Implicit keys need to be on a single line');\n }\n }\n else if (keyProps.found?.indent !== bm.indent) {\n onError(offset, 'BAD_INDENT', startColMsg);\n }\n // key value\n ctx.atKey = true;\n const keyStart = keyProps.end;\n const keyNode = key\n ? composeNode(ctx, key, keyProps, onError)\n : composeEmptyNode(ctx, keyStart, start, null, keyProps, onError);\n if (ctx.schema.compat)\n utilFlowIndentCheck.flowIndentCheck(bm.indent, key, onError);\n ctx.atKey = false;\n if (utilMapIncludes.mapIncludes(ctx, map.items, keyNode))\n onError(keyStart, 'DUPLICATE_KEY', 'Map keys must be unique');\n // value properties\n const valueProps = resolveProps.resolveProps(sep ?? [], {\n indicator: 'map-value-ind',\n next: value,\n offset: keyNode.range[2],\n onError,\n parentIndent: bm.indent,\n startOnNewline: !key || key.type === 'block-scalar'\n });\n offset = valueProps.end;\n if (valueProps.found) {\n if (implicitKey) {\n if (value?.type === 'block-map' && !valueProps.hasNewline)\n onError(offset, 'BLOCK_AS_IMPLICIT_KEY', 'Nested mappings are not allowed in compact mappings');\n if (ctx.options.strict &&\n keyProps.start < valueProps.found.offset - 1024)\n onError(keyNode.range, 'KEY_OVER_1024_CHARS', 'The : indicator must be at most 1024 chars after the start of an implicit block mapping key');\n }\n // value value\n const valueNode = value\n ? composeNode(ctx, value, valueProps, onError)\n : composeEmptyNode(ctx, offset, sep, null, valueProps, onError);\n if (ctx.schema.compat)\n utilFlowIndentCheck.flowIndentCheck(bm.indent, value, onError);\n offset = valueNode.range[2];\n const pair = new Pair.Pair(keyNode, valueNode);\n if (ctx.options.keepSourceTokens)\n pair.srcToken = collItem;\n map.items.push(pair);\n }\n else {\n // key with no value\n if (implicitKey)\n onError(keyNode.range, 'MISSING_CHAR', 'Implicit map keys need to be followed by map values');\n if (valueProps.comment) {\n if (keyNode.comment)\n keyNode.comment += '\\n' + valueProps.comment;\n else\n keyNode.comment = valueProps.comment;\n }\n const pair = new Pair.Pair(keyNode);\n if (ctx.options.keepSourceTokens)\n pair.srcToken = collItem;\n map.items.push(pair);\n }\n }\n if (commentEnd && commentEnd < offset)\n onError(commentEnd, 'IMPOSSIBLE', 'Map comment with trailing content');\n map.range = [bm.offset, offset, commentEnd ?? offset];\n return map;\n}\n\nexports.resolveBlockMap = resolveBlockMap;\n","'use strict';\n\nvar YAMLSeq = require('../nodes/YAMLSeq.js');\nvar resolveProps = require('./resolve-props.js');\nvar utilFlowIndentCheck = require('./util-flow-indent-check.js');\n\nfunction resolveBlockSeq({ composeNode, composeEmptyNode }, ctx, bs, onError, tag) {\n const NodeClass = tag?.nodeClass ?? YAMLSeq.YAMLSeq;\n const seq = new NodeClass(ctx.schema);\n if (ctx.atRoot)\n ctx.atRoot = false;\n if (ctx.atKey)\n ctx.atKey = false;\n let offset = bs.offset;\n let commentEnd = null;\n for (const { start, value } of bs.items) {\n const props = resolveProps.resolveProps(start, {\n indicator: 'seq-item-ind',\n next: value,\n offset,\n onError,\n parentIndent: bs.indent,\n startOnNewline: true\n });\n if (!props.found) {\n if (props.anchor || props.tag || value) {\n if (value?.type === 'block-seq')\n onError(props.end, 'BAD_INDENT', 'All sequence items must start at the same column');\n else\n onError(offset, 'MISSING_CHAR', 'Sequence item without - indicator');\n }\n else {\n commentEnd = props.end;\n if (props.comment)\n seq.comment = props.comment;\n continue;\n }\n }\n const node = value\n ? composeNode(ctx, value, props, onError)\n : composeEmptyNode(ctx, props.end, start, null, props, onError);\n if (ctx.schema.compat)\n utilFlowIndentCheck.flowIndentCheck(bs.indent, value, onError);\n offset = node.range[2];\n seq.items.push(node);\n }\n seq.range = [bs.offset, offset, commentEnd ?? offset];\n return seq;\n}\n\nexports.resolveBlockSeq = resolveBlockSeq;\n","'use strict';\n\nfunction resolveEnd(end, offset, reqSpace, onError) {\n let comment = '';\n if (end) {\n let hasSpace = false;\n let sep = '';\n for (const token of end) {\n const { source, type } = token;\n switch (type) {\n case 'space':\n hasSpace = true;\n break;\n case 'comment': {\n if (reqSpace && !hasSpace)\n onError(token, 'MISSING_CHAR', 'Comments must be separated from other tokens by white space characters');\n const cb = source.substring(1) || ' ';\n if (!comment)\n comment = cb;\n else\n comment += sep + cb;\n sep = '';\n break;\n }\n case 'newline':\n if (comment)\n sep += source;\n hasSpace = true;\n break;\n default:\n onError(token, 'UNEXPECTED_TOKEN', `Unexpected ${type} at node end`);\n }\n offset += source.length;\n }\n }\n return { comment, offset };\n}\n\nexports.resolveEnd = resolveEnd;\n","'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar Pair = require('../nodes/Pair.js');\nvar YAMLMap = require('../nodes/YAMLMap.js');\nvar YAMLSeq = require('../nodes/YAMLSeq.js');\nvar resolveEnd = require('./resolve-end.js');\nvar resolveProps = require('./resolve-props.js');\nvar utilContainsNewline = require('./util-contains-newline.js');\nvar utilMapIncludes = require('./util-map-includes.js');\n\nconst blockMsg = 'Block collections are not allowed within flow collections';\nconst isBlock = (token) => token && (token.type === 'block-map' || token.type === 'block-seq');\nfunction resolveFlowCollection({ composeNode, composeEmptyNode }, ctx, fc, onError, tag) {\n const isMap = fc.start.source === '{';\n const fcName = isMap ? 'flow map' : 'flow sequence';\n const NodeClass = (tag?.nodeClass ?? (isMap ? YAMLMap.YAMLMap : YAMLSeq.YAMLSeq));\n const coll = new NodeClass(ctx.schema);\n coll.flow = true;\n const atRoot = ctx.atRoot;\n if (atRoot)\n ctx.atRoot = false;\n if (ctx.atKey)\n ctx.atKey = false;\n let offset = fc.offset + fc.start.source.length;\n for (let i = 0; i < fc.items.length; ++i) {\n const collItem = fc.items[i];\n const { start, key, sep, value } = collItem;\n const props = resolveProps.resolveProps(start, {\n flow: fcName,\n indicator: 'explicit-key-ind',\n next: key ?? sep?.[0],\n offset,\n onError,\n parentIndent: fc.indent,\n startOnNewline: false\n });\n if (!props.found) {\n if (!props.anchor && !props.tag && !sep && !value) {\n if (i === 0 && props.comma)\n onError(props.comma, 'UNEXPECTED_TOKEN', `Unexpected , in ${fcName}`);\n else if (i < fc.items.length - 1)\n onError(props.start, 'UNEXPECTED_TOKEN', `Unexpected empty item in ${fcName}`);\n if (props.comment) {\n if (coll.comment)\n coll.comment += '\\n' + props.comment;\n else\n coll.comment = props.comment;\n }\n offset = props.end;\n continue;\n }\n if (!isMap && ctx.options.strict && utilContainsNewline.containsNewline(key))\n onError(key, // checked by containsNewline()\n 'MULTILINE_IMPLICIT_KEY', 'Implicit keys of flow sequence pairs need to be on a single line');\n }\n if (i === 0) {\n if (props.comma)\n onError(props.comma, 'UNEXPECTED_TOKEN', `Unexpected , in ${fcName}`);\n }\n else {\n if (!props.comma)\n onError(props.start, 'MISSING_CHAR', `Missing , between ${fcName} items`);\n if (props.comment) {\n let prevItemComment = '';\n loop: for (const st of start) {\n switch (st.type) {\n case 'comma':\n case 'space':\n break;\n case 'comment':\n prevItemComment = st.source.substring(1);\n break loop;\n default:\n break loop;\n }\n }\n if (prevItemComment) {\n let prev = coll.items[coll.items.length - 1];\n if (identity.isPair(prev))\n prev = prev.value ?? prev.key;\n if (prev.comment)\n prev.comment += '\\n' + prevItemComment;\n else\n prev.comment = prevItemComment;\n props.comment = props.comment.substring(prevItemComment.length + 1);\n }\n }\n }\n if (!isMap && !sep && !props.found) {\n // item is a value in a seq\n // → key & sep are empty, start does not include ? or :\n const valueNode = value\n ? composeNode(ctx, value, props, onError)\n : composeEmptyNode(ctx, props.end, sep, null, props, onError);\n coll.items.push(valueNode);\n offset = valueNode.range[2];\n if (isBlock(value))\n onError(valueNode.range, 'BLOCK_IN_FLOW', blockMsg);\n }\n else {\n // item is a key+value pair\n // key value\n ctx.atKey = true;\n const keyStart = props.end;\n const keyNode = key\n ? composeNode(ctx, key, props, onError)\n : composeEmptyNode(ctx, keyStart, start, null, props, onError);\n if (isBlock(key))\n onError(keyNode.range, 'BLOCK_IN_FLOW', blockMsg);\n ctx.atKey = false;\n // value properties\n const valueProps = resolveProps.resolveProps(sep ?? [], {\n flow: fcName,\n indicator: 'map-value-ind',\n next: value,\n offset: keyNode.range[2],\n onError,\n parentIndent: fc.indent,\n startOnNewline: false\n });\n if (valueProps.found) {\n if (!isMap && !props.found && ctx.options.strict) {\n if (sep)\n for (const st of sep) {\n if (st === valueProps.found)\n break;\n if (st.type === 'newline') {\n onError(st, 'MULTILINE_IMPLICIT_KEY', 'Implicit keys of flow sequence pairs need to be on a single line');\n break;\n }\n }\n if (props.start < valueProps.found.offset - 1024)\n onError(valueProps.found, 'KEY_OVER_1024_CHARS', 'The : indicator must be at most 1024 chars after the start of an implicit flow sequence key');\n }\n }\n else if (value) {\n if ('source' in value && value.source?.[0] === ':')\n onError(value, 'MISSING_CHAR', `Missing space after : in ${fcName}`);\n else\n onError(valueProps.start, 'MISSING_CHAR', `Missing , or : between ${fcName} items`);\n }\n // value value\n const valueNode = value\n ? composeNode(ctx, value, valueProps, onError)\n : valueProps.found\n ? composeEmptyNode(ctx, valueProps.end, sep, null, valueProps, onError)\n : null;\n if (valueNode) {\n if (isBlock(value))\n onError(valueNode.range, 'BLOCK_IN_FLOW', blockMsg);\n }\n else if (valueProps.comment) {\n if (keyNode.comment)\n keyNode.comment += '\\n' + valueProps.comment;\n else\n keyNode.comment = valueProps.comment;\n }\n const pair = new Pair.Pair(keyNode, valueNode);\n if (ctx.options.keepSourceTokens)\n pair.srcToken = collItem;\n if (isMap) {\n const map = coll;\n if (utilMapIncludes.mapIncludes(ctx, map.items, keyNode))\n onError(keyStart, 'DUPLICATE_KEY', 'Map keys must be unique');\n map.items.push(pair);\n }\n else {\n const map = new YAMLMap.YAMLMap(ctx.schema);\n map.flow = true;\n map.items.push(pair);\n const endRange = (valueNode ?? keyNode).range;\n map.range = [keyNode.range[0], endRange[1], endRange[2]];\n coll.items.push(map);\n }\n offset = valueNode ? valueNode.range[2] : valueProps.end;\n }\n }\n const expectedEnd = isMap ? '}' : ']';\n const [ce, ...ee] = fc.end;\n let cePos = offset;\n if (ce?.source === expectedEnd)\n cePos = ce.offset + ce.source.length;\n else {\n const name = fcName[0].toUpperCase() + fcName.substring(1);\n const msg = atRoot\n ? `${name} must end with a ${expectedEnd}`\n : `${name} in block collection must be sufficiently indented and end with a ${expectedEnd}`;\n onError(offset, atRoot ? 'MISSING_CHAR' : 'BAD_INDENT', msg);\n if (ce && ce.source.length !== 1)\n ee.unshift(ce);\n }\n if (ee.length > 0) {\n const end = resolveEnd.resolveEnd(ee, cePos, ctx.options.strict, onError);\n if (end.comment) {\n if (coll.comment)\n coll.comment += '\\n' + end.comment;\n else\n coll.comment = end.comment;\n }\n coll.range = [fc.offset, cePos, end.offset];\n }\n else {\n coll.range = [fc.offset, cePos, cePos];\n }\n return coll;\n}\n\nexports.resolveFlowCollection = resolveFlowCollection;\n","'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar Scalar = require('../nodes/Scalar.js');\nvar YAMLMap = require('../nodes/YAMLMap.js');\nvar YAMLSeq = require('../nodes/YAMLSeq.js');\nvar resolveBlockMap = require('./resolve-block-map.js');\nvar resolveBlockSeq = require('./resolve-block-seq.js');\nvar resolveFlowCollection = require('./resolve-flow-collection.js');\n\nfunction resolveCollection(CN, ctx, token, onError, tagName, tag) {\n const coll = token.type === 'block-map'\n ? resolveBlockMap.resolveBlockMap(CN, ctx, token, onError, tag)\n : token.type === 'block-seq'\n ? resolveBlockSeq.resolveBlockSeq(CN, ctx, token, onError, tag)\n : resolveFlowCollection.resolveFlowCollection(CN, ctx, token, onError, tag);\n const Coll = coll.constructor;\n // If we got a tagName matching the class, or the tag name is '!',\n // then use the tagName from the node class used to create it.\n if (tagName === '!' || tagName === Coll.tagName) {\n coll.tag = Coll.tagName;\n return coll;\n }\n if (tagName)\n coll.tag = tagName;\n return coll;\n}\nfunction composeCollection(CN, ctx, token, props, onError) {\n const tagToken = props.tag;\n const tagName = !tagToken\n ? null\n : ctx.directives.tagName(tagToken.source, msg => onError(tagToken, 'TAG_RESOLVE_FAILED', msg));\n if (token.type === 'block-seq') {\n const { anchor, newlineAfterProp: nl } = props;\n const lastProp = anchor && tagToken\n ? anchor.offset > tagToken.offset\n ? anchor\n : tagToken\n : (anchor ?? tagToken);\n if (lastProp && (!nl || nl.offset < lastProp.offset)) {\n const message = 'Missing newline after block sequence props';\n onError(lastProp, 'MISSING_CHAR', message);\n }\n }\n const expType = token.type === 'block-map'\n ? 'map'\n : token.type === 'block-seq'\n ? 'seq'\n : token.start.source === '{'\n ? 'map'\n : 'seq';\n // shortcut: check if it's a generic YAMLMap or YAMLSeq\n // before jumping into the custom tag logic.\n if (!tagToken ||\n !tagName ||\n tagName === '!' ||\n (tagName === YAMLMap.YAMLMap.tagName && expType === 'map') ||\n (tagName === YAMLSeq.YAMLSeq.tagName && expType === 'seq')) {\n return resolveCollection(CN, ctx, token, onError, tagName);\n }\n let tag = ctx.schema.tags.find(t => t.tag === tagName && t.collection === expType);\n if (!tag) {\n const kt = ctx.schema.knownTags[tagName];\n if (kt?.collection === expType) {\n ctx.schema.tags.push(Object.assign({}, kt, { default: false }));\n tag = kt;\n }\n else {\n if (kt) {\n onError(tagToken, 'BAD_COLLECTION_TYPE', `${kt.tag} used for ${expType} collection, but expects ${kt.collection ?? 'scalar'}`, true);\n }\n else {\n onError(tagToken, 'TAG_RESOLVE_FAILED', `Unresolved tag: ${tagName}`, true);\n }\n return resolveCollection(CN, ctx, token, onError, tagName);\n }\n }\n const coll = resolveCollection(CN, ctx, token, onError, tagName, tag);\n const res = tag.resolve?.(coll, msg => onError(tagToken, 'TAG_RESOLVE_FAILED', msg), ctx.options) ?? coll;\n const node = identity.isNode(res)\n ? res\n : new Scalar.Scalar(res);\n node.range = coll.range;\n node.tag = tagName;\n if (tag?.format)\n node.format = tag.format;\n return node;\n}\n\nexports.composeCollection = composeCollection;\n","'use strict';\n\nvar Scalar = require('../nodes/Scalar.js');\n\nfunction resolveBlockScalar(ctx, scalar, onError) {\n const start = scalar.offset;\n const header = parseBlockScalarHeader(scalar, ctx.options.strict, onError);\n if (!header)\n return { value: '', type: null, comment: '', range: [start, start, start] };\n const type = header.mode === '>' ? Scalar.Scalar.BLOCK_FOLDED : Scalar.Scalar.BLOCK_LITERAL;\n const lines = scalar.source ? splitLines(scalar.source) : [];\n // determine the end of content & start of chomping\n let chompStart = lines.length;\n for (let i = lines.length - 1; i >= 0; --i) {\n const content = lines[i][1];\n if (content === '' || content === '\\r')\n chompStart = i;\n else\n break;\n }\n // shortcut for empty contents\n if (chompStart === 0) {\n const value = header.chomp === '+' && lines.length > 0\n ? '\\n'.repeat(Math.max(1, lines.length - 1))\n : '';\n let end = start + header.length;\n if (scalar.source)\n end += scalar.source.length;\n return { value, type, comment: header.comment, range: [start, end, end] };\n }\n // find the indentation level to trim from start\n let trimIndent = scalar.indent + header.indent;\n let offset = scalar.offset + header.length;\n let contentStart = 0;\n for (let i = 0; i < chompStart; ++i) {\n const [indent, content] = lines[i];\n if (content === '' || content === '\\r') {\n if (header.indent === 0 && indent.length > trimIndent)\n trimIndent = indent.length;\n }\n else {\n if (indent.length < trimIndent) {\n const message = 'Block scalars with more-indented leading empty lines must use an explicit indentation indicator';\n onError(offset + indent.length, 'MISSING_CHAR', message);\n }\n if (header.indent === 0)\n trimIndent = indent.length;\n contentStart = i;\n if (trimIndent === 0 && !ctx.atRoot) {\n const message = 'Block scalar values in collections must be indented';\n onError(offset, 'BAD_INDENT', message);\n }\n break;\n }\n offset += indent.length + content.length + 1;\n }\n // include trailing more-indented empty lines in content\n for (let i = lines.length - 1; i >= chompStart; --i) {\n if (lines[i][0].length > trimIndent)\n chompStart = i + 1;\n }\n let value = '';\n let sep = '';\n let prevMoreIndented = false;\n // leading whitespace is kept intact\n for (let i = 0; i < contentStart; ++i)\n value += lines[i][0].slice(trimIndent) + '\\n';\n for (let i = contentStart; i < chompStart; ++i) {\n let [indent, content] = lines[i];\n offset += indent.length + content.length + 1;\n const crlf = content[content.length - 1] === '\\r';\n if (crlf)\n content = content.slice(0, -1);\n /* istanbul ignore if already caught in lexer */\n if (content && indent.length < trimIndent) {\n const src = header.indent\n ? 'explicit indentation indicator'\n : 'first line';\n const message = `Block scalar lines must not be less indented than their ${src}`;\n onError(offset - content.length - (crlf ? 2 : 1), 'BAD_INDENT', message);\n indent = '';\n }\n if (type === Scalar.Scalar.BLOCK_LITERAL) {\n value += sep + indent.slice(trimIndent) + content;\n sep = '\\n';\n }\n else if (indent.length > trimIndent || content[0] === '\\t') {\n // more-indented content within a folded block\n if (sep === ' ')\n sep = '\\n';\n else if (!prevMoreIndented && sep === '\\n')\n sep = '\\n\\n';\n value += sep + indent.slice(trimIndent) + content;\n sep = '\\n';\n prevMoreIndented = true;\n }\n else if (content === '') {\n // empty line\n if (sep === '\\n')\n value += '\\n';\n else\n sep = '\\n';\n }\n else {\n value += sep + content;\n sep = ' ';\n prevMoreIndented = false;\n }\n }\n switch (header.chomp) {\n case '-':\n break;\n case '+':\n for (let i = chompStart; i < lines.length; ++i)\n value += '\\n' + lines[i][0].slice(trimIndent);\n if (value[value.length - 1] !== '\\n')\n value += '\\n';\n break;\n default:\n value += '\\n';\n }\n const end = start + header.length + scalar.source.length;\n return { value, type, comment: header.comment, range: [start, end, end] };\n}\nfunction parseBlockScalarHeader({ offset, props }, strict, onError) {\n /* istanbul ignore if should not happen */\n if (props[0].type !== 'block-scalar-header') {\n onError(props[0], 'IMPOSSIBLE', 'Block scalar header not found');\n return null;\n }\n const { source } = props[0];\n const mode = source[0];\n let indent = 0;\n let chomp = '';\n let error = -1;\n for (let i = 1; i < source.length; ++i) {\n const ch = source[i];\n if (!chomp && (ch === '-' || ch === '+'))\n chomp = ch;\n else {\n const n = Number(ch);\n if (!indent && n)\n indent = n;\n else if (error === -1)\n error = offset + i;\n }\n }\n if (error !== -1)\n onError(error, 'UNEXPECTED_TOKEN', `Block scalar header includes extra characters: ${source}`);\n let hasSpace = false;\n let comment = '';\n let length = source.length;\n for (let i = 1; i < props.length; ++i) {\n const token = props[i];\n switch (token.type) {\n case 'space':\n hasSpace = true;\n // fallthrough\n case 'newline':\n length += token.source.length;\n break;\n case 'comment':\n if (strict && !hasSpace) {\n const message = 'Comments must be separated from other tokens by white space characters';\n onError(token, 'MISSING_CHAR', message);\n }\n length += token.source.length;\n comment = token.source.substring(1);\n break;\n case 'error':\n onError(token, 'UNEXPECTED_TOKEN', token.message);\n length += token.source.length;\n break;\n /* istanbul ignore next should not happen */\n default: {\n const message = `Unexpected token in block scalar header: ${token.type}`;\n onError(token, 'UNEXPECTED_TOKEN', message);\n const ts = token.source;\n if (ts && typeof ts === 'string')\n length += ts.length;\n }\n }\n }\n return { mode, indent, chomp, comment, length };\n}\n/** @returns Array of lines split up as `[indent, content]` */\nfunction splitLines(source) {\n const split = source.split(/\\n( *)/);\n const first = split[0];\n const m = first.match(/^( *)/);\n const line0 = m?.[1]\n ? [m[1], first.slice(m[1].length)]\n : ['', first];\n const lines = [line0];\n for (let i = 1; i < split.length; i += 2)\n lines.push([split[i], split[i + 1]]);\n return lines;\n}\n\nexports.resolveBlockScalar = resolveBlockScalar;\n","'use strict';\n\nvar Scalar = require('../nodes/Scalar.js');\nvar resolveEnd = require('./resolve-end.js');\n\nfunction resolveFlowScalar(scalar, strict, onError) {\n const { offset, type, source, end } = scalar;\n let _type;\n let value;\n const _onError = (rel, code, msg) => onError(offset + rel, code, msg);\n switch (type) {\n case 'scalar':\n _type = Scalar.Scalar.PLAIN;\n value = plainValue(source, _onError);\n break;\n case 'single-quoted-scalar':\n _type = Scalar.Scalar.QUOTE_SINGLE;\n value = singleQuotedValue(source, _onError);\n break;\n case 'double-quoted-scalar':\n _type = Scalar.Scalar.QUOTE_DOUBLE;\n value = doubleQuotedValue(source, _onError);\n break;\n /* istanbul ignore next should not happen */\n default:\n onError(scalar, 'UNEXPECTED_TOKEN', `Expected a flow scalar value, but found: ${type}`);\n return {\n value: '',\n type: null,\n comment: '',\n range: [offset, offset + source.length, offset + source.length]\n };\n }\n const valueEnd = offset + source.length;\n const re = resolveEnd.resolveEnd(end, valueEnd, strict, onError);\n return {\n value,\n type: _type,\n comment: re.comment,\n range: [offset, valueEnd, re.offset]\n };\n}\nfunction plainValue(source, onError) {\n let badChar = '';\n switch (source[0]) {\n /* istanbul ignore next should not happen */\n case '\\t':\n badChar = 'a tab character';\n break;\n case ',':\n badChar = 'flow indicator character ,';\n break;\n case '%':\n badChar = 'directive indicator character %';\n break;\n case '|':\n case '>': {\n badChar = `block scalar indicator ${source[0]}`;\n break;\n }\n case '@':\n case '`': {\n badChar = `reserved character ${source[0]}`;\n break;\n }\n }\n if (badChar)\n onError(0, 'BAD_SCALAR_START', `Plain value cannot start with ${badChar}`);\n return unfoldLines(source);\n}\nfunction singleQuotedValue(source, onError) {\n if (source[source.length - 1] !== \"'\" || source.length === 1)\n onError(source.length, 'MISSING_CHAR', \"Missing closing 'quote\");\n return unfoldLines(source.slice(1, -1)).replace(/''/g, \"'\");\n}\nfunction unfoldLines(source) {\n const line = /(.*?)\\r?\\n/sy;\n let match = line.exec(source);\n if (!match)\n return source;\n /**\n * The negative lookbehinds in these RegExps are to\n * prevent causing a polynomial search time in certain cases.\n *\n * The try-catch is for Safari < 16.4 and other old browsers:\n * https://caniuse.com/js-regexp-lookbehind\n */\n let trimEnd, trimBoth;\n try {\n trimEnd = new RegExp('(?<![ \\t])[ \\t]+$');\n trimBoth = new RegExp('^[ \\t]+|(?<![ \\t])[ \\t]+$', 'g');\n }\n catch {\n trimEnd = /[ \\t]+$/;\n trimBoth = /^[ \\t]+|[ \\t]+$/g;\n }\n let res = match[1].replace(trimEnd, '');\n let sep = ' ';\n let pos = line.lastIndex;\n while ((match = line.exec(source))) {\n const lm = match[1].replace(trimBoth, '');\n if (lm === '') {\n if (sep === '\\n')\n res += sep;\n else\n sep = '\\n';\n }\n else {\n res += sep + lm;\n sep = ' ';\n }\n pos = line.lastIndex;\n }\n const last = /[ \\t]*(.*)/sy;\n last.lastIndex = pos;\n match = last.exec(source);\n return res + sep + (match?.[1] ?? '');\n}\nfunction doubleQuotedValue(source, onError) {\n let res = '';\n for (let i = 1; i < source.length - 1; ++i) {\n const ch = source[i];\n if (ch === '\\r' && source[i + 1] === '\\n')\n continue;\n if (ch === '\\n') {\n const { fold, offset } = foldNewline(source, i);\n res += fold;\n i = offset;\n }\n else if (ch === '\\\\') {\n let next = source[++i];\n const cc = escapeCodes[next];\n if (cc)\n res += cc;\n else if (next === '\\n') {\n // skip escaped newlines, but still trim the following line\n next = source[i + 1];\n while (next === ' ' || next === '\\t')\n next = source[++i + 1];\n }\n else if (next === '\\r' && source[i + 1] === '\\n') {\n // skip escaped CRLF newlines, but still trim the following line\n next = source[++i + 1];\n while (next === ' ' || next === '\\t')\n next = source[++i + 1];\n }\n else if (next === 'x' || next === 'u' || next === 'U') {\n const length = next === 'x' ? 2 : next === 'u' ? 4 : 8;\n res += parseCharCode(source, i + 1, length, onError);\n i += length;\n }\n else {\n const raw = source.substr(i - 1, 2);\n onError(i - 1, 'BAD_DQ_ESCAPE', `Invalid escape sequence ${raw}`);\n res += raw;\n }\n }\n else if (ch === ' ' || ch === '\\t') {\n // trim trailing whitespace\n const wsStart = i;\n let next = source[i + 1];\n while (next === ' ' || next === '\\t')\n next = source[++i + 1];\n if (next !== '\\n' && !(next === '\\r' && source[i + 2] === '\\n'))\n res += i > wsStart ? source.slice(wsStart, i + 1) : ch;\n }\n else {\n res += ch;\n }\n }\n if (source[source.length - 1] !== '\"' || source.length === 1)\n onError(source.length, 'MISSING_CHAR', 'Missing closing \"quote');\n return res;\n}\n/**\n * Fold a single newline into a space, multiple newlines to N - 1 newlines.\n * Presumes `source[offset] === '\\n'`\n */\nfunction foldNewline(source, offset) {\n let fold = '';\n let ch = source[offset + 1];\n while (ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r') {\n if (ch === '\\r' && source[offset + 2] !== '\\n')\n break;\n if (ch === '\\n')\n fold += '\\n';\n offset += 1;\n ch = source[offset + 1];\n }\n if (!fold)\n fold = ' ';\n return { fold, offset };\n}\nconst escapeCodes = {\n '0': '\\0', // null character\n a: '\\x07', // bell character\n b: '\\b', // backspace\n e: '\\x1b', // escape character\n f: '\\f', // form feed\n n: '\\n', // line feed\n r: '\\r', // carriage return\n t: '\\t', // horizontal tab\n v: '\\v', // vertical tab\n N: '\\u0085', // Unicode next line\n _: '\\u00a0', // Unicode non-breaking space\n L: '\\u2028', // Unicode line separator\n P: '\\u2029', // Unicode paragraph separator\n ' ': ' ',\n '\"': '\"',\n '/': '/',\n '\\\\': '\\\\',\n '\\t': '\\t'\n};\nfunction parseCharCode(source, offset, length, onError) {\n const cc = source.substr(offset, length);\n const ok = cc.length === length && /^[0-9a-fA-F]+$/.test(cc);\n const code = ok ? parseInt(cc, 16) : NaN;\n try {\n return String.fromCodePoint(code);\n }\n catch {\n const raw = source.substr(offset - 2, length + 2);\n onError(offset - 2, 'BAD_DQ_ESCAPE', `Invalid escape sequence ${raw}`);\n return raw;\n }\n}\n\nexports.resolveFlowScalar = resolveFlowScalar;\n","'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar Scalar = require('../nodes/Scalar.js');\nvar resolveBlockScalar = require('./resolve-block-scalar.js');\nvar resolveFlowScalar = require('./resolve-flow-scalar.js');\n\nfunction composeScalar(ctx, token, tagToken, onError) {\n const { value, type, comment, range } = token.type === 'block-scalar'\n ? resolveBlockScalar.resolveBlockScalar(ctx, token, onError)\n : resolveFlowScalar.resolveFlowScalar(token, ctx.options.strict, onError);\n const tagName = tagToken\n ? ctx.directives.tagName(tagToken.source, msg => onError(tagToken, 'TAG_RESOLVE_FAILED', msg))\n : null;\n let tag;\n if (ctx.options.stringKeys && ctx.atKey) {\n tag = ctx.schema[identity.SCALAR];\n }\n else if (tagName)\n tag = findScalarTagByName(ctx.schema, value, tagName, tagToken, onError);\n else if (token.type === 'scalar')\n tag = findScalarTagByTest(ctx, value, token, onError);\n else\n tag = ctx.schema[identity.SCALAR];\n let scalar;\n try {\n const res = tag.resolve(value, msg => onError(tagToken ?? token, 'TAG_RESOLVE_FAILED', msg), ctx.options);\n scalar = identity.isScalar(res) ? res : new Scalar.Scalar(res);\n }\n catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n onError(tagToken ?? token, 'TAG_RESOLVE_FAILED', msg);\n scalar = new Scalar.Scalar(value);\n }\n scalar.range = range;\n scalar.source = value;\n if (type)\n scalar.type = type;\n if (tagName)\n scalar.tag = tagName;\n if (tag.format)\n scalar.format = tag.format;\n if (comment)\n scalar.comment = comment;\n return scalar;\n}\nfunction findScalarTagByName(schema, value, tagName, tagToken, onError) {\n if (tagName === '!')\n return schema[identity.SCALAR]; // non-specific tag\n const matchWithTest = [];\n for (const tag of schema.tags) {\n if (!tag.collection && tag.tag === tagName) {\n if (tag.default && tag.test)\n matchWithTest.push(tag);\n else\n return tag;\n }\n }\n for (const tag of matchWithTest)\n if (tag.test?.test(value))\n return tag;\n const kt = schema.knownTags[tagName];\n if (kt && !kt.collection) {\n // Ensure that the known tag is available for stringifying,\n // but does not get used by default.\n schema.tags.push(Object.assign({}, kt, { default: false, test: undefined }));\n return kt;\n }\n onError(tagToken, 'TAG_RESOLVE_FAILED', `Unresolved tag: ${tagName}`, tagName !== 'tag:yaml.org,2002:str');\n return schema[identity.SCALAR];\n}\nfunction findScalarTagByTest({ atKey, directives, schema }, value, token, onError) {\n const tag = schema.tags.find(tag => (tag.default === true || (atKey && tag.default === 'key')) &&\n tag.test?.test(value)) || schema[identity.SCALAR];\n if (schema.compat) {\n const compat = schema.compat.find(tag => tag.default && tag.test?.test(value)) ??\n schema[identity.SCALAR];\n if (tag.tag !== compat.tag) {\n const ts = directives.tagString(tag.tag);\n const cs = directives.tagString(compat.tag);\n const msg = `Value may be parsed as either ${ts} or ${cs}`;\n onError(token, 'TAG_RESOLVE_FAILED', msg, true);\n }\n }\n return tag;\n}\n\nexports.composeScalar = composeScalar;\n","'use strict';\n\nfunction emptyScalarPosition(offset, before, pos) {\n if (before) {\n pos ?? (pos = before.length);\n for (let i = pos - 1; i >= 0; --i) {\n let st = before[i];\n switch (st.type) {\n case 'space':\n case 'comment':\n case 'newline':\n offset -= st.source.length;\n continue;\n }\n // Technically, an empty scalar is immediately after the last non-empty\n // node, but it's more useful to place it after any whitespace.\n st = before[++i];\n while (st?.type === 'space') {\n offset += st.source.length;\n st = before[++i];\n }\n break;\n }\n }\n return offset;\n}\n\nexports.emptyScalarPosition = emptyScalarPosition;\n","'use strict';\n\nvar Alias = require('../nodes/Alias.js');\nvar identity = require('../nodes/identity.js');\nvar composeCollection = require('./compose-collection.js');\nvar composeScalar = require('./compose-scalar.js');\nvar resolveEnd = require('./resolve-end.js');\nvar utilEmptyScalarPosition = require('./util-empty-scalar-position.js');\n\nconst CN = { composeNode, composeEmptyNode };\nfunction composeNode(ctx, token, props, onError) {\n const atKey = ctx.atKey;\n const { spaceBefore, comment, anchor, tag } = props;\n let node;\n let isSrcToken = true;\n switch (token.type) {\n case 'alias':\n node = composeAlias(ctx, token, onError);\n if (anchor || tag)\n onError(token, 'ALIAS_PROPS', 'An alias node must not specify any properties');\n break;\n case 'scalar':\n case 'single-quoted-scalar':\n case 'double-quoted-scalar':\n case 'block-scalar':\n node = composeScalar.composeScalar(ctx, token, tag, onError);\n if (anchor)\n node.anchor = anchor.source.substring(1);\n break;\n case 'block-map':\n case 'block-seq':\n case 'flow-collection':\n try {\n node = composeCollection.composeCollection(CN, ctx, token, props, onError);\n if (anchor)\n node.anchor = anchor.source.substring(1);\n }\n catch (error) {\n // Almost certainly here due to a stack overflow\n const message = error instanceof Error ? error.message : String(error);\n onError(token, 'RESOURCE_EXHAUSTION', message);\n }\n break;\n default: {\n const message = token.type === 'error'\n ? token.message\n : `Unsupported token (type: ${token.type})`;\n onError(token, 'UNEXPECTED_TOKEN', message);\n isSrcToken = false;\n }\n }\n node ?? (node = composeEmptyNode(ctx, token.offset, undefined, null, props, onError));\n if (anchor && node.anchor === '')\n onError(anchor, 'BAD_ALIAS', 'Anchor cannot be an empty string');\n if (atKey &&\n ctx.options.stringKeys &&\n (!identity.isScalar(node) ||\n typeof node.value !== 'string' ||\n (node.tag && node.tag !== 'tag:yaml.org,2002:str'))) {\n const msg = 'With stringKeys, all keys must be strings';\n onError(tag ?? token, 'NON_STRING_KEY', msg);\n }\n if (spaceBefore)\n node.spaceBefore = true;\n if (comment) {\n if (token.type === 'scalar' && token.source === '')\n node.comment = comment;\n else\n node.commentBefore = comment;\n }\n // @ts-expect-error Type checking misses meaning of isSrcToken\n if (ctx.options.keepSourceTokens && isSrcToken)\n node.srcToken = token;\n return node;\n}\nfunction composeEmptyNode(ctx, offset, before, pos, { spaceBefore, comment, anchor, tag, end }, onError) {\n const token = {\n type: 'scalar',\n offset: utilEmptyScalarPosition.emptyScalarPosition(offset, before, pos),\n indent: -1,\n source: ''\n };\n const node = composeScalar.composeScalar(ctx, token, tag, onError);\n if (anchor) {\n node.anchor = anchor.source.substring(1);\n if (node.anchor === '')\n onError(anchor, 'BAD_ALIAS', 'Anchor cannot be an empty string');\n }\n if (spaceBefore)\n node.spaceBefore = true;\n if (comment) {\n node.comment = comment;\n node.range[2] = end;\n }\n return node;\n}\nfunction composeAlias({ options }, { offset, source, end }, onError) {\n const alias = new Alias.Alias(source.substring(1));\n if (alias.source === '')\n onError(offset, 'BAD_ALIAS', 'Alias cannot be an empty string');\n if (alias.source.endsWith(':'))\n onError(offset + source.length - 1, 'BAD_ALIAS', 'Alias ending in : is ambiguous', true);\n const valueEnd = offset + source.length;\n const re = resolveEnd.resolveEnd(end, valueEnd, options.strict, onError);\n alias.range = [offset, valueEnd, re.offset];\n if (re.comment)\n alias.comment = re.comment;\n return alias;\n}\n\nexports.composeEmptyNode = composeEmptyNode;\nexports.composeNode = composeNode;\n","'use strict';\n\nvar Document = require('../doc/Document.js');\nvar composeNode = require('./compose-node.js');\nvar resolveEnd = require('./resolve-end.js');\nvar resolveProps = require('./resolve-props.js');\n\nfunction composeDoc(options, directives, { offset, start, value, end }, onError) {\n const opts = Object.assign({ _directives: directives }, options);\n const doc = new Document.Document(undefined, opts);\n const ctx = {\n atKey: false,\n atRoot: true,\n directives: doc.directives,\n options: doc.options,\n schema: doc.schema\n };\n const props = resolveProps.resolveProps(start, {\n indicator: 'doc-start',\n next: value ?? end?.[0],\n offset,\n onError,\n parentIndent: 0,\n startOnNewline: true\n });\n if (props.found) {\n doc.directives.docStart = true;\n if (value &&\n (value.type === 'block-map' || value.type === 'block-seq') &&\n !props.hasNewline)\n onError(props.end, 'MISSING_CHAR', 'Block collection cannot start on same line with directives-end marker');\n }\n // @ts-expect-error If Contents is set, let's trust the user\n doc.contents = value\n ? composeNode.composeNode(ctx, value, props, onError)\n : composeNode.composeEmptyNode(ctx, props.end, start, null, props, onError);\n const contentEnd = doc.contents.range[2];\n const re = resolveEnd.resolveEnd(end, contentEnd, false, onError);\n if (re.comment)\n doc.comment = re.comment;\n doc.range = [offset, contentEnd, re.offset];\n return doc;\n}\n\nexports.composeDoc = composeDoc;\n","'use strict';\n\nvar node_process = require('process');\nvar directives = require('../doc/directives.js');\nvar Document = require('../doc/Document.js');\nvar errors = require('../errors.js');\nvar identity = require('../nodes/identity.js');\nvar composeDoc = require('./compose-doc.js');\nvar resolveEnd = require('./resolve-end.js');\n\nfunction getErrorPos(src) {\n if (typeof src === 'number')\n return [src, src + 1];\n if (Array.isArray(src))\n return src.length === 2 ? src : [src[0], src[1]];\n const { offset, source } = src;\n return [offset, offset + (typeof source === 'string' ? source.length : 1)];\n}\nfunction parsePrelude(prelude) {\n let comment = '';\n let atComment = false;\n let afterEmptyLine = false;\n for (let i = 0; i < prelude.length; ++i) {\n const source = prelude[i];\n switch (source[0]) {\n case '#':\n comment +=\n (comment === '' ? '' : afterEmptyLine ? '\\n\\n' : '\\n') +\n (source.substring(1) || ' ');\n atComment = true;\n afterEmptyLine = false;\n break;\n case '%':\n if (prelude[i + 1]?.[0] !== '#')\n i += 1;\n atComment = false;\n break;\n default:\n // This may be wrong after doc-end, but in that case it doesn't matter\n if (!atComment)\n afterEmptyLine = true;\n atComment = false;\n }\n }\n return { comment, afterEmptyLine };\n}\n/**\n * Compose a stream of CST nodes into a stream of YAML Documents.\n *\n * ```ts\n * import { Composer, Parser } from 'yaml'\n *\n * const src: string = ...\n * const tokens = new Parser().parse(src)\n * const docs = new Composer().compose(tokens)\n * ```\n */\nclass Composer {\n constructor(options = {}) {\n this.doc = null;\n this.atDirectives = false;\n this.prelude = [];\n this.errors = [];\n this.warnings = [];\n this.onError = (source, code, message, warning) => {\n const pos = getErrorPos(source);\n if (warning)\n this.warnings.push(new errors.YAMLWarning(pos, code, message));\n else\n this.errors.push(new errors.YAMLParseError(pos, code, message));\n };\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n this.directives = new directives.Directives({ version: options.version || '1.2' });\n this.options = options;\n }\n decorate(doc, afterDoc) {\n const { comment, afterEmptyLine } = parsePrelude(this.prelude);\n //console.log({ dc: doc.comment, prelude, comment })\n if (comment) {\n const dc = doc.contents;\n if (afterDoc) {\n doc.comment = doc.comment ? `${doc.comment}\\n${comment}` : comment;\n }\n else if (afterEmptyLine || doc.directives.docStart || !dc) {\n doc.commentBefore = comment;\n }\n else if (identity.isCollection(dc) && !dc.flow && dc.items.length > 0) {\n let it = dc.items[0];\n if (identity.isPair(it))\n it = it.key;\n const cb = it.commentBefore;\n it.commentBefore = cb ? `${comment}\\n${cb}` : comment;\n }\n else {\n const cb = dc.commentBefore;\n dc.commentBefore = cb ? `${comment}\\n${cb}` : comment;\n }\n }\n if (afterDoc) {\n for (let i = 0; i < this.errors.length; ++i)\n doc.errors.push(this.errors[i]);\n for (let i = 0; i < this.warnings.length; ++i)\n doc.warnings.push(this.warnings[i]);\n }\n else {\n doc.errors = this.errors;\n doc.warnings = this.warnings;\n }\n this.prelude = [];\n this.errors = [];\n this.warnings = [];\n }\n /**\n * Current stream status information.\n *\n * Mostly useful at the end of input for an empty stream.\n */\n streamInfo() {\n return {\n comment: parsePrelude(this.prelude).comment,\n directives: this.directives,\n errors: this.errors,\n warnings: this.warnings\n };\n }\n /**\n * Compose tokens into documents.\n *\n * @param forceDoc - If the stream contains no document, still emit a final document including any comments and directives that would be applied to a subsequent document.\n * @param endOffset - Should be set if `forceDoc` is also set, to set the document range end and to indicate errors correctly.\n */\n *compose(tokens, forceDoc = false, endOffset = -1) {\n for (const token of tokens)\n yield* this.next(token);\n yield* this.end(forceDoc, endOffset);\n }\n /** Advance the composer by one CST token. */\n *next(token) {\n if (node_process.env.LOG_STREAM)\n console.dir(token, { depth: null });\n switch (token.type) {\n case 'directive':\n this.directives.add(token.source, (offset, message, warning) => {\n const pos = getErrorPos(token);\n pos[0] += offset;\n this.onError(pos, 'BAD_DIRECTIVE', message, warning);\n });\n this.prelude.push(token.source);\n this.atDirectives = true;\n break;\n case 'document': {\n const doc = composeDoc.composeDoc(this.options, this.directives, token, this.onError);\n if (this.atDirectives && !doc.directives.docStart)\n this.onError(token, 'MISSING_CHAR', 'Missing directives-end/doc-start indicator line');\n this.decorate(doc, false);\n if (this.doc)\n yield this.doc;\n this.doc = doc;\n this.atDirectives = false;\n break;\n }\n case 'byte-order-mark':\n case 'space':\n break;\n case 'comment':\n case 'newline':\n this.prelude.push(token.source);\n break;\n case 'error': {\n const msg = token.source\n ? `${token.message}: ${JSON.stringify(token.source)}`\n : token.message;\n const error = new errors.YAMLParseError(getErrorPos(token), 'UNEXPECTED_TOKEN', msg);\n if (this.atDirectives || !this.doc)\n this.errors.push(error);\n else\n this.doc.errors.push(error);\n break;\n }\n case 'doc-end': {\n if (!this.doc) {\n const msg = 'Unexpected doc-end without preceding document';\n this.errors.push(new errors.YAMLParseError(getErrorPos(token), 'UNEXPECTED_TOKEN', msg));\n break;\n }\n this.doc.directives.docEnd = true;\n const end = resolveEnd.resolveEnd(token.end, token.offset + token.source.length, this.doc.options.strict, this.onError);\n this.decorate(this.doc, true);\n if (end.comment) {\n const dc = this.doc.comment;\n this.doc.comment = dc ? `${dc}\\n${end.comment}` : end.comment;\n }\n this.doc.range[2] = end.offset;\n break;\n }\n default:\n this.errors.push(new errors.YAMLParseError(getErrorPos(token), 'UNEXPECTED_TOKEN', `Unsupported token ${token.type}`));\n }\n }\n /**\n * Call at end of input to yield any remaining document.\n *\n * @param forceDoc - If the stream contains no document, still emit a final document including any comments and directives that would be applied to a subsequent document.\n * @param endOffset - Should be set if `forceDoc` is also set, to set the document range end and to indicate errors correctly.\n */\n *end(forceDoc = false, endOffset = -1) {\n if (this.doc) {\n this.decorate(this.doc, true);\n yield this.doc;\n this.doc = null;\n }\n else if (forceDoc) {\n const opts = Object.assign({ _directives: this.directives }, this.options);\n const doc = new Document.Document(undefined, opts);\n if (this.atDirectives)\n this.onError(endOffset, 'MISSING_CHAR', 'Missing directives-end indicator line');\n doc.range = [0, endOffset, endOffset];\n this.decorate(doc, false);\n yield doc;\n }\n }\n}\n\nexports.Composer = Composer;\n","'use strict';\n\nvar resolveBlockScalar = require('../compose/resolve-block-scalar.js');\nvar resolveFlowScalar = require('../compose/resolve-flow-scalar.js');\nvar errors = require('../errors.js');\nvar stringifyString = require('../stringify/stringifyString.js');\n\nfunction resolveAsScalar(token, strict = true, onError) {\n if (token) {\n const _onError = (pos, code, message) => {\n const offset = typeof pos === 'number' ? pos : Array.isArray(pos) ? pos[0] : pos.offset;\n if (onError)\n onError(offset, code, message);\n else\n throw new errors.YAMLParseError([offset, offset + 1], code, message);\n };\n switch (token.type) {\n case 'scalar':\n case 'single-quoted-scalar':\n case 'double-quoted-scalar':\n return resolveFlowScalar.resolveFlowScalar(token, strict, _onError);\n case 'block-scalar':\n return resolveBlockScalar.resolveBlockScalar({ options: { strict } }, token, _onError);\n }\n }\n return null;\n}\n/**\n * Create a new scalar token with `value`\n *\n * Values that represent an actual string but may be parsed as a different type should use a `type` other than `'PLAIN'`,\n * as this function does not support any schema operations and won't check for such conflicts.\n *\n * @param value The string representation of the value, which will have its content properly indented.\n * @param context.end Comments and whitespace after the end of the value, or after the block scalar header. If undefined, a newline will be added.\n * @param context.implicitKey Being within an implicit key may affect the resolved type of the token's value.\n * @param context.indent The indent level of the token.\n * @param context.inFlow Is this scalar within a flow collection? This may affect the resolved type of the token's value.\n * @param context.offset The offset position of the token.\n * @param context.type The preferred type of the scalar token. If undefined, the previous type of the `token` will be used, defaulting to `'PLAIN'`.\n */\nfunction createScalarToken(value, context) {\n const { implicitKey = false, indent, inFlow = false, offset = -1, type = 'PLAIN' } = context;\n const source = stringifyString.stringifyString({ type, value }, {\n implicitKey,\n indent: indent > 0 ? ' '.repeat(indent) : '',\n inFlow,\n options: { blockQuote: true, lineWidth: -1 }\n });\n const end = context.end ?? [\n { type: 'newline', offset: -1, indent, source: '\\n' }\n ];\n switch (source[0]) {\n case '|':\n case '>': {\n const he = source.indexOf('\\n');\n const head = source.substring(0, he);\n const body = source.substring(he + 1) + '\\n';\n const props = [\n { type: 'block-scalar-header', offset, indent, source: head }\n ];\n if (!addEndtoBlockProps(props, end))\n props.push({ type: 'newline', offset: -1, indent, source: '\\n' });\n return { type: 'block-scalar', offset, indent, props, source: body };\n }\n case '\"':\n return { type: 'double-quoted-scalar', offset, indent, source, end };\n case \"'\":\n return { type: 'single-quoted-scalar', offset, indent, source, end };\n default:\n return { type: 'scalar', offset, indent, source, end };\n }\n}\n/**\n * Set the value of `token` to the given string `value`, overwriting any previous contents and type that it may have.\n *\n * Best efforts are made to retain any comments previously associated with the `token`,\n * though all contents within a collection's `items` will be overwritten.\n *\n * Values that represent an actual string but may be parsed as a different type should use a `type` other than `'PLAIN'`,\n * as this function does not support any schema operations and won't check for such conflicts.\n *\n * @param token Any token. If it does not include an `indent` value, the value will be stringified as if it were an implicit key.\n * @param value The string representation of the value, which will have its content properly indented.\n * @param context.afterKey In most cases, values after a key should have an additional level of indentation.\n * @param context.implicitKey Being within an implicit key may affect the resolved type of the token's value.\n * @param context.inFlow Being within a flow collection may affect the resolved type of the token's value.\n * @param context.type The preferred type of the scalar token. If undefined, the previous type of the `token` will be used, defaulting to `'PLAIN'`.\n */\nfunction setScalarValue(token, value, context = {}) {\n let { afterKey = false, implicitKey = false, inFlow = false, type } = context;\n let indent = 'indent' in token ? token.indent : null;\n if (afterKey && typeof indent === 'number')\n indent += 2;\n if (!type)\n switch (token.type) {\n case 'single-quoted-scalar':\n type = 'QUOTE_SINGLE';\n break;\n case 'double-quoted-scalar':\n type = 'QUOTE_DOUBLE';\n break;\n case 'block-scalar': {\n const header = token.props[0];\n if (header.type !== 'block-scalar-header')\n throw new Error('Invalid block scalar header');\n type = header.source[0] === '>' ? 'BLOCK_FOLDED' : 'BLOCK_LITERAL';\n break;\n }\n default:\n type = 'PLAIN';\n }\n const source = stringifyString.stringifyString({ type, value }, {\n implicitKey: implicitKey || indent === null,\n indent: indent !== null && indent > 0 ? ' '.repeat(indent) : '',\n inFlow,\n options: { blockQuote: true, lineWidth: -1 }\n });\n switch (source[0]) {\n case '|':\n case '>':\n setBlockScalarValue(token, source);\n break;\n case '\"':\n setFlowScalarValue(token, source, 'double-quoted-scalar');\n break;\n case \"'\":\n setFlowScalarValue(token, source, 'single-quoted-scalar');\n break;\n default:\n setFlowScalarValue(token, source, 'scalar');\n }\n}\nfunction setBlockScalarValue(token, source) {\n const he = source.indexOf('\\n');\n const head = source.substring(0, he);\n const body = source.substring(he + 1) + '\\n';\n if (token.type === 'block-scalar') {\n const header = token.props[0];\n if (header.type !== 'block-scalar-header')\n throw new Error('Invalid block scalar header');\n header.source = head;\n token.source = body;\n }\n else {\n const { offset } = token;\n const indent = 'indent' in token ? token.indent : -1;\n const props = [\n { type: 'block-scalar-header', offset, indent, source: head }\n ];\n if (!addEndtoBlockProps(props, 'end' in token ? token.end : undefined))\n props.push({ type: 'newline', offset: -1, indent, source: '\\n' });\n for (const key of Object.keys(token))\n if (key !== 'type' && key !== 'offset')\n delete token[key];\n Object.assign(token, { type: 'block-scalar', indent, props, source: body });\n }\n}\n/** @returns `true` if last token is a newline */\nfunction addEndtoBlockProps(props, end) {\n if (end)\n for (const st of end)\n switch (st.type) {\n case 'space':\n case 'comment':\n props.push(st);\n break;\n case 'newline':\n props.push(st);\n return true;\n }\n return false;\n}\nfunction setFlowScalarValue(token, source, type) {\n switch (token.type) {\n case 'scalar':\n case 'double-quoted-scalar':\n case 'single-quoted-scalar':\n token.type = type;\n token.source = source;\n break;\n case 'block-scalar': {\n const end = token.props.slice(1);\n let oa = source.length;\n if (token.props[0].type === 'block-scalar-header')\n oa -= token.props[0].source.length;\n for (const tok of end)\n tok.offset += oa;\n delete token.props;\n Object.assign(token, { type, source, end });\n break;\n }\n case 'block-map':\n case 'block-seq': {\n const offset = token.offset + source.length;\n const nl = { type: 'newline', offset, indent: token.indent, source: '\\n' };\n delete token.items;\n Object.assign(token, { type, source, end: [nl] });\n break;\n }\n default: {\n const indent = 'indent' in token ? token.indent : -1;\n const end = 'end' in token && Array.isArray(token.end)\n ? token.end.filter(st => st.type === 'space' ||\n st.type === 'comment' ||\n st.type === 'newline')\n : [];\n for (const key of Object.keys(token))\n if (key !== 'type' && key !== 'offset')\n delete token[key];\n Object.assign(token, { type, indent, source, end });\n }\n }\n}\n\nexports.createScalarToken = createScalarToken;\nexports.resolveAsScalar = resolveAsScalar;\nexports.setScalarValue = setScalarValue;\n","'use strict';\n\n/**\n * Stringify a CST document, token, or collection item\n *\n * Fair warning: This applies no validation whatsoever, and\n * simply concatenates the sources in their logical order.\n */\nconst stringify = (cst) => 'type' in cst ? stringifyToken(cst) : stringifyItem(cst);\nfunction stringifyToken(token) {\n switch (token.type) {\n case 'block-scalar': {\n let res = '';\n for (const tok of token.props)\n res += stringifyToken(tok);\n return res + token.source;\n }\n case 'block-map':\n case 'block-seq': {\n let res = '';\n for (const item of token.items)\n res += stringifyItem(item);\n return res;\n }\n case 'flow-collection': {\n let res = token.start.source;\n for (const item of token.items)\n res += stringifyItem(item);\n for (const st of token.end)\n res += st.source;\n return res;\n }\n case 'document': {\n let res = stringifyItem(token);\n if (token.end)\n for (const st of token.end)\n res += st.source;\n return res;\n }\n default: {\n let res = token.source;\n if ('end' in token && token.end)\n for (const st of token.end)\n res += st.source;\n return res;\n }\n }\n}\nfunction stringifyItem({ start, key, sep, value }) {\n let res = '';\n for (const st of start)\n res += st.source;\n if (key)\n res += stringifyToken(key);\n if (sep)\n for (const st of sep)\n res += st.source;\n if (value)\n res += stringifyToken(value);\n return res;\n}\n\nexports.stringify = stringify;\n","'use strict';\n\nconst BREAK = Symbol('break visit');\nconst SKIP = Symbol('skip children');\nconst REMOVE = Symbol('remove item');\n/**\n * Apply a visitor to a CST document or item.\n *\n * Walks through the tree (depth-first) starting from the root, calling a\n * `visitor` function with two arguments when entering each item:\n * - `item`: The current item, which included the following members:\n * - `start: SourceToken[]` – Source tokens before the key or value,\n * possibly including its anchor or tag.\n * - `key?: Token | null` – Set for pair values. May then be `null`, if\n * the key before the `:` separator is empty.\n * - `sep?: SourceToken[]` – Source tokens between the key and the value,\n * which should include the `:` map value indicator if `value` is set.\n * - `value?: Token` – The value of a sequence item, or of a map pair.\n * - `path`: The steps from the root to the current node, as an array of\n * `['key' | 'value', number]` tuples.\n *\n * The return value of the visitor may be used to control the traversal:\n * - `undefined` (default): Do nothing and continue\n * - `visit.SKIP`: Do not visit the children of this token, continue with\n * next sibling\n * - `visit.BREAK`: Terminate traversal completely\n * - `visit.REMOVE`: Remove the current item, then continue with the next one\n * - `number`: Set the index of the next step. This is useful especially if\n * the index of the current token has changed.\n * - `function`: Define the next visitor for this item. After the original\n * visitor is called on item entry, next visitors are called after handling\n * a non-empty `key` and when exiting the item.\n */\nfunction visit(cst, visitor) {\n if ('type' in cst && cst.type === 'document')\n cst = { start: cst.start, value: cst.value };\n _visit(Object.freeze([]), cst, visitor);\n}\n// Without the `as symbol` casts, TS declares these in the `visit`\n// namespace using `var`, but then complains about that because\n// `unique symbol` must be `const`.\n/** Terminate visit traversal completely */\nvisit.BREAK = BREAK;\n/** Do not visit the children of the current item */\nvisit.SKIP = SKIP;\n/** Remove the current item */\nvisit.REMOVE = REMOVE;\n/** Find the item at `path` from `cst` as the root */\nvisit.itemAtPath = (cst, path) => {\n let item = cst;\n for (const [field, index] of path) {\n const tok = item?.[field];\n if (tok && 'items' in tok) {\n item = tok.items[index];\n }\n else\n return undefined;\n }\n return item;\n};\n/**\n * Get the immediate parent collection of the item at `path` from `cst` as the root.\n *\n * Throws an error if the collection is not found, which should never happen if the item itself exists.\n */\nvisit.parentCollection = (cst, path) => {\n const parent = visit.itemAtPath(cst, path.slice(0, -1));\n const field = path[path.length - 1][0];\n const coll = parent?.[field];\n if (coll && 'items' in coll)\n return coll;\n throw new Error('Parent collection not found');\n};\nfunction _visit(path, item, visitor) {\n let ctrl = visitor(item, path);\n if (typeof ctrl === 'symbol')\n return ctrl;\n for (const field of ['key', 'value']) {\n const token = item[field];\n if (token && 'items' in token) {\n for (let i = 0; i < token.items.length; ++i) {\n const ci = _visit(Object.freeze(path.concat([[field, i]])), token.items[i], visitor);\n if (typeof ci === 'number')\n i = ci - 1;\n else if (ci === BREAK)\n return BREAK;\n else if (ci === REMOVE) {\n token.items.splice(i, 1);\n i -= 1;\n }\n }\n if (typeof ctrl === 'function' && field === 'key')\n ctrl = ctrl(item, path);\n }\n }\n return typeof ctrl === 'function' ? ctrl(item, path) : ctrl;\n}\n\nexports.visit = visit;\n","'use strict';\n\nvar cstScalar = require('./cst-scalar.js');\nvar cstStringify = require('./cst-stringify.js');\nvar cstVisit = require('./cst-visit.js');\n\n/** The byte order mark */\nconst BOM = '\\u{FEFF}';\n/** Start of doc-mode */\nconst DOCUMENT = '\\x02'; // C0: Start of Text\n/** Unexpected end of flow-mode */\nconst FLOW_END = '\\x18'; // C0: Cancel\n/** Next token is a scalar value */\nconst SCALAR = '\\x1f'; // C0: Unit Separator\n/** @returns `true` if `token` is a flow or block collection */\nconst isCollection = (token) => !!token && 'items' in token;\n/** @returns `true` if `token` is a flow or block scalar; not an alias */\nconst isScalar = (token) => !!token &&\n (token.type === 'scalar' ||\n token.type === 'single-quoted-scalar' ||\n token.type === 'double-quoted-scalar' ||\n token.type === 'block-scalar');\n/* istanbul ignore next */\n/** Get a printable representation of a lexer token */\nfunction prettyToken(token) {\n switch (token) {\n case BOM:\n return '<BOM>';\n case DOCUMENT:\n return '<DOC>';\n case FLOW_END:\n return '<FLOW_END>';\n case SCALAR:\n return '<SCALAR>';\n default:\n return JSON.stringify(token);\n }\n}\n/** Identify the type of a lexer token. May return `null` for unknown tokens. */\nfunction tokenType(source) {\n switch (source) {\n case BOM:\n return 'byte-order-mark';\n case DOCUMENT:\n return 'doc-mode';\n case FLOW_END:\n return 'flow-error-end';\n case SCALAR:\n return 'scalar';\n case '---':\n return 'doc-start';\n case '...':\n return 'doc-end';\n case '':\n case '\\n':\n case '\\r\\n':\n return 'newline';\n case '-':\n return 'seq-item-ind';\n case '?':\n return 'explicit-key-ind';\n case ':':\n return 'map-value-ind';\n case '{':\n return 'flow-map-start';\n case '}':\n return 'flow-map-end';\n case '[':\n return 'flow-seq-start';\n case ']':\n return 'flow-seq-end';\n case ',':\n return 'comma';\n }\n switch (source[0]) {\n case ' ':\n case '\\t':\n return 'space';\n case '#':\n return 'comment';\n case '%':\n return 'directive-line';\n case '*':\n return 'alias';\n case '&':\n return 'anchor';\n case '!':\n return 'tag';\n case \"'\":\n return 'single-quoted-scalar';\n case '\"':\n return 'double-quoted-scalar';\n case '|':\n case '>':\n return 'block-scalar-header';\n }\n return null;\n}\n\nexports.createScalarToken = cstScalar.createScalarToken;\nexports.resolveAsScalar = cstScalar.resolveAsScalar;\nexports.setScalarValue = cstScalar.setScalarValue;\nexports.stringify = cstStringify.stringify;\nexports.visit = cstVisit.visit;\nexports.BOM = BOM;\nexports.DOCUMENT = DOCUMENT;\nexports.FLOW_END = FLOW_END;\nexports.SCALAR = SCALAR;\nexports.isCollection = isCollection;\nexports.isScalar = isScalar;\nexports.prettyToken = prettyToken;\nexports.tokenType = tokenType;\n","'use strict';\n\nvar cst = require('./cst.js');\n\n/*\nSTART -> stream\n\nstream\n directive -> line-end -> stream\n indent + line-end -> stream\n [else] -> line-start\n\nline-end\n comment -> line-end\n newline -> .\n input-end -> END\n\nline-start\n doc-start -> doc\n doc-end -> stream\n [else] -> indent -> block-start\n\nblock-start\n seq-item-start -> block-start\n explicit-key-start -> block-start\n map-value-start -> block-start\n [else] -> doc\n\ndoc\n line-end -> line-start\n spaces -> doc\n anchor -> doc\n tag -> doc\n flow-start -> flow -> doc\n flow-end -> error -> doc\n seq-item-start -> error -> doc\n explicit-key-start -> error -> doc\n map-value-start -> doc\n alias -> doc\n quote-start -> quoted-scalar -> doc\n block-scalar-header -> line-end -> block-scalar(min) -> line-start\n [else] -> plain-scalar(false, min) -> doc\n\nflow\n line-end -> flow\n spaces -> flow\n anchor -> flow\n tag -> flow\n flow-start -> flow -> flow\n flow-end -> .\n seq-item-start -> error -> flow\n explicit-key-start -> flow\n map-value-start -> flow\n alias -> flow\n quote-start -> quoted-scalar -> flow\n comma -> flow\n [else] -> plain-scalar(true, 0) -> flow\n\nquoted-scalar\n quote-end -> .\n [else] -> quoted-scalar\n\nblock-scalar(min)\n newline + peek(indent < min) -> .\n [else] -> block-scalar(min)\n\nplain-scalar(is-flow, min)\n scalar-end(is-flow) -> .\n peek(newline + (indent < min)) -> .\n [else] -> plain-scalar(min)\n*/\nfunction isEmpty(ch) {\n switch (ch) {\n case undefined:\n case ' ':\n case '\\n':\n case '\\r':\n case '\\t':\n return true;\n default:\n return false;\n }\n}\nconst hexDigits = new Set('0123456789ABCDEFabcdef');\nconst tagChars = new Set(\"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()\");\nconst flowIndicatorChars = new Set(',[]{}');\nconst invalidAnchorChars = new Set(' ,[]{}\\n\\r\\t');\nconst isNotAnchorChar = (ch) => !ch || invalidAnchorChars.has(ch);\n/**\n * Splits an input string into lexical tokens, i.e. smaller strings that are\n * easily identifiable by `tokens.tokenType()`.\n *\n * Lexing starts always in a \"stream\" context. Incomplete input may be buffered\n * until a complete token can be emitted.\n *\n * In addition to slices of the original input, the following control characters\n * may also be emitted:\n *\n * - `\\x02` (Start of Text): A document starts with the next token\n * - `\\x18` (Cancel): Unexpected end of flow-mode (indicates an error)\n * - `\\x1f` (Unit Separator): Next token is a scalar value\n * - `\\u{FEFF}` (Byte order mark): Emitted separately outside documents\n */\nclass Lexer {\n constructor() {\n /**\n * Flag indicating whether the end of the current buffer marks the end of\n * all input\n */\n this.atEnd = false;\n /**\n * Explicit indent set in block scalar header, as an offset from the current\n * minimum indent, so e.g. set to 1 from a header `|2+`. Set to -1 if not\n * explicitly set.\n */\n this.blockScalarIndent = -1;\n /**\n * Block scalars that include a + (keep) chomping indicator in their header\n * include trailing empty lines, which are otherwise excluded from the\n * scalar's contents.\n */\n this.blockScalarKeep = false;\n /** Current input */\n this.buffer = '';\n /**\n * Flag noting whether the map value indicator : can immediately follow this\n * node within a flow context.\n */\n this.flowKey = false;\n /** Count of surrounding flow collection levels. */\n this.flowLevel = 0;\n /**\n * Minimum level of indentation required for next lines to be parsed as a\n * part of the current scalar value.\n */\n this.indentNext = 0;\n /** Indentation level of the current line. */\n this.indentValue = 0;\n /** Position of the next \\n character. */\n this.lineEndPos = null;\n /** Stores the state of the lexer if reaching the end of incpomplete input */\n this.next = null;\n /** A pointer to `buffer`; the current position of the lexer. */\n this.pos = 0;\n }\n /**\n * Generate YAML tokens from the `source` string. If `incomplete`,\n * a part of the last line may be left as a buffer for the next call.\n *\n * @returns A generator of lexical tokens\n */\n *lex(source, incomplete = false) {\n if (source) {\n if (typeof source !== 'string')\n throw TypeError('source is not a string');\n this.buffer = this.buffer ? this.buffer + source : source;\n this.lineEndPos = null;\n }\n this.atEnd = !incomplete;\n let next = this.next ?? 'stream';\n while (next && (incomplete || this.hasChars(1)))\n next = yield* this.parseNext(next);\n }\n atLineEnd() {\n let i = this.pos;\n let ch = this.buffer[i];\n while (ch === ' ' || ch === '\\t')\n ch = this.buffer[++i];\n if (!ch || ch === '#' || ch === '\\n')\n return true;\n if (ch === '\\r')\n return this.buffer[i + 1] === '\\n';\n return false;\n }\n charAt(n) {\n return this.buffer[this.pos + n];\n }\n continueScalar(offset) {\n let ch = this.buffer[offset];\n if (this.indentNext > 0) {\n let indent = 0;\n while (ch === ' ')\n ch = this.buffer[++indent + offset];\n if (ch === '\\r') {\n const next = this.buffer[indent + offset + 1];\n if (next === '\\n' || (!next && !this.atEnd))\n return offset + indent + 1;\n }\n return ch === '\\n' || indent >= this.indentNext || (!ch && !this.atEnd)\n ? offset + indent\n : -1;\n }\n if (ch === '-' || ch === '.') {\n const dt = this.buffer.substr(offset, 3);\n if ((dt === '---' || dt === '...') && isEmpty(this.buffer[offset + 3]))\n return -1;\n }\n return offset;\n }\n getLine() {\n let end = this.lineEndPos;\n if (typeof end !== 'number' || (end !== -1 && end < this.pos)) {\n end = this.buffer.indexOf('\\n', this.pos);\n this.lineEndPos = end;\n }\n if (end === -1)\n return this.atEnd ? this.buffer.substring(this.pos) : null;\n if (this.buffer[end - 1] === '\\r')\n end -= 1;\n return this.buffer.substring(this.pos, end);\n }\n hasChars(n) {\n return this.pos + n <= this.buffer.length;\n }\n setNext(state) {\n this.buffer = this.buffer.substring(this.pos);\n this.pos = 0;\n this.lineEndPos = null;\n this.next = state;\n return null;\n }\n peek(n) {\n return this.buffer.substr(this.pos, n);\n }\n *parseNext(next) {\n switch (next) {\n case 'stream':\n return yield* this.parseStream();\n case 'line-start':\n return yield* this.parseLineStart();\n case 'block-start':\n return yield* this.parseBlockStart();\n case 'doc':\n return yield* this.parseDocument();\n case 'flow':\n return yield* this.parseFlowCollection();\n case 'quoted-scalar':\n return yield* this.parseQuotedScalar();\n case 'block-scalar':\n return yield* this.parseBlockScalar();\n case 'plain-scalar':\n return yield* this.parsePlainScalar();\n }\n }\n *parseStream() {\n let line = this.getLine();\n if (line === null)\n return this.setNext('stream');\n if (line[0] === cst.BOM) {\n yield* this.pushCount(1);\n line = line.substring(1);\n }\n if (line[0] === '%') {\n let dirEnd = line.length;\n let cs = line.indexOf('#');\n while (cs !== -1) {\n const ch = line[cs - 1];\n if (ch === ' ' || ch === '\\t') {\n dirEnd = cs - 1;\n break;\n }\n else {\n cs = line.indexOf('#', cs + 1);\n }\n }\n while (true) {\n const ch = line[dirEnd - 1];\n if (ch === ' ' || ch === '\\t')\n dirEnd -= 1;\n else\n break;\n }\n const n = (yield* this.pushCount(dirEnd)) + (yield* this.pushSpaces(true));\n yield* this.pushCount(line.length - n); // possible comment\n this.pushNewline();\n return 'stream';\n }\n if (this.atLineEnd()) {\n const sp = yield* this.pushSpaces(true);\n yield* this.pushCount(line.length - sp);\n yield* this.pushNewline();\n return 'stream';\n }\n yield cst.DOCUMENT;\n return yield* this.parseLineStart();\n }\n *parseLineStart() {\n const ch = this.charAt(0);\n if (!ch && !this.atEnd)\n return this.setNext('line-start');\n if (ch === '-' || ch === '.') {\n if (!this.atEnd && !this.hasChars(4))\n return this.setNext('line-start');\n const s = this.peek(3);\n if ((s === '---' || s === '...') && isEmpty(this.charAt(3))) {\n yield* this.pushCount(3);\n this.indentValue = 0;\n this.indentNext = 0;\n return s === '---' ? 'doc' : 'stream';\n }\n }\n this.indentValue = yield* this.pushSpaces(false);\n if (this.indentNext > this.indentValue && !isEmpty(this.charAt(1)))\n this.indentNext = this.indentValue;\n return yield* this.parseBlockStart();\n }\n *parseBlockStart() {\n const [ch0, ch1] = this.peek(2);\n if (!ch1 && !this.atEnd)\n return this.setNext('block-start');\n if ((ch0 === '-' || ch0 === '?' || ch0 === ':') && isEmpty(ch1)) {\n const n = (yield* this.pushCount(1)) + (yield* this.pushSpaces(true));\n this.indentNext = this.indentValue + 1;\n this.indentValue += n;\n return 'block-start';\n }\n return 'doc';\n }\n *parseDocument() {\n yield* this.pushSpaces(true);\n const line = this.getLine();\n if (line === null)\n return this.setNext('doc');\n let n = yield* this.pushIndicators();\n switch (line[n]) {\n case '#':\n yield* this.pushCount(line.length - n);\n // fallthrough\n case undefined:\n yield* this.pushNewline();\n return yield* this.parseLineStart();\n case '{':\n case '[':\n yield* this.pushCount(1);\n this.flowKey = false;\n this.flowLevel = 1;\n return 'flow';\n case '}':\n case ']':\n // this is an error\n yield* this.pushCount(1);\n return 'doc';\n case '*':\n yield* this.pushUntil(isNotAnchorChar);\n return 'doc';\n case '\"':\n case \"'\":\n return yield* this.parseQuotedScalar();\n case '|':\n case '>':\n n += yield* this.parseBlockScalarHeader();\n n += yield* this.pushSpaces(true);\n yield* this.pushCount(line.length - n);\n yield* this.pushNewline();\n return yield* this.parseBlockScalar();\n default:\n return yield* this.parsePlainScalar();\n }\n }\n *parseFlowCollection() {\n let nl, sp;\n let indent = -1;\n do {\n nl = yield* this.pushNewline();\n if (nl > 0) {\n sp = yield* this.pushSpaces(false);\n this.indentValue = indent = sp;\n }\n else {\n sp = 0;\n }\n sp += yield* this.pushSpaces(true);\n } while (nl + sp > 0);\n const line = this.getLine();\n if (line === null)\n return this.setNext('flow');\n if ((indent !== -1 && indent < this.indentNext && line[0] !== '#') ||\n (indent === 0 &&\n (line.startsWith('---') || line.startsWith('...')) &&\n isEmpty(line[3]))) {\n // Allowing for the terminal ] or } at the same (rather than greater)\n // indent level as the initial [ or { is technically invalid, but\n // failing here would be surprising to users.\n const atFlowEndMarker = indent === this.indentNext - 1 &&\n this.flowLevel === 1 &&\n (line[0] === ']' || line[0] === '}');\n if (!atFlowEndMarker) {\n // this is an error\n this.flowLevel = 0;\n yield cst.FLOW_END;\n return yield* this.parseLineStart();\n }\n }\n let n = 0;\n while (line[n] === ',') {\n n += yield* this.pushCount(1);\n n += yield* this.pushSpaces(true);\n this.flowKey = false;\n }\n n += yield* this.pushIndicators();\n switch (line[n]) {\n case undefined:\n return 'flow';\n case '#':\n yield* this.pushCount(line.length - n);\n return 'flow';\n case '{':\n case '[':\n yield* this.pushCount(1);\n this.flowKey = false;\n this.flowLevel += 1;\n return 'flow';\n case '}':\n case ']':\n yield* this.pushCount(1);\n this.flowKey = true;\n this.flowLevel -= 1;\n return this.flowLevel ? 'flow' : 'doc';\n case '*':\n yield* this.pushUntil(isNotAnchorChar);\n return 'flow';\n case '\"':\n case \"'\":\n this.flowKey = true;\n return yield* this.parseQuotedScalar();\n case ':': {\n const next = this.charAt(1);\n if (this.flowKey || isEmpty(next) || next === ',') {\n this.flowKey = false;\n yield* this.pushCount(1);\n yield* this.pushSpaces(true);\n return 'flow';\n }\n }\n // fallthrough\n default:\n this.flowKey = false;\n return yield* this.parsePlainScalar();\n }\n }\n *parseQuotedScalar() {\n const quote = this.charAt(0);\n let end = this.buffer.indexOf(quote, this.pos + 1);\n if (quote === \"'\") {\n while (end !== -1 && this.buffer[end + 1] === \"'\")\n end = this.buffer.indexOf(\"'\", end + 2);\n }\n else {\n // double-quote\n while (end !== -1) {\n let n = 0;\n while (this.buffer[end - 1 - n] === '\\\\')\n n += 1;\n if (n % 2 === 0)\n break;\n end = this.buffer.indexOf('\"', end + 1);\n }\n }\n // Only looking for newlines within the quotes\n const qb = this.buffer.substring(0, end);\n let nl = qb.indexOf('\\n', this.pos);\n if (nl !== -1) {\n while (nl !== -1) {\n const cs = this.continueScalar(nl + 1);\n if (cs === -1)\n break;\n nl = qb.indexOf('\\n', cs);\n }\n if (nl !== -1) {\n // this is an error caused by an unexpected unindent\n end = nl - (qb[nl - 1] === '\\r' ? 2 : 1);\n }\n }\n if (end === -1) {\n if (!this.atEnd)\n return this.setNext('quoted-scalar');\n end = this.buffer.length;\n }\n yield* this.pushToIndex(end + 1, false);\n return this.flowLevel ? 'flow' : 'doc';\n }\n *parseBlockScalarHeader() {\n this.blockScalarIndent = -1;\n this.blockScalarKeep = false;\n let i = this.pos;\n while (true) {\n const ch = this.buffer[++i];\n if (ch === '+')\n this.blockScalarKeep = true;\n else if (ch > '0' && ch <= '9')\n this.blockScalarIndent = Number(ch) - 1;\n else if (ch !== '-')\n break;\n }\n return yield* this.pushUntil(ch => isEmpty(ch) || ch === '#');\n }\n *parseBlockScalar() {\n let nl = this.pos - 1; // may be -1 if this.pos === 0\n let indent = 0;\n let ch;\n loop: for (let i = this.pos; (ch = this.buffer[i]); ++i) {\n switch (ch) {\n case ' ':\n indent += 1;\n break;\n case '\\n':\n nl = i;\n indent = 0;\n break;\n case '\\r': {\n const next = this.buffer[i + 1];\n if (!next && !this.atEnd)\n return this.setNext('block-scalar');\n if (next === '\\n')\n break;\n } // fallthrough\n default:\n break loop;\n }\n }\n if (!ch && !this.atEnd)\n return this.setNext('block-scalar');\n if (indent >= this.indentNext) {\n if (this.blockScalarIndent === -1)\n this.indentNext = indent;\n else {\n this.indentNext =\n this.blockScalarIndent + (this.indentNext === 0 ? 1 : this.indentNext);\n }\n do {\n const cs = this.continueScalar(nl + 1);\n if (cs === -1)\n break;\n nl = this.buffer.indexOf('\\n', cs);\n } while (nl !== -1);\n if (nl === -1) {\n if (!this.atEnd)\n return this.setNext('block-scalar');\n nl = this.buffer.length;\n }\n }\n // Trailing insufficiently indented tabs are invalid.\n // To catch that during parsing, we include them in the block scalar value.\n let i = nl + 1;\n ch = this.buffer[i];\n while (ch === ' ')\n ch = this.buffer[++i];\n if (ch === '\\t') {\n while (ch === '\\t' || ch === ' ' || ch === '\\r' || ch === '\\n')\n ch = this.buffer[++i];\n nl = i - 1;\n }\n else if (!this.blockScalarKeep) {\n do {\n let i = nl - 1;\n let ch = this.buffer[i];\n if (ch === '\\r')\n ch = this.buffer[--i];\n const lastChar = i; // Drop the line if last char not more indented\n while (ch === ' ')\n ch = this.buffer[--i];\n if (ch === '\\n' && i >= this.pos && i + 1 + indent > lastChar)\n nl = i;\n else\n break;\n } while (true);\n }\n yield cst.SCALAR;\n yield* this.pushToIndex(nl + 1, true);\n return yield* this.parseLineStart();\n }\n *parsePlainScalar() {\n const inFlow = this.flowLevel > 0;\n let end = this.pos - 1;\n let i = this.pos - 1;\n let ch;\n while ((ch = this.buffer[++i])) {\n if (ch === ':') {\n const next = this.buffer[i + 1];\n if (isEmpty(next) || (inFlow && flowIndicatorChars.has(next)))\n break;\n end = i;\n }\n else if (isEmpty(ch)) {\n let next = this.buffer[i + 1];\n if (ch === '\\r') {\n if (next === '\\n') {\n i += 1;\n ch = '\\n';\n next = this.buffer[i + 1];\n }\n else\n end = i;\n }\n if (next === '#' || (inFlow && flowIndicatorChars.has(next)))\n break;\n if (ch === '\\n') {\n const cs = this.continueScalar(i + 1);\n if (cs === -1)\n break;\n i = Math.max(i, cs - 2); // to advance, but still account for ' #'\n }\n }\n else {\n if (inFlow && flowIndicatorChars.has(ch))\n break;\n end = i;\n }\n }\n if (!ch && !this.atEnd)\n return this.setNext('plain-scalar');\n yield cst.SCALAR;\n yield* this.pushToIndex(end + 1, true);\n return inFlow ? 'flow' : 'doc';\n }\n *pushCount(n) {\n if (n > 0) {\n yield this.buffer.substr(this.pos, n);\n this.pos += n;\n return n;\n }\n return 0;\n }\n *pushToIndex(i, allowEmpty) {\n const s = this.buffer.slice(this.pos, i);\n if (s) {\n yield s;\n this.pos += s.length;\n return s.length;\n }\n else if (allowEmpty)\n yield '';\n return 0;\n }\n *pushIndicators() {\n let n = 0;\n loop: while (true) {\n switch (this.charAt(0)) {\n case '!':\n n += yield* this.pushTag();\n n += yield* this.pushSpaces(true);\n continue loop;\n case '&':\n n += yield* this.pushUntil(isNotAnchorChar);\n n += yield* this.pushSpaces(true);\n continue loop;\n case '-': // this is an error\n case '?': // this is an error outside flow collections\n case ':': {\n const inFlow = this.flowLevel > 0;\n const ch1 = this.charAt(1);\n if (isEmpty(ch1) || (inFlow && flowIndicatorChars.has(ch1))) {\n if (!inFlow)\n this.indentNext = this.indentValue + 1;\n else if (this.flowKey)\n this.flowKey = false;\n n += yield* this.pushCount(1);\n n += yield* this.pushSpaces(true);\n continue loop;\n }\n }\n }\n break loop;\n }\n return n;\n }\n *pushTag() {\n if (this.charAt(1) === '<') {\n let i = this.pos + 2;\n let ch = this.buffer[i];\n while (!isEmpty(ch) && ch !== '>')\n ch = this.buffer[++i];\n return yield* this.pushToIndex(ch === '>' ? i + 1 : i, false);\n }\n else {\n let i = this.pos + 1;\n let ch = this.buffer[i];\n while (ch) {\n if (tagChars.has(ch))\n ch = this.buffer[++i];\n else if (ch === '%' &&\n hexDigits.has(this.buffer[i + 1]) &&\n hexDigits.has(this.buffer[i + 2])) {\n ch = this.buffer[(i += 3)];\n }\n else\n break;\n }\n return yield* this.pushToIndex(i, false);\n }\n }\n *pushNewline() {\n const ch = this.buffer[this.pos];\n if (ch === '\\n')\n return yield* this.pushCount(1);\n else if (ch === '\\r' && this.charAt(1) === '\\n')\n return yield* this.pushCount(2);\n else\n return 0;\n }\n *pushSpaces(allowTabs) {\n let i = this.pos - 1;\n let ch;\n do {\n ch = this.buffer[++i];\n } while (ch === ' ' || (allowTabs && ch === '\\t'));\n const n = i - this.pos;\n if (n > 0) {\n yield this.buffer.substr(this.pos, n);\n this.pos = i;\n }\n return n;\n }\n *pushUntil(test) {\n let i = this.pos;\n let ch = this.buffer[i];\n while (!test(ch))\n ch = this.buffer[++i];\n return yield* this.pushToIndex(i, false);\n }\n}\n\nexports.Lexer = Lexer;\n","'use strict';\n\n/**\n * Tracks newlines during parsing in order to provide an efficient API for\n * determining the one-indexed `{ line, col }` position for any offset\n * within the input.\n */\nclass LineCounter {\n constructor() {\n this.lineStarts = [];\n /**\n * Should be called in ascending order. Otherwise, call\n * `lineCounter.lineStarts.sort()` before calling `linePos()`.\n */\n this.addNewLine = (offset) => this.lineStarts.push(offset);\n /**\n * Performs a binary search and returns the 1-indexed { line, col }\n * position of `offset`. If `line === 0`, `addNewLine` has never been\n * called or `offset` is before the first known newline.\n */\n this.linePos = (offset) => {\n let low = 0;\n let high = this.lineStarts.length;\n while (low < high) {\n const mid = (low + high) >> 1; // Math.floor((low + high) / 2)\n if (this.lineStarts[mid] < offset)\n low = mid + 1;\n else\n high = mid;\n }\n if (this.lineStarts[low] === offset)\n return { line: low + 1, col: 1 };\n if (low === 0)\n return { line: 0, col: offset };\n const start = this.lineStarts[low - 1];\n return { line: low, col: offset - start + 1 };\n };\n }\n}\n\nexports.LineCounter = LineCounter;\n","'use strict';\n\nvar node_process = require('process');\nvar cst = require('./cst.js');\nvar lexer = require('./lexer.js');\n\nfunction includesToken(list, type) {\n for (let i = 0; i < list.length; ++i)\n if (list[i].type === type)\n return true;\n return false;\n}\nfunction findNonEmptyIndex(list) {\n for (let i = 0; i < list.length; ++i) {\n switch (list[i].type) {\n case 'space':\n case 'comment':\n case 'newline':\n break;\n default:\n return i;\n }\n }\n return -1;\n}\nfunction isFlowToken(token) {\n switch (token?.type) {\n case 'alias':\n case 'scalar':\n case 'single-quoted-scalar':\n case 'double-quoted-scalar':\n case 'flow-collection':\n return true;\n default:\n return false;\n }\n}\nfunction getPrevProps(parent) {\n switch (parent.type) {\n case 'document':\n return parent.start;\n case 'block-map': {\n const it = parent.items[parent.items.length - 1];\n return it.sep ?? it.start;\n }\n case 'block-seq':\n return parent.items[parent.items.length - 1].start;\n /* istanbul ignore next should not happen */\n default:\n return [];\n }\n}\n/** Note: May modify input array */\nfunction getFirstKeyStartProps(prev) {\n if (prev.length === 0)\n return [];\n let i = prev.length;\n loop: while (--i >= 0) {\n switch (prev[i].type) {\n case 'doc-start':\n case 'explicit-key-ind':\n case 'map-value-ind':\n case 'seq-item-ind':\n case 'newline':\n break loop;\n }\n }\n while (prev[++i]?.type === 'space') {\n /* loop */\n }\n return prev.splice(i, prev.length);\n}\nfunction arrayPushArray(target, source) {\n // May exhaust call stack with large `source` array\n if (source.length < 1e5)\n Array.prototype.push.apply(target, source);\n else\n for (let i = 0; i < source.length; ++i)\n target.push(source[i]);\n}\nfunction fixFlowSeqItems(fc) {\n if (fc.start.type === 'flow-seq-start') {\n for (const it of fc.items) {\n if (it.sep &&\n !it.value &&\n !includesToken(it.start, 'explicit-key-ind') &&\n !includesToken(it.sep, 'map-value-ind')) {\n if (it.key)\n it.value = it.key;\n delete it.key;\n if (isFlowToken(it.value)) {\n if (it.value.end)\n arrayPushArray(it.value.end, it.sep);\n else\n it.value.end = it.sep;\n }\n else\n arrayPushArray(it.start, it.sep);\n delete it.sep;\n }\n }\n }\n}\n/**\n * A YAML concrete syntax tree (CST) parser\n *\n * ```ts\n * const src: string = ...\n * for (const token of new Parser().parse(src)) {\n * // token: Token\n * }\n * ```\n *\n * To use the parser with a user-provided lexer:\n *\n * ```ts\n * function* parse(source: string, lexer: Lexer) {\n * const parser = new Parser()\n * for (const lexeme of lexer.lex(source))\n * yield* parser.next(lexeme)\n * yield* parser.end()\n * }\n *\n * const src: string = ...\n * const lexer = new Lexer()\n * for (const token of parse(src, lexer)) {\n * // token: Token\n * }\n * ```\n */\nclass Parser {\n /**\n * @param onNewLine - If defined, called separately with the start position of\n * each new line (in `parse()`, including the start of input).\n */\n constructor(onNewLine) {\n /** If true, space and sequence indicators count as indentation */\n this.atNewLine = true;\n /** If true, next token is a scalar value */\n this.atScalar = false;\n /** Current indentation level */\n this.indent = 0;\n /** Current offset since the start of parsing */\n this.offset = 0;\n /** On the same line with a block map key */\n this.onKeyLine = false;\n /** Top indicates the node that's currently being built */\n this.stack = [];\n /** The source of the current token, set in parse() */\n this.source = '';\n /** The type of the current token, set in parse() */\n this.type = '';\n // Must be defined after `next()`\n this.lexer = new lexer.Lexer();\n this.onNewLine = onNewLine;\n }\n /**\n * Parse `source` as a YAML stream.\n * If `incomplete`, a part of the last line may be left as a buffer for the next call.\n *\n * Errors are not thrown, but yielded as `{ type: 'error', message }` tokens.\n *\n * @returns A generator of tokens representing each directive, document, and other structure.\n */\n *parse(source, incomplete = false) {\n if (this.onNewLine && this.offset === 0)\n this.onNewLine(0);\n for (const lexeme of this.lexer.lex(source, incomplete))\n yield* this.next(lexeme);\n if (!incomplete)\n yield* this.end();\n }\n /**\n * Advance the parser by the `source` of one lexical token.\n */\n *next(source) {\n this.source = source;\n if (node_process.env.LOG_TOKENS)\n console.log('|', cst.prettyToken(source));\n if (this.atScalar) {\n this.atScalar = false;\n yield* this.step();\n this.offset += source.length;\n return;\n }\n const type = cst.tokenType(source);\n if (!type) {\n const message = `Not a YAML token: ${source}`;\n yield* this.pop({ type: 'error', offset: this.offset, message, source });\n this.offset += source.length;\n }\n else if (type === 'scalar') {\n this.atNewLine = false;\n this.atScalar = true;\n this.type = 'scalar';\n }\n else {\n this.type = type;\n yield* this.step();\n switch (type) {\n case 'newline':\n this.atNewLine = true;\n this.indent = 0;\n if (this.onNewLine)\n this.onNewLine(this.offset + source.length);\n break;\n case 'space':\n if (this.atNewLine && source[0] === ' ')\n this.indent += source.length;\n break;\n case 'explicit-key-ind':\n case 'map-value-ind':\n case 'seq-item-ind':\n if (this.atNewLine)\n this.indent += source.length;\n break;\n case 'doc-mode':\n case 'flow-error-end':\n return;\n default:\n this.atNewLine = false;\n }\n this.offset += source.length;\n }\n }\n /** Call at end of input to push out any remaining constructions */\n *end() {\n while (this.stack.length > 0)\n yield* this.pop();\n }\n get sourceToken() {\n const st = {\n type: this.type,\n offset: this.offset,\n indent: this.indent,\n source: this.source\n };\n return st;\n }\n *step() {\n const top = this.peek(1);\n if (this.type === 'doc-end' && top?.type !== 'doc-end') {\n while (this.stack.length > 0)\n yield* this.pop();\n this.stack.push({\n type: 'doc-end',\n offset: this.offset,\n source: this.source\n });\n return;\n }\n if (!top)\n return yield* this.stream();\n switch (top.type) {\n case 'document':\n return yield* this.document(top);\n case 'alias':\n case 'scalar':\n case 'single-quoted-scalar':\n case 'double-quoted-scalar':\n return yield* this.scalar(top);\n case 'block-scalar':\n return yield* this.blockScalar(top);\n case 'block-map':\n return yield* this.blockMap(top);\n case 'block-seq':\n return yield* this.blockSequence(top);\n case 'flow-collection':\n return yield* this.flowCollection(top);\n case 'doc-end':\n return yield* this.documentEnd(top);\n }\n /* istanbul ignore next should not happen */\n yield* this.pop();\n }\n peek(n) {\n return this.stack[this.stack.length - n];\n }\n *pop(error) {\n const token = error ?? this.stack.pop();\n /* istanbul ignore if should not happen */\n if (!token) {\n const message = 'Tried to pop an empty stack';\n yield { type: 'error', offset: this.offset, source: '', message };\n }\n else if (this.stack.length === 0) {\n yield token;\n }\n else {\n const top = this.peek(1);\n if (token.type === 'block-scalar') {\n // Block scalars use their parent rather than header indent\n token.indent = 'indent' in top ? top.indent : 0;\n }\n else if (token.type === 'flow-collection' && top.type === 'document') {\n // Ignore all indent for top-level flow collections\n token.indent = 0;\n }\n if (token.type === 'flow-collection')\n fixFlowSeqItems(token);\n switch (top.type) {\n case 'document':\n top.value = token;\n break;\n case 'block-scalar':\n top.props.push(token); // error\n break;\n case 'block-map': {\n const it = top.items[top.items.length - 1];\n if (it.value) {\n top.items.push({ start: [], key: token, sep: [] });\n this.onKeyLine = true;\n return;\n }\n else if (it.sep) {\n it.value = token;\n }\n else {\n Object.assign(it, { key: token, sep: [] });\n this.onKeyLine = !it.explicitKey;\n return;\n }\n break;\n }\n case 'block-seq': {\n const it = top.items[top.items.length - 1];\n if (it.value)\n top.items.push({ start: [], value: token });\n else\n it.value = token;\n break;\n }\n case 'flow-collection': {\n const it = top.items[top.items.length - 1];\n if (!it || it.value)\n top.items.push({ start: [], key: token, sep: [] });\n else if (it.sep)\n it.value = token;\n else\n Object.assign(it, { key: token, sep: [] });\n return;\n }\n /* istanbul ignore next should not happen */\n default:\n yield* this.pop();\n yield* this.pop(token);\n }\n if ((top.type === 'document' ||\n top.type === 'block-map' ||\n top.type === 'block-seq') &&\n (token.type === 'block-map' || token.type === 'block-seq')) {\n const last = token.items[token.items.length - 1];\n if (last &&\n !last.sep &&\n !last.value &&\n last.start.length > 0 &&\n findNonEmptyIndex(last.start) === -1 &&\n (token.indent === 0 ||\n last.start.every(st => st.type !== 'comment' || st.indent < token.indent))) {\n if (top.type === 'document')\n top.end = last.start;\n else\n top.items.push({ start: last.start });\n token.items.splice(-1, 1);\n }\n }\n }\n }\n *stream() {\n switch (this.type) {\n case 'directive-line':\n yield { type: 'directive', offset: this.offset, source: this.source };\n return;\n case 'byte-order-mark':\n case 'space':\n case 'comment':\n case 'newline':\n yield this.sourceToken;\n return;\n case 'doc-mode':\n case 'doc-start': {\n const doc = {\n type: 'document',\n offset: this.offset,\n start: []\n };\n if (this.type === 'doc-start')\n doc.start.push(this.sourceToken);\n this.stack.push(doc);\n return;\n }\n }\n yield {\n type: 'error',\n offset: this.offset,\n message: `Unexpected ${this.type} token in YAML stream`,\n source: this.source\n };\n }\n *document(doc) {\n if (doc.value)\n return yield* this.lineEnd(doc);\n switch (this.type) {\n case 'doc-start': {\n if (findNonEmptyIndex(doc.start) !== -1) {\n yield* this.pop();\n yield* this.step();\n }\n else\n doc.start.push(this.sourceToken);\n return;\n }\n case 'anchor':\n case 'tag':\n case 'space':\n case 'comment':\n case 'newline':\n doc.start.push(this.sourceToken);\n return;\n }\n const bv = this.startBlockValue(doc);\n if (bv)\n this.stack.push(bv);\n else {\n yield {\n type: 'error',\n offset: this.offset,\n message: `Unexpected ${this.type} token in YAML document`,\n source: this.source\n };\n }\n }\n *scalar(scalar) {\n if (this.type === 'map-value-ind') {\n const prev = getPrevProps(this.peek(2));\n const start = getFirstKeyStartProps(prev);\n let sep;\n if (scalar.end) {\n sep = scalar.end;\n sep.push(this.sourceToken);\n delete scalar.end;\n }\n else\n sep = [this.sourceToken];\n const map = {\n type: 'block-map',\n offset: scalar.offset,\n indent: scalar.indent,\n items: [{ start, key: scalar, sep }]\n };\n this.onKeyLine = true;\n this.stack[this.stack.length - 1] = map;\n }\n else\n yield* this.lineEnd(scalar);\n }\n *blockScalar(scalar) {\n switch (this.type) {\n case 'space':\n case 'comment':\n case 'newline':\n scalar.props.push(this.sourceToken);\n return;\n case 'scalar':\n scalar.source = this.source;\n // block-scalar source includes trailing newline\n this.atNewLine = true;\n this.indent = 0;\n if (this.onNewLine) {\n let nl = this.source.indexOf('\\n') + 1;\n while (nl !== 0) {\n this.onNewLine(this.offset + nl);\n nl = this.source.indexOf('\\n', nl) + 1;\n }\n }\n yield* this.pop();\n break;\n /* istanbul ignore next should not happen */\n default:\n yield* this.pop();\n yield* this.step();\n }\n }\n *blockMap(map) {\n const it = map.items[map.items.length - 1];\n // it.sep is true-ish if pair already has key or : separator\n switch (this.type) {\n case 'newline':\n this.onKeyLine = false;\n if (it.value) {\n const end = 'end' in it.value ? it.value.end : undefined;\n const last = Array.isArray(end) ? end[end.length - 1] : undefined;\n if (last?.type === 'comment')\n end?.push(this.sourceToken);\n else\n map.items.push({ start: [this.sourceToken] });\n }\n else if (it.sep) {\n it.sep.push(this.sourceToken);\n }\n else {\n it.start.push(this.sourceToken);\n }\n return;\n case 'space':\n case 'comment':\n if (it.value) {\n map.items.push({ start: [this.sourceToken] });\n }\n else if (it.sep) {\n it.sep.push(this.sourceToken);\n }\n else {\n if (this.atIndentedComment(it.start, map.indent)) {\n const prev = map.items[map.items.length - 2];\n const end = prev?.value?.end;\n if (Array.isArray(end)) {\n arrayPushArray(end, it.start);\n end.push(this.sourceToken);\n map.items.pop();\n return;\n }\n }\n it.start.push(this.sourceToken);\n }\n return;\n }\n if (this.indent >= map.indent) {\n const atMapIndent = !this.onKeyLine && this.indent === map.indent;\n const atNextItem = atMapIndent &&\n (it.sep || it.explicitKey) &&\n this.type !== 'seq-item-ind';\n // For empty nodes, assign newline-separated not indented empty tokens to following node\n let start = [];\n if (atNextItem && it.sep && !it.value) {\n const nl = [];\n for (let i = 0; i < it.sep.length; ++i) {\n const st = it.sep[i];\n switch (st.type) {\n case 'newline':\n nl.push(i);\n break;\n case 'space':\n break;\n case 'comment':\n if (st.indent > map.indent)\n nl.length = 0;\n break;\n default:\n nl.length = 0;\n }\n }\n if (nl.length >= 2)\n start = it.sep.splice(nl[1]);\n }\n switch (this.type) {\n case 'anchor':\n case 'tag':\n if (atNextItem || it.value) {\n start.push(this.sourceToken);\n map.items.push({ start });\n this.onKeyLine = true;\n }\n else if (it.sep) {\n it.sep.push(this.sourceToken);\n }\n else {\n it.start.push(this.sourceToken);\n }\n return;\n case 'explicit-key-ind':\n if (!it.sep && !it.explicitKey) {\n it.start.push(this.sourceToken);\n it.explicitKey = true;\n }\n else if (atNextItem || it.value) {\n start.push(this.sourceToken);\n map.items.push({ start, explicitKey: true });\n }\n else {\n this.stack.push({\n type: 'block-map',\n offset: this.offset,\n indent: this.indent,\n items: [{ start: [this.sourceToken], explicitKey: true }]\n });\n }\n this.onKeyLine = true;\n return;\n case 'map-value-ind':\n if (it.explicitKey) {\n if (!it.sep) {\n if (includesToken(it.start, 'newline')) {\n Object.assign(it, { key: null, sep: [this.sourceToken] });\n }\n else {\n const start = getFirstKeyStartProps(it.start);\n this.stack.push({\n type: 'block-map',\n offset: this.offset,\n indent: this.indent,\n items: [{ start, key: null, sep: [this.sourceToken] }]\n });\n }\n }\n else if (it.value) {\n map.items.push({ start: [], key: null, sep: [this.sourceToken] });\n }\n else if (includesToken(it.sep, 'map-value-ind')) {\n this.stack.push({\n type: 'block-map',\n offset: this.offset,\n indent: this.indent,\n items: [{ start, key: null, sep: [this.sourceToken] }]\n });\n }\n else if (isFlowToken(it.key) &&\n !includesToken(it.sep, 'newline')) {\n const start = getFirstKeyStartProps(it.start);\n const key = it.key;\n const sep = it.sep;\n sep.push(this.sourceToken);\n // @ts-expect-error type guard is wrong here\n delete it.key;\n // @ts-expect-error type guard is wrong here\n delete it.sep;\n this.stack.push({\n type: 'block-map',\n offset: this.offset,\n indent: this.indent,\n items: [{ start, key, sep }]\n });\n }\n else if (start.length > 0) {\n // Not actually at next item\n it.sep = it.sep.concat(start, this.sourceToken);\n }\n else {\n it.sep.push(this.sourceToken);\n }\n }\n else {\n if (!it.sep) {\n Object.assign(it, { key: null, sep: [this.sourceToken] });\n }\n else if (it.value || atNextItem) {\n map.items.push({ start, key: null, sep: [this.sourceToken] });\n }\n else if (includesToken(it.sep, 'map-value-ind')) {\n this.stack.push({\n type: 'block-map',\n offset: this.offset,\n indent: this.indent,\n items: [{ start: [], key: null, sep: [this.sourceToken] }]\n });\n }\n else {\n it.sep.push(this.sourceToken);\n }\n }\n this.onKeyLine = true;\n return;\n case 'alias':\n case 'scalar':\n case 'single-quoted-scalar':\n case 'double-quoted-scalar': {\n const fs = this.flowScalar(this.type);\n if (atNextItem || it.value) {\n map.items.push({ start, key: fs, sep: [] });\n this.onKeyLine = true;\n }\n else if (it.sep) {\n this.stack.push(fs);\n }\n else {\n Object.assign(it, { key: fs, sep: [] });\n this.onKeyLine = true;\n }\n return;\n }\n default: {\n const bv = this.startBlockValue(map);\n if (bv) {\n if (bv.type === 'block-seq') {\n if (!it.explicitKey &&\n it.sep &&\n !includesToken(it.sep, 'newline')) {\n yield* this.pop({\n type: 'error',\n offset: this.offset,\n message: 'Unexpected block-seq-ind on same line with key',\n source: this.source\n });\n return;\n }\n }\n else if (atMapIndent) {\n map.items.push({ start });\n }\n this.stack.push(bv);\n return;\n }\n }\n }\n }\n yield* this.pop();\n yield* this.step();\n }\n *blockSequence(seq) {\n const it = seq.items[seq.items.length - 1];\n switch (this.type) {\n case 'newline':\n if (it.value) {\n const end = 'end' in it.value ? it.value.end : undefined;\n const last = Array.isArray(end) ? end[end.length - 1] : undefined;\n if (last?.type === 'comment')\n end?.push(this.sourceToken);\n else\n seq.items.push({ start: [this.sourceToken] });\n }\n else\n it.start.push(this.sourceToken);\n return;\n case 'space':\n case 'comment':\n if (it.value)\n seq.items.push({ start: [this.sourceToken] });\n else {\n if (this.atIndentedComment(it.start, seq.indent)) {\n const prev = seq.items[seq.items.length - 2];\n const end = prev?.value?.end;\n if (Array.isArray(end)) {\n arrayPushArray(end, it.start);\n end.push(this.sourceToken);\n seq.items.pop();\n return;\n }\n }\n it.start.push(this.sourceToken);\n }\n return;\n case 'anchor':\n case 'tag':\n if (it.value || this.indent <= seq.indent)\n break;\n it.start.push(this.sourceToken);\n return;\n case 'seq-item-ind':\n if (this.indent !== seq.indent)\n break;\n if (it.value || includesToken(it.start, 'seq-item-ind'))\n seq.items.push({ start: [this.sourceToken] });\n else\n it.start.push(this.sourceToken);\n return;\n }\n if (this.indent > seq.indent) {\n const bv = this.startBlockValue(seq);\n if (bv) {\n this.stack.push(bv);\n return;\n }\n }\n yield* this.pop();\n yield* this.step();\n }\n *flowCollection(fc) {\n const it = fc.items[fc.items.length - 1];\n if (this.type === 'flow-error-end') {\n let top;\n do {\n yield* this.pop();\n top = this.peek(1);\n } while (top?.type === 'flow-collection');\n }\n else if (fc.end.length === 0) {\n switch (this.type) {\n case 'comma':\n case 'explicit-key-ind':\n if (!it || it.sep)\n fc.items.push({ start: [this.sourceToken] });\n else\n it.start.push(this.sourceToken);\n return;\n case 'map-value-ind':\n if (!it || it.value)\n fc.items.push({ start: [], key: null, sep: [this.sourceToken] });\n else if (it.sep)\n it.sep.push(this.sourceToken);\n else\n Object.assign(it, { key: null, sep: [this.sourceToken] });\n return;\n case 'space':\n case 'comment':\n case 'newline':\n case 'anchor':\n case 'tag':\n if (!it || it.value)\n fc.items.push({ start: [this.sourceToken] });\n else if (it.sep)\n it.sep.push(this.sourceToken);\n else\n it.start.push(this.sourceToken);\n return;\n case 'alias':\n case 'scalar':\n case 'single-quoted-scalar':\n case 'double-quoted-scalar': {\n const fs = this.flowScalar(this.type);\n if (!it || it.value)\n fc.items.push({ start: [], key: fs, sep: [] });\n else if (it.sep)\n this.stack.push(fs);\n else\n Object.assign(it, { key: fs, sep: [] });\n return;\n }\n case 'flow-map-end':\n case 'flow-seq-end':\n fc.end.push(this.sourceToken);\n return;\n }\n const bv = this.startBlockValue(fc);\n /* istanbul ignore else should not happen */\n if (bv)\n this.stack.push(bv);\n else {\n yield* this.pop();\n yield* this.step();\n }\n }\n else {\n const parent = this.peek(2);\n if (parent.type === 'block-map' &&\n ((this.type === 'map-value-ind' && parent.indent === fc.indent) ||\n (this.type === 'newline' &&\n !parent.items[parent.items.length - 1].sep))) {\n yield* this.pop();\n yield* this.step();\n }\n else if (this.type === 'map-value-ind' &&\n parent.type !== 'flow-collection') {\n const prev = getPrevProps(parent);\n const start = getFirstKeyStartProps(prev);\n fixFlowSeqItems(fc);\n const sep = fc.end.splice(1, fc.end.length);\n sep.push(this.sourceToken);\n const map = {\n type: 'block-map',\n offset: fc.offset,\n indent: fc.indent,\n items: [{ start, key: fc, sep }]\n };\n this.onKeyLine = true;\n this.stack[this.stack.length - 1] = map;\n }\n else {\n yield* this.lineEnd(fc);\n }\n }\n }\n flowScalar(type) {\n if (this.onNewLine) {\n let nl = this.source.indexOf('\\n') + 1;\n while (nl !== 0) {\n this.onNewLine(this.offset + nl);\n nl = this.source.indexOf('\\n', nl) + 1;\n }\n }\n return {\n type,\n offset: this.offset,\n indent: this.indent,\n source: this.source\n };\n }\n startBlockValue(parent) {\n switch (this.type) {\n case 'alias':\n case 'scalar':\n case 'single-quoted-scalar':\n case 'double-quoted-scalar':\n return this.flowScalar(this.type);\n case 'block-scalar-header':\n return {\n type: 'block-scalar',\n offset: this.offset,\n indent: this.indent,\n props: [this.sourceToken],\n source: ''\n };\n case 'flow-map-start':\n case 'flow-seq-start':\n return {\n type: 'flow-collection',\n offset: this.offset,\n indent: this.indent,\n start: this.sourceToken,\n items: [],\n end: []\n };\n case 'seq-item-ind':\n return {\n type: 'block-seq',\n offset: this.offset,\n indent: this.indent,\n items: [{ start: [this.sourceToken] }]\n };\n case 'explicit-key-ind': {\n this.onKeyLine = true;\n const prev = getPrevProps(parent);\n const start = getFirstKeyStartProps(prev);\n start.push(this.sourceToken);\n return {\n type: 'block-map',\n offset: this.offset,\n indent: this.indent,\n items: [{ start, explicitKey: true }]\n };\n }\n case 'map-value-ind': {\n this.onKeyLine = true;\n const prev = getPrevProps(parent);\n const start = getFirstKeyStartProps(prev);\n return {\n type: 'block-map',\n offset: this.offset,\n indent: this.indent,\n items: [{ start, key: null, sep: [this.sourceToken] }]\n };\n }\n }\n return null;\n }\n atIndentedComment(start, indent) {\n if (this.type !== 'comment')\n return false;\n if (this.indent <= indent)\n return false;\n return start.every(st => st.type === 'newline' || st.type === 'space');\n }\n *documentEnd(docEnd) {\n if (this.type !== 'doc-mode') {\n if (docEnd.end)\n docEnd.end.push(this.sourceToken);\n else\n docEnd.end = [this.sourceToken];\n if (this.type === 'newline')\n yield* this.pop();\n }\n }\n *lineEnd(token) {\n switch (this.type) {\n case 'comma':\n case 'doc-start':\n case 'doc-end':\n case 'flow-seq-end':\n case 'flow-map-end':\n case 'map-value-ind':\n yield* this.pop();\n yield* this.step();\n break;\n case 'newline':\n this.onKeyLine = false;\n // fallthrough\n case 'space':\n case 'comment':\n default:\n // all other values are errors\n if (token.end)\n token.end.push(this.sourceToken);\n else\n token.end = [this.sourceToken];\n if (this.type === 'newline')\n yield* this.pop();\n }\n }\n}\n\nexports.Parser = Parser;\n","'use strict';\n\nvar composer = require('./compose/composer.js');\nvar Document = require('./doc/Document.js');\nvar errors = require('./errors.js');\nvar log = require('./log.js');\nvar identity = require('./nodes/identity.js');\nvar lineCounter = require('./parse/line-counter.js');\nvar parser = require('./parse/parser.js');\n\nfunction parseOptions(options) {\n const prettyErrors = options.prettyErrors !== false;\n const lineCounter$1 = options.lineCounter || (prettyErrors && new lineCounter.LineCounter()) || null;\n return { lineCounter: lineCounter$1, prettyErrors };\n}\n/**\n * Parse the input as a stream of YAML documents.\n *\n * Documents should be separated from each other by `...` or `---` marker lines.\n *\n * @returns If an empty `docs` array is returned, it will be of type\n * EmptyStream and contain additional stream information. In\n * TypeScript, you should use `'empty' in docs` as a type guard for it.\n */\nfunction parseAllDocuments(source, options = {}) {\n const { lineCounter, prettyErrors } = parseOptions(options);\n const parser$1 = new parser.Parser(lineCounter?.addNewLine);\n const composer$1 = new composer.Composer(options);\n const docs = Array.from(composer$1.compose(parser$1.parse(source)));\n if (prettyErrors && lineCounter)\n for (const doc of docs) {\n doc.errors.forEach(errors.prettifyError(source, lineCounter));\n doc.warnings.forEach(errors.prettifyError(source, lineCounter));\n }\n if (docs.length > 0)\n return docs;\n return Object.assign([], { empty: true }, composer$1.streamInfo());\n}\n/** Parse an input string into a single YAML.Document */\nfunction parseDocument(source, options = {}) {\n const { lineCounter, prettyErrors } = parseOptions(options);\n const parser$1 = new parser.Parser(lineCounter?.addNewLine);\n const composer$1 = new composer.Composer(options);\n // `doc` is always set by compose.end(true) at the very latest\n let doc = null;\n for (const _doc of composer$1.compose(parser$1.parse(source), true, source.length)) {\n if (!doc)\n doc = _doc;\n else if (doc.options.logLevel !== 'silent') {\n doc.errors.push(new errors.YAMLParseError(_doc.range.slice(0, 2), 'MULTIPLE_DOCS', 'Source contains multiple documents; please use YAML.parseAllDocuments()'));\n break;\n }\n }\n if (prettyErrors && lineCounter) {\n doc.errors.forEach(errors.prettifyError(source, lineCounter));\n doc.warnings.forEach(errors.prettifyError(source, lineCounter));\n }\n return doc;\n}\nfunction parse(src, reviver, options) {\n let _reviver = undefined;\n if (typeof reviver === 'function') {\n _reviver = reviver;\n }\n else if (options === undefined && reviver && typeof reviver === 'object') {\n options = reviver;\n }\n const doc = parseDocument(src, options);\n if (!doc)\n return null;\n doc.warnings.forEach(warning => log.warn(doc.options.logLevel, warning));\n if (doc.errors.length > 0) {\n if (doc.options.logLevel !== 'silent')\n throw doc.errors[0];\n else\n doc.errors = [];\n }\n return doc.toJS(Object.assign({ reviver: _reviver }, options));\n}\nfunction stringify(value, replacer, options) {\n let _replacer = null;\n if (typeof replacer === 'function' || Array.isArray(replacer)) {\n _replacer = replacer;\n }\n else if (options === undefined && replacer) {\n options = replacer;\n }\n if (typeof options === 'string')\n options = options.length;\n if (typeof options === 'number') {\n const indent = Math.round(options);\n options = indent < 1 ? undefined : indent > 8 ? { indent: 8 } : { indent };\n }\n if (value === undefined) {\n const { keepUndefined } = options ?? replacer ?? {};\n if (!keepUndefined)\n return undefined;\n }\n if (identity.isDocument(value) && !_replacer)\n return value.toString(options);\n return new Document.Document(value, _replacer, options).toString(options);\n}\n\nexports.parse = parse;\nexports.parseAllDocuments = parseAllDocuments;\nexports.parseDocument = parseDocument;\nexports.stringify = stringify;\n","'use strict';\n\nvar composer = require('./compose/composer.js');\nvar Document = require('./doc/Document.js');\nvar Schema = require('./schema/Schema.js');\nvar errors = require('./errors.js');\nvar Alias = require('./nodes/Alias.js');\nvar identity = require('./nodes/identity.js');\nvar Pair = require('./nodes/Pair.js');\nvar Scalar = require('./nodes/Scalar.js');\nvar YAMLMap = require('./nodes/YAMLMap.js');\nvar YAMLSeq = require('./nodes/YAMLSeq.js');\nvar cst = require('./parse/cst.js');\nvar lexer = require('./parse/lexer.js');\nvar lineCounter = require('./parse/line-counter.js');\nvar parser = require('./parse/parser.js');\nvar publicApi = require('./public-api.js');\nvar visit = require('./visit.js');\n\n\n\nexports.Composer = composer.Composer;\nexports.Document = Document.Document;\nexports.Schema = Schema.Schema;\nexports.YAMLError = errors.YAMLError;\nexports.YAMLParseError = errors.YAMLParseError;\nexports.YAMLWarning = errors.YAMLWarning;\nexports.Alias = Alias.Alias;\nexports.isAlias = identity.isAlias;\nexports.isCollection = identity.isCollection;\nexports.isDocument = identity.isDocument;\nexports.isMap = identity.isMap;\nexports.isNode = identity.isNode;\nexports.isPair = identity.isPair;\nexports.isScalar = identity.isScalar;\nexports.isSeq = identity.isSeq;\nexports.Pair = Pair.Pair;\nexports.Scalar = Scalar.Scalar;\nexports.YAMLMap = YAMLMap.YAMLMap;\nexports.YAMLSeq = YAMLSeq.YAMLSeq;\nexports.CST = cst;\nexports.Lexer = lexer.Lexer;\nexports.LineCounter = lineCounter.LineCounter;\nexports.Parser = parser.Parser;\nexports.parse = publicApi.parse;\nexports.parseAllDocuments = publicApi.parseAllDocuments;\nexports.parseDocument = publicApi.parseDocument;\nexports.stringify = publicApi.stringify;\nexports.visit = visit.visit;\nexports.visitAsync = visit.visitAsync;\n","/** Process I/O, injectable so commands are testable in-process. */\nexport interface Io {\n cwd: string;\n env: Record<string, string | undefined>;\n out(text: string): void;\n err(text: string): void;\n /** Node version used for engine checks. */\n nodeVersion: string;\n}\n\nexport function processIo(): Io {\n return {\n cwd: process.cwd(),\n env: process.env,\n out: (t) => process.stdout.write(`${t}\\n`),\n err: (t) => process.stderr.write(`${t}\\n`),\n nodeVersion: process.versions.node,\n };\n}\n\n/** Bufferless capture for tests. */\nexport function captureIo(cwd: string, env: Record<string, string | undefined> = {}) {\n const stdout: string[] = [];\n const stderr: string[] = [];\n const io: Io = {\n cwd,\n env,\n out: (t) => stdout.push(t),\n err: (t) => stderr.push(t),\n nodeVersion: process.versions.node,\n };\n return { io, stdout, stderr, text: () => stdout.join(\"\\n\"), errText: () => stderr.join(\"\\n\") };\n}\n\n/** Colour is opt-in: a TTY, no NO_COLOR, not dumb. Output is plain text otherwise. */\nexport function colorEnabled(io: Io, isTTY = Boolean(process.stdout.isTTY)): boolean {\n if (io.env.NO_COLOR !== undefined && io.env.NO_COLOR !== \"\") return false;\n if (io.env.TERM === \"dumb\") return false;\n return isTTY;\n}\n\nexport function paint(enabled: boolean, code: number, text: string): string {\n return enabled ? `\\u001b[${code}m${text}\\u001b[0m` : text;\n}\n\n/** Thrown by a command to end with a message and a non-zero exit code. */\nexport class CliError extends Error {\n constructor(\n message: string,\n readonly exitCode = 1,\n ) {\n super(message);\n this.name = \"CliError\";\n }\n}\n","/**\n * `openspace check` (arch §7.1, GC12): everything that must be true before a site is published.\n * Pure over the files in a checkout — no network, no Astro — so it runs in CI in seconds.\n */\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { blocksRegistry } from \"@omniharmonic/openspace-blocks\";\nimport {\n findBrokenLinks,\n isMediaPath,\n LinkTargets,\n type MediaMeta,\n type SiteDocument,\n SiteDocumentSchema,\n scanForSecrets,\n} from \"@omniharmonic/openspace-schema\";\nimport {\n COLLECTION_CONFIG_FILE,\n COLLECTIONS_DIR,\n CONFIG_FILE,\n ITEM_EXT,\n loadSite,\n MEDIA_FILE,\n PAGES_DIR,\n SITE_FILE,\n SiteContentError,\n STYLES_FILE,\n} from \"@omniharmonic/openspace-site-kit/content\";\n\nexport type Severity = \"error\" | \"warning\";\nexport type CheckRule =\n | \"schema\"\n | \"block\"\n | \"link\"\n | \"redirect\"\n | \"image\"\n | \"media\"\n | \"size\"\n | \"secret\"\n | \"gating\";\n\nexport interface Finding {\n severity: Severity;\n rule: CheckRule;\n /** Repo-relative file the finding is in. */\n file: string;\n /** Location inside the file's JSON value (dot path), when known. */\n path?: string;\n /** 1-based line, when known (secrets). */\n line?: number;\n message: string;\n}\n\nexport interface Budgets {\n /** `media/` total at which a warning is shown (arch §5.6: 600 MB). */\n mediaWarnBytes: number;\n /** `media/` total above which the check fails (900 MB). */\n mediaFailBytes: number;\n /** Longest image edge in px (the upload pipeline's cap). */\n maxImageEdge: number;\n /** GitHub rejects single files over 100 MB. */\n maxFileBytes: number;\n}\n\nconst MB = 1024 * 1024;\nexport const DEFAULT_BUDGETS: Budgets = {\n mediaWarnBytes: 600 * MB,\n mediaFailBytes: 900 * MB,\n maxImageEdge: 2400,\n maxFileBytes: 100 * MB,\n};\n\nexport interface CheckOptions {\n budgets?: Partial<Budgets>;\n}\n\nexport interface CheckReport {\n ok: boolean;\n errors: number;\n warnings: number;\n findings: Finding[];\n stats: {\n pages: number;\n items: number;\n mediaFiles: number;\n mediaBytes: number;\n filesScanned: number;\n };\n}\n\nasync function listFiles(root: string, dir: string, includeDot = false): Promise<string[]> {\n const out: string[] = [];\n let entries: import(\"node:fs\").Dirent[];\n try {\n entries = await readdir(join(root, dir), { withFileTypes: true });\n } catch {\n return out;\n }\n for (const e of entries.sort((a, b) => a.name.localeCompare(b.name))) {\n if (!includeDot && e.name.startsWith(\".\")) continue;\n const rel = `${dir}/${e.name}`;\n if (e.isDirectory()) out.push(...(await listFiles(root, rel, includeDot)));\n else if (e.isFile()) out.push(rel);\n }\n return out;\n}\n\nconst dotPath = (path: readonly (string | number | symbol)[]) =>\n path.map((p) => String(p)).join(\".\");\n\n/** Repo file a `SiteDocument` path lives in. */\nfunction fileForDocPath(\n path: readonly (string | number | symbol)[],\n pageFiles: Record<string, string>,\n): string {\n const [head, a, b] = path.map((p) => String(p));\n switch (head) {\n case \"config\":\n return CONFIG_FILE;\n case \"site\":\n return SITE_FILE;\n case \"styles\":\n return STYLES_FILE;\n case \"media\":\n return MEDIA_FILE;\n case \"pages\":\n return (a && pageFiles[a]) || PAGES_DIR;\n case \"collections\":\n return b === undefined\n ? `${COLLECTIONS_DIR}/${a}`\n : `${COLLECTIONS_DIR}/${a}/${b}${ITEM_EXT}`;\n case \"collectionConfigs\":\n return `${COLLECTIONS_DIR}/${a}/${COLLECTION_CONFIG_FILE}`;\n default:\n return \"content\";\n }\n}\n\n/** How many leading doc-path segments name the file (the rest is the path inside it). */\nfunction fileDepth(path: readonly (string | number | symbol)[]): number {\n switch (String(path[0])) {\n case \"pages\":\n case \"media\":\n case \"collectionConfigs\":\n return 2;\n case \"collections\":\n return 3;\n default:\n return 1;\n }\n}\n\nconst IMAGE_EXT_RE = /\\.(?:jpe?g|png|gif|webp|avif|svg)$/i;\nconst MEDIA_REF_RE = /(?<![\\w/.:-])media\\/[A-Za-z0-9_\\-./]+\\.[A-Za-z0-9]+/g;\nexport async function runCheck(root: string, options: CheckOptions = {}): Promise<CheckReport> {\n const budgets: Budgets = { ...DEFAULT_BUDGETS, ...options.budgets };\n const findings: Finding[] = [];\n const add = (f: Finding) => {\n const key = `${f.severity}|${f.rule}|${f.file}|${f.path ?? \"\"}|${f.line ?? \"\"}|${f.message}`;\n if (seen.has(key)) return;\n seen.add(key);\n findings.push(f);\n };\n const seen = new Set<string>();\n const stats: CheckReport[\"stats\"] = {\n pages: 0,\n items: 0,\n mediaFiles: 0,\n mediaBytes: 0,\n filesScanned: 0,\n };\n\n // --- load + schema ------------------------------------------------------------------------\n let doc: SiteDocument | undefined;\n let pageFiles: Record<string, string> = {};\n try {\n const loaded = await loadSite(root, { validate: false });\n doc = loaded.doc;\n pageFiles = loaded.pageFiles;\n } catch (e) {\n if (e instanceof SiteContentError) {\n for (const i of e.issues)\n add({\n severity: \"error\",\n rule: \"schema\",\n file: i.file,\n path: dotPath(i.path) || undefined,\n message: i.message,\n });\n } else {\n add({ severity: \"error\", rule: \"schema\", file: CONFIG_FILE, message: (e as Error).message });\n }\n }\n\n if (doc) {\n stats.pages = Object.keys(doc.pages).length;\n stats.items = Object.values(doc.collections).reduce((n, c) => n + Object.keys(c).length, 0);\n const parsed = SiteDocumentSchema.safeParse(doc);\n if (!parsed.success) {\n for (const i of parsed.error.issues)\n add({\n severity: \"error\",\n rule: \"schema\",\n file: fileForDocPath(i.path, pageFiles),\n path: dotPath(i.path.slice(fileDepth(i.path))) || undefined,\n message: i.message,\n });\n }\n for (const issue of blocksRegistry().validateDocument(doc))\n add({\n severity: \"error\",\n rule: \"block\",\n file: fileForDocPath(issue.path, pageFiles),\n path: dotPath(issue.path.slice(fileDepth(issue.path))) || undefined,\n message: issue.message,\n });\n }\n\n // --- media folder ---------------------------------------------------------------------------\n const mediaOnDisk = new Map<string, number>();\n for (const rel of await listFiles(root, \"media\")) {\n const bytes = (await stat(join(root, rel))).size;\n mediaOnDisk.set(rel, bytes);\n stats.mediaBytes += bytes;\n if (bytes > budgets.maxFileBytes)\n add({\n severity: \"error\",\n rule: \"size\",\n file: rel,\n message: `File is ${fmtBytes(bytes)}; GitHub rejects files over ${fmtBytes(budgets.maxFileBytes)}. Host large video elsewhere (the Cloudflare target can use R2).`,\n });\n }\n stats.mediaFiles = mediaOnDisk.size;\n if (stats.mediaBytes > budgets.mediaFailBytes) {\n add({\n severity: \"error\",\n rule: \"size\",\n file: \"media/\",\n message: `media/ is ${fmtBytes(stats.mediaBytes)}, over the ${fmtBytes(budgets.mediaFailBytes)} limit (GitHub Pages publishes at most 1 GB). Remove unused files or move video/large files to the Cloudflare target's R2.`,\n });\n } else if (stats.mediaBytes >= budgets.mediaWarnBytes) {\n add({\n severity: \"warning\",\n rule: \"size\",\n file: \"media/\",\n message: `media/ is ${fmtBytes(stats.mediaBytes)} of ${fmtBytes(budgets.mediaFailBytes)}; getting close to the limit.`,\n });\n }\n\n // --- references (links, redirects, images) ------------------------------------------------\n if (doc) checkReferences(doc, pageFiles, mediaOnDisk, budgets, add);\n\n // --- secrets over config + content/** ---------------------------------------------------------\n const textFiles = [CONFIG_FILE, ...(await listFiles(root, \"content\", true))];\n for (const rel of textFiles) {\n let text: string;\n try {\n const buf = await readFile(join(root, rel));\n if (buf.includes(0)) continue; // binary\n text = buf.toString(\"utf8\");\n } catch {\n continue;\n }\n stats.filesScanned++;\n for (const s of scanForSecrets(text))\n add({\n severity: \"error\",\n rule: \"secret\",\n file: rel,\n line: s.line,\n message: `${s.description} found (${s.preview}). Remove it from content and rotate the credential; secrets belong in repository or Worker secrets.`,\n });\n }\n\n // Only pages can be gated: collection items carry no access flags in the schema.\n // --- gated content in a public repo ---------------------------------------------------------\n // Members-only / password pages are stubs in the repository (`contentRef`, no sections); their\n // content lives in the Hub and reaches only the Cloudflare Worker's private storage.\n for (const page of doc ? Object.values(doc.pages) : []) {\n const gated =\n page.access?.password ||\n page.access?.members ||\n page.slug === \"members\" ||\n page.slug.startsWith(\"members/\");\n if (!gated) continue;\n const kinds =\n [page.access?.password && \"password\", page.access?.members && \"members-only\"]\n .filter(Boolean)\n .join(\" and \") || \"members-only\";\n const file = pageFiles[page.id] ?? PAGES_DIR;\n // A warning, not an error: template samples and hand-made sites may carry it on purpose,\n // and the Hub never commits it (it seals gated pages into stubs).\n if (page.sections.length)\n add({\n severity: \"warning\",\n rule: \"gating\",\n file,\n path: \"sections\",\n message: `Page \"${page.title}\" is ${kinds}, but its content is in the site's files, which anyone can read. Edit it in Studio (the Hub keeps gated content out of the files); the published site serves only content the Hub holds.`,\n });\n else if (doc?.config.deploy.target === \"github-pages\")\n add({\n severity: \"warning\",\n rule: \"gating\",\n file,\n path: \"access\",\n message: `Page \"${page.title}\" is ${kinds}: it is only published with Cloudflare hosting.`,\n });\n }\n\n const errors = findings.filter((f) => f.severity === \"error\").length;\n const warnings = findings.length - errors;\n return { ok: errors === 0, errors, warnings, findings, stats };\n}\n\ntype Add = (f: Finding) => void;\n\nfunction checkReferences(\n doc: SiteDocument,\n pageFiles: Record<string, string>,\n mediaOnDisk: Map<string, number>,\n budgets: Budgets,\n add: Add,\n): void {\n const resolver = new LinkTargets(doc);\n const reportedImages = new Set<string>();\n\n const checkImage = (ref: string, file: string, path: string) => {\n if (!isMediaPath(ref)) return;\n if (!mediaOnDisk.has(ref))\n add({\n severity: \"error\",\n rule: \"image\",\n file,\n path: path || undefined,\n message: `Image ${ref} does not exist in media/`,\n });\n const meta: MediaMeta | undefined = doc.media[ref];\n if (!meta && mediaOnDisk.has(ref) && !reportedImages.has(ref)) {\n reportedImages.add(ref);\n const isImage = IMAGE_EXT_RE.test(ref);\n add({\n severity: isImage ? \"error\" : \"warning\",\n rule: \"media\",\n file: MEDIA_FILE,\n message: isImage\n ? `${ref} is used but has no entry in content/media.json (images need their width, height and alt text recorded)`\n : `${ref} is used but has no entry in content/media.json (its type and size are recorded there)`,\n });\n }\n };\n\n const walk = (value: unknown, file: string, path: (string | number)[]): void => {\n if (typeof value === \"string\") {\n const here = dotPath(path);\n for (const m of value.matchAll(MEDIA_REF_RE)) checkImage(m[0], file, here);\n return;\n }\n if (Array.isArray(value)) {\n for (const [i, v] of value.entries()) walk(v, file, [...path, i]);\n return;\n }\n if (value && typeof value === \"object\")\n for (const [k, v] of Object.entries(value)) walk(v, file, [...path, k]);\n };\n\n // Links: the same rules Studio's Design check and the Hub's publish gate use.\n for (const l of findBrokenLinks(doc))\n add({\n severity: l.severity,\n rule: \"link\",\n file:\n l.scope.kind === \"site\"\n ? SITE_FILE\n : l.scope.kind === \"page\"\n ? (pageFiles[l.scope.page] ?? PAGES_DIR)\n : `${COLLECTIONS_DIR}/${l.scope.collection}/${l.scope.slug}${ITEM_EXT}`,\n path: dotPath(l.path) || undefined,\n message: l.message,\n });\n\n walk(doc.site, SITE_FILE, []);\n for (const page of Object.values(doc.pages)) walk(page, pageFiles[page.id] ?? PAGES_DIR, []);\n for (const [name, items] of Object.entries(doc.collections))\n for (const item of Object.values(items))\n walk(item, `${COLLECTIONS_DIR}/${name}/${item.slug}${ITEM_EXT}`, []);\n\n // Redirects.\n (doc.site.redirects ?? []).forEach((r, i) => {\n const at = `redirects.${i}`;\n if (/^https?:/.test(r.to)) return;\n const from = r.from.replace(/^\\/+|\\/+$/g, \"\");\n const to = r.to.replace(/^\\/+|\\/+$/g, \"\");\n if (from === to)\n add({\n severity: \"error\",\n rule: \"redirect\",\n file: SITE_FILE,\n path: at,\n message: `Redirect ${r.from} points at itself`,\n });\n else if (!resolver.pathResolves(r.to))\n add({\n severity: \"error\",\n rule: \"redirect\",\n file: SITE_FILE,\n path: `${at}.to`,\n message: `Redirect ${r.from} → ${r.to}: the destination does not lead to any page`,\n });\n if (resolver.slugs.has(from))\n add({\n severity: \"warning\",\n rule: \"redirect\",\n file: SITE_FILE,\n path: `${at}.from`,\n message: `Redirect from ${r.from} is shadowed by a page with the same address and will not be used`,\n });\n });\n\n // media.json: every entry should have its file; images must respect the long-edge budget.\n for (const [path, meta] of Object.entries(doc.media)) {\n if (!mediaOnDisk.has(path))\n add({\n severity: \"warning\",\n rule: \"media\",\n file: MEDIA_FILE,\n path,\n message: `Listed in media.json but ${path} is missing from media/`,\n });\n if (meta.kind === \"image\" && meta.width && meta.height) {\n const edge = Math.max(meta.width, meta.height);\n if (edge > budgets.maxImageEdge)\n add({\n severity: \"error\",\n rule: \"size\",\n file: MEDIA_FILE,\n path,\n message: `${path} is ${meta.width}×${meta.height}px; the longest edge may be at most ${budgets.maxImageEdge}px. Resize it before committing.`,\n });\n }\n }\n}\n\nexport function fmtBytes(n: number): string {\n if (n >= 1024 * MB) return `${(n / (1024 * MB)).toFixed(1)} GB`;\n if (n >= MB) return `${(n / MB).toFixed(1)} MB`;\n if (n >= 1024) return `${(n / 1024).toFixed(1)} KB`;\n return `${n} B`;\n}\n\n/** Plain-text report grouped by file. */\nexport function formatReport(\n report: CheckReport,\n paint: (code: number, s: string) => string,\n): string {\n const lines: string[] = [];\n const byFile = new Map<string, Finding[]>();\n for (const f of report.findings) byFile.set(f.file, [...(byFile.get(f.file) ?? []), f]);\n for (const file of [...byFile.keys()].sort()) {\n lines.push(paint(1, file));\n for (const f of byFile.get(file) ?? []) {\n const where = [f.path, f.line !== undefined ? `line ${f.line}` : undefined]\n .filter(Boolean)\n .join(\", \");\n const sev = f.severity === \"error\" ? paint(31, \"error \") : paint(33, \"warning\");\n lines.push(` ${sev} ${f.rule.padEnd(8)} ${where ? `${where}: ` : \"\"}${f.message}`);\n }\n lines.push(\"\");\n }\n const s = report.stats;\n lines.push(\n `Checked ${s.pages} pages, ${s.items} collection items, ${s.mediaFiles} media files (${fmtBytes(s.mediaBytes)}), ${s.filesScanned} files scanned for secrets.`,\n );\n lines.push(\n report.ok\n ? `OK: ${report.warnings} warning${report.warnings === 1 ? \"\" : \"s\"}, no errors.`\n : `FAILED: ${report.errors} error${report.errors === 1 ? \"\" : \"s\"}, ${report.warnings} warning${report.warnings === 1 ? \"\" : \"s\"}.`,\n );\n return lines.join(\"\\n\");\n}\n\n/** GitHub Actions workflow commands, so errors show up on the PR. */\nexport function githubAnnotations(report: CheckReport): string[] {\n const esc = (s: string) => s.replace(/%/g, \"%25\").replace(/\\r/g, \"%0D\").replace(/\\n/g, \"%0A\");\n return report.findings.map((f) => {\n const level = f.severity === \"error\" ? \"error\" : \"warning\";\n const loc = `file=${esc(f.file)}${f.line !== undefined ? `,line=${f.line}` : \"\"}`;\n return `::${level} ${loc},title=${f.rule}::${esc(f.message)}`;\n });\n}\n","import type { SiteDocument } from \"./document\";\nimport type { PageId } from \"./ids\";\nimport type { Page } from \"./page\";\nimport type { Link } from \"./primitives\";\n\n/**\n * Internal links: which site-relative addresses lead to a page, which links in a document lead\n * nowhere, and how to point a dangling link at a page that exists. Shared by `openspace check`\n * (CI), Studio's Design check, the Hub's publish gate and every path that inserts presets or\n * new blocks, so they all agree on what a broken link is.\n */\n\nconst COLLECTION_SUBPATHS = new Set([\"page\", \"category\", \"categories\", \"tag\", \"tags\"]);\n/** Markdown and HTML links to site-relative paths inside Markdown bodies. */\nexport const MARKDOWN_LINK_RE = /\\]\\((\\/[^)\\s]*)\\)|href=\"(\\/[^\"\\s]*)\"/g;\n\nconst trimSlashes = (s: string) => s.replace(/^\\/+|\\/+$/g, \"\");\n\n/** What a site's internal addresses lead to. */\nexport class LinkTargets {\n readonly slugs: Set<string>;\n readonly redirectFroms: Set<string>;\n constructor(readonly doc: SiteDocument) {\n this.slugs = new Set(Object.values(doc.pages).map((p) => p.slug));\n this.redirectFroms = new Set((doc.site.redirects ?? []).map((r) => trimSlashes(r.from)));\n }\n hasCollection(name: string): boolean {\n return name in this.doc.collections || name in (this.doc.collectionConfigs ?? {});\n }\n /** Does a site-internal path (`/about/`, `/journal/hello`) lead somewhere? */\n pathResolves(raw: string): boolean {\n const path = raw.split(/[?#]/)[0] ?? \"\";\n const slug = trimSlashes(path);\n const last = slug.split(\"/\").pop() ?? \"\";\n if (/\\.[A-Za-z0-9]+$/.test(last)) return true; // files: feeds, downloads, sitemap\n if (slug === \"404\" || slug.startsWith(\"_os/\")) return true;\n if (this.slugs.has(slug) || this.redirectFroms.has(slug)) return true;\n const [head, second, ...rest] = slug.split(\"/\");\n if (head && this.hasCollection(head)) {\n if (second === undefined) return true;\n if (this.doc.collections[head]?.[second]) return rest.length === 0;\n return COLLECTION_SUBPATHS.has(second);\n }\n return false;\n }\n}\n\n/** True for `/…` (not `//host`): a link inside the site. */\nexport const isInternalPath = (s: string): boolean => /^\\/(?!\\/)/.test(s);\n\n// --- finding broken links -------------------------------------------------------------------\n\nexport type BrokenLinkKind =\n /** A link value `{type:\"url\", url:\"/…\"}`. */\n | \"url\"\n /** `{type:\"page\", page}` to a page that doesn't exist. */\n | \"page\"\n /** `{type:\"item\"}` to a collection item that doesn't exist. */\n | \"item\"\n /** A navigation entry for a collection that doesn't exist. */\n | \"collection\"\n /** A link inside a Markdown body (collection items). */\n | \"markdown\"\n /** A link mark inside rich text. */\n | \"richtext\";\n\n/** Where a broken link is: in `content/site.json`, a page, or a collection item. */\nexport type LinkScope =\n | { kind: \"site\" }\n | { kind: \"page\"; page: PageId }\n | { kind: \"item\"; collection: string; slug: string };\n\nexport interface BrokenLink {\n scope: LinkScope;\n /** Path inside the scope's value (`sections.0.blocks.1.fields.link`). */\n path: (string | number)[];\n /** The page or footer the link's block lives in (`\"footer\"`), when it is in a block. */\n container?: string;\n section?: string;\n block?: string;\n /** Top-level block field the link is in (`link`, `secondaryLink`, `content`). */\n field?: string;\n kind: BrokenLinkKind;\n /** What the link points at: `/book`, a page id, `journal/hello`, a collection name. */\n target: string;\n /**\n * `error` for links the published site's check fails on (link values, Markdown links);\n * `warning` for rich-text links, which `openspace check` reports without failing.\n */\n severity: \"error\" | \"warning\";\n /** The `openspace check` message. */\n message: string;\n}\n\nconst isObject = (v: unknown): v is Record<string, unknown> =>\n !!v && typeof v === \"object\" && !Array.isArray(v);\n\n/** Every internal link in the document that leads nowhere, in document order. */\nexport function findBrokenLinks(doc: SiteDocument): BrokenLink[] {\n const targets = new LinkTargets(doc);\n const out: BrokenLink[] = [];\n type Where = Pick<BrokenLink, \"container\" | \"section\" | \"block\" | \"field\">;\n\n const walk = (value: unknown, scope: LinkScope, path: (string | number)[], where: Where) => {\n const add = (\n kind: BrokenLinkKind,\n target: string,\n message: string,\n severity: BrokenLink[\"severity\"] = \"error\",\n ) => out.push({ scope, path, ...where, kind, target, severity, message });\n if (typeof value === \"string\") {\n if (path[path.length - 1] === \"body\")\n for (const m of value.matchAll(MARKDOWN_LINK_RE)) {\n const target = m[1] ?? m[2];\n if (target && !targets.pathResolves(target))\n add(\"markdown\", target, `Link to ${target} does not lead to any page`);\n }\n return;\n }\n if (Array.isArray(value)) {\n for (const [i, v] of value.entries()) walk(v, scope, [...path, i], where);\n return;\n }\n if (!isObject(value)) return;\n const o = value;\n if (o.type === \"page\" && typeof o.page === \"string\") {\n if (!(o.page in doc.pages))\n add(\"page\", o.page, `Link to page ${o.page} but no such page exists`);\n } else if (\n o.type === \"item\" &&\n typeof o.collection === \"string\" &&\n typeof o.slug === \"string\"\n ) {\n if (!doc.collections[o.collection]?.[o.slug])\n add(\n \"item\",\n `${o.collection}/${o.slug}`,\n `Link to ${o.collection}/${o.slug} but no such item exists`,\n );\n } else if (o.type === \"collection\" && typeof o.collection === \"string\") {\n if (!targets.hasCollection(o.collection))\n add(\n \"collection\",\n o.collection,\n `Navigation points at collection \"${o.collection}\" which does not exist`,\n );\n } else if (o.type === \"url\" && typeof o.url === \"string\" && isInternalPath(o.url)) {\n if (!targets.pathResolves(o.url))\n add(\"url\", o.url, `Link to ${o.url} does not lead to any page`);\n } else if (o.type === \"link\" && isObject(o.attrs) && typeof o.attrs.href === \"string\") {\n const href = o.attrs.href;\n if (isInternalPath(href) && !targets.pathResolves(href))\n add(\"richtext\", href, `Text link to ${href} does not lead to any page`, \"warning\");\n }\n for (const [k, v] of Object.entries(o)) walk(v, scope, [...path, k], where);\n };\n\n /** A section: its blocks' links carry the block (and field) they are in. */\n const walkSection = (\n section: { id: string; blocks: readonly { id: string }[] },\n scope: LinkScope,\n base: (string | number)[],\n container: string,\n ) => {\n for (const [k, v] of Object.entries(section))\n if (k !== \"blocks\") walk(v, scope, [...base, k], { container, section: section.id });\n section.blocks.forEach((b, j) => {\n const at = { container, section: section.id, block: b.id };\n for (const [k, v] of Object.entries(b)) {\n if (k !== \"fields\") walk(v, scope, [...base, \"blocks\", j, k], at);\n else if (isObject(v))\n for (const [field, fv] of Object.entries(v))\n walk(fv, scope, [...base, \"blocks\", j, \"fields\", field], { ...at, field });\n }\n });\n };\n\n const site = { kind: \"site\" } as const;\n for (const [k, v] of Object.entries(doc.site))\n if (k === \"footer\") walkSection(doc.site.footer, site, [\"footer\"], \"footer\");\n else walk(v, site, [k], {});\n for (const page of Object.values(doc.pages)) {\n const scope: LinkScope = { kind: \"page\", page: page.id };\n for (const [k, v] of Object.entries(page)) if (k !== \"sections\") walk(v, scope, [k], {});\n for (const [i, s] of page.sections.entries()) walkSection(s, scope, [\"sections\", i], page.id);\n }\n for (const [collection, items] of Object.entries(doc.collections))\n for (const item of Object.values(items))\n walk(item, { kind: \"item\", collection, slug: item.slug }, [], {});\n return out;\n}\n\n// --- pointing dangling links somewhere --------------------------------------------------------\n\n/** Words that mark a page as the place to get in touch, book or buy. */\nconst CONTACT_WORDS = [\n \"contact\",\n \"book\",\n \"booking\",\n \"bookings\",\n \"reserve\",\n \"reservations\",\n \"enquire\",\n \"enquiry\",\n \"enquiries\",\n \"inquire\",\n \"inquiry\",\n \"get-in-touch\",\n \"hello\",\n \"appointments\",\n \"visit\",\n];\n\nconst words = (s: string) =>\n s\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .filter((w) => w.length > 2);\n\n/** Same word, or one a short suffix away (`book` / `booking`, `retreat` / `retreats`). */\nconst related = (a: string, b: string) => {\n if (a === b) return true;\n const [s, l] = a.length < b.length ? [a, b] : [b, a];\n return s.length >= 4 && l.startsWith(s) && l.length - s.length <= 3;\n};\n\nconst publicPages = (doc: SiteDocument): Page[] =>\n Object.values(doc.pages).filter(\n (p) => !p.access?.password && !p.access?.members && p.slug !== \"404\",\n );\n\nconst pagePath = (p: Page) => (p.slug ? `/${p.slug}` : \"/\");\n\nexport interface LinkSuggestion {\n /** The page to point at; absent for a collection's index. */\n page?: Page;\n /** Its site-relative path (`/contact`, `/`, `/journal/`). */\n path: string;\n}\n\n/**\n * A page for a link to `target` (an internal path that leads nowhere) to point at instead:\n * a page or collection whose address or title shares a word with it; else a contact/booking-like\n * page; else the home page. Undefined when the site has no public page at all.\n */\nexport function suggestLinkTarget(doc: SiteDocument, target: string): LinkSuggestion | undefined {\n const wanted = words(trimSlashes(target.split(/[?#]/)[0] ?? \"\"));\n const pages = publicPages(doc);\n const matches = (p: Page, list: readonly string[]) => {\n const own = [...words(p.slug), ...words(p.title)];\n return own.some((w) => list.some((x) => related(w, x)));\n };\n const bySlugWord = pages.find((p) => p.slug && wanted.some((w) => words(p.slug).includes(w)));\n if (bySlugWord) return { page: bySlugWord, path: pagePath(bySlugWord) };\n const byWord = pages.find((p) => p.slug && matches(p, wanted));\n if (byWord) return { page: byWord, path: pagePath(byWord) };\n const collection = Object.keys(doc.collections).find((c) =>\n wanted.some((w) => related(w, c.toLowerCase())),\n );\n if (collection) return { path: `/${collection}/` };\n const contact = CONTACT_WORDS.map((w) =>\n pages.find((p) => p.slug && (words(p.slug).includes(w) || words(p.title).includes(w))),\n ).find(Boolean);\n if (contact) return { page: contact, path: pagePath(contact) };\n const home = pages.find((p) => p.slug === \"\") ?? pages[0];\n return home ? { page: home, path: pagePath(home) } : undefined;\n}\n\n/** The link value a suggestion stands for (pages by id, so renaming the page keeps it working). */\nexport function suggestionLink(s: LinkSuggestion, newTab?: boolean): Link {\n if (s.page) return { type: \"page\", page: s.page.id };\n return { type: \"url\", url: s.path, ...(newTab ? { newTab } : {}) };\n}\n\nexport interface LinkChange {\n path: (string | number)[];\n from: string;\n to: string;\n}\n\n/**\n * Point every internal link in `value` (a section, block, page or header built from a preset or\n * a block's demo content) that leads nowhere in `doc` at a page that exists\n * (`suggestLinkTarget`). Links that work are kept, and so are external, email, phone and anchor\n * links. Only block content changes: layout and style stay exactly as built, so an Editor may\n * still insert the result as a preset section. Returns a copy and what changed.\n */\nexport function resolveInternalLinks<T>(\n value: T,\n doc: SiteDocument,\n): { value: T; changes: LinkChange[] } {\n const targets = new LinkTargets(doc);\n const changes: LinkChange[] = [];\n const cache = new Map<string, LinkSuggestion | undefined>();\n const suggest = (target: string) => {\n if (!cache.has(target)) cache.set(target, suggestLinkTarget(doc, target));\n return cache.get(target);\n };\n const fix = (v: unknown, path: (string | number)[]): unknown => {\n if (typeof v === \"string\") {\n if (path[path.length - 1] !== \"body\") return v;\n return v.replace(MARKDOWN_LINK_RE, (m, md?: string, html?: string) => {\n const target = md ?? html;\n if (!target || targets.pathResolves(target)) return m;\n const s = suggest(target);\n if (!s) return m;\n changes.push({ path, from: target, to: s.path });\n return md ? `](${s.path})` : `href=\"${s.path}\"`;\n });\n }\n if (Array.isArray(v)) return v.map((x, i) => fix(x, [...path, i]));\n if (!isObject(v)) return v;\n if (v.type === \"url\" && typeof v.url === \"string\" && isInternalPath(v.url)) {\n if (targets.pathResolves(v.url)) return v;\n const s = suggest(v.url);\n if (!s) return v;\n changes.push({ path, from: v.url, to: s.path });\n return suggestionLink(s, v.newTab === true ? true : undefined);\n }\n if (v.type === \"page\" && typeof v.page === \"string\" && !(v.page in doc.pages)) {\n const home = suggest(\"/\");\n if (!home?.page) return v;\n changes.push({ path, from: v.page, to: home.path });\n return { ...v, page: home.page.id };\n }\n if (v.type === \"link\" && isObject(v.attrs) && typeof v.attrs.href === \"string\") {\n const href = v.attrs.href;\n if (!isInternalPath(href) || targets.pathResolves(href)) return v;\n const s = suggest(href);\n if (!s) return v;\n changes.push({ path, from: href, to: s.path });\n return { ...v, attrs: { ...v.attrs, href: s.path } };\n }\n const out: Record<string, unknown> = {};\n for (const [k, x] of Object.entries(v)) out[k] = fix(x, [...path, k]);\n return out;\n };\n return { value: fix(value, []) as T, changes };\n}\n\n/** `doc` with `pages` added (links on a page being created may point at the page itself). */\nexport function withPages(doc: SiteDocument, pages: readonly Page[]): SiteDocument {\n const all = { ...doc.pages };\n for (const p of pages) all[p.id] = p;\n return { ...doc, pages: all };\n}\n","/**\n * Secret scanner (Global Constraint 12, arch §3.4): site content must never contain secrets.\n * Used by `openspace check` and the Hub before accepting content. Detects API-key-shaped\n * strings; publishable keys (Stripe `pk_`) are deliberately not flagged.\n */\n\nexport interface SecretFinding {\n /** Rule id, e.g. `stripe-secret-key`. */\n rule: string;\n description: string;\n /** Offset of the match in the scanned text. */\n index: number;\n /** 1-based line and column. */\n line: number;\n column: number;\n /** Redacted preview, safe to log: first 4 characters + length. */\n preview: string;\n}\n\ninterface Rule {\n id: string;\n description: string;\n pattern: RegExp;\n /** Capture group holding the secret (default: whole match). */\n group?: number;\n /** Extra check on the captured secret. */\n accept?: (secret: string) => boolean;\n}\n\n/** Shannon entropy in bits per character. */\nexport function shannonEntropy(value: string): number {\n if (!value) return 0;\n const counts = new Map<string, number>();\n for (const c of value) counts.set(c, (counts.get(c) ?? 0) + 1);\n let h = 0;\n for (const n of counts.values()) {\n const p = n / value.length;\n h -= p * Math.log2(p);\n }\n return h;\n}\n\n/** Heuristic for \"looks random\": long, high-entropy, mixes letters and digits, not a path/URL. */\nfunction looksRandom(value: string): boolean {\n if (value.length < 16) return false;\n if (/^(?:https?:|media\\/|\\/|\\.\\/)/.test(value)) return false;\n if (!/[0-9]/.test(value) || !/[A-Za-z]/.test(value)) return false;\n // Plain words joined by separators (\"primary-button-color-2\") aren't secrets.\n if (/^[a-z]+(?:[-_.][a-z0-9]+)+$/.test(value) && shannonEntropy(value) < 4) return false;\n return shannonEntropy(value) >= 3.5;\n}\n\nconst KEY_NAME =\n \"(?:api[_-]?key|apikey|secret(?:[_-]?key)?|client[_-]?secret|access[_-]?(?:key|token)|auth[_-]?token|private[_-]?key|bearer|token|password|passwd|pwd|key)\";\n\nexport const SECRET_RULES: readonly Rule[] = [\n {\n id: \"stripe-secret-key\",\n description: \"Stripe secret or restricted key\",\n pattern: /\\b(?:sk|rk)_(?:live|test)_[0-9A-Za-z]{16,}\\b/g,\n },\n {\n id: \"stripe-webhook-secret\",\n description: \"Stripe webhook signing secret\",\n pattern: /\\bwhsec_[0-9A-Za-z]{24,}\\b/g,\n },\n {\n id: \"github-token\",\n description: \"GitHub token\",\n pattern: /\\b(?:ghp|gho|ghu|ghs|ghr)_[0-9A-Za-z]{36,}\\b/g,\n },\n {\n id: \"github-fine-grained-token\",\n description: \"GitHub fine-grained personal access token\",\n pattern: /\\bgithub_pat_[0-9A-Za-z_]{40,}\\b/g,\n },\n {\n id: \"aws-access-key-id\",\n description: \"AWS access key id\",\n pattern: /\\b(?:AKIA|ASIA|ABIA|ACCA)[0-9A-Z]{16}\\b/g,\n },\n {\n id: \"anthropic-api-key\",\n description: \"Anthropic API key\",\n pattern: /\\bsk-ant-[0-9A-Za-z_-]{20,}/g,\n },\n {\n id: \"openai-api-key\",\n description: \"OpenAI API key\",\n pattern: /\\bsk-(?:proj-|svcacct-)?[0-9A-Za-z_-]{32,}/g,\n accept: (s) => !s.startsWith(\"sk-ant-\"),\n },\n {\n id: \"google-api-key\",\n description: \"Google API key\",\n pattern: /\\bAIza[0-9A-Za-z_-]{35}\\b/g,\n },\n {\n id: \"slack-token\",\n description: \"Slack token\",\n pattern: /\\bxox[abprs]-[0-9A-Za-z-]{10,}/g,\n },\n {\n id: \"private-key\",\n description: \"PEM private key\",\n pattern: /-----BEGIN (?:RSA |EC |DSA |OPENSSH |PGP |ENCRYPTED )?PRIVATE KEY(?: BLOCK)?-----/g,\n },\n {\n id: \"generic-secret-assignment\",\n description: \"High-entropy value assigned to a key/secret/token/password name\",\n // `apiKey = \"…\"`, `\"client_secret\": \"…\"`, `token: …`, `?api_key=…`\n pattern: new RegExp(\n `(?:^|[^A-Za-z0-9])[\"']?[A-Za-z0-9_-]*${KEY_NAME}[\"']?\\\\s*[:=]\\\\s*[\"']?([A-Za-z0-9_\\\\-+/=.~!@#$%^*]{16,})`,\n \"gi\",\n ),\n group: 1,\n accept: looksRandom,\n },\n];\n\nfunction position(text: string, index: number): { line: number; column: number } {\n let line = 1;\n let last = -1;\n for (let i = 0; i < index; i++) {\n if (text.charCodeAt(i) === 10) {\n line++;\n last = i;\n }\n }\n return { line, column: index - last };\n}\n\nfunction redact(secret: string): string {\n return `${secret.slice(0, 4)}…(${secret.length} chars)`;\n}\n\n/** Find API-key-shaped strings in `text`. Overlapping matches are reported once. */\nexport function scanForSecrets(text: string): SecretFinding[] {\n const findings: SecretFinding[] = [];\n const covered: Array<[number, number]> = [];\n const overlaps = (start: number, end: number) => covered.some(([s, e]) => start < e && end > s);\n for (const rule of SECRET_RULES) {\n rule.pattern.lastIndex = 0;\n for (const m of text.matchAll(rule.pattern)) {\n const secret = rule.group !== undefined ? m[rule.group] : m[0];\n if (!secret || m.index === undefined) continue;\n const start = m.index + (rule.group !== undefined ? m[0].lastIndexOf(secret) : 0);\n const end = start + secret.length;\n if (overlaps(start, end)) continue;\n if (rule.accept && !rule.accept(secret)) continue;\n covered.push([start, end]);\n findings.push({\n rule: rule.id,\n description: rule.description,\n index: start,\n ...position(text, start),\n preview: redact(secret),\n });\n }\n }\n return findings.sort((a, b) => a.index - b.index);\n}\n\n/** Convenience: scan any JSON-serializable value (e.g. a SiteDocument). */\nexport function scanValueForSecrets(value: unknown): SecretFinding[] {\n return scanForSecrets(JSON.stringify(value, null, 2) ?? \"\");\n}\n","import type { NeutralTint } from \"./scales\";\n\nexport interface CuratedPalette {\n id: string;\n name: string;\n /** Brand color (OKLCH) the full palette is generated from. */\n brand: string;\n neutral: NeutralTint;\n description: string;\n /** Launch templates this palette was designed for (doc 04 §7). */\n templates?: string[];\n}\n\n/** Named starting palettes for Studio's palette picker. */\nexport const curatedPalettes: readonly CuratedPalette[] = [\n {\n id: \"sage\",\n name: \"Oat & Sage\",\n brand: \"oklch(0.62 0.07 145)\",\n neutral: \"warm\",\n description: \"Soft sage on oat paper; calm and organic.\",\n templates: [\"meadow\"],\n },\n {\n id: \"clay\",\n name: \"Clay\",\n brand: \"oklch(0.6 0.11 45)\",\n neutral: \"warm\",\n description: \"Sun-baked terracotta with bone neutrals.\",\n templates: [\"meadow\", \"kiln\"],\n },\n {\n id: \"harbor\",\n name: \"Harbor Blue\",\n brand: \"oklch(0.42 0.12 255)\",\n neutral: \"warm\",\n description: \"Deep civic blue on warm paper.\",\n templates: [\"harbor\"],\n },\n {\n id: \"signal-orange\",\n name: \"Signal Orange\",\n brand: \"oklch(0.68 0.19 45)\",\n neutral: \"warm\",\n description: \"A bright call-to-action orange.\",\n templates: [\"harbor\"],\n },\n {\n id: \"monochrome\",\n name: \"Monochrome\",\n brand: \"oklch(0.25 0 0)\",\n neutral: \"pure\",\n description: \"Ink and white; lets the photography lead.\",\n templates: [\"atelier\"],\n },\n {\n id: \"ledger-green\",\n name: \"Ledger Green\",\n brand: \"oklch(0.42 0.08 160)\",\n neutral: \"warm\",\n description: \"Deep green with ink and ivory.\",\n templates: [\"ledger\"],\n },\n {\n id: \"tomato\",\n name: \"Tomato\",\n brand: \"oklch(0.6 0.2 30)\",\n neutral: \"warm\",\n description: \"Ripe tomato red on cream.\",\n templates: [\"hearth\"],\n },\n {\n id: \"olive\",\n name: \"Olive Grove\",\n brand: \"oklch(0.55 0.09 115)\",\n neutral: \"warm\",\n description: \"Olive and cream, quietly appetizing.\",\n templates: [\"hearth\"],\n },\n {\n id: \"electric\",\n name: \"Electric Violet\",\n brand: \"oklch(0.62 0.25 285)\",\n neutral: \"cool\",\n description: \"Near-black chrome with an electric accent.\",\n templates: [\"signal\"],\n },\n {\n id: \"highlighter\",\n name: \"Highlighter\",\n brand: \"oklch(0.9 0.17 100)\",\n neutral: \"warm\",\n description: \"Paper and ink with a highlighter-yellow mark.\",\n templates: [\"field-notes\"],\n },\n {\n id: \"plum\",\n name: \"Night Plum\",\n brand: \"oklch(0.45 0.14 330)\",\n neutral: \"cool\",\n description: \"Dark plum with a vivid edge.\",\n templates: [\"encore\"],\n },\n {\n id: \"charcoal-clay\",\n name: \"Charcoal & Clay\",\n brand: \"oklch(0.52 0.08 50)\",\n neutral: \"warm\",\n description: \"Fired clay against charcoal and bone.\",\n templates: [\"kiln\"],\n },\n {\n id: \"earth\",\n name: \"Earth & Sky\",\n brand: \"oklch(0.5 0.1 140)\",\n neutral: \"cool\",\n description: \"Grounded greens under an open sky.\",\n templates: [\"commons\"],\n },\n {\n id: \"dusty-rose\",\n name: \"Dusty Rose\",\n brand: \"oklch(0.68 0.07 10)\",\n neutral: \"warm\",\n description: \"Linen, ink and a muted rose.\",\n templates: [\"vow\"],\n },\n {\n id: \"lagoon\",\n name: \"Lagoon\",\n brand: \"oklch(0.58 0.1 195)\",\n neutral: \"cool\",\n description: \"Clear teal water; fresh and open.\",\n templates: [\"link\"],\n },\n {\n id: \"saffron\",\n name: \"Saffron\",\n brand: \"oklch(0.78 0.15 80)\",\n neutral: \"warm\",\n description: \"Golden saffron, warm and generous.\",\n templates: [\"link\"],\n },\n {\n id: \"ink-blue\",\n name: \"Ink Blue\",\n brand: \"oklch(0.35 0.08 265)\",\n neutral: \"cool\",\n description: \"Fountain-pen blue; serious and literate.\",\n templates: [\"field-notes\", \"ledger\"],\n },\n {\n id: \"lavender\",\n name: \"Lavender\",\n brand: \"oklch(0.7 0.1 300)\",\n neutral: \"cool\",\n description: \"Gentle lavender for soft, restful brands.\",\n },\n {\n id: \"forest\",\n name: \"Forest\",\n brand: \"oklch(0.4 0.07 150)\",\n neutral: \"warm\",\n description: \"Old-growth green, steady and natural.\",\n templates: [\"commons\"],\n },\n {\n id: \"coral\",\n name: \"Coral\",\n brand: \"oklch(0.7 0.15 25)\",\n neutral: \"warm\",\n description: \"Playful coral with sunny neutrals.\",\n templates: [\"link\"],\n },\n];\n\nexport function getCuratedPalette(id: string): CuratedPalette | undefined {\n return curatedPalettes.find((p) => p.id === id);\n}\n","/**\n * `@omniharmonic/openspace-site-kit/content` — read and write a site repository's content as one\n * `SiteDocument` (arch §2.1). Shared by the Astro integration, the CLI, the local MCP server\n * and anything else that edits a checkout. Writing is formatting-stable: unchanged files are\n * left untouched byte-for-byte, so load → write is a no-op.\n */\nimport { mkdir, readdir, readFile, rm, rmdir, writeFile } from \"node:fs/promises\";\nimport { dirname, join, relative, sep } from \"node:path\";\nimport {\n type CollectionConfig,\n CollectionConfigSchema,\n type CollectionItem,\n CollectionItemSchema,\n type MediaMeta,\n type Page,\n PageSchema,\n type SiteConfig,\n SiteConfigSchema,\n type SiteDocument,\n SiteDocumentSchema,\n SiteSchema,\n StylesSchema,\n} from \"@omniharmonic/openspace-schema\";\nimport type { z } from \"zod\";\nimport {\n COLLECTION_CONFIG_FILE,\n COLLECTIONS_DIR,\n CONFIG_FILE,\n collectionKind,\n formatJson,\n ITEM_EXT,\n MEDIA_FILE,\n PAGES_DIR,\n pageFileFor,\n pageFileMatchesSlug,\n parseItemFile,\n SITE_FILE,\n STYLES_FILE,\n serializeItemFile,\n} from \"./files\";\n\nexport * from \"./files\";\n\nexport interface ContentIssue {\n /** Repo-relative file the issue is in. */\n file: string;\n /** Path inside the file's value. */\n path: (string | number)[];\n message: string;\n}\n\n/** Content failed to load or validate; `issues` name the offending files. */\nexport class SiteContentError extends Error {\n constructor(readonly issues: ContentIssue[]) {\n super(\n `Site content is invalid:\\n${issues\n .map((i) => ` ${i.file}${i.path.length ? ` (${i.path.join(\".\")})` : \"\"}: ${i.message}`)\n .join(\"\\n\")}`,\n );\n this.name = \"SiteContentError\";\n }\n}\n\nexport interface LoadOptions {\n /** Validate the assembled document with `SiteDocumentSchema` (default true). */\n validate?: boolean;\n}\n\nexport interface LoadedSite {\n doc: SiteDocument;\n /** Repo-relative file each page was read from, by page id. */\n pageFiles: Record<string, string>;\n}\n\nconst toPosix = (p: string) => p.split(sep).join(\"/\");\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await readFile(path);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function walk(dir: string): Promise<string[]> {\n let entries: import(\"node:fs\").Dirent[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return [];\n }\n const out: string[] = [];\n for (const e of entries.sort((a, b) => a.name.localeCompare(b.name))) {\n if (e.name.startsWith(\".\")) continue;\n const p = join(dir, e.name);\n if (e.isDirectory()) out.push(...(await walk(p)));\n else out.push(p);\n }\n return out;\n}\n\n/** Load and validate everything; also returns where each page came from. */\nexport async function loadSite(rootDir: string, opts: LoadOptions = {}): Promise<LoadedSite> {\n const issues: ContentIssue[] = [];\n const readJson = async (rel: string, required: boolean): Promise<unknown> => {\n let text: string;\n try {\n text = await readFile(join(rootDir, rel), \"utf8\");\n } catch {\n if (required) issues.push({ file: rel, path: [], message: \"File is missing\" });\n return undefined;\n }\n try {\n return JSON.parse(text) as unknown;\n } catch (e) {\n issues.push({ file: rel, path: [], message: `Invalid JSON: ${(e as Error).message}` });\n return undefined;\n }\n };\n const check = <S extends z.ZodType>(schema: S, value: unknown, file: string) => {\n const r = schema.safeParse(value);\n // Keep the file's own value (key order included) so load → write is byte-stable; zod's\n // output would reorder keys to the schema's order.\n if (r.success) return value as z.infer<S>;\n for (const i of r.error.issues)\n issues.push({ file, path: i.path as (string | number)[], message: i.message });\n return undefined;\n };\n\n const config = check(SiteConfigSchema, await readJson(CONFIG_FILE, true), CONFIG_FILE);\n const site = check(SiteSchema, await readJson(SITE_FILE, true), SITE_FILE);\n const styles = check(StylesSchema, await readJson(STYLES_FILE, true), STYLES_FILE);\n const mediaRaw = (await readJson(MEDIA_FILE, false)) ?? {};\n const media = mediaRaw as Record<string, MediaMeta>;\n\n const pages: Record<string, Page> = {};\n const pageFiles: Record<string, string> = {};\n for (const abs of await walk(join(rootDir, PAGES_DIR))) {\n if (!abs.endsWith(\".json\")) continue;\n const rel = toPosix(relative(rootDir, abs));\n const page = check(PageSchema, await readJson(rel, true), rel);\n if (!page) continue;\n const within = toPosix(relative(join(rootDir, PAGES_DIR), abs));\n if (!pageFileMatchesSlug(within, page.slug)) {\n issues.push({\n file: rel,\n path: [\"slug\"],\n message: `Page slug \"${page.slug}\" does not match its file location (expected ${PAGES_DIR}/${pageFileFor(page.slug)})`,\n });\n }\n if (pages[page.id]) {\n issues.push({\n file: rel,\n path: [\"id\"],\n message: `Page id ${page.id} is also used by ${pageFiles[page.id]}`,\n });\n continue;\n }\n pages[page.id] = page;\n pageFiles[page.id] = rel;\n }\n\n const collections: Record<string, Record<string, CollectionItem>> = {};\n const collectionConfigs: Record<string, CollectionConfig> = {};\n let collectionDirs: string[] = [];\n try {\n collectionDirs = (await readdir(join(rootDir, COLLECTIONS_DIR), { withFileTypes: true }))\n .filter((d) => d.isDirectory() && !d.name.startsWith(\".\"))\n .map((d) => d.name)\n .sort();\n } catch {\n collectionDirs = [];\n }\n for (const name of collectionDirs) {\n const dir = `${COLLECTIONS_DIR}/${name}`;\n const cfgRel = `${dir}/${COLLECTION_CONFIG_FILE}`;\n let cfg: CollectionConfig | undefined;\n if (await exists(join(rootDir, cfgRel))) {\n cfg = check(CollectionConfigSchema, await readJson(cfgRel, true), cfgRel);\n if (cfg) collectionConfigs[name] = cfg;\n }\n const kind = collectionKind(name, cfg);\n const items: Record<string, CollectionItem> = {};\n const files = (await readdir(join(rootDir, dir))).filter((f) => f.endsWith(ITEM_EXT)).sort();\n if (!kind) {\n if (files.length)\n issues.push({\n file: cfgRel,\n path: [\"kind\"],\n message: `Can't tell what kind of collection \"${name}\" is; set \"kind\" in ${COLLECTION_CONFIG_FILE}`,\n });\n continue;\n }\n for (const file of files) {\n const rel = `${dir}/${file}`;\n let parsed: ReturnType<typeof parseItemFile>;\n try {\n parsed = parseItemFile(await readFile(join(rootDir, rel), \"utf8\"));\n } catch (e) {\n issues.push({\n file: rel,\n path: [],\n message: `Invalid frontmatter: ${(e as Error).message}`,\n });\n continue;\n }\n const slug = file.slice(0, -ITEM_EXT.length);\n const item = check(\n CollectionItemSchema,\n { kind, slug, frontmatter: parsed.frontmatter, body: parsed.body },\n rel,\n );\n if (item) items[slug] = item;\n }\n collections[name] = items;\n }\n\n if (issues.length || !config || !site || !styles) throw new SiteContentError(issues);\n const doc: SiteDocument = { config, site, styles, pages, collections, media };\n if (Object.keys(collectionConfigs).length) doc.collectionConfigs = collectionConfigs;\n\n if (opts.validate !== false) {\n const r = SiteDocumentSchema.safeParse(doc);\n if (!r.success) {\n throw new SiteContentError(\n r.error.issues.map((i) => ({\n file: fileForDocPath(i.path as (string | number)[], pageFiles),\n path: (i.path as (string | number)[]).slice(fileDepth(i.path as (string | number)[])),\n message: i.message,\n })),\n );\n }\n }\n return { doc, pageFiles };\n}\n\nfunction fileDepth(path: (string | number)[]): number {\n switch (path[0]) {\n case \"pages\":\n case \"media\":\n return 2;\n case \"collections\":\n return 3;\n case \"collectionConfigs\":\n return 2;\n default:\n return 1;\n }\n}\n\nfunction fileForDocPath(path: (string | number)[], pageFiles: Record<string, string>): string {\n const [head, a, b] = path;\n switch (head) {\n case \"config\":\n return CONFIG_FILE;\n case \"site\":\n return SITE_FILE;\n case \"styles\":\n return STYLES_FILE;\n case \"media\":\n return MEDIA_FILE;\n case \"pages\":\n return pageFiles[String(a)] ?? PAGES_DIR;\n case \"collections\":\n return b === undefined\n ? `${COLLECTIONS_DIR}/${a}`\n : `${COLLECTIONS_DIR}/${a}/${b}${ITEM_EXT}`;\n case \"collectionConfigs\":\n return `${COLLECTIONS_DIR}/${a}/${COLLECTION_CONFIG_FILE}`;\n default:\n return \"content\";\n }\n}\n\n/** Read `openspace.json` + `content/**` into a validated `SiteDocument`. */\nexport async function loadSiteDocument(\n rootDir: string,\n opts: LoadOptions = {},\n): Promise<SiteDocument> {\n return (await loadSite(rootDir, opts)).doc;\n}\n\n/** Read and validate only `openspace.json`. */\nexport async function loadSiteConfig(rootDir: string): Promise<SiteConfig> {\n const text = await readFile(join(rootDir, CONFIG_FILE), \"utf8\");\n const r = SiteConfigSchema.safeParse(JSON.parse(text));\n if (!r.success)\n throw new SiteContentError(\n r.error.issues.map((i) => ({\n file: CONFIG_FILE,\n path: i.path as (string | number)[],\n message: i.message,\n })),\n );\n return r.data;\n}\n\nexport interface WriteResult {\n /** Repo-relative files created or changed. */\n written: string[];\n /** Repo-relative files removed (deleted pages/items). */\n removed: string[];\n}\n\n/**\n * Write a `SiteDocument` back to disk. Pages keep their current file when it still matches\n * their slug and move to the canonical location otherwise; deleted pages and items are\n * removed; files whose content is unchanged are not rewritten.\n */\nexport async function writeSiteDocument(\n rootDir: string,\n doc: SiteDocument,\n opts: { validate?: boolean } = {},\n): Promise<WriteResult> {\n if (opts.validate !== false) {\n const r = SiteDocumentSchema.safeParse(doc);\n if (!r.success)\n throw new SiteContentError(\n r.error.issues.map((i) => ({\n file: \"document\",\n path: i.path as (string | number)[],\n message: i.message,\n })),\n );\n }\n const result: WriteResult = { written: [], removed: [] };\n const put = async (rel: string, text: string) => {\n const abs = join(rootDir, rel);\n let prev: string | undefined;\n try {\n prev = await readFile(abs, \"utf8\");\n } catch {\n prev = undefined;\n }\n if (prev === text) return;\n await mkdir(dirname(abs), { recursive: true });\n await writeFile(abs, text);\n result.written.push(rel);\n };\n const remove = async (rel: string) => {\n await rm(join(rootDir, rel), { force: true });\n result.removed.push(rel);\n // Tidy now-empty folders up to (not including) the content root.\n let dir = dirname(join(rootDir, rel));\n const stop = join(rootDir, \"content\");\n while (dir.startsWith(stop) && dir !== stop) {\n try {\n await rmdir(dir);\n } catch {\n break;\n }\n dir = dirname(dir);\n }\n };\n\n await put(CONFIG_FILE, formatJson(doc.config));\n await put(SITE_FILE, formatJson(doc.site));\n await put(STYLES_FILE, formatJson(doc.styles));\n if (Object.keys(doc.media).length || (await exists(join(rootDir, MEDIA_FILE))))\n await put(MEDIA_FILE, formatJson(doc.media));\n\n // Pages: map existing files by id so pages keep their location.\n const existing = new Map<string, string>();\n const pagesRoot = join(rootDir, PAGES_DIR);\n for (const abs of await walk(pagesRoot)) {\n if (!abs.endsWith(\".json\")) continue;\n try {\n const v = JSON.parse(await readFile(abs, \"utf8\")) as { id?: unknown };\n if (typeof v.id === \"string\") existing.set(v.id, toPosix(relative(pagesRoot, abs)));\n } catch {\n // Unreadable files are left alone.\n }\n }\n const keep = new Set<string>();\n for (const page of Object.values(doc.pages)) {\n const current = existing.get(page.id);\n const rel =\n current && pageFileMatchesSlug(current, page.slug) ? current : pageFileFor(page.slug);\n keep.add(rel);\n await put(`${PAGES_DIR}/${rel}`, formatJson(page));\n }\n for (const rel of existing.values()) if (!keep.has(rel)) await remove(`${PAGES_DIR}/${rel}`);\n\n // Collections.\n const names = new Set([\n ...Object.keys(doc.collections),\n ...Object.keys(doc.collectionConfigs ?? {}),\n ]);\n for (const name of [...names].sort()) {\n const dir = `${COLLECTIONS_DIR}/${name}`;\n const cfg = doc.collectionConfigs?.[name];\n if (cfg) await put(`${dir}/${COLLECTION_CONFIG_FILE}`, formatJson(cfg));\n else if (await exists(join(rootDir, dir, COLLECTION_CONFIG_FILE)))\n await remove(`${dir}/${COLLECTION_CONFIG_FILE}`);\n const items = doc.collections[name] ?? {};\n for (const item of Object.values(items))\n await put(`${dir}/${item.slug}${ITEM_EXT}`, serializeItemFile(item));\n let onDisk: string[] = [];\n try {\n onDisk = (await readdir(join(rootDir, dir))).filter((f) => f.endsWith(ITEM_EXT));\n } catch {\n onDisk = [];\n }\n for (const f of onDisk) if (!items[f.slice(0, -ITEM_EXT.length)]) await remove(`${dir}/${f}`);\n }\n // Collections removed from the document entirely.\n try {\n for (const d of await readdir(join(rootDir, COLLECTIONS_DIR), { withFileTypes: true })) {\n if (!d.isDirectory() || names.has(d.name)) continue;\n for (const f of await readdir(join(rootDir, COLLECTIONS_DIR, d.name)))\n if (f.endsWith(ITEM_EXT) || f === COLLECTION_CONFIG_FILE)\n await remove(`${COLLECTIONS_DIR}/${d.name}/${f}`);\n }\n } catch {\n // No collections folder.\n }\n return result;\n}\n","import {\n COLLECTION_KINDS,\n type CollectionConfig,\n type CollectionItem,\n type CollectionKind,\n} from \"@omniharmonic/openspace-schema\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\n\n/**\n * File-level conventions of a site repository (arch §2.1). Pure string functions; the\n * filesystem-touching loader/writer lives in `./index.ts`.\n */\n\nexport const CONFIG_FILE = \"openspace.json\";\nexport const SITE_FILE = \"content/site.json\";\nexport const STYLES_FILE = \"content/styles.json\";\n/** Media metadata (ruling: one file, keyed by repo path). */\nexport const MEDIA_FILE = \"content/media.json\";\nexport const PAGES_DIR = \"content/pages\";\nexport const COLLECTIONS_DIR = \"content/collections\";\nexport const COLLECTION_CONFIG_FILE = \"_collection.json\";\nexport const ITEM_EXT = \".mdoc\";\n\n/** Formatting-stable JSON: two-space indent, trailing newline. */\nexport function formatJson(value: unknown): string {\n return `${JSON.stringify(value, null, 2)}\\n`;\n}\n\n/**\n * Canonical file for a page slug, relative to `content/pages`: `\"\"` → `home.json`,\n * `about` → `about.json`, `services/pricing` → `services/pricing.json`. A page whose slug is\n * also a folder of other pages may live at `<slug>/index.json` instead; both are accepted.\n */\nexport function pageFileFor(slug: string): string {\n return slug === \"\" ? \"home.json\" : `${slug}.json`;\n}\n\n/** Slugs a page file location may hold (`a/b.json` → `a/b`; `a/index.json` → `a`). */\nexport function slugsForPageFile(rel: string): string[] {\n const noExt = rel.replace(/\\\\/g, \"/\").replace(/\\.json$/, \"\");\n if (noExt === \"home\" || noExt === \"index\") return [\"\"];\n if (noExt.endsWith(\"/index\")) return [noExt.slice(0, -\"/index\".length), noExt];\n return [noExt];\n}\n\n/** Whether a page file location is acceptable for a slug. */\nexport function pageFileMatchesSlug(rel: string, slug: string): boolean {\n return slugsForPageFile(rel).includes(slug);\n}\n\nconst NAME_KIND: Record<string, CollectionKind> = {\n blog: \"blog\",\n journal: \"blog\",\n news: \"blog\",\n posts: \"blog\",\n writing: \"blog\",\n events: \"events\",\n calendar: \"events\",\n portfolio: \"portfolio\",\n projects: \"portfolio\",\n work: \"portfolio\",\n podcast: \"podcast\",\n episodes: \"podcast\",\n products: \"products\",\n shop: \"products\",\n store: \"products\",\n};\n\n/** Item kind for a collection: its `_collection.json` kind, else a conventional folder name. */\nexport function collectionKind(\n name: string,\n config: CollectionConfig | undefined,\n): CollectionKind | undefined {\n if (config && config.kind !== \"custom\") return config.kind;\n if (config?.kind === \"custom\") return undefined;\n if ((COLLECTION_KINDS as readonly string[]).includes(name)) return name as CollectionKind;\n return NAME_KIND[name];\n}\n\nexport interface ParsedItemFile {\n frontmatter: Record<string, unknown>;\n body: string;\n}\n\nconst FRONTMATTER_RE = /^---\\r?\\n([\\s\\S]*?)\\r?\\n?---\\r?\\n?/;\n\n/** Split a `.mdoc` file into YAML frontmatter and Markdoc body. */\nexport function parseItemFile(source: string): ParsedItemFile {\n const m = FRONTMATTER_RE.exec(source);\n if (!m) return { frontmatter: {}, body: source };\n const raw = parseYaml(m[1] ?? \"\") as unknown;\n const frontmatter =\n raw && typeof raw === \"object\" && !Array.isArray(raw) ? (raw as Record<string, unknown>) : {};\n let body = source.slice(m[0].length);\n if (body.startsWith(\"\\r\\n\")) body = body.slice(2);\n else if (body.startsWith(\"\\n\")) body = body.slice(1);\n return { frontmatter, body };\n}\n\n/** Inverse of {@link parseItemFile}: `---\\n<yaml>---\\n\\n<body>`. */\nexport function serializeItemFile(item: Pick<CollectionItem, \"frontmatter\" | \"body\">): string {\n const clean = JSON.parse(JSON.stringify(item.frontmatter)) as Record<string, unknown>;\n const yaml = stringifyYaml(clean, { lineWidth: 0 });\n return `---\\n${yaml}---\\n${item.body ? `\\n${item.body}` : \"\"}`;\n}\n","import { resolve } from \"node:path\";\nimport { Command, CommanderError } from \"commander\";\nimport { renderAgentsMd, writeAgentsMd } from \"./agents\";\nimport { type Budgets, formatReport, githubAnnotations, runCheck } from \"./check\";\nimport { runDev, type Spawner } from \"./dev\";\nimport { EJECT_WARNING, runEject } from \"./eject\";\nimport { type GatedSyncDeps, runGatedSync } from \"./gated-sync\";\nimport { CliError, colorEnabled, type Io, paint } from \"./io\";\nimport { runMcp } from \"./mcp\";\nimport { runMigrate } from \"./migrate\";\nimport { runNew } from \"./new\";\n\nexport const VERSION = \"0.1.0\";\n\n/** Build the `openspace` command tree. Commands report problems by throwing `CliError`. */\nexport interface ProgramDeps {\n spawner?: Spawner;\n findBin?: (cwd: string) => string | undefined;\n gatedSync?: GatedSyncDeps;\n}\n\nexport function createProgram(\n io: Io,\n setExit: (code: number) => void,\n deps: ProgramDeps = {},\n): Command {\n const program = new Command(\"openspace\")\n .description(\"Check, preview, migrate, scaffold and serve OpenSpace sites to Claude (MCP).\")\n .version(VERSION)\n .configureOutput({ writeOut: (s) => io.out(s.trimEnd()), writeErr: (s) => io.err(s.trimEnd()) })\n .exitOverride();\n\n program\n .command(\"check\")\n .argument(\"[dir]\", \"site folder (default: the current folder)\")\n .description(\"Validate content: schemas, links, images, size budgets and secrets.\")\n .option(\"--ci\", \"CI mode: also print GitHub Actions annotations\")\n .option(\"--json\", \"print the report as JSON\")\n .option(\"--media-warn-mb <n>\", \"media folder warning threshold in MB\", Number)\n .option(\"--media-fail-mb <n>\", \"media folder failure threshold in MB\", Number)\n .action(\n async (\n dir: string | undefined,\n opts: {\n ci?: boolean;\n json?: boolean;\n mediaWarnMb?: number;\n mediaFailMb?: number;\n },\n ) => {\n const budgets: Partial<Budgets> = {};\n if (opts.mediaWarnMb !== undefined) budgets.mediaWarnBytes = opts.mediaWarnMb * 1024 * 1024;\n if (opts.mediaFailMb !== undefined) budgets.mediaFailBytes = opts.mediaFailMb * 1024 * 1024;\n const report = await runCheck(resolve(io.cwd, dir ?? \".\"), { budgets });\n if (opts.json) {\n io.out(JSON.stringify(report, null, 2));\n } else {\n if (opts.ci) for (const line of githubAnnotations(report)) io.out(line);\n const color = colorEnabled(io);\n io.out(formatReport(report, (code, s) => paint(color, code, s)));\n }\n if (!report.ok) setExit(1);\n },\n );\n\n program\n .command(\"dev\")\n .description(\"Start the local preview (astro dev) in this site.\")\n .allowUnknownOption()\n .argument(\"[astroArgs...]\", \"extra arguments passed to astro dev\")\n .action(async (args: string[]) => {\n setExit(await runDev(io, args, deps.spawner, deps.findBin));\n });\n\n program\n .command(\"migrate\")\n .description(\"Upgrade content to the current schema version and write it back.\")\n .option(\"--dry-run\", \"report what would change without writing\")\n .action(async (opts: { dryRun?: boolean }) => {\n const r = await runMigrate(io.cwd, { dryRun: opts.dryRun });\n if (!r.applied.length && !r.blocksMigrated) {\n io.out(`Already up to date (schema version ${r.to}). Nothing changed.`);\n return;\n }\n io.out(`Migrated schema version ${r.from} -> ${r.to}.`);\n for (const a of r.applied) io.out(` ${a}`);\n if (r.blocksMigrated)\n io.out(` Upgraded ${r.blocksMigrated} block(s) to their latest version.`);\n io.out(opts.dryRun ? \"Dry run, would write:\" : `Wrote ${r.written.length} file(s):`);\n for (const f of r.written) io.out(` ${f}`);\n for (const f of r.removed) io.out(` ${opts.dryRun ? \"would remove\" : \"removed\"} ${f}`);\n });\n\n program\n .command(\"new\")\n .description(\"Create a new site from a template.\")\n .argument(\"<template>\", \"template id (for example: meadow)\")\n .argument(\"<dir>\", \"folder to create\")\n .option(\"--target <target>\", \"github-pages or cloudflare\", \"github-pages\")\n .option(\"--repo <owner/name>\", \"GitHub repository, used for the Pages address\")\n .option(\"--url <url>\", \"address the site is served from before a custom domain\")\n .option(\"--domain <hostname>\", \"custom domain\")\n .option(\"--title <title>\", \"site title\")\n .option(\"--hub <url>\", \"Hub address\")\n .option(\"--templates-dir <dir>\", \"folder holding template directories\")\n .action(\n async (\n template: string,\n dir: string,\n opts: {\n target: string;\n repo?: string;\n url?: string;\n domain?: string;\n title?: string;\n hub?: string;\n templatesDir?: string;\n },\n ) => {\n if (opts.target !== \"github-pages\" && opts.target !== \"cloudflare\")\n throw new CliError(`--target must be github-pages or cloudflare, not \"${opts.target}\".`);\n const r = await runNew(io, template, dir, { ...opts, target: opts.target });\n if (r.usedFallback)\n io.out(\n `Note: template \"${template}\" has no content of its own yet, so the Meadow sample site (${r.contentFrom}) was used instead.`,\n );\n io.out(\n `Created ${r.dir} (${r.files} shell files, site id ${r.siteId}, template ${r.templateId}).`,\n );\n io.out(\"Next:\");\n io.out(` cd ${dir}`);\n io.out(\" npm install\");\n io.out(\" npx openspace check\");\n io.out(\" npx openspace dev\");\n if (opts.url === undefined && opts.repo === undefined && !opts.domain)\n io.out(\"Set deploy.url in openspace.json to where the site will be published.\");\n },\n );\n\n program\n .command(\"eject\")\n .description(\"Copy the site kit into src/openspace-kit and remove the dependency.\")\n .option(\"-y, --yes\", \"confirm without asking\")\n .action(async (opts: { yes?: boolean }) => {\n io.err(EJECT_WARNING);\n if (!opts.yes) throw new CliError(\"Re-run with --yes to eject.\");\n const r = await runEject(io);\n io.out(`Copied ${r.files} files from ${r.copiedFrom}.`);\n for (const f of r.rewritten) io.out(` rewrote imports in ${f}`);\n if (r.addedDependencies.length)\n io.out(`Added dependencies: ${r.addedDependencies.join(\", \")}. Run \"npm install\".`);\n io.out(\"Done. Studio can no longer edit this site.\");\n });\n\n program\n .command(\"gated-sync\")\n .description(\n \"Publish workflow (Cloudflare): put this version's members-only and password pages into the Worker's private storage.\",\n )\n .option(\"--bucket <name>\", \"R2 bucket (default: the OS_GATED bucket in wrangler.jsonc)\")\n .action(async (opts: { bucket?: string }) => {\n await runGatedSync(io, opts, deps.gatedSync);\n });\n\n program\n .command(\"agents-md\")\n .description(\"Regenerate AGENTS.md from the schema and block library.\")\n .option(\"--stdout\", \"print instead of writing the file\")\n .action(async (opts: { stdout?: boolean }) => {\n if (opts.stdout) {\n io.out((await renderAgentsMd(io.cwd)).trimEnd());\n return;\n }\n const { changed } = await writeAgentsMd(io.cwd);\n io.out(changed ? \"Updated AGENTS.md.\" : \"AGENTS.md is already up to date.\");\n });\n\n program\n .command(\"mcp\")\n .argument(\"[dir]\", \"site folder (default: the current folder)\")\n .description(\"Run the local MCP server (stdio) so Claude can edit and design this site.\")\n .option(\"--no-publish\", \"don't allow the publish tool (commits) on this connection\")\n .option(\"--no-screenshots\", \"don't start a browser for screenshots\")\n .option(\"--preview-port <n>\", \"port for the local preview server (default: random)\", Number)\n .action(\n async (\n dir: string | undefined,\n opts: { publish?: boolean; screenshots?: boolean; previewPort?: number },\n ) => {\n // stdout is the MCP protocol channel; runMcp only talks on stderr.\n await runMcp(io, resolve(io.cwd, dir ?? \".\"), {\n publish: opts.publish,\n screenshots: opts.screenshots,\n previewPort: opts.previewPort,\n });\n },\n );\n\n return program;\n}\n\n/** Run the CLI with `argv` (without node and script) and return the exit code. */\nexport async function run(argv: string[], io: Io, deps: ProgramDeps = {}): Promise<number> {\n let code = 0;\n const program = createProgram(\n io,\n (c) => {\n code = c;\n },\n deps,\n );\n try {\n await program.parseAsync(argv, { from: \"user\" });\n } catch (e) {\n if (e instanceof CommanderError) return e.exitCode;\n if (e instanceof CliError) {\n io.err(`Error: ${e.message}`);\n return e.exitCode;\n }\n const err = e as Error & { issues?: unknown };\n io.err(`Error: ${err.message}`);\n return 1;\n }\n return code;\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\n/** Render `AGENTS.md` for the site in `root` (title from content/site.json when readable). */\nexport async function renderAgentsMd(root: string, siteTitle?: string): Promise<string> {\n let title = siteTitle;\n if (!title) {\n try {\n const site = JSON.parse(await readFile(join(root, \"content/site.json\"), \"utf8\")) as {\n title?: unknown;\n };\n if (typeof site.title === \"string\") title = site.title;\n } catch {\n // No site yet: use the generic heading.\n }\n }\n // Loaded lazily: site-kit's entry pulls in the whole build pipeline.\n const { generateAgentsMd } = await import(\"@omniharmonic/openspace-site-kit/agents-md\");\n return generateAgentsMd(title ? { siteTitle: title } : {});\n}\n\nexport async function writeAgentsMd(\n root: string,\n siteTitle?: string,\n): Promise<{ changed: boolean }> {\n const next = await renderAgentsMd(root, siteTitle);\n let prev: string | undefined;\n try {\n prev = await readFile(join(root, \"AGENTS.md\"), \"utf8\");\n } catch {\n prev = undefined;\n }\n if (prev === next) return { changed: false };\n await writeFile(join(root, \"AGENTS.md\"), next);\n return { changed: true };\n}\n","import { type ChildProcess, spawn } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport { CliError, type Io } from \"./io\";\nimport { compareVersions } from \"./semver\";\n\n/** Astro 7 refuses to start below this Node version. */\nexport const ASTRO_MIN_NODE = \"22.23.4\";\n\nexport type Spawner = (cmd: string, args: string[], opts: { cwd: string }) => ChildProcess;\n\n/** Find the astro CLI entry for the site in `cwd`. */\nexport function findAstroBin(cwd: string): string | undefined {\n try {\n const req = createRequire(join(cwd, \"package.json\"));\n const pkgPath = req.resolve(\"astro/package.json\");\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf8\")) as {\n bin?: string | Record<string, string>;\n };\n const rel = typeof pkg.bin === \"string\" ? pkg.bin : pkg.bin?.astro;\n if (!rel) return undefined;\n const bin = join(dirname(pkgPath), rel);\n return existsSync(bin) ? bin : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Run `astro dev` in the site; resolves with astro's exit code. */\nexport async function runDev(\n io: Io,\n args: string[],\n spawner: Spawner = (c, a, o) => spawn(c, a, { ...o, stdio: \"inherit\" }),\n findBin: (cwd: string) => string | undefined = findAstroBin,\n): Promise<number> {\n if (compareVersions(io.nodeVersion, ASTRO_MIN_NODE) < 0)\n throw new CliError(\n `Astro needs Node ${ASTRO_MIN_NODE} or newer, but this is Node ${io.nodeVersion}.\\nInstall a newer Node 22 (for example with nvm: \"nvm install 22 && nvm use 22\") and run \"openspace dev\" again.`,\n );\n if (!existsSync(join(io.cwd, \"openspace.json\")))\n throw new CliError('No openspace.json here. Run \"openspace dev\" from the root of your site.');\n const bin = findBin(io.cwd);\n if (!bin)\n throw new CliError(\n 'Astro is not installed in this site. Run \"npm install\" first, then try again.',\n );\n const child = spawner(process.execPath, [bin, \"dev\", ...args], { cwd: io.cwd });\n return new Promise((resolve, reject) => {\n child.on(\"error\", reject);\n child.on(\"exit\", (code, signal) => resolve(code ?? (signal ? 1 : 0)));\n });\n}\n","/** Compare dotted numeric versions: negative if a < b. */\nexport function compareVersions(a: string, b: string): number {\n const pa = a.split(\".\").map((n) => Number.parseInt(n, 10) || 0);\n const pb = b.split(\".\").map((n) => Number.parseInt(n, 10) || 0);\n for (let i = 0; i < Math.max(pa.length, pb.length); i++) {\n const d = (pa[i] ?? 0) - (pb[i] ?? 0);\n if (d !== 0) return d;\n }\n return 0;\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { cp, mkdir, readdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join, posix, relative, sep } from \"node:path\";\nimport { CliError, type Io } from \"./io\";\n\nexport const KIT_PACKAGE = \"@omniharmonic/openspace-site-kit\";\nexport const EJECT_DIR = \"src/openspace-kit\";\n\nexport interface EjectResult {\n copiedFrom: string;\n files: number;\n rewritten: string[];\n addedDependencies: string[];\n}\n\ninterface KitPackage {\n root: string;\n json: {\n version?: string;\n dependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n exports?: Record<string, { default?: string } | string>;\n };\n sourceDir: string;\n}\n\nfunction locateKit(cwd: string): KitPackage {\n // Find node_modules/@omniharmonic/openspace-site-kit by walking up; resolving the entry would fail for a\n // published layout whose exports point at dist files that are not installed.\n let pkgRoot: string | undefined;\n for (let dir = cwd; ; ) {\n const candidate = join(dir, \"node_modules\", \"@omniharmonic\", \"openspace-site-kit\");\n if (existsSync(join(candidate, \"package.json\"))) {\n pkgRoot = candidate;\n break;\n }\n const up = dirname(dir);\n if (up === dir) break;\n dir = up;\n }\n if (!pkgRoot)\n throw new CliError(\n `${KIT_PACKAGE} is not installed in this site, so there is nothing to eject.`,\n );\n const json = JSON.parse(\n readFileSync(join(pkgRoot, \"package.json\"), \"utf8\"),\n ) as KitPackage[\"json\"];\n const sourceDir = join(pkgRoot, \"src\");\n if (!existsSync(join(sourceDir, \"index.ts\")))\n throw new CliError(\n `The installed ${KIT_PACKAGE}${json.version ? ` ${json.version}` : \"\"} ships only built output (dist/), and ejecting built JavaScript would give you code nobody can maintain.\\nInstall a version that ships its source (${KIT_PACKAGE} with a src/ folder) and run \"openspace eject\" again. Nothing was changed.`,\n );\n return { root: pkgRoot, json, sourceDir };\n}\n\nasync function walk(dir: string): Promise<string[]> {\n const out: string[] = [];\n for (const e of await readdir(dir, { withFileTypes: true })) {\n const abs = join(dir, e.name);\n if (e.isDirectory()) out.push(...(await walk(abs)));\n else out.push(abs);\n }\n return out;\n}\n\n/**\n * Source file (relative to the kit's `src/`) behind an export target. A published package's\n * exports point at `./dist/x.js` while `src/x.ts` ships alongside; the workspace's point at\n * `./src/x.ts` directly.\n */\nexport function sourceFor(target: string): string | undefined {\n const t = target.replace(/^\\.\\//, \"\");\n if (t.startsWith(\"src/\")) return t.slice(4);\n if (t.startsWith(\"dist/\")) return t.slice(5).replace(/\\.(?:m?js|d\\.ts)$/, \".ts\");\n return undefined;\n}\n\n/**\n * Map each `@omniharmonic/openspace-site-kit[/sub]` specifier to the ejected file it will resolve to.\n * Every mapped file must exist in the kit's source; otherwise eject fails before writing.\n */\nfunction specifierMap(kit: KitPackage): Map<string, string> {\n const map = new Map<string, string>();\n for (const [key, value] of Object.entries(kit.json.exports ?? {})) {\n const target = typeof value === \"string\" ? value : value.default;\n if (!target) continue;\n const spec = key === \".\" ? KIT_PACKAGE : `${KIT_PACKAGE}/${key.slice(2)}`;\n const inSrc = sourceFor(target);\n if (!inSrc || !existsSync(join(kit.sourceDir, inSrc)))\n throw new CliError(\n `Cannot eject: ${spec} is exported as ${target}, but its source file${inSrc ? ` src/${inSrc}` : \"\"} is not in the package. Nothing was changed.`,\n );\n map.set(spec, `${EJECT_DIR}/${inSrc}`);\n }\n return map;\n}\n\n/**\n * Rewrite the integration's entrypoint table (src/entrypoints.ts) to project-relative paths.\n * Throws if the table is missing, has no kit specifiers, or any is left unresolved.\n */\nexport function rewriteEntrypoints(source: string, specs: Map<string, string>): string {\n let count = 0;\n const out = source.replace(\n /([\"'])(@omniharmonic\\/openspace-site-kit(?:\\/[\\w./-]+)?)\\1/g,\n (_m, q, spec) => {\n const target = specs.get(spec);\n if (!target)\n throw new CliError(`Cannot eject: entrypoint ${spec} is not in the kit's exports.`);\n count++;\n return `${q}./${target}${q}`;\n },\n );\n if (count === 0 || /[\"']@omniharmonic\\/openspace-site-kit/.test(out))\n throw new CliError(\n \"Cannot eject: src/entrypoints.ts in this site-kit version is not in the expected shape. Nothing was changed.\",\n );\n return out;\n}\n\n/** `./a/b` style relative specifier from file `from` to repo path `to`. */\nfunction relSpec(from: string, to: string): string {\n const r = posix.relative(posix.dirname(from), to);\n return r.startsWith(\".\") ? r : `./${r}`;\n}\n\n/**\n * Copy the kit's source into `src/openspace-kit/`, point the site's imports at it and drop the\n * npm dependency. Studio edits only un-ejected sites, so callers must confirm first.\n */\nexport async function runEject(io: Io): Promise<EjectResult> {\n const root = io.cwd;\n const pkgPath = join(root, \"package.json\");\n if (!existsSync(pkgPath))\n throw new CliError(\"No package.json here. Run this from your site's root.\");\n const pkg = JSON.parse(await readFile(pkgPath, \"utf8\")) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n if (existsSync(join(root, EJECT_DIR)))\n throw new CliError(`${EJECT_DIR} already exists; this site looks ejected already.`);\n if (!pkg.dependencies?.[KIT_PACKAGE] && !pkg.devDependencies?.[KIT_PACKAGE])\n throw new CliError(`${KIT_PACKAGE} is not a dependency of this site; nothing to eject.`);\n\n const kit = locateKit(root);\n const specs = specifierMap(kit);\n const entrypointsFile = join(kit.sourceDir, \"entrypoints.ts\");\n if (!existsSync(entrypointsFile))\n throw new CliError(\n \"Cannot eject: this site-kit version has no src/entrypoints.ts. Update @omniharmonic/openspace-site-kit first. Nothing was changed.\",\n );\n // Everything that can fail is computed before the first write.\n const patchedEntrypoints = rewriteEntrypoints(await readFile(entrypointsFile, \"utf8\"), specs);\n\n const dest = join(root, EJECT_DIR);\n // Rewrite the site's own imports.\n const rewritten: string[] = [];\n const edits: { abs: string; next: string }[] = [];\n const candidates = [\n ...(await readdir(root)).filter((f) => /^astro\\.config\\.[mc]?[jt]s$/.test(f)),\n ...(existsSync(join(root, \"src\"))\n ? (await walk(join(root, \"src\")))\n .filter((f) => !f.startsWith(dest) && /\\.(?:astro|[mc]?[jt]sx?)$/.test(f))\n .map((f) => relative(root, f).split(sep).join(\"/\"))\n : []),\n ];\n for (const rel of candidates) {\n const abs = join(root, rel);\n const text = await readFile(abs, \"utf8\");\n const next = text.replace(\n /([\"'])(@omniharmonic\\/openspace-site-kit(?:\\/[\\w./-]+)?)\\1/g,\n (m, q, spec) => {\n const target = specs.get(spec);\n return target ? `${q}${relSpec(rel, target)}${q}` : m;\n },\n );\n if (next !== text) edits.push({ abs, next });\n if (next !== text) rewritten.push(rel);\n }\n\n // The kit's own dependencies become the site's.\n const deps = { ...(pkg.dependencies ?? {}) };\n const dev = { ...(pkg.devDependencies ?? {}) };\n delete deps[KIT_PACKAGE];\n delete dev[KIT_PACKAGE];\n const added: string[] = [];\n const kitDeps = { ...kit.json.dependencies };\n for (const [name, range] of Object.entries(kitDeps)) {\n if (deps[name] || dev[name]) continue;\n // Published packages carry real ranges; a workspace range is meaningless outside the monorepo.\n deps[name] = range.startsWith(\"workspace:\") ? `^${kit.json.version ?? \"0.1.0\"}` : range;\n added.push(name);\n }\n const out = { ...pkg, dependencies: sortKeys(deps) } as Record<string, unknown>;\n if (Object.keys(dev).length) out.devDependencies = sortKeys(dev);\n else delete out.devDependencies;\n const pkgText = `${JSON.stringify(out, null, 2)}\\n`;\n\n // Apply: copy, rewrite, then update the site. Any failure rolls everything back.\n const originals = new Map<string, string>();\n let files: number;\n try {\n await mkdir(dest, { recursive: true });\n await cp(kit.sourceDir, dest, {\n recursive: true,\n filter: (src) => !/\\.(?:test|spec)\\.[tj]sx?$/.test(src) && !src.endsWith(\".map\"),\n });\n await writeFile(join(dest, \"entrypoints.ts\"), patchedEntrypoints);\n files = (await walk(dest)).length;\n for (const e of [...edits, { abs: pkgPath, next: pkgText }]) {\n const original = await readFile(e.abs, \"utf8\");\n await writeFile(e.abs, e.next);\n originals.set(e.abs, original); // only files actually changed are restored\n }\n } catch (e) {\n try {\n for (const [abs, text] of originals) await writeFile(abs, text);\n } finally {\n await rm(dest, { recursive: true, force: true });\n }\n throw e;\n }\n\n return { copiedFrom: kit.sourceDir, files, rewritten, addedDependencies: added.sort() };\n}\n\nfunction sortKeys<T>(o: Record<string, T>): Record<string, T> {\n return Object.fromEntries(Object.entries(o).sort(([a], [b]) => a.localeCompare(b)));\n}\n\nexport const EJECT_WARNING =\n \"Ejecting copies the OpenSpace site kit into src/openspace-kit and removes it as a dependency.\\n\" +\n \"OpenSpace Studio and automatic updates stop working for this site: you own the code from now on.\\n\" +\n \"This cannot be undone automatically.\";\n","/**\n * `openspace gated-sync` — run by the Cloudflare publish workflow before `wrangler deploy`.\n *\n * Members-only and password pages are committed as stubs (title, slug, access, `contentRef`);\n * their content is kept by the Hub. This command asks GitHub for the run's OIDC identity token\n * (audience: the Hub), downloads exactly the content versions the checked-out commit names from\n * `<hub>/ci/sites/<siteId>/gated`, and puts them into the Worker's private R2 bucket at\n * `pages/<pageId>/<contentRef>.json`, where the deployed Worker reads them. Nothing is written to\n * the build output or the repository.\n */\nimport { spawn } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { mkdtemp, readdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, join, relative } from \"node:path\";\nimport { CliError, type Io } from \"./io\";\n\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;\n/** Run wrangler with `args`; resolves with its exit code. */\nexport type WranglerRunner = (args: string[], cwd: string) => Promise<number>;\n\nexport interface GatedSyncDeps {\n fetch?: FetchLike;\n wrangler?: WranglerRunner;\n}\n\ninterface Stub {\n id: string;\n ref: string;\n}\n\nasync function pageFiles(dir: string): Promise<string[]> {\n if (!existsSync(dir)) return [];\n const out: string[] = [];\n for (const e of await readdir(dir, { withFileTypes: true })) {\n const p = join(dir, e.name);\n if (e.isDirectory()) out.push(...(await pageFiles(p)));\n else if (e.name.endsWith(\".json\")) out.push(p);\n }\n return out;\n}\n\n/** Sealed gated-page stubs in the working copy (pages whose content the Hub keeps). */\nexport async function sealedStubs(root: string): Promise<Stub[]> {\n const stubs: Stub[] = [];\n for (const file of await pageFiles(join(root, \"content/pages\"))) {\n let page: { id?: unknown; contentRef?: unknown };\n try {\n page = JSON.parse(await readFile(file, \"utf8\")) as typeof page;\n } catch {\n throw new CliError(`${relative(root, file)} is not valid JSON.`);\n }\n if (typeof page.id === \"string\" && typeof page.contentRef === \"string\")\n stubs.push({ id: page.id, ref: page.contentRef });\n }\n return stubs;\n}\n\n/** The `OS_GATED` bucket name from wrangler.jsonc (comments allowed). */\nexport function gatedBucketName(root: string): string | undefined {\n const path = join(root, \"wrangler.jsonc\");\n if (!existsSync(path)) return undefined;\n const text = readFileSync(path, \"utf8\")\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\")\n .replace(/^\\s*\\/\\/.*$/gm, \"\")\n .replace(/,(\\s*[}\\]])/g, \"$1\");\n try {\n const config = JSON.parse(text) as {\n r2_buckets?: Array<{ binding?: string; bucket_name?: string }>;\n };\n return config.r2_buckets?.find((b) => b.binding === \"OS_GATED\")?.bucket_name;\n } catch {\n throw new CliError(\"wrangler.jsonc could not be read.\");\n }\n}\n\nfunction findWranglerBin(cwd: string): string | undefined {\n try {\n const req = createRequire(join(cwd, \"package.json\"));\n const pkgPath = req.resolve(\"wrangler/package.json\");\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf8\")) as {\n bin?: string | Record<string, string>;\n };\n const rel = typeof pkg.bin === \"string\" ? pkg.bin : (pkg.bin?.wrangler ?? pkg.bin?.wrangler2);\n return rel ? join(dirname(pkgPath), rel) : undefined;\n } catch {\n return undefined;\n }\n}\n\nconst defaultWrangler: WranglerRunner = (args, cwd) => {\n const bin = findWranglerBin(cwd);\n if (!bin) throw new CliError('wrangler is not installed in this site. Run \"npm install\" first.');\n const child = spawn(process.execPath, [bin, ...args], { cwd, stdio: \"inherit\" });\n return new Promise((resolve, reject) => {\n child.on(\"error\", reject);\n child.on(\"exit\", (code, signal) => resolve(code ?? (signal ? 1 : 0)));\n });\n};\n\n/** The run's GitHub Actions OIDC token for `audience` (needs `permissions: id-token: write`). */\nasync function actionsToken(io: Io, fetchFn: FetchLike, audience: string): Promise<string> {\n const url = io.env.ACTIONS_ID_TOKEN_REQUEST_URL;\n const bearer = io.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN;\n if (!url || !bearer)\n throw new CliError(\n \"Private pages are published from the site's GitHub Actions workflow only (it needs `permissions: id-token: write`).\",\n );\n const u = new URL(url);\n u.searchParams.set(\"audience\", audience);\n const res = await fetchFn(u.toString(), { headers: { authorization: `Bearer ${bearer}` } });\n const body = (await res.json().catch(() => ({}))) as { value?: string };\n if (!res.ok || !body.value)\n throw new CliError(`GitHub didn't issue a workflow identity token (${res.status}).`);\n return body.value;\n}\n\nexport interface GatedSyncResult {\n uploaded: number;\n bucket: string | null;\n}\n\nexport async function runGatedSync(\n io: Io,\n opts: { bucket?: string } = {},\n deps: GatedSyncDeps = {},\n): Promise<GatedSyncResult> {\n const root = io.cwd;\n const configPath = join(root, \"openspace.json\");\n if (!existsSync(configPath))\n throw new CliError('No openspace.json here. Run \"openspace gated-sync\" from the site root.');\n const config = JSON.parse(await readFile(configPath, \"utf8\")) as {\n siteId: string;\n hub: string;\n deploy?: { target?: string };\n };\n const stubs = await sealedStubs(root);\n if (!stubs.length) {\n io.out(\"No members-only or password pages to upload.\");\n return { uploaded: 0, bucket: null };\n }\n if (config.deploy?.target !== \"cloudflare\")\n throw new CliError(\n \"Members-only and password pages need Cloudflare hosting (Studio → Settings → Hosting).\",\n );\n const bucket = opts.bucket ?? gatedBucketName(root);\n if (!bucket)\n throw new CliError('wrangler.jsonc has no \"bucket_name\" for the OS_GATED R2 binding.');\n const fetchFn = deps.fetch ?? ((input, init) => fetch(input, init));\n const hubUrl = new URL(config.hub);\n const local = [\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(hubUrl.hostname);\n if (hubUrl.protocol !== \"https:\" && !(hubUrl.protocol === \"http:\" && local))\n throw new CliError(`The Hub address must use https (got ${hubUrl.origin}).`);\n const hub = config.hub.replace(/\\/+$/, \"\");\n const token = await actionsToken(io, fetchFn, hub);\n const res = await fetchFn(`${hub}/ci/sites/${encodeURIComponent(config.siteId)}/gated`, {\n headers: { authorization: `Bearer ${token}`, accept: \"application/json\" },\n });\n const body = (await res.json().catch(() => ({}))) as {\n pages?: Array<{ id: string; ref: string; page: unknown }>;\n error?: { message?: string };\n };\n if (!res.ok || !Array.isArray(body.pages))\n throw new CliError(\n `The Hub didn't hand over this version's private pages (${res.status}${body.error?.message ? `: ${body.error.message}` : \"\"}).`,\n );\n const byKey = new Map(body.pages.map((p) => [`${p.id}/${p.ref}`, p]));\n const missing = stubs.filter((s) => !byKey.has(`${s.id}/${s.ref}`));\n if (missing.length)\n throw new CliError(\n `The Hub is missing private page content for ${missing.map((m) => m.id).join(\", \")}.`,\n );\n const wrangler = deps.wrangler ?? defaultWrangler;\n // Idempotent: an existing bucket makes this fail, which is fine; `put` below is what counts.\n await wrangler([\"r2\", \"bucket\", \"create\", bucket], root);\n const tmp = await mkdtemp(join(tmpdir(), \"os-gated-\"));\n try {\n for (const s of stubs) {\n const entry = byKey.get(`${s.id}/${s.ref}`);\n const file = join(tmp, `${s.id}-${s.ref}.json`);\n await writeFile(file, JSON.stringify(entry?.page), { mode: 0o600 });\n const code = await wrangler(\n [\n \"r2\",\n \"object\",\n \"put\",\n `${bucket}/pages/${s.id}/${s.ref}.json`,\n \"--file\",\n file,\n \"--content-type\",\n \"application/json\",\n \"--remote\",\n ],\n root,\n );\n if (code !== 0) throw new CliError(`Uploading ${s.id} to ${bucket} failed.`);\n }\n } finally {\n await rm(tmp, { recursive: true, force: true });\n }\n io.out(`Uploaded ${stubs.length} private page(s) to ${bucket}.`);\n return { uploaded: stubs.length, bucket };\n}\n","/**\n * `openspace mcp [dir]`: the shared OpenSpace MCP tool set over stdio against a local site\n * (arch §10.4). stdout carries the protocol; everything human goes to stderr.\n */\nimport type { Readable, Writable } from \"node:stream\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createMcpServer, type ImageResizer } from \"@omniharmonic/openspace-mcp-tools\";\nimport { CliError, type Io } from \"../io\";\nimport { FileSiteStore } from \"./file-store\";\nimport { createScreenshotter, loadPlaywright } from \"./screenshot\";\n\nexport { FileSiteStore } from \"./file-store\";\nexport { startPreviewServer } from \"./preview-server\";\n\nexport interface McpOptions {\n publish?: boolean;\n previewPort?: number;\n screenshots?: boolean;\n stdin?: Readable;\n stdout?: Writable;\n}\n\n/** sharp (optional) as the image resizer for uploads above 2400px. */\nasync function loadResizer(): Promise<ImageResizer | undefined> {\n try {\n const spec = \"sharp\";\n const mod = (await import(/* @vite-ignore */ spec)) as { default: (b: Uint8Array) => unknown };\n // biome-ignore lint/suspicious/noExplicitAny: optional dependency without types here\n const sharp = mod.default as any;\n return async (bytes, maxEdge) => {\n const out = await sharp(bytes)\n .rotate()\n .resize({ width: maxEdge, height: maxEdge, fit: \"inside\", withoutEnlargement: true })\n .toBuffer({ resolveWithObject: true });\n return { bytes: new Uint8Array(out.data), width: out.info.width, height: out.info.height };\n };\n } catch {\n return undefined;\n }\n}\n\n/** Run the stdio server until the client disconnects. */\nexport async function runMcp(io: Io, dir: string, opts: McpOptions = {}): Promise<void> {\n let store: FileSiteStore;\n const pw =\n opts.screenshots === false\n ? { error: \"disabled with --no-screenshots\" }\n : await loadPlaywright();\n try {\n store = await FileSiteStore.open(dir, {\n previewPort: opts.previewPort,\n resize: await loadResizer(),\n screenshotter: \"chromium\" in pw ? createScreenshotter(pw.chromium) : undefined,\n });\n } catch (e) {\n throw new CliError(`Can't serve ${dir}: ${e instanceof Error ? e.message : String(e)}`);\n }\n const server = createMcpServer(\n store,\n { sites: \"*\", publish: opts.publish !== false, role: \"owner\" },\n {\n onError: (e, where) =>\n io.err(`openspace mcp: ${where}: ${e instanceof Error ? e.stack : String(e)}`),\n },\n );\n const transport = new StdioServerTransport(\n opts.stdin ?? process.stdin,\n opts.stdout ?? process.stdout,\n );\n const closed = new Promise<void>((resolve) => {\n transport.onclose = () => resolve();\n });\n (opts.stdin ?? process.stdin).once(\"end\", () => void transport.close());\n await server.connect(transport);\n io.err(\n `openspace mcp: serving ${dir} over stdio (${store.capabilities.canPublish ? \"git: publish commits content\" : \"no git: edits are saved to files\"}; screenshots ${store.capabilities.canScreenshot ? \"on\" : `off — ${\"error\" in pw ? pw.error : \"\"}`}).`,\n );\n await closed;\n await server.close();\n await store.close();\n}\n","// Should be no imports here!\n\n/**\n * The sentinel value returned by producers to replace the draft with undefined.\n */\nexport const NOTHING: unique symbol = Symbol.for(\"immer-nothing\")\n\n/**\n * To let Immer treat your class instances as plain immutable objects\n * (albeit with a custom prototype), you must define either an instance property\n * or a static property on each of your custom classes.\n *\n * Otherwise, your class instance will never be drafted, which means it won't be\n * safe to mutate in a produce callback.\n */\nexport const DRAFTABLE: unique symbol = Symbol.for(\"immer-draftable\")\n\nexport const DRAFT_STATE: unique symbol = Symbol.for(\"immer-state\")\n","import {isFunction} from \"../internal\"\n\nexport const errors =\n\tprocess.env.NODE_ENV !== \"production\"\n\t\t? [\n\t\t\t\t// All error codes, starting by 0:\n\t\t\t\tfunction (plugin: string) {\n\t\t\t\t\treturn `The plugin for '${plugin}' has not been loaded into Immer. To enable the plugin, import and call \\`enable${plugin}()\\` when initializing your application.`\n\t\t\t\t},\n\t\t\t\tfunction (thing: string) {\n\t\t\t\t\treturn `produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '${thing}'`\n\t\t\t\t},\n\t\t\t\t\"This object has been frozen and should not be mutated\",\n\t\t\t\tfunction (data: any) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t\"Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? \" +\n\t\t\t\t\t\tdata\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\t\"An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.\",\n\t\t\t\t\"Immer forbids circular references\",\n\t\t\t\t\"The first or second argument to `produce` must be a function\",\n\t\t\t\t\"The third argument to `produce` must be a function or undefined\",\n\t\t\t\t\"First argument to `createDraft` must be a plain object, an array, or an immerable object\",\n\t\t\t\t\"First argument to `finishDraft` must be a draft returned by `createDraft`\",\n\t\t\t\tfunction (thing: string) {\n\t\t\t\t\treturn `'current' expects a draft, got: ${thing}`\n\t\t\t\t},\n\t\t\t\t\"Object.defineProperty() cannot be used on an Immer draft\",\n\t\t\t\t\"Object.setPrototypeOf() cannot be used on an Immer draft\",\n\t\t\t\t\"Immer only supports deleting array indices\",\n\t\t\t\t\"Immer only supports setting array indices and the 'length' property\",\n\t\t\t\tfunction (thing: string) {\n\t\t\t\t\treturn `'original' expects a draft, got: ${thing}`\n\t\t\t\t}\n\t\t\t\t// Note: if more errors are added, the errorOffset in Patches.ts should be increased\n\t\t\t\t// See Patches.ts for additional errors\n\t\t\t]\n\t\t: []\n\nexport function die(error: number, ...args: any[]): never {\n\tif (process.env.NODE_ENV !== \"production\") {\n\t\tconst e = errors[error]\n\t\tconst msg = isFunction(e) ? e.apply(null, args as any) : e\n\t\tthrow new Error(`[Immer] ${msg}`)\n\t}\n\tthrow new Error(\n\t\t`[Immer] minified error nr: ${error}. Full error at: https://bit.ly/3cXEKWf`\n\t)\n}\n","import {\n\tDRAFT_STATE,\n\tDRAFTABLE,\n\tObjectish,\n\tDraft,\n\tAnyObject,\n\tAnyMap,\n\tAnySet,\n\tImmerState,\n\tArchType,\n\tdie,\n\tStrictMode\n} from \"../internal\"\n\nconst O = Object\n\nexport const getPrototypeOf = O.getPrototypeOf\n\nexport const CONSTRUCTOR = \"constructor\"\nexport const PROTOTYPE = \"prototype\"\n\nexport const CONFIGURABLE = \"configurable\"\nexport const ENUMERABLE = \"enumerable\"\nexport const WRITABLE = \"writable\"\nexport const VALUE = \"value\"\n\n/** Returns true if the given value is an Immer draft */\n/*#__PURE__*/\nexport let isDraft = (value: any): boolean => !!value && !!value[DRAFT_STATE]\n\n/**\n * Returns true if the given value is an Immer draft that has been modified,\n * either directly or through one of its nested drafts. Modifications made to\n * a nested draft mark all of its parent drafts as modified as well, so this\n * also reports modifications that happened anywhere inside the given draft.\n * Returns false for values that are not drafts.\n */\n/*#__PURE__*/\nexport function isModified(value: any): boolean {\n\tif (!isDraft(value)) return false\n\treturn value[DRAFT_STATE].modified_\n}\n\n/** Returns true if the given value can be drafted by Immer */\n/*#__PURE__*/\nexport function isDraftable(value: any): boolean {\n\tif (!value) return false\n\treturn (\n\t\tisPlainObject(value) ||\n\t\tisArray(value) ||\n\t\t!!value[DRAFTABLE] ||\n\t\t!!value[CONSTRUCTOR]?.[DRAFTABLE] ||\n\t\tisMap(value) ||\n\t\tisSet(value)\n\t)\n}\n\nconst objectCtorString = O[PROTOTYPE][CONSTRUCTOR].toString()\nconst cachedCtorStrings = new WeakMap()\n/*#__PURE__*/\nexport function isPlainObject(value: any): boolean {\n\tif (!value || !isObjectish(value)) return false\n\tconst proto = getPrototypeOf(value)\n\tif (proto === null || proto === O[PROTOTYPE]) return true\n\n\tconst Ctor = O.hasOwnProperty.call(proto, CONSTRUCTOR) && proto[CONSTRUCTOR]\n\tif (Ctor === Object) return true\n\n\tif (!isFunction(Ctor)) return false\n\n\tlet ctorString = cachedCtorStrings.get(Ctor)\n\tif (ctorString === undefined) {\n\t\tctorString = Function.toString.call(Ctor)\n\t\tcachedCtorStrings.set(Ctor, ctorString)\n\t}\n\n\treturn ctorString === objectCtorString\n}\n\n/** Get the underlying object that is represented by the given draft */\n/*#__PURE__*/\nexport function original<T>(value: Draft<T>): T\nexport function original(value: Draft<any>): any {\n\tif (!isDraft(value)) die(15, value)\n\treturn value[DRAFT_STATE].base_\n}\n\n/**\n * Each iterates a map, set or array.\n * Or, if any other kind of object, all of its own properties.\n *\n * @param obj The object to iterate over\n * @param iter The iterator function\n * @param strict When true (default), includes symbols and non-enumerable properties.\n * When false, uses looseiteration over only enumerable string properties.\n */\nexport function each<T extends Objectish>(\n\tobj: T,\n\titer: (key: string | number, value: any, source: T) => void,\n\tstrict?: boolean\n): void\nexport function each(obj: any, iter: any, strict: boolean = true) {\n\tif (getArchtype(obj) === ArchType.Object) {\n\t\t// If strict, we do a full iteration including symbols and non-enumerable properties\n\t\t// Otherwise, we only iterate enumerable string properties for performance\n\t\tconst keys = strict ? Reflect.ownKeys(obj) : O.keys(obj)\n\t\tkeys.forEach(key => {\n\t\t\titer(key, obj[key], obj)\n\t\t})\n\t} else {\n\t\tobj.forEach((entry: any, index: any) => iter(index, entry, obj))\n\t}\n}\n\n/*#__PURE__*/\nexport function getArchtype(thing: any): ArchType {\n\tconst state: undefined | ImmerState = thing[DRAFT_STATE]\n\treturn state\n\t\t? state.type_\n\t\t: isArray(thing)\n\t\t? ArchType.Array\n\t\t: isMap(thing)\n\t\t? ArchType.Map\n\t\t: isSet(thing)\n\t\t? ArchType.Set\n\t\t: ArchType.Object\n}\n\n/*#__PURE__*/\nexport let has = (\n\tthing: any,\n\tprop: PropertyKey,\n\ttype = getArchtype(thing)\n): boolean =>\n\ttype === ArchType.Map\n\t\t? thing.has(prop)\n\t\t: O[PROTOTYPE].hasOwnProperty.call(thing, prop)\n\n/*#__PURE__*/\nexport let get = (\n\tthing: AnyMap | AnyObject,\n\tprop: PropertyKey,\n\ttype = getArchtype(thing)\n): any =>\n\t// @ts-ignore\n\ttype === ArchType.Map ? thing.get(prop) : thing[prop]\n\n/*#__PURE__*/\nexport let set = (\n\tthing: any,\n\tpropOrOldValue: PropertyKey,\n\tvalue: any,\n\ttype = getArchtype(thing)\n) => {\n\tif (type === ArchType.Map) thing.set(propOrOldValue, value)\n\telse if (type === ArchType.Set) {\n\t\tthing.add(value)\n\t} else thing[propOrOldValue] = value\n}\n\n/*#__PURE__*/\nexport function is(x: any, y: any): boolean {\n\t// From: https://github.com/facebook/fbjs/blob/c69904a511b900266935168223063dd8772dfc40/packages/fbjs/src/core/shallowEqual.js\n\tif (x === y) {\n\t\treturn x !== 0 || 1 / x === 1 / y\n\t} else {\n\t\treturn x !== x && y !== y\n\t}\n}\n\nexport let isArray = Array.isArray\n\n/*#__PURE__*/\nexport let isMap = (target: any): target is AnyMap => target instanceof Map\n\n/*#__PURE__*/\nexport let isSet = (target: any): target is AnySet => target instanceof Set\n\nexport let isObjectish = (target: any) => typeof target === \"object\"\n\nexport let isFunction = (target: any): target is Function =>\n\ttypeof target === \"function\"\n\nexport let isBoolean = (target: any): target is boolean =>\n\ttypeof target === \"boolean\"\n\nexport function isArrayIndex(value: string | number): value is number | string {\n\tconst n = +value\n\treturn Number.isInteger(n) && String(n) === value\n}\n\nexport let getProxyDraft = <T extends any>(value: T): ImmerState | null => {\n\tif (!isObjectish(value)) return null\n\treturn (value as {[DRAFT_STATE]: any})?.[DRAFT_STATE]\n}\n\n/*#__PURE__*/\nexport let latest = (state: ImmerState): any => state.copy_ || state.base_\n\nexport let getValue = <T extends object>(value: T): T => {\n\tconst proxyDraft = getProxyDraft(value)\n\t// Use the copy only if the draft was actually modified. An unmodified\n\t// draft can still have a copy_ (e.g. the get trap caches child drafts\n\t// there), and using it would both break structural sharing and leak\n\t// soon-to-be-revoked child drafts into the result.\n\treturn proxyDraft ? getFinalValue(proxyDraft) : value\n}\n\nexport let getFinalValue = (state: ImmerState): any =>\n\tstate.modified_ ? state.copy_ : state.base_\n\n/*#__PURE__*/\nexport function shallowCopy(base: any, strict: StrictMode) {\n\tif (isMap(base)) {\n\t\treturn new Map(base)\n\t}\n\tif (isSet(base)) {\n\t\treturn new Set(base)\n\t}\n\tif (isArray(base)) return Array[PROTOTYPE].slice.call(base)\n\n\tconst isPlain = isPlainObject(base)\n\n\tif (strict === true || (strict === \"class_only\" && !isPlain)) {\n\t\t// Perform a strict copy\n\t\tconst descriptors = O.getOwnPropertyDescriptors(base)\n\t\tdelete descriptors[DRAFT_STATE as any]\n\t\tlet keys = Reflect.ownKeys(descriptors)\n\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\tconst key: any = keys[i]\n\t\t\tconst desc = descriptors[key]\n\t\t\tif (desc[WRITABLE] === false) {\n\t\t\t\tdesc[WRITABLE] = true\n\t\t\t\tdesc[CONFIGURABLE] = true\n\t\t\t}\n\t\t\t// like object.assign, we will read any _own_, get/set accessors. This helps in dealing\n\t\t\t// with libraries that trap values, like mobx or vue\n\t\t\t// unlike object.assign, non-enumerables will be copied as well\n\t\t\tif (desc.get || desc.set)\n\t\t\t\tdescriptors[key] = {\n\t\t\t\t\t[CONFIGURABLE]: true,\n\t\t\t\t\t[WRITABLE]: true, // could live with !!desc.set as well here...\n\t\t\t\t\t[ENUMERABLE]: desc[ENUMERABLE],\n\t\t\t\t\t[VALUE]: base[key]\n\t\t\t\t}\n\t\t}\n\t\treturn O.create(getPrototypeOf(base), descriptors)\n\t} else {\n\t\t// perform a sloppy copy\n\t\tconst proto = getPrototypeOf(base)\n\t\tif (proto !== null && isPlain) {\n\t\t\treturn {...base} // assumption: better inner class optimization than the assign below\n\t\t}\n\t\tconst obj = O.create(proto)\n\t\treturn O.assign(obj, base)\n\t}\n}\n\n/**\n * Freezes draftable objects. Returns the original object.\n * By default freezes shallowly, but if the second argument is `true` it will freeze recursively.\n *\n * @param obj\n * @param deep\n */\nexport function freeze<T>(obj: T, deep?: boolean): T\nexport function freeze<T>(obj: any, deep: boolean = false): T {\n\tif (isFrozen(obj) || isDraft(obj) || !isDraftable(obj)) return obj\n\tif (getArchtype(obj) > 1 /* Map or Set */) {\n\t\tO.defineProperties(obj, {\n\t\t\tset: dontMutateMethodOverride,\n\t\t\tadd: dontMutateMethodOverride,\n\t\t\tclear: dontMutateMethodOverride,\n\t\t\tdelete: dontMutateMethodOverride\n\t\t})\n\t}\n\tO.freeze(obj)\n\tif (deep)\n\t\t// See #590, don't recurse into non-enumerable / Symbol properties when freezing\n\t\t// So use Object.values (only string-like, enumerables) instead of each()\n\t\teach(\n\t\t\tobj,\n\t\t\t(_key, value) => {\n\t\t\t\tfreeze(value, true)\n\t\t\t},\n\t\t\tfalse\n\t\t)\n\treturn obj\n}\n\nfunction dontMutateFrozenCollections() {\n\tdie(2)\n}\n\nconst dontMutateMethodOverride = {\n\t[VALUE]: dontMutateFrozenCollections\n}\n\nexport function isFrozen(obj: any): boolean {\n\t// Fast path: primitives and null/undefined are always \"frozen\"\n\tif (obj === null || !isObjectish(obj)) return true\n\treturn O.isFrozen(obj)\n}\n","import {\n\tImmerState,\n\tPatch,\n\tDrafted,\n\tImmerBaseState,\n\tAnyMap,\n\tAnySet,\n\tArchType,\n\tdie,\n\tImmerScope,\n\tProxyArrayState\n} from \"../internal\"\n\nexport const PluginMapSet = \"MapSet\"\nexport const PluginPatches = \"Patches\"\nexport const PluginArrayMethods = \"ArrayMethods\"\n\nexport type PatchesPlugin = {\n\tgeneratePatches_(\n\t\tstate: ImmerState,\n\t\tbasePath: PatchPath,\n\t\trootScope: ImmerScope\n\t): void\n\tgenerateReplacementPatches_(\n\t\tbase: any,\n\t\treplacement: any,\n\t\trootScope: ImmerScope\n\t): void\n\tapplyPatches_<T>(draft: T, patches: readonly Patch[]): T\n\tgetPath: (state: ImmerState) => PatchPath | null\n}\n\nexport type MapSetPlugin = {\n\tproxyMap_<T extends AnyMap>(target: T, parent?: ImmerState): [T, ImmerState]\n\tproxySet_<T extends AnySet>(target: T, parent?: ImmerState): [T, ImmerState]\n\tfixSetContents: (state: ImmerState) => void\n}\n\nexport type ArrayMethodsPlugin = {\n\tcreateMethodInterceptor: (state: ProxyArrayState, method: string) => Function\n\tisArrayOperationMethod: (method: string) => boolean\n\tisMutatingArrayMethod: (method: string) => boolean\n}\n\n/** Plugin utilities */\nconst plugins: {\n\tPatches?: PatchesPlugin\n\tMapSet?: MapSetPlugin\n\tArrayMethods?: ArrayMethodsPlugin\n} = {}\n\ntype Plugins = typeof plugins\n\nexport function getPlugin<K extends keyof Plugins>(\n\tpluginKey: K\n): Exclude<Plugins[K], undefined> {\n\tconst plugin = plugins[pluginKey]\n\tif (!plugin) {\n\t\tdie(0, pluginKey)\n\t}\n\t// @ts-ignore\n\treturn plugin\n}\n\nexport let isPluginLoaded = <K extends keyof Plugins>(pluginKey: K): boolean =>\n\t!!plugins[pluginKey]\n\nexport let clearPlugin = <K extends keyof Plugins>(pluginKey: K): void => {\n\tdelete plugins[pluginKey]\n}\n\nexport function loadPlugin<K extends keyof Plugins>(\n\tpluginKey: K,\n\timplementation: Plugins[K]\n): void {\n\tif (!plugins[pluginKey]) plugins[pluginKey] = implementation\n}\n/** Map / Set plugin */\n\nexport interface MapState extends ImmerBaseState {\n\ttype_: ArchType.Map\n\tcopy_: AnyMap | undefined\n\tbase_: AnyMap\n\trevoked_: boolean\n\tdraft_: Drafted<AnyMap, MapState>\n}\n\nexport interface SetState extends ImmerBaseState {\n\ttype_: ArchType.Set\n\tcopy_: AnySet | undefined\n\tbase_: AnySet\n\tdrafts_: Map<any, Drafted> // maps the original value to the draft value in the new set\n\trevoked_: boolean\n\tdraft_: Drafted<AnySet, SetState>\n}\n\n/** Patches plugin */\n\nexport type PatchPath = (string | number)[]\n","import {\n\tPatch,\n\tPatchListener,\n\tDrafted,\n\tImmer,\n\tDRAFT_STATE,\n\tImmerState,\n\tArchType,\n\tgetPlugin,\n\tPatchesPlugin,\n\tMapSetPlugin,\n\tisPluginLoaded,\n\tPluginMapSet,\n\tPluginPatches,\n\tArrayMethodsPlugin,\n\tPluginArrayMethods\n} from \"../internal\"\n\n/** Each scope represents a `produce` call. */\n\nexport interface ImmerScope {\n\tpatches_?: Patch[]\n\tinversePatches_?: Patch[]\n\tpatchPlugin_?: PatchesPlugin\n\tmapSetPlugin_?: MapSetPlugin\n\tarrayMethodsPlugin_?: ArrayMethodsPlugin\n\tcanAutoFreeze_: boolean\n\tdrafts_: any[]\n\tparent_?: ImmerScope\n\tpatchListener_?: PatchListener\n\timmer_: Immer\n\tunfinalizedDrafts_: number\n\thandledSet_: Set<any>\n\tprocessedForPatches_: Set<any>\n}\n\nlet currentScope: ImmerScope | undefined\n\nexport let getCurrentScope = () => currentScope!\n\nlet createScope = (\n\tparent_: ImmerScope | undefined,\n\timmer_: Immer\n): ImmerScope => ({\n\tdrafts_: [],\n\tparent_,\n\timmer_,\n\t// Whenever the modified draft contains a draft from another scope, we\n\t// need to prevent auto-freezing so the unowned draft can be finalized.\n\tcanAutoFreeze_: true,\n\tunfinalizedDrafts_: 0,\n\thandledSet_: new Set(),\n\tprocessedForPatches_: new Set(),\n\tmapSetPlugin_: isPluginLoaded(PluginMapSet)\n\t\t? getPlugin(PluginMapSet)\n\t\t: undefined,\n\tarrayMethodsPlugin_: isPluginLoaded(PluginArrayMethods)\n\t\t? getPlugin(PluginArrayMethods)\n\t\t: undefined\n})\n\nexport function usePatchesInScope(\n\tscope: ImmerScope,\n\tpatchListener?: PatchListener\n) {\n\tif (patchListener) {\n\t\tscope.patchPlugin_ = getPlugin(PluginPatches) // assert we have the plugin\n\t\tscope.patches_ = []\n\t\tscope.inversePatches_ = []\n\t\tscope.patchListener_ = patchListener\n\t}\n}\n\nexport function revokeScope(scope: ImmerScope) {\n\tleaveScope(scope)\n\tscope.drafts_.forEach(revokeDraft)\n\t// @ts-ignore\n\tscope.drafts_ = null\n}\n\nexport function leaveScope(scope: ImmerScope) {\n\tif (scope === currentScope) {\n\t\tcurrentScope = scope.parent_\n\t}\n}\n\nexport let enterScope = (immer: Immer) =>\n\t(currentScope = createScope(currentScope, immer))\n\nfunction revokeDraft(draft: Drafted) {\n\tconst state: ImmerState = draft[DRAFT_STATE]\n\tif (state.type_ === ArchType.Object || state.type_ === ArchType.Array)\n\t\tstate.revoke_()\n\telse state.revoked_ = true\n}\n","import {\n\tImmerScope,\n\tDRAFT_STATE,\n\tisDraftable,\n\tNOTHING,\n\tPatchPath,\n\teach,\n\tfreeze,\n\tImmerState,\n\tisDraft,\n\tSetState,\n\tset,\n\tArchType,\n\tgetPlugin,\n\tdie,\n\trevokeScope,\n\tisFrozen,\n\tget,\n\tPatch,\n\tlatest,\n\tprepareCopy,\n\tgetFinalValue,\n\tgetValue,\n\tProxyArrayState\n} from \"../internal\"\n\nexport function processResult(result: any, scope: ImmerScope) {\n\tscope.unfinalizedDrafts_ = scope.drafts_.length\n\tconst baseDraft = scope.drafts_![0]\n\tconst isReplaced = result !== undefined && result !== baseDraft\n\n\tif (isReplaced) {\n\t\tif (baseDraft[DRAFT_STATE].modified_) {\n\t\t\trevokeScope(scope)\n\t\t\tdie(4)\n\t\t}\n\t\tif (isDraftable(result)) {\n\t\t\t// Finalize the result in case it contains (or is) a subset of the draft.\n\t\t\tresult = finalize(scope, result)\n\t\t}\n\t\tconst {patchPlugin_} = scope\n\t\tif (patchPlugin_) {\n\t\t\tpatchPlugin_.generateReplacementPatches_(\n\t\t\t\tbaseDraft[DRAFT_STATE].base_,\n\t\t\t\tresult,\n\t\t\t\tscope\n\t\t\t)\n\t\t}\n\t} else {\n\t\t// Finalize the base draft.\n\t\tresult = finalize(scope, baseDraft)\n\t}\n\n\tmaybeFreeze(scope, result, true)\n\n\trevokeScope(scope)\n\tif (scope.patches_) {\n\t\tscope.patchListener_!(scope.patches_, scope.inversePatches_!)\n\t}\n\treturn result !== NOTHING ? result : undefined\n}\n\nfunction finalize(rootScope: ImmerScope, value: any) {\n\t// Don't recurse in tho recursive data structures\n\tif (isFrozen(value)) return value\n\n\tconst state: ImmerState = value[DRAFT_STATE]\n\tif (!state) {\n\t\tconst finalValue = handleValue(value, rootScope.handledSet_, rootScope)\n\t\treturn finalValue\n\t}\n\n\t// Never finalize drafts owned by another scope\n\tif (!isSameScope(state, rootScope)) {\n\t\treturn value\n\t}\n\n\t// Unmodified draft, return the (frozen) original\n\tif (!state.modified_) {\n\t\treturn state.base_\n\t}\n\n\tif (!state.finalized_) {\n\t\t// Execute all registered draft finalization callbacks\n\t\tconst {callbacks_} = state\n\t\tif (callbacks_) {\n\t\t\twhile (callbacks_.length > 0) {\n\t\t\t\tconst callback = callbacks_.pop()!\n\t\t\t\tcallback(rootScope)\n\t\t\t}\n\t\t}\n\n\t\tgeneratePatchesAndFinalize(state, rootScope)\n\t}\n\n\t// By now the root copy has been fully updated throughout its tree\n\treturn state.copy_\n}\n\nfunction maybeFreeze(scope: ImmerScope, value: any, deep = false) {\n\t// we never freeze for a non-root scope; as it would prevent pruning for drafts inside wrapping objects\n\tif (!scope.parent_ && scope.immer_.autoFreeze_ && scope.canAutoFreeze_) {\n\t\tfreeze(value, deep)\n\t}\n}\n\nfunction markStateFinalized(state: ImmerState) {\n\tstate.finalized_ = true\n\tstate.scope_.unfinalizedDrafts_--\n}\n\nlet isSameScope = (state: ImmerState, rootScope: ImmerScope) =>\n\tstate.scope_ === rootScope\n\n// A reusable empty array to avoid allocations\nconst EMPTY_LOCATIONS_RESULT: (string | symbol | number)[] = []\n\n// Updates all references to a draft in its parent to the finalized value.\n// This handles cases where the same draft appears multiple times in the parent, or has been moved around.\nexport function updateDraftInParent(\n\tparent: ImmerState,\n\tdraftValue: any,\n\tfinalizedValue: any,\n\toriginalKey?: string | number | symbol\n): void {\n\tconst parentCopy = latest(parent)\n\tconst parentType = parent.type_\n\n\t// Fast path: Check if draft is still at original key\n\tif (originalKey !== undefined) {\n\t\tconst currentValue = get(parentCopy, originalKey, parentType)\n\t\tif (currentValue === draftValue) {\n\t\t\t// Still at original location, just update it\n\t\t\tset(parentCopy, originalKey, finalizedValue, parentType)\n\t\t\treturn\n\t\t}\n\t}\n\n\t// Slow path: Build reverse mapping of all children\n\t// to their indices in the parent, so that we can\n\t// replace all locations where this draft appears.\n\t// We only have to build this once per parent.\n\tif (!parent.draftLocations_) {\n\t\tconst draftLocations = (parent.draftLocations_ = new Map())\n\n\t\t// Use `each` which works on Arrays, Maps, and Objects\n\t\teach(parentCopy, (key, value) => {\n\t\t\tif (isDraft(value)) {\n\t\t\t\tconst keys = draftLocations.get(value) || []\n\t\t\t\tkeys.push(key)\n\t\t\t\tdraftLocations.set(value, keys)\n\t\t\t}\n\t\t})\n\t}\n\n\t// Look up all locations where this draft appears\n\tconst locations =\n\t\tparent.draftLocations_.get(draftValue) ?? EMPTY_LOCATIONS_RESULT\n\n\t// Update all locations\n\tfor (const location of locations) {\n\t\tset(parentCopy, location, finalizedValue, parentType)\n\t}\n}\n\n// Register a callback to finalize a child draft when the parent draft is finalized.\n// This assumes there is a parent -> child relationship between the two drafts,\n// and we have a key to locate the child in the parent.\nexport function registerChildFinalizationCallback(\n\tparent: ImmerState,\n\tchild: ImmerState,\n\tkey: string | number | symbol\n) {\n\tparent.callbacks_.push(function childCleanup(rootScope) {\n\t\tconst state: ImmerState = child\n\n\t\t// Can only continue if this is a draft owned by this scope\n\t\tif (!state || !isSameScope(state, rootScope)) {\n\t\t\treturn\n\t\t}\n\n\t\t// Handle potential set value finalization first\n\t\trootScope.mapSetPlugin_?.fixSetContents(state)\n\n\t\tconst finalizedValue = getFinalValue(state)\n\n\t\t// Update all locations in the parent that referenced this draft\n\t\tupdateDraftInParent(parent, state.draft_ ?? state, finalizedValue, key)\n\n\t\tgeneratePatchesAndFinalize(state, rootScope)\n\t})\n}\n\nfunction generatePatchesAndFinalize(state: ImmerState, rootScope: ImmerScope) {\n\tconst shouldFinalize =\n\t\tstate.modified_ &&\n\t\t!state.finalized_ &&\n\t\t(state.type_ === ArchType.Set ||\n\t\t\t(state.type_ === ArchType.Array &&\n\t\t\t\t(state as ProxyArrayState).allIndicesReassigned_) ||\n\t\t\t(state.assigned_?.size ?? 0) > 0)\n\n\tif (shouldFinalize) {\n\t\tconst {patchPlugin_} = rootScope\n\t\tif (patchPlugin_) {\n\t\t\tconst basePath = patchPlugin_!.getPath(state)\n\n\t\t\tif (basePath) {\n\t\t\t\tpatchPlugin_!.generatePatches_(state, basePath, rootScope)\n\t\t\t}\n\t\t}\n\n\t\tmarkStateFinalized(state)\n\t}\n}\n\nexport function handleCrossReference(\n\ttarget: ImmerState,\n\tkey: string | number | symbol,\n\tvalue: any\n) {\n\tconst {scope_} = target\n\t// Check if value is a draft from this scope\n\tif (isDraft(value)) {\n\t\tconst state: ImmerState = value[DRAFT_STATE]\n\t\tif (isSameScope(state, scope_)) {\n\t\t\t// Register callback to update this location when the draft finalizes\n\n\t\t\tstate.callbacks_.push(function crossReferenceCleanup() {\n\t\t\t\t// Update the target location with finalized value\n\t\t\t\tprepareCopy(target)\n\n\t\t\t\tconst finalizedValue = getFinalValue(state)\n\n\t\t\t\tupdateDraftInParent(target, value, finalizedValue, key)\n\t\t\t})\n\t\t}\n\t} else if (isDraftable(value)) {\n\t\t// Handle non-draft objects that might contain drafts\n\t\ttarget.callbacks_.push(function nestedDraftCleanup() {\n\t\t\tconst targetCopy = latest(target)\n\n\t\t\t// For Sets, check if value is still in the set\n\t\t\tif (target.type_ === ArchType.Set) {\n\t\t\t\tif (targetCopy.has(value)) {\n\t\t\t\t\t// Process the value to replace any nested drafts\n\t\t\t\t\thandleValue(value, scope_.handledSet_, scope_)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Maps/objects\n\t\t\t\tif (get(targetCopy, key, target.type_) === value) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tscope_.drafts_.length > 1 &&\n\t\t\t\t\t\t((target as Exclude<ImmerState, SetState>).assigned_!.get(key) ??\n\t\t\t\t\t\t\tfalse) === true &&\n\t\t\t\t\t\ttarget.copy_\n\t\t\t\t\t) {\n\t\t\t\t\t\t// This might be a non-draft value that has drafts\n\t\t\t\t\t\t// inside. We do need to recurse here to handle those.\n\t\t\t\t\t\thandleValue(\n\t\t\t\t\t\t\tget(target.copy_, key, target.type_),\n\t\t\t\t\t\t\tscope_.handledSet_,\n\t\t\t\t\t\t\tscope_\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nexport function handleValue(\n\ttarget: any,\n\thandledSet: Set<any>,\n\trootScope: ImmerScope\n) {\n\tif (!rootScope.immer_.autoFreeze_ && rootScope.unfinalizedDrafts_ < 1) {\n\t\t// optimization: if an object is not a draft, and we don't have to\n\t\t// deepfreeze everything, and we are sure that no drafts are left in the remaining object\n\t\t// cause we saw and finalized all drafts already; we can stop visiting the rest of the tree.\n\t\t// This benefits especially adding large data tree's without further processing.\n\t\t// See add-data.js perf test\n\t\treturn target\n\t}\n\n\t// Skip if already handled, frozen, or not draftable\n\tif (\n\t\tisDraft(target) ||\n\t\thandledSet.has(target) ||\n\t\t!isDraftable(target) ||\n\t\tisFrozen(target)\n\t) {\n\t\treturn target\n\t}\n\n\thandledSet.add(target)\n\n\t// Process ALL properties/entries\n\teach(target, (key, value) => {\n\t\tif (isDraft(value)) {\n\t\t\tconst state: ImmerState = value[DRAFT_STATE]\n\t\t\tif (isSameScope(state, rootScope)) {\n\t\t\t\t// Replace draft with finalized value\n\n\t\t\t\tconst updatedValue = getFinalValue(state)\n\n\t\t\t\tset(target, key, updatedValue, target.type_)\n\n\t\t\t\tmarkStateFinalized(state)\n\t\t\t}\n\t\t} else if (isDraftable(value)) {\n\t\t\t// Recursively handle nested values\n\t\t\thandleValue(value, handledSet, rootScope)\n\t\t}\n\t})\n\n\treturn target\n}\n","import {\n\thas,\n\tis,\n\tisDraftable,\n\tshallowCopy,\n\tlatest,\n\tImmerBaseState,\n\tImmerState,\n\tDrafted,\n\tAnyObject,\n\tAnyArray,\n\tObjectish,\n\tgetCurrentScope,\n\tgetPrototypeOf,\n\tDRAFT_STATE,\n\tdie,\n\tcreateProxy,\n\tArchType,\n\thandleCrossReference,\n\tWRITABLE,\n\tCONFIGURABLE,\n\tENUMERABLE,\n\tVALUE,\n\tisArray,\n\tisArrayIndex\n} from \"../internal\"\n\ninterface ProxyBaseState extends ImmerBaseState {\n\tparent_?: ImmerState\n\trevoke_(): void\n}\n\nexport interface ProxyObjectState extends ProxyBaseState {\n\ttype_: ArchType.Object\n\tbase_: any\n\tcopy_: any\n\tdraft_: Drafted<AnyObject, ProxyObjectState>\n}\n\nexport interface ProxyArrayState extends ProxyBaseState {\n\ttype_: ArchType.Array\n\tbase_: AnyArray\n\tcopy_: AnyArray | null\n\tdraft_: Drafted<AnyArray, ProxyArrayState>\n\toperationMethod?: string\n\tallIndicesReassigned_?: boolean\n\tbaseRefs_?: Set<any>\n}\n\ntype ProxyState = ProxyObjectState | ProxyArrayState\n\n/**\n * Returns a new draft of the `base` object.\n *\n * The second argument is the parent draft-state (used internally).\n */\nexport function createProxyProxy<T extends Objectish>(\n\tbase: T,\n\tparent?: ImmerState\n): [Drafted<T, ProxyState>, ProxyState] {\n\tconst baseIsArray = isArray(base)\n\tconst state: ProxyState = {\n\t\ttype_: baseIsArray ? ArchType.Array : (ArchType.Object as any),\n\t\t// Track which produce call this is associated with.\n\t\tscope_: parent ? parent.scope_ : getCurrentScope()!,\n\t\t// True for both shallow and deep changes.\n\t\tmodified_: false,\n\t\t// Used during finalization.\n\t\tfinalized_: false,\n\t\t// Track which properties have been assigned (true) or deleted (false).\n\t\t// actually instantiated in `prepareCopy()`\n\t\tassigned_: undefined,\n\t\t// The parent draft state.\n\t\tparent_: parent,\n\t\t// The base state.\n\t\tbase_: base,\n\t\t// The base proxy.\n\t\tdraft_: null as any, // set below\n\t\t// The base copy with any updated values.\n\t\tcopy_: null,\n\t\t// Called by the `produce` function.\n\t\trevoke_: null as any,\n\t\tisManual_: false,\n\t\t// `callbacks` actually gets assigned in `createProxy`\n\t\tcallbacks_: undefined as any\n\t}\n\n\t// the traps must target something, a bit like the 'real' base.\n\t// but also, we need to be able to determine from the target what the relevant state is\n\t// (to avoid creating traps per instance to capture the state in closure,\n\t// and to avoid creating weird hidden properties as well)\n\t// So the trick is to use 'state' as the actual 'target'! (and make sure we intercept everything)\n\t// Note that in the case of an array, we put the state in an array to have better Reflect defaults ootb\n\tlet target: T = state as any\n\tlet traps: ProxyHandler<object | Array<any>> = objectTraps\n\tif (baseIsArray) {\n\t\ttarget = [state] as any\n\t\ttraps = arrayTraps\n\t}\n\n\tconst {revoke, proxy} = Proxy.revocable(target, traps)\n\tstate.draft_ = proxy as any\n\tstate.revoke_ = revoke\n\treturn [proxy as any, state]\n}\n\n/**\n * Object drafts\n */\nexport const objectTraps: ProxyHandler<ProxyState> = {\n\tget(state, prop) {\n\t\tif (prop === DRAFT_STATE) return state\n\n\t\tlet arrayPlugin = state.scope_.arrayMethodsPlugin_\n\t\tconst isArrayWithStringProp =\n\t\t\tstate.type_ === ArchType.Array && typeof prop === \"string\"\n\t\t// Intercept array methods so that we can override\n\t\t// behavior and skip proxy creation for perf\n\t\tif (isArrayWithStringProp) {\n\t\t\tif (arrayPlugin?.isArrayOperationMethod(prop)) {\n\t\t\t\treturn arrayPlugin.createMethodInterceptor(state, prop)\n\t\t\t}\n\t\t}\n\n\t\tconst source = latest(state)\n\t\tif (!has(source, prop, state.type_)) {\n\t\t\t// non-existing or non-own property...\n\t\t\treturn readPropFromProto(state, source, prop)\n\t\t}\n\t\tconst value = source[prop]\n\t\tif (state.finalized_ || !isDraftable(value)) {\n\t\t\treturn value\n\t\t}\n\n\t\t// During mutating array operations, defer proxy creation for array elements\n\t\t// This optimization avoids creating unnecessary proxies during sort/reverse\n\t\tif (\n\t\t\tisArrayWithStringProp &&\n\t\t\t(state as ProxyArrayState).operationMethod &&\n\t\t\tarrayPlugin?.isMutatingArrayMethod(\n\t\t\t\t(state as ProxyArrayState).operationMethod!\n\t\t\t) &&\n\t\t\tisArrayIndex(prop)\n\t\t) {\n\t\t\t// Return raw value during mutating operations, create proxy only if modified\n\t\t\treturn value\n\t\t}\n\t\t// Check for existing draft in modified state.\n\t\t// Assigned values are never drafted. This catches any drafts we created, too.\n\t\tif (\n\t\t\tvalue === peek(state.base_, prop) ||\n\t\t\tisRelocatedBaseRef(state, prop, value)\n\t\t) {\n\t\t\tprepareCopy(state)\n\t\t\t// Ensure array keys are always numbers\n\t\t\tconst childKey = state.type_ === ArchType.Array ? +(prop as string) : prop\n\t\t\tconst childDraft = createProxy(state.scope_, value, state, childKey)\n\n\t\t\treturn (state.copy_![childKey] = childDraft)\n\t\t}\n\t\treturn value\n\t},\n\thas(state, prop) {\n\t\treturn prop in latest(state)\n\t},\n\townKeys(state) {\n\t\treturn Reflect.ownKeys(latest(state))\n\t},\n\tset(\n\t\tstate: ProxyObjectState,\n\t\tprop: string /* strictly not, but helps TS */,\n\t\tvalue\n\t) {\n\t\tconst desc = getDescriptorFromProto(latest(state), prop)\n\t\tif (desc?.set) {\n\t\t\t// special case: if this write is captured by a setter, we have\n\t\t\t// to trigger it with the correct context\n\t\t\tdesc.set.call(state.draft_, value)\n\t\t\treturn true\n\t\t}\n\t\tif (!state.modified_) {\n\t\t\t// the last check is because we need to be able to distinguish setting a non-existing to undefined (which is a change)\n\t\t\t// from setting an existing property with value undefined to undefined (which is not a change)\n\t\t\tconst current = peek(latest(state), prop)\n\t\t\t// special case, if we assigning the original value to a draft, we can ignore the assignment\n\t\t\tconst currentState: ProxyObjectState = current?.[DRAFT_STATE]\n\t\t\tif (currentState && currentState.base_ === value) {\n\t\t\t\tstate.copy_![prop] = value\n\t\t\t\t// The property still holds its base value, so nothing was assigned\n\t\t\t\t// and nothing was deleted. `false` here reads as a deletion later.\n\t\t\t\tstate.assigned_!.delete(prop)\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tif (\n\t\t\t\tis(value, current) &&\n\t\t\t\t(value !== undefined || has(state.base_, prop, state.type_))\n\t\t\t)\n\t\t\t\treturn true\n\t\t\tprepareCopy(state)\n\t\t\tmarkChanged(state)\n\t\t}\n\n\t\tif (\n\t\t\t(state.copy_![prop] === value &&\n\t\t\t\t// special case: handle new props with value 'undefined'\n\t\t\t\t(value !== undefined || has(state.copy_, prop, state.type_))) ||\n\t\t\t// special case: NaN\n\t\t\t(Number.isNaN(value) && Number.isNaN(state.copy_![prop]))\n\t\t)\n\t\t\treturn true\n\n\t\t// @ts-ignore\n\t\tstate.copy_![prop] = value\n\t\tstate.assigned_!.set(prop, true)\n\n\t\thandleCrossReference(state, prop, value)\n\t\treturn true\n\t},\n\tdeleteProperty(state, prop: string) {\n\t\tprepareCopy(state)\n\t\t// The `undefined` check is a fast path for pre-existing keys.\n\t\tif (peek(state.base_, prop) !== undefined || prop in state.base_) {\n\t\t\tstate.assigned_!.set(prop, false)\n\t\t\tmarkChanged(state)\n\t\t} else {\n\t\t\t// if an originally not assigned property was deleted\n\t\t\tstate.assigned_!.delete(prop)\n\t\t}\n\t\tif (state.copy_) {\n\t\t\tdelete state.copy_[prop]\n\t\t}\n\t\treturn true\n\t},\n\t// Note: We never coerce `desc.value` into an Immer draft, because we can't make\n\t// the same guarantee in ES5 mode.\n\tgetOwnPropertyDescriptor(state, prop) {\n\t\tconst owner = latest(state)\n\t\tconst desc = Reflect.getOwnPropertyDescriptor(owner, prop)\n\t\tif (!desc) return desc\n\t\treturn {\n\t\t\t[WRITABLE]: true,\n\t\t\t[CONFIGURABLE]: state.type_ !== ArchType.Array || prop !== \"length\",\n\t\t\t[ENUMERABLE]: desc[ENUMERABLE],\n\t\t\t[VALUE]: owner[prop]\n\t\t}\n\t},\n\tdefineProperty() {\n\t\tdie(11)\n\t},\n\tgetPrototypeOf(state) {\n\t\treturn getPrototypeOf(state.base_)\n\t},\n\tsetPrototypeOf() {\n\t\tdie(12)\n\t}\n}\n\n/**\n * Array drafts\n */\n\nconst arrayTraps: ProxyHandler<[ProxyArrayState]> = {}\n// Use `for..in` instead of `each` to work around a weird\n// prod test suite issue\nfor (let key in objectTraps) {\n\tlet fn = objectTraps[key as keyof typeof objectTraps] as Function\n\t// @ts-ignore\n\tarrayTraps[key] = function () {\n\t\tconst args = arguments\n\t\targs[0] = args[0][0]\n\t\treturn fn.apply(this, args)\n\t}\n}\narrayTraps.deleteProperty = function (state, prop) {\n\tif (process.env.NODE_ENV !== \"production\" && isNaN(parseInt(prop as any)))\n\t\tdie(13)\n\t// @ts-ignore\n\treturn arrayTraps.set!.call(this, state, prop, undefined)\n}\narrayTraps.set = function (state, prop, value) {\n\tif (\n\t\tprocess.env.NODE_ENV !== \"production\" &&\n\t\tprop !== \"length\" &&\n\t\tisNaN(parseInt(prop as any))\n\t)\n\t\tdie(14)\n\treturn objectTraps.set!.call(this, state[0], prop, value, state[0])\n}\n\n// Access a property without creating an Immer draft.\nfunction peek(draft: Drafted, prop: PropertyKey) {\n\tconst state = draft[DRAFT_STATE]\n\tconst source = state ? latest(state) : draft\n\treturn source[prop]\n}\n\n// Reordering array methods (reverse, sort) from the array-methods plugin run\n// natively on `copy_`, which still holds raw base references. This relocates an\n// un-drafted base object to a position where it no longer matches `base_[prop]`,\n// so the normal positional check above misses it and the get trap would hand back\n// the raw base object, breaking the guarantee that the base state is never mutated.\n// Detect such a relocated base reference so it is drafted before being exposed.\n//\n// Membership in `baseRefs_` is what identifies it, not `assigned_`: once elements\n// have been reordered, `assigned_` is keyed by index and no longer describes the\n// value that now sits there (e.g. a base object relocated onto an index that\n// `push` or `unshift` assigned earlier). Objects the user newly assigned are\n// never in `baseRefs_`, so they are still returned as-is.\nfunction isRelocatedBaseRef(state: ImmerState, prop: PropertyKey, value: any) {\n\tif (\n\t\tstate.type_ !== ArchType.Array ||\n\t\t!(state as ProxyArrayState).allIndicesReassigned_ ||\n\t\t!isDraftable(value) ||\n\t\tvalue[DRAFT_STATE]\n\t) {\n\t\treturn false\n\t}\n\treturn (state as ProxyArrayState).baseRefs_!.has(value)\n}\n\nfunction readPropFromProto(state: ImmerState, source: any, prop: PropertyKey) {\n\tconst desc = getDescriptorFromProto(source, prop)\n\treturn desc\n\t\t? VALUE in desc\n\t\t\t? desc[VALUE]\n\t\t\t: // This is a very special case, if the prop is a getter defined by the\n\t\t\t\t// prototype, we should invoke it with the draft as context!\n\t\t\t\tdesc.get?.call(state.draft_)\n\t\t: undefined\n}\n\nfunction getDescriptorFromProto(\n\tsource: any,\n\tprop: PropertyKey\n): PropertyDescriptor | undefined {\n\t// 'in' checks proto!\n\tif (!(prop in source)) return undefined\n\tlet proto = getPrototypeOf(source)\n\twhile (proto) {\n\t\tconst desc = Object.getOwnPropertyDescriptor(proto, prop)\n\t\tif (desc) return desc\n\t\tproto = getPrototypeOf(proto)\n\t}\n\treturn undefined\n}\n\nexport function markChanged(state: ImmerState) {\n\tif (!state.modified_) {\n\t\tstate.modified_ = true\n\t\tif (state.parent_) {\n\t\t\tmarkChanged(state.parent_)\n\t\t}\n\t}\n}\n\nexport function prepareCopy(state: ImmerState) {\n\tif (!state.copy_) {\n\t\t// Actually create the `assigned_` map now that we\n\t\t// know this is a modified draft.\n\t\tstate.assigned_ = new Map()\n\t\tstate.copy_ = shallowCopy(\n\t\t\tstate.base_,\n\t\t\tstate.scope_.immer_.useStrictShallowCopy_\n\t\t)\n\t}\n}\n","import {\n\tIProduceWithPatches,\n\tIProduce,\n\tImmerState,\n\tDrafted,\n\tisDraftable,\n\tprocessResult,\n\tPatch,\n\tObjectish,\n\tDRAFT_STATE,\n\tDraft,\n\tPatchListener,\n\tisDraft,\n\tisMap,\n\tisSet,\n\tcreateProxyProxy,\n\tgetPlugin,\n\tdie,\n\tenterScope,\n\trevokeScope,\n\tleaveScope,\n\tusePatchesInScope,\n\tgetCurrentScope,\n\tNOTHING,\n\tfreeze,\n\tcurrent,\n\tImmerScope,\n\tregisterChildFinalizationCallback,\n\tArchType,\n\tMapSetPlugin,\n\tAnyMap,\n\tAnySet,\n\tisObjectish,\n\tisFunction,\n\tisBoolean,\n\tPluginMapSet,\n\tPluginPatches\n} from \"../internal\"\n\ninterface ProducersFns {\n\tproduce: IProduce\n\tproduceWithPatches: IProduceWithPatches\n}\n\nexport type StrictMode = boolean | \"class_only\"\n\nexport class Immer implements ProducersFns {\n\tautoFreeze_: boolean = true\n\tuseStrictShallowCopy_: StrictMode = false\n\tuseStrictIteration_: boolean = false\n\n\tconstructor(config?: {\n\t\tautoFreeze?: boolean\n\t\tuseStrictShallowCopy?: StrictMode\n\t\tuseStrictIteration?: boolean\n\t}) {\n\t\tif (isBoolean(config?.autoFreeze)) this.setAutoFreeze(config!.autoFreeze)\n\t\tif (isBoolean(config?.useStrictShallowCopy))\n\t\t\tthis.setUseStrictShallowCopy(config!.useStrictShallowCopy)\n\t\tif (isBoolean(config?.useStrictIteration))\n\t\t\tthis.setUseStrictIteration(config!.useStrictIteration)\n\t}\n\n\t/**\n\t * The `produce` function takes a value and a \"recipe function\" (whose\n\t * return value often depends on the base state). The recipe function is\n\t * free to mutate its first argument however it wants. All mutations are\n\t * only ever applied to a __copy__ of the base state.\n\t *\n\t * Pass only a function to create a \"curried producer\" which relieves you\n\t * from passing the recipe function every time.\n\t *\n\t * Only plain objects and arrays are made mutable. All other objects are\n\t * considered uncopyable.\n\t *\n\t * Note: This function is __bound__ to its `Immer` instance.\n\t *\n\t * @param {any} base - the initial state\n\t * @param {Function} recipe - function that receives a proxy of the base state as first argument and which can be freely modified\n\t * @param {Function} patchListener - optional function that will be called with all the patches produced here\n\t * @returns {any} a new state, or the initial state if nothing was modified\n\t */\n\tproduce: IProduce = (base: any, recipe?: any, patchListener?: any) => {\n\t\t// curried invocation\n\t\tif (isFunction(base) && !isFunction(recipe)) {\n\t\t\tconst defaultBase = recipe\n\t\t\trecipe = base\n\n\t\t\tconst self = this\n\t\t\treturn function curriedProduce(\n\t\t\t\tthis: any,\n\t\t\t\tbase = defaultBase,\n\t\t\t\t...args: any[]\n\t\t\t) {\n\t\t\t\treturn self.produce(base, (draft: Drafted) => recipe.call(this, draft, ...args)) // prettier-ignore\n\t\t\t}\n\t\t}\n\n\t\tif (!isFunction(recipe)) die(6)\n\t\tif (patchListener !== undefined && !isFunction(patchListener)) die(7)\n\n\t\tlet result\n\n\t\t// Only plain objects, arrays, and \"immerable classes\" are drafted.\n\t\tif (isDraftable(base)) {\n\t\t\tconst scope = enterScope(this)\n\t\t\tconst proxy = createProxy(scope, base, undefined)\n\t\t\tlet hasError = true\n\t\t\ttry {\n\t\t\t\tresult = recipe(proxy)\n\t\t\t\thasError = false\n\t\t\t} finally {\n\t\t\t\t// finally instead of catch + rethrow better preserves original stack\n\t\t\t\tif (hasError) revokeScope(scope)\n\t\t\t\telse leaveScope(scope)\n\t\t\t}\n\t\t\tusePatchesInScope(scope, patchListener)\n\t\t\treturn processResult(result, scope)\n\t\t} else if (!base || !isObjectish(base)) {\n\t\t\tresult = recipe(base)\n\t\t\tif (result === undefined) result = base\n\t\t\tif (result === NOTHING) result = undefined\n\t\t\tif (this.autoFreeze_) freeze(result, true)\n\t\t\tif (patchListener) {\n\t\t\t\tconst p: Patch[] = []\n\t\t\t\tconst ip: Patch[] = []\n\t\t\t\tgetPlugin(PluginPatches).generateReplacementPatches_(base, result, {\n\t\t\t\t\tpatches_: p,\n\t\t\t\t\tinversePatches_: ip\n\t\t\t\t} as ImmerScope) // dummy scope\n\t\t\t\tpatchListener(p, ip)\n\t\t\t}\n\t\t\treturn result\n\t\t} else die(1, base)\n\t}\n\n\tproduceWithPatches: IProduceWithPatches = (base: any, recipe?: any): any => {\n\t\t// curried invocation\n\t\tif (isFunction(base)) {\n\t\t\treturn (state: any, ...args: any[]) =>\n\t\t\t\tthis.produceWithPatches(state, (draft: any) => base(draft, ...args))\n\t\t}\n\n\t\tlet patches: Patch[], inversePatches: Patch[]\n\t\tconst result = this.produce(base, recipe, (p: Patch[], ip: Patch[]) => {\n\t\t\tpatches = p\n\t\t\tinversePatches = ip\n\t\t})\n\t\treturn [result, patches!, inversePatches!]\n\t}\n\n\tcreateDraft<T extends Objectish>(base: T): Draft<T> {\n\t\tif (!isDraftable(base)) die(8)\n\t\tif (isDraft(base)) base = current(base as Draft<T>)\n\t\tconst scope = enterScope(this)\n\t\tconst proxy = createProxy(scope, base, undefined)\n\t\tproxy[DRAFT_STATE].isManual_ = true\n\t\tleaveScope(scope)\n\t\treturn proxy as any\n\t}\n\n\tfinishDraft<D extends Draft<any>>(\n\t\tdraft: D,\n\t\tpatchListener?: PatchListener\n\t): D extends Draft<infer T> ? T : never {\n\t\tconst state: ImmerState = draft && (draft as any)[DRAFT_STATE]\n\t\tif (!state || !state.isManual_) die(9)\n\t\tconst {scope_: scope} = state\n\t\tusePatchesInScope(scope, patchListener)\n\t\treturn processResult(undefined, scope)\n\t}\n\n\t/**\n\t * Pass true to automatically freeze all copies created by Immer.\n\t *\n\t * By default, auto-freezing is enabled.\n\t */\n\tsetAutoFreeze(value: boolean) {\n\t\tthis.autoFreeze_ = value\n\t}\n\n\t/**\n\t * Pass true to enable strict shallow copy.\n\t *\n\t * By default, immer does not copy the object descriptors such as getter, setter and non-enumrable properties.\n\t */\n\tsetUseStrictShallowCopy(value: StrictMode) {\n\t\tthis.useStrictShallowCopy_ = value\n\t}\n\n\t/**\n\t * Pass false to use faster iteration that skips non-enumerable properties\n\t * but still handles symbols for compatibility.\n\t *\n\t * By default, strict iteration is enabled (includes all own properties).\n\t */\n\tsetUseStrictIteration(value: boolean) {\n\t\tthis.useStrictIteration_ = value\n\t}\n\n\tshouldUseStrictIteration(): boolean {\n\t\treturn this.useStrictIteration_\n\t}\n\n\tapplyPatches<T extends Objectish>(base: T, patches: readonly Patch[]): T {\n\t\t// If a patch replaces the entire state, take that replacement as base\n\t\t// before applying patches\n\t\tlet i: number\n\t\tfor (i = patches.length - 1; i >= 0; i--) {\n\t\t\tconst patch = patches[i]\n\t\t\tif (patch.path.length === 0 && patch.op === \"replace\") {\n\t\t\t\tbase = patch.value\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\t// If there was a patch that replaced the entire state, start from the\n\t\t// patch after that.\n\t\tif (i > -1) {\n\t\t\tpatches = patches.slice(i + 1)\n\t\t}\n\n\t\tconst applyPatchesImpl = getPlugin(PluginPatches).applyPatches_\n\t\tif (isDraft(base)) {\n\t\t\t// N.B: never hits if some patch a replacement, patches are never drafts\n\t\t\treturn applyPatchesImpl(base, patches)\n\t\t}\n\t\t// Otherwise, produce a copy of the base state.\n\t\treturn this.produce(base, (draft: Drafted) =>\n\t\t\tapplyPatchesImpl(draft, patches)\n\t\t)\n\t}\n}\n\nexport function createProxy<T extends Objectish>(\n\trootScope: ImmerScope,\n\tvalue: T,\n\tparent?: ImmerState,\n\tkey?: string | number | symbol\n): Drafted<T, ImmerState> {\n\t// precondition: createProxy should be guarded by isDraftable, so we know we can safely draft\n\t// returning a tuple here lets us skip a proxy access\n\t// to DRAFT_STATE later\n\tconst [draft, state] = isMap(value)\n\t\t? getPlugin(PluginMapSet).proxyMap_(value, parent)\n\t\t: isSet(value)\n\t\t\t? getPlugin(PluginMapSet).proxySet_(value, parent)\n\t\t\t: createProxyProxy(value, parent)\n\n\tconst scope = parent?.scope_ ?? getCurrentScope()\n\tscope.drafts_.push(draft)\n\n\t// Ensure the parent callbacks are passed down so we actually\n\t// track all callbacks added throughout the tree\n\tstate.callbacks_ = parent?.callbacks_ ?? []\n\tstate.key_ = key\n\n\tif (parent && key !== undefined) {\n\t\tregisterChildFinalizationCallback(parent, state, key)\n\t} else {\n\t\t// It's a root draft, register it with the scope\n\t\tstate.callbacks_.push(function rootDraftCleanup(rootScope) {\n\t\t\trootScope.mapSetPlugin_?.fixSetContents(state)\n\n\t\t\tconst {patchPlugin_} = rootScope\n\n\t\t\tif (state.modified_ && patchPlugin_) {\n\t\t\t\tpatchPlugin_.generatePatches_(state, [], rootScope)\n\t\t\t}\n\t\t})\n\t}\n\n\treturn draft as any\n}\n","import {\n\tdie,\n\tDraft,\n\tisDraft,\n\tshallowCopy,\n\teach,\n\tDRAFT_STATE,\n\tset,\n\tImmerState,\n\tisDraftable,\n\tisFrozen,\n\tisSet\n} from \"../internal\"\n\n/** Takes a snapshot of the current state of a draft and finalizes it (but without freezing). This is a great utility to print the current state during debugging (no Proxies in the way). The output of current can also be safely leaked outside the producer. */\nexport function current<T>(value: Draft<T>): T\nexport function current(value: Draft<any>): any {\n\tif (!isDraft(value)) die(10, value)\n\treturn currentImpl(value)\n}\n\nfunction currentImpl(value: any): any {\n\tif (!isDraftable(value) || isFrozen(value)) return value\n\tconst state: ImmerState | undefined = value[DRAFT_STATE]\n\tlet copy: any\n\tlet strict = true // Default to strict for compatibility\n\tif (state) {\n\t\tif (!state.modified_) return state.base_\n\t\t// Optimization: avoid generating new drafts during copying\n\t\tstate.finalized_ = true\n\t\tcopy = shallowCopy(value, state.scope_.immer_.useStrictShallowCopy_)\n\t\tstrict = state.scope_.immer_.shouldUseStrictIteration()\n\t} else {\n\t\tcopy = shallowCopy(value, true)\n\t}\n\t// Rebuild Sets so snapshots replace their draft values in insertion order.\n\tconst source = copy\n\tif (isSet(copy)) copy = new Set()\n\t// recurse\n\teach(\n\t\tsource,\n\t\t(key, childValue) => {\n\t\t\tset(copy, key, currentImpl(childValue))\n\t\t},\n\t\tstrict\n\t)\n\tif (state) {\n\t\tstate.finalized_ = false\n\t}\n\treturn copy\n}\n","import {immerable} from \"../immer\"\nimport {\n\tImmerState,\n\tPatch,\n\tSetState,\n\tProxyArrayState,\n\tMapState,\n\tProxyObjectState,\n\tPatchPath,\n\tget,\n\teach,\n\thas,\n\tgetArchtype,\n\tgetPrototypeOf,\n\tisSet,\n\tisMap,\n\tloadPlugin,\n\tArchType,\n\tdie,\n\tisDraft,\n\tisDraftable,\n\tNOTHING,\n\terrors,\n\tDRAFT_STATE,\n\tgetProxyDraft,\n\tImmerScope,\n\tisObjectish,\n\tisFunction,\n\tCONSTRUCTOR,\n\tPluginPatches,\n\tisArray,\n\tPROTOTYPE\n} from \"../internal\"\n\nexport function enablePatches() {\n\tconst errorOffset = 16\n\tif (process.env.NODE_ENV !== \"production\") {\n\t\terrors.push(\n\t\t\t'Sets cannot have \"replace\" patches.',\n\t\t\tfunction (op: string) {\n\t\t\t\treturn \"Unsupported patch operation: \" + op\n\t\t\t},\n\t\t\tfunction (path: string) {\n\t\t\t\treturn \"Cannot apply patch, path doesn't resolve: \" + path\n\t\t\t},\n\t\t\t\"Patching reserved attributes like __proto__, prototype and constructor is not allowed\"\n\t\t)\n\t}\n\n\tfunction getPath(state: ImmerState, path: PatchPath = []): PatchPath | null {\n\t\t// Step 1: Check if state has a stored key\n\t\tif (state.key_ !== undefined) {\n\t\t\t// Step 2: Validate the key is still valid in parent\n\n\t\t\tconst parentCopy = state.parent_!.copy_ ?? state.parent_!.base_\n\t\t\tconst proxyDraft = getProxyDraft(get(parentCopy, state.key_!))\n\t\t\tconst valueAtKey = get(parentCopy, state.key_!)\n\n\t\t\tif (valueAtKey === undefined) {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\t// Check if the value at the key is still related to this draft\n\t\t\t// It should be either the draft itself or the copy. The base means the\n\t\t\t// original value was written back, which discards this draft's changes\n\t\t\tif (valueAtKey !== state.draft_ && valueAtKey !== state.copy_) {\n\t\t\t\treturn null // Value was replaced with something else\n\t\t\t}\n\t\t\tif (proxyDraft != null && proxyDraft.base_ !== state.base_) {\n\t\t\t\treturn null // Different draft\n\t\t\t}\n\n\t\t\t// Step 3: Handle Set case specially\n\t\t\tconst isSet = state.parent_!.type_ === ArchType.Set\n\t\t\tlet key: string | number\n\n\t\t\tif (isSet) {\n\t\t\t\t// For Sets, find the index in the drafts_ map\n\t\t\t\tconst setParent = state.parent_ as SetState\n\t\t\t\tkey = Array.from(setParent.drafts_.keys()).indexOf(state.key_)\n\t\t\t} else {\n\t\t\t\tkey = state.key_ as string | number\n\t\t\t}\n\n\t\t\t// Step 4: Validate key still exists in parent\n\t\t\tif (!((isSet && parentCopy.size > key) || has(parentCopy, key))) {\n\t\t\t\treturn null // Key deleted\n\t\t\t}\n\n\t\t\t// Once an array's elements have been shifted or reordered, a child's index\n\t\t\t// no longer matches its position in the base. The array generates a patch\n\t\t\t// for every index that changed (carrying the finalized child), so a nested\n\t\t\t// patch at the child's new index is redundant and, for an index past the\n\t\t\t// base length, points at a path that does not exist yet when it is applied.\n\t\t\tif (\n\t\t\t\tstate.parent_!.type_ === ArchType.Array &&\n\t\t\t\t(state.parent_ as ProxyArrayState).allIndicesReassigned_\n\t\t\t) {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\t// Step 5: Add key to path\n\t\t\tpath.push(key)\n\t\t}\n\n\t\t// Step 6: Recurse to parent if exists\n\t\tif (state.parent_) {\n\t\t\treturn getPath(state.parent_, path)\n\t\t}\n\n\t\t// Step 7: At root - reverse path and validate\n\t\tpath.reverse()\n\n\t\ttry {\n\t\t\t// Validate path can be resolved from ROOT\n\t\t\tresolvePath(state.copy_, path)\n\t\t} catch (e) {\n\t\t\treturn null // Path invalid\n\t\t}\n\n\t\treturn path\n\t}\n\n\t// NEW: Add resolvePath helper function\n\tfunction resolvePath(base: any, path: PatchPath): any {\n\t\tlet current = base\n\t\tfor (let i = 0; i < path.length - 1; i++) {\n\t\t\tconst key = path[i]\n\t\t\tcurrent = get(current, key)\n\t\t\tif (!isObjectish(current) || current === null) {\n\t\t\t\tthrow new Error(`Cannot resolve path at '${path.join(\"/\")}'`)\n\t\t\t}\n\t\t}\n\t\treturn current\n\t}\n\n\tconst REPLACE = \"replace\"\n\tconst ADD = \"add\"\n\tconst REMOVE = \"remove\"\n\n\tfunction generatePatches_(\n\t\tstate: ImmerState,\n\t\tbasePath: PatchPath,\n\t\tscope: ImmerScope\n\t): void {\n\t\tif (state.scope_.processedForPatches_.has(state)) {\n\t\t\treturn\n\t\t}\n\n\t\tstate.scope_.processedForPatches_.add(state)\n\n\t\tconst {patches_, inversePatches_} = scope\n\n\t\tswitch (state.type_) {\n\t\t\tcase ArchType.Object:\n\t\t\tcase ArchType.Map:\n\t\t\t\treturn generatePatchesFromAssigned(\n\t\t\t\t\tstate,\n\t\t\t\t\tbasePath,\n\t\t\t\t\tpatches_!,\n\t\t\t\t\tinversePatches_!\n\t\t\t\t)\n\t\t\tcase ArchType.Array:\n\t\t\t\treturn generateArrayPatches(\n\t\t\t\t\tstate,\n\t\t\t\t\tbasePath,\n\t\t\t\t\tpatches_!,\n\t\t\t\t\tinversePatches_!\n\t\t\t\t)\n\t\t\tcase ArchType.Set:\n\t\t\t\treturn generateSetPatches(\n\t\t\t\t\tstate as any as SetState,\n\t\t\t\t\tbasePath,\n\t\t\t\t\tpatches_!,\n\t\t\t\t\tinversePatches_!\n\t\t\t\t)\n\t\t}\n\t}\n\n\tfunction generateArrayPatches(\n\t\tstate: ProxyArrayState,\n\t\tbasePath: PatchPath,\n\t\tpatches: Patch[],\n\t\tinversePatches: Patch[]\n\t) {\n\t\tlet {base_, assigned_} = state\n\t\tlet copy_ = state.copy_!\n\n\t\t// Reduce complexity by ensuring `base` is never longer.\n\t\tif (copy_.length < base_.length) {\n\t\t\t// @ts-ignore\n\t\t\t;[base_, copy_] = [copy_, base_]\n\t\t\t;[patches, inversePatches] = [inversePatches, patches]\n\t\t}\n\n\t\tconst allReassigned = state.allIndicesReassigned_ === true\n\n\t\t// Process replaced indices.\n\t\tfor (let i = 0; i < base_.length; i++) {\n\t\t\tconst copiedItem = copy_[i]\n\t\t\tconst baseItem = base_[i]\n\n\t\t\tconst isAssigned = allReassigned || assigned_?.get(i.toString())\n\t\t\tif (isAssigned && copiedItem !== baseItem) {\n\t\t\t\tconst childState = copiedItem?.[DRAFT_STATE]\n\t\t\t\tif (childState && childState.modified_) {\n\t\t\t\t\t// Skip - let the child generate its own patches\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst path = basePath.concat([i])\n\t\t\t\tpatches.push({\n\t\t\t\t\top: REPLACE,\n\t\t\t\t\tpath,\n\t\t\t\t\t// Need to maybe clone it, as it can in fact be the original value\n\t\t\t\t\t// due to the base/copy inversion at the start of this function\n\t\t\t\t\tvalue: clonePatchValueIfNeeded(copiedItem)\n\t\t\t\t})\n\t\t\t\tinversePatches.push({\n\t\t\t\t\top: REPLACE,\n\t\t\t\t\tpath,\n\t\t\t\t\tvalue: clonePatchValueIfNeeded(baseItem)\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\t// Process added indices.\n\t\tfor (let i = base_.length; i < copy_.length; i++) {\n\t\t\tconst path = basePath.concat([i])\n\t\t\tpatches.push({\n\t\t\t\top: ADD,\n\t\t\t\tpath,\n\t\t\t\t// Need to maybe clone it, as it can in fact be the original value\n\t\t\t\t// due to the base/copy inversion at the start of this function\n\t\t\t\tvalue: clonePatchValueIfNeeded(copy_[i])\n\t\t\t})\n\t\t}\n\t\tfor (let i = copy_.length - 1; base_.length <= i; --i) {\n\t\t\tconst path = basePath.concat([i])\n\t\t\tinversePatches.push({\n\t\t\t\top: REMOVE,\n\t\t\t\tpath\n\t\t\t})\n\t\t}\n\t}\n\n\t// This is used for both Map objects and normal objects.\n\tfunction generatePatchesFromAssigned(\n\t\tstate: MapState | ProxyObjectState,\n\t\tbasePath: PatchPath,\n\t\tpatches: Patch[],\n\t\tinversePatches: Patch[]\n\t) {\n\t\tconst {base_, copy_, type_} = state\n\t\teach(state.assigned_!, (key, assignedValue) => {\n\t\t\tconst origValue = get(base_, key, type_)\n\t\t\tconst value = get(copy_!, key, type_)\n\t\t\tconst op = !assignedValue ? REMOVE : has(base_, key) ? REPLACE : ADD\n\t\t\tif (origValue === value && op === REPLACE) return\n\t\t\tconst path = basePath.concat(key as any)\n\t\t\tpatches.push(\n\t\t\t\top === REMOVE\n\t\t\t\t\t? {op, path}\n\t\t\t\t\t: {op, path, value: clonePatchValueIfNeeded(value)}\n\t\t\t)\n\t\t\tinversePatches.push(\n\t\t\t\top === ADD\n\t\t\t\t\t? {op: REMOVE, path}\n\t\t\t\t\t: op === REMOVE\n\t\t\t\t\t\t? {op: ADD, path, value: clonePatchValueIfNeeded(origValue)}\n\t\t\t\t\t\t: {op: REPLACE, path, value: clonePatchValueIfNeeded(origValue)}\n\t\t\t)\n\t\t})\n\t}\n\n\tfunction generateSetPatches(\n\t\tstate: SetState,\n\t\tbasePath: PatchPath,\n\t\tpatches: Patch[],\n\t\tinversePatches: Patch[]\n\t) {\n\t\tlet {base_, copy_} = state\n\n\t\tlet i = 0\n\t\tbase_.forEach((value: any) => {\n\t\t\tif (!copy_!.has(value)) {\n\t\t\t\tconst path = basePath.concat([i])\n\t\t\t\tpatches.push({\n\t\t\t\t\top: REMOVE,\n\t\t\t\t\tpath,\n\t\t\t\t\tvalue\n\t\t\t\t})\n\t\t\t\tinversePatches.unshift({\n\t\t\t\t\top: ADD,\n\t\t\t\t\tpath,\n\t\t\t\t\tvalue\n\t\t\t\t})\n\t\t\t}\n\t\t\ti++\n\t\t})\n\t\ti = 0\n\t\tcopy_!.forEach((value: any) => {\n\t\t\tif (!base_.has(value)) {\n\t\t\t\tconst path = basePath.concat([i])\n\t\t\t\tpatches.push({\n\t\t\t\t\top: ADD,\n\t\t\t\t\tpath,\n\t\t\t\t\tvalue\n\t\t\t\t})\n\t\t\t\tinversePatches.unshift({\n\t\t\t\t\top: REMOVE,\n\t\t\t\t\tpath,\n\t\t\t\t\tvalue\n\t\t\t\t})\n\t\t\t}\n\t\t\ti++\n\t\t})\n\t}\n\n\tfunction generateReplacementPatches_(\n\t\tbaseValue: any,\n\t\treplacement: any,\n\t\tscope: ImmerScope\n\t): void {\n\t\tconst {patches_, inversePatches_} = scope\n\t\tpatches_!.push({\n\t\t\top: REPLACE,\n\t\t\tpath: [],\n\t\t\tvalue: replacement === NOTHING ? undefined : replacement\n\t\t})\n\t\tinversePatches_!.push({\n\t\t\top: REPLACE,\n\t\t\tpath: [],\n\t\t\tvalue: baseValue\n\t\t})\n\t}\n\n\tfunction applyPatches_<T>(draft: T, patches: readonly Patch[]): T {\n\t\tpatches.forEach(patch => {\n\t\t\tconst {path, op} = patch\n\n\t\t\tlet base: any = draft\n\t\t\tfor (let i = 0; i < path.length - 1; i++) {\n\t\t\t\tconst parentType = getArchtype(base)\n\t\t\t\tlet p = path[i]\n\t\t\t\tif (typeof p !== \"string\" && typeof p !== \"number\") {\n\t\t\t\t\tp = \"\" + p\n\t\t\t\t}\n\n\t\t\t\t// See #738, avoid prototype pollution\n\t\t\t\tif (\n\t\t\t\t\t(parentType === ArchType.Object || parentType === ArchType.Array) &&\n\t\t\t\t\t(p === \"__proto__\" || p === CONSTRUCTOR)\n\t\t\t\t)\n\t\t\t\t\tdie(errorOffset + 3)\n\t\t\t\tif (isFunction(base) && p === PROTOTYPE) die(errorOffset + 3)\n\t\t\t\tbase = get(base, p)\n\t\t\t\tif (base === null || !isObjectish(base))\n\t\t\t\t\tdie(errorOffset + 2, path.join(\"/\"))\n\t\t\t}\n\n\t\t\tconst type = getArchtype(base)\n\t\t\tconst value = deepClonePatchValue(patch.value) // used to clone patch to ensure original patch is not modified, see #411\n\t\t\tconst key = path[path.length - 1]\n\t\t\tswitch (op) {\n\t\t\t\tcase REPLACE:\n\t\t\t\t\tswitch (type) {\n\t\t\t\t\t\tcase ArchType.Map:\n\t\t\t\t\t\t\treturn base.set(key, value)\n\t\t\t\t\t\t/* istanbul ignore next */\n\t\t\t\t\t\tcase ArchType.Set:\n\t\t\t\t\t\t\tdie(errorOffset)\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t// if value is an object, then it's assigned by reference\n\t\t\t\t\t\t\t// in the following add or remove ops, the value field inside the patch will also be modifyed\n\t\t\t\t\t\t\t// so we use value from the cloned patch\n\t\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\t\treturn (base[key] = value)\n\t\t\t\t\t}\n\t\t\t\tcase ADD:\n\t\t\t\t\tswitch (type) {\n\t\t\t\t\t\tcase ArchType.Array:\n\t\t\t\t\t\t\treturn key === \"-\"\n\t\t\t\t\t\t\t\t? base.push(value)\n\t\t\t\t\t\t\t\t: base.splice(key as any, 0, value)\n\t\t\t\t\t\tcase ArchType.Map:\n\t\t\t\t\t\t\treturn base.set(key, value)\n\t\t\t\t\t\tcase ArchType.Set:\n\t\t\t\t\t\t\treturn base.add(value)\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treturn (base[key] = value)\n\t\t\t\t\t}\n\t\t\t\tcase REMOVE:\n\t\t\t\t\tswitch (type) {\n\t\t\t\t\t\tcase ArchType.Array:\n\t\t\t\t\t\t\treturn base.splice(key as any, 1)\n\t\t\t\t\t\tcase ArchType.Map:\n\t\t\t\t\t\t\treturn base.delete(key)\n\t\t\t\t\t\tcase ArchType.Set:\n\t\t\t\t\t\t\treturn base.delete(patch.value)\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treturn delete base[key]\n\t\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tdie(errorOffset + 1, op)\n\t\t\t}\n\t\t})\n\n\t\treturn draft\n\t}\n\n\t// optimize: this is quite a performance hit, can we detect intelligently when it is needed?\n\t// E.g. auto-draft when new objects from outside are assigned and modified?\n\t// (See failing test when deepClone just returns obj)\n\tfunction deepClonePatchValue<T>(obj: T): T\n\tfunction deepClonePatchValue(obj: any) {\n\t\tif (!isDraftable(obj)) return obj\n\t\tif (isArray(obj)) return obj.map(deepClonePatchValue)\n\t\tif (isMap(obj))\n\t\t\treturn new Map(\n\t\t\t\tArray.from(obj.entries()).map(([k, v]) => [k, deepClonePatchValue(v)])\n\t\t\t)\n\t\tif (isSet(obj)) return new Set(Array.from(obj).map(deepClonePatchValue))\n\t\tconst cloned = Object.create(getPrototypeOf(obj))\n\t\tfor (const key in obj) cloned[key] = deepClonePatchValue(obj[key])\n\t\tif (has(obj, immerable)) cloned[immerable] = obj[immerable]\n\t\treturn cloned\n\t}\n\n\tfunction clonePatchValueIfNeeded<T>(obj: T): T {\n\t\tif (isDraft(obj)) {\n\t\t\treturn deepClonePatchValue(obj)\n\t\t} else return obj\n\t}\n\n\tloadPlugin(PluginPatches, {\n\t\tapplyPatches_,\n\t\tgeneratePatches_,\n\t\tgenerateReplacementPatches_,\n\t\tgetPath\n\t})\n}\n","// types only!\nimport {\n\tImmerState,\n\tAnyMap,\n\tAnySet,\n\tMapState,\n\tSetState,\n\tDRAFT_STATE,\n\tgetCurrentScope,\n\tlatest,\n\tisDraftable,\n\tcreateProxy,\n\tloadPlugin,\n\tmarkChanged,\n\tdie,\n\tArchType,\n\teach,\n\tgetValue,\n\tPluginMapSet,\n\thandleCrossReference\n} from \"../internal\"\n\n// Feature-detect `Iterator.from` (added in ES2025) without augmenting the\n// global scope. Declaring `var Iterator` in a `declare global` block leaks a\n// conflicting global variable into the bundled `.d.ts` (TS2403 when compiled\n// against the ESNext lib). We cast via `globalThis` to satisfy the type checker\n// while keeping the runtime feature detect accurate. (#1273)\nconst _globalIterator = (globalThis as any).Iterator as\n\t| undefined\n\t| { from: <T>(iterable: Iterator<T>) => IterableIterator<T> }\nconst hasIteratorFrom =\n\ttypeof _globalIterator?.from === \"function\"\n\nexport function enableMapSet() {\n\tclass DraftMap extends Map {\n\t\t[DRAFT_STATE]: MapState\n\n\t\tconstructor(target: AnyMap, parent?: ImmerState) {\n\t\t\tsuper()\n\t\t\tthis[DRAFT_STATE] = {\n\t\t\t\ttype_: ArchType.Map,\n\t\t\t\tparent_: parent,\n\t\t\t\tscope_: parent ? parent.scope_ : getCurrentScope()!,\n\t\t\t\tmodified_: false,\n\t\t\t\tfinalized_: false,\n\t\t\t\tcopy_: undefined,\n\t\t\t\tassigned_: undefined,\n\t\t\t\tbase_: target,\n\t\t\t\tdraft_: this as any,\n\t\t\t\tisManual_: false,\n\t\t\t\trevoked_: false,\n\t\t\t\tcallbacks_: []\n\t\t\t}\n\t\t}\n\n\t\tget size(): number {\n\t\t\tconst state: MapState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\treturn latest(state).size\n\t\t}\n\n\t\thas(key: any): boolean {\n\t\t\tconst state: MapState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\treturn latest(state).has(key)\n\t\t}\n\n\t\tset(key: any, value: any) {\n\t\t\tconst state: MapState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tif (!latest(state).has(key) || latest(state).get(key) !== value) {\n\t\t\t\tprepareMapCopy(state)\n\t\t\t\tmarkChanged(state)\n\t\t\t\tstate.assigned_!.set(key, true)\n\t\t\t\tstate.copy_!.set(key, value)\n\t\t\t\tstate.assigned_!.set(key, true)\n\t\t\t\thandleCrossReference(state, key, value)\n\t\t\t}\n\t\t\treturn this\n\t\t}\n\n\t\tdelete(key: any): boolean {\n\t\t\tif (!this.has(key)) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tconst state: MapState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tprepareMapCopy(state)\n\t\t\tmarkChanged(state)\n\t\t\tif (state.base_.has(key)) {\n\t\t\t\tstate.assigned_!.set(key, false)\n\t\t\t} else {\n\t\t\t\tstate.assigned_!.delete(key)\n\t\t\t}\n\t\t\tstate.copy_!.delete(key)\n\t\t\treturn true\n\t\t}\n\n\t\tclear() {\n\t\t\tconst state: MapState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tif (latest(state).size) {\n\t\t\t\tprepareMapCopy(state)\n\t\t\t\tmarkChanged(state)\n\t\t\t\tstate.assigned_ = new Map()\n\t\t\t\teach(state.base_, key => {\n\t\t\t\t\tstate.assigned_!.set(key, false)\n\t\t\t\t})\n\t\t\t\tstate.copy_!.clear()\n\t\t\t}\n\t\t}\n\n\t\tforEach(cb: (value: any, key: any, self: any) => void, thisArg?: any) {\n\t\t\tconst state: MapState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tprepareMapCopy(state)\n\t\t\tlatest(state).forEach((_value: any, key: any, _map: any) => {\n\t\t\t\tcb.call(thisArg, this.get(key), key, this)\n\t\t\t})\n\t\t}\n\n\t\tget(key: any): any {\n\t\t\tconst state: MapState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tconst value = latest(state).get(key)\n\t\t\tif (state.finalized_ || !isDraftable(value)) {\n\t\t\t\treturn value\n\t\t\t}\n\t\t\tif (value !== state.base_.get(key)) {\n\t\t\t\treturn value // either already drafted or reassigned\n\t\t\t}\n\t\t\t// despite what it looks, this creates a draft only once, see above condition\n\t\t\tconst draft = createProxy(state.scope_, value, state, key)\n\t\t\tprepareMapCopy(state)\n\t\t\tstate.copy_!.set(key, draft)\n\t\t\treturn draft\n\t\t}\n\n\t\tkeys(): IterableIterator<any> {\n\t\t\tconst state: MapState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tprepareMapCopy(state)\n\t\t\treturn latest(state).keys()\n\t\t}\n\n\t\tvalues(): IterableIterator<any> {\n\t\t\tconst iterator = this.keys()\n\t\t\treturn iteratorFrom({\n\t\t\t\tnext: () => {\n\t\t\t\t\tconst r = iterator.next()\n\t\t\t\t\t/* istanbul ignore next */\n\t\t\t\t\tif (r.done) return r\n\t\t\t\t\tconst value = this.get(r.value)\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdone: false,\n\t\t\t\t\t\tvalue\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\tentries(): IterableIterator<[any, any]> {\n\t\t\tconst iterator = this.keys()\n\t\t\treturn iteratorFrom({\n\t\t\t\tnext: () => {\n\t\t\t\t\tconst r = iterator.next()\n\t\t\t\t\t/* istanbul ignore next */\n\t\t\t\t\tif (r.done) return r\n\t\t\t\t\tconst value = this.get(r.value)\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdone: false,\n\t\t\t\t\t\tvalue: [r.value, value]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\t[Symbol.iterator]() {\n\t\t\treturn this.entries()\n\t\t}\n\t}\n\n\tfunction iteratorFrom<T, TReturn>(\n\t\titerable: Iterator<T, TReturn>\n\t): IterableIterator<T> {\n\t\tif (hasIteratorFrom) {\n\t\t\treturn _globalIterator!.from(iterable)\n\t\t}\n\n\t\tconst iterator: IterableIterator<T> = {\n\t\t\t...iterable,\n\t\t\t[Symbol.iterator]: () => iterator\n\t\t}\n\n\t\treturn iterator\n\t}\n\n\tfunction proxyMap_<T extends AnyMap>(\n\t\ttarget: T,\n\t\tparent?: ImmerState\n\t): [T, MapState] {\n\t\t// @ts-ignore\n\t\tconst map = new DraftMap(target, parent)\n\t\treturn [map as any, map[DRAFT_STATE]]\n\t}\n\n\tfunction prepareMapCopy(state: MapState) {\n\t\tif (!state.copy_) {\n\t\t\tstate.assigned_ = new Map()\n\t\t\tstate.copy_ = new Map(state.base_)\n\t\t}\n\t}\n\n\tclass DraftSet extends Set {\n\t\t[DRAFT_STATE]: SetState\n\t\tconstructor(target: AnySet, parent?: ImmerState) {\n\t\t\tsuper()\n\t\t\tthis[DRAFT_STATE] = {\n\t\t\t\ttype_: ArchType.Set,\n\t\t\t\tparent_: parent,\n\t\t\t\tscope_: parent ? parent.scope_ : getCurrentScope()!,\n\t\t\t\tmodified_: false,\n\t\t\t\tfinalized_: false,\n\t\t\t\tcopy_: undefined,\n\t\t\t\tbase_: target,\n\t\t\t\tdraft_: this,\n\t\t\t\tdrafts_: new Map(),\n\t\t\t\trevoked_: false,\n\t\t\t\tisManual_: false,\n\t\t\t\tassigned_: undefined,\n\t\t\t\tcallbacks_: []\n\t\t\t}\n\t\t}\n\n\t\tget size(): number {\n\t\t\tconst state: SetState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\treturn latest(state).size\n\t\t}\n\n\t\thas(value: any): boolean {\n\t\t\tconst state: SetState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\t// bit of trickery here, to be able to recognize both the value, and the draft of its value\n\t\t\tif (!state.copy_) {\n\t\t\t\treturn state.base_.has(value)\n\t\t\t}\n\t\t\tif (state.copy_.has(value)) return true\n\t\t\tif (state.drafts_.has(value) && state.copy_.has(state.drafts_.get(value)))\n\t\t\t\treturn true\n\t\t\treturn false\n\t\t}\n\n\t\tadd(value: any): any {\n\t\t\tconst state: SetState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tif (!this.has(value)) {\n\t\t\t\tprepareSetCopy(state)\n\t\t\t\tmarkChanged(state)\n\t\t\t\tstate.copy_!.add(value)\n\t\t\t\thandleCrossReference(state, value, value)\n\t\t\t}\n\t\t\treturn this\n\t\t}\n\n\t\tdelete(value: any): any {\n\t\t\tif (!this.has(value)) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tconst state: SetState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tprepareSetCopy(state)\n\t\t\tmarkChanged(state)\n\t\t\treturn (\n\t\t\t\tstate.copy_!.delete(value) ||\n\t\t\t\t(state.drafts_.has(value)\n\t\t\t\t\t? state.copy_!.delete(state.drafts_.get(value))\n\t\t\t\t\t: /* istanbul ignore next */ false)\n\t\t\t)\n\t\t}\n\n\t\tclear() {\n\t\t\tconst state: SetState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tif (latest(state).size) {\n\t\t\t\tprepareSetCopy(state)\n\t\t\t\tmarkChanged(state)\n\t\t\t\tstate.copy_!.clear()\n\t\t\t}\n\t\t}\n\n\t\tvalues(): IterableIterator<any> {\n\t\t\tconst state: SetState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tprepareSetCopy(state)\n\t\t\treturn state.copy_!.values()\n\t\t}\n\n\t\tentries(): IterableIterator<[any, any]> {\n\t\t\tconst state: SetState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tprepareSetCopy(state)\n\t\t\treturn state.copy_!.entries()\n\t\t}\n\n\t\tkeys(): IterableIterator<any> {\n\t\t\treturn this.values()\n\t\t}\n\n\t\t[Symbol.iterator]() {\n\t\t\treturn this.values()\n\t\t}\n\n\t\tforEach(cb: any, thisArg?: any) {\n\t\t\tconst iterator = this.values()\n\t\t\tlet result = iterator.next()\n\t\t\twhile (!result.done) {\n\t\t\t\tcb.call(thisArg, result.value, result.value, this)\n\t\t\t\tresult = iterator.next()\n\t\t\t}\n\t\t}\n\t}\n\tfunction proxySet_<T extends AnySet>(\n\t\ttarget: T,\n\t\tparent?: ImmerState\n\t): [T, SetState] {\n\t\t// @ts-ignore\n\t\tconst set = new DraftSet(target, parent)\n\t\treturn [set as any, set[DRAFT_STATE]]\n\t}\n\n\tfunction prepareSetCopy(state: SetState) {\n\t\tif (!state.copy_) {\n\t\t\t// create drafts for all entries to preserve insertion order\n\t\t\tstate.copy_ = new Set()\n\t\t\tstate.base_.forEach(value => {\n\t\t\t\tif (isDraftable(value)) {\n\t\t\t\t\tconst draft = createProxy(state.scope_, value, state, value)\n\t\t\t\t\tstate.drafts_.set(value, draft)\n\t\t\t\t\tstate.copy_!.add(draft)\n\t\t\t\t} else {\n\t\t\t\t\tstate.copy_!.add(value)\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n\n\tfunction assertUnrevoked(state: any /*ES5State | MapState | SetState*/) {\n\t\tif (state.revoked_) die(3, JSON.stringify(latest(state)))\n\t}\n\n\tfunction fixSetContents(target: ImmerState) {\n\t\t// For sets we clone before iterating, otherwise we can get in endless loop due to modifying during iteration, see #628\n\t\t// To preserve insertion order in all cases we then clear the set\n\t\tif (target.type_ === ArchType.Set && target.copy_) {\n\t\t\tconst copy = new Set(target.copy_)\n\t\t\ttarget.copy_.clear()\n\t\t\tcopy.forEach(value => {\n\t\t\t\ttarget.copy_!.add(getValue(value))\n\t\t\t})\n\t\t}\n\t}\n\n\tloadPlugin(PluginMapSet, {proxyMap_, proxySet_, fixSetContents})\n}\n","import {\n\tPluginArrayMethods,\n\tlatest,\n\tloadPlugin,\n\tmarkChanged,\n\tprepareCopy,\n\thandleCrossReference,\n\tProxyArrayState\n} from \"../internal\"\n\n/**\n * Methods that directly modify the array in place.\n * These operate on the copy without creating per-element proxies:\n * - `push`, `pop`: Add/remove from end\n * - `shift`, `unshift`: Add/remove from start (marks all indices reassigned)\n * - `splice`: Add/remove at arbitrary position (marks all indices reassigned)\n * - `reverse`, `sort`: Reorder elements (marks all indices reassigned)\n */\ntype MutatingArrayMethod =\n\t| \"push\"\n\t| \"pop\"\n\t| \"shift\"\n\t| \"unshift\"\n\t| \"splice\"\n\t| \"reverse\"\n\t| \"sort\"\n\n/**\n * Methods that read from the array without modifying it.\n * These fall into distinct categories based on return semantics:\n *\n * **Subset operations** (return drafts - mutations propagate):\n * - `filter`, `slice`: Return array of draft proxies\n * - `find`, `findLast`: Return single draft proxy or undefined\n *\n * **Transform operations** (return base values - mutations don't track):\n * - `concat`, `flat`: Create new structures, not subsets of original\n *\n * **Primitive-returning** (no draft needed):\n * - `findIndex`, `findLastIndex`, `indexOf`, `lastIndexOf`: Return numbers\n * - `some`, `every`, `includes`: Return booleans\n * - `join`, `toString`, `toLocaleString`: Return strings\n */\ntype NonMutatingArrayMethod =\n\t| \"filter\"\n\t| \"slice\"\n\t| \"concat\"\n\t| \"flat\"\n\t| \"find\"\n\t| \"findIndex\"\n\t| \"findLast\"\n\t| \"findLastIndex\"\n\t| \"some\"\n\t| \"every\"\n\t| \"indexOf\"\n\t| \"lastIndexOf\"\n\t| \"includes\"\n\t| \"join\"\n\t| \"toString\"\n\t| \"toLocaleString\"\n\n/** Union of all array operation methods handled by the plugin. */\nexport type ArrayOperationMethod = MutatingArrayMethod | NonMutatingArrayMethod\n\n/**\n * Enables optimized array method handling for Immer drafts.\n *\n * This plugin overrides array methods to avoid unnecessary Proxy creation during iteration,\n * significantly improving performance for array-heavy operations.\n *\n * **Mutating methods** (push, pop, shift, unshift, splice, sort, reverse):\n * Operate directly on the copy without creating per-element proxies.\n *\n * **Non-mutating methods** fall into categories:\n * - **Subset operations** (filter, slice, find, findLast): Return draft proxies - mutations track\n * - **Transform operations** (concat, flat): Return base values - mutations don't track\n * - **Primitive-returning** (indexOf, includes, some, every, etc.): Return primitives\n *\n * **Important**: Callbacks for overridden methods receive base values, not drafts.\n * This is the core performance optimization.\n *\n * @example\n * ```ts\n * import { enableArrayMethods, produce } from \"immer\"\n *\n * enableArrayMethods()\n *\n * const next = produce(state, draft => {\n * // Optimized - no proxy creation per element\n * draft.items.sort((a, b) => a.value - b.value)\n *\n * // filter returns drafts - mutations propagate\n * const filtered = draft.items.filter(x => x.value > 5)\n * filtered[0].value = 999 // Affects draft.items[originalIndex]\n * })\n * ```\n *\n * @see https://immerjs.github.io/immer/array-methods\n */\nexport function enableArrayMethods() {\n\tconst SHIFTING_METHODS = new Set<MutatingArrayMethod>([\"shift\", \"unshift\"])\n\n\tconst QUEUE_METHODS = new Set<MutatingArrayMethod>([\"push\", \"pop\"])\n\n\tconst RESULT_RETURNING_METHODS = new Set<MutatingArrayMethod>([\n\t\t...QUEUE_METHODS,\n\t\t...SHIFTING_METHODS\n\t])\n\n\tconst REORDERING_METHODS = new Set<MutatingArrayMethod>([\"reverse\", \"sort\"])\n\n\t// Optimized method detection using array-based lookup\n\tconst MUTATING_METHODS = new Set<MutatingArrayMethod>([\n\t\t...RESULT_RETURNING_METHODS,\n\t\t...REORDERING_METHODS,\n\t\t\"splice\"\n\t])\n\n\tconst FIND_METHODS = new Set<NonMutatingArrayMethod>([\"find\", \"findLast\"])\n\n\tconst NON_MUTATING_METHODS = new Set<NonMutatingArrayMethod>([\n\t\t\"filter\",\n\t\t\"slice\",\n\t\t\"concat\",\n\t\t\"flat\",\n\t\t...FIND_METHODS,\n\t\t\"findIndex\",\n\t\t\"findLastIndex\",\n\t\t\"some\",\n\t\t\"every\",\n\t\t\"indexOf\",\n\t\t\"lastIndexOf\",\n\t\t\"includes\",\n\t\t\"join\",\n\t\t\"toString\",\n\t\t\"toLocaleString\"\n\t])\n\n\t// Type guard for method detection\n\tfunction isMutatingArrayMethod(\n\t\tmethod: string\n\t): method is MutatingArrayMethod {\n\t\treturn MUTATING_METHODS.has(method as any)\n\t}\n\n\tfunction isNonMutatingArrayMethod(\n\t\tmethod: string\n\t): method is NonMutatingArrayMethod {\n\t\treturn NON_MUTATING_METHODS.has(method as any)\n\t}\n\n\tfunction isArrayOperationMethod(\n\t\tmethod: string\n\t): method is ArrayOperationMethod {\n\t\treturn isMutatingArrayMethod(method) || isNonMutatingArrayMethod(method)\n\t}\n\n\tfunction enterOperation(\n\t\tstate: ProxyArrayState,\n\t\tmethod: ArrayOperationMethod\n\t) {\n\t\tstate.operationMethod = method\n\t}\n\n\tfunction exitOperation(state: ProxyArrayState) {\n\t\tstate.operationMethod = undefined\n\t}\n\n\t// Shared utility functions for array method handlers\n\tfunction executeArrayMethod<T>(\n\t\tstate: ProxyArrayState,\n\t\toperation: () => T,\n\t\tmarkLength = true\n\t): T {\n\t\tprepareCopy(state)\n\t\tconst result = operation()\n\t\tmarkArrayChanged(state, markLength)\n\t\treturn result\n\t}\n\n\t/**\n\t * Marks the array (and its ancestors) as modified after a mutating operation.\n\t *\n\t * Kept separate from `executeArrayMethod` so that operations which turn out to\n\t * be no-ops (e.g. `push()` with no arguments, `splice(i, 0)`, `pop()`/`shift()`\n\t * on an empty array) can prepare a copy but skip marking, preserving Immer's\n\t * structural-sharing guarantee that a change-free producer returns the base.\n\t */\n\tfunction markArrayChanged(state: ProxyArrayState, markLength = true) {\n\t\tmarkChanged(state)\n\t\tif (markLength) state.assigned_!.set(\"length\", true)\n\t}\n\n\tfunction markAllIndicesReassigned(state: ProxyArrayState) {\n\t\tstate.allIndicesReassigned_ = true\n\t\tstate.baseRefs_ = new Set(state.base_)\n\t}\n\n\tfunction normalizeSliceIndex(index: number, length: number): number {\n\t\tif (index < 0) {\n\t\t\treturn Math.max(length + index, 0)\n\t\t}\n\t\treturn Math.min(index, length)\n\t}\n\n\t/**\n\t * Calls handleCrossReference for each value being inserted into the array,\n\t * and marks the corresponding indices as assigned in `assigned_`.\n\t *\n\t * This ensures nested drafts inside inserted values (e.g. from spreading\n\t * a draft object) are properly finalized, matching the behavior of the\n\t * proxy set trap which calls handleCrossReference on every assignment.\n\t *\n\t * Without this, values containing draft proxies (like `{...state[0]}`)\n\t * pushed via the array methods plugin would have their nested drafts\n\t * revoked during finalization without being replaced by final values.\n\t *\n\t * The index is stringified because the proxy traps only ever see property\n\t * names, so `assigned_` is keyed by string everywhere else. A numeric key\n\t * would be invisible to the readers that look indices up by name, such as\n\t * patch generation.\n\t */\n\tfunction handleInsertedValues(\n\t\tstate: ProxyArrayState,\n\t\tstartIndex: number,\n\t\tvalues: any[]\n\t) {\n\t\tfor (let i = 0; i < values.length; i++) {\n\t\t\tconst index = \"\" + (startIndex + i)\n\t\t\tstate.assigned_!.set(index, true)\n\t\t\thandleCrossReference(state, index, values[i])\n\t\t}\n\t}\n\n\t/**\n\t * Handles mutating operations that add/remove elements (push, pop, shift, unshift, splice).\n\t *\n\t * Operates directly on `state.copy_` without creating per-element proxies.\n\t * For shifting methods (shift, unshift), marks all indices as reassigned since\n\t * indices shift.\n\t *\n\t * @returns For push/pop/shift/unshift: the native method result. For others: the draft.\n\t */\n\tfunction handleSimpleOperation(\n\t\tstate: ProxyArrayState,\n\t\tmethod: string,\n\t\targs: any[]\n\t) {\n\t\t// Detect no-op calls before creating a copy so structural sharing is\n\t\t// preserved: push/unshift with no arguments add nothing, and pop/shift\n\t\t// on an empty array remove nothing. The check must happen before\n\t\t// prepareCopy - a stray copy_ on an unmodified state would be picked\n\t\t// up by finalization of a parent Set and break identity there.\n\t\tconst isInsert = method === \"push\" || method === \"unshift\"\n\t\tif (isInsert ? args.length === 0 : latest(state).length === 0) {\n\t\t\t// Match the native return values: push/unshift return the\n\t\t\t// (unchanged) length, pop/shift on an empty array return undefined\n\t\t\treturn isInsert ? latest(state).length : undefined\n\t\t}\n\n\t\tprepareCopy(state)\n\n\t\t// For push/unshift, capture the length before the operation\n\t\t// so we can compute insertion indices for handleCrossReference\n\t\tconst lengthBefore = state.copy_!.length\n\n\t\tconst result = (state.copy_! as any)[method](...args)\n\n\t\tmarkArrayChanged(state)\n\n\t\t// Handle index reassignment for shifting methods\n\t\tif (SHIFTING_METHODS.has(method as MutatingArrayMethod)) {\n\t\t\tmarkAllIndicesReassigned(state)\n\t\t}\n\n\t\t// Handle cross-references for newly inserted values.\n\t\t// push appends at the end, unshift inserts at the beginning.\n\t\tif (method === \"push\") {\n\t\t\thandleInsertedValues(state, lengthBefore, args)\n\t\t} else if (method === \"unshift\") {\n\t\t\thandleInsertedValues(state, 0, args)\n\t\t}\n\n\t\t// Return appropriate value based on method\n\t\treturn RESULT_RETURNING_METHODS.has(method as MutatingArrayMethod)\n\t\t\t? result\n\t\t\t: state.draft_\n\t}\n\n\t/**\n\t * Handles reordering operations (reverse, sort) that change element order.\n\t *\n\t * Operates directly on `state.copy_` and marks all indices as reassigned\n\t * since element positions change. Does not mark length as changed since\n\t * these operations preserve array length.\n\t *\n\t * @returns The draft proxy for method chaining.\n\t */\n\tfunction handleReorderingOperation(\n\t\tstate: ProxyArrayState,\n\t\tmethod: string,\n\t\targs: any[]\n\t) {\n\t\t// Reordering an array with fewer than two elements cannot change it,\n\t\t// so preserve structural sharing and skip copying (see\n\t\t// handleSimpleOperation for why this must run before prepareCopy).\n\t\tif (latest(state).length <= 1) return state.draft_\n\n\t\treturn executeArrayMethod(\n\t\t\tstate,\n\t\t\t() => {\n\t\t\t\t;(state.copy_! as any)[method](...args)\n\t\t\t\tmarkAllIndicesReassigned(state)\n\t\t\t\treturn state.draft_\n\t\t\t},\n\t\t\tfalse\n\t\t) // Don't mark length as changed\n\t}\n\n\t/**\n\t * Creates an interceptor function for a specific array method.\n\t *\n\t * The interceptor wraps array method calls to:\n\t * 1. Set `state.operationMethod` flag during execution (allows proxy `get` trap\n\t * to detect we're inside an optimized method and skip proxy creation)\n\t * 2. Route to appropriate handler based on method type\n\t * 3. Clean up the operation flag in `finally` block\n\t *\n\t * The `operationMethod` flag is the key mechanism that enables the proxy's `get`\n\t * trap to return base values instead of creating nested proxies during iteration.\n\t *\n\t * @param state - The proxy array state\n\t * @param originalMethod - Name of the array method being intercepted\n\t * @returns Interceptor function that handles the method call\n\t */\n\tfunction createMethodInterceptor(\n\t\tstate: ProxyArrayState,\n\t\toriginalMethod: string\n\t) {\n\t\treturn function interceptedMethod(...args: any[]) {\n\t\t\t// Enter operation mode - this flag tells the proxy's get trap to return\n\t\t\t// base values instead of creating nested proxies during iteration\n\t\t\tconst method = originalMethod as ArrayOperationMethod\n\t\t\tenterOperation(state, method)\n\n\t\t\ttry {\n\t\t\t\t// Check if this is a mutating method\n\t\t\t\tif (isMutatingArrayMethod(method)) {\n\t\t\t\t\t// Direct method dispatch - no configuration lookup needed\n\t\t\t\t\tif (RESULT_RETURNING_METHODS.has(method)) {\n\t\t\t\t\t\treturn handleSimpleOperation(state, method, args)\n\t\t\t\t\t}\n\t\t\t\t\tif (REORDERING_METHODS.has(method)) {\n\t\t\t\t\t\treturn handleReorderingOperation(state, method, args)\n\t\t\t\t\t}\n\n\t\t\t\t\tif (method === \"splice\") {\n\t\t\t\t\t\tconst insertCount = args.length > 2 ? args.length - 2 : 0\n\n\t\t\t\t\t\t// Detect no-op calls before creating a copy so structural\n\t\t\t\t\t\t// sharing is preserved (see handleSimpleOperation). A splice\n\t\t\t\t\t\t// removes nothing when called with no arguments, when the\n\t\t\t\t\t\t// normalized start is at/past the end, or when the delete\n\t\t\t\t\t\t// count coerces to less than 1. splice(start) with a single\n\t\t\t\t\t\t// argument removes everything from start onwards, so it must\n\t\t\t\t\t\t// not match. Exotic arguments that slip through are caught\n\t\t\t\t\t\t// by the post-copy check below.\n\t\t\t\t\t\tif (insertCount === 0) {\n\t\t\t\t\t\t\tconst length = latest(state).length\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\targs.length === 0 ||\n\t\t\t\t\t\t\t\tnormalizeSliceIndex(args[0] ?? 0, length) === length ||\n\t\t\t\t\t\t\t\t(args.length > 1 && !(args[1] >= 1))\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\treturn []\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tprepareCopy(state)\n\t\t\t\t\t\t// The start index must be resolved against the length the array\n\t\t\t\t\t\t// had before the splice, like the native method does\n\t\t\t\t\t\tconst lengthBefore = state.copy_!.length\n\t\t\t\t\t\tconst res = state.copy_!.splice(\n\t\t\t\t\t\t\t...(args as [number, number, ...any[]])\n\t\t\t\t\t\t)\n\n\t\t\t\t\t\t// Backstop for exotic arguments the pre-check above missed:\n\t\t\t\t\t\t// if nothing was removed and nothing inserted, the array is\n\t\t\t\t\t\t// unchanged and must not be marked as modified.\n\t\t\t\t\t\tif (res.length === 0 && insertCount === 0) {\n\t\t\t\t\t\t\treturn res\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmarkArrayChanged(state)\n\t\t\t\t\t\tmarkAllIndicesReassigned(state)\n\t\t\t\t\t\t// Handle cross-references for inserted values (args from index 2+)\n\t\t\t\t\t\tif (insertCount > 0) {\n\t\t\t\t\t\t\tconst startIndex = normalizeSliceIndex(args[0] ?? 0, lengthBefore)\n\t\t\t\t\t\t\thandleInsertedValues(state, startIndex, args.slice(2))\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn res\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Handle non-mutating methods\n\t\t\t\t\treturn handleNonMutatingOperation(state, method, args)\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\t// Always exit operation mode - must be in finally to handle exceptions\n\t\t\t\texitOperation(state)\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Handles non-mutating array methods with different return semantics.\n\t *\n\t * **Subset operations** return draft proxies for mutation tracking:\n\t * - `filter`, `slice`: Return `state.draft_[i]` for each selected element\n\t * - `find`, `findLast`: Return `state.draft_[i]` for the found element\n\t *\n\t * This allows mutations on returned elements to propagate back to the draft:\n\t * ```ts\n\t * const filtered = draft.items.filter(x => x.value > 5)\n\t * filtered[0].value = 999 // Mutates draft.items[originalIndex]\n\t * ```\n\t *\n\t * **Transform operations** return base values (no draft tracking):\n\t * - `concat`, `flat`: These create NEW arrays rather than selecting subsets.\n\t * Since the result structure differs from the original, tracking mutations\n\t * back to specific draft indices would be impractical/impossible.\n\t *\n\t * **Primitive operations** return the native result directly:\n\t * - `indexOf`, `includes`, `some`, `every`, `join`, etc.\n\t *\n\t * @param state - The proxy array state\n\t * @param method - The non-mutating method name\n\t * @param args - Arguments passed to the method\n\t * @returns Drafts for subset operations, base values for transforms, primitives otherwise\n\t */\n\tfunction handleNonMutatingOperation(\n\t\tstate: ProxyArrayState,\n\t\tmethod: NonMutatingArrayMethod,\n\t\targs: any[]\n\t) {\n\t\tconst source = latest(state)\n\n\t\t// Methods that return arrays with selected items - need to return drafts\n\t\tif (method === \"filter\") {\n\t\t\tconst predicate = args[0]\n\t\t\tconst thisArg = args[1]\n\t\t\tconst result: any[] = []\n\n\t\t\t// First pass: call predicate on base values to determine which items pass\n\t\t\tconst length = source.length\n\t\t\tfor (let i = 0; i < length; i++) {\n\t\t\t\tif (predicate.call(thisArg, source[i], i, source)) {\n\t\t\t\t\t// Only create draft for items that passed the predicate\n\t\t\t\t\tresult.push(state.draft_[i])\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result\n\t\t}\n\n\t\tif (FIND_METHODS.has(method)) {\n\t\t\tconst predicate = args[0]\n\t\t\tconst thisArg = args[1]\n\t\t\tconst length = source.length\n\t\t\tconst isForward = method === \"find\"\n\t\t\tconst step = isForward ? 1 : -1\n\t\t\tconst start = isForward ? 0 : length - 1\n\n\t\t\tfor (let i = start; i >= 0 && i < length; i += step) {\n\t\t\t\tif (predicate.call(thisArg, source[i], i, source)) {\n\t\t\t\t\treturn state.draft_[i]\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn undefined\n\t\t}\n\n\t\tif (method === \"slice\") {\n\t\t\tconst rawStart = args[0] ?? 0\n\t\t\tconst rawEnd = args[1] ?? source.length\n\n\t\t\t// Normalize negative indices\n\t\t\tconst start = normalizeSliceIndex(rawStart, source.length)\n\t\t\tconst end = normalizeSliceIndex(rawEnd, source.length)\n\n\t\t\tconst result: any[] = []\n\n\t\t\t// Return drafts for items in the slice range\n\t\t\tfor (let i = start; i < end; i++) {\n\t\t\t\tresult.push(state.draft_[i])\n\t\t\t}\n\n\t\t\treturn result\n\t\t}\n\n\t\t// For other methods, call on base array directly:\n\t\t// - indexOf, includes, join, toString: Return primitives, no draft needed\n\t\t// - concat, flat: Return NEW arrays (not subsets). Elements are base values.\n\t\t// This is intentional - concat/flat create new data structures rather than\n\t\t// selecting subsets of the original, making draft tracking impractical.\n\t\treturn source[method as keyof typeof Array.prototype](...args)\n\t}\n\n\tloadPlugin(PluginArrayMethods, {\n\t\tcreateMethodInterceptor,\n\t\tisArrayOperationMethod,\n\t\tisMutatingArrayMethod\n\t})\n}\n","import {\n\tIProduce,\n\tIProduceWithPatches,\n\tImmer,\n\tDraft,\n\tImmutable\n} from \"./internal\"\n\nexport {\n\tDraft,\n\tWritableDraft,\n\tWritableNonArrayDraft,\n\tImmutable,\n\tPatch,\n\tPatchListener,\n\tProducer,\n\toriginal,\n\tcurrent,\n\tisDraft,\n\tisDraftable,\n\tisModified,\n\tNOTHING as nothing,\n\tDRAFTABLE as immerable,\n\tfreeze,\n\tObjectish,\n\tStrictMode\n} from \"./internal\"\n\nconst immer = new Immer()\n\n/**\n * The `produce` function takes a value and a \"recipe function\" (whose\n * return value often depends on the base state). The recipe function is\n * free to mutate its first argument however it wants. All mutations are\n * only ever applied to a __copy__ of the base state.\n *\n * Pass only a function to create a \"curried producer\" which relieves you\n * from passing the recipe function every time.\n *\n * Only plain objects and arrays are made mutable. All other objects are\n * considered uncopyable.\n *\n * Note: This function is __bound__ to its `Immer` instance.\n *\n * @param {any} base - the initial state\n * @param {Function} producer - function that receives a proxy of the base state as first argument and which can be freely modified\n * @param {Function} patchListener - optional function that will be called with all the patches produced here\n * @returns {any} a new state, or the initial state if nothing was modified\n */\nexport const produce: IProduce = /* @__PURE__ */ immer.produce\n\n/**\n * Like `produce`, but `produceWithPatches` always returns a tuple\n * [nextState, patches, inversePatches] (instead of just the next state)\n */\nexport const produceWithPatches: IProduceWithPatches =\n\t/* @__PURE__ */ immer.produceWithPatches.bind(immer)\n\n/**\n * Pass true to automatically freeze all copies created by Immer.\n *\n * Always freeze by default, even in production mode\n */\nexport const setAutoFreeze = /* @__PURE__ */ immer.setAutoFreeze.bind(immer)\n\n/**\n * Pass true to enable strict shallow copy.\n *\n * By default, immer does not copy the object descriptors such as getter, setter and non-enumrable properties.\n */\nexport const setUseStrictShallowCopy =\n\t/* @__PURE__ */ immer.setUseStrictShallowCopy.bind(immer)\n\n/**\n * Pass false to use loose iteration that only processes enumerable string properties.\n * This skips symbols and non-enumerable properties for maximum performance.\n *\n * By default, strict iteration is enabled (includes all own properties).\n */\nexport const setUseStrictIteration =\n\t/* @__PURE__ */ immer.setUseStrictIteration.bind(immer)\n\n/**\n * Apply an array of Immer patches to the first argument.\n *\n * This function is a producer, which means copy-on-write is in effect.\n */\nexport const applyPatches = /* @__PURE__ */ immer.applyPatches.bind(immer)\n\n/**\n * Create an Immer draft from the given base state, which may be a draft itself.\n * The draft can be modified until you finalize it with the `finishDraft` function.\n */\nexport const createDraft = /* @__PURE__ */ immer.createDraft.bind(immer)\n\n/**\n * Finalize an Immer draft from a `createDraft` call, returning the base state\n * (if no changes were made) or a modified copy. The draft must *not* be\n * mutated afterwards.\n *\n * Pass a function as the 2nd argument to generate Immer patches based on the\n * changes that were made.\n */\nexport const finishDraft = /* @__PURE__ */ immer.finishDraft.bind(immer)\n\n/**\n * This function is actually a no-op, but can be used to cast an immutable type\n * to an draft type and make TypeScript happy\n *\n * @param value\n */\nexport let castDraft = <T>(value: T): Draft<T> => value as any\n\n/**\n * This function is actually a no-op, but can be used to cast a mutable type\n * to an immutable type and make TypeScript happy\n * @param value\n */\nexport let castImmutable = <T>(value: T): Immutable<T> => value as any\n\nexport {Immer}\n\nexport {enablePatches} from \"./plugins/patches\"\nexport {enableMapSet} from \"./plugins/mapset\"\nexport {enableArrayMethods} from \"./plugins/arrayMethods\"\n","import {\n BlockIdSchema,\n BlockSchema,\n BlockStyleSchema,\n CollectionConfigSchema,\n CollectionItemSchema,\n CollectionNameSchema,\n GridItemSchema,\n GridRectSchema,\n MAX_GRID_ROWS,\n MediaMetaSchema,\n MediaPathSchema,\n NavItemSchema,\n PageIdSchema,\n PageSchema,\n responsive,\n SectionIdSchema,\n SectionSchema,\n SlugSchema,\n VariantNameSchema,\n} from \"@omniharmonic/openspace-schema\";\nimport { z } from \"zod\";\n\n/**\n * The operation vocabulary (arch §5.3). Every edit — Studio, Hub DraftRoom, MCP agents, CLI —\n * is one of these plain JSON values. Ops target stable ids, are validated against\n * `@omniharmonic/openspace-schema` before they are accepted, are invertible (undo) and mergeable (rebase).\n */\n\n/** Op metadata: a unique op id, who made it, and when (ms since epoch; used for LWW). */\nexport const OpMetaShape = {\n id: z.string().min(1).max(128),\n actor: z.string().min(1).max(128),\n ts: z.number().finite().min(0),\n};\nexport interface OpMeta {\n id: string;\n actor: string;\n ts: number;\n}\n\n/**\n * The block/section container an op addresses: a page id, or `\"footer\"` for the site footer\n * (a single grid/stack section in `site.footer`). Sections cannot be inserted, moved or\n * deleted in the footer.\n */\nexport const FOOTER = \"footer\" as const;\nexport const ContainerIdSchema = z.union([PageIdSchema, z.literal(FOOTER)]);\nexport type ContainerId = z.infer<typeof ContainerIdSchema>;\n\n/**\n * Where to put a block/section in its parent list: a final index (0-based, in the list\n * without the moved item), `\"start\"`, `\"end\"`, or before/after a sibling id.\n */\nexport const PositionSchema = z.union([\n z.int().min(0),\n z.literal(\"start\"),\n z.literal(\"end\"),\n z.strictObject({ before: z.string().min(1) }),\n z.strictObject({ after: z.string().min(1) }),\n]);\nexport type Position = z.infer<typeof PositionSchema>;\n\n/**\n * A path patch: dot-separated paths into an object (`\"seo.description\"`, `\"choices.palette.brand\"`).\n * Arrays are leaf values (replaced whole). `unset` removes keys. Paths within one patch must not\n * overlap (no path may be a prefix of another).\n */\nexport const PathSchema = z\n .string()\n .min(1)\n .max(300)\n .regex(/^[^.]+(?:\\.[^.]+)*$/, { message: \"Expected a dot-separated path\" });\nexport const PatchShape = {\n set: z.record(PathSchema, z.unknown()).optional(),\n unset: z.array(PathSchema).max(500).optional(),\n};\nexport interface Patch {\n set?: Record<string, unknown>;\n unset?: string[];\n}\n\nexport const RowsSchema = responsive(z.int().min(1).max(MAX_GRID_ROWS));\nexport type Rows = z.infer<typeof RowsSchema>;\n\nexport const BreakpointSchema = z.enum([\"d\", \"t\", \"m\"]);\n\nconst op = <T extends string, S extends z.core.$ZodLooseShape>(name: T, shape: S) =>\n z.strictObject({ op: z.literal(name), ...OpMetaShape, ...shape });\n\nexport const BlockUpdateOpSchema = op(\"block.update\", {\n page: ContainerIdSchema,\n block: BlockIdSchema,\n /** Field values to set (top-level field keys). */\n set: z.record(z.string().min(1).max(100), z.unknown()).optional(),\n /** Field keys to remove. */\n unset: z.array(z.string().min(1).max(100)).max(200).optional(),\n /** New variant; `null` removes it. */\n variant: VariantNameSchema.nullable().optional(),\n /** New style overrides (replaced whole); `null` removes them. */\n style: BlockStyleSchema.nullable().optional(),\n /** Stack column; `null` removes it. */\n column: z.int().min(0).max(3).nullable().optional(),\n /** Layers label; `null` removes it. */\n label: z.string().max(80).nullable().optional(),\n /** Hide the block on the published site; `null` (or `false`) shows it again. */\n hidden: z.boolean().nullable().optional(),\n});\n\nexport const BlockInsertOpSchema = op(\"block.insert\", {\n page: ContainerIdSchema,\n section: SectionIdSchema,\n at: PositionSchema,\n block: BlockSchema,\n /** Grid placement when inserting into a grid section (auto-placed at the bottom if absent). */\n place: GridItemSchema.optional(),\n /** Exact grid rows to set afterwards (used by inverses); otherwise rows auto-grow to fit. */\n rows: RowsSchema.optional(),\n});\n\nexport const BlockMoveOpSchema = op(\"block.move\", {\n page: ContainerIdSchema,\n block: BlockIdSchema,\n to: z.strictObject({\n section: SectionIdSchema,\n at: PositionSchema,\n /** Grid placement in the destination (kept/auto-placed if absent). */\n place: GridItemSchema.optional(),\n /** Stack column in the destination; `null` removes it. */\n column: z.int().min(0).max(3).nullable().optional(),\n /** Exact rows for the destination grid (used by inverses). */\n rows: RowsSchema.optional(),\n }),\n /** Exact rows for the source grid section after the block leaves (used by inverses). */\n fromRows: RowsSchema.optional(),\n});\n\nexport const BlockDeleteOpSchema = op(\"block.delete\", {\n page: ContainerIdSchema,\n block: BlockIdSchema,\n /** Exact rows for the grid section afterwards (used by inverses). */\n rows: RowsSchema.optional(),\n});\n\nexport const GridPlaceOpSchema = op(\"grid.place\", {\n page: ContainerIdSchema,\n section: SectionIdSchema,\n block: BlockIdSchema,\n bp: BreakpointSchema,\n /** The placement; `null` removes a tablet/mobile override (desktop is required). */\n rect: GridRectSchema.nullable(),\n /** Exact rows to set (used by inverses); otherwise rows auto-grow to fit the placement. */\n rows: RowsSchema.optional(),\n});\n\nexport const SectionInsertOpSchema = op(\"section.insert\", {\n page: PageIdSchema,\n at: PositionSchema,\n section: SectionSchema,\n});\n\nexport const SectionMoveOpSchema = op(\"section.move\", {\n page: PageIdSchema,\n section: SectionIdSchema,\n at: PositionSchema,\n});\n\nexport const SectionDeleteOpSchema = op(\"section.delete\", {\n page: PageIdSchema,\n section: SectionIdSchema,\n});\n\n/** Paths into the section (`\"style.colorTheme\"`, `\"layout\"`, `\"label\"`); not `id`/`blocks`. */\nexport const SectionUpdateOpSchema = op(\"section.update\", {\n page: ContainerIdSchema,\n section: SectionIdSchema,\n ...PatchShape,\n});\n\nexport const StylesPatchOpSchema = op(\"styles.patch\", {\n patch: z.strictObject(PatchShape),\n});\n\nexport const PageCreateOpSchema = op(\"page.create\", {\n page: PageSchema,\n /** Optionally replace the navigation tree in the same step (e.g. to add the new page). */\n nav: z.array(NavItemSchema).optional(),\n});\n\n/** Paths into the page (`\"title\"`, `\"slug\"`, `\"seo.description\"`); not `id`/`sections`. */\nexport const PageUpdateOpSchema = op(\"page.update\", {\n page: PageIdSchema,\n ...PatchShape,\n});\n\nexport const PageDeleteOpSchema = op(\"page.delete\", {\n page: PageIdSchema,\n /** Optionally replace the navigation tree in the same step (e.g. to drop links to the page). */\n nav: z.array(NavItemSchema).optional(),\n});\n\nexport const NavUpdateOpSchema = op(\"nav.update\", {\n tree: z.array(NavItemSchema),\n});\n\n/** Paths into `site.json` (`\"title\"`, `\"header.sticky\"`); navigation goes through `nav.update`. */\nexport const SiteUpdateOpSchema = op(\"site.update\", { ...PatchShape });\n\n/** Adds (or replaces) the metadata for a media file. */\nexport const MediaAddOpSchema = op(\"media.add\", {\n path: MediaPathSchema,\n meta: MediaMetaSchema,\n});\n\nexport const MediaRemoveOpSchema = op(\"media.remove\", {\n path: MediaPathSchema,\n});\n\n/** Creates or replaces a collection item (the collection is created if needed). */\nexport const CollectionUpsertOpSchema = op(\"collection.upsert\", {\n collection: CollectionNameSchema,\n item: CollectionItemSchema,\n});\n\nexport const CollectionDeleteOpSchema = op(\"collection.delete\", {\n collection: CollectionNameSchema,\n slug: SlugSchema,\n /**\n * Keep the collection's (now empty) entry. By default a collection with no items left is\n * removed from `collections` (its settings in `collectionConfigs` are untouched).\n */\n keepEmpty: z.boolean().optional(),\n});\n\n/** Creates, replaces or (with `config: null`) removes a collection's `_collection.json`. */\nexport const CollectionConfigUpsertOpSchema = op(\"collectionConfig.upsert\", {\n collection: CollectionNameSchema,\n config: CollectionConfigSchema.nullable(),\n /** With `config: null`: keep an empty `collectionConfigs` object instead of dropping it. */\n keepEmpty: z.boolean().optional(),\n});\n\nexport const OpSchema = z.discriminatedUnion(\"op\", [\n BlockUpdateOpSchema,\n BlockInsertOpSchema,\n BlockMoveOpSchema,\n BlockDeleteOpSchema,\n GridPlaceOpSchema,\n SectionInsertOpSchema,\n SectionMoveOpSchema,\n SectionDeleteOpSchema,\n SectionUpdateOpSchema,\n StylesPatchOpSchema,\n PageCreateOpSchema,\n PageUpdateOpSchema,\n PageDeleteOpSchema,\n NavUpdateOpSchema,\n SiteUpdateOpSchema,\n MediaAddOpSchema,\n MediaRemoveOpSchema,\n CollectionUpsertOpSchema,\n CollectionDeleteOpSchema,\n CollectionConfigUpsertOpSchema,\n]);\n\nexport type Op = z.infer<typeof OpSchema>;\nexport type OpType = Op[\"op\"];\nexport type OpOf<T extends OpType> = Extract<Op, { op: T }>;\nexport type BlockUpdateOp = OpOf<\"block.update\">;\nexport type BlockInsertOp = OpOf<\"block.insert\">;\nexport type BlockMoveOp = OpOf<\"block.move\">;\nexport type BlockDeleteOp = OpOf<\"block.delete\">;\nexport type GridPlaceOp = OpOf<\"grid.place\">;\nexport type SectionInsertOp = OpOf<\"section.insert\">;\nexport type SectionMoveOp = OpOf<\"section.move\">;\nexport type SectionDeleteOp = OpOf<\"section.delete\">;\nexport type SectionUpdateOp = OpOf<\"section.update\">;\nexport type StylesPatchOp = OpOf<\"styles.patch\">;\nexport type PageCreateOp = OpOf<\"page.create\">;\nexport type PageUpdateOp = OpOf<\"page.update\">;\nexport type PageDeleteOp = OpOf<\"page.delete\">;\nexport type NavUpdateOp = OpOf<\"nav.update\">;\nexport type SiteUpdateOp = OpOf<\"site.update\">;\nexport type MediaAddOp = OpOf<\"media.add\">;\nexport type MediaRemoveOp = OpOf<\"media.remove\">;\nexport type CollectionUpsertOp = OpOf<\"collection.upsert\">;\nexport type CollectionDeleteOp = OpOf<\"collection.delete\">;\nexport type CollectionConfigUpsertOp = OpOf<\"collectionConfig.upsert\">;\n\n/** Every op type, in vocabulary order. */\nexport const OP_TYPES = OpSchema.options.map((o) => o.shape.op.value) as OpType[];\n\n/** An op without its metadata, as produced by builders before stamping. */\nexport type OpBody<T extends Op = Op> = T extends Op ? Omit<T, keyof OpMeta> : never;\n\n/** Attach metadata to an op body. */\nexport function stamp<T extends Op>(body: OpBody<T>, meta: OpMeta): T {\n return { ...body, id: meta.id, actor: meta.actor, ts: meta.ts } as unknown as T;\n}\n\n/** Parse untrusted JSON (WebSocket, MCP, CLI) into an `Op`. */\nexport function parseOp(\n value: unknown,\n): { ok: true; op: Op } | { ok: false; errors: { path: (string | number)[]; message: string }[] } {\n const r = OpSchema.safeParse(value);\n if (r.success) return { ok: true, op: r.data };\n return {\n ok: false,\n errors: r.error.issues.map((i) => ({\n path: i.path.map((p) => (typeof p === \"symbol\" ? String(p) : p)),\n message: i.message,\n })),\n };\n}\n","import {\n type Block,\n type Breakpoint,\n GRID_COLUMNS,\n type GridItem,\n type GridLayout,\n type GridRect,\n type Page,\n resolve,\n type Section,\n type SiteDocument,\n} from \"@omniharmonic/openspace-schema\";\nimport { type ContainerId, FOOTER, type Position, type Rows } from \"./ops\";\n\n/** A precondition failure while applying an op (missing target, bad position…). */\nexport class OpError extends Error {\n readonly path: (string | number)[];\n constructor(message: string, path: (string | number)[] = []) {\n super(message);\n this.name = \"OpError\";\n this.path = path;\n }\n}\n\n/** Document path of a container's sections (for error paths). */\nexport function containerPath(container: ContainerId): (string | number)[] {\n return container === FOOTER ? [\"site\", \"footer\"] : [\"pages\", container];\n}\n\n/** The sections of a page, or `[footer]`. Undefined if the page does not exist. */\nexport function sectionsOf(doc: SiteDocument, container: ContainerId): Section[] | undefined {\n if (container === FOOTER) return [doc.site.footer];\n return doc.pages[container]?.sections;\n}\n\nexport function getPage(doc: SiteDocument, id: string): Page | undefined {\n return Object.hasOwn(doc.pages, id) ? doc.pages[id as Page[\"id\"]] : undefined;\n}\n\nexport interface SectionLoc {\n section: Section;\n index: number;\n}\n\nexport function findSection(\n doc: SiteDocument,\n container: ContainerId,\n sectionId: string,\n): SectionLoc | undefined {\n const sections = sectionsOf(doc, container);\n if (!sections) return undefined;\n const index = sections.findIndex((s) => s.id === sectionId);\n if (index < 0) return undefined;\n return { section: sections[index] as Section, index };\n}\n\nexport interface BlockLoc {\n section: Section;\n sectionIndex: number;\n block: Block;\n index: number;\n}\n\nexport function findBlock(\n doc: SiteDocument,\n container: ContainerId,\n blockId: string,\n): BlockLoc | undefined {\n const sections = sectionsOf(doc, container);\n if (!sections) return undefined;\n for (let i = 0; i < sections.length; i++) {\n const section = sections[i] as Section;\n const index = section.blocks.findIndex((b) => b.id === blockId);\n if (index >= 0)\n return { section, sectionIndex: i, block: section.blocks[index] as Block, index };\n }\n return undefined;\n}\n\n/** Where a section lives anywhere in the document. */\nexport function locateSection(\n doc: SiteDocument,\n sectionId: string,\n): { container: ContainerId; index: number; section: Section } | undefined {\n if (doc.site.footer.id === sectionId)\n return { container: FOOTER, index: 0, section: doc.site.footer };\n for (const page of Object.values(doc.pages)) {\n const index = page.sections.findIndex((s) => s.id === sectionId);\n if (index >= 0) return { container: page.id, index, section: page.sections[index] as Section };\n }\n return undefined;\n}\n\n/** Where a block lives anywhere in the document. */\nexport function locateBlock(\n doc: SiteDocument,\n blockId: string,\n): ({ container: ContainerId } & BlockLoc) | undefined {\n const inFooter = findBlock(doc, FOOTER, blockId);\n if (inFooter) return { container: FOOTER, ...inFooter };\n for (const page of Object.values(doc.pages)) {\n const loc = findBlock(doc, page.id, blockId);\n if (loc) return { container: page.id, ...loc };\n }\n return undefined;\n}\n\n/** Every section and block id in the document (pages + footer), mapped to its container. */\nexport function indexIds(doc: SiteDocument): {\n sections: Map<string, ContainerId>;\n blocks: Map<string, ContainerId>;\n} {\n const sections = new Map<string, ContainerId>();\n const blocks = new Map<string, ContainerId>();\n const add = (container: ContainerId, s: Section) => {\n sections.set(s.id, container);\n for (const b of s.blocks) blocks.set(b.id, container);\n };\n add(FOOTER, doc.site.footer);\n for (const page of Object.values(doc.pages)) for (const s of page.sections) add(page.id, s);\n return { sections, blocks };\n}\n\n/** Resolve a position against a list of sibling ids. Throws `OpError` if out of range. */\nexport function resolvePosition(\n ids: readonly string[],\n at: Position,\n path: (string | number)[],\n): number {\n if (typeof at === \"number\") {\n if (at > ids.length)\n throw new OpError(`Position ${at} is out of range (0–${ids.length})`, [...path, \"at\"]);\n return at;\n }\n if (at === \"start\") return 0;\n if (at === \"end\") return ids.length;\n const anchor = \"before\" in at ? at.before : at.after;\n const i = ids.indexOf(anchor);\n if (i < 0) throw new OpError(`Position anchor ${anchor} is not a sibling here`, [...path, \"at\"]);\n return \"before\" in at ? i : i + 1;\n}\n\n// --- grid helpers ---------------------------------------------------------------------------\n\n/** The placement that applies at a breakpoint (tablet inherits desktop; mobile is independent). */\nexport function effectiveRect(item: GridItem, bp: Breakpoint): GridRect | undefined {\n if (bp === \"t\") return item.t ?? item.d;\n return item[bp];\n}\n\n/** The last row used by any placement at a breakpoint (0 when empty). */\nexport function usedRows(layout: GridLayout, bp: Breakpoint): number {\n let max = 0;\n for (const item of Object.values(layout.items)) {\n const r = effectiveRect(item, bp);\n if (r) max = Math.max(max, r.y + r.h - 1);\n }\n return max;\n}\n\n/** Raise `rows` (mutably) wherever a placement extends past the last row. Never shrinks. */\nexport function raiseRows(layout: GridLayout): void {\n for (const bp of [\"d\", \"t\", \"m\"] as const) {\n const need = usedRows(layout, bp);\n if (need > resolve(layout.rows, bp)) layout.rows[bp] = need;\n }\n}\n\nexport const AUTO_PLACE = { w: 12, h: 4 } as const;\n\n/** A placement below everything else: desktop always, mobile when other items have one. */\nexport function autoPlace(layout: GridLayout): GridItem {\n const item: GridItem = {\n d: {\n x: 1,\n y: usedRows(layout, \"d\") + 1,\n w: Math.min(AUTO_PLACE.w, GRID_COLUMNS.d),\n h: AUTO_PLACE.h,\n },\n };\n if (Object.values(layout.items).some((i) => i.m !== undefined)) {\n item.m = { x: 1, y: usedRows(layout, \"m\") + 1, w: GRID_COLUMNS.m, h: AUTO_PLACE.h };\n }\n return item;\n}\n\nexport function copyRows(rows: Rows): Rows {\n const out: Rows = { d: rows.d };\n if (rows.t !== undefined) out.t = rows.t;\n if (rows.m !== undefined) out.m = rows.m;\n return out;\n}\n","/** Small, dependency-free helpers for JSON values and dot-path patches. */\n\nexport type Obj = Record<string, unknown>;\n\nconst FORBIDDEN_SEGMENTS = new Set([\"__proto__\", \"prototype\", \"constructor\"]);\n\n/** The first own key anywhere in a JSON value that could reach a prototype, if any. */\nexport function findForbiddenKey(value: unknown, depth = 0): string | undefined {\n if (depth > 64 || value === null || typeof value !== \"object\") return undefined;\n if (Array.isArray(value)) {\n for (const v of value) {\n const k = findForbiddenKey(v, depth + 1);\n if (k) return k;\n }\n return undefined;\n }\n for (const key of Object.keys(value)) {\n if (FORBIDDEN_SEGMENTS.has(key)) return key;\n const k = findForbiddenKey((value as Obj)[key], depth + 1);\n if (k) return k;\n }\n return undefined;\n}\n\n/** True for object keys that could reach a prototype (rejected in every op). */\nexport function isForbiddenKey(key: string): boolean {\n return FORBIDDEN_SEGMENTS.has(key);\n}\n\n/** True for plain objects (and Immer drafts of them, which proxy a plain object). */\nexport function isPlainObject(value: unknown): value is Obj {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\n/** Structural equality for JSON values (key order ignored, `undefined` keys ignored). */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== typeof b || a === null || b === null) return false;\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) if (!deepEqual(a[i], b[i])) return false;\n return true;\n }\n if (Array.isArray(b)) return false;\n if (typeof a === \"object\") {\n const ao = a as Obj;\n const bo = b as Obj;\n const ak = Object.keys(ao).filter((k) => ao[k] !== undefined);\n const bk = Object.keys(bo).filter((k) => bo[k] !== undefined);\n if (ak.length !== bk.length) return false;\n for (const k of ak) {\n if (!Object.hasOwn(bo, k) || !deepEqual(ao[k], bo[k])) return false;\n }\n return true;\n }\n return false;\n}\n\n/** A deep copy of a JSON value (drops `undefined` object values). */\nexport function clone<T>(value: T): T {\n if (Array.isArray(value)) return value.map((v) => clone(v)) as T;\n if (isPlainObject(value)) {\n const out: Obj = {};\n for (const [k, v] of Object.entries(value)) if (v !== undefined) out[k] = clone(v);\n return out as T;\n }\n return value;\n}\n\nexport function splitPath(path: string): string[] {\n return path.split(\".\");\n}\n\n/** Problems with a path (forbidden segments) or `undefined` if fine. */\nexport function checkPath(path: string): string | undefined {\n if (path.length === 0) return \"Empty path\";\n for (const seg of splitPath(path)) {\n if (seg.length === 0) return `Empty segment in path \"${path}\"`;\n if (FORBIDDEN_SEGMENTS.has(seg)) return `Forbidden path segment \"${seg}\"`;\n }\n return undefined;\n}\n\n/** True if path `a` equals `b` or is an ancestor of it (segment-wise). */\nexport function isPathPrefix(a: string, b: string): boolean {\n return a === b || b.startsWith(`${a}.`);\n}\n\nexport function pathsOverlap(a: string, b: string): boolean {\n return isPathPrefix(a, b) || isPathPrefix(b, a);\n}\n\n/** Paths in a patch that overlap one another (each reported once). */\nexport function overlappingPaths(paths: readonly string[]): string[] {\n const out = new Set<string>();\n for (let i = 0; i < paths.length; i++)\n for (let j = i + 1; j < paths.length; j++) {\n const a = paths[i] as string;\n const b = paths[j] as string;\n if (pathsOverlap(a, b)) out.add(a.length >= b.length ? a : b);\n }\n return [...out];\n}\n\nexport interface PathLookup {\n /** Whether the full path exists. */\n exists: boolean;\n value: unknown;\n /**\n * The shortest prefix of the path that does not exist (when `exists` is false and the\n * walk only ran through objects), or `undefined` if the walk hit a non-object.\n */\n missingAt?: string;\n /** True if an intermediate segment is not a plain object. */\n blocked: boolean;\n}\n\nexport function lookupPath(root: unknown, path: string): PathLookup {\n const segs = splitPath(path);\n let cur: unknown = root;\n for (let i = 0; i < segs.length; i++) {\n const seg = segs[i] as string;\n if (!isPlainObject(cur)) return { exists: false, value: undefined, blocked: true };\n if (!Object.hasOwn(cur, seg) || cur[seg] === undefined) {\n return {\n exists: false,\n value: undefined,\n missingAt: segs.slice(0, i + 1).join(\".\"),\n blocked: false,\n };\n }\n cur = cur[seg];\n }\n return { exists: true, value: cur, blocked: false };\n}\n\nexport function getPath(root: unknown, path: string): unknown {\n return lookupPath(root, path).value;\n}\n\n/**\n * Set a value at a path on a mutable object (an Immer draft), creating intermediate objects.\n * Throws if an intermediate value exists and is not a plain object.\n */\nexport function setPath(root: Obj, path: string, value: unknown): void {\n const segs = splitPath(path);\n let cur: Obj = root;\n for (let i = 0; i < segs.length - 1; i++) {\n const seg = segs[i] as string;\n const next = cur[seg];\n if (next === undefined) {\n const created: Obj = {};\n cur[seg] = created;\n cur = cur[seg] as Obj;\n } else if (isPlainObject(next)) {\n cur = next as Obj;\n } else {\n throw new Error(`Cannot set \"${path}\": \"${segs.slice(0, i + 1).join(\".\")}\" is not an object`);\n }\n }\n cur[segs[segs.length - 1] as string] = clone(value);\n}\n\n/** Remove the value at a path (no-op if missing). */\nexport function unsetPath(root: Obj, path: string): void {\n const segs = splitPath(path);\n let cur: unknown = root;\n for (let i = 0; i < segs.length - 1; i++) {\n if (!isPlainObject(cur)) return;\n cur = (cur as Obj)[segs[i] as string];\n }\n if (isPlainObject(cur)) delete cur[segs[segs.length - 1] as string];\n}\n\n/** Apply a patch (unset first, then set) to a mutable object. */\nexport function applyPatch(root: Obj, patch: { set?: Obj; unset?: readonly string[] }): void {\n for (const p of patch.unset ?? []) unsetPath(root, p);\n for (const [p, v] of Object.entries(patch.set ?? {})) setPath(root, p, v);\n}\n\n/**\n * The patch that undoes `patch` on `root` (computed before applying). For a set into missing\n * parents, the inverse unsets the shallowest missing ancestor, so the original shape is restored\n * exactly.\n */\nexport function invertPatch(\n root: unknown,\n patch: { set?: Obj; unset?: readonly string[] },\n): { set: Obj; unset: string[] } {\n const set: Obj = {};\n const unset = new Set<string>();\n for (const p of patch.unset ?? []) {\n const l = lookupPath(root, p);\n if (l.exists) set[p] = clone(l.value);\n }\n for (const p of Object.keys(patch.set ?? {})) {\n const l = lookupPath(root, p);\n if (l.exists) set[p] = clone(l.value);\n else if (l.missingAt !== undefined) unset.add(l.missingAt);\n }\n return { set, unset: [...unset] };\n}\n\n/**\n * Leaf-level differences between two objects as a patch: nested plain objects are recursed into,\n * arrays and primitives are compared whole. `skip` lists top-level keys to ignore.\n */\nexport function diffObjects(\n before: Obj,\n after: Obj,\n skip: readonly string[] = [],\n prefix = \"\",\n): { set: Obj; unset: string[] } {\n const set: Obj = {};\n const unset: string[] = [];\n const walk = (a: Obj, b: Obj, base: string, top: boolean) => {\n for (const k of Object.keys(a)) {\n if (top && skip.includes(k)) continue;\n if (a[k] === undefined) continue;\n if (b[k] === undefined) unset.push(base + k);\n }\n for (const k of Object.keys(b)) {\n if (top && skip.includes(k)) continue;\n const bv = b[k];\n if (bv === undefined) continue;\n const av = a[k];\n if (av === undefined) set[base + k] = clone(bv);\n else if (isPlainObject(av) && isPlainObject(bv)) walk(av, bv, `${base + k}.`, false);\n else if (!deepEqual(av, bv)) set[base + k] = clone(bv);\n }\n };\n walk(before, after, prefix, true);\n return { set, unset };\n}\n\nexport function isEmptyPatch(patch: { set?: Obj; unset?: readonly string[] }): boolean {\n return Object.keys(patch.set ?? {}).length === 0 && (patch.unset ?? []).length === 0;\n}\n\n/** All paths a patch touches. */\nexport function patchPaths(patch: { set?: Obj; unset?: readonly string[] }): string[] {\n return [...(patch.unset ?? []), ...Object.keys(patch.set ?? {})];\n}\n\n/**\n * True if `value` survives a JSON round trip unchanged: null, booleans, finite numbers, strings,\n * arrays and plain objects of those (no `undefined`, functions, class instances, NaN).\n */\nexport function isJson(value: unknown, depth = 0): boolean {\n if (depth > 64) return false;\n if (value === null) return true;\n switch (typeof value) {\n case \"boolean\":\n case \"string\":\n return true;\n case \"number\":\n return Number.isFinite(value);\n case \"object\":\n if (Array.isArray(value)) return value.every((v) => isJson(v, depth + 1));\n if (!isPlainObject(value)) return false;\n return Object.values(value).every((v) => isJson(v, depth + 1));\n default:\n return false;\n }\n}\n","import type { Block, GridItem, Section, SiteDocument } from \"@omniharmonic/openspace-schema\";\nimport { produce } from \"immer\";\nimport {\n autoPlace,\n containerPath,\n copyRows,\n findBlock,\n findSection,\n getPage,\n OpError,\n raiseRows,\n resolvePosition,\n sectionsOf,\n} from \"./doc\";\nimport { type ContainerId, FOOTER, type Op, type Patch } from \"./ops\";\nimport {\n applyPatch,\n checkPath,\n clone,\n isForbiddenKey,\n type Obj,\n overlappingPaths,\n patchPaths,\n} from \"./paths\";\n\n/** Top-level keys that path patches may not touch, per target. */\nexport const PROTECTED_PATHS = {\n page: [\"id\", \"sections\"],\n section: [\"id\", \"blocks\"],\n site: [\"nav\"],\n styles: [] as string[],\n} as const;\n\nfunction checkPatch(\n patch: Patch,\n protectedKeys: readonly string[],\n path: (string | number)[],\n what: string,\n): void {\n const paths = patchPaths(patch);\n for (const p of paths) {\n const problem = checkPath(p);\n if (problem) throw new OpError(problem, path);\n const top = p.split(\".\")[0] as string;\n if (protectedKeys.includes(top)) {\n const hint =\n top === \"nav\"\n ? \"use nav.update\"\n : top === \"sections\" || top === \"blocks\"\n ? \"use the section/block ops\"\n : \"ids never change\";\n throw new OpError(`Cannot patch ${what} \"${top}\" directly (${hint})`, path);\n }\n }\n const overlaps = overlappingPaths(paths);\n if (overlaps.length > 0)\n throw new OpError(`Overlapping patch paths: ${overlaps.join(\", \")}`, path);\n}\n\nfunction requireSections(doc: SiteDocument, container: ContainerId): Section[] {\n const sections = sectionsOf(doc, container);\n if (!sections) throw new OpError(`Page ${container} does not exist`, [\"pages\", container]);\n return sections;\n}\n\nfunction requireSection(doc: SiteDocument, container: ContainerId, id: string): Section {\n requireSections(doc, container);\n const loc = findSection(doc, container, id);\n if (!loc)\n throw new OpError(`Section ${id} is not on ${describe(container)}`, containerPath(container));\n return loc.section;\n}\n\nfunction describe(container: ContainerId): string {\n return container === FOOTER ? \"the footer\" : `page ${container}`;\n}\n\nfunction requirePage(doc: SiteDocument, id: string, op: string) {\n if (id === FOOTER) throw new OpError(`${op} is not allowed on the footer`, [\"site\", \"footer\"]);\n const page = getPage(doc, id);\n if (!page) throw new OpError(`Page ${id} does not exist`, [\"pages\", id]);\n return page;\n}\n\n/** Put a block into a section (grid placement/columns handled by the caller). */\nfunction placeInGrid(section: Section, blockId: string, item: GridItem | undefined): void {\n if (section.layout.mode !== \"grid\") return;\n section.layout.items[blockId as Block[\"id\"]] = item ? clone(item) : autoPlace(section.layout);\n}\n\n/**\n * Mutate `doc` (an Immer draft) by `op`. Throws `OpError` when a precondition fails.\n * Exposed for batching inside one `produce` call; most callers want `apply`.\n */\nexport function mutate(doc: SiteDocument, op: Op): void {\n switch (op.op) {\n case \"block.update\": {\n for (const k of [...(op.unset ?? []), ...Object.keys(op.set ?? {})])\n if (isForbiddenKey(k)) throw new OpError(`Forbidden field key \"${k}\"`, [\"set\", k]);\n requireSections(doc, op.page);\n const loc = findBlock(doc, op.page, op.block);\n if (!loc)\n throw new OpError(\n `Block ${op.block} is not on ${describe(op.page)}`,\n containerPath(op.page),\n );\n const b = loc.block;\n for (const k of op.unset ?? []) delete b.fields[k];\n for (const [k, v] of Object.entries(op.set ?? {})) b.fields[k] = clone(v);\n if (op.variant !== undefined) {\n if (op.variant === null) delete b.variant;\n else b.variant = op.variant;\n }\n if (op.style !== undefined) {\n if (op.style === null) delete b.style;\n else b.style = clone(op.style);\n }\n if (op.label !== undefined) {\n if (op.label === null) delete b.label;\n else b.label = op.label;\n }\n if (op.hidden !== undefined) {\n if (!op.hidden) delete b.hidden;\n else b.hidden = true;\n }\n if (op.column !== undefined) {\n if (op.column === null) delete b.column;\n else b.column = op.column;\n }\n return;\n }\n case \"block.insert\": {\n const section = requireSection(doc, op.page, op.section);\n const at = resolvePosition(\n section.blocks.map((b) => b.id),\n op.at,\n [...containerPath(op.page), \"sections\", op.section],\n );\n if (section.blocks.some((b) => b.id === op.block.id))\n throw new OpError(`Block ${op.block.id} already exists`, [\"block\", \"id\"]);\n section.blocks.splice(at, 0, clone(op.block));\n if (section.layout.mode === \"grid\") {\n placeInGrid(section, op.block.id, op.place);\n if (op.rows) section.layout.rows = copyRows(op.rows);\n else raiseRows(section.layout);\n }\n return;\n }\n case \"block.move\": {\n requireSections(doc, op.page);\n const from = findBlock(doc, op.page, op.block);\n if (!from)\n throw new OpError(\n `Block ${op.block} is not on ${describe(op.page)}`,\n containerPath(op.page),\n );\n const dest = requireSection(doc, op.page, op.to.section);\n const src = from.section;\n const same = src.id === dest.id;\n const [block] = src.blocks.splice(from.index, 1) as [Block];\n if (src.layout.mode === \"grid\" && !same) {\n delete src.layout.items[block.id];\n if (op.fromRows) src.layout.rows = copyRows(op.fromRows);\n }\n const at = resolvePosition(\n dest.blocks.map((b) => b.id),\n op.to.at,\n [...containerPath(op.page), \"sections\", dest.id],\n );\n dest.blocks.splice(at, 0, block);\n const moved = dest.blocks[at] as Block;\n if (dest.layout.mode === \"grid\") {\n // Within one grid section the placement is kept unless a new one is given.\n if (!same || op.to.place || !dest.layout.items[block.id])\n placeInGrid(dest, block.id, op.to.place);\n if (op.to.rows) dest.layout.rows = copyRows(op.to.rows);\n else raiseRows(dest.layout);\n }\n if (op.to.column !== undefined) {\n if (op.to.column === null) delete moved.column;\n else moved.column = op.to.column;\n } else if (dest.layout.mode === \"stack\" && moved.column !== undefined) {\n const cols = dest.layout.columns.d.length;\n if (moved.column >= cols) moved.column = cols - 1;\n }\n return;\n }\n case \"block.delete\": {\n requireSections(doc, op.page);\n const loc = findBlock(doc, op.page, op.block);\n if (!loc)\n throw new OpError(\n `Block ${op.block} is not on ${describe(op.page)}`,\n containerPath(op.page),\n );\n loc.section.blocks.splice(loc.index, 1);\n if (loc.section.layout.mode === \"grid\") {\n delete loc.section.layout.items[op.block];\n if (op.rows) loc.section.layout.rows = copyRows(op.rows);\n }\n return;\n }\n case \"grid.place\": {\n const section = requireSection(doc, op.page, op.section);\n const base = [...containerPath(op.page), \"sections\", op.section];\n if (section.layout.mode !== \"grid\")\n throw new OpError(`Section ${op.section} is not a grid section`, [\n ...base,\n \"layout\",\n \"mode\",\n ]);\n if (!section.blocks.some((b) => b.id === op.block))\n throw new OpError(`Block ${op.block} is not in section ${op.section}`, [...base, \"blocks\"]);\n const item = section.layout.items[op.block];\n if (op.rect === null) {\n if (op.bp === \"d\")\n throw new OpError(\"The desktop placement cannot be removed\", [\n ...base,\n \"layout\",\n \"items\",\n op.block,\n \"d\",\n ]);\n if (item) delete item[op.bp];\n } else if (item) {\n item[op.bp] = clone(op.rect);\n } else {\n if (op.bp !== \"d\")\n throw new OpError(`Block ${op.block} needs a desktop placement first`, [\n ...base,\n \"layout\",\n \"items\",\n op.block,\n ]);\n section.layout.items[op.block] = { d: clone(op.rect) };\n }\n if (op.rows) section.layout.rows = copyRows(op.rows);\n else raiseRows(section.layout);\n return;\n }\n case \"section.insert\": {\n const page = requirePage(doc, op.page, \"section.insert\");\n const at = resolvePosition(\n page.sections.map((s) => s.id),\n op.at,\n [\"pages\", op.page],\n );\n if (page.sections.some((s) => s.id === op.section.id))\n throw new OpError(`Section ${op.section.id} already exists`, [\"section\", \"id\"]);\n page.sections.splice(at, 0, clone(op.section));\n return;\n }\n case \"section.move\": {\n const page = requirePage(doc, op.page, \"section.move\");\n const from = page.sections.findIndex((s) => s.id === op.section);\n if (from < 0)\n throw new OpError(`Section ${op.section} is not on page ${op.page}`, [\"pages\", op.page]);\n const [section] = page.sections.splice(from, 1) as [Section];\n const at = resolvePosition(\n page.sections.map((s) => s.id),\n op.at,\n [\"pages\", op.page],\n );\n page.sections.splice(at, 0, section);\n return;\n }\n case \"section.delete\": {\n const page = requirePage(doc, op.page, \"section.delete\");\n const from = page.sections.findIndex((s) => s.id === op.section);\n if (from < 0)\n throw new OpError(`Section ${op.section} is not on page ${op.page}`, [\"pages\", op.page]);\n page.sections.splice(from, 1);\n return;\n }\n case \"section.update\": {\n const section = requireSection(doc, op.page, op.section);\n checkPatch(\n op,\n PROTECTED_PATHS.section,\n [...containerPath(op.page), \"sections\", op.section],\n \"section\",\n );\n applyPatch(section as unknown as Obj, op);\n return;\n }\n case \"styles.patch\": {\n checkPatch(op.patch, PROTECTED_PATHS.styles, [\"styles\"], \"styles\");\n applyPatch(doc.styles as unknown as Obj, op.patch);\n return;\n }\n case \"page.create\": {\n if (getPage(doc, op.page.id))\n throw new OpError(`Page ${op.page.id} already exists`, [\"pages\", op.page.id]);\n doc.pages[op.page.id] = clone(op.page);\n if (op.nav) doc.site.nav = clone(op.nav);\n return;\n }\n case \"page.update\": {\n const page = requirePage(doc, op.page, \"page.update\");\n checkPatch(op, PROTECTED_PATHS.page, [\"pages\", op.page], \"page\");\n applyPatch(page as unknown as Obj, op);\n return;\n }\n case \"page.delete\": {\n requirePage(doc, op.page, \"page.delete\");\n delete doc.pages[op.page];\n if (op.nav) doc.site.nav = clone(op.nav);\n return;\n }\n case \"nav.update\": {\n doc.site.nav = clone(op.tree);\n return;\n }\n case \"site.update\": {\n checkPatch(op, PROTECTED_PATHS.site, [\"site\"], \"site\");\n applyPatch(doc.site as unknown as Obj, op);\n return;\n }\n case \"media.add\": {\n doc.media[op.path] = clone(op.meta);\n return;\n }\n case \"media.remove\": {\n if (!Object.hasOwn(doc.media, op.path))\n throw new OpError(`Media ${op.path} does not exist`, [\"media\", op.path]);\n delete doc.media[op.path];\n return;\n }\n case \"collection.upsert\": {\n const items = Object.hasOwn(doc.collections, op.collection)\n ? doc.collections[op.collection]\n : undefined;\n if (items) items[op.item.slug] = clone(op.item);\n else doc.collections[op.collection] = { [op.item.slug]: clone(op.item) };\n return;\n }\n case \"collection.delete\": {\n const items = Object.hasOwn(doc.collections, op.collection)\n ? doc.collections[op.collection]\n : undefined;\n if (!items || !Object.hasOwn(items, op.slug))\n throw new OpError(`Item ${op.collection}/${op.slug} does not exist`, [\n \"collections\",\n op.collection,\n op.slug,\n ]);\n delete items[op.slug];\n if (!op.keepEmpty && Object.keys(items).length === 0) delete doc.collections[op.collection];\n return;\n }\n case \"collectionConfig.upsert\": {\n if (op.config === null) {\n const configs = doc.collectionConfigs;\n if (!configs || !Object.hasOwn(configs, op.collection))\n throw new OpError(`Collection ${op.collection} has no settings`, [\n \"collectionConfigs\",\n op.collection,\n ]);\n delete configs[op.collection];\n if (!op.keepEmpty && Object.keys(configs).length === 0) delete doc.collectionConfigs;\n } else {\n if (!doc.collectionConfigs) doc.collectionConfigs = {};\n doc.collectionConfigs[op.collection] = clone(op.config);\n }\n return;\n }\n default: {\n const never: never = op;\n throw new OpError(`Unknown op ${(never as { op: string }).op}`, [\"op\"]);\n }\n }\n}\n\n/**\n * Apply an op immutably (Immer structural sharing; untouched pages keep their identity).\n * Throws `OpError` when a precondition fails. Does not schema-validate — use `validate` for\n * untrusted ops.\n */\nexport function apply(doc: SiteDocument, op: Op): SiteDocument {\n return produce(doc, (draft) => {\n mutate(draft as SiteDocument, op);\n });\n}\n\n/** Apply ops in order (one Immer pass). Throws `OpError` (with `index`) on the first failure. */\nexport function applyAll(doc: SiteDocument, ops: readonly Op[]): SiteDocument {\n return produce(doc, (draft) => {\n ops.forEach((op, index) => {\n try {\n mutate(draft as SiteDocument, op);\n } catch (e) {\n if (e instanceof OpError) throw Object.assign(e, { index });\n throw e;\n }\n });\n });\n}\n","import type { Block, NavItem, Page, Section, SiteDocument } from \"@omniharmonic/openspace-schema\";\nimport { apply } from \"./apply\";\nimport { findSection, getPage, locateBlock, locateSection } from \"./doc\";\nimport { type ContainerId, FOOTER, type Op, type OpBody, type OpMeta } from \"./ops\";\nimport { clone, deepEqual, diffObjects, isEmptyPatch, type Obj } from \"./paths\";\n\nexport interface DiffOptions {\n actor?: string;\n ts?: number;\n /** Op ids are `<idPrefix><n>`. */\n idPrefix?: string;\n}\n\n/** Navigation with every reference to `pageId` removed (folders keep their other items). */\nexport function pruneNav(nav: readonly NavItem[], pageId: string): NavItem[] {\n const out: NavItem[] = [];\n for (const item of nav) {\n if (item.type === \"page\" && item.page === pageId) continue;\n if (item.type === \"button\" && item.link.type === \"page\" && item.link.page === pageId) continue;\n if (item.type === \"folder\") {\n const folder = clone(item);\n if (folder.page === pageId) delete folder.page;\n folder.items = folder.items.filter((leaf) => !(leaf.type === \"page\" && leaf.page === pageId));\n out.push(folder);\n continue;\n }\n out.push(clone(item));\n }\n return out;\n}\n\nfunction navRefersTo(nav: readonly NavItem[], pageId: string): boolean {\n return !deepEqual(pruneNav(nav, pageId), nav);\n}\n\n/**\n * Ops that turn `before` into `after` (`applyAll(before, diff(before, after))` equals `after`,\n * except `config`, which ops do not edit). Used by the CLI/local MCP to turn file edits into ops\n * and by the update bot. Ids are matched, so moved blocks/sections become moves, not\n * delete + insert (cross-page moves are delete + insert).\n *\n * Each op is applied to a working copy as it is emitted, so later ops see earlier ones. For\n * ordinary edits every op is individually valid; contrived reshuffles (e.g. swapping two pages'\n * slugs) may pass through an intermediate state that `validate` would reject.\n */\nexport function diff(before: SiteDocument, after: SiteDocument, options: DiffOptions = {}): Op[] {\n const actor = options.actor ?? \"system\";\n const ts = options.ts ?? 0;\n const prefix = options.idPrefix ?? \"diff-\";\n const ops: Op[] = [];\n let work = before;\n const emit = (body: OpBody) => {\n const meta: OpMeta = { id: `${prefix}${ops.length + 1}`, actor, ts };\n const op = { ...body, ...meta } as Op;\n ops.push(op);\n work = apply(work, op);\n };\n\n // Where every section/block lives in `after`.\n const afterSections = new Map<string, ContainerId>();\n const afterBlocks = new Set<string>();\n const noteSection = (container: ContainerId, s: Section) => {\n afterSections.set(s.id, container);\n for (const b of s.blocks) afterBlocks.add(b.id);\n };\n noteSection(FOOTER, after.site.footer);\n for (const page of Object.values(after.pages))\n for (const s of page.sections) noteSection(page.id, s);\n\n // 1. Styles.\n const styles = diffObjects(before.styles as unknown as Obj, after.styles as unknown as Obj);\n if (!isEmptyPatch(styles)) emit({ op: \"styles.patch\", patch: compactPatch(styles) });\n\n // 2. Deleted pages (dropping them from navigation in the same step).\n for (const id of Object.keys(before.pages)) {\n if (Object.hasOwn(after.pages, id)) continue;\n const nav = work.site.nav;\n emit(\n navRefersTo(nav, id)\n ? { op: \"page.delete\", page: id as Page[\"id\"], nav: pruneNav(nav, id) }\n : { op: \"page.delete\", page: id as Page[\"id\"] },\n );\n }\n\n // 3. Content that no longer exists anywhere.\n for (const page of Object.values(work.pages))\n for (const s of [...page.sections])\n if (!afterSections.has(s.id)) emit({ op: \"section.delete\", page: page.id, section: s.id });\n const removeBlock = (id: string) => {\n const loc = locateBlock(work, id);\n if (loc) emit({ op: \"block.delete\", page: loc.container, block: id as Block[\"id\"] });\n };\n const allBlocks = (doc: SiteDocument) => {\n const ids: string[] = doc.site.footer.blocks.map((b) => b.id);\n for (const p of Object.values(doc.pages))\n for (const s of p.sections) for (const b of s.blocks) ids.push(b.id);\n return ids;\n };\n for (const id of allBlocks(work)) if (!afterBlocks.has(id)) removeBlock(id);\n\n // 4. New pages: whole when none of their content exists yet, otherwise empty then filled.\n for (const page of Object.values(after.pages)) {\n if (getPage(work, page.id)) continue;\n const reuses = page.sections.some(\n (s) => locateSection(work, s.id) || s.blocks.some((b) => locateBlock(work, b.id)),\n );\n emit({ op: \"page.create\", page: reuses ? { ...clone(page), sections: [] } : clone(page) });\n }\n\n // 5. Structure: sections in order per page, blocks in order per section.\n const insertWhole = (page: Page[\"id\"], at: number, section: Section) => {\n for (const b of section.blocks) removeBlock(b.id);\n emit({ op: \"section.insert\", page, at, section: clone(section) });\n };\n const needsReplace = (w: Section, s: Section) =>\n w.layout.mode !== s.layout.mode ||\n (w.layout.mode === \"stack\" &&\n s.layout.mode === \"stack\" &&\n w.layout.columns.d.length !== s.layout.columns.d.length);\n\n const syncBlocks = (container: ContainerId, target: Section) => {\n target.blocks.forEach((ab, i) => {\n const cur = liveSection(work, container, target.id);\n const grid = target.layout.mode === \"grid\" ? target.layout : undefined;\n if (cur.blocks[i]?.id !== ab.id) {\n const loc = locateBlock(work, ab.id);\n if (loc && loc.container === container) {\n const to: Extract<OpBody, { op: \"block.move\" }>[\"to\"] = { section: target.id, at: i };\n const item = grid?.items[ab.id];\n if (item) to.place = clone(item);\n if (!grid) to.column = ab.column ?? null;\n emit({ op: \"block.move\", page: container, block: ab.id, to });\n } else {\n if (loc) removeBlock(ab.id);\n const item = grid?.items[ab.id];\n emit({\n op: \"block.insert\",\n page: container,\n section: target.id,\n at: i,\n block: clone(ab),\n ...(item ? { place: clone(item) } : {}),\n });\n }\n }\n // Content of the block.\n const wb = liveSection(work, container, target.id).blocks[i] as Block;\n const set: Record<string, unknown> = {};\n const unset: string[] = [];\n for (const k of Object.keys(wb.fields))\n if (!Object.hasOwn(ab.fields, k) || ab.fields[k] === undefined) unset.push(k);\n for (const [k, v] of Object.entries(ab.fields))\n if (v !== undefined && !deepEqual(wb.fields[k], v)) set[k] = clone(v);\n const upd: Extract<OpBody, { op: \"block.update\" }> = {\n op: \"block.update\",\n page: container,\n block: ab.id,\n };\n if (Object.keys(set).length) upd.set = set;\n if (unset.length) upd.unset = unset;\n if (!deepEqual(wb.variant, ab.variant)) upd.variant = ab.variant ?? null;\n if (!deepEqual(wb.style, ab.style)) upd.style = ab.style ? clone(ab.style) : null;\n if (!deepEqual(wb.column, ab.column)) upd.column = ab.column ?? null;\n if (!deepEqual(wb.label, ab.label)) upd.label = ab.label ?? null;\n if (Boolean(wb.hidden) !== Boolean(ab.hidden)) upd.hidden = ab.hidden ? true : null;\n if (Object.keys(upd).length > 3) emit(upd);\n // Grid placement.\n if (grid) {\n const wl = liveSection(work, container, target.id).layout;\n const witem = wl.mode === \"grid\" ? wl.items[ab.id] : undefined;\n const sitem = grid.items[ab.id];\n if (sitem)\n for (const bp of [\"d\", \"t\", \"m\"] as const) {\n if (deepEqual(witem?.[bp], sitem[bp])) continue;\n const rect = sitem[bp];\n emit({\n op: \"grid.place\",\n page: container,\n section: target.id,\n block: ab.id,\n bp,\n rect: rect ? clone(rect) : null,\n });\n }\n }\n });\n };\n\n // Footer.\n {\n const target = after.site.footer;\n const w = work.site.footer;\n if (w.id !== target.id || needsReplace(w, target)) {\n for (const b of target.blocks) if (!w.blocks.some((x) => x.id === b.id)) removeBlock(b.id);\n emit({ op: \"site.update\", set: { footer: clone(target) } });\n } else syncBlocks(FOOTER, target);\n }\n\n for (const page of Object.values(after.pages)) {\n page.sections.forEach((target, j) => {\n const cur = (getPage(work, page.id) as Page).sections;\n if (cur[j]?.id !== target.id) {\n const loc = locateSection(work, target.id);\n if (loc && loc.container === page.id) {\n emit({ op: \"section.move\", page: page.id, section: target.id, at: j });\n } else {\n if (loc && loc.container !== FOOTER)\n emit({ op: \"section.delete\", page: loc.container, section: target.id });\n insertWhole(page.id, j, target);\n return;\n }\n }\n const w = (getPage(work, page.id) as Page).sections[j] as Section;\n if (needsReplace(w, target)) {\n emit({ op: \"section.delete\", page: page.id, section: target.id });\n insertWhole(page.id, j, target);\n return;\n }\n syncBlocks(page.id, target);\n });\n }\n\n // 6. Section settings (layout rows/columns, style, label…) once membership is final.\n const syncSection = (container: ContainerId, target: Section) => {\n const w = findSection(work, container, target.id)?.section;\n if (!w) return;\n const patch = diffObjects(w as unknown as Obj, target as unknown as Obj, [\"id\", \"blocks\"]);\n if (!isEmptyPatch(patch))\n emit({ op: \"section.update\", page: container, section: target.id, ...compactPatch(patch) });\n };\n syncSection(FOOTER, after.site.footer);\n for (const page of Object.values(after.pages))\n for (const s of page.sections) syncSection(page.id, s);\n\n // 7. Page settings.\n for (const page of Object.values(after.pages)) {\n const w = getPage(work, page.id) as Page;\n const patch = diffObjects(w as unknown as Obj, page as unknown as Obj, [\"id\", \"sections\"]);\n if (!isEmptyPatch(patch)) emit({ op: \"page.update\", page: page.id, ...compactPatch(patch) });\n }\n\n // 8. Site settings and navigation.\n const site = diffObjects(work.site as unknown as Obj, after.site as unknown as Obj, [\n \"nav\",\n \"footer\",\n ]);\n if (!isEmptyPatch(site)) emit({ op: \"site.update\", ...compactPatch(site) });\n if (!deepEqual(work.site.nav, after.site.nav))\n emit({ op: \"nav.update\", tree: clone(after.site.nav) });\n\n // 9. Media.\n for (const path of Object.keys(work.media))\n if (!Object.hasOwn(after.media, path)) emit({ op: \"media.remove\", path });\n for (const [path, meta] of Object.entries(after.media))\n if (!deepEqual(work.media[path], meta)) emit({ op: \"media.add\", path, meta: clone(meta) });\n\n // 10. Collections.\n for (const [name, items] of Object.entries(work.collections)) {\n const keep = after.collections[name];\n const gone = Object.keys(items).filter((slug) => !keep || !Object.hasOwn(keep, slug));\n for (const slug of gone)\n emit({\n op: \"collection.delete\",\n collection: name,\n slug,\n ...(keep ? { keepEmpty: true } : {}),\n });\n }\n for (const [name, items] of Object.entries(after.collections))\n for (const [slug, item] of Object.entries(items))\n if (!deepEqual(work.collections[name]?.[slug], item))\n emit({ op: \"collection.upsert\", collection: name, item: clone(item) });\n\n // 11. Collection settings.\n const wc = work.collectionConfigs ?? {};\n const ac = after.collectionConfigs;\n const goneConfigs = Object.keys(wc).filter((n) => !ac || !Object.hasOwn(ac, n));\n for (const name of goneConfigs)\n emit({\n op: \"collectionConfig.upsert\",\n collection: name,\n config: null,\n ...(ac ? { keepEmpty: true } : {}),\n });\n for (const [name, config] of Object.entries(ac ?? {}))\n if (!deepEqual(wc[name], config))\n emit({ op: \"collectionConfig.upsert\", collection: name, config: clone(config) });\n\n return ops;\n}\n\nfunction compactPatch(patch: { set: Obj; unset: string[] }): { set?: Obj; unset?: string[] } {\n const out: { set?: Obj; unset?: string[] } = {};\n if (Object.keys(patch.set).length) out.set = patch.set;\n if (patch.unset.length) out.unset = patch.unset;\n return out;\n}\n\nfunction liveSection(doc: SiteDocument, container: ContainerId, id: string): Section {\n const loc = findSection(doc, container, id);\n if (!loc) throw new Error(`diff: section ${id} vanished from ${container}`);\n return loc.section;\n}\n","import {\n type Block,\n type BlockRegistry,\n type CollectionItem,\n type NavItem,\n PageSchema,\n SectionSchema,\n type SiteDocument,\n SiteDocumentSchema,\n SiteSchema,\n StylesSchema,\n} from \"@omniharmonic/openspace-schema\";\nimport { produce } from \"immer\";\nimport type { z } from \"zod\";\nimport { mutate } from \"./apply\";\nimport { containerPath, indexIds, OpError, sectionsOf } from \"./doc\";\nimport { type ContainerId, FOOTER, type Op, parseOp } from \"./ops\";\nimport { findForbiddenKey, isJson, isPathPrefix, isPlainObject, patchPaths } from \"./paths\";\n\nexport interface OpIssue {\n path: (string | number)[];\n message: string;\n}\n\nexport type ValidationResult =\n | { ok: true; doc: SiteDocument; warnings: OpIssue[] }\n | { ok: false; errors: OpIssue[] };\n\nexport interface ValidateOptions {\n /** Also validate inserted/updated blocks' fields against their definitions. */\n registry?: BlockRegistry;\n /**\n * Skip parsing the op's shape with `OpSchema` (only for ops constructed in-process by\n * trusted code; anything from the network must be parsed).\n */\n trusted?: boolean;\n}\n\nfunction zodIssues(error: z.ZodError, prefix: (string | number)[]): OpIssue[] {\n return error.issues.map((i) => ({\n path: [...prefix, ...i.path.map((p) => (typeof p === \"symbol\" ? String(p) : p))],\n message: i.message,\n }));\n}\n\n// --- referential checks ----------------------------------------------------------------------\n\n/** Navigation/announcement links that point at pages which do not exist. */\nexport function siteRefIssues(doc: SiteDocument): OpIssue[] {\n const issues: OpIssue[] = [];\n const has = (id: string) => Object.hasOwn(doc.pages, id);\n const checkItem = (item: NavItem | { type: string }, path: (string | number)[]) => {\n const it = item as NavItem;\n if (it.type === \"page\" && !has(it.page))\n issues.push({\n path: [...path, \"page\"],\n message: `Navigation links to missing page ${it.page}`,\n });\n if (it.type === \"folder\") {\n if (it.page && !has(it.page))\n issues.push({\n path: [...path, \"page\"],\n message: `Folder lands on missing page ${it.page}`,\n });\n it.items.forEach((leaf, j) => {\n checkItem(leaf, [...path, \"items\", j]);\n });\n }\n if (it.type === \"button\" && it.link.type === \"page\" && !has(it.link.page))\n issues.push({\n path: [...path, \"link\", \"page\"],\n message: `Button links to missing page ${it.link.page}`,\n });\n };\n doc.site.nav.forEach((item, i) => {\n checkItem(item, [\"site\", \"nav\", i]);\n });\n const link = doc.site.announcement?.link;\n if (link?.type === \"page\" && !has(link.page))\n issues.push({\n path: [\"site\", \"announcement\", \"link\", \"page\"],\n message: `Announcement links to missing page ${link.page}`,\n });\n return issues;\n}\n\n/** Walk a JSON value, calling `visit` for every plain object with its path. */\nfunction walk(\n value: unknown,\n path: (string | number)[],\n visit: (o: Record<string, unknown>, p: (string | number)[]) => void,\n) {\n if (Array.isArray(value)) {\n value.forEach((v, i) => {\n walk(v, [...path, i], visit);\n });\n } else if (isPlainObject(value)) {\n visit(value, path);\n for (const [k, v] of Object.entries(value)) walk(v, [...path, k], visit);\n }\n}\n\n/** Page links inside page content (block fields, SEO…) that point at `pageId`. */\nfunction contentLinksTo(doc: SiteDocument, pageId: string): OpIssue[] {\n const out: OpIssue[] = [];\n const visit = (o: Record<string, unknown>, p: (string | number)[]) => {\n if (o.type === \"page\" && o.page === pageId)\n out.push({ path: p, message: `Links to deleted page ${pageId}` });\n };\n walk(doc.pages, [\"pages\"], visit);\n walk(doc.site.footer, [\"site\", \"footer\"], visit);\n return out;\n}\n\n/** Strings anywhere in content equal to a media path. */\nfunction mediaRefs(doc: SiteDocument, path: string): OpIssue[] {\n const out: OpIssue[] = [];\n const scan = (value: unknown, p: (string | number)[]) => {\n if (typeof value === \"string\") {\n if (value === path) out.push({ path: p, message: `Still references removed media ${path}` });\n } else if (Array.isArray(value)) {\n value.forEach((v, i) => {\n scan(v, [...p, i]);\n });\n } else if (isPlainObject(value)) for (const [k, v] of Object.entries(value)) scan(v, [...p, k]);\n };\n scan(doc.pages, [\"pages\"]);\n scan(doc.site, [\"site\"]);\n scan(doc.collections, [\"collections\"]);\n return out;\n}\n\nfunction slugIssues(doc: SiteDocument, pageId: string): OpIssue[] {\n const page = doc.pages[pageId as keyof SiteDocument[\"pages\"]];\n if (!page) return [];\n for (const other of Object.values(doc.pages)) {\n if (other.id !== pageId && other.slug === page.slug)\n return [\n {\n path: [\"pages\", pageId, \"slug\"],\n message: `Slug \"${page.slug}\" is also used by ${other.id}`,\n },\n ];\n }\n return [];\n}\n\nfunction collectionIssues(doc: SiteDocument, name: string): OpIssue[] {\n const items = Object.values(doc.collections[name] ?? {}) as CollectionItem[];\n const kinds = new Set(items.map((i) => i.kind));\n const out: OpIssue[] = [];\n if (kinds.size > 1)\n out.push({ path: [\"collections\", name], message: `Collection ${name} mixes item kinds` });\n const configKind = doc.collectionConfigs?.[name]?.kind;\n if (configKind && configKind !== \"custom\") {\n for (const item of items)\n if (item.kind !== configKind)\n out.push({\n path: [\"collections\", name, item.slug, \"kind\"],\n message: `Collection ${name} is a ${configKind} collection but ${item.slug} is ${item.kind}`,\n });\n }\n return out;\n}\n\n/** Section/block ids introduced by an op must be new to the whole document. */\nfunction newIdIssues(\n doc: SiteDocument,\n sections: readonly { id: string; blocks: readonly { id: string }[] }[],\n blocks: readonly { id: string }[],\n path: (string | number)[],\n): OpIssue[] {\n const idx = indexIds(doc);\n const out: OpIssue[] = [];\n const seen = new Set<string>();\n const claim = (id: string, kind: \"Section\" | \"Block\", taken: boolean) => {\n if (taken || seen.has(id)) out.push({ path, message: `${kind} id ${id} is already used` });\n seen.add(id);\n };\n for (const s of sections) {\n claim(s.id, \"Section\", idx.sections.has(s.id));\n for (const b of s.blocks) claim(b.id, \"Block\", idx.blocks.has(b.id));\n }\n for (const b of blocks) claim(b.id, \"Block\", idx.blocks.has(b.id));\n return out;\n}\n\n/** Section/block ids must be unique across pages + footer (checked after footer replacement). */\nfunction globalIdIssues(doc: SiteDocument): OpIssue[] {\n const r = SiteDocumentSchema.safeParse(doc);\n if (r.success) return [];\n return zodIssues(r.error, []).filter((i) => /id .* is used in both/.test(i.message));\n}\n\nfunction containerIssues(doc: SiteDocument, container: ContainerId): OpIssue[] {\n if (container === FOOTER) {\n const r = SectionSchema.safeParse(doc.site.footer);\n return r.success ? [] : zodIssues(r.error, [\"site\", \"footer\"]);\n }\n const page = doc.pages[container];\n if (!page) return [{ path: [\"pages\", container], message: `Page ${container} does not exist` }];\n const r = PageSchema.safeParse(page);\n return r.success ? [] : zodIssues(r.error, [\"pages\", container]);\n}\n\nfunction blockIssues(\n registry: BlockRegistry | undefined,\n doc: SiteDocument,\n container: ContainerId,\n ids: readonly string[],\n): OpIssue[] {\n if (!registry || ids.length === 0) return [];\n const want = new Set(ids);\n const out: OpIssue[] = [];\n const base = containerPath(container);\n (sectionsOf(doc, container) ?? []).forEach((s, i) => {\n s.blocks.forEach((b: Block, j) => {\n if (!want.has(b.id)) return;\n const r = registry.validate(b);\n if (!r.success)\n for (const issue of r.issues)\n out.push({\n path: [...base, \"sections\", i, \"blocks\", j, ...issue.path],\n message: issue.message,\n });\n });\n });\n return out;\n}\n\nfunction setValueIssues(op: Op): OpIssue[] {\n const sets: Record<string, unknown>[] = [];\n if (op.op === \"styles.patch\") sets.push(op.patch.set ?? {});\n else if (\n op.op === \"block.update\" ||\n op.op === \"section.update\" ||\n op.op === \"page.update\" ||\n op.op === \"site.update\"\n )\n sets.push(op.set ?? {});\n const out: OpIssue[] = [];\n for (const set of sets)\n for (const [k, v] of Object.entries(set))\n if (v === undefined || !isJson(v))\n out.push({ path: [\"set\", k], message: `Value for \"${k}\" is not plain JSON` });\n return out;\n}\n\n// --- validate --------------------------------------------------------------------------------\n\n/**\n * Validate an op against a document: shape (OpSchema), preconditions (targets exist, positions in\n * range, new ids unique), then the resulting fragment (page, footer, site, styles, item…) against\n * the schema plus referential integrity. On success returns the resulting document and any\n * non-blocking warnings (e.g. content links to a deleted page).\n */\nexport function validate(\n doc: SiteDocument,\n input: Op | unknown,\n options: ValidateOptions = {},\n): ValidationResult {\n const forbidden = findForbiddenKey(input);\n if (forbidden)\n return { ok: false, errors: [{ path: [], message: `Forbidden key \"${forbidden}\"` }] };\n let op: Op;\n if (options.trusted) op = input as Op;\n else {\n const parsed = parseOp(input);\n if (!parsed.ok) return { ok: false, errors: parsed.errors };\n op = parsed.op;\n }\n const valueIssues = setValueIssues(op);\n if (valueIssues.length) return { ok: false, errors: valueIssues };\n\n // Preconditions that need the document before the op.\n const pre: OpIssue[] = [];\n switch (op.op) {\n case \"block.insert\":\n pre.push(...newIdIssues(doc, [], [op.block], [\"block\", \"id\"]));\n break;\n case \"section.insert\":\n pre.push(...newIdIssues(doc, [op.section], [], [\"section\", \"id\"]));\n break;\n case \"page.create\":\n pre.push(...newIdIssues(doc, op.page.sections, [], [\"page\", \"sections\"]));\n break;\n case \"media.add\":\n if (op.meta.path !== op.path)\n pre.push({\n path: [\"meta\", \"path\"],\n message: `Media path ${op.meta.path} does not match ${op.path}`,\n });\n for (const [p, m] of Object.entries(doc.media))\n if (p !== op.path && m.id === op.meta.id)\n pre.push({\n path: [\"meta\", \"id\"],\n message: `Media id ${op.meta.id} is already used by ${p}`,\n });\n break;\n }\n if (pre.length) return { ok: false, errors: pre };\n\n let next: SiteDocument;\n try {\n next = produce(doc, (draft) => {\n mutate(draft as SiteDocument, op);\n });\n } catch (e) {\n if (e instanceof OpError) return { ok: false, errors: [{ path: e.path, message: e.message }] };\n return {\n ok: false,\n errors: [{ path: [], message: e instanceof Error ? e.message : String(e) }],\n };\n }\n\n const errors: OpIssue[] = [];\n const warnings: OpIssue[] = [];\n switch (op.op) {\n case \"block.update\":\n errors.push(\n ...containerIssues(next, op.page),\n ...blockIssues(options.registry, next, op.page, [op.block]),\n );\n break;\n case \"block.insert\":\n errors.push(\n ...containerIssues(next, op.page),\n ...blockIssues(options.registry, next, op.page, [op.block.id]),\n );\n break;\n case \"block.move\":\n case \"block.delete\":\n case \"grid.place\":\n case \"section.move\":\n case \"section.delete\":\n errors.push(...containerIssues(next, op.page));\n break;\n case \"section.update\":\n errors.push(...containerIssues(next, op.page));\n break;\n case \"section.insert\":\n errors.push(\n ...containerIssues(next, op.page),\n ...blockIssues(\n options.registry,\n next,\n op.page,\n op.section.blocks.map((b) => b.id),\n ),\n );\n break;\n case \"page.create\":\n errors.push(\n ...containerIssues(next, op.page.id),\n ...slugIssues(next, op.page.id),\n ...blockIssues(\n options.registry,\n next,\n op.page.id,\n op.page.sections.flatMap((s) => s.blocks.map((b) => b.id)),\n ),\n );\n if (op.nav) errors.push(...siteSchemaIssues(next), ...siteRefIssues(next));\n break;\n case \"page.update\":\n errors.push(...containerIssues(next, op.page));\n if (patchPaths(op).some((p) => isPathPrefix(\"slug\", p)))\n errors.push(...slugIssues(next, op.page));\n break;\n case \"page.delete\":\n if (op.nav) errors.push(...siteSchemaIssues(next));\n errors.push(...siteRefIssues(next));\n warnings.push(...contentLinksTo(next, op.page));\n break;\n case \"nav.update\":\n errors.push(...siteSchemaIssues(next), ...siteRefIssues(next));\n break;\n case \"site.update\":\n errors.push(...siteSchemaIssues(next), ...siteRefIssues(next));\n if (errors.length === 0 && patchPaths(op).some((p) => isPathPrefix(\"footer\", p)))\n errors.push(...globalIdIssues(next));\n break;\n case \"styles.patch\": {\n const r = StylesSchema.safeParse(next.styles);\n if (!r.success) errors.push(...zodIssues(r.error, [\"styles\"]));\n break;\n }\n case \"media.add\":\n break;\n case \"media.remove\":\n warnings.push(...mediaRefs(next, op.path));\n break;\n case \"collection.upsert\":\n case \"collectionConfig.upsert\":\n errors.push(...collectionIssues(next, op.collection));\n break;\n case \"collection.delete\":\n break;\n }\n if (errors.length) return { ok: false, errors };\n return { ok: true, doc: next, warnings };\n}\n\nfunction siteSchemaIssues(doc: SiteDocument): OpIssue[] {\n const r = SiteSchema.safeParse(doc.site);\n return r.success ? [] : zodIssues(r.error, [\"site\"]);\n}\n\n/** Validate a sequence of ops; stops at the first invalid one. */\nexport function validateAll(\n doc: SiteDocument,\n ops: readonly unknown[],\n options: ValidateOptions = {},\n):\n | { ok: true; doc: SiteDocument; warnings: OpIssue[] }\n | { ok: false; index: number; errors: OpIssue[] } {\n let cur = doc;\n const warnings: OpIssue[] = [];\n for (let index = 0; index < ops.length; index++) {\n const r = validate(cur, ops[index], options);\n if (!r.ok) return { ok: false, index, errors: r.errors };\n cur = r.doc;\n warnings.push(...r.warnings);\n }\n return { ok: true, doc: cur, warnings };\n}\n\n/**\n * Full validation of a document: the whole `SiteDocumentSchema` (ids unique, keys match, …),\n * navigation/announcement page references and, with a registry, every block's fields.\n */\nexport function validateDocument(\n doc: unknown,\n options: Pick<ValidateOptions, \"registry\"> = {},\n): ValidationResult {\n const r = SiteDocumentSchema.safeParse(doc);\n if (!r.success) return { ok: false, errors: zodIssues(r.error, []) };\n const errors = siteRefIssues(r.data);\n if (options.registry)\n for (const issue of options.registry.validateDocument(r.data))\n errors.push({ path: issue.path, message: issue.message });\n if (errors.length) return { ok: false, errors };\n return { ok: true, doc: doc as SiteDocument, warnings: [] };\n}\n","import type {\n BlockRegistry,\n ColorTheme,\n Section,\n SiteDocument,\n} from \"@omniharmonic/openspace-schema\";\nimport { findBlock, findSection, locateBlock } from \"./doc\";\nimport { invert } from \"./invert\";\nimport type { Op } from \"./ops\";\nimport { deepEqual, isPathPrefix, isPlainObject, patchPaths } from \"./paths\";\n\n/**\n * Collaborator roles (arch §6.4, PRD). The Hub enforces them on every op it accepts.\n *\n * - **owner**, **designer**: every op.\n * - **editor**: content, pages, navigation, media and collections — but no `styles.patch`, no\n * `grid.place`, no section layout/style/lock changes, no code injection; and on locked\n * sections only text/image field updates; no header settings; new sections only as a preset\n * build or a copy of an existing section's layout and style.\n * - **contributor**: only `collection.upsert` of a draft item (never over a non-draft item, and\n * never over a draft someone else started).\n */\nexport const ROLES = [\"owner\", \"designer\", \"editor\", \"contributor\"] as const;\nexport type Role = (typeof ROLES)[number];\n\nexport type RoleDecision = { allowed: true; op: Op } | { allowed: false; reason: string };\n\nexport interface RoleContext {\n /**\n * The document the op will apply to. Needed to find which section a block-level op touches\n * (and an item's current status for contributors). Without it, Editors are treated as if\n * any block they touch were in a locked section.\n */\n doc?: SiteDocument;\n /**\n * Block definitions: field kinds for locked-section checks. The Hub must pass it; without it\n * only same-shape changes to existing text/image fields are allowed (fail safe).\n */\n registry?: BlockRegistry;\n /** The person submitting the op (user id). Needed for contributor edits to existing items. */\n userId?: string;\n /**\n * Who started a collection item (user id), as recorded by the Hub when the item was created.\n * Contributors may only change existing drafts they started; without this (or `userId`)\n * edits to existing items are denied (fail safe).\n */\n itemAuthor?: (collection: string, slug: string) => string | undefined;\n /**\n * Builds the section a preset (`section.preset`, e.g. `hero/split-image@2`) produces in a color\n * theme, or undefined for an unknown preset or a theme the preset isn't designed for. Editors may\n * only insert sections whose layout and style match a preset build or an existing section\n * (duplicate / paste); without this, only the latter.\n */\n presetSection?: (preset: string, colorTheme: ColorTheme | undefined) => Section | undefined;\n}\n\n/**\n * A section's designer-owned look: its layout (grid rects keyed by block order, since a built or\n * duplicated section has fresh block ids) and its style.\n */\nfunction sectionLook(section: Section): unknown {\n const layout = section.layout;\n if (layout.mode !== \"grid\") return { layout, style: section.style };\n const order = new Map(section.blocks.map((b, i) => [b.id as string, i]));\n const items = Object.entries(layout.items)\n .map(([id, item]) => [order.get(id) ?? -1, item] as const)\n .sort((a, b) => a[0] - b[0]);\n return { layout: { ...layout, items }, style: section.style };\n}\n\n/** True if `section` looks exactly like a preset build or a section already in the document. */\nexport function isKnownSectionLook(section: Section, context: RoleContext): boolean {\n const look = sectionLook(section);\n if (section.preset && context.presetSection) {\n const built = context.presetSection(section.preset, section.style?.colorTheme);\n if (built && deepEqual(sectionLook(built), look)) return true;\n }\n const doc = context.doc;\n if (!doc) return false;\n if (deepEqual(sectionLook(doc.site.footer), look)) return true;\n for (const page of Object.values(doc.pages))\n for (const s of page.sections) if (deepEqual(sectionLook(s), look)) return true;\n return false;\n}\n\n/** Ids of locked sections in a document (pages + footer). */\nexport function lockedSectionsOf(doc: SiteDocument): Set<string> {\n const out = new Set<string>();\n if (doc.site.footer.locked) out.add(doc.site.footer.id);\n for (const page of Object.values(doc.pages))\n for (const s of page.sections) if (s.locked) out.add(s.id);\n return out;\n}\n\nconst CONTENT_KINDS = new Set([\"text\", \"richText\", \"image\"]);\n\nfunction isImageValue(v: unknown): boolean {\n return isPlainObject(v) && typeof v.src === \"string\";\n}\n\ntype Shape = \"string\" | \"doc\" | \"image\" | \"images\" | undefined;\nfunction contentShape(v: unknown): Shape {\n if (typeof v === \"string\") return \"string\";\n if (isPlainObject(v) && v.type === \"doc\" && Array.isArray(v.content)) return \"doc\";\n if (isImageValue(v)) return \"image\";\n if (Array.isArray(v) && v.length > 0 && v.every(isImageValue)) return \"images\";\n return undefined;\n}\n\n/** True if both values are text/image content of the same shape. */\nexport function sameContentShape(before: unknown, after: unknown): boolean {\n const a = contentShape(before);\n return a !== undefined && a === contentShape(after);\n}\n\n/** Shape-based guess: a string, a rich-text doc, an image, or a list of images. */\nexport function isTextOrImageValue(v: unknown): boolean {\n if (typeof v === \"string\") return true;\n if (isPlainObject(v) && v.type === \"doc\" && Array.isArray(v.content)) return true;\n if (isImageValue(v)) return true;\n return Array.isArray(v) && v.length > 0 && v.every(isImageValue);\n}\n\nconst deny = (reason: string): RoleDecision => ({ allowed: false, reason });\n\n/**\n * True if `op` is exactly the undo of `priorOp`: it equals `invert(docBefore, priorOp)` apart from\n * op metadata. `docBefore` is the document `priorOp` was applied to (the server keeps it, or\n * recomputes it from the op log).\n *\n * How the Hub authorizes undo: an inverse can carry fields a role may not send directly (grid\n * placements and rows restoring a deleted block, for instance). When an op arrives, if it\n * `isInverseOf` one of the same actor's own earlier accepted ops — and nothing has touched those\n * locations since (`rebase` it over the intervening ops first) — accept it as an undo; otherwise\n * run `transformForRole` as usual.\n */\nexport function isInverseOf(op: Op, priorOp: Op, docBefore: SiteDocument): boolean {\n let expected: Op;\n try {\n expected = invert(docBefore, priorOp);\n } catch {\n return false;\n }\n const strip = ({ id: _i, actor: _a, ts: _t, ...body }: Op) => body;\n return deepEqual(strip(op), strip(expected));\n}\n\n/**\n * Decide whether `role` may submit `op`.\n *\n * The Hub must pass `context.doc` (and should pass `context.registry`): without them checks fail\n * safe and deny anything that depends on the document (block edits in locked sections, page\n * deletes, contributor saves). Undo ops are authorized separately — see `isInverseOf`. Allowed ops are returned unchanged (ops are never\n * silently rewritten, so what the user sees is what is stored).\n */\nexport function transformForRole(\n op: Op,\n role: Role,\n lockedSections: Iterable<string>,\n context: RoleContext = {},\n): RoleDecision {\n const allow: RoleDecision = { allowed: true, op };\n if (role === \"owner\" || role === \"designer\") return allow;\n const { doc, registry } = context;\n\n if (role === \"contributor\") {\n if (op.op !== \"collection.upsert\")\n return deny(\"Contributors can only create and edit draft collection items\");\n if (op.item.frontmatter.status !== \"draft\")\n return deny(\"Contributors can only save items as drafts; an editor publishes them\");\n if (!doc) return deny(\"Can't check this item without the current document\");\n const existing = doc.collections[op.collection]?.[op.item.slug];\n if (existing && existing.frontmatter.status !== \"draft\")\n return deny(\"This item is already published or scheduled; only editors can change it\");\n if (existing) {\n const author = context.itemAuthor?.(op.collection, op.item.slug);\n if (!context.userId || !author || author !== context.userId)\n return deny(\"Someone else started this draft; only they or an editor can change it\");\n }\n return allow;\n }\n\n if (role !== \"editor\") return deny(`Unknown role ${String(role)}`);\n const locked = new Set(lockedSections);\n /** Section of a block, or undefined if unknown (no doc / not found). */\n const sectionOfBlock = (page: string, block: string): string | undefined => {\n if (!doc) return undefined;\n const loc =\n findBlock(doc, page as Parameters<typeof findBlock>[1], block) ?? locateBlock(doc, block);\n return loc?.section.id;\n };\n const isLocked = (section: string | undefined) => section === undefined || locked.has(section);\n const sectionById = (page: string, id: string) =>\n doc ? findSection(doc, page as Parameters<typeof findSection>[1], id)?.section : undefined;\n const NO_GRID = \"Editors can't reposition blocks on the grid\";\n\n switch (op.op) {\n case \"styles.patch\":\n return deny(\"Editors can't change site styles\");\n case \"grid.place\":\n return deny(\"Editors can't reposition blocks on the grid\");\n case \"section.update\": {\n const paths = patchPaths(op);\n if (paths.some((p) => isPathPrefix(\"layout\", p) || isPathPrefix(\"style\", p)))\n return deny(\"Editors can't change section layout or style\");\n if (paths.some((p) => isPathPrefix(\"locked\", p)))\n return deny(\"Only owners and designers can lock or unlock sections\");\n if (locked.has(op.section)) return deny(\"This section is locked\");\n return allow;\n }\n case \"section.move\":\n case \"section.delete\":\n if (locked.has(op.section)) return deny(\"This section is locked\");\n return allow;\n case \"section.insert\":\n if (op.section.locked) return deny(\"Only owners and designers can lock sections\");\n if (!isKnownSectionLook(op.section, context))\n return deny(\n \"Editors add sections from the section gallery (or duplicate one); its layout and style come from the design\",\n );\n return allow;\n case \"block.insert\":\n if (locked.has(op.section)) return deny(\"This section is locked\");\n if (op.place || op.rows) return deny(NO_GRID);\n return allow;\n case \"block.delete\":\n if (isLocked(sectionOfBlock(op.page, op.block))) return deny(\"This section is locked\");\n if (op.rows) return deny(NO_GRID);\n return allow;\n case \"block.move\": {\n const from = sectionOfBlock(op.page, op.block);\n if (isLocked(from) || locked.has(op.to.section)) return deny(\"This section is locked\");\n if (op.to.place || op.to.rows || op.fromRows) return deny(NO_GRID);\n // Moving into, out of or between grid sections lays the grid out again; reordering inside\n // one grid section keeps placements and is fine.\n if (from !== op.to.section) {\n const src = sectionById(op.page, from as string);\n const dest = sectionById(op.page, op.to.section);\n if (!src || !dest) return deny(\"Can't check this move without the current document\");\n if (src.layout.mode === \"grid\" || dest.layout.mode === \"grid\") return deny(NO_GRID);\n }\n return allow;\n }\n case \"block.update\": {\n const section = sectionOfBlock(op.page, op.block);\n if (!isLocked(section)) return allow;\n if (\n op.variant !== undefined ||\n op.style !== undefined ||\n op.column !== undefined ||\n op.label !== undefined ||\n op.hidden !== undefined\n )\n return deny(\"This section is locked: only its text and images can change\");\n if (op.unset?.length) return deny(\"This section is locked: fields can't be removed\");\n const block = doc ? findBlock(doc, op.page, op.block)?.block : undefined;\n if (!block) return deny(\"Can't check this edit without the current document\");\n const def = registry?.get(block.type);\n for (const [key, value] of Object.entries(op.set ?? {})) {\n const kind = def?.meta.fields[key]?.kind;\n // With a registry the field kind is authoritative. Without one (fail safe), only an\n // existing field may change, and only to a value of the same text/image shape.\n const ok = def\n ? kind !== undefined && CONTENT_KINDS.has(kind)\n : block.fields[key] !== undefined && sameContentShape(block.fields[key], value);\n if (!ok) return deny(`This section is locked: \"${key}\" is not a text or image field`);\n }\n return allow;\n }\n case \"site.update\": {\n const paths = patchPaths(op);\n if (paths.some((p) => /^(customCss|headInjection|footerInjection)(\\.|$)/.test(p)))\n return deny(\"Editors can't change custom code\");\n if (paths.some((p) => isPathPrefix(\"footer\", p)))\n return deny(\"Editors change the footer through its blocks\");\n if (paths.some((p) => isPathPrefix(\"header\", p)))\n return deny(\"Editors can't change the header layout; ask a designer\");\n return allow;\n }\n case \"page.update\":\n if (patchPaths(op).some((p) => /^(headInjection|footerInjection)(\\.|$)/.test(p)))\n return deny(\"Editors can't change custom code\");\n return allow;\n case \"page.create\":\n if (op.page.headInjection !== undefined || op.page.footerInjection !== undefined)\n return deny(\"Editors can't change custom code\");\n if (op.page.sections.some((s) => s.locked))\n return deny(\"Only owners and designers can lock sections\");\n if (!op.page.sections.every((s) => isKnownSectionLook(s, context)))\n return deny(\n \"Editors build pages from the section gallery; layout and style come from the design\",\n );\n return allow;\n case \"page.delete\": {\n const page = doc?.pages[op.page];\n if (!page) return deny(\"Can't check this page without the current document\");\n if (page.sections.some((s) => s.locked || locked.has(s.id)))\n return deny(\"This page has locked sections; only owners and designers can delete it\");\n return allow;\n }\n default:\n // nav.update, media.*, collection.*, collectionConfig.upsert\n return allow;\n }\n}\n","import type { SiteDocument } from \"@omniharmonic/openspace-schema\";\nimport { FOOTER, type Op } from \"./ops\";\nimport { patchPaths } from \"./paths\";\n\n/** Counts behind a change summary (publish dialog, commit message, \"what changed\" lists). */\nexport interface ChangeStats {\n ops: number;\n /** Ids of existing pages whose content or settings changed (not created/deleted ones). */\n pagesEdited: string[];\n pagesCreated: string[];\n pagesDeleted: string[];\n footerEdited: boolean;\n sectionsAdded: number;\n sectionsRemoved: number;\n sectionsMoved: number;\n blocksAdded: number;\n blocksRemoved: number;\n blocksMoved: number;\n /** Distinct blocks whose fields, style or placement changed. */\n blocksEdited: number;\n imagesAdded: number;\n imagesRemoved: number;\n /** Non-image media (video, audio, files). */\n filesAdded: number;\n filesRemoved: number;\n /** Human labels of changed style settings, e.g. \"accent color\", \"fonts\". */\n stylesChanged: string[];\n navChanged: boolean;\n siteSettingsChanged: boolean;\n itemsSaved: number;\n itemsDeleted: number;\n collectionSettingsChanged: number;\n}\n\nconst STYLE_LABELS: Record<string, string> = {\n \"choices.palette.brand\": \"brand color\",\n \"choices.palette\": \"color palette\",\n \"choices.pairing\": \"fonts\",\n \"choices.density\": \"spacing\",\n \"choices.shape\": \"corner style\",\n \"choices.buttons\": \"button style\",\n \"choices.motion\": \"motion\",\n \"choices.imageTreatment\": \"image style\",\n \"overrides.type\": \"typography\",\n \"overrides.font\": \"typography\",\n \"overrides.space\": \"spacing\",\n \"overrides.radius\": \"corner style\",\n};\n\n/** A friendly label for a styles path, e.g. `overrides.color.accent` → \"accent color\". */\nexport function styleLabel(path: string): string {\n const color = /^overrides\\.color\\.([^.]+)/.exec(path);\n if (color) return `${(color[1] as string).replace(/-/g, \" \")} color`;\n let best = \"\";\n for (const prefix of Object.keys(STYLE_LABELS))\n if ((path === prefix || path.startsWith(`${prefix}.`)) && prefix.length > best.length)\n best = prefix;\n return best ? (STYLE_LABELS[best] as string) : \"site styles\";\n}\n\nexport function stats(ops: readonly Op[], doc: SiteDocument): ChangeStats {\n const s: ChangeStats = {\n ops: ops.length,\n pagesEdited: [],\n pagesCreated: [],\n pagesDeleted: [],\n footerEdited: false,\n sectionsAdded: 0,\n sectionsRemoved: 0,\n sectionsMoved: 0,\n blocksAdded: 0,\n blocksRemoved: 0,\n blocksMoved: 0,\n blocksEdited: 0,\n imagesAdded: 0,\n imagesRemoved: 0,\n filesAdded: 0,\n filesRemoved: 0,\n stylesChanged: [],\n navChanged: false,\n siteSettingsChanged: false,\n itemsSaved: 0,\n itemsDeleted: 0,\n collectionSettingsChanged: 0,\n };\n const edited = new Set<string>();\n const created = new Set<string>();\n const deleted = new Set<string>();\n const editedBlocks = new Set<string>();\n const styleLabels = new Set<string>();\n const configs = new Set<string>();\n const touch = (page: string) => {\n if (page === FOOTER) s.footerEdited = true;\n else edited.add(page);\n };\n for (const op of ops) {\n switch (op.op) {\n case \"block.update\":\n case \"grid.place\":\n touch(op.page);\n editedBlocks.add(op.block);\n break;\n case \"block.insert\":\n touch(op.page);\n s.blocksAdded++;\n break;\n case \"block.delete\":\n touch(op.page);\n s.blocksRemoved++;\n break;\n case \"block.move\":\n touch(op.page);\n s.blocksMoved++;\n break;\n case \"section.insert\":\n touch(op.page);\n s.sectionsAdded++;\n break;\n case \"section.delete\":\n touch(op.page);\n s.sectionsRemoved++;\n break;\n case \"section.move\":\n touch(op.page);\n s.sectionsMoved++;\n break;\n case \"section.update\":\n case \"page.update\":\n touch(op.page);\n break;\n case \"styles.patch\":\n for (const p of patchPaths(op.patch)) styleLabels.add(styleLabel(p));\n break;\n case \"page.create\":\n if (deleted.has(op.page.id)) deleted.delete(op.page.id);\n else created.add(op.page.id);\n if (op.nav) s.navChanged = true;\n break;\n case \"page.delete\":\n if (created.has(op.page)) created.delete(op.page);\n else deleted.add(op.page);\n if (op.nav) s.navChanged = true;\n break;\n case \"nav.update\":\n s.navChanged = true;\n break;\n case \"site.update\":\n if (patchPaths(op).some((p) => p === \"footer\" || p.startsWith(\"footer.\")))\n s.footerEdited = true;\n if (patchPaths(op).some((p) => p !== \"footer\" && !p.startsWith(\"footer.\")))\n s.siteSettingsChanged = true;\n break;\n case \"media.add\":\n if (!Object.hasOwn(doc.media, op.path)) {\n if (op.meta.kind === \"image\") s.imagesAdded++;\n else s.filesAdded++;\n }\n break;\n case \"media.remove\": {\n const kind = doc.media[op.path]?.kind;\n if (kind === \"image\") s.imagesRemoved++;\n else s.filesRemoved++;\n break;\n }\n case \"collection.upsert\":\n s.itemsSaved++;\n break;\n case \"collection.delete\":\n s.itemsDeleted++;\n break;\n case \"collectionConfig.upsert\":\n configs.add(op.collection);\n break;\n }\n }\n s.pagesCreated = [...created];\n s.pagesDeleted = [...deleted];\n s.pagesEdited = [...edited].filter((id) => !created.has(id) && !deleted.has(id));\n s.blocksEdited = editedBlocks.size;\n s.stylesChanged = [...styleLabels];\n s.collectionSettingsChanged = configs.size;\n return s;\n}\n\nfunction list(items: readonly string[], max = 3, noun = \"pages\"): string {\n if (items.length === 0) return \"\";\n if (items.length === 1) return items[0] as string;\n if (items.length <= max)\n return `${items.slice(0, -1).join(\", \")} and ${items[items.length - 1] as string}`;\n const rest = items.length - (max - 1);\n return `${items.slice(0, max - 1).join(\", \")} and ${rest} other ${noun}`;\n}\n\nconst count = (n: number, one: string, many = `${one}s`) => `${n} ${n === 1 ? one : many}`;\n\n/**\n * A one-line human summary of a set of ops against the document they apply to, e.g.\n * \"Edited Home and About; added 2 images; changed accent color\".\n */\nexport function summarize(ops: readonly Op[], doc: SiteDocument): string {\n const s = stats(ops, doc);\n const created = new Map<string, string>();\n for (const op of ops) if (op.op === \"page.create\") created.set(op.page.id, op.page.title);\n const title = (id: string) =>\n doc.pages[id as keyof SiteDocument[\"pages\"]]?.title ?? created.get(id) ?? id;\n\n const parts: string[] = [];\n const editedNames = s.pagesEdited.map(title);\n if (s.footerEdited) editedNames.push(\"the footer\");\n if (editedNames.length) parts.push(`edited ${list(editedNames)}`);\n if (s.pagesCreated.length)\n parts.push(\n s.pagesCreated.length <= 2\n ? `added ${s.pagesCreated.length === 1 ? \"page\" : \"pages\"} ${list(s.pagesCreated.map(title))}`\n : `added ${count(s.pagesCreated.length, \"page\")}`,\n );\n if (s.pagesDeleted.length)\n parts.push(\n s.pagesDeleted.length <= 2\n ? `deleted ${s.pagesDeleted.length === 1 ? \"page\" : \"pages\"} ${list(s.pagesDeleted.map(title))}`\n : `deleted ${count(s.pagesDeleted.length, \"page\")}`,\n );\n if (s.imagesAdded) parts.push(`added ${count(s.imagesAdded, \"image\")}`);\n if (s.filesAdded) parts.push(`added ${count(s.filesAdded, \"file\")}`);\n if (s.imagesRemoved) parts.push(`removed ${count(s.imagesRemoved, \"image\")}`);\n if (s.filesRemoved) parts.push(`removed ${count(s.filesRemoved, \"file\")}`);\n if (s.stylesChanged.length) parts.push(`changed ${list(s.stylesChanged, 3, \"styles\")}`);\n if (s.navChanged) parts.push(\"updated navigation\");\n if (s.siteSettingsChanged) parts.push(\"updated site settings\");\n if (s.itemsSaved) parts.push(`saved ${count(s.itemsSaved, \"collection item\")}`);\n if (s.itemsDeleted) parts.push(`deleted ${count(s.itemsDeleted, \"collection item\")}`);\n if (s.collectionSettingsChanged)\n parts.push(`updated settings for ${count(s.collectionSettingsChanged, \"collection\")}`);\n if (parts.length === 0) return \"No changes\";\n const text = parts.join(\"; \");\n return text.charAt(0).toUpperCase() + text.slice(1);\n}\n","import type { OpIssue } from \"@omniharmonic/openspace-ops\";\nimport type { z } from \"zod\";\n\n/**\n * A failure the agent can correct: returned as an MCP tool result with `isError: true` and a\n * message that names the offending input paths, so the model can fix the call and retry.\n */\nexport class ToolError extends Error {\n constructor(\n message: string,\n readonly code: string = \"invalid\",\n readonly issues: OpIssue[] = [],\n readonly hint?: string,\n ) {\n super(message);\n this.name = \"ToolError\";\n }\n}\n\nexport const pathText = (path: readonly (string | number | symbol)[]): string =>\n path.length\n ? path\n .map((p, i) =>\n typeof p === \"number\" ? `[${p}]` : `${i === 0 ? \"\" : \".\"}${String(p as string)}`,\n )\n .join(\"\")\n : \"(root)\";\n\nexport function issueLines(issues: readonly OpIssue[], prefix: (string | number)[] = []): string[] {\n return issues.map((i) => `- ${pathText([...prefix, ...i.path])}: ${i.message}`);\n}\n\n/** Zod issues → `OpIssue`s (symbols stringified). */\nexport function zodToIssues(error: z.ZodError): OpIssue[] {\n return error.issues.map((i) => ({\n path: i.path.map((p) => (typeof p === \"symbol\" ? String(p) : p)),\n message: i.message,\n }));\n}\n\nexport function invalidInput(tool: string, error: z.ZodError): ToolError {\n const issues = zodToIssues(error);\n return new ToolError(\n `Invalid arguments for ${tool}:\\n${issueLines(issues).join(\"\\n\")}`,\n \"invalid_arguments\",\n issues,\n \"Fix the listed argument paths and call the tool again.\",\n );\n}\n\n/** Render a ToolError for the agent. */\nexport function errorText(e: ToolError): string {\n return e.hint ? `${e.message}\\n\\nHint: ${e.hint}` : e.message;\n}\n","/**\n * Per-connection tool context: grant checks, site/page resolution, op stamping, agent session\n * lifecycle (a snapshot before the first edit) and role filtering before ops reach the store.\n */\n\nimport { presetSection } from \"@omniharmonic/openspace-blocks\";\nimport {\n FOOTER,\n lockedSectionsOf,\n type Op,\n type OpBody,\n type OpIssue,\n transformForRole,\n} from \"@omniharmonic/openspace-ops\";\nimport type { BlockRegistry, Page, SiteDocument } from \"@omniharmonic/openspace-schema\";\nimport { issueLines, ToolError } from \"./errors\";\nimport type { AgentSession, Grant, SiteStore } from \"./store\";\n\nexport interface ContextOptions {\n store: SiteStore;\n grant: Grant;\n registry: BlockRegistry;\n /** Clock (ms). */\n now?: () => number;\n /** Agent label for sessions (\"Claude\"). */\n label?: string;\n}\n\nconst OP_SUBJECT: Partial<Record<Op[\"op\"], (op: Op) => string>> = {\n \"block.update\": (o) => `block ${(o as { block: string }).block}`,\n \"block.insert\": (o) => `new ${(o as { block: { type: string } }).block.type} block`,\n \"block.move\": (o) => `block ${(o as { block: string }).block}`,\n \"block.delete\": (o) => `block ${(o as { block: string }).block}`,\n \"grid.place\": (o) => `block ${(o as { block: string }).block}`,\n \"section.insert\": (o) => `new section ${(o as { section: { id: string } }).section.id}`,\n \"section.update\": (o) => `section ${(o as { section: string }).section}`,\n \"section.move\": (o) => `section ${(o as { section: string }).section}`,\n \"section.delete\": (o) => `section ${(o as { section: string }).section}`,\n \"page.create\": (o) => `new page ${(o as { page: { id: string } }).page.id}`,\n \"page.update\": (o) => `page ${(o as { page: string }).page}`,\n \"page.delete\": (o) => `page ${(o as { page: string }).page}`,\n};\n\nexport class ToolContext {\n readonly store: SiteStore;\n readonly grant: Grant;\n readonly registry: BlockRegistry;\n readonly label: string;\n private readonly clock: () => number;\n private readonly sessions = new Map<string, Promise<AgentSession>>();\n private counter = 0;\n\n constructor(opts: ContextOptions) {\n this.store = opts.store;\n this.grant = opts.grant;\n this.registry = opts.registry;\n this.clock = opts.now ?? (() => Date.now());\n this.label = opts.label ?? opts.grant.label ?? \"Claude\";\n }\n\n now(): number {\n return this.clock();\n }\n\n /** Site ids this connection may touch. */\n async allowedSites(): Promise<string[]> {\n const all = (await this.store.listSites()).map((s) => s.id);\n if (this.grant.sites === \"*\") return all;\n const granted = new Set(this.grant.sites);\n return all.filter((id) => granted.has(id));\n }\n\n /** Resolve the `site` argument (optional when the grant covers exactly one site). */\n async siteId(input?: string): Promise<string> {\n const allowed = await this.allowedSites();\n if (input) {\n if (allowed.includes(input)) return input;\n throw new ToolError(\n `This connection can't reach site \"${input}\". Sites available: ${allowed.join(\", \") || \"none\"}.`,\n \"forbidden\",\n );\n }\n if (allowed.length === 1) return allowed[0] as string;\n if (!allowed.length) throw new ToolError(\"This connection has no sites.\", \"forbidden\");\n throw new ToolError(\n `Several sites are available; pass \"site\" (one of: ${allowed.join(\", \")}).`,\n \"invalid_arguments\",\n );\n }\n\n /** The person's role on a site (per-site `roles` first, then `role`; undefined = local owner). */\n roleFor(siteId: string): Grant[\"role\"] {\n return this.grant.roles?.[siteId] ?? this.grant.role;\n }\n\n async doc(siteId: string): Promise<SiteDocument> {\n return this.store.getDocument(siteId);\n }\n\n /** The agent session for a site, started (with its snapshot) on first use. */\n session(siteId: string): Promise<AgentSession> {\n let s = this.sessions.get(siteId);\n if (!s) {\n s = this.store.startSession(siteId, { label: this.label, userId: this.grant.userId });\n this.sessions.set(siteId, s);\n s.catch(() => this.sessions.delete(siteId));\n }\n return s;\n }\n\n /** Sessions started on this connection (for `close`). */\n async startedSessions(): Promise<Array<{ siteId: string; session: AgentSession }>> {\n const out: Array<{ siteId: string; session: AgentSession }> = [];\n for (const [siteId, p] of this.sessions) {\n try {\n out.push({ siteId, session: await p });\n } catch {\n // A session that failed to start has nothing to end.\n }\n }\n return out;\n }\n\n async endSessions(): Promise<void> {\n for (const { siteId, session } of await this.startedSessions())\n await this.store.endSession(siteId, session.sessionId).catch(() => undefined);\n this.sessions.clear();\n }\n\n /** Stamp op bodies with a fresh id, the session actor and the clock. */\n stamp(bodies: readonly OpBody[], actor: string): Op[] {\n const ts = this.now();\n return bodies.map(\n (b) =>\n ({\n ...b,\n id: `mcp_${ts.toString(36)}_${(this.counter++).toString(36)}`,\n actor,\n ts,\n }) as Op,\n );\n }\n\n /**\n * Apply op bodies as the agent. Errors come back as a `ToolError` that names the op and the\n * offending paths so the agent can correct its call.\n */\n async apply(\n siteId: string,\n bodies: readonly OpBody[],\n ): Promise<{ doc: SiteDocument; warnings: OpIssue[]; ops: Op[]; session: AgentSession }> {\n if (!bodies.length) throw new ToolError(\"Nothing to change.\", \"no_changes\");\n const session = await this.session(siteId);\n let ops = this.stamp(bodies, session.actor);\n const role = this.roleFor(siteId);\n if (role && role !== \"owner\" && role !== \"designer\") {\n const doc = await this.doc(siteId);\n const locked = lockedSectionsOf(doc);\n ops = ops.map((op) => {\n const d = transformForRole(op, role, locked, {\n doc,\n registry: this.registry,\n presetSection,\n });\n if (!d.allowed)\n throw new ToolError(`Not allowed for your role (${role}): ${d.reason}.`, \"forbidden\");\n return d.op;\n });\n }\n const r = await this.store.applyOps(siteId, ops, {\n actor: session.actor,\n session: session.sessionId,\n });\n if (!r.ok) {\n const op = ops[r.index];\n const what = op\n ? `${op.op}${OP_SUBJECT[op.op] ? ` on ${OP_SUBJECT[op.op]?.(op)}` : \"\"}`\n : \"edit\";\n const n = ops.length > 1 ? ` (step ${r.index + 1} of ${ops.length})` : \"\";\n throw new ToolError(\n `The change was rejected${n}: ${what}.\\n${issueLines(r.errors).join(\"\\n\")}`,\n r.code === \"forbidden\" ? \"forbidden\" : \"rejected\",\n r.errors,\n \"Nothing was changed. Correct the listed paths (ids come from get_page; field shapes from list_blocks/get_block_schema) and try again.\",\n );\n }\n return { doc: r.doc, warnings: r.warnings, ops, session };\n }\n}\n\n/** Resolve a page reference: an id (`pg_…`), a slug (`\"\"`/`/` for home, `about`, `/about/`), or a title. */\nexport function resolvePage(\n doc: SiteDocument,\n ref: string,\n opts: { allowFooter?: boolean } = {},\n): { id: string; page: Page | null } {\n if (ref === FOOTER) {\n if (opts.allowFooter) return { id: FOOTER, page: null };\n throw new ToolError(\n 'The footer is not a page here; use the block tools with page \"footer\".',\n \"invalid_arguments\",\n );\n }\n const direct = doc.pages[ref as Page[\"id\"]];\n if (direct) return { id: direct.id, page: direct };\n const slug = ref.replace(/^\\/+|\\/+$/g, \"\");\n const pages = Object.values(doc.pages);\n const bySlug = pages.find((p) => p.slug === slug);\n if (bySlug) return { id: bySlug.id, page: bySlug };\n const byTitle = pages.filter((p) => p.title.toLowerCase() === ref.toLowerCase());\n if (byTitle.length === 1 && byTitle[0]) return { id: byTitle[0].id, page: byTitle[0] };\n throw new ToolError(\n `No page \"${ref}\". Pages: ${pages.map((p) => `${p.id} (\"${p.title}\", /${p.slug})`).join(\", \")}.`,\n \"not_found\",\n );\n}\n\n/** Public path of a page (`/` for home). */\nexport const pagePathOf = (page: Page): string => (page.slug ? `/${page.slug}/` : \"/\");\n","/** Design guidance for agents (doc 04 §9) — the same rules Studio's Design check enforces. */\nexport const DESIGN_GUIDANCE = `# OpenSpace design guidance\n\nThe same rules power Studio's built-in Design check. Follow them so pages look designed, not assembled.\n\n1. **Start from presets.** Compose pages from section presets (list_section_presets); customize fields before styles; use exact values only when asked.\n2. **One primary action per screenful.** Secondary actions use secondary or tertiary button styles.\n3. **Create rhythm with color themes.** Alternate surfaces deliberately (e.g., Light → Light accent → Light → Dark for a finale); avoid more than three consecutive sections with the same theme on long pages, and avoid flipping every section.\n4. **Respect copy lengths.** Use each preset's recommended ranges; shorten rather than shrink type.\n5. **Keep image aspect ratios consistent within a section.**\n6. **Two typefaces maximum.** Change the pairing in Site Styles rather than per block.\n7. **Never invent facts, testimonials, prices or credentials.** Ask the owner.\n8. **Alt text describes the image's purpose,** not just its contents; decorative images are marked decorative.\n9. **Check mobile.** After any grid change, review the mobile placement.\n10. **Prefer fewer, stronger sections** over many thin ones.\n\nDesign check flags: contrast failures, more than two families, headings out of order, empty sections, images above 2× their displayed size, missing alt text, overlapping text in grid sections, and pages without a clear call to action.\n\n## Working with OpenSpace\n\n- Content is structured: sections hold blocks; every section and block has a stable id — target edits by id and never recreate what you can update.\n- Styles come from Site Styles tokens (palette, pairing, density, shape, buttons, motion, image treatment). Never write inline CSS; restyle with set_styles or apply_template_look.\n- Section color themes: light, light-accent, dark, dark-accent, brand. The contrast solver keeps text readable in all five.\n- Rich text is Markdown: headings (#–####), **bold**, *italic*, [links](/contact), lists, > quotes; a trailing {.lead} sets a paragraph preset.\n- Edits land in the draft. The owner publishes — call publish only when they ask, with confirm: true.\n`;\n\n/** The rapid design-iteration loop (resource + `iterate-design` prompt). */\nexport const ITERATION_GUIDANCE = `# Design iteration loop\n\nRepeat until the page is right, keeping each pass small:\n\n1. **Inspect** — get_page (detail \"outline\") for ids and copy; get_styles for the current look.\n2. **Check** — design_check on the page. Fix errors first (apply_fix for autofixable issues), then warnings that matter.\n3. **Edit** — one intent per pass: replace demo copy (update_block), swap a section for a better preset (insert_section + delete_section), adjust a section's color theme for rhythm (update_section colorTheme), or restyle globally (set_styles / apply_template_look).\n4. **Look** — screenshot the page (or just the section you changed) at desktop and mobile; use render_page when screenshots are unavailable.\n5. **Judge** — hierarchy (one H1, clear headline), one primary action per screen, rhythm of themes, copy within preset ranges, images consistent, nothing cramped on mobile. Then go back to 2.\n\nFinish with design_check showing zero errors and get_draft_diff to summarise the work for the owner.\n`;\n","/**\n * Image upload pipeline shared by the Memory and File stores (no Node APIs, Workers-safe):\n * sniff the format, read dimensions, strip metadata (EXIF/XMP/text chunks), and build the\n * `media/YYYY/MM/<name>-<id>.<ext>` path and `MediaMeta`. Resizing above 2400 px needs a\n * resizer (sharp in the CLI); without one an oversized image is refused with a clear message.\n */\nimport { type MediaMeta, newId } from \"@omniharmonic/openspace-schema\";\nimport { ToolError } from \"./errors\";\nimport type { ImageUploadInput } from \"./store\";\n\nexport const MAX_IMAGE_EDGE = 2400;\nexport const MAX_IMAGE_BYTES = 15 * 1024 * 1024;\n\nexport type ImageFormat = \"jpeg\" | \"png\" | \"gif\" | \"webp\" | \"avif\";\nconst MIME: Record<ImageFormat, string> = {\n jpeg: \"image/jpeg\",\n png: \"image/png\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n avif: \"image/avif\",\n};\nconst EXT: Record<ImageFormat, string> = {\n jpeg: \"jpg\",\n png: \"png\",\n gif: \"gif\",\n webp: \"webp\",\n avif: \"avif\",\n};\n\nexport function base64ToBytes(b64: string): Uint8Array {\n const clean = b64.replace(/^data:[^;]+;base64,/, \"\").replace(/\\s+/g, \"\");\n const bin = atob(clean);\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\n}\n\nexport function bytesToBase64(bytes: Uint8Array): string {\n let s = \"\";\n const chunk = 0x8000;\n for (let i = 0; i < bytes.length; i += chunk)\n s += String.fromCharCode(...bytes.subarray(i, i + chunk));\n return btoa(s);\n}\n\nconst u16be = (b: Uint8Array, o: number) => ((b[o] ?? 0) << 8) | (b[o + 1] ?? 0);\nconst u32be = (b: Uint8Array, o: number) =>\n (((b[o] ?? 0) << 24) >>> 0) +\n (((b[o + 1] ?? 0) << 16) | ((b[o + 2] ?? 0) << 8) | (b[o + 3] ?? 0));\nconst u16le = (b: Uint8Array, o: number) => (b[o] ?? 0) | ((b[o + 1] ?? 0) << 8);\nconst u24le = (b: Uint8Array, o: number) =>\n (b[o] ?? 0) | ((b[o + 1] ?? 0) << 8) | ((b[o + 2] ?? 0) << 16);\nconst ascii = (b: Uint8Array, o: number, n: number) => String.fromCharCode(...b.subarray(o, o + n));\n\nexport function sniffImage(b: Uint8Array): ImageFormat | null {\n if (b[0] === 0xff && b[1] === 0xd8 && b[2] === 0xff) return \"jpeg\";\n if (b[0] === 0x89 && ascii(b, 1, 3) === \"PNG\") return \"png\";\n if (ascii(b, 0, 4) === \"GIF8\") return \"gif\";\n if (ascii(b, 0, 4) === \"RIFF\" && ascii(b, 8, 4) === \"WEBP\") return \"webp\";\n if (ascii(b, 4, 4) === \"ftyp\" && /avi[fs]/.test(ascii(b, 8, 4))) return \"avif\";\n return null;\n}\n\n/** Intrinsic size of a JPEG/PNG/GIF/WebP/AVIF, or null if it can't be read. */\nexport function imageSize(b: Uint8Array): { width: number; height: number } | null {\n const fmt = sniffImage(b);\n if (fmt === \"png\") return { width: u32be(b, 16), height: u32be(b, 20) };\n if (fmt === \"gif\") return { width: u16le(b, 6), height: u16le(b, 8) };\n if (fmt === \"jpeg\") {\n let o = 2;\n while (o + 9 < b.length) {\n if (b[o] !== 0xff) {\n o++;\n continue;\n }\n const marker = b[o + 1] ?? 0;\n if (marker === 0xd8 || marker === 0x01 || (marker >= 0xd0 && marker <= 0xd7)) {\n o += 2;\n continue;\n }\n const len = u16be(b, o + 2);\n // SOF0..SOF15 except DHT (C4), JPG (C8), DAC (CC).\n if (marker >= 0xc0 && marker <= 0xcf && ![0xc4, 0xc8, 0xcc].includes(marker))\n return { height: u16be(b, o + 5), width: u16be(b, o + 7) };\n o += 2 + len;\n }\n return null;\n }\n if (fmt === \"webp\") {\n const chunk = ascii(b, 12, 4);\n if (chunk === \"VP8 \") return { width: u16le(b, 26) & 0x3fff, height: u16le(b, 28) & 0x3fff };\n if (chunk === \"VP8L\") {\n const bits = (b[21] ?? 0) | ((b[22] ?? 0) << 8) | ((b[23] ?? 0) << 16) | ((b[24] ?? 0) << 24);\n return { width: (bits & 0x3fff) + 1, height: ((bits >> 14) & 0x3fff) + 1 };\n }\n if (chunk === \"VP8X\") return { width: u24le(b, 24) + 1, height: u24le(b, 27) + 1 };\n return null;\n }\n if (fmt === \"avif\") {\n // Find the `ispe` property box: 4 bytes version/flags, then width and height (u32 BE).\n for (let o = 0; o + 16 < b.length && o < 4096; o++)\n if (ascii(b, o, 4) === \"ispe\") return { width: u32be(b, o + 8), height: u32be(b, o + 12) };\n }\n return null;\n}\n\n/** Remove EXIF/XMP/comments from JPEG (keeps JFIF and ICC) and text/EXIF chunks from PNG. */\nexport function stripMetadata(b: Uint8Array): Uint8Array {\n const fmt = sniffImage(b);\n if (fmt === \"jpeg\") {\n const parts: Uint8Array[] = [b.subarray(0, 2)];\n let o = 2;\n while (o + 4 <= b.length) {\n if (b[o] !== 0xff) break;\n const marker = b[o + 1] ?? 0;\n if (marker === 0xda) break; // start of scan: the rest is image data\n const len = u16be(b, o + 2);\n const seg = b.subarray(o, o + 2 + len);\n const isApp = marker >= 0xe1 && marker <= 0xef;\n const keepIcc = marker === 0xe2 && ascii(b, o + 4, 11) === \"ICC_PROFILE\";\n if ((!isApp || keepIcc) && marker !== 0xfe) parts.push(seg);\n o += 2 + len;\n }\n parts.push(b.subarray(o));\n return concat(parts);\n }\n if (fmt === \"png\") {\n const drop = new Set([\"tEXt\", \"zTXt\", \"iTXt\", \"eXIf\", \"tIME\"]);\n const parts: Uint8Array[] = [b.subarray(0, 8)];\n let o = 8;\n while (o + 12 <= b.length) {\n const len = u32be(b, o);\n const type = ascii(b, o + 4, 4);\n const end = o + 12 + len;\n if (!drop.has(type)) parts.push(b.subarray(o, end));\n o = end;\n if (type === \"IEND\") break;\n }\n return concat(parts);\n }\n return b;\n}\n\nfunction concat(parts: Uint8Array[]): Uint8Array {\n const out = new Uint8Array(parts.reduce((n, p) => n + p.length, 0));\n let o = 0;\n for (const p of parts) {\n out.set(p, o);\n o += p.length;\n }\n return out;\n}\n\n/** Optional resizer (sharp in the CLI): returns bytes no larger than `maxEdge` on either side. */\nexport type ImageResizer = (\n bytes: Uint8Array,\n maxEdge: number,\n) => Promise<{ bytes: Uint8Array; width: number; height: number }>;\n\nexport interface PreparedImage {\n bytes: Uint8Array;\n path: string;\n meta: MediaMeta;\n}\n\nconst slugify = (s: string) =>\n s\n .toLowerCase()\n .replace(/\\.[a-z0-9]+$/, \"\")\n .normalize(\"NFKD\")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 40) || \"image\";\n\n/** Fetch an https image with a size cap (Workers and Node both have `fetch`). */\nexport async function fetchImage(\n url: string,\n fetchImpl: typeof fetch = fetch,\n): Promise<{ bytes: Uint8Array; name: string }> {\n let u: URL;\n try {\n u = new URL(url);\n } catch {\n throw new ToolError(`\"${url}\" is not a valid URL.`, \"invalid_arguments\");\n }\n // Follow redirects by hand so every hop must stay on https.\n let res: Response | undefined;\n for (let hop = 0; hop <= 5; hop++) {\n if (u.protocol !== \"https:\")\n throw new ToolError(\n hop\n ? `${url} redirects to a non-https address (${u.protocol}), which is refused.`\n : \"Only https:// image URLs can be uploaded.\",\n \"invalid_arguments\",\n );\n res = await fetchImpl(u.toString(), { redirect: \"manual\" });\n if (res.status >= 300 && res.status < 400 && res.headers.get(\"location\")) {\n u = new URL(res.headers.get(\"location\") as string, u);\n continue;\n }\n break;\n }\n if (!res || (res.status >= 300 && res.status < 400))\n throw new ToolError(`${url} redirects too many times.`, \"fetch_failed\");\n if (!res.ok)\n throw new ToolError(`Downloading ${url} failed with HTTP ${res.status}.`, \"fetch_failed\");\n const tooLarge = () => new ToolError(`The image at ${url} is larger than 15 MB.`, \"too_large\");\n const declared = Number(res.headers.get(\"content-length\") ?? \"\");\n if (Number.isFinite(declared) && declared > MAX_IMAGE_BYTES) {\n await res.body?.cancel().catch(() => undefined);\n throw tooLarge();\n }\n // Stream with a cap: never buffer more than the limit, whatever the server claims.\n const chunks: Uint8Array[] = [];\n let total = 0;\n if (res.body) {\n const reader = res.body.getReader();\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n total += value.length;\n if (total > MAX_IMAGE_BYTES) {\n await reader.cancel().catch(() => undefined);\n throw tooLarge();\n }\n chunks.push(value);\n }\n }\n return { bytes: concat(chunks), name: u.pathname.split(\"/\").pop() || \"image\" };\n}\n\n/**\n * Turn an upload into stored bytes + `MediaMeta`. `now` sets the folder (`media/2026/10/`).\n */\nexport async function prepareImage(\n input: ImageUploadInput,\n opts: { fetch?: typeof fetch; resize?: ImageResizer; now?: Date } = {},\n): Promise<PreparedImage> {\n if (typeof input.alt !== \"string\")\n throw new ToolError(\n 'alt is required: describe the image\\'s purpose, or \"\" for a decorative image.',\n \"invalid_arguments\",\n );\n if ((input.url ? 1 : 0) + (input.base64 ? 1 : 0) !== 1)\n throw new ToolError(\"Give exactly one of url or base64.\", \"invalid_arguments\");\n let bytes: Uint8Array;\n let name = input.filename ?? \"image\";\n if (input.url) {\n const r = await fetchImage(input.url, opts.fetch);\n bytes = r.bytes;\n if (!input.filename) name = r.name;\n } else {\n try {\n bytes = base64ToBytes(input.base64 as string);\n } catch {\n throw new ToolError(\"base64 is not valid base64 data.\", \"invalid_arguments\");\n }\n if (bytes.length > MAX_IMAGE_BYTES)\n throw new ToolError(\"The image is larger than 15 MB.\", \"too_large\");\n }\n const fmt = sniffImage(bytes);\n if (!fmt)\n throw new ToolError(\n \"That file is not a JPEG, PNG, GIF, WebP or AVIF image.\",\n \"unsupported_image\",\n );\n let size = imageSize(bytes);\n if (!size?.width || !size.height)\n throw new ToolError(\"Couldn't read the image's dimensions.\", \"unsupported_image\");\n if (Math.max(size.width, size.height) > MAX_IMAGE_EDGE) {\n if (!opts.resize)\n throw new ToolError(\n `The image is ${size.width}×${size.height}px; images are stored at most ${MAX_IMAGE_EDGE}px on the long edge and no resizer is available here.`,\n \"too_large\",\n [],\n \"Upload a smaller version (for Unsplash/imgix URLs add ?w=2400), or install sharp next to the CLI.\",\n );\n const r = await opts.resize(bytes, MAX_IMAGE_EDGE);\n bytes = r.bytes;\n size = { width: r.width, height: r.height };\n }\n bytes = stripMetadata(bytes);\n const now = opts.now ?? new Date();\n const id = newId(\"med\");\n const yyyy = String(now.getUTCFullYear());\n const mm = String(now.getUTCMonth() + 1).padStart(2, \"0\");\n const finalFmt = sniffImage(bytes) ?? fmt;\n const path = `media/${yyyy}/${mm}/${slugify(name)}-${id.slice(4, 8)}.${EXT[finalFmt]}`;\n const meta: MediaMeta = {\n id: id as MediaMeta[\"id\"],\n path: path as MediaMeta[\"path\"],\n kind: \"image\",\n mime: MIME[finalFmt],\n bytes: bytes.length,\n width: size.width,\n height: size.height,\n alt: input.alt,\n createdAt: now.toISOString(),\n };\n if (input.credit && Object.keys(input.credit).length) meta.credit = input.credit as never;\n if (input.license) meta.license = input.license;\n if (input.filename) meta.originalName = input.filename.slice(0, 255);\n return { bytes, path, meta };\n}\n","/**\n * Rich text crosses the MCP boundary as Markdown (arch §3.5): `get_page` returns rich-text fields\n * as Markdown strings and the edit tools accept Markdown (or ProseMirror JSON) for them. The\n * conversion is driven by each block's field metadata, so it reaches rich text nested in list\n * items too (accordion answers, tab panels…).\n */\nimport {\n type Block,\n type BlockRegistry,\n type FieldMeta,\n fromMarkdown,\n type RichTextDoc,\n toMarkdown,\n} from \"@omniharmonic/openspace-schema\";\n\nconst isRecord = (v: unknown): v is Record<string, unknown> =>\n typeof v === \"object\" && v !== null && !Array.isArray(v);\n\nconst isDoc = (v: unknown): v is RichTextDoc => isRecord(v) && v.type === \"doc\";\n\ntype Direction = \"out\" | \"in\";\n\nfunction convertValue(meta: FieldMeta | undefined, value: unknown, dir: Direction): unknown {\n if (!meta) return value;\n if (meta.kind === \"richText\") {\n if (dir === \"out\" && isDoc(value)) return toMarkdown(value);\n if (dir === \"in\" && typeof value === \"string\") return fromMarkdown(value);\n return value;\n }\n if (meta.kind === \"list\" && Array.isArray(value))\n return value.map((item) => (isRecord(item) ? convertFields(meta.fields, item, dir) : item));\n return value;\n}\n\nexport function convertFields(\n metas: Record<string, FieldMeta>,\n fields: Record<string, unknown>,\n dir: Direction,\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(fields)) out[k] = convertValue(metas[k], v, dir);\n return out;\n}\n\n/** Block fields with rich text as Markdown (unknown block types pass through). */\nexport function fieldsToAgent(\n registry: BlockRegistry,\n type: string,\n fields: Record<string, unknown>,\n): Record<string, unknown> {\n const def = registry.get(type);\n return def ? convertFields(def.meta.fields, fields, \"out\") : fields;\n}\n\n/** Agent-supplied fields with Markdown strings turned into rich-text documents. */\nexport function fieldsFromAgent(\n registry: BlockRegistry,\n type: string,\n fields: Record<string, unknown>,\n): Record<string, unknown> {\n const def = registry.get(type);\n return def ? convertFields(def.meta.fields, fields, \"in\") : fields;\n}\n\nexport function blockToAgent(registry: BlockRegistry, block: Block): Record<string, unknown> {\n return { ...block, fields: fieldsToAgent(registry, block.type, block.fields) };\n}\n\n/** Plain text preview of a block (first ~80 chars of its text fields), for summaries. */\nexport function blockPreview(registry: BlockRegistry, block: Block, max = 80): string {\n const def = registry.get(block.type);\n const parts: string[] = [];\n const walk = (metas: Record<string, FieldMeta>, fields: Record<string, unknown>) => {\n for (const [k, m] of Object.entries(metas)) {\n const v = fields[k];\n if (m.kind === \"text\" && typeof v === \"string\") parts.push(v);\n else if (m.kind === \"richText\" && isDoc(v)) parts.push(toMarkdown(v).replace(/\\s+/g, \" \"));\n else if (m.kind === \"image\" && isRecord(v) && typeof v.alt === \"string\")\n parts.push(`[image: ${v.alt || \"no alt\"}]`);\n else if (m.kind === \"list\" && Array.isArray(v))\n for (const item of v) if (isRecord(item)) walk(m.fields, item);\n if (parts.join(\" \").length > max) return;\n }\n };\n if (def) walk(def.meta.fields, block.fields);\n const text = parts.join(\" · \").trim();\n return text.length > max ? `${text.slice(0, max - 1)}…` : text;\n}\n","/** MCP prompts: starting points for the common jobs an owner asks their AI to do. */\nimport { ToolError } from \"./errors\";\nimport { ITERATION_GUIDANCE } from \"./guidance\";\n\nexport interface PromptArgument {\n name: string;\n description: string;\n required?: boolean;\n}\n\nexport interface PromptDefinition {\n name: string;\n title: string;\n description: string;\n arguments: PromptArgument[];\n render(args: Record<string, string>): string;\n}\n\nconst site = (a: Record<string, string>) => (a.site ? ` (site ${a.site})` : \"\");\n\nexport const PROMPTS: PromptDefinition[] = [\n {\n name: \"design-a-page\",\n title: \"Design a page\",\n description:\n \"Compose a new page (or redesign one) from section presets, with real copy, checked and reviewed.\",\n arguments: [\n {\n name: \"brief\",\n description: \"What the page is for, who it's for, what it must say.\",\n required: true,\n },\n {\n name: \"page\",\n description: \"Existing page to redesign (id, slug or title); omit for a new page.\",\n },\n { name: \"site\", description: \"Site id (when the connection has several).\" },\n ],\n render: (\n a,\n ) => `Design ${a.page ? `the page \"${a.page}\"` : \"a new page\"}${site(a)} from this brief:\n\n${a.brief}\n\nWork like a designer:\n1. Read openspace://guidance/design, then get_site (pages, nav, current look) and, for an existing page, get_page with detail \"outline\".\n2. Plan 4–7 sections that tell the story in order (hero with one clear headline and primary action → value → proof → details → closing call to action). Pick presets with list_section_presets; choose color themes that create rhythm (e.g. light → light-accent → light → dark finale).\n3. Build it: create_page with the preset ids (or insert_section into the existing page).\n4. Replace every piece of demo copy with copy from the brief (update_block; rich text is Markdown). Keep within each preset's word ranges. Don't invent facts, prices, testimonials or credentials — leave a clear placeholder question for the owner instead, and list those questions at the end.\n5. Run design_check on the page, fix errors (apply_fix where offered), then screenshot desktop and mobile (or render_page) and refine.\n6. Finish with zero design_check errors and a short summary from get_draft_diff. Don't publish unless asked.`,\n },\n {\n name: \"restyle-site\",\n title: \"Restyle the site\",\n description:\n \"Change the whole site's look through Site Styles (palette, type, shape, buttons) — never inline CSS.\",\n arguments: [\n {\n name: \"mood\",\n description: 'The feeling to aim for, e.g. \"warmer and more editorial\".',\n required: true,\n },\n { name: \"site\", description: \"Site id (when the connection has several).\" },\n ],\n render: (a) => `Restyle the site${site(a)} to feel: ${a.mood}\n\n1. get_styles (with options) and get_site to see the current look and content; screenshot the home page as a \"before\".\n2. create_snapshot named \"before-restyle\".\n3. Try list_templates for a matching look (apply_template_look), or set_styles with a curated palette, a type pairing and shape/button/density choices that fit the mood. Keep two typefaces at most.\n4. Screenshot the home page (desktop and mobile) and one inner page; compare with the \"before\". Adjust section color themes with update_section if the rhythm suffers.\n5. design_check the whole site: contrast must have zero errors (set_styles explains any automatic contrast adjustments).\n6. Summarise what changed and why; don't publish unless asked.`,\n },\n {\n name: \"write-blog-post\",\n title: \"Write a blog post\",\n description: \"Draft a post in the owner's voice and save it as a draft.\",\n arguments: [\n { name: \"topic\", description: \"What the post is about.\", required: true },\n { name: \"audience\", description: \"Who it's for (optional).\" },\n { name: \"site\", description: \"Site id (when the connection has several).\" },\n ],\n render: (\n a,\n ) => `Write a blog post${site(a)} about: ${a.topic}${a.audience ? `\\nAudience: ${a.audience}` : \"\"}\n\n1. list_posts with withBody for two or three recent posts to learn the owner's voice, length and structure; get_site for the site's purpose.\n2. Draft the post in Markdown: a specific title, a one-sentence excerpt (≤ 160 characters), short paragraphs, ## subheadings, and a closing call to action ({% button href=\"/contact\" %}…{% /button %} where it helps).\n3. Never invent facts, quotes, prices or events — ask the owner, and mark open questions in your reply.\n4. Save it with create_post as a draft (status \"draft\"), with tags that already exist on the site where possible.\n5. Reply with the title, excerpt and the open questions. Publishing the post is the owner's call.`,\n },\n {\n name: \"iterate-design\",\n title: \"Iterate on a design\",\n description: \"Tight look → check → edit loop on one page until it meets the design bar.\",\n arguments: [\n { name: \"page\", description: \"Page id, slug or title.\", required: true },\n {\n name: \"goal\",\n description: 'What to improve (optional), e.g. \"stronger hero, calmer mobile\".',\n },\n { name: \"site\", description: \"Site id (when the connection has several).\" },\n ],\n render: (\n a,\n ) => `Iterate on the design of \"${a.page}\"${site(a)}.${a.goal ? ` Goal: ${a.goal}.` : \"\"}\n\n${ITERATION_GUIDANCE}\nDo at most five passes, and after each pass say in one line what you changed and what you saw in the screenshot. Stop when design_check shows no errors and the page reads clearly on desktop and mobile.`,\n },\n];\n\nexport function getPrompt(name: string, args: Record<string, string> = {}) {\n const p = PROMPTS.find((x) => x.name === name);\n if (!p)\n throw new ToolError(\n `Unknown prompt \"${name}\". Prompts: ${PROMPTS.map((x) => x.name).join(\", \")}.`,\n \"not_found\",\n );\n const missing = p.arguments.filter((x) => x.required && !args[x.name]?.trim()).map((x) => x.name);\n if (missing.length)\n throw new ToolError(`Prompt ${name} needs: ${missing.join(\", \")}.`, \"invalid_arguments\");\n return {\n description: p.description,\n messages: [{ role: \"user\" as const, content: { type: \"text\" as const, text: p.render(args) } }],\n };\n}\n","/**\n * Preview HTML through the one renderer (ADR-3): a whole page, or a single section rendered as a\n * page of its own (header and footer included so it is styled exactly as on the site), or just\n * the section's markup (`fragment`).\n */\nimport { blocksStyleTag, registerAll } from \"@omniharmonic/openspace-blocks\";\nimport { renderPageHtml } from \"@omniharmonic/openspace-renderer\";\nimport type { Page, SiteDocument } from \"@omniharmonic/openspace-schema\";\nimport { ToolError } from \"./errors\";\n\nlet registered = false;\n\nexport interface PreviewOptions {\n /** Render only this section (as a one-section page). */\n sectionId?: string;\n /** Return only the inner HTML of `<main>` instead of a full document. */\n fragment?: boolean;\n basePath?: string;\n /** Behaviors URL; previews without a server can't run behaviors (static markup only). */\n behaviorsUrl?: string;\n}\n\nexport function renderPreviewHtml(\n doc: SiteDocument,\n pageId: string,\n opts: PreviewOptions = {},\n): string {\n if (!registered) {\n registerAll();\n registered = true;\n }\n const page = doc.pages[pageId as Page[\"id\"]];\n if (!page) throw new ToolError(`No page ${pageId}.`, \"not_found\");\n let target: Page | string = pageId;\n if (opts.sectionId) {\n const section = page.sections.find((s) => s.id === opts.sectionId);\n if (!section)\n throw new ToolError(\n `No section ${opts.sectionId} on ${pageId}. Sections: ${page.sections.map((s) => s.id).join(\", \")}.`,\n \"not_found\",\n );\n target = { ...page, sections: [{ ...section, hidden: false }] };\n }\n const html = renderPageHtml({\n doc,\n pageId: target,\n mode: \"preview\",\n basePath: opts.basePath ?? \"\",\n behaviorsUrl: opts.behaviorsUrl,\n extraHead: blocksStyleTag(),\n });\n if (!opts.fragment) return html;\n const m = /<main\\b[^>]*>([\\s\\S]*)<\\/main>/.exec(html);\n return (m?.[1] ?? html).trim();\n}\n","/**\n * MCP resources (arch §10.2): block JSON Schemas, document schemas, each site's token set and\n * AGENTS.md, the design guidance (doc 04 §9) and the preset catalog — so the agent composes with\n * presets and tokens rather than inventing styles.\n */\nimport { presetCatalog } from \"@omniharmonic/openspace-blocks\";\nimport { blockFieldsJsonSchema, toJsonSchema } from \"@omniharmonic/openspace-schema\";\nimport { generateAgentsMd } from \"@omniharmonic/openspace-site-kit/agents-md\";\nimport { compileStyles } from \"@omniharmonic/openspace-theme\";\nimport type { ToolContext } from \"./context\";\nimport { ToolError } from \"./errors\";\nimport { DESIGN_GUIDANCE, ITERATION_GUIDANCE } from \"./guidance\";\n\nexport interface ResourceEntry {\n uri: string;\n name: string;\n title?: string;\n description?: string;\n mimeType: string;\n}\n\nexport interface ResourceContents {\n uri: string;\n mimeType: string;\n text: string;\n}\n\nconst DOC_SCHEMAS = [\n \"page\",\n \"section\",\n \"block\",\n \"site\",\n \"styles\",\n \"rich-text\",\n \"collection-item\",\n] as const;\n\nexport const RESOURCE_TEMPLATES = [\n {\n uriTemplate: \"openspace://schemas/blocks/{type}\",\n name: \"block-schema\",\n title: \"Block JSON Schema\",\n description: \"JSON Schema for one block type's fields (labels and AI hints included).\",\n mimeType: \"application/json\",\n },\n {\n uriTemplate: \"openspace://sites/{site}/tokens\",\n name: \"site-tokens\",\n title: \"Site design tokens\",\n description:\n \"Compiled Site Styles: palette, role colors per section theme, fonts, CSS variables.\",\n mimeType: \"application/json\",\n },\n {\n uriTemplate: \"openspace://sites/{site}/agents-md\",\n name: \"agents-md\",\n title: \"AGENTS.md\",\n description: \"How agents should edit the site: schema, conventions and safe-edit rules.\",\n mimeType: \"text/markdown\",\n },\n];\n\nconst json = (uri: string, value: unknown): ResourceContents => ({\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify(value, null, 2),\n});\n\nexport async function listResources(ctx: ToolContext): Promise<ResourceEntry[]> {\n const out: ResourceEntry[] = [\n {\n uri: \"openspace://guidance/design\",\n name: \"design-guidance\",\n title: \"Design guidance\",\n description:\n \"The rules Studio's Design check enforces (doc 04 §9) and how to work with presets and tokens.\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"openspace://guidance/iteration\",\n name: \"iteration-guidance\",\n title: \"Design iteration loop\",\n description: \"Inspect → check → edit → look → judge, with the tools for each step.\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"openspace://presets\",\n name: \"presets\",\n title: \"Section preset catalog\",\n description: \"Every section preset with copy ranges, image slots, themes and AI guidance.\",\n mimeType: \"application/json\",\n },\n {\n uri: \"openspace://schemas/blocks\",\n name: \"block-schemas\",\n title: \"Block JSON Schemas\",\n description: \"Field JSON Schemas for every block type.\",\n mimeType: \"application/json\",\n },\n ];\n for (const name of DOC_SCHEMAS)\n out.push({\n uri: `openspace://schemas/${name}`,\n name: `${name}-schema`,\n title: `${name} JSON Schema`,\n mimeType: \"application/json\",\n });\n for (const id of await ctx.allowedSites()) {\n out.push({\n uri: `openspace://sites/${id}/tokens`,\n name: `${id}-tokens`,\n title: \"Site design tokens\",\n mimeType: \"application/json\",\n });\n out.push({\n uri: `openspace://sites/${id}/agents-md`,\n name: `${id}-agents-md`,\n title: \"AGENTS.md\",\n mimeType: \"text/markdown\",\n });\n }\n return out;\n}\n\nexport async function readResource(ctx: ToolContext, uri: string): Promise<ResourceContents> {\n if (uri === \"openspace://guidance/design\")\n return { uri, mimeType: \"text/markdown\", text: DESIGN_GUIDANCE };\n if (uri === \"openspace://guidance/iteration\")\n return { uri, mimeType: \"text/markdown\", text: ITERATION_GUIDANCE };\n if (uri === \"openspace://presets\") return json(uri, presetCatalog);\n if (uri === \"openspace://schemas/blocks\")\n return json(\n uri,\n Object.fromEntries(ctx.registry.list().map((d) => [d.type, blockFieldsJsonSchema(d)])),\n );\n let m = /^openspace:\\/\\/schemas\\/blocks\\/([a-z0-9/-]+)$/.exec(uri);\n if (m) {\n const def = ctx.registry.get(m[1] as string);\n if (!def) throw new ToolError(`Unknown block type \"${m[1]}\".`, \"not_found\");\n return json(uri, blockFieldsJsonSchema(def));\n }\n m = /^openspace:\\/\\/schemas\\/([a-z-]+)$/.exec(uri);\n if (m && (DOC_SCHEMAS as readonly string[]).includes(m[1] as string))\n return json(uri, toJsonSchema(m[1] as (typeof DOC_SCHEMAS)[number]));\n m = /^openspace:\\/\\/sites\\/([^/]+)\\/(tokens|agents-md)$/.exec(uri);\n if (m) {\n const siteId = await ctx.siteId(m[1]);\n const doc = await ctx.doc(siteId);\n if (m[2] === \"tokens\") {\n const compiled = compileStyles(doc.styles);\n return json(uri, {\n choices: doc.styles.choices,\n overrides: doc.styles.overrides ?? null,\n tokens: compiled.tokens,\n contrast: compiled.contrast,\n });\n }\n const text =\n (await ctx.store.agentsMd?.(siteId)) ??\n generateAgentsMd({ registry: ctx.registry, siteTitle: doc.site.title });\n return { uri, mimeType: \"text/markdown\", text };\n }\n throw new ToolError(`Unknown resource ${uri}. Call resources/list.`, \"not_found\");\n}\n","/**\n * A transport-agnostic MCP server: `handle(jsonRpcMessage)` implements the protocol methods\n * (initialize, ping, tools/*, resources/*, prompts/*) and returns the response, so the same\n * server runs behind stdio (CLI), Streamable HTTP on Workers (Hub) or an in-memory pipe (tests).\n * `connect(transport)` wires it to any `@modelcontextprotocol/sdk` `Transport`.\n *\n * Only the SDK's protocol types/constants are imported (zod-only, no Node APIs), so this module\n * runs on Cloudflare Workers.\n */\nimport type { Transport } from \"@modelcontextprotocol/sdk/shared/transport.js\";\nimport {\n ErrorCode,\n type JSONRPCMessage,\n LATEST_PROTOCOL_VERSION,\n SUPPORTED_PROTOCOL_VERSIONS,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { blocksRegistry } from \"@omniharmonic/openspace-blocks\";\nimport type { BlockRegistry } from \"@omniharmonic/openspace-schema\";\nimport { z } from \"zod\";\nimport { ToolContext } from \"./context\";\nimport { errorText, invalidInput, ToolError } from \"./errors\";\nimport { getPrompt, PROMPTS } from \"./prompts\";\nimport { listResources, RESOURCE_TEMPLATES, readResource } from \"./resources\";\nimport type { Grant, SiteStore } from \"./store\";\nimport type { ToolDefinition, ToolOutput } from \"./tool\";\nimport { ALL_TOOLS } from \"./tools\";\n\nexport const SERVER_NAME = \"openspace\";\nexport const SERVER_VERSION = \"0.1.0\";\n\nexport const SERVER_INSTRUCTIONS = `OpenSpace edits a website through typed, validated operations. Start with get_site, then get_page (detail \"outline\") for ids. Compose with section presets (list_section_presets → insert_section/create_page), replace demo copy with update_block (rich text is Markdown), restyle only through Site Styles (set_styles / apply_template_look). Iterate: design_check → edit → screenshot/render_page. Read openspace://guidance/design once per session. Edits land in the draft; publish only when the owner asks (confirm: true).`;\n\nexport interface McpServerOptions {\n store: SiteStore;\n grant: Grant;\n registry?: BlockRegistry;\n /** Clock in ms (tests). */\n now?: () => number;\n /** Agent label recorded on sessions (default from the client's name, else \"Claude\"). */\n label?: string;\n /** Extra/override tools (e.g. a Hub-only tool); same name replaces a built-in. */\n tools?: readonly ToolDefinition[];\n /**\n * Called with unexpected (non-ToolError) failures; their details never reach the client.\n * Default: `console.error`.\n */\n onError?: (error: unknown, method: string) => void;\n /**\n * Treat the connection as already initialized (stateless transports that re-create the\n * server per request, like `handleMcpRequest`).\n */\n assumeInitialized?: boolean;\n}\n\n/** Methods a client may call before `initialize` completes. */\nconst PRE_INIT_METHODS = new Set([\"initialize\", \"ping\"]);\n/** The only protocol revision that allowed JSON-RPC batches. */\nconst BATCH_VERSION = \"2025-03-26\";\n\ntype Id = string | number;\ntype Json = Record<string, unknown>;\n\nconst isRecord = (v: unknown): v is Json =>\n typeof v === \"object\" && v !== null && !Array.isArray(v);\n\nclass RpcError extends Error {\n constructor(\n readonly code: number,\n message: string,\n readonly data?: unknown,\n ) {\n super(message);\n }\n}\n\n/** Resource not found (MCP spec). */\nconst RESOURCE_NOT_FOUND = -32002;\n\nconst schemaCache = new WeakMap<z.ZodType, Json>();\nfunction inputJsonSchema(schema: z.ZodType): Json {\n let s = schemaCache.get(schema);\n if (!s) {\n s = z.toJSONSchema(schema, { io: \"input\", unrepresentable: \"any\" }) as Json;\n delete s.$schema;\n if (s.type !== \"object\") s = { type: \"object\", properties: {} };\n schemaCache.set(schema, s);\n }\n return s;\n}\n\nexport class OpenSpaceMcpServer {\n readonly ctx: ToolContext;\n private readonly tools = new Map<string, ToolDefinition>();\n private clientName: string | undefined;\n private initialized: boolean;\n private protocolVersion: string | undefined;\n private closed = false;\n\n constructor(private readonly options: McpServerOptions) {\n this.ctx = new ToolContext({\n store: options.store,\n grant: options.grant,\n registry: options.registry ?? blocksRegistry(),\n now: options.now,\n label: options.label,\n });\n this.initialized = Boolean(options.assumeInitialized);\n for (const t of ALL_TOOLS) this.tools.set(t.name, t);\n for (const t of options.tools ?? []) this.tools.set(t.name, t);\n }\n\n /** Tool definitions served by this instance. */\n toolList(): ToolDefinition[] {\n return [...this.tools.values()];\n }\n\n /**\n * Handle one JSON-RPC message (or a batch). Returns the response(s), or undefined for\n * notifications.\n */\n async handle(message: unknown): Promise<JSONRPCMessage | JSONRPCMessage[] | undefined> {\n if (Array.isArray(message)) {\n // Batching was removed in MCP 2025-06-18; only a 2025-03-26 session may batch.\n if (this.protocolVersion !== BATCH_VERSION)\n return {\n jsonrpc: \"2.0\",\n id: null,\n error: {\n code: ErrorCode.InvalidRequest,\n message: \"JSON-RPC batches are not supported in this protocol version\",\n },\n } as unknown as JSONRPCMessage;\n const out: JSONRPCMessage[] = [];\n for (const m of message) {\n const r = await this.handleOne(m);\n if (r) out.push(r);\n }\n return out.length ? out : undefined;\n }\n return this.handleOne(message);\n }\n\n private async handleOne(message: unknown): Promise<JSONRPCMessage | undefined> {\n if (!isRecord(message) || message.jsonrpc !== \"2.0\" || typeof message.method !== \"string\") {\n // Responses from the client (we send no requests) and malformed input.\n if (isRecord(message) && (\"result\" in message || \"error\" in message)) return undefined;\n const id =\n isRecord(message) && (typeof message.id === \"string\" || typeof message.id === \"number\")\n ? message.id\n : null;\n return {\n jsonrpc: \"2.0\",\n id,\n error: { code: ErrorCode.InvalidRequest, message: \"Invalid JSON-RPC request\" },\n } as unknown as JSONRPCMessage;\n }\n const hasId = typeof message.id === \"string\" || typeof message.id === \"number\";\n const params = isRecord(message.params) ? message.params : {};\n if (!hasId) {\n // Notifications: initialized, cancelled, roots changed… nothing to do.\n return undefined;\n }\n const id = message.id as Id;\n if (!this.initialized && !PRE_INIT_METHODS.has(message.method))\n return {\n jsonrpc: \"2.0\",\n id,\n error: {\n code: ErrorCode.InvalidRequest,\n message: \"Server not initialized: send initialize first\",\n },\n } as JSONRPCMessage;\n try {\n const result = await this.dispatch(message.method, params);\n return { jsonrpc: \"2.0\", id, result } as JSONRPCMessage;\n } catch (e) {\n if (e instanceof RpcError)\n return {\n jsonrpc: \"2.0\",\n id,\n error: {\n code: e.code,\n message: e.message,\n ...(e.data !== undefined ? { data: e.data } : {}),\n },\n } as JSONRPCMessage;\n if (e instanceof ToolError)\n return {\n jsonrpc: \"2.0\",\n id,\n error: { code: ErrorCode.InvalidParams, message: errorText(e) },\n } as JSONRPCMessage;\n this.reportError(e, message.method);\n return {\n jsonrpc: \"2.0\",\n id,\n error: {\n code: ErrorCode.InternalError,\n message: \"Internal error; the details were logged on the server.\",\n },\n } as JSONRPCMessage;\n }\n }\n\n private async dispatch(method: string, params: Json): Promise<Json> {\n switch (method) {\n case \"initialize\":\n return this.initialize(params);\n case \"ping\":\n return {};\n case \"logging/setLevel\":\n return {};\n case \"tools/list\":\n return {\n tools: this.toolList().map((t) => ({\n name: t.name,\n title: t.title,\n description: t.description,\n inputSchema: inputJsonSchema(t.input),\n annotations: { title: t.title, ...t.annotations },\n })),\n };\n case \"tools/call\":\n return this.callTool(params);\n case \"resources/list\":\n return { resources: await listResources(this.ctx) };\n case \"resources/templates/list\":\n return { resourceTemplates: RESOURCE_TEMPLATES };\n case \"resources/read\": {\n if (typeof params.uri !== \"string\")\n throw new RpcError(ErrorCode.InvalidParams, \"uri is required\");\n try {\n return { contents: [await readResource(this.ctx, params.uri)] };\n } catch (e) {\n if (e instanceof ToolError && e.code === \"not_found\")\n throw new RpcError(RESOURCE_NOT_FOUND, e.message, { uri: params.uri });\n throw e;\n }\n }\n case \"prompts/list\":\n return {\n prompts: PROMPTS.map((p) => ({\n name: p.name,\n title: p.title,\n description: p.description,\n arguments: p.arguments,\n })),\n };\n case \"prompts/get\": {\n if (typeof params.name !== \"string\")\n throw new RpcError(ErrorCode.InvalidParams, \"name is required\");\n const args = isRecord(params.arguments)\n ? Object.fromEntries(Object.entries(params.arguments).map(([k, v]) => [k, String(v)]))\n : {};\n return getPrompt(params.name, args);\n }\n case \"completion/complete\":\n return { completion: { values: [], hasMore: false } };\n default:\n throw new RpcError(ErrorCode.MethodNotFound, `Method not found: ${method}`);\n }\n }\n\n private reportError(e: unknown, where: string): void {\n if (this.options.onError) this.options.onError(e, where);\n else console.error(`openspace mcp: ${where}:`, e);\n }\n\n private initialize(params: Json): Json {\n const requested = typeof params.protocolVersion === \"string\" ? params.protocolVersion : \"\";\n const protocolVersion = (SUPPORTED_PROTOCOL_VERSIONS as readonly string[]).includes(requested)\n ? requested\n : LATEST_PROTOCOL_VERSION;\n this.protocolVersion = protocolVersion;\n this.initialized = true;\n const info = isRecord(params.clientInfo) ? params.clientInfo : {};\n this.clientName = typeof info.name === \"string\" ? info.name : undefined;\n return {\n protocolVersion,\n capabilities: {\n tools: { listChanged: false },\n resources: { listChanged: false, subscribe: false },\n prompts: { listChanged: false },\n logging: {},\n },\n serverInfo: { name: SERVER_NAME, title: \"OpenSpace\", version: SERVER_VERSION },\n instructions: SERVER_INSTRUCTIONS,\n };\n }\n\n /** Name the client reported in `initialize`. */\n get client(): string | undefined {\n return this.clientName;\n }\n\n private async callTool(params: Json): Promise<Json> {\n const name = params.name;\n if (typeof name !== \"string\") throw new RpcError(ErrorCode.InvalidParams, \"name is required\");\n const tool = this.tools.get(name);\n if (!tool)\n throw new RpcError(\n ErrorCode.InvalidParams,\n `Unknown tool \"${name}\". Call tools/list for the available tools.`,\n );\n const parsed = tool.input.safeParse(isRecord(params.arguments) ? params.arguments : {});\n try {\n if (!parsed.success) throw invalidInput(name, parsed.error);\n const out = await tool.handler(this.ctx, parsed.data as never);\n return toCallResult(out);\n } catch (e) {\n if (e instanceof ToolError)\n return {\n isError: true,\n content: [{ type: \"text\", text: errorText(e) }],\n structuredContent: {\n error: {\n code: e.code,\n message: e.message,\n ...(e.issues.length ? { issues: e.issues } : {}),\n },\n },\n };\n this.reportError(e, `tools/call ${name}`);\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: `Internal error in ${name}; the details were logged on the server. Try again, or try a different approach.`,\n },\n ],\n };\n }\n }\n\n /** Wire the server to an SDK transport (stdio, Streamable HTTP, in-memory). */\n async connect(transport: Transport): Promise<void> {\n transport.onmessage = (message) => {\n void this.handle(message).then(\n async (response) => {\n if (!response) return;\n for (const r of Array.isArray(response) ? response : [response]) await transport.send(r);\n },\n (e) => this.options.onError?.(e, \"transport\"),\n );\n };\n const prior = transport.onclose;\n transport.onclose = () => {\n prior?.();\n void this.close();\n };\n await transport.start();\n }\n\n /** End the agent sessions this connection started. Idempotent. */\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n await this.ctx.endSessions();\n }\n}\n\nfunction toCallResult(out: ToolOutput): Json {\n const content: Json[] = [];\n const text = out.text ?? (out.data !== undefined ? JSON.stringify(out.data, null, 2) : \"Done.\");\n content.push({ type: \"text\", text });\n for (const img of out.images ?? [])\n content.push({ type: \"image\", data: img.base64, mimeType: img.mimeType });\n const result: Json = { content };\n if (isRecord(out.data)) result.structuredContent = JSON.parse(JSON.stringify(out.data)) as Json;\n return result;\n}\n\n/** A stateful server for one connection (agent sessions are kept until `close`). */\nexport function createMcpServer(\n store: SiteStore,\n grant: Grant,\n options: Omit<McpServerOptions, \"store\" | \"grant\"> = {},\n): OpenSpaceMcpServer {\n return new OpenSpaceMcpServer({ ...options, store, grant });\n}\n\n/**\n * Stateless one-shot handling: a fresh server per message, closed afterwards. Every edit then\n * runs in its own agent session (with its own start snapshot); keep a `createMcpServer`\n * instance per MCP session when the transport has sessions (the Hub's McpAgent does).\n */\nexport async function handleMcpRequest(\n store: SiteStore,\n grant: Grant,\n message: unknown,\n options: Omit<McpServerOptions, \"store\" | \"grant\"> = {},\n): Promise<JSONRPCMessage | JSONRPCMessage[] | undefined> {\n const server = createMcpServer(store, grant, { assumeInitialized: true, ...options });\n try {\n return await server.handle(message);\n } finally {\n await server.close();\n }\n}\n","import { blockHeadings } from \"@omniharmonic/openspace-blocks\";\nimport {\n type Block,\n type GridRect,\n type ImageValue,\n plainText,\n type RichTextDoc,\n type Section,\n STACK_UNITS,\n} from \"@omniharmonic/openspace-schema\";\n\n/** What the checks need to know about blocks and sections. */\n\n/** Blocks that carry no reading text (media and decoration). Everything else is \"text\". */\nexport const NON_TEXT_BLOCKS = new Set([\n \"image\",\n \"gallery\",\n \"video\",\n \"shape\",\n \"spacer\",\n \"line\",\n \"divider\",\n \"map\",\n \"before-after\",\n \"embed\",\n]);\nexport const isTextBlock = (b: Block) => !NON_TEXT_BLOCKS.has(b.type);\n\n/** Blocks that are, or contain, an action a visitor can take. */\nexport const ACTION_BLOCKS = new Set([\n \"button\",\n \"form\",\n \"newsletter\",\n \"booking\",\n \"donation\",\n \"product\",\n \"member-login\",\n \"link-list\",\n \"pricing\",\n]);\n\n/** Blocks with a `headingLevel` + optional heading text (library B). */\nconst LEVEL_FIELD_BLOCKS = new Set([\n \"summary\",\n \"events\",\n \"hours\",\n \"contact-info\",\n \"countdown\",\n \"booking\",\n \"donation\",\n \"member-login\",\n \"social-feed\",\n]);\n\nconst lvl = (tag: unknown, fallback = 3) => {\n const m = /^h([1-6])$/.exec(String(tag ?? \"\"));\n return m ? Number(m[1]) : fallback;\n};\nconst list = (v: unknown): Record<string, unknown>[] =>\n Array.isArray(v) ? (v as Record<string, unknown>[]) : [];\n\nexport interface OutlineHeading {\n level: number;\n text: string;\n blockId: string;\n /** Whether the level is editable (heading/text blocks, `headingLevel` fields). */\n editable: boolean;\n}\n\n/** Headings a block renders, in document order. */\nexport function headingsOf(block: Block): OutlineHeading[] {\n const f = block.fields;\n const out = (level: number, text: string, editable = false): OutlineHeading => ({\n level,\n text,\n blockId: block.id,\n editable,\n });\n switch (block.type) {\n case \"heading\":\n case \"text\":\n return blockHeadings(block).map((h) => out(h.level, h.text, true));\n case \"card\":\n return f.heading ? [out(3, String(f.heading))] : [];\n case \"columns\":\n return list(f.items).map((i) => out(3, String(i.heading ?? \"\")));\n case \"team\":\n return list(f.people).map((p) => out(3, String(p.name ?? \"\")));\n case \"pricing\":\n return list(f.plans).map((p) => out(3, String(p.name ?? \"\")));\n case \"timeline\":\n return list(f.items).map((i) => out(3, String(i.title ?? \"\")));\n case \"restaurant-menu\":\n return list(f.sections).map((s) => out(3, String(s.title ?? \"\")));\n case \"audio\":\n return [out(3, String(f.title ?? \"\"))];\n case \"newsletter\":\n return f.heading ? [out(2, String(f.heading))] : [];\n default:\n if (LEVEL_FIELD_BLOCKS.has(block.type) && f.heading)\n return [out(lvl(f.headingLevel), String(f.heading), true)];\n return [];\n }\n}\n\n/** Blocks of a section in rendered (DOM) order: stack by column, grid by desktop reading order. */\nexport function blocksInOrder(section: Section): Block[] {\n const layout = section.layout;\n if (layout.mode === \"stack\") {\n const cols = layout.columns.d.length;\n const byCol: Block[][] = Array.from({ length: cols }, () => []);\n for (const b of section.blocks) byCol[Math.min(Math.max(b.column ?? 0, 0), cols - 1)]?.push(b);\n return byCol.flat();\n }\n return [...section.blocks].sort((a, b) => {\n const ra = layout.items[a.id]?.d;\n const rb = layout.items[b.id]?.d;\n if (!ra || !rb) return 0;\n return ra.y - rb.y || ra.x - rb.x;\n });\n}\n\n/** All visible plain text in a block (for emptiness and word counts). */\nexport function blockText(block: Block): string {\n const parts: string[] = [];\n const walk = (v: unknown, key?: string) => {\n if (typeof v === \"string\") {\n if (\n key &&\n /^(?:src|url|href|link|id|type|variant|icon|level|size|aspect|network|day|opens|closes|currency|source|provider|mode|frequency|target|tileServer|headingLevel|placeholder|columns|separator|speed|color|shape|thickness|length|height|role|align|alignment|layout|fit|theme|kind)$/.test(\n key,\n )\n )\n return;\n parts.push(v);\n } else if (Array.isArray(v)) for (const x of v) walk(x);\n else if (v && typeof v === \"object\") {\n const o = v as Record<string, unknown>;\n if (o.type === \"doc\" && Array.isArray(o.content)) {\n parts.push(plainText(o as unknown as RichTextDoc));\n return;\n }\n if (typeof o.src === \"string\") return; // images: alt text isn't reading text\n for (const [k, x] of Object.entries(o)) walk(x, k);\n }\n };\n walk(block.fields);\n return parts.join(\" \").replace(/\\s+/g, \" \").trim();\n}\n\nexport interface FoundImage {\n image: ImageValue;\n /** Field path inside the block, e.g. `[\"images\", 2, \"image\"]`. */\n path: (string | number)[];\n}\n\n/** Every image value (`{ src, alt }`) inside a block's fields. */\nexport function imagesIn(block: Block): FoundImage[] {\n const out: FoundImage[] = [];\n const walk = (v: unknown, path: (string | number)[]) => {\n if (Array.isArray(v)) {\n v.forEach((x, i) => {\n walk(x, [...path, i]);\n });\n } else if (v && typeof v === \"object\") {\n const o = v as Record<string, unknown>;\n if (typeof o.src === \"string\" && typeof o.alt === \"string\" && !(\"kind\" in o)) {\n out.push({ image: o as unknown as ImageValue, path });\n return;\n }\n for (const [k, x] of Object.entries(o)) walk(x, [...path, k]);\n }\n };\n walk(block.fields, []);\n return out;\n}\n\n// --- display size -------------------------------------------------------------------------------\n\n/** Desktop design widths (CSS px) for the content width tokens and the viewport. */\nexport const VIEWPORT = 1920;\n/** Desktop grid row unit (CSS px). */\nexport const GRID_ROW_PX = 24;\nexport const CONTENT_WIDTHS = { narrow: 720, content: 1280, wide: 1440, full: VIEWPORT } as const;\n\nfunction containerWidth(section: Section): number {\n return CONTENT_WIDTHS[section.layout.width ?? \"content\"];\n}\n\n/** Largest CSS width a block is drawn at on desktop. */\nexport function blockDisplayWidth(section: Section, block: Block): number {\n const W = containerWidth(section);\n const layout = section.layout;\n if (layout.mode === \"stack\") {\n const cols = layout.columns.d;\n const span = cols[Math.min(block.column ?? 0, cols.length - 1)] ?? STACK_UNITS;\n return (W * span) / STACK_UNITS;\n }\n const rect = layout.items[block.id]?.d;\n if (!rect) return W;\n return rectWidth(rect, W);\n}\n\nexport function rectWidth(rect: GridRect, W: number): number {\n let w = (W * rect.w) / 24;\n const side = (VIEWPORT - W) / 2;\n if (rect.bleed === \"left\" || rect.bleed === \"both\") w += side;\n if (rect.bleed === \"right\" || rect.bleed === \"both\") w += side;\n return w;\n}\n\n/** Display width of one image inside a block (galleries, cards and lists divide the block). */\nexport function imageDisplayWidth(\n block: Block,\n blockWidth: number,\n path: (string | number)[],\n): number {\n const f = block.fields;\n const n = (v: unknown, d: number) => Number(v ?? d) || d;\n switch (block.type) {\n case \"gallery\":\n if (block.variant === \"slideshow\") return blockWidth;\n if (block.variant === \"carousel\") return blockWidth / 2.5;\n if (block.variant === \"strips\") return blockWidth / 2;\n return blockWidth / n(f.columns, 3);\n case \"columns\":\n return blockWidth / n(f.columns, 3);\n case \"team\":\n return blockWidth / n(f.columns, 3);\n case \"testimonial\":\n case \"quote-carousel\":\n return 96;\n default:\n return path.length > 1 ? blockWidth / 2 : blockWidth;\n }\n}\n\n/** Crop aspect (w/h) an image block draws at, when it crops. */\nexport function cropAspect(block: Block, section: Section): number | undefined {\n const layout = section.layout;\n if (layout.mode === \"grid\") {\n // Grid images fill their cell (rows are at least one row unit tall).\n const rect = layout.items[block.id]?.d;\n if (!rect || block.type !== \"image\") return undefined;\n return rectWidth(rect, CONTENT_WIDTHS[layout.width ?? \"content\"]) / (rect.h * GRID_ROW_PX);\n }\n const a = block.fields.aspect;\n if (typeof a !== \"string\" || !/^\\d+:\\d+$/.test(a)) return undefined;\n const [w, h] = a.split(\":\").map(Number) as [number, number];\n return w / h;\n}\n","import type { Op, OpMeta } from \"@omniharmonic/openspace-ops\";\n\n/** A Design check / SEO check finding. Plain JSON: Studio, MCP and the CLI all show these. */\nexport type Severity = \"error\" | \"warning\" | \"info\";\n\nexport interface Autofix {\n /** Button label in Studio, e.g. \"Use the nearest accessible color\". */\n label: string;\n /** Operations that fix the issue (validated against the document they were computed for). */\n ops: Op[];\n}\n\nexport interface Issue {\n /** Stable key for this finding (`rule:page:section:block…`), for de-duplication and dismissal. */\n id: string;\n /** Rule id, e.g. `contrast`, `heading-order`. */\n rule: string;\n severity: Severity;\n /** Page id (`\"footer\"` for the site footer); absent for site-wide issues. */\n page?: string;\n section?: string;\n block?: string;\n /** What's wrong, in plain language. */\n message: string;\n /** How to fix it, in plain language. */\n fix: string;\n autofix?: Autofix;\n}\n\nexport interface CheckOptions {\n /** Actor recorded on autofix ops (default `\"design-check\"`). */\n actor?: string;\n /** Timestamp for autofix ops (default `Date.now()`). */\n now?: number;\n}\n\n/** Op metadata factory for autofix ops. */\nexport function opMeta(options: CheckOptions): () => OpMeta {\n let n = 0;\n const actor = options.actor ?? \"design-check\";\n const ts = options.now ?? Date.now();\n const stamp = ts.toString(36);\n return () => ({ id: `lint_${stamp}_${n++}`, actor, ts });\n}\n\nexport function issue(i: Omit<Issue, \"id\"> & { key?: string }): Issue {\n const { key, ...rest } = i;\n const id = [rest.rule, rest.page, rest.section, rest.block, key].filter(Boolean).join(\":\");\n return { id, ...rest };\n}\n\n/** Errors first, then warnings, then info; stable otherwise. */\nexport function sortIssues(issues: Issue[]): Issue[] {\n const rank: Record<Severity, number> = { error: 0, warning: 1, info: 2 };\n return issues\n .map((i, n) => [i, n] as const)\n .sort(([a, na], [b, nb]) => rank[a.severity] - rank[b.severity] || na - nb)\n .map(([i]) => i);\n}\n","import { blocksRegistry } from \"@omniharmonic/openspace-blocks\";\nimport type { Op } from \"@omniharmonic/openspace-ops\";\nimport {\n type BrokenLink,\n findBrokenLinks,\n type Page,\n resolveInternalLinks,\n type SiteDocument,\n SiteDocumentSchema,\n suggestLinkTarget,\n} from \"@omniharmonic/openspace-schema\";\nimport { type CheckOptions, type Issue, issue, opMeta } from \"./issue\";\n\n/**\n * Broken internal links, in plain language: the Design check's `broken-link` rule and the\n * publish gate (`publishCheck`) the Hub runs before a publish. Both use the schema's\n * `findBrokenLinks`, the same rules `openspace check` fails CI on.\n */\n\nconst titleOf = (p: Page) => p.title || (p.slug === \"\" ? \"Home\" : p.slug);\n\n/** \"A button on Home\", \"A card in the footer\", \"Your menu\", \"“Spring hours” in journal\". */\nexport function linkPlace(doc: SiteDocument, link: BrokenLink): string {\n const s = link.scope;\n if (link.block) {\n const container =\n link.container === \"footer\"\n ? doc.site.footer\n : doc.pages[link.container as Page[\"id\"]]?.sections.find((x) => x.id === link.section);\n const block = container?.blocks.find((b) => b.id === link.block);\n const label = (block && blocksRegistry().get(block.type)?.meta.label) || \"block\";\n const what = `A ${label.toLowerCase()}`;\n if (link.container === \"footer\") return `${what} in the footer`;\n const page = doc.pages[link.container as Page[\"id\"]];\n return page ? `${what} on ${titleOf(page)}` : what;\n }\n if (s.kind === \"site\") {\n const head = link.path[0];\n if (head === \"nav\") return \"Your menu\";\n if (head === \"header\") return \"The header\";\n if (head === \"announcement\") return \"The announcement bar\";\n if (head === \"popup\") return \"The pop-up\";\n return \"Your site settings\";\n }\n if (s.kind === \"page\") {\n const page = doc.pages[s.page];\n return page ? `The page ${titleOf(page)}` : \"A page\";\n }\n const item = doc.collections[s.collection]?.[s.slug];\n const title = (item?.frontmatter as { title?: string } | undefined)?.title ?? s.slug;\n return `“${title}” in ${s.collection}`;\n}\n\n/** One sentence: \"A button on Home links to /book, which isn't a page on your site.\" */\nexport function describeBrokenLink(doc: SiteDocument, link: BrokenLink): string {\n const where = linkPlace(doc, link);\n switch (link.kind) {\n case \"page\":\n return `${where} links to a page that no longer exists.`;\n case \"item\":\n return `${where} links to ${link.target}, which isn't on your site any more.`;\n case \"collection\":\n return `${where} points at the “${link.target}” collection, which doesn't exist.`;\n default:\n return `${where} links to ${link.target}, which isn't a page on your site.`;\n }\n}\n\n/** The autofix for a broken link in a block field or the menu: point it at an existing page. */\nfunction linkFix(\n doc: SiteDocument,\n link: BrokenLink,\n meta: () => ReturnType<ReturnType<typeof opMeta>>,\n): Issue[\"autofix\"] | undefined {\n const target = link.kind === \"page\" ? \"/\" : link.target;\n const s = suggestLinkTarget(doc, target);\n if (!s) return undefined;\n const label = `Link to ${s.page ? titleOf(s.page) : s.path} instead`;\n if (link.block && link.field) {\n const container =\n link.container === \"footer\"\n ? doc.site.footer\n : doc.pages[link.container as Page[\"id\"]]?.sections.find((x) => x.id === link.section);\n const block = container?.blocks.find((b) => b.id === link.block);\n if (!block) return undefined;\n const { value, changes } = resolveInternalLinks(block.fields[link.field], doc);\n if (!changes.length) return undefined;\n return {\n label,\n ops: [\n {\n op: \"block.update\",\n ...meta(),\n page: link.container as never,\n block: block.id as never,\n set: { [link.field]: value },\n } as Op,\n ],\n };\n }\n if (link.scope.kind === \"site\" && link.path[0] === \"nav\") {\n const { value, changes } = resolveInternalLinks(doc.site.nav, doc);\n if (!changes.length) return undefined;\n return { label, ops: [{ op: \"site.update\", ...meta(), set: { nav: value } } as Op] };\n }\n return undefined;\n}\n\n/**\n * Design check `broken-link` issues: links that lead nowhere on `pageId` (or every page and\n * collection item), in the footer and in the site's menu, header and banners.\n */\nexport function linkIssues(\n doc: SiteDocument,\n pageId?: string,\n options: CheckOptions = {},\n meta: () => ReturnType<ReturnType<typeof opMeta>> = opMeta(options),\n): Issue[] {\n const out: Issue[] = [];\n for (const link of findBrokenLinks(doc)) {\n const s = link.scope;\n if (pageId && s.kind === \"page\" && s.page !== pageId) continue;\n if (pageId && s.kind === \"item\") continue;\n const page = link.container ?? (s.kind === \"page\" ? s.page : undefined);\n const autofix = linkFix(doc, link, meta);\n out.push(\n issue({\n rule: \"broken-link\",\n severity: link.severity,\n ...(page ? { page } : {}),\n ...(link.section ? { section: link.section } : {}),\n ...(link.block ? { block: link.block } : {}),\n key: `${s.kind === \"item\" ? `${s.collection}/${s.slug}:` : \"\"}${link.path.join(\".\")}`,\n message: describeBrokenLink(doc, link),\n fix:\n link.severity === \"error\"\n ? \"Point the link at a page that exists, or add the missing page. The site can't be published until then.\"\n : \"Point the link at a page that exists, or add the missing page.\",\n ...(autofix ? { autofix } : {}),\n }),\n );\n }\n return out;\n}\n\n// --- publish gate -------------------------------------------------------------------------------\n\nexport interface PublishProblem {\n rule: \"schema\" | \"block\" | \"link\";\n severity: \"error\" | \"warning\";\n /** Plain language: which page, which block, which link. */\n message: string;\n page?: string;\n section?: string;\n block?: string;\n /** The link target, for link problems. */\n target?: string;\n}\n\nexport interface PublishCheck {\n ok: boolean;\n errors: PublishProblem[];\n warnings: PublishProblem[];\n}\n\nconst where = (doc: SiteDocument, path: readonly PropertyKey[]): string => {\n const [head, id] = path.map(String);\n if (head === \"pages\" && id) {\n const page = doc.pages[id as Page[\"id\"]];\n return page ? `on ${titleOf(page)}` : \"on a page\";\n }\n if (head === \"collections\") return `in ${id ?? \"a collection\"}`;\n if (head === \"site\") return \"in the site settings\";\n return \"in the site\";\n};\n\nexport interface PublishCheckOptions {\n /**\n * How block field problems count (default `error`, as in `openspace check`). The Hub passes\n * `warning`: a site's own check pins its block library version, which may accept fields this\n * one doesn't, and a publish must never be refused for a difference the site's run won't see.\n */\n blocks?: \"error\" | \"warning\";\n}\n\n/**\n * What must hold before a draft goes live — the parts of `openspace check` that look at content\n * (the document's shape, every block's fields, internal links). Errors block a publish; warnings\n * (text links that lead nowhere) don't. Media files, sizes and secrets are checked by the site's\n * own publish run; members-only pages are never a problem here.\n */\nexport function publishCheck(doc: SiteDocument, options: PublishCheckOptions = {}): PublishCheck {\n const errors: PublishProblem[] = [];\n const warnings: PublishProblem[] = [];\n const parsed = SiteDocumentSchema.safeParse(doc);\n if (!parsed.success)\n for (const i of parsed.error.issues.slice(0, 20))\n errors.push({\n rule: \"schema\",\n severity: \"error\",\n message: `Something ${where(doc, i.path)} isn't in a shape the site understands (${i.path.join(\".\")}: ${i.message}).`,\n });\n const blockSeverity = options.blocks ?? \"error\";\n for (const i of blocksRegistry().validateDocument(doc).slice(0, 20))\n (blockSeverity === \"error\" ? errors : warnings).push({\n rule: \"block\",\n severity: blockSeverity,\n block: i.blockId,\n message: `A block ${where(doc, i.path)} has a setting the site can't use (${i.message}).`,\n });\n for (const link of findBrokenLinks(doc)) {\n const p: PublishProblem = {\n rule: \"link\",\n severity: link.severity,\n message: describeBrokenLink(doc, link),\n target: link.target,\n ...(link.container ? { page: link.container } : {}),\n ...(link.scope.kind === \"page\" && !link.container ? { page: link.scope.page } : {}),\n ...(link.section ? { section: link.section } : {}),\n ...(link.block ? { block: link.block } : {}),\n };\n (link.severity === \"error\" ? errors : warnings).push(p);\n }\n return { ok: errors.length === 0, errors, warnings };\n}\n","import type { Op, SiteDocument } from \"@omniharmonic/openspace-ops\";\nimport { findSection } from \"@omniharmonic/openspace-ops\";\nimport {\n type Block,\n GRID_COLUMNS,\n type GridItem,\n type GridRect,\n type Section,\n} from \"@omniharmonic/openspace-schema\";\nimport { CONTENT_WIDTHS, isTextBlock, rectWidth } from \"./content\";\nimport { type CheckOptions, opMeta } from \"./issue\";\n\n/**\n * Mobile auto-layout (arch §3.3): when a grid section has no mobile placements, generate them by\n * visual reading order — top-to-bottom, then left-to-right on the desktop grid — not insertion\n * order. Items stack full width on the 8-column mobile grid with a one-row gap between them;\n * heights are scaled (media keeps its desktop proportions, text keeps its pixel height and grows\n * to fit). Items layered *on* another item on desktop (a caption card over a photo, a shape\n * behind a portrait) stay layered on it on mobile.\n */\n\n/** Row unit heights (CSS px) on desktop and mobile, and the mobile content width at 390px. */\nexport const ROW_UNIT = { d: 24, m: 20 } as const;\nexport const MOBILE_WIDTH = 350;\n\nexport interface AutoMobileOptions {\n /** Regenerate every placement, discarding stored `m` rects (default: keep them). */\n reset?: boolean;\n}\n\n/** Share of `a`'s area covered by `b`. */\nfunction coverage(a: GridRect, b: GridRect): number {\n const w = Math.min(a.x + a.w, b.x + b.w) - Math.max(a.x, b.x);\n const h = Math.min(a.y + a.h, b.y + b.h) - Math.max(a.y, b.y);\n if (w <= 0 || h <= 0) return 0;\n return (w * h) / (a.w * a.h);\n}\n\n/**\n * Visual reading order of desktop rects.\n *\n * 1. Bands: walking top to bottom, an item joins the current band while it starts above the\n * band's bottom edge (it overlaps the band vertically); otherwise it starts a new band.\n * 2. Columns: inside a band, items whose horizontal extents overlap (transitively) form a\n * column. Columns are read left to right, each top to bottom.\n *\n * So an eyebrow, heading and button stacked beside a tall photo read eyebrow → heading →\n * button → photo, even when the photo starts higher; a row of cards reads left to right; and\n * staggered columns read column by column.\n *\n * Note: the renderer's DOM order (and `fallbackMobileRects`) still sorts by each rect's top-left\n * corner only. Stored `m` placements from `autoMobileLayout` are what make mobile follow this\n * order; the DOM order for assistive tech is unchanged.\n */\nexport function readingOrder<T extends { id: string; rect: GridRect }>(items: readonly T[]): T[] {\n const sorted = [...items].sort((a, b) => a.rect.y - b.rect.y || a.rect.x - b.rect.x);\n const bands: T[][] = [];\n let bottom = 0;\n for (const it of sorted) {\n const band = bands[bands.length - 1];\n if (band && it.rect.y < bottom) {\n band.push(it);\n bottom = Math.max(bottom, it.rect.y + it.rect.h);\n } else {\n bands.push([it]);\n bottom = it.rect.y + it.rect.h;\n }\n }\n return bands.flatMap(columnsOf);\n}\n\n/** Group a band into columns of horizontally overlapping items; read columns left to right. */\nfunction columnsOf<T extends { rect: GridRect }>(band: T[]): T[] {\n const parent = band.map((_, i) => i);\n const find = (i: number): number => {\n let root = i;\n while (parent[root] !== root) root = parent[root] as number;\n return root;\n };\n for (let i = 0; i < band.length; i++)\n for (let j = i + 1; j < band.length; j++) {\n const a = (band[i] as T).rect;\n const b = (band[j] as T).rect;\n if (a.x < b.x + b.w && b.x < a.x + a.w) parent[find(i)] = find(j);\n }\n const groups = new Map<number, T[]>();\n band.forEach((it, i) => {\n const root = find(i);\n groups.set(root, [...(groups.get(root) ?? []), it]);\n });\n return [...groups.values()]\n .sort((a, b) => Math.min(...a.map((i) => i.rect.x)) - Math.min(...b.map((i) => i.rect.x)))\n .flatMap((col) => col.sort((a, b) => a.rect.y - b.rect.y || a.rect.x - b.rect.x));\n}\n\n/** Mobile row span for a desktop rect: media keeps its aspect ratio, text its pixel height. */\nexport function mobileHeight(\n block: Block | undefined,\n d: GridRect,\n width: number = CONTENT_WIDTHS.content,\n): number {\n const pxHeight = d.h * ROW_UNIT.d;\n if (block && !isTextBlock(block)) {\n const pxWidth = rectWidth(d, width);\n const scaled = (pxHeight * MOBILE_WIDTH) / Math.max(1, pxWidth);\n return Math.max(4, Math.round(scaled / ROW_UNIT.m));\n }\n return Math.max(1, Math.round(pxHeight / ROW_UNIT.m));\n}\n\n/**\n * Grid items with `m` placements for every block of a grid section. Returns `undefined` for\n * stack sections (they stack by column order instead).\n */\nexport function autoMobileLayout(\n section: Section,\n options: AutoMobileOptions = {},\n): Record<string, GridItem> | undefined {\n const layout = section.layout;\n if (layout.mode !== \"grid\") return undefined;\n const width = CONTENT_WIDTHS[layout.width ?? \"content\"];\n const blocks = new Map(section.blocks.map((b) => [b.id as string, b]));\n const out: Record<string, GridItem> = {};\n const placed: { id: string; d: GridRect; m: GridRect }[] = [];\n\n let cursor = 1;\n for (const [id, item] of Object.entries(layout.items)) {\n out[id] = structuredClone(item);\n if (!options.reset && item.m) {\n placed.push({ id, d: item.d, m: item.m });\n cursor = Math.max(cursor, item.m.y + item.m.h + 1);\n }\n }\n const pending = Object.entries(layout.items)\n .filter(([, item]) => options.reset || !item.m)\n .map(([id, item]) => ({ id, rect: item.d }));\n const cols = GRID_COLUMNS.m;\n\n // An item is layered on a larger item that covers at least half of it (a caption card on a\n // photo, a shape behind a portrait). Those follow their host; everything else stacks.\n const area = (r: GridRect) => r.w * r.h;\n const all = Object.entries(layout.items).map(([id, item]) => ({ id, d: item.d }));\n const hostOf = new Map<string, string>();\n for (const { id, rect } of pending) {\n const host = all\n .filter((o) => {\n const hb = blocks.get(o.id);\n return (\n o.id !== id &&\n !!hb &&\n !isTextBlock(hb) &&\n area(o.d) > area(rect) &&\n coverage(rect, o.d) >= 0.5\n );\n })\n .sort((x, y) => coverage(rect, y.d) - coverage(rect, x.d) || area(y.d) - area(x.d))[0];\n if (host) hostOf.set(id, host.id);\n }\n const placedById = new Map(placed.map((pl) => [pl.id, pl]));\n const place = (id: string, d: GridRect, m: GridRect) => {\n out[id] = { ...out[id], d, m } as GridItem;\n const entry = { id, d, m };\n placed.push(entry);\n placedById.set(id, entry);\n cursor = Math.max(cursor, m.y + m.h + 1);\n };\n\n const layer = (it: { id: string; rect: GridRect }, host: { d: GridRect; m: GridRect }) => {\n const d = it.rect;\n const block = blocks.get(it.id);\n const z = d.z !== undefined ? { z: d.z } : {};\n const ratio = Math.max(0, (d.y - host.d.y) / host.d.h);\n let m: GridRect;\n if (!block || isTextBlock(block)) {\n // Text panels sit on the lower part of their photo, full width of it.\n const offset = Math.min(\n host.m.h - 1,\n Math.max(Math.ceil(host.m.h * 0.6), Math.round(ratio * host.m.h)),\n );\n m = {\n x: host.m.x,\n y: host.m.y + offset,\n w: host.m.w,\n h: mobileHeight(block, d, width),\n ...z,\n };\n } else {\n const w = Math.min(cols, Math.max(2, Math.round((d.w / host.d.w) * host.m.w)));\n const x = host.m.x + Math.round(((d.x - host.d.x) / host.d.w) * host.m.w);\n m = {\n x: Math.min(Math.max(1, x), cols - w + 1),\n y: host.m.y + Math.round(ratio * host.m.h),\n w,\n h: Math.max(2, Math.round((d.h / host.d.h) * host.m.h)),\n ...z,\n };\n }\n place(it.id, d, m);\n return m;\n };\n /** Place everything layered on `hostId` (recursively), right after the host. */\n const placeLayered = (hostId: string, depth = 0) => {\n const host = placedById.get(hostId);\n if (!host || depth > 4) return;\n for (const it of pending) {\n if (hostOf.get(it.id) !== hostId || placedById.has(it.id)) continue;\n layer(it, host);\n placeLayered(it.id, depth + 1);\n }\n };\n\n // Items layered on stored (kept) placements.\n for (const pl of [...placed]) placeLayered(pl.id);\n // Stack the items that aren't layered on anything in reading order, each followed by its layers.\n // Reading order is computed over the items that stack, so a panel layered across two columns\n // doesn't merge them.\n for (const { id, rect: d } of readingOrder(pending.filter((it) => !hostOf.has(it.id)))) {\n if (placedById.has(id)) continue;\n const block = blocks.get(id);\n const m: GridRect = { x: 1, y: cursor, w: cols, h: mobileHeight(block, d, width) };\n if (d.z !== undefined) m.z = d.z;\n if (block && !isTextBlock(block) && d.bleed) m.bleed = \"both\";\n place(id, d, m);\n placeLayered(id);\n }\n // Anything left (layered on an item that is itself unplaced): stack it.\n for (const it of pending) {\n if (placedById.has(it.id)) continue;\n const block = blocks.get(it.id);\n place(it.id, it.rect, { x: 1, y: cursor, w: cols, h: mobileHeight(block, it.rect, width) });\n }\n return out;\n}\n\n/** Rows needed to hold every mobile placement. */\nexport function mobileRowCount(items: Record<string, GridItem>): number {\n let rows = 1;\n for (const item of Object.values(items))\n if (item.m) rows = Math.max(rows, item.m.y + item.m.h - 1);\n return rows;\n}\n\n/**\n * `grid.place` operations that store the generated mobile placements of a section (for Studio's\n * \"Reset mobile layout\" and the MCP tool). `page` is a page id or `\"footer\"`.\n */\nexport function autoMobileLayoutOps(\n doc: SiteDocument,\n page: string,\n sectionId: string,\n options: AutoMobileOptions & CheckOptions = {},\n): Op[] {\n const section = findSection(doc, page as never, sectionId)?.section;\n if (!section) throw new Error(`Section ${sectionId} not found on ${page}`);\n const items = autoMobileLayout(section, options);\n if (!items) return [];\n const meta = opMeta(options);\n const layout = section.layout as Extract<Section[\"layout\"], { mode: \"grid\" }>;\n const ops: Op[] = [];\n for (const [block, item] of Object.entries(items)) {\n if (!item.m) continue;\n const before = layout.items[block as keyof typeof layout.items]?.m;\n if (before && JSON.stringify(before) === JSON.stringify(item.m)) continue;\n ops.push({\n op: \"grid.place\",\n ...meta(),\n page: page as never,\n section: sectionId as never,\n block: block as never,\n bp: \"m\",\n rect: item.m,\n });\n }\n return ops;\n}\n","import type { Block, RichTextDoc, Section, StyleChoices } from \"@omniharmonic/openspace-schema\";\nimport { contrastRatio, toHex } from \"@omniharmonic/openspace-theme\";\nimport { NON_TEXT_BLOCKS } from \"./content\";\n\n/**\n * Worst-case contrast of text drawn over a photo or video section background (doc 04 §3.3).\n *\n * A photograph can be any brightness anywhere, so the only colour we can rely on behind the\n * text is the scrim: the overlay colour at its opacity, composited over the photo. The worst\n * cases are the overlay blended over pure black and over pure white; text must reach its WCAG\n * minimum against both. Blocks with their own colour theme sit on a panel and are skipped.\n */\n\nexport interface PhotoTextCheck {\n /** Theme role the text is drawn in (`heading`, `text`, `link`, `text-muted`). */\n role: string;\n /** What the text is, in plain language (\"Eyebrow\", \"Body text\"). */\n label: string;\n /** Minimum ratio: 3 for large headings, 4.5 for everything else. */\n min: number;\n}\n\nexport interface PhotoContrastFailure extends PhotoTextCheck {\n ratio: number;\n blockId: string;\n}\n\nconst SOLID_PRIMARY: ReadonlySet<StyleChoices[\"buttons\"]> = new Set([\"solid\", \"pill-solid\"]);\n\nfunction richChecks(doc: RichTextDoc | undefined, out: PhotoTextCheck[]) {\n const walk = (nodes: unknown[]) => {\n for (const n of nodes as {\n type: string;\n attrs?: { preset?: string };\n content?: unknown[];\n marks?: { type: string }[];\n }[]) {\n if (n.type === \"heading\") out.push({ role: \"heading\", label: \"Heading\", min: 3 });\n else if (n.type === \"paragraph\" && n.attrs?.preset === \"eyebrow\")\n out.push({ role: \"text-muted\", label: \"Eyebrow\", min: 4.5 });\n else if (n.type === \"paragraph\") out.push({ role: \"text\", label: \"Body text\", min: 4.5 });\n if (n.type === \"text\" && n.marks?.some((m) => m.type === \"link\"))\n out.push({ role: \"link\", label: \"Link\", min: 4.5 });\n if (n.content) walk(n.content);\n }\n };\n if (doc?.content) walk(doc.content);\n}\n\n/** The text colours a block draws directly on the section background. */\nexport function photoTextChecks(block: Block, buttons: StyleChoices[\"buttons\"]): PhotoTextCheck[] {\n if (NON_TEXT_BLOCKS.has(block.type)) return [];\n const f = block.fields as Record<string, unknown>;\n const out: PhotoTextCheck[] = [];\n switch (block.type) {\n case \"heading\":\n out.push({ role: \"heading\", label: \"Heading\", min: 3 });\n if (f.eyebrow) out.push({ role: \"link\", label: \"Eyebrow\", min: 4.5 });\n if (f.subheading) out.push({ role: \"text\", label: \"Introduction\", min: 4.5 });\n break;\n case \"text\":\n richChecks(f.content as RichTextDoc, out);\n break;\n case \"button\": {\n const role = (f.role as string) ?? \"primary\";\n if (role === \"primary\" && !SOLID_PRIMARY.has(buttons))\n out.push({ role: \"link\", label: \"Button label\", min: 4.5 });\n else if (role !== \"primary\") out.push({ role: \"text\", label: \"Button label\", min: 4.5 });\n if (f.secondaryLabel) out.push({ role: \"text\", label: \"Second button label\", min: 4.5 });\n if (f.note) out.push({ role: \"text-muted\", label: \"Button note\", min: 4.5 });\n break;\n }\n default:\n out.push({ role: \"text\", label: \"Text\", min: 4.5 });\n }\n return out;\n}\n\nfunction rgb(hex: string): [number, number, number] {\n const h = toHex(hex).replace(\"#\", \"\");\n return [0, 2, 4].map((i) => Number.parseInt(h.slice(i, i + 2), 16)) as [number, number, number];\n}\n\n/** `color` at `opacity` composited over `under` (sRGB, as browsers paint an overlay). */\nexport function blendOver(color: string, opacity: number, under: string): string {\n const a = rgb(color);\n const b = rgb(under);\n const mix = a.map((c, i) => Math.round(c * opacity + (b[i] as number) * (1 - opacity)));\n return `#${mix.map((c) => c.toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\n/** Contrast of `text` against the scrim over the darkest and brightest possible photo. */\nexport function worstCaseRatio(text: string, overlay: string, opacity: number): number {\n return Math.min(\n contrastRatio(text, blendOver(overlay, opacity, \"#000000\")),\n contrastRatio(text, blendOver(overlay, opacity, \"#ffffff\")),\n );\n}\n\n/**\n * Text in a photo-background section that can fail contrast somewhere on the photo, plus the\n * smallest overlay opacity (in 5% steps) that makes every piece pass, if there is one.\n */\nexport function photoContrast(\n section: Section,\n roles: Record<string, string>,\n overlay: string,\n opacity: number,\n buttons: StyleChoices[\"buttons\"],\n): { failures: PhotoContrastFailure[]; minOpacity: number | undefined } {\n const checks: (PhotoTextCheck & { blockId: string; color: string })[] = [];\n for (const b of section.blocks) {\n if (b.style?.colorTheme) continue;\n for (const c of photoTextChecks(b, buttons)) {\n const color = roles[c.role];\n if (color) checks.push({ ...c, blockId: b.id, color });\n }\n }\n const failing = (alpha: number) =>\n checks\n .map((c) => ({ ...c, ratio: worstCaseRatio(c.color, overlay, alpha) }))\n .filter((c) => c.ratio < c.min);\n const failures = failing(opacity).map(({ color: _c, ...rest }) => rest);\n let minOpacity: number | undefined;\n if (failures.length)\n for (let a = Math.ceil(opacity * 20) / 20; a <= 0.95 + 1e-9; a += 0.05)\n if (failing(a).length === 0) {\n minOpacity = Math.round(a * 100) / 100;\n break;\n }\n return { failures, minOpacity };\n}\n","import { copyViolations, getPreset } from \"@omniharmonic/openspace-blocks\";\nimport { FOOTER, type Op, type SiteDocument } from \"@omniharmonic/openspace-ops\";\nimport {\n type Block,\n COLOR_THEMES,\n type ColorTheme,\n fallbackMobileRects,\n type GridRect,\n type Page,\n type RichTextDoc,\n type Section,\n} from \"@omniharmonic/openspace-schema\";\nimport {\n compileStyles,\n contrastRatio,\n flattenDtcg,\n getPairing,\n nearestAccessible,\n pairingFamilies,\n type ThemeTokens,\n} from \"@omniharmonic/openspace-theme\";\nimport {\n ACTION_BLOCKS,\n blockDisplayWidth,\n blocksInOrder,\n blockText,\n cropAspect,\n headingsOf,\n imageDisplayWidth,\n imagesIn,\n isTextBlock,\n type OutlineHeading,\n} from \"./content\";\nimport { type CheckOptions, type Issue, issue, opMeta, sortIssues } from \"./issue\";\nimport { linkIssues } from \"./links\";\nimport { autoMobileLayout } from \"./mobile\";\nimport { photoContrast } from \"./photo-contrast\";\n\n/**\n * Studio's Design check (doc 04 §9): contrast failures, more than two typefaces, headings out of\n * order, empty sections, oversized images, missing alt text, overlapping text in grid sections,\n * pages without a clear call to action, more than one primary action per section, section color\n * rhythm (more than three in a row; flipping every section), copy outside a preset's\n * recommended range, photo backgrounds without a scrim, mixed image shapes in a section and\n * internal links that lead nowhere (the same rule `openspace check` fails a publish on).\n *\n * With `pageId`, page-level checks run for that page only (site-wide checks — styles, the\n * footer — always run). Issues come back sorted errors → warnings → info.\n */\nexport function designCheck(\n doc: SiteDocument,\n pageId?: string,\n options: CheckOptions = {},\n): Issue[] {\n const ctx = new Ctx(doc, options);\n ctx.site();\n const pages = pageId\n ? [doc.pages[pageId as Page[\"id\"]]].filter((p): p is Page => !!p)\n : Object.values(doc.pages);\n if (pageId && pages.length === 0) throw new Error(`Page ${pageId} not found`);\n for (const page of pages) ctx.page(page);\n ctx.container(FOOTER, [doc.site.footer], { footer: true });\n ctx.issues.push(...linkIssues(doc, pageId, options, ctx.meta));\n return sortIssues(ctx.issues);\n}\n\nconst LIGHT = new Set<ColorTheme>([\"light\", \"light-accent\"]);\nconst themeOf = (s: Section): ColorTheme => s.style.colorTheme ?? \"light\";\nconst visible = (sections: readonly Section[]) => sections.filter((s) => !s.hidden);\nconst PHOTO_BLOCKS = new Set([\"image\", \"gallery\", \"video\", \"before-after\", \"map\"]);\nconst RESPONSIVE_HOSTS = /^https:\\/\\/(?:images\\.unsplash\\.com|[^/]+\\.imgix\\.net)\\//;\n\nclass Ctx {\n issues: Issue[] = [];\n meta: ReturnType<typeof opMeta>;\n tokens: ThemeTokens;\n\n constructor(\n readonly doc: SiteDocument,\n options: CheckOptions,\n ) {\n this.meta = opMeta(options);\n this.tokens = compileStyles(doc.styles).tokens;\n }\n\n add(i: Parameters<typeof issue>[0]) {\n this.issues.push(issue(i));\n }\n\n // --- site-wide ------------------------------------------------------------------------------\n\n site() {\n this.contrast();\n this.families();\n }\n\n /** Color pairs that fail WCAG AA: unfixable ones (errors) and overrides the solver had to move. */\n contrast() {\n const styles = this.doc.styles;\n const solved = compileStyles(styles);\n for (const f of solved.contrast.failures) {\n this.add({\n rule: \"contrast\",\n severity: \"error\",\n key: `${f.theme}:${f.fg}:${f.bg}`,\n message: `In the ${f.theme} color theme, ${f.fg} on ${f.bg} has a contrast of ${f.ratio}:1; it needs ${f.required}:1 to be readable.`,\n fix: `Choose a brand color with more contrast, or set ${f.fg} to ${f.suggestion}.`,\n });\n }\n if (!styles.overrides) return;\n const overridden = new Map<string, string>(); // \"theme:role\" → override path\n for (const t of flattenDtcg(styles.overrides)) {\n const [group, a, b] = t.path;\n if (group !== \"color\" || !a) continue;\n if (b && (COLOR_THEMES as readonly string[]).includes(a))\n overridden.set(`${a}:${b}`, t.path.join(\".\"));\n else if (b && a === \"all\")\n for (const th of COLOR_THEMES) overridden.set(`${th}:${b}`, t.path.join(\".\"));\n else if (!b) overridden.set(`light:${a}`, t.path.join(\".\"));\n }\n const raw = compileStyles(styles, { solve: false });\n // One issue per overridden color: fix it against every surface it fails on.\n const groups = new Map<\n string,\n { theme: ColorTheme; target: string; fixFg: boolean; failures: typeof raw.contrast.failures }\n >();\n for (const f of raw.contrast.failures) {\n const fixFg = overridden.has(`${f.theme}:${f.fg}`);\n if (!fixFg && !overridden.has(`${f.theme}:${f.bg}`)) continue;\n const target = fixFg ? f.fg : f.bg;\n const key = `${f.theme}:${target}`;\n const g = groups.get(key) ?? { theme: f.theme, target, fixFg, failures: [] };\n g.failures.push(f);\n groups.set(key, g);\n }\n for (const [key, g] of groups) {\n const first = g.failures[0];\n if (!first) continue;\n let value = g.fixFg ? first.fgColor : first.bgColor;\n for (let pass = 0; pass < 3; pass++)\n for (const f of g.failures) {\n const other = g.fixFg ? f.bgColor : f.fgColor;\n if (contrastRatio(value, other) < f.required)\n value = nearestAccessible(value, other, f.required + 0.05);\n }\n const pairs = g.failures\n .map((f) => `${f.fg} on ${f.bg} (${f.ratio}:1, needs ${f.required}:1)`)\n .join(\"; \");\n const ops: Op[] = [\n {\n op: \"styles.patch\",\n ...this.meta(),\n patch: {\n set: { [`overrides.color.${g.theme}.${g.target}`]: { $value: value, $type: \"color\" } },\n },\n },\n ];\n this.add({\n rule: \"contrast-override\",\n severity: \"warning\",\n key,\n message: `Your custom ${g.target} color is hard to read in the ${g.theme} theme: ${pairs}. It's adjusted automatically when published.`,\n fix: `Use ${value}, the nearest accessible shade, so what you see is what's published.`,\n autofix: { label: \"Use the nearest accessible color\", ops },\n });\n }\n }\n\n /** More than two type families (pairing + overrides + custom CSS). */\n families() {\n const families = new Map<string, string>(); // family (lowercase) → where\n const pairing = getPairing(this.doc.styles.choices.pairing);\n if (pairing)\n for (const f of pairingFamilies(pairing)) families.set(f.family.toLowerCase(), \"pairing\");\n const overridePaths: string[] = [];\n for (const t of flattenDtcg(this.doc.styles.overrides)) {\n if (t.path[t.path.length - 1] !== \"fontFamily\" && t.type !== \"fontFamily\") continue;\n const v = t.token.$value;\n const first = (Array.isArray(v) ? v[0] : v) as unknown;\n if (typeof first !== \"string\" || first.startsWith(\"{\")) continue;\n families.set(first.replace(/[\"']/g, \"\").trim().toLowerCase(), \"override\");\n overridePaths.push(`overrides.${t.path.join(\".\")}`);\n }\n const generic =\n /^(?:serif|sans-serif|monospace|cursive|fantasy|system-ui|ui-[a-z-]+|inherit|initial|unset)$/;\n for (const m of (this.doc.site.customCss ?? \"\").matchAll(/font-family\\s*:\\s*([^;}]+)/gi)) {\n const first = (m[1] ?? \"\").split(\",\")[0]?.replace(/[\"']/g, \"\").trim().toLowerCase() ?? \"\";\n if (!first || generic.test(first) || first.startsWith(\"var(\")) continue;\n families.set(first, \"custom CSS\");\n }\n if (families.size <= 2) return;\n this.add({\n rule: \"too-many-typefaces\",\n severity: \"warning\",\n message: `The site uses ${families.size} typefaces (${[...families.keys()].join(\", \")}). More than two makes pages feel busy.`,\n fix: \"Pick a different type pairing in Site Styles instead of changing fonts block by block.\",\n ...(overridePaths.length\n ? {\n autofix: {\n label: \"Remove custom fonts and keep the pairing\",\n ops: [{ op: \"styles.patch\", ...this.meta(), patch: { unset: overridePaths } } as Op],\n },\n }\n : {}),\n });\n }\n\n // --- pages ------------------------------------------------------------------------------------\n\n page(page: Page) {\n const sections = visible(page.sections);\n this.container(page.id, sections, { footer: false });\n this.headings(page, sections);\n this.cta(page, sections);\n this.rhythm(page, sections);\n }\n\n container(page: string, sections: readonly Section[], o: { footer: boolean }) {\n for (const section of visible(sections)) {\n this.empty(page, section, o.footer);\n this.images(page, section);\n this.overlap(page, section);\n this.primaryActions(page, section);\n this.copyLength(page, section);\n this.background(page, section);\n }\n }\n\n headings(page: Page, sections: readonly Section[]) {\n const outline: (OutlineHeading & { section: string })[] = [];\n for (const s of sections)\n for (const b of blocksInOrder(s))\n for (const h of headingsOf(b)) outline.push({ ...h, section: s.id });\n const h1s = outline.filter((h) => h.level === 1);\n if (outline.length && h1s.length === 0) {\n this.add({\n rule: \"heading-missing-h1\",\n severity: \"warning\",\n page: page.id,\n message: `“${page.title}” has no main heading (Heading 1).`,\n fix: \"Make the first heading on the page a Heading 1 — usually the hero headline.\",\n });\n }\n for (const extra of h1s.slice(1)) {\n const fix = this.relevel(page.id, extra, 2);\n this.add({\n rule: \"heading-multiple-h1\",\n severity: \"warning\",\n page: page.id,\n section: extra.section,\n block: extra.blockId,\n key: extra.text,\n message: `“${extra.text}” is a second Heading 1 on this page. Use one Heading 1 per page.`,\n fix: \"Change it to a Heading 2; the visual size can stay the same.\",\n ...(fix ? { autofix: { label: \"Change to Heading 2\", ops: fix } } : {}),\n });\n }\n let prev = 0;\n for (const h of outline) {\n if (prev && h.level > prev + 1) {\n const fix = this.relevel(page.id, h, prev + 1);\n this.add({\n rule: \"heading-order\",\n severity: \"warning\",\n page: page.id,\n section: h.section,\n block: h.blockId,\n key: `${h.text}:${h.level}`,\n message: `“${h.text || \"Untitled\"}” jumps from Heading ${prev} to Heading ${h.level}, skipping a level.`,\n fix: h.editable\n ? `Make it a Heading ${prev + 1}, or add a Heading ${prev + 1} above it.`\n : `Add a Heading ${prev + 1} above it (for example a section heading).`,\n ...(fix ? { autofix: { label: `Change to Heading ${prev + 1}`, ops: fix } } : {}),\n });\n }\n prev = h.level;\n }\n }\n\n /** Ops that change one heading's level (heading blocks, rich text, `headingLevel` fields). */\n relevel(page: string, h: OutlineHeading & { section: string }, level: number): Op[] | undefined {\n if (!h.editable) return undefined;\n const block = this.blockById(page, h.blockId);\n if (!block) return undefined;\n const base = {\n op: \"block.update\" as const,\n ...this.meta(),\n page: page as never,\n block: block.id,\n };\n if (block.type === \"heading\") return [{ ...base, set: { level: `h${level}` } }];\n if (block.type === \"text\") {\n const content = structuredClone(block.fields.content as RichTextDoc);\n const node = content.content.find(\n (n) => n.type === \"heading\" && n.attrs.level === h.level && plain(n) === h.text,\n );\n if (node?.type !== \"heading\") return undefined;\n node.attrs = { ...node.attrs, level: level as 1 | 2 | 3 | 4 };\n return [{ ...base, set: { content } }];\n }\n if (level >= 2 && level <= 4) return [{ ...base, set: { headingLevel: `h${level}` } }];\n return undefined;\n }\n\n blockById(page: string, id: string): Block | undefined {\n const sections =\n page === FOOTER\n ? [this.doc.site.footer]\n : (this.doc.pages[page as Page[\"id\"]]?.sections ?? []);\n for (const s of sections) for (const b of s.blocks) if (b.id === id) return b;\n return undefined;\n }\n\n empty(page: string, section: Section, footer: boolean) {\n const empty =\n section.blocks.length === 0 || section.blocks.every((b) => isTextBlock(b) && !blockText(b));\n if (!empty) return;\n this.add({\n rule: \"empty-section\",\n severity: \"warning\",\n page,\n section: section.id,\n message: section.blocks.length\n ? \"This section's blocks are all empty.\"\n : \"This section is empty.\",\n fix: footer ? \"Add your details to the footer.\" : \"Add content or delete the section.\",\n ...(!footer\n ? {\n autofix: {\n label: \"Delete the section\",\n ops: [\n {\n op: \"section.delete\",\n ...this.meta(),\n page: page as never,\n section: section.id,\n } as Op,\n ],\n },\n }\n : {}),\n });\n }\n\n images(page: string, section: Section) {\n const aspects = new Set<string>();\n for (const block of section.blocks) {\n if (\n block.type === \"image\" &&\n typeof block.fields.aspect === \"string\" &&\n section.layout.mode === \"stack\"\n )\n aspects.add(block.fields.aspect);\n const blockWidth = blockDisplayWidth(section, block);\n for (const { image, path } of imagesIn(block)) {\n const where = path.length ? path.join(\".\") : \"image\";\n if (!image.alt.trim()) {\n this.add({\n rule: \"missing-alt\",\n severity: \"warning\",\n page,\n section: section.id,\n block: block.id,\n key: where,\n message: `An image in this ${block.type} block has no alt text, so people using screen readers won't know what it shows.`,\n fix: \"Describe what the image is for (e.g. 'Maya adjusting a student's pose'). Only purely decorative images should be left empty.\",\n });\n }\n if (![\"image\", \"gallery\", \"card\", \"columns\", \"before-after\"].includes(block.type)) continue;\n const width =\n image.width ?? this.doc.media[image.src as keyof SiteDocument[\"media\"]]?.width;\n const height =\n image.height ?? this.doc.media[image.src as keyof SiteDocument[\"media\"]]?.height;\n if (!width) continue;\n const display = imageDisplayWidth(block, blockWidth, path);\n const crop = cropAspect(block, section);\n const needed = crop && height ? display * Math.max(1, width / height / crop) : display;\n if (width <= needed * 2 * 1.05) continue;\n const responsive = RESPONSIVE_HOSTS.test(image.src) || !/^https?:/.test(image.src);\n const target = Math.ceil((needed * 2) / 10) * 10;\n const ops = this.resizeOps(page, block, path, image, target);\n this.add({\n rule: \"oversized-image\",\n severity: responsive ? \"info\" : \"warning\",\n page,\n section: section.id,\n block: block.id,\n key: where,\n message: `An image is ${width}px wide but shown at about ${Math.round(needed)}px — more than twice its displayed size${responsive ? \"\" : \", which makes the page slow to load\"}.`,\n fix: `Use a version about ${target}px wide.`,\n ...(ops ? { autofix: { label: `Resize to ${target}px`, ops } } : {}),\n });\n }\n }\n if (aspects.size > 1) {\n this.add({\n rule: \"mixed-aspects\",\n severity: \"info\",\n page,\n section: section.id,\n message: `Images in this section use different shapes (${[...aspects].join(\", \")}).`,\n fix: \"Keep image aspect ratios consistent within a section.\",\n });\n }\n }\n\n /** For imgix/Unsplash URLs: ask for a smaller width (a trivial, lossless fix). */\n resizeOps(\n page: string,\n block: Block,\n path: (string | number)[],\n image: { src: string; width?: number; height?: number },\n target: number,\n ): Op[] | undefined {\n if (!RESPONSIVE_HOSTS.test(image.src) || !image.width || !image.height) return undefined;\n const url = new URL(image.src);\n url.searchParams.set(\"w\", String(target));\n const resized = {\n ...image,\n src: url.toString(),\n width: target,\n height: Math.round((target * image.height) / image.width),\n };\n const [field, ...rest] = path;\n if (field === undefined) return undefined;\n const value = structuredClone(block.fields[field as string]);\n if (rest.length === 0) {\n return [\n {\n op: \"block.update\",\n ...this.meta(),\n page: page as never,\n block: block.id,\n set: { [field]: { ...(value as object), ...resized } },\n },\n ];\n }\n let node = value as Record<string | number, unknown>;\n for (const k of rest.slice(0, -1)) node = node[k] as Record<string | number, unknown>;\n const last = rest[rest.length - 1] as string | number;\n node[last] = { ...(node[last] as object), ...resized };\n return [\n {\n op: \"block.update\",\n ...this.meta(),\n page: page as never,\n block: block.id,\n set: { [field]: value },\n },\n ];\n }\n\n /** Text blocks that overlap other text blocks in a grid, at any breakpoint. */\n overlap(page: string, section: Section) {\n const layout = section.layout;\n if (layout.mode !== \"grid\") return;\n const text = section.blocks.filter(isTextBlock);\n const fallback = fallbackMobileRects(layout);\n const rectAt = (id: string, bp: \"d\" | \"t\" | \"m\"): GridRect | undefined => {\n const item = layout.items[id as keyof typeof layout.items];\n if (!item) return undefined;\n if (bp === \"d\") return item.d;\n if (bp === \"t\") return item.t ?? item.d;\n return item.m ?? fallback[id];\n };\n const names = { d: \"desktop\", t: \"tablet\", m: \"mobile\" } as const;\n for (const bp of [\"d\", \"t\", \"m\"] as const) {\n if (bp === \"t\" && !Object.values(layout.items).some((i) => i.t)) continue;\n for (let i = 0; i < text.length; i++)\n for (let j = i + 1; j < text.length; j++) {\n const a = text[i] as Block;\n const b = text[j] as Block;\n const ra = rectAt(a.id, bp);\n const rb = rectAt(b.id, bp);\n if (!ra || !rb || !overlaps(ra, rb)) continue;\n let autofix: Issue[\"autofix\"];\n if (bp === \"m\") {\n const items = autoMobileLayout(section, { reset: true });\n if (items) {\n autofix = {\n label: \"Re-stack the mobile layout\",\n ops: Object.entries(items).flatMap(([block, item]) =>\n item.m\n ? [\n {\n op: \"grid.place\",\n ...this.meta(),\n page: page as never,\n section: section.id,\n block: block as never,\n bp: \"m\",\n rect: item.m,\n } as Op,\n ]\n : [],\n ),\n };\n }\n }\n this.add({\n rule: \"overlapping-text\",\n severity: \"error\",\n page,\n section: section.id,\n block: b.id,\n key: `${bp}:${a.id}`,\n message: `Two text blocks (${a.type} and ${b.type}) overlap on ${names[bp]}, so neither can be read properly.`,\n fix: `Move one of them in the ${names[bp]} layout, or put the text on an image instead of on other text.`,\n ...(autofix ? { autofix } : {}),\n });\n }\n // Text drawn over a photo needs its own panel (a block color theme) to stay legible.\n const media = section.blocks.filter((x) => PHOTO_BLOCKS.has(x.type));\n for (const t of text) {\n const rt = rectAt(t.id, bp);\n let hidden = false;\n for (const m of media) {\n const rm = rectAt(m.id, bp);\n if (!rt || !rm || (rm.z ?? 1) <= (rt.z ?? 1) || !covers(rm, rt)) continue;\n hidden = true;\n this.add({\n rule: \"text-hidden\",\n severity: \"error\",\n page,\n section: section.id,\n block: t.id,\n key: `${bp}:${m.id}`,\n message: `A ${t.type} block is completely covered by a ${m.type} on ${names[bp]}, so visitors can't see it.`,\n fix: `Bring the ${t.type} to the front (a higher layer than the ${m.type}) or move it off the ${m.type}.`,\n });\n break;\n }\n if (hidden || t.style?.colorTheme) continue;\n for (const m of media) {\n const rm = rectAt(m.id, bp);\n if (!rt || !rm || !overlaps(rt, rm) || (rt.z ?? 1) < (rm.z ?? 1)) continue;\n this.add({\n rule: \"text-over-photo\",\n severity: \"warning\",\n page,\n section: section.id,\n block: t.id,\n key: `${bp}:${m.id}`,\n message: `A ${t.type} block sits directly on a photo on ${names[bp]}, where busy areas make it hard to read.`,\n fix: \"Give the block its own color theme (a solid panel), or move it off the photo.\",\n autofix: {\n label: \"Put the text on a panel\",\n ops: [\n {\n op: \"block.update\",\n ...this.meta(),\n page: page as never,\n block: t.id,\n style: {\n ...(t.style ?? {}),\n colorTheme: themeOf(section),\n padding: t.style?.padding ?? { d: \"lg\", m: \"md\" },\n },\n } as Op,\n ],\n },\n });\n break;\n }\n }\n }\n }\n\n primaryActions(page: string, section: Section) {\n const primaries = section.blocks.filter(\n (b) => b.type === \"button\" && (b.fields.role ?? \"primary\") === \"primary\",\n );\n for (const extra of primaries.slice(1)) {\n this.add({\n rule: \"multiple-primary-actions\",\n severity: \"warning\",\n page,\n section: section.id,\n block: extra.id,\n message: `This section has ${primaries.length} primary buttons. One main action per screenful is clearer.`,\n fix: \"Make the other actions secondary or tertiary.\",\n autofix: {\n label: \"Make it a secondary button\",\n ops: [\n {\n op: \"block.update\",\n ...this.meta(),\n page: page as never,\n block: extra.id,\n set: { role: \"secondary\" },\n } as Op,\n ],\n },\n });\n }\n }\n\n copyLength(page: string, section: Section) {\n if (!section.preset) return;\n const preset = getPreset(section.preset);\n if (!preset || preset.target === \"header\" || !preset.copy.length) return;\n for (const v of copyViolations(section, preset.copy)) {\n const [min, max] = v.rule.words;\n this.add({\n rule: \"copy-length\",\n severity: v.direction === \"long\" ? \"warning\" : \"info\",\n page,\n section: section.id,\n block: v.blockId,\n key: `${v.rule.slot}:${v.item ?? 0}`,\n message: `${v.rule.label} is ${v.words} word${v.words === 1 ? \"\" : \"s\"}; this layout is designed for ${min}–${max}.`,\n fix:\n v.direction === \"long\"\n ? \"Shorten it rather than making the text smaller.\"\n : \"Add a little more detail so the layout feels balanced.\",\n });\n }\n }\n\n /** Photo/video backgrounds behind text need a scrim; exact background colors need contrast. */\n background(page: string, section: Section) {\n const bg = section.style.background;\n if (!bg || bg.type === \"none\") return;\n const hasText = section.blocks.some((b) => isTextBlock(b) && !b.style?.colorTheme);\n if (!hasText) return;\n if (bg.type === \"image\" || bg.type === \"video\") {\n // A missing overlay is a 0% scrim; text must still pass over any photo.\n const overlay = bg.overlay ?? { color: \"background\", opacity: 0 };\n const minOpacity = this.photoText(page, section, overlay);\n if (overlay.opacity < 0.35) {\n const target = Math.max(0.35, minOpacity ?? 0.35);\n this.add({\n rule: \"photo-without-scrim\",\n severity: \"warning\",\n page,\n section: section.id,\n message:\n \"Text sits directly on a photo background, which is hard to read on busy or bright areas.\",\n fix:\n minOpacity === null\n ? \"Put the text on a panel (a block color theme): no overlay keeps it readable over every photo.\"\n : `Add an overlay of at least ${Math.round(target * 100)}% (the section's background color works well).`,\n ...(minOpacity === null\n ? {}\n : {\n autofix: {\n label: `Add a ${Math.round(target * 100)}% overlay`,\n ops: [\n {\n op: \"section.update\",\n ...this.meta(),\n page: page as never,\n section: section.id,\n set: {\n \"style.background.overlay\": { color: overlay.color, opacity: target },\n },\n } as Op,\n ],\n },\n }),\n });\n }\n return;\n }\n const theme = themeOf(section);\n const colors = this.tokens.themes[theme];\n const stops =\n bg.type === \"color\" ? [bg.color] : [bg.from, bg.via, bg.to].filter((c): c is string => !!c);\n for (const stop of stops) {\n const color = this.resolveColor(stop, theme);\n if (!color) continue;\n const ratio = contrastRatio(colors.text, color);\n if (ratio >= 4.5) continue;\n this.add({\n rule: \"background-contrast\",\n severity: \"error\",\n page,\n section: section.id,\n key: stop,\n message: `The section background (${stop}) leaves body text at ${ratio.toFixed(2)}:1 contrast; it needs 4.5:1.`,\n fix: `Use a color theme instead of a custom background, or a background close to ${nearestAccessible(color, colors.text)}.`,\n });\n }\n }\n\n /**\n * Text over a photo/video background must pass WCAG against the scrim blended over both the\n * darkest and the brightest possible photo (the photo itself can be anything).\n */\n /**\n * Returns the smallest overlay opacity at which every text colour passes (`undefined` when\n * nothing fails or the overlay colour is unknown, `null` when no opacity is enough).\n */\n photoText(\n page: string,\n section: Section,\n overlay: { color: string; opacity: number },\n ): number | null | undefined {\n const theme = themeOf(section);\n const roles = this.tokens.themes[theme] as unknown as Record<string, string>;\n const color = this.resolveColor(overlay.color, theme);\n if (!color) {\n this.add({\n rule: \"photo-overlay-color\",\n severity: \"warning\",\n page,\n section: section.id,\n message: `The photo overlay color “${overlay.color}” isn't a color or theme role, so text contrast over the photo can't be checked.`,\n fix: \"Use a theme role such as background, or a CSS color.\",\n });\n return undefined;\n }\n const { failures, minOpacity } = photoContrast(\n section,\n roles,\n color,\n overlay.opacity,\n this.doc.styles.choices.buttons,\n );\n if (failures.length === 0) return overlay.opacity;\n const worst = new Map<string, (typeof failures)[number]>();\n for (const f of failures) {\n const key = `${f.blockId}:${f.label}`;\n const prev = worst.get(key);\n if (!prev || f.ratio < prev.ratio) worst.set(key, f);\n }\n for (const f of worst.values()) {\n this.add({\n rule: \"text-over-photo-contrast\",\n severity: \"error\",\n page,\n section: section.id,\n block: f.blockId,\n key: f.label,\n message: `${f.label} over the background photo can drop to ${f.ratio.toFixed(2)}:1 contrast on bright or dark parts of the photo; it needs ${f.min}:1.`,\n fix: minOpacity\n ? `Raise the photo overlay to ${Math.round(minOpacity * 100)}%, or put the text on a panel.`\n : \"Put the text on a panel (a block color theme), or use a plain background.\",\n ...(minOpacity\n ? {\n autofix: {\n label: `Raise the overlay to ${Math.round(minOpacity * 100)}%`,\n ops: [\n {\n op: \"section.update\",\n ...this.meta(),\n page: page as never,\n section: section.id,\n set: {\n \"style.background.overlay\": { color: overlay.color, opacity: minOpacity },\n },\n } as Op,\n ],\n },\n }\n : {}),\n });\n }\n return minOpacity ?? null;\n }\n\n resolveColor(value: string, theme: ColorTheme): string | undefined {\n const roles = this.tokens.themes[theme] as Record<string, string>;\n if (roles[value]) return roles[value];\n const m = /^(accent|neutral)-(\\d+)$/.exec(value);\n if (m)\n return (this.tokens.palette[m[1] as \"accent\" | \"neutral\"] as Record<number, string>)[\n Number(m[2])\n ];\n return /^(?:#|oklch|oklab|rgb|hsl|lab|lch)/.test(value) ? value : undefined;\n }\n\n cta(page: Page, sections: readonly Section[]) {\n if (sections.length === 0) return;\n const has = sections.some((s) => s.blocks.some((b) => ACTION_BLOCKS.has(b.type)));\n const navButton = this.doc.site.nav.some((n) => n.type === \"button\" && !n.hidden);\n if (has || navButton) return;\n this.add({\n rule: \"no-call-to-action\",\n severity: \"warning\",\n page: page.id,\n message: `“${page.title}” has no clear call to action — nothing tells visitors what to do next.`,\n fix: \"Add a button, form or signup (a call-to-action section at the end works well).\",\n });\n }\n\n rhythm(page: Page, sections: readonly Section[]) {\n if (sections.length < 5) return;\n let run = 1;\n sections.forEach((s, i) => {\n if (i === 0) return;\n const same = themeOf(s) === themeOf(sections[i - 1] as Section);\n run = same ? run + 1 : 1;\n if (run === 4) {\n const alt: ColorTheme = LIGHT.has(themeOf(s))\n ? themeOf(s) === \"light\"\n ? \"light-accent\"\n : \"light\"\n : themeOf(s) === \"dark\"\n ? \"dark-accent\"\n : \"dark\";\n this.add({\n rule: \"rhythm-repeat\",\n severity: \"warning\",\n page: page.id,\n section: s.id,\n message: `Four sections in a row use the ${themeOf(s)} color theme, so the page reads as one long block.`,\n fix: `Give one of them a different color theme, for example ${alt}.`,\n autofix: {\n label: `Switch this section to ${alt}`,\n ops: [\n {\n op: \"section.update\",\n ...this.meta(),\n page: page.id,\n section: s.id,\n set: { \"style.colorTheme\": alt },\n } as Op,\n ],\n },\n });\n }\n });\n const flips = sections\n .slice(1)\n .filter(\n (s, i) => LIGHT.has(themeOf(s)) !== LIGHT.has(themeOf(sections[i] as Section)),\n ).length;\n if (flips === sections.length - 1) {\n this.add({\n rule: \"rhythm-flipping\",\n severity: \"warning\",\n page: page.id,\n message: \"Every section flips between light and dark, which feels restless.\",\n fix: \"Group related sections on the same or a neighbouring theme (Light → Light accent → Light), and save dark themes for moments that matter.\",\n });\n }\n }\n}\n\n/** `outer` covers every cell of `inner`. */\nfunction covers(outer: GridRect, inner: GridRect): boolean {\n return (\n outer.x <= inner.x &&\n outer.y <= inner.y &&\n outer.x + outer.w >= inner.x + inner.w &&\n outer.y + outer.h >= inner.y + inner.h\n );\n}\n\nfunction overlaps(a: GridRect, b: GridRect): boolean {\n return a.x < b.x + b.w && b.x < a.x + a.w && a.y < b.y + b.h && b.y < a.y + a.h;\n}\n\nfunction plain(node: unknown): string {\n const parts: string[] = [];\n const walk = (n: unknown) => {\n if (!n || typeof n !== \"object\") return;\n const o = n as { type?: string; text?: string; content?: unknown[] };\n if (o.type === \"text\" && o.text) parts.push(o.text);\n if (Array.isArray(o.content)) o.content.forEach(walk);\n };\n walk(node);\n return parts.join(\"\");\n}\n","import type { Op, SiteDocument } from \"@omniharmonic/openspace-ops\";\nimport type { Page } from \"@omniharmonic/openspace-schema\";\nimport { blocksInOrder, blockText, imagesIn } from \"./content\";\nimport { type CheckOptions, type Issue, issue, opMeta, sortIssues } from \"./issue\";\n\n/**\n * SEO check for one page: title and description (presence, length, uniqueness), a social sharing image, thin content, image alt text, vague link labels and\n * no-index pages. Autofixes fill in a missing description from the page's first paragraph and a\n * missing share image from the page's first photo.\n */\nexport function seoCheck(page: Page, doc: SiteDocument, options: CheckOptions = {}): Issue[] {\n const meta = opMeta(options);\n const out: Issue[] = [];\n const add = (i: Parameters<typeof issue>[0]) => out.push(issue({ ...i, page: page.id }));\n const sections = page.sections.filter((s) => !s.hidden);\n const blocks = sections.flatMap((s) => blocksInOrder(s));\n const patch = (set: Record<string, unknown>): Op => ({\n op: \"page.update\",\n ...meta(),\n page: page.id,\n set,\n });\n\n // Title\n const title = effectiveTitle(page, doc);\n if (title.length > 60) {\n add({\n rule: \"seo-title-long\",\n severity: \"warning\",\n message: `The page title in search results is ${title.length} characters (“${title}”); search engines cut it off after about 60.`,\n fix: \"Set a shorter SEO title for this page.\",\n });\n } else if ((page.seo?.title || page.title).trim().length < 4) {\n add({\n rule: \"seo-title-short\",\n severity: \"info\",\n message: `The page title “${page.title}” says very little about the page.`,\n fix: \"Use a descriptive title, e.g. 'Classes & timetable' instead of 'Info'.\",\n });\n }\n const sameTitle = Object.values(doc.pages).filter(\n (p) => p.id !== page.id && effectiveTitle(p, doc) === title,\n );\n if (sameTitle.length) {\n add({\n rule: \"seo-title-duplicate\",\n severity: \"warning\",\n message: `“${title}” is also the title of ${sameTitle.map((p) => p.title).join(\", \")}. Each page needs its own title in search results.`,\n fix: \"Give each page a distinct SEO title.\",\n });\n }\n\n // Description\n const description = page.seo?.description || undefined;\n const firstParagraph = blocks\n .filter((b) => b.type === \"text\" || b.type === \"heading\")\n .map((b) => (b.type === \"heading\" ? String(b.fields.subheading ?? \"\") : blockText(b)))\n .find((t) => t.split(/\\s+/).length >= 8);\n if (!description) {\n const suggestion = firstParagraph ? clip(firstParagraph, 155) : undefined;\n add({\n rule: \"seo-description-missing\",\n severity: doc.site.seo?.description ? \"info\" : \"warning\",\n message: doc.site.seo?.description\n ? \"This page has no description of its own, so search results show the site-wide one.\"\n : \"This page has no description for search results.\",\n fix: \"Write one or two sentences (50–160 characters) about what's on this page.\",\n ...(suggestion\n ? {\n autofix: {\n label: \"Use the page's first paragraph\",\n ops: [patch({ \"seo.description\": suggestion })],\n },\n }\n : {}),\n });\n } else if (description.length < 50 || description.length > 160) {\n add({\n rule: \"seo-description-length\",\n severity: \"info\",\n message: `The description is ${description.length} characters; aim for 50–160 so it isn't cut off or too thin.`,\n fix:\n description.length > 160\n ? \"Shorten the description.\"\n : \"Add a little more detail to the description.\",\n });\n }\n if (description) {\n const same = Object.values(doc.pages).filter(\n (p) => p.id !== page.id && p.seo?.description === description,\n );\n if (same.length) {\n add({\n rule: \"seo-description-duplicate\",\n severity: \"info\",\n message: `${same.map((p) => p.title).join(\", \")} use the same description.`,\n fix: \"Describe each page in its own words.\",\n });\n }\n }\n\n // Heading 1 problems are reported by `designCheck` (heading-missing-h1 / heading-multiple-h1),\n // which owns the page outline; seoCheck doesn't repeat them.\n\n // Share image\n if (!page.seo?.image && !doc.site.seo?.image) {\n const first = blocks\n .flatMap(imagesIn)\n .find(({ image }) => image.width === undefined || image.width >= 600)?.image;\n add({\n rule: \"seo-share-image\",\n severity: \"info\",\n message: \"No image is set for when this page is shared on social media or in messages.\",\n fix: \"Choose a share image in the page's SEO settings.\",\n ...(first\n ? {\n autofix: {\n label: \"Use the page's first photo\",\n ops: [patch({ \"seo.image\": first.src })],\n },\n }\n : {}),\n });\n }\n\n // Thin content\n const words = blocks.map(blockText).join(\" \").split(/\\s+/).filter(Boolean).length;\n if (!page.seo?.noindex && words < 80) {\n add({\n rule: \"seo-thin-content\",\n severity: \"info\",\n message: `The page has about ${words} words of text; search engines have little to go on.`,\n fix: \"Add a short paragraph that explains what's on the page in your own words.\",\n });\n }\n\n // Alt text\n const missingAlt = blocks\n .flatMap((b) => imagesIn(b).map((i) => ({ b, i })))\n .filter(({ i }) => !i.image.alt.trim());\n if (missingAlt.length) {\n add({\n rule: \"seo-image-alt\",\n severity: \"warning\",\n message: `${missingAlt.length} image${missingAlt.length === 1 ? \" has\" : \"s have\"} no alt text, which search engines and screen readers rely on.`,\n fix: \"Describe what each image shows and why it's there.\",\n });\n }\n\n // Vague link labels\n for (const b of blocks.filter((x) => x.type === \"button\")) {\n for (const label of [b.fields.label, b.fields.secondaryLabel]) {\n if (\n typeof label === \"string\" &&\n /^(?:click here|here|read more|learn more|more|link|go)$/i.test(label.trim())\n ) {\n add({\n rule: \"seo-link-text\",\n severity: \"info\",\n block: b.id,\n key: label,\n message: `The button “${label}” doesn't say where it goes.`,\n fix: \"Use a label that names the destination, e.g. 'See the class timetable'.\",\n });\n }\n }\n }\n\n if (page.seo?.noindex) {\n add({\n rule: \"seo-noindex\",\n severity: \"info\",\n message: \"This page is hidden from search engines.\",\n fix: \"Turn off 'Hide from search engines' if people should find it on Google.\",\n autofix: {\n label: \"Show in search engines\",\n ops: [{ op: \"page.update\", ...meta(), page: page.id, unset: [\"seo.noindex\"] }],\n },\n });\n }\n return sortIssues(out);\n}\n\n/** Title as shown in search results (`seo.title` or the page title, through the site template). */\nexport function effectiveTitle(page: Page, doc: SiteDocument): string {\n const base = page.seo?.title || page.title;\n const template = doc.site.seo?.titleTemplate;\n return template?.includes(\"%s\") ? template.replace(\"%s\", base) : base;\n}\n\nfunction clip(text: string, max: number): string {\n if (text.length <= max) return text;\n const cut = text.slice(0, max - 1);\n return `${cut.slice(0, cut.lastIndexOf(\" \"))}…`;\n}\n","/**\n * Template looks for `list_templates` / `apply_template_look`. Sources, in order:\n * 1. the store's injected `templates` catalog (Hub, CLI with a templates folder);\n * 2. an installed `@omniharmonic/openspace-templates` package (the template registry, loaded optionally);\n * 3. built-in looks for the twelve launch templates (doc 04 §7), assembled from the theme\n * package's template pairings and curated palettes — usable before template content ships.\n */\nimport { type StyleChoices, StyleChoicesSchema } from \"@omniharmonic/openspace-schema\";\nimport { curatedPalettes, TYPE_PAIRINGS } from \"@omniharmonic/openspace-theme\";\nimport type { SiteStore, TemplateInfo, TemplateLook } from \"./store\";\n\ntype Mood = Pick<StyleChoices, \"density\" | \"shape\" | \"buttons\" | \"motion\" | \"imageTreatment\">;\n\nconst LAUNCH: Array<{\n id: string;\n name: string;\n persona: string;\n mood: string;\n look: Mood;\n alt: Mood;\n /** Extra palette for the third look when the template has only one of its own. */\n extraPalette: string;\n}> = [\n {\n id: \"meadow\",\n name: \"Meadow\",\n persona: \"Yoga, therapy, bodywork, wellness\",\n mood: \"Calm, airy, organic\",\n look: {\n density: \"airy\",\n shape: \"round\",\n buttons: \"pill-solid\",\n motion: \"subtle\",\n imageTreatment: \"arch\",\n },\n alt: {\n density: \"comfortable\",\n shape: \"soft\",\n buttons: \"pill-outline\",\n motion: \"subtle\",\n imageTreatment: \"rounded\",\n },\n extraPalette: \"lavender\",\n },\n {\n id: \"harbor\",\n name: \"Harbor\",\n persona: \"Nonprofits, community orgs\",\n mood: \"Trustworthy, warm, civic\",\n look: {\n density: \"comfortable\",\n shape: \"soft\",\n buttons: \"solid\",\n motion: \"subtle\",\n imageTreatment: \"rounded\",\n },\n alt: {\n density: \"compact\",\n shape: \"sharp\",\n buttons: \"outline\",\n motion: \"none\",\n imageTreatment: \"none\",\n },\n extraPalette: \"forest\",\n },\n {\n id: \"atelier\",\n name: \"Atelier\",\n persona: \"Photographers, visual artists\",\n mood: \"Gallery-first, minimal chrome\",\n look: {\n density: \"airy\",\n shape: \"sharp\",\n buttons: \"text-arrow\",\n motion: \"subtle\",\n imageTreatment: \"none\",\n },\n alt: {\n density: \"comfortable\",\n shape: \"sharp\",\n buttons: \"underline\",\n motion: \"none\",\n imageTreatment: \"frame\",\n },\n extraPalette: \"ink-blue\",\n },\n {\n id: \"ledger\",\n name: \"Ledger\",\n persona: \"Consultants, coaches, freelancers\",\n mood: \"Crisp, editorial, confident\",\n look: {\n density: \"comfortable\",\n shape: \"sharp\",\n buttons: \"solid\",\n motion: \"subtle\",\n imageTreatment: \"none\",\n },\n alt: {\n density: \"compact\",\n shape: \"soft\",\n buttons: \"text-arrow\",\n motion: \"none\",\n imageTreatment: \"rounded\",\n },\n extraPalette: \"harbor\",\n },\n {\n id: \"hearth\",\n name: \"Hearth\",\n persona: \"Restaurants, cafés, bakeries\",\n mood: \"Warm, appetizing\",\n look: {\n density: \"comfortable\",\n shape: \"soft\",\n buttons: \"pill-solid\",\n motion: \"subtle\",\n imageTreatment: \"rounded\",\n },\n alt: {\n density: \"comfortable\",\n shape: \"round\",\n buttons: \"outline\",\n motion: \"expressive\",\n imageTreatment: \"grain\",\n },\n extraPalette: \"saffron\",\n },\n {\n id: \"signal\",\n name: \"Signal\",\n persona: \"Products, startups, launches\",\n mood: \"Bold, modern, technical\",\n look: {\n density: \"compact\",\n shape: \"soft\",\n buttons: \"solid\",\n motion: \"expressive\",\n imageTreatment: \"rounded\",\n },\n alt: {\n density: \"comfortable\",\n shape: \"round\",\n buttons: \"pill-solid\",\n motion: \"subtle\",\n imageTreatment: \"none\",\n },\n extraPalette: \"lagoon\",\n },\n {\n id: \"field-notes\",\n name: \"Field Notes\",\n persona: \"Writers, newsletters, blogs\",\n mood: \"Reading-first, literary\",\n look: {\n density: \"comfortable\",\n shape: \"sharp\",\n buttons: \"underline\",\n motion: \"none\",\n imageTreatment: \"none\",\n },\n alt: {\n density: \"airy\",\n shape: \"soft\",\n buttons: \"text-arrow\",\n motion: \"subtle\",\n imageTreatment: \"grain\",\n },\n extraPalette: \"sage\",\n },\n {\n id: \"encore\",\n name: \"Encore\",\n persona: \"Musicians, performers, podcasters\",\n mood: \"Expressive, nocturnal\",\n look: {\n density: \"comfortable\",\n shape: \"sharp\",\n buttons: \"solid\",\n motion: \"expressive\",\n imageTreatment: \"duotone\",\n },\n alt: {\n density: \"compact\",\n shape: \"round\",\n buttons: \"pill-outline\",\n motion: \"subtle\",\n imageTreatment: \"none\",\n },\n extraPalette: \"coral\",\n },\n {\n id: \"kiln\",\n name: \"Kiln\",\n persona: \"Makers and small shops\",\n mood: \"Tactile, crafted\",\n look: {\n density: \"comfortable\",\n shape: \"soft\",\n buttons: \"outline\",\n motion: \"subtle\",\n imageTreatment: \"grain\",\n },\n alt: {\n density: \"airy\",\n shape: \"round\",\n buttons: \"pill-solid\",\n motion: \"subtle\",\n imageTreatment: \"blob\",\n },\n extraPalette: \"olive\",\n },\n {\n id: \"commons\",\n name: \"Commons\",\n persona: \"Coalitions, cooperatives, movements\",\n mood: \"Grounded, collective\",\n look: {\n density: \"comfortable\",\n shape: \"soft\",\n buttons: \"solid\",\n motion: \"subtle\",\n imageTreatment: \"rounded\",\n },\n alt: {\n density: \"compact\",\n shape: \"sharp\",\n buttons: \"outline\",\n motion: \"none\",\n imageTreatment: \"none\",\n },\n extraPalette: \"harbor\",\n },\n {\n id: \"vow\",\n name: \"Vow\",\n persona: \"Weddings and celebrations\",\n mood: \"Romantic, refined\",\n look: {\n density: \"airy\",\n shape: \"round\",\n buttons: \"pill-outline\",\n motion: \"subtle\",\n imageTreatment: \"arch\",\n },\n alt: {\n density: \"airy\",\n shape: \"sharp\",\n buttons: \"underline\",\n motion: \"subtle\",\n imageTreatment: \"frame\",\n },\n extraPalette: \"lavender\",\n },\n {\n id: \"link\",\n name: \"Link\",\n persona: \"Link-in-bio, single page\",\n mood: \"Mobile-first, punchy\",\n look: {\n density: \"compact\",\n shape: \"round\",\n buttons: \"pill-solid\",\n motion: \"expressive\",\n imageTreatment: \"circle\",\n },\n alt: {\n density: \"compact\",\n shape: \"soft\",\n buttons: \"solid\",\n motion: \"subtle\",\n imageTreatment: \"rounded\",\n },\n extraPalette: \"electric\",\n },\n];\n\nfunction builtInTemplates(): TemplateInfo[] {\n return LAUNCH.map((t) => {\n const pairing = TYPE_PAIRINGS.find((p) => p.template === t.id)?.id ?? \"fraunces-hanken\";\n const own = curatedPalettes.filter((p) => p.templates?.includes(t.id));\n const extra = curatedPalettes.find((p) => p.id === t.extraPalette);\n const palettes = [...own, ...(extra ? [extra] : [])];\n const pick = (i: number) => palettes[Math.min(i, palettes.length - 1)] ?? curatedPalettes[0];\n const choices = (\n paletteIndex: number,\n mood: Mood,\n contrast: \"standard\" | \"high\" = \"standard\",\n ): StyleChoices => {\n const pal = pick(paletteIndex);\n return {\n palette: {\n brand: pal?.brand ?? \"oklch(0.55 0.12 250)\",\n neutral: pal?.neutral ?? \"warm\",\n contrast,\n source: \"curated\",\n },\n pairing,\n ...mood,\n };\n };\n const looks: TemplateLook[] = [\n {\n id: \"signature\",\n name: `${t.name} — ${pick(0)?.name}`,\n description: `The template's own look: ${t.mood.toLowerCase()}.`,\n choices: choices(0, t.look),\n },\n {\n id: \"alternate\",\n name: `${t.name} — ${pick(1)?.name}`,\n description: \"Same type pairing, a second palette and a different shape and button style.\",\n choices: choices(1, t.alt),\n },\n {\n id: \"high-contrast\",\n name: `${t.name} — ${pick(2)?.name}, high contrast`,\n description: \"AAA contrast (7:1 body text) with a third palette.\",\n choices: choices(2, t.look, \"high\"),\n },\n ];\n return {\n id: t.id,\n name: t.name,\n persona: t.persona,\n mood: t.mood,\n description: `For ${t.persona.toLowerCase()}. ${t.mood}.`,\n tags: [\"built-in\"],\n looks,\n };\n });\n}\n\nconst isRecord = (v: unknown): v is Record<string, unknown> =>\n typeof v === \"object\" && v !== null && !Array.isArray(v);\n\n/** Normalise whatever a template registry exports into `TemplateInfo`. */\nexport function normaliseTemplate(raw: unknown): TemplateInfo | null {\n if (!isRecord(raw)) return null;\n const meta = isRecord(raw.template) ? { ...raw, ...raw.template } : raw;\n const id = typeof meta.id === \"string\" ? meta.id : null;\n if (!id) return null;\n const rawLooks = Array.isArray(meta.looks) ? meta.looks : [];\n const looks: TemplateLook[] = [];\n rawLooks.forEach((l, i) => {\n if (!isRecord(l)) return;\n const candidate = isRecord(l.choices)\n ? l.choices\n : isRecord(l.styles) && isRecord(l.styles.choices)\n ? l.styles.choices\n : l;\n const parsed = StyleChoicesSchema.safeParse(candidate);\n if (!parsed.success) return;\n const name = typeof l.name === \"string\" ? l.name : `Look ${i + 1}`;\n looks.push({\n id:\n typeof l.id === \"string\"\n ? l.id\n : name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\") || `look-${i + 1}`,\n name,\n ...(typeof l.description === \"string\" ? { description: l.description } : {}),\n choices: parsed.data,\n });\n });\n const str = (k: string) => (typeof meta[k] === \"string\" ? (meta[k] as string) : undefined);\n return {\n id,\n name: str(\"name\") ?? id,\n description: str(\"description\"),\n persona: str(\"persona\"),\n mood: str(\"mood\"),\n tags: Array.isArray(meta.tags)\n ? meta.tags.filter((t): t is string => typeof t === \"string\")\n : undefined,\n looks,\n };\n}\n\n/** Read a `@omniharmonic/openspace-templates`-style module (several export shapes are accepted). */\nexport async function templatesFromModule(\n mod: Record<string, unknown>,\n): Promise<TemplateInfo[] | null> {\n let raws: unknown[] | null = null;\n const cat = mod.templateCatalog;\n if (Array.isArray(cat)) raws = cat;\n else if (isRecord(cat) && typeof cat.list === \"function\")\n raws = await (cat.list as () => unknown[])();\n else if (typeof mod.listTemplates === \"function\")\n raws = await (mod.listTemplates as () => unknown[])();\n else if (Array.isArray(mod.templates)) raws = mod.templates;\n else if (isRecord(mod.templates)) raws = Object.values(mod.templates);\n else if (typeof mod.loadTemplate === \"function\") {\n const ids = (mod.TEMPLATE_IDS ?? mod.templateIds) as unknown;\n if (Array.isArray(ids))\n raws = await Promise.all(ids.map((id) => (mod.loadTemplate as (id: unknown) => unknown)(id)));\n }\n if (!raws) return null;\n const out = raws\n .map(normaliseTemplate)\n .filter((t): t is TemplateInfo => !!t && t.looks.length > 0);\n return out.length ? out : null;\n}\n\n/** Optional dependency, resolved at runtime only (the specifier is not a literal for bundlers). */\nconst OPTIONAL_TEMPLATES_PACKAGE = [\"@omniharmonic\", \"openspace-templates\"].join(\"/\");\n\nexport async function loadTemplates(\n store: SiteStore,\n importer: (spec: string) => Promise<unknown> = (spec) => import(/* @vite-ignore */ spec),\n): Promise<{ source: \"store\" | \"package\" | \"built-in\"; templates: TemplateInfo[] }> {\n if (store.templates) return { source: \"store\", templates: await store.templates.list() };\n try {\n const mod = (await importer(OPTIONAL_TEMPLATES_PACKAGE)) as Record<string, unknown>;\n const list = await templatesFromModule(mod);\n if (list) return { source: \"package\", templates: list };\n } catch {\n // Not installed: fall back to the built-in looks.\n }\n return { source: \"built-in\", templates: builtInTemplates() };\n}\n","import { z } from \"zod\";\nimport type { ToolContext } from \"./context\";\n\n/** What a tool handler returns; the server turns it into MCP `content` + `structuredContent`. */\nexport interface ToolOutput {\n /** Human/agent-readable text. Defaults to pretty JSON of `data`. */\n text?: string;\n /** Structured result (also sent as `structuredContent` when it is an object). */\n data?: unknown;\n /** Images (PNG screenshots). */\n images?: Array<{ base64: string; mimeType: string; caption?: string }>;\n}\n\nexport interface ToolAnnotations {\n title?: string;\n readOnlyHint?: boolean;\n destructiveHint?: boolean;\n idempotentHint?: boolean;\n openWorldHint?: boolean;\n}\n\nexport interface ToolDefinition<S extends z.ZodObject = z.ZodObject> {\n name: string;\n title: string;\n description: string;\n input: S;\n annotations: ToolAnnotations;\n handler(ctx: ToolContext, input: z.output<S>): Promise<ToolOutput>;\n}\n\nexport function defineTool<S extends z.ZodObject>(def: ToolDefinition<S>): ToolDefinition<S> {\n return def;\n}\n\n/** Shared argument: the site id (optional when the connection covers one site). */\nexport const siteArg = z\n .string()\n .optional()\n .describe(\"Site id (st_…). Optional when this connection covers exactly one site.\");\n\n/** Page reference: id, slug or title. */\nexport const pageArg = z\n .string()\n .describe('Page id (pg_…), slug (\"\" or \"/\" for home, \"about\") or exact title.');\n\n/** Container reference for block/section tools: a page or \"footer\". */\nexport const containerArg = z\n .string()\n .describe('Page id/slug/title, or \"footer\" for the site footer section.');\n\n/** Insert/move position. */\nexport const positionArg = z\n .union([\n z.int().min(0),\n z.enum([\"start\", \"end\"]),\n z.strictObject({ before: z.string() }),\n z.strictObject({ after: z.string() }),\n ])\n .describe('Where: an index, \"start\", \"end\", {\"before\": id} or {\"after\": id}.');\n\n/** `confirm: true` required by destructive tools. */\nexport const confirmArg = z\n .boolean()\n .optional()\n .describe(\"Must be true. Ask the owner first: this cannot be undone from here.\");\n\nexport const deviceArg = z.enum([\"desktop\", \"tablet\", \"mobile\"]);\n","import {\n getPreset,\n PRESET_CATEGORIES,\n type Preset,\n presetCatalog,\n} from \"@omniharmonic/openspace-blocks\";\nimport { FOOTER } from \"@omniharmonic/openspace-ops\";\nimport {\n type Block,\n type BlockMeta,\n blockFieldsJsonSchema,\n type Page,\n type Section,\n type SiteDocument,\n} from \"@omniharmonic/openspace-schema\";\nimport { compileStyles, getPairing } from \"@omniharmonic/openspace-theme\";\nimport { z } from \"zod\";\nimport { pagePathOf, resolvePage, type ToolContext } from \"../context\";\nimport { ToolError } from \"../errors\";\nimport { blockPreview, blockToAgent } from \"../markdown\";\nimport { containerArg, defineTool, siteArg } from \"../tool\";\n\nexport const listSites = defineTool({\n name: \"list_sites\",\n title: \"List sites\",\n description:\n \"Sites this connection can edit, with their titles and live addresses. Start here when you don't know the site id.\",\n input: z.object({}),\n annotations: { readOnlyHint: true },\n async handler(ctx) {\n const allowed = new Set(await ctx.allowedSites());\n const sites = (await ctx.store.listSites()).filter((s) => allowed.has(s.id));\n return { data: { sites, canPublish: ctx.grant.publish && ctx.store.capabilities.canPublish } };\n },\n});\n\nexport function stylesSummary(doc: SiteDocument) {\n const compiled = compileStyles(doc.styles);\n const pairing = getPairing(doc.styles.choices.pairing);\n return {\n choices: doc.styles.choices,\n pairing: pairing\n ? { id: pairing.id, heading: pairing.heading.family, body: pairing.body.family }\n : { id: doc.styles.choices.pairing, unknown: true },\n overrides: doc.styles.overrides ?? null,\n brand: compiled.tokens.palette.brand,\n themes: Object.fromEntries(\n Object.entries(compiled.tokens.themes).map(([theme, c]) => [\n theme,\n {\n background: c.background,\n text: c.text,\n heading: c.heading,\n accent: c.accent,\n \"accent-text\": c[\"accent-text\"],\n },\n ]),\n ),\n contrast: {\n mode: compiled.contrast.mode,\n adjustedBySolver: compiled.contrast.adjustments.length,\n failures: compiled.contrast.failures.length,\n },\n };\n}\n\nfunction pageSummary(page: Page) {\n return {\n id: page.id,\n title: page.title,\n slug: page.slug,\n path: pagePathOf(page),\n sections: page.sections.length,\n hidden: page.hidden ?? false,\n };\n}\n\nexport const getSite = defineTool({\n name: \"get_site\",\n title: \"Get site\",\n description:\n \"Site settings, navigation, header/footer, Site Styles summary, page list and collections. Call before editing to learn page ids and the current look.\",\n input: z.object({ site: siteArg }),\n annotations: { readOnlyHint: true },\n async handler(ctx, input) {\n const siteId = await ctx.siteId(input.site);\n const doc = await ctx.doc(siteId);\n const { site } = doc;\n return {\n data: {\n id: siteId,\n title: site.title,\n tagline: site.tagline ?? null,\n template: doc.config.template ?? null,\n url: doc.config.deploy.customDomain\n ? `https://${doc.config.deploy.customDomain}`\n : doc.config.deploy.url,\n nav: site.nav,\n header: site.header,\n footer: {\n sectionId: site.footer.id,\n layout: site.footer.layout.mode,\n blocks: site.footer.blocks.map((b) => ({ id: b.id, type: b.type })),\n note: 'Edit footer blocks with the block tools using page \"footer\".',\n },\n announcement: site.announcement ?? null,\n social: site.social ?? [],\n seo: site.seo ?? null,\n styles: stylesSummary(doc),\n pages: Object.values(doc.pages).map(pageSummary),\n collections: Object.entries(doc.collections).map(([name, items]) => ({\n name,\n kind: Object.values(items)[0]?.kind ?? doc.collectionConfigs?.[name]?.kind ?? null,\n items: Object.keys(items).length,\n })),\n media: Object.keys(doc.media).length,\n capabilities: {\n ...ctx.store.capabilities,\n grantPublish: ctx.grant.publish,\n },\n },\n };\n },\n});\n\nfunction sectionView(\n ctx: ToolContext,\n section: Section,\n detail: \"full\" | \"outline\",\n): Record<string, unknown> {\n const blocks = section.blocks.map((b: Block) => {\n if (detail === \"outline\") {\n const out: Record<string, unknown> = {\n id: b.id,\n type: b.type,\n text: blockPreview(ctx.registry, b),\n };\n if (b.variant) out.variant = b.variant;\n if (b.column !== undefined) out.column = b.column;\n if (b.hidden) out.hidden = true;\n return out;\n }\n return blockToAgent(ctx.registry, b);\n });\n const base: Record<string, unknown> = {\n id: section.id,\n ...(section.preset ? { preset: section.preset } : {}),\n ...(section.label ? { label: section.label } : {}),\n ...(section.hidden ? { hidden: true } : {}),\n ...(section.locked ? { locked: true } : {}),\n theme: section.style?.colorTheme ?? \"light\",\n };\n if (detail === \"outline\") {\n base.layout =\n section.layout.mode === \"grid\" ? \"grid\" : `stack ${JSON.stringify(section.layout.columns.d)}`;\n base.blocks = blocks;\n return base;\n }\n return {\n ...base,\n layout: section.layout,\n style: section.style ?? {},\n ...(section.anchor ? { anchor: section.anchor } : {}),\n blocks,\n };\n}\n\nexport const getPage = defineTool({\n name: \"get_page\",\n title: \"Get page\",\n description:\n 'A page\\'s section/block tree with stable ids, fields (rich text as Markdown), layout and style. Use detail \"outline\" for a compact overview (ids, types, text previews) and \"full\" before editing fields or grid placements. page \"footer\" returns the site footer section.',\n input: z.object({\n site: siteArg,\n page: containerArg,\n detail: z.enum([\"full\", \"outline\"]).optional().describe('Default \"full\".'),\n }),\n annotations: { readOnlyHint: true },\n async handler(ctx, input) {\n const siteId = await ctx.siteId(input.site);\n const doc = await ctx.doc(siteId);\n const detail = input.detail ?? \"full\";\n const { id, page } = resolvePage(doc, input.page, { allowFooter: true });\n if (id === FOOTER || !page)\n return { data: { page: FOOTER, sections: [sectionView(ctx, doc.site.footer, detail)] } };\n return {\n data: {\n id: page.id,\n title: page.title,\n slug: page.slug,\n path: pagePathOf(page),\n seo: page.seo ?? {},\n ...(page.header ? { header: page.header } : {}),\n ...(page.hidden ? { hidden: true } : {}),\n sections: page.sections.map((s) => sectionView(ctx, s, detail)),\n },\n };\n },\n});\n\nfunction blockMetaView(m: BlockMeta, full: boolean) {\n const fields = Object.fromEntries(\n Object.entries(m.fields).map(([k, f]) => {\n const v: Record<string, unknown> = {\n kind: f.kind === \"richText\" ? \"richText (Markdown)\" : f.kind,\n };\n if (f.optional) v.optional = true;\n if (f.label) v.label = f.label;\n if (full && f.help) v.help = f.help;\n if (f.ai) v.ai = f.ai;\n if (f.kind === \"select\") v.options = f.options.map((o) => o.value);\n if (f.kind === \"text\" && f.maxLength) v.maxLength = f.maxLength;\n if (f.kind === \"list\")\n v.itemFields = Object.fromEntries(\n Object.entries(f.fields).map(([ik, iv]) => [\n ik,\n iv.kind === \"richText\" ? \"richText (Markdown)\" : iv.kind,\n ]),\n );\n if (f.kind === \"image\") v.shape = \"{ src, alt, focal? }\";\n if (f.kind === \"link\") v.allow = f.allow;\n return [k, v];\n }),\n );\n return {\n type: m.type,\n label: m.label,\n category: m.category,\n description: m.description,\n variants: m.variants,\n styleSlots: m.styleSlots,\n fields,\n ai: m.ai,\n };\n}\n\nexport const listBlocks = defineTool({\n name: \"list_blocks\",\n title: \"List blocks\",\n description:\n \"The block catalog: each block's fields (rich text as Markdown), variants, style slots and AI guidance (purpose, whenToUse, avoid). Filter by category or type. Prefer section presets for whole sections; use blocks to add or adjust pieces.\",\n input: z.object({\n category: z.string().optional(),\n type: z.string().optional().describe(\"One block type for full detail.\"),\n }),\n annotations: { readOnlyHint: true },\n async handler(ctx, input) {\n let metas = ctx.registry.meta();\n if (input.type) {\n metas = metas.filter((m) => m.type === input.type);\n if (!metas.length)\n throw new ToolError(\n `Unknown block type \"${input.type}\". Types: ${ctx.registry.types().join(\", \")}.`,\n \"not_found\",\n );\n }\n if (input.category) metas = metas.filter((m) => m.category === input.category);\n return {\n data: {\n blocks: metas.map((m) => blockMetaView(m, Boolean(input.type))),\n categories: [...new Set(ctx.registry.meta().map((m) => m.category))],\n },\n };\n },\n});\n\nexport const getBlockSchema = defineTool({\n name: \"get_block_schema\",\n title: \"Get block schema\",\n description:\n \"JSON Schema for one block type's fields (with labels and AI hints). Rich-text fields are shown as ProseMirror JSON but the edit tools also accept a Markdown string for them.\",\n input: z.object({ type: z.string() }),\n annotations: { readOnlyHint: true },\n async handler(ctx, input) {\n const def = ctx.registry.get(input.type);\n if (!def)\n throw new ToolError(\n `Unknown block type \"${input.type}\". Types: ${ctx.registry.types().join(\", \")}.`,\n \"not_found\",\n );\n return {\n data: {\n type: def.type,\n version: def.version,\n variants: def.meta.variants,\n styleSlots: def.meta.styleSlots,\n fields: blockFieldsJsonSchema(def),\n },\n };\n },\n});\n\nexport const listSectionPresets = defineTool({\n name: \"list_section_presets\",\n title: \"List section presets\",\n description:\n \"Designed section presets by category (hero, about, services, gallery, testimonials, pricing, faq, team, stats, cta, contact, newsletter, blog, events, products, footer, header) with descriptions, layout, designed-for color themes, copy-length ranges and AI guidance. Compose pages from these with insert_section/create_page.\",\n input: z.object({\n category: z.enum(PRESET_CATEGORIES).optional(),\n query: z.string().optional().describe(\"Words to match in label, description or tags.\"),\n detail: z.enum([\"brief\", \"full\"]).optional().describe('Default \"brief\".'),\n }),\n annotations: { readOnlyHint: true },\n async handler(_ctx, input) {\n let list = presetCatalog.slice();\n if (input.category) list = list.filter((p) => p.category === input.category);\n if (input.query) {\n const words = input.query.toLowerCase().split(/\\s+/).filter(Boolean);\n list = list.filter((p) => {\n const hay =\n `${p.id} ${p.label} ${p.description} ${p.tags.join(\" \")} ${p.ai.whenToUse}`.toLowerCase();\n return words.every((w) => hay.includes(w));\n });\n }\n const full = input.detail === \"full\";\n return {\n data: {\n presets: list.map((p) =>\n full\n ? p\n : {\n id: p.id,\n label: p.label,\n description: p.description,\n target: p.target,\n layout: p.layout,\n overlap: p.overlap,\n themes: p.themes,\n whenToUse: p.ai.whenToUse,\n },\n ),\n categories: PRESET_CATEGORIES,\n },\n };\n },\n});\n\n/** Find a preset by exact id, or by `category/name` (latest version). */\nexport function findPreset(id: string): Preset {\n const exact = getPreset(id);\n if (exact) return exact;\n const base = id.replace(/@\\d+$/, \"\");\n const matches = presetCatalog\n .filter((p) => p.id.startsWith(`${base}@`))\n .sort((a, b) => b.version - a.version);\n const best = matches[0] && getPreset(matches[0].id);\n if (best) return best;\n const category = base.split(\"/\")[0] ?? \"\";\n const near = presetCatalog.filter((p) => p.category === category).map((p) => p.id);\n throw new ToolError(\n `Unknown preset \"${id}\".${near.length ? ` In ${category}: ${near.join(\", \")}.` : \" Call list_section_presets.\"}`,\n \"not_found\",\n );\n}\n","import { designCheck, type Issue, seoCheck } from \"@omniharmonic/openspace-lint\";\nimport { type Op, type OpBody, validate, validateAll } from \"@omniharmonic/openspace-ops\";\nimport {\n BREAKPOINT_INFO,\n BUTTON_STYLES,\n DENSITIES,\n IMAGE_TREATMENTS,\n MOTION_LEVELS,\n type Page,\n SHAPES,\n type SiteDocument,\n} from \"@omniharmonic/openspace-schema\";\nimport {\n compileStyles,\n curatedPalettes,\n getCuratedPalette,\n getPairing,\n TYPE_PAIRINGS,\n} from \"@omniharmonic/openspace-theme\";\nimport { z } from \"zod\";\nimport { pagePathOf, resolvePage, type ToolContext } from \"../context\";\nimport { issueLines, ToolError } from \"../errors\";\nimport { renderPreviewHtml } from \"../render\";\nimport type { Device } from \"../store\";\nimport { loadTemplates } from \"../templates\";\nimport { defineTool, deviceArg, siteArg, type ToolOutput } from \"../tool\";\nimport { stylesSummary } from \"./read\";\n\nconst stripMeta = (op: Op): OpBody => {\n const { id: _i, actor: _a, ts: _t, ...body } = op;\n return body as OpBody;\n};\n\n// --- styles ------------------------------------------------------------------------------------\n\nexport const getStyles = defineTool({\n name: \"get_styles\",\n title: \"Get Site Styles\",\n description:\n \"Current Site Styles (palette, type pairing, density, shape, buttons, motion, image treatment, token overrides), the resulting colors per section theme, and the available options (pairings, curated palettes, enum values). Change styles here, never with inline CSS.\",\n input: z.object({\n site: siteArg,\n options: z.boolean().optional().describe(\"Include the option lists (default true).\"),\n }),\n annotations: { readOnlyHint: true },\n async handler(ctx, input) {\n const siteId = await ctx.siteId(input.site);\n const doc = await ctx.doc(siteId);\n const compiled = compileStyles(doc.styles);\n const data: Record<string, unknown> = {\n ...stylesSummary(doc),\n themes: compiled.tokens.themes,\n fonts: { googleFontsUrl: compiled.tokens.fonts.googleFontsUrl },\n solverAdjustments: compiled.contrast.adjustments,\n };\n if (input.options !== false)\n data.options = {\n pairings: TYPE_PAIRINGS.map((p) => ({\n id: p.id,\n heading: p.heading.family,\n body: p.body.family,\n ...(p.template ? { template: p.template } : {}),\n })),\n palettes: curatedPalettes.map((p) => ({\n id: p.id,\n name: p.name,\n brand: p.brand,\n neutral: p.neutral,\n description: p.description,\n })),\n density: DENSITIES,\n shape: SHAPES,\n buttons: BUTTON_STYLES,\n motion: MOTION_LEVELS,\n imageTreatment: IMAGE_TREATMENTS,\n neutral: [\"warm\", \"cool\", \"pure\"],\n contrast: [\"standard\", \"high\"],\n overridePaths:\n 'overrides use DTCG paths: \"color.<role>\" (light theme), \"color.<theme>.<role>\", \"color.all.<role>\", \"color.accent-500\", \"type.display.letterSpacing\"… Roles: background, surface, surface-raised, text, text-muted, heading, accent, accent-text, link, border, focus…',\n };\n return { data };\n },\n});\n\nconst ChoicesPatch = z\n .object({\n palette: z\n .object({\n brand: z.string().optional(),\n neutral: z.enum([\"warm\", \"cool\", \"pure\"]).optional(),\n contrast: z.enum([\"standard\", \"high\"]).optional(),\n source: z.enum([\"brand\", \"logo\", \"image\", \"curated\"]).optional(),\n })\n .optional(),\n pairing: z.string().optional(),\n density: z.enum(DENSITIES).optional(),\n shape: z.enum(SHAPES).optional(),\n buttons: z.enum(BUTTON_STYLES).optional(),\n motion: z.enum(MOTION_LEVELS).optional(),\n imageTreatment: z.enum(IMAGE_TREATMENTS).optional(),\n })\n .describe(\"Partial Site Styles choices.\");\n\nexport type ContrastMode = \"adjust\" | \"reject\";\n\n/**\n * Apply a styles patch with a contrast check. Unfixable contrast failures are always refused;\n * overrides that fail contrast are replaced by the nearest accessible color (`adjust`) or\n * refused (`reject`). Returns explanations of every adjustment.\n */\nexport async function applyStyles(\n ctx: ToolContext,\n siteId: string,\n patch: { set?: Record<string, unknown>; unset?: string[] },\n mode: ContrastMode,\n): Promise<{ doc: SiteDocument; adjustments: string[]; solverNotes: string[] }> {\n const doc = await ctx.doc(siteId);\n const pairing = patch.set?.[\"choices.pairing\"];\n if (typeof pairing === \"string\" && !getPairing(pairing))\n throw new ToolError(\n `Unknown type pairing \"${pairing}\". Pairings: ${TYPE_PAIRINGS.map((p) => p.id).join(\", \")}.`,\n \"invalid_arguments\",\n );\n const body: Record<string, unknown> = { op: \"styles.patch\", patch: {} };\n if (patch.set && Object.keys(patch.set).length)\n (body.patch as Record<string, unknown>).set = patch.set;\n if (patch.unset?.length) (body.patch as Record<string, unknown>).unset = patch.unset;\n const [first] = ctx.stamp([body as OpBody], \"preview\");\n const trial = validate(doc, first);\n if (!trial.ok)\n throw new ToolError(\n `Those styles are not valid:\\n${issueLines(trial.errors).join(\"\\n\")}`,\n \"invalid_arguments\",\n trial.errors,\n );\n // Only the site-wide contrast rules matter here.\n const issues = designCheck({ ...trial.doc, pages: {} }).filter(\n (i) => i.rule === \"contrast\" || i.rule === \"contrast-override\",\n );\n const unfixable = issues.filter((i) => i.rule === \"contrast\");\n if (unfixable.length)\n throw new ToolError(\n `These styles leave text unreadable even after automatic adjustment:\\n${unfixable.map((i) => `- ${i.message} ${i.fix}`).join(\"\\n\")}`,\n \"contrast\",\n [],\n 'Pick a brand color with more lightness contrast, or keep contrast \"standard\".',\n );\n const overrideIssues = issues.filter((i) => i.rule === \"contrast-override\");\n if (overrideIssues.length && mode === \"reject\")\n throw new ToolError(\n `These color overrides fail WCAG AA contrast:\\n${overrideIssues.map((i) => `- ${i.message} ${i.fix}`).join(\"\\n\")}`,\n \"contrast\",\n [],\n 'Use the suggested colors, or call again with onContrast: \"adjust\" to apply them automatically.',\n );\n const fixes = overrideIssues.flatMap((i) => (i.autofix?.ops ?? []).map(stripMeta));\n if (fixes.length) {\n // Re-check the adjusted result before anything is written.\n const adjusted = validateAll(doc, ctx.stamp([body as OpBody, ...fixes], \"preview\"));\n const left = adjusted.ok\n ? designCheck({ ...adjusted.doc, pages: {} }).filter(\n (i) => i.rule === \"contrast\" || i.rule === \"contrast-override\",\n )\n : [];\n if (!adjusted.ok || left.length)\n throw new ToolError(\n `These colors can't be made readable automatically:\\n${(adjusted.ok ? left.map((i) => `- ${i.message}`) : issueLines(adjusted.errors)).join(\"\\n\")}`,\n \"contrast\",\n [],\n \"Choose override colors with more contrast against the theme's backgrounds, or remove the overrides.\",\n );\n }\n const { doc: next } = await ctx.apply(siteId, [body as OpBody, ...fixes]);\n const solverNotes = compileStyles(next.styles)\n .warnings.filter((w) => w.code === \"contrast-adjusted\")\n .map((w) => w.message);\n return {\n doc: next,\n adjustments: overrideIssues.map((i) => `${i.message} → ${i.fix}`),\n solverNotes,\n };\n}\n\nconst isRecord = (v: unknown): v is Record<string, unknown> =>\n typeof v === \"object\" && v !== null && !Array.isArray(v);\n\nexport const setStyles = defineTool({\n name: \"set_styles\",\n title: \"Set Site Styles\",\n description:\n 'Restyle the whole site: patch Site Styles choices (palette brand/neutral/contrast, pairing, density, shape, buttons, motion, imageTreatment), pick a curated palette by id, and set/unset exact DTCG token overrides (e.g. {\"color.accent\": \"#2f6b4f\"}). Every change is contrast-checked: unreadable overrides are moved to the nearest accessible shade (onContrast \"adjust\", default) or refused (\"reject\"), with an explanation.',\n input: z.object({\n site: siteArg,\n choices: ChoicesPatch.optional(),\n palette: z.string().optional().describe(\"Curated palette id (sets brand + neutral).\"),\n overrides: z\n .object({\n set: z\n .record(z.string(), z.unknown())\n .optional()\n .describe('Token path → value or {$value, $type}, e.g. {\"color.accent\": \"#0a5\"}'),\n unset: z.array(z.string()).optional(),\n })\n .optional(),\n onContrast: z.enum([\"adjust\", \"reject\"]).optional(),\n }),\n annotations: { idempotentHint: true },\n async handler(ctx, input) {\n const siteId = await ctx.siteId(input.site);\n const set: Record<string, unknown> = {};\n const unset: string[] = [];\n if (input.palette) {\n const p = getCuratedPalette(input.palette);\n if (!p)\n throw new ToolError(\n `Unknown palette \"${input.palette}\". Palettes: ${curatedPalettes.map((c) => c.id).join(\", \")}.`,\n \"invalid_arguments\",\n );\n set[\"choices.palette.brand\"] = p.brand;\n set[\"choices.palette.neutral\"] = p.neutral;\n set[\"choices.palette.source\"] = \"curated\";\n }\n const c = input.choices ?? {};\n for (const [k, v] of Object.entries(c.palette ?? {}))\n if (v !== undefined) set[`choices.palette.${k}`] = v;\n for (const k of [\"pairing\", \"density\", \"shape\", \"buttons\", \"motion\", \"imageTreatment\"] as const)\n if (c[k] !== undefined) set[`choices.${k}`] = c[k];\n for (const [path, v] of Object.entries(input.overrides?.set ?? {})) {\n const token = isRecord(v) && \"$value\" in v ? v : { $value: v };\n if (path.startsWith(\"color.\") && isRecord(token) && token.$type === undefined)\n token.$type = \"color\";\n set[`overrides.${path}`] = token;\n }\n for (const path of input.overrides?.unset ?? []) unset.push(`overrides.${path}`);\n if (!Object.keys(set).length && !unset.length)\n throw new ToolError(\n \"Nothing to change: give choices, palette or overrides.\",\n \"invalid_arguments\",\n );\n const r = await applyStyles(ctx, siteId, { set, unset }, input.onContrast ?? \"adjust\");\n return {\n data: {\n styles: stylesSummary(r.doc),\n contrastAdjustments: r.adjustments,\n solverNotes: r.solverNotes,\n next: \"Check the result with screenshot or render_page, then design_check.\",\n },\n };\n },\n});\n\n// --- templates ---------------------------------------------------------------------------------\n\nexport const listTemplates = defineTool({\n name: \"list_templates\",\n title: \"List templates and looks\",\n description:\n \"Templates and their alternate looks (palette + type pairing + shape/buttons combinations). apply_template_look restyles the current content with one of them without touching the content.\",\n input: z.object({ template: z.string().optional() }),\n annotations: { readOnlyHint: true },\n async handler(ctx, input) {\n const { source, templates } = await loadTemplates(ctx.store);\n const list = input.template ? templates.filter((t) => t.id === input.template) : templates;\n return {\n data: {\n source,\n templates: list.map((t) => ({\n id: t.id,\n name: t.name,\n description: t.description,\n persona: t.persona,\n mood: t.mood,\n looks: t.looks.map((l) => ({\n id: l.id,\n name: l.name,\n description: l.description,\n pairing: l.choices.pairing,\n brand: l.choices.palette.brand,\n shape: l.choices.shape,\n buttons: l.choices.buttons,\n })),\n })),\n },\n };\n },\n});\n\nexport const applyTemplateLook = defineTool({\n name: \"apply_template_look\",\n title: \"Apply template look\",\n description:\n \"Restyle the site with a template look (Site Styles choices only; content and layout stay). Contrast-checked like set_styles. resetOverrides also clears exact token overrides so the look applies cleanly.\",\n input: z.object({\n site: siteArg,\n template: z.string(),\n look: z.string().optional().describe(\"Look id (default: the template's first look).\"),\n resetOverrides: z.boolean().optional(),\n }),\n annotations: { idempotentHint: true },\n async handler(ctx, input) {\n const siteId = await ctx.siteId(input.site);\n const { templates } = await loadTemplates(ctx.store);\n const t = templates.find((x) => x.id === input.template);\n if (!t)\n throw new ToolError(\n `Unknown template \"${input.template}\". Templates: ${templates.map((x) => x.id).join(\", \")}.`,\n \"not_found\",\n );\n const look = input.look ? t.looks.find((l) => l.id === input.look) : t.looks[0];\n if (!look)\n throw new ToolError(\n `Template ${t.id} has no look \"${input.look}\". Looks: ${t.looks.map((l) => l.id).join(\", \")}.`,\n \"not_found\",\n );\n const doc = await ctx.doc(siteId);\n const unset = input.resetOverrides && doc.styles.overrides ? [\"overrides\"] : [];\n const r = await applyStyles(ctx, siteId, { set: { choices: look.choices }, unset }, \"adjust\");\n return {\n data: {\n applied: { template: t.id, look: look.id, name: look.name },\n styles: stylesSummary(r.doc),\n contrastAdjustments: r.adjustments,\n ...(doc.styles.overrides && !input.resetOverrides\n ? {\n note: \"The site has exact token overrides that still apply on top of this look; pass resetOverrides: true to clear them.\",\n }\n : {}),\n },\n };\n },\n});\n\n// --- design check ------------------------------------------------------------------------------\n\nconst CHECKS = [\"design\", \"seo\"] as const;\n\nfunction runChecks(\n doc: SiteDocument,\n pageId: string | undefined,\n checks: readonly string[],\n now: number,\n): Issue[] {\n const out: Issue[] = [];\n if (checks.includes(\"design\"))\n out.push(...designCheck(doc, pageId, { actor: \"design-check\", now }));\n if (checks.includes(\"seo\")) {\n const pages = pageId ? [doc.pages[pageId as Page[\"id\"]]] : Object.values(doc.pages);\n for (const p of pages) if (p) out.push(...seoCheck(p, doc, { actor: \"design-check\", now }));\n }\n return out;\n}\n\nconst RANK = { error: 0, warning: 1, info: 2 } as const;\n\nexport const designCheckTool = defineTool({\n name: \"design_check\",\n title: \"Design check\",\n description:\n \"Run Studio's Design check (contrast, typefaces, heading order, empty sections, missing alt text, oversized images, overlapping text in grids, calls to action, color rhythm, copy lengths) and the SEO check on a page or the whole site. Each issue has an id; issues with autofix can be fixed with apply_fix. Aim for zero errors before publishing.\",\n input: z.object({\n site: siteArg,\n page: z.string().optional().describe(\"Page id/slug/title (default: whole site).\"),\n checks: z.array(z.enum(CHECKS)).optional().describe('Default [\"design\", \"seo\"].'),\n minSeverity: z\n .enum([\"error\", \"warning\", \"info\"])\n .optional()\n .describe('Default \"info\" (everything).'),\n }),\n annotations: { readOnlyHint: true },\n async handler(ctx, input) {\n const siteId = await ctx.siteId(input.site);\n const doc = await ctx.doc(siteId);\n const pageId = input.page ? resolvePage(doc, input.page).id : undefined;\n const min = RANK[input.minSeverity ?? \"info\"];\n const issues = runChecks(doc, pageId, input.checks ?? CHECKS, ctx.now()).filter(\n (i) => RANK[i.severity] <= min,\n );\n const counts = { error: 0, warning: 0, info: 0 };\n for (const i of issues) counts[i.severity]++;\n return {\n data: {\n ...(pageId ? { page: pageId } : {}),\n counts,\n issues: issues.map((i) => ({\n id: i.id,\n rule: i.rule,\n severity: i.severity,\n ...(i.page ? { page: i.page } : {}),\n ...(i.section ? { section: i.section } : {}),\n ...(i.block ? { block: i.block } : {}),\n message: i.message,\n fix: i.fix,\n autofix: i.autofix?.label ?? null,\n })),\n next: issues.some((i) => i.autofix)\n ? \"Fix with apply_fix {issues: [ids]} or edit directly; then re-run design_check.\"\n : undefined,\n },\n };\n },\n});\n\nexport const applyFix = defineTool({\n name: \"apply_fix\",\n title: \"Apply design fix\",\n description:\n 'Apply the automatic fix of one or more design_check/SEO issues by id (or \"all\" to apply every available autofix on the page/site). Issues are recomputed before each fix, so ids stay valid as the document changes.',\n input: z.object({\n site: siteArg,\n issues: z.union([z.array(z.string()).min(1), z.literal(\"all\")]),\n page: z.string().optional().describe('Limit to a page (needed for speed with \"all\").'),\n }),\n annotations: {},\n async handler(ctx, input) {\n const siteId = await ctx.siteId(input.site);\n let doc = await ctx.doc(siteId);\n const pageId = input.page ? resolvePage(doc, input.page).id : undefined;\n const applied: Array<{ id: string; fix: string }> = [];\n const skipped: Array<{ id: string; reason: string }> = [];\n const wanted = input.issues === \"all\" ? null : [...new Set(input.issues)];\n const seen = new Set<string>();\n for (let guard = 0; guard < 100; guard++) {\n const issues = runChecks(doc, pageId, CHECKS, ctx.now());\n const next = wanted\n ? wanted.map((id) => issues.find((i) => i.id === id && !seen.has(id))).find(Boolean)\n : issues.find((i) => i.autofix && !seen.has(i.id));\n if (!next) break;\n seen.add(next.id);\n if (!next.autofix) {\n skipped.push({ id: next.id, reason: `No automatic fix. ${next.fix}` });\n continue;\n }\n try {\n const r = await ctx.apply(siteId, next.autofix.ops.map(stripMeta));\n doc = r.doc;\n applied.push({ id: next.id, fix: next.autofix.label });\n } catch (e) {\n skipped.push({ id: next.id, reason: e instanceof Error ? e.message : String(e) });\n }\n }\n if (wanted)\n for (const id of wanted)\n if (!seen.has(id))\n skipped.push({\n id,\n reason: \"Not found (already fixed, or the id is wrong — re-run design_check).\",\n });\n const remaining = runChecks(doc, pageId, CHECKS, ctx.now());\n const counts = { error: 0, warning: 0, info: 0 };\n for (const i of remaining) counts[i.severity]++;\n return { data: { applied, skipped, remaining: counts } };\n },\n});\n\n// --- preview, render, screenshot ----------------------------------------------------------------\n\nexport const preview = defineTool({\n name: \"preview\",\n title: \"Preview\",\n description:\n \"Preview address of the draft (a page path is added when page is given). Share it with the owner; use screenshot to look at the page yourself.\",\n input: z.object({ site: siteArg, page: z.string().optional() }),\n annotations: { readOnlyHint: true },\n async handler(ctx, input) {\n const siteId = await ctx.siteId(input.site);\n const doc = await ctx.doc(siteId);\n const page = input.page ? resolvePage(doc, input.page).page : null;\n const url = await ctx.store.previewUrl(siteId, page ? pagePathOf(page) : \"/\");\n return {\n data: {\n url,\n ...(url\n ? {}\n : {\n note: \"No preview server here; use render_page for the HTML or screenshot for an image.\",\n }),\n screenshots: ctx.store.capabilities.canScreenshot,\n },\n };\n },\n});\n\nexport const renderPage = defineTool({\n name: \"render_page\",\n title: \"Render page HTML\",\n description:\n \"The draft page rendered to HTML by the site's real renderer: the full document, a one-section document (section), or only the markup inside <main> (fragment). Use it to inspect structure, headings and classes while iterating on a design.\",\n input: z.object({\n site: siteArg,\n page: z.string(),\n section: z.string().optional(),\n fragment: z.boolean().optional(),\n maxChars: z.int().min(1000).optional().describe(\"Truncate long output (default 200000).\"),\n }),\n annotations: { readOnlyHint: true },\n async handler(ctx, input) {\n const siteId = await ctx.siteId(input.site);\n const doc = await ctx.doc(siteId);\n const { id } = resolvePage(doc, input.page);\n const html = renderPreviewHtml(doc, id, { sectionId: input.section, fragment: input.fragment });\n const max = input.maxChars ?? 200_000;\n return {\n text:\n html.length > max\n ? `${html.slice(0, max)}\\n<!-- truncated: ${html.length - max} more characters -->`\n : html,\n };\n },\n});\n\nconst DEVICE_WIDTH: Record<Device, number> = {\n desktop: BREAKPOINT_INFO.d.previewWidth,\n tablet: BREAKPOINT_INFO.t.previewWidth,\n mobile: BREAKPOINT_INFO.m.previewWidth,\n};\n\nexport const screenshot = defineTool({\n name: \"screenshot\",\n title: \"Screenshot\",\n description:\n 'PNG screenshot of a draft page or one section at desktop (1440), tablet (834) or mobile (390) width — or \"all\" three — so you can see the design and iterate. Returns the preview URL as well. Needs a screenshot provider (Playwright locally).',\n input: z.object({\n site: siteArg,\n page: z.string(),\n section: z.string().optional(),\n device: z\n .union([deviceArg, z.literal(\"all\")])\n .optional()\n .describe('Default \"desktop\".'),\n fullPage: z\n .boolean()\n .optional()\n .describe(\"Capture the whole page height (default true for pages, ignored for sections).\"),\n }),\n annotations: { readOnlyHint: true },\n async handler(ctx, input): Promise<ToolOutput> {\n const siteId = await ctx.siteId(input.site);\n const doc = await ctx.doc(siteId);\n const { id, page } = resolvePage(doc, input.page);\n const url = await ctx.store.previewUrl(siteId, page ? pagePathOf(page) : \"/\");\n if (!ctx.store.capabilities.canScreenshot || !ctx.store.screenshot)\n throw new ToolError(\n \"Screenshots aren't available here.\",\n \"unsupported\",\n [],\n ctx.store.capabilities.publishNote?.includes(\"git\")\n ? \"Install Playwright next to the CLI (npm i -D playwright && npx playwright install chromium) and restart the MCP server; meanwhile use render_page.\"\n : `Use render_page to inspect the HTML${url ? ` or open ${url}` : \"\"}.`,\n );\n const html = renderPreviewHtml(doc, id, { sectionId: input.section });\n const devices: Device[] =\n input.device === \"all\" ? [\"desktop\", \"tablet\", \"mobile\"] : [input.device ?? \"desktop\"];\n const images: NonNullable<ToolOutput[\"images\"]> = [];\n const shots: Array<{ device: Device; width: number; height?: number }> = [];\n for (const device of devices) {\n const shot = await ctx.store.screenshot(siteId, {\n pageId: id,\n sectionId: input.section,\n device,\n width: DEVICE_WIDTH[device],\n fullPage: input.section ? false : (input.fullPage ?? true),\n html,\n });\n images.push({\n base64: shot.base64,\n mimeType: shot.mimeType,\n caption: `${device} ${shot.width}px`,\n });\n shots.push({ device, width: shot.width, height: shot.height });\n }\n return {\n text: `Screenshot${shots.length > 1 ? \"s\" : \"\"} of ${page?.title ?? id}${input.section ? ` (section ${input.section})` : \"\"}: ${shots.map((s) => `${s.device} ${s.width}×${s.height ?? \"?\"}`).join(\", \")}.${url ? ` Preview: ${url}` : \"\"}`,\n data: { url, shots },\n images,\n };\n },\n});\n\nexport const designTools = [\n getStyles,\n setStyles,\n listTemplates,\n applyTemplateLook,\n designCheckTool,\n applyFix,\n preview,\n renderPage,\n screenshot,\n];\n","import { autoMobileLayoutOps } from \"@omniharmonic/openspace-lint\";\nimport {\n FOOTER,\n findBlock,\n findSection,\n locateBlock,\n type OpBody,\n} from \"@omniharmonic/openspace-ops\";\nimport {\n type Block,\n type BlockRegistry,\n COLOR_THEMES,\n type LinkChange,\n LinkSchema,\n newId,\n resolveInternalLinks,\n type Section,\n type SiteDocument,\n} from \"@omniharmonic/openspace-schema\";\nimport { z } from \"zod\";\nimport { resolvePage, type ToolContext } from \"../context\";\nimport { ToolError } from \"../errors\";\nimport { blockPreview, fieldsFromAgent } from \"../markdown\";\nimport { containerArg, defineTool, positionArg, siteArg } from \"../tool\";\nimport { findPreset } from \"./read\";\n\nconst isRecord = (v: unknown): v is Record<string, unknown> =>\n typeof v === \"object\" && v !== null && !Array.isArray(v);\n\nconst themeArg = z.enum(COLOR_THEMES).describe(\"Section color theme.\");\n\nconst blockSummary = (registry: BlockRegistry, b: Block) => ({\n id: b.id,\n type: b.type,\n ...(b.variant ? { variant: b.variant } : {}),\n ...(b.column !== undefined ? { column: b.column } : {}),\n text: blockPreview(registry, b),\n});\n\nexport function sectionSummary(registry: BlockRegistry, s: Section) {\n return {\n id: s.id,\n ...(s.preset ? { preset: s.preset } : {}),\n theme: s.style?.colorTheme ?? \"light\",\n layout: s.layout.mode,\n blocks: s.blocks.map((b) => blockSummary(registry, b)),\n };\n}\n\n/** Resolve a page-or-footer container reference to its id. */\nfunction container(doc: SiteDocument, ref: string): string {\n return resolvePage(doc, ref, { allowFooter: true }).id;\n}\n\nfunction pageOnly(doc: SiteDocument, ref: string): string {\n if (ref === FOOTER)\n throw new ToolError(\n \"Sections can't be inserted, moved or deleted in the footer; replace it with a footer preset (insert_section with a footer/… preset) or edit its blocks.\",\n \"invalid_arguments\",\n );\n return resolvePage(doc, ref).id;\n}\n\nfunction requireSection(doc: SiteDocument, page: string, section: string): Section {\n const loc = findSection(doc, page as never, section);\n if (!loc) {\n const ids =\n page === FOOTER\n ? [doc.site.footer.id]\n : ((doc.pages[page as never] as { sections: Section[] } | undefined)?.sections.map(\n (s) => s.id,\n ) ?? []);\n throw new ToolError(\n `No section ${section} on ${page}. Sections there: ${ids.join(\", \") || \"none\"}.`,\n \"not_found\",\n );\n }\n return loc.section;\n}\n\nfunction requireBlock(\n doc: SiteDocument,\n page: string,\n block: string,\n): { block: Block; section: Section } {\n const loc = findBlock(doc, page as never, block);\n if (loc) return { block: loc.block, section: loc.section };\n const elsewhere = locateBlock(doc, block);\n throw new ToolError(\n elsewhere\n ? `Block ${block} is on ${elsewhere.container}, not ${page}.`\n : `No block ${block}. Call get_page to see block ids.`,\n \"not_found\",\n );\n}\n\n/** Build a new block from agent input: fresh id, current version, Markdown → rich text. */\nexport function makeBlock(\n registry: BlockRegistry,\n input: { type: string; fields?: Record<string, unknown>; id?: string; [k: string]: unknown },\n): Block {\n const def = registry.get(input.type);\n if (!def)\n throw new ToolError(\n `Unknown block type \"${input.type}\". Types: ${registry.types().join(\", \")}.`,\n \"invalid_arguments\",\n );\n const fields: Record<string, unknown> = {};\n // Only required fields fall back to their defaults, so library demo copy never leaks in.\n for (const [k, m] of Object.entries(def.meta.fields))\n if (!m.optional && m.default !== undefined) fields[k] = structuredClone(m.default);\n Object.assign(fields, fieldsFromAgent(registry, input.type, input.fields ?? {}));\n const { type, fields: _f, id, v: _v, ...rest } = input;\n return {\n ...rest,\n id: (id ?? newId(\"blk\")) as Block[\"id\"],\n type,\n v: def.version,\n fields,\n } as Block;\n}\n\n/** Normalise an explicit section from the agent: ids filled in, blocks built with `makeBlock`. */\nexport function makeSection(registry: BlockRegistry, raw: Record<string, unknown>): Section {\n const blocks = Array.isArray(raw.blocks) ? raw.blocks : [];\n return {\n ...raw,\n id: (typeof raw.id === \"string\" ? raw.id : newId(\"sec\")) as Section[\"id\"],\n layout: raw.layout ?? { mode: \"stack\", columns: { d: [12] } },\n style: isRecord(raw.style) ? raw.style : { colorTheme: \"light\" },\n blocks: blocks.map((b, i) => {\n if (!isRecord(b) || typeof b.type !== \"string\")\n throw new ToolError(`section.blocks[${i}] needs a \"type\".`, \"invalid_arguments\");\n return makeBlock(registry, b as { type: string });\n }),\n } as Section;\n}\n\nexport const insertSection = defineTool({\n name: \"insert_section\",\n title: \"Insert section\",\n description:\n \"Add a section to a page from a preset id (preferred — see list_section_presets) or an explicit section. Preset sections arrive with designed demo copy: replace it with the owner's real content using update_block. Header presets restyle the site header and footer presets replace the site footer (page is ignored for those). Returns the new section and block ids.\",\n input: z.object({\n site: siteArg,\n page: z\n .string()\n .optional()\n .describe(\"Page id/slug/title (not needed for header/footer presets).\"),\n preset: z\n .string()\n .optional()\n .describe('Preset id, e.g. \"hero/split-image@1\" (version optional).'),\n section: z\n .looseObject({})\n .optional()\n .describe(\n \"Explicit section ({layout, style, blocks:[{type, fields, variant?, column?}]}); ids are generated when omitted; rich text as Markdown.\",\n ),\n at: positionArg.optional(),\n colorTheme: themeArg.optional(),\n primaryLink: z\n .unknown()\n .optional()\n .describe(\n \"Link for the main call to action ({type:'page', page:'pg_…'} or {type:'url', url}).\",\n ),\n secondaryLink: z.unknown().optional(),\n collection: z.string().optional().describe(\"Collection for summary/events/product presets.\"),\n label: z.string().max(80).optional().describe(\"Layers label for the section.\"),\n }),\n annotations: {},\n async handler(ctx, input) {\n const siteId = await ctx.siteId(input.site);\n const doc = await ctx.doc(siteId);\n if (!!input.preset === !!input.section)\n throw new ToolError(\"Give exactly one of preset or section.\", \"invalid_arguments\");\n const links: Record<string, unknown> = {};\n for (const k of [\"primaryLink\", \"secondaryLink\"] as const) {\n if (input[k] === undefined) continue;\n const r = LinkSchema.safeParse(input[k]);\n if (!r.success)\n throw new ToolError(\n `${k} is not a valid link: ${r.error.issues.map((i) => i.message).join(\"; \")}`,\n \"invalid_arguments\",\n );\n links[k] = r.data;\n }\n if (input.preset) {\n const preset = findPreset(input.preset);\n const opts = { colorTheme: input.colorTheme, collection: input.collection, ...links };\n // The preset's example links (/book, /retreats…) point at pages this site has, so an\n // inserted preset never stops a publish; links passed in are checked the same way.\n const linkNote = (changes: LinkChange[]) =>\n changes.length\n ? {\n linksChanged: changes.map((c) => ({ from: c.from, to: c.to })),\n linkNote:\n \"Example links that lead nowhere on this site were pointed at existing pages; change them with update_block.\",\n }\n : {};\n if (preset.target === \"header\") {\n const { value: header, changes } = resolveInternalLinks(preset.build(opts), doc);\n await ctx.apply(siteId, [{ op: \"site.update\", set: { header } } as OpBody]);\n return {\n data: {\n applied: preset.id,\n header,\n note: \"The site header now uses this preset.\",\n ...linkNote(changes),\n },\n };\n }\n const { value: section, changes } = resolveInternalLinks(preset.build(opts) as Section, doc);\n if (input.label) section.label = input.label;\n if (preset.target === \"footer\") {\n await ctx.apply(siteId, [{ op: \"site.update\", set: { footer: section } } as OpBody]);\n return {\n data: {\n replaced: \"footer\",\n section: sectionSummary(ctx.registry, section),\n note: 'Edit footer blocks with page \"footer\".',\n ...linkNote(changes),\n },\n };\n }\n if (!input.page)\n throw new ToolError(\"page is required for page sections.\", \"invalid_arguments\");\n const page = pageOnly(doc, input.page);\n await ctx.apply(siteId, [\n { op: \"section.insert\", page, at: input.at ?? \"end\", section } as OpBody,\n ]);\n return {\n data: {\n page,\n section: sectionSummary(ctx.registry, section),\n copyGuidance: preset.copy.map((c) => `${c.label}: ${c.words[0]}–${c.words[1]} words`),\n next: \"Replace the demo copy with the owner's content (update_block), then run design_check.\",\n ...linkNote(changes),\n },\n };\n }\n if (!input.page) throw new ToolError(\"page is required.\", \"invalid_arguments\");\n const page = pageOnly(doc, input.page);\n const section = makeSection(ctx.registry, input.section as Record<string, unknown>);\n if (input.colorTheme)\n section.style = { ...(section.style ?? {}), colorTheme: input.colorTheme };\n if (input.label) section.label = input.label;\n await ctx.apply(siteId, [\n { op: \"section.insert\", page, at: input.at ?? \"end\", section } as OpBody,\n ]);\n return { data: { page, section: sectionSummary(ctx.registry, section) } };\n },\n});\n\nexport const updateSection = defineTool({\n name: \"update_section\",\n title: \"Update section\",\n description:\n 'Change a section\\'s settings with dot-path patches, e.g. set {\"style.colorTheme\": \"dark\", \"style.padding\": {\"d\": \"xl\", \"m\": \"lg\"}, \"label\": \"Intro\", \"anchor\": \"classes\", \"hidden\": true, \"layout\": {...}}. Shortcuts: colorTheme. Blocks are edited with the block tools.',\n input: z.object({\n site: siteArg,\n page: containerArg,\n section: z.string(),\n set: z.record(z.string(), z.unknown()).optional(),\n unset: z.array(z.string()).optional(),\n colorTheme: themeArg.optional(),\n }),\n annotations: { idempotentHint: true },\n async handler(ctx, input) {\n const siteId = await ctx.siteId(input.site);\n const doc = await ctx.doc(siteId);\n const page = container(doc, input.page);\n requireSection(doc, page, input.section);\n const set = { ...(input.set ?? {}) };\n if (input.colorTheme) set[\"style.colorTheme\"] = input.colorTheme;\n const body: Record<string, unknown> = { op: \"section.update\", page, section: input.section };\n if (Object.keys(set).length) body.set = set;\n if (input.unset?.length) body.unset = input.unset;\n const { doc: next } = await ctx.apply(siteId, [body as OpBody]);\n return {\n data: { section: sectionSummary(ctx.registry, requireSection(next, page, input.section)) },\n };\n },\n});\n\nexport const moveSection = defineTool({\n name: \"move_section\",\n title: \"Move section\",\n description: \"Reorder a section within its page.\",\n input: z.object({ site: siteArg, page: z.string(), section: z.string(), at: positionArg }),\n annotations: { idempotentHint: true },\n async handler(ctx, input) {\n const siteId = await ctx.siteId(input.site);\n const doc = await ctx.doc(siteId);\n const page = pageOnly(doc, input.page);\n requireSection(doc, page, input.section);\n const { doc: next } = await ctx.apply(siteId, [\n { op: \"section.move\", page, section: input.section, at: input.at } as OpBody,\n ]);\n return { data: { order: next.pages[page as never]?.sections.map((s: Section) => s.id) } };\n },\n});\n\nexport const deleteSection = defineTool({\n name: \"delete_section\",\n title: \"Delete section\",\n description:\n \"Remove a section and its blocks from a page (recoverable from the session snapshot or discard_draft).\",\n input: z.object({ site: siteArg, page: z.string(), section: z.string() }),\n annotations: { destructiveHint: true },\n async handler(ctx, input) {\n const siteId = await ctx.siteId(input.site);\n const doc = await ctx.doc(siteId);\n const page = pageOnly(doc, input.page);\n requireSection(doc, page, input.section);\n await ctx.apply(siteId, [{ op: \"section.delete\", page, section: input.section } as OpBody]);\n return { data: { deleted: input.section } };\n },\n});\n\nconst gridItemArg = z\n .looseObject({})\n .describe(\n \"Grid placement {d:{x,y,w,h,z?,bleed?}, t?, m?}: 24 columns on desktop/tablet, 8 on mobile, 1-based.\",\n );\n\nexport const insertBlock = defineTool({\n name: \"insert_block\",\n title: \"Insert block\",\n description:\n \"Add a block to a section. Fields are validated against the block type (see list_blocks); rich text as Markdown. In stack sections pick a column (0-based); in grid sections give place (auto-placed at the bottom otherwise) and then check the mobile layout (auto_mobile_layout).\",\n input: z.object({\n site: siteArg,\n page: containerArg,\n section: z.string(),\n block: z\n .looseObject({\n type: z.string(),\n fields: z.record(z.string(), z.unknown()).optional(),\n variant: z.string().optional(),\n style: z.record(z.string(), z.unknown()).optional(),\n column: z.int().min(0).max(3).optional(),\n label: z.string().optional(),\n })\n .describe(\"{type, fields, variant?, style?, column?, label?}\"),\n at: positionArg.optional(),\n place: gridItemArg.optional(),\n }),\n annotations: {},\n async handler(ctx, input) {\n const siteId = await ctx.siteId(input.site);\n const doc = await ctx.doc(siteId);\n const page = container(doc, input.page);\n requireSection(doc, page, input.section);\n const made = makeBlock(ctx.registry, input.block as { type: string });\n // Demo links from the block's defaults (/schedule…) point at pages this site has; links\n // the caller gave are kept as given (design_check reports them if they lead nowhere).\n const block = resolveInternalLinks(made, doc).value;\n for (const k of Object.keys(input.block.fields ?? {}))\n if (k in made.fields) block.fields[k] = made.fields[k];\n const body: Record<string, unknown> = {\n op: \"block.insert\",\n page,\n section: input.section,\n at: input.at ?? \"end\",\n block,\n };\n if (input.place) body.place = input.place;\n const { doc: next, warnings } = await ctx.apply(siteId, [body as OpBody]);\n const placed = findBlock(next, page as never, block.id);\n return {\n data: {\n block: blockSummary(ctx.registry, placed?.block ?? block),\n ...(warnings.length ? { warnings } : {}),\n },\n };\n },\n});\n\nexport const updateBlock = defineTool({\n name: \"update_block\",\n title: \"Update block\",\n description:\n \"Edit a block: set replaces whole top-level fields (rich text as Markdown; lists are replaced whole), unset removes optional fields; variant/style/column/label/hidden adjust presentation (null removes). Ids are preserved.\",\n input: z.object({\n site: siteArg,\n page: containerArg,\n block: z.string(),\n set: z.record(z.string(), z.unknown()).optional(),\n unset: z.array(z.string()).optional(),\n variant: z.string().nullable().optional(),\n style: z.record(z.string(), z.unknown()).nullable().optional(),\n column: z.int().min(0).max(3).nullable().optional(),\n label: z.string().max(80).nullable().optional(),\n hidden: z.boolean().nullable().optional(),\n }),\n annotations: { idempotentHint: true },\n async handler(ctx, input) {\n const siteId = await ctx.siteId(input.site);\n const doc = await ctx.doc(siteId);\n const page = container(doc, input.page);\n const { block } = requireBlock(doc, page, input.block);\n const body: Record<string, unknown> = { op: \"block.update\", page, block: input.block };\n if (input.set) body.set = fieldsFromAgent(ctx.registry, block.type, input.set);\n if (input.unset?.length) body.unset = input.unset;\n for (const k of [\"variant\", \"style\", \"column\", \"label\", \"hidden\"] as const)\n if (input[k] !== undefined) body[k] = input[k];\n if (Object.keys(body).length === 3)\n throw new ToolError(\n \"Nothing to change: give set, unset, variant, style, column, label or hidden.\",\n \"invalid_arguments\",\n );\n const { doc: next } = await ctx.apply(siteId, [body as OpBody]);\n const updated = findBlock(next, page as never, input.block)?.block ?? block;\n return { data: { block: blockSummary(ctx.registry, updated) } };\n },\n});\n\nexport const moveBlock = defineTool({\n name: \"move_block\",\n title: \"Move block\",\n description:\n \"Move a block within its page (to another section and/or position). Give column for stack sections and place for grid sections.\",\n input: z.object({\n site: siteArg,\n page: containerArg,\n block: z.string(),\n to: z.object({\n section: z.string(),\n at: positionArg.optional(),\n column: z.int().min(0).max(3).nullable().optional(),\n place: gridItemArg.optional(),\n }),\n }),\n annotations: { idempotentHint: true },\n async handler(ctx, input) {\n const siteId = await ctx.siteId(input.site);\n const doc = await ctx.doc(siteId);\n const page = container(doc, input.page);\n requireBlock(doc, page, input.block);\n requireSection(doc, page, input.to.section);\n const to: Record<string, unknown> = { section: input.to.section, at: input.to.at ?? \"end\" };\n if (input.to.column !== undefined) to.column = input.to.column;\n if (input.to.place) to.place = input.to.place;\n await ctx.apply(siteId, [{ op: \"block.move\", page, block: input.block, to } as OpBody]);\n return { data: { moved: input.block, to } };\n },\n});\n\nexport const deleteBlock = defineTool({\n name: \"delete_block\",\n title: \"Delete block\",\n description:\n \"Remove a block from its section (recoverable via the session snapshot or discard_draft).\",\n input: z.object({ site: siteArg, page: containerArg, block: z.string() }),\n annotations: { destructiveHint: true },\n async handler(ctx, input) {\n const siteId = await ctx.siteId(input.site);\n const doc = await ctx.doc(siteId);\n const page = container(doc, input.page);\n requireBlock(doc, page, input.block);\n await ctx.apply(siteId, [{ op: \"block.delete\", page, block: input.block } as OpBody]);\n return { data: { deleted: input.block } };\n },\n});\n\nconst rectArg = z\n .looseObject({})\n .describe(\n \"{x, y, w, h, z?, bleed?: 'left'|'right'|'both'} (1-based; 24 columns desktop/tablet, 8 mobile)\",\n );\n\nexport const placeInGrid = defineTool({\n name: \"place_in_grid\",\n title: \"Place in grid\",\n description:\n \"Set a block's grid placement per breakpoint in a grid section. d = desktop (required on first placement), t = tablet override (null removes), m = mobile (null removes; regenerate with auto_mobile_layout). Rows grow automatically. Overlap is allowed (use z) but text must not overlap text.\",\n input: z.object({\n site: siteArg,\n page: containerArg,\n section: z.string(),\n block: z.string(),\n d: rectArg.optional(),\n t: rectArg.nullable().optional(),\n m: rectArg.nullable().optional(),\n }),\n annotations: { idempotentHint: true },\n async handler(ctx, input) {\n const siteId = await ctx.siteId(input.site);\n const doc = await ctx.doc(siteId);\n const page = container(doc, input.page);\n const section = requireSection(doc, page, input.section);\n if (section.layout.mode !== \"grid\")\n throw new ToolError(\n `Section ${section.id} is a stack section; set the block's column with update_block instead.`,\n \"invalid_arguments\",\n );\n const bodies: OpBody[] = [];\n for (const bp of [\"d\", \"t\", \"m\"] as const) {\n const rect = input[bp];\n if (rect === undefined) continue;\n bodies.push({\n op: \"grid.place\",\n page,\n section: section.id,\n block: input.block,\n bp,\n rect,\n } as OpBody);\n }\n if (!bodies.length) throw new ToolError(\"Give at least one of d, t or m.\", \"invalid_arguments\");\n const { doc: next } = await ctx.apply(siteId, bodies);\n const after = requireSection(next, page, section.id);\n return {\n data: {\n placement: after.layout.mode === \"grid\" ? after.layout.items[input.block as never] : null,\n rows: after.layout.mode === \"grid\" ? after.layout.rows : null,\n next:\n input.d && input.m === undefined\n ? \"Desktop changed: review mobile (auto_mobile_layout or screenshot device mobile).\"\n : undefined,\n },\n };\n },\n});\n\nexport const autoMobileLayout = defineTool({\n name: \"auto_mobile_layout\",\n title: \"Auto mobile layout\",\n description:\n \"Generate mobile grid placements for a grid section by visual reading order (top-to-bottom, left-to-right on the desktop grid, layered items kept on their host). Keeps existing mobile placements unless reset is true.\",\n input: z.object({\n site: siteArg,\n page: containerArg,\n section: z.string(),\n reset: z.boolean().optional(),\n }),\n annotations: { idempotentHint: true },\n async handler(ctx, input) {\n const siteId = await ctx.siteId(input.site);\n const doc = await ctx.doc(siteId);\n const page = container(doc, input.page);\n const section = requireSection(doc, page, input.section);\n if (section.layout.mode !== \"grid\")\n return { data: { changed: 0, note: \"Stack sections stack automatically on mobile.\" } };\n const ops = autoMobileLayoutOps(doc, page, section.id, { reset: input.reset });\n if (!ops.length)\n return { data: { changed: 0, note: \"Mobile placements are already complete.\" } };\n const bodies = ops.map(({ id: _i, actor: _a, ts: _t, ...b }) => b as OpBody);\n const { doc: next } = await ctx.apply(siteId, bodies);\n const after = requireSection(next, page, section.id);\n return {\n data: {\n changed: ops.length,\n mobile:\n after.layout.mode === \"grid\"\n ? Object.fromEntries(Object.entries(after.layout.items).map(([id, it]) => [id, it.m]))\n : null,\n },\n };\n },\n});\n\nexport const editTools = [\n insertSection,\n updateSection,\n moveSection,\n deleteSection,\n insertBlock,\n updateBlock,\n moveBlock,\n deleteBlock,\n placeInGrid,\n autoMobileLayout,\n];\n\nexport type { ToolContext };\n","import { type OpBody, pruneNav } from \"@omniharmonic/openspace-ops\";\nimport {\n COLOR_THEMES,\n type CollectionItem,\n type CollectionKind,\n FRONTMATTER_SCHEMAS,\n type NavItem,\n newId,\n type Page,\n resolveInternalLinks,\n type Section,\n type SiteDocument,\n withPages,\n} from \"@omniharmonic/openspace-schema\";\nimport { z } from \"zod\";\nimport { pagePathOf, resolvePage } from \"../context\";\nimport { ToolError } from \"../errors\";\nimport { confirmArg, defineTool, siteArg } from \"../tool\";\nimport { makeSection, sectionSummary } from \"./edit\";\nimport { findPreset } from \"./read\";\n\nfunction requireConfirm(confirm: boolean | undefined, what: string) {\n if (confirm !== true)\n throw new ToolError(\n `${what} needs confirm: true. Ask the owner before doing this.`,\n \"confirmation_required\",\n );\n}\n\nconst slugify = (s: string) =>\n s\n .toLowerCase()\n .normalize(\"NFKD\")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 60);\n\n/** Add a page link to the nav, before any trailing button (the header CTA stays last). */\nfunction navWithPage(nav: readonly NavItem[], pageId: string, label?: string): NavItem[] {\n const item = { type: \"page\", page: pageId, ...(label ? { label } : {}) } as NavItem;\n const out = [...nav];\n let at = out.length;\n while (at > 0 && out[at - 1]?.type === \"button\") at--;\n out.splice(at, 0, item);\n return out;\n}\n\nexport const createPage = defineTool({\n name: \"create_page\",\n title: \"Create page\",\n description:\n 'Create a page, optionally composed from section presets in order (fastest way to draft a page: presets [\"hero/…\", \"services/…\", \"testimonials/…\", \"cta/…\"]) and added to the navigation (default true). Replace the presets\\' demo copy afterwards with update_block.',\n input: z.object({\n site: siteArg,\n title: z.string().min(1).max(200),\n slug: z\n .string()\n .optional()\n .describe('URL slug (\"about\", \"services/massage\"); default from the title.'),\n presets: z.array(z.string()).max(20).optional().describe(\"Preset ids to build, in order.\"),\n themes: z\n .array(z.enum(COLOR_THEMES))\n .optional()\n .describe(\"Color theme per preset (same order); default each preset's own.\"),\n sections: z.array(z.looseObject({})).optional().describe(\"Explicit sections (after presets).\"),\n description: z\n .string()\n .max(300)\n .optional()\n .describe(\"SEO description (50–160 characters is best).\"),\n addToNav: z.boolean().optional(),\n navLabel: z.string().max(60).optional(),\n hidden: z.boolean().optional(),\n }),\n annotations: {},\n async handler(ctx, input) {\n const siteId = await ctx.siteId(input.site);\n const doc = await ctx.doc(siteId);\n const slug =\n input.slug !== undefined ? input.slug.replace(/^\\/+|\\/+$/g, \"\") : slugify(input.title);\n const sections: Section[] = [];\n (input.presets ?? []).forEach((id, i) => {\n const preset = findPreset(id);\n if (preset.target !== \"page\")\n throw new ToolError(\n `Preset ${preset.id} is a ${preset.target} preset; use insert_section for it.`,\n \"invalid_arguments\",\n );\n const colorTheme = input.themes?.[i];\n sections.push(preset.build(colorTheme ? { colorTheme } : {}) as Section);\n });\n const page: Page = {\n id: newId(\"pg\") as Page[\"id\"],\n title: input.title,\n slug,\n seo: input.description ? { description: input.description } : {},\n sections,\n } as Page;\n // The presets' example links (/book, /retreats…) point at pages the site has (or this\n // one); explicit sections are kept as given.\n const linked = resolveInternalLinks(sections, withPages(doc, [page]));\n page.sections = linked.value;\n for (const raw of input.sections ?? []) page.sections.push(makeSection(ctx.registry, raw));\n if (input.hidden) page.hidden = true;\n const body: Record<string, unknown> = { op: \"page.create\", page };\n if (input.addToNav !== false && !input.hidden)\n body.nav = navWithPage(doc.site.nav, page.id, input.navLabel);\n await ctx.apply(siteId, [body as OpBody]);\n return {\n data: {\n page: { id: page.id, title: page.title, slug: page.slug, path: pagePathOf(page) },\n sections: page.sections.map((s) => sectionSummary(ctx.registry, s)),\n inNav: Boolean(body.nav),\n ...(linked.changes.length\n ? {\n linksChanged: linked.changes.map((c) => ({ from: c.from, to: c.to })),\n linkNote:\n \"Example links that lead nowhere on this site were pointed at existing pages; change them with update_block.\",\n }\n : {}),\n },\n };\n },\n});\n\nexport const updatePage = defineTool({\n name: \"update_page\",\n title: \"Update page\",\n description:\n 'Change page settings with dot paths, e.g. set {\"title\": \"About us\", \"slug\": \"about-us\", \"seo.description\": \"…\", \"seo.title\": \"…\", \"hidden\": true, \"header.transparentOnHero\": true}.',\n input: z.object({\n site: siteArg,\n page: z.string(),\n set: z.record(z.string(), z.unknown()).optional(),\n unset: z.array(z.string()).optional(),\n }),\n annotations: { idempotentHint: true },\n async handler(ctx, input) {\n const siteId = await ctx.siteId(input.site);\n const doc = await ctx.doc(siteId);\n const { id } = resolvePage(doc, input.page);\n if (!input.set && !input.unset?.length)\n throw new ToolError(\"Give set or unset.\", \"invalid_arguments\");\n const code = [...Object.keys(input.set ?? {}), ...(input.unset ?? [])].filter((p) =>\n /^(headInjection|footerInjection)(\\.|$)/.test(p),\n );\n if (code.length)\n throw new ToolError(\n `These settings can't be changed here: ${code.join(\", \")}.`,\n \"forbidden\",\n [],\n \"Per-page custom code is changed by the owner in Studio's page settings (Advanced).\",\n );\n const body: Record<string, unknown> = { op: \"page.update\", page: id };\n if (input.set) body.set = input.set;\n if (input.unset?.length) body.unset = input.unset;\n const { doc: next } = await ctx.apply(siteId, [body as OpBody]);\n const p = next.pages[id as never] as Page;\n return {\n data: { page: { id: p.id, title: p.title, slug: p.slug, path: pagePathOf(p), seo: p.seo } },\n };\n },\n});\n\nexport const deletePage = defineTool({\n name: \"delete_page\",\n title: \"Delete page\",\n description:\n \"Delete a page and remove it from the navigation. Destructive: requires confirm: true after the owner agrees.\",\n input: z.object({ site: siteArg, page: z.string(), confirm: confirmArg }),\n annotations: { destructiveHint: true },\n async handler(ctx, input) {\n requireConfirm(input.confirm, \"Deleting a page\");\n const siteId = await ctx.siteId(input.site);\n const doc = await ctx.doc(siteId);\n const { id, page } = resolvePage(doc, input.page);\n const { warnings } = await ctx.apply(siteId, [\n { op: \"page.delete\", page: id, nav: pruneNav(doc.site.nav, id) } as OpBody,\n ]);\n return {\n data: {\n deleted: { id, title: page?.title },\n ...(warnings.length ? { warnings: warnings.map((w) => w.message) } : {}),\n },\n };\n },\n});\n\nexport const updateNavigation = defineTool({\n name: \"update_navigation\",\n title: \"Update navigation\",\n description:\n 'Replace the navigation tree. Items: {type:\"page\", page:\"pg_…\", label?}, {type:\"collection\", collection, label}, {type:\"link\", label, href, newTab?}, {type:\"button\", label, link, style:\"primary\"|\"secondary\"|\"tertiary\"}, {type:\"folder\", label, page?, items:[…one level…]}. Keep one button at most (the header call to action).',\n input: z.object({ site: siteArg, tree: z.array(z.looseObject({})) }),\n annotations: { idempotentHint: true },\n async handler(ctx, input) {\n const siteId = await ctx.siteId(input.site);\n const { doc } = await ctx.apply(siteId, [{ op: \"nav.update\", tree: input.tree } as OpBody]);\n return { data: { nav: doc.site.nav } };\n },\n});\n\nconst SITE_FORBIDDEN = [\"nav\", \"customCss\", \"headInjection\", \"footerInjection\"];\n\nexport const updateSite = defineTool({\n name: \"update_site\",\n title: \"Update site settings\",\n description:\n 'Change site settings with dot paths: title, tagline, header (variant, sticky, mobileMenu…), announcement, social, seo, locale. Navigation goes through update_navigation; footer blocks through the block tools with page \"footer\". Custom code (customCss, head/footer injection) can\\'t be changed through MCP.',\n input: z.object({\n site: siteArg,\n set: z.record(z.string(), z.unknown()).optional(),\n unset: z.array(z.string()).optional(),\n }),\n annotations: { idempotentHint: true },\n async handler(ctx, input) {\n const siteId = await ctx.siteId(input.site);\n const paths = [...Object.keys(input.set ?? {}), ...(input.unset ?? [])];\n const bad = paths.filter((p) => SITE_FORBIDDEN.includes(p.split(\".\")[0] ?? \"\"));\n if (bad.length)\n throw new ToolError(\n `These settings can't be changed here: ${bad.join(\", \")}.`,\n \"forbidden\",\n [],\n \"Use update_navigation for the menu; custom code is changed by the owner in Studio's Advanced settings.\",\n );\n if (!paths.length) throw new ToolError(\"Give set or unset.\", \"invalid_arguments\");\n const body: Record<string, unknown> = { op: \"site.update\" };\n if (input.set) body.set = input.set;\n if (input.unset?.length) body.unset = input.unset;\n const { doc } = await ctx.apply(siteId, [body as OpBody]);\n return {\n data: {\n title: doc.site.title,\n tagline: doc.site.tagline ?? null,\n header: doc.site.header,\n announcement: doc.site.announcement ?? null,\n },\n };\n },\n});\n\nexport const uploadImage = defineTool({\n name: \"upload_image\",\n title: \"Upload image\",\n description:\n 'Add an image to the site\\'s media from an https URL or base64 data. It is stored at most 2400px on the long edge with metadata stripped. alt describes the image\\'s purpose (\"\" only for decorative images). Use the returned src in image fields as {\"src\": src, \"alt\": alt}.',\n input: z.object({\n site: siteArg,\n url: z.string().optional(),\n base64: z.string().optional(),\n alt: z.string().max(500),\n filename: z.string().max(120).optional(),\n credit: z\n .object({\n author: z.string().optional(),\n url: z.string().optional(),\n source: z.string().optional(),\n })\n .optional(),\n license: z.string().max(200).optional(),\n }),\n annotations: { openWorldHint: true },\n async handler(ctx, input) {\n const siteId = await ctx.siteId(input.site);\n const session = await ctx.session(siteId);\n const meta = await ctx.store.uploadImage(\n siteId,\n {\n url: input.url,\n base64: input.base64,\n alt: input.alt,\n filename: input.filename,\n credit: input.credit,\n license: input.license,\n },\n { actor: session.actor, session: session.sessionId },\n );\n return {\n data: {\n src: meta.path,\n alt: meta.alt ?? \"\",\n width: meta.width,\n height: meta.height,\n bytes: meta.bytes,\n mediaId: meta.id,\n imageValue: { src: meta.path, alt: meta.alt ?? \"\" },\n },\n };\n },\n});\n\n// --- collections (blog posts, events, …) -----------------------------------------------------\n\nfunction collectionKindOf(doc: SiteDocument, name: string): CollectionKind | null {\n const cfgKind = doc.collectionConfigs?.[name]?.kind;\n if (cfgKind && cfgKind !== \"custom\") return cfgKind;\n const first = Object.values(doc.collections[name] ?? {})[0];\n return first?.kind ?? null;\n}\n\nfunction defaultCollection(doc: SiteDocument): string | null {\n const names = new Set([\n ...Object.keys(doc.collections),\n ...Object.keys(doc.collectionConfigs ?? {}),\n ]);\n for (const n of names) if (collectionKindOf(doc, n) === \"blog\") return n;\n return null;\n}\n\nfunction itemView(item: CollectionItem, withBody: boolean) {\n return {\n slug: item.slug,\n kind: item.kind,\n ...item.frontmatter,\n ...(withBody ? { body: item.body } : {}),\n };\n}\n\nconst today = (ms: number) => new Date(ms).toISOString().slice(0, 10);\n\nexport const createPost = defineTool({\n name: \"create_post\",\n title: \"Create post\",\n description:\n 'Create a blog post (or an item in another collection). body is Markdown; Markdoc tags like {% button href=\"/contact\" %}Book{% /button %} embed blocks. New posts are drafts unless status is \"published\" (or \"scheduled\" with publishAt). Never invent facts, quotes or prices.',\n input: z.object({\n site: siteArg,\n collection: z\n .string()\n .optional()\n .describe(\"Collection name (default: the site's blog collection).\"),\n title: z.string().min(1).max(200),\n slug: z.string().optional().describe(\"Default: <date>-<title>.\"),\n body: z.string().max(200_000),\n date: z\n .string()\n .optional()\n .describe(\n \"YYYY-MM-DD. Used by kinds whose frontmatter has a date (blog and podcast require one and default to today; portfolio keeps it when given).\",\n ),\n excerpt: z.string().max(500).optional(),\n image: z.string().optional().describe(\"media/… path or https URL.\"),\n imageAlt: z.string().optional(),\n tags: z.array(z.string()).optional(),\n categories: z.array(z.string()).optional(),\n author: z.string().optional(),\n status: z.enum([\"draft\", \"scheduled\", \"published\"]).optional(),\n publishAt: z.string().optional(),\n frontmatter: z\n .record(z.string(), z.unknown())\n .optional()\n .describe(\n \"Extra frontmatter for non-blog kinds — events: start, end (ISO date-times with a UTC offset, e.g. 2026-11-21T14:00:00-08:00, or YYYY-MM-DD with allDay), timezone, location; products: price {amount in minor units, currency}; podcast: audio.\",\n ),\n }),\n annotations: {},\n async handler(ctx, input) {\n const siteId = await ctx.siteId(input.site);\n const doc = await ctx.doc(siteId);\n const collection = input.collection ?? defaultCollection(doc) ?? \"blog\";\n const kind = collectionKindOf(doc, collection) ?? \"blog\";\n const date = input.date ?? today(ctx.now());\n const slug = input.slug ?? `${date}-${slugify(input.title)}`.slice(0, 80);\n if (doc.collections[collection]?.[slug])\n throw new ToolError(`${collection}/${slug} already exists; use update_post.`, \"conflict\");\n const fm: Record<string, unknown> = {\n ...(input.frontmatter ?? {}),\n title: input.title,\n status: input.status ?? \"draft\",\n };\n const dateField = frontmatterField(kind, \"date\");\n if (dateField === \"required\") fm.date = input.date ?? fm.date ?? date;\n else if (dateField === \"optional\" && input.date !== undefined) fm.date = input.date;\n for (const k of [\n \"excerpt\",\n \"image\",\n \"imageAlt\",\n \"tags\",\n \"categories\",\n \"author\",\n \"publishAt\",\n ] as const)\n if (input[k] !== undefined) fm[k] = input[k];\n const r = FRONTMATTER_SCHEMAS[kind].safeParse(fm);\n if (!r.success)\n throw new ToolError(\n `Invalid ${kind} frontmatter:\\n${r.error.issues.map((i) => `- ${i.path.join(\".\") || \"(root)\"}: ${i.message}`).join(\"\\n\")}`,\n \"invalid_arguments\",\n );\n const item = { kind, slug, frontmatter: fm, body: input.body } as CollectionItem;\n await ctx.apply(siteId, [{ op: \"collection.upsert\", collection, item } as OpBody]);\n return { data: { collection, item: itemView(item, false), path: `/${collection}/${slug}/` } };\n },\n});\n\n/** Whether a collection kind's frontmatter has `key`, and whether it's required. */\nfunction frontmatterField(kind: keyof typeof FRONTMATTER_SCHEMAS, key: string) {\n const shape = (FRONTMATTER_SCHEMAS[kind] as unknown as { shape?: Record<string, z.ZodType> })\n .shape;\n const field = shape?.[key];\n if (!field) return \"absent\" as const;\n return field.safeParse(undefined).success ? (\"optional\" as const) : (\"required\" as const);\n}\n\nexport const updatePost = defineTool({\n name: \"update_post\",\n title: \"Update post\",\n description:\n 'Edit a collection item: frontmatter fields to set (title, excerpt, tags, status \"published\" to publish it with the next site publish…) and/or a new Markdown body.',\n input: z.object({\n site: siteArg,\n collection: z.string().optional(),\n slug: z.string(),\n set: z.record(z.string(), z.unknown()).optional().describe(\"Frontmatter fields; null removes.\"),\n body: z.string().max(200_000).optional(),\n }),\n annotations: { idempotentHint: true },\n async handler(ctx, input) {\n const siteId = await ctx.siteId(input.site);\n const doc = await ctx.doc(siteId);\n const collection = input.collection ?? defaultCollection(doc) ?? \"blog\";\n const existing = doc.collections[collection]?.[input.slug];\n if (!existing)\n throw new ToolError(\n `No item ${collection}/${input.slug}. Items: ${Object.keys(doc.collections[collection] ?? {}).join(\", \") || \"none\"}.`,\n \"not_found\",\n );\n const fm: Record<string, unknown> = { ...existing.frontmatter };\n for (const [k, v] of Object.entries(input.set ?? {})) {\n if (v === null) delete fm[k];\n else fm[k] = v;\n }\n const r = FRONTMATTER_SCHEMAS[existing.kind].safeParse(fm);\n if (!r.success)\n throw new ToolError(\n `Invalid ${existing.kind} frontmatter:\\n${r.error.issues.map((i) => `- ${i.path.join(\".\") || \"(root)\"}: ${i.message}`).join(\"\\n\")}`,\n \"invalid_arguments\",\n );\n const item = {\n ...existing,\n frontmatter: fm,\n body: input.body ?? existing.body,\n } as CollectionItem;\n await ctx.apply(siteId, [{ op: \"collection.upsert\", collection, item } as OpBody]);\n return { data: { collection, item: itemView(item, false) } };\n },\n});\n\nexport const listPosts = defineTool({\n name: \"list_posts\",\n title: \"List posts\",\n description:\n \"Items in a collection (default: the blog), newest first, with frontmatter. withBody includes the Markdown bodies.\",\n input: z.object({\n site: siteArg,\n collection: z.string().optional(),\n status: z.enum([\"draft\", \"scheduled\", \"published\"]).optional(),\n withBody: z.boolean().optional(),\n }),\n annotations: { readOnlyHint: true },\n async handler(ctx, input) {\n const siteId = await ctx.siteId(input.site);\n const doc = await ctx.doc(siteId);\n const collection = input.collection ?? defaultCollection(doc);\n const names = Object.keys(doc.collections);\n if (!collection || !doc.collections[collection])\n return { data: { collection, items: [], collections: names } };\n const items = Object.values(doc.collections[collection])\n .filter((i) => !input.status || i.frontmatter.status === input.status)\n .sort((a, b) =>\n String((b.frontmatter as { date?: string }).date ?? b.slug).localeCompare(\n String((a.frontmatter as { date?: string }).date ?? a.slug),\n ),\n )\n .map((i) => itemView(i, Boolean(input.withBody)));\n return { data: { collection, items, collections: names } };\n },\n});\n\nexport const pageTools = [\n createPage,\n updatePage,\n deletePage,\n updateNavigation,\n updateSite,\n uploadImage,\n createPost,\n updatePost,\n listPosts,\n];\n\nexport { requireConfirm };\n","import { z } from \"zod\";\nimport { ToolError } from \"../errors\";\nimport { confirmArg, defineTool, siteArg } from \"../tool\";\nimport { requireConfirm } from \"./pages\";\n\nexport const getDraftDiff = defineTool({\n name: \"get_draft_diff\",\n title: \"Unpublished changes\",\n description: \"Plain-language summary of the changes in the draft that are not published yet.\",\n input: z.object({ site: siteArg }),\n annotations: { readOnlyHint: true },\n async handler(ctx, input) {\n const siteId = await ctx.siteId(input.site);\n return { data: await ctx.store.getDraftDiff(siteId) };\n },\n});\n\nexport const publish = defineTool({\n name: \"publish\",\n title: \"Publish\",\n description:\n \"Publish the draft so the live site updates. Only after the owner explicitly asks: requires confirm: true and a connection allowed to publish. Run design_check first; message summarises the change (default: generated from the edits).\",\n input: z.object({\n site: siteArg,\n message: z.string().max(500).optional(),\n confirm: confirmArg,\n }),\n annotations: { destructiveHint: true, openWorldHint: true },\n async handler(ctx, input) {\n const siteId = await ctx.siteId(input.site);\n if (!ctx.grant.publish)\n throw new ToolError(\n \"This connection isn't allowed to publish. The owner can publish from Studio, or allow publishing for this connection.\",\n \"forbidden\",\n );\n if (!ctx.store.capabilities.canPublish)\n throw new ToolError(\n `Publishing isn't available here. ${ctx.store.capabilities.publishNote ?? \"\"}`.trim(),\n \"unsupported\",\n );\n requireConfirm(input.confirm, \"Publishing\");\n const session = await ctx.session(siteId);\n const r = await ctx.store.publish(siteId, { message: input.message, actor: session.actor });\n return {\n data: r,\n text:\n r.status === \"no_changes\"\n ? \"Nothing to publish: the draft matches the live site.\"\n : `Published${r.version ? ` (${r.version.slice(0, 9)})` : \"\"}: ${r.summary}${r.note ? `\\n${r.note}` : \"\"}`,\n };\n },\n});\n\nexport const discardDraft = defineTool({\n name: \"discard_draft\",\n title: \"Discard draft\",\n description:\n \"Throw away every unpublished change (including other people's) and return the draft to the live version. Destructive: requires confirm: true after the owner agrees.\",\n input: z.object({ site: siteArg, confirm: confirmArg }),\n annotations: { destructiveHint: true },\n async handler(ctx, input) {\n requireConfirm(input.confirm, \"Discarding the draft\");\n const siteId = await ctx.siteId(input.site);\n const role = ctx.roleFor(siteId);\n if (role && role !== \"owner\" && role !== \"designer\")\n throw new ToolError(\n `Discarding the whole draft throws away everyone's unpublished work, so it needs a designer or owner (your role: ${role}).`,\n \"forbidden\",\n );\n const session = await ctx.session(siteId);\n const r = await ctx.store.discardDraft(siteId, {\n actor: session.actor,\n session: session.sessionId,\n });\n return {\n data: { discarded: r.hasChanges, summary: r.summary },\n text: r.hasChanges ? `Discarded: ${r.summary}` : \"There were no unpublished changes.\",\n };\n },\n});\n\nexport const listVersions = defineTool({\n name: \"list_versions\",\n title: \"List versions\",\n description: \"Published versions, newest first (for rollback).\",\n input: z.object({ site: siteArg, limit: z.int().min(1).max(100).optional() }),\n annotations: { readOnlyHint: true },\n async handler(ctx, input) {\n const siteId = await ctx.siteId(input.site);\n if (!ctx.store.capabilities.canRollback)\n return { data: { versions: [], note: \"This store keeps no version history.\" } };\n return { data: { versions: await ctx.store.listVersions(siteId, { limit: input.limit }) } };\n },\n});\n\nexport const rollback = defineTool({\n name: \"rollback\",\n title: \"Roll back\",\n description:\n \"Restore the live site to an earlier published version (from list_versions). Requires confirm: true and publish permission; unpublished work is kept in a snapshot where the store supports it.\",\n input: z.object({ site: siteArg, version: z.string(), confirm: confirmArg }),\n annotations: { destructiveHint: true, openWorldHint: true },\n async handler(ctx, input) {\n const siteId = await ctx.siteId(input.site);\n if (!ctx.grant.publish)\n throw new ToolError(\n \"This connection isn't allowed to publish, so it can't roll back either.\",\n \"forbidden\",\n );\n if (!ctx.store.capabilities.canRollback)\n throw new ToolError(\"Rolling back isn't available here.\", \"unsupported\");\n requireConfirm(input.confirm, \"Rolling back\");\n const session = await ctx.session(siteId);\n const r = await ctx.store.rollback(siteId, input.version, {\n actor: session.actor,\n session: session.sessionId,\n });\n return { data: r };\n },\n});\n\nexport const createSnapshot = defineTool({\n name: \"create_snapshot\",\n title: \"Create snapshot\",\n description:\n \"Save a named snapshot of the draft before a risky change (e.g. before restyling). A snapshot is also taken automatically before your first edit in each session.\",\n input: z.object({\n site: siteArg,\n name: z.string().regex(/^[a-z0-9][a-z0-9-]{0,40}$/, \"lowercase letters, digits and dashes\"),\n }),\n annotations: {},\n async handler(ctx, input) {\n const siteId = await ctx.siteId(input.site);\n const tag = await ctx.store.snapshot(siteId, input.name);\n return {\n data: { snapshot: tag, ...(tag ? {} : { note: \"This store can't take snapshots.\" }) },\n };\n },\n});\n\nexport const publishTools = [\n getDraftDiff,\n publish,\n discardDraft,\n listVersions,\n rollback,\n createSnapshot,\n];\n","import type { ToolDefinition } from \"../tool\";\nimport { designTools } from \"./design\";\nimport { editTools } from \"./edit\";\nimport { pageTools } from \"./pages\";\nimport { publishTools } from \"./publish\";\nimport {\n getBlockSchema,\n getPage,\n getSite,\n listBlocks,\n listSectionPresets,\n listSites,\n} from \"./read\";\n\n/** Every tool, in the order `tools/list` returns them (read → edit → design → publish). */\nexport const ALL_TOOLS: readonly ToolDefinition[] = [\n listSites,\n getSite,\n getPage,\n listBlocks,\n getBlockSchema,\n listSectionPresets,\n ...editTools,\n ...pageTools,\n ...designTools,\n ...publishTools,\n] as unknown as ToolDefinition[];\n\nexport * from \"./design\";\nexport * from \"./edit\";\nexport * from \"./pages\";\nexport * from \"./publish\";\nexport * from \"./read\";\n","/**\n * `FileSiteStore`: the MCP tools against a local site checkout. Reads and writes go through\n * site-kit's content loader/writer (formatting-stable), every edit is validated `@omniharmonic/openspace-ops`\n * operations, and with git:\n * - the draft is the working tree, the published version is HEAD;\n * - `publish` commits `content/` and `media/` on the current branch (push to deploy);\n * - snapshots (one at the start of each agent session) are `os/snap/<name>` tags on commits\n * made from a temporary index, so the person's index and branch are untouched;\n * - discard/rollback snapshot the working tree first.\n * Without git the baseline is the content as it was when the server started.\n */\nimport { existsSync } from \"node:fs\";\nimport { mkdir, mkdtemp, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { blocksRegistry } from \"@omniharmonic/openspace-blocks\";\nimport {\n type AgentSession,\n type ApplyContext,\n type ApplyResult,\n type DraftDiff,\n type ImageResizer,\n type ImageUploadInput,\n type PublishResult,\n prepareImage,\n type Screenshot,\n type ScreenshotRequest,\n type SiteStore,\n type SiteSummary,\n type StoreCapabilities,\n type TemplateCatalog,\n ToolError,\n type VersionInfo,\n} from \"@omniharmonic/openspace-mcp-tools\";\nimport { diff, type Op, summarize, validateAll } from \"@omniharmonic/openspace-ops\";\nimport type { BlockRegistry, MediaMeta, SiteDocument } from \"@omniharmonic/openspace-schema\";\nimport { loadSiteDocument, writeSiteDocument } from \"@omniharmonic/openspace-site-kit/content\";\nimport { Git } from \"./git\";\nimport { type PreviewServer, startPreviewServer } from \"./preview-server\";\nimport type { Screenshotter } from \"./screenshot\";\n\n/** What snapshots capture (read-only), relative to the site folder. */\nconst TRACKED = [\"content\", \"media\", \"openspace.json\"];\n/** What agents may change, stage and commit: never `openspace.json`, `src/` or workflows. */\nconst WRITABLE = [\"content\", \"media\"];\nconst CONFIG_FILE = \"openspace.json\";\n/** A rollback target: a commit sha (7–40 hex) or a snapshot tag. */\nconst VERSION_RE = /^(?:[0-9a-f]{7,40}|os\\/snap\\/[a-z0-9][a-z0-9-]{0,80})$/;\n\nexport interface FileSiteStoreOptions {\n registry?: BlockRegistry;\n /** Optional screenshot provider (Playwright). */\n screenshotter?: Screenshotter;\n resize?: ImageResizer;\n templates?: TemplateCatalog;\n previewPort?: number;\n now?: () => Date;\n}\n\nexport class FileSiteStore implements SiteStore {\n capabilities: StoreCapabilities = { canPublish: false, canScreenshot: false, canRollback: false };\n readonly templates?: TemplateCatalog;\n private readonly git: Git;\n private readonly registry: BlockRegistry;\n private hasGit = false;\n private siteId = \"\";\n private baseline: SiteDocument | undefined;\n private preview: Promise<PreviewServer> | undefined;\n private queue: Promise<unknown> = Promise.resolve();\n private sessionSeq = 0;\n\n private constructor(\n readonly root: string,\n private readonly options: FileSiteStoreOptions,\n ) {\n this.git = new Git(root);\n this.registry = options.registry ?? blocksRegistry();\n this.templates = options.templates;\n }\n\n /** Open a site folder (validates the content up front, with file-named errors). */\n static async open(root: string, options: FileSiteStoreOptions = {}): Promise<FileSiteStore> {\n const store = new FileSiteStore(root, options);\n const doc = await loadSiteDocument(root);\n store.siteId = doc.config.siteId;\n store.baseline = doc;\n store.hasGit = await store.git.available();\n store.capabilities = {\n canPublish: store.hasGit,\n canRollback: store.hasGit,\n canScreenshot: Boolean(options.screenshotter),\n publishNote: store.hasGit\n ? \"Local site in git: publishing commits content/ and media/ on the current branch; push it to deploy.\"\n : \"Local site without git: edits are saved to the files; there is no publish step.\",\n };\n return store;\n }\n\n private now(): Date {\n return this.options.now?.() ?? new Date();\n }\n\n /** Run store mutations one at a time. */\n private serial<T>(fn: () => Promise<T>): Promise<T> {\n const next = this.queue.then(fn, fn);\n this.queue = next.catch(() => undefined);\n return next;\n }\n\n private check(siteId: string) {\n if (siteId !== this.siteId) throw new ToolError(`Unknown site \"${siteId}\".`, \"not_found\");\n }\n\n async listSites(): Promise<SiteSummary[]> {\n const doc = await loadSiteDocument(this.root);\n return [\n {\n id: this.siteId,\n title: doc.site.title,\n url: doc.config.deploy.customDomain\n ? `https://${doc.config.deploy.customDomain}`\n : (doc.config.deploy.url ?? null),\n },\n ];\n }\n\n async getDocument(siteId: string): Promise<SiteDocument> {\n this.check(siteId);\n return loadSiteDocument(this.root);\n }\n\n applyOps(siteId: string, ops: Op[], _ctx: ApplyContext): Promise<ApplyResult> {\n this.check(siteId);\n return this.serial(async () => {\n const doc = await loadSiteDocument(this.root);\n const r = validateAll(doc, ops, { registry: this.registry });\n if (!r.ok) return { ok: false, index: r.index, errors: r.errors, code: \"invalid\" };\n await this.writeContent(r.doc);\n return { ok: true, doc: r.doc, warnings: r.warnings };\n });\n }\n\n /**\n * Write content (and media.json) only. `openspace.json` is never written from agent paths\n * (arch §10.3): the document carries the config as it is on disk, and the file's bytes are\n * put back if the writer would have reformatted it.\n */\n private async writeContent(doc: SiteDocument): Promise<void> {\n const configPath = join(this.root, CONFIG_FILE);\n const original = await readFile(configPath, \"utf8\");\n const current = (await loadSiteDocument(this.root, { validate: false }).catch(() => null))\n ?.config;\n await writeSiteDocument(this.root, { ...doc, config: current ?? doc.config });\n if ((await readFile(configPath, \"utf8\")) !== original) await writeFile(configPath, original);\n }\n\n /**\n * Restore the content of `target` through ops (Global Constraint 5): `diff(current, target)`\n * validated in sequence, then written. `config` is ignored by `diff`, so it stays untouched.\n */\n private async restoreThroughOps(target: SiteDocument, actor: string): Promise<number> {\n const current = await loadSiteDocument(this.root);\n const ops = diff(current, target, { actor, ts: this.now().getTime(), idPrefix: \"restore_\" });\n if (!ops.length) return 0;\n const r = validateAll(current, ops, { registry: this.registry });\n if (!r.ok) {\n const op = ops[r.index];\n throw new ToolError(\n `Restoring failed at step ${r.index + 1} of ${ops.length} (${op?.op}):\\n${r.errors\n .map((e) => `- ${e.path.join(\".\") || \"(root)\"}: ${e.message}`)\n .join(\"\\n\")}`,\n \"restore_failed\",\n r.errors,\n \"Nothing was changed. The saved version may not match the current schema; restore it by hand from git.\",\n );\n }\n await this.writeContent(r.doc);\n return ops.length;\n }\n\n /** The published document: HEAD with git, else the content as loaded at start. */\n private async publishedDoc(rev = \"HEAD\"): Promise<SiteDocument | null> {\n if (!this.hasGit) return this.baseline ?? null;\n if (rev === \"HEAD\" && !(await this.git.head())) return null;\n const dir = await mkdtemp(join(tmpdir(), \"os-pub-\"));\n try {\n await this.git.extract(rev, TRACKED, dir);\n if (!existsSync(join(dir, \"openspace.json\"))) return null;\n return await loadSiteDocument(dir);\n } catch {\n return null;\n } finally {\n await rm(dir, { recursive: true, force: true });\n }\n }\n\n async getDraftDiff(siteId: string): Promise<DraftDiff> {\n this.check(siteId);\n const draft = await loadSiteDocument(this.root);\n const published = await this.publishedDoc();\n const files = this.hasGit ? await this.git.status(this.git.existing(TRACKED)) : [];\n if (!published)\n return {\n hasChanges: true,\n summary: \"Nothing published yet: the whole site is new.\",\n changes: files,\n };\n const ops = diff(published, draft, { actor: \"diff\" });\n if (!ops.length && !files.length)\n return { hasChanges: false, summary: \"No unpublished changes.\" };\n return {\n hasChanges: true,\n summary: ops.length ? summarize(ops, published) : \"Changed files\",\n ...(files.length ? { changes: files.map((l) => l.trim()) } : {}),\n };\n }\n\n publish(siteId: string, opts: { message?: string; actor: string }): Promise<PublishResult> {\n this.check(siteId);\n if (!this.hasGit)\n throw new ToolError(\n \"This site folder isn't in git, so there's nothing to publish to.\",\n \"unsupported\",\n );\n return this.serial(async () => {\n const d = await this.getDraftDiff(siteId);\n const paths = this.git.existing(WRITABLE);\n if (!d.hasChanges || !(await this.git.status(paths)).length)\n return { status: \"no_changes\" as const, summary: \"No unpublished changes.\" };\n const subject =\n (opts.message?.trim() || d.summary).split(\"\\n\")[0]?.slice(0, 200) ?? \"Update content\";\n await this.git.run([\"add\", \"-A\", \"--\", ...paths]);\n const env = await this.git.identityEnv();\n await this.git.run(\n [\n \"commit\",\n \"-q\",\n \"-m\",\n subject,\n \"-m\",\n `Agent: ${opts.actor} via openspace mcp`,\n \"--\",\n ...paths,\n ],\n { env },\n );\n const version = await this.git.out([\"rev-parse\", \"HEAD\"]);\n return {\n status: \"published\" as const,\n version,\n summary: subject,\n note: \"Committed on the current branch. Push it (git push) and the publish workflow updates the live site.\",\n };\n });\n }\n\n discardDraft(siteId: string, ctx: ApplyContext): Promise<DraftDiff> {\n this.check(siteId);\n return this.serial(async () => {\n const d = await this.getDraftDiff(siteId);\n if (!d.hasChanges) return d;\n if (this.hasGit) {\n const published = await this.publishedDoc();\n if (!published)\n throw new ToolError(\n \"Nothing has been published yet, so there's no version to go back to.\",\n \"unsupported\",\n );\n const tag = await this.git.snapshot(`before-discard-${this.now().getTime()}`, TRACKED);\n await this.restoreThroughOps(published, ctx.actor);\n await this.restoreMedia(\"HEAD\");\n return { ...d, summary: `${d.summary} (saved as ${tag})` };\n }\n if (this.baseline) await this.restoreThroughOps(this.baseline, ctx.actor);\n return d;\n });\n }\n\n /** Put media files back as they are in `rev` (binary files; their metadata goes through ops). */\n private async restoreMedia(rev: string): Promise<void> {\n if (!existsSync(join(this.root, \"media\")) && !(await this.git.head())) return;\n await this.git.run([\"checkout\", \"--end-of-options\", rev, \"--\", \"media\"]).catch(() => undefined);\n await this.git.run([\"clean\", \"-fdq\", \"--\", \"media\"]).catch(() => undefined);\n }\n\n rollback(siteId: string, version: string, ctx: ApplyContext): Promise<PublishResult> {\n this.check(siteId);\n if (!this.hasGit) throw new ToolError(\"Rolling back needs git.\", \"unsupported\");\n if (!VERSION_RE.test(version))\n throw new ToolError(\n `\"${version}\" is not a version id: use a commit id from list_versions (7–40 hex characters) or an os/snap/… tag.`,\n \"invalid_arguments\",\n );\n return this.serial(async () => {\n let sha: string;\n try {\n sha = await this.git.out([\n \"rev-parse\",\n \"--verify\",\n \"--end-of-options\",\n `${version}^{commit}`,\n ]);\n } catch {\n throw new ToolError(`No version \"${version}\". Call list_versions.`, \"not_found\");\n }\n const target = await this.publishedDoc(sha);\n if (!target) throw new ToolError(`Version ${version} has no site content.`, \"not_found\");\n const tag = await this.git.snapshot(`before-rollback-${this.now().getTime()}`, TRACKED);\n await this.restoreThroughOps(target, ctx.actor);\n await this.restoreMedia(sha);\n const paths = this.git.existing(WRITABLE);\n if (!(await this.git.status(paths)).length)\n return { status: \"no_changes\" as const, summary: \"That version is what's already there.\" };\n await this.git.run([\"add\", \"-A\", \"--\", ...paths]);\n const subject = `Roll back content to ${sha.slice(0, 9)}`;\n await this.git.run(\n [\n \"commit\",\n \"-q\",\n \"-m\",\n subject,\n \"-m\",\n `Agent: ${ctx.actor} via openspace mcp\\nUnpublished work saved as ${tag}`,\n \"--\",\n ...paths,\n ],\n { env: await this.git.identityEnv() },\n );\n return {\n status: \"published\" as const,\n version: await this.git.out([\"rev-parse\", \"HEAD\"]),\n summary: subject,\n note: `Earlier unpublished work is saved as ${tag}. Push to update the live site.`,\n };\n });\n }\n\n async listVersions(siteId: string, opts: { limit?: number } = {}): Promise<VersionInfo[]> {\n this.check(siteId);\n if (!this.hasGit || !(await this.git.head())) return [];\n const out = await this.git.out([\n \"log\",\n `-n${opts.limit ?? 20}`,\n \"--format=%H%x1f%s%x1f%aI%x1f%an\",\n \"--\",\n ...WRITABLE,\n ]);\n return out\n .split(\"\\n\")\n .filter(Boolean)\n .map((line, i) => {\n const [version = \"\", summary = \"\", date = \"\", author = \"\"] = line.split(\"\\u001f\");\n return { version, summary, date, author, current: i === 0 };\n });\n }\n\n private previewServer(): Promise<PreviewServer> {\n this.preview ??= startPreviewServer(this.root, () => loadSiteDocument(this.root), {\n port: this.options.previewPort,\n });\n return this.preview;\n }\n\n async previewUrl(siteId: string, pagePath = \"/\"): Promise<string | null> {\n this.check(siteId);\n const { url } = await this.previewServer();\n return `${url}${pagePath.startsWith(\"/\") ? pagePath : `/${pagePath}`}`;\n }\n\n async uploadImage(\n siteId: string,\n input: ImageUploadInput,\n ctx: ApplyContext,\n ): Promise<MediaMeta> {\n this.check(siteId);\n const prepared = await prepareImage(input, { resize: this.options.resize, now: this.now() });\n const abs = join(this.root, prepared.path);\n await mkdir(dirname(abs), { recursive: true });\n await writeFile(abs, prepared.bytes);\n const op: Op = {\n op: \"media.add\",\n id: `media_${prepared.meta.id}`,\n actor: ctx.actor,\n ts: this.now().getTime(),\n path: prepared.meta.path,\n meta: prepared.meta,\n };\n const r = await this.applyOps(siteId, [op], ctx);\n if (!r.ok) {\n await rm(abs, { force: true });\n throw new ToolError(\n `The image could not be added: ${r.errors.map((e) => e.message).join(\"; \")}`,\n );\n }\n return prepared.meta;\n }\n\n async snapshot(siteId: string, name: string): Promise<string | null> {\n this.check(siteId);\n if (!this.hasGit) return null;\n return this.serial(() => this.git.snapshot(name, TRACKED));\n }\n\n async startSession(siteId: string, opts: { label: string }): Promise<AgentSession> {\n this.check(siteId);\n this.sessionSeq += 1;\n const sessionId = `local-${this.now().getTime().toString(36)}-${this.sessionSeq}`;\n let snapshot: string | null = null;\n if (this.hasGit) {\n // A failed snapshot must not block editing; the session just has no undo point.\n snapshot = await this.snapshot(siteId, `agent-${this.now().getTime()}`).catch(() => null);\n }\n return {\n sessionId,\n actor: `agent:${opts.label.toLowerCase().replace(/[^a-z0-9]+/g, \"-\")}`,\n snapshot,\n };\n }\n\n async endSession(): Promise<void> {}\n\n async screenshot(siteId: string, request: ScreenshotRequest): Promise<Screenshot> {\n this.check(siteId);\n if (!this.options.screenshotter)\n throw new ToolError(\"Screenshots are not available.\", \"unsupported\");\n const doc = await loadSiteDocument(this.root);\n const page = doc.pages[request.pageId as never] as { slug: string } | undefined;\n const url = await this.previewUrl(siteId, page?.slug ? `/${page.slug}/` : \"/\");\n return this.options.screenshotter.capture(url as string, request);\n }\n\n async agentsMd(): Promise<string | null> {\n try {\n return await readFile(join(this.root, \"AGENTS.md\"), \"utf8\");\n } catch {\n return null;\n }\n }\n\n /** Stop the preview server and browser. */\n async close(): Promise<void> {\n await this.options.screenshotter?.close();\n if (this.preview) await (await this.preview).close();\n this.preview = undefined;\n }\n}\n","/**\n * Small git helpers for the local MCP store. Everything runs with `cwd` = the site folder, so\n * pathspecs are relative to it even when the site lives in a subfolder of a bigger repository.\n * Snapshots are commits made from a temporary index (the person's index and branch are never\n * touched) and tagged `os/snap/<name>`.\n */\nimport { execFile } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { mkdtemp, rm } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport interface GitResult {\n stdout: string;\n stderr: string;\n}\n\nexport class Git {\n constructor(\n readonly cwd: string,\n private readonly env: NodeJS.ProcessEnv = process.env,\n ) {}\n\n run(args: string[], opts: { env?: NodeJS.ProcessEnv; input?: string } = {}): Promise<GitResult> {\n return new Promise((resolve, reject) => {\n const child = execFile(\n \"git\",\n args,\n { cwd: this.cwd, env: { ...this.env, ...opts.env }, maxBuffer: 64 * 1024 * 1024 },\n (err, stdout, stderr) => {\n if (err) {\n const e = new Error(`git ${args[0]} failed: ${String(stderr || err.message).trim()}`);\n reject(e);\n } else resolve({ stdout: String(stdout), stderr: String(stderr) });\n },\n );\n if (opts.input !== undefined) child.stdin?.end(opts.input);\n });\n }\n\n async out(args: string[], env?: NodeJS.ProcessEnv): Promise<string> {\n return (await this.run(args, { env })).stdout.trim();\n }\n\n /** True when the folder is inside a git work tree and git is installed. */\n async available(): Promise<boolean> {\n try {\n if ((await this.out([\"rev-parse\", \"--is-inside-work-tree\"])) !== \"true\") return false;\n } catch {\n return false;\n }\n // A site folder the enclosing repository ignores is not versioned by it.\n try {\n await this.run([\"check-ignore\", \"-q\", \"openspace.json\"]);\n return false;\n } catch {\n return true;\n }\n }\n\n async head(): Promise<string | null> {\n try {\n return await this.out([\"rev-parse\", \"--verify\", \"-q\", \"HEAD\"]);\n } catch {\n return null;\n }\n }\n\n /** `user.name`/`user.email` fallbacks so snapshot commits work on unconfigured machines. */\n async identityEnv(): Promise<NodeJS.ProcessEnv> {\n const get = async (k: string) => {\n try {\n return await this.out([\"config\", k]);\n } catch {\n return \"\";\n }\n };\n const env: NodeJS.ProcessEnv = {};\n if (!(await get(\"user.name\"))) {\n env.GIT_AUTHOR_NAME = \"OpenSpace\";\n env.GIT_COMMITTER_NAME = \"OpenSpace\";\n }\n if (!(await get(\"user.email\"))) {\n env.GIT_AUTHOR_EMAIL = \"mcp@openspace.local\";\n env.GIT_COMMITTER_EMAIL = \"mcp@openspace.local\";\n }\n return env;\n }\n\n /** Paths (relative to cwd) that exist, from a candidate list. */\n existing(paths: string[]): string[] {\n return paths.filter((p) => existsSync(join(this.cwd, p)));\n }\n\n /** Uncommitted changes under the given paths (porcelain lines). */\n async status(paths: string[]): Promise<string[]> {\n const out = await this.out([\"status\", \"--porcelain\", \"--untracked-files=all\", \"--\", ...paths]);\n return out ? out.split(\"\\n\") : [];\n }\n\n /**\n * Commit the current working-tree state of `paths` on top of HEAD without touching the index\n * or branch, and tag it `os/snap/<name>` (`-2`, `-3`… when taken). Returns the tag.\n */\n async snapshot(name: string, paths: string[]): Promise<string> {\n const dir = await mkdtemp(join(tmpdir(), \"os-snap-\"));\n const index = join(dir, \"index\");\n try {\n const env = { ...(await this.identityEnv()), GIT_INDEX_FILE: index };\n const head = await this.head();\n await this.run(head ? [\"read-tree\", head] : [\"read-tree\", \"--empty\"], { env });\n const present = this.existing(paths);\n if (present.length) await this.run([\"add\", \"-A\", \"--\", ...present], { env });\n const tree = await this.out([\"write-tree\"], env);\n const sha = await this.out(\n [\"commit-tree\", tree, ...(head ? [\"-p\", head] : []), \"-m\", `OpenSpace snapshot: ${name}`],\n env,\n );\n let tag = `os/snap/${name}`;\n for (let n = 2; await this.tagExists(tag); n++) tag = `os/snap/${name}-${n}`;\n await this.run([\"tag\", tag, sha]);\n return tag;\n } finally {\n await rm(dir, { recursive: true, force: true });\n }\n }\n\n async tagExists(tag: string): Promise<boolean> {\n try {\n await this.run([\"rev-parse\", \"--verify\", \"-q\", `refs/tags/${tag}`]);\n return true;\n } catch {\n return false;\n }\n }\n\n /** Extract `paths` (relative to the site folder) of `rev` into `dest`. */\n async extract(rev: string, paths: string[], dest: string): Promise<void> {\n const prefix = await this.out([\"rev-parse\", \"--show-prefix\"]);\n const treeish = prefix ? `${rev}:${prefix.replace(/\\/$/, \"\")}` : rev;\n const listed = await this.out([\"ls-tree\", \"--name-only\", treeish]);\n const have = new Set(listed.split(\"\\n\"));\n const wanted = paths.filter((p) => have.has(p.split(\"/\")[0] as string));\n if (!wanted.length) return;\n const tar = join(dest, \".snapshot.tar\");\n await this.run([\"archive\", \"--format=tar\", \"-o\", tar, treeish, \"--\", ...wanted]);\n await new Promise<void>((resolve, reject) =>\n execFile(\"tar\", [\"-xf\", tar, \"-C\", dest], (err) => (err ? reject(err) : resolve())),\n );\n await rm(tar, { force: true });\n }\n}\n","/**\n * A tiny local preview server for the MCP tools: renders draft pages through the real renderer\n * on every request (so it always shows the files as they are now), serves `media/` and, when the\n * renderer's built assets are available, the behavior modules.\n */\nimport { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { createServer, type Server } from \"node:http\";\nimport { createRequire } from \"node:module\";\nimport type { AddressInfo } from \"node:net\";\nimport { dirname, extname, join, normalize, sep } from \"node:path\";\nimport { renderPreviewHtml } from \"@omniharmonic/openspace-mcp-tools\";\nimport type { SiteDocument } from \"@omniharmonic/openspace-schema\";\n\nconst TYPES: Record<string, string> = {\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".png\": \"image/png\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".avif\": \"image/avif\",\n \".svg\": \"image/svg+xml\",\n \".mp4\": \"video/mp4\",\n \".webm\": \"video/webm\",\n \".mp3\": \"audio/mpeg\",\n \".pdf\": \"application/pdf\",\n \".js\": \"text/javascript\",\n \".css\": \"text/css\",\n};\n\n/** The renderer's built behaviors folder, if this install has one. */\nfunction behaviorsDir(): string | null {\n try {\n const req = createRequire(import.meta.url);\n const pkg = req.resolve(\"@omniharmonic/openspace-renderer/package.json\");\n const dir = join(dirname(pkg), \"dist\", \"behaviors\");\n return existsSync(dir) ? dir : null;\n } catch {\n return null;\n }\n}\n\n/** Decoded request paths must not climb out of their folder or smuggle separators. */\nexport function safePath(path: string): boolean {\n if (path.includes(\"\\\\\") || path.includes(\"\\0\")) return false;\n return !path.split(\"/\").some((seg) => seg === \"..\" || seg === \".\");\n}\n\n/** Host header (with optional port) must be loopback: 127.0.0.1, localhost or [::1]. */\nexport function allowedHost(host: string | undefined): boolean {\n if (!host) return false;\n const name = host.startsWith(\"[\") ? host.slice(0, host.indexOf(\"]\") + 1) : host.split(\":\")[0];\n return name === \"127.0.0.1\" || name === \"localhost\" || name === \"[::1]\";\n}\n\nexport interface PreviewServer {\n url: string;\n close(): Promise<void>;\n}\n\nexport async function startPreviewServer(\n root: string,\n load: () => Promise<SiteDocument>,\n opts: { port?: number; host?: string } = {},\n): Promise<PreviewServer> {\n const behaviors = behaviorsDir();\n const server: Server = createServer(async (req, res) => {\n try {\n // DNS-rebinding guard: only answer requests addressed to the loopback host.\n if (!allowedHost(req.headers.host)) {\n res.writeHead(403, { \"content-type\": \"text/plain; charset=utf-8\" });\n res.end(\"Forbidden host\");\n return;\n }\n const url = new URL(req.url ?? \"/\", \"http://localhost\");\n let path: string;\n try {\n path = decodeURIComponent(url.pathname);\n } catch {\n path = \"\\0\";\n }\n if (!safePath(path)) {\n res.writeHead(404, { \"content-type\": \"text/plain; charset=utf-8\" });\n res.end(\"Not found\");\n return;\n }\n const serveFile = async (base: string, rel: string) => {\n const file = normalize(join(base, rel));\n if (!file.startsWith(normalize(base) + sep)) return false;\n try {\n const body = await readFile(file);\n res.writeHead(200, {\n \"content-type\": TYPES[extname(file).toLowerCase()] ?? \"application/octet-stream\",\n \"cache-control\": \"no-store\",\n });\n res.end(body);\n return true;\n } catch {\n return false;\n }\n };\n if (path.startsWith(\"/media/\")) {\n if (await serveFile(join(root, \"media\"), path.slice(\"/media/\".length))) return;\n } else if (path.startsWith(\"/_os/behaviors/\") && behaviors) {\n if (await serveFile(behaviors, path.slice(\"/_os/behaviors/\".length))) return;\n } else {\n const doc = await load();\n const slug = path.replace(/^\\/+|\\/+$/g, \"\").replace(/\\/index\\.html$/, \"\");\n const page = Object.values(doc.pages).find((p) => p.slug === slug);\n if (page) {\n const html = renderPreviewHtml(doc, page.id, { behaviorsUrl: \"/_os/behaviors\" });\n res.writeHead(200, {\n \"content-type\": \"text/html; charset=utf-8\",\n \"cache-control\": \"no-store\",\n });\n res.end(html);\n return;\n }\n }\n res.writeHead(404, { \"content-type\": \"text/plain; charset=utf-8\" });\n res.end(\"Not found\");\n } catch (e) {\n res.writeHead(500, { \"content-type\": \"text/plain; charset=utf-8\" });\n res.end(`Preview failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n });\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(opts.port ?? 0, opts.host ?? \"127.0.0.1\", () => resolve());\n });\n const { port } = server.address() as AddressInfo;\n server.unref();\n return {\n url: `http://${opts.host ?? \"127.0.0.1\"}:${port}`,\n close: () => new Promise((resolve) => server.close(() => resolve())),\n };\n}\n","/**\n * Screenshots through Playwright when it is installed (an optional dependency): the page is\n * loaded from the local preview server so media and fonts resolve, and a section capture is an\n * element screenshot of `[data-os-id=\"sec_…\"]` in the real page.\n */\nimport type { Screenshot, ScreenshotRequest } from \"@omniharmonic/openspace-mcp-tools\";\n\n// biome-ignore lint/suspicious/noExplicitAny: Playwright is optional and untyped here\ntype Browser = any;\n\nexport interface Screenshotter {\n capture(url: string, req: ScreenshotRequest): Promise<Screenshot>;\n close(): Promise<void>;\n}\n\ntype Importer = (spec: string) => Promise<unknown>;\nconst defaultImporter: Importer = (spec) => import(/* @vite-ignore */ spec);\n\n/** Load Playwright's chromium, or explain why not. */\nexport async function loadPlaywright(\n importer: Importer = defaultImporter,\n): Promise<{ chromium: { launch(o?: object): Promise<Browser> } } | { error: string }> {\n for (const spec of [\"playwright\", \"playwright-core\"]) {\n try {\n const mod = (await importer(spec)) as {\n chromium?: unknown;\n default?: { chromium?: unknown };\n };\n const chromium = mod.chromium ?? mod.default?.chromium;\n if (chromium) return { chromium: chromium as { launch(o?: object): Promise<Browser> } };\n } catch {\n // try the next one\n }\n }\n return {\n error:\n \"Playwright is not installed. Run `npm i -D playwright && npx playwright install chromium` in the site folder and restart `openspace mcp`.\",\n };\n}\n\nexport function createScreenshotter(chromium: {\n launch(o?: object): Promise<Browser>;\n}): Screenshotter {\n let browser: Promise<Browser> | undefined;\n const launch = async (): Promise<Browser> => {\n try {\n return await chromium.launch({ headless: true });\n } catch (first) {\n // Fall back to an installed Google Chrome when Playwright's own browser isn't downloaded.\n try {\n return await chromium.launch({ headless: true, channel: \"chrome\" });\n } catch {\n throw new Error(\n `Couldn't start a browser for screenshots (${(first as Error).message.split(\"\\n\")[0]}). Run \\`npx playwright install chromium\\`.`,\n );\n }\n }\n };\n return {\n async capture(url, req) {\n browser ??= launch();\n let b: Browser;\n try {\n b = await browser;\n } catch (e) {\n browser = undefined;\n throw e;\n }\n const page = await b.newPage({\n viewport: { width: req.width, height: 900 },\n deviceScaleFactor: 1,\n });\n try {\n await page.goto(url, { waitUntil: \"load\", timeout: 30_000 });\n await page.waitForLoadState(\"networkidle\", { timeout: 5_000 }).catch(() => undefined);\n await page.evaluate(\"document.fonts && document.fonts.ready\").catch(() => undefined);\n let png: Buffer;\n if (req.sectionId) {\n png = await page\n .locator(`[data-os-id=\"${req.sectionId}\"]`)\n .first()\n .screenshot({ type: \"png\" });\n } else png = await page.screenshot({ type: \"png\", fullPage: req.fullPage });\n const height = png.readUInt32BE(20);\n return {\n base64: png.toString(\"base64\"),\n mimeType: \"image/png\",\n width: png.readUInt32BE(16),\n height,\n };\n } finally {\n await page.close().catch(() => undefined);\n }\n },\n async close() {\n if (!browser) return;\n const b = await browser.catch(() => undefined);\n browser = undefined;\n await b?.close().catch(() => undefined);\n },\n };\n}\n","import { cp, mkdtemp, rm } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { blocksRegistry } from \"@omniharmonic/openspace-blocks\";\nimport {\n CURRENT_SCHEMA_VERSION,\n type MigrateSiteOptions,\n migrateSite,\n type SiteContentLike,\n type SiteDocument,\n} from \"@omniharmonic/openspace-schema\";\nimport { loadSiteDocument, writeSiteDocument } from \"@omniharmonic/openspace-site-kit/content\";\n\nexport interface MigrateResult {\n from: number;\n to: number;\n /** Site-level migrations applied, in order. */\n applied: string[];\n /** Blocks upgraded to their definition's current version. */\n blocksMigrated: number;\n /** Repo-relative files written. */\n written: string[];\n removed: string[];\n}\n\n/**\n * Run site-level and block-level migrations over the checkout and write the result back.\n * Idempotent: a current site changes nothing on disk.\n */\nexport async function runMigrate(\n root: string,\n opts: { dryRun?: boolean; migrations?: MigrateSiteOptions[\"migrations\"]; target?: number } = {},\n): Promise<MigrateResult> {\n const doc = await loadSiteDocument(root);\n const from = doc.config.schemaVersion;\n const siteResult = migrateSite(doc as unknown as SiteContentLike, {\n migrations: opts.migrations,\n target: opts.target,\n });\n let next = siteResult.content as unknown as SiteDocument;\n\n const registry = blocksRegistry();\n let blocksMigrated = 0;\n const migrateBlocks = <T extends { blocks: SiteDocument[\"site\"][\"footer\"][\"blocks\"] }>(\n s: T,\n ): T => ({\n ...s,\n blocks: s.blocks.map((b) => {\n const m = registry.migrate(b);\n if (m !== b) blocksMigrated++;\n return m;\n }),\n });\n next = {\n ...next,\n site: { ...next.site, footer: migrateBlocks(next.site.footer) },\n pages: Object.fromEntries(\n Object.entries(next.pages).map(([id, page]) => [\n id,\n { ...page, sections: page.sections.map(migrateBlocks) },\n ]),\n ),\n };\n\n let written: string[] = [];\n let removed: string[] = [];\n if (siteResult.applied.length || blocksMigrated) {\n if (opts.dryRun) {\n // Write into a scratch copy of the text content to learn which files would change.\n const scratch = await mkdtemp(join(tmpdir(), \"os-migrate-\"));\n try {\n await cp(join(root, \"openspace.json\"), join(scratch, \"openspace.json\"));\n await cp(join(root, \"content\"), join(scratch, \"content\"), { recursive: true });\n const r = await writeSiteDocument(scratch, next);\n written = r.written;\n removed = r.removed;\n } finally {\n await rm(scratch, { recursive: true, force: true });\n }\n } else {\n const r = await writeSiteDocument(root, next);\n written = r.written;\n removed = r.removed;\n }\n }\n return {\n from,\n to: siteResult.to,\n applied: siteResult.applied,\n blocksMigrated,\n written,\n removed,\n };\n}\n\nexport { CURRENT_SCHEMA_VERSION };\n","import { existsSync } from \"node:fs\";\nimport { cp, mkdir, readdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { CURRENT_SCHEMA_VERSION, newId, type SiteConfig } from \"@omniharmonic/openspace-schema\";\nimport { loadSiteDocument, writeSiteDocument } from \"@omniharmonic/openspace-site-kit/content\";\nimport { starterFiles } from \"@omniharmonic/openspace-template-starter\";\nimport { writeAgentsMd } from \"./agents\";\nimport { CliError, type Io } from \"./io\";\nimport { monorepoRoot } from \"./repo-root\";\n\nexport interface NewOptions {\n target?: \"github-pages\" | \"cloudflare\";\n /** `owner/name`: derives the GitHub Pages URL. */\n repo?: string;\n /** Explicit `deploy.url`. */\n url?: string;\n domain?: string;\n title?: string;\n hub?: string;\n /** Folder holding `<id>/` template directories (default: the checkout's templates/). */\n templatesDir?: string;\n}\n\nexport interface NewResult {\n dir: string;\n siteId: string;\n templateId: string;\n /** Where the template content came from. */\n contentFrom: string;\n /** True when the template had no content yet and the Meadow fixture stood in. */\n usedFallback: boolean;\n files: number;\n}\n\ninterface TemplateSource {\n /** Folder with `content/` (and optionally `media/`, `public/`, `openspace.json`). */\n root: string;\n usedFallback: boolean;\n}\n\n/**\n * The published CLI bundles the starter and the launch templates next to its code\n * (`dist/starter/`, `dist/templates/`, written by scripts/bundle-templates.mjs at build time).\n * Undefined when running from source, where the checkout's folders are used instead.\n */\nconst HERE = dirname(fileURLToPath(import.meta.url));\nconst bundled = (name: string): string | undefined => {\n const dir = join(HERE, name);\n return existsSync(dir) ? dir : undefined;\n};\n\nconst slugify = (s: string) =>\n s\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\") || \"my-site\";\n\n/**\n * Template ids under the templates dir: folders with a `template.json` (the registry's gallery\n * metadata). Helper folders such as `lib/`, `test/` or `node_modules/` are not templates, and the\n * starter is the shell, not a look.\n */\nasync function templateIds(dir: string): Promise<string[]> {\n try {\n return (await readdir(dir, { withFileTypes: true }))\n .filter(\n (d) =>\n d.isDirectory() &&\n d.name !== \"starter\" &&\n !d.name.startsWith(\".\") &&\n existsSync(join(dir, d.name, \"template.json\")),\n )\n .map((d) => d.name)\n .sort();\n } catch {\n return [];\n }\n}\n\n/**\n * Templates are data under `templates/<id>/` (content/, media/, …). Until a template ships its\n * content, the Meadow fixture site (tools/fixtures/meadow-site) stands in for it.\n */\nasync function resolveTemplate(id: string, io: Io, opts: NewOptions): Promise<TemplateSource> {\n const repo = monorepoRoot();\n const dirs = [\n opts.templatesDir,\n io.env.OPENSPACE_TEMPLATES_DIR,\n repo ? join(repo, \"templates\") : undefined,\n bundled(\"templates\"),\n ].filter((d): d is string => Boolean(d));\n let known = false;\n for (const dir of dirs) {\n const root = join(dir, id);\n if (existsSync(join(root, \"content\", \"site.json\")) && existsSync(join(root, \"openspace.json\")))\n return { root, usedFallback: false };\n if (existsSync(join(root, \"template.json\"))) known = true;\n }\n const bundledTemplates = bundled(\"templates\");\n const fallback =\n io.env.OPENSPACE_FALLBACK_TEMPLATE ??\n (repo\n ? join(repo, \"tools\", \"fixtures\", \"meadow-site\")\n : bundledTemplates\n ? join(bundledTemplates, \"meadow\")\n : undefined);\n if ((known || id === \"starter\") && fallback && existsSync(join(fallback, \"content\", \"site.json\")))\n return { root: fallback, usedFallback: true };\n const all = (await Promise.all(dirs.map(templateIds))).flat();\n throw new CliError(\n `Unknown template \"${id}\".${all.length ? ` Available: ${[...new Set(all)].join(\", \")}.` : \"\"}` +\n (dirs.length ? \"\" : \" Run from an OpenSpace checkout or set OPENSPACE_TEMPLATES_DIR.\"),\n );\n}\n\nasync function isEmptyDir(dir: string): Promise<boolean> {\n try {\n return (await readdir(dir)).length === 0;\n } catch {\n return true;\n }\n}\n\n/** Scaffold a new site: the starter shell + a template's content, a fresh site id, AGENTS.md. */\nexport async function runNew(\n io: Io,\n templateId: string,\n dirArg: string,\n opts: NewOptions = {},\n): Promise<NewResult> {\n if (!/^[a-z0-9][a-z0-9-]*$/.test(templateId))\n throw new CliError(\n `Invalid template id \"${templateId}\": use lowercase letters, digits and dashes only.`,\n );\n const dir = resolve(io.cwd, dirArg);\n if (!(await isEmptyDir(dir)))\n throw new CliError(`${dir} already exists and is not empty. Choose a new folder.`);\n const tpl = await resolveTemplate(templateId, io, opts);\n // mkdir returns the first directory it had to create (undefined if `dir` already existed),\n // so cleanup removes exactly what this command made.\n const createdRoot = await mkdir(dir, { recursive: true });\n try {\n return await scaffold(templateId, dir, tpl, opts);\n } catch (e) {\n if (createdRoot) await rm(createdRoot, { recursive: true, force: true });\n else\n for (const entry of await readdir(dir))\n await rm(join(dir, entry), { recursive: true, force: true });\n throw e;\n }\n}\n\nasync function scaffold(\n templateId: string,\n dir: string,\n tpl: TemplateSource,\n opts: NewOptions,\n): Promise<NewResult> {\n const targetKind = opts.target ?? \"github-pages\";\n const slug = slugify(basename(dir));\n\n // 1. The shell.\n const starterRoot = monorepoRoot() ? undefined : bundled(\"starter\");\n const files = await starterFiles(targetKind, starterRoot);\n for (const [rel, text] of Object.entries(files)) {\n const abs = join(dir, rel);\n await mkdir(dirname(abs), { recursive: true });\n await writeFile(abs, text);\n }\n const pkgPath = join(dir, \"package.json\");\n const pkg = JSON.parse(await readFile(pkgPath, \"utf8\")) as Record<string, unknown>;\n pkg.name = slug;\n await writeFile(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`);\n\n // 2. The template's content.\n for (const part of [\"content\", \"media\", \"public\"]) {\n const from = join(tpl.root, part);\n if (existsSync(from)) await cp(from, join(dir, part), { recursive: true });\n }\n let tplConfig: Partial<SiteConfig> = {};\n try {\n tplConfig = JSON.parse(await readFile(join(tpl.root, \"openspace.json\"), \"utf8\")) as SiteConfig;\n } catch {\n tplConfig = {};\n }\n // Placeholder identity so the content loads; replaced below.\n await writeFile(join(dir, \"openspace.json\"), `${JSON.stringify(tplConfig, null, 2)}\\n`);\n let tplVersion = tplConfig.template?.version ?? \"1.0.0\";\n try {\n const tp = JSON.parse(await readFile(join(tpl.root, \"package.json\"), \"utf8\")) as {\n version?: string;\n };\n if (tp.version && !tpl.usedFallback) tplVersion = tp.version;\n } catch {\n // Fixture sites have no package.json.\n }\n\n // 3. Identity: fresh site id, current schema, this site's deploy target. All through the\n // validated document writer.\n const url =\n opts.url ??\n (opts.repo\n ? `https://${opts.repo.split(\"/\")[0]}.github.io/${opts.repo.split(\"/\")[1] ?? slug}`\n : targetKind === \"cloudflare\"\n ? `https://${slug}.pages.dev`\n : `https://example.github.io/${slug}`);\n const doc = await loadSiteDocument(dir);\n const siteId = newId(\"st\");\n doc.config = {\n ...(tplConfig.$schema ? { $schema: tplConfig.$schema } : {}),\n siteId,\n schemaVersion: CURRENT_SCHEMA_VERSION,\n template: {\n id: templateId === \"starter\" ? (tplConfig.template?.id ?? templateId) : templateId,\n version: tplVersion,\n },\n hub: opts.hub ?? tplConfig.hub ?? \"https://hub.openspace.dev\",\n deploy: { target: targetKind, url, customDomain: opts.domain ?? null },\n features: tplConfig.features ?? {\n forms: true,\n newsletter: false,\n analytics: false,\n search: true,\n },\n };\n if (opts.title) doc.site = { ...doc.site, title: opts.title };\n await writeSiteDocument(dir, doc);\n\n // 4. AGENTS.md for this site.\n await writeAgentsMd(dir, doc.site.title);\n\n return {\n dir,\n siteId,\n templateId: doc.config.template.id,\n contentFrom: tpl.root,\n usedFallback: tpl.usedFallback,\n files: Object.keys(files).length,\n };\n}\n","/**\n * The OpenSpace starter: the thin Astro shell every site repository gets (arch §2.1). The Hub\n * and CLI copy `site/` into a new repository together with a template's content, add\n * `AGENTS.md` (`generateAgentsMd` from site-kit) and, for the Cloudflare target, overlay\n * `variants/cloudflare/`.\n */\nimport { readdir, readFile } from \"node:fs/promises\";\nimport { dirname, join, relative, sep } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport const name = \"@omniharmonic/openspace-template-starter\";\n\nexport const STARTER_DIR = join(dirname(fileURLToPath(import.meta.url)), \"..\");\nexport const SITE_DIR = join(STARTER_DIR, \"site\");\nexport const VARIANTS = { cloudflare: join(STARTER_DIR, \"variants\", \"cloudflare\") } as const;\nexport type StarterVariant = \"github-pages\" | keyof typeof VARIANTS;\n\nasync function walk(dir: string, base = dir): Promise<string[]> {\n const out: string[] = [];\n for (const e of await readdir(dir, { withFileTypes: true })) {\n const abs = join(dir, e.name);\n if (e.isDirectory()) out.push(...(await walk(abs, base)));\n else if (e.name !== \".gitkeep\") out.push(relative(base, abs).split(sep).join(\"/\"));\n }\n return out.sort();\n}\n\n/**\n * The shell's files (repo path → contents) for a deploy target. `root` is a folder laid out like\n * this package (`site/`, `variants/<name>/`); the published CLI passes the copy it bundles.\n */\nexport async function starterFiles(\n variant: StarterVariant = \"github-pages\",\n root: string = STARTER_DIR,\n): Promise<Record<string, string>> {\n const files: Record<string, string> = {};\n const siteDir = join(root, \"site\");\n for (const rel of await walk(siteDir)) files[rel] = await readFile(join(siteDir, rel), \"utf8\");\n if (variant !== \"github-pages\") {\n const dir = join(root, \"variants\", variant);\n for (const rel of await walk(dir)) files[rel] = await readFile(join(dir, rel), \"utf8\");\n }\n return files;\n}\n","import { existsSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/** The OpenSpace monorepo root when running from a source checkout, else undefined. */\nexport function monorepoRoot(from = dirname(fileURLToPath(import.meta.url))): string | undefined {\n let dir = from;\n for (;;) {\n if (existsSync(join(dir, \"pnpm-workspace.yaml\")) && existsSync(join(dir, \"templates\")))\n return dir;\n const up = dirname(dir);\n if (up === dir) return undefined;\n dir = up;\n }\n}\n"],"mappings":"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","names":["isMap","res","count","res","anchors","doc","count","node","i","end","json","value","stringify","comment","str","map","seq","require_schema","pairs","omap","require_bool","require_float","require_int","n","set","res","require_schema","set","set","tags","json","count","res","count","sep","sep","isMap","sep","value","end","sep","sep","tag","errors","errors","sep","i","ch","list","sep","start","errors","lineCounter","errors","readdir","readFile","join","walk","container","site","list","overlaps","parseYaml","stringifyYaml","site","pageFiles","current","readdir","join","fileForDocPath","pageFiles","fileDepth","stats","issue","readFile","errors","walk","paint","resolve","readFile","writeFile","join","site","generateAgentsMd","dirname","join","join","dirname","resolve","existsSync","readFileSync","mkdir","readdir","readFile","rm","writeFile","dirname","join","relative","sep","join","existsSync","dirname","json","readFileSync","walk","readdir","count","readFile","relative","sep","mkdir","writeFile","rm","spawn","existsSync","readFileSync","readdir","readFile","rm","writeFile","createRequire","dirname","join","relative","existsSync","readdir","join","readFile","relative","readFileSync","createRequire","dirname","spawn","resolve","writeFile","rm","immer","current","Immer","base","rootScope","Immer","container","isPlainObject","isPlainObject","set","walk","isPlainObject","overlaps","container","op","op","container","set","site","has","walk","isPlainObject","container","r","issue","op","set","errors","isPlainObject","op","op","op","walk","list","walk","container","walk","responsive","rm","has","run","walk","set","words","isRecord","list","site","getPage","list","words","op","isRecord","set","c","list","isRecord","requireSection","changes","section","page","set","placeInGrid","autoMobileLayout","slugify","p","getPage","isRecord","id","existsSync","mkdir","mkdtemp","readFile","rm","writeFile","tmpdir","dirname","join","existsSync","mkdtemp","rm","tmpdir","join","resolve","get","existsSync","readFile","createRequire","dirname","join","sep","createRequire","join","dirname","existsSync","sep","readFile","resolve","WRITABLE","CONFIG_FILE","join","readFile","current","writeFile","op","mkdtemp","tmpdir","existsSync","rm","pagePath","mkdir","dirname","resolve","cp","mkdtemp","rm","tmpdir","join","mkdtemp","join","tmpdir","cp","rm","existsSync","cp","mkdir","readdir","readFile","rm","writeFile","dirname","join","resolve","fileURLToPath","readdir","readFile","dirname","join","relative","sep","join","dirname","walk","readdir","relative","sep","readFile","existsSync","dirname","join","fileURLToPath","dirname","fileURLToPath","join","existsSync","slugify","readdir","resolve","mkdir","rm","writeFile","readFile","cp","resolve"]}