@crouton-kit/crouter 0.3.33 → 0.3.35
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 +427 -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 +843 -743
- 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 +19 -9
- package/dist/core/__tests__/flagship-lifecycle.test.js +4 -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 +2 -2
- 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 +17 -3
- 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 +17 -11
- package/dist/core/__tests__/live-mutation.test.js +15 -10
- 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 -3
- package/dist/core/hearth/guest-env.d.ts +7 -0
- package/dist/core/hearth/guest-env.js +17 -1
- package/dist/core/hearth/index.d.ts +0 -1
- package/dist/core/hearth/index.js +0 -1
- package/dist/core/hearth/model-auth-guest.d.ts +8 -0
- package/dist/core/hearth/model-auth-guest.js +430 -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/types.d.ts +35 -1
- 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/{wake-proxy/proxy.js → control-plane/relay.js} +201 -275
- 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/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-DUThOUzU.css +2 -0
- package/dist/web-client/assets/index-IAJVtuVe.js +80 -0
- package/dist/web-client/index.html +2 -2
- package/package.json +12 -9
- 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.d.ts +0 -1
- package/dist/core/__tests__/editor-label.test.js +0 -26
- package/dist/core/__tests__/fault-marker.test.d.ts +0 -1
- 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/core/hearth/registry.d.ts +0 -15
- package/dist/core/hearth/registry.js +0 -179
- package/dist/hearth/wake-proxy/__tests__/anthropic-oauth.test.d.ts +0 -1
- package/dist/hearth/wake-proxy/__tests__/anthropic-oauth.test.js +0 -289
- package/dist/hearth/wake-proxy/__tests__/config-timeout.test.d.ts +0 -1
- package/dist/hearth/wake-proxy/__tests__/config-timeout.test.js +0 -34
- package/dist/hearth/wake-proxy/__tests__/guest-source.test.d.ts +0 -1
- package/dist/hearth/wake-proxy/__tests__/guest-source.test.js +0 -203
- package/dist/hearth/wake-proxy/__tests__/hardening.test.d.ts +0 -1
- package/dist/hearth/wake-proxy/__tests__/hardening.test.js +0 -59
- package/dist/hearth/wake-proxy/__tests__/hearth-status-route.test.d.ts +0 -1
- package/dist/hearth/wake-proxy/__tests__/hearth-status-route.test.js +0 -372
- package/dist/hearth/wake-proxy/__tests__/http-running-route-fast-path.test.d.ts +0 -1
- package/dist/hearth/wake-proxy/__tests__/http-running-route-fast-path.test.js +0 -258
- package/dist/hearth/wake-proxy/__tests__/model-auth-routes.test.d.ts +0 -1
- package/dist/hearth/wake-proxy/__tests__/model-auth-routes.test.js +0 -437
- 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/hearth/wake-proxy/__tests__/static-asset-allowlist.test.d.ts +0 -1
- package/dist/hearth/wake-proxy/__tests__/static-asset-allowlist.test.js +0 -15
- package/dist/hearth/wake-proxy/__tests__/warm-path-concurrency.test.d.ts +0 -1
- package/dist/hearth/wake-proxy/__tests__/warm-path-concurrency.test.js +0 -141
- package/dist/hearth/wake-proxy/__tests__/ws-teardown-accounting.test.d.ts +0 -1
- package/dist/hearth/wake-proxy/__tests__/ws-teardown-accounting.test.js +0 -143
- package/dist/hearth/wake-proxy/anthropic-oauth.d.ts +0 -58
- package/dist/hearth/wake-proxy/anthropic-oauth.js +0 -189
- package/dist/hearth/wake-proxy/auth.d.ts +0 -22
- package/dist/hearth/wake-proxy/auth.js +0 -128
- package/dist/hearth/wake-proxy/config.d.ts +0 -2
- package/dist/hearth/wake-proxy/config.js +0 -151
- package/dist/hearth/wake-proxy/guest-source.d.ts +0 -14
- package/dist/hearth/wake-proxy/guest-source.js +0 -130
- package/dist/hearth/wake-proxy/hearth-status.d.ts +0 -44
- package/dist/hearth/wake-proxy/hearth-status.js +0 -267
- package/dist/hearth/wake-proxy/home.d.ts +0 -67
- package/dist/hearth/wake-proxy/home.js +0 -297
- package/dist/hearth/wake-proxy/main.js +0 -134
- package/dist/hearth/wake-proxy/model-auth.d.ts +0 -13
- package/dist/hearth/wake-proxy/model-auth.js +0 -345
- package/dist/hearth/wake-proxy/proxy.d.ts +0 -35
- package/dist/hearth/wake-proxy/public-source-gate.d.ts +0 -9
- package/dist/hearth/wake-proxy/public-source-gate.js +0 -409
- package/dist/hearth/wake-proxy/redact.d.ts +0 -1
- package/dist/hearth/wake-proxy/redact.js +0 -17
- package/dist/hearth/wake-proxy/server.d.ts +0 -11
- package/dist/hearth/wake-proxy/server.js +0 -142
- package/dist/hearth/wake-proxy/state.d.ts +0 -18
- package/dist/hearth/wake-proxy/state.js +0 -342
- package/dist/hearth/wake-proxy/types.d.ts +0 -76
- package/dist/web-client/assets/index-BZUxTkv5.css +0 -2
- package/dist/web-client/assets/index-D36PNBj4.js +0 -80
- /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/hearth/{wake-proxy → control-plane}/main.d.ts +0 -0
- /package/dist/hearth/{wake-proxy → control-plane}/types.js +0 -0
|
@@ -20,6 +20,7 @@ import { mkdtempSync, mkdirSync, rmSync, writeFileSync, existsSync } from 'node:
|
|
|
20
20
|
import { tmpdir } from 'node:os';
|
|
21
21
|
import { join } from 'node:path';
|
|
22
22
|
import { closeDb } from '../canvas/db.js';
|
|
23
|
+
import { resetScopeCache } from '../scope.js';
|
|
23
24
|
import { injectedDocsPath } from '../canvas/paths.js';
|
|
24
25
|
import { spawnNode } from '../runtime/nodes.js';
|
|
25
26
|
import { renderOnReadDocs } from '../substrate/on-read.js';
|
|
@@ -27,20 +28,32 @@ import { loadInjectedDocs, saveInjectedDocs, clearInjectedDocs, } from '../subst
|
|
|
27
28
|
const FIXTURE_BODY = 'Fixture body that must surface exactly once.';
|
|
28
29
|
let home;
|
|
29
30
|
let work;
|
|
31
|
+
let prevHomeEnv;
|
|
30
32
|
before(() => {
|
|
31
33
|
home = mkdtempSync(join(tmpdir(), 'crtr-onread-home-'));
|
|
32
34
|
process.env['CRTR_HOME'] = home;
|
|
35
|
+
prevHomeEnv = process.env['HOME'];
|
|
33
36
|
});
|
|
34
37
|
beforeEach(() => {
|
|
35
38
|
closeDb();
|
|
39
|
+
resetScopeCache();
|
|
36
40
|
rmSync(home, { recursive: true, force: true });
|
|
41
|
+
if (prevHomeEnv === undefined)
|
|
42
|
+
delete process.env['HOME'];
|
|
43
|
+
else
|
|
44
|
+
process.env['HOME'] = prevHomeEnv;
|
|
37
45
|
work = mkdtempSync(join(tmpdir(), 'crtr-onread-work-'));
|
|
38
46
|
});
|
|
39
47
|
after(() => {
|
|
40
48
|
closeDb();
|
|
49
|
+
resetScopeCache();
|
|
41
50
|
rmSync(home, { recursive: true, force: true });
|
|
42
51
|
rmSync(work, { recursive: true, force: true });
|
|
43
52
|
delete process.env['CRTR_HOME'];
|
|
53
|
+
if (prevHomeEnv === undefined)
|
|
54
|
+
delete process.env['HOME'];
|
|
55
|
+
else
|
|
56
|
+
process.env['HOME'] = prevHomeEnv;
|
|
44
57
|
});
|
|
45
58
|
test('injected-store round-trips and clears', () => {
|
|
46
59
|
const node = spawnNode({ kind: 'general', cwd: work, parent: null }).node_id;
|
|
@@ -51,6 +64,33 @@ test('injected-store round-trips and clears', () => {
|
|
|
51
64
|
assert.ok(!existsSync(injectedDocsPath(node)), 'clear removes the file');
|
|
52
65
|
assert.deepEqual([...loadInjectedDocs(node)], [], 'load after clear is empty');
|
|
53
66
|
});
|
|
67
|
+
test('user-global memory docs do not fire positionally for every file under home', () => {
|
|
68
|
+
const fakeHome = mkdtempSync(join(tmpdir(), 'crtr-onread-user-home-'));
|
|
69
|
+
process.env['HOME'] = fakeHome;
|
|
70
|
+
resetScopeCache();
|
|
71
|
+
const node = spawnNode({ kind: 'general', cwd: join(fakeHome, 'work'), parent: null }).node_id;
|
|
72
|
+
const userMemDir = join(fakeHome, '.crouter', 'memory');
|
|
73
|
+
mkdirSync(userMemDir, { recursive: true });
|
|
74
|
+
writeFileSync(join(userMemDir, 'noisy-global.md'), '---\nkind: preference\n' +
|
|
75
|
+
'when-and-why-to-read: When reading any file, this preference should be read because this fixture must not fire positionally\n' +
|
|
76
|
+
'file-read-visibility: content\n---\n' +
|
|
77
|
+
'NOISY USER BODY\n');
|
|
78
|
+
const projectMemDir = join(fakeHome, 'work', '.crouter', 'memory');
|
|
79
|
+
mkdirSync(projectMemDir, { recursive: true });
|
|
80
|
+
writeFileSync(join(projectMemDir, 'local.md'), '---\nkind: knowledge\n' +
|
|
81
|
+
'when-and-why-to-read: When reading project files, this reference should be read because local project memories remain positional\n' +
|
|
82
|
+
'file-read-visibility: content\n---\n' +
|
|
83
|
+
'LOCAL PROJECT BODY\n');
|
|
84
|
+
const readFile = join(fakeHome, 'work', 'ideas.md');
|
|
85
|
+
writeFileSync(readFile, 'turn off xml closer\n');
|
|
86
|
+
const rendered = renderOnReadDocs(node, readFile, new Set());
|
|
87
|
+
assert.ok(!rendered.includes('NOISY USER BODY'), 'user-global doc is not positional');
|
|
88
|
+
assert.ok(rendered.includes('LOCAL PROJECT BODY'), 'project doc still fires positionally');
|
|
89
|
+
assert.ok(rendered.includes('<memory kind="knowledge" name="local"'), 'memory docs render as memory tags');
|
|
90
|
+
assert.ok(!rendered.includes('triggered-by='), 'read target is not repeated on child items');
|
|
91
|
+
assert.ok(!rendered.includes('<auto-loaded-context file='), 'read target is not repeated on the wrapper');
|
|
92
|
+
rmSync(fakeHome, { recursive: true, force: true });
|
|
93
|
+
});
|
|
54
94
|
test('on-read doc surfaces once, stays deduped across a revive(resume), re-surfaces after a fresh launch', () => {
|
|
55
95
|
const node = spawnNode({ kind: 'general', cwd: work, parent: null }).node_id;
|
|
56
96
|
// A positional substrate doc in a `.crouter/memory/` ancestor of the read file.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// Drift guard for the attach-viewer's bundle-safe preview registry.
|
|
2
|
+
// Run with: node --import tsx/esm --test src/core/__tests__/preview-registry-sync.test.ts
|
|
3
|
+
//
|
|
4
|
+
// src/core/preview-registry.ts is a hand-maintained, zero-import mirror of
|
|
5
|
+
// every leaf's `help.preview.suppressOutput` — it has to be hand-maintained
|
|
6
|
+
// (not computed) because the attach viewer can never import the live command
|
|
7
|
+
// tree (build-root.ts pulls in every subtree, including the web client's
|
|
8
|
+
// Tailwind native binary — see command-preview-implementation.md). This test
|
|
9
|
+
// is the only thing that keeps the mirror honest: it walks the real,
|
|
10
|
+
// buildRoot()-assembled tree (safe here — this is a test, not the attach
|
|
11
|
+
// bundle) and asserts the set of leaves declaring `suppressOutput: true`
|
|
12
|
+
// matches the registry exactly.
|
|
13
|
+
import { test } from 'node:test';
|
|
14
|
+
import assert from 'node:assert/strict';
|
|
15
|
+
import { buildRoot } from '../../build-root.js';
|
|
16
|
+
import { SUPPRESS_OUTPUT_LEAVES } from '../preview-registry.js';
|
|
17
|
+
test('preview-registry.ts matches every leaf declaring help.preview.suppressOutput', async () => {
|
|
18
|
+
const root = await buildRoot();
|
|
19
|
+
const declared = new Set();
|
|
20
|
+
const walk = (branch) => {
|
|
21
|
+
for (const child of branch.children) {
|
|
22
|
+
if (child.kind === 'branch') {
|
|
23
|
+
walk(child);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
const leaf = child;
|
|
27
|
+
if (leaf.help.preview?.suppressOutput === true)
|
|
28
|
+
declared.add(leaf.help.name);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
for (const subtree of root.subtrees)
|
|
33
|
+
walk(subtree);
|
|
34
|
+
assert.deepEqual([...declared].sort(), [...SUPPRESS_OUTPUT_LEAVES].sort(), 'src/core/preview-registry.ts is out of sync with the leaves that declare ' +
|
|
35
|
+
'help.preview.suppressOutput — update SUPPRESS_OUTPUT_LEAVES to match.');
|
|
36
|
+
});
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { test, before, after, beforeEach } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { mkdtempSync, rmSync, existsSync } from 'node:fs';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { createNode, getRow, recordPid, pruneToLimit, } from '../canvas/canvas.js';
|
|
7
|
+
import { closeDb } from '../canvas/db.js';
|
|
8
|
+
import { nodeDir } from '../canvas/paths.js';
|
|
9
|
+
let home;
|
|
10
|
+
// A timestamp `secondsAgo` before now — created order doubles as recency order
|
|
11
|
+
// here (no telemetry.json is written, so recencyMs falls back to created epoch).
|
|
12
|
+
const at = (secondsAgo) => new Date(Date.now() - secondsAgo * 1000).toISOString();
|
|
13
|
+
function node(id, over = {}) {
|
|
14
|
+
return {
|
|
15
|
+
node_id: id,
|
|
16
|
+
name: id,
|
|
17
|
+
created: at(0),
|
|
18
|
+
cwd: '/tmp/work',
|
|
19
|
+
kind: 'general',
|
|
20
|
+
mode: 'base',
|
|
21
|
+
lifecycle: 'terminal',
|
|
22
|
+
status: 'dead',
|
|
23
|
+
...over,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
before(() => {
|
|
27
|
+
home = mkdtempSync(join(tmpdir(), 'crtr-prune-limit-'));
|
|
28
|
+
process.env['CRTR_HOME'] = home;
|
|
29
|
+
});
|
|
30
|
+
beforeEach(() => {
|
|
31
|
+
closeDb();
|
|
32
|
+
rmSync(home, { recursive: true, force: true });
|
|
33
|
+
});
|
|
34
|
+
after(() => {
|
|
35
|
+
closeDb();
|
|
36
|
+
rmSync(home, { recursive: true, force: true });
|
|
37
|
+
delete process.env['CRTR_HOME'];
|
|
38
|
+
delete process.env['CRTR_NODE_ID'];
|
|
39
|
+
});
|
|
40
|
+
test('keeps all live nodes even when liveCount exceeds the cap', () => {
|
|
41
|
+
// 5 live (active/idle with a running pi) + 2 old terminal; cap of 3.
|
|
42
|
+
// target = max(3, 5) = 5, so NO live node is ever deleted; the 2 terminal
|
|
43
|
+
// fall beyond rank 5 and are pruned.
|
|
44
|
+
for (let i = 0; i < 5; i++) {
|
|
45
|
+
createNode(node(`live-${i}`, { status: 'active', created: at(i) }));
|
|
46
|
+
recordPid(`live-${i}`, process.pid); // process.pid is alive → isPidAlive true
|
|
47
|
+
}
|
|
48
|
+
createNode(node('old-a', { status: 'dead', created: at(100) }));
|
|
49
|
+
createNode(node('old-b', { status: 'done', created: at(101) }));
|
|
50
|
+
const result = pruneToLimit({ maxNodes: 3 });
|
|
51
|
+
assert.equal(result.dryRun, false);
|
|
52
|
+
assert.deepEqual(result.pruned.map((p) => p.node_id).sort(), ['old-a', 'old-b']);
|
|
53
|
+
for (let i = 0; i < 5; i++) {
|
|
54
|
+
assert.ok(getRow(`live-${i}`) !== null, `live-${i} must survive past the cap`);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
test('deletes the oldest terminal nodes beyond max(cap, liveCount)', () => {
|
|
58
|
+
// 1 live + 5 terminal of descending recency; cap of 3 → target = max(3,1) = 3.
|
|
59
|
+
// Ranked by recency DESC: live-0, term-0, term-1 (top 3, kept), then
|
|
60
|
+
// term-2, term-3, term-4 (rank >= 3, pruned).
|
|
61
|
+
createNode(node('live-0', { status: 'idle', created: at(0) }));
|
|
62
|
+
recordPid('live-0', process.pid);
|
|
63
|
+
for (let i = 0; i < 5; i++) {
|
|
64
|
+
createNode(node(`term-${i}`, { status: 'dead', created: at(10 + i) }));
|
|
65
|
+
}
|
|
66
|
+
const result = pruneToLimit({ maxNodes: 3 });
|
|
67
|
+
assert.deepEqual(result.pruned.map((p) => p.node_id).sort(), ['term-2', 'term-3', 'term-4']);
|
|
68
|
+
// The kept set: the live node + the two newest terminal.
|
|
69
|
+
for (const id of ['live-0', 'term-0', 'term-1']) {
|
|
70
|
+
assert.ok(getRow(id) !== null, `${id} must survive`);
|
|
71
|
+
assert.ok(existsSync(nodeDir(id)), `${id} dir must survive`);
|
|
72
|
+
}
|
|
73
|
+
// The pruned set: rows AND dirs gone.
|
|
74
|
+
for (const id of ['term-2', 'term-3', 'term-4']) {
|
|
75
|
+
assert.equal(getRow(id), null, `${id} row should be pruned`);
|
|
76
|
+
assert.ok(!existsSync(nodeDir(id)), `${id} dir should be removed`);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
test('--dry-run reports candidates but deletes nothing', () => {
|
|
80
|
+
for (let i = 0; i < 5; i++) {
|
|
81
|
+
createNode(node(`term-${i}`, { status: 'dead', created: at(i) }));
|
|
82
|
+
}
|
|
83
|
+
const result = pruneToLimit({ maxNodes: 3, dryRun: true });
|
|
84
|
+
assert.equal(result.dryRun, true);
|
|
85
|
+
assert.deepEqual(result.pruned.map((p) => p.node_id).sort(), ['term-3', 'term-4']);
|
|
86
|
+
// Nothing deleted — all rows + dirs intact.
|
|
87
|
+
for (let i = 0; i < 5; i++) {
|
|
88
|
+
assert.ok(getRow(`term-${i}`) !== null, `term-${i} must survive a dry run`);
|
|
89
|
+
assert.ok(existsSync(nodeDir(`term-${i}`)), `term-${i} dir must survive a dry run`);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
@@ -93,41 +93,54 @@ after(() => {
|
|
|
93
93
|
// ---------------------------------------------------------------------------
|
|
94
94
|
// resumeArgs — the pure resume-source selection
|
|
95
95
|
// ---------------------------------------------------------------------------
|
|
96
|
-
test('resumeArgs
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
});
|
|
96
|
+
test('resumeArgs resumes by the absolute file path when it exists on disk', () => {
|
|
97
|
+
mkdirSync(home, { recursive: true });
|
|
98
|
+
const sessionFile = join(home, 'resume-args-exists.jsonl');
|
|
99
|
+
writeFileSync(sessionFile, '{}\n', 'utf8');
|
|
100
|
+
const m = node('n', { pi_session_id: 'uuid-123', pi_session_file: sessionFile });
|
|
101
|
+
assert.deepEqual(resumeArgs(m, true), { resumeSessionPath: sessionFile });
|
|
102
102
|
});
|
|
103
|
-
test('resumeArgs falls
|
|
103
|
+
test('resumeArgs selects nothing (falls through to fresh) when no file was ever captured (older node)', () => {
|
|
104
104
|
const m = node('n', { pi_session_id: 'uuid-123', pi_session_file: null });
|
|
105
|
-
assert.deepEqual(resumeArgs(m, true), {
|
|
106
|
-
|
|
107
|
-
|
|
105
|
+
assert.deepEqual(resumeArgs(m, true), {});
|
|
106
|
+
});
|
|
107
|
+
test('resumeArgs selects nothing (falls through to fresh) when the recorded file does not exist on disk', () => {
|
|
108
|
+
// The related P6 finding: pi_session_file can be recorded in meta with
|
|
109
|
+
// nothing ever written there (the first-boot engine died before
|
|
110
|
+
// session_start). A bare id is NOT a safe fallback either —
|
|
111
|
+
// headlessBrokerHost's preflight fatally rejects it — so this must select
|
|
112
|
+
// NEITHER source, not silently hand pi a path that isn't there.
|
|
113
|
+
const m = node('n', {
|
|
114
|
+
pi_session_id: 'uuid-123',
|
|
115
|
+
pi_session_file: join(home, 'never-written.jsonl'),
|
|
108
116
|
});
|
|
117
|
+
assert.deepEqual(resumeArgs(m, true), {});
|
|
109
118
|
});
|
|
110
119
|
test('resumeArgs selects neither source on a no-resume (refresh) revive', () => {
|
|
111
|
-
|
|
120
|
+
mkdirSync(home, { recursive: true });
|
|
121
|
+
const sessionFile = join(home, 'resume-args-refresh.jsonl');
|
|
122
|
+
writeFileSync(sessionFile, '{}\n', 'utf8');
|
|
123
|
+
const m = node('n', { pi_session_id: 'uuid-123', pi_session_file: sessionFile });
|
|
112
124
|
assert.deepEqual(resumeArgs(m, false), {});
|
|
113
125
|
});
|
|
114
126
|
// ---------------------------------------------------------------------------
|
|
115
127
|
// buildPiArgv — the `--session` argument the revive builds
|
|
116
128
|
// ---------------------------------------------------------------------------
|
|
117
|
-
test('buildPiArgv resumes by ABSOLUTE path when pi_session_file
|
|
118
|
-
|
|
129
|
+
test('buildPiArgv resumes by ABSOLUTE path when pi_session_file exists on disk', () => {
|
|
130
|
+
mkdirSync(home, { recursive: true });
|
|
131
|
+
const sessionFile = join(home, 'build-argv-exists.jsonl');
|
|
132
|
+
writeFileSync(sessionFile, '{}\n', 'utf8');
|
|
133
|
+
const m = node('n', { pi_session_id: 'uuid-123', pi_session_file: sessionFile });
|
|
119
134
|
const { argv } = buildPiArgv(m, resumeArgs(m, true));
|
|
120
135
|
const i = argv.indexOf('--session');
|
|
121
136
|
assert.ok(i >= 0, 'argv carries --session');
|
|
122
|
-
assert.equal(argv[i + 1],
|
|
123
|
-
assert.ok(!argv.includes('uuid-123'), 'the bare uuid is
|
|
137
|
+
assert.equal(argv[i + 1], sessionFile, 'resumes by absolute file path');
|
|
138
|
+
assert.ok(!argv.includes('uuid-123'), 'the bare uuid is never used to resume');
|
|
124
139
|
});
|
|
125
|
-
test('buildPiArgv
|
|
140
|
+
test('buildPiArgv passes no --session when no path is stored (falls through to fresh)', () => {
|
|
126
141
|
const m = node('n', { pi_session_id: 'uuid-123', pi_session_file: null });
|
|
127
142
|
const { argv } = buildPiArgv(m, resumeArgs(m, true));
|
|
128
|
-
|
|
129
|
-
assert.ok(i >= 0, 'argv carries --session');
|
|
130
|
-
assert.equal(argv[i + 1], 'uuid-123', 'resumes by bare uuid (older node)');
|
|
143
|
+
assert.ok(!argv.includes('--session'), 'no bare-uuid resume — a bare id is fatally rejected by broker preflight');
|
|
131
144
|
});
|
|
132
145
|
test('buildPiArgv passes no --session on a fresh (no-resume) launch', () => {
|
|
133
146
|
const m = node('n', { pi_session_id: 'uuid-123', pi_session_file: '/abs/sess.jsonl' });
|
|
@@ -140,11 +153,14 @@ test('buildPiArgv passes no --session on a fresh (no-resume) launch', () => {
|
|
|
140
153
|
// (kind/mode/lifecycle come back as the node's *current* self).
|
|
141
154
|
// ---------------------------------------------------------------------------
|
|
142
155
|
test('a resumed revive replays the persisted LaunchSpec (model, tools, extensions, prompt, env)', () => {
|
|
156
|
+
mkdirSync(home, { recursive: true });
|
|
157
|
+
const sessionFile = join(home, 'launchspec-replay.jsonl');
|
|
158
|
+
writeFileSync(sessionFile, '{}\n', 'utf8');
|
|
143
159
|
const m = node('n', {
|
|
144
160
|
kind: 'developer',
|
|
145
161
|
mode: 'orchestrator',
|
|
146
162
|
pi_session_id: 'uuid-9',
|
|
147
|
-
pi_session_file:
|
|
163
|
+
pi_session_file: sessionFile,
|
|
148
164
|
launch: {
|
|
149
165
|
model: 'anthropic/sonnet',
|
|
150
166
|
tools: ['bash', 'read'],
|
|
@@ -167,7 +183,7 @@ test('a resumed revive replays the persisted LaunchSpec (model, tools, extension
|
|
|
167
183
|
assert.equal(argv[ti + 1], 'bash,read');
|
|
168
184
|
assert.ok(argv.includes('--append-system-prompt'), 'system prompt replayed');
|
|
169
185
|
const si = argv.indexOf('--session');
|
|
170
|
-
assert.equal(argv[si + 1],
|
|
186
|
+
assert.equal(argv[si + 1], sessionFile, 'still resumes by file path');
|
|
171
187
|
// Env contract: launch-spec env merged over the node identity env.
|
|
172
188
|
assert.equal(env['FOO'], 'bar');
|
|
173
189
|
assert.equal(env['CRTR_NODE_ID'], 'n');
|
|
@@ -230,6 +246,33 @@ test('reviveNode PROCEEDS when the broker engine is DOWN (dead pid) — cycle co
|
|
|
230
246
|
await h.dispose();
|
|
231
247
|
}
|
|
232
248
|
});
|
|
249
|
+
test('reviveNode fresh-fallback clears the stale session identity (Major-3: no phantom stranded-relaunch)', async () => {
|
|
250
|
+
const h = await createHarness({ headless: true, sessionPrefix: 'crtr-revive-freshfb' });
|
|
251
|
+
try {
|
|
252
|
+
// resume=true was ASKED, but the recorded .jsonl is gone from disk, so
|
|
253
|
+
// resumeArgs falls through to a FRESH launch. The stale pi_session_id /
|
|
254
|
+
// pi_session_file must be cleared BEFORE launch: if this fresh broker then
|
|
255
|
+
// dies before session_start (no new pid, no new session), the daemon keys on
|
|
256
|
+
// pi_session_id — a leftover id would be misread as a stranded relaunch and
|
|
257
|
+
// retried forever instead of surfaced as a boot failure.
|
|
258
|
+
const missingFile = join(home, 'sessions', 'never-written.jsonl');
|
|
259
|
+
const M = h.fabricateBrokerNode({
|
|
260
|
+
status: 'active',
|
|
261
|
+
intent: null,
|
|
262
|
+
pi_pid: deadPid(),
|
|
263
|
+
pi_session_id: 'uuid-stale',
|
|
264
|
+
pi_session_file: missingFile,
|
|
265
|
+
});
|
|
266
|
+
const res = reviveNode(M, { resume: true });
|
|
267
|
+
assert.equal(res.resumed, false, 'a missing .jsonl forces a fresh (non-resuming) launch');
|
|
268
|
+
const after = h.node(M);
|
|
269
|
+
assert.equal(after.pi_session_id, null, 'stale pi_session_id cleared before the fresh launch');
|
|
270
|
+
assert.equal(after.pi_session_file, null, 'stale pi_session_file cleared before the fresh launch');
|
|
271
|
+
}
|
|
272
|
+
finally {
|
|
273
|
+
await h.dispose();
|
|
274
|
+
}
|
|
275
|
+
});
|
|
233
276
|
test('reviveNode crashes and clears pid when launch/preflight throws', async () => {
|
|
234
277
|
const h = await createHarness({ headless: true, sessionPrefix: 'crtr-revive-fail' });
|
|
235
278
|
const originalLaunch = headlessBrokerHost.launch;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// Regression for final-integrated-verdict finding #3: the v7 (`wakeups`) →
|
|
2
|
+
// v9 (`triggers`) migration must preserve a deadline wakeup's `fire_at`
|
|
3
|
+
// exactly, not just its `trigger_type`/`node_id`. Drives the real migration
|
|
4
|
+
// steps (`MIGRATIONS[6]` = appendWakeupsTable/v7, `MIGRATIONS[8]` =
|
|
5
|
+
// migrateWakeupsToTriggers/v9) directly against a bare `DatabaseSync`, seeding
|
|
6
|
+
// a v7-shaped `wakeups` row by hand — see `src/core/canvas/db.ts`.
|
|
7
|
+
import { test, before, after } from 'node:test';
|
|
8
|
+
import assert from 'node:assert/strict';
|
|
9
|
+
import { mkdtempSync, rmSync } from 'node:fs';
|
|
10
|
+
import { tmpdir } from 'node:os';
|
|
11
|
+
import { join } from 'node:path';
|
|
12
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
13
|
+
import { MIGRATIONS } from '../canvas/db.js';
|
|
14
|
+
let home;
|
|
15
|
+
before(() => {
|
|
16
|
+
home = mkdtempSync(join(tmpdir(), 'crtr-trigger-migration-'));
|
|
17
|
+
});
|
|
18
|
+
after(() => {
|
|
19
|
+
rmSync(home, { recursive: true, force: true });
|
|
20
|
+
});
|
|
21
|
+
test('v7->v9 migration preserves a deadline wakeup\'s fire_at exactly', () => {
|
|
22
|
+
const db = new DatabaseSync(join(home, 'migration.db'));
|
|
23
|
+
try {
|
|
24
|
+
db.exec('PRAGMA foreign_keys = ON;');
|
|
25
|
+
// v1 — nodes/edges baseline (MIGRATIONS[0]); triggers.node_id's FK needs a
|
|
26
|
+
// real nodes row to reference.
|
|
27
|
+
MIGRATIONS[0](db);
|
|
28
|
+
const created = new Date().toISOString();
|
|
29
|
+
db.prepare(`INSERT INTO nodes (node_id, name, kind, cwd, created) VALUES (?, ?, ?, ?, ?)`).run('target-node', 'target-node', 'general', '/tmp/work', created);
|
|
30
|
+
// v7 — the wakeups table (MIGRATIONS[6]).
|
|
31
|
+
MIGRATIONS[6](db);
|
|
32
|
+
const fireAt = '2026-01-01T12:34:56.000Z';
|
|
33
|
+
db.prepare(`INSERT INTO wakeups (wakeup_id, node_id, owner_id, fire_at, kind, recur, payload, created)
|
|
34
|
+
VALUES (?, ?, ?, ?, 'deadline', NULL, ?, ?)`).run('wk-1', 'target-node', 'target-node', fireAt, JSON.stringify({ body: 'time is up', timeout: true, label: 'deadline' }), created);
|
|
35
|
+
// v9 — generalize wakeups into triggers (MIGRATIONS[8]).
|
|
36
|
+
MIGRATIONS[8](db);
|
|
37
|
+
const row = db.prepare('SELECT * FROM triggers WHERE trigger_id = ?').get('wk-1');
|
|
38
|
+
assert.ok(row, 'migrated trigger row should exist under the preserved wakeup_id');
|
|
39
|
+
assert.equal(row['trigger_type'], 'until');
|
|
40
|
+
assert.equal(row['action_mode'], 'deadline_message');
|
|
41
|
+
// The literal required assertion (verdict finding #3): fire_at must survive
|
|
42
|
+
// the migration byte-for-byte, not just the trigger_type/action_mode shape.
|
|
43
|
+
assert.equal(row['fire_at'], fireAt);
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
db.close();
|
|
47
|
+
}
|
|
48
|
+
});
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
// Run with: node --import tsx/esm --test src/core/__tests__/wake-bearings.test.ts
|
|
2
2
|
//
|
|
3
|
-
//
|
|
3
|
+
// Trigger-origin self-knowledge (the <crtr-wake> provenance block). Regression
|
|
4
4
|
// guard for the observed gap: a node woken or BORN by a scheduled TIMER could
|
|
5
|
-
// not tell it came from a timer — a
|
|
5
|
+
// not tell it came from a timer — a fired trigger arrived indistinguishable
|
|
6
6
|
// from an ordinary refresh/message (the Invariant B/D anti-goal). These lock:
|
|
7
|
-
// • buildWakeBearings renders the right decision-first block per
|
|
8
|
-
// cadence, and never crashes when the armer was reaped (no resolved
|
|
9
|
-
//
|
|
7
|
+
// • buildWakeBearings renders the right decision-first block per trigger
|
|
8
|
+
// kind / cadence, and never crashes when the armer was reaped (no resolved
|
|
9
|
+
// name);
|
|
10
|
+
// • the fresh-revive kickoff carries that block (so a scheduled alarm is
|
|
10
11
|
// distinguishable from a generic context-refresh), placed AFTER the kickoff
|
|
11
12
|
// sentinel (goal-capture keys on it) and BEFORE the roadmap/disk bearings;
|
|
12
13
|
// • an ordinary fresh revive (no wakeReason) carries NO block.
|
|
@@ -47,9 +48,9 @@ after(() => {
|
|
|
47
48
|
delete process.env['CRTR_HOME'];
|
|
48
49
|
});
|
|
49
50
|
// --- buildWakeBearings: one per kind / cadence variant ----------------------
|
|
50
|
-
test('
|
|
51
|
+
test('node_birth one-shot: names a deferred birth + the armer, and says it does not recur', () => {
|
|
51
52
|
const o = {
|
|
52
|
-
kind: '
|
|
53
|
+
kind: 'node_birth',
|
|
53
54
|
ownerId: 'arm-1',
|
|
54
55
|
ownerName: 'release-orch',
|
|
55
56
|
armedAt: ARMED,
|
|
@@ -64,9 +65,9 @@ test('spawn one-shot: names a deferred birth + the armer, and says it does not r
|
|
|
64
65
|
assert.match(b, /only run, not a recurring job/);
|
|
65
66
|
assert.match(b, /Your task follows\./);
|
|
66
67
|
});
|
|
67
|
-
test('
|
|
68
|
+
test('node_birth cron: surfaces the cadence + frames it as one run of a standing job', () => {
|
|
68
69
|
const o = {
|
|
69
|
-
kind: '
|
|
70
|
+
kind: 'node_birth',
|
|
70
71
|
ownerId: 'arm-1',
|
|
71
72
|
ownerName: 'nightly',
|
|
72
73
|
armedAt: ARMED,
|
|
@@ -79,9 +80,9 @@ test('spawn cron: surfaces the cadence + frames it as one run of a standing job'
|
|
|
79
80
|
assert.match(b, /one run of a standing job, not a one-off/);
|
|
80
81
|
assert.match(b, /inherit nothing from prior runs but this task/);
|
|
81
82
|
});
|
|
82
|
-
test('
|
|
83
|
+
test('node_birth interval cron: renders the every-N cadence', () => {
|
|
83
84
|
const o = {
|
|
84
|
-
kind: '
|
|
85
|
+
kind: 'node_birth',
|
|
85
86
|
ownerId: 'arm-1',
|
|
86
87
|
ownerName: 'poller',
|
|
87
88
|
armedAt: ARMED,
|
|
@@ -89,9 +90,9 @@ test('spawn interval cron: renders the every-N cadence', () => {
|
|
|
89
90
|
};
|
|
90
91
|
assert.match(buildWakeBearings(o), /firing every 6h/);
|
|
91
92
|
});
|
|
92
|
-
test('
|
|
93
|
+
test('node_birth with a reaped armer: renders the bare id, no name, never crashes', () => {
|
|
93
94
|
const o = {
|
|
94
|
-
kind: '
|
|
95
|
+
kind: 'node_birth',
|
|
95
96
|
ownerId: 'gone-9',
|
|
96
97
|
ownerName: undefined, // armer no longer exists → no resolved name
|
|
97
98
|
armedAt: ARMED,
|
|
@@ -101,20 +102,21 @@ test('spawn with a reaped armer: renders the bare id, no name, never crashes', (
|
|
|
101
102
|
assert.match(b, /armed by node gone-9 \(now gone\)/); // bare id, flagged reaped
|
|
102
103
|
assert.doesNotMatch(b, /\("/); // never an empty/dangling name
|
|
103
104
|
});
|
|
104
|
-
test('
|
|
105
|
-
const o = { kind: '
|
|
105
|
+
test('fresh_revive one-shot: frames a timed re-check, NOT a new request', () => {
|
|
106
|
+
const o = { kind: 'fresh_revive', ownerId: 'n1', ownerName: 'n1', armedAt: ARMED, recur: null };
|
|
106
107
|
const b = buildWakeBearings(o);
|
|
107
108
|
assert.match(b, /a scheduled alarm fired/);
|
|
108
109
|
assert.match(b, /a timer, NOT a new message or request/);
|
|
109
110
|
assert.match(b, /timed re-check, not a new task/);
|
|
110
111
|
assert.match(b, /re-read your roadmap/);
|
|
111
|
-
// No armer attribution on bare (could be `--node`-armed by another),
|
|
112
|
+
// No armer attribution on a bare revive (could be `--node`-armed by another),
|
|
113
|
+
// no ISO.
|
|
112
114
|
assert.doesNotMatch(b, /you set/);
|
|
113
115
|
assert.doesNotMatch(b, new RegExp(ARMED));
|
|
114
116
|
});
|
|
115
|
-
test('
|
|
117
|
+
test('fresh_revive recurring: frames one tick of a standing re-check + the cadence', () => {
|
|
116
118
|
const o = {
|
|
117
|
-
kind: '
|
|
119
|
+
kind: 'fresh_revive',
|
|
118
120
|
ownerId: 'n1',
|
|
119
121
|
ownerName: 'n1',
|
|
120
122
|
armedAt: ARMED,
|
|
@@ -124,12 +126,12 @@ test('bare recurring: frames one tick of a standing re-check + the cadence', ()
|
|
|
124
126
|
assert.match(b, /recurring scheduled alarm fired \(every 6h\)/);
|
|
125
127
|
assert.match(b, /one tick of a standing re-check/);
|
|
126
128
|
});
|
|
127
|
-
// --- the
|
|
128
|
-
test('a
|
|
129
|
+
// --- the fresh-revive kickoff seam -------------------------------------
|
|
130
|
+
test('a fresh_revive trigger makes the fresh-revive kickoff distinguishable from a refresh', () => {
|
|
129
131
|
const id = 'b1';
|
|
130
132
|
const meta = createNode(node(id));
|
|
131
133
|
const wakeReason = {
|
|
132
|
-
kind: '
|
|
134
|
+
kind: 'fresh_revive',
|
|
133
135
|
ownerId: id,
|
|
134
136
|
ownerName: id,
|
|
135
137
|
armedAt: ARMED,
|
|
@@ -1,37 +1,37 @@
|
|
|
1
1
|
// Run with: node --import tsx/esm --test src/core/__tests__/wake-origin.test.ts
|
|
2
2
|
//
|
|
3
|
-
// HEADLESS RETARGET (foundation-spec §C.16 + §E).
|
|
4
|
-
// the DAEMON FIRING seams (the other half of the regression — wake-bearings.
|
|
5
|
-
// covers the pure block in isolation). The observed gap: a
|
|
6
|
-
//
|
|
7
|
-
//
|
|
3
|
+
// HEADLESS RETARGET (foundation-spec §C.16 + §E). Trigger-origin self-knowledge
|
|
4
|
+
// at the DAEMON FIRING seams (the other half of the regression — wake-bearings.
|
|
5
|
+
// test.ts covers the pure block in isolation). The observed gap: a node woken
|
|
6
|
+
// or born by a scheduled trigger arrived indistinguishable from an ordinary
|
|
7
|
+
// message/spawn (Invariant D). Both seams are driven model-only — ZERO tmux,
|
|
8
|
+
// ZERO boot:
|
|
8
9
|
//
|
|
9
|
-
// (1) BUG LOCKED — a node woken or BORN by a TIMER must, by construction, learn
|
|
10
|
-
// CLOCK (not an event) caused it:
|
|
11
|
-
// (distinct from a plain `node msg`), and a
|
|
12
|
-
// <crtr-wake> birth block (armer + cadence) to the
|
|
13
|
-
// ordinary `node new` carries none.
|
|
10
|
+
// (1) BUG LOCKED — a node woken or BORN by a TIMER must, by construction, learn
|
|
11
|
+
// a CLOCK (not an event) caused it: an inbox_message trigger rides a
|
|
12
|
+
// ⏰-marked inbox label (distinct from a plain `node msg`), and a node_birth
|
|
13
|
+
// trigger prepends the <crtr-wake> birth block (armer + cadence) to the
|
|
14
|
+
// newborn's kickoff while an ordinary `node new` carries none.
|
|
14
15
|
//
|
|
15
|
-
// (2) WHY MODEL-LEVEL, NOT TMUX CHROME — the
|
|
16
|
-
// (superviseTick's third pass → appendInbox; readInboxSince reads it
|
|
17
|
-
// The spawn-birth seam (spawn.ts) assembles the kickoff as
|
|
16
|
+
// (2) WHY MODEL-LEVEL, NOT TMUX CHROME — the inbox_message seam is pure data
|
|
17
|
+
// layer (superviseTick's third pass → appendInbox; readInboxSince reads it
|
|
18
|
+
// back). The spawn-birth seam (spawn.ts) assembles the kickoff as
|
|
18
19
|
// `${buildWakeBearings(wakeOrigin)}\n\n${idBlock}${prompt}` ONLY when a
|
|
19
20
|
// wakeOrigin is present; `node new` passes none → no block. The load-bearing
|
|
20
|
-
// fact is the PURE rendering of buildWakeBearings for a
|
|
21
|
-
// absence without one) — reading it off a real booted pi's prompt
|
|
22
|
-
// tmux/SDK overhead for a string a pure call already returns.
|
|
21
|
+
// fact is the PURE rendering of buildWakeBearings for a node_birth origin
|
|
22
|
+
// (and its absence without one) — reading it off a real booted pi's prompt
|
|
23
|
+
// was pure tmux/SDK overhead for a string a pure call already returns.
|
|
23
24
|
//
|
|
24
25
|
// (3) HOW THE DRIVE STILL FAILS IF THE BUG REGRESSES — drop the ⏰ label marker
|
|
25
|
-
// and the
|
|
26
|
-
// and the spawn assert goes RED (the block / armer / cadence
|
|
26
|
+
// and the inbox_message assert goes RED; drop the node_birth <crtr-wake>
|
|
27
|
+
// rendering and the spawn assert goes RED (the block / armer / cadence
|
|
28
|
+
// vanish).
|
|
27
29
|
import { test, before, after, beforeEach } from 'node:test';
|
|
28
30
|
import assert from 'node:assert/strict';
|
|
29
31
|
import { mkdtempSync, rmSync } from 'node:fs';
|
|
30
32
|
import { tmpdir } from 'node:os';
|
|
31
33
|
import { join } from 'node:path';
|
|
32
|
-
import { createNode } from '../canvas/
|
|
33
|
-
import { armWake } from '../canvas/wakeups.js';
|
|
34
|
-
import { closeDb } from '../canvas/db.js';
|
|
34
|
+
import { createNode, armTrigger, closeDb } from '../canvas/index.js';
|
|
35
35
|
import { readInboxSince } from '../feed/inbox.js';
|
|
36
36
|
import { superviseTick } from '../../daemon/crtrd.js';
|
|
37
37
|
import { buildWakeBearings } from '../runtime/bearings.js';
|
|
@@ -62,16 +62,18 @@ after(() => {
|
|
|
62
62
|
rmSync(home, { recursive: true, force: true });
|
|
63
63
|
delete process.env['CRTR_HOME'];
|
|
64
64
|
});
|
|
65
|
-
// ---
|
|
66
|
-
test('a
|
|
65
|
+
// --- inbox_message seam (the daemon's third pass → inbox) -------------------
|
|
66
|
+
test('a due inbox_message trigger delivers a ⏰-marked inbox label, distinct from a plain message', async () => {
|
|
67
67
|
const armer = createNode(node('armer'));
|
|
68
68
|
const target = createNode(node('tgt')); // no tmux placement → pass 1 skips it
|
|
69
|
-
|
|
70
|
-
|
|
69
|
+
armTrigger({
|
|
70
|
+
trigger_id: 'trg-noted-1',
|
|
71
71
|
node_id: target.node_id,
|
|
72
72
|
owner_id: armer.node_id,
|
|
73
|
+
action: 'msg',
|
|
74
|
+
action_mode: 'inbox_message',
|
|
75
|
+
trigger_type: 'at',
|
|
73
76
|
fire_at: new Date(Date.now() - 1000).toISOString(),
|
|
74
|
-
kind: 'noted',
|
|
75
77
|
recur: null,
|
|
76
78
|
payload: { body: 'CI should be green by now — check it', label: 'check CI' },
|
|
77
79
|
});
|
|
@@ -79,22 +81,23 @@ test('a noted scheduled wake delivers a ⏰-marked inbox label, distinct from a
|
|
|
79
81
|
await superviseTick(Date.now());
|
|
80
82
|
closeDb();
|
|
81
83
|
const entries = readInboxSince(target.node_id);
|
|
82
|
-
assert.equal(entries.length, 1, 'the
|
|
84
|
+
assert.equal(entries.length, 1, 'the due trigger delivered exactly one inbox entry');
|
|
83
85
|
// Invariant D: the timer signal rides the VISIBLE label (digests never surface
|
|
84
86
|
// arbitrary data keys), so this is distinguishable from a plain `node msg`.
|
|
85
87
|
assert.equal(entries[0].label, '⏰ scheduled wake — check CI');
|
|
86
88
|
assert.notEqual(entries[0].label, 'check CI', 'a plain message would carry the bare label');
|
|
87
89
|
});
|
|
88
|
-
// ---
|
|
89
|
-
test('a
|
|
90
|
+
// --- node_birth seam (the headline; spawn.ts kickoff assembly) --------------
|
|
91
|
+
test('a node_birth trigger renders a <crtr-wake> birth block (armer + cadence); a plain node new renders none', async () => {
|
|
90
92
|
const armer = createNode(node('armer'));
|
|
91
93
|
// The spawn-birth seam (spawn.ts): the newborn's pi kickoff is
|
|
92
94
|
// `${buildWakeBearings(wakeOrigin)}\n\n${idBlock}${prompt}`
|
|
93
95
|
// when a wakeOrigin is present, and just `${idBlock}${prompt}` (no block)
|
|
94
|
-
// when it is not. The daemon's third pass builds the WakeOrigin from the
|
|
95
|
-
// recurring
|
|
96
|
+
// when it is not. The daemon's third pass builds the WakeOrigin from the
|
|
97
|
+
// fired recurring node_birth trigger row via wakeOriginFrom; here we assert
|
|
98
|
+
// the block it yields.
|
|
96
99
|
const origin = {
|
|
97
|
-
kind: '
|
|
100
|
+
kind: 'node_birth',
|
|
98
101
|
ownerId: armer.node_id,
|
|
99
102
|
ownerName: 'armer',
|
|
100
103
|
armedAt: new Date(Date.now() - 1000).toISOString(),
|
|
@@ -110,5 +113,5 @@ test('a spawn scheduled wake renders a <crtr-wake> birth block (armer + cadence)
|
|
|
110
113
|
// prepends nothing — no <crtr-wake> in the newborn's kickoff.
|
|
111
114
|
const wakeBlock = (o) => (o !== undefined ? `${buildWakeBearings(o)}\n\n` : '');
|
|
112
115
|
assert.equal(wakeBlock(undefined), '', 'node new (no wakeOrigin) prepends no wake block');
|
|
113
|
-
assert.match(wakeBlock(origin), /<crtr-wake>/, 'a
|
|
116
|
+
assert.match(wakeBlock(origin), /<crtr-wake>/, 'a node_birth trigger prepends the block');
|
|
114
117
|
});
|