@crouton-kit/crouter 0.3.33 → 0.3.35

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.
Files changed (617) hide show
  1. package/README.md +2 -2
  2. package/dist/build-root.js +3 -6
  3. package/dist/builtin-memory/crouter-development/marketplaces.md +6 -6
  4. package/dist/builtin-memory/crouter-development/plugins.md +13 -13
  5. package/dist/builtin-memory/internal/examples/imessage-assistant.md +3 -3
  6. package/dist/builtin-memory/internal/nodes-and-canvas.md +4 -4
  7. package/dist/builtin-personas/developer/PERSONA.md +1 -1
  8. package/dist/builtin-personas/orchestration-kernel.md +1 -1
  9. package/dist/builtin-personas/waiting.md +1 -1
  10. package/dist/builtin-pi-packages/pi-crtr-extensions/README.md +71 -0
  11. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/crtr-help-gate.test.ts +41 -0
  12. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/provider-rotation.test.ts +663 -0
  13. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +52 -0
  14. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +418 -0
  15. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crouter-help.ts +87 -0
  16. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crtr-commands/filters.json +7 -0
  17. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crtr-commands/index.ts +174 -0
  18. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crtr-help-gate.ts +408 -0
  19. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +442 -0
  20. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +119 -0
  21. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/nested-context.ts +327 -0
  22. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +574 -0
  23. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/statusline.ts +260 -0
  24. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/strip-skills-docs.ts +40 -0
  25. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/sysprompt-window.ts +19 -0
  26. package/dist/builtin-pi-packages/pi-crtr-extensions/lib/package.json +3 -0
  27. package/dist/builtin-pi-packages/pi-crtr-extensions/lib/subscription-state.js +1 -0
  28. package/dist/builtin-pi-packages/pi-crtr-extensions/lib/subscription-state.ts +479 -0
  29. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/LICENSE +13 -0
  30. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/README.md +172 -0
  31. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/bin.mjs +11 -0
  32. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-collection.js +88 -0
  33. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-doc.js +43 -0
  34. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-node.js +109 -0
  35. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-scalar.js +86 -0
  36. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/composer.js +219 -0
  37. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-block-map.js +115 -0
  38. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +198 -0
  39. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +49 -0
  40. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-end.js +37 -0
  41. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +207 -0
  42. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +225 -0
  43. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-props.js +146 -0
  44. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-contains-newline.js +34 -0
  45. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +26 -0
  46. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +15 -0
  47. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-map-includes.js +13 -0
  48. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/Document.js +335 -0
  49. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/anchors.js +71 -0
  50. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/applyReviver.js +55 -0
  51. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/createNode.js +88 -0
  52. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/directives.js +176 -0
  53. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/errors.js +57 -0
  54. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/index.js +17 -0
  55. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/log.js +11 -0
  56. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Alias.js +116 -0
  57. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Collection.js +147 -0
  58. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Node.js +38 -0
  59. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Pair.js +36 -0
  60. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Scalar.js +24 -0
  61. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/YAMLMap.js +144 -0
  62. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +113 -0
  63. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +63 -0
  64. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/identity.js +36 -0
  65. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/toJS.js +37 -0
  66. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst-scalar.js +214 -0
  67. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst-stringify.js +61 -0
  68. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst-visit.js +97 -0
  69. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst.js +98 -0
  70. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/lexer.js +721 -0
  71. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/line-counter.js +39 -0
  72. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/parser.js +975 -0
  73. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/public-api.js +102 -0
  74. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/Schema.js +37 -0
  75. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/map.js +17 -0
  76. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/null.js +15 -0
  77. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/seq.js +17 -0
  78. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/string.js +14 -0
  79. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/bool.js +19 -0
  80. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/float.js +43 -0
  81. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/int.js +38 -0
  82. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/schema.js +23 -0
  83. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/json/schema.js +62 -0
  84. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/tags.js +96 -0
  85. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +58 -0
  86. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +26 -0
  87. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +46 -0
  88. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +71 -0
  89. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +67 -0
  90. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +74 -0
  91. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +78 -0
  92. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +39 -0
  93. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +93 -0
  94. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +101 -0
  95. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +146 -0
  96. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringify.js +129 -0
  97. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +153 -0
  98. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyComment.js +20 -0
  99. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +85 -0
  100. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +25 -0
  101. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyPair.js +150 -0
  102. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyString.js +336 -0
  103. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/util.js +11 -0
  104. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/visit.js +233 -0
  105. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/index.js +5 -0
  106. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/package.json +3 -0
  107. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/cli.d.ts +8 -0
  108. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/cli.mjs +201 -0
  109. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-collection.d.ts +11 -0
  110. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-collection.js +90 -0
  111. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-doc.d.ts +7 -0
  112. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-doc.js +45 -0
  113. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-node.d.ts +29 -0
  114. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-node.js +112 -0
  115. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-scalar.d.ts +5 -0
  116. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-scalar.js +88 -0
  117. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/composer.d.ts +63 -0
  118. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/composer.js +224 -0
  119. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-map.d.ts +6 -0
  120. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-map.js +117 -0
  121. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +11 -0
  122. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-scalar.js +200 -0
  123. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +6 -0
  124. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-seq.js +51 -0
  125. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-end.d.ts +6 -0
  126. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-end.js +39 -0
  127. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +7 -0
  128. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-collection.js +209 -0
  129. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +10 -0
  130. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-scalar.js +227 -0
  131. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-props.d.ts +23 -0
  132. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-props.js +148 -0
  133. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-contains-newline.d.ts +2 -0
  134. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-contains-newline.js +36 -0
  135. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +2 -0
  136. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-empty-scalar-position.js +28 -0
  137. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +3 -0
  138. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-flow-indent-check.js +17 -0
  139. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-map-includes.d.ts +4 -0
  140. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-map-includes.js +15 -0
  141. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/Document.d.ts +141 -0
  142. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/Document.js +337 -0
  143. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/anchors.d.ts +24 -0
  144. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/anchors.js +76 -0
  145. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/applyReviver.d.ts +9 -0
  146. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/applyReviver.js +57 -0
  147. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/createNode.d.ts +17 -0
  148. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/createNode.js +90 -0
  149. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/directives.d.ts +49 -0
  150. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/directives.js +178 -0
  151. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/errors.d.ts +21 -0
  152. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/errors.js +62 -0
  153. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/index.d.ts +25 -0
  154. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/index.js +50 -0
  155. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/log.d.ts +3 -0
  156. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/log.js +19 -0
  157. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Alias.d.ts +29 -0
  158. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Alias.js +118 -0
  159. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Collection.d.ts +73 -0
  160. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Collection.js +151 -0
  161. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Node.d.ts +53 -0
  162. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Node.js +40 -0
  163. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Pair.d.ts +22 -0
  164. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Pair.js +39 -0
  165. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Scalar.d.ts +47 -0
  166. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Scalar.js +27 -0
  167. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLMap.d.ts +53 -0
  168. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLMap.js +147 -0
  169. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +60 -0
  170. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLSeq.js +115 -0
  171. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +4 -0
  172. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/addPairToJSMap.js +65 -0
  173. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/identity.d.ts +23 -0
  174. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/identity.js +53 -0
  175. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/toJS.d.ts +29 -0
  176. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/toJS.js +39 -0
  177. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/options.d.ts +350 -0
  178. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-scalar.d.ts +64 -0
  179. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-scalar.js +218 -0
  180. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-stringify.d.ts +8 -0
  181. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-stringify.js +63 -0
  182. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-visit.d.ts +39 -0
  183. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-visit.js +99 -0
  184. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst.d.ts +109 -0
  185. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst.js +112 -0
  186. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/lexer.d.ts +87 -0
  187. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/lexer.js +723 -0
  188. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/line-counter.d.ts +22 -0
  189. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/line-counter.js +41 -0
  190. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/parser.d.ts +84 -0
  191. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/parser.js +980 -0
  192. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/public-api.d.ts +44 -0
  193. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/public-api.js +107 -0
  194. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/Schema.d.ts +17 -0
  195. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/Schema.js +39 -0
  196. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/map.d.ts +2 -0
  197. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/map.js +19 -0
  198. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/null.d.ts +4 -0
  199. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/null.js +17 -0
  200. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/seq.d.ts +2 -0
  201. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/seq.js +19 -0
  202. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/string.d.ts +2 -0
  203. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/string.js +16 -0
  204. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/bool.d.ts +4 -0
  205. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/bool.js +21 -0
  206. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/float.d.ts +4 -0
  207. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/float.js +47 -0
  208. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/int.d.ts +4 -0
  209. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/int.js +42 -0
  210. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/schema.d.ts +1 -0
  211. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/schema.js +25 -0
  212. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/json/schema.d.ts +2 -0
  213. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/json/schema.js +64 -0
  214. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/json-schema.d.ts +69 -0
  215. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/tags.d.ts +48 -0
  216. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/tags.js +99 -0
  217. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/types.d.ts +92 -0
  218. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +2 -0
  219. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/binary.js +70 -0
  220. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +7 -0
  221. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/bool.js +29 -0
  222. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +4 -0
  223. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/float.js +50 -0
  224. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +5 -0
  225. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/int.js +76 -0
  226. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +9 -0
  227. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/merge.js +71 -0
  228. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +22 -0
  229. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/omap.js +77 -0
  230. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +10 -0
  231. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +82 -0
  232. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +1 -0
  233. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/schema.js +41 -0
  234. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +28 -0
  235. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/set.js +96 -0
  236. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +6 -0
  237. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +105 -0
  238. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +34 -0
  239. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/foldFlowLines.js +151 -0
  240. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringify.d.ts +21 -0
  241. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringify.js +132 -0
  242. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +17 -0
  243. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyCollection.js +155 -0
  244. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyComment.d.ts +10 -0
  245. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyComment.js +24 -0
  246. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +4 -0
  247. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyDocument.js +87 -0
  248. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +2 -0
  249. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyNumber.js +27 -0
  250. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyPair.d.ts +3 -0
  251. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyPair.js +152 -0
  252. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyString.d.ts +9 -0
  253. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyString.js +338 -0
  254. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/test-events.d.ts +4 -0
  255. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/test-events.js +134 -0
  256. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/util.d.ts +16 -0
  257. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/util.js +28 -0
  258. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/visit.d.ts +102 -0
  259. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/visit.js +236 -0
  260. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/package.json +97 -0
  261. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/util.js +2 -0
  262. package/dist/builtin-pi-packages/pi-crtr-extensions/package-lock.json +3385 -0
  263. package/dist/builtin-pi-packages/pi-crtr-extensions/package.json +25 -0
  264. package/dist/builtin-pi-packages/pi-mode-switch/README.md +64 -0
  265. package/dist/builtin-pi-packages/pi-mode-switch/bin/mode +40 -0
  266. package/dist/builtin-pi-packages/pi-mode-switch/extensions/index.ts +427 -0
  267. package/dist/builtin-pi-packages/pi-mode-switch/package.json +13 -0
  268. package/dist/clients/attach/__tests__/crtr-output-coverage.test.js +55 -0
  269. package/dist/clients/attach/__tests__/crtr-output-render.test.js +2340 -0
  270. package/dist/clients/attach/attach-cmd.js +843 -743
  271. package/dist/clients/attach/auth-pickers.js +2 -2
  272. package/dist/clients/attach/canvas-panels.js +1 -1
  273. package/dist/clients/attach/chat-view.d.ts +3 -2
  274. package/dist/clients/attach/chat-view.js +30 -10
  275. package/dist/clients/attach/clipboard-image.js +1 -1
  276. package/dist/clients/attach/clipboard-text.js +1 -1
  277. package/dist/clients/attach/config-load.js +1 -1
  278. package/dist/clients/attach/crtr-output-render.d.ts +48 -0
  279. package/dist/clients/attach/crtr-output-render.js +646 -0
  280. package/dist/clients/attach/extension-dialogs.js +1 -1
  281. package/dist/clients/attach/graph-overlay.js +3 -3
  282. package/dist/clients/attach/input-controller.js +1 -1
  283. package/dist/clients/attach/pickers.js +1 -1
  284. package/dist/clients/attach/slash-commands.js +5 -6
  285. package/dist/clients/attach/titled-editor.d.ts +4 -0
  286. package/dist/clients/attach/titled-editor.js +13 -1
  287. package/dist/clients/attach/view-socket.js +1 -1
  288. package/dist/clients/web/__tests__/source-cache.test.js +5 -5
  289. package/dist/clients/web/server.js +29 -5
  290. package/dist/clients/web/source-cache.js +3 -3
  291. package/dist/clients/web/web-cmd.js +7 -7
  292. package/dist/commands/canvas-issue.js +1 -1
  293. package/dist/commands/canvas-prune.js +24 -2
  294. package/dist/commands/canvas-snapshot.js +3 -0
  295. package/dist/commands/canvas-tmux-spread.js +3 -3
  296. package/dist/commands/human.js +1 -1
  297. package/dist/commands/memory/lint.js +15 -8
  298. package/dist/commands/memory/origin.d.ts +1 -0
  299. package/dist/commands/memory/origin.js +88 -0
  300. package/dist/commands/memory/shared.d.ts +8 -0
  301. package/dist/commands/memory/shared.js +22 -1
  302. package/dist/commands/memory/write.js +17 -12
  303. package/dist/commands/memory.js +4 -3
  304. package/dist/commands/node-context.js +4 -4
  305. package/dist/commands/node-snapshot.js +4 -1
  306. package/dist/commands/node.d.ts +2 -2
  307. package/dist/commands/node.js +814 -606
  308. package/dist/commands/pkg/market-inspect.d.ts +2 -1
  309. package/dist/commands/pkg/market-inspect.js +14 -32
  310. package/dist/commands/pkg/market-manage.d.ts +3 -1
  311. package/dist/commands/pkg/market-manage.js +58 -154
  312. package/dist/commands/pkg/market.js +7 -7
  313. package/dist/commands/pkg/plugin-inspect.d.ts +2 -1
  314. package/dist/commands/pkg/plugin-inspect.js +8 -24
  315. package/dist/commands/pkg/plugin-manage.d.ts +5 -1
  316. package/dist/commands/pkg/plugin-manage.js +245 -171
  317. package/dist/commands/pkg/plugin.js +6 -6
  318. package/dist/commands/pkg.js +5 -5
  319. package/dist/commands/revive.js +5 -3
  320. package/dist/commands/search/answer.js +1 -1
  321. package/dist/commands/search/contents.js +1 -1
  322. package/dist/commands/search/web.js +2 -2
  323. package/dist/commands/search.js +1 -1
  324. package/dist/commands/surface.d.ts +2 -0
  325. package/dist/commands/surface.js +43 -0
  326. package/dist/commands/sys/promptstudio.js +1 -1
  327. package/dist/commands/sys/settings.js +2 -2
  328. package/dist/commands/sys/setup-core.d.ts +88 -0
  329. package/dist/commands/sys/setup-core.js +352 -0
  330. package/dist/commands/sys/setup.d.ts +2 -0
  331. package/dist/commands/sys/setup.js +516 -0
  332. package/dist/commands/sys/sysprompt.js +3 -0
  333. package/dist/commands/sys.js +3 -2
  334. package/dist/commands/view-cycle.js +5 -5
  335. package/dist/commands/view-list.js +3 -3
  336. package/dist/commands/view-new.js +5 -5
  337. package/dist/commands/view-pick.js +6 -6
  338. package/dist/commands/view-run.js +14 -14
  339. package/dist/commands/view.js +3 -3
  340. package/dist/commands/workspace.js +10 -10
  341. package/dist/core/__tests__/boot.test.js +140 -0
  342. package/dist/core/__tests__/broker-sdk-wiring.test.js +6 -27
  343. package/dist/core/__tests__/daemon-boot.test.js +22 -0
  344. package/dist/core/__tests__/fixtures/fake-engine.js +19 -9
  345. package/dist/core/__tests__/flagship-lifecycle.test.js +4 -1
  346. package/dist/core/__tests__/full/broker-attach-limits.test.js +1 -1
  347. package/dist/core/__tests__/full/broker-attach-stream.test.js +1 -1
  348. package/dist/core/__tests__/full/broker-crash-teardown.test.js +10 -5
  349. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +1 -1
  350. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +2 -2
  351. package/dist/core/__tests__/full/broker-pane-resolution.test.js +1 -1
  352. package/dist/core/__tests__/full/cascade-close.test.js +31 -18
  353. package/dist/core/__tests__/full/detach-focus.test.js +17 -3
  354. package/dist/core/__tests__/hearth-bootstrap.test.js +136 -0
  355. package/dist/core/__tests__/helpers/harness.js +1 -1
  356. package/dist/core/__tests__/live-mutation-verbs.test.js +17 -11
  357. package/dist/core/__tests__/live-mutation.test.js +15 -10
  358. package/dist/core/__tests__/migration.test.js +124 -0
  359. package/dist/core/__tests__/on-read-dedup-resume.test.js +40 -0
  360. package/dist/core/__tests__/preview-registry-sync.test.js +36 -0
  361. package/dist/core/__tests__/prune-to-limit.test.js +91 -0
  362. package/dist/core/__tests__/revive.test.js +64 -21
  363. package/dist/core/__tests__/trigger-migration.test.js +48 -0
  364. package/dist/core/__tests__/wake-bearings.test.js +23 -21
  365. package/dist/core/__tests__/wake-origin.test.js +36 -33
  366. package/dist/core/canvas/boot.d.ts +48 -0
  367. package/dist/core/canvas/boot.js +157 -0
  368. package/dist/core/canvas/canvas.d.ts +27 -1
  369. package/dist/core/canvas/canvas.js +86 -5
  370. package/dist/core/canvas/db.js +86 -1
  371. package/dist/core/canvas/index.d.ts +1 -1
  372. package/dist/core/canvas/index.js +1 -1
  373. package/dist/core/canvas/nav-model.js +1 -1
  374. package/dist/core/canvas/pid.d.ts +6 -0
  375. package/dist/core/canvas/pid.js +13 -0
  376. package/dist/core/canvas/triggers.d.ts +108 -0
  377. package/dist/core/canvas/triggers.js +320 -0
  378. package/dist/core/canvas/types.d.ts +128 -46
  379. package/dist/core/command.js +13 -4
  380. package/dist/core/hearth/__tests__/model-auth-guest.test.js +151 -0
  381. package/dist/core/hearth/config.d.ts +1 -0
  382. package/dist/core/hearth/config.js +36 -3
  383. package/dist/core/hearth/guest-env.d.ts +7 -0
  384. package/dist/core/hearth/guest-env.js +17 -1
  385. package/dist/core/hearth/index.d.ts +0 -1
  386. package/dist/core/hearth/index.js +0 -1
  387. package/dist/core/hearth/model-auth-guest.d.ts +8 -0
  388. package/dist/core/hearth/model-auth-guest.js +430 -0
  389. package/dist/core/hearth/provider.d.ts +13 -6
  390. package/dist/core/hearth/providers/blaxel-bootstrap.d.ts +2 -0
  391. package/dist/core/hearth/providers/blaxel-bootstrap.js +127 -19
  392. package/dist/core/hearth/providers/blaxel-home.d.ts +8 -4
  393. package/dist/core/hearth/providers/blaxel-home.js +85 -75
  394. package/dist/core/hearth/providers/blaxel.d.ts +5 -0
  395. package/dist/core/hearth/providers/blaxel.js +86 -12
  396. package/dist/core/hearth/providers/types.d.ts +6 -1
  397. package/dist/core/hearth/types.d.ts +35 -1
  398. package/dist/core/help.d.ts +16 -0
  399. package/dist/core/help.js +2 -0
  400. package/dist/core/memory-resolver.d.ts +8 -8
  401. package/dist/core/memory-resolver.js +58 -26
  402. package/dist/core/preview-registry.d.ts +25 -0
  403. package/dist/core/preview-registry.js +2047 -0
  404. package/dist/core/resolver.d.ts +1 -0
  405. package/dist/core/resolver.js +23 -16
  406. package/dist/core/runtime/bearings.d.ts +11 -10
  407. package/dist/core/runtime/bearings.js +8 -8
  408. package/dist/core/runtime/broker-protocol.d.ts +2 -2
  409. package/dist/core/runtime/broker-protocol.js +2 -2
  410. package/dist/core/runtime/close.js +2 -2
  411. package/dist/core/runtime/kickoff.js +1 -1
  412. package/dist/core/runtime/launch.d.ts +9 -3
  413. package/dist/core/runtime/launch.js +17 -9
  414. package/dist/core/runtime/lifecycle.js +7 -7
  415. package/dist/core/runtime/model-swap.js +1 -1
  416. package/dist/core/runtime/placement.d.ts +5 -5
  417. package/dist/core/runtime/placement.js +10 -10
  418. package/dist/core/runtime/recycle.js +7 -7
  419. package/dist/core/runtime/reset.d.ts +1 -1
  420. package/dist/core/runtime/reset.js +3 -3
  421. package/dist/core/runtime/revive-all.d.ts +5 -2
  422. package/dist/core/runtime/revive-all.js +5 -2
  423. package/dist/core/runtime/revive.d.ts +15 -8
  424. package/dist/core/runtime/revive.js +52 -16
  425. package/dist/core/runtime/spawn.d.ts +1 -1
  426. package/dist/core/runtime/spawn.js +7 -7
  427. package/dist/core/runtime/stop-guard.js +5 -5
  428. package/dist/core/runtime/surface-bg.js +1 -1
  429. package/dist/core/runtime/tmux.d.ts +1 -1
  430. package/dist/core/runtime/tmux.js +4 -4
  431. package/dist/core/scope.d.ts +9 -0
  432. package/dist/core/scope.js +37 -15
  433. package/dist/core/substrate/on-read.js +23 -21
  434. package/dist/core/substrate/render.js +3 -3
  435. package/dist/core/view/loader.js +2 -2
  436. package/dist/core/wake.d.ts +2 -2
  437. package/dist/core/wake.js +7 -7
  438. package/dist/daemon/__tests__/predicate-eval.test.js +109 -0
  439. package/dist/daemon/crtrd.js +222 -103
  440. package/dist/daemon/predicate-eval.d.ts +52 -0
  441. package/dist/daemon/predicate-eval.js +248 -0
  442. package/dist/hearth/control-plane/__tests__/node-message.test.js +60 -0
  443. package/dist/hearth/control-plane/__tests__/rate-limit-recurrence.test.js +49 -0
  444. package/dist/hearth/control-plane/__tests__/relay-security.test.js +314 -0
  445. package/dist/hearth/control-plane/__tests__/scheduler-scan-loop.test.js +133 -0
  446. package/dist/hearth/control-plane/__tests__/trigger-delivery.test.js +170 -0
  447. package/dist/hearth/control-plane/__tests__/webhook-ingress.test.js +167 -0
  448. package/dist/hearth/control-plane/config.d.ts +21 -0
  449. package/dist/hearth/control-plane/config.js +77 -0
  450. package/dist/hearth/control-plane/db.d.ts +30 -0
  451. package/dist/hearth/control-plane/db.js +534 -0
  452. package/dist/hearth/control-plane/ingress/rate-limit.d.ts +24 -0
  453. package/dist/hearth/control-plane/ingress/rate-limit.js +100 -0
  454. package/dist/hearth/control-plane/ingress/route-store.d.ts +31 -0
  455. package/dist/hearth/control-plane/ingress/route-store.js +61 -0
  456. package/dist/hearth/control-plane/ingress/webhook-delivery-store.d.ts +41 -0
  457. package/dist/hearth/control-plane/ingress/webhook-delivery-store.js +69 -0
  458. package/dist/hearth/control-plane/ingress/webhook-route.d.ts +55 -0
  459. package/dist/hearth/control-plane/ingress/webhook-route.js +285 -0
  460. package/dist/hearth/control-plane/main.js +88 -0
  461. package/dist/hearth/control-plane/node-message.d.ts +31 -0
  462. package/dist/hearth/control-plane/node-message.js +98 -0
  463. package/dist/hearth/control-plane/register.d.ts +15 -0
  464. package/dist/hearth/control-plane/register.js +34 -0
  465. package/dist/hearth/control-plane/registry.d.ts +17 -0
  466. package/dist/hearth/control-plane/registry.js +161 -0
  467. package/dist/hearth/control-plane/relay.d.ts +40 -0
  468. package/dist/hearth/{wake-proxy/proxy.js → control-plane/relay.js} +201 -275
  469. package/dist/hearth/control-plane/scheduler/fire-store.d.ts +36 -0
  470. package/dist/hearth/control-plane/scheduler/fire-store.js +73 -0
  471. package/dist/hearth/control-plane/scheduler/recurrence.d.ts +7 -0
  472. package/dist/hearth/control-plane/scheduler/recurrence.js +58 -0
  473. package/dist/hearth/control-plane/scheduler/scan-loop.d.ts +38 -0
  474. package/dist/hearth/control-plane/scheduler/scan-loop.js +138 -0
  475. package/dist/hearth/control-plane/scheduler/schedule-store.d.ts +32 -0
  476. package/dist/hearth/control-plane/scheduler/schedule-store.js +66 -0
  477. package/dist/hearth/control-plane/secrets.d.ts +17 -0
  478. package/dist/hearth/control-plane/secrets.js +113 -0
  479. package/dist/hearth/control-plane/server.d.ts +27 -0
  480. package/dist/hearth/control-plane/server.js +346 -0
  481. package/dist/hearth/control-plane/session.d.ts +68 -0
  482. package/dist/hearth/control-plane/session.js +273 -0
  483. package/dist/hearth/control-plane/triggers/acl.d.ts +14 -0
  484. package/dist/hearth/control-plane/triggers/acl.js +52 -0
  485. package/dist/hearth/control-plane/triggers/audit-store.d.ts +38 -0
  486. package/dist/hearth/control-plane/triggers/audit-store.js +79 -0
  487. package/dist/hearth/control-plane/triggers/deliver.d.ts +43 -0
  488. package/dist/hearth/control-plane/triggers/deliver.js +76 -0
  489. package/dist/hearth/control-plane/triggers/envelope.d.ts +29 -0
  490. package/dist/hearth/control-plane/triggers/envelope.js +38 -0
  491. package/dist/hearth/control-plane/types.d.ts +66 -0
  492. package/dist/hearth/control-plane/wake.d.ts +80 -0
  493. package/dist/hearth/control-plane/wake.js +312 -0
  494. package/dist/pi-extensions/canvas-doc-substrate.js +28 -2
  495. package/dist/pi-extensions/canvas-nav.js +1 -1
  496. package/dist/prompts/view.js +7 -8
  497. package/dist/types.js +4 -4
  498. package/dist/web-client/assets/index-DUThOUzU.css +2 -0
  499. package/dist/web-client/assets/index-IAJVtuVe.js +80 -0
  500. package/dist/web-client/index.html +2 -2
  501. package/package.json +12 -9
  502. package/scripts/postinstall.mjs +8 -0
  503. package/dist/clients/attach/__tests__/action-parity.test.js +0 -48
  504. package/dist/clients/attach/__tests__/autocomplete-and-bash-mode.test.js +0 -96
  505. package/dist/clients/attach/__tests__/bash-bang-routing.test.js +0 -58
  506. package/dist/clients/attach/__tests__/bundle-pi-tui-dedup.test.js +0 -56
  507. package/dist/clients/attach/__tests__/clipboard-image.test.js +0 -76
  508. package/dist/clients/attach/__tests__/editor-newline.test.js +0 -82
  509. package/dist/clients/attach/__tests__/git-info.test.js +0 -31
  510. package/dist/clients/attach/__tests__/onrequest-wired.test.js +0 -20
  511. package/dist/clients/attach/__tests__/reconnect-giveup.test.js +0 -30
  512. package/dist/clients/attach/__tests__/slash-quit-copy.test.js +0 -42
  513. package/dist/clients/attach/__tests__/titled-editor.test.js +0 -60
  514. package/dist/commands/memory/__tests__/lint-schema.test.js +0 -52
  515. package/dist/core/__tests__/argv-parser.test.js +0 -217
  516. package/dist/core/__tests__/artifact-paths.test.js +0 -44
  517. package/dist/core/__tests__/draw-style.test.js +0 -258
  518. package/dist/core/__tests__/editor-label.test.d.ts +0 -1
  519. package/dist/core/__tests__/editor-label.test.js +0 -26
  520. package/dist/core/__tests__/fault-marker.test.d.ts +0 -1
  521. package/dist/core/__tests__/fault-marker.test.js +0 -112
  522. package/dist/core/__tests__/fault-retry-rewind.test.d.ts +0 -1
  523. package/dist/core/__tests__/fault-retry-rewind.test.js +0 -123
  524. package/dist/core/__tests__/frame-decoder-perf.test.d.ts +0 -1
  525. package/dist/core/__tests__/frame-decoder-perf.test.js +0 -224
  526. package/dist/core/__tests__/keystone.test.d.ts +0 -1
  527. package/dist/core/__tests__/keystone.test.js +0 -185
  528. package/dist/core/__tests__/listing-completeness.test.d.ts +0 -1
  529. package/dist/core/__tests__/listing-completeness.test.js +0 -31
  530. package/dist/core/__tests__/memory-resolver.test.d.ts +0 -1
  531. package/dist/core/__tests__/memory-resolver.test.js +0 -119
  532. package/dist/core/__tests__/memory.test.d.ts +0 -1
  533. package/dist/core/__tests__/memory.test.js +0 -60
  534. package/dist/core/__tests__/model-ladders.test.d.ts +0 -1
  535. package/dist/core/__tests__/model-ladders.test.js +0 -160
  536. package/dist/core/__tests__/node-env.test.d.ts +0 -1
  537. package/dist/core/__tests__/node-env.test.js +0 -26
  538. package/dist/core/__tests__/pane-column.test.d.ts +0 -1
  539. package/dist/core/__tests__/pane-column.test.js +0 -153
  540. package/dist/core/__tests__/persona-compose.test.d.ts +0 -1
  541. package/dist/core/__tests__/persona-compose.test.js +0 -53
  542. package/dist/core/__tests__/persona-subkind.test.d.ts +0 -1
  543. package/dist/core/__tests__/persona-subkind.test.js +0 -65
  544. package/dist/core/__tests__/persona.test.d.ts +0 -1
  545. package/dist/core/__tests__/persona.test.js +0 -107
  546. package/dist/core/__tests__/unknown-path.test.d.ts +0 -1
  547. package/dist/core/__tests__/unknown-path.test.js +0 -58
  548. package/dist/core/canvas/wakeups.d.ts +0 -76
  549. package/dist/core/canvas/wakeups.js +0 -185
  550. package/dist/core/hearth/registry.d.ts +0 -15
  551. package/dist/core/hearth/registry.js +0 -179
  552. package/dist/hearth/wake-proxy/__tests__/anthropic-oauth.test.d.ts +0 -1
  553. package/dist/hearth/wake-proxy/__tests__/anthropic-oauth.test.js +0 -289
  554. package/dist/hearth/wake-proxy/__tests__/config-timeout.test.d.ts +0 -1
  555. package/dist/hearth/wake-proxy/__tests__/config-timeout.test.js +0 -34
  556. package/dist/hearth/wake-proxy/__tests__/guest-source.test.d.ts +0 -1
  557. package/dist/hearth/wake-proxy/__tests__/guest-source.test.js +0 -203
  558. package/dist/hearth/wake-proxy/__tests__/hardening.test.d.ts +0 -1
  559. package/dist/hearth/wake-proxy/__tests__/hardening.test.js +0 -59
  560. package/dist/hearth/wake-proxy/__tests__/hearth-status-route.test.d.ts +0 -1
  561. package/dist/hearth/wake-proxy/__tests__/hearth-status-route.test.js +0 -372
  562. package/dist/hearth/wake-proxy/__tests__/http-running-route-fast-path.test.d.ts +0 -1
  563. package/dist/hearth/wake-proxy/__tests__/http-running-route-fast-path.test.js +0 -258
  564. package/dist/hearth/wake-proxy/__tests__/model-auth-routes.test.d.ts +0 -1
  565. package/dist/hearth/wake-proxy/__tests__/model-auth-routes.test.js +0 -437
  566. package/dist/hearth/wake-proxy/__tests__/source-bridge-gate.test.d.ts +0 -1
  567. package/dist/hearth/wake-proxy/__tests__/source-bridge-gate.test.js +0 -455
  568. package/dist/hearth/wake-proxy/__tests__/static-asset-allowlist.test.d.ts +0 -1
  569. package/dist/hearth/wake-proxy/__tests__/static-asset-allowlist.test.js +0 -15
  570. package/dist/hearth/wake-proxy/__tests__/warm-path-concurrency.test.d.ts +0 -1
  571. package/dist/hearth/wake-proxy/__tests__/warm-path-concurrency.test.js +0 -141
  572. package/dist/hearth/wake-proxy/__tests__/ws-teardown-accounting.test.d.ts +0 -1
  573. package/dist/hearth/wake-proxy/__tests__/ws-teardown-accounting.test.js +0 -143
  574. package/dist/hearth/wake-proxy/anthropic-oauth.d.ts +0 -58
  575. package/dist/hearth/wake-proxy/anthropic-oauth.js +0 -189
  576. package/dist/hearth/wake-proxy/auth.d.ts +0 -22
  577. package/dist/hearth/wake-proxy/auth.js +0 -128
  578. package/dist/hearth/wake-proxy/config.d.ts +0 -2
  579. package/dist/hearth/wake-proxy/config.js +0 -151
  580. package/dist/hearth/wake-proxy/guest-source.d.ts +0 -14
  581. package/dist/hearth/wake-proxy/guest-source.js +0 -130
  582. package/dist/hearth/wake-proxy/hearth-status.d.ts +0 -44
  583. package/dist/hearth/wake-proxy/hearth-status.js +0 -267
  584. package/dist/hearth/wake-proxy/home.d.ts +0 -67
  585. package/dist/hearth/wake-proxy/home.js +0 -297
  586. package/dist/hearth/wake-proxy/main.js +0 -134
  587. package/dist/hearth/wake-proxy/model-auth.d.ts +0 -13
  588. package/dist/hearth/wake-proxy/model-auth.js +0 -345
  589. package/dist/hearth/wake-proxy/proxy.d.ts +0 -35
  590. package/dist/hearth/wake-proxy/public-source-gate.d.ts +0 -9
  591. package/dist/hearth/wake-proxy/public-source-gate.js +0 -409
  592. package/dist/hearth/wake-proxy/redact.d.ts +0 -1
  593. package/dist/hearth/wake-proxy/redact.js +0 -17
  594. package/dist/hearth/wake-proxy/server.d.ts +0 -11
  595. package/dist/hearth/wake-proxy/server.js +0 -142
  596. package/dist/hearth/wake-proxy/state.d.ts +0 -18
  597. package/dist/hearth/wake-proxy/state.js +0 -342
  598. package/dist/hearth/wake-proxy/types.d.ts +0 -76
  599. package/dist/web-client/assets/index-BZUxTkv5.css +0 -2
  600. package/dist/web-client/assets/index-D36PNBj4.js +0 -80
  601. /package/dist/clients/attach/__tests__/{action-parity.test.d.ts → crtr-output-coverage.test.d.ts} +0 -0
  602. /package/dist/clients/attach/__tests__/{autocomplete-and-bash-mode.test.d.ts → crtr-output-render.test.d.ts} +0 -0
  603. /package/dist/{clients/attach/__tests__/bash-bang-routing.test.d.ts → core/__tests__/boot.test.d.ts} +0 -0
  604. /package/dist/{clients/attach/__tests__/bundle-pi-tui-dedup.test.d.ts → core/__tests__/hearth-bootstrap.test.d.ts} +0 -0
  605. /package/dist/{clients/attach/__tests__/clipboard-image.test.d.ts → core/__tests__/preview-registry-sync.test.d.ts} +0 -0
  606. /package/dist/{clients/attach/__tests__/editor-newline.test.d.ts → core/__tests__/prune-to-limit.test.d.ts} +0 -0
  607. /package/dist/{clients/attach/__tests__/git-info.test.d.ts → core/__tests__/trigger-migration.test.d.ts} +0 -0
  608. /package/dist/{clients/attach/__tests__/onrequest-wired.test.d.ts → core/hearth/__tests__/model-auth-guest.test.d.ts} +0 -0
  609. /package/dist/{clients/attach/__tests__/reconnect-giveup.test.d.ts → daemon/__tests__/predicate-eval.test.d.ts} +0 -0
  610. /package/dist/{clients/attach/__tests__/slash-quit-copy.test.d.ts → hearth/control-plane/__tests__/node-message.test.d.ts} +0 -0
  611. /package/dist/{clients/attach/__tests__/titled-editor.test.d.ts → hearth/control-plane/__tests__/rate-limit-recurrence.test.d.ts} +0 -0
  612. /package/dist/{commands/memory/__tests__/lint-schema.test.d.ts → hearth/control-plane/__tests__/relay-security.test.d.ts} +0 -0
  613. /package/dist/{core/__tests__/argv-parser.test.d.ts → hearth/control-plane/__tests__/scheduler-scan-loop.test.d.ts} +0 -0
  614. /package/dist/{core/__tests__/artifact-paths.test.d.ts → hearth/control-plane/__tests__/trigger-delivery.test.d.ts} +0 -0
  615. /package/dist/{core/__tests__/draw-style.test.d.ts → hearth/control-plane/__tests__/webhook-ingress.test.d.ts} +0 -0
  616. /package/dist/hearth/{wake-proxy → control-plane}/main.d.ts +0 -0
  617. /package/dist/hearth/{wake-proxy → 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,427 @@
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, ALWAYS open the finished spec for the human with
117
+ \`crtr human review <absolute-path-to-the-spec.md>\` — this is required, not
118
+ optional. Do NOT just tell the user the spec is done or point them at the file
119
+ path: the user cannot easily open the spec file themselves, so \`crtr human
120
+ review\` is the way to put it in front of them for line-by-line comments. Run
121
+ it the moment the spec is complete (after the reviewer node's Issues are
122
+ resolved), then incorporate the returned comments. Do not move on until the
123
+ user has reviewed it. Once they approve it, run \`${MODE_CLI} normal\` to lift
124
+ the restrictions and begin implementing — the command prints your normal-mode
125
+ operating instructions.`,
126
+ },
127
+ plan: {
128
+ label: "plan",
129
+ context: `[PLAN MODE]
130
+ You are in plan mode. Your job is to produce an actionable implementation plan —
131
+ no changes yet.
132
+
133
+ How to operate:
134
+ - Do NOT edit production code. Read-only exploration only (writing the plan file
135
+ itself is allowed).
136
+ - Resolve open questions as you go. Whenever something is ambiguous or a decision
137
+ needs a call, put it to the user with the \`crtr human ask\` command rather than
138
+ asking inline, then fold the answer into the plan. Do this before drafting for
139
+ the unknowns you can see up front, and again whenever a new question surfaces
140
+ while you write. The finished plan records decisions, not open questions.
141
+ - Investigate the relevant code to understand how the change fits in.
142
+ - Then write the plan to a markdown file under the project's crtr plans
143
+ directory: \`~/.crouter/workspaces/<cwd-with-each-slash-replaced-by-a-dash>/plans/<slug>.md\`
144
+ (e.g. cwd \`/Users/me/Code/app\` → \`~/.crouter/workspaces/-Users-me-Code-app/plans/\`).
145
+ Create the directory if it does not exist. The plan is a numbered, ordered list
146
+ of concrete steps: which files to touch, which functions to add or modify,
147
+ which tests to write, plus risks and dependencies.
148
+ - Then validate the plan with a reviewer node first: spawn one with
149
+ \`crtr node new "Review the plan at <absolute-path>" --kind review\` — you
150
+ auto-subscribe to it and are woken when it finishes. Read its verdict with
151
+ \`crtr feed read\` and dereference the report path it points to. It flags
152
+ completeness gaps, spec misalignment, unresolved decisions, buildability
153
+ problems, quality smells
154
+ (timelines, "for now" shortcuts, magic values, fallbacks, missing type
155
+ contracts), and overlapping file ownership across parallel tasks. Resolve every
156
+ Issue before moving on; Recommendations are advisory.
157
+ - Finally, present the finished plan for review with
158
+ \`crtr human review <absolute-path-to-the-plan.md>\` and incorporate the
159
+ returned comments. Wait for approval before moving on. Once the user approves,
160
+ run \`${MODE_CLI} normal\` to begin implementation — the command prints your
161
+ normal-mode operating instructions.`,
162
+ },
163
+ };
164
+
165
+ export default function modeSwitchExtension(pi: ExtensionAPI): void {
166
+ let currentMode: Mode = "normal";
167
+ // The mode whose guidance was last injected. Injection only fires when the
168
+ // active mode differs from this.
169
+ let lastInjectedMode: Mode | null = "normal";
170
+ // TUI handle, captured by the editor factory, so mode changes can repaint the
171
+ // input badge.
172
+ let activeTui: TUI | undefined;
173
+ // Watches <root>/mode-switch/request.json for agent-initiated CLI switches.
174
+ let modeWatcher: FSWatcher | undefined;
175
+ // UI toast, available only when the session has a UI.
176
+ let uiNotify: ((message: string, type?: "info" | "warning" | "error") => void) | undefined;
177
+ // Token of the most recent CLI request this instance has applied. Lets us
178
+ // reconcile to the request file WITHOUT deleting it: deleting was racy because
179
+ // /reload can leave extra extension instances behind, and a stale one could
180
+ // consume the request before the on-screen instance ever observed it.
181
+ let lastAppliedToken: string | undefined;
182
+
183
+ /** Append the mode badge to the bottom-right of the input box border. */
184
+ function decorateInput(
185
+ lines: string[],
186
+ width: number,
187
+ theme: { fg(color: string, text: string): string; bg(color: string, text: string): string },
188
+ ): string[] {
189
+ if (lines.length === 0) return lines;
190
+ const def = MODES[currentMode];
191
+ const badge = theme.bg("selectedBg", theme.fg("text", ` ${def.label} `));
192
+ const badgeWidth = visibleWidth(badge);
193
+ if (badgeWidth + 2 >= width) return lines;
194
+ // Replace the rightmost cells of the bottom border line with the badge.
195
+ const last = lines.length - 1;
196
+ lines[last] = truncateToWidth(lines[last]!, width - badgeWidth, "") + badge;
197
+ return lines;
198
+ }
199
+
200
+ function repaint(): void {
201
+ activeTui?.requestRender();
202
+ }
203
+
204
+ function persist(): void {
205
+ pi.appendEntry("mode-switch", { mode: currentMode });
206
+ }
207
+
208
+ function persistCurrent(): void {
209
+ try {
210
+ writeFileSync(join(modeSwitchDir(), "current"), `${currentMode}\n`);
211
+ } catch {
212
+ // Best-effort: the viewer treats the file as a hint, not authority.
213
+ }
214
+ }
215
+
216
+ // Apply a mode change to state and persistence. Shared by every path: the
217
+ // Alt+M / command path (which adds a UI toast and injects guidance on the
218
+ // next turn) and the CLI path (which already handed the agent its guidance via
219
+ // stdout).
220
+ function applyMode(next: Mode): void {
221
+ currentMode = next;
222
+ repaint();
223
+ persist();
224
+ persistCurrent();
225
+ }
226
+
227
+ function setMode(next: Mode, ctx: ExtensionContext): void {
228
+ if (next === currentMode) {
229
+ ctx.ui.notify(`Already in ${next} mode.`, "info");
230
+ return;
231
+ }
232
+ applyMode(next);
233
+ ctx.ui.notify(
234
+ currentMode === "normal"
235
+ ? "Normal mode — full access restored."
236
+ : `${currentMode[0].toUpperCase()}${currentMode.slice(1)} mode — guidance will be applied on your next message.`,
237
+ );
238
+ }
239
+
240
+ // The agent switches its own mode by running the bundled CLI, which writes the
241
+ // requested mode to <root>/mode-switch/request.json. We pick that up live via
242
+ // fs.watch (with a before_agent_start reconcile as a backstop) only to sync the
243
+ // badge and persisted state — never to inject guidance, since the CLI already
244
+ // printed it to the agent's bash output. The request is consumed on read so a
245
+ // later Alt+M can't be clobbered by a stale request.
246
+ function applyFromRequest(next: Mode, source: "cli" | "attach"): void {
247
+ if (next === currentMode) return;
248
+ applyMode(next);
249
+ if (source === "cli") lastInjectedMode = next;
250
+ uiNotify?.(source === "cli" ? `Mode → ${next} (agent)` : `Mode → ${next} (viewer)`, "info");
251
+ }
252
+
253
+ function reconcileFromCli(): void {
254
+ let raw: string;
255
+ try {
256
+ raw = readFileSync(join(modeSwitchDir(), "request.json"), "utf8");
257
+ } catch {
258
+ return; // no pending request
259
+ }
260
+ let parsed: { mode?: string; token?: string; source?: "cli" | "attach" };
261
+ try {
262
+ parsed = JSON.parse(raw) as { mode?: string; token?: string; source?: "cli" | "attach" };
263
+ } catch {
264
+ return; // half-written; a later watch event or turn catches the final write
265
+ }
266
+ // Apply each CLI request at most once (token-gated) and never delete it, so
267
+ // every live instance — including the one actually on screen — converges to the
268
+ // requested mode regardless of /reload leftovers. A lingering request whose
269
+ // token we already applied can't clobber a later Alt+M.
270
+ if (parsed.token && parsed.token === lastAppliedToken) return;
271
+ lastAppliedToken = parsed.token;
272
+ if (parsed.mode && (CYCLE as string[]).includes(parsed.mode)) {
273
+ applyFromRequest(parsed.mode as Mode, parsed.source ?? "cli");
274
+ }
275
+ }
276
+
277
+ function startModeWatcher(dir: string): void {
278
+ modeWatcher?.close();
279
+ try {
280
+ modeWatcher = watch(dir, (_event, filename) => {
281
+ if (filename && filename !== "request.json") return;
282
+ reconcileFromCli();
283
+ });
284
+ } catch {
285
+ // fs.watch unsupported here — the before_agent_start reconcile still covers it.
286
+ }
287
+ }
288
+
289
+ function cycleMode(ctx: ExtensionContext): void {
290
+ const idx = CYCLE.indexOf(currentMode);
291
+ setMode(CYCLE[(idx + 1) % CYCLE.length], ctx);
292
+ }
293
+
294
+ // Alt+M cycles modes.
295
+ pi.registerShortcut("alt+m", {
296
+ description: "Cycle mode (normal → spec → plan)",
297
+ handler: async (ctx) => cycleMode(ctx),
298
+ });
299
+
300
+ // /mode cycles; /mode <name> jumps to a specific mode.
301
+ pi.registerCommand("mode", {
302
+ description: "Cycle operating mode, or /mode <normal|spec|plan> to set one",
303
+ getArgumentCompletions: (prefix: string) => {
304
+ const items = CYCLE.map((m) => ({ value: m, label: m }));
305
+ const filtered = items.filter((i) => i.value.startsWith(prefix));
306
+ return filtered.length > 0 ? filtered : null;
307
+ },
308
+ handler: async (args, ctx) => {
309
+ const arg = args.trim().toLowerCase();
310
+ if (!arg) {
311
+ cycleMode(ctx);
312
+ return;
313
+ }
314
+ if ((CYCLE as string[]).includes(arg)) {
315
+ setMode(arg as Mode, ctx);
316
+ } else {
317
+ ctx.ui.notify(`Unknown mode "${arg}". Use: ${CYCLE.join(", ")}.`, "error");
318
+ }
319
+ },
320
+ });
321
+
322
+ // The core behaviour: inject the active mode's guidance before the turn, but
323
+ // only when the mode has changed since the last injection. We first reconcile
324
+ // any agent-initiated CLI switch the fs.watch may have missed.
325
+ pi.on("before_agent_start", async () => {
326
+ reconcileFromCli();
327
+ if (currentMode === lastInjectedMode) return;
328
+ lastInjectedMode = currentMode;
329
+ return {
330
+ message: {
331
+ customType: "mode-switch-context",
332
+ content: MODES[currentMode].context,
333
+ display: false,
334
+ },
335
+ };
336
+ });
337
+
338
+ // Keep only the most recent mode-guidance message and drop the older ones, so
339
+ // the LLM always sees the current mode's instructions (including the
340
+ // "restrictions lifted" note when returning to normal) and never stale
341
+ // guidance from a previous mode.
342
+ pi.on("context", async (event) => {
343
+ const messages = event.messages;
344
+ let lastIdx = -1;
345
+ for (let i = messages.length - 1; i >= 0; i--) {
346
+ if ((messages[i] as { customType?: string }).customType === "mode-switch-context") {
347
+ lastIdx = i;
348
+ break;
349
+ }
350
+ }
351
+ if (lastIdx === -1) return;
352
+ return {
353
+ messages: messages.filter((m, i) => {
354
+ return (m as { customType?: string }).customType !== "mode-switch-context" || i === lastIdx;
355
+ }),
356
+ };
357
+ });
358
+
359
+ // Restore persisted mode on session start / resume, and install the input
360
+ // badge.
361
+ pi.on("session_start", async (_event, ctx) => {
362
+ // Guarantee the per-cwd specs/ and plans/ dirs exist so spec/plan modes
363
+ // have somewhere to write the moment they're entered.
364
+ ensureArtifactDirs();
365
+
366
+ const entries = ctx.sessionManager.getEntries();
367
+ const last = entries
368
+ .filter((e: { type: string; customType?: string }) => e.type === "custom" && e.customType === "mode-switch")
369
+ .pop() as { data?: { mode?: Mode } } | undefined;
370
+
371
+ if (last?.data?.mode && (CYCLE as string[]).includes(last.data.mode)) {
372
+ currentMode = last.data.mode;
373
+ }
374
+
375
+ // Re-establish non-normal mode guidance on the next turn after a resume;
376
+ // normal mode needs no re-injection.
377
+ lastInjectedMode = currentMode === "normal" ? "normal" : null;
378
+
379
+ // Mirror each mode's guidance to disk so the CLI can hand the right one to the
380
+ // agent on stdout, clear any stale request from a previous session, write the
381
+ // current mode hint for the viewer, and start watching for mode requests.
382
+ const dir = modeSwitchDir();
383
+ try {
384
+ for (const mode of CYCLE) {
385
+ writeFileSync(join(dir, "guidance", `${mode}.txt`), MODES[mode].context);
386
+ }
387
+ writeFileSync(join(dir, "current"), `${currentMode}\n`);
388
+ rmSync(join(dir, "request.json"), { force: true });
389
+ } catch {
390
+ // Best-effort: the before_agent_start reconcile still covers switches.
391
+ }
392
+ lastAppliedToken = undefined;
393
+ startModeWatcher(dir);
394
+
395
+ if (!ctx.hasUI) return;
396
+ uiNotify = (message, type) => ctx.ui.notify(message, type);
397
+
398
+ // Wrap whatever editor is already installed (e.g. a session-name badge on
399
+ // the top border) so both decorations coexist. A transparent Proxy forwards
400
+ // every method/property to the base editor and overrides only render() to
401
+ // append the mode badge on the bottom-right border line.
402
+ const previousFactory = ctx.ui.getEditorComponent();
403
+ const uiTheme = ctx.ui.theme;
404
+ ctx.ui.setEditorComponent((tui, theme, keybindings) => {
405
+ activeTui = tui;
406
+ const base = previousFactory
407
+ ? previousFactory(tui, theme, keybindings)
408
+ : new CustomEditor(tui, theme, keybindings);
409
+ return new Proxy(base, {
410
+ get(target, prop, receiver) {
411
+ if (prop === "render") {
412
+ return (width: number): string[] => decorateInput(target.render(width), width, uiTheme);
413
+ }
414
+ const value = Reflect.get(target, prop, target);
415
+ return typeof value === "function" ? value.bind(target) : value;
416
+ },
417
+ });
418
+ });
419
+ repaint();
420
+ });
421
+
422
+ // Stop watching the request file when the session ends.
423
+ pi.on("session_shutdown", async () => {
424
+ modeWatcher?.close();
425
+ modeWatcher = undefined;
426
+ });
427
+ }
@@ -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
+ });