@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.
Files changed (566) 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 +422 -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 +826 -754
  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 +1 -1
  345. package/dist/core/__tests__/full/broker-attach-limits.test.js +1 -1
  346. package/dist/core/__tests__/full/broker-attach-stream.test.js +1 -1
  347. package/dist/core/__tests__/full/broker-crash-teardown.test.js +10 -5
  348. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +1 -1
  349. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +1 -1
  350. package/dist/core/__tests__/full/broker-pane-resolution.test.js +1 -1
  351. package/dist/core/__tests__/full/cascade-close.test.js +31 -18
  352. package/dist/core/__tests__/full/detach-focus.test.js +2 -2
  353. package/dist/core/__tests__/hearth-bootstrap.test.js +136 -0
  354. package/dist/core/__tests__/helpers/harness.js +1 -1
  355. package/dist/core/__tests__/live-mutation-verbs.test.js +10 -10
  356. package/dist/core/__tests__/live-mutation.test.js +8 -8
  357. package/dist/core/__tests__/migration.test.js +124 -0
  358. package/dist/core/__tests__/on-read-dedup-resume.test.js +40 -0
  359. package/dist/core/__tests__/preview-registry-sync.test.js +36 -0
  360. package/dist/core/__tests__/prune-to-limit.test.js +91 -0
  361. package/dist/core/__tests__/revive.test.js +64 -21
  362. package/dist/core/__tests__/trigger-migration.test.js +48 -0
  363. package/dist/core/__tests__/wake-bearings.test.js +23 -21
  364. package/dist/core/__tests__/wake-origin.test.js +36 -33
  365. package/dist/core/canvas/boot.d.ts +48 -0
  366. package/dist/core/canvas/boot.js +157 -0
  367. package/dist/core/canvas/canvas.d.ts +27 -1
  368. package/dist/core/canvas/canvas.js +86 -5
  369. package/dist/core/canvas/db.js +86 -1
  370. package/dist/core/canvas/index.d.ts +1 -1
  371. package/dist/core/canvas/index.js +1 -1
  372. package/dist/core/canvas/nav-model.js +1 -1
  373. package/dist/core/canvas/pid.d.ts +6 -0
  374. package/dist/core/canvas/pid.js +13 -0
  375. package/dist/core/canvas/triggers.d.ts +108 -0
  376. package/dist/core/canvas/triggers.js +320 -0
  377. package/dist/core/canvas/types.d.ts +128 -46
  378. package/dist/core/command.js +13 -4
  379. package/dist/core/hearth/__tests__/model-auth-guest.test.js +151 -0
  380. package/dist/core/hearth/config.d.ts +1 -0
  381. package/dist/core/hearth/config.js +36 -0
  382. package/dist/core/hearth/guest-env.d.ts +7 -0
  383. package/dist/core/hearth/guest-env.js +17 -1
  384. package/dist/core/hearth/model-auth-guest.d.ts +8 -0
  385. package/dist/core/hearth/model-auth-guest.js +435 -0
  386. package/dist/core/hearth/provider.d.ts +13 -6
  387. package/dist/core/hearth/providers/blaxel-bootstrap.d.ts +2 -0
  388. package/dist/core/hearth/providers/blaxel-bootstrap.js +127 -19
  389. package/dist/core/hearth/providers/blaxel-home.d.ts +8 -4
  390. package/dist/core/hearth/providers/blaxel-home.js +85 -75
  391. package/dist/core/hearth/providers/blaxel.d.ts +5 -0
  392. package/dist/core/hearth/providers/blaxel.js +86 -12
  393. package/dist/core/hearth/providers/types.d.ts +6 -1
  394. package/dist/core/hearth/registry.js +2 -1
  395. package/dist/core/hearth/types.d.ts +35 -0
  396. package/dist/core/help.d.ts +16 -0
  397. package/dist/core/help.js +2 -0
  398. package/dist/core/memory-resolver.d.ts +8 -8
  399. package/dist/core/memory-resolver.js +58 -26
  400. package/dist/core/preview-registry.d.ts +25 -0
  401. package/dist/core/preview-registry.js +2047 -0
  402. package/dist/core/resolver.d.ts +1 -0
  403. package/dist/core/resolver.js +23 -16
  404. package/dist/core/runtime/bearings.d.ts +11 -10
  405. package/dist/core/runtime/bearings.js +8 -8
  406. package/dist/core/runtime/broker-protocol.d.ts +2 -2
  407. package/dist/core/runtime/broker-protocol.js +2 -2
  408. package/dist/core/runtime/close.js +2 -2
  409. package/dist/core/runtime/kickoff.js +1 -1
  410. package/dist/core/runtime/launch.d.ts +9 -3
  411. package/dist/core/runtime/launch.js +17 -9
  412. package/dist/core/runtime/lifecycle.js +7 -7
  413. package/dist/core/runtime/model-swap.js +1 -1
  414. package/dist/core/runtime/placement.d.ts +5 -5
  415. package/dist/core/runtime/placement.js +10 -10
  416. package/dist/core/runtime/recycle.js +7 -7
  417. package/dist/core/runtime/reset.d.ts +1 -1
  418. package/dist/core/runtime/reset.js +3 -3
  419. package/dist/core/runtime/revive-all.d.ts +5 -2
  420. package/dist/core/runtime/revive-all.js +5 -2
  421. package/dist/core/runtime/revive.d.ts +15 -8
  422. package/dist/core/runtime/revive.js +52 -16
  423. package/dist/core/runtime/spawn.d.ts +1 -1
  424. package/dist/core/runtime/spawn.js +7 -7
  425. package/dist/core/runtime/stop-guard.js +5 -5
  426. package/dist/core/runtime/surface-bg.js +1 -1
  427. package/dist/core/runtime/tmux.d.ts +1 -1
  428. package/dist/core/runtime/tmux.js +4 -4
  429. package/dist/core/scope.d.ts +9 -0
  430. package/dist/core/scope.js +37 -15
  431. package/dist/core/substrate/on-read.js +23 -21
  432. package/dist/core/substrate/render.js +3 -3
  433. package/dist/core/view/loader.js +2 -2
  434. package/dist/core/wake.d.ts +2 -2
  435. package/dist/core/wake.js +7 -7
  436. package/dist/daemon/__tests__/predicate-eval.test.js +109 -0
  437. package/dist/daemon/crtrd.js +222 -103
  438. package/dist/daemon/predicate-eval.d.ts +52 -0
  439. package/dist/daemon/predicate-eval.js +248 -0
  440. package/dist/hearth/control-plane/__tests__/node-message.test.js +60 -0
  441. package/dist/hearth/control-plane/__tests__/rate-limit-recurrence.test.js +49 -0
  442. package/dist/hearth/control-plane/__tests__/relay-security.test.js +314 -0
  443. package/dist/hearth/control-plane/__tests__/scheduler-scan-loop.test.js +133 -0
  444. package/dist/hearth/control-plane/__tests__/trigger-delivery.test.js +170 -0
  445. package/dist/hearth/control-plane/__tests__/webhook-ingress.test.js +167 -0
  446. package/dist/hearth/control-plane/config.d.ts +21 -0
  447. package/dist/hearth/control-plane/config.js +77 -0
  448. package/dist/hearth/control-plane/db.d.ts +30 -0
  449. package/dist/hearth/control-plane/db.js +534 -0
  450. package/dist/hearth/control-plane/ingress/rate-limit.d.ts +24 -0
  451. package/dist/hearth/control-plane/ingress/rate-limit.js +100 -0
  452. package/dist/hearth/control-plane/ingress/route-store.d.ts +31 -0
  453. package/dist/hearth/control-plane/ingress/route-store.js +61 -0
  454. package/dist/hearth/control-plane/ingress/webhook-delivery-store.d.ts +41 -0
  455. package/dist/hearth/control-plane/ingress/webhook-delivery-store.js +69 -0
  456. package/dist/hearth/control-plane/ingress/webhook-route.d.ts +55 -0
  457. package/dist/hearth/control-plane/ingress/webhook-route.js +285 -0
  458. package/dist/hearth/control-plane/main.js +88 -0
  459. package/dist/hearth/control-plane/node-message.d.ts +31 -0
  460. package/dist/hearth/control-plane/node-message.js +98 -0
  461. package/dist/hearth/control-plane/register.d.ts +15 -0
  462. package/dist/hearth/control-plane/register.js +34 -0
  463. package/dist/hearth/control-plane/registry.d.ts +17 -0
  464. package/dist/hearth/control-plane/registry.js +161 -0
  465. package/dist/hearth/control-plane/relay.d.ts +40 -0
  466. package/dist/hearth/control-plane/relay.js +642 -0
  467. package/dist/hearth/control-plane/scheduler/fire-store.d.ts +36 -0
  468. package/dist/hearth/control-plane/scheduler/fire-store.js +73 -0
  469. package/dist/hearth/control-plane/scheduler/recurrence.d.ts +7 -0
  470. package/dist/hearth/control-plane/scheduler/recurrence.js +58 -0
  471. package/dist/hearth/control-plane/scheduler/scan-loop.d.ts +38 -0
  472. package/dist/hearth/control-plane/scheduler/scan-loop.js +138 -0
  473. package/dist/hearth/control-plane/scheduler/schedule-store.d.ts +32 -0
  474. package/dist/hearth/control-plane/scheduler/schedule-store.js +66 -0
  475. package/dist/hearth/control-plane/secrets.d.ts +17 -0
  476. package/dist/hearth/control-plane/secrets.js +113 -0
  477. package/dist/hearth/control-plane/server.d.ts +27 -0
  478. package/dist/hearth/control-plane/server.js +346 -0
  479. package/dist/hearth/control-plane/session.d.ts +68 -0
  480. package/dist/hearth/control-plane/session.js +273 -0
  481. package/dist/hearth/control-plane/triggers/acl.d.ts +14 -0
  482. package/dist/hearth/control-plane/triggers/acl.js +52 -0
  483. package/dist/hearth/control-plane/triggers/audit-store.d.ts +38 -0
  484. package/dist/hearth/control-plane/triggers/audit-store.js +79 -0
  485. package/dist/hearth/control-plane/triggers/deliver.d.ts +43 -0
  486. package/dist/hearth/control-plane/triggers/deliver.js +76 -0
  487. package/dist/hearth/control-plane/triggers/envelope.d.ts +29 -0
  488. package/dist/hearth/control-plane/triggers/envelope.js +38 -0
  489. package/dist/hearth/control-plane/types.d.ts +66 -0
  490. package/dist/hearth/control-plane/wake.d.ts +80 -0
  491. package/dist/hearth/control-plane/wake.js +312 -0
  492. package/dist/hearth/wake-proxy/__tests__/guest-source.test.js +2 -2
  493. package/dist/hearth/wake-proxy/home.d.ts +2 -8
  494. package/dist/hearth/wake-proxy/home.js +48 -12
  495. package/dist/pi-extensions/canvas-doc-substrate.js +28 -2
  496. package/dist/pi-extensions/canvas-nav.js +1 -1
  497. package/dist/prompts/view.js +7 -8
  498. package/dist/types.js +4 -4
  499. package/dist/web-client/assets/{index-D36PNBj4.js → index-BRKxe-hy.js} +2 -2
  500. package/dist/web-client/index.html +1 -1
  501. package/package.json +12 -8
  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.js +0 -26
  519. package/dist/core/__tests__/fault-marker.test.js +0 -112
  520. package/dist/core/__tests__/fault-retry-rewind.test.d.ts +0 -1
  521. package/dist/core/__tests__/fault-retry-rewind.test.js +0 -123
  522. package/dist/core/__tests__/frame-decoder-perf.test.d.ts +0 -1
  523. package/dist/core/__tests__/frame-decoder-perf.test.js +0 -224
  524. package/dist/core/__tests__/keystone.test.d.ts +0 -1
  525. package/dist/core/__tests__/keystone.test.js +0 -185
  526. package/dist/core/__tests__/listing-completeness.test.d.ts +0 -1
  527. package/dist/core/__tests__/listing-completeness.test.js +0 -31
  528. package/dist/core/__tests__/memory-resolver.test.d.ts +0 -1
  529. package/dist/core/__tests__/memory-resolver.test.js +0 -119
  530. package/dist/core/__tests__/memory.test.d.ts +0 -1
  531. package/dist/core/__tests__/memory.test.js +0 -60
  532. package/dist/core/__tests__/model-ladders.test.d.ts +0 -1
  533. package/dist/core/__tests__/model-ladders.test.js +0 -160
  534. package/dist/core/__tests__/node-env.test.d.ts +0 -1
  535. package/dist/core/__tests__/node-env.test.js +0 -26
  536. package/dist/core/__tests__/pane-column.test.d.ts +0 -1
  537. package/dist/core/__tests__/pane-column.test.js +0 -153
  538. package/dist/core/__tests__/persona-compose.test.d.ts +0 -1
  539. package/dist/core/__tests__/persona-compose.test.js +0 -53
  540. package/dist/core/__tests__/persona-subkind.test.d.ts +0 -1
  541. package/dist/core/__tests__/persona-subkind.test.js +0 -65
  542. package/dist/core/__tests__/persona.test.d.ts +0 -1
  543. package/dist/core/__tests__/persona.test.js +0 -107
  544. package/dist/core/__tests__/unknown-path.test.d.ts +0 -1
  545. package/dist/core/__tests__/unknown-path.test.js +0 -58
  546. package/dist/core/canvas/wakeups.d.ts +0 -76
  547. package/dist/core/canvas/wakeups.js +0 -185
  548. package/dist/hearth/wake-proxy/__tests__/source-bridge-gate.test.d.ts +0 -1
  549. package/dist/hearth/wake-proxy/__tests__/source-bridge-gate.test.js +0 -455
  550. /package/dist/clients/attach/__tests__/{action-parity.test.d.ts → crtr-output-coverage.test.d.ts} +0 -0
  551. /package/dist/clients/attach/__tests__/{autocomplete-and-bash-mode.test.d.ts → crtr-output-render.test.d.ts} +0 -0
  552. /package/dist/{clients/attach/__tests__/bash-bang-routing.test.d.ts → core/__tests__/boot.test.d.ts} +0 -0
  553. /package/dist/{clients/attach/__tests__/bundle-pi-tui-dedup.test.d.ts → core/__tests__/hearth-bootstrap.test.d.ts} +0 -0
  554. /package/dist/{clients/attach/__tests__/clipboard-image.test.d.ts → core/__tests__/preview-registry-sync.test.d.ts} +0 -0
  555. /package/dist/{clients/attach/__tests__/editor-newline.test.d.ts → core/__tests__/prune-to-limit.test.d.ts} +0 -0
  556. /package/dist/{clients/attach/__tests__/git-info.test.d.ts → core/__tests__/trigger-migration.test.d.ts} +0 -0
  557. /package/dist/{clients/attach/__tests__/onrequest-wired.test.d.ts → core/hearth/__tests__/model-auth-guest.test.d.ts} +0 -0
  558. /package/dist/{clients/attach/__tests__/reconnect-giveup.test.d.ts → daemon/__tests__/predicate-eval.test.d.ts} +0 -0
  559. /package/dist/{clients/attach/__tests__/slash-quit-copy.test.d.ts → hearth/control-plane/__tests__/node-message.test.d.ts} +0 -0
  560. /package/dist/{clients/attach/__tests__/titled-editor.test.d.ts → hearth/control-plane/__tests__/rate-limit-recurrence.test.d.ts} +0 -0
  561. /package/dist/{commands/memory/__tests__/lint-schema.test.d.ts → hearth/control-plane/__tests__/relay-security.test.d.ts} +0 -0
  562. /package/dist/{core/__tests__/argv-parser.test.d.ts → hearth/control-plane/__tests__/scheduler-scan-loop.test.d.ts} +0 -0
  563. /package/dist/{core/__tests__/artifact-paths.test.d.ts → hearth/control-plane/__tests__/trigger-delivery.test.d.ts} +0 -0
  564. /package/dist/{core/__tests__/draw-style.test.d.ts → hearth/control-plane/__tests__/webhook-ingress.test.d.ts} +0 -0
  565. /package/dist/{core/__tests__/editor-label.test.d.ts → hearth/control-plane/main.d.ts} +0 -0
  566. /package/dist/{core/__tests__/fault-marker.test.d.ts → hearth/control-plane/types.js} +0 -0
