@crouton-kit/crouter 0.3.33 → 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 +2 -2
- package/dist/build-root.js +3 -6
- package/dist/builtin-memory/crouter-development/marketplaces.md +6 -6
- package/dist/builtin-memory/crouter-development/plugins.md +13 -13
- package/dist/builtin-memory/internal/examples/imessage-assistant.md +3 -3
- package/dist/builtin-memory/internal/nodes-and-canvas.md +4 -4
- package/dist/builtin-personas/developer/PERSONA.md +1 -1
- package/dist/builtin-personas/orchestration-kernel.md +1 -1
- package/dist/builtin-personas/waiting.md +1 -1
- package/dist/builtin-pi-packages/pi-crtr-extensions/README.md +71 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/crtr-help-gate.test.ts +41 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/provider-rotation.test.ts +663 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +52 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +418 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crouter-help.ts +87 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crtr-commands/filters.json +7 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crtr-commands/index.ts +174 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crtr-help-gate.ts +408 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +442 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +119 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/nested-context.ts +327 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +574 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/statusline.ts +260 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/strip-skills-docs.ts +40 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/sysprompt-window.ts +19 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/lib/package.json +3 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/lib/subscription-state.js +1 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/lib/subscription-state.ts +479 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/LICENSE +13 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/README.md +172 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/bin.mjs +11 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-collection.js +88 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-doc.js +43 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-node.js +109 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-scalar.js +86 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/composer.js +219 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-block-map.js +115 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +198 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +49 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-end.js +37 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +207 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +225 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-props.js +146 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-contains-newline.js +34 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +26 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +15 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-map-includes.js +13 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/Document.js +335 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/anchors.js +71 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/applyReviver.js +55 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/createNode.js +88 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/directives.js +176 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/errors.js +57 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/index.js +17 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/log.js +11 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Alias.js +116 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Collection.js +147 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Node.js +38 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Pair.js +36 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Scalar.js +24 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/YAMLMap.js +144 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +113 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +63 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/identity.js +36 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/toJS.js +37 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst-scalar.js +214 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst-stringify.js +61 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst-visit.js +97 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst.js +98 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/lexer.js +721 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/line-counter.js +39 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/parser.js +975 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/public-api.js +102 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/Schema.js +37 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/map.js +17 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/null.js +15 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/seq.js +17 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/string.js +14 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/bool.js +19 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/float.js +43 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/int.js +38 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/schema.js +23 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/json/schema.js +62 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/tags.js +96 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +58 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +26 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +46 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +71 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +67 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +74 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +78 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +39 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +93 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +101 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +146 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringify.js +129 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +153 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyComment.js +20 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +85 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +25 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyPair.js +150 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyString.js +336 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/util.js +11 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/visit.js +233 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/index.js +5 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/package.json +3 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/cli.d.ts +8 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/cli.mjs +201 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-collection.d.ts +11 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-collection.js +90 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-doc.d.ts +7 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-doc.js +45 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-node.d.ts +29 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-node.js +112 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-scalar.d.ts +5 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-scalar.js +88 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/composer.d.ts +63 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/composer.js +224 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-map.d.ts +6 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-map.js +117 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +11 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-scalar.js +200 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +6 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-seq.js +51 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-end.d.ts +6 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-end.js +39 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +7 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-collection.js +209 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +10 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-scalar.js +227 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-props.d.ts +23 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-props.js +148 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-contains-newline.d.ts +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-contains-newline.js +36 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-empty-scalar-position.js +28 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +3 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-flow-indent-check.js +17 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-map-includes.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-map-includes.js +15 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/Document.d.ts +141 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/Document.js +337 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/anchors.d.ts +24 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/anchors.js +76 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/applyReviver.d.ts +9 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/applyReviver.js +57 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/createNode.d.ts +17 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/createNode.js +90 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/directives.d.ts +49 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/directives.js +178 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/errors.d.ts +21 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/errors.js +62 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/index.d.ts +25 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/index.js +50 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/log.d.ts +3 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/log.js +19 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Alias.d.ts +29 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Alias.js +118 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Collection.d.ts +73 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Collection.js +151 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Node.d.ts +53 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Node.js +40 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Pair.d.ts +22 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Pair.js +39 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Scalar.d.ts +47 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Scalar.js +27 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLMap.d.ts +53 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLMap.js +147 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +60 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLSeq.js +115 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/addPairToJSMap.js +65 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/identity.d.ts +23 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/identity.js +53 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/toJS.d.ts +29 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/toJS.js +39 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/options.d.ts +350 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-scalar.d.ts +64 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-scalar.js +218 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-stringify.d.ts +8 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-stringify.js +63 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-visit.d.ts +39 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-visit.js +99 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst.d.ts +109 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst.js +112 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/lexer.d.ts +87 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/lexer.js +723 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/line-counter.d.ts +22 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/line-counter.js +41 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/parser.d.ts +84 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/parser.js +980 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/public-api.d.ts +44 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/public-api.js +107 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/Schema.d.ts +17 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/Schema.js +39 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/map.d.ts +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/map.js +19 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/null.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/null.js +17 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/seq.d.ts +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/seq.js +19 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/string.d.ts +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/string.js +16 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/bool.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/bool.js +21 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/float.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/float.js +47 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/int.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/int.js +42 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/schema.d.ts +1 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/schema.js +25 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/json/schema.d.ts +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/json/schema.js +64 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/json-schema.d.ts +69 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/tags.d.ts +48 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/tags.js +99 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/types.d.ts +92 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/binary.js +70 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +7 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/bool.js +29 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/float.js +50 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +5 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/int.js +76 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +9 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/merge.js +71 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +22 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/omap.js +77 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +10 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +82 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +1 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/schema.js +41 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +28 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/set.js +96 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +6 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +105 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +34 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/foldFlowLines.js +151 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringify.d.ts +21 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringify.js +132 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +17 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyCollection.js +155 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyComment.d.ts +10 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyComment.js +24 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyDocument.js +87 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyNumber.js +27 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyPair.d.ts +3 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyPair.js +152 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyString.d.ts +9 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyString.js +338 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/test-events.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/test-events.js +134 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/util.d.ts +16 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/util.js +28 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/visit.d.ts +102 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/visit.js +236 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/package.json +97 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/util.js +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/package-lock.json +3385 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/package.json +25 -0
- package/dist/builtin-pi-packages/pi-mode-switch/README.md +64 -0
- package/dist/builtin-pi-packages/pi-mode-switch/bin/mode +40 -0
- package/dist/builtin-pi-packages/pi-mode-switch/extensions/index.ts +422 -0
- package/dist/builtin-pi-packages/pi-mode-switch/package.json +13 -0
- package/dist/clients/attach/__tests__/crtr-output-coverage.test.js +55 -0
- package/dist/clients/attach/__tests__/crtr-output-render.test.js +2340 -0
- package/dist/clients/attach/attach-cmd.js +826 -754
- package/dist/clients/attach/auth-pickers.js +2 -2
- package/dist/clients/attach/canvas-panels.js +1 -1
- package/dist/clients/attach/chat-view.d.ts +3 -2
- package/dist/clients/attach/chat-view.js +30 -10
- package/dist/clients/attach/clipboard-image.js +1 -1
- package/dist/clients/attach/clipboard-text.js +1 -1
- package/dist/clients/attach/config-load.js +1 -1
- package/dist/clients/attach/crtr-output-render.d.ts +48 -0
- package/dist/clients/attach/crtr-output-render.js +646 -0
- package/dist/clients/attach/extension-dialogs.js +1 -1
- package/dist/clients/attach/graph-overlay.js +3 -3
- package/dist/clients/attach/input-controller.js +1 -1
- package/dist/clients/attach/pickers.js +1 -1
- package/dist/clients/attach/slash-commands.js +5 -6
- package/dist/clients/attach/titled-editor.d.ts +4 -0
- package/dist/clients/attach/titled-editor.js +13 -1
- package/dist/clients/attach/view-socket.js +1 -1
- package/dist/clients/web/__tests__/source-cache.test.js +5 -5
- package/dist/clients/web/server.js +29 -5
- package/dist/clients/web/source-cache.js +3 -3
- package/dist/clients/web/web-cmd.js +7 -7
- package/dist/commands/canvas-issue.js +1 -1
- package/dist/commands/canvas-prune.js +24 -2
- package/dist/commands/canvas-snapshot.js +3 -0
- package/dist/commands/canvas-tmux-spread.js +3 -3
- package/dist/commands/human.js +1 -1
- package/dist/commands/memory/lint.js +15 -8
- package/dist/commands/memory/origin.d.ts +1 -0
- package/dist/commands/memory/origin.js +88 -0
- package/dist/commands/memory/shared.d.ts +8 -0
- package/dist/commands/memory/shared.js +22 -1
- package/dist/commands/memory/write.js +17 -12
- package/dist/commands/memory.js +4 -3
- package/dist/commands/node-context.js +4 -4
- package/dist/commands/node-snapshot.js +4 -1
- package/dist/commands/node.d.ts +2 -2
- package/dist/commands/node.js +814 -606
- package/dist/commands/pkg/market-inspect.d.ts +2 -1
- package/dist/commands/pkg/market-inspect.js +14 -32
- package/dist/commands/pkg/market-manage.d.ts +3 -1
- package/dist/commands/pkg/market-manage.js +58 -154
- package/dist/commands/pkg/market.js +7 -7
- package/dist/commands/pkg/plugin-inspect.d.ts +2 -1
- package/dist/commands/pkg/plugin-inspect.js +8 -24
- package/dist/commands/pkg/plugin-manage.d.ts +5 -1
- package/dist/commands/pkg/plugin-manage.js +245 -171
- package/dist/commands/pkg/plugin.js +6 -6
- package/dist/commands/pkg.js +5 -5
- package/dist/commands/revive.js +5 -3
- package/dist/commands/search/answer.js +1 -1
- package/dist/commands/search/contents.js +1 -1
- package/dist/commands/search/web.js +2 -2
- package/dist/commands/search.js +1 -1
- package/dist/commands/surface.d.ts +2 -0
- package/dist/commands/surface.js +43 -0
- package/dist/commands/sys/promptstudio.js +1 -1
- package/dist/commands/sys/settings.js +2 -2
- package/dist/commands/sys/setup-core.d.ts +88 -0
- package/dist/commands/sys/setup-core.js +352 -0
- package/dist/commands/sys/setup.d.ts +2 -0
- package/dist/commands/sys/setup.js +516 -0
- package/dist/commands/sys/sysprompt.js +3 -0
- package/dist/commands/sys.js +3 -2
- package/dist/commands/view-cycle.js +5 -5
- package/dist/commands/view-list.js +3 -3
- package/dist/commands/view-new.js +5 -5
- package/dist/commands/view-pick.js +6 -6
- package/dist/commands/view-run.js +14 -14
- package/dist/commands/view.js +3 -3
- package/dist/commands/workspace.js +10 -10
- package/dist/core/__tests__/boot.test.js +140 -0
- package/dist/core/__tests__/broker-sdk-wiring.test.js +6 -27
- package/dist/core/__tests__/daemon-boot.test.js +22 -0
- package/dist/core/__tests__/fixtures/fake-engine.js +1 -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__/hearth-bootstrap.test.js +136 -0
- package/dist/core/__tests__/helpers/harness.js +1 -1
- 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 +124 -0
- package/dist/core/__tests__/on-read-dedup-resume.test.js +40 -0
- package/dist/core/__tests__/preview-registry-sync.test.js +36 -0
- package/dist/core/__tests__/prune-to-limit.test.js +91 -0
- package/dist/core/__tests__/revive.test.js +64 -21
- package/dist/core/__tests__/trigger-migration.test.js +48 -0
- package/dist/core/__tests__/wake-bearings.test.js +23 -21
- package/dist/core/__tests__/wake-origin.test.js +36 -33
- package/dist/core/canvas/boot.d.ts +48 -0
- package/dist/core/canvas/boot.js +157 -0
- package/dist/core/canvas/canvas.d.ts +27 -1
- package/dist/core/canvas/canvas.js +86 -5
- package/dist/core/canvas/db.js +86 -1
- package/dist/core/canvas/index.d.ts +1 -1
- package/dist/core/canvas/index.js +1 -1
- package/dist/core/canvas/nav-model.js +1 -1
- package/dist/core/canvas/pid.d.ts +6 -0
- package/dist/core/canvas/pid.js +13 -0
- package/dist/core/canvas/triggers.d.ts +108 -0
- package/dist/core/canvas/triggers.js +320 -0
- package/dist/core/canvas/types.d.ts +128 -46
- package/dist/core/command.js +13 -4
- package/dist/core/hearth/__tests__/model-auth-guest.test.js +151 -0
- package/dist/core/hearth/config.d.ts +1 -0
- package/dist/core/hearth/config.js +36 -0
- package/dist/core/hearth/guest-env.d.ts +7 -0
- package/dist/core/hearth/guest-env.js +17 -1
- 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 +13 -6
- package/dist/core/hearth/providers/blaxel-bootstrap.d.ts +2 -0
- package/dist/core/hearth/providers/blaxel-bootstrap.js +127 -19
- package/dist/core/hearth/providers/blaxel-home.d.ts +8 -4
- package/dist/core/hearth/providers/blaxel-home.js +85 -75
- package/dist/core/hearth/providers/blaxel.d.ts +5 -0
- package/dist/core/hearth/providers/blaxel.js +86 -12
- package/dist/core/hearth/providers/types.d.ts +6 -1
- package/dist/core/hearth/registry.js +2 -1
- package/dist/core/hearth/types.d.ts +35 -0
- package/dist/core/help.d.ts +16 -0
- package/dist/core/help.js +2 -0
- package/dist/core/memory-resolver.d.ts +8 -8
- package/dist/core/memory-resolver.js +58 -26
- package/dist/core/preview-registry.d.ts +25 -0
- package/dist/core/preview-registry.js +2047 -0
- package/dist/core/resolver.d.ts +1 -0
- package/dist/core/resolver.js +23 -16
- package/dist/core/runtime/bearings.d.ts +11 -10
- package/dist/core/runtime/bearings.js +8 -8
- package/dist/core/runtime/broker-protocol.d.ts +2 -2
- package/dist/core/runtime/broker-protocol.js +2 -2
- package/dist/core/runtime/close.js +2 -2
- package/dist/core/runtime/kickoff.js +1 -1
- package/dist/core/runtime/launch.d.ts +9 -3
- package/dist/core/runtime/launch.js +17 -9
- package/dist/core/runtime/lifecycle.js +7 -7
- package/dist/core/runtime/model-swap.js +1 -1
- package/dist/core/runtime/placement.d.ts +5 -5
- package/dist/core/runtime/placement.js +10 -10
- package/dist/core/runtime/recycle.js +7 -7
- package/dist/core/runtime/reset.d.ts +1 -1
- package/dist/core/runtime/reset.js +3 -3
- package/dist/core/runtime/revive-all.d.ts +5 -2
- package/dist/core/runtime/revive-all.js +5 -2
- package/dist/core/runtime/revive.d.ts +15 -8
- package/dist/core/runtime/revive.js +52 -16
- package/dist/core/runtime/spawn.d.ts +1 -1
- package/dist/core/runtime/spawn.js +7 -7
- package/dist/core/runtime/stop-guard.js +5 -5
- package/dist/core/runtime/surface-bg.js +1 -1
- package/dist/core/runtime/tmux.d.ts +1 -1
- package/dist/core/runtime/tmux.js +4 -4
- package/dist/core/scope.d.ts +9 -0
- package/dist/core/scope.js +37 -15
- package/dist/core/substrate/on-read.js +23 -21
- package/dist/core/substrate/render.js +3 -3
- package/dist/core/view/loader.js +2 -2
- package/dist/core/wake.d.ts +2 -2
- package/dist/core/wake.js +7 -7
- package/dist/daemon/__tests__/predicate-eval.test.js +109 -0
- package/dist/daemon/crtrd.js +222 -103
- package/dist/daemon/predicate-eval.d.ts +52 -0
- package/dist/daemon/predicate-eval.js +248 -0
- package/dist/hearth/control-plane/__tests__/node-message.test.js +60 -0
- package/dist/hearth/control-plane/__tests__/rate-limit-recurrence.test.js +49 -0
- package/dist/hearth/control-plane/__tests__/relay-security.test.js +314 -0
- package/dist/hearth/control-plane/__tests__/scheduler-scan-loop.test.js +133 -0
- package/dist/hearth/control-plane/__tests__/trigger-delivery.test.js +170 -0
- package/dist/hearth/control-plane/__tests__/webhook-ingress.test.js +167 -0
- package/dist/hearth/control-plane/config.d.ts +21 -0
- package/dist/hearth/control-plane/config.js +77 -0
- package/dist/hearth/control-plane/db.d.ts +30 -0
- package/dist/hearth/control-plane/db.js +534 -0
- package/dist/hearth/control-plane/ingress/rate-limit.d.ts +24 -0
- package/dist/hearth/control-plane/ingress/rate-limit.js +100 -0
- package/dist/hearth/control-plane/ingress/route-store.d.ts +31 -0
- package/dist/hearth/control-plane/ingress/route-store.js +61 -0
- package/dist/hearth/control-plane/ingress/webhook-delivery-store.d.ts +41 -0
- package/dist/hearth/control-plane/ingress/webhook-delivery-store.js +69 -0
- package/dist/hearth/control-plane/ingress/webhook-route.d.ts +55 -0
- package/dist/hearth/control-plane/ingress/webhook-route.js +285 -0
- package/dist/hearth/control-plane/main.js +88 -0
- package/dist/hearth/control-plane/node-message.d.ts +31 -0
- package/dist/hearth/control-plane/node-message.js +98 -0
- package/dist/hearth/control-plane/register.d.ts +15 -0
- package/dist/hearth/control-plane/register.js +34 -0
- package/dist/hearth/control-plane/registry.d.ts +17 -0
- package/dist/hearth/control-plane/registry.js +161 -0
- package/dist/hearth/control-plane/relay.d.ts +40 -0
- package/dist/hearth/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/wake.d.ts +80 -0
- package/dist/hearth/control-plane/wake.js +312 -0
- package/dist/hearth/wake-proxy/__tests__/guest-source.test.js +2 -2
- package/dist/hearth/wake-proxy/home.d.ts +2 -8
- package/dist/hearth/wake-proxy/home.js +48 -12
- package/dist/pi-extensions/canvas-doc-substrate.js +28 -2
- package/dist/pi-extensions/canvas-nav.js +1 -1
- package/dist/prompts/view.js +7 -8
- package/dist/types.js +4 -4
- package/dist/web-client/assets/{index-D36PNBj4.js → index-BRKxe-hy.js} +2 -2
- package/dist/web-client/index.html +1 -1
- package/package.json +12 -8
- package/scripts/postinstall.mjs +8 -0
- package/dist/clients/attach/__tests__/action-parity.test.js +0 -48
- package/dist/clients/attach/__tests__/autocomplete-and-bash-mode.test.js +0 -96
- package/dist/clients/attach/__tests__/bash-bang-routing.test.js +0 -58
- package/dist/clients/attach/__tests__/bundle-pi-tui-dedup.test.js +0 -56
- package/dist/clients/attach/__tests__/clipboard-image.test.js +0 -76
- package/dist/clients/attach/__tests__/editor-newline.test.js +0 -82
- package/dist/clients/attach/__tests__/git-info.test.js +0 -31
- package/dist/clients/attach/__tests__/onrequest-wired.test.js +0 -20
- package/dist/clients/attach/__tests__/reconnect-giveup.test.js +0 -30
- package/dist/clients/attach/__tests__/slash-quit-copy.test.js +0 -42
- package/dist/clients/attach/__tests__/titled-editor.test.js +0 -60
- package/dist/commands/memory/__tests__/lint-schema.test.js +0 -52
- package/dist/core/__tests__/argv-parser.test.js +0 -217
- package/dist/core/__tests__/artifact-paths.test.js +0 -44
- package/dist/core/__tests__/draw-style.test.js +0 -258
- package/dist/core/__tests__/editor-label.test.js +0 -26
- package/dist/core/__tests__/fault-marker.test.js +0 -112
- package/dist/core/__tests__/fault-retry-rewind.test.d.ts +0 -1
- package/dist/core/__tests__/fault-retry-rewind.test.js +0 -123
- package/dist/core/__tests__/frame-decoder-perf.test.d.ts +0 -1
- package/dist/core/__tests__/frame-decoder-perf.test.js +0 -224
- package/dist/core/__tests__/keystone.test.d.ts +0 -1
- package/dist/core/__tests__/keystone.test.js +0 -185
- package/dist/core/__tests__/listing-completeness.test.d.ts +0 -1
- package/dist/core/__tests__/listing-completeness.test.js +0 -31
- package/dist/core/__tests__/memory-resolver.test.d.ts +0 -1
- package/dist/core/__tests__/memory-resolver.test.js +0 -119
- package/dist/core/__tests__/memory.test.d.ts +0 -1
- package/dist/core/__tests__/memory.test.js +0 -60
- package/dist/core/__tests__/model-ladders.test.d.ts +0 -1
- package/dist/core/__tests__/model-ladders.test.js +0 -160
- package/dist/core/__tests__/node-env.test.d.ts +0 -1
- package/dist/core/__tests__/node-env.test.js +0 -26
- package/dist/core/__tests__/pane-column.test.d.ts +0 -1
- package/dist/core/__tests__/pane-column.test.js +0 -153
- package/dist/core/__tests__/persona-compose.test.d.ts +0 -1
- package/dist/core/__tests__/persona-compose.test.js +0 -53
- package/dist/core/__tests__/persona-subkind.test.d.ts +0 -1
- package/dist/core/__tests__/persona-subkind.test.js +0 -65
- package/dist/core/__tests__/persona.test.d.ts +0 -1
- package/dist/core/__tests__/persona.test.js +0 -107
- package/dist/core/__tests__/unknown-path.test.d.ts +0 -1
- package/dist/core/__tests__/unknown-path.test.js +0 -58
- package/dist/core/canvas/wakeups.d.ts +0 -76
- package/dist/core/canvas/wakeups.js +0 -185
- package/dist/hearth/wake-proxy/__tests__/source-bridge-gate.test.d.ts +0 -1
- package/dist/hearth/wake-proxy/__tests__/source-bridge-gate.test.js +0 -455
- /package/dist/clients/attach/__tests__/{action-parity.test.d.ts → crtr-output-coverage.test.d.ts} +0 -0
- /package/dist/clients/attach/__tests__/{autocomplete-and-bash-mode.test.d.ts → crtr-output-render.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/bash-bang-routing.test.d.ts → core/__tests__/boot.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/bundle-pi-tui-dedup.test.d.ts → core/__tests__/hearth-bootstrap.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/clipboard-image.test.d.ts → core/__tests__/preview-registry-sync.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/editor-newline.test.d.ts → core/__tests__/prune-to-limit.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/git-info.test.d.ts → core/__tests__/trigger-migration.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/onrequest-wired.test.d.ts → core/hearth/__tests__/model-auth-guest.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/reconnect-giveup.test.d.ts → daemon/__tests__/predicate-eval.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/slash-quit-copy.test.d.ts → hearth/control-plane/__tests__/node-message.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/titled-editor.test.d.ts → hearth/control-plane/__tests__/rate-limit-recurrence.test.d.ts} +0 -0
- /package/dist/{commands/memory/__tests__/lint-schema.test.d.ts → hearth/control-plane/__tests__/relay-security.test.d.ts} +0 -0
- /package/dist/{core/__tests__/argv-parser.test.d.ts → hearth/control-plane/__tests__/scheduler-scan-loop.test.d.ts} +0 -0
- /package/dist/{core/__tests__/artifact-paths.test.d.ts → hearth/control-plane/__tests__/trigger-delivery.test.d.ts} +0 -0
- /package/dist/{core/__tests__/draw-style.test.d.ts → hearth/control-plane/__tests__/webhook-ingress.test.d.ts} +0 -0
- /package/dist/{core/__tests__/editor-label.test.d.ts → hearth/control-plane/main.d.ts} +0 -0
- /package/dist/{core/__tests__/fault-marker.test.d.ts → hearth/control-plane/types.js} +0 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
// Detects a boot change (a host reboot, or — the case this exists for — a
|
|
2
|
+
// Blaxel/Firecracker microVM destroy+recreate) so callers can stop trusting any
|
|
3
|
+
// `pi_pid` recorded before it.
|
|
4
|
+
//
|
|
5
|
+
// canvas.db is durable — it survives a VM/sandbox destroy+recreate or a host
|
|
6
|
+
// reboot on whatever volume it lives on (see paths.ts / the storage-tiers
|
|
7
|
+
// doc) — but `pi_pid` is a raw OS pid: once the process table resets, a small
|
|
8
|
+
// stale pid can coincidentally collide with an unrelated process that now
|
|
9
|
+
// happens to hold that number, so `isPidAlive` reads it "alive" when the
|
|
10
|
+
// broker it once named is long gone. Left unchecked this fools BOTH the
|
|
11
|
+
// daemon's own liveness poll (crtrd.ts) and reviveNode's double-launch guard
|
|
12
|
+
// (revive.ts) into believing a dead broker is still running — the node then
|
|
13
|
+
// stays permanently unrevivable until a human runs `canvas revive --fresh`.
|
|
14
|
+
//
|
|
15
|
+
// The signal (primary): the Linux kernel's per-boot identity at
|
|
16
|
+
// `/proc/sys/kernel/random/boot_id` — a fresh random UUID minted on every
|
|
17
|
+
// kernel boot. A Firecracker microVM recreate (Blaxel's deployment shape) boots
|
|
18
|
+
// a brand-new kernel, so `boot_id` changes; a plain daemon restart within the
|
|
19
|
+
// same boot leaves it identical. This is an EXACT identity, so on Linux we need
|
|
20
|
+
// no wall-clock window at all. NOTE this detects a *kernel boot*, not an
|
|
21
|
+
// arbitrary container recreate: an ordinary container that shares the host
|
|
22
|
+
// kernel keeps the host's `boot_id` across recreation, so this would NOT fire
|
|
23
|
+
// there — that shape is out of scope (Hearth runs on Firecracker microVMs).
|
|
24
|
+
//
|
|
25
|
+
// The signal (fallback, non-Linux dev only): `os.uptime()` resets to ~0 on a
|
|
26
|
+
// reboot and is otherwise monotonic, so `now - uptime` estimates the current
|
|
27
|
+
// boot's wall-clock start (the "boot epoch"). Used only when `boot_id` is
|
|
28
|
+
// unavailable (e.g. macOS dev), where a genuine reboot/recreate is not a
|
|
29
|
+
// production concern; the epoch comparison keeps a generous tolerance there.
|
|
30
|
+
//
|
|
31
|
+
// The last-seen identity is persisted in canvas.db (the same durable tier the
|
|
32
|
+
// pids live in) as a single `canvas_meta` row, and the compare+sweep runs in
|
|
33
|
+
// ONE `BEGIN IMMEDIATE` transaction so concurrent callers (daemon startup and a
|
|
34
|
+
// manual/direct revive in another process) are serialized: a second caller
|
|
35
|
+
// blocks on the write lock, then reads the marker the first already updated and
|
|
36
|
+
// no-ops, so it can never clear a pid the first just recorded (single-writer).
|
|
37
|
+
import { readFileSync } from 'node:fs';
|
|
38
|
+
import { uptime } from 'node:os';
|
|
39
|
+
import { openDb } from './db.js';
|
|
40
|
+
/** Wall-clock epoch drift (fallback signal only) beyond which two boot-start
|
|
41
|
+
* estimates are called DIFFERENT boots. Absorbs clock-sync jitter (NTP, a VM's
|
|
42
|
+
* first sync after boot) and `os.uptime()`'s ~1s resolution. Only consulted
|
|
43
|
+
* when the exact kernel `boot_id` is unavailable on BOTH sides (non-Linux
|
|
44
|
+
* dev). A false positive would clear a genuinely live pid and let reviveNode
|
|
45
|
+
* double-spawn onto the same session; a false negative just falls back to the
|
|
46
|
+
* manual `--fresh` status quo — so it is kept generous, biased against the
|
|
47
|
+
* dangerous direction. The production target (Linux/Firecracker) never reaches
|
|
48
|
+
* this branch; there `boot_id` is exact. */
|
|
49
|
+
const BOOT_EPOCH_TOLERANCE_MS = 60_000;
|
|
50
|
+
function readKernelBootId() {
|
|
51
|
+
try {
|
|
52
|
+
const id = readFileSync('/proc/sys/kernel/random/boot_id', 'utf8').trim();
|
|
53
|
+
return id.length > 0 ? id : null;
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return null; // non-Linux, or unreadable — fall back to the wall-clock epoch
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/** Identity of the CURRENT OS boot. `now` is injectable for tests. */
|
|
60
|
+
export function currentBootIdentity(now = Date.now()) {
|
|
61
|
+
return { bootId: readKernelBootId(), bootEpochMs: now - Math.round(uptime() * 1000) };
|
|
62
|
+
}
|
|
63
|
+
/** Pure decision core: does `current` belong to a DIFFERENT boot than the
|
|
64
|
+
* persisted `known`? `known === null` (no history — a fresh install, or the
|
|
65
|
+
* first run of a build that added this marker) is never a boot change: there
|
|
66
|
+
* is nothing to contradict it, and treating "no history" as a change could
|
|
67
|
+
* clear genuinely live pids that predate this feature.
|
|
68
|
+
*
|
|
69
|
+
* When BOTH sides carry a kernel `boot_id`, that exact identity decides it — no
|
|
70
|
+
* wall-clock window, so a real quick reboot/recreate (a short-lived prior boot
|
|
71
|
+
* whose start is <60s away) is still detected. Only when a `boot_id` is missing
|
|
72
|
+
* on either side (non-Linux dev) does it fall back to the epoch-drift window.
|
|
73
|
+
* Unit-testable without real uptime/fs. */
|
|
74
|
+
export function bootChanged(current, known) {
|
|
75
|
+
if (known === null)
|
|
76
|
+
return false;
|
|
77
|
+
if (current.bootId !== null && known.bootId !== null) {
|
|
78
|
+
return current.bootId !== known.bootId;
|
|
79
|
+
}
|
|
80
|
+
return Math.abs(current.bootEpochMs - known.bootEpochMs) > BOOT_EPOCH_TOLERANCE_MS;
|
|
81
|
+
}
|
|
82
|
+
const BOOT_MARKER_KEY = 'boot_identity';
|
|
83
|
+
function readBootMarker(db) {
|
|
84
|
+
const row = db
|
|
85
|
+
.prepare('SELECT value FROM canvas_meta WHERE key = ?')
|
|
86
|
+
.get(BOOT_MARKER_KEY);
|
|
87
|
+
if (row === undefined)
|
|
88
|
+
return null;
|
|
89
|
+
try {
|
|
90
|
+
const parsed = JSON.parse(row.value);
|
|
91
|
+
if (typeof parsed.bootEpochMs !== 'number')
|
|
92
|
+
return null;
|
|
93
|
+
return {
|
|
94
|
+
bootId: typeof parsed.bootId === 'string' ? parsed.bootId : null,
|
|
95
|
+
bootEpochMs: parsed.bootEpochMs,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return null; // malformed — treat as "no history yet"
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function writeBootMarker(db, identity) {
|
|
103
|
+
db.prepare('INSERT INTO canvas_meta (key, value) VALUES (?, ?) ' +
|
|
104
|
+
'ON CONFLICT(key) DO UPDATE SET value = excluded.value').run(BOOT_MARKER_KEY, JSON.stringify(identity));
|
|
105
|
+
}
|
|
106
|
+
/** Idempotent and safe to call from every revive entry point (daemon startup,
|
|
107
|
+
* reviveNode): compares the current boot's identity against the last one
|
|
108
|
+
* recorded, and if they differ, clears `pi_pid` on every node that has one —
|
|
109
|
+
* regardless of status, since reviveNode's double-launch guard reads `pi_pid`
|
|
110
|
+
* unconditionally, not just on active/idle rows. The first caller after a
|
|
111
|
+
* genuine boot change does the sweep and persists the new marker; every call
|
|
112
|
+
* after that (in this process or another) reads a matching marker and no-ops.
|
|
113
|
+
*
|
|
114
|
+
* SINGLE-WRITER: the whole read-marker + sweep + write-marker runs in one
|
|
115
|
+
* `BEGIN IMMEDIATE` transaction. A concurrent caller (a manual revive racing
|
|
116
|
+
* daemon startup, in a separate process) blocks on the SQLite write lock until
|
|
117
|
+
* this commits, then reads the already-updated marker and no-ops — so it can
|
|
118
|
+
* never `clearPid` a broker pid the first caller's revive just recorded, which
|
|
119
|
+
* would otherwise hide a live broker behind `pi_pid=NULL` and risk a second
|
|
120
|
+
* broker on the same session.
|
|
121
|
+
*
|
|
122
|
+
* `current` defaults to the real identity; tests inject a synthetic one against
|
|
123
|
+
* an isolated CRTR_HOME to simulate a boot change without a real reboot. */
|
|
124
|
+
export function reconcileBootLiveness(current = currentBootIdentity()) {
|
|
125
|
+
const db = openDb();
|
|
126
|
+
db.exec('BEGIN IMMEDIATE');
|
|
127
|
+
try {
|
|
128
|
+
const known = readBootMarker(db);
|
|
129
|
+
if (!bootChanged(current, known)) {
|
|
130
|
+
if (known === null)
|
|
131
|
+
writeBootMarker(db, current); // seed first-ever marker
|
|
132
|
+
db.exec('COMMIT');
|
|
133
|
+
return { changed: false, cleared: [] };
|
|
134
|
+
}
|
|
135
|
+
const rows = db
|
|
136
|
+
.prepare('SELECT node_id FROM nodes WHERE pi_pid IS NOT NULL')
|
|
137
|
+
.all();
|
|
138
|
+
const upd = db.prepare('UPDATE nodes SET pi_pid = NULL WHERE node_id = ?');
|
|
139
|
+
const cleared = [];
|
|
140
|
+
for (const row of rows) {
|
|
141
|
+
upd.run(row.node_id);
|
|
142
|
+
cleared.push(row.node_id);
|
|
143
|
+
}
|
|
144
|
+
writeBootMarker(db, current);
|
|
145
|
+
db.exec('COMMIT');
|
|
146
|
+
return { changed: true, cleared };
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
try {
|
|
150
|
+
db.exec('ROLLBACK');
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
/* best-effort — nothing was committed */
|
|
154
|
+
}
|
|
155
|
+
throw err;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
@@ -87,7 +87,12 @@ export interface PruneResult {
|
|
|
87
87
|
* analogue of {@link pruneNodes}, for IMMEDIATE reaping — e.g. an empty node the
|
|
88
88
|
* user closed or detached from. Pure persisted-state removal: the caller MUST
|
|
89
89
|
* have already torn down the broker engine + viewer (this does not signal any
|
|
90
|
-
* process).
|
|
90
|
+
* process). Reaps this node's triggers FIRST (spec §Deterministic removal,
|
|
91
|
+
* criterion 15: target deletion kills any in-flight predicate process group and
|
|
92
|
+
* consumes target-bound + owner-armed trigger rows, instead of leaving them to
|
|
93
|
+
* the FK cascade alone with no kill and no notice) via the same
|
|
94
|
+
* `cancelTriggersFor` seam `close`/`cancel` already use. Best-effort dir removal
|
|
95
|
+
* after the row delete, mirroring pruneNodes. */
|
|
91
96
|
export declare function deleteNode(nodeId: string): void;
|
|
92
97
|
/** Retention sweep: remove TERMINAL nodes (status dead | done | canceled) whose
|
|
93
98
|
* `created` is older than `ttlDays`, bounding the otherwise-unbounded growth of
|
|
@@ -111,3 +116,24 @@ export declare function pruneNodes(opts: {
|
|
|
111
116
|
dryRun?: boolean;
|
|
112
117
|
includeStale?: boolean;
|
|
113
118
|
}): PruneResult;
|
|
119
|
+
/** Count-based retention sweep: keep at most `maxNodes` of the MOST-RECENTLY-
|
|
120
|
+
* ACTIVE nodes, but NEVER delete a live node — so the real retained floor is
|
|
121
|
+
* `max(maxNodes, liveCount)`. Bounds the otherwise-unbounded growth the TTL
|
|
122
|
+
* sweep can't (a canvas that never crosses the TTL still grows without limit).
|
|
123
|
+
*
|
|
124
|
+
* Liveness (protected, always kept): status active|idle AND a live `pi_pid` —
|
|
125
|
+
* the SAME signal `pruneNodes`'s `includeStale` and placement use (`isPidAlive`).
|
|
126
|
+
* The caller ($CRTR_NODE_ID) is also always protected.
|
|
127
|
+
*
|
|
128
|
+
* Algorithm: order ALL nodes by recency DESC (telemetry.json mtime, falling back
|
|
129
|
+
* to `created`); `target = max(maxNodes, liveCount)`; delete every node ranked
|
|
130
|
+
* beyond `target` (0-indexed rank >= target) that is NOT live and NOT the caller.
|
|
131
|
+
* Retained = all live + the newest terminal nodes up to `target`.
|
|
132
|
+
*
|
|
133
|
+
* Mirrors {@link pruneNodes} exactly for the delete (shared `deletePrunedNodes`:
|
|
134
|
+
* transactioned row sweep + FK edge cascade + best-effort dir removal). `dryRun`
|
|
135
|
+
* reports the candidate set and deletes NOTHING. */
|
|
136
|
+
export declare function pruneToLimit(opts: {
|
|
137
|
+
maxNodes: number;
|
|
138
|
+
dryRun?: boolean;
|
|
139
|
+
}): PruneResult;
|
|
@@ -4,11 +4,12 @@
|
|
|
4
4
|
// Source-of-truth split: a node's meta.json is canonical for its own fields;
|
|
5
5
|
// the db row is a queryable index re-derivable from it. The subscribes_to edges
|
|
6
6
|
// are db-authoritative (mutable, many-writers — what WAL is for).
|
|
7
|
-
import { existsSync, readFileSync, renameSync, readdirSync, rmSync, openSync, writeSync, fsyncSync, closeSync, } from 'node:fs';
|
|
7
|
+
import { existsSync, readFileSync, renameSync, readdirSync, rmSync, openSync, writeSync, fsyncSync, closeSync, statSync, } from 'node:fs';
|
|
8
8
|
import { join, dirname } from 'node:path';
|
|
9
9
|
import { openDb } from './db.js';
|
|
10
10
|
import { isPidAlive } from './pid.js';
|
|
11
|
-
import {
|
|
11
|
+
import { cancelTriggersFor } from './triggers.js';
|
|
12
|
+
import { ensureHome, ensureNodeDirs, nodeMetaPath, nodeDir, nodesRoot, jobDir, } from './paths.js';
|
|
12
13
|
// ---------------------------------------------------------------------------
|
|
13
14
|
// meta.json (durable identity — the source of truth for what PERSISTS)
|
|
14
15
|
//
|
|
@@ -400,8 +401,14 @@ export function rebuildIndex() {
|
|
|
400
401
|
* analogue of {@link pruneNodes}, for IMMEDIATE reaping — e.g. an empty node the
|
|
401
402
|
* user closed or detached from. Pure persisted-state removal: the caller MUST
|
|
402
403
|
* have already torn down the broker engine + viewer (this does not signal any
|
|
403
|
-
* process).
|
|
404
|
+
* process). Reaps this node's triggers FIRST (spec §Deterministic removal,
|
|
405
|
+
* criterion 15: target deletion kills any in-flight predicate process group and
|
|
406
|
+
* consumes target-bound + owner-armed trigger rows, instead of leaving them to
|
|
407
|
+
* the FK cascade alone with no kill and no notice) via the same
|
|
408
|
+
* `cancelTriggersFor` seam `close`/`cancel` already use. Best-effort dir removal
|
|
409
|
+
* after the row delete, mirroring pruneNodes. */
|
|
404
410
|
export function deleteNode(nodeId) {
|
|
411
|
+
cancelTriggersFor(nodeId);
|
|
405
412
|
openDb().prepare('DELETE FROM nodes WHERE node_id = ?').run(nodeId);
|
|
406
413
|
rmSync(nodeDir(nodeId), { recursive: true, force: true });
|
|
407
414
|
}
|
|
@@ -458,7 +465,24 @@ export function pruneNodes(opts) {
|
|
|
458
465
|
const candidates = [...terminal, ...stale];
|
|
459
466
|
if (dryRun || candidates.length === 0)
|
|
460
467
|
return { pruned: candidates, dryRun };
|
|
461
|
-
|
|
468
|
+
deletePrunedNodes(candidates);
|
|
469
|
+
return { pruned: candidates, dryRun };
|
|
470
|
+
}
|
|
471
|
+
/** Hard-delete a set of pruned nodes: reaps each node's triggers (killing any
|
|
472
|
+
* in-flight predicate process group and consuming target-bound + owner-armed
|
|
473
|
+
* rows — spec criterion 15, the same reap {@link deleteNode} does) BEFORE the
|
|
474
|
+
* transactioned row sweep (the edges→nodes FK, ON DELETE CASCADE, GCs their
|
|
475
|
+
* edges), followed by best-effort on-disk `nodes/<id>/` dir removal. Shared by
|
|
476
|
+
* {@link pruneNodes} (TTL) and {@link pruneToLimit} (count) so the delete
|
|
477
|
+
* semantics never drift. The fs isn't transactional, so dirs are removed AFTER
|
|
478
|
+
* COMMIT — by then the rows are gone, so a re-run never re-finds a
|
|
479
|
+
* half-deleted node. */
|
|
480
|
+
function deletePrunedNodes(candidates) {
|
|
481
|
+
if (candidates.length === 0)
|
|
482
|
+
return;
|
|
483
|
+
for (const c of candidates)
|
|
484
|
+
cancelTriggersFor(c.node_id);
|
|
485
|
+
const db = openDb();
|
|
462
486
|
db.exec('BEGIN');
|
|
463
487
|
try {
|
|
464
488
|
const del = db.prepare('DELETE FROM nodes WHERE node_id = ?');
|
|
@@ -470,9 +494,66 @@ export function pruneNodes(opts) {
|
|
|
470
494
|
db.exec('ROLLBACK');
|
|
471
495
|
throw e;
|
|
472
496
|
}
|
|
473
|
-
// Remove each pruned node's on-disk dir (best-effort, after COMMIT).
|
|
474
497
|
for (const c of candidates) {
|
|
475
498
|
rmSync(nodeDir(c.node_id), { recursive: true, force: true });
|
|
476
499
|
}
|
|
500
|
+
}
|
|
501
|
+
/** "Most recent activity" sort key (epoch ms) read CHEAPLY: a `statSync` (no file
|
|
502
|
+
* read, no parse) of the node's `job/telemetry.json` — rewritten on every
|
|
503
|
+
* turn_end at a deterministic path, so it tracks last-message recency without a
|
|
504
|
+
* meta read. Falls back to `created`'s epoch when a node never ran a turn.
|
|
505
|
+
* Mirrors render.ts's `sessionMtime` (the same key the snapshot roster surfaces
|
|
506
|
+
* as `last_activity`). Never throws. */
|
|
507
|
+
function recencyMs(nodeId, created) {
|
|
508
|
+
try {
|
|
509
|
+
const st = statSync(join(jobDir(nodeId), 'telemetry.json'), { throwIfNoEntry: false });
|
|
510
|
+
if (st !== undefined)
|
|
511
|
+
return st.mtimeMs;
|
|
512
|
+
}
|
|
513
|
+
catch {
|
|
514
|
+
/* fall through to created */
|
|
515
|
+
}
|
|
516
|
+
const t = Date.parse(created);
|
|
517
|
+
return Number.isNaN(t) ? 0 : t;
|
|
518
|
+
}
|
|
519
|
+
/** Count-based retention sweep: keep at most `maxNodes` of the MOST-RECENTLY-
|
|
520
|
+
* ACTIVE nodes, but NEVER delete a live node — so the real retained floor is
|
|
521
|
+
* `max(maxNodes, liveCount)`. Bounds the otherwise-unbounded growth the TTL
|
|
522
|
+
* sweep can't (a canvas that never crosses the TTL still grows without limit).
|
|
523
|
+
*
|
|
524
|
+
* Liveness (protected, always kept): status active|idle AND a live `pi_pid` —
|
|
525
|
+
* the SAME signal `pruneNodes`'s `includeStale` and placement use (`isPidAlive`).
|
|
526
|
+
* The caller ($CRTR_NODE_ID) is also always protected.
|
|
527
|
+
*
|
|
528
|
+
* Algorithm: order ALL nodes by recency DESC (telemetry.json mtime, falling back
|
|
529
|
+
* to `created`); `target = max(maxNodes, liveCount)`; delete every node ranked
|
|
530
|
+
* beyond `target` (0-indexed rank >= target) that is NOT live and NOT the caller.
|
|
531
|
+
* Retained = all live + the newest terminal nodes up to `target`.
|
|
532
|
+
*
|
|
533
|
+
* Mirrors {@link pruneNodes} exactly for the delete (shared `deletePrunedNodes`:
|
|
534
|
+
* transactioned row sweep + FK edge cascade + best-effort dir removal). `dryRun`
|
|
535
|
+
* reports the candidate set and deletes NOTHING. */
|
|
536
|
+
export function pruneToLimit(opts) {
|
|
537
|
+
const dryRun = opts.dryRun ?? false;
|
|
538
|
+
const selfId = process.env['CRTR_NODE_ID'] ?? '';
|
|
539
|
+
const rows = listNodes();
|
|
540
|
+
// Rank ALL nodes by recency DESC, tagging liveness as we go.
|
|
541
|
+
const ranked = rows
|
|
542
|
+
.map((r) => ({
|
|
543
|
+
node_id: r.node_id,
|
|
544
|
+
status: r.status,
|
|
545
|
+
created: r.created,
|
|
546
|
+
recency: recencyMs(r.node_id, r.created),
|
|
547
|
+
live: (r.status === 'active' || r.status === 'idle') && isPidAlive(r.pi_pid),
|
|
548
|
+
}))
|
|
549
|
+
.sort((a, b) => b.recency - a.recency);
|
|
550
|
+
const liveCount = ranked.filter((r) => r.live).length;
|
|
551
|
+
const target = Math.max(opts.maxNodes, liveCount);
|
|
552
|
+
const candidates = ranked
|
|
553
|
+
.filter((r, rank) => rank >= target && !r.live && r.node_id !== selfId)
|
|
554
|
+
.map((r) => ({ node_id: r.node_id, status: r.status, created: r.created }));
|
|
555
|
+
if (dryRun || candidates.length === 0)
|
|
556
|
+
return { pruned: candidates, dryRun };
|
|
557
|
+
deletePrunedNodes(candidates);
|
|
477
558
|
return { pruned: candidates, dryRun };
|
|
478
559
|
}
|
package/dist/core/canvas/db.js
CHANGED
|
@@ -232,7 +232,7 @@ CREATE TABLE IF NOT EXISTS focuses (
|
|
|
232
232
|
* `owner_id` is the ARMER, set on EVERY row, and is deliberately a PLAIN indexed
|
|
233
233
|
* column with NO FK (design D1/D2): an FK on `owner_id` would cascade-drop a
|
|
234
234
|
* crashed-then-pruned armer's detached cron, violating Invariant E. A detached
|
|
235
|
-
* wake is reaped only by the explicit `
|
|
235
|
+
* wake is reaped only by the explicit `cancelTriggersFor` DELETE, never by cascade.
|
|
236
236
|
*
|
|
237
237
|
* `fire_at` is an ISO 8601 UTC string for the NEXT occurrence, so the per-tick
|
|
238
238
|
* due query is a lexicographic `<=` compare. The partial unique index
|
|
@@ -256,6 +256,76 @@ CREATE INDEX IF NOT EXISTS idx_wakeups_owner ON wakeups(owner_id);
|
|
|
256
256
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_wakeups_deadline ON wakeups(node_id) WHERE kind = 'deadline';
|
|
257
257
|
`);
|
|
258
258
|
}
|
|
259
|
+
/** v9 — generalize the `wakeups` table (v7) into the `triggers` table (the
|
|
260
|
+
* unified node-trigger-grammar substrate). The old `kind` axis (bare/noted/
|
|
261
|
+
* deadline/spawn) splits into three orthogonal axes: `action` (what enacts:
|
|
262
|
+
* 'msg'|'new') x `action_mode` (how: 'inbox_message'|'fresh_revive'|
|
|
263
|
+
* 'deadline_message'|'node_birth') x `trigger_type` (when: 'at'|'every'|
|
|
264
|
+
* 'when'|'until') — so a daemon-owned predicate (`--when`) trigger can live in
|
|
265
|
+
* the same table as a clock trigger. Predicate-only columns (`when_script`
|
|
266
|
+
* through `last_stderr`) are additive null/idle for every migrated clock row.
|
|
267
|
+
*
|
|
268
|
+
* Migration mapping, preserving every existing `wakeup_id` as `trigger_id`
|
|
269
|
+
* (so an old wake's id stays cancelable): bare→fresh_revive, noted→
|
|
270
|
+
* inbox_message, deadline→deadline_message (trigger_type='until'), spawn→
|
|
271
|
+
* node_birth. `payload` JSON carries over unchanged — the old per-kind
|
|
272
|
+
* payload shapes (plus SpawnChildOpts) map 1:1 onto the new payload union at
|
|
273
|
+
* the TS layer (triggers.ts), no JSON transform needed. The `wakeups` table
|
|
274
|
+
* is then DROPPED — not kept as a parallel table. Additive, forward-only. */
|
|
275
|
+
function migrateWakeupsToTriggers(db) {
|
|
276
|
+
db.exec(`
|
|
277
|
+
CREATE TABLE IF NOT EXISTS triggers (
|
|
278
|
+
trigger_id TEXT PRIMARY KEY,
|
|
279
|
+
owner_id TEXT NOT NULL,
|
|
280
|
+
node_id TEXT, -- TARGET + node-anchored cancel anchor; NULL = canvas-detached
|
|
281
|
+
action TEXT NOT NULL, -- 'msg' | 'new'
|
|
282
|
+
action_mode TEXT NOT NULL, -- 'inbox_message' | 'fresh_revive' | 'deadline_message' | 'node_birth'
|
|
283
|
+
trigger_type TEXT NOT NULL, -- 'at' | 'every' | 'when' | 'until'
|
|
284
|
+
fire_at TEXT, -- clock triggers: NEXT occurrence, ISO 8601 UTC; lexicographic <=
|
|
285
|
+
recur TEXT, -- NULL = one-shot; else the recur JSON the daemon advances
|
|
286
|
+
payload TEXT, -- JSON action payload, discriminated by action_mode
|
|
287
|
+
when_script TEXT, -- predicate triggers: the --when bash source
|
|
288
|
+
eval_every TEXT, -- predicate triggers: evaluation cadence (recur-shaped JSON)
|
|
289
|
+
next_eval_at TEXT, -- predicate triggers: next evaluation instant
|
|
290
|
+
timeout_at TEXT, -- predicate triggers: wall-clock expiry
|
|
291
|
+
eval_state TEXT NOT NULL DEFAULT 'idle', -- 'idle' | 'running'
|
|
292
|
+
eval_started_at TEXT,
|
|
293
|
+
eval_pid INTEGER,
|
|
294
|
+
eval_lease_owner TEXT,
|
|
295
|
+
last_eval_at TEXT,
|
|
296
|
+
last_exit INTEGER,
|
|
297
|
+
last_stderr TEXT,
|
|
298
|
+
created TEXT NOT NULL,
|
|
299
|
+
FOREIGN KEY (node_id) REFERENCES nodes(node_id) ON DELETE CASCADE
|
|
300
|
+
);
|
|
301
|
+
CREATE INDEX IF NOT EXISTS idx_triggers_fire ON triggers(fire_at); -- clock per-tick due query
|
|
302
|
+
CREATE INDEX IF NOT EXISTS idx_triggers_node ON triggers(node_id); -- by-node cancel / list
|
|
303
|
+
CREATE INDEX IF NOT EXISTS idx_triggers_owner ON triggers(owner_id); -- by-owner reap
|
|
304
|
+
CREATE INDEX IF NOT EXISTS idx_triggers_eval ON triggers(eval_state, next_eval_at); -- predicate due query
|
|
305
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_triggers_deadline ON triggers(node_id) WHERE action_mode = 'deadline_message';
|
|
306
|
+
|
|
307
|
+
INSERT INTO triggers (trigger_id, owner_id, node_id, action, action_mode, trigger_type, fire_at, recur, payload, created)
|
|
308
|
+
SELECT
|
|
309
|
+
wakeup_id,
|
|
310
|
+
owner_id,
|
|
311
|
+
node_id,
|
|
312
|
+
CASE kind WHEN 'spawn' THEN 'new' ELSE 'msg' END,
|
|
313
|
+
CASE kind
|
|
314
|
+
WHEN 'bare' THEN 'fresh_revive'
|
|
315
|
+
WHEN 'noted' THEN 'inbox_message'
|
|
316
|
+
WHEN 'deadline' THEN 'deadline_message'
|
|
317
|
+
WHEN 'spawn' THEN 'node_birth'
|
|
318
|
+
END,
|
|
319
|
+
CASE WHEN kind = 'deadline' THEN 'until' WHEN recur IS NULL THEN 'at' ELSE 'every' END,
|
|
320
|
+
fire_at,
|
|
321
|
+
recur,
|
|
322
|
+
payload,
|
|
323
|
+
created
|
|
324
|
+
FROM wakeups;
|
|
325
|
+
|
|
326
|
+
DROP TABLE wakeups;
|
|
327
|
+
`);
|
|
328
|
+
}
|
|
259
329
|
/** v8 — additive identity column `host_kind`: which HOST launches + supervises a
|
|
260
330
|
* node — `'tmux'` (a pane) or `'broker'` (the headless in-process engine). It is
|
|
261
331
|
* durable IDENTITY mirrored from meta.json like `cwd` (NOT runtime like `pane`),
|
|
@@ -266,6 +336,19 @@ function addHostKindColumn(db) {
|
|
|
266
336
|
const columns = nodeColumns(db);
|
|
267
337
|
addNodeColumnIfMissing(db, columns, 'host_kind', `ALTER TABLE nodes ADD COLUMN host_kind TEXT;`);
|
|
268
338
|
}
|
|
339
|
+
/** v10 — the `canvas_meta` key/value table: a single durable place for
|
|
340
|
+
* small, cross-process canvas-wide scalars that aren't node rows. First user:
|
|
341
|
+
* the boot marker (boot.ts), which records the last-seen kernel boot identity
|
|
342
|
+
* so boot-liveness reconciliation is a single-writer SQLite transaction on
|
|
343
|
+
* this row rather than a race-prone JSON file. Additive, forward-only. */
|
|
344
|
+
function addCanvasMetaTable(db) {
|
|
345
|
+
db.exec(`
|
|
346
|
+
CREATE TABLE IF NOT EXISTS canvas_meta (
|
|
347
|
+
key TEXT PRIMARY KEY,
|
|
348
|
+
value TEXT NOT NULL
|
|
349
|
+
);
|
|
350
|
+
`);
|
|
351
|
+
}
|
|
269
352
|
/** The ordered migration list. Index `i` is migration version `i + 1`; the db's
|
|
270
353
|
* `user_version` tracks how many have been applied. Append only. */
|
|
271
354
|
export const MIGRATIONS = [
|
|
@@ -277,6 +360,8 @@ export const MIGRATIONS = [
|
|
|
277
360
|
/* v6 */ addFocusesTable,
|
|
278
361
|
/* v7 */ appendWakeupsTable,
|
|
279
362
|
/* v8 */ addHostKindColumn,
|
|
363
|
+
/* v9 */ migrateWakeupsToTriggers,
|
|
364
|
+
/* v10 */ addCanvasMetaTable,
|
|
280
365
|
];
|
|
281
366
|
/** Bring `db` up to the latest schema version. Reads `user_version`, runs each
|
|
282
367
|
* pending migration in order, and bumps `user_version` after each so the work
|
|
@@ -6,6 +6,6 @@ export * from './paths.js';
|
|
|
6
6
|
export * from './canvas.js';
|
|
7
7
|
export * from './history.js';
|
|
8
8
|
export * from './focuses.js';
|
|
9
|
-
export * from './
|
|
9
|
+
export * from './triggers.js';
|
|
10
10
|
export * from './telemetry.js';
|
|
11
11
|
export { openDb, closeDb } from './db.js';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// nav-model.ts — the pure model/render layer of the canvas graph-nav chrome.
|
|
2
2
|
//
|
|
3
3
|
// Extracted from src/pi-extensions/canvas-nav.ts so a SINGLE source feeds both
|
|
4
|
-
// the legacy pi extension (canvas-nav) and the headless `crtr attach` viewer.
|
|
4
|
+
// the legacy pi extension (canvas-nav) and the headless `crtr surface attach` viewer.
|
|
5
5
|
// Everything here is pi-API-free: it reads the canvas (sqlite + meta.json + node
|
|
6
6
|
// telemetry) and produces ANSI-styled strings + a flattened graph model. The
|
|
7
7
|
// extension-host wiring (widgets, key taps, the ask-poll timer, run/focus
|
|
@@ -2,3 +2,9 @@
|
|
|
2
2
|
* 0)` throws ESRCH when the process is gone; EPERM means it exists but isn't
|
|
3
3
|
* ours — still alive. A null/undefined pid (legacy / never-booted) reads dead. */
|
|
4
4
|
export declare function isPidAlive(pid: number | null | undefined): boolean;
|
|
5
|
+
/** SIGTERM a process GROUP by pid (the negative-pid convention) — best-effort,
|
|
6
|
+
* swallowing ESRCH (already gone). Shared by triggers.ts (cancel-time reap of
|
|
7
|
+
* an in-flight predicate evaluation) and daemon/predicate-eval.ts (per-eval
|
|
8
|
+
* timeout + stale-lease recovery kills). Lives beside isPidAlive: canvas/ is
|
|
9
|
+
* the lowest shared layer every process-liveness/-teardown primitive sits at. */
|
|
10
|
+
export declare function killProcessGroup(pid: number, signal?: NodeJS.Signals): void;
|
package/dist/core/canvas/pid.js
CHANGED
|
@@ -21,3 +21,16 @@ export function isPidAlive(pid) {
|
|
|
21
21
|
return e.code === 'EPERM';
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
|
+
/** SIGTERM a process GROUP by pid (the negative-pid convention) — best-effort,
|
|
25
|
+
* swallowing ESRCH (already gone). Shared by triggers.ts (cancel-time reap of
|
|
26
|
+
* an in-flight predicate evaluation) and daemon/predicate-eval.ts (per-eval
|
|
27
|
+
* timeout + stale-lease recovery kills). Lives beside isPidAlive: canvas/ is
|
|
28
|
+
* the lowest shared layer every process-liveness/-teardown primitive sits at. */
|
|
29
|
+
export function killProcessGroup(pid, signal = 'SIGTERM') {
|
|
30
|
+
try {
|
|
31
|
+
process.kill(-pid, signal);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
/* already gone */
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import type { ArmTriggerSpec, Trigger, TriggerScope } from './types.js';
|
|
2
|
+
/** A thrown integrity-backstop error from armTrigger. `code` is mapped by the
|
|
3
|
+
* command surface to a rendered error block — armTrigger carries integrity
|
|
4
|
+
* backstops only (empty body / recur-on-deadline / unknown action_mode);
|
|
5
|
+
* target-resolvability + recoverable-state + per-owner cap checks live in the
|
|
6
|
+
* surface, so a non-surface armer could insert a dangling trigger — every
|
|
7
|
+
* armer MUST route through the surface. */
|
|
8
|
+
export declare class TriggerArmError extends Error {
|
|
9
|
+
readonly code: string;
|
|
10
|
+
constructor(code: string, message: string);
|
|
11
|
+
}
|
|
12
|
+
/** INSERT one trigger row from the pinned spec, returning its (caller-supplied)
|
|
13
|
+
* `trigger_id`. JSON.stringifies the typed `payload` union into the TEXT
|
|
14
|
+
* column and stamps `created`.
|
|
15
|
+
*
|
|
16
|
+
* Deadline upsert (≤1 deadline per node): for `action_mode === 'deadline_message'`
|
|
17
|
+
* the node's existing deadline is canceled first, then the new one inserted —
|
|
18
|
+
* the partial unique index `idx_triggers_deadline` is the schema-level
|
|
19
|
+
* backstop.
|
|
20
|
+
*
|
|
21
|
+
* Integrity backstops (throw TriggerArmError):
|
|
22
|
+
* - empty/whitespace payload `body` for inbox_message/deadline_message → `empty_body`
|
|
23
|
+
* (a `trigger_type='when'` inbox_message may omit body entirely instead —
|
|
24
|
+
* that is the stdout-as-body case, not a violation).
|
|
25
|
+
* - non-NULL `recur` on a deadline_message → `deadline_cannot_recur`.
|
|
26
|
+
* - unknown `action_mode` → `bad_action_mode`. */
|
|
27
|
+
export declare function armTrigger(spec: ArmTriggerSpec): string;
|
|
28
|
+
/** UPDATE the next fire time — clock recurrence advancement (the daemon settles
|
|
29
|
+
* a recurring row to its next slot BEFORE enacting, crash-safe). */
|
|
30
|
+
export declare function advanceTrigger(trigger_id: string, nextFireIso: string): void;
|
|
31
|
+
/** DELETE one trigger by id — one-shot consumption (the daemon settles a
|
|
32
|
+
* one-shot row BEFORE enacting, crash-safe). */
|
|
33
|
+
/** Deletes the row and reports whether it actually removed a LIVE one (vs a
|
|
34
|
+
* no-op on an already-gone trigger) — callers racing another consumer of the
|
|
35
|
+
* same trigger (e.g. predicate-eval.ts's close handler racing a wall-clock
|
|
36
|
+
* reaper's kill) use the return value to no-op instead of double-enacting. */
|
|
37
|
+
export declare function consumeTrigger(trigger_id: string): boolean;
|
|
38
|
+
/** DELETE one trigger by id — the explicit user/surface cancel. Idempotent:
|
|
39
|
+
* 0 rows ⇒ no error. Kills any in-flight predicate process group for this
|
|
40
|
+
* trigger before deleting. */
|
|
41
|
+
export declare function cancelTrigger(trigger_id: string): void;
|
|
42
|
+
/** DELETE every trigger anchored to this node AND every detached trigger it
|
|
43
|
+
* ARMED — deliberate close/reap. Hooked at transition('cancel'). */
|
|
44
|
+
export declare function cancelTriggersFor(node_id: string): void;
|
|
45
|
+
/** DELETE this node's one-shot self-alarms (recur IS NULL); node-anchored
|
|
46
|
+
* recurring triggers SURVIVE — finalize is the instance finishing, not a
|
|
47
|
+
* teardown of standing schedules. Hooked at transition('finalize'). */
|
|
48
|
+
export declare function cancelSelfAlarms(node_id: string): void;
|
|
49
|
+
/** DELETE this node's pending deadline(s) — cancel-on-wake. Hooked at
|
|
50
|
+
* reviveNode, so the deadline always belongs to the dormancy left. */
|
|
51
|
+
export declare function cancelDeadlinesFor(node_id: string): void;
|
|
52
|
+
/** The daemon's per-tick due query for CLOCK triggers only (`at`/`every`/
|
|
53
|
+
* `until` — predicate `when` triggers fire via next_eval_at, see
|
|
54
|
+
* duePredicateTriggers): every row whose fire_at has arrived, in fire_at
|
|
55
|
+
* order, with `payload` parsed into the typed union. Returns exactly ONE row
|
|
56
|
+
* per recurring trigger regardless of missed slots — coalescing is structural. */
|
|
57
|
+
export declare function dueClockTriggers(nowIso: string): Trigger[];
|
|
58
|
+
/** List triggers for a scope (node / owner / subtree / due / canvas), `payload`
|
|
59
|
+
* parsed as in dueClockTriggers. The subtree variant binds the id set with `?`
|
|
60
|
+
* placeholders (mirroring listNodes — the codebase's one safe dynamic-IN
|
|
61
|
+
* spot); ids are NEVER string-concatenated. The `due` scope is clock-only,
|
|
62
|
+
* matching dueClockTriggers' filter. */
|
|
63
|
+
export declare function listTriggers(scope: TriggerScope): Trigger[];
|
|
64
|
+
/** True if the node has ANY pending self-anchored trigger (of any type).
|
|
65
|
+
* Consumed by the stop-guard self-wake seam so a no-child poll node releases
|
|
66
|
+
* dormant after arming instead of being nagged to finish. */
|
|
67
|
+
export declare function hasPendingSelfTrigger(node_id: string): boolean;
|
|
68
|
+
/** Predicate triggers due for evaluation: idle, `next_eval_at` arrived,
|
|
69
|
+
* deterministic order (`next_eval_at`, then `created`, then `trigger_id` —
|
|
70
|
+
* spec §Daemon behavior step 3). Capacity enforcement (max concurrent
|
|
71
|
+
* canvas-wide / per-owner) is the daemon's job, not this query's. */
|
|
72
|
+
export declare function duePredicateTriggers(nowIso: string): Trigger[];
|
|
73
|
+
/** Atomically acquire the idle lease for one predicate evaluation: flips
|
|
74
|
+
* `eval_state` to 'running' and records lease/pid metadata, but ONLY if the
|
|
75
|
+
* row is still idle (the `WHERE eval_state = 'idle'` guard is the atomicity —
|
|
76
|
+
* two daemons racing the same row can't both win). Returns whether THIS call
|
|
77
|
+
* acquired it. */
|
|
78
|
+
export declare function acquirePredicateLease(trigger_id: string, leaseOwner: string, pid: number, startedAtIso: string): boolean;
|
|
79
|
+
/** The settled outcome of one predicate evaluation, to be recorded by
|
|
80
|
+
* recordPredicateEvalResult. `exitCode` null means the evaluation timed out
|
|
81
|
+
* (no exit was observed). */
|
|
82
|
+
export interface PredicateEvalResult {
|
|
83
|
+
completedAtIso: string;
|
|
84
|
+
/** When the row should next be checked (completed_at + eval_every). */
|
|
85
|
+
nextEvalAtIso: string;
|
|
86
|
+
exitCode: number | null;
|
|
87
|
+
stderrTail: string | null;
|
|
88
|
+
}
|
|
89
|
+
/** Record a non-firing predicate evaluation result (exit non-zero, or a
|
|
90
|
+
* per-eval timeout): releases the lease back to idle and schedules the next
|
|
91
|
+
* check. Exit-0 (fire) is NOT recorded here — the spec's settle-before-enact
|
|
92
|
+
* rule means a firing predicate is consumed (consumeTrigger) then enacted,
|
|
93
|
+
* never left as an idle row. */
|
|
94
|
+
export declare function recordPredicateEvalResult(trigger_id: string, result: PredicateEvalResult): void;
|
|
95
|
+
/** Every predicate trigger currently marked 'running' — the daemon's stale-
|
|
96
|
+
* lease recovery scan on restart checks each recorded `eval_pid` for
|
|
97
|
+
* liveness and calls resetPredicateLease for any that's gone. */
|
|
98
|
+
export declare function runningPredicateTriggers(): Trigger[];
|
|
99
|
+
/** Reset a predicate trigger's lease back to idle without recording a result —
|
|
100
|
+
* stale-lease recovery for a row whose recorded eval_pid is no longer alive
|
|
101
|
+
* (the prior daemon instance died mid-evaluation). */
|
|
102
|
+
export declare function resetPredicateLease(trigger_id: string): void;
|
|
103
|
+
/** Predicate triggers whose WALL-CLOCK timeout has arrived, regardless of
|
|
104
|
+
* eval_state (an in-flight evaluation past its own trigger's timeout_at is
|
|
105
|
+
* still reaped — the caller kills the process group itself since this is a
|
|
106
|
+
* read, not a mutation). Spec §Predicate triggers: "Wall-clock timeout_at
|
|
107
|
+
* reached: consume and notify owner." */
|
|
108
|
+
export declare function duePredicateTimeouts(nowIso: string): Trigger[];
|