@crouton-kit/crouter 0.3.32 → 0.3.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -2
- package/dist/build-root.js +4 -6
- package/dist/builtin-memory/crouter-development/marketplaces.md +8 -8
- package/dist/builtin-memory/crouter-development/personas/base-prompt.md +2 -2
- package/dist/builtin-memory/crouter-development/personas/orchestrator-prompt.md +5 -5
- package/dist/builtin-memory/crouter-development/personas.md +3 -4
- package/dist/builtin-memory/crouter-development/plugins.md +31 -31
- package/dist/builtin-memory/design.md +4 -1
- package/dist/builtin-memory/development.md +4 -1
- package/dist/builtin-memory/internal/INDEX.md +1 -1
- package/dist/builtin-memory/internal/examples/imessage-assistant.md +3 -3
- package/dist/builtin-memory/internal/nodes-and-canvas.md +9 -9
- package/dist/builtin-memory/internal/storage-tiers.md +5 -5
- package/dist/builtin-memory/planning.md +4 -1
- package/dist/builtin-memory/product.md +80 -0
- package/dist/builtin-memory/spec.md +4 -1
- package/dist/builtin-personas/advisor/PERSONA.md +10 -0
- package/dist/builtin-personas/design/PERSONA.md +2 -2
- package/dist/builtin-personas/design/orchestrator.md +3 -3
- package/dist/builtin-personas/developer/PERSONA.md +1 -1
- package/dist/builtin-personas/developer/orchestrator.md +2 -2
- package/dist/builtin-personas/explore/PERSONA.md +3 -3
- package/dist/builtin-personas/explore/orchestrator.md +4 -2
- package/dist/builtin-personas/general/PERSONA.md +1 -1
- package/dist/builtin-personas/general/orchestrator.md +1 -1
- package/dist/builtin-personas/orchestration-kernel.md +8 -15
- package/dist/builtin-personas/plan/PERSONA.md +1 -1
- package/dist/builtin-personas/plan/orchestrator.md +2 -2
- package/dist/builtin-personas/plan/reviewers/architecture-fit/PERSONA.md +1 -1
- package/dist/builtin-personas/plan/reviewers/code-smells/PERSONA.md +1 -1
- package/dist/builtin-personas/plan/reviewers/pattern-consistency/PERSONA.md +1 -1
- package/dist/builtin-personas/plan/reviewers/requirements-coverage/PERSONA.md +1 -1
- package/dist/builtin-personas/plan/reviewers/security/PERSONA.md +1 -1
- package/dist/builtin-personas/product/PERSONA.md +18 -0
- package/dist/builtin-personas/product/orchestrator.md +14 -0
- package/dist/builtin-personas/product/teardown/PERSONA.md +13 -0
- package/dist/builtin-personas/review/PERSONA.md +1 -1
- package/dist/builtin-personas/review/orchestrator.md +1 -1
- package/dist/builtin-personas/runtime-base.md +5 -0
- package/dist/builtin-personas/spec/PERSONA.md +1 -1
- package/dist/builtin-personas/spec/orchestrator.md +2 -2
- package/dist/builtin-personas/spec/requirements/PERSONA.md +1 -1
- package/dist/builtin-personas/waiting.md +1 -1
- package/dist/builtin-pi-packages/pi-crtr-extensions/README.md +71 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/crtr-help-gate.test.ts +41 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/provider-rotation.test.ts +663 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +52 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +418 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crouter-help.ts +87 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crtr-commands/filters.json +7 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crtr-commands/index.ts +174 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crtr-help-gate.ts +408 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +442 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +119 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/nested-context.ts +327 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +574 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/statusline.ts +260 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/strip-skills-docs.ts +40 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/sysprompt-window.ts +19 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/lib/package.json +3 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/lib/subscription-state.js +1 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/lib/subscription-state.ts +479 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/LICENSE +13 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/README.md +172 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/bin.mjs +11 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-collection.js +88 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-doc.js +43 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-node.js +109 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-scalar.js +86 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/composer.js +219 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-block-map.js +115 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +198 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +49 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-end.js +37 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +207 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +225 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-props.js +146 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-contains-newline.js +34 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +26 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +15 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-map-includes.js +13 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/Document.js +335 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/anchors.js +71 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/applyReviver.js +55 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/createNode.js +88 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/directives.js +176 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/errors.js +57 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/index.js +17 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/log.js +11 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Alias.js +116 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Collection.js +147 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Node.js +38 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Pair.js +36 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Scalar.js +24 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/YAMLMap.js +144 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +113 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +63 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/identity.js +36 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/toJS.js +37 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst-scalar.js +214 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst-stringify.js +61 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst-visit.js +97 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst.js +98 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/lexer.js +721 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/line-counter.js +39 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/parser.js +975 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/public-api.js +102 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/Schema.js +37 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/map.js +17 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/null.js +15 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/seq.js +17 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/string.js +14 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/bool.js +19 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/float.js +43 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/int.js +38 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/schema.js +23 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/json/schema.js +62 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/tags.js +96 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +58 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +26 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +46 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +71 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +67 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +74 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +78 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +39 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +93 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +101 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +146 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringify.js +129 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +153 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyComment.js +20 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +85 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +25 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyPair.js +150 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyString.js +336 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/util.js +11 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/visit.js +233 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/index.js +5 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/package.json +3 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/cli.d.ts +8 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/cli.mjs +201 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-collection.d.ts +11 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-collection.js +90 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-doc.d.ts +7 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-doc.js +45 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-node.d.ts +29 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-node.js +112 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-scalar.d.ts +5 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-scalar.js +88 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/composer.d.ts +63 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/composer.js +224 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-map.d.ts +6 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-map.js +117 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +11 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-scalar.js +200 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +6 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-seq.js +51 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-end.d.ts +6 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-end.js +39 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +7 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-collection.js +209 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +10 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-scalar.js +227 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-props.d.ts +23 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-props.js +148 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-contains-newline.d.ts +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-contains-newline.js +36 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-empty-scalar-position.js +28 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +3 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-flow-indent-check.js +17 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-map-includes.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-map-includes.js +15 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/Document.d.ts +141 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/Document.js +337 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/anchors.d.ts +24 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/anchors.js +76 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/applyReviver.d.ts +9 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/applyReviver.js +57 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/createNode.d.ts +17 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/createNode.js +90 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/directives.d.ts +49 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/directives.js +178 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/errors.d.ts +21 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/errors.js +62 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/index.d.ts +25 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/index.js +50 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/log.d.ts +3 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/log.js +19 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Alias.d.ts +29 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Alias.js +118 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Collection.d.ts +73 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Collection.js +151 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Node.d.ts +53 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Node.js +40 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Pair.d.ts +22 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Pair.js +39 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Scalar.d.ts +47 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Scalar.js +27 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLMap.d.ts +53 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLMap.js +147 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +60 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLSeq.js +115 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/addPairToJSMap.js +65 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/identity.d.ts +23 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/identity.js +53 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/toJS.d.ts +29 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/toJS.js +39 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/options.d.ts +350 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-scalar.d.ts +64 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-scalar.js +218 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-stringify.d.ts +8 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-stringify.js +63 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-visit.d.ts +39 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-visit.js +99 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst.d.ts +109 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst.js +112 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/lexer.d.ts +87 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/lexer.js +723 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/line-counter.d.ts +22 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/line-counter.js +41 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/parser.d.ts +84 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/parser.js +980 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/public-api.d.ts +44 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/public-api.js +107 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/Schema.d.ts +17 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/Schema.js +39 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/map.d.ts +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/map.js +19 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/null.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/null.js +17 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/seq.d.ts +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/seq.js +19 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/string.d.ts +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/string.js +16 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/bool.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/bool.js +21 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/float.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/float.js +47 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/int.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/int.js +42 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/schema.d.ts +1 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/schema.js +25 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/json/schema.d.ts +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/json/schema.js +64 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/json-schema.d.ts +69 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/tags.d.ts +48 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/tags.js +99 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/types.d.ts +92 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/binary.js +70 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +7 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/bool.js +29 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/float.js +50 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +5 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/int.js +76 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +9 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/merge.js +71 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +22 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/omap.js +77 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +10 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +82 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +1 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/schema.js +41 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +28 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/set.js +96 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +6 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +105 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +34 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/foldFlowLines.js +151 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringify.d.ts +21 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringify.js +132 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +17 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyCollection.js +155 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyComment.d.ts +10 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyComment.js +24 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyDocument.js +87 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyNumber.js +27 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyPair.d.ts +3 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyPair.js +152 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyString.d.ts +9 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyString.js +338 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/test-events.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/test-events.js +134 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/util.d.ts +16 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/util.js +28 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/visit.d.ts +102 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/visit.js +236 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/package.json +97 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/util.js +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/package-lock.json +3385 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/package.json +25 -0
- package/dist/builtin-pi-packages/pi-mode-switch/README.md +64 -0
- package/dist/builtin-pi-packages/pi-mode-switch/bin/mode +40 -0
- package/dist/builtin-pi-packages/pi-mode-switch/extensions/index.ts +422 -0
- package/dist/builtin-pi-packages/pi-mode-switch/package.json +13 -0
- package/dist/builtin-views/canvas/core.mjs +82 -1
- package/dist/builtin-views/canvas/tui.mjs +9 -5
- package/dist/builtin-views/canvas/web.jsx +3 -2
- package/dist/builtin-views/chat/core.mjs +725 -0
- package/dist/builtin-views/chat/text.mjs +101 -0
- package/dist/builtin-views/chat/tui.mjs +368 -0
- package/dist/builtin-views/chat/web.jsx +367 -0
- package/dist/builtin-views/prompt-review/core.mjs +863 -0
- package/dist/builtin-views/prompt-review/text.mjs +15 -0
- package/dist/builtin-views/prompt-review/tui.mjs +196 -0
- package/dist/builtin-views/prompt-review/web.jsx +484 -0
- package/dist/builtin-views/settings/core.mjs +397 -0
- package/dist/builtin-views/settings/text.mjs +40 -0
- package/dist/builtin-views/settings/tui.mjs +95 -0
- package/dist/builtin-views/settings/web.jsx +167 -0
- package/dist/cli.js +16 -3
- 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.d.ts +18 -0
- package/dist/clients/attach/attach-cmd.js +1797 -797
- package/dist/clients/attach/auth-pickers.js +2 -2
- package/dist/clients/attach/canvas-panels.js +3 -3
- package/dist/clients/attach/chat-view.d.ts +13 -2
- package/dist/clients/attach/chat-view.js +53 -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.d.ts +8 -4
- package/dist/clients/attach/config-load.js +3 -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.d.ts +2 -3
- package/dist/clients/attach/extension-dialogs.js +8 -10
- package/dist/clients/attach/graph-overlay.js +6 -5
- package/dist/clients/attach/input-controller.d.ts +4 -3
- package/dist/clients/attach/input-controller.js +25 -4
- package/dist/clients/attach/pickers.js +1 -1
- package/dist/clients/attach/slash-commands.d.ts +7 -7
- package/dist/clients/attach/slash-commands.js +40 -17
- package/dist/clients/attach/titled-editor.d.ts +4 -0
- package/dist/clients/attach/titled-editor.js +31 -15
- package/dist/clients/attach/view-socket.d.ts +2 -1
- package/dist/clients/attach/view-socket.js +28 -9
- package/dist/clients/web/__tests__/source-cache.test.js +32 -0
- package/dist/clients/web/dev-server.js +1 -0
- package/dist/clients/web/events.js +9 -11
- package/dist/clients/web/server.d.ts +4 -3
- package/dist/clients/web/server.js +166 -35
- package/dist/clients/web/source-cache.d.ts +10 -0
- package/dist/clients/web/source-cache.js +57 -0
- package/dist/clients/web/web-cmd.js +32 -13
- package/dist/commands/__tests__/human.test.js +30 -28
- package/dist/commands/canvas-history/search.js +1 -1
- package/dist/commands/canvas-history.js +5 -8
- package/dist/commands/canvas-issue.d.ts +2 -0
- package/dist/commands/canvas-issue.js +148 -0
- package/dist/commands/canvas-prune.js +43 -2
- package/dist/commands/canvas-rebuild-index.d.ts +2 -0
- package/dist/commands/canvas-rebuild-index.js +57 -0
- package/dist/commands/canvas-snapshot.d.ts +2 -0
- package/dist/commands/canvas-snapshot.js +51 -0
- package/dist/commands/canvas-tmux-spread.d.ts +2 -0
- package/dist/commands/canvas-tmux-spread.js +188 -0
- package/dist/commands/canvas.d.ts +1 -0
- package/dist/commands/canvas.js +16 -1
- package/dist/commands/chord.js +143 -48
- package/dist/commands/daemon.js +3 -3
- package/dist/commands/human/prompts.d.ts +0 -1
- package/dist/commands/human/prompts.js +39 -54
- package/dist/commands/human/queue.d.ts +12 -1
- package/dist/commands/human/queue.js +468 -73
- package/dist/commands/human/shared.d.ts +3 -4
- package/dist/commands/human/shared.js +3 -3
- package/dist/commands/human.js +12 -11
- package/dist/commands/memory/find.js +3 -2
- package/dist/commands/memory/lint.js +15 -8
- package/dist/commands/memory/list.js +4 -3
- package/dist/commands/memory/origin.d.ts +1 -0
- package/dist/commands/memory/origin.js +88 -0
- package/dist/commands/memory/read.js +3 -3
- package/dist/commands/memory/shared.d.ts +9 -4
- package/dist/commands/memory/shared.js +28 -10
- package/dist/commands/memory/write.js +19 -14
- package/dist/commands/memory.js +6 -8
- package/dist/commands/node-context.d.ts +2 -0
- package/dist/commands/node-context.js +172 -0
- package/dist/commands/node-snapshot.d.ts +2 -0
- package/dist/commands/node-snapshot.js +126 -0
- package/dist/commands/node.d.ts +2 -2
- package/dist/commands/node.js +987 -603
- 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 +13 -29
- package/dist/commands/pkg/plugin-manage.d.ts +5 -1
- package/dist/commands/pkg/plugin-manage.js +246 -172
- package/dist/commands/pkg/plugin.js +6 -6
- package/dist/commands/pkg.js +7 -7
- package/dist/commands/push.d.ts +2 -0
- package/dist/commands/push.js +79 -11
- package/dist/commands/revive.js +79 -4
- package/dist/commands/search/answer.d.ts +1 -0
- package/dist/commands/search/answer.js +50 -0
- package/dist/commands/search/contents.d.ts +1 -0
- package/dist/commands/search/contents.js +96 -0
- package/dist/commands/search/exa.d.ts +53 -0
- package/dist/commands/search/exa.js +155 -0
- package/dist/commands/search/puremd.d.ts +11 -0
- package/dist/commands/search/puremd.js +53 -0
- package/dist/commands/search/web.d.ts +1 -0
- package/dist/commands/search/web.js +65 -0
- package/dist/commands/search.d.ts +2 -0
- package/dist/commands/search.js +24 -0
- package/dist/commands/surface.d.ts +2 -0
- package/dist/commands/surface.js +43 -0
- package/dist/commands/sys/__tests__/sync-import.test.js +72 -0
- package/dist/commands/sys/config.js +59 -10
- package/dist/commands/sys/doctor.js +56 -4
- package/dist/commands/sys/prompt-review.d.ts +1 -0
- package/dist/commands/sys/prompt-review.js +178 -0
- package/dist/commands/sys/promptstudio.d.ts +2 -0
- package/dist/commands/sys/promptstudio.js +65 -0
- package/dist/commands/sys/settings.d.ts +2 -0
- package/dist/commands/sys/settings.js +16 -0
- 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/sync.js +311 -159
- package/dist/commands/sys/sysprompt.d.ts +1 -0
- package/dist/commands/sys/sysprompt.js +89 -0
- package/dist/commands/sys.js +10 -5
- package/dist/commands/view-cycle.js +5 -5
- package/dist/commands/view-list.js +3 -3
- package/dist/commands/view-new.js +6 -6
- 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-preflight.test.js +85 -0
- package/dist/core/__tests__/broker-sdk-wiring.test.js +10 -16
- package/dist/core/__tests__/canvas.test.js +37 -1
- package/dist/core/__tests__/chat-view-reconnect.test.js +70 -0
- package/dist/core/__tests__/child-death-wake.test.js +11 -2
- package/dist/core/__tests__/close.test.js +39 -1
- package/dist/core/__tests__/connection-reconnect-resume.test.js +37 -0
- package/dist/core/__tests__/context-intro.test.js +48 -14
- package/dist/core/__tests__/daemon-boot.test.js +204 -9
- package/dist/core/__tests__/fixtures/fake-engine.d.ts +30 -4
- package/dist/core/__tests__/fixtures/fake-engine.js +157 -18
- package/dist/core/__tests__/fixtures/fake-pi-host.js +10 -1
- package/dist/core/__tests__/full/broker-attach-limits.test.js +1 -1
- package/dist/core/__tests__/full/broker-attach-stream.test.js +1 -1
- package/dist/core/__tests__/full/broker-crash-teardown.test.js +10 -5
- package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +1 -1
- package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +1 -1
- package/dist/core/__tests__/full/broker-pane-resolution.test.js +1 -1
- package/dist/core/__tests__/full/cascade-close.test.js +31 -18
- package/dist/core/__tests__/full/detach-focus.test.js +2 -2
- package/dist/core/__tests__/full/human-new-window-regression.test.js +1 -1
- package/dist/core/__tests__/hearth-bootstrap.test.js +136 -0
- package/dist/core/__tests__/helpers/harness.d.ts +1 -1
- package/dist/core/__tests__/helpers/harness.js +3 -3
- package/dist/core/__tests__/human-stranded-deliver.test.js +38 -1
- package/dist/core/__tests__/human-surface-target.test.js +1 -1
- package/dist/core/__tests__/kickoff.test.js +18 -19
- package/dist/core/__tests__/live-mutation-verbs.test.js +10 -10
- package/dist/core/__tests__/live-mutation.test.js +8 -8
- package/dist/core/__tests__/migration.test.js +172 -13
- 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__/push-final-guard.test.js +7 -1
- package/dist/core/__tests__/relaunch-root.test.js +9 -9
- package/dist/core/__tests__/revive.test.js +100 -27
- package/dist/core/__tests__/spawn-root.test.js +24 -1
- package/dist/core/__tests__/stop-guard.test.js +10 -0
- package/dist/core/__tests__/stranded-relaunch.test.js +72 -0
- package/dist/core/__tests__/tmux-surface.test.js +5 -1
- 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/__tests__/yield-ensures-daemon.test.js +54 -0
- package/dist/core/artifact.d.ts +2 -33
- package/dist/core/artifact.js +27 -87
- package/dist/core/bootstrap.js +2 -0
- package/dist/core/canvas/boot.d.ts +48 -0
- package/dist/core/canvas/boot.js +157 -0
- package/dist/core/canvas/browse/__tests__/model.test.js +35 -1
- package/dist/core/canvas/browse/app.js +87 -17
- package/dist/core/canvas/browse/model.d.ts +10 -1
- package/dist/core/canvas/browse/model.js +37 -1
- package/dist/core/canvas/browse/render.js +35 -33
- package/dist/core/canvas/canvas.d.ts +33 -0
- package/dist/core/canvas/canvas.js +138 -8
- package/dist/core/canvas/db.js +121 -9
- package/dist/core/canvas/index.d.ts +1 -1
- package/dist/core/canvas/index.js +1 -1
- package/dist/core/canvas/labels.d.ts +6 -8
- package/dist/core/canvas/labels.js +8 -11
- package/dist/core/canvas/nav-model.d.ts +5 -4
- package/dist/core/canvas/nav-model.js +32 -18
- package/dist/core/canvas/paths.d.ts +18 -1
- package/dist/core/canvas/paths.js +31 -2
- package/dist/core/canvas/pid.d.ts +6 -0
- package/dist/core/canvas/pid.js +13 -0
- package/dist/core/canvas/render.d.ts +25 -0
- package/dist/core/canvas/render.js +96 -13
- package/dist/core/canvas/status-glyph.d.ts +35 -0
- package/dist/core/canvas/status-glyph.js +104 -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 +130 -48
- package/dist/core/command.js +13 -4
- package/dist/core/config.js +114 -16
- package/dist/core/fault-classifier.d.ts +41 -0
- package/dist/core/fault-classifier.js +110 -0
- package/dist/core/feed/inbox.d.ts +15 -0
- package/dist/core/feed/inbox.js +40 -14
- package/dist/core/frontmatter.d.ts +1 -11
- package/dist/core/frontmatter.js +1 -55
- package/dist/core/hearth/__tests__/model-auth-guest.test.js +151 -0
- package/dist/core/hearth/config.d.ts +3 -0
- package/dist/core/hearth/config.js +111 -0
- package/dist/core/hearth/guest-env.d.ts +9 -0
- package/dist/core/hearth/guest-env.js +27 -0
- package/dist/core/hearth/index.d.ts +5 -0
- package/dist/core/hearth/index.js +5 -0
- package/dist/core/hearth/model-auth-guest.d.ts +8 -0
- package/dist/core/hearth/model-auth-guest.js +435 -0
- package/dist/core/hearth/provider.d.ts +28 -0
- package/dist/core/hearth/provider.js +10 -0
- package/dist/core/hearth/providers/blaxel-bootstrap.d.ts +12 -0
- package/dist/core/hearth/providers/blaxel-bootstrap.js +147 -0
- package/dist/core/hearth/providers/blaxel-home.d.ts +15 -0
- package/dist/core/hearth/providers/blaxel-home.js +136 -0
- package/dist/core/hearth/providers/blaxel.d.ts +31 -0
- package/dist/core/hearth/providers/blaxel.js +282 -0
- package/dist/core/hearth/providers/types.d.ts +77 -0
- package/dist/core/hearth/registry.d.ts +15 -0
- package/dist/core/hearth/registry.js +180 -0
- package/dist/core/hearth/types.d.ts +156 -0
- package/dist/core/help.d.ts +16 -0
- package/dist/core/help.js +2 -0
- package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.js +79 -0
- package/dist/core/{skill-sync → host-exports}/builtins.d.ts +21 -13
- package/dist/core/host-exports/builtins.js +68 -0
- package/dist/core/{skill-sync → host-exports}/export.d.ts +9 -6
- package/dist/core/{skill-sync → host-exports}/export.js +37 -14
- package/dist/core/io.js +1 -1
- package/dist/core/log.d.ts +9 -0
- package/dist/core/log.js +113 -0
- package/dist/core/memory-resolver.d.ts +13 -13
- package/dist/core/memory-resolver.js +70 -51
- package/dist/core/personas/index.d.ts +4 -4
- package/dist/core/personas/index.js +2 -2
- package/dist/core/personas/loader.d.ts +51 -0
- package/dist/core/personas/loader.js +54 -50
- package/dist/core/personas/resolve.d.ts +43 -27
- package/dist/core/personas/resolve.js +336 -94
- 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/auth-reload.d.ts +7 -0
- package/dist/core/runtime/auth-reload.js +69 -0
- package/dist/core/runtime/bearings.d.ts +46 -25
- package/dist/core/runtime/bearings.js +313 -52
- package/dist/core/runtime/branded-host.d.ts +4 -2
- package/dist/core/runtime/branded-host.js +66 -4
- package/dist/core/runtime/broker-protocol.d.ts +40 -5
- package/dist/core/runtime/broker-protocol.js +2 -2
- package/dist/core/runtime/broker.js +343 -18
- package/dist/core/runtime/close.js +39 -31
- package/dist/core/runtime/connectivity.d.ts +12 -0
- package/dist/core/runtime/connectivity.js +73 -0
- package/dist/core/runtime/fault-recovery-nudge.d.ts +2 -0
- package/dist/core/runtime/fault-recovery-nudge.js +2 -0
- package/dist/core/runtime/fault-recovery.d.ts +23 -0
- package/dist/core/runtime/fault-recovery.js +74 -0
- package/dist/core/runtime/fault.d.ts +25 -0
- package/dist/core/runtime/fault.js +176 -0
- package/dist/core/runtime/front-door.d.ts +1 -1
- package/dist/core/runtime/front-door.js +2 -2
- package/dist/core/runtime/host.d.ts +10 -0
- package/dist/core/runtime/host.js +71 -9
- package/dist/core/runtime/kickoff.js +32 -46
- package/dist/core/runtime/launch.d.ts +41 -21
- package/dist/core/runtime/launch.js +165 -52
- package/dist/core/runtime/lifecycle.js +7 -7
- package/dist/core/runtime/model-swap.d.ts +18 -0
- package/dist/core/runtime/model-swap.js +95 -0
- package/dist/core/runtime/naming.d.ts +7 -0
- package/dist/core/runtime/naming.js +61 -9
- package/dist/core/runtime/nodes.js +6 -1
- package/dist/core/runtime/persona.js +16 -17
- package/dist/core/runtime/placement.d.ts +41 -36
- package/dist/core/runtime/placement.js +159 -74
- package/dist/core/runtime/promote.d.ts +2 -0
- package/dist/core/runtime/promote.js +23 -3
- package/dist/core/runtime/recycle.js +13 -11
- package/dist/core/runtime/reset.d.ts +6 -3
- package/dist/core/runtime/reset.js +5 -5
- 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 +19 -8
- package/dist/core/runtime/revive.js +79 -25
- package/dist/core/runtime/roadmap.d.ts +1 -1
- package/dist/core/runtime/roadmap.js +1 -1
- package/dist/core/runtime/spawn.d.ts +3 -3
- package/dist/core/runtime/spawn.js +37 -13
- package/dist/core/runtime/stop-guard.js +11 -6
- package/dist/core/runtime/surface-bg.js +1 -1
- package/dist/core/runtime/tmux-chrome.d.ts +1 -1
- package/dist/core/runtime/tmux-chrome.js +1 -1
- package/dist/core/runtime/tmux.d.ts +30 -7
- package/dist/core/runtime/tmux.js +138 -84
- package/dist/core/runtime/view-socket-client.d.ts +46 -0
- package/dist/core/runtime/view-socket-client.js +203 -0
- package/dist/core/scope.d.ts +9 -0
- package/dist/core/scope.js +37 -15
- package/dist/core/substrate/index.d.ts +1 -1
- package/dist/core/substrate/index.js +1 -1
- package/dist/core/substrate/on-read.js +39 -25
- package/dist/core/substrate/render.d.ts +10 -13
- package/dist/core/substrate/render.js +56 -51
- package/dist/core/tui/host.js +83 -18
- package/dist/core/view/__tests__/transport-cache.test.js +62 -0
- package/dist/core/view/contract.d.ts +20 -0
- package/dist/core/view/loader.js +2 -2
- package/dist/core/view/stream-local.d.ts +3 -0
- package/dist/core/view/stream-local.js +184 -0
- package/dist/core/view/transport-cache.d.ts +8 -0
- package/dist/core/view/transport-cache.js +38 -0
- package/dist/core/view/transport-local.js +4 -0
- package/dist/core/view/transport.d.ts +7 -1
- 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.d.ts +3 -19
- package/dist/daemon/crtrd.js +360 -280
- package/dist/daemon/manage.d.ts +18 -1
- package/dist/daemon/manage.js +54 -9
- 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.d.ts +1 -0
- package/dist/hearth/control-plane/__tests__/scheduler-scan-loop.test.js +133 -0
- package/dist/hearth/control-plane/__tests__/trigger-delivery.test.d.ts +1 -0
- package/dist/hearth/control-plane/__tests__/trigger-delivery.test.js +170 -0
- package/dist/hearth/control-plane/__tests__/webhook-ingress.test.d.ts +1 -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.d.ts +1 -0
- package/dist/hearth/control-plane/main.js +88 -0
- package/dist/hearth/control-plane/node-message.d.ts +31 -0
- package/dist/hearth/control-plane/node-message.js +98 -0
- package/dist/hearth/control-plane/register.d.ts +15 -0
- package/dist/hearth/control-plane/register.js +34 -0
- package/dist/hearth/control-plane/registry.d.ts +17 -0
- package/dist/hearth/control-plane/registry.js +161 -0
- package/dist/hearth/control-plane/relay.d.ts +40 -0
- package/dist/hearth/control-plane/relay.js +642 -0
- package/dist/hearth/control-plane/scheduler/fire-store.d.ts +36 -0
- package/dist/hearth/control-plane/scheduler/fire-store.js +73 -0
- package/dist/hearth/control-plane/scheduler/recurrence.d.ts +7 -0
- package/dist/hearth/control-plane/scheduler/recurrence.js +58 -0
- package/dist/hearth/control-plane/scheduler/scan-loop.d.ts +38 -0
- package/dist/hearth/control-plane/scheduler/scan-loop.js +138 -0
- package/dist/hearth/control-plane/scheduler/schedule-store.d.ts +32 -0
- package/dist/hearth/control-plane/scheduler/schedule-store.js +66 -0
- package/dist/hearth/control-plane/secrets.d.ts +17 -0
- package/dist/hearth/control-plane/secrets.js +113 -0
- package/dist/hearth/control-plane/server.d.ts +27 -0
- package/dist/hearth/control-plane/server.js +346 -0
- package/dist/hearth/control-plane/session.d.ts +68 -0
- package/dist/hearth/control-plane/session.js +273 -0
- package/dist/hearth/control-plane/triggers/acl.d.ts +14 -0
- package/dist/hearth/control-plane/triggers/acl.js +52 -0
- package/dist/hearth/control-plane/triggers/audit-store.d.ts +38 -0
- package/dist/hearth/control-plane/triggers/audit-store.js +79 -0
- package/dist/hearth/control-plane/triggers/deliver.d.ts +43 -0
- package/dist/hearth/control-plane/triggers/deliver.js +76 -0
- package/dist/hearth/control-plane/triggers/envelope.d.ts +29 -0
- package/dist/hearth/control-plane/triggers/envelope.js +38 -0
- package/dist/hearth/control-plane/types.d.ts +66 -0
- package/dist/hearth/control-plane/types.js +1 -0
- package/dist/hearth/control-plane/wake.d.ts +80 -0
- package/dist/hearth/control-plane/wake.js +312 -0
- package/dist/hearth/wake-proxy/__tests__/anthropic-oauth.test.d.ts +1 -0
- package/dist/hearth/wake-proxy/__tests__/anthropic-oauth.test.js +289 -0
- package/dist/hearth/wake-proxy/__tests__/config-timeout.test.d.ts +1 -0
- package/dist/hearth/wake-proxy/__tests__/config-timeout.test.js +34 -0
- package/dist/hearth/wake-proxy/__tests__/guest-source.test.d.ts +1 -0
- package/dist/hearth/wake-proxy/__tests__/guest-source.test.js +203 -0
- package/dist/hearth/wake-proxy/__tests__/hardening.test.d.ts +1 -0
- package/dist/hearth/wake-proxy/__tests__/hardening.test.js +59 -0
- package/dist/hearth/wake-proxy/__tests__/hearth-status-route.test.d.ts +1 -0
- package/dist/hearth/wake-proxy/__tests__/hearth-status-route.test.js +372 -0
- package/dist/hearth/wake-proxy/__tests__/http-running-route-fast-path.test.d.ts +1 -0
- package/dist/hearth/wake-proxy/__tests__/http-running-route-fast-path.test.js +258 -0
- package/dist/hearth/wake-proxy/__tests__/model-auth-routes.test.d.ts +1 -0
- package/dist/hearth/wake-proxy/__tests__/model-auth-routes.test.js +437 -0
- package/dist/hearth/wake-proxy/__tests__/static-asset-allowlist.test.d.ts +1 -0
- package/dist/hearth/wake-proxy/__tests__/static-asset-allowlist.test.js +15 -0
- package/dist/hearth/wake-proxy/__tests__/warm-path-concurrency.test.d.ts +1 -0
- package/dist/hearth/wake-proxy/__tests__/warm-path-concurrency.test.js +141 -0
- package/dist/hearth/wake-proxy/__tests__/ws-teardown-accounting.test.d.ts +1 -0
- package/dist/hearth/wake-proxy/__tests__/ws-teardown-accounting.test.js +143 -0
- package/dist/hearth/wake-proxy/anthropic-oauth.d.ts +58 -0
- package/dist/hearth/wake-proxy/anthropic-oauth.js +189 -0
- package/dist/hearth/wake-proxy/auth.d.ts +22 -0
- package/dist/hearth/wake-proxy/auth.js +128 -0
- package/dist/hearth/wake-proxy/config.d.ts +2 -0
- package/dist/hearth/wake-proxy/config.js +151 -0
- package/dist/hearth/wake-proxy/guest-source.d.ts +14 -0
- package/dist/hearth/wake-proxy/guest-source.js +130 -0
- package/dist/hearth/wake-proxy/hearth-status.d.ts +44 -0
- package/dist/hearth/wake-proxy/hearth-status.js +267 -0
- package/dist/hearth/wake-proxy/home.d.ts +61 -0
- package/dist/hearth/wake-proxy/home.js +333 -0
- package/dist/hearth/wake-proxy/main.d.ts +1 -0
- package/dist/hearth/wake-proxy/main.js +134 -0
- package/dist/hearth/wake-proxy/model-auth.d.ts +13 -0
- package/dist/hearth/wake-proxy/model-auth.js +345 -0
- package/dist/hearth/wake-proxy/proxy.d.ts +35 -0
- package/dist/hearth/wake-proxy/proxy.js +716 -0
- package/dist/hearth/wake-proxy/public-source-gate.d.ts +9 -0
- package/dist/hearth/wake-proxy/public-source-gate.js +409 -0
- package/dist/hearth/wake-proxy/redact.d.ts +1 -0
- package/dist/hearth/wake-proxy/redact.js +17 -0
- package/dist/hearth/wake-proxy/server.d.ts +11 -0
- package/dist/hearth/wake-proxy/server.js +142 -0
- package/dist/hearth/wake-proxy/state.d.ts +18 -0
- package/dist/hearth/wake-proxy/state.js +342 -0
- package/dist/hearth/wake-proxy/types.d.ts +76 -0
- package/dist/hearth/wake-proxy/types.js +1 -0
- package/dist/index.js +3 -2
- package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +6 -5
- package/dist/pi-extensions/canvas-context-intro.js +7 -7
- package/dist/pi-extensions/canvas-doc-substrate.js +47 -24
- package/dist/pi-extensions/canvas-nav.js +16 -9
- package/dist/pi-extensions/canvas-stophook.d.ts +1 -1
- package/dist/pi-extensions/canvas-stophook.js +78 -11
- package/dist/prompts/view.js +7 -8
- package/dist/types.d.ts +39 -20
- package/dist/types.js +38 -13
- package/dist/web/runtime.js +141 -42
- package/dist/web/transport-http.js +7 -5
- package/dist/web/transport-stream.d.ts +3 -0
- package/dist/web/transport-stream.js +204 -0
- package/dist/web-client/assets/fragment-mono-latin-400-normal-BYwT3kSJ.woff +0 -0
- package/dist/web-client/assets/fragment-mono-latin-400-normal-yxdJ5AmL.woff2 +0 -0
- package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-BbKYyvR9.woff2 +0 -0
- package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-CT4YFKeK.woff +0 -0
- package/dist/web-client/assets/fraunces-latin-ext-wght-normal-Ca2vKHc0.woff2 +0 -0
- package/dist/web-client/assets/fraunces-latin-wght-normal-ukD16Tqj.woff2 +0 -0
- package/dist/web-client/assets/fraunces-vietnamese-wght-normal-CnvboYUG.woff2 +0 -0
- package/dist/web-client/assets/index-BRKxe-hy.js +80 -0
- package/dist/web-client/assets/index-BZUxTkv5.css +2 -0
- package/dist/web-client/assets/instrument-sans-latin-ext-wght-normal-B5bTHO_g.woff2 +0 -0
- package/dist/web-client/assets/instrument-sans-latin-wght-normal-BbzFLZTg.woff2 +0 -0
- package/dist/web-client/assets/martian-mono-cyrillic-wght-normal-B84CD5C_.woff2 +0 -0
- package/dist/web-client/assets/martian-mono-latin-ext-wght-normal-DlL6xMw5.woff2 +0 -0
- package/dist/web-client/assets/martian-mono-latin-wght-normal-5W32yIyr.woff2 +0 -0
- package/dist/web-client/index.html +3 -2
- package/package.json +37 -11
- package/scripts/postinstall.mjs +8 -0
- package/dist/clients/attach/__tests__/action-parity.test.js +0 -48
- 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 -39
- 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__/draw-style.test.js +0 -258
- package/dist/core/__tests__/error-stall-recycle.test.js +0 -141
- package/dist/core/__tests__/frame-decoder-perf.test.js +0 -224
- package/dist/core/__tests__/keystone.test.js +0 -185
- package/dist/core/__tests__/listing-completeness.test.js +0 -31
- package/dist/core/__tests__/memory-resolver.test.js +0 -108
- package/dist/core/__tests__/memory.test.js +0 -60
- package/dist/core/__tests__/pane-column.test.js +0 -153
- package/dist/core/__tests__/persona-compose.test.js +0 -53
- package/dist/core/__tests__/persona-subkind.test.js +0 -65
- package/dist/core/__tests__/persona.test.js +0 -107
- 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/skill-sync/__tests__/dry-run-wrote-count.test.js +0 -57
- package/dist/core/skill-sync/builtins.js +0 -112
- package/dist/core/skill-sync/claude-plugins.d.ts +0 -23
- package/dist/core/skill-sync/claude-plugins.js +0 -71
- package/dist/core/skill-sync/engine.d.ts +0 -42
- package/dist/core/skill-sync/engine.js +0 -633
- package/dist/core/skill-sync/manifest.d.ts +0 -64
- package/dist/core/skill-sync/manifest.js +0 -181
- package/dist/core/skill-sync/profile.d.ts +0 -76
- package/dist/core/skill-sync/profile.js +0 -173
- package/dist/core/skill-sync/snapshot.d.ts +0 -57
- package/dist/core/skill-sync/snapshot.js +0 -120
- package/dist/pi-extensions/canvas-commands.d.ts +0 -37
- package/dist/pi-extensions/canvas-commands.js +0 -113
- package/dist/pi-extensions/canvas-resume.d.ts +0 -21
- package/dist/pi-extensions/canvas-resume.js +0 -83
- package/dist/pi-extensions/canvas-view.d.ts +0 -21
- package/dist/pi-extensions/canvas-view.js +0 -76
- package/dist/web-client/assets/index-BUvQb4hR.css +0 -2
- package/dist/web-client/assets/index-ClLQXYAE.js +0 -10
- /package/dist/clients/attach/__tests__/{action-parity.test.d.ts → crtr-output-coverage.test.d.ts} +0 -0
- /package/dist/clients/attach/__tests__/{clipboard-image.test.d.ts → crtr-output-render.test.d.ts} +0 -0
- /package/dist/clients/{attach/__tests__/editor-newline.test.d.ts → web/__tests__/source-cache.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/git-info.test.d.ts → commands/sys/__tests__/sync-import.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/onrequest-wired.test.d.ts → core/__tests__/boot.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/reconnect-giveup.test.d.ts → core/__tests__/broker-preflight.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/slash-quit-copy.test.d.ts → core/__tests__/chat-view-reconnect.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/titled-editor.test.d.ts → core/__tests__/connection-reconnect-resume.test.d.ts} +0 -0
- /package/dist/{commands/memory/__tests__/lint-schema.test.d.ts → core/__tests__/hearth-bootstrap.test.d.ts} +0 -0
- /package/dist/core/__tests__/{argv-parser.test.d.ts → preview-registry-sync.test.d.ts} +0 -0
- /package/dist/core/__tests__/{draw-style.test.d.ts → prune-to-limit.test.d.ts} +0 -0
- /package/dist/core/__tests__/{error-stall-recycle.test.d.ts → stranded-relaunch.test.d.ts} +0 -0
- /package/dist/core/__tests__/{frame-decoder-perf.test.d.ts → trigger-migration.test.d.ts} +0 -0
- /package/dist/core/__tests__/{keystone.test.d.ts → yield-ensures-daemon.test.d.ts} +0 -0
- /package/dist/core/{__tests__/listing-completeness.test.d.ts → hearth/__tests__/model-auth-guest.test.d.ts} +0 -0
- /package/dist/core/{__tests__/memory-resolver.test.d.ts → hearth/providers/types.js} +0 -0
- /package/dist/core/{__tests__/memory.test.d.ts → hearth/types.js} +0 -0
- /package/dist/core/{__tests__/pane-column.test.d.ts → host-exports/__tests__/export-prunes-boot-skill.test.d.ts} +0 -0
- /package/dist/core/{__tests__/persona-compose.test.d.ts → view/__tests__/transport-cache.test.d.ts} +0 -0
- /package/dist/{core/__tests__/persona-subkind.test.d.ts → daemon/__tests__/predicate-eval.test.d.ts} +0 -0
- /package/dist/{core/__tests__/persona.test.d.ts → hearth/control-plane/__tests__/node-message.test.d.ts} +0 -0
- /package/dist/{core/__tests__/unknown-path.test.d.ts → hearth/control-plane/__tests__/rate-limit-recurrence.test.d.ts} +0 -0
- /package/dist/{core/skill-sync/__tests__/dry-run-wrote-count.test.d.ts → hearth/control-plane/__tests__/relay-security.test.d.ts} +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
|
+
});
|
|
@@ -11,7 +11,7 @@ import { tmpdir } from 'node:os';
|
|
|
11
11
|
import { join } from 'node:path';
|
|
12
12
|
import { createNode, setStatus } from '../canvas/canvas.js';
|
|
13
13
|
import { closeDb } from '../canvas/db.js';
|
|
14
|
-
import { registerPush } from '../../commands/push.js';
|
|
14
|
+
import { registerPush, mapFinalizeTransitionRaceError } from '../../commands/push.js';
|
|
15
15
|
import { InputError } from '../io.js';
|
|
16
16
|
let home;
|
|
17
17
|
const prevNodeId = process.env['CRTR_NODE_ID'];
|
|
@@ -69,3 +69,9 @@ test('push final on a dead node is also caught cleanly', async () => {
|
|
|
69
69
|
process.env['CRTR_NODE_ID'] = id;
|
|
70
70
|
await assert.rejects(() => finalLeaf().run({ body: 'x' }), (e) => e instanceof InputError && e.payload.error === 'already_finalized');
|
|
71
71
|
});
|
|
72
|
+
test('a raw finalize-transition race is normalized to already_finalized', () => {
|
|
73
|
+
const mapped = mapFinalizeTransitionRaceError('canceled', new Error("illegal lifecycle transition: 'finalize' from status='canceled' (node raceNode)"));
|
|
74
|
+
assert.ok(mapped instanceof InputError, 'the raw transition error is converted');
|
|
75
|
+
assert.equal(mapped?.payload.error, 'already_finalized');
|
|
76
|
+
assert.equal(mapped?.payload.message, 'This node is already canceled — `push final` finishes a node once and cannot finalize it again.');
|
|
77
|
+
});
|
|
@@ -36,7 +36,7 @@ function makeDeps(pid) {
|
|
|
36
36
|
const deps = {
|
|
37
37
|
launchBroker: (nodeId) => {
|
|
38
38
|
launched.push(nodeId);
|
|
39
|
-
return { pid };
|
|
39
|
+
return { pid, exited: new Promise(() => { }) };
|
|
40
40
|
},
|
|
41
41
|
waitForViewSocket: () => true,
|
|
42
42
|
respawnViewer: () => true,
|
|
@@ -57,7 +57,7 @@ after(() => {
|
|
|
57
57
|
rmSync(home, { recursive: true, force: true });
|
|
58
58
|
delete process.env['CRTR_HOME'];
|
|
59
59
|
});
|
|
60
|
-
test('relaunchRoot parks the old root done and mints a fresh active root, reaping descendants', () => {
|
|
60
|
+
test('relaunchRoot parks the old root done and mints a fresh active root, reaping descendants', async () => {
|
|
61
61
|
// root → child → grandchild (a parent that subscribes to its workers).
|
|
62
62
|
createNode(node('root', { parent: null, lifecycle: 'resident', cwd: '/tmp/proj' }));
|
|
63
63
|
createNode(node('child', { parent: 'root' }));
|
|
@@ -65,7 +65,7 @@ test('relaunchRoot parks the old root done and mints a fresh active root, reapin
|
|
|
65
65
|
subscribe('root', 'child', true);
|
|
66
66
|
subscribe('child', 'grand', true);
|
|
67
67
|
const { deps, launched } = makeDeps(4242);
|
|
68
|
-
const res = relaunchRoot('root', deps);
|
|
68
|
+
const res = await relaunchRoot('root', deps);
|
|
69
69
|
// A fresh, DIFFERENT node id was minted and booted.
|
|
70
70
|
assert.ok(res, 'relaunchRoot returns the new node id');
|
|
71
71
|
const newId = res.newNodeId;
|
|
@@ -86,14 +86,14 @@ test('relaunchRoot parks the old root done and mints a fresh active root, reapin
|
|
|
86
86
|
assert.equal(getNode('child')?.status, 'canceled', 'descendant child canceled');
|
|
87
87
|
assert.equal(getNode('grand')?.status, 'canceled', 'descendant grandchild canceled');
|
|
88
88
|
});
|
|
89
|
-
test('relaunchRoot on a boot failure leaves the old root + descendants fully intact', () => {
|
|
89
|
+
test('relaunchRoot on a boot failure leaves the old root + descendants fully intact', async () => {
|
|
90
90
|
// The mint-and-boot-FIRST ordering: a launch failure (pid=null) must occur
|
|
91
91
|
// BEFORE the old root is parked or its descendants reaped.
|
|
92
92
|
createNode(node('root', { parent: null, lifecycle: 'resident' }));
|
|
93
93
|
createNode(node('child', { parent: 'root' }));
|
|
94
94
|
subscribe('root', 'child', true);
|
|
95
95
|
const { deps, launched } = makeDeps(null); // broker never starts
|
|
96
|
-
const res = relaunchRoot('root', deps);
|
|
96
|
+
const res = await relaunchRoot('root', deps);
|
|
97
97
|
assert.equal(res, null, 'a boot failure returns null');
|
|
98
98
|
// Old root + descendant untouched: still live, ready to keep running.
|
|
99
99
|
assert.equal(getNode('root')?.status, 'active', 'old root left active + untouched');
|
|
@@ -102,13 +102,13 @@ test('relaunchRoot on a boot failure leaves the old root + descendants fully int
|
|
|
102
102
|
assert.equal(launched.length, 1, 'one broker launch was attempted');
|
|
103
103
|
assert.equal(getNode(launched[0])?.status, 'dead', 'the half-born new node is crashed (dead)');
|
|
104
104
|
});
|
|
105
|
-
test('relaunchRoot is a no-op for a non-root child and an already-parked root', () => {
|
|
105
|
+
test('relaunchRoot is a no-op for a non-root child and an already-parked root', async () => {
|
|
106
106
|
createNode(node('root', { parent: null, lifecycle: 'resident' }));
|
|
107
107
|
createNode(node('child', { parent: 'root' }));
|
|
108
108
|
createNode(node('done-root', { parent: null, status: 'done' }));
|
|
109
109
|
const { deps, launched } = makeDeps(1);
|
|
110
|
-
assert.equal(relaunchRoot('child', deps), null, 'a child is not a relaunchable root');
|
|
111
|
-
assert.equal(relaunchRoot('done-root', deps), null, 'a done root is not relaunched again (double /new)');
|
|
112
|
-
assert.equal(relaunchRoot('ghost', deps), null, 'an unknown node is a no-op');
|
|
110
|
+
assert.equal(await relaunchRoot('child', deps), null, 'a child is not a relaunchable root');
|
|
111
|
+
assert.equal(await relaunchRoot('done-root', deps), null, 'a done root is not relaunched again (double /new)');
|
|
112
|
+
assert.equal(await relaunchRoot('ghost', deps), null, 'an unknown node is a no-op');
|
|
113
113
|
assert.deepEqual(launched, [], 'no broker was booted for any of the no-op cases');
|
|
114
114
|
});
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// Run with: node --import tsx/esm --test src/core/__tests__/revive.test.ts
|
|
2
2
|
//
|
|
3
3
|
// HEADLESS RETARGET (foundation-spec §C.13 + §E). Covers the session-picker fix
|
|
4
|
-
// (resume by ABSOLUTE session-file path, cwd-immune
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
4
|
+
// (resume by ABSOLUTE session-file path, cwd-immune) and the double-revive guard
|
|
5
|
+
// that keeps two pi processes off one session file. The argv selection is
|
|
6
|
+
// unit-tested via the pure `resumeArgs` + `buildPiArgv`; the guard + the
|
|
7
|
+
// cycle-counter bump are now driven against a fabricated BROKER-hosted node —
|
|
8
|
+
// ZERO real tmux, ZERO real boot.
|
|
9
9
|
//
|
|
10
10
|
// (1) BUG LOCKED — the double-revive guard (revive.ts:114): a node already up
|
|
11
11
|
// (its engine container alive AND its pi pid live) must NOT be re-launched —
|
|
@@ -30,13 +30,14 @@
|
|
|
30
30
|
// goes RED.
|
|
31
31
|
import { test, before, after, beforeEach } from 'node:test';
|
|
32
32
|
import assert from 'node:assert/strict';
|
|
33
|
-
import { mkdtempSync, rmSync } from 'node:fs';
|
|
33
|
+
import { mkdtempSync, rmSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
34
34
|
import { tmpdir } from 'node:os';
|
|
35
35
|
import { join } from 'node:path';
|
|
36
36
|
import { spawn, spawnSync } from 'node:child_process';
|
|
37
37
|
import { createNode } from '../canvas/canvas.js';
|
|
38
38
|
import { closeDb } from '../canvas/db.js';
|
|
39
39
|
import { buildPiArgv } from '../runtime/launch.js';
|
|
40
|
+
import { headlessBrokerHost } from '../runtime/host.js';
|
|
40
41
|
import { resumeArgs, reviveNode } from '../runtime/revive.js';
|
|
41
42
|
import { createHarness } from './helpers/harness.js';
|
|
42
43
|
let home;
|
|
@@ -92,41 +93,54 @@ after(() => {
|
|
|
92
93
|
// ---------------------------------------------------------------------------
|
|
93
94
|
// resumeArgs — the pure resume-source selection
|
|
94
95
|
// ---------------------------------------------------------------------------
|
|
95
|
-
test('resumeArgs
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
});
|
|
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 });
|
|
101
102
|
});
|
|
102
|
-
test('resumeArgs falls
|
|
103
|
+
test('resumeArgs selects nothing (falls through to fresh) when no file was ever captured (older node)', () => {
|
|
103
104
|
const m = node('n', { pi_session_id: 'uuid-123', pi_session_file: null });
|
|
104
|
-
assert.deepEqual(resumeArgs(m, true), {
|
|
105
|
-
|
|
106
|
-
|
|
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'),
|
|
107
116
|
});
|
|
117
|
+
assert.deepEqual(resumeArgs(m, true), {});
|
|
108
118
|
});
|
|
109
119
|
test('resumeArgs selects neither source on a no-resume (refresh) revive', () => {
|
|
110
|
-
|
|
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 });
|
|
111
124
|
assert.deepEqual(resumeArgs(m, false), {});
|
|
112
125
|
});
|
|
113
126
|
// ---------------------------------------------------------------------------
|
|
114
127
|
// buildPiArgv — the `--session` argument the revive builds
|
|
115
128
|
// ---------------------------------------------------------------------------
|
|
116
|
-
test('buildPiArgv resumes by ABSOLUTE path when pi_session_file
|
|
117
|
-
|
|
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 });
|
|
118
134
|
const { argv } = buildPiArgv(m, resumeArgs(m, true));
|
|
119
135
|
const i = argv.indexOf('--session');
|
|
120
136
|
assert.ok(i >= 0, 'argv carries --session');
|
|
121
|
-
assert.equal(argv[i + 1],
|
|
122
|
-
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');
|
|
123
139
|
});
|
|
124
|
-
test('buildPiArgv
|
|
140
|
+
test('buildPiArgv passes no --session when no path is stored (falls through to fresh)', () => {
|
|
125
141
|
const m = node('n', { pi_session_id: 'uuid-123', pi_session_file: null });
|
|
126
142
|
const { argv } = buildPiArgv(m, resumeArgs(m, true));
|
|
127
|
-
|
|
128
|
-
assert.ok(i >= 0, 'argv carries --session');
|
|
129
|
-
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');
|
|
130
144
|
});
|
|
131
145
|
test('buildPiArgv passes no --session on a fresh (no-resume) launch', () => {
|
|
132
146
|
const m = node('n', { pi_session_id: 'uuid-123', pi_session_file: '/abs/sess.jsonl' });
|
|
@@ -139,11 +153,14 @@ test('buildPiArgv passes no --session on a fresh (no-resume) launch', () => {
|
|
|
139
153
|
// (kind/mode/lifecycle come back as the node's *current* self).
|
|
140
154
|
// ---------------------------------------------------------------------------
|
|
141
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');
|
|
142
159
|
const m = node('n', {
|
|
143
160
|
kind: 'developer',
|
|
144
161
|
mode: 'orchestrator',
|
|
145
162
|
pi_session_id: 'uuid-9',
|
|
146
|
-
pi_session_file:
|
|
163
|
+
pi_session_file: sessionFile,
|
|
147
164
|
launch: {
|
|
148
165
|
model: 'anthropic/sonnet',
|
|
149
166
|
tools: ['bash', 'read'],
|
|
@@ -166,7 +183,7 @@ test('a resumed revive replays the persisted LaunchSpec (model, tools, extension
|
|
|
166
183
|
assert.equal(argv[ti + 1], 'bash,read');
|
|
167
184
|
assert.ok(argv.includes('--append-system-prompt'), 'system prompt replayed');
|
|
168
185
|
const si = argv.indexOf('--session');
|
|
169
|
-
assert.equal(argv[si + 1],
|
|
186
|
+
assert.equal(argv[si + 1], sessionFile, 'still resumes by file path');
|
|
170
187
|
// Env contract: launch-spec env merged over the node identity env.
|
|
171
188
|
assert.equal(env['FOO'], 'bar');
|
|
172
189
|
assert.equal(env['CRTR_NODE_ID'], 'n');
|
|
@@ -211,11 +228,15 @@ test('reviveNode PROCEEDS when the broker engine is DOWN (dead pid) — cycle co
|
|
|
211
228
|
// circuit → reviveNode proceeds. It bumps cycles BEFORE the detached (fake-
|
|
212
229
|
// engine) launch, so the bump is observable instantly; the throwaway broker is
|
|
213
230
|
// killed by dispose().
|
|
231
|
+
const sessionFile = join(home, 'sessions', 'crtr-revive-proceed.jsonl');
|
|
232
|
+
mkdirSync(join(home, 'sessions'), { recursive: true });
|
|
233
|
+
writeFileSync(sessionFile, '{}\n', 'utf8');
|
|
214
234
|
const M = h.fabricateBrokerNode({
|
|
215
235
|
status: 'active',
|
|
216
236
|
intent: null,
|
|
217
237
|
pi_pid: deadPid(),
|
|
218
238
|
pi_session_id: 'uuid-1',
|
|
239
|
+
pi_session_file: sessionFile,
|
|
219
240
|
});
|
|
220
241
|
assert.equal(h.node(M).cycles ?? 0, 0, 'fabricated at cycle 0 (no revive yet)');
|
|
221
242
|
reviveNode(M, { resume: true });
|
|
@@ -225,3 +246,55 @@ test('reviveNode PROCEEDS when the broker engine is DOWN (dead pid) — cycle co
|
|
|
225
246
|
await h.dispose();
|
|
226
247
|
}
|
|
227
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
|
+
});
|
|
276
|
+
test('reviveNode crashes and clears pid when launch/preflight throws', async () => {
|
|
277
|
+
const h = await createHarness({ headless: true, sessionPrefix: 'crtr-revive-fail' });
|
|
278
|
+
const originalLaunch = headlessBrokerHost.launch;
|
|
279
|
+
try {
|
|
280
|
+
const sessionFile = join(home, 'sessions', 'crtr-revive-fail.jsonl');
|
|
281
|
+
mkdirSync(join(home, 'sessions'), { recursive: true });
|
|
282
|
+
writeFileSync(sessionFile, '{}\n', 'utf8');
|
|
283
|
+
const M = h.fabricateBrokerNode({
|
|
284
|
+
status: 'active',
|
|
285
|
+
intent: null,
|
|
286
|
+
pi_pid: deadPid(),
|
|
287
|
+
pi_session_id: 'uuid-2',
|
|
288
|
+
pi_session_file: sessionFile,
|
|
289
|
+
});
|
|
290
|
+
headlessBrokerHost.launch = (_nodeId, _inv, _opts) => { throw new Error('boom'); };
|
|
291
|
+
assert.throws(() => reviveNode(M, { resume: true }), /refusing to revive/i);
|
|
292
|
+
const after = h.node(M);
|
|
293
|
+
assert.equal(after.status, 'dead', 'failed revive marks the node dead');
|
|
294
|
+
assert.equal(after.pi_pid, null, 'failed revive clears the stale pid');
|
|
295
|
+
}
|
|
296
|
+
finally {
|
|
297
|
+
headlessBrokerHost.launch = originalLaunch;
|
|
298
|
+
await h.dispose();
|
|
299
|
+
}
|
|
300
|
+
});
|
|
@@ -10,7 +10,8 @@ import { createNode, getNode, getRow, subscribersOf } from '../canvas/canvas.js'
|
|
|
10
10
|
import { closeDb } from '../canvas/db.js';
|
|
11
11
|
import { nodeDir } from '../canvas/paths.js';
|
|
12
12
|
import { spawnNode } from '../runtime/nodes.js';
|
|
13
|
-
import { resolveSpawner } from '../runtime/spawn.js';
|
|
13
|
+
import { spawnChild, resolveSpawner } from '../runtime/spawn.js';
|
|
14
|
+
import { headlessBrokerHost } from '../runtime/host.js';
|
|
14
15
|
let home;
|
|
15
16
|
function spawner(id) {
|
|
16
17
|
return {
|
|
@@ -81,3 +82,25 @@ test('unknown parent: spawnNode throws and mints NO node dir / row (validate bef
|
|
|
81
82
|
assert.equal(getRow(orphanId), null, 'no index row written for the orphan');
|
|
82
83
|
assert.equal(existsSync(nodeDir(orphanId)), false, 'no node dir scaffolded for the orphan');
|
|
83
84
|
});
|
|
85
|
+
test('spawnChild crashes the node when launch/preflight throws', async () => {
|
|
86
|
+
const parentId = 'A';
|
|
87
|
+
createNode(spawner(parentId));
|
|
88
|
+
const originalLaunch = headlessBrokerHost.launch;
|
|
89
|
+
let launchedNodeId = null;
|
|
90
|
+
try {
|
|
91
|
+
headlessBrokerHost.launch = (nodeId, _inv, _opts) => {
|
|
92
|
+
launchedNodeId = nodeId;
|
|
93
|
+
throw new Error('boom');
|
|
94
|
+
};
|
|
95
|
+
await assert.rejects(async () => spawnChild({ kind: 'developer', cwd: '/tmp/work', parent: parentId, prompt: 'task' }), /refusing to launch/i);
|
|
96
|
+
assert.ok(launchedNodeId !== null, 'the launch hook saw the spawned node id');
|
|
97
|
+
const after = getNode(launchedNodeId);
|
|
98
|
+
assert.equal(after.status, 'dead', 'failed spawn marks the node dead');
|
|
99
|
+
assert.equal(after.pi_pid, null, 'failed spawn clears the stale pid');
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
headlessBrokerHost.launch = originalLaunch;
|
|
103
|
+
closeDb();
|
|
104
|
+
rmSync(home, { recursive: true, force: true });
|
|
105
|
+
}
|
|
106
|
+
});
|
|
@@ -80,3 +80,13 @@ test('pushedFinal → finished; askedHuman → escalated (both short-circuit bef
|
|
|
80
80
|
assert.deepEqual(evaluateStop('t', { pushedFinal: true, askedHuman: false }), { action: 'allow', reason: 'finished' });
|
|
81
81
|
assert.deepEqual(evaluateStop('t', { pushedFinal: false, askedHuman: true }), { action: 'allow', reason: 'escalated' });
|
|
82
82
|
});
|
|
83
|
+
test('already-terminal stored statuses are allowed without a stall reprompt', () => {
|
|
84
|
+
for (const [id, status] of [
|
|
85
|
+
['doneNode', 'done'],
|
|
86
|
+
['deadNode', 'dead'],
|
|
87
|
+
['canceledNode', 'canceled'],
|
|
88
|
+
]) {
|
|
89
|
+
createNode(node(id, { parent: 'mgr', lifecycle: 'terminal', status }));
|
|
90
|
+
assert.deepEqual(evaluateStop(id, noSignals), { action: 'allow', reason: 'finished' });
|
|
91
|
+
}
|
|
92
|
+
});
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// Run with: node --import tsx/esm --test src/core/__tests__/stranded-relaunch.test.ts
|
|
2
|
+
//
|
|
3
|
+
// BUG-REGRESSION (observed 2026-06-15 on the live canvas). A broker-hosted node
|
|
4
|
+
// whose row carries pi_pid=NULL but pi_session_id SET was read by
|
|
5
|
+
// handleNodeLiveness as "a relaunch in flight — leave it" UNCONDITIONALLY, with
|
|
6
|
+
// no timeout. reviveNode clears pi_pid right after launch and the fresh engine
|
|
7
|
+
// re-records it within a tick or two — but a relaunch whose broker DIED in that
|
|
8
|
+
// gap (after the pid-clear, before re-record) never re-records, so the node sat
|
|
9
|
+
// 'active' with no engine FOREVER and its parent waited on a dead child. Six such
|
|
10
|
+
// stranded resident roots had accumulated and the daemon would never recover or
|
|
11
|
+
// reap any of them.
|
|
12
|
+
//
|
|
13
|
+
// THE FIX — give the pid==null + session-set case the SAME REVIVE_GRACE_MS boot
|
|
14
|
+
// grace as the never-booted case: a healthy relaunch always re-records its pid
|
|
15
|
+
// well inside the grace (and the pid-alive branch clears the clock); if the grace
|
|
16
|
+
// ELAPSES with still no pid, the relaunch is dead → grace-revive RESUME on the
|
|
17
|
+
// saved session. The 20s grace doubles as the double-spawn guard.
|
|
18
|
+
//
|
|
19
|
+
// WHY MODEL-LEVEL, NOT TMUX CHROME — the stranding lives entirely in pure daemon
|
|
20
|
+
// logic (the pid==null branch of handleNodeLiveness + the unhealthySince clock).
|
|
21
|
+
// A fabricated broker row carrying pi_pid=null + a recorded pi_session_id
|
|
22
|
+
// reproduces the exact stranded state with no process at all; h.tick(now) walks a
|
|
23
|
+
// deterministic clock across the grace boundary and getNode().cycles (reviveNode
|
|
24
|
+
// bumps cycles + transition('revive') BEFORE the detached spawn) makes the revive
|
|
25
|
+
// observable instantly.
|
|
26
|
+
//
|
|
27
|
+
// HOW IT FAILS IF THE BUG REGRESSES — restore the unconditional
|
|
28
|
+
// `if (meta.pi_session_id != null) return;` and the PAST-grace tick never revives
|
|
29
|
+
// → cycles stays 0 → the final assert goes RED.
|
|
30
|
+
import { test } from 'node:test';
|
|
31
|
+
import assert from 'node:assert/strict';
|
|
32
|
+
import { createHarness } from './helpers/harness.js';
|
|
33
|
+
// REVIVE_GRACE_MS is 20_000 (crtrd.ts). Offsets well inside / well past it keep
|
|
34
|
+
// the test robust to the exact value without importing it.
|
|
35
|
+
const NOW = 7_000_000;
|
|
36
|
+
const WITHIN_GRACE = NOW + 10_000; // < 20s after first-observed-null → still pending
|
|
37
|
+
const PAST_GRACE = NOW + 25_000; // > 20s after first-observed-null → revive
|
|
38
|
+
test('stranded relaunch: pid=null + session set is revived once the boot grace elapses, not left active forever', { timeout: 30_000 }, async () => {
|
|
39
|
+
const h = await createHarness({ headless: true, sessionPrefix: 'crtr-stranded' });
|
|
40
|
+
try {
|
|
41
|
+
// The EXACT stranded state: a broker row that booted once (pi_session_id
|
|
42
|
+
// captured) whose relaunch then died after the pid-clear — pi_pid NULL,
|
|
43
|
+
// intent null (so it is neither the refresh nor the idle-release path).
|
|
44
|
+
const B = h.fabricateBrokerNode({
|
|
45
|
+
kind: 'developer',
|
|
46
|
+
status: 'active',
|
|
47
|
+
intent: null,
|
|
48
|
+
pi_pid: null,
|
|
49
|
+
pi_session_id: 'sess-stranded-B',
|
|
50
|
+
});
|
|
51
|
+
const b0 = h.node(B);
|
|
52
|
+
assert.equal(b0.host_kind, 'broker', 'B is broker-hosted (paneless)');
|
|
53
|
+
assert.equal(b0.pi_pid ?? null, null, 'row pi_pid is null (relaunch never re-recorded)');
|
|
54
|
+
assert.equal(b0.pi_session_id, 'sess-stranded-B', 'session is set (booted once)');
|
|
55
|
+
assert.equal(b0.cycles ?? 0, 0, 'no revive yet — cycles at 0');
|
|
56
|
+
// --- TICK 1 @ NOW: first observation of null pid → start the boot grace
|
|
57
|
+
// clock, do NOT revive (a healthy relaunch re-records its pid here). ---
|
|
58
|
+
await h.tick(NOW);
|
|
59
|
+
assert.equal(h.node(B).cycles ?? 0, 0, 'first tick: no revive — grace clock started');
|
|
60
|
+
// --- TICK 2 @ NOW+10s (WITHIN grace): still pending. This is the
|
|
61
|
+
// double-spawn guard — a healthy relaunch would have re-recorded by now. ---
|
|
62
|
+
await h.tick(WITHIN_GRACE);
|
|
63
|
+
assert.equal(h.node(B).cycles ?? 0, 0, 'within REVIVE_GRACE_MS: still no revive (healthy relaunch grace, not a strand yet)');
|
|
64
|
+
// --- TICK 3 @ NOW+25s (PAST grace): the relaunch is dead → grace-revive
|
|
65
|
+
// RESUME on the saved session; reviveNode bumps cycles immediately. ---
|
|
66
|
+
await h.tick(PAST_GRACE);
|
|
67
|
+
assert.equal(h.node(B).cycles ?? 0, 1, 'past REVIVE_GRACE_MS: the stranded relaunch is revived (cycles bumped) — NOT left active forever');
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
await h.dispose();
|
|
71
|
+
}
|
|
72
|
+
});
|
|
@@ -68,7 +68,11 @@ test('§2.2 driver invariant: every placement verb in tmux.ts passes an explicit
|
|
|
68
68
|
found++;
|
|
69
69
|
const verb = m[1];
|
|
70
70
|
const arr = enclosingArray(src, m.index);
|
|
71
|
-
|
|
71
|
+
// The invariant is "name a specific tmux object, never fall back to the
|
|
72
|
+
// GLOBAL current one". `-t` targets a destination; `break-pane` (and the
|
|
73
|
+
// deleted swap/join/move-pane) instead name their SOURCE with `-s` — which
|
|
74
|
+
// satisfies the invariant identically. Accept either explicit target flag.
|
|
75
|
+
assert.ok(arr.includes(`'-t'`) || arr.includes(`'-s'`), `tmux verb '${verb}' is invoked WITHOUT an explicit -t/-s target — a latent ` +
|
|
72
76
|
`instance of the unbidden-window bug (§2.2). Offending args array:\n${arr}`);
|
|
73
77
|
}
|
|
74
78
|
// Sanity: the driver really does contain placement verbs (so a refactor that
|