@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
@@ -1,7 +1,7 @@
1
- // `crtr view pick` — hidden raw-ANSI picker over the available views.
1
+ // `crtr surface view pick` — hidden raw-ANSI picker over the available views.
2
2
  //
3
3
  // Backs the /view popup: a minimal full-screen list of listViews(); j/k move,
4
- // Enter hands off to `crtr view run <id>` (execFileSync, stdio inherit — a
4
+ // Enter hands off to the surface-view run command (execFileSync, stdio inherit — a
5
5
  // one-way handoff, the picker exits as the view takes over, same pattern as
6
6
  // browse's selectAndFocus), q/Esc/Ctrl-C quit. Outside a TTY it prints the
7
7
  // plain list and exits 0. Reuses the core/tui terminal + draw primitives.
@@ -14,7 +14,7 @@ export const viewPickLeaf = defineLeaf({
14
14
  name: 'pick',
15
15
  tier: 'hidden',
16
16
  description: 'raw-ANSI view picker (used by the /view popup)',
17
- whenToUse: 'internal — the /view popup shells this to choose a view, then it execs `crtr view run <id>`. You normally run `crtr view run <name>` or `crtr view list` directly',
17
+ whenToUse: 'internal — the picker chooses a view for the popup, then hands off to the view host. You normally use run or list directly',
18
18
  help: {
19
19
  name: 'view pick',
20
20
  summary: 'interactive picker over available views; Enter runs the chosen view. Outside a TTY it prints the list and exits',
@@ -23,7 +23,7 @@ export const viewPickLeaf = defineLeaf({
23
23
  outputKind: 'object',
24
24
  effects: [
25
25
  'Inside a TTY: takes over the terminal in raw mode until you pick (Enter) or quit (q/Esc/Ctrl-C).',
26
- 'On Enter: execs `crtr view run <id>` (stdio inherited) — a one-way handoff; the picker exits.',
26
+ 'On Enter: hands off to the chosen view host (stdio inherited) — a one-way handoff; the picker exits.',
27
27
  'Outside a TTY: prints the plain view list and exits 0.',
28
28
  ],
29
29
  },
@@ -38,7 +38,7 @@ export const viewPickLeaf = defineLeaf({
38
38
  return;
39
39
  }
40
40
  if (views.length === 0) {
41
- process.stdout.write('No views found. Scaffold one with `crtr view new <name>`.\n');
41
+ process.stdout.write('No views found. Scaffold one with the view new leaf.\n');
42
42
  return;
43
43
  }
44
44
  const caps = detectColorCaps();
@@ -81,7 +81,7 @@ export const viewPickLeaf = defineLeaf({
81
81
  const launch = (id) => {
82
82
  cleanup();
83
83
  try {
84
- execFileSync('crtr', ['view', 'run', id], { stdio: 'inherit' });
84
+ execFileSync('crtr', ['surface', 'view', 'run', id], { stdio: 'inherit' });
85
85
  }
86
86
  catch {
87
87
  // The view takes the terminal over; a sync handoff may be interrupted.
@@ -1,10 +1,10 @@
1
- // `crtr view run <name>` — resolve, load, and host a view's TUI target.
1
+ // `crtr surface view run` — resolve, load, and host a view's TUI target.
2
2
  //
3
3
  // Resolves the view across scopes (project→user→builtin), loads its core.mjs +
4
4
  // tui.mjs (+ optional text.mjs), then hands them to the dual-target core host.
5
5
  // The host owns the screen and the non-TTY path: when stdin is NOT a TTY it
6
- // prints the text presenter's dump and exits 0, so `crtr view run <name> | cat`
7
- // works anywhere. A view that ships no core.mjs is not a view — run fails with a
6
+ // prints the text presenter's dump and exits 0, so a pipe gets a static
7
+ // snapshot. A view that ships no core.mjs is not a view — run fails with a
8
8
  // clear error naming the contract, never a fallback. The interactive path is
9
9
  // tmux-only (crtr is tmux-only) — outside tmux with a TTY we notify + no-op,
10
10
  // never a non-tmux fallback. --port / --target forward verbatim onto
@@ -13,7 +13,7 @@
13
13
  // --window / --split open the view as a PERSISTENT MONITOR instead of taking
14
14
  // over the current pane: --window in a new background (non-focus-stealing)
15
15
  // tmux window, --split in a right-hand split of the current pane. Both shell a
16
- // plain inner `crtr view run <name>` into the new pane, which hosts the view
16
+ // plain inner surface-view run command into the new pane, which hosts the view
17
17
  // there and self-tags the pane with @crtr_view so the Alt+V then ]/[ view-cycle
18
18
  // can flip it to the next/prev view in place. Both are tmux-only by nature; in
19
19
  // a pipe (non-TTY) placement is meaningless, so they degrade to the static dump.
@@ -27,7 +27,7 @@ import { inTmux, currentTmux, openNodeWindow, splitWindow, piCommand, setPaneOpt
27
27
  export const viewRunLeaf = defineLeaf({
28
28
  name: 'run',
29
29
  description: 'resolve, load, and host a view (in this pane, a new window, or a split)',
30
- whenToUse: 'you want to OPEN a view by name — a full-screen raw-ANSI surface. By default it hosts in the current pane (tmux-only interactive; piped it prints a static snapshot). Pass --window to open it as a background monitor window, or --split to open it beside the current pane both leave you where you are so a view becomes a live monitor you flip between with Alt+V then ]/[. Pass --port/--target to forward connection details. Use `crtr view list` first to see what is available, or `crtr view new` to scaffold one',
30
+ whenToUse: 'you want to open a view by name — a full-screen raw-ANSI surface. By default it hosts in the current pane (tmux-only interactive; piped it prints a static snapshot). Pass --window to open it as a background monitor window, or --split to open it beside the current pane so it stays available as a live monitor. Pass --port/--target to forward connection details. Use list first to see what is available, or new to scaffold one',
31
31
  help: {
32
32
  name: 'view run',
33
33
  summary: 'host a view in the current pane, a new window (--window), or a split (--split); outside a TTY it prints the view\'s static dump and exits 0',
@@ -35,8 +35,8 @@ export const viewRunLeaf = defineLeaf({
35
35
  { kind: 'positional', name: 'name', required: true, constraint: 'View id to run (its directory name). Resolves project→user→builtin.' },
36
36
  { kind: 'flag', name: 'window', type: 'bool', required: false, constraint: 'Open the view in a NEW background tmux window (non-focus-stealing) instead of the current pane — a persistent monitor. tmux-only; ignored (static dump) in a pipe. Mutually exclusive with --split.' },
37
37
  { kind: 'flag', name: 'split', type: 'bool', required: false, constraint: 'Open the view in a right-hand SPLIT of the current pane instead of taking it over — a side-by-side monitor. tmux-only; ignored (static dump) in a pipe. Mutually exclusive with --window.' },
38
- { kind: 'flag', name: 'port', type: 'int', required: false, constraint: 'Forwarded verbatim to the view as options.port (e.g. a CDP debugging port).' },
39
- { kind: 'flag', name: 'target', type: 'string', required: false, constraint: 'Forwarded verbatim to the view as options.target (e.g. a browser tab id).' },
38
+ { kind: 'flag', name: 'port', type: 'int', required: false, constraint: 'Forwarded verbatim to the view as options.port for views that connect to a network service.' },
39
+ { kind: 'flag', name: 'target', type: 'string', required: false, constraint: 'Forwarded verbatim to the view as options.target for views that need an external target identifier.' },
40
40
  ],
41
41
  output: [
42
42
  { name: 'hosted', type: 'string', required: false, constraint: 'For --window/--split: "window" or "split" — where the monitor opened. Absent for an in-pane host (which holds the terminal until you quit).' },
@@ -76,7 +76,7 @@ export const viewRunLeaf = defineLeaf({
76
76
  error: 'view_invalid',
77
77
  message: `'${name}' is not a valid view: ${dir} has no core.mjs`,
78
78
  received: name,
79
- next: `A view is a directory containing core.mjs (the portable core) plus optional tui.mjs (render + keymap), web.jsx, and text.mjs. Scaffold the shape with \`crtr view new ${name}\`.`,
79
+ next: 'A view is a directory containing core.mjs (the portable core) plus optional tui.mjs (render + keymap), web.jsx, and text.mjs. Use the surface view new leaf to scaffold the shape.',
80
80
  });
81
81
  }
82
82
  const avail = listViews().map((v) => v.id);
@@ -85,8 +85,8 @@ export const viewRunLeaf = defineLeaf({
85
85
  message: `no view: ${name}`,
86
86
  received: name,
87
87
  next: avail.length > 0
88
- ? `Available views: ${avail.join(', ')}. Or scaffold one with \`crtr view new ${name}\`.`
89
- : `No views found. Scaffold one with \`crtr view new ${name}\`.`,
88
+ ? `Available views: ${avail.join(', ')}. Or scaffold one with the surface view new leaf.`
89
+ : 'No views found. Scaffold one with the surface view new leaf.',
90
90
  });
91
91
  }
92
92
  const options = {};
@@ -116,7 +116,7 @@ export const viewRunLeaf = defineLeaf({
116
116
  throw new InputError({
117
117
  error: 'not_in_tmux',
118
118
  message: '--window/--split are tmux-only — run crtr inside its tmux session',
119
- next: `Open it from inside tmux, or drop the flag to host in the current pane (or pipe for a snapshot: \`crtr view run ${name} | cat\`).`,
119
+ next: 'Open it from inside tmux, or drop the placement flag to host in the current pane. For a static snapshot, pipe the command output.',
120
120
  });
121
121
  }
122
122
  const here = currentTmux();
@@ -129,7 +129,7 @@ export const viewRunLeaf = defineLeaf({
129
129
  }
130
130
  // The inner command re-enters this leaf with NO placement flag, so it
131
131
  // hosts the view in its own (new) pane and self-tags it via @crtr_view.
132
- const argv = ['view', 'run', name];
132
+ const argv = ['surface', 'view', 'run', name];
133
133
  if (port !== undefined)
134
134
  argv.push('--port', String(port));
135
135
  if (target !== undefined)
@@ -164,8 +164,8 @@ export const viewRunLeaf = defineLeaf({
164
164
  if (process.stdin.isTTY && !inTmux()) {
165
165
  throw new InputError({
166
166
  error: 'not_in_tmux',
167
- message: 'crtr view is tmux-only — run it inside the crtr tmux session',
168
- next: `Open it from inside tmux (e.g. the /view popup), or pipe for a static snapshot: \`crtr view run ${name} | cat\`.`,
167
+ message: 'crtr surface view is tmux-only — run it inside the crtr tmux session',
168
+ next: 'Open it from inside tmux, or pipe the command output for a static snapshot.',
169
169
  });
170
170
  }
171
171
  // Self-tag this pane with the view id (+ any forwarded --port/--target) so
@@ -1,4 +1,4 @@
1
- // `crtr view` — the TUI view library.
1
+ // `crtr surface view` — the TUI view library.
2
2
  //
3
3
  // Views are switchable surfaces with two targets from one portable core.mjs:
4
4
  // the tmux TUI (`run`) and a React+Tailwind web page. This branch assembles the
@@ -6,7 +6,7 @@
6
6
  // target (interactive in tmux, static dump when piped), `new` scaffolds a fresh
7
7
  // view directory, and the hidden `pick` backs the /view popup. Each leaf owns
8
8
  // its own help one level down. The web target is no longer served per-view here:
9
- // it is hosted by the unified `crtr web serve` (the shell's /view/<id> route).
9
+ // it is hosted by the unified surface web server (the shell's /view/<id> route).
10
10
  import { defineBranch } from '../core/command.js';
11
11
  import { viewListLeaf } from './view-list.js';
12
12
  import { viewRunLeaf } from './view-run.js';
@@ -24,7 +24,7 @@ export function registerView() {
24
24
  help: {
25
25
  name: 'view',
26
26
  summary: 'host and author switchable raw-ANSI terminal views',
27
- model: '`list` when you do not know which views exist a flat roster (id/title/description/scope) across project→user→builtin. `run <name>` opens the TUI target full-screen in the current pane (tmux-only interactive; piped it prints the view\'s static dump and exits 0), forwarding --port/--target onto the view; pass --window/--split to open it as a persistent monitor (new window / split) you flip between with Alt+V then ]/[. The web target (React+Tailwind) is served by the unified `crtr web serve` (the shell\'s /view/<id> route), not per-view here. `cycle` switches a monitor pane to the next/prev view in place (what those keys drive). `new <name>` scaffolds a runnable view directory (core.mjs + tui.mjs + web.jsx + text.mjs) you edit. `pick` is a hidden raw-ANSI picker the /view popup shells. Append `-h` at any leaf for its schema.',
27
+ model: 'The branch divides into listing, hosting, cycling, authoring, and the hidden picker. `list` is the roster; `run` hosts a named view in the current pane or a monitor pane; `cycle` advances a monitor in place; `new` scaffolds a view directory; `pick` backs the popup. The browser target is part of the web surface, not this branch.',
28
28
  },
29
29
  children: [viewListLeaf, viewRunLeaf, viewCycleLeaf, viewNewLeaf, viewPickLeaf],
30
30
  });
@@ -2,19 +2,19 @@
2
2
  //
3
3
  // Turns the current tmux window into an editor view for attached headless nodes:
4
4
  // a narrow LEFT rail (the `workspace-sidebar` view — this graph + other live
5
- // agents in this cwd, with ⚑ inbox flags) beside a CHAT pane (`crtr attach`).
5
+ // agents in this cwd, with ⚑ inbox flags) beside a CHAT pane (surface attach).
6
6
  // Selecting a node in the rail swaps it into the chat pane.
7
7
  //
8
8
  // Layout build (the only two driver acts, both through placement's seam):
9
9
  // 1. splitWindow(here, before+size) → the rail pane, left of here, runs
10
- // `crtr view run workspace-sidebar`.
10
+ // the workspace-sidebar view host.
11
11
  // 2. `crtr node focus <node> --pane <here>` → swaps the chat node's attach
12
12
  // viewer into here's slot (here's old content relocates to the backstage).
13
13
  // The rail finds the chat pane by DISCOVERY (the `@crtr_node` tag attach sets),
14
14
  // so it is robust to that swap — no launch-time pane id is threaded into it.
15
15
  //
16
- // Command shape: the path-walker forbids a flat top-level leaf (same constraint
17
- // as attach), so this is a BRANCH wrapping one leaf: `crtr workspace enter`.
16
+ // Command shape: under `crtr surface workspace`, this is a BRANCH wrapping one
17
+ // leaf: `enter`.
18
18
  import { execFile } from 'node:child_process';
19
19
  import { defineBranch, defineLeaf } from '../core/command.js';
20
20
  import { InputError } from '../core/io.js';
@@ -37,10 +37,10 @@ function defaultChatNode(cwd) {
37
37
  const workspaceEnterLeaf = defineLeaf({
38
38
  name: 'enter',
39
39
  description: 'enter the editor view — a node rail beside a chat pane, in this window',
40
- whenToUse: 'you want to work in the agent-centric editor layout: a left rail listing this graph + the other live agents in this working directory (with ⚑ inbox flags) beside a chat pane attached to a node. Selecting a node in the rail swaps it into the chat pane. Opens in the CURRENT tmux window. tmux-only.',
40
+ whenToUse: 'you want to work in the agent-centric editor layout: a left rail listing this graph plus the other live agents in this working directory (with ⚑ inbox flags) beside a chat pane attached to a node. Selecting a node in the rail swaps it into the chat pane. Opens in the current tmux window. tmux-only.',
41
41
  help: {
42
42
  name: 'workspace enter',
43
- summary: 'split the current window into a left node-rail (the workspace-sidebar view) + a chat pane (crtr attach); ↵ in the rail swaps a node into the chat. tmux-only.',
43
+ summary: 'split the current window into a left node-rail (the workspace-sidebar view) + a chat pane (surface attach); ↵ in the rail swaps a node into the chat. tmux-only.',
44
44
  params: [
45
45
  {
46
46
  kind: 'flag',
@@ -74,12 +74,12 @@ const workspaceEnterLeaf = defineLeaf({
74
74
  const node = input['node'];
75
75
  const width = input['width'] ?? RAIL_WIDTH;
76
76
  if (!process.stdout.isTTY) {
77
- return { note: 'crtr workspace enter builds a tmux layout — run it in a tmux pane (a TTY), not a pipe.' };
77
+ return { note: 'surface workspace enter builds a tmux layout — run it in a tmux pane (a TTY), not a pipe.' };
78
78
  }
79
79
  if (!inTmux()) {
80
80
  throw new InputError({
81
81
  error: 'not_in_tmux',
82
- message: 'crtr workspace is tmux-only — run it inside the crtr tmux session',
82
+ message: 'surface workspace is tmux-only — run it inside the crtr tmux session',
83
83
  next: 'Open it from inside tmux.',
84
84
  });
85
85
  }
@@ -109,7 +109,7 @@ const workspaceEnterLeaf = defineLeaf({
109
109
  }
110
110
  // 1. The rail — a narrow split to the LEFT of here. It discovers the chat
111
111
  // pane itself (the @crtr_node tag), so no pane id is threaded in.
112
- const railCmd = piCommand(['view', 'run', 'workspace-sidebar', '--target', here.pane], 'crtr');
112
+ const railCmd = piCommand(['surface', 'view', 'run', 'workspace-sidebar', '--target', here.pane], 'crtr');
113
113
  const rail = splitWindow(here.pane, {
114
114
  cwd: process.cwd(),
115
115
  env: {},
@@ -154,7 +154,7 @@ export function registerWorkspace() {
154
154
  help: {
155
155
  name: 'workspace',
156
156
  summary: 'enter the agent-centric editor view (node rail + chat pane) in the current tmux window',
157
- model: '`enter` splits the current window into a narrow left rail (the workspace-sidebar view this graph + other live agents in this cwd, ⚑ inbox flags) and a chat pane (`crtr attach`) attached to a node (--node, or the newest live root here). ↵ in the rail swaps the selected node into the chat pane. tmux-only; piped it prints a notice and exits 0.',
157
+ model: 'The branch is a two-pane editor layout: a narrow left rail and a chat pane. The rail shows this graph plus the other live agents in the working directory, and selecting a node swaps it into chat. tmux-only; piped input prints a notice and exits 0.',
158
158
  },
159
159
  children: [workspaceEnterLeaf],
160
160
  });
@@ -0,0 +1,140 @@
1
+ // Run with: node --import tsx/esm --test src/core/__tests__/boot.test.ts
2
+ //
3
+ // BUG LOCKED (Hearth P6 Bug B — a sandbox/VM destroy+recreate, or a host
4
+ // reboot, leaves stale `pi_pid` values in the durable canvas.db; a pid-reuse
5
+ // collision on the fresh boot can fool `isPidAlive` into reading a dead
6
+ // broker as alive, wedging the node forever). reconcileBootLiveness is the
7
+ // fix: detect the boot change and clear every stale pid BEFORE any liveness
8
+ // check trusts it.
9
+ //
10
+ // Exercises the pure decision core (bootChanged) and the impure, single-writer
11
+ // sweep (reconcileBootLiveness) against a real isolated CRTR_HOME + canvas.db —
12
+ // no real reboot, no real uptime: both take an injected BootIdentity (kernel
13
+ // boot_id + wall-clock epoch) so a boot change is simulated by handing a
14
+ // different identity between calls.
15
+ import { test, before, after, beforeEach } from 'node:test';
16
+ import assert from 'node:assert/strict';
17
+ import { mkdtempSync, rmSync } from 'node:fs';
18
+ import { tmpdir } from 'node:os';
19
+ import { join } from 'node:path';
20
+ import { createNode, getRow, recordPid } from '../canvas/canvas.js';
21
+ import { closeDb } from '../canvas/db.js';
22
+ import { bootChanged, reconcileBootLiveness } from '../canvas/boot.js';
23
+ let home;
24
+ /** Build a BootIdentity for injection. `bootId` null models the non-Linux
25
+ * fallback (wall-clock window); a string models the exact kernel boot_id. */
26
+ function ident(bootId, bootEpochMs) {
27
+ return { bootId, bootEpochMs };
28
+ }
29
+ function node(id, over = {}) {
30
+ return {
31
+ node_id: id,
32
+ name: id,
33
+ created: new Date().toISOString(),
34
+ cwd: '/tmp/work',
35
+ kind: 'developer',
36
+ mode: 'base',
37
+ lifecycle: 'terminal',
38
+ status: 'active',
39
+ ...over,
40
+ };
41
+ }
42
+ before(() => {
43
+ home = mkdtempSync(join(tmpdir(), 'crtr-boot-'));
44
+ process.env['CRTR_HOME'] = home;
45
+ });
46
+ beforeEach(() => {
47
+ closeDb();
48
+ rmSync(home, { recursive: true, force: true });
49
+ });
50
+ after(() => {
51
+ closeDb();
52
+ rmSync(home, { recursive: true, force: true });
53
+ delete process.env['CRTR_HOME'];
54
+ });
55
+ // ---------------------------------------------------------------------------
56
+ // bootChanged — pure core
57
+ // ---------------------------------------------------------------------------
58
+ test('bootChanged: no persisted history is never a change (never clears a genuinely live pid)', () => {
59
+ assert.equal(bootChanged(ident('boot-A', 1_000_000), null), false);
60
+ });
61
+ test('bootChanged: same kernel boot_id is the SAME boot (daemon restart, no reboot)', () => {
62
+ assert.equal(bootChanged(ident('boot-A', 1_000_000 + 5_000), ident('boot-A', 1_000_000)), false, 'identical boot_id — same boot regardless of epoch');
63
+ });
64
+ test('bootChanged: a DIFFERENT boot_id under 60s wall-delta is still detected (Major-2 regression)', () => {
65
+ // A genuinely fast reboot/recreate: boot B starts only 42s after boot A
66
+ // (Hearth\'s measured recreate window), well inside the 60s wall tolerance.
67
+ // The exact kernel boot_id catches it with NO reliance on the wall-clock
68
+ // window — the case the old epoch-only compare false-negatived.
69
+ assert.equal(bootChanged(ident('boot-B', 1_000_000 + 42_000), ident('boot-A', 1_000_000)), true, 'distinct boot_id 42s apart — a real quick recreate, detected');
70
+ });
71
+ test('bootChanged: same boot_id with a huge epoch jump is NOT a boot change (NTP step within a boot)', () => {
72
+ assert.equal(bootChanged(ident('boot-A', 1_000_000 + 10 * 60_000), ident('boot-A', 1_000_000)), false, 'boot_id trumps the wall clock — an NTP correction mid-boot never false-positives');
73
+ });
74
+ test('bootChanged: wall-clock fallback (no boot_id) — epochs within tolerance are the SAME boot', () => {
75
+ assert.equal(bootChanged(ident(null, 1_000_000 + 5_000), ident(null, 1_000_000)), false, '5s drift — same boot');
76
+ });
77
+ test('bootChanged: wall-clock fallback (no boot_id) — epochs far apart are a DIFFERENT boot', () => {
78
+ assert.equal(bootChanged(ident(null, 1_000_000 + 10 * 60_000), ident(null, 1_000_000)), true, '10min apart — different boot');
79
+ });
80
+ // ---------------------------------------------------------------------------
81
+ // reconcileBootLiveness — the impure sweep against a real canvas.db
82
+ // ---------------------------------------------------------------------------
83
+ test('reconcileBootLiveness: first-ever call seeds the marker and clears nothing', () => {
84
+ const m = node('n1');
85
+ createNode(m);
86
+ recordPid('n1', 12345);
87
+ const result = reconcileBootLiveness(ident('boot-A', 1_000_000));
88
+ assert.deepEqual(result, { changed: false, cleared: [] });
89
+ assert.equal(getRow('n1')?.pi_pid, 12345, 'a first-ever run never clears an existing pid');
90
+ });
91
+ test('reconcileBootLiveness: same boot (same boot_id) leaves pids untouched — MUST NOT weaken the normal daemon-restart case', () => {
92
+ const m = node('n1');
93
+ createNode(m);
94
+ recordPid('n1', 12345);
95
+ reconcileBootLiveness(ident('boot-A', 1_000_000)); // seed
96
+ const result = reconcileBootLiveness(ident('boot-A', 1_000_000 + 3_000)); // 3s later, same boot
97
+ assert.deepEqual(result, { changed: false, cleared: [] });
98
+ assert.equal(getRow('n1')?.pi_pid, 12345, 'a live pid on the same boot is never cleared');
99
+ });
100
+ test('reconcileBootLiveness: a boot change clears every recorded pid, regardless of status', () => {
101
+ const active = node('active-1', { status: 'active' });
102
+ const idle = node('idle-1', { status: 'idle' });
103
+ const dead = node('dead-1', { status: 'dead' }); // the guard reads pi_pid unconditionally
104
+ const noPid = node('no-pid-1', { status: 'active' });
105
+ for (const m of [active, idle, dead, noPid])
106
+ createNode(m);
107
+ recordPid('active-1', 111);
108
+ recordPid('idle-1', 222);
109
+ recordPid('dead-1', 333);
110
+ // no-pid-1 deliberately left without a recorded pid.
111
+ reconcileBootLiveness(ident('boot-A', 1_000_000)); // seed boot A
112
+ const result = reconcileBootLiveness(ident('boot-B', 1_000_000 + 60 * 60_000)); // boot B
113
+ assert.equal(result.changed, true);
114
+ assert.deepEqual(result.cleared.sort(), ['active-1', 'dead-1', 'idle-1']);
115
+ assert.equal(getRow('active-1')?.pi_pid, null);
116
+ assert.equal(getRow('idle-1')?.pi_pid, null);
117
+ assert.equal(getRow('dead-1')?.pi_pid, null, 'cleared even though status is dead — the double-launch guard reads pi_pid unconditionally');
118
+ assert.equal(getRow('no-pid-1')?.pi_pid, null, 'already null — no-op, not an error');
119
+ });
120
+ test('reconcileBootLiveness: a fast recreate (distinct boot_id, 42s wall) still sweeps (Major-2 regression)', () => {
121
+ const m = node('n1');
122
+ createNode(m);
123
+ recordPid('n1', 111);
124
+ reconcileBootLiveness(ident('boot-A', 1_000_000)); // seed boot A
125
+ const result = reconcileBootLiveness(ident('boot-B', 1_000_000 + 42_000)); // 42s later — inside the wall window, but new boot_id
126
+ assert.equal(result.changed, true, 'distinct boot_id detected even 42s apart');
127
+ assert.deepEqual(result.cleared, ['n1']);
128
+ assert.equal(getRow('n1')?.pi_pid, null);
129
+ });
130
+ test('reconcileBootLiveness: after reconciling, the SAME boot no longer re-triggers (idempotent)', () => {
131
+ const m = node('n1');
132
+ createNode(m);
133
+ recordPid('n1', 111);
134
+ reconcileBootLiveness(ident('boot-A', 1_000_000)); // seed boot A
135
+ reconcileBootLiveness(ident('boot-B', 1_000_000 + 60 * 60_000)); // boot change → clears + persists boot B
136
+ recordPid('n1', 999); // a fresh broker re-records its pid post-revive
137
+ const result = reconcileBootLiveness(ident('boot-B', 1_000_000 + 60 * 60_000 + 2_000)); // still boot B, 2s later
138
+ assert.deepEqual(result, { changed: false, cleared: [] });
139
+ assert.equal(getRow('n1')?.pi_pid, 999, 'a pid recorded AFTER reconciliation, within the same boot, is never touched');
140
+ });
@@ -12,9 +12,6 @@
12
12
  // model provider is registered into the ModelRegistry and resolves onto
13
13
  // the session. Plain createAgentSession never calls registerProvider, so a
14
14
  // custom-provider node would get NO model.
15
- // C4 — a project AGENTS.md is injected into the assembled system prompt (the
16
- // services path loads project context; 0.78.1 has no project-trust gate so
17
- // context is unconditionally loaded — see buildBrokerSession's C4 note).
18
15
  // C2 — with ZERO viewers attached, the broker UI context resolves confirm() /
19
16
  // select() / input() / editor() to deny/cancel IMMEDIATELY (noOp), instead
20
17
  // of relying on a per-dialog timeout and hanging the agent turn forever.
@@ -23,7 +20,7 @@
23
20
  // dialog routing are all local. No tmux, no broker process — direct unit drives.
24
21
  import { test } from 'node:test';
25
22
  import assert from 'node:assert/strict';
26
- import { mkdtempSync, writeFileSync, rmSync } from 'node:fs';
23
+ import { mkdtempSync, rmSync } from 'node:fs';
27
24
  import { tmpdir } from 'node:os';
28
25
  import { join, dirname } from 'node:path';
29
26
  import { fileURLToPath } from 'node:url';
@@ -86,29 +83,11 @@ test('C3b — broker splits model thinking suffix before SDK registry lookup', a
86
83
  rmSync(cwd, { recursive: true, force: true });
87
84
  }
88
85
  });
89
- // ===========================================================================
90
- // C4 project context (AGENTS.md) is injected into the system prompt. The
91
- // services path loads project context files; on the 0.78.1 pin there is no
92
- // project-trust gate, so they load unconditionally (and buildBrokerSession does
93
- // NOT re-introduce the CLI's headless trust resolver, which would drop them).
94
- // ===========================================================================
95
- test('C4 — a project AGENTS.md is injected into the assembled system prompt', async () => {
96
- const cwd = mkdtempSync(join(tmpdir(), 'crtr-c4-'));
97
- try {
98
- const marker = 'C4_AGENTS_MARKER_' + Math.random().toString(36).slice(2);
99
- writeFileSync(join(cwd, 'AGENTS.md'), `# Project rules\n\n${marker}\n`);
100
- const { session } = await buildBrokerSession(realEngine, cfg(cwd));
101
- try {
102
- assert.ok(session.systemPrompt.includes(marker), 'C4: project AGENTS.md content is present in the assembled system prompt');
103
- }
104
- finally {
105
- session.dispose();
106
- }
107
- }
108
- finally {
109
- rmSync(cwd, { recursive: true, force: true });
110
- }
111
- });
86
+ // (C4 — project AGENTS.md/CLAUDE.md injection — was removed: crouter now sets
87
+ // `noContextFiles: true` in buildBrokerSession and re-renders project context
88
+ // into the first-message <crtr-context> bearings instead of pi's system prompt
89
+ // (broker.ts). That behavior is covered by context-intro.test.ts's "project
90
+ // instructions ride the bearings, not the system prompt" test.)
112
91
  // ===========================================================================
113
92
  // C2 — zero-viewer dialogs resolve to deny/cancel IMMEDIATELY (noOp), never
114
93
  // hanging the turn and never waiting on a per-dialog timeout. Drives the REAL
@@ -116,6 +116,28 @@ test('an unplaced active node is left alone before it boots', async () => {
116
116
  await superviseTick();
117
117
  assert.equal(getNode('S').status, 'active', 'unplaced active node is not reaped');
118
118
  });
119
+ // Major-4: a correctly-dormant idle-release node whose recorded pid was cleared
120
+ // to null by boot reconciliation must NOT be spuriously revived. Its pi_pid is
121
+ // null and pi_session_id is set, so the pid-null branch would otherwise read it
122
+ // as a "stranded relaunch" and grace-revive it — even though it freed itself on
123
+ // purpose and has no unseen inbox. The pid-null branch must honor idle-release
124
+ // dormancy the same way the dead-pid branch does: leave it idle; only the second
125
+ // pass wakes it, and only on an unseen inbox entry.
126
+ test('idle-release node with a boot-cleared (null) pid and no unseen inbox stays dormant', async () => {
127
+ createNode(node('D', {
128
+ status: 'idle',
129
+ intent: 'idle-release',
130
+ pi_pid: null, // cleared by boot reconciliation
131
+ pi_session_id: '019e8f00-freed-while-dormant', // set → would look like a stranded relaunch
132
+ }));
133
+ const t0 = Date.now();
134
+ await superviseTick(t0); // first observation
135
+ await superviseTick(t0 + 60_000); // well past the boot grace
136
+ const after = getNode('D');
137
+ assert.equal(after.status, 'idle', 'dormant idle-release node is left idle, not revived');
138
+ assert.equal(after.intent, 'idle-release', 'intent unchanged — no revive fired');
139
+ assert.equal(after.pi_pid, null, 'no fresh pid — reviveNode was never invoked');
140
+ });
119
141
  // Daemon start guard: spawnDaemon must not report success before the daemon is
120
142
  // plausibly alive and has written its pidfile. This is a pure bounded poll over
121
143
  // injected clocks/probes, so we can lock it down deterministically without a
@@ -104,7 +104,7 @@ export class SessionManager {
104
104
  // ---------------------------------------------------------------------------
105
105
  // AgentSessionEvent stream synthesis (T8 / G1, G3, G4, G8). The fake emits a
106
106
  // REALISTIC streaming assistant turn through session.subscribe — the SAME channel
107
- // the real pi engine feeds the broker's fan-out — so the frames a `crtr attach`
107
+ // the real pi engine feeds the broker's fan-out — so the frames a `crtr surface attach`
108
108
  // client receives are byte-for-byte real AgentSessionEvents. The EMITTED event
109
109
  // shapes are typed against the real `AgentSessionEvent` union from pi (whose full
110
110
  // 17 variants are message_start/update/end, tool_execution_start/update/end,
@@ -3,7 +3,7 @@
3
3
  // FULL TIER (real-boot-bound): tmux-free, but it boots a REAL broker process
4
4
  // (~5s pi-SDK load), so it lives in full/ (CI), not the fast local loop.
5
5
  //
6
- // T8 — the `crtr attach` acceptance gate, gates G4/G7/G8/G9 (controller
6
+ // T8 — the `crtr surface attach` acceptance gate, gates G4/G7/G8/G9 (controller
7
7
  // arbitration, decoder overflow caps, backpressure shedding, and the load-bearing
8
8
  // ONE-WRITER proof). Split out of broker-lifecycle.test.ts; the gates are the
9
9
  // original acceptance gate, unchanged.
@@ -3,7 +3,7 @@
3
3
  // FULL TIER (real-boot-bound): tmux-free, but it boots a REAL broker process
4
4
  // (~5s pi-SDK load), so it lives in full/ (CI), not the fast local loop.
5
5
  //
6
- // T8 — the `crtr attach` acceptance gate, gates G1/G1b/G2/G3 (controller drive,
6
+ // T8 — the `crtr surface attach` acceptance gate, gates G1/G1b/G2/G3 (controller drive,
7
7
  // relay/coalescing, detach survival, catch-up snapshot). Split out of
8
8
  // broker-lifecycle.test.ts; the gates are the original acceptance gate, unchanged.
9
9
  //
@@ -12,7 +12,7 @@
12
12
  // • items 4–6: a CRASHED broker (pid killed out from under the daemon) must
13
13
  // grace-revive RESUMING the saved .jsonl, ONE-WRITER (the crashed pid is
14
14
  // dead BEFORE the revive launches and never resurrects; the revived pid is
15
- // distinct); and a clean `node close` tears the broker down (shutdown frame
15
+ // distinct); and a clean `node lifecycle close` tears the broker down (shutdown frame
16
16
  // → exit, socket unlinked, status canceled, daemon leaves it).
17
17
  // • M-1/M-2: a broker that DIES before session_start records NO pid and NO
18
18
  // session EVER. Read pid==null unconditionally as "still booting" and the
@@ -40,7 +40,8 @@
40
40
  // RED. Verified by reverting that branch (see bug-injection report).
41
41
  import { test, before, after } from 'node:test';
42
42
  import assert from 'node:assert/strict';
43
- import { existsSync } from 'node:fs';
43
+ import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
44
+ import { join } from 'node:path';
44
45
  import { createHarness } from '../helpers/harness.js';
45
46
  import { subscribe } from '../../canvas/canvas.js';
46
47
  import { isPidAlive } from '../../canvas/pid.js';
@@ -84,13 +85,17 @@ test('CRASH → grace-revive RESUME (one-writer), then clean teardown on close',
84
85
  assert.ok(newPid != null && isPidAlive(newPid), 'the revived broker pid is alive');
85
86
  assert.notEqual(newPid, oldPid, 'the revived pid is distinct from the crashed one');
86
87
  assert.equal(isPidAlive(oldPid), false, 'one-writer: the crashed pid never resurrected');
87
- // --- Item 5: clean teardown of the (revived, live) broker. node close marks
88
+ // --- Item 5: clean teardown of the (revived, live) broker. node lifecycle close marks
88
89
  // canceled BEFORE teardown (crash-safe order), then hostFor(broker).teardown
89
90
  // sends the `shutdown` frame → the broker disposes + exits, socket unlinked. ---
91
+ const sessionFile = h.node(id).pi_session_file;
92
+ assert.ok(sessionFile !== null && sessionFile !== undefined, 'revived broker has a session file');
93
+ mkdirSync(join(sessionFile, '..'), { recursive: true });
94
+ writeFileSync(sessionFile, JSON.stringify({ type: 'message', message: { role: 'assistant', content: [{ type: 'text', text: 'hi' }] } }) + '\n');
90
95
  const sock = h.brokerSock(id);
91
96
  await h.waitFor(() => existsSync(sock), { label: 'revived broker created its view.sock' });
92
- const res = h.cli(root, ['node', 'close', '--node', id]);
93
- assert.equal(res.code, 0, `node close should exit 0\n--stderr--\n${res.stderr}`);
97
+ const res = h.cli(root, ['node', 'lifecycle', 'close', '--node', id]);
98
+ assert.equal(res.code, 0, `node lifecycle close should exit 0\n--stderr--\n${res.stderr}`);
94
99
  await h.waitFor(() => !isPidAlive(newPid), { label: 'broker process exited on shutdown frame' });
95
100
  await h.waitFor(() => !existsSync(sock), { label: 'broker unlinked its socket on exit' });
96
101
  assert.equal(h.status(id), 'canceled', 'the closed node is canceled');
@@ -3,7 +3,7 @@
3
3
  // FULL TIER (real-boot-bound): tmux-free, but it boots a REAL broker process,
4
4
  // so it lives in full/ (CI), not the fast local loop.
5
5
  //
6
- // BUG-REGRESSION (real, observed 2026-06-11 in `crtr attach`): switching the
6
+ // BUG-REGRESSION (real, observed 2026-06-11 in `crtr surface attach`): switching the
7
7
  // model (/model <provider/id> or the picker) visibly did nothing — the viewer's
8
8
  // status bar kept showing the OLD model until some unrelated event happened to
9
9
  // arrive.
@@ -3,7 +3,7 @@
3
3
  // FULL TIER (real-boot-bound): tmux-free, but it boots a REAL broker process,
4
4
  // so it lives in full/ (CI), not the fast local loop.
5
5
  //
6
- // BUG-REGRESSION (real, observed 2026-06-11 in `crtr attach`): double-Esc (or
6
+ // BUG-REGRESSION (real, observed 2026-06-11 in `crtr surface attach`): double-Esc (or
7
7
  // /tree) opened the session-tree picker, but SELECTING an entry visibly did
8
8
  // nothing — the viewer stayed on the old transcript instead of traveling back
9
9
  // to the chosen point in time.
@@ -6,7 +6,7 @@
6
6
  //
7
7
  // (1) Gap 1 — `nodeInPane()` (src/commands/node.ts) resolved a pane via
8
8
  // window→node ONLY. A broker engine runs DETACHED with window=null, and its
9
- // on-screen presence is a `crtr attach` VIEWER pane, so the window lookup
9
+ // on-screen presence is a `crtr surface attach` VIEWER pane, so the window lookup
10
10
  // never found it: `node cycle`/`recycle`/`close`/`demote`/`lifecycle` all
11
11
  // broke when the current pane was a broker viewer. The fix has attach
12
12
  // self-tag its pane `@crtr_node=<id>` and nodeInPane resolve that tag first.