@crouton-kit/crouter 0.3.33 → 0.3.34
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.
- package/README.md +2 -2
- package/dist/build-root.js +3 -6
- package/dist/builtin-memory/crouter-development/marketplaces.md +6 -6
- package/dist/builtin-memory/crouter-development/plugins.md +13 -13
- package/dist/builtin-memory/internal/examples/imessage-assistant.md +3 -3
- package/dist/builtin-memory/internal/nodes-and-canvas.md +4 -4
- package/dist/builtin-personas/developer/PERSONA.md +1 -1
- package/dist/builtin-personas/orchestration-kernel.md +1 -1
- package/dist/builtin-personas/waiting.md +1 -1
- package/dist/builtin-pi-packages/pi-crtr-extensions/README.md +71 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/crtr-help-gate.test.ts +41 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/provider-rotation.test.ts +663 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +52 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +418 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crouter-help.ts +87 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crtr-commands/filters.json +7 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crtr-commands/index.ts +174 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crtr-help-gate.ts +408 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +442 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +119 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/nested-context.ts +327 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +574 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/statusline.ts +260 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/strip-skills-docs.ts +40 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/sysprompt-window.ts +19 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/lib/package.json +3 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/lib/subscription-state.js +1 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/lib/subscription-state.ts +479 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/LICENSE +13 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/README.md +172 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/bin.mjs +11 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-collection.js +88 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-doc.js +43 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-node.js +109 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-scalar.js +86 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/composer.js +219 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-block-map.js +115 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +198 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +49 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-end.js +37 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +207 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +225 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-props.js +146 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-contains-newline.js +34 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +26 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +15 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-map-includes.js +13 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/Document.js +335 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/anchors.js +71 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/applyReviver.js +55 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/createNode.js +88 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/directives.js +176 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/errors.js +57 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/index.js +17 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/log.js +11 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Alias.js +116 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Collection.js +147 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Node.js +38 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Pair.js +36 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Scalar.js +24 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/YAMLMap.js +144 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +113 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +63 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/identity.js +36 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/toJS.js +37 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst-scalar.js +214 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst-stringify.js +61 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst-visit.js +97 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst.js +98 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/lexer.js +721 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/line-counter.js +39 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/parser.js +975 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/public-api.js +102 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/Schema.js +37 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/map.js +17 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/null.js +15 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/seq.js +17 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/string.js +14 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/bool.js +19 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/float.js +43 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/int.js +38 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/schema.js +23 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/json/schema.js +62 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/tags.js +96 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +58 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +26 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +46 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +71 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +67 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +74 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +78 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +39 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +93 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +101 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +146 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringify.js +129 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +153 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyComment.js +20 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +85 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +25 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyPair.js +150 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyString.js +336 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/util.js +11 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/visit.js +233 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/index.js +5 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/package.json +3 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/cli.d.ts +8 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/cli.mjs +201 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-collection.d.ts +11 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-collection.js +90 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-doc.d.ts +7 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-doc.js +45 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-node.d.ts +29 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-node.js +112 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-scalar.d.ts +5 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-scalar.js +88 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/composer.d.ts +63 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/composer.js +224 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-map.d.ts +6 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-map.js +117 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +11 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-scalar.js +200 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +6 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-seq.js +51 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-end.d.ts +6 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-end.js +39 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +7 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-collection.js +209 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +10 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-scalar.js +227 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-props.d.ts +23 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-props.js +148 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-contains-newline.d.ts +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-contains-newline.js +36 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-empty-scalar-position.js +28 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +3 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-flow-indent-check.js +17 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-map-includes.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-map-includes.js +15 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/Document.d.ts +141 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/Document.js +337 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/anchors.d.ts +24 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/anchors.js +76 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/applyReviver.d.ts +9 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/applyReviver.js +57 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/createNode.d.ts +17 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/createNode.js +90 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/directives.d.ts +49 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/directives.js +178 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/errors.d.ts +21 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/errors.js +62 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/index.d.ts +25 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/index.js +50 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/log.d.ts +3 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/log.js +19 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Alias.d.ts +29 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Alias.js +118 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Collection.d.ts +73 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Collection.js +151 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Node.d.ts +53 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Node.js +40 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Pair.d.ts +22 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Pair.js +39 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Scalar.d.ts +47 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Scalar.js +27 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLMap.d.ts +53 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLMap.js +147 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +60 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLSeq.js +115 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/addPairToJSMap.js +65 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/identity.d.ts +23 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/identity.js +53 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/toJS.d.ts +29 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/toJS.js +39 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/options.d.ts +350 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-scalar.d.ts +64 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-scalar.js +218 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-stringify.d.ts +8 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-stringify.js +63 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-visit.d.ts +39 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-visit.js +99 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst.d.ts +109 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst.js +112 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/lexer.d.ts +87 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/lexer.js +723 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/line-counter.d.ts +22 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/line-counter.js +41 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/parser.d.ts +84 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/parser.js +980 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/public-api.d.ts +44 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/public-api.js +107 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/Schema.d.ts +17 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/Schema.js +39 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/map.d.ts +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/map.js +19 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/null.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/null.js +17 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/seq.d.ts +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/seq.js +19 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/string.d.ts +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/string.js +16 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/bool.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/bool.js +21 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/float.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/float.js +47 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/int.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/int.js +42 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/schema.d.ts +1 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/schema.js +25 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/json/schema.d.ts +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/json/schema.js +64 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/json-schema.d.ts +69 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/tags.d.ts +48 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/tags.js +99 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/types.d.ts +92 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/binary.js +70 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +7 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/bool.js +29 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/float.js +50 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +5 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/int.js +76 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +9 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/merge.js +71 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +22 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/omap.js +77 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +10 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +82 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +1 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/schema.js +41 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +28 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/set.js +96 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +6 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +105 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +34 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/foldFlowLines.js +151 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringify.d.ts +21 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringify.js +132 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +17 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyCollection.js +155 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyComment.d.ts +10 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyComment.js +24 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyDocument.js +87 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyNumber.js +27 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyPair.d.ts +3 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyPair.js +152 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyString.d.ts +9 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyString.js +338 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/test-events.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/test-events.js +134 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/util.d.ts +16 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/util.js +28 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/visit.d.ts +102 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/visit.js +236 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/package.json +97 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/util.js +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/package-lock.json +3385 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/package.json +25 -0
- package/dist/builtin-pi-packages/pi-mode-switch/README.md +64 -0
- package/dist/builtin-pi-packages/pi-mode-switch/bin/mode +40 -0
- package/dist/builtin-pi-packages/pi-mode-switch/extensions/index.ts +422 -0
- package/dist/builtin-pi-packages/pi-mode-switch/package.json +13 -0
- package/dist/clients/attach/__tests__/crtr-output-coverage.test.js +55 -0
- package/dist/clients/attach/__tests__/crtr-output-render.test.js +2340 -0
- package/dist/clients/attach/attach-cmd.js +826 -754
- package/dist/clients/attach/auth-pickers.js +2 -2
- package/dist/clients/attach/canvas-panels.js +1 -1
- package/dist/clients/attach/chat-view.d.ts +3 -2
- package/dist/clients/attach/chat-view.js +30 -10
- package/dist/clients/attach/clipboard-image.js +1 -1
- package/dist/clients/attach/clipboard-text.js +1 -1
- package/dist/clients/attach/config-load.js +1 -1
- package/dist/clients/attach/crtr-output-render.d.ts +48 -0
- package/dist/clients/attach/crtr-output-render.js +646 -0
- package/dist/clients/attach/extension-dialogs.js +1 -1
- package/dist/clients/attach/graph-overlay.js +3 -3
- package/dist/clients/attach/input-controller.js +1 -1
- package/dist/clients/attach/pickers.js +1 -1
- package/dist/clients/attach/slash-commands.js +5 -6
- package/dist/clients/attach/titled-editor.d.ts +4 -0
- package/dist/clients/attach/titled-editor.js +13 -1
- package/dist/clients/attach/view-socket.js +1 -1
- package/dist/clients/web/__tests__/source-cache.test.js +5 -5
- package/dist/clients/web/server.js +29 -5
- package/dist/clients/web/source-cache.js +3 -3
- package/dist/clients/web/web-cmd.js +7 -7
- package/dist/commands/canvas-issue.js +1 -1
- package/dist/commands/canvas-prune.js +24 -2
- package/dist/commands/canvas-snapshot.js +3 -0
- package/dist/commands/canvas-tmux-spread.js +3 -3
- package/dist/commands/human.js +1 -1
- package/dist/commands/memory/lint.js +15 -8
- package/dist/commands/memory/origin.d.ts +1 -0
- package/dist/commands/memory/origin.js +88 -0
- package/dist/commands/memory/shared.d.ts +8 -0
- package/dist/commands/memory/shared.js +22 -1
- package/dist/commands/memory/write.js +17 -12
- package/dist/commands/memory.js +4 -3
- package/dist/commands/node-context.js +4 -4
- package/dist/commands/node-snapshot.js +4 -1
- package/dist/commands/node.d.ts +2 -2
- package/dist/commands/node.js +814 -606
- package/dist/commands/pkg/market-inspect.d.ts +2 -1
- package/dist/commands/pkg/market-inspect.js +14 -32
- package/dist/commands/pkg/market-manage.d.ts +3 -1
- package/dist/commands/pkg/market-manage.js +58 -154
- package/dist/commands/pkg/market.js +7 -7
- package/dist/commands/pkg/plugin-inspect.d.ts +2 -1
- package/dist/commands/pkg/plugin-inspect.js +8 -24
- package/dist/commands/pkg/plugin-manage.d.ts +5 -1
- package/dist/commands/pkg/plugin-manage.js +245 -171
- package/dist/commands/pkg/plugin.js +6 -6
- package/dist/commands/pkg.js +5 -5
- package/dist/commands/revive.js +5 -3
- package/dist/commands/search/answer.js +1 -1
- package/dist/commands/search/contents.js +1 -1
- package/dist/commands/search/web.js +2 -2
- package/dist/commands/search.js +1 -1
- package/dist/commands/surface.d.ts +2 -0
- package/dist/commands/surface.js +43 -0
- package/dist/commands/sys/promptstudio.js +1 -1
- package/dist/commands/sys/settings.js +2 -2
- package/dist/commands/sys/setup-core.d.ts +88 -0
- package/dist/commands/sys/setup-core.js +352 -0
- package/dist/commands/sys/setup.d.ts +2 -0
- package/dist/commands/sys/setup.js +516 -0
- package/dist/commands/sys/sysprompt.js +3 -0
- package/dist/commands/sys.js +3 -2
- package/dist/commands/view-cycle.js +5 -5
- package/dist/commands/view-list.js +3 -3
- package/dist/commands/view-new.js +5 -5
- package/dist/commands/view-pick.js +6 -6
- package/dist/commands/view-run.js +14 -14
- package/dist/commands/view.js +3 -3
- package/dist/commands/workspace.js +10 -10
- package/dist/core/__tests__/boot.test.js +140 -0
- package/dist/core/__tests__/broker-sdk-wiring.test.js +6 -27
- package/dist/core/__tests__/daemon-boot.test.js +22 -0
- package/dist/core/__tests__/fixtures/fake-engine.js +1 -1
- package/dist/core/__tests__/full/broker-attach-limits.test.js +1 -1
- package/dist/core/__tests__/full/broker-attach-stream.test.js +1 -1
- package/dist/core/__tests__/full/broker-crash-teardown.test.js +10 -5
- package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +1 -1
- package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +1 -1
- package/dist/core/__tests__/full/broker-pane-resolution.test.js +1 -1
- package/dist/core/__tests__/full/cascade-close.test.js +31 -18
- package/dist/core/__tests__/full/detach-focus.test.js +2 -2
- package/dist/core/__tests__/hearth-bootstrap.test.js +136 -0
- package/dist/core/__tests__/helpers/harness.js +1 -1
- package/dist/core/__tests__/live-mutation-verbs.test.js +10 -10
- package/dist/core/__tests__/live-mutation.test.js +8 -8
- package/dist/core/__tests__/migration.test.js +124 -0
- package/dist/core/__tests__/on-read-dedup-resume.test.js +40 -0
- package/dist/core/__tests__/preview-registry-sync.test.js +36 -0
- package/dist/core/__tests__/prune-to-limit.test.js +91 -0
- package/dist/core/__tests__/revive.test.js +64 -21
- package/dist/core/__tests__/trigger-migration.test.js +48 -0
- package/dist/core/__tests__/wake-bearings.test.js +23 -21
- package/dist/core/__tests__/wake-origin.test.js +36 -33
- package/dist/core/canvas/boot.d.ts +48 -0
- package/dist/core/canvas/boot.js +157 -0
- package/dist/core/canvas/canvas.d.ts +27 -1
- package/dist/core/canvas/canvas.js +86 -5
- package/dist/core/canvas/db.js +86 -1
- package/dist/core/canvas/index.d.ts +1 -1
- package/dist/core/canvas/index.js +1 -1
- package/dist/core/canvas/nav-model.js +1 -1
- package/dist/core/canvas/pid.d.ts +6 -0
- package/dist/core/canvas/pid.js +13 -0
- package/dist/core/canvas/triggers.d.ts +108 -0
- package/dist/core/canvas/triggers.js +320 -0
- package/dist/core/canvas/types.d.ts +128 -46
- package/dist/core/command.js +13 -4
- package/dist/core/hearth/__tests__/model-auth-guest.test.js +151 -0
- package/dist/core/hearth/config.d.ts +1 -0
- package/dist/core/hearth/config.js +36 -0
- package/dist/core/hearth/guest-env.d.ts +7 -0
- package/dist/core/hearth/guest-env.js +17 -1
- package/dist/core/hearth/model-auth-guest.d.ts +8 -0
- package/dist/core/hearth/model-auth-guest.js +435 -0
- package/dist/core/hearth/provider.d.ts +13 -6
- package/dist/core/hearth/providers/blaxel-bootstrap.d.ts +2 -0
- package/dist/core/hearth/providers/blaxel-bootstrap.js +127 -19
- package/dist/core/hearth/providers/blaxel-home.d.ts +8 -4
- package/dist/core/hearth/providers/blaxel-home.js +85 -75
- package/dist/core/hearth/providers/blaxel.d.ts +5 -0
- package/dist/core/hearth/providers/blaxel.js +86 -12
- package/dist/core/hearth/providers/types.d.ts +6 -1
- package/dist/core/hearth/registry.js +2 -1
- package/dist/core/hearth/types.d.ts +35 -0
- package/dist/core/help.d.ts +16 -0
- package/dist/core/help.js +2 -0
- package/dist/core/memory-resolver.d.ts +8 -8
- package/dist/core/memory-resolver.js +58 -26
- package/dist/core/preview-registry.d.ts +25 -0
- package/dist/core/preview-registry.js +2047 -0
- package/dist/core/resolver.d.ts +1 -0
- package/dist/core/resolver.js +23 -16
- package/dist/core/runtime/bearings.d.ts +11 -10
- package/dist/core/runtime/bearings.js +8 -8
- package/dist/core/runtime/broker-protocol.d.ts +2 -2
- package/dist/core/runtime/broker-protocol.js +2 -2
- package/dist/core/runtime/close.js +2 -2
- package/dist/core/runtime/kickoff.js +1 -1
- package/dist/core/runtime/launch.d.ts +9 -3
- package/dist/core/runtime/launch.js +17 -9
- package/dist/core/runtime/lifecycle.js +7 -7
- package/dist/core/runtime/model-swap.js +1 -1
- package/dist/core/runtime/placement.d.ts +5 -5
- package/dist/core/runtime/placement.js +10 -10
- package/dist/core/runtime/recycle.js +7 -7
- package/dist/core/runtime/reset.d.ts +1 -1
- package/dist/core/runtime/reset.js +3 -3
- package/dist/core/runtime/revive-all.d.ts +5 -2
- package/dist/core/runtime/revive-all.js +5 -2
- package/dist/core/runtime/revive.d.ts +15 -8
- package/dist/core/runtime/revive.js +52 -16
- package/dist/core/runtime/spawn.d.ts +1 -1
- package/dist/core/runtime/spawn.js +7 -7
- package/dist/core/runtime/stop-guard.js +5 -5
- package/dist/core/runtime/surface-bg.js +1 -1
- package/dist/core/runtime/tmux.d.ts +1 -1
- package/dist/core/runtime/tmux.js +4 -4
- package/dist/core/scope.d.ts +9 -0
- package/dist/core/scope.js +37 -15
- package/dist/core/substrate/on-read.js +23 -21
- package/dist/core/substrate/render.js +3 -3
- package/dist/core/view/loader.js +2 -2
- package/dist/core/wake.d.ts +2 -2
- package/dist/core/wake.js +7 -7
- package/dist/daemon/__tests__/predicate-eval.test.js +109 -0
- package/dist/daemon/crtrd.js +222 -103
- package/dist/daemon/predicate-eval.d.ts +52 -0
- package/dist/daemon/predicate-eval.js +248 -0
- package/dist/hearth/control-plane/__tests__/node-message.test.js +60 -0
- package/dist/hearth/control-plane/__tests__/rate-limit-recurrence.test.js +49 -0
- package/dist/hearth/control-plane/__tests__/relay-security.test.js +314 -0
- package/dist/hearth/control-plane/__tests__/scheduler-scan-loop.test.js +133 -0
- package/dist/hearth/control-plane/__tests__/trigger-delivery.test.js +170 -0
- package/dist/hearth/control-plane/__tests__/webhook-ingress.test.js +167 -0
- package/dist/hearth/control-plane/config.d.ts +21 -0
- package/dist/hearth/control-plane/config.js +77 -0
- package/dist/hearth/control-plane/db.d.ts +30 -0
- package/dist/hearth/control-plane/db.js +534 -0
- package/dist/hearth/control-plane/ingress/rate-limit.d.ts +24 -0
- package/dist/hearth/control-plane/ingress/rate-limit.js +100 -0
- package/dist/hearth/control-plane/ingress/route-store.d.ts +31 -0
- package/dist/hearth/control-plane/ingress/route-store.js +61 -0
- package/dist/hearth/control-plane/ingress/webhook-delivery-store.d.ts +41 -0
- package/dist/hearth/control-plane/ingress/webhook-delivery-store.js +69 -0
- package/dist/hearth/control-plane/ingress/webhook-route.d.ts +55 -0
- package/dist/hearth/control-plane/ingress/webhook-route.js +285 -0
- package/dist/hearth/control-plane/main.js +88 -0
- package/dist/hearth/control-plane/node-message.d.ts +31 -0
- package/dist/hearth/control-plane/node-message.js +98 -0
- package/dist/hearth/control-plane/register.d.ts +15 -0
- package/dist/hearth/control-plane/register.js +34 -0
- package/dist/hearth/control-plane/registry.d.ts +17 -0
- package/dist/hearth/control-plane/registry.js +161 -0
- package/dist/hearth/control-plane/relay.d.ts +40 -0
- package/dist/hearth/control-plane/relay.js +642 -0
- package/dist/hearth/control-plane/scheduler/fire-store.d.ts +36 -0
- package/dist/hearth/control-plane/scheduler/fire-store.js +73 -0
- package/dist/hearth/control-plane/scheduler/recurrence.d.ts +7 -0
- package/dist/hearth/control-plane/scheduler/recurrence.js +58 -0
- package/dist/hearth/control-plane/scheduler/scan-loop.d.ts +38 -0
- package/dist/hearth/control-plane/scheduler/scan-loop.js +138 -0
- package/dist/hearth/control-plane/scheduler/schedule-store.d.ts +32 -0
- package/dist/hearth/control-plane/scheduler/schedule-store.js +66 -0
- package/dist/hearth/control-plane/secrets.d.ts +17 -0
- package/dist/hearth/control-plane/secrets.js +113 -0
- package/dist/hearth/control-plane/server.d.ts +27 -0
- package/dist/hearth/control-plane/server.js +346 -0
- package/dist/hearth/control-plane/session.d.ts +68 -0
- package/dist/hearth/control-plane/session.js +273 -0
- package/dist/hearth/control-plane/triggers/acl.d.ts +14 -0
- package/dist/hearth/control-plane/triggers/acl.js +52 -0
- package/dist/hearth/control-plane/triggers/audit-store.d.ts +38 -0
- package/dist/hearth/control-plane/triggers/audit-store.js +79 -0
- package/dist/hearth/control-plane/triggers/deliver.d.ts +43 -0
- package/dist/hearth/control-plane/triggers/deliver.js +76 -0
- package/dist/hearth/control-plane/triggers/envelope.d.ts +29 -0
- package/dist/hearth/control-plane/triggers/envelope.js +38 -0
- package/dist/hearth/control-plane/types.d.ts +66 -0
- package/dist/hearth/control-plane/wake.d.ts +80 -0
- package/dist/hearth/control-plane/wake.js +312 -0
- package/dist/hearth/wake-proxy/__tests__/guest-source.test.js +2 -2
- package/dist/hearth/wake-proxy/home.d.ts +2 -8
- package/dist/hearth/wake-proxy/home.js +48 -12
- package/dist/pi-extensions/canvas-doc-substrate.js +28 -2
- package/dist/pi-extensions/canvas-nav.js +1 -1
- package/dist/prompts/view.js +7 -8
- package/dist/types.js +4 -4
- package/dist/web-client/assets/{index-D36PNBj4.js → index-BRKxe-hy.js} +2 -2
- package/dist/web-client/index.html +1 -1
- package/package.json +12 -8
- package/scripts/postinstall.mjs +8 -0
- package/dist/clients/attach/__tests__/action-parity.test.js +0 -48
- package/dist/clients/attach/__tests__/autocomplete-and-bash-mode.test.js +0 -96
- package/dist/clients/attach/__tests__/bash-bang-routing.test.js +0 -58
- package/dist/clients/attach/__tests__/bundle-pi-tui-dedup.test.js +0 -56
- package/dist/clients/attach/__tests__/clipboard-image.test.js +0 -76
- package/dist/clients/attach/__tests__/editor-newline.test.js +0 -82
- package/dist/clients/attach/__tests__/git-info.test.js +0 -31
- package/dist/clients/attach/__tests__/onrequest-wired.test.js +0 -20
- package/dist/clients/attach/__tests__/reconnect-giveup.test.js +0 -30
- package/dist/clients/attach/__tests__/slash-quit-copy.test.js +0 -42
- package/dist/clients/attach/__tests__/titled-editor.test.js +0 -60
- package/dist/commands/memory/__tests__/lint-schema.test.js +0 -52
- package/dist/core/__tests__/argv-parser.test.js +0 -217
- package/dist/core/__tests__/artifact-paths.test.js +0 -44
- package/dist/core/__tests__/draw-style.test.js +0 -258
- package/dist/core/__tests__/editor-label.test.js +0 -26
- package/dist/core/__tests__/fault-marker.test.js +0 -112
- package/dist/core/__tests__/fault-retry-rewind.test.d.ts +0 -1
- package/dist/core/__tests__/fault-retry-rewind.test.js +0 -123
- package/dist/core/__tests__/frame-decoder-perf.test.d.ts +0 -1
- package/dist/core/__tests__/frame-decoder-perf.test.js +0 -224
- package/dist/core/__tests__/keystone.test.d.ts +0 -1
- package/dist/core/__tests__/keystone.test.js +0 -185
- package/dist/core/__tests__/listing-completeness.test.d.ts +0 -1
- package/dist/core/__tests__/listing-completeness.test.js +0 -31
- package/dist/core/__tests__/memory-resolver.test.d.ts +0 -1
- package/dist/core/__tests__/memory-resolver.test.js +0 -119
- package/dist/core/__tests__/memory.test.d.ts +0 -1
- package/dist/core/__tests__/memory.test.js +0 -60
- package/dist/core/__tests__/model-ladders.test.d.ts +0 -1
- package/dist/core/__tests__/model-ladders.test.js +0 -160
- package/dist/core/__tests__/node-env.test.d.ts +0 -1
- package/dist/core/__tests__/node-env.test.js +0 -26
- package/dist/core/__tests__/pane-column.test.d.ts +0 -1
- package/dist/core/__tests__/pane-column.test.js +0 -153
- package/dist/core/__tests__/persona-compose.test.d.ts +0 -1
- package/dist/core/__tests__/persona-compose.test.js +0 -53
- package/dist/core/__tests__/persona-subkind.test.d.ts +0 -1
- package/dist/core/__tests__/persona-subkind.test.js +0 -65
- package/dist/core/__tests__/persona.test.d.ts +0 -1
- package/dist/core/__tests__/persona.test.js +0 -107
- package/dist/core/__tests__/unknown-path.test.d.ts +0 -1
- package/dist/core/__tests__/unknown-path.test.js +0 -58
- package/dist/core/canvas/wakeups.d.ts +0 -76
- package/dist/core/canvas/wakeups.js +0 -185
- package/dist/hearth/wake-proxy/__tests__/source-bridge-gate.test.d.ts +0 -1
- package/dist/hearth/wake-proxy/__tests__/source-bridge-gate.test.js +0 -455
- /package/dist/clients/attach/__tests__/{action-parity.test.d.ts → crtr-output-coverage.test.d.ts} +0 -0
- /package/dist/clients/attach/__tests__/{autocomplete-and-bash-mode.test.d.ts → crtr-output-render.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/bash-bang-routing.test.d.ts → core/__tests__/boot.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/bundle-pi-tui-dedup.test.d.ts → core/__tests__/hearth-bootstrap.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/clipboard-image.test.d.ts → core/__tests__/preview-registry-sync.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/editor-newline.test.d.ts → core/__tests__/prune-to-limit.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/git-info.test.d.ts → core/__tests__/trigger-migration.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/onrequest-wired.test.d.ts → core/hearth/__tests__/model-auth-guest.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/reconnect-giveup.test.d.ts → daemon/__tests__/predicate-eval.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/slash-quit-copy.test.d.ts → hearth/control-plane/__tests__/node-message.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/titled-editor.test.d.ts → hearth/control-plane/__tests__/rate-limit-recurrence.test.d.ts} +0 -0
- /package/dist/{commands/memory/__tests__/lint-schema.test.d.ts → hearth/control-plane/__tests__/relay-security.test.d.ts} +0 -0
- /package/dist/{core/__tests__/argv-parser.test.d.ts → hearth/control-plane/__tests__/scheduler-scan-loop.test.d.ts} +0 -0
- /package/dist/{core/__tests__/artifact-paths.test.d.ts → hearth/control-plane/__tests__/trigger-delivery.test.d.ts} +0 -0
- /package/dist/{core/__tests__/draw-style.test.d.ts → hearth/control-plane/__tests__/webhook-ingress.test.d.ts} +0 -0
- /package/dist/{core/__tests__/editor-label.test.d.ts → hearth/control-plane/main.d.ts} +0 -0
- /package/dist/{core/__tests__/fault-marker.test.d.ts → hearth/control-plane/types.js} +0 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { GuestNodeId, MachineId, TenantId } from '../../core/hearth/types.js';
|
|
2
|
+
export type HearthProvider = 'blaxel';
|
|
3
|
+
export type HomeId = string;
|
|
4
|
+
export type UserId = string;
|
|
5
|
+
export type ProviderSandboxId = MachineId;
|
|
6
|
+
export type ProviderVolumeId = string;
|
|
7
|
+
export type PreviewEndpoint = string;
|
|
8
|
+
export type RelayAuthRef = string;
|
|
9
|
+
export type HomeStatus = 'provisioning' | 'running' | 'suspended' | 'restoring' | 'terminating' | 'terminated' | 'unknown';
|
|
10
|
+
export type HomeHealthVerdict = 'healthy' | 'degraded' | 'unknown';
|
|
11
|
+
export interface Home {
|
|
12
|
+
home_id: HomeId;
|
|
13
|
+
tenant_id: TenantId;
|
|
14
|
+
user_id: UserId;
|
|
15
|
+
provider: HearthProvider;
|
|
16
|
+
provider_sandbox_id: ProviderSandboxId | null;
|
|
17
|
+
provider_volume_id: ProviderVolumeId | null;
|
|
18
|
+
preview_endpoint: PreviewEndpoint | null;
|
|
19
|
+
home_agent_target: GuestNodeId | null;
|
|
20
|
+
relay_auth_ref: RelayAuthRef | null;
|
|
21
|
+
status: HomeStatus;
|
|
22
|
+
template_version: string | null;
|
|
23
|
+
last_ready_at: string | null;
|
|
24
|
+
last_wake_at: string | null;
|
|
25
|
+
last_suspend_at: string | null;
|
|
26
|
+
last_wake_latency_ms: number | null;
|
|
27
|
+
health_verdict: HomeHealthVerdict;
|
|
28
|
+
created_at: string;
|
|
29
|
+
updated_at: string;
|
|
30
|
+
}
|
|
31
|
+
export type ResolvedHome = Home;
|
|
32
|
+
export interface CreateHomeInput {
|
|
33
|
+
home_id: HomeId;
|
|
34
|
+
tenant_id: TenantId;
|
|
35
|
+
user_id: UserId;
|
|
36
|
+
provider?: HearthProvider;
|
|
37
|
+
provider_sandbox_id?: ProviderSandboxId | null;
|
|
38
|
+
provider_volume_id?: ProviderVolumeId | null;
|
|
39
|
+
preview_endpoint?: PreviewEndpoint | null;
|
|
40
|
+
home_agent_target?: GuestNodeId | null;
|
|
41
|
+
relay_auth_ref?: RelayAuthRef | null;
|
|
42
|
+
status?: HomeStatus;
|
|
43
|
+
template_version?: string | null;
|
|
44
|
+
last_ready_at?: string | null;
|
|
45
|
+
last_wake_at?: string | null;
|
|
46
|
+
last_suspend_at?: string | null;
|
|
47
|
+
last_wake_latency_ms?: number | null;
|
|
48
|
+
health_verdict?: HomeHealthVerdict;
|
|
49
|
+
created_at?: string;
|
|
50
|
+
updated_at?: string;
|
|
51
|
+
}
|
|
52
|
+
export interface RefreshProviderPointersInput {
|
|
53
|
+
provider_sandbox_id: ProviderSandboxId | null;
|
|
54
|
+
preview_endpoint: PreviewEndpoint | null;
|
|
55
|
+
status?: HomeStatus;
|
|
56
|
+
template_version?: string | null;
|
|
57
|
+
}
|
|
58
|
+
export interface TouchWakeInput {
|
|
59
|
+
at?: string;
|
|
60
|
+
latency_ms?: number | null;
|
|
61
|
+
}
|
|
62
|
+
export type HomePatch = Partial<Pick<Home, 'provider_sandbox_id' | 'provider_volume_id' | 'preview_endpoint' | 'relay_auth_ref' | 'status' | 'template_version' | 'last_ready_at' | 'last_wake_at' | 'last_suspend_at' | 'last_wake_latency_ms' | 'health_verdict'>>;
|
|
63
|
+
export interface TenantSession {
|
|
64
|
+
tenant_id: TenantId;
|
|
65
|
+
user_id: UserId;
|
|
66
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { type HomeBackend } from '../../core/hearth/provider.js';
|
|
2
|
+
import type { M0Config } from '../../core/hearth/types.js';
|
|
3
|
+
import { type ControlPlaneConfig } from './config.js';
|
|
4
|
+
import { getHomeById, refreshProviderPointers, setHomeStatus, touchReady, touchWake } from './registry.js';
|
|
5
|
+
import { resolveSecret } from './secrets.js';
|
|
6
|
+
import type { HomeId, HomeStatus } from './types.js';
|
|
7
|
+
export interface WakeResult {
|
|
8
|
+
preview_endpoint: string;
|
|
9
|
+
relayToken: string;
|
|
10
|
+
}
|
|
11
|
+
/** Normalize a provider-observed runtime status into the CP `HomeStatus`
|
|
12
|
+
* vocabulary before it is ever persisted (Q3 / P3.4 review Minor finding):
|
|
13
|
+
* the provider's `MachineState` is broad (and may include future
|
|
14
|
+
* pause/suspend/standby spellings the SDK doesn't expose yet); CP's
|
|
15
|
+
* `HomeStatus` enum does not have a `'paused'` member. Anything
|
|
16
|
+
* pause/suspend/standby-shaped collapses to `'suspended'`; an exact
|
|
17
|
+
* `'running'` passes through; everything else (provisioning, terminating,
|
|
18
|
+
* terminated, restoring, unrecognized) becomes `'unknown'` rather than
|
|
19
|
+
* guessing a more specific CP status from a provider-specific string. */
|
|
20
|
+
export declare function normalizeProviderStatus(providerStatus: string | null | undefined): HomeStatus;
|
|
21
|
+
/** One bounded attempt: open a WebSocket to `/node/<target>` carrying the
|
|
22
|
+
* relay token and require the upgrade to both succeed AND survive a short
|
|
23
|
+
* settle window (or yield a first frame) within `attemptTimeoutMs` — proof
|
|
24
|
+
* the in-guest web server answered AND relayed to a live broker `view.sock`
|
|
25
|
+
* (R-WAKE-2), not just that the SPA shell route is up. Every branch
|
|
26
|
+
* (success, handshake rejection, error, premature close, attempt timeout)
|
|
27
|
+
* closes the socket and resolves exactly once — a success closes gracefully
|
|
28
|
+
* (code 1000) so the guest relay does not record a false fault, anything
|
|
29
|
+
* else terminates it. */
|
|
30
|
+
declare function probeNodeOnce(previewEndpoint: string, target: string, relayToken: string, attemptTimeoutMs: number): Promise<boolean>;
|
|
31
|
+
/** Retry the single-shot probe until it confirms `/node/<target>` is serving
|
|
32
|
+
* or `windowMs` elapses. Always runs at least one attempt (R-WAKE-1: "a
|
|
33
|
+
* single failed probe does not abort"). Every timer this loop starts
|
|
34
|
+
* (the per-attempt abort timeout, the inter-attempt backoff) is cleared/
|
|
35
|
+
* resolved before the loop returns — nothing is left armed. */
|
|
36
|
+
declare function probeNodeReady(previewEndpoint: string, target: string, relayToken: string, windowMs: number): Promise<boolean>;
|
|
37
|
+
/** Indirection seam so a smoke/test script can swap any step (the provider
|
|
38
|
+
* backend, the registry setters, the secret resolver, the probe itself, the
|
|
39
|
+
* clock) without touching a real DB/provider/filesystem. Production code
|
|
40
|
+
* never reassigns these; only ad hoc verification scripts do. */
|
|
41
|
+
export declare const wakeInternals: {
|
|
42
|
+
getHomeById: typeof getHomeById;
|
|
43
|
+
refreshProviderPointers: typeof refreshProviderPointers;
|
|
44
|
+
setHomeStatus: typeof setHomeStatus;
|
|
45
|
+
touchWake: typeof touchWake;
|
|
46
|
+
touchReady: typeof touchReady;
|
|
47
|
+
resolveSecret: typeof resolveSecret;
|
|
48
|
+
getHomeBackend: (config: M0Config) => HomeBackend;
|
|
49
|
+
loadM0Config: () => M0Config;
|
|
50
|
+
loadControlPlaneConfig: () => ControlPlaneConfig;
|
|
51
|
+
probeNodeOnce: typeof probeNodeOnce;
|
|
52
|
+
probeNodeReady: typeof probeNodeReady;
|
|
53
|
+
now: () => number;
|
|
54
|
+
};
|
|
55
|
+
/** Cheap, non-probing fast path: return a still-fresh warm-verdict cache hit
|
|
56
|
+
* for `home_id`, or `null` if there is none (expired or never confirmed).
|
|
57
|
+
* Never reads the registry and never calls the provider — callers fall back
|
|
58
|
+
* to `ensureAwake` on a `null` (Q1: "no call to provider"). */
|
|
59
|
+
export declare function resolveRunning(home_id: HomeId): WakeResult | null;
|
|
60
|
+
/** Drop the cached warm verdict for a home (e.g. an upstream relay forward
|
|
61
|
+
* failed) so the next `ensureAwake`/`resolveRunning` re-checks instead of
|
|
62
|
+
* trusting a stale "ready" answer. */
|
|
63
|
+
export declare function invalidateWarmVerdict(home_id: HomeId): void;
|
|
64
|
+
/** Clear all warm verdicts and in-flight wake coalescing. Test/smoke-script
|
|
65
|
+
* hygiene only — production never needs this (one CP process, S2). */
|
|
66
|
+
export declare function resetWakeCacheForTests(): void;
|
|
67
|
+
/** Bring a home up and ready, returning the route to relay to once it is.
|
|
68
|
+
* Reads the registry, resolves the relay token, calls the provider
|
|
69
|
+
* wake/resume seam, ready-probes `/node/<home_agent_target>`, refreshes
|
|
70
|
+
* provider pointers on a recreate, records wake/ready timing, and returns
|
|
71
|
+
* `{ preview_endpoint, relayToken }`. Throws on a ready-probe timeout
|
|
72
|
+
* (wake-failure UX is deferred — gap note 2 — a throw is the accepted
|
|
73
|
+
* cutover behavior).
|
|
74
|
+
*
|
|
75
|
+
* A fresh warm-verdict cache hit short-circuits without re-entering this
|
|
76
|
+
* pipeline at all. Otherwise concurrent callers for the SAME `home_id`
|
|
77
|
+
* coalesce onto one in-flight wake (Q1) instead of each driving their own
|
|
78
|
+
* provider call. */
|
|
79
|
+
export declare function ensureAwake(home_id: HomeId): Promise<WakeResult>;
|
|
80
|
+
export {};
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
// control-plane/wake.ts — CP wake orchestration (P4.2 / part-plan T3.1).
|
|
2
|
+
//
|
|
3
|
+
// Generalizes M0 `wake-proxy/home.ts` (`ensureAwake`/`resolveRunningHome`/
|
|
4
|
+
// `probeRelayServing`) onto the CP `home` registry, with one deliberate
|
|
5
|
+
// behavior drop: NO idle-pause machinery (S3 — the provider owns
|
|
6
|
+
// idle->suspend; M0's `scheduleIdlePause`/`pauseNow` timer chain is not
|
|
7
|
+
// reproduced here, by design, not oversight).
|
|
8
|
+
//
|
|
9
|
+
// Pipeline (R-WAKE-1): read the `home` row -> resolve the relay token handle
|
|
10
|
+
// -> call the provider wake/resume seam (`HomeBackend.wake`, owned by the
|
|
11
|
+
// home/provider slice, IP-1) -> ready-probe the in-guest web server on
|
|
12
|
+
// `/node/<home_agent_target>` over a short retried window, carrying the
|
|
13
|
+
// relay token -> if the provider returned a new sandbox/preview (a
|
|
14
|
+
// recreate), persist the refreshed pointers; `home_agent_target` is NEVER
|
|
15
|
+
// part of that patch (R-WAKE-6 — `refreshProviderPointers` doesn't accept it)
|
|
16
|
+
// -> record wake/ready timing -> return the route. Readiness here means the
|
|
17
|
+
// guest web server answers `/node/<target>` AND relays to a live broker
|
|
18
|
+
// `view.sock` (R-WAKE-2 — not "the SPA shell renders"). `src/clients/web/
|
|
19
|
+
// server.ts` only proves that second half on a WS upgrade: `bridgeConnection`
|
|
20
|
+
// opens `view.sock` AFTER the 101 response and closes the socket with 1011
|
|
21
|
+
// the instant that fails (ECONNREFUSED/ENOENT — "no running broker"), so an
|
|
22
|
+
// HTTP GET 200 on `/node/<target>` (the SPA static/fallback route) proves
|
|
23
|
+
// only that the guest web server is up, not that the broker is. The probe
|
|
24
|
+
// therefore opens a real WebSocket to `/node/<target>` and requires a
|
|
25
|
+
// successful upgrade that SURVIVES a short settle window (or yields a first
|
|
26
|
+
// frame) before declaring readiness.
|
|
27
|
+
//
|
|
28
|
+
// All timers used during a probe retry window are cleared before the
|
|
29
|
+
// function that started them returns — there is no `setTimeout`/`setInterval`
|
|
30
|
+
// left armed once `ensureAwake`/`resolveRunning` resolve (S3 regression bar).
|
|
31
|
+
import { setTimeout as delay } from 'node:timers/promises';
|
|
32
|
+
import { WebSocket } from 'ws';
|
|
33
|
+
import { general } from '../../core/errors.js';
|
|
34
|
+
import { loadM0Config } from '../../core/hearth/config.js';
|
|
35
|
+
import { getHomeBackend } from '../../core/hearth/provider.js';
|
|
36
|
+
import { loadControlPlaneConfig } from './config.js';
|
|
37
|
+
import { getHomeById, refreshProviderPointers, setHomeStatus, touchReady, touchWake } from './registry.js';
|
|
38
|
+
import { resolveSecret } from './secrets.js';
|
|
39
|
+
// Individual probe attempt timeout — bounded short so a dead route fails
|
|
40
|
+
// fast and the retry loop gets multiple attempts inside the overall window,
|
|
41
|
+
// rather than one attempt eating the whole window (mirrors M0's
|
|
42
|
+
// `READY_PROBE_TIMEOUT_MS`).
|
|
43
|
+
const READY_PROBE_ATTEMPT_TIMEOUT_MS = 1_500;
|
|
44
|
+
// Backoff between probe attempts (Q1: "500ms backoff between attempts").
|
|
45
|
+
const READY_PROBE_BACKOFF_MS = 500;
|
|
46
|
+
// How long a confirmed-ready verdict is trusted before `resolveRunning`/
|
|
47
|
+
// `ensureAwake` re-checks instead of trusting a stale answer (Q1: "10s TTL,
|
|
48
|
+
// in-process"). Single CP process, no distributed cache (S2).
|
|
49
|
+
const WARM_VERDICT_TTL_MS = 10_000;
|
|
50
|
+
/** Normalize a provider-observed runtime status into the CP `HomeStatus`
|
|
51
|
+
* vocabulary before it is ever persisted (Q3 / P3.4 review Minor finding):
|
|
52
|
+
* the provider's `MachineState` is broad (and may include future
|
|
53
|
+
* pause/suspend/standby spellings the SDK doesn't expose yet); CP's
|
|
54
|
+
* `HomeStatus` enum does not have a `'paused'` member. Anything
|
|
55
|
+
* pause/suspend/standby-shaped collapses to `'suspended'`; an exact
|
|
56
|
+
* `'running'` passes through; everything else (provisioning, terminating,
|
|
57
|
+
* terminated, restoring, unrecognized) becomes `'unknown'` rather than
|
|
58
|
+
* guessing a more specific CP status from a provider-specific string. */
|
|
59
|
+
export function normalizeProviderStatus(providerStatus) {
|
|
60
|
+
if (providerStatus === null || providerStatus === undefined)
|
|
61
|
+
return 'unknown';
|
|
62
|
+
const normalized = providerStatus.trim().toLowerCase();
|
|
63
|
+
if (normalized === 'paused' || normalized === 'suspended' || normalized === 'standby')
|
|
64
|
+
return 'suspended';
|
|
65
|
+
if (normalized === 'running')
|
|
66
|
+
return 'running';
|
|
67
|
+
return 'unknown';
|
|
68
|
+
}
|
|
69
|
+
function requireHomeField(value, field, home_id) {
|
|
70
|
+
if (value === null || value === undefined || (typeof value === 'string' && value.trim() === '')) {
|
|
71
|
+
throw general(`home ${home_id} is missing ${field} — cannot wake`, { home_id, field });
|
|
72
|
+
}
|
|
73
|
+
return value;
|
|
74
|
+
}
|
|
75
|
+
function buildDescriptor(home, relayToken) {
|
|
76
|
+
return {
|
|
77
|
+
homeId: home.home_id,
|
|
78
|
+
tenantId: home.tenant_id,
|
|
79
|
+
userId: home.user_id,
|
|
80
|
+
providerName: home.provider,
|
|
81
|
+
providerSandboxId: requireHomeField(home.provider_sandbox_id, 'provider_sandbox_id', home.home_id),
|
|
82
|
+
providerVolumeId: requireHomeField(home.provider_volume_id, 'provider_volume_id', home.home_id),
|
|
83
|
+
previewEndpoint: home.preview_endpoint,
|
|
84
|
+
homeAgentTarget: requireHomeField(home.home_agent_target, 'home_agent_target', home.home_id),
|
|
85
|
+
relayAuthRef: home.relay_auth_ref,
|
|
86
|
+
relayToken,
|
|
87
|
+
status: home.status,
|
|
88
|
+
templateVersion: home.template_version,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
// After a successful 101 upgrade, `bridgeConnection` (server.ts) still has to
|
|
92
|
+
// dial the broker's `view.sock` and can close the socket (1011, "no running
|
|
93
|
+
// broker") the instant that dial fails. That happens fast on a local unix
|
|
94
|
+
// socket (ECONNREFUSED/ENOENT are immediate), so a settle window this short
|
|
95
|
+
// is enough to let a dead-broker close win the race against a false-positive
|
|
96
|
+
// `open` before the probe declares readiness.
|
|
97
|
+
const READY_PROBE_WS_SETTLE_MS = 300;
|
|
98
|
+
function wsUrlForNode(previewEndpoint, target) {
|
|
99
|
+
const url = new URL(`/node/${encodeURIComponent(target)}`, previewEndpoint);
|
|
100
|
+
url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:';
|
|
101
|
+
return url;
|
|
102
|
+
}
|
|
103
|
+
/** One bounded attempt: open a WebSocket to `/node/<target>` carrying the
|
|
104
|
+
* relay token and require the upgrade to both succeed AND survive a short
|
|
105
|
+
* settle window (or yield a first frame) within `attemptTimeoutMs` — proof
|
|
106
|
+
* the in-guest web server answered AND relayed to a live broker `view.sock`
|
|
107
|
+
* (R-WAKE-2), not just that the SPA shell route is up. Every branch
|
|
108
|
+
* (success, handshake rejection, error, premature close, attempt timeout)
|
|
109
|
+
* closes the socket and resolves exactly once — a success closes gracefully
|
|
110
|
+
* (code 1000) so the guest relay does not record a false fault, anything
|
|
111
|
+
* else terminates it. */
|
|
112
|
+
async function probeNodeOnce(previewEndpoint, target, relayToken, attemptTimeoutMs) {
|
|
113
|
+
return new Promise((resolveProbe) => {
|
|
114
|
+
let settled = false;
|
|
115
|
+
let settleTimer = null;
|
|
116
|
+
let ws;
|
|
117
|
+
try {
|
|
118
|
+
ws = new WebSocket(wsUrlForNode(previewEndpoint, target), {
|
|
119
|
+
headers: { authorization: `Bearer ${relayToken}` },
|
|
120
|
+
perMessageDeflate: false,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
resolveProbe(false);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const finish = (ready) => {
|
|
128
|
+
if (settled)
|
|
129
|
+
return;
|
|
130
|
+
settled = true;
|
|
131
|
+
if (settleTimer !== null)
|
|
132
|
+
clearTimeout(settleTimer);
|
|
133
|
+
clearTimeout(attemptTimer);
|
|
134
|
+
try {
|
|
135
|
+
// A confirmed-ready probe closes gracefully (code 1000) so the guest
|
|
136
|
+
// relay's `bridgeConnection` sees a normal browser close and does NOT
|
|
137
|
+
// record a false browser<->relay fault (P4.2 re-review Major). `close()`
|
|
138
|
+
// sends the close frame synchronously off the OPEN socket, so resolving
|
|
139
|
+
// right after calling it still delivers a normal close to the guest —
|
|
140
|
+
// the probe does not need to wait for the closing handshake to finish.
|
|
141
|
+
// Failure/timeout/error paths still abort hard via `terminate()`: there
|
|
142
|
+
// is nothing graceful to negotiate when the socket never proved ready.
|
|
143
|
+
if (ready) {
|
|
144
|
+
ws.close(1000, 'readiness probe complete');
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
ws.terminate();
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
/* ignore */
|
|
152
|
+
}
|
|
153
|
+
resolveProbe(ready);
|
|
154
|
+
};
|
|
155
|
+
const attemptTimer = setTimeout(() => finish(false), attemptTimeoutMs);
|
|
156
|
+
ws.once('open', () => {
|
|
157
|
+
// The attempt timer (above) still bounds the total wait, so it is safe
|
|
158
|
+
// to always arm the full settle window here — whichever timer fires
|
|
159
|
+
// first wins via `finish`'s once-only guard.
|
|
160
|
+
settleTimer = setTimeout(() => finish(true), Math.min(READY_PROBE_WS_SETTLE_MS, attemptTimeoutMs));
|
|
161
|
+
});
|
|
162
|
+
ws.once('message', () => finish(true));
|
|
163
|
+
ws.once('unexpected-response', () => finish(false));
|
|
164
|
+
ws.once('error', () => finish(false));
|
|
165
|
+
ws.once('close', () => finish(false));
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
/** Retry the single-shot probe until it confirms `/node/<target>` is serving
|
|
169
|
+
* or `windowMs` elapses. Always runs at least one attempt (R-WAKE-1: "a
|
|
170
|
+
* single failed probe does not abort"). Every timer this loop starts
|
|
171
|
+
* (the per-attempt abort timeout, the inter-attempt backoff) is cleared/
|
|
172
|
+
* resolved before the loop returns — nothing is left armed. */
|
|
173
|
+
async function probeNodeReady(previewEndpoint, target, relayToken, windowMs) {
|
|
174
|
+
const deadline = Date.now() + Math.max(0, windowMs);
|
|
175
|
+
let firstAttempt = true;
|
|
176
|
+
for (;;) {
|
|
177
|
+
const remaining = deadline - Date.now();
|
|
178
|
+
// Past the first attempt, an already-expired budget ends the loop here
|
|
179
|
+
// instead of spending one more full attempt timeout (P4.2 re-review
|
|
180
|
+
// Minor) — only the very first attempt is unconditional (R-WAKE-1: "a
|
|
181
|
+
// single failed probe does not abort"/at-least-one-attempt).
|
|
182
|
+
if (!firstAttempt && remaining <= 0)
|
|
183
|
+
return false;
|
|
184
|
+
const attemptTimeoutMs = firstAttempt
|
|
185
|
+
? Math.max(250, Math.min(READY_PROBE_ATTEMPT_TIMEOUT_MS, windowMs))
|
|
186
|
+
: Math.min(READY_PROBE_ATTEMPT_TIMEOUT_MS, remaining);
|
|
187
|
+
firstAttempt = false;
|
|
188
|
+
if (await wakeInternals.probeNodeOnce(previewEndpoint, target, relayToken, attemptTimeoutMs))
|
|
189
|
+
return true;
|
|
190
|
+
const remainingAfter = deadline - Date.now();
|
|
191
|
+
if (remainingAfter <= 0)
|
|
192
|
+
return false;
|
|
193
|
+
await delay(Math.min(READY_PROBE_BACKOFF_MS, remainingAfter));
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/** Indirection seam so a smoke/test script can swap any step (the provider
|
|
197
|
+
* backend, the registry setters, the secret resolver, the probe itself, the
|
|
198
|
+
* clock) without touching a real DB/provider/filesystem. Production code
|
|
199
|
+
* never reassigns these; only ad hoc verification scripts do. */
|
|
200
|
+
export const wakeInternals = {
|
|
201
|
+
getHomeById,
|
|
202
|
+
refreshProviderPointers,
|
|
203
|
+
setHomeStatus,
|
|
204
|
+
touchWake,
|
|
205
|
+
touchReady,
|
|
206
|
+
resolveSecret,
|
|
207
|
+
getHomeBackend: (config) => getHomeBackend(config),
|
|
208
|
+
loadM0Config: () => loadM0Config(),
|
|
209
|
+
loadControlPlaneConfig: () => loadControlPlaneConfig(),
|
|
210
|
+
probeNodeOnce,
|
|
211
|
+
probeNodeReady,
|
|
212
|
+
now: () => Date.now(),
|
|
213
|
+
};
|
|
214
|
+
const warmVerdicts = new Map();
|
|
215
|
+
const inflightWakes = new Map();
|
|
216
|
+
/** Cheap, non-probing fast path: return a still-fresh warm-verdict cache hit
|
|
217
|
+
* for `home_id`, or `null` if there is none (expired or never confirmed).
|
|
218
|
+
* Never reads the registry and never calls the provider — callers fall back
|
|
219
|
+
* to `ensureAwake` on a `null` (Q1: "no call to provider"). */
|
|
220
|
+
export function resolveRunning(home_id) {
|
|
221
|
+
const warm = warmVerdicts.get(home_id);
|
|
222
|
+
if (warm === undefined)
|
|
223
|
+
return null;
|
|
224
|
+
if (wakeInternals.now() - warm.confirmedAt >= WARM_VERDICT_TTL_MS)
|
|
225
|
+
return null;
|
|
226
|
+
return warm.result;
|
|
227
|
+
}
|
|
228
|
+
/** Drop the cached warm verdict for a home (e.g. an upstream relay forward
|
|
229
|
+
* failed) so the next `ensureAwake`/`resolveRunning` re-checks instead of
|
|
230
|
+
* trusting a stale "ready" answer. */
|
|
231
|
+
export function invalidateWarmVerdict(home_id) {
|
|
232
|
+
warmVerdicts.delete(home_id);
|
|
233
|
+
}
|
|
234
|
+
/** Clear all warm verdicts and in-flight wake coalescing. Test/smoke-script
|
|
235
|
+
* hygiene only — production never needs this (one CP process, S2). */
|
|
236
|
+
export function resetWakeCacheForTests() {
|
|
237
|
+
warmVerdicts.clear();
|
|
238
|
+
inflightWakes.clear();
|
|
239
|
+
}
|
|
240
|
+
async function runEnsureAwake(home_id) {
|
|
241
|
+
const home = wakeInternals.getHomeById(home_id);
|
|
242
|
+
if (home === null)
|
|
243
|
+
throw general(`home not found: ${home_id}`, { home_id });
|
|
244
|
+
const relayAuthRef = requireHomeField(home.relay_auth_ref, 'relay_auth_ref', home_id);
|
|
245
|
+
const relayToken = wakeInternals.resolveSecret(relayAuthRef);
|
|
246
|
+
const target = requireHomeField(home.home_agent_target, 'home_agent_target', home_id);
|
|
247
|
+
const descriptor = buildDescriptor(home, relayToken);
|
|
248
|
+
const startedAt = wakeInternals.now();
|
|
249
|
+
const m0 = wakeInternals.loadM0Config();
|
|
250
|
+
const refresh = await wakeInternals.getHomeBackend(m0).wake(descriptor);
|
|
251
|
+
const normalizedStatus = normalizeProviderStatus(refresh.status);
|
|
252
|
+
const recreated = refresh.providerSandboxId !== home.provider_sandbox_id || (refresh.previewEndpoint ?? null) !== home.preview_endpoint;
|
|
253
|
+
let previewEndpoint;
|
|
254
|
+
if (recreated) {
|
|
255
|
+
// R-WAKE-6, non-negotiable: persist the new sandbox/preview pointers but
|
|
256
|
+
// never the home node target — `refreshProviderPointers`'s input shape
|
|
257
|
+
// has no `home_agent_target` field, so there is no way for this call to
|
|
258
|
+
// touch it even by accident.
|
|
259
|
+
const updated = wakeInternals.refreshProviderPointers(home_id, {
|
|
260
|
+
provider_sandbox_id: refresh.providerSandboxId,
|
|
261
|
+
preview_endpoint: refresh.previewEndpoint ?? null,
|
|
262
|
+
status: normalizedStatus,
|
|
263
|
+
template_version: refresh.templateVersion ?? home.template_version,
|
|
264
|
+
});
|
|
265
|
+
previewEndpoint = updated.preview_endpoint;
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
wakeInternals.setHomeStatus(home_id, normalizedStatus);
|
|
269
|
+
previewEndpoint = home.preview_endpoint;
|
|
270
|
+
}
|
|
271
|
+
const resolvedPreviewEndpoint = requireHomeField(previewEndpoint, 'preview_endpoint', home_id);
|
|
272
|
+
const controlPlaneConfig = wakeInternals.loadControlPlaneConfig();
|
|
273
|
+
const ready = await wakeInternals.probeNodeReady(resolvedPreviewEndpoint, target, relayToken, controlPlaneConfig.readyTimeoutMs);
|
|
274
|
+
if (!ready) {
|
|
275
|
+
throw general(`guest web relay did not become ready before timeout: ${home_id}`, { home_id, previewEndpoint: resolvedPreviewEndpoint });
|
|
276
|
+
}
|
|
277
|
+
const readyAt = new Date().toISOString();
|
|
278
|
+
wakeInternals.touchWake(home_id, { at: new Date(startedAt).toISOString(), latency_ms: wakeInternals.now() - startedAt });
|
|
279
|
+
wakeInternals.touchReady(home_id, readyAt);
|
|
280
|
+
return { preview_endpoint: resolvedPreviewEndpoint, relayToken };
|
|
281
|
+
}
|
|
282
|
+
/** Bring a home up and ready, returning the route to relay to once it is.
|
|
283
|
+
* Reads the registry, resolves the relay token, calls the provider
|
|
284
|
+
* wake/resume seam, ready-probes `/node/<home_agent_target>`, refreshes
|
|
285
|
+
* provider pointers on a recreate, records wake/ready timing, and returns
|
|
286
|
+
* `{ preview_endpoint, relayToken }`. Throws on a ready-probe timeout
|
|
287
|
+
* (wake-failure UX is deferred — gap note 2 — a throw is the accepted
|
|
288
|
+
* cutover behavior).
|
|
289
|
+
*
|
|
290
|
+
* A fresh warm-verdict cache hit short-circuits without re-entering this
|
|
291
|
+
* pipeline at all. Otherwise concurrent callers for the SAME `home_id`
|
|
292
|
+
* coalesce onto one in-flight wake (Q1) instead of each driving their own
|
|
293
|
+
* provider call. */
|
|
294
|
+
export async function ensureAwake(home_id) {
|
|
295
|
+
const warm = resolveRunning(home_id);
|
|
296
|
+
if (warm !== null)
|
|
297
|
+
return warm;
|
|
298
|
+
const inflight = inflightWakes.get(home_id);
|
|
299
|
+
if (inflight !== undefined)
|
|
300
|
+
return inflight;
|
|
301
|
+
const promise = runEnsureAwake(home_id)
|
|
302
|
+
.then((result) => {
|
|
303
|
+
warmVerdicts.set(home_id, { result, confirmedAt: wakeInternals.now() });
|
|
304
|
+
return result;
|
|
305
|
+
})
|
|
306
|
+
.finally(() => {
|
|
307
|
+
if (inflightWakes.get(home_id) === promise)
|
|
308
|
+
inflightWakes.delete(home_id);
|
|
309
|
+
});
|
|
310
|
+
inflightWakes.set(home_id, promise);
|
|
311
|
+
return promise;
|
|
312
|
+
}
|
|
@@ -97,7 +97,7 @@ test('runGuestSource releases activity on wake timeout', async () => {
|
|
|
97
97
|
throw new Error('fetch should not run after wake timeout');
|
|
98
98
|
},
|
|
99
99
|
});
|
|
100
|
-
const raw = await runGuestSource(tenantId, { kind: 'exec', bin: 'crtr', args: ['view', 'list'] }, deps);
|
|
100
|
+
const raw = await runGuestSource(tenantId, { kind: 'exec', bin: 'crtr', args: ['surface', 'view', 'list'] }, deps);
|
|
101
101
|
assert.equal(raw.ok, false);
|
|
102
102
|
assert.equal(raw.stdout, '');
|
|
103
103
|
assert.match(raw.stderr, /timed out/i);
|
|
@@ -118,7 +118,7 @@ test('runGuestSource releases activity when the bridge fetch aborts on timeout',
|
|
|
118
118
|
});
|
|
119
119
|
}),
|
|
120
120
|
});
|
|
121
|
-
const raw = await runGuestSource(tenantId, { kind: 'exec', bin: 'crtr', args: ['view', 'list'] }, deps);
|
|
121
|
+
const raw = await runGuestSource(tenantId, { kind: 'exec', bin: 'crtr', args: ['surface', 'view', 'list'] }, deps);
|
|
122
122
|
assert.equal(raw.ok, false);
|
|
123
123
|
assert.equal(raw.stdout, '');
|
|
124
124
|
assert.doesNotMatch(raw.stderr, /Bearer secret/);
|
|
@@ -20,13 +20,7 @@ declare function captureAwakeHome(tenantId: string): AwakenedHome;
|
|
|
20
20
|
* place that turns "a known-running home" into a forwardable route without the heavy gate.
|
|
21
21
|
*/
|
|
22
22
|
export declare function resolveRunningHome(tenantId: string): AwakenedHome | null;
|
|
23
|
-
/**
|
|
24
|
-
* Wake the tenant's home through the configured backend seam. The backend owns the restore-vs-
|
|
25
|
-
* recreate decision and persists the refreshed `webRoute`/`relayToken` to the registry. Until the
|
|
26
|
-
* Blaxel backend is wired, `getHomeBackend` throws a 503 "no provider
|
|
27
|
-
* configured" — so a cold home cannot be woken, while an already-serving home still forwards via
|
|
28
|
-
* the fast path above (which never calls this).
|
|
29
|
-
*/
|
|
23
|
+
/** Wake the tenant's home through the configured backend seam and persist returned pointers. */
|
|
30
24
|
declare function wakeHome(tenantId: string): Promise<void>;
|
|
31
25
|
export declare const wakeProxyInternals: {
|
|
32
26
|
probeRelayReady: typeof probeRelayReady;
|
|
@@ -52,7 +46,7 @@ export declare function releaseActivity(handle: ActivityHandle): TenantActivityS
|
|
|
52
46
|
export declare function scheduleIdlePause(tenantId: string): void;
|
|
53
47
|
/**
|
|
54
48
|
* Pause the tenant's home through the backend seam. We never drive a sandbox SDK directly here —
|
|
55
|
-
* the backend
|
|
49
|
+
* the backend returns provider pointer/state changes and this layer persists them. Serialized under the per-tenant
|
|
56
50
|
* in-process lock; the single-process deployment invariant (one wake-proxy machine per tenant)
|
|
57
51
|
* makes this lock authoritative.
|
|
58
52
|
*/
|
|
@@ -121,15 +121,51 @@ export function resolveRunningHome(tenantId) {
|
|
|
121
121
|
webPort: getRuntime().m0.webPort,
|
|
122
122
|
};
|
|
123
123
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
124
|
+
function homeProviderDescriptor(home) {
|
|
125
|
+
return {
|
|
126
|
+
homeId: home.tenantId,
|
|
127
|
+
tenantId: home.tenantId,
|
|
128
|
+
providerName: 'blaxel',
|
|
129
|
+
providerSandboxId: home.machineId,
|
|
130
|
+
providerVolumeId: home.homeStorage.volumeId,
|
|
131
|
+
previewEndpoint: home.webRoute?.concreteUrl ?? home.webRoute?.url ?? null,
|
|
132
|
+
homeAgentTarget: home.nodeId ?? '',
|
|
133
|
+
relayToken: home.relayToken ?? '',
|
|
134
|
+
status: home.state,
|
|
135
|
+
templateVersion: home.templateVersion ?? null,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
function persistProviderRefresh(m0, tenantId, refresh) {
|
|
139
|
+
updateHome(m0.registryPath, tenantId, (draft) => ({
|
|
140
|
+
...draft,
|
|
141
|
+
providerName: refresh.providerName,
|
|
142
|
+
machineId: refresh.providerSandboxId,
|
|
143
|
+
homeStorage: {
|
|
144
|
+
...draft.homeStorage,
|
|
145
|
+
ownerMachineId: refresh.providerSandboxId,
|
|
146
|
+
volumeId: refresh.providerVolumeId,
|
|
147
|
+
guestHome: m0.guestHome,
|
|
148
|
+
mountPath: m0.guestHome,
|
|
149
|
+
},
|
|
150
|
+
state: refresh.status,
|
|
151
|
+
nodeId: refresh.homeAgentTarget,
|
|
152
|
+
webRoute: refresh.route ?? draft.webRoute,
|
|
153
|
+
templateVersion: refresh.templateVersion,
|
|
154
|
+
updatedAt: refresh.updatedAt,
|
|
155
|
+
}));
|
|
156
|
+
}
|
|
157
|
+
async function loadHomeDescriptor(tenantId) {
|
|
158
|
+
const home = getHome(getRuntime().m0.registryPath, tenantId);
|
|
159
|
+
if (home === null) {
|
|
160
|
+
throw general(`no home for tenant ${tenantId} — run the existing provision/bootstrap flow`, { tenantId });
|
|
161
|
+
}
|
|
162
|
+
return homeProviderDescriptor(home);
|
|
163
|
+
}
|
|
164
|
+
/** Wake the tenant's home through the configured backend seam and persist returned pointers. */
|
|
131
165
|
async function wakeHome(tenantId) {
|
|
132
|
-
|
|
166
|
+
const m0 = getRuntime().m0;
|
|
167
|
+
const refresh = await getHomeBackend(m0).wake(await loadHomeDescriptor(tenantId));
|
|
168
|
+
persistProviderRefresh(m0, tenantId, refresh);
|
|
133
169
|
}
|
|
134
170
|
export const wakeProxyInternals = {
|
|
135
171
|
probeRelayReady,
|
|
@@ -194,7 +230,7 @@ export function scheduleIdlePause(tenantId) {
|
|
|
194
230
|
}
|
|
195
231
|
/**
|
|
196
232
|
* Pause the tenant's home through the backend seam. We never drive a sandbox SDK directly here —
|
|
197
|
-
* the backend
|
|
233
|
+
* the backend returns provider pointer/state changes and this layer persists them. Serialized under the per-tenant
|
|
198
234
|
* in-process lock; the single-process deployment invariant (one wake-proxy machine per tenant)
|
|
199
235
|
* makes this lock authoritative.
|
|
200
236
|
*/
|
|
@@ -213,7 +249,8 @@ export async function pauseNow(tenantId) {
|
|
|
213
249
|
}
|
|
214
250
|
if (home.state !== 'running')
|
|
215
251
|
return;
|
|
216
|
-
await getHomeBackend(m0).suspend(
|
|
252
|
+
const refresh = await getHomeBackend(m0).suspend(homeProviderDescriptor(home));
|
|
253
|
+
persistProviderRefresh(m0, tenantId, refresh);
|
|
217
254
|
touchTenantPause(cfg, tenantId);
|
|
218
255
|
clearTenantIdleTimer(tenantId);
|
|
219
256
|
});
|
|
@@ -279,8 +316,7 @@ async function runEnsureAwake(tenantId) {
|
|
|
279
316
|
return wakeProxyInternals.captureAwakeHome(tenantId);
|
|
280
317
|
}
|
|
281
318
|
}
|
|
282
|
-
// Not serving: drive the backend seam to bring the home up
|
|
283
|
-
// owns the warm-resume-vs-recreate decision and persists webRoute/relayToken to the registry.
|
|
319
|
+
// Not serving: drive the backend seam to bring the home up, then persist the returned route.
|
|
284
320
|
await wakeProxyInternals.wakeHome(tenantId);
|
|
285
321
|
const refreshed = getHome(m0.registryPath, tenantId);
|
|
286
322
|
const relayUrl = refreshed?.webRoute?.concreteUrl ?? refreshed?.webRoute?.url ?? null;
|
|
@@ -45,6 +45,31 @@ import { loadInjectedDocs, saveInjectedDocs } from '../core/substrate/injected-s
|
|
|
45
45
|
* to reach for while reading the tools, so memory docs/preferences must sit
|
|
46
46
|
* there, not far below. Mirrors crouter-help.ts. Falls back to appending if absent. */
|
|
47
47
|
const TOOLS_ANCHOR = '\n\nGuidelines:';
|
|
48
|
+
const AUTO_CONTEXT_RE = /<auto-loaded-context(?:\s[^>]*)?>\n([\s\S]*?)\n<\/auto-loaded-context>/;
|
|
49
|
+
function mergeAutoLoadedContext(injected, content) {
|
|
50
|
+
const match = injected.match(AUTO_CONTEXT_RE);
|
|
51
|
+
const inner = match?.[1]?.trim();
|
|
52
|
+
if (!inner)
|
|
53
|
+
return content;
|
|
54
|
+
const existingText = content.map((block) => block.text ?? '').join('\n');
|
|
55
|
+
if (existingText.includes(inner))
|
|
56
|
+
return content;
|
|
57
|
+
const existingIdx = content.findIndex((block) => typeof block.text === 'string' && AUTO_CONTEXT_RE.test(block.text));
|
|
58
|
+
if (existingIdx !== -1) {
|
|
59
|
+
return content.map((block, idx) => {
|
|
60
|
+
if (idx !== existingIdx || typeof block.text !== 'string')
|
|
61
|
+
return block;
|
|
62
|
+
return {
|
|
63
|
+
...block,
|
|
64
|
+
text: block.text.replace(AUTO_CONTEXT_RE, (_whole, current) => {
|
|
65
|
+
const trimmed = String(current).trim();
|
|
66
|
+
return `<auto-loaded-context>\n${inner}${trimmed === '' ? '' : `\n${trimmed}`}\n</auto-loaded-context>`;
|
|
67
|
+
}),
|
|
68
|
+
};
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return [{ type: 'text', text: `<auto-loaded-context>\n${inner}\n</auto-loaded-context>` }, ...content];
|
|
72
|
+
}
|
|
48
73
|
/**
|
|
49
74
|
* Register the document substrate's two render hooks on `pi`.
|
|
50
75
|
*
|
|
@@ -115,8 +140,9 @@ export function registerCanvasDocSubstrate(pi) {
|
|
|
115
140
|
// A doc surfaced → renderOnReadDocs grew injectedDocs; persist the set so
|
|
116
141
|
// the dedup survives a later dormancy → revive(resume).
|
|
117
142
|
saveInjectedDocs(nodeId, injectedDocs);
|
|
118
|
-
//
|
|
119
|
-
|
|
143
|
+
// Fold into any existing auto-loaded-context block from sibling read hooks;
|
|
144
|
+
// otherwise prepend one quiet block ahead of the file contents.
|
|
145
|
+
return { content: mergeAutoLoadedContext(injected, event.content) };
|
|
120
146
|
}
|
|
121
147
|
catch {
|
|
122
148
|
return; // inert on error — a bug must degrade a read, never break it
|
|
@@ -473,7 +473,7 @@ export function registerCanvasNav(pi) {
|
|
|
473
473
|
const target = cursorId ?? nodeId;
|
|
474
474
|
const n = cNode(target);
|
|
475
475
|
const nm = n !== null ? fullName(n) : shortId(target);
|
|
476
|
-
pendingConfirm = { label: `kill ${nm}?`, action: () => shellCrtr(['node', 'close', '--node', target], render) };
|
|
476
|
+
pendingConfirm = { label: `kill ${nm}?`, action: () => shellCrtr(['node', 'lifecycle', 'close', '--node', target], render) };
|
|
477
477
|
render();
|
|
478
478
|
return { consume: true };
|
|
479
479
|
}
|