@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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { test, before, after, beforeEach } from 'node:test';
|
|
2
2
|
import assert from 'node:assert/strict';
|
|
3
|
-
import { mkdtempSync, rmSync, existsSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { mkdtempSync, rmSync, existsSync, readFileSync, writeFileSync, statSync } from 'node:fs';
|
|
4
4
|
import { tmpdir } from 'node:os';
|
|
5
5
|
import { join } from 'node:path';
|
|
6
6
|
import { createNode, getNode, getRow, updateNode, setStatus, listNodes, subscribe, unsubscribe, setSubscriptionActive, recordSpawn, subscribersOf, subscriptionsOf, view, hasActiveLiveSubscription, rebuildIndex, } from '../canvas/canvas.js';
|
|
@@ -139,6 +139,42 @@ test('recordSpawn writes the audit-only spawned_by edge', () => {
|
|
|
139
139
|
assert.equal(subscriptionsOf('child').length, 0);
|
|
140
140
|
assert.equal(subscribersOf('parent').length, 0);
|
|
141
141
|
});
|
|
142
|
+
// --- Regression: Hearth M0 cold-boot 0-byte meta.json -----------------------
|
|
143
|
+
// A bare write-temp-then-rename WITHOUT fsync left meta.json 0-byte on the guest's
|
|
144
|
+
// durable NFS home after a sandbox recreate (the open inode is silly-renamed and the
|
|
145
|
+
// new content never flushed). Cold-boot's `canvas rebuild-index` + `canvas revive`
|
|
146
|
+
// then JSON.parse('') → "Unexpected end of JSON input" → the chain dies → guest
|
|
147
|
+
// daemon-only, no web on 7878. Fix: writeMeta fsyncs temp+parent dir (durable), and
|
|
148
|
+
// readMeta/rebuildIndex tolerate an empty/corrupt meta as MISSING instead of throwing.
|
|
149
|
+
test('writeMeta produces a durable, non-empty, atomically-named meta.json', () => {
|
|
150
|
+
createNode(node('a'));
|
|
151
|
+
const p = nodeMetaPath('a');
|
|
152
|
+
assert.ok(statSync(p).size > 0, 'meta.json must be non-empty');
|
|
153
|
+
assert.ok(!existsSync(`${p}.tmp`), 'temp file must be renamed away, not left behind');
|
|
154
|
+
assert.equal(getNode('a')?.node_id, 'a');
|
|
155
|
+
});
|
|
156
|
+
test('getNode returns null (not throw) on a 0-byte meta.json', () => {
|
|
157
|
+
createNode(node('a'));
|
|
158
|
+
writeFileSync(nodeMetaPath('a'), ''); // the observed NFS 0-byte corruption
|
|
159
|
+
assert.equal(getNode('a'), null);
|
|
160
|
+
});
|
|
161
|
+
test('getNode returns null (not throw) on an unparseable meta.json', () => {
|
|
162
|
+
createNode(node('a'));
|
|
163
|
+
writeFileSync(nodeMetaPath('a'), '{ broken json');
|
|
164
|
+
assert.equal(getNode('a'), null);
|
|
165
|
+
});
|
|
166
|
+
test('rebuildIndex skips a corrupt-meta node instead of throwing', () => {
|
|
167
|
+
createNode(node('good'));
|
|
168
|
+
createNode(node('bad'));
|
|
169
|
+
writeFileSync(nodeMetaPath('bad'), ''); // 0-byte corruption on one node
|
|
170
|
+
closeDb();
|
|
171
|
+
rmSync(join(home, 'canvas.db'), { force: true });
|
|
172
|
+
rmSync(join(home, 'canvas.db-wal'), { force: true });
|
|
173
|
+
rmSync(join(home, 'canvas.db-shm'), { force: true });
|
|
174
|
+
assert.doesNotThrow(() => rebuildIndex());
|
|
175
|
+
assert.equal(getRow('good')?.node_id, 'good'); // healthy node reindexed
|
|
176
|
+
assert.equal(getRow('bad'), null); // corrupt node skipped, no crash
|
|
177
|
+
});
|
|
142
178
|
test('rebuildIndex reconstructs node rows from on-disk metas', () => {
|
|
143
179
|
createNode(node('a', { parent: null }));
|
|
144
180
|
createNode(node('b', { parent: 'a' }));
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { test } from 'node:test';
|
|
3
|
+
// @ts-ignore -- chat core is a plain built view module with no generated .d.ts.
|
|
4
|
+
import core from '../../builtin-views/chat/core.mjs';
|
|
5
|
+
import { openLocalStream } from '../view/stream-local.js';
|
|
6
|
+
const flushMicrotasks = async () => {
|
|
7
|
+
await Promise.resolve();
|
|
8
|
+
};
|
|
9
|
+
test('local invalid/no-node stream failures close asynchronously after the channel returns', async () => {
|
|
10
|
+
for (const target of ['not/valid', 'definitely-not-a-real-node-review-5362b32']) {
|
|
11
|
+
const events = [];
|
|
12
|
+
const channel = openLocalStream({ kind: 'stream', target, role: 'controller' }, {
|
|
13
|
+
onFrame() {
|
|
14
|
+
events.push('frame');
|
|
15
|
+
},
|
|
16
|
+
onClose(reason) {
|
|
17
|
+
events.push(`close:${reason}`);
|
|
18
|
+
},
|
|
19
|
+
onError(err) {
|
|
20
|
+
events.push(`error:${err.kind}`);
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
assert.equal(events.length, 0, `${target}: callbacks stay deferred until after openLocalStream returns`);
|
|
24
|
+
assert.equal(typeof channel.close, 'function', `${target}: channel is returned before failure callbacks fire`);
|
|
25
|
+
await flushMicrotasks();
|
|
26
|
+
assert.ok(events[0]?.startsWith('error:'), `${target}: reports the terminal open failure as an error`);
|
|
27
|
+
assert.equal(events[1]?.startsWith('close:'), true, `${target}: follows with streamClose`);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
test('control_changed demotion updates reconnect intent without clobbering an explicit controller request', () => {
|
|
31
|
+
let current = {
|
|
32
|
+
target: 'n1',
|
|
33
|
+
desiredRole: 'controller',
|
|
34
|
+
channel: null,
|
|
35
|
+
clientId: 'client-1',
|
|
36
|
+
conn: 'open',
|
|
37
|
+
role: 'controller',
|
|
38
|
+
controllerId: 'client-1',
|
|
39
|
+
session: null,
|
|
40
|
+
transcript: [],
|
|
41
|
+
draft: '',
|
|
42
|
+
notices: [],
|
|
43
|
+
pendingDialog: null,
|
|
44
|
+
queued: [],
|
|
45
|
+
contextTokens: undefined,
|
|
46
|
+
};
|
|
47
|
+
const ctx = {
|
|
48
|
+
get state() {
|
|
49
|
+
return current;
|
|
50
|
+
},
|
|
51
|
+
set(next) {
|
|
52
|
+
current = typeof next === 'function' ? next(current) : next;
|
|
53
|
+
},
|
|
54
|
+
signal: {
|
|
55
|
+
clearBanner() { },
|
|
56
|
+
setBanner() { },
|
|
57
|
+
setStatus() { },
|
|
58
|
+
setSubtitle() { },
|
|
59
|
+
setMode() { },
|
|
60
|
+
quit() { },
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
core.intents.streamFrame(ctx, { type: 'control_changed', controller_id: 'other-client' });
|
|
64
|
+
assert.equal(current.role, 'observer');
|
|
65
|
+
assert.equal(current.desiredRole, 'observer');
|
|
66
|
+
current = { ...current, role: 'observer', desiredRole: 'controller' };
|
|
67
|
+
core.intents.streamFrame(ctx, { type: 'control_changed', controller_id: 'other-client' });
|
|
68
|
+
assert.equal(current.role, 'observer');
|
|
69
|
+
assert.equal(current.desiredRole, 'controller');
|
|
70
|
+
});
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
// the one genuine-terminal wake that still lives in core: close.ts.
|
|
24
24
|
import { test, before, after, beforeEach } from 'node:test';
|
|
25
25
|
import assert from 'node:assert/strict';
|
|
26
|
-
import { mkdtempSync, rmSync } from 'node:fs';
|
|
26
|
+
import { mkdtempSync, rmSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
27
27
|
import { tmpdir } from 'node:os';
|
|
28
28
|
import { join } from 'node:path';
|
|
29
29
|
import { spawnSync } from 'node:child_process';
|
|
@@ -46,6 +46,15 @@ function node(id, over = {}) {
|
|
|
46
46
|
...over,
|
|
47
47
|
};
|
|
48
48
|
}
|
|
49
|
+
/** Write a minimal pi session with one assistant message so the node reads as
|
|
50
|
+
* NON-empty (produced AI output) — otherwise closeNode reaps it outright. */
|
|
51
|
+
function withSession(id) {
|
|
52
|
+
const dir = join(home, 'sessions');
|
|
53
|
+
mkdirSync(dir, { recursive: true });
|
|
54
|
+
const f = join(dir, `${id}.jsonl`);
|
|
55
|
+
writeFileSync(f, JSON.stringify({ type: 'message', message: { role: 'assistant', content: [{ type: 'text', text: 'hi' }] } }) + '\n');
|
|
56
|
+
return f;
|
|
57
|
+
}
|
|
49
58
|
/** A pid that is guaranteed dead. */
|
|
50
59
|
function deadPid() {
|
|
51
60
|
const r = spawnSync('true', [], { stdio: 'ignore' });
|
|
@@ -115,7 +124,7 @@ test('pid-only liveness: a dead-engine booted child is revivable, NOT reaped, an
|
|
|
115
124
|
test('node close of a child wakes its SURVIVING manager (the parent outside the closing set)', async () => {
|
|
116
125
|
inboxWaitingParent('PARENT');
|
|
117
126
|
// A booted child; closeNode tears its (paneless-for-the-test) engine down.
|
|
118
|
-
createNode(node('CHILD', { pane: GONE_PANE, tmux_session: 'crtr-cdw', window: '@1', pi_session_id: 'booted', status: 'active' }));
|
|
127
|
+
createNode(node('CHILD', { pane: GONE_PANE, tmux_session: 'crtr-cdw', window: '@1', pi_session_id: 'booted', pi_session_file: withSession('CHILD'), status: 'active' }));
|
|
119
128
|
subscribe('PARENT', 'CHILD', true); // PARENT is a manager OUTSIDE the close set
|
|
120
129
|
// Closing CHILD: closingSet({CHILD}) cannot pull in PARENT (PARENT is a
|
|
121
130
|
// SUBSCRIBER of CHILD, never a descendant), so PARENT survives + must wake.
|
|
@@ -1,13 +1,25 @@
|
|
|
1
1
|
import { test, before, after, beforeEach } from 'node:test';
|
|
2
2
|
import assert from 'node:assert/strict';
|
|
3
|
-
import { mkdtempSync, rmSync } from 'node:fs';
|
|
3
|
+
import { mkdtempSync, rmSync, mkdirSync, writeFileSync, existsSync } from 'node:fs';
|
|
4
4
|
import { tmpdir } from 'node:os';
|
|
5
5
|
import { join } from 'node:path';
|
|
6
6
|
import { createNode, getNode, subscribe } from '../canvas/canvas.js';
|
|
7
|
+
import { nodeDir } from '../canvas/paths.js';
|
|
7
8
|
import { closeDb } from '../canvas/db.js';
|
|
8
9
|
import { closeNode } from '../runtime/close.js';
|
|
9
10
|
import { readInboxSince } from '../feed/inbox.js';
|
|
10
11
|
let home;
|
|
12
|
+
/** Write a minimal pi session containing one assistant message, so the node
|
|
13
|
+
* reads as NON-empty (it produced AI output). Without this a node has no
|
|
14
|
+
* session and closeNode reaps it outright instead of cancel+notice — see the
|
|
15
|
+
* dedicated empty-reap test below. */
|
|
16
|
+
function withSession(id) {
|
|
17
|
+
const dir = join(home, 'sessions');
|
|
18
|
+
mkdirSync(dir, { recursive: true });
|
|
19
|
+
const f = join(dir, `${id}.jsonl`);
|
|
20
|
+
writeFileSync(f, JSON.stringify({ type: 'message', message: { role: 'assistant', content: [{ type: 'text', text: 'hi' }] } }) + '\n');
|
|
21
|
+
return f;
|
|
22
|
+
}
|
|
11
23
|
function node(id, over = {}) {
|
|
12
24
|
return {
|
|
13
25
|
node_id: id,
|
|
@@ -18,6 +30,7 @@ function node(id, over = {}) {
|
|
|
18
30
|
mode: 'base',
|
|
19
31
|
lifecycle: 'terminal',
|
|
20
32
|
status: 'active',
|
|
33
|
+
pi_session_file: withSession(id),
|
|
21
34
|
...over,
|
|
22
35
|
};
|
|
23
36
|
}
|
|
@@ -132,6 +145,31 @@ test('closing a leaf node closes only itself', () => {
|
|
|
132
145
|
test('throws on an unknown node', () => {
|
|
133
146
|
assert.throws(() => closeNode('ghost'), /unknown node/);
|
|
134
147
|
});
|
|
148
|
+
// Regression: empty nodes (engine never produced an assistant message) are
|
|
149
|
+
// USELESS shells, so closing one must DELETE it from the graph + disk, not park
|
|
150
|
+
// a canceled husk. (Reported: "many nodes on the canvas that haven't generated
|
|
151
|
+
// anything yet, just taking up space" — close/detach now reap them.)
|
|
152
|
+
test('closing an EMPTY node (no AI output) deletes it from the graph + disk', () => {
|
|
153
|
+
createNode(node('shell', { pi_session_file: null }));
|
|
154
|
+
const dir = nodeDir('shell');
|
|
155
|
+
assert.ok(existsSync(dir), 'dir exists before close');
|
|
156
|
+
const res = closeNode('shell');
|
|
157
|
+
assert.deepEqual(res.closed, ['shell']);
|
|
158
|
+
assert.equal(getNode('shell'), null, 'row deleted from the graph');
|
|
159
|
+
assert.equal(existsSync(dir), false, 'on-disk dir removed');
|
|
160
|
+
});
|
|
161
|
+
// A close that reaps an EMPTY child still wakes a SURVIVING manager — the child
|
|
162
|
+
// is gone either way, so a parent that delegated must learn it vanished.
|
|
163
|
+
test('reaping an empty child still notifies a surviving external manager', () => {
|
|
164
|
+
createNode(node('child', { pi_session_file: null })); // empty → reaped
|
|
165
|
+
createNode(node('mgr')); // external manager, NOT closed
|
|
166
|
+
spawnEdge('mgr', 'child');
|
|
167
|
+
closeNode('child');
|
|
168
|
+
assert.equal(getNode('child'), null, 'empty child reaped');
|
|
169
|
+
const note = readInboxSince('mgr').at(-1);
|
|
170
|
+
assert.match(note.label, /Child closed/);
|
|
171
|
+
assert.equal(note.data?.['child'], 'child');
|
|
172
|
+
});
|
|
135
173
|
// NOTE (broker-host cut): the former "Step 7: closing a FOCUSED node closes its
|
|
136
174
|
// focus row + nulls its pane (tearDownNode)" test was DELETED. close.ts no longer
|
|
137
175
|
// routes through the synchronous tearDownNode — it sends the broker `shutdown`
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Run with: node --import tsx/esm --test src/core/__tests__/connection-reconnect-resume.test.ts
|
|
2
|
+
//
|
|
3
|
+
// BUG-REGRESSION: connection faults follow the shared broker-owned retry schedule.
|
|
4
|
+
// The broker exercises this policy table directly.
|
|
5
|
+
import { test } from 'node:test';
|
|
6
|
+
import assert from 'node:assert/strict';
|
|
7
|
+
import { nextFaultRetry, policyFor } from '../runtime/fault-recovery.js';
|
|
8
|
+
const NOW = Date.parse('2026-06-23T20:00:00.000Z');
|
|
9
|
+
const ISO = (ms) => new Date(ms).toISOString();
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// J1 — the policy table itself: connection faults retry on a 5s → 2x → 60s
|
|
12
|
+
// cap, and the planner advances the next attempt.
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
test('J1 policy table: connection faults use the shared retry schedule', () => {
|
|
15
|
+
assert.deepEqual(policyFor('connection'), {
|
|
16
|
+
kind: 'connection',
|
|
17
|
+
gate: 'online',
|
|
18
|
+
max: 8,
|
|
19
|
+
baseDelayMs: 5_000,
|
|
20
|
+
capDelayMs: 60_000,
|
|
21
|
+
fatal: false,
|
|
22
|
+
});
|
|
23
|
+
const plan = nextFaultRetry({
|
|
24
|
+
link: 'pi→provider',
|
|
25
|
+
op: 'generation turn',
|
|
26
|
+
kind: 'connection',
|
|
27
|
+
retry: { disposition: 'auto', by: 'daemon' },
|
|
28
|
+
message: 'Connection error.',
|
|
29
|
+
since: ISO(NOW),
|
|
30
|
+
logPath: '/tmp/crtr-fault.log',
|
|
31
|
+
}, NOW);
|
|
32
|
+
assert.equal(plan.attempt, 1, 'the first plan primes attempt 1');
|
|
33
|
+
assert.equal(plan.max, 8, 'connection max attempts stay at 8');
|
|
34
|
+
assert.equal(plan.nextAt, ISO(NOW + 5_000), 'connection starts at 5s');
|
|
35
|
+
assert.equal(plan.fault.retry.attempt, 1, 'planned marker carries the primed attempt');
|
|
36
|
+
assert.equal(plan.fault.retry.disposition, 'auto', 'planned marker stays auto');
|
|
37
|
+
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
// Tests for the <crtr-
|
|
2
|
-
// 1. Worker and orchestrator bearings carry the `<knowledge>`
|
|
3
|
-
// (substrate knowledge docs + node-local docs as a file tree).
|
|
1
|
+
// Tests for the <crtr-bearings> preamble:
|
|
2
|
+
// 1. Worker and orchestrator bearings carry the `<memory kind="knowledge">`
|
|
3
|
+
// block (substrate knowledge docs + node-local docs as a file tree).
|
|
4
4
|
// Orchestrators add the across-cycles framing; promotion delivers that
|
|
5
5
|
// same orchestrator context-dir framing to a node that spawned base.
|
|
6
6
|
// 2. canvas-context-intro injects the block as its own session message at
|
|
@@ -20,9 +20,14 @@ import { personaDrift } from '../runtime/persona.js';
|
|
|
20
20
|
import { memoryDir } from '../runtime/memory.js';
|
|
21
21
|
import registerCanvasContextIntro, { buildContextIntro, renderContextMessage, CONTEXT_INTRO_CUSTOM_TYPE, } from '../../pi-extensions/canvas-context-intro.js';
|
|
22
22
|
let home;
|
|
23
|
+
let prevAgentDir;
|
|
23
24
|
before(() => {
|
|
24
25
|
home = mkdtempSync(join(tmpdir(), 'crtr-ctxintro-'));
|
|
25
26
|
process.env['CRTR_HOME'] = home;
|
|
27
|
+
// Isolate pi's global agent dir to an empty path so buildProjectContextBlock
|
|
28
|
+
// can't pick up the dev machine's real ~/.pi/agent/AGENTS.md (hermeticity).
|
|
29
|
+
prevAgentDir = process.env['PI_CODING_AGENT_DIR'];
|
|
30
|
+
process.env['PI_CODING_AGENT_DIR'] = join(home, 'no-agent-dir');
|
|
26
31
|
});
|
|
27
32
|
beforeEach(() => {
|
|
28
33
|
closeDb();
|
|
@@ -33,6 +38,10 @@ after(() => {
|
|
|
33
38
|
rmSync(home, { recursive: true, force: true });
|
|
34
39
|
delete process.env['CRTR_HOME'];
|
|
35
40
|
delete process.env['CRTR_NODE_ID'];
|
|
41
|
+
if (prevAgentDir === undefined)
|
|
42
|
+
delete process.env['PI_CODING_AGENT_DIR'];
|
|
43
|
+
else
|
|
44
|
+
process.env['PI_CODING_AGENT_DIR'] = prevAgentDir;
|
|
36
45
|
});
|
|
37
46
|
test('worker bearings: base framing + <knowledge> block, NO across-cycles framing', () => {
|
|
38
47
|
// Bug-regression: review finding M1 — buildContextBearings renders the
|
|
@@ -44,23 +53,49 @@ test('worker bearings: base framing + <knowledge> block, NO across-cycles framin
|
|
|
44
53
|
mkdirSync(dir, { recursive: true });
|
|
45
54
|
writeFileSync(join(dir, 'test-ref.md'), '---\nkind: knowledge\nwhen-and-why-to-read: When testing, this reference should be read because it is a regression fixture\nsystem-prompt-visibility: preview\n---\nTest body.\n');
|
|
46
55
|
const block = buildContextIntro(meta.node_id);
|
|
47
|
-
assert.match(block,
|
|
56
|
+
assert.match(block, /<crtr-bearings>/, 'opens with the bearings section');
|
|
57
|
+
assert.ok(block.includes(contextDir(meta.node_id)), 'names the context-dir path inline (no dir= attribute)');
|
|
58
|
+
assert.doesNotMatch(block, /<crtr-context/, 'no legacy <crtr-context dir=…> wrapper');
|
|
59
|
+
assert.match(block, /## Your context directory/, 'context dir is its own markdown subsection');
|
|
48
60
|
assert.match(block, /shared document store, not a task tracker/, 'base = shared docs, not tasks');
|
|
49
|
-
//
|
|
50
|
-
|
|
61
|
+
// The catalog is a sibling <memory kind="knowledge"> block, never nested
|
|
62
|
+
// under anything dir-scoped.
|
|
63
|
+
assert.match(block, /<memory kind="knowledge">/, 'knowledge catalog present as a memory block');
|
|
51
64
|
// Per-store stanza headers (label · dir) never appear.
|
|
52
65
|
assert.doesNotMatch(block, /user-global · /, 'no user-global label·dir stanza');
|
|
53
66
|
assert.doesNotMatch(block, /node-local · /, 'no node-local label·dir stanza');
|
|
54
67
|
// No (empty) placeholder marker.
|
|
55
68
|
assert.doesNotMatch(block, /\(empty\)/, 'no (empty) placeholder');
|
|
56
|
-
assert.match(block, /<knowledge>/, '<knowledge> block present');
|
|
57
69
|
assert.match(block, /\nknowledge\n/, 'tree headed by the `knowledge` root label');
|
|
58
70
|
// The node-local preview-rung doc renders as a tree entry with a `# read when:`
|
|
59
71
|
// routing line (verbatim previewLine output).
|
|
60
72
|
assert.match(block, /test-ref {2}# read when: When testing, this reference should be read because it is a regression fixture\./, 'node-local preview doc renders its routing line');
|
|
73
|
+
assert.match(block, /<project_context>/, 'project_context now rides the bearings even without project files');
|
|
74
|
+
assert.match(block, /<environment cwd="\/tmp\/work">/, 'environment block is always present');
|
|
75
|
+
assert.match(block, /Directory listing: unavailable \(cwd missing or unreadable\)\./, 'missing cwd degrades the directory listing');
|
|
76
|
+
assert.match(block, /Git: not a git repository\./, 'missing cwd degrades git info');
|
|
61
77
|
// A terminal worker must NOT carry the orchestrator across-cycles framing.
|
|
62
78
|
assert.doesNotMatch(block, /refresh cycles/, 'no across-cycles framing for a terminal worker');
|
|
63
|
-
assert.match(block, /<\/crtr-
|
|
79
|
+
assert.match(block, /<\/crtr-bearings>/);
|
|
80
|
+
});
|
|
81
|
+
test('project instructions (AGENTS.md/CLAUDE.md) ride the bearings, not the system prompt', () => {
|
|
82
|
+
// pi's <project_context> is suppressed in the system prompt (broker.ts
|
|
83
|
+
// noContextFiles) and re-rendered into the first-message bearings here. The
|
|
84
|
+
// discovery walks the node cwd ancestry, so a CLAUDE.md in the node's cwd must
|
|
85
|
+
// surface inside a <project_context> block AFTER the <crtr-bearings> block.
|
|
86
|
+
const proj = mkdtempSync(join(tmpdir(), 'crtr-proj-'));
|
|
87
|
+
writeFileSync(join(proj, 'CLAUDE.md'), 'PROJECT_MARKER: build then commit.\n');
|
|
88
|
+
const meta = spawnNode({ kind: 'general', cwd: proj, parent: null });
|
|
89
|
+
const block = buildContextIntro(meta.node_id);
|
|
90
|
+
assert.match(block, /<project_context>/, 'project_context block present in the bearings');
|
|
91
|
+
assert.match(block, new RegExp(`<project_instructions path="${join(proj, 'CLAUDE.md')}">`), 'the project CLAUDE.md is rendered with its path');
|
|
92
|
+
assert.match(block, /PROJECT_MARKER: build then commit\./, 'project file content rides the message');
|
|
93
|
+
assert.match(block, /<environment cwd=".*crtr-proj-.*">/, 'environment block is appended inside project_context');
|
|
94
|
+
assert.match(block, /Directory:\n CLAUDE\.md\n/, 'environment block includes an ls-style listing');
|
|
95
|
+
assert.match(block, /Git: not a git repository\./, 'git snapshot degrades cleanly for a non-repo');
|
|
96
|
+
assert.match(block, /<environment[\s\S]*<\/environment>\n<\/project_context>$/, 'environment block closes project_context');
|
|
97
|
+
assert.ok(block.indexOf('</crtr-bearings>') < block.indexOf('<project_context>'), 'project_context follows the crtr-bearings block');
|
|
98
|
+
rmSync(proj, { recursive: true, force: true });
|
|
64
99
|
});
|
|
65
100
|
test('orchestrator bearings: across-cycles framing + node-local substrate docs ride into <knowledge>; a non-substrate .md file is never inlined', () => {
|
|
66
101
|
// Bug-regression: review finding M1 — buildContextBearings renders <knowledge>.
|
|
@@ -78,21 +113,20 @@ test('orchestrator bearings: across-cycles framing + node-local substrate docs r
|
|
|
78
113
|
const block = buildContextIntro(meta.node_id);
|
|
79
114
|
assert.match(block, /shared document store, not a task tracker/, 'still carries the base framing');
|
|
80
115
|
assert.match(block, /refresh cycles/, 'orchestrator gets the across-cycles framing');
|
|
81
|
-
assert.
|
|
82
|
-
assert.match(block, /<knowledge>/, 'knowledge block present');
|
|
116
|
+
assert.match(block, /<memory kind="knowledge">/, 'knowledge catalog present as a memory block');
|
|
83
117
|
assert.match(block, /flaky-build {2}# read when: When the build flakes, this reference should be read because the first run fails\./, 'node-local doc renders as a tree entry with its routing line');
|
|
84
118
|
// The non-substrate file never renders: no header line, no pointer line, no path.
|
|
85
119
|
assert.ok(!block.includes('# memory index'), 'the index header comment is NOT inlined');
|
|
86
120
|
assert.ok(!block.includes('- [Flaky build](flaky-build.md)'), 'index pointer lines are NOT inlined');
|
|
87
121
|
assert.ok(!block.includes(legacyIndexPath), 'no absolute index (MEMORY.md) path');
|
|
88
122
|
assert.ok(!block.includes('node-local · '), 'no label·dir stanza header');
|
|
89
|
-
assert.match(block, /<\/crtr-
|
|
123
|
+
assert.match(block, /<\/crtr-bearings>/);
|
|
90
124
|
});
|
|
91
125
|
test('orchestrator bearings: no per-store stanzas or (empty) markers; a rung-none node-local doc still surfaces as a bare-name tree entry', () => {
|
|
92
126
|
// Bug-regression: review findings M1 + M6 — the <knowledge> block carries no
|
|
93
127
|
// per-store `label · dir` stanzas or (empty) markers, and node-local docs are
|
|
94
128
|
// NOT filtered on rung: a migrated node-local doc defaults
|
|
95
|
-
// system-prompt-visibility: none and must still ride into
|
|
129
|
+
// system-prompt-visibility: none and must still ride into the knowledge memory block as
|
|
96
130
|
// its bare name (floored to the `name` rung; never its body).
|
|
97
131
|
const meta = spawnNode({ kind: 'general', cwd: '/tmp/work', parent: null });
|
|
98
132
|
promote(meta.node_id); // flip to orchestrator mode
|
|
@@ -147,7 +181,7 @@ test('session_start injects the block as the first message of an empty session',
|
|
|
147
181
|
assert.equal(pi.sent.length, 1, 'one message injected');
|
|
148
182
|
assert.equal(pi.sent[0].customType, CONTEXT_INTRO_CUSTOM_TYPE);
|
|
149
183
|
assert.equal(pi.sent[0].display, true);
|
|
150
|
-
assert.match(pi.sent[0].content, /<crtr-
|
|
184
|
+
assert.match(pi.sent[0].content, /<crtr-bearings>/);
|
|
151
185
|
});
|
|
152
186
|
test('session_start is idempotent across resume (skips if already in history)', () => {
|
|
153
187
|
const meta = spawnNode({ kind: 'general', cwd: '/tmp/work', parent: null });
|
|
@@ -177,7 +211,7 @@ test('renderer registered for the customType; collapsed hides body, ctrl+o expan
|
|
|
177
211
|
registerCanvasContextIntro(pi);
|
|
178
212
|
const renderer = pi.renderers[CONTEXT_INTRO_CUSTOM_TYPE];
|
|
179
213
|
assert.ok(renderer, 'message renderer registered for crtr-context');
|
|
180
|
-
const body = '<crtr-
|
|
214
|
+
const body = '<crtr-bearings>\nshared document store\n</crtr-bearings>';
|
|
181
215
|
const message = { customType: CONTEXT_INTRO_CUSTOM_TYPE, content: body };
|
|
182
216
|
const theme = {}; // no fg → plain text, easy to assert
|
|
183
217
|
// Collapsed (default): a single stub line, NONE of the body.
|
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
import { test, before, after, beforeEach } from 'node:test';
|
|
2
2
|
import assert from 'node:assert/strict';
|
|
3
|
-
import { mkdtempSync, rmSync } from 'node:fs';
|
|
3
|
+
import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
4
4
|
import { tmpdir } from 'node:os';
|
|
5
5
|
import { join } from 'node:path';
|
|
6
|
-
import { spawnSync } from 'node:child_process';
|
|
6
|
+
import { spawnSync, spawn } from 'node:child_process';
|
|
7
|
+
import { createServer } from 'node:net';
|
|
7
8
|
import { createNode, getNode, subscribe } from '../canvas/canvas.js';
|
|
8
9
|
import { closeDb } from '../canvas/db.js';
|
|
9
10
|
import { readInboxSince } from '../feed/inbox.js';
|
|
10
|
-
import { superviseTick } from '../../daemon/crtrd.js';
|
|
11
|
+
import { superviseTick, readPidfile } from '../../daemon/crtrd.js';
|
|
12
|
+
import { verifyDaemonStartup } from '../../daemon/manage.js';
|
|
13
|
+
import { waitForBrokerViewSocket } from '../runtime/placement.js';
|
|
14
|
+
import { viewSocketPath } from '../canvas/paths.js';
|
|
15
|
+
import { signBrandedHostArtifacts, brandedHostWorks } from '../runtime/branded-host.js';
|
|
11
16
|
import { markBusy, clearBusy } from '../runtime/busy.js';
|
|
12
17
|
let home;
|
|
13
18
|
function node(id, over = {}) {
|
|
@@ -104,13 +109,203 @@ test('a crashed booted child is revivable, not reaped, and raises no false boot-
|
|
|
104
109
|
assert.equal(readInboxSince('P2').length, 0, 'no false boot-failure / child-death push on a crash (wake relocated to push/close)');
|
|
105
110
|
clearBusy('C2');
|
|
106
111
|
});
|
|
107
|
-
//
|
|
108
|
-
//
|
|
109
|
-
test('
|
|
110
|
-
// No tmux_session/window → treated as an inline root and skipped entirely,
|
|
111
|
-
// which exercises the "no placement → not daemon-managed" guard rather than a
|
|
112
|
-
// false reap. (We avoid depending on a real live tmux window in the test env.)
|
|
112
|
+
// An unplaced active node is not daemon-managed; the daemon leaves it untouched
|
|
113
|
+
// rather than treating the missing broker/session fields as a boot failure.
|
|
114
|
+
test('an unplaced active node is left alone before it boots', async () => {
|
|
113
115
|
createNode(node('S', { status: 'active', pi_session_id: null }));
|
|
114
116
|
await superviseTick();
|
|
115
117
|
assert.equal(getNode('S').status, 'active', 'unplaced active node is not reaped');
|
|
116
118
|
});
|
|
119
|
+
// Major-4: a correctly-dormant idle-release node whose recorded pid was cleared
|
|
120
|
+
// to null by boot reconciliation must NOT be spuriously revived. Its pi_pid is
|
|
121
|
+
// null and pi_session_id is set, so the pid-null branch would otherwise read it
|
|
122
|
+
// as a "stranded relaunch" and grace-revive it — even though it freed itself on
|
|
123
|
+
// purpose and has no unseen inbox. The pid-null branch must honor idle-release
|
|
124
|
+
// dormancy the same way the dead-pid branch does: leave it idle; only the second
|
|
125
|
+
// pass wakes it, and only on an unseen inbox entry.
|
|
126
|
+
test('idle-release node with a boot-cleared (null) pid and no unseen inbox stays dormant', async () => {
|
|
127
|
+
createNode(node('D', {
|
|
128
|
+
status: 'idle',
|
|
129
|
+
intent: 'idle-release',
|
|
130
|
+
pi_pid: null, // cleared by boot reconciliation
|
|
131
|
+
pi_session_id: '019e8f00-freed-while-dormant', // set → would look like a stranded relaunch
|
|
132
|
+
}));
|
|
133
|
+
const t0 = Date.now();
|
|
134
|
+
await superviseTick(t0); // first observation
|
|
135
|
+
await superviseTick(t0 + 60_000); // well past the boot grace
|
|
136
|
+
const after = getNode('D');
|
|
137
|
+
assert.equal(after.status, 'idle', 'dormant idle-release node is left idle, not revived');
|
|
138
|
+
assert.equal(after.intent, 'idle-release', 'intent unchanged — no revive fired');
|
|
139
|
+
assert.equal(after.pi_pid, null, 'no fresh pid — reviveNode was never invoked');
|
|
140
|
+
});
|
|
141
|
+
// Daemon start guard: spawnDaemon must not report success before the daemon is
|
|
142
|
+
// plausibly alive and has written its pidfile. This is a pure bounded poll over
|
|
143
|
+
// injected clocks/probes, so we can lock it down deterministically without a
|
|
144
|
+
// real daemon process.
|
|
145
|
+
test('verifyDaemonStartup waits for pidfile + live pid, then reports success for the spawned pid', async () => {
|
|
146
|
+
let now = 0;
|
|
147
|
+
let pidfileReady = false;
|
|
148
|
+
let pidAliveReady = false;
|
|
149
|
+
let slept = 0;
|
|
150
|
+
const existingPid = await verifyDaemonStartup(42, 50, {
|
|
151
|
+
now: () => now,
|
|
152
|
+
readPidfile: () => (pidfileReady ? 42 : null),
|
|
153
|
+
isPidAlive: () => pidAliveReady,
|
|
154
|
+
sleepMs: (ms) => {
|
|
155
|
+
slept += ms;
|
|
156
|
+
now += ms;
|
|
157
|
+
if (now >= 20)
|
|
158
|
+
pidfileReady = true;
|
|
159
|
+
if (now >= 30)
|
|
160
|
+
pidAliveReady = true;
|
|
161
|
+
},
|
|
162
|
+
});
|
|
163
|
+
assert.equal(existingPid, null, 'the spawned daemon owns the pidfile when startup succeeds');
|
|
164
|
+
assert.equal(pidfileReady, true, 'pidfile must have appeared before success');
|
|
165
|
+
assert.equal(pidAliveReady, true, 'pid must have been alive before success');
|
|
166
|
+
assert.equal(slept > 0, true, 'the guard must actually poll');
|
|
167
|
+
});
|
|
168
|
+
// Regression for the cold-guest recreate blocker: the production startup window
|
|
169
|
+
// must tolerate a slower cold start than the old 500ms bound.
|
|
170
|
+
test('verifyDaemonStartup default window tolerates a slower cold start', async () => {
|
|
171
|
+
let now = 0;
|
|
172
|
+
let pidfileReady = false;
|
|
173
|
+
let pidAliveReady = false;
|
|
174
|
+
const existingPid = await verifyDaemonStartup(42, undefined, {
|
|
175
|
+
now: () => now,
|
|
176
|
+
readPidfile: () => (pidfileReady ? 42 : null),
|
|
177
|
+
isPidAlive: () => pidAliveReady,
|
|
178
|
+
sleepMs: (ms) => {
|
|
179
|
+
now += ms;
|
|
180
|
+
if (now >= 600)
|
|
181
|
+
pidfileReady = true;
|
|
182
|
+
if (now >= 700)
|
|
183
|
+
pidAliveReady = true;
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
assert.equal(existingPid, null, 'the production startup window must allow a cold guest to settle');
|
|
187
|
+
});
|
|
188
|
+
// A concurrent start race is success when another live daemon already owns the
|
|
189
|
+
// pidfile; the loser must return that existing pid instead of timing out.
|
|
190
|
+
test('verifyDaemonStartup returns the existing live daemon when another pid won the startup race', async () => {
|
|
191
|
+
let now = 0;
|
|
192
|
+
let slept = 0;
|
|
193
|
+
const existingPid = await verifyDaemonStartup(42, 50, {
|
|
194
|
+
now: () => now,
|
|
195
|
+
readPidfile: () => 7,
|
|
196
|
+
isPidAlive: (pid) => pid === 7,
|
|
197
|
+
sleepMs: (ms) => {
|
|
198
|
+
slept += ms;
|
|
199
|
+
now += ms;
|
|
200
|
+
},
|
|
201
|
+
});
|
|
202
|
+
assert.equal(existingPid, 7, 'the live pidfile owner must be reported back');
|
|
203
|
+
assert.equal(slept, 0, 'no polling is needed once another live daemon is visible');
|
|
204
|
+
});
|
|
205
|
+
// The guard stays bounded: if the daemon never becomes ready, it throws instead
|
|
206
|
+
// of claiming "started" forever.
|
|
207
|
+
test('verifyDaemonStartup throws after its tiny startup window expires', async () => {
|
|
208
|
+
let now = 0;
|
|
209
|
+
await assert.rejects(async () => verifyDaemonStartup(99, 25, {
|
|
210
|
+
now: () => now,
|
|
211
|
+
readPidfile: () => null,
|
|
212
|
+
isPidAlive: () => false,
|
|
213
|
+
sleepMs: (ms) => {
|
|
214
|
+
now += ms;
|
|
215
|
+
},
|
|
216
|
+
}), /did not become ready within 25ms/);
|
|
217
|
+
});
|
|
218
|
+
// REGRESSION (bug #102): the verifier polls with a real async sleep, NOT a
|
|
219
|
+
// synchronous Atomics.wait, so the event loop stays free to dispatch the spawned
|
|
220
|
+
// child's `exit` event. We spawn a REAL child that exits immediately and let the
|
|
221
|
+
// real wall clock + real setTimeout sleep drive the loop: the exit event fires
|
|
222
|
+
// mid-wait, childExited() flips non-null, and the verifier fails fast with the
|
|
223
|
+
// exit reason — well inside the 2s window. If the loop blocked the event loop
|
|
224
|
+
// (the old bug), the exit event would never fire and this would time out with the
|
|
225
|
+
// generic message instead.
|
|
226
|
+
test('verifyDaemonStartup throws when the spawned daemon exits before it can become ready', async () => {
|
|
227
|
+
let exited = null;
|
|
228
|
+
const child = spawn(process.execPath, ['-e', 'process.exit(1)'], { stdio: 'ignore' });
|
|
229
|
+
child.once('exit', (code, signal) => {
|
|
230
|
+
exited = { code, signal };
|
|
231
|
+
});
|
|
232
|
+
const started = Date.now();
|
|
233
|
+
await assert.rejects(async () => verifyDaemonStartup(77, 2_000, {
|
|
234
|
+
readPidfile: () => null,
|
|
235
|
+
isPidAlive: () => false,
|
|
236
|
+
childExited: () => exited,
|
|
237
|
+
}), /exited before becoming ready \(with exit code 1\)/);
|
|
238
|
+
assert.ok(Date.now() - started < 1_500, 'must fail fast on the real child exit, not run out the window');
|
|
239
|
+
});
|
|
240
|
+
test('the daemon honours an explicit CRTR_PIDFILE override', () => {
|
|
241
|
+
const home = mkdtempSync(join(tmpdir(), 'crtr-pidfile-home-'));
|
|
242
|
+
const pidfile = join(home, 'crtrd.pid');
|
|
243
|
+
const prevHome = process.env['CRTR_HOME'];
|
|
244
|
+
const prevPidfile = process.env['CRTR_PIDFILE'];
|
|
245
|
+
process.env['CRTR_HOME'] = mkdtempSync(join(tmpdir(), 'crtr-home-'));
|
|
246
|
+
process.env['CRTR_PIDFILE'] = pidfile;
|
|
247
|
+
writeFileSync(pidfile, '321');
|
|
248
|
+
try {
|
|
249
|
+
assert.equal(readPidfile(), 321, 'the daemon must read its pidfile from CRTR_PIDFILE, not CRTR_HOME');
|
|
250
|
+
}
|
|
251
|
+
finally {
|
|
252
|
+
if (prevHome === undefined)
|
|
253
|
+
delete process.env['CRTR_HOME'];
|
|
254
|
+
else
|
|
255
|
+
process.env['CRTR_HOME'] = prevHome;
|
|
256
|
+
if (prevPidfile === undefined)
|
|
257
|
+
delete process.env['CRTR_PIDFILE'];
|
|
258
|
+
else
|
|
259
|
+
process.env['CRTR_PIDFILE'] = prevPidfile;
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
// REGRESSION (bug #102 follow-up): with NO exit promise, the readiness loop must
|
|
263
|
+
// still observe a real `connect`. A buggy `?? Promise.resolve('retry')` race lost
|
|
264
|
+
// to the probe instantly, so live-broker callers (focus on an already-alive node,
|
|
265
|
+
// canvas-tmux-spread) could never return true and stalled the full 30s deadline.
|
|
266
|
+
test('waitForBrokerViewSocket returns true on a live socket when given no exit promise', async () => {
|
|
267
|
+
// CRTR_SOCK_DIR override keeps the AF_UNIX path short — the temp CRTR_HOME path
|
|
268
|
+
// would blow past macOS's 104-byte sun_path limit (listen EINVAL).
|
|
269
|
+
const sockDir = mkdtempSync('/tmp/crtr-sock-');
|
|
270
|
+
process.env['CRTR_SOCK_DIR'] = sockDir;
|
|
271
|
+
const nodeId = 'lb';
|
|
272
|
+
const sockPath = viewSocketPath(nodeId);
|
|
273
|
+
const server = createServer();
|
|
274
|
+
await new Promise((resolve) => server.listen(sockPath, () => resolve()));
|
|
275
|
+
try {
|
|
276
|
+
const started = Date.now();
|
|
277
|
+
const ready = await waitForBrokerViewSocket(nodeId);
|
|
278
|
+
assert.equal(ready, true, 'a live accepting socket must report ready even without an exit promise');
|
|
279
|
+
assert.ok(Date.now() - started < 1_000, 'readiness must resolve promptly, not stall the full deadline');
|
|
280
|
+
}
|
|
281
|
+
finally {
|
|
282
|
+
await new Promise((resolve) => server.close(() => resolve()));
|
|
283
|
+
delete process.env['CRTR_SOCK_DIR'];
|
|
284
|
+
rmSync(sockDir, { recursive: true, force: true });
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
test('waitForBrokerViewSocket returns false as soon as the real broker process exits', async () => {
|
|
288
|
+
const child = spawn(process.execPath, ['-e', 'process.exit(1)'], { stdio: 'ignore' });
|
|
289
|
+
const exited = new Promise((resolve) => {
|
|
290
|
+
child.once('exit', (code, signal) => {
|
|
291
|
+
resolve({ code, signal });
|
|
292
|
+
});
|
|
293
|
+
});
|
|
294
|
+
const started = Date.now();
|
|
295
|
+
const ready = await waitForBrokerViewSocket('dead-broker-for-readiness-test', exited);
|
|
296
|
+
assert.equal(ready, false, 'an exited broker must fail readiness');
|
|
297
|
+
assert.ok(Date.now() - started < 1000, 'the readiness guard must fail fast instead of waiting for the socket deadline');
|
|
298
|
+
});
|
|
299
|
+
test('signBrandedHostArtifacts signs the copied libnode before the branded binary', () => {
|
|
300
|
+
const signed = [];
|
|
301
|
+
signBrandedHostArtifacts('/tmp/crouter', '/tmp/libnode.dylib', (path) => signed.push(path));
|
|
302
|
+
assert.deepEqual(signed, ['/tmp/libnode.dylib', '/tmp/crouter']);
|
|
303
|
+
});
|
|
304
|
+
test('brandedHostWorks health-checks if a binary is executable', () => {
|
|
305
|
+
// Issue #102: the branded host binary can be corrupted or killed by macOS
|
|
306
|
+
// before exec, causing spawn() to fail silently. The health-check detects this.
|
|
307
|
+
const goodBin = process.execPath; // a real, executable binary
|
|
308
|
+
const badBin = '/nonexistent/crouter-broken';
|
|
309
|
+
assert.equal(brandedHostWorks(goodBin), true, 'health-check passes for a real executable binary');
|
|
310
|
+
assert.equal(brandedHostWorks(badBin), false, 'health-check fails for a nonexistent binary');
|
|
311
|
+
});
|