@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,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "pi-crtr-extensions",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Silas's personal pi extensions and prompt templates.",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"pi-package"
|
|
8
|
+
],
|
|
9
|
+
"license": "MIT",
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"yaml": "^2.9.0"
|
|
12
|
+
},
|
|
13
|
+
"devDependencies": {
|
|
14
|
+
"@earendil-works/pi-ai": "^0.79.6"
|
|
15
|
+
},
|
|
16
|
+
"peerDependencies": {
|
|
17
|
+
"@earendil-works/pi-coding-agent": "*"
|
|
18
|
+
},
|
|
19
|
+
"pi": {
|
|
20
|
+
"extensions": [
|
|
21
|
+
"extensions/*.ts",
|
|
22
|
+
"extensions/*/index.ts"
|
|
23
|
+
]
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# pi-mode-switch
|
|
2
|
+
|
|
3
|
+
Press **Alt+M** to cycle between operating modes — the way Claude's Shift+Tab
|
|
4
|
+
cycles plan / accept-edits. Whenever the mode changes, the new mode's operating
|
|
5
|
+
instructions are injected (invisibly) before your next message.
|
|
6
|
+
|
|
7
|
+
## Modes
|
|
8
|
+
|
|
9
|
+
| Mode | What it does |
|
|
10
|
+
|---|---|
|
|
11
|
+
| `normal` | Full tool access (default). Restrictions lifted. |
|
|
12
|
+
| `spec` | Write a specification before any code. No edits. |
|
|
13
|
+
| `plan` | Produce an implementation plan. Read-only, no changes. |
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
- `Alt+M` — cycle `normal → spec → plan → normal`
|
|
18
|
+
- `/mode` — same as Alt+M
|
|
19
|
+
- `/mode <normal\|spec\|plan>` — jump to a specific mode
|
|
20
|
+
- the agent can switch its own mode by running the bundled `bin/mode` CLI through
|
|
21
|
+
its bash tool — e.g. `bash <plugin>/bin/mode normal` after a spec/plan is
|
|
22
|
+
approved. The command prints that mode's guidance, so the text only enters
|
|
23
|
+
context at the moment of the switch (no always-on tool)
|
|
24
|
+
|
|
25
|
+
The current mode renders as a badge on the **bottom-right of the input box**,
|
|
26
|
+
diagonally opposite the session-name badge (top-left). Mode persists across
|
|
27
|
+
`--resume`.
|
|
28
|
+
|
|
29
|
+
## How it works
|
|
30
|
+
|
|
31
|
+
The extension tracks the active mode and the mode whose guidance was last
|
|
32
|
+
injected. On `before_agent_start` it compares the two: if they differ, it
|
|
33
|
+
prepends that mode's guidance to the turn (as a hidden `mode-switch-context`
|
|
34
|
+
message) and records the injection. Stay in the same mode and nothing extra is
|
|
35
|
+
added. Returning to `normal` also strips stale guidance from context.
|
|
36
|
+
|
|
37
|
+
The agent can also switch its own mode without a permanent tool. The bundled
|
|
38
|
+
`bin/mode` CLI, run through the normal bash tool, writes the requested mode to
|
|
39
|
+
`<artifact-root>/mode-switch/request.json` and prints that mode's operating
|
|
40
|
+
instructions to stdout. The extension mirrors each mode's guidance to
|
|
41
|
+
`mode-switch/guidance/<mode>.txt` at session start (single source of truth stays
|
|
42
|
+
in the extension), watches the request file to keep the badge and session state in
|
|
43
|
+
sync, and consumes each request on read so a later Alt+M isn't clobbered. The
|
|
44
|
+
guidance reaches the agent through the command's own output, so it only enters
|
|
45
|
+
context at the moment of the switch — no tool sits in the context window, and
|
|
46
|
+
there's no coupling to any external runtime, just files.
|
|
47
|
+
|
|
48
|
+
This is guidance-only — it does not hard-restrict tools. The instructions tell
|
|
49
|
+
the agent not to edit in spec/plan mode; combine with a tool gate if you want
|
|
50
|
+
enforcement.
|
|
51
|
+
|
|
52
|
+
The input badge is drawn by wrapping whatever editor is already installed (e.g. a
|
|
53
|
+
session-name badge extension) in a transparent Proxy that overrides only
|
|
54
|
+
`render()`. It composes instead of replacing, so other editor decorations keep
|
|
55
|
+
working.
|
|
56
|
+
|
|
57
|
+
## Install
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
pi install /Users/silasrhyneer/Code/cli/pi-mode-switch # user scope
|
|
61
|
+
pi install -l /Users/silasrhyneer/Code/cli/pi-mode-switch # project scope
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Run `/reload` in pi after install, then press Alt+M.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Mode-switch CLI — lets the agent change its own operating mode.
|
|
3
|
+
#
|
|
4
|
+
# Usage: mode <normal|spec|plan>
|
|
5
|
+
#
|
|
6
|
+
# Writes the requested mode to the per-cwd channel the pi mode-switch extension
|
|
7
|
+
# watches (so the badge and session state stay in sync), then prints that mode's
|
|
8
|
+
# operating instructions to stdout — so the guidance enters the agent's context
|
|
9
|
+
# only at the moment of the switch, with no always-on tool.
|
|
10
|
+
set -euo pipefail
|
|
11
|
+
|
|
12
|
+
mode="${1:-}"
|
|
13
|
+
case "$mode" in
|
|
14
|
+
normal | spec | plan) ;;
|
|
15
|
+
*)
|
|
16
|
+
echo "usage: mode <normal|spec|plan>" >&2
|
|
17
|
+
exit 1
|
|
18
|
+
;;
|
|
19
|
+
esac
|
|
20
|
+
|
|
21
|
+
# Per-node runtime dir, mirroring the extension's artifact root
|
|
22
|
+
# (~/.crouter/workspaces/<cwd-with-each-slash-as-a-dash>/mode-switch/<node-id>).
|
|
23
|
+
# Run from the project root so this matches the running session's directory.
|
|
24
|
+
node_id="${CRTR_NODE_ID:-standalone}"
|
|
25
|
+
dir="$HOME/.crouter/workspaces/$(pwd | sed 's:/:-:g')/mode-switch/$node_id"
|
|
26
|
+
mkdir -p "$dir"
|
|
27
|
+
|
|
28
|
+
# Signal the running extension. Atomic write via temp + rename so the watcher
|
|
29
|
+
# never reads a half-written file.
|
|
30
|
+
tmp="$(mktemp "$dir/request.XXXXXX")"
|
|
31
|
+
printf '{"mode":"%s","token":"%s","source":"cli"}\n' "$mode" "$(date +%s)-$$-${RANDOM:-0}" >"$tmp"
|
|
32
|
+
mv -f "$tmp" "$dir/request.json"
|
|
33
|
+
|
|
34
|
+
# Hand the new mode's operating instructions to the agent.
|
|
35
|
+
guidance="$dir/guidance/$mode.txt"
|
|
36
|
+
if [ -f "$guidance" ]; then
|
|
37
|
+
cat "$guidance"
|
|
38
|
+
else
|
|
39
|
+
echo "[$mode mode] requested. (No running mode-switch extension detected for this directory, so detailed guidance is unavailable.)"
|
|
40
|
+
fi
|
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mode Switch Extension
|
|
3
|
+
*
|
|
4
|
+
* Press Alt+M to cycle between operating modes, the way Claude's Shift+Tab
|
|
5
|
+
* cycles plan / accept-edits. Modes here:
|
|
6
|
+
*
|
|
7
|
+
* normal → full access (default)
|
|
8
|
+
* spec → write a specification before any code
|
|
9
|
+
* plan → produce an implementation plan, no changes
|
|
10
|
+
*
|
|
11
|
+
* The only behaviour is context injection: whenever the active mode differs
|
|
12
|
+
* from the mode whose guidance was last injected, the mode's operating
|
|
13
|
+
* instructions are prepended (invisibly) to the next agent turn. Stay in the
|
|
14
|
+
* same mode across turns and nothing extra is injected.
|
|
15
|
+
*
|
|
16
|
+
* - Alt+M or /mode to cycle; /mode <name> to jump to a specific mode
|
|
17
|
+
* - The agent can switch its own mode by running the bundled `bin/mode` CLI via
|
|
18
|
+
* its bash tool; the command prints the new mode's guidance to stdout, so that
|
|
19
|
+
* text only enters context at the moment of the switch (no always-on tool)
|
|
20
|
+
* - The active mode is mirrored to a tiny `current` file the attach viewer
|
|
21
|
+
* reads for its footer indicator; when a real UI exists, it still also renders
|
|
22
|
+
* as a badge on the bottom-right of the input box by wrapping the previous
|
|
23
|
+
* editor instead of replacing it.
|
|
24
|
+
* - State persists across session resume
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import { CustomEditor, type ExtensionAPI, type ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
28
|
+
import type { TUI } from "@earendil-works/pi-tui";
|
|
29
|
+
import { truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
|
|
30
|
+
import { type FSWatcher, mkdirSync, readFileSync, rmSync, watch, writeFileSync } from "node:fs";
|
|
31
|
+
import { dirname, join } from "node:path";
|
|
32
|
+
import { fileURLToPath } from "node:url";
|
|
33
|
+
import { workspaceRoot } from "../../../core/artifact.js";
|
|
34
|
+
|
|
35
|
+
type Mode = "normal" | "spec" | "plan";
|
|
36
|
+
|
|
37
|
+
// Absolute path to the bundled mode-switch CLI (extensions/../bin/mode). The
|
|
38
|
+
// extension runs from its package source dir, so we resolve it relative to this
|
|
39
|
+
// file. The agent runs it through its normal bash tool, so it costs zero context
|
|
40
|
+
// until the moment it's used.
|
|
41
|
+
const CLI_PATH = join(dirname(fileURLToPath(import.meta.url)), "..", "bin", "mode");
|
|
42
|
+
const MODE_CLI = `bash "${CLI_PATH}"`;
|
|
43
|
+
|
|
44
|
+
// Per-cwd crouter artifact root: ~/.crouter/workspaces/<cwd-with-each-slash-as-a-dash>/.
|
|
45
|
+
// Mirrors crouter's mangleCwd / workspaceRoot (src/core/artifact.ts). spec/plan
|
|
46
|
+
// modes write their artifacts under <root>/specs and <root>/plans respectively,
|
|
47
|
+
// so we make sure both dirs exist for the cwd whenever a session starts.
|
|
48
|
+
function ensureArtifactDirs(cwd: string = process.cwd()): void {
|
|
49
|
+
const root = workspaceRoot(cwd);
|
|
50
|
+
try {
|
|
51
|
+
mkdirSync(join(root, "specs"), { recursive: true });
|
|
52
|
+
mkdirSync(join(root, "plans"), { recursive: true });
|
|
53
|
+
mkdirSync(join(modeSwitchDir(cwd), "guidance"), { recursive: true });
|
|
54
|
+
} catch {
|
|
55
|
+
// Best-effort: never block session start on a filesystem hiccup.
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Per-node channel the CLI, attach viewer, and this extension share, under the
|
|
60
|
+
// same per-cwd artifact root: <root>/mode-switch/<node-id>/{request.json,current}.
|
|
61
|
+
function modeSwitchDir(cwd: string = process.cwd(), nodeId: string = process.env["CRTR_NODE_ID"] ?? "standalone"): string {
|
|
62
|
+
return join(workspaceRoot(cwd), "mode-switch", nodeId);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// The cycle order Alt+M walks through.
|
|
66
|
+
const CYCLE: Mode[] = ["normal", "spec", "plan"];
|
|
67
|
+
|
|
68
|
+
interface ModeDef {
|
|
69
|
+
/** Badge label shown in the input box. */
|
|
70
|
+
label: string;
|
|
71
|
+
/** Guidance injected before the next turn when this mode becomes active. */
|
|
72
|
+
context: string;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const MODES: Record<Mode, ModeDef> = {
|
|
76
|
+
normal: {
|
|
77
|
+
label: "normal",
|
|
78
|
+
context: `[NORMAL MODE]
|
|
79
|
+
Mode restrictions are lifted — you have full tool access again.
|
|
80
|
+
|
|
81
|
+
Proceed with the work as discussed. If a spec or plan was produced earlier in
|
|
82
|
+
this session, follow it. You may read, edit, write, and run commands freely. If a
|
|
83
|
+
request is large enough to need a written spec or plan first, switch modes by
|
|
84
|
+
running \`${MODE_CLI} spec\` (or \`plan\`); the command prints that mode's
|
|
85
|
+
operating instructions to follow.`,
|
|
86
|
+
},
|
|
87
|
+
spec: {
|
|
88
|
+
label: "spec",
|
|
89
|
+
context: `[SPEC MODE]
|
|
90
|
+
You are in spec mode. Your job is to turn a rough request into a clear, written
|
|
91
|
+
specification BEFORE any code is written.
|
|
92
|
+
|
|
93
|
+
How to operate:
|
|
94
|
+
- Do NOT implement, edit, or write production code. Hold off on changes entirely.
|
|
95
|
+
- Resolve open questions as you go. Whenever something is ambiguous — scope,
|
|
96
|
+
inputs and outputs, edge cases, constraints, or what "done" means — put the
|
|
97
|
+
question to the user with the \`crtr human ask\` command rather than asking
|
|
98
|
+
inline, then fold the answer into the spec. Do this before drafting for the
|
|
99
|
+
unknowns you can see up front, and again whenever a new question surfaces while
|
|
100
|
+
you write. The finished spec records decisions, not open questions.
|
|
101
|
+
- Explore the codebase read-only to ground the spec in how things actually work.
|
|
102
|
+
- Then write the specification to a markdown file under the project's crtr specs
|
|
103
|
+
directory: \`~/.crouter/workspaces/<cwd-with-each-slash-replaced-by-a-dash>/specs/<slug>.md\`
|
|
104
|
+
(e.g. cwd \`/Users/me/Code/app\` → \`~/.crouter/workspaces/-Users-me-Code-app/specs/\`).
|
|
105
|
+
Create the directory if it does not exist. Cover: problem statement, goals and
|
|
106
|
+
non-goals, requirements, a high-level approach, and acceptance criteria. Keep
|
|
107
|
+
it tight and reviewable.
|
|
108
|
+
- Then validate the spec with a reviewer node first: spawn one with
|
|
109
|
+
\`crtr node new "Review the spec at <absolute-path>" --kind review\` — you
|
|
110
|
+
auto-subscribe to it and are woken when it finishes. Read its verdict with
|
|
111
|
+
\`crtr feed read\` and dereference the report path it points to. It flags
|
|
112
|
+
completeness gaps, contradictions, ambiguity, scope creep, and unspecified
|
|
113
|
+
failure modes on critical paths. Resolve every Issue it raises before showing
|
|
114
|
+
the spec to anyone;
|
|
115
|
+
Recommendations are advisory.
|
|
116
|
+
- Finally, present the finished spec for review with
|
|
117
|
+
\`crtr human review <absolute-path-to-the-spec.md>\` and incorporate the
|
|
118
|
+
returned comments. Do not move on until the user has reviewed it. Once they
|
|
119
|
+
approve it, run \`${MODE_CLI} normal\` to lift the restrictions and begin
|
|
120
|
+
implementing — the command prints your normal-mode operating instructions.`,
|
|
121
|
+
},
|
|
122
|
+
plan: {
|
|
123
|
+
label: "plan",
|
|
124
|
+
context: `[PLAN MODE]
|
|
125
|
+
You are in plan mode. Your job is to produce an actionable implementation plan —
|
|
126
|
+
no changes yet.
|
|
127
|
+
|
|
128
|
+
How to operate:
|
|
129
|
+
- Do NOT edit production code. Read-only exploration only (writing the plan file
|
|
130
|
+
itself is allowed).
|
|
131
|
+
- Resolve open questions as you go. Whenever something is ambiguous or a decision
|
|
132
|
+
needs a call, put it to the user with the \`crtr human ask\` command rather than
|
|
133
|
+
asking inline, then fold the answer into the plan. Do this before drafting for
|
|
134
|
+
the unknowns you can see up front, and again whenever a new question surfaces
|
|
135
|
+
while you write. The finished plan records decisions, not open questions.
|
|
136
|
+
- Investigate the relevant code to understand how the change fits in.
|
|
137
|
+
- Then write the plan to a markdown file under the project's crtr plans
|
|
138
|
+
directory: \`~/.crouter/workspaces/<cwd-with-each-slash-replaced-by-a-dash>/plans/<slug>.md\`
|
|
139
|
+
(e.g. cwd \`/Users/me/Code/app\` → \`~/.crouter/workspaces/-Users-me-Code-app/plans/\`).
|
|
140
|
+
Create the directory if it does not exist. The plan is a numbered, ordered list
|
|
141
|
+
of concrete steps: which files to touch, which functions to add or modify,
|
|
142
|
+
which tests to write, plus risks and dependencies.
|
|
143
|
+
- Then validate the plan with a reviewer node first: spawn one with
|
|
144
|
+
\`crtr node new "Review the plan at <absolute-path>" --kind review\` — you
|
|
145
|
+
auto-subscribe to it and are woken when it finishes. Read its verdict with
|
|
146
|
+
\`crtr feed read\` and dereference the report path it points to. It flags
|
|
147
|
+
completeness gaps, spec misalignment, unresolved decisions, buildability
|
|
148
|
+
problems, quality smells
|
|
149
|
+
(timelines, "for now" shortcuts, magic values, fallbacks, missing type
|
|
150
|
+
contracts), and overlapping file ownership across parallel tasks. Resolve every
|
|
151
|
+
Issue before moving on; Recommendations are advisory.
|
|
152
|
+
- Finally, present the finished plan for review with
|
|
153
|
+
\`crtr human review <absolute-path-to-the-plan.md>\` and incorporate the
|
|
154
|
+
returned comments. Wait for approval before moving on. Once the user approves,
|
|
155
|
+
run \`${MODE_CLI} normal\` to begin implementation — the command prints your
|
|
156
|
+
normal-mode operating instructions.`,
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
export default function modeSwitchExtension(pi: ExtensionAPI): void {
|
|
161
|
+
let currentMode: Mode = "normal";
|
|
162
|
+
// The mode whose guidance was last injected. Injection only fires when the
|
|
163
|
+
// active mode differs from this.
|
|
164
|
+
let lastInjectedMode: Mode | null = "normal";
|
|
165
|
+
// TUI handle, captured by the editor factory, so mode changes can repaint the
|
|
166
|
+
// input badge.
|
|
167
|
+
let activeTui: TUI | undefined;
|
|
168
|
+
// Watches <root>/mode-switch/request.json for agent-initiated CLI switches.
|
|
169
|
+
let modeWatcher: FSWatcher | undefined;
|
|
170
|
+
// UI toast, available only when the session has a UI.
|
|
171
|
+
let uiNotify: ((message: string, type?: "info" | "warning" | "error") => void) | undefined;
|
|
172
|
+
// Token of the most recent CLI request this instance has applied. Lets us
|
|
173
|
+
// reconcile to the request file WITHOUT deleting it: deleting was racy because
|
|
174
|
+
// /reload can leave extra extension instances behind, and a stale one could
|
|
175
|
+
// consume the request before the on-screen instance ever observed it.
|
|
176
|
+
let lastAppliedToken: string | undefined;
|
|
177
|
+
|
|
178
|
+
/** Append the mode badge to the bottom-right of the input box border. */
|
|
179
|
+
function decorateInput(
|
|
180
|
+
lines: string[],
|
|
181
|
+
width: number,
|
|
182
|
+
theme: { fg(color: string, text: string): string; bg(color: string, text: string): string },
|
|
183
|
+
): string[] {
|
|
184
|
+
if (lines.length === 0) return lines;
|
|
185
|
+
const def = MODES[currentMode];
|
|
186
|
+
const badge = theme.bg("selectedBg", theme.fg("text", ` ${def.label} `));
|
|
187
|
+
const badgeWidth = visibleWidth(badge);
|
|
188
|
+
if (badgeWidth + 2 >= width) return lines;
|
|
189
|
+
// Replace the rightmost cells of the bottom border line with the badge.
|
|
190
|
+
const last = lines.length - 1;
|
|
191
|
+
lines[last] = truncateToWidth(lines[last]!, width - badgeWidth, "") + badge;
|
|
192
|
+
return lines;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function repaint(): void {
|
|
196
|
+
activeTui?.requestRender();
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function persist(): void {
|
|
200
|
+
pi.appendEntry("mode-switch", { mode: currentMode });
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
function persistCurrent(): void {
|
|
204
|
+
try {
|
|
205
|
+
writeFileSync(join(modeSwitchDir(), "current"), `${currentMode}\n`);
|
|
206
|
+
} catch {
|
|
207
|
+
// Best-effort: the viewer treats the file as a hint, not authority.
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// Apply a mode change to state and persistence. Shared by every path: the
|
|
212
|
+
// Alt+M / command path (which adds a UI toast and injects guidance on the
|
|
213
|
+
// next turn) and the CLI path (which already handed the agent its guidance via
|
|
214
|
+
// stdout).
|
|
215
|
+
function applyMode(next: Mode): void {
|
|
216
|
+
currentMode = next;
|
|
217
|
+
repaint();
|
|
218
|
+
persist();
|
|
219
|
+
persistCurrent();
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function setMode(next: Mode, ctx: ExtensionContext): void {
|
|
223
|
+
if (next === currentMode) {
|
|
224
|
+
ctx.ui.notify(`Already in ${next} mode.`, "info");
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
applyMode(next);
|
|
228
|
+
ctx.ui.notify(
|
|
229
|
+
currentMode === "normal"
|
|
230
|
+
? "Normal mode — full access restored."
|
|
231
|
+
: `${currentMode[0].toUpperCase()}${currentMode.slice(1)} mode — guidance will be applied on your next message.`,
|
|
232
|
+
);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// The agent switches its own mode by running the bundled CLI, which writes the
|
|
236
|
+
// requested mode to <root>/mode-switch/request.json. We pick that up live via
|
|
237
|
+
// fs.watch (with a before_agent_start reconcile as a backstop) only to sync the
|
|
238
|
+
// badge and persisted state — never to inject guidance, since the CLI already
|
|
239
|
+
// printed it to the agent's bash output. The request is consumed on read so a
|
|
240
|
+
// later Alt+M can't be clobbered by a stale request.
|
|
241
|
+
function applyFromRequest(next: Mode, source: "cli" | "attach"): void {
|
|
242
|
+
if (next === currentMode) return;
|
|
243
|
+
applyMode(next);
|
|
244
|
+
if (source === "cli") lastInjectedMode = next;
|
|
245
|
+
uiNotify?.(source === "cli" ? `Mode → ${next} (agent)` : `Mode → ${next} (viewer)`, "info");
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
function reconcileFromCli(): void {
|
|
249
|
+
let raw: string;
|
|
250
|
+
try {
|
|
251
|
+
raw = readFileSync(join(modeSwitchDir(), "request.json"), "utf8");
|
|
252
|
+
} catch {
|
|
253
|
+
return; // no pending request
|
|
254
|
+
}
|
|
255
|
+
let parsed: { mode?: string; token?: string; source?: "cli" | "attach" };
|
|
256
|
+
try {
|
|
257
|
+
parsed = JSON.parse(raw) as { mode?: string; token?: string; source?: "cli" | "attach" };
|
|
258
|
+
} catch {
|
|
259
|
+
return; // half-written; a later watch event or turn catches the final write
|
|
260
|
+
}
|
|
261
|
+
// Apply each CLI request at most once (token-gated) and never delete it, so
|
|
262
|
+
// every live instance — including the one actually on screen — converges to the
|
|
263
|
+
// requested mode regardless of /reload leftovers. A lingering request whose
|
|
264
|
+
// token we already applied can't clobber a later Alt+M.
|
|
265
|
+
if (parsed.token && parsed.token === lastAppliedToken) return;
|
|
266
|
+
lastAppliedToken = parsed.token;
|
|
267
|
+
if (parsed.mode && (CYCLE as string[]).includes(parsed.mode)) {
|
|
268
|
+
applyFromRequest(parsed.mode as Mode, parsed.source ?? "cli");
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
function startModeWatcher(dir: string): void {
|
|
273
|
+
modeWatcher?.close();
|
|
274
|
+
try {
|
|
275
|
+
modeWatcher = watch(dir, (_event, filename) => {
|
|
276
|
+
if (filename && filename !== "request.json") return;
|
|
277
|
+
reconcileFromCli();
|
|
278
|
+
});
|
|
279
|
+
} catch {
|
|
280
|
+
// fs.watch unsupported here — the before_agent_start reconcile still covers it.
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
function cycleMode(ctx: ExtensionContext): void {
|
|
285
|
+
const idx = CYCLE.indexOf(currentMode);
|
|
286
|
+
setMode(CYCLE[(idx + 1) % CYCLE.length], ctx);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// Alt+M cycles modes.
|
|
290
|
+
pi.registerShortcut("alt+m", {
|
|
291
|
+
description: "Cycle mode (normal → spec → plan)",
|
|
292
|
+
handler: async (ctx) => cycleMode(ctx),
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
// /mode cycles; /mode <name> jumps to a specific mode.
|
|
296
|
+
pi.registerCommand("mode", {
|
|
297
|
+
description: "Cycle operating mode, or /mode <normal|spec|plan> to set one",
|
|
298
|
+
getArgumentCompletions: (prefix: string) => {
|
|
299
|
+
const items = CYCLE.map((m) => ({ value: m, label: m }));
|
|
300
|
+
const filtered = items.filter((i) => i.value.startsWith(prefix));
|
|
301
|
+
return filtered.length > 0 ? filtered : null;
|
|
302
|
+
},
|
|
303
|
+
handler: async (args, ctx) => {
|
|
304
|
+
const arg = args.trim().toLowerCase();
|
|
305
|
+
if (!arg) {
|
|
306
|
+
cycleMode(ctx);
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
if ((CYCLE as string[]).includes(arg)) {
|
|
310
|
+
setMode(arg as Mode, ctx);
|
|
311
|
+
} else {
|
|
312
|
+
ctx.ui.notify(`Unknown mode "${arg}". Use: ${CYCLE.join(", ")}.`, "error");
|
|
313
|
+
}
|
|
314
|
+
},
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
// The core behaviour: inject the active mode's guidance before the turn, but
|
|
318
|
+
// only when the mode has changed since the last injection. We first reconcile
|
|
319
|
+
// any agent-initiated CLI switch the fs.watch may have missed.
|
|
320
|
+
pi.on("before_agent_start", async () => {
|
|
321
|
+
reconcileFromCli();
|
|
322
|
+
if (currentMode === lastInjectedMode) return;
|
|
323
|
+
lastInjectedMode = currentMode;
|
|
324
|
+
return {
|
|
325
|
+
message: {
|
|
326
|
+
customType: "mode-switch-context",
|
|
327
|
+
content: MODES[currentMode].context,
|
|
328
|
+
display: false,
|
|
329
|
+
},
|
|
330
|
+
};
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
// Keep only the most recent mode-guidance message and drop the older ones, so
|
|
334
|
+
// the LLM always sees the current mode's instructions (including the
|
|
335
|
+
// "restrictions lifted" note when returning to normal) and never stale
|
|
336
|
+
// guidance from a previous mode.
|
|
337
|
+
pi.on("context", async (event) => {
|
|
338
|
+
const messages = event.messages;
|
|
339
|
+
let lastIdx = -1;
|
|
340
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
341
|
+
if ((messages[i] as { customType?: string }).customType === "mode-switch-context") {
|
|
342
|
+
lastIdx = i;
|
|
343
|
+
break;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
if (lastIdx === -1) return;
|
|
347
|
+
return {
|
|
348
|
+
messages: messages.filter((m, i) => {
|
|
349
|
+
return (m as { customType?: string }).customType !== "mode-switch-context" || i === lastIdx;
|
|
350
|
+
}),
|
|
351
|
+
};
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
// Restore persisted mode on session start / resume, and install the input
|
|
355
|
+
// badge.
|
|
356
|
+
pi.on("session_start", async (_event, ctx) => {
|
|
357
|
+
// Guarantee the per-cwd specs/ and plans/ dirs exist so spec/plan modes
|
|
358
|
+
// have somewhere to write the moment they're entered.
|
|
359
|
+
ensureArtifactDirs();
|
|
360
|
+
|
|
361
|
+
const entries = ctx.sessionManager.getEntries();
|
|
362
|
+
const last = entries
|
|
363
|
+
.filter((e: { type: string; customType?: string }) => e.type === "custom" && e.customType === "mode-switch")
|
|
364
|
+
.pop() as { data?: { mode?: Mode } } | undefined;
|
|
365
|
+
|
|
366
|
+
if (last?.data?.mode && (CYCLE as string[]).includes(last.data.mode)) {
|
|
367
|
+
currentMode = last.data.mode;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
// Re-establish non-normal mode guidance on the next turn after a resume;
|
|
371
|
+
// normal mode needs no re-injection.
|
|
372
|
+
lastInjectedMode = currentMode === "normal" ? "normal" : null;
|
|
373
|
+
|
|
374
|
+
// Mirror each mode's guidance to disk so the CLI can hand the right one to the
|
|
375
|
+
// agent on stdout, clear any stale request from a previous session, write the
|
|
376
|
+
// current mode hint for the viewer, and start watching for mode requests.
|
|
377
|
+
const dir = modeSwitchDir();
|
|
378
|
+
try {
|
|
379
|
+
for (const mode of CYCLE) {
|
|
380
|
+
writeFileSync(join(dir, "guidance", `${mode}.txt`), MODES[mode].context);
|
|
381
|
+
}
|
|
382
|
+
writeFileSync(join(dir, "current"), `${currentMode}\n`);
|
|
383
|
+
rmSync(join(dir, "request.json"), { force: true });
|
|
384
|
+
} catch {
|
|
385
|
+
// Best-effort: the before_agent_start reconcile still covers switches.
|
|
386
|
+
}
|
|
387
|
+
lastAppliedToken = undefined;
|
|
388
|
+
startModeWatcher(dir);
|
|
389
|
+
|
|
390
|
+
if (!ctx.hasUI) return;
|
|
391
|
+
uiNotify = (message, type) => ctx.ui.notify(message, type);
|
|
392
|
+
|
|
393
|
+
// Wrap whatever editor is already installed (e.g. a session-name badge on
|
|
394
|
+
// the top border) so both decorations coexist. A transparent Proxy forwards
|
|
395
|
+
// every method/property to the base editor and overrides only render() to
|
|
396
|
+
// append the mode badge on the bottom-right border line.
|
|
397
|
+
const previousFactory = ctx.ui.getEditorComponent();
|
|
398
|
+
const uiTheme = ctx.ui.theme;
|
|
399
|
+
ctx.ui.setEditorComponent((tui, theme, keybindings) => {
|
|
400
|
+
activeTui = tui;
|
|
401
|
+
const base = previousFactory
|
|
402
|
+
? previousFactory(tui, theme, keybindings)
|
|
403
|
+
: new CustomEditor(tui, theme, keybindings);
|
|
404
|
+
return new Proxy(base, {
|
|
405
|
+
get(target, prop, receiver) {
|
|
406
|
+
if (prop === "render") {
|
|
407
|
+
return (width: number): string[] => decorateInput(target.render(width), width, uiTheme);
|
|
408
|
+
}
|
|
409
|
+
const value = Reflect.get(target, prop, target);
|
|
410
|
+
return typeof value === "function" ? value.bind(target) : value;
|
|
411
|
+
},
|
|
412
|
+
});
|
|
413
|
+
});
|
|
414
|
+
repaint();
|
|
415
|
+
});
|
|
416
|
+
|
|
417
|
+
// Stop watching the request file when the session ends.
|
|
418
|
+
pi.on("session_shutdown", async () => {
|
|
419
|
+
modeWatcher?.close();
|
|
420
|
+
modeWatcher = undefined;
|
|
421
|
+
});
|
|
422
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "pi-mode-switch",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Press Alt+M to cycle between spec, plan, and normal modes. Injects mode-specific operating guidance whenever the mode changes.",
|
|
5
|
+
"keywords": ["pi-package", "modes", "spec", "plan"],
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"peerDependencies": {
|
|
8
|
+
"@earendil-works/pi-coding-agent": "*"
|
|
9
|
+
},
|
|
10
|
+
"pi": {
|
|
11
|
+
"extensions": ["./extensions"]
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
import test from 'node:test';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
const ROOT = join(HERE, '..', '..', '..');
|
|
8
|
+
const EXTENSIONS = join(ROOT, 'builtin-pi-packages', 'pi-crtr-extensions', 'extensions');
|
|
9
|
+
function read(path) {
|
|
10
|
+
return readFileSync(path, 'utf8');
|
|
11
|
+
}
|
|
12
|
+
function tsFiles(dir) {
|
|
13
|
+
return readdirSync(dir)
|
|
14
|
+
.flatMap((entry) => {
|
|
15
|
+
const path = join(dir, entry);
|
|
16
|
+
const stat = statSync(path);
|
|
17
|
+
if (stat.isDirectory())
|
|
18
|
+
return entry === 'node_modules' ? [] : tsFiles(path);
|
|
19
|
+
return path.endsWith('.ts') ? [path] : [];
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
test('crtr slash-command output is stamped with the rendered crtr-output message type', () => {
|
|
23
|
+
const source = read(join(EXTENSIONS, 'crtr-commands', 'index.ts'));
|
|
24
|
+
assert.match(source, /pi\.sendMessage\(\s*\{[\s\S]*customType:\s*["']crtr-output["'][\s\S]*content:\s*`\$ crtr/);
|
|
25
|
+
});
|
|
26
|
+
test('every extension message that displays `$ crtr ...` output uses crtr-output', () => {
|
|
27
|
+
const offenders = [];
|
|
28
|
+
for (const file of tsFiles(EXTENSIONS)) {
|
|
29
|
+
const source = read(file);
|
|
30
|
+
const crtrOutputBlocks = [...source.matchAll(/pi\.sendMessage\(\s*\{[\s\S]*?\}\s*,/g)];
|
|
31
|
+
for (const match of crtrOutputBlocks) {
|
|
32
|
+
const block = match[0];
|
|
33
|
+
if (!block.includes('$ crtr'))
|
|
34
|
+
continue;
|
|
35
|
+
if (!/customType:\s*["']crtr-output["']/.test(block))
|
|
36
|
+
offenders.push(file);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
assert.deepEqual(offenders, []);
|
|
40
|
+
});
|
|
41
|
+
test('the broker bundle does not re-duplicate the attach viewer\'s crtr renderer', () => {
|
|
42
|
+
// The broker only ever runs pi in mode:'print' (broker.ts), and print mode
|
|
43
|
+
// never calls renderCall/renderResult/registerMessageRenderer hooks (only
|
|
44
|
+
// interactive TUI mode does). crtr output rendering lives solely in the
|
|
45
|
+
// attach viewer's crtr-output-render.ts — this file must not exist in the
|
|
46
|
+
// broker's extension set.
|
|
47
|
+
assert.equal(existsSync(join(EXTENSIONS, 'crtr-bash-renderer.ts')), false);
|
|
48
|
+
});
|
|
49
|
+
test('the attach viewer covers crtr bash tool calls and crtr-output messages natively', () => {
|
|
50
|
+
const chatView = read(join(ROOT, 'clients', 'attach', 'chat-view.ts'));
|
|
51
|
+
assert.match(chatView, /CRTR_OUTPUT_CUSTOM_TYPE/);
|
|
52
|
+
assert.match(chatView, /new CrtrOutputMessageComponent\(/);
|
|
53
|
+
assert.match(chatView, /createCrtrBashToolDefinition\(args\)/);
|
|
54
|
+
assert.match(chatView, /new ToolExecutionComponent\([\s\S]*toolDefinition as never/);
|
|
55
|
+
});
|