@@ -0,0 +1,174 @@
1
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+ import { execFile } from "node:child_process";
3
+ import { promisify } from "node:util";
4
+ import { readFileSync, writeFileSync, existsSync } from "node:fs";
5
+ import { fileURLToPath } from "node:url";
6
+ import { dirname, join } from "node:path";
7
+
8
+ const exec = promisify(execFile);
9
+
10
+ // ---------------------------------------------------------------------------
11
+ // crtr-commands: auto-generates a slash command for every node in the crtr
12
+ // CLI tree. `/node:new` runs `crtr node new -h`; `/node:list`
13
+ // runs `crtr node list -h`, and so on.
14
+ //
15
+ // Discovery is help-only (parses `-h` output), so walking the tree never
16
+ // executes a real crtr command. The tree is cached to tree-cache.json next
17
+ // to this file; rebuild it with `/crtr-refresh`.
18
+ // ---------------------------------------------------------------------------
19
+
20
+ const HERE = dirname(fileURLToPath(import.meta.url));
21
+ const CACHE_PATH = join(HERE, "tree-cache.json");
22
+ const FILTERS_PATH = join(HERE, "filters.json");
23
+ const CRTR = "crtr";
24
+ const MAX_DEPTH = 6;
25
+
26
+ // When true, injecting the output triggers an immediate agent response.
27
+ // When false (default), the output is loaded into context and the agent
28
+ // responds on your next message — closer to a prompt-template that primes
29
+ // context without forcing a turn.
30
+ const TRIGGER_TURN = false;
31
+
32
+ type Cache = { version: number; builtAt: number; nodes: string[][] };
33
+ type Filters = { include?: string[]; exclude?: string[] };
34
+
35
+ function loadFilters(): Filters {
36
+ if (!existsSync(FILTERS_PATH)) return {};
37
+ try {
38
+ const f = JSON.parse(readFileSync(FILTERS_PATH, "utf8")) as Filters;
39
+ return { include: f.include ?? [], exclude: f.exclude ?? [] };
40
+ } catch {
41
+ return {};
42
+ }
43
+ }
44
+
45
+ // An entry matches a node when it equals the node's colon-path OR is an
46
+ // ancestor prefix of it (entry "node" matches "node", "node:new", ...).
47
+ function matchesAny(name: string, entries: string[]): boolean {
48
+ return entries.some((e) => name === e || name.startsWith(e + ":"));
49
+ }
50
+
51
+ function isAllowed(name: string, filters: Filters): boolean {
52
+ const include = filters.include ?? [];
53
+ const exclude = filters.exclude ?? [];
54
+ if (include.length > 0 && !matchesAny(name, include)) return false;
55
+ if (exclude.length > 0 && matchesAny(name, exclude)) return false;
56
+ return true;
57
+ }
58
+
59
+ async function runCrtr(args: string[]): Promise<string> {
60
+ try {
61
+ const { stdout } = await exec(CRTR, args, { maxBuffer: 8 * 1024 * 1024 });
62
+ return stdout;
63
+ } catch (err: any) {
64
+ // crtr exits non-zero on errors but still prints to stdout.
65
+ return (err?.stdout as string) ?? `crtr ${args.join(" ")} failed: ${err?.message ?? err}`;
66
+ }
67
+ }
68
+
69
+ // Parse child command names from a node's `-h` output (help-only, no execution).
70
+ function parseChildren(path: string[], helpText: string): string[] {
71
+ if (path.length === 0) {
72
+ // Root uses <command name="X"> tags.
73
+ return [...helpText.matchAll(/<command name="([^"]+)">/g)].map((m) => m[1]);
74
+ }
75
+ // Sub-nodes use a "Branches" block of indented rows.
76
+ const kids: string[] = [];
77
+ let inBranches = false;
78
+ for (const line of helpText.split("\n")) {
79
+ if (line.trim() === "Branches") {
80
+ inBranches = true;
81
+ continue;
82
+ }
83
+ if (inBranches) {
84
+ if (line.trim() === "") break;
85
+ if (!/^\s/.test(line)) break;
86
+ kids.push(line.trim().split(/\s+/)[0]);
87
+ }
88
+ }
89
+ return kids;
90
+ }
91
+
92
+ async function walkTree(): Promise<string[][]> {
93
+ const nodes: string[][] = [];
94
+ async function walk(path: string[], depth: number): Promise<void> {
95
+ if (path.length > 0) nodes.push(path);
96
+ if (depth > MAX_DEPTH) return;
97
+ const help = await runCrtr([...path, "-h"]);
98
+ for (const child of parseChildren(path, help)) {
99
+ if (child.startsWith("_")) continue; // skip internal commands
100
+ await walk([...path, child], depth + 1);
101
+ }
102
+ }
103
+ await walk([], 0);
104
+ return nodes;
105
+ }
106
+
107
+ function loadCache(): Cache | null {
108
+ if (!existsSync(CACHE_PATH)) return null;
109
+ try {
110
+ return JSON.parse(readFileSync(CACHE_PATH, "utf8")) as Cache;
111
+ } catch {
112
+ return null;
113
+ }
114
+ }
115
+
116
+ function saveCache(nodes: string[][]): void {
117
+ const cache: Cache = { version: 1, builtAt: Date.now(), nodes };
118
+ writeFileSync(CACHE_PATH, JSON.stringify(cache, null, 2));
119
+ }
120
+
121
+ export default async function (pi: ExtensionAPI) {
122
+ let cache = loadCache();
123
+ if (!cache || !Array.isArray(cache.nodes) || cache.nodes.length === 0) {
124
+ const nodes = await walkTree();
125
+ saveCache(nodes);
126
+ cache = { version: 1, builtAt: Date.now(), nodes };
127
+ }
128
+
129
+ const register = (path: string[]) => {
130
+ const name = path.join(":"); // e.g. ["node","new"] -> "node:new"
131
+ pi.registerCommand(name, {
132
+ description: `Run \`crtr ${path.join(" ")} -h\` (pass args to run the real command)`,
133
+ handler: async (args, ctx) => {
134
+ const extra = (args ?? "").trim();
135
+ // No args -> show help. With args -> run the real command.
136
+ const argv = extra ? [...path, ...extra.split(/\s+/)] : [...path, "-h"];
137
+ ctx.ui.setStatus("crtr-commands", `running crtr ${argv.join(" ")}`);
138
+ const output = await runCrtr(argv);
139
+ ctx.ui.setStatus("crtr-commands", "");
140
+ pi.sendMessage(
141
+ {
142
+ customType: "crtr-output",
143
+ content: `$ crtr ${argv.join(" ")}\n\n${output.trimEnd()}`,
144
+ display: true,
145
+ },
146
+ { triggerTurn: TRIGGER_TURN },
147
+ );
148
+ },
149
+ });
150
+ };
151
+
152
+ const filters = loadFilters();
153
+ let count = 0;
154
+ for (const path of cache.nodes) {
155
+ if (!isAllowed(path.join(":"), filters)) continue;
156
+ register(path);
157
+ count++;
158
+ }
159
+
160
+ pi.on("session_start", async (_e, ctx) => {
161
+ ctx.ui.setStatus("crtr-commands", `${count} crtr commands`);
162
+ });
163
+
164
+ pi.registerCommand("crtr-refresh", {
165
+ description: "Rebuild the crtr command tree cache (then run /reload)",
166
+ handler: async (_args, ctx) => {
167
+ ctx.ui.setStatus("crtr-commands", "walking crtr tree...");
168
+ const nodes = await walkTree();
169
+ saveCache(nodes);
170
+ ctx.ui.setStatus("crtr-commands", "");
171
+ ctx.ui.notify(`crtr-commands: cached ${nodes.length} commands. Run /reload to apply.`, "info");
172
+ },
173
+ });
174
+ }
@@ -0,0 +1,408 @@
1
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+ import { execFile } from "node:child_process";
3
+ import { promisify } from "node:util";
4
+ import { existsSync, realpathSync } from "node:fs";
5
+ import { join, dirname } from "node:path";
6
+ import { pathToFileURL } from "node:url";
7
+
8
+ const exec = promisify(execFile);
9
+
10
+ // ---------------------------------------------------------------------------
11
+ // crtr-help-gate: refuse to let the agent EXECUTE a crtr leaf command until it
12
+ // has read that command's `-h` (its contract) in this pi session.
13
+ //
14
+ // Why: crtr's whole interface contract is "read the schema, then invoke". This
15
+ // guard makes that mechanical — a crtr method (a leaf like `node new`,
16
+ // `human ask`, `skill read`) cannot run until `crtr <that path> -h` (or
17
+ // `--help`) has been seen this session. The first blind attempt is BLOCKED:
18
+ // the agent gets the command's `-h` output inline plus the instruction to read
19
+ // it. So the method is never executed without its contract already in context.
20
+ //
21
+ // Scope of the gate:
22
+ // - Only LEAF executions are gated. `crtr`, `crtr node`, `crtr node -h`,
23
+ // `crtr node new -h` are all help/listing surfaces (crtr just prints help
24
+ // and exits) — they are allowed and the leaf-targeted ones record a bless.
25
+ // - Resolution uses crtr's OWN argv walker (`walk` + `buildRoot` from its
26
+ // installed dist), so a path resolves exactly the way `crtr` itself would:
27
+ // `crtr skill read some-skill` resolves to the leaf `skill read`, NOT to a
28
+ // bogus `skill read some-skill`.
29
+ // - "Help seen" survives /reload, /resume, /fork because it is rebuilt from
30
+ // the session's own command history on session_start.
31
+ //
32
+ // Fail-open: if crtr's dist can't be located/imported, the gate disables
33
+ // itself and never blocks anything (it must never brick the agent).
34
+ // ---------------------------------------------------------------------------
35
+
36
+ // When true (default): the block dumps the help AND blesses the path, so the
37
+ // immediate retry runs. Still guarantees the method never executes without
38
+ // its help already shown — just without an explicit extra `-h` call, and no
39
+ // risk of a re-block loop.
40
+ // When false (strict): a blocked command is NOT auto-blessed. The agent must
41
+ // run `crtr <path> -h` itself (which the gate allows + blesses), then
42
+ // re-issue — the help text is then shown twice.
43
+ const BLESS_ON_BLOCK = true;
44
+
45
+ const HELP_MAX = 16_000; // cap embedded -h output
46
+
47
+ type CrtrNode = { kind: "root" | "branch" | "leaf"; help?: { params?: unknown[] } };
48
+ type WalkResult = { node: CrtrNode; path: string[]; remaining: string[] };
49
+ type WalkFn = (root: unknown, tokens: string[]) => WalkResult;
50
+
51
+ let crtrRoot: unknown = null;
52
+ let walk: WalkFn | null = null;
53
+
54
+ // ---------------------------------------------------------------------------
55
+ // Locate + import crtr's real command tree and argv walker.
56
+ // ---------------------------------------------------------------------------
57
+
58
+ function resolveCrtrDist(): string | null {
59
+ const dirs = (process.env.PATH ?? "").split(":");
60
+ for (const d of dirs) {
61
+ if (!d) continue;
62
+ const cand = join(d, "crtr");
63
+ try {
64
+ if (!existsSync(cand)) continue;
65
+ const real = realpathSync(cand); // <checkout>/bin/crtr
66
+ const dist = join(dirname(real), "..", "dist");
67
+ if (existsSync(join(dist, "build-root.js")) && existsSync(join(dist, "core", "command.js"))) {
68
+ return dist;
69
+ }
70
+ } catch {
71
+ /* keep scanning */
72
+ }
73
+ }
74
+ return null;
75
+ }
76
+
77
+ async function loadCrtr(): Promise<boolean> {
78
+ const dist = resolveCrtrDist();
79
+ if (!dist) return false;
80
+ try {
81
+ const cmdMod = (await import(pathToFileURL(join(dist, "core", "command.js")).href)) as {
82
+ walk: WalkFn;
83
+ };
84
+ const brMod = (await import(pathToFileURL(join(dist, "build-root.js")).href)) as {
85
+ buildRoot: () => unknown;
86
+ };
87
+ if (typeof cmdMod.walk !== "function" || typeof brMod.buildRoot !== "function") return false;
88
+ walk = cmdMod.walk;
89
+ crtrRoot = brMod.buildRoot();
90
+ return crtrRoot != null;
91
+ } catch {
92
+ return false;
93
+ }
94
+ }
95
+
96
+ // ---------------------------------------------------------------------------
97
+ // Shell-aware tokenizer + crtr-invocation finder.
98
+ // ---------------------------------------------------------------------------
99
+
100
+ type Tok = { value: string; op: boolean };
101
+
102
+ // Opening half of a heredoc redirect: `<<DELIM`, `<<-DELIM`, `<< DELIM`,
103
+ // `<<'DELIM'`, `<<"DELIM"`. Group 1 = the `-` (strip-leading-tabs) variant;
104
+ // group 2 = the quote (if any); group 3 = the delimiter word. Deliberately does
105
+ // NOT match `<<<` (here-string) or `x << 2` (no word delimiter).
106
+ const HEREDOC_OPEN = /<<(-?)\s*(["']?)([A-Za-z_][A-Za-z0-9_]*)\2/g;
107
+
108
+ /** Remove heredoc BODIES (the stdin data between `<<DELIM` and its closing
109
+ * `DELIM` line) from a bash command before it is tokenized. The opening line
110
+ * is kept — `crtr push final <<'EOF'` is still a real `push final` invocation
111
+ * we want to gate — but the body lines, which are data fed on stdin and never
112
+ * executed as commands, are dropped. Without this the tokenizer's newline=
113
+ * command-separator rule would read every `crtr <leaf>` line inside a heredoc
114
+ * body (a spawn prompt, a push report) as a real invocation and gate it. */
115
+ export function stripHeredocs(cmd: string): string {
116
+ const lines = cmd.split("\n");
117
+ const out: string[] = [];
118
+ let i = 0;
119
+ while (i < lines.length) {
120
+ const line = lines[i];
121
+ out.push(line);
122
+ i++;
123
+ // Collect every heredoc opened on this line, in left-to-right order; their
124
+ // bodies stack and are consumed in that order.
125
+ const delims: { name: string; dash: boolean }[] = [];
126
+ HEREDOC_OPEN.lastIndex = 0;
127
+ let m: RegExpExecArray | null;
128
+ while ((m = HEREDOC_OPEN.exec(line)) !== null) {
129
+ delims.push({ name: m[3], dash: m[1] === "-" });
130
+ }
131
+ for (const d of delims) {
132
+ while (i < lines.length) {
133
+ const body = lines[i];
134
+ // `<<-` strips leading TABS from the body and the closing delimiter.
135
+ const probe = d.dash ? body.replace(/^\t+/, "") : body;
136
+ i++;
137
+ if (probe === d.name) break; // closing delimiter line — drop it, stop
138
+ // body line: dropped (not pushed to out)
139
+ }
140
+ }
141
+ }
142
+ return out.join("\n");
143
+ }
144
+
145
+ function tokenize(cmd: string): Tok[] {
146
+ const out: Tok[] = [];
147
+ let cur = "";
148
+ let hasContent = false;
149
+ let quote: string | null = null;
150
+ const pushCur = (): void => {
151
+ if (hasContent) out.push({ value: cur, op: false });
152
+ cur = "";
153
+ hasContent = false;
154
+ };
155
+ const pushOp = (v: string): void => {
156
+ pushCur();
157
+ out.push({ value: v, op: true });
158
+ };
159
+ for (let i = 0; i < cmd.length; i++) {
160
+ const c = cmd[i];
161
+ if (quote) {
162
+ if (c === quote) {
163
+ quote = null;
164
+ } else if (quote === '"' && c === "\\" && i + 1 < cmd.length) {
165
+ cur += cmd[++i];
166
+ hasContent = true;
167
+ } else {
168
+ cur += c;
169
+ hasContent = true;
170
+ }
171
+ continue;
172
+ }
173
+ if (c === "'" || c === '"') {
174
+ quote = c;
175
+ hasContent = true; // an empty "" is still a token
176
+ continue;
177
+ }
178
+ if (c === "\\" && i + 1 < cmd.length) {
179
+ cur += cmd[++i];
180
+ hasContent = true;
181
+ continue;
182
+ }
183
+ if (c === "&" && cmd[i + 1] === "&") {
184
+ pushOp("&&");
185
+ i++;
186
+ continue;
187
+ }
188
+ if (c === "|" && cmd[i + 1] === "|") {
189
+ pushOp("||");
190
+ i++;
191
+ continue;
192
+ }
193
+ if (c === "&" || c === "|" || c === ";" || c === "\n" || c === "(" || c === ")" || c === "`") {
194
+ pushOp(c);
195
+ continue;
196
+ }
197
+ if (c === " " || c === "\t" || c === "\r") {
198
+ pushCur();
199
+ continue;
200
+ }
201
+ cur += c;
202
+ hasContent = true;
203
+ }
204
+ pushCur();
205
+ return out;
206
+ }
207
+
208
+ function baseName(tok: string): string {
209
+ const parts = tok.split("/");
210
+ return parts[parts.length - 1] ?? tok;
211
+ }
212
+
213
+ const ENV_ASSIGN = /^[A-Za-z_][A-Za-z0-9_]*=/;
214
+
215
+ /** Return the argv (tokens after the binary) of every `crtr`/`crouter`
216
+ * invocation that sits in command position (start, after a shell operator, or
217
+ * after env-assignments / a command substitution opener). */
218
+ function findCrtrInvocations(tokens: Tok[]): string[][] {
219
+ const invs: string[][] = [];
220
+ let cmdPos = true;
221
+ for (let i = 0; i < tokens.length; i++) {
222
+ const t = tokens[i];
223
+ if (t.op) {
224
+ cmdPos = true; // every operator (incl. `(`, `)`, backtick) opens command position
225
+ continue;
226
+ }
227
+ if (!cmdPos) continue;
228
+ if (ENV_ASSIGN.test(t.value)) continue; // env prefix — stay in command position
229
+ const base = baseName(t.value);
230
+ if (base === "crtr" || base === "crouter") {
231
+ const args: string[] = [];
232
+ let j = i + 1;
233
+ for (; j < tokens.length && !tokens[j].op; j++) args.push(tokens[j].value);
234
+ invs.push(args);
235
+ i = j - 1;
236
+ }
237
+ cmdPos = false; // consumed a command word
238
+ }
239
+ return invs;
240
+ }
241
+
242
+ // ---------------------------------------------------------------------------
243
+ // Gate logic.
244
+ // ---------------------------------------------------------------------------
245
+
246
+ type InvKind = { kind: "help-leaf" | "exec-leaf" | "other"; path: string };
247
+
248
+ function evaluate(args: string[]): InvKind {
249
+ // `--json` is a crtr global stripped before its own walk; mirror that.
250
+ const toks = args.filter((a) => a !== "--json");
251
+ const { node, path, remaining } = walk!(crtrRoot, toks);
252
+ const help = remaining.some((t) => t === "-h" || t === "--help");
253
+ const key = path.join(" ");
254
+ if (node.kind === "leaf") {
255
+ // A leaf with no declared params has no input contract to read — there is
256
+ // nothing -h would teach beyond the name. Don't gate it.
257
+ const hasParams = (node.help?.params?.length ?? 0) > 0;
258
+ if (!hasParams) return { kind: "other", path: key };
259
+ return { kind: help ? "help-leaf" : "exec-leaf", path: key };
260
+ }
261
+ return { kind: "other", path: key };
262
+ }
263
+
264
+ /** Evaluate one bash command. Mutates `blessed` (commits help-read blessings)
265
+ * ONLY when the command is allowed to run; a blocked command commits nothing
266
+ * (it never executes, so its help never prints) — except the offending path
267
+ * itself when BLESS_ON_BLOCK is set. */
268
+ export function processCommand(command: string, blessed: Set<string>): { block: false } | { block: true; path: string } {
269
+ const invs = findCrtrInvocations(tokenize(stripHeredocs(command)));
270
+ const localBless: string[] = [];
271
+ for (const args of invs) {
272
+ const r = evaluate(args);
273
+ if (r.kind === "help-leaf") {
274
+ localBless.push(r.path);
275
+ } else if (r.kind === "exec-leaf") {
276
+ if (!blessed.has(r.path) && !localBless.includes(r.path)) {
277
+ if (BLESS_ON_BLOCK) blessed.add(r.path);
278
+ return { block: true, path: r.path };
279
+ }
280
+ }
281
+ }
282
+ for (const p of localBless) blessed.add(p);
283
+ return { block: false };
284
+ }
285
+
286
+ async function captureHelp(pathKey: string): Promise<string> {
287
+ const parts = pathKey.split(" ").filter(Boolean);
288
+ try {
289
+ const { stdout } = await exec("crtr", [...parts, "-h"], { maxBuffer: 8 * 1024 * 1024, timeout: 10_000 });
290
+ return stdout.trim();
291
+ } catch (err) {
292
+ const out = (err as { stdout?: string })?.stdout;
293
+ return (out ?? "").trim() || `(could not capture \`crtr ${parts.join(" ")} -h\`)`;
294
+ }
295
+ }
296
+
297
+ /** A blocked command is discarded IN FULL — pi executes NONE of it. When that
298
+ * same command also built the body (a heredoc, or output redirected to a file),
299
+ * a naive retry of ONLY the crtr call reads STALE/missing state. This is issue
300
+ * #5: `cat > /tmp/f <<EOF…EOF; crtr push final "$(cat /tmp/f)"` was blocked, the
301
+ * heredoc never wrote /tmp/f, and the retry `push final < /tmp/f` then published
302
+ * a days-old report a DIFFERENT node had left in that shared path. So the block
303
+ * reason MUST steer a re-issue of the WHOLE command and call out the discarded
304
+ * write — never let the agent believe only the crtr call needs re-issuing. */
305
+ function hasDiscardedWrite(command: string): boolean {
306
+ HEREDOC_OPEN.lastIndex = 0;
307
+ if (HEREDOC_OPEN.test(command)) return true;
308
+ // An output redirect to a FILE (`> f` / `>> f`), ignoring fd-dup forms
309
+ // (`>&2`, `2>&1`) that write no standalone file a retry would read back.
310
+ return /(?:^|\s)\d?>>?\s*(?![&])\S/.test(stripHeredocs(command));
311
+ }
312
+
313
+ export function buildReason(pathKey: string, help: string, command: string): string {
314
+ const cmd = `crtr ${pathKey}`;
315
+ const helpBlock = help.length > HELP_MAX ? `${help.slice(0, HELP_MAX)}\n…(truncated)` : help;
316
+ const discardLine = hasDiscardedWrite(command)
317
+ ? "Your ENTIRE bash command was discarded before anything ran — the heredoc/redirect (`<<`, `cat >`, `>`, `>>`) that built the body did NOT execute and its output was NEVER written. Re-issue the WHOLE command (the setup AND the crtr call together), not just the crtr call — any file or `$(…)` the crtr call reads is now stale or missing, so re-issuing the crtr call alone would publish the wrong data."
318
+ : "Your ENTIRE bash command was discarded — nothing in it ran. Re-issue the WHOLE command, not just the crtr call.";
319
+ const next = BLESS_ON_BLOCK
320
+ ? `The schema is shown below. ${discardLine} Re-issue the SAME command as-is, or adjust it based on the schema below — it runs on the second attempt.`
321
+ : `Run \`${cmd} -h\` yourself, read the schema, then re-issue your whole command. ${discardLine}`;
322
+ return [
323
+ `crtr help-gate: blocked \`${cmd}\`.`,
324
+ ``,
325
+ `You have not run \`${cmd} -h\` in this pi session. Policy: read a crtr command's contract before invoking it — never call a method blindly.`,
326
+ ``,
327
+ `Call a command with -h before trying to use it. ${next}`,
328
+ ``,
329
+ `Output of \`${cmd} -h\`:`,
330
+ ``,
331
+ helpBlock,
332
+ ].join("\n");
333
+ }
334
+
335
+ // ---------------------------------------------------------------------------
336
+ // Wiring.
337
+ // ---------------------------------------------------------------------------
338
+
339
+ export default async function (pi: ExtensionAPI) {
340
+ const ready = await loadCrtr();
341
+ const blessed = new Set<string>();
342
+ let warned = false;
343
+
344
+ pi.on("session_start", async (_event, ctx) => {
345
+ if (!ready) {
346
+ if (!warned) {
347
+ ctx.ui.notify("crtr-help-gate: crtr dist not found — gate disabled.", "warn");
348
+ warned = true;
349
+ }
350
+ ctx.ui.setStatus("crtr-gate", "crtr-gate off");
351
+ return;
352
+ }
353
+ // Rebuild "help seen" from this session's own bash history so the gate
354
+ // survives /reload, /resume, /fork.
355
+ blessed.clear();
356
+ try {
357
+ for (const entry of ctx.sessionManager.getEntries() as Array<{ message?: unknown }>) {
358
+ const msg = entry.message as { role?: string; content?: unknown } | undefined;
359
+ if (!msg || msg.role !== "assistant" || !Array.isArray(msg.content)) continue;
360
+ for (const part of msg.content as Array<Record<string, unknown>>) {
361
+ if (part?.type === "toolCall" && part?.name === "bash") {
362
+ const command = (part.arguments as { command?: unknown } | undefined)?.command;
363
+ if (typeof command === "string") processCommand(command, blessed);
364
+ }
365
+ }
366
+ }
367
+ } catch {
368
+ /* best-effort replay */
369
+ }
370
+ ctx.ui.setStatus("crtr-gate", `crtr-gate: ${blessed.size} helped`);
371
+ });
372
+
373
+ pi.on("tool_call", async (event) => {
374
+ if (!ready) return;
375
+ if ((event.toolName ?? "").toLowerCase() !== "bash") return;
376
+ const command = (event.input as { command?: unknown } | undefined)?.command;
377
+ if (typeof command !== "string") return;
378
+ if (!command.includes("crtr") && !command.includes("crouter")) return;
379
+
380
+ const res = processCommand(command, blessed);
381
+ if (!res.block) return;
382
+ const help = await captureHelp(res.path);
383
+ return { block: true, reason: buildReason(res.path, help, command) };
384
+ });
385
+
386
+ // Visibility / escape hatch.
387
+ pi.registerCommand("crtr-gate", {
388
+ description: "crtr help-gate: show or reset which crtr commands have been -h'd this session",
389
+ handler: async (args, ctx) => {
390
+ const arg = (args ?? "").trim();
391
+ if (!ready) {
392
+ ctx.ui.notify("crtr-help-gate is disabled (crtr dist not found).", "warn");
393
+ return;
394
+ }
395
+ if (arg === "reset") {
396
+ blessed.clear();
397
+ ctx.ui.setStatus("crtr-gate", "crtr-gate: 0 helped");
398
+ ctx.ui.notify("crtr-help-gate: cleared. All crtr commands now require -h again.", "info");
399
+ return;
400
+ }
401
+ const list = [...blessed].sort();
402
+ ctx.ui.notify(
403
+ list.length ? `crtr commands -h'd this session:\n ${list.join("\n ")}` : "No crtr commands -h'd yet this session.",
404
+ "info",
405
+ );
406
+ },
407
+ });
408
+ }