@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
|
@@ -0,0 +1,534 @@
|
|
|
1
|
+
// control-plane.db — the CP's own SQLite store, separate from canvas.db. This
|
|
2
|
+
// module is the SOLE owner of the cached `DatabaseSync` connection and the
|
|
3
|
+
// migration gate: every other CP store (registry, scheduler, ingress) imports
|
|
4
|
+
// `getControlPlaneDb()` from here rather than opening a second connection
|
|
5
|
+
// (master plan decision 9 / orchestration brief non-negotiable). It lives on
|
|
6
|
+
// the CP's own data volume — NOT canvas home, NOT `canvasDbPath()` — because
|
|
7
|
+
// the control plane is a separate always-on process from any home/node.
|
|
8
|
+
//
|
|
9
|
+
// Mirrors `src/core/canvas/db.ts` exactly: `DatabaseSync` + WAL, schema
|
|
10
|
+
// expressed as a forward-only `MIGRATIONS` list gated by `PRAGMA user_version`.
|
|
11
|
+
// Migrations are append-only — never edit a shipped step.
|
|
12
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
13
|
+
import { existsSync, mkdirSync } from 'node:fs';
|
|
14
|
+
import { homedir } from 'node:os';
|
|
15
|
+
import { dirname, join, resolve } from 'node:path';
|
|
16
|
+
const ENV = {
|
|
17
|
+
// Same data-dir convention `secrets.ts` (P1.3) uses, so the CP's SQLite db
|
|
18
|
+
// and its secrets file default to living side by side on one data volume.
|
|
19
|
+
dataDir: 'CRTR_HEARTH_CP_DATA_DIR',
|
|
20
|
+
// Explicit override for the db file itself, for deployments that want the
|
|
21
|
+
// db on a different mount than the rest of the CP data dir.
|
|
22
|
+
dbPath: 'CRTR_HEARTH_CP_DB_PATH',
|
|
23
|
+
};
|
|
24
|
+
const DB_FILE_NAME = 'control-plane.db';
|
|
25
|
+
function expandHomePath(input) {
|
|
26
|
+
if (input.startsWith('~'))
|
|
27
|
+
return join(homedir(), input.slice(1));
|
|
28
|
+
return resolve(input);
|
|
29
|
+
}
|
|
30
|
+
function defaultDataDir(env) {
|
|
31
|
+
const dataDir = env[ENV.dataDir]?.trim();
|
|
32
|
+
return dataDir !== undefined && dataDir !== ''
|
|
33
|
+
? expandHomePath(dataDir)
|
|
34
|
+
: expandHomePath('~/.crouter/hearth-control-plane');
|
|
35
|
+
}
|
|
36
|
+
/** Resolve the CP SQLite db file path: an explicit `CRTR_HEARTH_CP_DB_PATH`
|
|
37
|
+
* override, else `<dataDir>/control-plane.db` where `dataDir` follows the
|
|
38
|
+
* same `CRTR_HEARTH_CP_DATA_DIR` convention `secrets.ts` uses. Deliberately
|
|
39
|
+
* independent of `canvasDbPath()` / `CRTR_HOME` — the control plane is not a
|
|
40
|
+
* canvas node and must not share or collide with a home's canvas db. */
|
|
41
|
+
export function controlPlaneDbPath(env = process.env) {
|
|
42
|
+
const override = env[ENV.dbPath]?.trim();
|
|
43
|
+
if (override !== undefined && override !== '')
|
|
44
|
+
return expandHomePath(override);
|
|
45
|
+
return join(defaultDataDir(env), DB_FILE_NAME);
|
|
46
|
+
}
|
|
47
|
+
// --- Schema as a forward-only migration list ------------------------------
|
|
48
|
+
/** v1 — the `home` registry table (design.md §5.1). `home_id` is the stable
|
|
49
|
+
* PK, independent of provider sandbox/node churn; `schedule` and
|
|
50
|
+
* `ingress_route` (added by later sibling migrations against this same
|
|
51
|
+
* handle) FK to it. Every secret is stored as a HANDLE
|
|
52
|
+
* (`relay_auth_ref`) — never a model credential, never an inline value
|
|
53
|
+
* (R-REG-3 / R-CP-8). `IF NOT EXISTS` makes this a no-op on re-open. */
|
|
54
|
+
function homeTable(db) {
|
|
55
|
+
db.exec(`
|
|
56
|
+
CREATE TABLE IF NOT EXISTS home (
|
|
57
|
+
home_id TEXT PRIMARY KEY,
|
|
58
|
+
tenant_id TEXT NOT NULL,
|
|
59
|
+
user_id TEXT NOT NULL,
|
|
60
|
+
provider TEXT NOT NULL DEFAULT 'blaxel',
|
|
61
|
+
provider_sandbox_id TEXT,
|
|
62
|
+
provider_volume_id TEXT,
|
|
63
|
+
preview_endpoint TEXT,
|
|
64
|
+
home_agent_target TEXT,
|
|
65
|
+
relay_auth_ref TEXT,
|
|
66
|
+
status TEXT NOT NULL DEFAULT 'provisioning',
|
|
67
|
+
template_version TEXT,
|
|
68
|
+
last_ready_at TEXT,
|
|
69
|
+
last_wake_at TEXT,
|
|
70
|
+
last_suspend_at TEXT,
|
|
71
|
+
last_wake_latency_ms INTEGER,
|
|
72
|
+
health_verdict TEXT NOT NULL DEFAULT 'unknown',
|
|
73
|
+
created_at TEXT NOT NULL,
|
|
74
|
+
updated_at TEXT NOT NULL
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
CREATE INDEX IF NOT EXISTS idx_home_tenant_user ON home(tenant_id, user_id);
|
|
78
|
+
CREATE INDEX IF NOT EXISTS idx_home_provider_sandbox ON home(provider_sandbox_id);
|
|
79
|
+
`);
|
|
80
|
+
}
|
|
81
|
+
/** v2 — cron schedule definitions. `next_fire_at` is the durable timer the CP
|
|
82
|
+
* scan loop selects on; home agents keep no cron scheduler state. */
|
|
83
|
+
function scheduleTable(db) {
|
|
84
|
+
db.exec(`
|
|
85
|
+
CREATE TABLE IF NOT EXISTS schedule (
|
|
86
|
+
schedule_id TEXT PRIMARY KEY,
|
|
87
|
+
tenant_id TEXT NOT NULL,
|
|
88
|
+
user_id TEXT NOT NULL,
|
|
89
|
+
home_id TEXT NOT NULL,
|
|
90
|
+
label TEXT NOT NULL,
|
|
91
|
+
recurrence TEXT NOT NULL,
|
|
92
|
+
timezone TEXT NOT NULL,
|
|
93
|
+
delivery_payload TEXT NOT NULL,
|
|
94
|
+
next_fire_at TEXT NOT NULL,
|
|
95
|
+
last_fired_at TEXT,
|
|
96
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
97
|
+
created_at TEXT NOT NULL,
|
|
98
|
+
updated_at TEXT NOT NULL,
|
|
99
|
+
FOREIGN KEY (home_id) REFERENCES home(home_id) ON DELETE CASCADE,
|
|
100
|
+
CHECK (enabled IN (0, 1))
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
CREATE INDEX IF NOT EXISTS idx_schedule_next_fire_at ON schedule(next_fire_at);
|
|
104
|
+
CREATE INDEX IF NOT EXISTS idx_schedule_tenant_user ON schedule(tenant_id, user_id);
|
|
105
|
+
CREATE INDEX IF NOT EXISTS idx_schedule_home ON schedule(home_id);
|
|
106
|
+
`);
|
|
107
|
+
}
|
|
108
|
+
/** v3 — cron fire idempotency ledger. The unique slot key is the load-bearing
|
|
109
|
+
* restart/double-scan guard: one schedule can own only one fire per instant. */
|
|
110
|
+
function scheduleFireTable(db) {
|
|
111
|
+
db.exec(`
|
|
112
|
+
CREATE TABLE IF NOT EXISTS schedule_fire (
|
|
113
|
+
fire_id TEXT PRIMARY KEY,
|
|
114
|
+
schedule_id TEXT NOT NULL,
|
|
115
|
+
home_id TEXT NOT NULL,
|
|
116
|
+
tenant_id TEXT NOT NULL,
|
|
117
|
+
user_id TEXT NOT NULL,
|
|
118
|
+
scheduled_for TEXT NOT NULL,
|
|
119
|
+
state TEXT NOT NULL DEFAULT 'pending',
|
|
120
|
+
attempts INTEGER NOT NULL DEFAULT 0,
|
|
121
|
+
last_error TEXT,
|
|
122
|
+
delivered_at TEXT,
|
|
123
|
+
created_at TEXT NOT NULL,
|
|
124
|
+
updated_at TEXT NOT NULL,
|
|
125
|
+
FOREIGN KEY (schedule_id) REFERENCES schedule(schedule_id) ON DELETE CASCADE,
|
|
126
|
+
FOREIGN KEY (home_id) REFERENCES home(home_id) ON DELETE CASCADE,
|
|
127
|
+
UNIQUE (schedule_id, scheduled_for),
|
|
128
|
+
CHECK (state IN ('pending', 'waking', 'delivered', 'failed')),
|
|
129
|
+
CHECK (attempts >= 0)
|
|
130
|
+
);
|
|
131
|
+
|
|
132
|
+
CREATE INDEX IF NOT EXISTS idx_schedule_fire_schedule ON schedule_fire(schedule_id);
|
|
133
|
+
CREATE INDEX IF NOT EXISTS idx_schedule_fire_home ON schedule_fire(home_id);
|
|
134
|
+
CREATE INDEX IF NOT EXISTS idx_schedule_fire_resumable ON schedule_fire(state, scheduled_for);
|
|
135
|
+
CREATE INDEX IF NOT EXISTS idx_schedule_fire_tenant_user ON schedule_fire(tenant_id, user_id);
|
|
136
|
+
`);
|
|
137
|
+
}
|
|
138
|
+
/** v4 — public ingress demux routes. `(channel, routing_key)` is deliberately
|
|
139
|
+
* globally unique because public webhook/phone/email addresses are global. */
|
|
140
|
+
function ingressRouteTable(db) {
|
|
141
|
+
db.exec(`
|
|
142
|
+
CREATE TABLE IF NOT EXISTS ingress_route (
|
|
143
|
+
route_id TEXT PRIMARY KEY,
|
|
144
|
+
tenant_id TEXT NOT NULL,
|
|
145
|
+
user_id TEXT NOT NULL,
|
|
146
|
+
home_id TEXT NOT NULL,
|
|
147
|
+
channel TEXT NOT NULL,
|
|
148
|
+
routing_key TEXT NOT NULL,
|
|
149
|
+
routing_key_kind TEXT NOT NULL,
|
|
150
|
+
channel_secret_ref TEXT,
|
|
151
|
+
delivery_template TEXT NOT NULL,
|
|
152
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
153
|
+
created_at TEXT NOT NULL,
|
|
154
|
+
updated_at TEXT NOT NULL,
|
|
155
|
+
FOREIGN KEY (home_id) REFERENCES home(home_id) ON DELETE CASCADE,
|
|
156
|
+
UNIQUE (channel, routing_key),
|
|
157
|
+
CHECK (enabled IN (0, 1))
|
|
158
|
+
);
|
|
159
|
+
|
|
160
|
+
CREATE INDEX IF NOT EXISTS idx_ingress_route_lookup ON ingress_route(channel, routing_key);
|
|
161
|
+
CREATE INDEX IF NOT EXISTS idx_ingress_route_tenant_user ON ingress_route(tenant_id, user_id);
|
|
162
|
+
CREATE INDEX IF NOT EXISTS idx_ingress_route_home ON ingress_route(home_id);
|
|
163
|
+
`);
|
|
164
|
+
}
|
|
165
|
+
/** v5 — webhook replay/idempotency ledger. Stores delivery identity and hashes
|
|
166
|
+
* only; raw public webhook bodies belong in the transient request path. */
|
|
167
|
+
function webhookDeliveryTable(db) {
|
|
168
|
+
db.exec(`
|
|
169
|
+
CREATE TABLE IF NOT EXISTS webhook_delivery (
|
|
170
|
+
delivery_id TEXT PRIMARY KEY,
|
|
171
|
+
route_id TEXT NOT NULL,
|
|
172
|
+
tenant_id TEXT NOT NULL,
|
|
173
|
+
user_id TEXT NOT NULL,
|
|
174
|
+
home_id TEXT NOT NULL,
|
|
175
|
+
replay_key TEXT NOT NULL,
|
|
176
|
+
replay_window_start TEXT NOT NULL,
|
|
177
|
+
payload_sha256 TEXT,
|
|
178
|
+
signature_sha256 TEXT,
|
|
179
|
+
state TEXT NOT NULL DEFAULT 'received',
|
|
180
|
+
received_at TEXT NOT NULL,
|
|
181
|
+
delivered_at TEXT,
|
|
182
|
+
last_error TEXT,
|
|
183
|
+
created_at TEXT NOT NULL,
|
|
184
|
+
updated_at TEXT NOT NULL,
|
|
185
|
+
FOREIGN KEY (route_id) REFERENCES ingress_route(route_id) ON DELETE CASCADE,
|
|
186
|
+
FOREIGN KEY (home_id) REFERENCES home(home_id) ON DELETE CASCADE,
|
|
187
|
+
UNIQUE (route_id, replay_key, replay_window_start),
|
|
188
|
+
CHECK (state IN ('received', 'delivered', 'rejected', 'failed'))
|
|
189
|
+
);
|
|
190
|
+
|
|
191
|
+
CREATE INDEX IF NOT EXISTS idx_webhook_delivery_route ON webhook_delivery(route_id, received_at);
|
|
192
|
+
CREATE INDEX IF NOT EXISTS idx_webhook_delivery_home ON webhook_delivery(home_id, received_at);
|
|
193
|
+
CREATE INDEX IF NOT EXISTS idx_webhook_delivery_tenant_user ON webhook_delivery(tenant_id, user_id);
|
|
194
|
+
`);
|
|
195
|
+
}
|
|
196
|
+
/** v6 — append-only trigger delivery audit. Stores operational metadata and
|
|
197
|
+
* content hashes; no public payload body and no secret literal columns. */
|
|
198
|
+
function triggerAuditTable(db) {
|
|
199
|
+
db.exec(`
|
|
200
|
+
CREATE TABLE IF NOT EXISTS trigger_audit (
|
|
201
|
+
audit_id TEXT PRIMARY KEY,
|
|
202
|
+
tenant_id TEXT NOT NULL,
|
|
203
|
+
user_id TEXT NOT NULL,
|
|
204
|
+
home_id TEXT NOT NULL,
|
|
205
|
+
source TEXT NOT NULL,
|
|
206
|
+
source_ref TEXT NOT NULL,
|
|
207
|
+
trigger_id TEXT NOT NULL,
|
|
208
|
+
tier TEXT NOT NULL,
|
|
209
|
+
outcome TEXT NOT NULL,
|
|
210
|
+
reason TEXT,
|
|
211
|
+
payload_sha256 TEXT,
|
|
212
|
+
metadata_json TEXT,
|
|
213
|
+
at TEXT NOT NULL,
|
|
214
|
+
FOREIGN KEY (home_id) REFERENCES home(home_id) ON DELETE CASCADE,
|
|
215
|
+
CHECK (source IN ('cron', 'webhook')),
|
|
216
|
+
CHECK (tier IN ('critical', 'urgent', 'normal', 'deferred')),
|
|
217
|
+
CHECK (outcome IN ('delivered', 'rejected', 'failed'))
|
|
218
|
+
);
|
|
219
|
+
|
|
220
|
+
CREATE INDEX IF NOT EXISTS idx_trigger_audit_home_at ON trigger_audit(home_id, at);
|
|
221
|
+
CREATE INDEX IF NOT EXISTS idx_trigger_audit_tenant_user_at ON trigger_audit(tenant_id, user_id, at);
|
|
222
|
+
CREATE INDEX IF NOT EXISTS idx_trigger_audit_trigger ON trigger_audit(trigger_id);
|
|
223
|
+
`);
|
|
224
|
+
}
|
|
225
|
+
/** v7 — DB-level consistency guards for denormalized tenant/user/home keys.
|
|
226
|
+
* Stores derive these values from parents; these triggers keep direct SQL from
|
|
227
|
+
* making tenant/user columns untrustworthy query or security boundaries. */
|
|
228
|
+
function tenantIdentityTriggers(db) {
|
|
229
|
+
db.exec(`
|
|
230
|
+
CREATE TRIGGER IF NOT EXISTS trg_schedule_identity_insert
|
|
231
|
+
BEFORE INSERT ON schedule
|
|
232
|
+
FOR EACH ROW
|
|
233
|
+
WHEN NOT EXISTS (
|
|
234
|
+
SELECT 1 FROM home
|
|
235
|
+
WHERE home_id = NEW.home_id AND tenant_id = NEW.tenant_id AND user_id = NEW.user_id
|
|
236
|
+
)
|
|
237
|
+
BEGIN
|
|
238
|
+
SELECT RAISE(ABORT, 'schedule tenant/user/home mismatch');
|
|
239
|
+
END;
|
|
240
|
+
|
|
241
|
+
CREATE TRIGGER IF NOT EXISTS trg_schedule_identity_update
|
|
242
|
+
BEFORE UPDATE OF home_id, tenant_id, user_id ON schedule
|
|
243
|
+
FOR EACH ROW
|
|
244
|
+
WHEN NOT EXISTS (
|
|
245
|
+
SELECT 1 FROM home
|
|
246
|
+
WHERE home_id = NEW.home_id AND tenant_id = NEW.tenant_id AND user_id = NEW.user_id
|
|
247
|
+
)
|
|
248
|
+
BEGIN
|
|
249
|
+
SELECT RAISE(ABORT, 'schedule tenant/user/home mismatch');
|
|
250
|
+
END;
|
|
251
|
+
|
|
252
|
+
CREATE TRIGGER IF NOT EXISTS trg_schedule_fire_identity_insert
|
|
253
|
+
BEFORE INSERT ON schedule_fire
|
|
254
|
+
FOR EACH ROW
|
|
255
|
+
WHEN NOT EXISTS (
|
|
256
|
+
SELECT 1 FROM schedule
|
|
257
|
+
WHERE schedule_id = NEW.schedule_id
|
|
258
|
+
AND home_id = NEW.home_id
|
|
259
|
+
AND tenant_id = NEW.tenant_id
|
|
260
|
+
AND user_id = NEW.user_id
|
|
261
|
+
)
|
|
262
|
+
BEGIN
|
|
263
|
+
SELECT RAISE(ABORT, 'schedule_fire schedule identity mismatch');
|
|
264
|
+
END;
|
|
265
|
+
|
|
266
|
+
CREATE TRIGGER IF NOT EXISTS trg_schedule_fire_identity_update
|
|
267
|
+
BEFORE UPDATE OF schedule_id, home_id, tenant_id, user_id ON schedule_fire
|
|
268
|
+
FOR EACH ROW
|
|
269
|
+
WHEN NOT EXISTS (
|
|
270
|
+
SELECT 1 FROM schedule
|
|
271
|
+
WHERE schedule_id = NEW.schedule_id
|
|
272
|
+
AND home_id = NEW.home_id
|
|
273
|
+
AND tenant_id = NEW.tenant_id
|
|
274
|
+
AND user_id = NEW.user_id
|
|
275
|
+
)
|
|
276
|
+
BEGIN
|
|
277
|
+
SELECT RAISE(ABORT, 'schedule_fire schedule identity mismatch');
|
|
278
|
+
END;
|
|
279
|
+
|
|
280
|
+
CREATE TRIGGER IF NOT EXISTS trg_ingress_route_identity_insert
|
|
281
|
+
BEFORE INSERT ON ingress_route
|
|
282
|
+
FOR EACH ROW
|
|
283
|
+
WHEN NOT EXISTS (
|
|
284
|
+
SELECT 1 FROM home
|
|
285
|
+
WHERE home_id = NEW.home_id AND tenant_id = NEW.tenant_id AND user_id = NEW.user_id
|
|
286
|
+
)
|
|
287
|
+
BEGIN
|
|
288
|
+
SELECT RAISE(ABORT, 'ingress_route tenant/user/home mismatch');
|
|
289
|
+
END;
|
|
290
|
+
|
|
291
|
+
CREATE TRIGGER IF NOT EXISTS trg_ingress_route_identity_update
|
|
292
|
+
BEFORE UPDATE OF home_id, tenant_id, user_id ON ingress_route
|
|
293
|
+
FOR EACH ROW
|
|
294
|
+
WHEN NOT EXISTS (
|
|
295
|
+
SELECT 1 FROM home
|
|
296
|
+
WHERE home_id = NEW.home_id AND tenant_id = NEW.tenant_id AND user_id = NEW.user_id
|
|
297
|
+
)
|
|
298
|
+
BEGIN
|
|
299
|
+
SELECT RAISE(ABORT, 'ingress_route tenant/user/home mismatch');
|
|
300
|
+
END;
|
|
301
|
+
|
|
302
|
+
CREATE TRIGGER IF NOT EXISTS trg_webhook_delivery_identity_insert
|
|
303
|
+
BEFORE INSERT ON webhook_delivery
|
|
304
|
+
FOR EACH ROW
|
|
305
|
+
WHEN NOT EXISTS (
|
|
306
|
+
SELECT 1 FROM ingress_route
|
|
307
|
+
WHERE route_id = NEW.route_id
|
|
308
|
+
AND home_id = NEW.home_id
|
|
309
|
+
AND tenant_id = NEW.tenant_id
|
|
310
|
+
AND user_id = NEW.user_id
|
|
311
|
+
)
|
|
312
|
+
BEGIN
|
|
313
|
+
SELECT RAISE(ABORT, 'webhook_delivery route identity mismatch');
|
|
314
|
+
END;
|
|
315
|
+
|
|
316
|
+
CREATE TRIGGER IF NOT EXISTS trg_webhook_delivery_identity_update
|
|
317
|
+
BEFORE UPDATE OF route_id, home_id, tenant_id, user_id ON webhook_delivery
|
|
318
|
+
FOR EACH ROW
|
|
319
|
+
WHEN NOT EXISTS (
|
|
320
|
+
SELECT 1 FROM ingress_route
|
|
321
|
+
WHERE route_id = NEW.route_id
|
|
322
|
+
AND home_id = NEW.home_id
|
|
323
|
+
AND tenant_id = NEW.tenant_id
|
|
324
|
+
AND user_id = NEW.user_id
|
|
325
|
+
)
|
|
326
|
+
BEGIN
|
|
327
|
+
SELECT RAISE(ABORT, 'webhook_delivery route identity mismatch');
|
|
328
|
+
END;
|
|
329
|
+
|
|
330
|
+
CREATE TRIGGER IF NOT EXISTS trg_trigger_audit_identity_insert
|
|
331
|
+
BEFORE INSERT ON trigger_audit
|
|
332
|
+
FOR EACH ROW
|
|
333
|
+
WHEN (
|
|
334
|
+
NEW.source = 'cron'
|
|
335
|
+
AND NOT EXISTS (
|
|
336
|
+
SELECT 1 FROM schedule_fire
|
|
337
|
+
WHERE fire_id = NEW.source_ref
|
|
338
|
+
AND home_id = NEW.home_id
|
|
339
|
+
AND tenant_id = NEW.tenant_id
|
|
340
|
+
AND user_id = NEW.user_id
|
|
341
|
+
)
|
|
342
|
+
) OR (
|
|
343
|
+
NEW.source = 'webhook'
|
|
344
|
+
AND NOT EXISTS (
|
|
345
|
+
SELECT 1 FROM ingress_route
|
|
346
|
+
WHERE route_id = NEW.source_ref
|
|
347
|
+
AND home_id = NEW.home_id
|
|
348
|
+
AND tenant_id = NEW.tenant_id
|
|
349
|
+
AND user_id = NEW.user_id
|
|
350
|
+
)
|
|
351
|
+
)
|
|
352
|
+
BEGIN
|
|
353
|
+
SELECT RAISE(ABORT, 'trigger_audit source identity mismatch');
|
|
354
|
+
END;
|
|
355
|
+
|
|
356
|
+
CREATE TRIGGER IF NOT EXISTS trg_trigger_audit_identity_update
|
|
357
|
+
BEFORE UPDATE OF source, source_ref, home_id, tenant_id, user_id ON trigger_audit
|
|
358
|
+
FOR EACH ROW
|
|
359
|
+
WHEN (
|
|
360
|
+
NEW.source = 'cron'
|
|
361
|
+
AND NOT EXISTS (
|
|
362
|
+
SELECT 1 FROM schedule_fire
|
|
363
|
+
WHERE fire_id = NEW.source_ref
|
|
364
|
+
AND home_id = NEW.home_id
|
|
365
|
+
AND tenant_id = NEW.tenant_id
|
|
366
|
+
AND user_id = NEW.user_id
|
|
367
|
+
)
|
|
368
|
+
) OR (
|
|
369
|
+
NEW.source = 'webhook'
|
|
370
|
+
AND NOT EXISTS (
|
|
371
|
+
SELECT 1 FROM ingress_route
|
|
372
|
+
WHERE route_id = NEW.source_ref
|
|
373
|
+
AND home_id = NEW.home_id
|
|
374
|
+
AND tenant_id = NEW.tenant_id
|
|
375
|
+
AND user_id = NEW.user_id
|
|
376
|
+
)
|
|
377
|
+
)
|
|
378
|
+
BEGIN
|
|
379
|
+
SELECT RAISE(ABORT, 'trigger_audit source identity mismatch');
|
|
380
|
+
END;
|
|
381
|
+
`);
|
|
382
|
+
}
|
|
383
|
+
/** v8 — parent-identity update guards. v7 validates a child row's own
|
|
384
|
+
* denormalized tenant/user/home tuple against its immediate parent on
|
|
385
|
+
* INSERT/UPDATE, but said nothing about editing the PARENT side: nothing
|
|
386
|
+
* stopped `UPDATE home SET tenant_id = ...` (or schedule/ingress_route/
|
|
387
|
+
* schedule_fire identity columns) out from under existing children, which
|
|
388
|
+
* would strand them with stale denormalized keys without tripping any
|
|
389
|
+
* v7 check (those only fire on the child table). These triggers reject an
|
|
390
|
+
* identity-column update on a parent row whenever a dependent child row
|
|
391
|
+
* already exists, so identity is write-once after first child creation;
|
|
392
|
+
* non-identity columns (status, timestamps, next_fire_at, metadata, etc.)
|
|
393
|
+
* are untouched by these triggers and remain freely updatable. Each guard
|
|
394
|
+
* checks only its immediate denormalizing child(ren) — sufficient because
|
|
395
|
+
* v7 already keeps every deeper descendant's copy in lockstep with that
|
|
396
|
+
* immediate child for as long as the immediate child row exists. */
|
|
397
|
+
function parentIdentityUpdateGuards(db) {
|
|
398
|
+
db.exec(`
|
|
399
|
+
CREATE TRIGGER IF NOT EXISTS trg_home_identity_update_guard
|
|
400
|
+
BEFORE UPDATE OF tenant_id, user_id ON home
|
|
401
|
+
FOR EACH ROW
|
|
402
|
+
WHEN (NEW.tenant_id IS NOT OLD.tenant_id OR NEW.user_id IS NOT OLD.user_id)
|
|
403
|
+
AND (
|
|
404
|
+
EXISTS (SELECT 1 FROM schedule WHERE home_id = OLD.home_id)
|
|
405
|
+
OR EXISTS (SELECT 1 FROM ingress_route WHERE home_id = OLD.home_id)
|
|
406
|
+
OR EXISTS (SELECT 1 FROM trigger_audit WHERE home_id = OLD.home_id)
|
|
407
|
+
)
|
|
408
|
+
BEGIN
|
|
409
|
+
SELECT RAISE(ABORT, 'home identity update blocked: dependent schedule/ingress_route/trigger_audit rows exist');
|
|
410
|
+
END;
|
|
411
|
+
|
|
412
|
+
CREATE TRIGGER IF NOT EXISTS trg_schedule_identity_update_guard
|
|
413
|
+
BEFORE UPDATE OF home_id, tenant_id, user_id ON schedule
|
|
414
|
+
FOR EACH ROW
|
|
415
|
+
WHEN (
|
|
416
|
+
NEW.home_id IS NOT OLD.home_id
|
|
417
|
+
OR NEW.tenant_id IS NOT OLD.tenant_id
|
|
418
|
+
OR NEW.user_id IS NOT OLD.user_id
|
|
419
|
+
)
|
|
420
|
+
AND EXISTS (SELECT 1 FROM schedule_fire WHERE schedule_id = OLD.schedule_id)
|
|
421
|
+
BEGIN
|
|
422
|
+
SELECT RAISE(ABORT, 'schedule identity update blocked: dependent schedule_fire rows exist');
|
|
423
|
+
END;
|
|
424
|
+
|
|
425
|
+
CREATE TRIGGER IF NOT EXISTS trg_ingress_route_identity_update_guard
|
|
426
|
+
BEFORE UPDATE OF home_id, tenant_id, user_id ON ingress_route
|
|
427
|
+
FOR EACH ROW
|
|
428
|
+
WHEN (
|
|
429
|
+
NEW.home_id IS NOT OLD.home_id
|
|
430
|
+
OR NEW.tenant_id IS NOT OLD.tenant_id
|
|
431
|
+
OR NEW.user_id IS NOT OLD.user_id
|
|
432
|
+
)
|
|
433
|
+
AND (
|
|
434
|
+
EXISTS (SELECT 1 FROM webhook_delivery WHERE route_id = OLD.route_id)
|
|
435
|
+
OR EXISTS (
|
|
436
|
+
SELECT 1 FROM trigger_audit WHERE source = 'webhook' AND source_ref = OLD.route_id
|
|
437
|
+
)
|
|
438
|
+
)
|
|
439
|
+
BEGIN
|
|
440
|
+
SELECT RAISE(ABORT, 'ingress_route identity update blocked: dependent webhook_delivery/trigger_audit rows exist');
|
|
441
|
+
END;
|
|
442
|
+
|
|
443
|
+
CREATE TRIGGER IF NOT EXISTS trg_schedule_fire_identity_update_guard
|
|
444
|
+
BEFORE UPDATE OF schedule_id, home_id, tenant_id, user_id ON schedule_fire
|
|
445
|
+
FOR EACH ROW
|
|
446
|
+
WHEN (
|
|
447
|
+
NEW.schedule_id IS NOT OLD.schedule_id
|
|
448
|
+
OR NEW.home_id IS NOT OLD.home_id
|
|
449
|
+
OR NEW.tenant_id IS NOT OLD.tenant_id
|
|
450
|
+
OR NEW.user_id IS NOT OLD.user_id
|
|
451
|
+
)
|
|
452
|
+
AND EXISTS (
|
|
453
|
+
SELECT 1 FROM trigger_audit WHERE source = 'cron' AND source_ref = OLD.fire_id
|
|
454
|
+
)
|
|
455
|
+
BEGIN
|
|
456
|
+
SELECT RAISE(ABORT, 'schedule_fire identity update blocked: dependent trigger_audit rows exist');
|
|
457
|
+
END;
|
|
458
|
+
`);
|
|
459
|
+
}
|
|
460
|
+
/** The ordered migration list. Index `i` is migration version `i + 1`; the
|
|
461
|
+
* db's `user_version` tracks how many have been applied. Append only. */
|
|
462
|
+
export const MIGRATIONS = [
|
|
463
|
+
/* v1 */ homeTable,
|
|
464
|
+
/* v2 */ scheduleTable,
|
|
465
|
+
/* v3 */ scheduleFireTable,
|
|
466
|
+
/* v4 */ ingressRouteTable,
|
|
467
|
+
/* v5 */ webhookDeliveryTable,
|
|
468
|
+
/* v6 */ triggerAuditTable,
|
|
469
|
+
/* v7 */ tenantIdentityTriggers,
|
|
470
|
+
/* v8 */ parentIdentityUpdateGuards,
|
|
471
|
+
];
|
|
472
|
+
/** Bring `db` up to the latest schema version. Reads `user_version`, runs
|
|
473
|
+
* each pending migration in order, and bumps `user_version` after each so
|
|
474
|
+
* the work is gated and idempotent: re-running is a no-op once
|
|
475
|
+
* `user_version` reaches `MIGRATIONS.length`. Forward-only. */
|
|
476
|
+
export function migrate(db) {
|
|
477
|
+
let v = db.prepare('PRAGMA user_version').get().user_version;
|
|
478
|
+
for (; v < MIGRATIONS.length; v++) {
|
|
479
|
+
MIGRATIONS[v](db);
|
|
480
|
+
// `user_version` takes no bound parameters; v is a controlled integer.
|
|
481
|
+
db.exec(`PRAGMA user_version = ${v + 1}`);
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
const handles = new Map();
|
|
485
|
+
/** Open (or reuse) the CP db at `path`, initializing WAL + schema on first
|
|
486
|
+
* open. This is the SOLE function in the codebase that may construct a
|
|
487
|
+
* `DatabaseSync` against the CP db file — every CP store goes through this
|
|
488
|
+
* (directly or via `getControlPlaneDb()`) and never opens its own
|
|
489
|
+
* connection. Keyed by path so tests with distinct temp dbs get independent
|
|
490
|
+
* handles, exactly like `src/core/canvas/db.ts`'s `openDb()`. */
|
|
491
|
+
export function openControlPlaneDb(path) {
|
|
492
|
+
const existing = handles.get(path);
|
|
493
|
+
if (existing) {
|
|
494
|
+
try {
|
|
495
|
+
existing.prepare('PRAGMA database_list').all();
|
|
496
|
+
return existing;
|
|
497
|
+
}
|
|
498
|
+
catch {
|
|
499
|
+
try {
|
|
500
|
+
existing.close();
|
|
501
|
+
}
|
|
502
|
+
catch {
|
|
503
|
+
/* ignore */
|
|
504
|
+
}
|
|
505
|
+
handles.delete(path);
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
const dir = dirname(path);
|
|
509
|
+
if (!existsSync(dir))
|
|
510
|
+
mkdirSync(dir, { recursive: true });
|
|
511
|
+
const db = new DatabaseSync(path);
|
|
512
|
+
db.exec('PRAGMA journal_mode = WAL;');
|
|
513
|
+
db.exec('PRAGMA foreign_keys = ON;');
|
|
514
|
+
db.exec('PRAGMA busy_timeout = 5000;');
|
|
515
|
+
migrate(db);
|
|
516
|
+
handles.set(path, db);
|
|
517
|
+
return db;
|
|
518
|
+
}
|
|
519
|
+
/** The cached handle accessor every CP store (registry, scheduler, ingress)
|
|
520
|
+
* imports — resolves the db path the standard way and opens/reuses the one
|
|
521
|
+
* connection for it. Never construct a second `DatabaseSync` against the CP
|
|
522
|
+
* db elsewhere in the codebase. */
|
|
523
|
+
export function getControlPlaneDb(env = process.env) {
|
|
524
|
+
return openControlPlaneDb(controlPlaneDbPath(env));
|
|
525
|
+
}
|
|
526
|
+
/** Close and forget the handle for `path` (defaults to the standard
|
|
527
|
+
* resolved path). Mainly for tests. */
|
|
528
|
+
export function closeControlPlaneDb(path = controlPlaneDbPath()) {
|
|
529
|
+
const db = handles.get(path);
|
|
530
|
+
if (db) {
|
|
531
|
+
db.close();
|
|
532
|
+
handles.delete(path);
|
|
533
|
+
}
|
|
534
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface RateLimiterConfig {
|
|
2
|
+
/** Per-key burst size (max tokens for one routing key). */
|
|
3
|
+
capacity: number;
|
|
4
|
+
/** Per-key steady-state refill rate (tokens/second). */
|
|
5
|
+
refillPerSec: number;
|
|
6
|
+
/** Global burst ceiling across all keys. */
|
|
7
|
+
globalCapacity: number;
|
|
8
|
+
/** Global steady-state refill rate (tokens/second). */
|
|
9
|
+
globalRefillPerSec: number;
|
|
10
|
+
/** Injectable clock for tests. Defaults to `Date.now`. */
|
|
11
|
+
now?: () => number;
|
|
12
|
+
}
|
|
13
|
+
export interface RateCheckResult {
|
|
14
|
+
ok: boolean;
|
|
15
|
+
retryAfterMs?: number;
|
|
16
|
+
}
|
|
17
|
+
export declare function loadRateLimiterConfig(env?: NodeJS.ProcessEnv): RateLimiterConfig;
|
|
18
|
+
export interface RateLimiter {
|
|
19
|
+
checkRate(key: string): RateCheckResult;
|
|
20
|
+
}
|
|
21
|
+
/** Build a token-bucket rate limiter. Each distinct `key` gets its own bucket
|
|
22
|
+
* plus a single shared global bucket; a request must draw one token from BOTH
|
|
23
|
+
* to pass. */
|
|
24
|
+
export declare function createRateLimiter(config: RateLimiterConfig): RateLimiter;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
// control-plane/ingress/rate-limit.ts — the R-TRIG-4 pre-resolution ingress
|
|
2
|
+
// rate limiter (master plan P5.2). Burst protection on inbound ingress ONLY,
|
|
3
|
+
// evaluated BEFORE any route lookup / secret resolution / DB write, so a flood
|
|
4
|
+
// against an unknown or unverified routing key is shed cheaply and can never
|
|
5
|
+
// amplify into DB work.
|
|
6
|
+
//
|
|
7
|
+
// An in-memory token bucket keyed by the caller-supplied key (the ingress
|
|
8
|
+
// `routing_key`) plus a coarse GLOBAL ceiling. In-memory is acceptable this
|
|
9
|
+
// increment because the CP is a single always-on instance (design D1 / R-CP-1,
|
|
10
|
+
// HA out of scope) — there is no distributed limiter to coordinate. Detailed
|
|
11
|
+
// backoff tuning is out of scope (part-plan gap note 3): sane defaults only.
|
|
12
|
+
const ENV = {
|
|
13
|
+
capacity: 'CRTR_HEARTH_CP_WEBHOOK_RATE_CAPACITY',
|
|
14
|
+
refillPerSec: 'CRTR_HEARTH_CP_WEBHOOK_RATE_REFILL_PER_SEC',
|
|
15
|
+
globalCapacity: 'CRTR_HEARTH_CP_WEBHOOK_RATE_GLOBAL_CAPACITY',
|
|
16
|
+
globalRefillPerSec: 'CRTR_HEARTH_CP_WEBHOOK_RATE_GLOBAL_REFILL_PER_SEC',
|
|
17
|
+
};
|
|
18
|
+
const DEFAULTS = {
|
|
19
|
+
capacity: 20,
|
|
20
|
+
refillPerSec: 5,
|
|
21
|
+
globalCapacity: 200,
|
|
22
|
+
globalRefillPerSec: 50,
|
|
23
|
+
};
|
|
24
|
+
function parsePositive(value, fallback) {
|
|
25
|
+
if (value === undefined || value.trim() === '')
|
|
26
|
+
return fallback;
|
|
27
|
+
const parsed = Number(value);
|
|
28
|
+
if (!Number.isFinite(parsed) || parsed <= 0)
|
|
29
|
+
return fallback;
|
|
30
|
+
return parsed;
|
|
31
|
+
}
|
|
32
|
+
export function loadRateLimiterConfig(env = process.env) {
|
|
33
|
+
return {
|
|
34
|
+
capacity: parsePositive(env[ENV.capacity], DEFAULTS.capacity),
|
|
35
|
+
refillPerSec: parsePositive(env[ENV.refillPerSec], DEFAULTS.refillPerSec),
|
|
36
|
+
globalCapacity: parsePositive(env[ENV.globalCapacity], DEFAULTS.globalCapacity),
|
|
37
|
+
globalRefillPerSec: parsePositive(env[ENV.globalRefillPerSec], DEFAULTS.globalRefillPerSec),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/** Bound on distinct live per-key buckets before an idle sweep runs. A sweep
|
|
41
|
+
* drops any bucket that has refilled back to full capacity (i.e. been idle
|
|
42
|
+
* long enough to be indistinguishable from a fresh one), so an attacker
|
|
43
|
+
* cycling through unbounded distinct routing keys cannot grow the map without
|
|
44
|
+
* limit — they are already shed by the global ceiling. */
|
|
45
|
+
const MAX_KEY_BUCKETS = 10_000;
|
|
46
|
+
/** Build a token-bucket rate limiter. Each distinct `key` gets its own bucket
|
|
47
|
+
* plus a single shared global bucket; a request must draw one token from BOTH
|
|
48
|
+
* to pass. */
|
|
49
|
+
export function createRateLimiter(config) {
|
|
50
|
+
const now = config.now ?? (() => Date.now());
|
|
51
|
+
const keyBuckets = new Map();
|
|
52
|
+
const globalBucket = { tokens: config.globalCapacity, lastRefillMs: now() };
|
|
53
|
+
function refill(bucket, capacity, refillPerSec, atMs) {
|
|
54
|
+
const elapsedSec = Math.max(0, (atMs - bucket.lastRefillMs) / 1000);
|
|
55
|
+
bucket.tokens = Math.min(capacity, bucket.tokens + elapsedSec * refillPerSec);
|
|
56
|
+
bucket.lastRefillMs = atMs;
|
|
57
|
+
}
|
|
58
|
+
function retryAfterMs(deficit, refillPerSec) {
|
|
59
|
+
return Math.max(1, Math.ceil((deficit / refillPerSec) * 1000));
|
|
60
|
+
}
|
|
61
|
+
/** Drop every key bucket that has refilled to full capacity as of `atMs` —
|
|
62
|
+
* such a bucket is behaviourally identical to a fresh one, so removing it
|
|
63
|
+
* loses no rate state while reclaiming memory. Active (partially-drained)
|
|
64
|
+
* buckets are kept so their limits still bite. */
|
|
65
|
+
function sweepIdle(atMs) {
|
|
66
|
+
for (const [key, bucket] of keyBuckets) {
|
|
67
|
+
refill(bucket, config.capacity, config.refillPerSec, atMs);
|
|
68
|
+
if (bucket.tokens >= config.capacity)
|
|
69
|
+
keyBuckets.delete(key);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
checkRate(key) {
|
|
74
|
+
const atMs = now();
|
|
75
|
+
// Global ceiling first — a flood across many keys is shed even if each
|
|
76
|
+
// individual key is under its own limit.
|
|
77
|
+
refill(globalBucket, config.globalCapacity, config.globalRefillPerSec, atMs);
|
|
78
|
+
if (globalBucket.tokens < 1) {
|
|
79
|
+
return { ok: false, retryAfterMs: retryAfterMs(1 - globalBucket.tokens, config.globalRefillPerSec) };
|
|
80
|
+
}
|
|
81
|
+
let bucket = keyBuckets.get(key);
|
|
82
|
+
if (bucket === undefined) {
|
|
83
|
+
if (keyBuckets.size >= MAX_KEY_BUCKETS)
|
|
84
|
+
sweepIdle(atMs);
|
|
85
|
+
bucket = { tokens: config.capacity, lastRefillMs: atMs };
|
|
86
|
+
keyBuckets.set(key, bucket);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
refill(bucket, config.capacity, config.refillPerSec, atMs);
|
|
90
|
+
}
|
|
91
|
+
if (bucket.tokens < 1) {
|
|
92
|
+
return { ok: false, retryAfterMs: retryAfterMs(1 - bucket.tokens, config.refillPerSec) };
|
|
93
|
+
}
|
|
94
|
+
// Draw from both buckets only when both admit the request.
|
|
95
|
+
bucket.tokens -= 1;
|
|
96
|
+
globalBucket.tokens -= 1;
|
|
97
|
+
return { ok: true };
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export type IngressChannel = 'webhook' | 'sms' | 'email' | `chat-${string}` | 'discord-gateway' | 'imap-idle';
|
|
2
|
+
export interface IngressRouteRow {
|
|
3
|
+
route_id: string;
|
|
4
|
+
tenant_id: string;
|
|
5
|
+
user_id: string;
|
|
6
|
+
home_id: string;
|
|
7
|
+
channel: IngressChannel;
|
|
8
|
+
routing_key: string;
|
|
9
|
+
routing_key_kind: string;
|
|
10
|
+
channel_secret_ref: string | null;
|
|
11
|
+
delivery_template: unknown;
|
|
12
|
+
enabled: boolean;
|
|
13
|
+
created_at: string;
|
|
14
|
+
updated_at: string;
|
|
15
|
+
}
|
|
16
|
+
export interface RegisterRouteInput {
|
|
17
|
+
route_id?: string;
|
|
18
|
+
home_id: string;
|
|
19
|
+
channel: IngressChannel;
|
|
20
|
+
routing_key: string;
|
|
21
|
+
routing_key_kind: string;
|
|
22
|
+
channel_secret_ref?: string | null;
|
|
23
|
+
delivery_template: unknown;
|
|
24
|
+
enabled?: boolean;
|
|
25
|
+
now?: string;
|
|
26
|
+
}
|
|
27
|
+
export declare function registerRoute(input: RegisterRouteInput): IngressRouteRow;
|
|
28
|
+
export declare function getRouteById(routeId: string): IngressRouteRow | null;
|
|
29
|
+
export declare function resolveRoute(channel: IngressChannel, routingKey: string): IngressRouteRow | null;
|
|
30
|
+
export declare function listRoutesForUser(tenantId: string, userId: string): IngressRouteRow[];
|
|
31
|
+
export declare function setRouteEnabled(routeId: string, enabled: boolean, now?: string): void;
|