@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,258 +0,0 @@
|
|
|
1
|
-
// Bug-regression test for the crtr TUI Draw style encoding.
|
|
2
|
-
//
|
|
3
|
-
// Observed bug (canvas + linkedin views, 2026-06-07): view code set Style.fg to a
|
|
4
|
-
// color NAME ('green'/'cyan'/'red') instead of an SGR parameter ('32'/'36'/'31').
|
|
5
|
-
// With color ON, styleSpan emitted `\x1b[greenm` — an invalid CSI the terminal
|
|
6
|
-
// eats as a control op, printing the tail ('reenm') as literal garbage. The
|
|
7
|
-
// monitor's status glyphs/flags rendered as garbage on any color terminal (the
|
|
8
|
-
// non-TTY/NO_COLOR path was unaffected because fg is gated behind `color`).
|
|
9
|
-
//
|
|
10
|
-
// Root-cause fix: styleSpan now only emits fg/bg when the value is a valid SGR
|
|
11
|
-
// parameter string (digits + semicolons); a bad value degrades to no-color
|
|
12
|
-
// instead of emitting a broken escape. These tests lock that guarantee.
|
|
13
|
-
//
|
|
14
|
-
// Run: node --import tsx/esm --test src/core/__tests__/draw-style.test.ts
|
|
15
|
-
import { test, describe } from 'node:test';
|
|
16
|
-
import assert from 'node:assert/strict';
|
|
17
|
-
import { styleSpan, isSgrParams, createDraw } from '../tui/draw.js';
|
|
18
|
-
import { drawChrome } from '../tui/host.js';
|
|
19
|
-
const ESC = '\x1b[';
|
|
20
|
-
const ON = { color: true, color256: true };
|
|
21
|
-
const OFF = { color: false, color256: false };
|
|
22
|
-
const SIZE = { cols: 80, rows: 24 };
|
|
23
|
-
/** Strip the harmless framing CSIs the serializer emits (cursor home / clear),
|
|
24
|
-
* so any REMAINING `\x1b[` not followed by an SGR param digit/semicolon is a
|
|
25
|
-
* broken SGR escape — the exact bug class (`\x1b[greenm`). */
|
|
26
|
-
function hasInvalidCsi(frame) {
|
|
27
|
-
const stripped = frame.replace(/\x1b\[[HJK]/g, '').replace(/[\r\n]/g, '');
|
|
28
|
-
return /\x1b\[[^0-9;]/.test(stripped);
|
|
29
|
-
}
|
|
30
|
-
/** Any 8-bit color SGR (fg 30-37/90-97, or 256-color bg) present in the frame. */
|
|
31
|
-
function hasColorSgr(frame) {
|
|
32
|
-
return /\x1b\[(3[0-9]|9[0-7])m/.test(frame) || /\x1b\[48;5;/.test(frame);
|
|
33
|
-
}
|
|
34
|
-
function baseChrome(over = {}) {
|
|
35
|
-
return { status: null, banner: null, busy: false, loaded: true, lastRefresh: Date.now(), tick: 0, subtitle: null, mode: null, ...over };
|
|
36
|
-
}
|
|
37
|
-
const MANIFEST = {
|
|
38
|
-
title: 'Test View', subtitle: '3 unread',
|
|
39
|
-
keymap: [
|
|
40
|
-
{ keys: 'j/k', label: 'move' }, { keys: 'enter', label: 'open' },
|
|
41
|
-
{ keys: 'r', label: 'reply' }, { keys: 'g', label: 'refresh' }, { keys: 'q', label: 'quit' },
|
|
42
|
-
],
|
|
43
|
-
};
|
|
44
|
-
describe('styleSpan: SGR encoding (bug-regression)', () => {
|
|
45
|
-
test('a valid numeric fg emits a well-formed CSI', () => {
|
|
46
|
-
const out = styleSpan('●', { fg: '32', bold: true }, true, '');
|
|
47
|
-
assert.ok(out.includes(`${ESC}32m`), 'should contain \\x1b[32m');
|
|
48
|
-
assert.ok(out.includes(`${ESC}1m`), 'bold still emitted');
|
|
49
|
-
});
|
|
50
|
-
test('a color NAME fg degrades to no-color — never emits a broken escape', () => {
|
|
51
|
-
const out = styleSpan('●', { fg: 'green' }, true, '');
|
|
52
|
-
// The bug: \x1b[greenm. Assert no CSI is followed by a non-digit/semicolon.
|
|
53
|
-
assert.ok(!/\x1b\[[^0-9;]/.test(out), 'no invalid CSI introducer');
|
|
54
|
-
assert.ok(!out.includes('green'), 'the bad token never leaks into output');
|
|
55
|
-
});
|
|
56
|
-
test('a color NAME bg degrades to no-color', () => {
|
|
57
|
-
const out = styleSpan('x', { bg: 'red' }, true, '');
|
|
58
|
-
assert.ok(!/\x1b\[[^0-9;]/.test(out), 'no invalid CSI introducer');
|
|
59
|
-
assert.ok(!out.includes('red'), 'the bad token never leaks into output');
|
|
60
|
-
});
|
|
61
|
-
test('a valid 256-color bg index emits 48;5;N', () => {
|
|
62
|
-
const out = styleSpan('x', { bg: '236' }, true, '');
|
|
63
|
-
assert.ok(out.includes(`${ESC}48;5;236m`), 'should contain \\x1b[48;5;236m');
|
|
64
|
-
});
|
|
65
|
-
test('compound SGR params (e.g. "1;36") are valid', () => {
|
|
66
|
-
assert.equal(isSgrParams('1;36'), true);
|
|
67
|
-
assert.equal(isSgrParams('236'), true);
|
|
68
|
-
assert.equal(isSgrParams('green'), false);
|
|
69
|
-
assert.equal(isSgrParams(''), false);
|
|
70
|
-
});
|
|
71
|
-
test('structural styles (bold/dim/reverse) are unaffected by color gating', () => {
|
|
72
|
-
const out = styleSpan('x', { fg: 'green', dim: true }, true, '');
|
|
73
|
-
assert.ok(out.includes(`${ESC}2m`), 'dim still emitted even when fg is rejected');
|
|
74
|
-
});
|
|
75
|
-
});
|
|
76
|
-
// ── New Draw primitives — same bug class (no invalid CSI; bad value degrades) ──
|
|
77
|
-
describe('spansRight: SGR encoding (bug-regression)', () => {
|
|
78
|
-
test('valid numeric fg → well-formed CSI, no broken escape', () => {
|
|
79
|
-
const { draw, frame } = createDraw(SIZE, ON);
|
|
80
|
-
draw.spansRight(0, 80, [{ text: 'ready', style: { fg: '32', bold: true } }]);
|
|
81
|
-
const f = frame();
|
|
82
|
-
assert.ok(f.includes(`${ESC}32m`), 'emits \\x1b[32m');
|
|
83
|
-
assert.ok(!hasInvalidCsi(f), 'no invalid CSI');
|
|
84
|
-
});
|
|
85
|
-
test('a color NAME fg degrades — no broken escape, name not leaked', () => {
|
|
86
|
-
const { draw, frame } = createDraw(SIZE, ON);
|
|
87
|
-
draw.spansRight(0, 80, [{ text: 'x', style: { fg: 'green' } }]);
|
|
88
|
-
const f = frame();
|
|
89
|
-
assert.ok(!hasInvalidCsi(f), 'no invalid CSI introducer');
|
|
90
|
-
assert.ok(!f.includes('green'), 'the bad token never leaks');
|
|
91
|
-
});
|
|
92
|
-
test('over-maxWidth groups left-clip with a leading … (no overflow, no garbage)', () => {
|
|
93
|
-
const { draw, frame } = createDraw(SIZE, ON);
|
|
94
|
-
draw.spansRight(0, 80, [{ text: 'abcdefghij', style: { dim: true } }], 4);
|
|
95
|
-
const f = frame();
|
|
96
|
-
assert.ok(f.includes('…'), 'leading ellipsis present');
|
|
97
|
-
assert.ok(!hasInvalidCsi(f), 'no invalid CSI');
|
|
98
|
-
});
|
|
99
|
-
});
|
|
100
|
-
describe('vline: SGR encoding + mono fallback (bug-regression)', () => {
|
|
101
|
-
test('renders a dim rule with no invalid CSI (color on)', () => {
|
|
102
|
-
const { draw, frame } = createDraw(SIZE, ON);
|
|
103
|
-
draw.vline(40, 0, 10);
|
|
104
|
-
const f = frame();
|
|
105
|
-
assert.ok(f.includes('│'), 'default │ glyph present');
|
|
106
|
-
assert.ok(f.includes(`${ESC}2m`), 'dim emitted');
|
|
107
|
-
assert.ok(!hasInvalidCsi(f), 'no invalid CSI');
|
|
108
|
-
});
|
|
109
|
-
test('ASCII fallback ch and mono caps both stay well-formed', () => {
|
|
110
|
-
const { draw, frame } = createDraw(SIZE, OFF);
|
|
111
|
-
draw.vline(40, 0, 10, '|');
|
|
112
|
-
const f = frame();
|
|
113
|
-
assert.ok(f.includes('|'), 'ASCII fallback | present');
|
|
114
|
-
assert.ok(!hasColorSgr(f), 'no color SGR when caps.color is off');
|
|
115
|
-
assert.ok(!hasInvalidCsi(f), 'no invalid CSI');
|
|
116
|
-
});
|
|
117
|
-
});
|
|
118
|
-
describe('ListItemRow.right: SGR encoding (bug-regression)', () => {
|
|
119
|
-
test('right group + cursor-row base merge → no invalid CSI', () => {
|
|
120
|
-
const { draw, frame } = createDraw(SIZE, ON);
|
|
121
|
-
/** @type {ListItemRow[]} */
|
|
122
|
-
const items = [
|
|
123
|
-
{ spans: [{ text: 'Ada Lovelace', style: { bold: true } }], right: [{ text: '2h', style: { fg: '90' } }] },
|
|
124
|
-
{ spans: [{ text: 'Grace Hopper' }], right: [{ text: '4h', style: { fg: '90' } }] },
|
|
125
|
-
];
|
|
126
|
-
const res = draw.list({ row: 2, col: 0, width: 80, height: 5 }, items, 0, 0);
|
|
127
|
-
const f = frame();
|
|
128
|
-
assert.equal(res.scroll, 0);
|
|
129
|
-
assert.ok(f.includes('2h') && f.includes('4h'), 'right-flushed timestamps drawn');
|
|
130
|
-
assert.ok(f.includes(`${ESC}48;5;236m`), 'cursor-row 236-bg highlight present');
|
|
131
|
-
assert.ok(!hasInvalidCsi(f), 'no invalid CSI');
|
|
132
|
-
});
|
|
133
|
-
test('a color NAME fg in the right group degrades, not leaks', () => {
|
|
134
|
-
const { draw, frame } = createDraw(SIZE, ON);
|
|
135
|
-
const items = [{ spans: [{ text: 'x' }], right: [{ text: 'y', style: { fg: 'cyan' } }] }];
|
|
136
|
-
draw.list({ row: 0, col: 0, width: 80, height: 2 }, items, 0, 0);
|
|
137
|
-
const f = frame();
|
|
138
|
-
assert.ok(!hasInvalidCsi(f), 'no invalid CSI');
|
|
139
|
-
assert.ok(!f.includes('cyan'), 'the bad token never leaks');
|
|
140
|
-
});
|
|
141
|
-
});
|
|
142
|
-
// ── Chrome — every new element survives the bug class + has a mono fallback ──
|
|
143
|
-
describe('drawChrome: SGR encoding + mono fallback (bug-regression)', () => {
|
|
144
|
-
const states = [
|
|
145
|
-
['working', baseChrome({ busy: true, status: 'Loading…' })],
|
|
146
|
-
['blocked', baseChrome({ banner: { msg: 'Send rejected', level: 'error' } })],
|
|
147
|
-
['attention', baseChrome({ banner: { msg: 'Log in, then press r', level: 'action' } })],
|
|
148
|
-
['ready', baseChrome({ status: '5 conversations' })],
|
|
149
|
-
['idle', baseChrome({ loaded: false, lastRefresh: 0 })],
|
|
150
|
-
['info-banner', baseChrome({ banner: { msg: 'Throttling — waiting', level: 'info' } })],
|
|
151
|
-
];
|
|
152
|
-
for (const [name, chrome] of states) {
|
|
153
|
-
test(`state "${name}" never emits a broken escape (color on)`, () => {
|
|
154
|
-
const { draw, frame } = createDraw(SIZE, ON);
|
|
155
|
-
drawChrome(draw, SIZE, MANIFEST, chrome);
|
|
156
|
-
assert.ok(!hasInvalidCsi(frame()), 'no invalid CSI');
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
test('mono fallback: no color SGR when caps.color is off, glyphs/words still render', () => {
|
|
160
|
-
const { draw, frame } = createDraw(SIZE, OFF);
|
|
161
|
-
drawChrome(draw, SIZE, MANIFEST, baseChrome({ busy: true, status: 'Loading…' }));
|
|
162
|
-
const f = frame();
|
|
163
|
-
assert.ok(!hasColorSgr(f), 'no color SGR emitted in mono');
|
|
164
|
-
assert.ok(f.includes('▎'), 'state rail glyph always drawn');
|
|
165
|
-
assert.ok(f.includes('working'), 'state WORD carries meaning in mono');
|
|
166
|
-
assert.ok(f.includes(`${ESC}1m`), 'structural bold still emitted');
|
|
167
|
-
assert.ok(!hasInvalidCsi(f), 'no invalid CSI');
|
|
168
|
-
});
|
|
169
|
-
test('every banner level renders its glyph with no broken escape', () => {
|
|
170
|
-
for (const [level, glyph] of [['info', 'ℹ'], ['action', '▸'], ['error', '✗']]) {
|
|
171
|
-
const { draw, frame } = createDraw(SIZE, ON);
|
|
172
|
-
drawChrome(draw, SIZE, MANIFEST, baseChrome({ banner: { msg: 'm', level } }));
|
|
173
|
-
const f = frame();
|
|
174
|
-
assert.ok(f.includes(glyph), `${level} banner glyph ${glyph} present`);
|
|
175
|
-
assert.ok(!hasInvalidCsi(f), `${level} banner: no invalid CSI`);
|
|
176
|
-
}
|
|
177
|
-
});
|
|
178
|
-
test('keymap overflow degrades to keys-only on a narrow screen, still well-formed', () => {
|
|
179
|
-
const narrow = { cols: 28, rows: 24 };
|
|
180
|
-
const { draw, frame } = createDraw(narrow, ON);
|
|
181
|
-
drawChrome(draw, narrow, MANIFEST, baseChrome({ status: 'a very long status line here' }));
|
|
182
|
-
const f = frame();
|
|
183
|
-
assert.ok(f.includes('q'), 'q quit hint survives overflow');
|
|
184
|
-
assert.ok(!hasInvalidCsi(f), 'no invalid CSI under overflow');
|
|
185
|
-
});
|
|
186
|
-
});
|
|
187
|
-
// ── Dynamic subtitle (host.setSubtitle) — same bug class + mono fallback ──
|
|
188
|
-
describe('drawChrome subtitle: SGR encoding + mono fallback (bug-regression)', () => {
|
|
189
|
-
test('a dynamic subtitle overrides manifest.subtitle, dim, no broken escape', () => {
|
|
190
|
-
const { draw, frame } = createDraw(SIZE, ON);
|
|
191
|
-
drawChrome(draw, SIZE, MANIFEST, baseChrome({ subtitle: '7 unread' }));
|
|
192
|
-
const f = frame();
|
|
193
|
-
assert.ok(f.includes('7 unread'), 'dynamic subtitle rendered');
|
|
194
|
-
assert.ok(!f.includes('3 unread'), 'dynamic value overrides the static manifest subtitle');
|
|
195
|
-
assert.ok(f.includes(`${ESC}2m`), 'subtitle is dim (structural)');
|
|
196
|
-
assert.ok(!hasInvalidCsi(f), 'no invalid CSI');
|
|
197
|
-
});
|
|
198
|
-
test('null subtitle falls back to the manifest default', () => {
|
|
199
|
-
const { draw, frame } = createDraw(SIZE, ON);
|
|
200
|
-
drawChrome(draw, SIZE, MANIFEST, baseChrome({ subtitle: null }));
|
|
201
|
-
const f = frame();
|
|
202
|
-
assert.ok(f.includes('3 unread'), 'manifest.subtitle shown when dynamic is null');
|
|
203
|
-
assert.ok(!hasInvalidCsi(f), 'no invalid CSI');
|
|
204
|
-
});
|
|
205
|
-
test('mono fallback: subtitle text renders dim with no color SGR', () => {
|
|
206
|
-
const { draw, frame } = createDraw(SIZE, OFF);
|
|
207
|
-
drawChrome(draw, SIZE, MANIFEST, baseChrome({ subtitle: '7 unread' }));
|
|
208
|
-
const f = frame();
|
|
209
|
-
assert.ok(f.includes('7 unread'), 'subtitle text still renders in mono');
|
|
210
|
-
assert.ok(!hasColorSgr(f), 'no color SGR emitted for the subtitle in mono');
|
|
211
|
-
assert.ok(!hasInvalidCsi(f), 'no invalid CSI');
|
|
212
|
-
});
|
|
213
|
-
});
|
|
214
|
-
// ── Mode chip (host.setMode) — same bug class, mono fallback, precedence ──
|
|
215
|
-
describe('drawChrome mode chip: SGR encoding + mono fallback (bug-regression)', () => {
|
|
216
|
-
test('compose mode → ✎ compose in yellow (33), no broken escape', () => {
|
|
217
|
-
const { draw, frame } = createDraw(SIZE, ON);
|
|
218
|
-
drawChrome(draw, SIZE, MANIFEST, baseChrome({ mode: 'compose' }));
|
|
219
|
-
const f = frame();
|
|
220
|
-
assert.ok(f.includes('✎') && f.includes('compose'), 'mode glyph + word present');
|
|
221
|
-
assert.ok(f.includes(`${ESC}33m`), 'compose-accent yellow 33 emitted');
|
|
222
|
-
assert.ok(!hasInvalidCsi(f), 'no invalid CSI');
|
|
223
|
-
});
|
|
224
|
-
test('react mode → ☺ react reuses the compose-accent yellow (33)', () => {
|
|
225
|
-
const { draw, frame } = createDraw(SIZE, ON);
|
|
226
|
-
drawChrome(draw, SIZE, MANIFEST, baseChrome({ mode: 'react' }));
|
|
227
|
-
const f = frame();
|
|
228
|
-
assert.ok(f.includes('☺') && f.includes('react'), 'react glyph + word present');
|
|
229
|
-
assert.ok(f.includes(`${ESC}33m`), 'react reuses yellow 33');
|
|
230
|
-
assert.ok(!hasInvalidCsi(f), 'no invalid CSI');
|
|
231
|
-
});
|
|
232
|
-
test('mono fallback: mode chip is glyph + bold word, no color SGR', () => {
|
|
233
|
-
const { draw, frame } = createDraw(SIZE, OFF);
|
|
234
|
-
drawChrome(draw, SIZE, MANIFEST, baseChrome({ mode: 'compose' }));
|
|
235
|
-
const f = frame();
|
|
236
|
-
assert.ok(f.includes('✎'), 'glyph carries the mode in mono');
|
|
237
|
-
assert.ok(f.includes('compose'), 'mode word carries meaning in mono');
|
|
238
|
-
assert.ok(f.includes(`${ESC}1m`), 'bold still emitted (mono carrier)');
|
|
239
|
-
assert.ok(!hasColorSgr(f), 'no color SGR emitted in mono');
|
|
240
|
-
assert.ok(!hasInvalidCsi(f), 'no invalid CSI');
|
|
241
|
-
});
|
|
242
|
-
test('precedence: an explicit mode WINS the chip over the derived busy/working state', () => {
|
|
243
|
-
const { draw, frame } = createDraw(SIZE, ON);
|
|
244
|
-
// busy would derive `working`; the explicit mode must override it.
|
|
245
|
-
drawChrome(draw, SIZE, MANIFEST, baseChrome({ busy: true, mode: 'compose' }));
|
|
246
|
-
const f = frame();
|
|
247
|
-
assert.ok(f.includes('compose'), 'mode word shown');
|
|
248
|
-
assert.ok(!f.includes('working'), 'derived working chip suppressed by the mode override');
|
|
249
|
-
assert.ok(!hasInvalidCsi(f), 'no invalid CSI');
|
|
250
|
-
});
|
|
251
|
-
test('null mode returns to the derived chip (ready when loaded)', () => {
|
|
252
|
-
const { draw, frame } = createDraw(SIZE, ON);
|
|
253
|
-
drawChrome(draw, SIZE, MANIFEST, baseChrome({ mode: null }));
|
|
254
|
-
const f = frame();
|
|
255
|
-
assert.ok(f.includes('ready'), 'derived ready chip shown when no mode set');
|
|
256
|
-
assert.ok(!hasInvalidCsi(f), 'no invalid CSI');
|
|
257
|
-
});
|
|
258
|
-
});
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
// Run with: node --import tsx/esm --test src/core/__tests__/error-stall-recycle.test.ts
|
|
2
|
-
//
|
|
3
|
-
// BUG-REGRESSION (§I error-stall; gh issue #4 — node mqaeqzdu-0746b3b7, a 9h
|
|
4
|
-
// zombie). A provider outage exhausted the engine's SDK retry budget mid-task:
|
|
5
|
-
// pi appended trailing stopReason:'error' assistant messages to the session
|
|
6
|
-
// .jsonl and PARKED (the stophook's agent_end returns early on 'error' — "stay
|
|
7
|
-
// alive for re-steering"). A headless node has no human to re-steer it, so the
|
|
8
|
-
// broker stayed alive, status stayed 'active', and the daemon's pid-only
|
|
9
|
-
// liveness check read it healthy for 9 hours while its parent believed it was
|
|
10
|
-
// working. The daemon is the authority: a live, not-busy, intent-null engine
|
|
11
|
-
// whose session file has been quiet past ERROR_STALL_QUIET_MS and whose last
|
|
12
|
-
// assistant message stopped with 'error' is force-killed, so the ordinary
|
|
13
|
-
// dead-pid crash path grace-revives RESUME on the saved session — the exact
|
|
14
|
-
// manual recovery (kill broker + canvas revive) that fixed the zombie by hand.
|
|
15
|
-
//
|
|
16
|
-
// Three legs: the pure truth table (E1 — errorStallVerdict), the tail-signature
|
|
17
|
-
// parser (E2 — trailingEngineError), and the daemon integration over a real
|
|
18
|
-
// live pid the daemon must SIGTERM (E3 — superviseTick with an injected clock).
|
|
19
|
-
// Regression check: drop §I and E3's "engine killed" assert goes RED (the
|
|
20
|
-
// parked error engine lives forever, never recovered).
|
|
21
|
-
import { test } from 'node:test';
|
|
22
|
-
import assert from 'node:assert/strict';
|
|
23
|
-
import { spawn } from 'node:child_process';
|
|
24
|
-
import { writeFileSync, utimesSync, mkdtempSync, rmSync } from 'node:fs';
|
|
25
|
-
import { join } from 'node:path';
|
|
26
|
-
import { tmpdir } from 'node:os';
|
|
27
|
-
import { createHeadlessHarness } from './helpers/harness.js';
|
|
28
|
-
import { errorStallVerdict, trailingEngineError, ERROR_STALL_QUIET_MS, isPidAlive, } from '../../daemon/crtrd.js';
|
|
29
|
-
// ---------------------------------------------------------------------------
|
|
30
|
-
// Session-jsonl line builders (the shape pi writes: {type:'message', message}).
|
|
31
|
-
// ---------------------------------------------------------------------------
|
|
32
|
-
function line(message) {
|
|
33
|
-
return JSON.stringify({ type: 'message', id: 'x', timestamp: new Date().toISOString(), message });
|
|
34
|
-
}
|
|
35
|
-
const assistant = (stopReason, errorMessage) => line({ role: 'assistant', stopReason, ...(errorMessage === undefined ? {} : { errorMessage }) });
|
|
36
|
-
const toolResult = () => line({ role: 'toolResult' });
|
|
37
|
-
const user = () => line({ role: 'user' });
|
|
38
|
-
// ---------------------------------------------------------------------------
|
|
39
|
-
// E1 — the pure error-stall truth table.
|
|
40
|
-
// ---------------------------------------------------------------------------
|
|
41
|
-
test('E1 errorStallVerdict: kill ONLY a live, not-busy, intent-null engine, quiet past grace, with a trailing error', () => {
|
|
42
|
-
const G = ERROR_STALL_QUIET_MS;
|
|
43
|
-
// The one 'kill' case.
|
|
44
|
-
assert.equal(errorStallVerdict(true, null, false, G, true), 'kill', 'alive+no-intent+!busy+quiet>=grace+error → kill');
|
|
45
|
-
assert.equal(errorStallVerdict(true, null, false, G + 60_000, true), 'kill', 'well past grace → kill');
|
|
46
|
-
// Recent session activity → leave (something is still making progress).
|
|
47
|
-
assert.equal(errorStallVerdict(true, null, false, G - 1, true), 'leave', 'within quiet grace → leave');
|
|
48
|
-
assert.equal(errorStallVerdict(true, null, false, null, true), 'leave', 'unknown quiet span → leave');
|
|
49
|
-
// No trailing error → a healthy park (attended root, awaiting node) — leave.
|
|
50
|
-
assert.equal(errorStallVerdict(true, null, false, G + 60_000, false), 'leave', 'last turn not an error → leave');
|
|
51
|
-
// A working engine is NEVER killed (wedged-on-bash is recovered by killing the
|
|
52
|
-
// subprocess, not the node).
|
|
53
|
-
assert.equal(errorStallVerdict(true, null, true, G + 60_000, true), 'leave', 'busy (mid-turn) → leave');
|
|
54
|
-
// A pending intent belongs to other paths (§H refresh; idle-release dormancy).
|
|
55
|
-
assert.equal(errorStallVerdict(true, 'refresh', false, G + 60_000, true), 'leave', 'intent=refresh → leave (§H owns it)');
|
|
56
|
-
assert.equal(errorStallVerdict(true, 'idle-release', false, G + 60_000, true), 'leave', 'intent=idle-release → leave');
|
|
57
|
-
// A dead/unknown pid is the ordinary revive path's job.
|
|
58
|
-
assert.equal(errorStallVerdict(false, null, false, G + 60_000, true), 'leave', 'dead pid → leave');
|
|
59
|
-
assert.equal(errorStallVerdict(null, null, false, G + 60_000, true), 'leave', 'unknown pid → leave');
|
|
60
|
-
});
|
|
61
|
-
// ---------------------------------------------------------------------------
|
|
62
|
-
// E2 — the tail-signature parser.
|
|
63
|
-
// ---------------------------------------------------------------------------
|
|
64
|
-
test('E2 trailingEngineError: only a trailing error assistant turn matches', () => {
|
|
65
|
-
// The observed zombie shape: trailing zero-token error assistant messages.
|
|
66
|
-
assert.equal(trailingEngineError([assistant('toolUse'), toolResult(), assistant('error', 'Connection error.')].join('\n')), 'Connection error.', 'trailing error turn → its errorMessage');
|
|
67
|
-
// Trailing non-assistant lines (toolResults, an injected user message that
|
|
68
|
-
// never got a response) are walked past to the last assistant turn.
|
|
69
|
-
assert.equal(trailingEngineError([assistant('error', 'Connection error.'), user()].join('\n')), 'Connection error.', 'trailing injected user line is walked past');
|
|
70
|
-
// A healthy park / human abort is NOT a wedge.
|
|
71
|
-
assert.equal(trailingEngineError([assistant('error', 'x'), toolResult(), assistant('stop')].join('\n')), null, 'recovered after an earlier error → null');
|
|
72
|
-
assert.equal(trailingEngineError(assistant('aborted')), null, 'human Esc → null');
|
|
73
|
-
// A tail cut mid-line (the 64KB boundary) is skipped, not fatal.
|
|
74
|
-
assert.equal(trailingEngineError(['ut"}}garbage-fragment', assistant('error', 'boom')].join('\n')), 'boom', 'cut first fragment is skipped');
|
|
75
|
-
// An error turn with no errorMessage still reads as a wedge.
|
|
76
|
-
assert.notEqual(trailingEngineError(assistant('error')), null, 'error with no errorMessage still matches');
|
|
77
|
-
assert.equal(trailingEngineError(null), null, 'no tail → null');
|
|
78
|
-
assert.equal(trailingEngineError(''), null, 'empty tail → null');
|
|
79
|
-
});
|
|
80
|
-
// ---------------------------------------------------------------------------
|
|
81
|
-
// E3 — daemon integration: a parked trailing-error engine is force-recycled.
|
|
82
|
-
// ---------------------------------------------------------------------------
|
|
83
|
-
const T0 = 9_000_000_000;
|
|
84
|
-
test('E3 daemon force-kills a wedged engine: live, not-busy, intent-null, session quiet past grace with a trailing error turn', { timeout: 30_000 }, async () => {
|
|
85
|
-
const h = await createHeadlessHarness({ sessionPrefix: 'crtr-e3' });
|
|
86
|
-
const dir = mkdtempSync(join(tmpdir(), 'crtr-e3-'));
|
|
87
|
-
// Real live subprocesses standing in for the parked engines; `sleep` dies on
|
|
88
|
-
// SIGTERM, so the daemon's force-kill is directly observable.
|
|
89
|
-
const wedged = spawn('sleep', ['300'], { stdio: 'ignore' });
|
|
90
|
-
const parked = spawn('sleep', ['300'], { stdio: 'ignore' });
|
|
91
|
-
try {
|
|
92
|
-
// The WEDGED node: session ends in an error turn, quiet for > the grace.
|
|
93
|
-
const wedgedFile = join(dir, 'wedged.jsonl');
|
|
94
|
-
writeFileSync(wedgedFile, [assistant('toolUse'), toolResult(), assistant('error', 'Connection error.')].join('\n') + '\n');
|
|
95
|
-
const staleSec = (T0 - ERROR_STALL_QUIET_MS - 1) / 1000;
|
|
96
|
-
utimesSync(wedgedFile, staleSec, staleSec);
|
|
97
|
-
const wedgedId = h.fabricateBrokerNode({
|
|
98
|
-
kind: 'developer',
|
|
99
|
-
status: 'active',
|
|
100
|
-
pi_pid: wedged.pid,
|
|
101
|
-
pi_session_id: 'sess-e3-wedged',
|
|
102
|
-
pi_session_file: wedgedFile,
|
|
103
|
-
});
|
|
104
|
-
// The CONTROL node: equally old and quiet, but its last turn is a healthy
|
|
105
|
-
// 'stop' (an attended root overnight) — must NEVER be killed.
|
|
106
|
-
const parkedFile = join(dir, 'parked.jsonl');
|
|
107
|
-
writeFileSync(parkedFile, [assistant('toolUse'), toolResult(), assistant('stop')].join('\n') + '\n');
|
|
108
|
-
utimesSync(parkedFile, staleSec, staleSec);
|
|
109
|
-
h.fabricateBrokerNode({
|
|
110
|
-
kind: 'developer',
|
|
111
|
-
status: 'active',
|
|
112
|
-
pi_pid: parked.pid,
|
|
113
|
-
pi_session_id: 'sess-e3-parked',
|
|
114
|
-
pi_session_file: parkedFile,
|
|
115
|
-
});
|
|
116
|
-
assert.equal(isPidAlive(wedged.pid), true, 'precondition: the wedged engine is alive');
|
|
117
|
-
// --- TICK @ T0: the session has already been quiet past the grace (the
|
|
118
|
-
// file mtime is the clock — no arming tick), so the daemon SIGTERMs
|
|
119
|
-
// the wedged engine on sight. ---
|
|
120
|
-
await h.tick(T0);
|
|
121
|
-
await h.waitFor(() => (isPidAlive(wedged.pid) ? null : true), {
|
|
122
|
-
label: 'daemon SIGTERM killed the wedged trailing-error engine (§I)',
|
|
123
|
-
timeoutMs: 10_000,
|
|
124
|
-
});
|
|
125
|
-
assert.equal(isPidAlive(wedged.pid), false, 'the wedged engine was force-killed');
|
|
126
|
-
assert.equal(isPidAlive(parked.pid), true, 'the healthily-parked engine was NOT touched');
|
|
127
|
-
assert.equal(h.node(wedgedId).intent ?? null, null, 'intent stays null — the dead-pid CRASH branch owns the revive (resume)');
|
|
128
|
-
}
|
|
129
|
-
finally {
|
|
130
|
-
for (const c of [wedged, parked]) {
|
|
131
|
-
try {
|
|
132
|
-
c.kill('SIGKILL');
|
|
133
|
-
}
|
|
134
|
-
catch {
|
|
135
|
-
/* already gone */
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
rmSync(dir, { recursive: true, force: true });
|
|
139
|
-
await h.dispose();
|
|
140
|
-
}
|
|
141
|
-
});
|
|
@@ -1,224 +0,0 @@
|
|
|
1
|
-
// Run with: node --import tsx/esm --test src/core/__tests__/frame-decoder-perf.test.ts
|
|
2
|
-
//
|
|
3
|
-
// Bug-regression suite for the FrameDecoder O(n²) typing-lag bug (2026-06-09).
|
|
4
|
-
//
|
|
5
|
-
// OBSERVED BUG: typing in `crtr attach` lagged after the headless-broker change.
|
|
6
|
-
// Root cause #1: FrameDecoder.push() did `this.buf += str` and re-scanned the
|
|
7
|
-
// WHOLE accumulated buffer (`this.buf.indexOf('\n')` + Buffer.byteLength over
|
|
8
|
-
// the consumed prefix) on every ~64 KiB socket chunk, so one large frame (the
|
|
9
|
-
// multi-MiB `welcome` snapshot, a big tool result) cost O(frame × chunks) —
|
|
10
|
-
// measured ~254 ms of event-loop stall decoding a 16 MiB frame, with the stall
|
|
11
|
-
// growing ~5× per size doubling. The decoder runs on BOTH the viewer and broker
|
|
12
|
-
// read paths, so the stall blocked keystroke handling directly.
|
|
13
|
-
//
|
|
14
|
-
// The fix holds the carried partial line as an array of chunk strings and scans
|
|
15
|
-
// each incoming chunk exactly once — amortized O(total bytes). Same 16 MiB frame:
|
|
16
|
-
// ~12 ms.
|
|
17
|
-
//
|
|
18
|
-
// These tests lock in (a) behavioral equivalence with the old decoder across
|
|
19
|
-
// randomized chunkings — frames, blank-line skip, malformed-JSON drop, multibyte
|
|
20
|
-
// splits, and both FrameOverflowError caps with identical byte accounting — and
|
|
21
|
-
// (b) the linear growth curve via a SCALING-RATIO assertion (per-MiB decode cost
|
|
22
|
-
// at 4 MiB vs 16 MiB must stay ~flat), so the quadratic shape cannot silently
|
|
23
|
-
// return. The ratio is measured with min-of-reps and interleaved sizes so it is
|
|
24
|
-
// robust to CPU contention from parallel `test:full` workers — see the perf test
|
|
25
|
-
// for the full rationale.
|
|
26
|
-
import { test } from 'node:test';
|
|
27
|
-
import assert from 'node:assert/strict';
|
|
28
|
-
import { StringDecoder } from 'node:string_decoder';
|
|
29
|
-
import { FrameDecoder, FrameOverflowError, CLIENT_READ_CAPS, } from '../runtime/broker-protocol.js';
|
|
30
|
-
// ---------------------------------------------------------------------------
|
|
31
|
-
// The PRE-FIX decoder, verbatim (git ed49e60), as the equivalence oracle.
|
|
32
|
-
// ---------------------------------------------------------------------------
|
|
33
|
-
class ReferenceFrameDecoder {
|
|
34
|
-
caps;
|
|
35
|
-
buf = '';
|
|
36
|
-
bufBytes = 0;
|
|
37
|
-
utf8 = new StringDecoder('utf8');
|
|
38
|
-
constructor(caps) {
|
|
39
|
-
this.caps = caps;
|
|
40
|
-
}
|
|
41
|
-
push(chunk) {
|
|
42
|
-
const str = typeof chunk === 'string' ? chunk : this.utf8.write(chunk);
|
|
43
|
-
this.buf += str;
|
|
44
|
-
this.bufBytes += Buffer.byteLength(str);
|
|
45
|
-
if (this.bufBytes > this.caps.maxTotalBytes) {
|
|
46
|
-
throw new FrameOverflowError('total', this.bufBytes, this.caps.maxTotalBytes);
|
|
47
|
-
}
|
|
48
|
-
const out = [];
|
|
49
|
-
let nl;
|
|
50
|
-
while ((nl = this.buf.indexOf('\n')) >= 0) {
|
|
51
|
-
const consumed = this.buf.slice(0, nl + 1);
|
|
52
|
-
this.bufBytes -= Buffer.byteLength(consumed);
|
|
53
|
-
const line = this.buf.slice(0, nl).trim();
|
|
54
|
-
this.buf = this.buf.slice(nl + 1);
|
|
55
|
-
if (line === '')
|
|
56
|
-
continue;
|
|
57
|
-
try {
|
|
58
|
-
out.push(JSON.parse(line));
|
|
59
|
-
}
|
|
60
|
-
catch {
|
|
61
|
-
/* drop malformed */
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
if (this.bufBytes > this.caps.maxLineBytes) {
|
|
65
|
-
throw new FrameOverflowError('line', this.bufBytes, this.caps.maxLineBytes);
|
|
66
|
-
}
|
|
67
|
-
return out;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
// Deterministic PRNG so a failure reproduces.
|
|
71
|
-
let seed = 0xc0ffee;
|
|
72
|
-
const rnd = () => {
|
|
73
|
-
seed = (seed * 1103515245 + 12345) & 0x7fffffff;
|
|
74
|
-
return seed / 0x7fffffff;
|
|
75
|
-
};
|
|
76
|
-
const randInt = (lo, hi) => lo + Math.floor(rnd() * (hi - lo + 1));
|
|
77
|
-
const MULTIBYTE = ['é', '漢', '🎉', '𝕏', 'ü', '한'];
|
|
78
|
-
const randText = (len) => {
|
|
79
|
-
let s = '';
|
|
80
|
-
while (s.length < len) {
|
|
81
|
-
s += rnd() < 0.2 ? MULTIBYTE[randInt(0, MULTIBYTE.length - 1)] : String.fromCharCode(randInt(97, 122));
|
|
82
|
-
}
|
|
83
|
-
return s;
|
|
84
|
-
};
|
|
85
|
-
function run(dec, stream, cuts) {
|
|
86
|
-
const frames = [];
|
|
87
|
-
let prev = 0;
|
|
88
|
-
try {
|
|
89
|
-
for (const cut of [...cuts, stream.length]) {
|
|
90
|
-
if (cut <= prev)
|
|
91
|
-
continue;
|
|
92
|
-
frames.push(...dec.push(stream.subarray(prev, cut)));
|
|
93
|
-
prev = cut;
|
|
94
|
-
}
|
|
95
|
-
return { frames, err: null };
|
|
96
|
-
}
|
|
97
|
-
catch (e) {
|
|
98
|
-
if (e instanceof FrameOverflowError)
|
|
99
|
-
return { frames, err: `${e.kind}:${e.bytes}:${e.cap}` };
|
|
100
|
-
throw e;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
test('FrameDecoder — behavior-equivalent to the pre-fix decoder across randomized chunkings (frames, blank lines, malformed JSON, multibyte splits, both overflow caps)', () => {
|
|
104
|
-
for (let t = 0; t < 1500; t++) {
|
|
105
|
-
// Small caps in ~30% of trials exercise both FrameOverflowError kinds with
|
|
106
|
-
// identical byte accounting; generous caps exercise the happy path.
|
|
107
|
-
const caps = rnd() < 0.3
|
|
108
|
-
? { maxLineBytes: randInt(50, 1500), maxTotalBytes: randInt(100, 4000) }
|
|
109
|
-
: { maxLineBytes: 1 << 20, maxTotalBytes: 1 << 21 };
|
|
110
|
-
const pieces = [];
|
|
111
|
-
for (let i = 0, n = randInt(1, 12); i < n; i++) {
|
|
112
|
-
const kind = rnd();
|
|
113
|
-
if (kind < 0.55)
|
|
114
|
-
pieces.push(JSON.stringify({ type: 'x', t: randText(randInt(0, 2000)) }) + '\n');
|
|
115
|
-
else if (kind < 0.7)
|
|
116
|
-
pieces.push('\n'); // blank-line skip
|
|
117
|
-
else if (kind < 0.8)
|
|
118
|
-
pieces.push(' \n'); // whitespace-only skip
|
|
119
|
-
else if (kind < 0.9)
|
|
120
|
-
pieces.push('{not json' + randText(randInt(0, 50)) + '\n'); // malformed drop
|
|
121
|
-
else
|
|
122
|
-
pieces.push(randText(randInt(0, 300))); // trailing partial, no newline
|
|
123
|
-
}
|
|
124
|
-
const stream = Buffer.from(pieces.join(''));
|
|
125
|
-
// Byte-level cut points — these can and do split multibyte chars.
|
|
126
|
-
const cuts = Array.from({ length: randInt(0, 20) }, () => randInt(0, stream.length)).sort((a, b) => a - b);
|
|
127
|
-
const expected = run(new ReferenceFrameDecoder(caps), stream, cuts);
|
|
128
|
-
const actual = run(new FrameDecoder(caps), stream, cuts);
|
|
129
|
-
assert.deepEqual(actual, expected, `trial ${t}: caps=${JSON.stringify(caps)} cuts=${JSON.stringify(cuts)} stream=${JSON.stringify(stream.toString('utf8').slice(0, 300))}`);
|
|
130
|
-
}
|
|
131
|
-
});
|
|
132
|
-
test('FrameDecoder — mixed string/Buffer pushes stay equivalent', () => {
|
|
133
|
-
for (let t = 0; t < 300; t++) {
|
|
134
|
-
const caps = { maxLineBytes: 1 << 20, maxTotalBytes: 1 << 21 };
|
|
135
|
-
const ref = new ReferenceFrameDecoder(caps);
|
|
136
|
-
const dec = new FrameDecoder(caps);
|
|
137
|
-
const refF = [];
|
|
138
|
-
const decF = [];
|
|
139
|
-
for (let i = 0, n = randInt(1, 10); i < n; i++) {
|
|
140
|
-
const s = rnd() < 0.5 ? JSON.stringify({ i, t: randText(randInt(0, 200)) }) + '\n' : randText(randInt(0, 100));
|
|
141
|
-
const input = rnd() < 0.5 ? s : Buffer.from(s);
|
|
142
|
-
refF.push(...ref.push(input));
|
|
143
|
-
decF.push(...dec.push(input));
|
|
144
|
-
}
|
|
145
|
-
assert.deepEqual(decF, refF, `mixed trial ${t}`);
|
|
146
|
-
}
|
|
147
|
-
});
|
|
148
|
-
test('FrameDecoder — a frame exactly AT each cap passes; one byte over throws (cap accounting exact)', () => {
|
|
149
|
-
// line cap: an unterminated partial exactly at maxLineBytes is fine…
|
|
150
|
-
{
|
|
151
|
-
const caps = { maxLineBytes: 100, maxTotalBytes: 1000 };
|
|
152
|
-
const dec = new FrameDecoder(caps);
|
|
153
|
-
assert.deepEqual(dec.push('x'.repeat(100)), []);
|
|
154
|
-
// …and the 101st byte trips it, reporting the full buffered size.
|
|
155
|
-
assert.throws(() => dec.push('x'), (e) => e instanceof FrameOverflowError && e.kind === 'line' && e.bytes === 101 && e.cap === 100);
|
|
156
|
-
}
|
|
157
|
-
// total cap: carry + chunk exactly at maxTotalBytes is fine; one over throws.
|
|
158
|
-
{
|
|
159
|
-
const caps = { maxLineBytes: 1000, maxTotalBytes: 100 };
|
|
160
|
-
const dec = new FrameDecoder(caps);
|
|
161
|
-
assert.deepEqual(dec.push('x'.repeat(60)), []);
|
|
162
|
-
assert.deepEqual(dec.push('x'.repeat(40 - 60 > 0 ? 0 : 40)), []); // 60 + 40 = 100, at cap
|
|
163
|
-
assert.throws(() => dec.push('x'), (e) => e instanceof FrameOverflowError && e.kind === 'total' && e.bytes === 101 && e.cap === 100);
|
|
164
|
-
}
|
|
165
|
-
// multibyte accounting: bytes, not chars (é = 2 bytes).
|
|
166
|
-
{
|
|
167
|
-
const caps = { maxLineBytes: 10, maxTotalBytes: 1000 };
|
|
168
|
-
const dec = new FrameDecoder(caps);
|
|
169
|
-
assert.throws(() => dec.push('é'.repeat(6)), // 12 bytes > 10, only 6 chars
|
|
170
|
-
(e) => e instanceof FrameOverflowError && e.kind === 'line' && e.bytes === 12);
|
|
171
|
-
}
|
|
172
|
-
});
|
|
173
|
-
test('FrameDecoder — large-frame decode is linear, not quadratic (the observed attach-lag regression)', () => {
|
|
174
|
-
// STRATEGY (contention-robust SCALING assertion): decode a single frame in
|
|
175
|
-
// 64 KiB socket-sized chunks at two sizes 4× apart (4 MiB vs 16 MiB) and assert
|
|
176
|
-
// the per-MiB cost stays ~flat. A linear decoder has per-MiB cost independent of
|
|
177
|
-
// size (ratio ≈ 1); the O(n²) bug makes per-MiB cost grow with size, so over a 4×
|
|
178
|
-
// size jump it grows ~4× (measured 5.5×+ pre-fix). Threshold 3× sits cleanly
|
|
179
|
-
// between the two signatures: well above linear noise, well below the quadratic
|
|
180
|
-
// signature.
|
|
181
|
-
//
|
|
182
|
-
// Why a RATIO, not an absolute wall-clock budget: an absolute budget is fragile
|
|
183
|
-
// under the parallel `test:full` workers — CPU contention scales every
|
|
184
|
-
// measurement up, so a tight budget flakes red on a loaded box without any code
|
|
185
|
-
// regression. A ratio of two contention-scaled measurements cancels whole-box
|
|
186
|
-
// slowdown, leaving only the algorithmic shape. Two further guards keep the
|
|
187
|
-
// minima clean under load: (1) MIN across REPS — contention only ADDS time, so
|
|
188
|
-
// the minimum approximates the uncontended cost; (2) the two sizes are timed
|
|
189
|
-
// INTERLEAVED within each rep, so a contention burst inflates both numerator and
|
|
190
|
-
// denominator alike instead of skewing the ratio. This fails ONLY on a
|
|
191
|
-
// complexity regression, not on a slow/busy CI box.
|
|
192
|
-
const CHUNK = 64 * 1024;
|
|
193
|
-
const SMALL_MIB = 4;
|
|
194
|
-
const LARGE_MIB = 16; // 4× SMALL — quadratic ⇒ per-MiB ~4×; linear ⇒ ~1×
|
|
195
|
-
const REPS = 7;
|
|
196
|
-
const makeFrame = (mib) => {
|
|
197
|
-
const overhead = Buffer.byteLength('{"type":"welcome","blob":""}\n');
|
|
198
|
-
return Buffer.from(`{"type":"welcome","blob":"${'x'.repeat(mib * 1024 * 1024 - overhead)}"}\n`);
|
|
199
|
-
};
|
|
200
|
-
const smallFrame = makeFrame(SMALL_MIB);
|
|
201
|
-
const largeFrame = makeFrame(LARGE_MIB);
|
|
202
|
-
const decodeMs = (frame) => {
|
|
203
|
-
const dec = new FrameDecoder(CLIENT_READ_CAPS);
|
|
204
|
-
const t0 = performance.now();
|
|
205
|
-
let n = 0;
|
|
206
|
-
for (let off = 0; off < frame.length; off += CHUNK) {
|
|
207
|
-
n += dec.push(frame.subarray(off, Math.min(off + CHUNK, frame.length))).length;
|
|
208
|
-
}
|
|
209
|
-
const ms = performance.now() - t0;
|
|
210
|
-
assert.equal(n, 1, 'decoded exactly one frame');
|
|
211
|
-
return ms;
|
|
212
|
-
};
|
|
213
|
-
decodeMs(smallFrame); // warm JIT on both paths before timing
|
|
214
|
-
decodeMs(largeFrame);
|
|
215
|
-
let bestSmall = Infinity;
|
|
216
|
-
let bestLarge = Infinity;
|
|
217
|
-
for (let rep = 0; rep < REPS; rep++) {
|
|
218
|
-
bestSmall = Math.min(bestSmall, decodeMs(smallFrame));
|
|
219
|
-
bestLarge = Math.min(bestLarge, decodeMs(largeFrame));
|
|
220
|
-
}
|
|
221
|
-
const perMibSmall = bestSmall / SMALL_MIB;
|
|
222
|
-
const perMibLarge = bestLarge / LARGE_MIB;
|
|
223
|
-
assert.ok(perMibLarge < perMibSmall * 3, `per-MiB decode cost grew superlinearly: ${perMibSmall.toFixed(2)}ms/MiB @${SMALL_MIB}MiB → ${perMibLarge.toFixed(2)}ms/MiB @${LARGE_MIB}MiB (ratio ${(perMibLarge / perMibSmall).toFixed(2)}×; quadratic regression)`);
|
|
224
|
-
});
|