@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
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
// `crtr view pick` — hidden raw-ANSI picker over the available views.
|
|
1
|
+
// `crtr surface view pick` — hidden raw-ANSI picker over the available views.
|
|
2
2
|
//
|
|
3
3
|
// Backs the /view popup: a minimal full-screen list of listViews(); j/k move,
|
|
4
|
-
// Enter hands off to
|
|
4
|
+
// Enter hands off to the surface-view run command (execFileSync, stdio inherit — a
|
|
5
5
|
// one-way handoff, the picker exits as the view takes over, same pattern as
|
|
6
6
|
// browse's selectAndFocus), q/Esc/Ctrl-C quit. Outside a TTY it prints the
|
|
7
7
|
// plain list and exits 0. Reuses the core/tui terminal + draw primitives.
|
|
@@ -14,7 +14,7 @@ export const viewPickLeaf = defineLeaf({
|
|
|
14
14
|
name: 'pick',
|
|
15
15
|
tier: 'hidden',
|
|
16
16
|
description: 'raw-ANSI view picker (used by the /view popup)',
|
|
17
|
-
whenToUse: 'internal — the
|
|
17
|
+
whenToUse: 'internal — the picker chooses a view for the popup, then hands off to the view host. You normally use run or list directly',
|
|
18
18
|
help: {
|
|
19
19
|
name: 'view pick',
|
|
20
20
|
summary: 'interactive picker over available views; Enter runs the chosen view. Outside a TTY it prints the list and exits',
|
|
@@ -23,7 +23,7 @@ export const viewPickLeaf = defineLeaf({
|
|
|
23
23
|
outputKind: 'object',
|
|
24
24
|
effects: [
|
|
25
25
|
'Inside a TTY: takes over the terminal in raw mode until you pick (Enter) or quit (q/Esc/Ctrl-C).',
|
|
26
|
-
'On Enter:
|
|
26
|
+
'On Enter: hands off to the chosen view host (stdio inherited) — a one-way handoff; the picker exits.',
|
|
27
27
|
'Outside a TTY: prints the plain view list and exits 0.',
|
|
28
28
|
],
|
|
29
29
|
},
|
|
@@ -38,7 +38,7 @@ export const viewPickLeaf = defineLeaf({
|
|
|
38
38
|
return;
|
|
39
39
|
}
|
|
40
40
|
if (views.length === 0) {
|
|
41
|
-
process.stdout.write('No views found. Scaffold one with
|
|
41
|
+
process.stdout.write('No views found. Scaffold one with the view new leaf.\n');
|
|
42
42
|
return;
|
|
43
43
|
}
|
|
44
44
|
const caps = detectColorCaps();
|
|
@@ -81,7 +81,7 @@ export const viewPickLeaf = defineLeaf({
|
|
|
81
81
|
const launch = (id) => {
|
|
82
82
|
cleanup();
|
|
83
83
|
try {
|
|
84
|
-
execFileSync('crtr', ['view', 'run', id], { stdio: 'inherit' });
|
|
84
|
+
execFileSync('crtr', ['surface', 'view', 'run', id], { stdio: 'inherit' });
|
|
85
85
|
}
|
|
86
86
|
catch {
|
|
87
87
|
// The view takes the terminal over; a sync handoff may be interrupted.
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
// `crtr view run
|
|
1
|
+
// `crtr surface view run` — resolve, load, and host a view's TUI target.
|
|
2
2
|
//
|
|
3
3
|
// Resolves the view across scopes (project→user→builtin), loads its core.mjs +
|
|
4
4
|
// tui.mjs (+ optional text.mjs), then hands them to the dual-target core host.
|
|
5
5
|
// The host owns the screen and the non-TTY path: when stdin is NOT a TTY it
|
|
6
|
-
// prints the text presenter's dump and exits 0, so
|
|
7
|
-
//
|
|
6
|
+
// prints the text presenter's dump and exits 0, so a pipe gets a static
|
|
7
|
+
// snapshot. A view that ships no core.mjs is not a view — run fails with a
|
|
8
8
|
// clear error naming the contract, never a fallback. The interactive path is
|
|
9
9
|
// tmux-only (crtr is tmux-only) — outside tmux with a TTY we notify + no-op,
|
|
10
10
|
// never a non-tmux fallback. --port / --target forward verbatim onto
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
// --window / --split open the view as a PERSISTENT MONITOR instead of taking
|
|
14
14
|
// over the current pane: --window in a new background (non-focus-stealing)
|
|
15
15
|
// tmux window, --split in a right-hand split of the current pane. Both shell a
|
|
16
|
-
// plain inner
|
|
16
|
+
// plain inner surface-view run command into the new pane, which hosts the view
|
|
17
17
|
// there and self-tags the pane with @crtr_view so the Alt+V then ]/[ view-cycle
|
|
18
18
|
// can flip it to the next/prev view in place. Both are tmux-only by nature; in
|
|
19
19
|
// a pipe (non-TTY) placement is meaningless, so they degrade to the static dump.
|
|
@@ -27,7 +27,7 @@ import { inTmux, currentTmux, openNodeWindow, splitWindow, piCommand, setPaneOpt
|
|
|
27
27
|
export const viewRunLeaf = defineLeaf({
|
|
28
28
|
name: 'run',
|
|
29
29
|
description: 'resolve, load, and host a view (in this pane, a new window, or a split)',
|
|
30
|
-
whenToUse: 'you want to
|
|
30
|
+
whenToUse: 'you want to open a view by name — a full-screen raw-ANSI surface. By default it hosts in the current pane (tmux-only interactive; piped it prints a static snapshot). Pass --window to open it as a background monitor window, or --split to open it beside the current pane so it stays available as a live monitor. Pass --port/--target to forward connection details. Use list first to see what is available, or new to scaffold one',
|
|
31
31
|
help: {
|
|
32
32
|
name: 'view run',
|
|
33
33
|
summary: 'host a view in the current pane, a new window (--window), or a split (--split); outside a TTY it prints the view\'s static dump and exits 0',
|
|
@@ -35,8 +35,8 @@ export const viewRunLeaf = defineLeaf({
|
|
|
35
35
|
{ kind: 'positional', name: 'name', required: true, constraint: 'View id to run (its directory name). Resolves project→user→builtin.' },
|
|
36
36
|
{ kind: 'flag', name: 'window', type: 'bool', required: false, constraint: 'Open the view in a NEW background tmux window (non-focus-stealing) instead of the current pane — a persistent monitor. tmux-only; ignored (static dump) in a pipe. Mutually exclusive with --split.' },
|
|
37
37
|
{ kind: 'flag', name: 'split', type: 'bool', required: false, constraint: 'Open the view in a right-hand SPLIT of the current pane instead of taking it over — a side-by-side monitor. tmux-only; ignored (static dump) in a pipe. Mutually exclusive with --window.' },
|
|
38
|
-
{ kind: 'flag', name: 'port', type: 'int', required: false, constraint: 'Forwarded verbatim to the view as options.port
|
|
39
|
-
{ kind: 'flag', name: 'target', type: 'string', required: false, constraint: 'Forwarded verbatim to the view as options.target
|
|
38
|
+
{ kind: 'flag', name: 'port', type: 'int', required: false, constraint: 'Forwarded verbatim to the view as options.port for views that connect to a network service.' },
|
|
39
|
+
{ kind: 'flag', name: 'target', type: 'string', required: false, constraint: 'Forwarded verbatim to the view as options.target for views that need an external target identifier.' },
|
|
40
40
|
],
|
|
41
41
|
output: [
|
|
42
42
|
{ name: 'hosted', type: 'string', required: false, constraint: 'For --window/--split: "window" or "split" — where the monitor opened. Absent for an in-pane host (which holds the terminal until you quit).' },
|
|
@@ -76,7 +76,7 @@ export const viewRunLeaf = defineLeaf({
|
|
|
76
76
|
error: 'view_invalid',
|
|
77
77
|
message: `'${name}' is not a valid view: ${dir} has no core.mjs`,
|
|
78
78
|
received: name,
|
|
79
|
-
next:
|
|
79
|
+
next: 'A view is a directory containing core.mjs (the portable core) plus optional tui.mjs (render + keymap), web.jsx, and text.mjs. Use the surface view new leaf to scaffold the shape.',
|
|
80
80
|
});
|
|
81
81
|
}
|
|
82
82
|
const avail = listViews().map((v) => v.id);
|
|
@@ -85,8 +85,8 @@ export const viewRunLeaf = defineLeaf({
|
|
|
85
85
|
message: `no view: ${name}`,
|
|
86
86
|
received: name,
|
|
87
87
|
next: avail.length > 0
|
|
88
|
-
? `Available views: ${avail.join(', ')}. Or scaffold one with
|
|
89
|
-
:
|
|
88
|
+
? `Available views: ${avail.join(', ')}. Or scaffold one with the surface view new leaf.`
|
|
89
|
+
: 'No views found. Scaffold one with the surface view new leaf.',
|
|
90
90
|
});
|
|
91
91
|
}
|
|
92
92
|
const options = {};
|
|
@@ -116,7 +116,7 @@ export const viewRunLeaf = defineLeaf({
|
|
|
116
116
|
throw new InputError({
|
|
117
117
|
error: 'not_in_tmux',
|
|
118
118
|
message: '--window/--split are tmux-only — run crtr inside its tmux session',
|
|
119
|
-
next:
|
|
119
|
+
next: 'Open it from inside tmux, or drop the placement flag to host in the current pane. For a static snapshot, pipe the command output.',
|
|
120
120
|
});
|
|
121
121
|
}
|
|
122
122
|
const here = currentTmux();
|
|
@@ -129,7 +129,7 @@ export const viewRunLeaf = defineLeaf({
|
|
|
129
129
|
}
|
|
130
130
|
// The inner command re-enters this leaf with NO placement flag, so it
|
|
131
131
|
// hosts the view in its own (new) pane and self-tags it via @crtr_view.
|
|
132
|
-
const argv = ['view', 'run', name];
|
|
132
|
+
const argv = ['surface', 'view', 'run', name];
|
|
133
133
|
if (port !== undefined)
|
|
134
134
|
argv.push('--port', String(port));
|
|
135
135
|
if (target !== undefined)
|
|
@@ -164,8 +164,8 @@ export const viewRunLeaf = defineLeaf({
|
|
|
164
164
|
if (process.stdin.isTTY && !inTmux()) {
|
|
165
165
|
throw new InputError({
|
|
166
166
|
error: 'not_in_tmux',
|
|
167
|
-
message: 'crtr view is tmux-only — run it inside the crtr tmux session',
|
|
168
|
-
next:
|
|
167
|
+
message: 'crtr surface view is tmux-only — run it inside the crtr tmux session',
|
|
168
|
+
next: 'Open it from inside tmux, or pipe the command output for a static snapshot.',
|
|
169
169
|
});
|
|
170
170
|
}
|
|
171
171
|
// Self-tag this pane with the view id (+ any forwarded --port/--target) so
|
package/dist/commands/view.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// `crtr view` — the TUI view library.
|
|
1
|
+
// `crtr surface view` — the TUI view library.
|
|
2
2
|
//
|
|
3
3
|
// Views are switchable surfaces with two targets from one portable core.mjs:
|
|
4
4
|
// the tmux TUI (`run`) and a React+Tailwind web page. This branch assembles the
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
// target (interactive in tmux, static dump when piped), `new` scaffolds a fresh
|
|
7
7
|
// view directory, and the hidden `pick` backs the /view popup. Each leaf owns
|
|
8
8
|
// its own help one level down. The web target is no longer served per-view here:
|
|
9
|
-
// it is hosted by the unified
|
|
9
|
+
// it is hosted by the unified surface web server (the shell's /view/<id> route).
|
|
10
10
|
import { defineBranch } from '../core/command.js';
|
|
11
11
|
import { viewListLeaf } from './view-list.js';
|
|
12
12
|
import { viewRunLeaf } from './view-run.js';
|
|
@@ -24,7 +24,7 @@ export function registerView() {
|
|
|
24
24
|
help: {
|
|
25
25
|
name: 'view',
|
|
26
26
|
summary: 'host and author switchable raw-ANSI terminal views',
|
|
27
|
-
model: '
|
|
27
|
+
model: 'The branch divides into listing, hosting, cycling, authoring, and the hidden picker. `list` is the roster; `run` hosts a named view in the current pane or a monitor pane; `cycle` advances a monitor in place; `new` scaffolds a view directory; `pick` backs the popup. The browser target is part of the web surface, not this branch.',
|
|
28
28
|
},
|
|
29
29
|
children: [viewListLeaf, viewRunLeaf, viewCycleLeaf, viewNewLeaf, viewPickLeaf],
|
|
30
30
|
});
|
|
@@ -2,19 +2,19 @@
|
|
|
2
2
|
//
|
|
3
3
|
// Turns the current tmux window into an editor view for attached headless nodes:
|
|
4
4
|
// a narrow LEFT rail (the `workspace-sidebar` view — this graph + other live
|
|
5
|
-
// agents in this cwd, with ⚑ inbox flags) beside a CHAT pane (
|
|
5
|
+
// agents in this cwd, with ⚑ inbox flags) beside a CHAT pane (surface attach).
|
|
6
6
|
// Selecting a node in the rail swaps it into the chat pane.
|
|
7
7
|
//
|
|
8
8
|
// Layout build (the only two driver acts, both through placement's seam):
|
|
9
9
|
// 1. splitWindow(here, before+size) → the rail pane, left of here, runs
|
|
10
|
-
//
|
|
10
|
+
// the workspace-sidebar view host.
|
|
11
11
|
// 2. `crtr node focus <node> --pane <here>` → swaps the chat node's attach
|
|
12
12
|
// viewer into here's slot (here's old content relocates to the backstage).
|
|
13
13
|
// The rail finds the chat pane by DISCOVERY (the `@crtr_node` tag attach sets),
|
|
14
14
|
// so it is robust to that swap — no launch-time pane id is threaded into it.
|
|
15
15
|
//
|
|
16
|
-
// Command shape:
|
|
17
|
-
//
|
|
16
|
+
// Command shape: under `crtr surface workspace`, this is a BRANCH wrapping one
|
|
17
|
+
// leaf: `enter`.
|
|
18
18
|
import { execFile } from 'node:child_process';
|
|
19
19
|
import { defineBranch, defineLeaf } from '../core/command.js';
|
|
20
20
|
import { InputError } from '../core/io.js';
|
|
@@ -37,10 +37,10 @@ function defaultChatNode(cwd) {
|
|
|
37
37
|
const workspaceEnterLeaf = defineLeaf({
|
|
38
38
|
name: 'enter',
|
|
39
39
|
description: 'enter the editor view — a node rail beside a chat pane, in this window',
|
|
40
|
-
whenToUse: 'you want to work in the agent-centric editor layout: a left rail listing this graph
|
|
40
|
+
whenToUse: 'you want to work in the agent-centric editor layout: a left rail listing this graph plus the other live agents in this working directory (with ⚑ inbox flags) beside a chat pane attached to a node. Selecting a node in the rail swaps it into the chat pane. Opens in the current tmux window. tmux-only.',
|
|
41
41
|
help: {
|
|
42
42
|
name: 'workspace enter',
|
|
43
|
-
summary: 'split the current window into a left node-rail (the workspace-sidebar view) + a chat pane (
|
|
43
|
+
summary: 'split the current window into a left node-rail (the workspace-sidebar view) + a chat pane (surface attach); ↵ in the rail swaps a node into the chat. tmux-only.',
|
|
44
44
|
params: [
|
|
45
45
|
{
|
|
46
46
|
kind: 'flag',
|
|
@@ -74,12 +74,12 @@ const workspaceEnterLeaf = defineLeaf({
|
|
|
74
74
|
const node = input['node'];
|
|
75
75
|
const width = input['width'] ?? RAIL_WIDTH;
|
|
76
76
|
if (!process.stdout.isTTY) {
|
|
77
|
-
return { note: '
|
|
77
|
+
return { note: 'surface workspace enter builds a tmux layout — run it in a tmux pane (a TTY), not a pipe.' };
|
|
78
78
|
}
|
|
79
79
|
if (!inTmux()) {
|
|
80
80
|
throw new InputError({
|
|
81
81
|
error: 'not_in_tmux',
|
|
82
|
-
message: '
|
|
82
|
+
message: 'surface workspace is tmux-only — run it inside the crtr tmux session',
|
|
83
83
|
next: 'Open it from inside tmux.',
|
|
84
84
|
});
|
|
85
85
|
}
|
|
@@ -109,7 +109,7 @@ const workspaceEnterLeaf = defineLeaf({
|
|
|
109
109
|
}
|
|
110
110
|
// 1. The rail — a narrow split to the LEFT of here. It discovers the chat
|
|
111
111
|
// pane itself (the @crtr_node tag), so no pane id is threaded in.
|
|
112
|
-
const railCmd = piCommand(['view', 'run', 'workspace-sidebar', '--target', here.pane], 'crtr');
|
|
112
|
+
const railCmd = piCommand(['surface', 'view', 'run', 'workspace-sidebar', '--target', here.pane], 'crtr');
|
|
113
113
|
const rail = splitWindow(here.pane, {
|
|
114
114
|
cwd: process.cwd(),
|
|
115
115
|
env: {},
|
|
@@ -154,7 +154,7 @@ export function registerWorkspace() {
|
|
|
154
154
|
help: {
|
|
155
155
|
name: 'workspace',
|
|
156
156
|
summary: 'enter the agent-centric editor view (node rail + chat pane) in the current tmux window',
|
|
157
|
-
model: '
|
|
157
|
+
model: 'The branch is a two-pane editor layout: a narrow left rail and a chat pane. The rail shows this graph plus the other live agents in the working directory, and selecting a node swaps it into chat. tmux-only; piped input prints a notice and exits 0.',
|
|
158
158
|
},
|
|
159
159
|
children: [workspaceEnterLeaf],
|
|
160
160
|
});
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
// Run with: node --import tsx/esm --test src/core/__tests__/boot.test.ts
|
|
2
|
+
//
|
|
3
|
+
// BUG LOCKED (Hearth P6 Bug B — a sandbox/VM destroy+recreate, or a host
|
|
4
|
+
// reboot, leaves stale `pi_pid` values in the durable canvas.db; a pid-reuse
|
|
5
|
+
// collision on the fresh boot can fool `isPidAlive` into reading a dead
|
|
6
|
+
// broker as alive, wedging the node forever). reconcileBootLiveness is the
|
|
7
|
+
// fix: detect the boot change and clear every stale pid BEFORE any liveness
|
|
8
|
+
// check trusts it.
|
|
9
|
+
//
|
|
10
|
+
// Exercises the pure decision core (bootChanged) and the impure, single-writer
|
|
11
|
+
// sweep (reconcileBootLiveness) against a real isolated CRTR_HOME + canvas.db —
|
|
12
|
+
// no real reboot, no real uptime: both take an injected BootIdentity (kernel
|
|
13
|
+
// boot_id + wall-clock epoch) so a boot change is simulated by handing a
|
|
14
|
+
// different identity between calls.
|
|
15
|
+
import { test, before, after, beforeEach } from 'node:test';
|
|
16
|
+
import assert from 'node:assert/strict';
|
|
17
|
+
import { mkdtempSync, rmSync } from 'node:fs';
|
|
18
|
+
import { tmpdir } from 'node:os';
|
|
19
|
+
import { join } from 'node:path';
|
|
20
|
+
import { createNode, getRow, recordPid } from '../canvas/canvas.js';
|
|
21
|
+
import { closeDb } from '../canvas/db.js';
|
|
22
|
+
import { bootChanged, reconcileBootLiveness } from '../canvas/boot.js';
|
|
23
|
+
let home;
|
|
24
|
+
/** Build a BootIdentity for injection. `bootId` null models the non-Linux
|
|
25
|
+
* fallback (wall-clock window); a string models the exact kernel boot_id. */
|
|
26
|
+
function ident(bootId, bootEpochMs) {
|
|
27
|
+
return { bootId, bootEpochMs };
|
|
28
|
+
}
|
|
29
|
+
function node(id, over = {}) {
|
|
30
|
+
return {
|
|
31
|
+
node_id: id,
|
|
32
|
+
name: id,
|
|
33
|
+
created: new Date().toISOString(),
|
|
34
|
+
cwd: '/tmp/work',
|
|
35
|
+
kind: 'developer',
|
|
36
|
+
mode: 'base',
|
|
37
|
+
lifecycle: 'terminal',
|
|
38
|
+
status: 'active',
|
|
39
|
+
...over,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
before(() => {
|
|
43
|
+
home = mkdtempSync(join(tmpdir(), 'crtr-boot-'));
|
|
44
|
+
process.env['CRTR_HOME'] = home;
|
|
45
|
+
});
|
|
46
|
+
beforeEach(() => {
|
|
47
|
+
closeDb();
|
|
48
|
+
rmSync(home, { recursive: true, force: true });
|
|
49
|
+
});
|
|
50
|
+
after(() => {
|
|
51
|
+
closeDb();
|
|
52
|
+
rmSync(home, { recursive: true, force: true });
|
|
53
|
+
delete process.env['CRTR_HOME'];
|
|
54
|
+
});
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
// bootChanged — pure core
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
test('bootChanged: no persisted history is never a change (never clears a genuinely live pid)', () => {
|
|
59
|
+
assert.equal(bootChanged(ident('boot-A', 1_000_000), null), false);
|
|
60
|
+
});
|
|
61
|
+
test('bootChanged: same kernel boot_id is the SAME boot (daemon restart, no reboot)', () => {
|
|
62
|
+
assert.equal(bootChanged(ident('boot-A', 1_000_000 + 5_000), ident('boot-A', 1_000_000)), false, 'identical boot_id — same boot regardless of epoch');
|
|
63
|
+
});
|
|
64
|
+
test('bootChanged: a DIFFERENT boot_id under 60s wall-delta is still detected (Major-2 regression)', () => {
|
|
65
|
+
// A genuinely fast reboot/recreate: boot B starts only 42s after boot A
|
|
66
|
+
// (Hearth\'s measured recreate window), well inside the 60s wall tolerance.
|
|
67
|
+
// The exact kernel boot_id catches it with NO reliance on the wall-clock
|
|
68
|
+
// window — the case the old epoch-only compare false-negatived.
|
|
69
|
+
assert.equal(bootChanged(ident('boot-B', 1_000_000 + 42_000), ident('boot-A', 1_000_000)), true, 'distinct boot_id 42s apart — a real quick recreate, detected');
|
|
70
|
+
});
|
|
71
|
+
test('bootChanged: same boot_id with a huge epoch jump is NOT a boot change (NTP step within a boot)', () => {
|
|
72
|
+
assert.equal(bootChanged(ident('boot-A', 1_000_000 + 10 * 60_000), ident('boot-A', 1_000_000)), false, 'boot_id trumps the wall clock — an NTP correction mid-boot never false-positives');
|
|
73
|
+
});
|
|
74
|
+
test('bootChanged: wall-clock fallback (no boot_id) — epochs within tolerance are the SAME boot', () => {
|
|
75
|
+
assert.equal(bootChanged(ident(null, 1_000_000 + 5_000), ident(null, 1_000_000)), false, '5s drift — same boot');
|
|
76
|
+
});
|
|
77
|
+
test('bootChanged: wall-clock fallback (no boot_id) — epochs far apart are a DIFFERENT boot', () => {
|
|
78
|
+
assert.equal(bootChanged(ident(null, 1_000_000 + 10 * 60_000), ident(null, 1_000_000)), true, '10min apart — different boot');
|
|
79
|
+
});
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
// reconcileBootLiveness — the impure sweep against a real canvas.db
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
test('reconcileBootLiveness: first-ever call seeds the marker and clears nothing', () => {
|
|
84
|
+
const m = node('n1');
|
|
85
|
+
createNode(m);
|
|
86
|
+
recordPid('n1', 12345);
|
|
87
|
+
const result = reconcileBootLiveness(ident('boot-A', 1_000_000));
|
|
88
|
+
assert.deepEqual(result, { changed: false, cleared: [] });
|
|
89
|
+
assert.equal(getRow('n1')?.pi_pid, 12345, 'a first-ever run never clears an existing pid');
|
|
90
|
+
});
|
|
91
|
+
test('reconcileBootLiveness: same boot (same boot_id) leaves pids untouched — MUST NOT weaken the normal daemon-restart case', () => {
|
|
92
|
+
const m = node('n1');
|
|
93
|
+
createNode(m);
|
|
94
|
+
recordPid('n1', 12345);
|
|
95
|
+
reconcileBootLiveness(ident('boot-A', 1_000_000)); // seed
|
|
96
|
+
const result = reconcileBootLiveness(ident('boot-A', 1_000_000 + 3_000)); // 3s later, same boot
|
|
97
|
+
assert.deepEqual(result, { changed: false, cleared: [] });
|
|
98
|
+
assert.equal(getRow('n1')?.pi_pid, 12345, 'a live pid on the same boot is never cleared');
|
|
99
|
+
});
|
|
100
|
+
test('reconcileBootLiveness: a boot change clears every recorded pid, regardless of status', () => {
|
|
101
|
+
const active = node('active-1', { status: 'active' });
|
|
102
|
+
const idle = node('idle-1', { status: 'idle' });
|
|
103
|
+
const dead = node('dead-1', { status: 'dead' }); // the guard reads pi_pid unconditionally
|
|
104
|
+
const noPid = node('no-pid-1', { status: 'active' });
|
|
105
|
+
for (const m of [active, idle, dead, noPid])
|
|
106
|
+
createNode(m);
|
|
107
|
+
recordPid('active-1', 111);
|
|
108
|
+
recordPid('idle-1', 222);
|
|
109
|
+
recordPid('dead-1', 333);
|
|
110
|
+
// no-pid-1 deliberately left without a recorded pid.
|
|
111
|
+
reconcileBootLiveness(ident('boot-A', 1_000_000)); // seed boot A
|
|
112
|
+
const result = reconcileBootLiveness(ident('boot-B', 1_000_000 + 60 * 60_000)); // boot B
|
|
113
|
+
assert.equal(result.changed, true);
|
|
114
|
+
assert.deepEqual(result.cleared.sort(), ['active-1', 'dead-1', 'idle-1']);
|
|
115
|
+
assert.equal(getRow('active-1')?.pi_pid, null);
|
|
116
|
+
assert.equal(getRow('idle-1')?.pi_pid, null);
|
|
117
|
+
assert.equal(getRow('dead-1')?.pi_pid, null, 'cleared even though status is dead — the double-launch guard reads pi_pid unconditionally');
|
|
118
|
+
assert.equal(getRow('no-pid-1')?.pi_pid, null, 'already null — no-op, not an error');
|
|
119
|
+
});
|
|
120
|
+
test('reconcileBootLiveness: a fast recreate (distinct boot_id, 42s wall) still sweeps (Major-2 regression)', () => {
|
|
121
|
+
const m = node('n1');
|
|
122
|
+
createNode(m);
|
|
123
|
+
recordPid('n1', 111);
|
|
124
|
+
reconcileBootLiveness(ident('boot-A', 1_000_000)); // seed boot A
|
|
125
|
+
const result = reconcileBootLiveness(ident('boot-B', 1_000_000 + 42_000)); // 42s later — inside the wall window, but new boot_id
|
|
126
|
+
assert.equal(result.changed, true, 'distinct boot_id detected even 42s apart');
|
|
127
|
+
assert.deepEqual(result.cleared, ['n1']);
|
|
128
|
+
assert.equal(getRow('n1')?.pi_pid, null);
|
|
129
|
+
});
|
|
130
|
+
test('reconcileBootLiveness: after reconciling, the SAME boot no longer re-triggers (idempotent)', () => {
|
|
131
|
+
const m = node('n1');
|
|
132
|
+
createNode(m);
|
|
133
|
+
recordPid('n1', 111);
|
|
134
|
+
reconcileBootLiveness(ident('boot-A', 1_000_000)); // seed boot A
|
|
135
|
+
reconcileBootLiveness(ident('boot-B', 1_000_000 + 60 * 60_000)); // boot change → clears + persists boot B
|
|
136
|
+
recordPid('n1', 999); // a fresh broker re-records its pid post-revive
|
|
137
|
+
const result = reconcileBootLiveness(ident('boot-B', 1_000_000 + 60 * 60_000 + 2_000)); // still boot B, 2s later
|
|
138
|
+
assert.deepEqual(result, { changed: false, cleared: [] });
|
|
139
|
+
assert.equal(getRow('n1')?.pi_pid, 999, 'a pid recorded AFTER reconciliation, within the same boot, is never touched');
|
|
140
|
+
});
|
|
@@ -12,9 +12,6 @@
|
|
|
12
12
|
// model provider is registered into the ModelRegistry and resolves onto
|
|
13
13
|
// the session. Plain createAgentSession never calls registerProvider, so a
|
|
14
14
|
// custom-provider node would get NO model.
|
|
15
|
-
// C4 — a project AGENTS.md is injected into the assembled system prompt (the
|
|
16
|
-
// services path loads project context; 0.78.1 has no project-trust gate so
|
|
17
|
-
// context is unconditionally loaded — see buildBrokerSession's C4 note).
|
|
18
15
|
// C2 — with ZERO viewers attached, the broker UI context resolves confirm() /
|
|
19
16
|
// select() / input() / editor() to deny/cancel IMMEDIATELY (noOp), instead
|
|
20
17
|
// of relying on a per-dialog timeout and hanging the agent turn forever.
|
|
@@ -23,7 +20,7 @@
|
|
|
23
20
|
// dialog routing are all local. No tmux, no broker process — direct unit drives.
|
|
24
21
|
import { test } from 'node:test';
|
|
25
22
|
import assert from 'node:assert/strict';
|
|
26
|
-
import { mkdtempSync,
|
|
23
|
+
import { mkdtempSync, rmSync } from 'node:fs';
|
|
27
24
|
import { tmpdir } from 'node:os';
|
|
28
25
|
import { join, dirname } from 'node:path';
|
|
29
26
|
import { fileURLToPath } from 'node:url';
|
|
@@ -86,29 +83,11 @@ test('C3b — broker splits model thinking suffix before SDK registry lookup', a
|
|
|
86
83
|
rmSync(cwd, { recursive: true, force: true });
|
|
87
84
|
}
|
|
88
85
|
});
|
|
89
|
-
//
|
|
90
|
-
//
|
|
91
|
-
//
|
|
92
|
-
//
|
|
93
|
-
//
|
|
94
|
-
// ===========================================================================
|
|
95
|
-
test('C4 — a project AGENTS.md is injected into the assembled system prompt', async () => {
|
|
96
|
-
const cwd = mkdtempSync(join(tmpdir(), 'crtr-c4-'));
|
|
97
|
-
try {
|
|
98
|
-
const marker = 'C4_AGENTS_MARKER_' + Math.random().toString(36).slice(2);
|
|
99
|
-
writeFileSync(join(cwd, 'AGENTS.md'), `# Project rules\n\n${marker}\n`);
|
|
100
|
-
const { session } = await buildBrokerSession(realEngine, cfg(cwd));
|
|
101
|
-
try {
|
|
102
|
-
assert.ok(session.systemPrompt.includes(marker), 'C4: project AGENTS.md content is present in the assembled system prompt');
|
|
103
|
-
}
|
|
104
|
-
finally {
|
|
105
|
-
session.dispose();
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
finally {
|
|
109
|
-
rmSync(cwd, { recursive: true, force: true });
|
|
110
|
-
}
|
|
111
|
-
});
|
|
86
|
+
// (C4 — project AGENTS.md/CLAUDE.md injection — was removed: crouter now sets
|
|
87
|
+
// `noContextFiles: true` in buildBrokerSession and re-renders project context
|
|
88
|
+
// into the first-message <crtr-context> bearings instead of pi's system prompt
|
|
89
|
+
// (broker.ts). That behavior is covered by context-intro.test.ts's "project
|
|
90
|
+
// instructions ride the bearings, not the system prompt" test.)
|
|
112
91
|
// ===========================================================================
|
|
113
92
|
// C2 — zero-viewer dialogs resolve to deny/cancel IMMEDIATELY (noOp), never
|
|
114
93
|
// hanging the turn and never waiting on a per-dialog timeout. Drives the REAL
|
|
@@ -116,6 +116,28 @@ test('an unplaced active node is left alone before it boots', async () => {
|
|
|
116
116
|
await superviseTick();
|
|
117
117
|
assert.equal(getNode('S').status, 'active', 'unplaced active node is not reaped');
|
|
118
118
|
});
|
|
119
|
+
// Major-4: a correctly-dormant idle-release node whose recorded pid was cleared
|
|
120
|
+
// to null by boot reconciliation must NOT be spuriously revived. Its pi_pid is
|
|
121
|
+
// null and pi_session_id is set, so the pid-null branch would otherwise read it
|
|
122
|
+
// as a "stranded relaunch" and grace-revive it — even though it freed itself on
|
|
123
|
+
// purpose and has no unseen inbox. The pid-null branch must honor idle-release
|
|
124
|
+
// dormancy the same way the dead-pid branch does: leave it idle; only the second
|
|
125
|
+
// pass wakes it, and only on an unseen inbox entry.
|
|
126
|
+
test('idle-release node with a boot-cleared (null) pid and no unseen inbox stays dormant', async () => {
|
|
127
|
+
createNode(node('D', {
|
|
128
|
+
status: 'idle',
|
|
129
|
+
intent: 'idle-release',
|
|
130
|
+
pi_pid: null, // cleared by boot reconciliation
|
|
131
|
+
pi_session_id: '019e8f00-freed-while-dormant', // set → would look like a stranded relaunch
|
|
132
|
+
}));
|
|
133
|
+
const t0 = Date.now();
|
|
134
|
+
await superviseTick(t0); // first observation
|
|
135
|
+
await superviseTick(t0 + 60_000); // well past the boot grace
|
|
136
|
+
const after = getNode('D');
|
|
137
|
+
assert.equal(after.status, 'idle', 'dormant idle-release node is left idle, not revived');
|
|
138
|
+
assert.equal(after.intent, 'idle-release', 'intent unchanged — no revive fired');
|
|
139
|
+
assert.equal(after.pi_pid, null, 'no fresh pid — reviveNode was never invoked');
|
|
140
|
+
});
|
|
119
141
|
// Daemon start guard: spawnDaemon must not report success before the daemon is
|
|
120
142
|
// plausibly alive and has written its pidfile. This is a pure bounded poll over
|
|
121
143
|
// injected clocks/probes, so we can lock it down deterministically without a
|
|
@@ -104,7 +104,7 @@ export class SessionManager {
|
|
|
104
104
|
// ---------------------------------------------------------------------------
|
|
105
105
|
// AgentSessionEvent stream synthesis (T8 / G1, G3, G4, G8). The fake emits a
|
|
106
106
|
// REALISTIC streaming assistant turn through session.subscribe — the SAME channel
|
|
107
|
-
// the real pi engine feeds the broker's fan-out — so the frames a `crtr attach`
|
|
107
|
+
// the real pi engine feeds the broker's fan-out — so the frames a `crtr surface attach`
|
|
108
108
|
// client receives are byte-for-byte real AgentSessionEvents. The EMITTED event
|
|
109
109
|
// shapes are typed against the real `AgentSessionEvent` union from pi (whose full
|
|
110
110
|
// 17 variants are message_start/update/end, tool_execution_start/update/end,
|
|
@@ -159,12 +159,16 @@ class SessionTree {
|
|
|
159
159
|
this.leafId = entry.id;
|
|
160
160
|
return entry;
|
|
161
161
|
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
162
|
+
/** Synthetic in-place rewind for the broker navigate_tree regression lock:
|
|
163
|
+
* drop the last turn (assistant leaf + its user parent) by re-anchoring the
|
|
164
|
+
* leaf past it. The abandoned tail is left in the map (not deleted), mirroring
|
|
165
|
+
* a real branch switch — only the ACTIVE branch shortens. */
|
|
166
|
+
rewindOneTurn() {
|
|
167
|
+
const leaf = this.leafId === null ? undefined : this.entries.get(this.leafId);
|
|
168
|
+
if (leaf === undefined)
|
|
169
|
+
return;
|
|
170
|
+
const user = leaf.parentId === null ? undefined : this.entries.get(leaf.parentId);
|
|
171
|
+
this.leafId = user !== undefined ? user.parentId : leaf.parentId;
|
|
168
172
|
}
|
|
169
173
|
getLeafId() {
|
|
170
174
|
return this.leafId;
|
|
@@ -329,9 +333,15 @@ class FakeSession {
|
|
|
329
333
|
* fake's "rewind" re-anchors the active branch without deleting the abandoned
|
|
330
334
|
* tail so the welcome snapshot can prove the one-nudge property. */
|
|
331
335
|
navigateTree(targetId, _options) {
|
|
332
|
-
|
|
336
|
+
// The broker regression this locks is pure frame plumbing (navigate_tree →
|
|
337
|
+
// reWelcomeAll + ack.detail), not real tree traversal, so the viewer sends a
|
|
338
|
+
// SYNTHETIC targetId. Rewind the active branch by one full turn (the last
|
|
339
|
+
// user+assistant pair) so the re-welcome serves an observably shorter
|
|
340
|
+
// transcript, and echo the target as editorText (pi parity: the navigator
|
|
341
|
+
// restores the navigated-to user message's text to the editor).
|
|
342
|
+
this.tree.rewindOneTurn();
|
|
333
343
|
this.syncTreeSnapshot();
|
|
334
|
-
return Promise.resolve(
|
|
344
|
+
return Promise.resolve({ cancelled: false, editorText: `rewound-to:${targetId}` });
|
|
335
345
|
}
|
|
336
346
|
// --- the single engine event stream the broker fans out (broker.ts subscribes
|
|
337
347
|
// here and broadcasts each event VERBATIM to every attached viewer) --------
|
|
@@ -66,7 +66,10 @@ function deadPid() {
|
|
|
66
66
|
const r = spawnSync('true', [], { stdio: 'ignore' });
|
|
67
67
|
return r.pid ?? 0x7ffffffe;
|
|
68
68
|
}
|
|
69
|
-
test('flagship: full node lifecycle — spawn, dormancy, one-hop wake, promote, yield, finish (headless)',
|
|
69
|
+
test('flagship: full node lifecycle — spawn, dormancy, one-hop wake, promote, yield, finish (headless)',
|
|
70
|
+
// Spawns real broker children + several full-CLI subprocesses; 30s risked the
|
|
71
|
+
// same slow-CI-runner timeout as the live-mutation tests. 60s = safe margin.
|
|
72
|
+
{ timeout: 60_000 }, async () => {
|
|
70
73
|
const h = await createHeadlessHarness({ sessionPrefix: 'crtr-flagship' });
|
|
71
74
|
try {
|
|
72
75
|
// ===================================================================
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// FULL TIER (real-boot-bound): tmux-free, but it boots a REAL broker process
|
|
4
4
|
// (~5s pi-SDK load), so it lives in full/ (CI), not the fast local loop.
|
|
5
5
|
//
|
|
6
|
-
// T8 — the `crtr attach` acceptance gate, gates G4/G7/G8/G9 (controller
|
|
6
|
+
// T8 — the `crtr surface attach` acceptance gate, gates G4/G7/G8/G9 (controller
|
|
7
7
|
// arbitration, decoder overflow caps, backpressure shedding, and the load-bearing
|
|
8
8
|
// ONE-WRITER proof). Split out of broker-lifecycle.test.ts; the gates are the
|
|
9
9
|
// original acceptance gate, unchanged.
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// FULL TIER (real-boot-bound): tmux-free, but it boots a REAL broker process
|
|
4
4
|
// (~5s pi-SDK load), so it lives in full/ (CI), not the fast local loop.
|
|
5
5
|
//
|
|
6
|
-
// T8 — the `crtr attach` acceptance gate, gates G1/G1b/G2/G3 (controller drive,
|
|
6
|
+
// T8 — the `crtr surface attach` acceptance gate, gates G1/G1b/G2/G3 (controller drive,
|
|
7
7
|
// relay/coalescing, detach survival, catch-up snapshot). Split out of
|
|
8
8
|
// broker-lifecycle.test.ts; the gates are the original acceptance gate, unchanged.
|
|
9
9
|
//
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
// • items 4–6: a CRASHED broker (pid killed out from under the daemon) must
|
|
13
13
|
// grace-revive RESUMING the saved .jsonl, ONE-WRITER (the crashed pid is
|
|
14
14
|
// dead BEFORE the revive launches and never resurrects; the revived pid is
|
|
15
|
-
// distinct); and a clean `node close` tears the broker down (shutdown frame
|
|
15
|
+
// distinct); and a clean `node lifecycle close` tears the broker down (shutdown frame
|
|
16
16
|
// → exit, socket unlinked, status canceled, daemon leaves it).
|
|
17
17
|
// • M-1/M-2: a broker that DIES before session_start records NO pid and NO
|
|
18
18
|
// session EVER. Read pid==null unconditionally as "still booting" and the
|
|
@@ -40,7 +40,8 @@
|
|
|
40
40
|
// RED. Verified by reverting that branch (see bug-injection report).
|
|
41
41
|
import { test, before, after } from 'node:test';
|
|
42
42
|
import assert from 'node:assert/strict';
|
|
43
|
-
import { existsSync } from 'node:fs';
|
|
43
|
+
import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
44
|
+
import { join } from 'node:path';
|
|
44
45
|
import { createHarness } from '../helpers/harness.js';
|
|
45
46
|
import { subscribe } from '../../canvas/canvas.js';
|
|
46
47
|
import { isPidAlive } from '../../canvas/pid.js';
|
|
@@ -84,13 +85,17 @@ test('CRASH → grace-revive RESUME (one-writer), then clean teardown on close',
|
|
|
84
85
|
assert.ok(newPid != null && isPidAlive(newPid), 'the revived broker pid is alive');
|
|
85
86
|
assert.notEqual(newPid, oldPid, 'the revived pid is distinct from the crashed one');
|
|
86
87
|
assert.equal(isPidAlive(oldPid), false, 'one-writer: the crashed pid never resurrected');
|
|
87
|
-
// --- Item 5: clean teardown of the (revived, live) broker. node close marks
|
|
88
|
+
// --- Item 5: clean teardown of the (revived, live) broker. node lifecycle close marks
|
|
88
89
|
// canceled BEFORE teardown (crash-safe order), then hostFor(broker).teardown
|
|
89
90
|
// sends the `shutdown` frame → the broker disposes + exits, socket unlinked. ---
|
|
91
|
+
const sessionFile = h.node(id).pi_session_file;
|
|
92
|
+
assert.ok(sessionFile !== null && sessionFile !== undefined, 'revived broker has a session file');
|
|
93
|
+
mkdirSync(join(sessionFile, '..'), { recursive: true });
|
|
94
|
+
writeFileSync(sessionFile, JSON.stringify({ type: 'message', message: { role: 'assistant', content: [{ type: 'text', text: 'hi' }] } }) + '\n');
|
|
90
95
|
const sock = h.brokerSock(id);
|
|
91
96
|
await h.waitFor(() => existsSync(sock), { label: 'revived broker created its view.sock' });
|
|
92
|
-
const res = h.cli(root, ['node', 'close', '--node', id]);
|
|
93
|
-
assert.equal(res.code, 0, `node close should exit 0\n--stderr--\n${res.stderr}`);
|
|
97
|
+
const res = h.cli(root, ['node', 'lifecycle', 'close', '--node', id]);
|
|
98
|
+
assert.equal(res.code, 0, `node lifecycle close should exit 0\n--stderr--\n${res.stderr}`);
|
|
94
99
|
await h.waitFor(() => !isPidAlive(newPid), { label: 'broker process exited on shutdown frame' });
|
|
95
100
|
await h.waitFor(() => !existsSync(sock), { label: 'broker unlinked its socket on exit' });
|
|
96
101
|
assert.equal(h.status(id), 'canceled', 'the closed node is canceled');
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// FULL TIER (real-boot-bound): tmux-free, but it boots a REAL broker process,
|
|
4
4
|
// so it lives in full/ (CI), not the fast local loop.
|
|
5
5
|
//
|
|
6
|
-
// BUG-REGRESSION (real, observed 2026-06-11 in `crtr attach`): switching the
|
|
6
|
+
// BUG-REGRESSION (real, observed 2026-06-11 in `crtr surface attach`): switching the
|
|
7
7
|
// model (/model <provider/id> or the picker) visibly did nothing — the viewer's
|
|
8
8
|
// status bar kept showing the OLD model until some unrelated event happened to
|
|
9
9
|
// arrive.
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// FULL TIER (real-boot-bound): tmux-free, but it boots a REAL broker process,
|
|
4
4
|
// so it lives in full/ (CI), not the fast local loop.
|
|
5
5
|
//
|
|
6
|
-
// BUG-REGRESSION (real, observed 2026-06-11 in `crtr attach`): double-Esc (or
|
|
6
|
+
// BUG-REGRESSION (real, observed 2026-06-11 in `crtr surface attach`): double-Esc (or
|
|
7
7
|
// /tree) opened the session-tree picker, but SELECTING an entry visibly did
|
|
8
8
|
// nothing — the viewer stayed on the old transcript instead of traveling back
|
|
9
9
|
// to the chosen point in time.
|
|
@@ -76,5 +76,5 @@ test('navigate_tree re-welcomes every viewer onto the rewound transcript and ack
|
|
|
76
76
|
const [first, second] = welcomes(o.frames);
|
|
77
77
|
assert.ok(frameHas(first, token), 'pre-navigate welcome holds the turn');
|
|
78
78
|
assert.ok(!frameHas(second, token), 're-welcome serves the rewound transcript (turn dropped)');
|
|
79
|
-
assert.equal(second.snapshot.messages.length, first.snapshot.messages.length -
|
|
79
|
+
assert.equal(second.snapshot.messages.length, first.snapshot.messages.length - 2, 're-welcome history is exactly one turn shorter (a turn = user + assistant = 2 tree messages)');
|
|
80
80
|
});
|