@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,4 +1,4 @@
1
- // input-controller.ts — the input half of `crtr attach` (T6).
1
+ // input-controller.ts — the input half of `crtr surface attach` (T6).
2
2
  //
3
3
  // Owns the editor's behavior: turns keystrokes + submits into `ClientToBroker`
4
4
  // command frames (sent via `hooks.onCommand`), reads pasted clipboard images to
@@ -1,4 +1,4 @@
1
- // pickers.ts — native interactive pickers for `crtr attach`, built against the
1
+ // pickers.ts — native interactive pickers for `crtr surface attach`, built against the
2
2
  // operator-view wire contract (broker read-op `data` frames). Each builder turns
3
3
  // a serialized picker payload into the REAL pi `*SelectorComponent`, wired so a
4
4
  // selection dispatches the SAME command frame the text-arg slash path sends and
@@ -1,4 +1,4 @@
1
- // slash-commands.ts — builtin slash-command parse + dispatch for `crtr attach` (C6).
1
+ // slash-commands.ts — builtin slash-command parse + dispatch for `crtr surface attach` (C6).
2
2
  //
3
3
  // Builtin slash commands are NOT engine-interpreted: `session.prompt('/model')`
4
4
  // ships "/model" to the LLM as literal text. So the viewer recognizes the 21
@@ -329,8 +329,7 @@ function resumeNode(ctx) {
329
329
  popup(cmd);
330
330
  return true;
331
331
  }
332
- /** `/view [name]`. Bare opens the picker (`crtr view pick`);
333
- * `/view <name>` opens that view directly (`crtr view run <name>`). Self-contained
332
+ /** `/view [name]`. Bare opens the picker; with a name it opens that view directly. Self-contained
334
333
  * popup — no node-focus, no return-pane. */
335
334
  function openView(arg, ctx) {
336
335
  if (process.env['TMUX'] === undefined) {
@@ -338,11 +337,11 @@ function openView(arg, ctx) {
338
337
  return true;
339
338
  }
340
339
  const name = arg.trim();
341
- const cmd = name === '' ? 'crtr view pick' : `crtr view run ${shellQuote(name)}`;
340
+ const cmd = name === '' ? 'crtr surface view pick' : `crtr surface view run ${shellQuote(name)}`;
342
341
  popup(cmd);
343
342
  return true;
344
343
  }
345
- /** `/context`. Opens `crtr node context` as a popup — a
344
+ /** `/context`. Opens `crtr node inspect context` as a popup — a
346
345
  * read-only nvim explorer over this node's + its subscriptions' context dirs.
347
346
  * Self-contained popup — no node-focus, no return-pane. */
348
347
  function openContext(ctx) {
@@ -357,7 +356,7 @@ function openContext(ctx) {
357
356
  ctx.notify('/context: no node to root on (viewer has no node id)');
358
357
  return true;
359
358
  }
360
- popup(`crtr node context --node ${shellQuote(nodeId)}`);
359
+ popup(`crtr node inspect context --node ${shellQuote(nodeId)}`);
361
360
  return true;
362
361
  }
363
362
  /** Open `cmd` as a fire-and-forget tmux display-popup (same geometry as the canvas
@@ -43,9 +43,13 @@ export declare class TitledEditor extends CustomEditor {
43
43
  /** Pre-styled context string painted into the RIGHT of the top border (cwd /
44
44
  * branch / git status). Already colorized by the caller; empty → omitted. */
45
45
  info: string;
46
+ /** Mode badge painted into the bottom-right of the outline. Empty → omitted. */
47
+ mode: string;
46
48
  /** Paint the chip solid so the name reads as a label sitting on the border
47
49
  * rule. Defaults to the reverse-video chip; attach-cmd swaps in a
48
50
  * thinking-colored background (bold white text) on each state update. */
49
51
  titleStyle: (s: string) => string;
52
+ /** Mode badge colorizer, matched to the current mode type. */
53
+ modeStyle: (s: string) => string;
50
54
  render(width: number): string[];
51
55
  }
@@ -1,4 +1,4 @@
1
- // titled-editor.ts — the `crtr attach` input editor with two bits of chrome pi's
1
+ // titled-editor.ts — the `crtr surface attach` input editor with two bits of chrome pi's
2
2
  // stock editor doesn't give us:
3
3
  // 1. the session name painted INTO the top border as a solid-background chip,
4
4
  // so it stays pinned to the editor instead of scrolling off as a free badge;
@@ -103,10 +103,14 @@ export class TitledEditor extends CustomEditor {
103
103
  /** Pre-styled context string painted into the RIGHT of the top border (cwd /
104
104
  * branch / git status). Already colorized by the caller; empty → omitted. */
105
105
  info = '';
106
+ /** Mode badge painted into the bottom-right of the outline. Empty → omitted. */
107
+ mode = '';
106
108
  /** Paint the chip solid so the name reads as a label sitting on the border
107
109
  * rule. Defaults to the reverse-video chip; attach-cmd swaps in a
108
110
  * thinking-colored background (bold white text) on each state update. */
109
111
  titleStyle = defaultTitleStyle;
112
+ /** Mode badge colorizer, matched to the current mode type. */
113
+ modeStyle = defaultTitleStyle;
110
114
  render(width) {
111
115
  const lines = super.render(width);
112
116
  if ((this.title || this.info) && lines.length > 0) {
@@ -114,6 +118,14 @@ export class TitledEditor extends CustomEditor {
114
118
  // border color.
115
119
  lines[0] = composeTopBorder(width, this.title, this.info, this.titleStyle, (s) => this.borderColor(s));
116
120
  }
121
+ if (this.mode && lines.length > 0) {
122
+ const badge = this.modeStyle(this.mode);
123
+ const badgeWidth = visibleWidth(badge);
124
+ if (badgeWidth + 2 < width) {
125
+ const last = lines.length - 1;
126
+ lines[last] = truncateToWidth(lines[last], width - badgeWidth, '') + badge;
127
+ }
128
+ }
117
129
  return lines;
118
130
  }
119
131
  }
@@ -1,4 +1,4 @@
1
- // view-socket.ts — the socket client half of `crtr attach` (Phase 4, T7).
1
+ // view-socket.ts — the socket client half of `crtr surface attach` (Phase 4, T7).
2
2
  //
3
3
  // The §0 ONE-WRITER INVARIANT lives in this directory: a viewer has ONLY a
4
4
  // socket. ViewSocketClient connects to a node's ALREADY-running headless broker
@@ -7,26 +7,26 @@ test('coalesces the idempotent crtr --json reads the SSE burst fans out', () =>
7
7
  // duplicate subprocesses because shouldCache only matched `canvas snapshot`.
8
8
  assert.equal(isCoalescableSourceRequest(exec(['canvas', 'snapshot', '--json'])), true);
9
9
  assert.equal(isCoalescableSourceRequest(exec(['human', 'list', '--json'])), true);
10
- assert.equal(isCoalescableSourceRequest(exec(['view', 'list', '--json'])), true);
11
- assert.equal(isCoalescableSourceRequest(exec(['node', 'snapshot', 'abc-123', '--json'])), true);
10
+ assert.equal(isCoalescableSourceRequest(exec(['surface', 'view', 'list', '--json'])), true);
11
+ assert.equal(isCoalescableSourceRequest(exec(['node', 'inspect', 'snapshot', 'abc-123', '--json'])), true);
12
12
  assert.equal(isCoalescableSourceRequest(exec(['node', 'inspect', 'show', 'abc-123', '--json'])), true);
13
13
  });
14
14
  test('does NOT coalesce writes, side-effecting, or target-mismatched requests', () => {
15
15
  // Writes — must never be cached (would drop a mutation).
16
16
  assert.equal(isCoalescableSourceRequest(exec(['node', 'new', '--json'], { stdin: 'prompt' })), false);
17
17
  assert.equal(isCoalescableSourceRequest(exec(['canvas', 'revive', 'abc', '--json'])), false);
18
- assert.equal(isCoalescableSourceRequest(exec(['node', 'msg', 'abc', '--json'], { stdin: 'hi' })), false);
18
+ assert.equal(isCoalescableSourceRequest(exec(['node', 'spine', 'msg', 'abc', '--json'], { stdin: 'hi' })), false);
19
19
  // human resolve / deck are on-demand writes, not the cached list read.
20
20
  assert.equal(isCoalescableSourceRequest(exec(['human', 'resolve', 'q1', '--json'])), false);
21
21
  // Any stdin or cwd override disqualifies even an allowlisted command shape.
22
22
  assert.equal(isCoalescableSourceRequest(exec(['canvas', 'snapshot', '--json'], { stdin: 'x' })), false);
23
- assert.equal(isCoalescableSourceRequest(exec(['view', 'list', '--json'], { cwd: '/elsewhere' })), false);
23
+ assert.equal(isCoalescableSourceRequest(exec(['surface', 'view', 'list', '--json'], { cwd: '/elsewhere' })), false);
24
24
  // Non-exec requests are never cacheable.
25
25
  assert.equal(isCoalescableSourceRequest({ kind: 'file', path: '/tmp/x' }), false);
26
26
  assert.equal(isCoalescableSourceRequest({ kind: 'http', method: 'GET', url: 'http://x' }), false);
27
27
  // Non-crtr bin, missing --json, or wrong arity must not match.
28
28
  assert.equal(isCoalescableSourceRequest(exec(['human', 'list', '--json'], { bin: 'sh' })), false);
29
29
  assert.equal(isCoalescableSourceRequest(exec(['human', 'list'])), false);
30
- assert.equal(isCoalescableSourceRequest(exec(['node', 'snapshot', '--json'])), false);
30
+ assert.equal(isCoalescableSourceRequest(exec(['node', 'inspect', 'snapshot', '--json'])), false);
31
31
  assert.equal(isCoalescableSourceRequest(exec(['node', 'inspect', 'show', '--json'])), false);
32
32
  });
@@ -1,4 +1,4 @@
1
- // server.ts — the unified `crtr web serve` host: the crouter web UI server.
1
+ // server.ts — the unified surface web server: the crouter web UI server.
2
2
  //
3
3
  // ONE long-running server process on the bound host that serves THREE concerns
4
4
  // on one origin (the §2 unified server):
@@ -13,7 +13,7 @@
13
13
  // • WS /node/<id> → open that node's ALREADY-running broker `view.sock`
14
14
  // and relay frames VERBATIM both directions. The relay
15
15
  // adds NOTHING — the browser is the SAME protocol peer
16
- // as `crtr attach`.
16
+ // as `crtr surface attach`.
17
17
  //
18
18
  // §0 ONE-WRITER INVARIANT: the WS relay is ONLY a socket relay. It NEVER calls
19
19
  // reviveNode, NEVER spawns `pi --session`, NEVER touches SessionManager, and
@@ -43,6 +43,12 @@ import { runSourceRequest } from '../../core/view/bridge.js';
43
43
  import { startEventHub } from './events.js';
44
44
  import { createDevServer } from './dev-server.js';
45
45
  import { SOURCE_CACHE_TTL_MS, isCoalescableSourceRequest } from './source-cache.js';
46
+ // ── Hearth product seam: model-auth lane (P3.3b, Silas-approved exception) ──
47
+ // This is the ONLY Hearth-aware import in this file. All OAuth/status/start/
48
+ // finish product logic lives in core/hearth/model-auth-guest.ts; this module
49
+ // provides only routing + relay-token enforcement for the lane (see the route
50
+ // block in startWebServer below).
51
+ import { handleHearthModelAuthRequest } from '../../core/hearth/model-auth-guest.js';
46
52
  const HERE = dirname(fileURLToPath(import.meta.url));
47
53
  /** Candidate dirs to serve the shell SPA bundle from, in priority order: an
48
54
  * explicit override, the compiled-module-relative `dist/web-client/` (what
@@ -189,7 +195,7 @@ function serveStatic(clientDir, req, res) {
189
195
  }
190
196
  if (!existsSync(filePath)) {
191
197
  res.writeHead(503, { 'content-type': 'text/plain; charset=utf-8' });
192
- res.end('crtr web shell bundle not found — run `npm run build` to emit it into ' +
198
+ res.end('crtr surface web shell bundle not found — run `npm run build` to emit it into ' +
193
199
  `${clientDir} (or pass --dev for Vite middleware)\n`);
194
200
  return;
195
201
  }
@@ -364,7 +370,7 @@ export async function startWebServer(opts) {
364
370
  const dev = opts.dev ?? false;
365
371
  const tokenRequired = !isLoopbackHost(host);
366
372
  if (tokenRequired && (token === undefined || token === '')) {
367
- throw new Error(`crtr web serve --host ${host} requires --token for remote-capable endpoints`);
373
+ throw new Error(`crtr surface web serve --host ${host} requires --token for remote-capable endpoints`);
368
374
  }
369
375
  const clientDir = resolveClientDir();
370
376
  // The bridge runs view sources + command verbs locally, in the cwd crtr was
@@ -441,6 +447,24 @@ export async function startWebServer(opts) {
441
447
  eventHub.addClient(res);
442
448
  return;
443
449
  }
450
+ // ── Hearth product seam: model-auth lane ──
451
+ // Isolated per the P3.3a/P3.3b approved exception. ALL Hearth/OAuth logic
452
+ // lives in core/hearth/model-auth-guest.ts; this block is ONLY routing +
453
+ // the relay-token gate. CRITICAL: this lane uses the STRICT token-only
454
+ // predicate requestTokenMatches(req, token), never requestAllowed() —
455
+ // requestAllowed() also accepts a same-origin loopback request with NO
456
+ // token at all, which would make this lane tokenless on local/dev binds.
457
+ // Every /__hearth/model-auth/* request fails closed (401) without an
458
+ // exact relay-token match, even on loopback.
459
+ if (pathname.startsWith('/__hearth/model-auth/anthropic/')) {
460
+ if (!requestTokenMatches(req, token)) {
461
+ res.writeHead(401, { 'content-type': 'text/plain; charset=utf-8' });
462
+ res.end('relay token required\n');
463
+ return;
464
+ }
465
+ void handleHearthModelAuthRequest(req, res);
466
+ return;
467
+ }
444
468
  // --dev: Vite middleware owns all remaining asset/HTML serving (incl. its
445
469
  // own SPA fallback). It is mounted AFTER the bridge + SSE checks above, so
446
470
  // those never fall through to Vite.
@@ -520,7 +544,7 @@ export async function startWebServer(opts) {
520
544
  // A server error AFTER listen (e.g. an accept failure) must not be an
521
545
  // unhandled 'error' that crashes the process (n9) — log + carry on.
522
546
  httpServer.on('error', (err) => {
523
- process.stderr.write(`crtr web: server error: ${err.message}\n`);
547
+ process.stderr.write(`crtr surface web: server error: ${err.message}\n`);
524
548
  });
525
549
  const addr = httpServer.address();
526
550
  const port = typeof addr === 'object' && addr !== null ? addr.port : opts.port;
@@ -12,7 +12,7 @@
12
12
  // (node new / canvas revive / node msg), file reads, http requests, and any
13
13
  // request carrying stdin or an overridden cwd are NEVER cacheable — caching
14
14
  // those would drop a mutation or serve a stale cross-cwd read. Target-dependent
15
- // reads (node snapshot/inspect for a specific id) ARE cacheable because the id
15
+ // reads (node inspect snapshot/show for a specific id) ARE cacheable because the id
16
16
  // is part of the request and therefore part of the coalescing key, so distinct
17
17
  // ids never collide.
18
18
  /** TTL for coalesced source reads. Must comfortably exceed the SSE debounce
@@ -26,8 +26,8 @@ export const SOURCE_CACHE_TTL_MS = 500;
26
26
  const CACHEABLE_READS = [
27
27
  ['canvas', 'snapshot', '--json'],
28
28
  ['human', 'list', '--json'],
29
- ['view', 'list', '--json'],
30
- ['node', 'snapshot', '*', '--json'],
29
+ ['surface', 'view', 'list', '--json'],
30
+ ['node', 'inspect', 'snapshot', '*', '--json'],
31
31
  ['node', 'inspect', 'show', '*', '--json'],
32
32
  ];
33
33
  function argsMatch(pattern, args) {
@@ -1,15 +1,15 @@
1
- // web-cmd.ts — the `crtr web` command leaf + registration.
1
+ // web-cmd.ts — the `crtr surface web` command leaf + registration.
2
2
  //
3
3
  // Starts the ONE long-running unified web server (server.ts): the crouter web UI
4
4
  // host. It serves the shell SPA, the source + command bridge (POST
5
5
  // /__crtr/source), the SSE change lane (GET /__crtr/events), and a VERBATIM
6
6
  // browser ⇄ broker relay on `ws://HOST:PORT/node/<id>` (the browser becomes
7
- // the SAME protocol peer as `crtr attach`). The node is selected by the URL, so
7
+ // the SAME protocol peer as surface attach). The node is selected by the URL, so
8
8
  // there is NO positional node here.
9
9
  //
10
10
  // Command shape (plan §3.6): the CLI path-walker forbids a flat top-level leaf
11
11
  // (`defineRoot.subtrees` is `BranchDef[]`), so `web` is a BRANCH wrapping a
12
- // single leaf: `crtr web serve`.
12
+ // single leaf: `crtr surface web serve`.
13
13
  import { spawn } from 'node:child_process';
14
14
  import { defineBranch, defineLeaf } from '../../core/command.js';
15
15
  import { startWebServer } from './server.js';
@@ -37,7 +37,7 @@ function openBrowser(url) {
37
37
  const webServeLeaf = defineLeaf({
38
38
  name: 'serve',
39
39
  description: 'start the crouter web UI server — the shell, the source/command bridge, and a browser ⇄ broker relay',
40
- whenToUse: 'you want the crouter web UI: a browser shell to watch the canvas and drive headless nodes, instead of a terminal pane. It starts ONE long-running server (default 127.0.0.1) that serves the shell SPA, the source + command bridge (POST /__crtr/source — views\' reads AND `crtr` command writes), an SSE change-invalidation lane (GET /__crtr/events), and a VERBATIM browser ⇄ broker relay on /node/<id> (the browser becomes the same protocol peer as `crtr attach`: one controller drives, extra viewers follow read-only). If you bind a non-loopback host, pass --token so the remote-capable bridge, SSE, and relay endpoints can authorize the page. The relay NEVER starts an engine — each node must already have a running headless broker (focus or revive it first); all writes flow through `crtr` subprocesses the bridge runs. Pass --dev for Vite middleware (HMR) while iterating on the shell. The server runs until ctrl+c; the node is picked in the browser via the URL, not on the command line.',
40
+ whenToUse: 'you want the crouter web UI: a browser shell to watch the canvas and drive headless nodes, instead of a terminal pane. It starts ONE long-running server (default 127.0.0.1) that serves the shell SPA, the source + command bridge (POST /__crtr/source — views\' reads AND `crtr` command writes), an SSE change-invalidation lane (GET /__crtr/events), and a VERBATIM browser ⇄ broker relay on /node/<id> (the browser becomes the same protocol peer as surface attach: one controller drives, extra viewers follow read-only). If you bind a non-loopback host, pass --token so the remote-capable bridge, SSE, and relay endpoints can authorize the page. The relay NEVER starts an engine — each node must already have a running headless broker (focus or revive it first); all writes flow through `crtr` subprocesses the bridge runs. Pass --dev for Vite middleware (HMR) while iterating on the shell. The server runs until ctrl+c; the node is picked in the browser via the URL, not on the command line.',
41
41
  help: {
42
42
  name: 'web serve',
43
43
  summary: 'start the long-running crouter web UI server: serves the shell SPA, the POST /__crtr/source bridge, the GET /__crtr/events SSE lane, and a VERBATIM browser ⇄ node-broker relay (browser picks the node via /node/<id>)',
@@ -100,7 +100,7 @@ const webServeLeaf = defineLeaf({
100
100
  const server = await startWebServer({ port, host, token, dev });
101
101
  const nodeUrlShape = `${server.url}/node/<id>`;
102
102
  const browserUrl = token !== undefined ? `${server.url}?token=${encodeURIComponent(token)}` : server.url;
103
- process.stdout.write(`crtr web serving on ${server.url}${dev ? ' (--dev: Vite middleware)' : ''}\n` +
103
+ process.stdout.write(`crtr surface web serving on ${server.url}${dev ? ' (--dev: Vite middleware)' : ''}\n` +
104
104
  ` open a node: ${nodeUrlShape}\n` +
105
105
  ` bridge: POST ${server.url}/__crtr/source\n` +
106
106
  ` events (SSE): GET ${server.url}/__crtr/events\n` +
@@ -127,12 +127,12 @@ export function registerWeb() {
127
127
  rootEntry: {
128
128
  concept: 'the crouter web UI server — one host serving the browser shell, the source/command bridge, an SSE change lane, and a VERBATIM relay to nodes\' running brokers',
129
129
  desc: 'serve the crouter web UI for the canvas and headless nodes',
130
- useWhen: 'you want the crouter web UI in a browser instead of a tmux pane: watch the canvas and drive headless nodes. It runs one long-lived server that serves the shell SPA, runs view sources + `crtr` command writes over POST /__crtr/source, streams canvas-change invalidations over GET /__crtr/events (SSE), and relays a browser connection VERBATIM to a node\'s already-running broker on /node/<id> — same protocol peer as `crtr attach`. The node is selected in the browser via the URL; if the server is bound off-loopback, the page must carry a token so the relay and bridge can authorize.',
130
+ useWhen: 'you want the crouter web UI in a browser instead of a tmux pane: watch the canvas and drive headless nodes. It runs one long-lived server that serves the shell SPA, runs view sources and crtr command writes over POST /__crtr/source, streams canvas-change invalidations over GET /__crtr/events, and relays a browser connection VERBATIM to a node\'s already-running broker on /node/<id>. The node is selected in the browser via the URL; if the server is bound off-loopback, the page must carry a token so the relay and bridge can authorize.',
131
131
  },
132
132
  help: {
133
133
  name: 'web',
134
134
  summary: 'serve the crouter web UI: the shell SPA, the source/command bridge, the SSE change lane, and a VERBATIM relay to headless nodes\' brokers',
135
- model: '`serve` starts the ONE long-running unified server on the bound host (--port, default 7878; --host defaults to 127.0.0.1; --token is required for non-loopback binds; --open to launch the browser; --dev for Vite middleware/HMR). It serves the shell SPA (static dist/web-client/ shipped, Vite middleware in --dev), the POST /__crtr/source bridge (views\' reads AND `crtr` command writes via the local exec/file/http transport), the GET /__crtr/events SSE change-invalidation lane, and on a browser ws://HOST:PORT/node/<id> connection opens that node\'s broker view.sock and relays frames VERBATIM both ways — the browser is the same protocol peer as `crtr attach` (one controller drives, extra viewers are read-only; arbitration + dialogs ride the same frames). The relay NEVER spawns pi or writes a session: the node must already have a running headless broker (focus or revive it first); all graph mutations flow through `crtr` subprocesses the bridge runs. The server keeps running until ctrl+c; the node is chosen in the browser via the URL, not on the command line.',
135
+ model: 'The branch is a long-running browser surface. `serve` starts the unified server on the bound host and port, serves the shell SPA, exposes the source/command bridge and SSE change lane, and relays browser frames to a node\'s running broker. The node is chosen in the browser via the URL; the server itself only hosts the surface and never spawns an engine.',
136
136
  },
137
137
  children: [webServeLeaf],
138
138
  });
@@ -70,7 +70,7 @@ export const issueNewLeaf = defineLeaf({
70
70
  name: 'canvas issue new',
71
71
  summary: 'Capture a free-text note as a GitHub issue labeled with its type (idea|bug). Reads the note from the popup TTY, auto-generates the title via a headless pi call, and files it with `gh issue create` when the cwd is a GitHub repo, else writes `<git-root>/.todos/<slug>.md`. Bound to the alt+c \u2192 i prefix chord.',
72
72
  params: [
73
- { kind: 'flag', name: 'type', type: 'string', required: true, constraint: 'Issue type / label: idea | bug.' },
73
+ { kind: 'flag', name: 'type', type: 'enum', choices: ['idea', 'bug'], required: true, constraint: 'Issue type / label.' },
74
74
  { kind: 'flag', name: 'body', type: 'string', required: false, constraint: 'The note text. Omit to read it from stdin/the popup TTY (type, Ctrl-D to submit).' },
75
75
  { kind: 'flag', name: 'cwd', type: 'string', required: false, constraint: 'Directory whose repo the issue targets. Defaults to --pane\u2019s path, then process.cwd().' },
76
76
  { kind: 'flag', name: 'pane', type: 'string', required: false, constraint: 'tmux pane whose cwd/client to use for repo resolution and the confirmation toast.' },
@@ -8,7 +8,7 @@
8
8
  //
9
9
  // Exported as a leaf; `crtr canvas` (canvas.ts) mounts it.
10
10
  import { defineLeaf } from '../core/command.js';
11
- import { pruneNodes } from '../core/canvas/index.js';
11
+ import { pruneNodes, pruneToLimit } from '../core/canvas/index.js';
12
12
  import { reapEmptyNodes } from '../core/runtime/placement.js';
13
13
  const DEFAULT_TTL_DAYS = 14;
14
14
  export const canvasPruneLeaf = defineLeaf({
@@ -17,8 +17,15 @@ export const canvasPruneLeaf = defineLeaf({
17
17
  whenToUse: 'you want to bound the canvas\u2019s on-disk growth \u2014 sweep away nodes that are finished (done), crashed (dead), or closed (canceled) and older than a retention window, reclaiming their rows, edges (cascade-deleted by the schema), and `nodes/<id>/` dirs. Run it as an operator/cron chore; live nodes (active/idle) are never touched, and you can preview the sweep before it deletes anything',
18
18
  help: {
19
19
  name: 'canvas prune',
20
- summary: 'delete terminal nodes older than a TTL (edges cascade, dirs removed); --dry-run to preview',
20
+ summary: 'delete terminal nodes older than a TTL (edges cascade, dirs removed); --max N for a count cap; --dry-run to preview',
21
21
  params: [
22
+ {
23
+ kind: 'flag',
24
+ name: 'max',
25
+ type: 'int',
26
+ required: false,
27
+ constraint: 'COUNT mode (instead of the TTL sweep): keep only the N most-recently-active nodes, deleting the oldest terminal nodes beyond the cap. LIVE nodes (active/idle with a running pi) are NEVER deleted, so the real floor is max(N, liveCount). Recency = telemetry.json mtime, falling back to created. Combine with --dry-run to preview.',
28
+ },
22
29
  {
23
30
  kind: 'flag',
24
31
  name: 'ttl',
@@ -60,6 +67,7 @@ export const canvasPruneLeaf = defineLeaf({
60
67
  ],
61
68
  outputKind: 'object',
62
69
  effects: [
70
+ 'With --max N: COUNT mode — keep only the N most-recently-active nodes, deleting the oldest terminal beyond max(N, liveCount); live (active/idle with a running pi) nodes and the caller are never deleted. Takes precedence over the TTL/--empty sweeps.',
63
71
  'Deletes matching `nodes` rows; their edges cascade-delete via the FK; each node\u2019s `nodes/<id>/` dir is removed.',
64
72
  'No-op on live nodes (active/idle) and on terminal nodes newer than the TTL. With --include-stale: also deletes active/idle nodes past the TTL whose process is gone (pi_pid null/dead); genuinely-running nodes and the caller are kept.',
65
73
  'Under --dry-run: read-only, deletes nothing.',
@@ -70,6 +78,20 @@ export const canvasPruneLeaf = defineLeaf({
70
78
  const dryRun = input['dryRun'] ?? false;
71
79
  const includeStale = input['includeStale'] ?? false;
72
80
  const empty = input['empty'] ?? false;
81
+ const maxNodes = input['max'];
82
+ if (maxNodes !== undefined) {
83
+ const result = pruneToLimit({ maxNodes, dryRun });
84
+ return {
85
+ pruned: dryRun ? 0 : result.pruned.length,
86
+ dryRun,
87
+ ttlDays,
88
+ nodes: result.pruned.map((p) => ({
89
+ node_id: p.node_id,
90
+ status: p.status,
91
+ created: p.created,
92
+ })),
93
+ };
94
+ }
73
95
  if (empty) {
74
96
  const ids = reapEmptyNodes({ dryRun });
75
97
  return {
@@ -15,6 +15,9 @@ export const canvasSnapshotLeaf = defineLeaf({
15
15
  ],
16
16
  outputKind: 'object',
17
17
  effects: ['Read-only: queries canvas.db, focus rows, telemetry files, and human ask counts.'],
18
+ // Machine-readable dump for the browser canvas, not for an agent/human to
19
+ // glance at — collapse it in the attach viewer by default.
20
+ preview: { suppressOutput: true },
18
21
  },
19
22
  run: async () => {
20
23
  const rows = dashboardRowsAll();
@@ -2,7 +2,7 @@
2
2
  //
3
3
  // Bound by the alt+c → `e` chord (config: prefixBinds['e'].run = "canvas
4
4
  // tmux-spread {self}"). It "expands" the graph you are watching: the caller's
5
- // own viewer pane is broken out into a BRAND-NEW window, then a `crtr attach`
5
+ // own viewer pane is broken out into a BRAND-NEW window, then a surface-attach
6
6
  // viewer pane is tiled beside it for every broker-alive node in the local
7
7
  // subtree (ancestry root → self → descendants), so the user lands on a single
8
8
  // window showing the whole live subtree at once.
@@ -51,7 +51,7 @@ export const tmuxSpreadLeaf = defineLeaf({
51
51
  whenToUse: 'you want the whole live subtree you are watching on one tiled tmux window at once — bound to the alt+c → e chord; rarely run by hand',
52
52
  help: {
53
53
  name: 'canvas tmux-spread',
54
- summary: 'Explode the local subtree into a tiled grid: break the caller\'s viewer pane into a brand-new window, then tile a `crtr attach` viewer pane beside it for every broker-alive node (status active/idle + live pi_pid) in the ancestry-root subtree, most-recently-active first, capped at 8 panes',
54
+ summary: 'Explode the local subtree into a tiled grid: break the caller\'s viewer pane into a brand-new window, then tile a surface-attach viewer pane beside it for every broker-alive node (status active/idle + live pi_pid) in the ancestry-root subtree, most-recently-active first, capped at 8 panes',
55
55
  params: [
56
56
  {
57
57
  kind: 'positional',
@@ -77,7 +77,7 @@ export const tmuxSpreadLeaf = defineLeaf({
77
77
  outputKind: 'object',
78
78
  effects: [
79
79
  'Breaks the caller\'s viewer pane into a brand-new tmux window (tmux break-pane).',
80
- 'Opens a `crtr attach` viewer pane (and a focuses row) for each shown sibling, moving any that had a viewer elsewhere into the spread.',
80
+ 'Opens a surface-attach viewer pane (and a focuses row) for each shown sibling, moving any that had a viewer elsewhere into the spread.',
81
81
  'Tiles the window and switches the client onto it.',
82
82
  ],
83
83
  },
@@ -20,7 +20,7 @@ export function registerHuman() {
20
20
  rootEntry: {
21
21
  concept: 'human-in-the-loop decisions, document review, and live display',
22
22
  desc: 'ask, review, notify, show, cancel, inbox, list',
23
- useWhen: 'you have a question for the user, want their feedback, or are presenting them with options or a choice — always reach for human instead of guessing or assuming, or laying a choice out as prose, when a person can decide; and whenever the user wants to review a spec, plan, or requirements document, this is the command (use `human review` for anchored line-by-line comments)'
23
+ useWhen: 'you have a question for the user, want their feedback, or are presenting them with options or a choice — always reach for human instead of guessing or assuming, or laying a choice out as prose, when a person can decide; and whenever the user wants to review a spec, plan, or requirements document, this is the command for anchored line-by-line comments.'
24
24
  },
25
25
  help: {
26
26
  name: 'human',
@@ -1,16 +1,16 @@
1
1
  // `crtr memory lint` — the permanent valid-YAML gate over the bounded corpus
2
2
  // (the CTO green-checkpoint: zero frontmatter parse errors at authoring time,
3
3
  // so an invalid doc fails HERE instead of being silently isolated at runtime).
4
- // Bounded corpus = the substrate memory dirs (project/user/builtin). Never a
5
- // filesystem-wide scan.
6
- import { basename, relative, sep } from 'node:path';
4
+ // Bounded corpus = the substrate memory dirs (ancestor projects/user/builtin).
5
+ // Never a filesystem-wide scan.
6
+ import { basename, join, relative, sep } from 'node:path';
7
7
  import { defineLeaf } from '../../core/command.js';
8
8
  import { general } from '../../core/errors.js';
9
9
  import { warn } from '../../core/output.js';
10
10
  import { pathExists, readText, walkFiles } from '../../core/fs-utils.js';
11
11
  import { parseFrontmatterGeneric } from '../../core/frontmatter.js';
12
- import { listInstalledPlugins } from '../../core/resolver.js';
13
- import { pluginMemoryDir, scopeMemoryDir } from '../../core/scope.js';
12
+ import { listInstalledPlugins, listInstalledPluginsInRoot } from '../../core/resolver.js';
13
+ import { pluginMemoryDir, projectScopeRoots, scopeMemoryDir } from '../../core/scope.js';
14
14
  import { isDocKind, RUNGS } from '../../core/substrate/index.js';
15
15
  /** The parser normalizes the `always` alias to `content`, so it lints valid. */
16
16
  const VALID_RUNGS = [...RUNGS, 'always'];
@@ -107,8 +107,8 @@ export const lintLeaf = defineLeaf({
107
107
  run: async () => {
108
108
  const findings = [];
109
109
  let memoryCount = 0;
110
- // Substrate memory stores (project/user/builtin), schema-aware. A scope's
111
- // corpus is its NATIVE memory dir plus each enabled plugin's memory dir —
110
+ // Substrate memory stores (ancestor projects/user/builtin), schema-aware.
111
+ // A source's corpus is its NATIVE memory dir plus each enabled plugin's memory dir —
112
112
  // plugin docs are substrate docs and lint through the same schema gate.
113
113
  // MEMORY.md index files are not substrate docs — YAML-parse only.
114
114
  const lintDir = (dir) => {
@@ -121,7 +121,14 @@ export const lintLeaf = defineLeaf({
121
121
  lintFile(file, basename(file) !== 'MEMORY.md', findings);
122
122
  }
123
123
  };
124
- for (const scope of ['project', 'user', 'builtin']) {
124
+ for (const root of projectScopeRoots()) {
125
+ lintDir(join(root, 'memory'));
126
+ for (const plugin of listInstalledPluginsInRoot('project', root)) {
127
+ if (plugin.enabled)
128
+ lintDir(pluginMemoryDir(plugin));
129
+ }
130
+ }
131
+ for (const scope of ['user', 'builtin']) {
125
132
  lintDir(scopeMemoryDir(scope));
126
133
  for (const plugin of listInstalledPlugins(scope)) {
127
134
  if (plugin.enabled)
@@ -0,0 +1 @@
1
+ export declare const originLeaf: import("../../core/command.js").LeafDef;
@@ -0,0 +1,88 @@
1
+ import { defineLeaf } from '../../core/command.js';
2
+ import { CrtrError, notFound } from '../../core/errors.js';
3
+ import { resolveMemoryDoc } from '../../core/memory-resolver.js';
4
+ import { getNode } from '../../core/canvas/canvas.js';
5
+ import { contextDir } from '../../core/canvas/paths.js';
6
+ export const originLeaf = defineLeaf({
7
+ name: 'origin',
8
+ description: 'deref a memory document back to the node + conversation that created it',
9
+ whenToUse: 'you are looking at a stored memory and want to know WHERE it came from — which node authored it, in what conversation, when, and in which project. Reads the `origin` provenance block the runtime stamps at creation and derefs the node pointer to its live session conversation, context dir, and current state. Docs hand-authored or created before provenance capture carry no origin — the command says so rather than guessing.',
10
+ help: {
11
+ name: 'memory origin',
12
+ summary: 'resolve a doc name to its creation provenance and deref the originating node',
13
+ params: [
14
+ { kind: 'positional', name: 'name', required: true, constraint: 'Path-derived memory identifier (e.g. `topic` or `area/topic`). Resolved across scopes: project > user > builtin.' },
15
+ ],
16
+ output: [
17
+ { name: 'name', type: 'string', required: true, constraint: 'Resolved document name.' },
18
+ { name: 'path', type: 'string', required: true, constraint: 'Absolute path to the document on disk.' },
19
+ { name: 'origin_recorded', type: 'boolean', required: true, constraint: 'true when the doc carries an `origin` provenance block; false for hand-authored or pre-provenance docs.' },
20
+ { name: 'created', type: 'string', required: false, constraint: 'ISO timestamp the doc was created. Absent when origin_recorded is false.' },
21
+ { name: 'cwd', type: 'string', required: false, constraint: 'Working directory the authoring conversation ran in.' },
22
+ { name: 'node', type: 'string', required: false, constraint: 'Node id that authored the doc, or null when written by a human at the CLI (no node).' },
23
+ { name: 'node_present', type: 'boolean', required: false, constraint: 'true when that node still exists on the canvas (deref below is live); false when it has been pruned.' },
24
+ { name: 'node_kind', type: 'string', required: false, constraint: 'Kind of the authoring node (only when node_present).' },
25
+ { name: 'node_mode', type: 'string', required: false, constraint: 'Mode of the authoring node (only when node_present).' },
26
+ { name: 'node_status', type: 'string', required: false, constraint: 'Current lifecycle status of the authoring node (only when node_present).' },
27
+ { name: 'node_description', type: 'string', required: false, constraint: 'The authoring node\u2019s description (only when node_present).' },
28
+ { name: 'session_file', type: 'string', required: false, constraint: 'Absolute path to the originating conversation\u2019s pi session .jsonl (only when node_present and a session was captured) \u2014 read it to see the conversation that produced the doc.' },
29
+ { name: 'context_dir', type: 'string', required: false, constraint: 'Absolute path to the authoring node\u2019s context dir (its shared document store).' },
30
+ { name: 'follow_up', type: 'string', required: true, constraint: 'Concrete next commands to inspect the origin.' },
31
+ ],
32
+ outputKind: 'object',
33
+ effects: ['None. Read-only.'],
34
+ },
35
+ run: async (input) => {
36
+ const nameRaw = input['name'];
37
+ let doc;
38
+ try {
39
+ doc = resolveMemoryDoc(nameRaw);
40
+ }
41
+ catch (e) {
42
+ if (!(e instanceof CrtrError && e.code === 'not_found'))
43
+ throw e;
44
+ }
45
+ if (doc === undefined) {
46
+ throw notFound(`memory document not found: ${nameRaw}`, {
47
+ memory: nameRaw,
48
+ next: 'Run `crtr memory find <query>` to discover documents, or `crtr memory list` to browse the inventory.',
49
+ });
50
+ }
51
+ const origin = doc.frontmatter?.['origin'];
52
+ if (origin === undefined || typeof origin !== 'object') {
53
+ return {
54
+ name: doc.name,
55
+ path: doc.path,
56
+ origin_recorded: false,
57
+ follow_up: 'No provenance recorded \u2014 this doc was hand-authored or created before provenance capture. Read its body with `crtr memory read ' +
58
+ doc.name +
59
+ '`.',
60
+ };
61
+ }
62
+ const str = (v) => (typeof v === 'string' ? v : null);
63
+ const nodeId = str(origin['node']);
64
+ const node = nodeId !== null ? getNode(nodeId) : null;
65
+ const sessionFile = str(node?.pi_session_file);
66
+ const followUp = node !== null
67
+ ? `Read the originating conversation at \`${sessionFile ?? '(no session captured)'}\`, browse its shared docs at \`${contextDir(nodeId)}\`, or attach live with \`crtr surface attach ${nodeId}\`.`
68
+ : nodeId !== null
69
+ ? `The authoring node \`${nodeId}\` has been pruned from the canvas; its context dir may persist at \`${contextDir(nodeId)}\`.`
70
+ : 'Authored by a human at the CLI \u2014 no node conversation to deref.';
71
+ return {
72
+ name: doc.name,
73
+ path: doc.path,
74
+ origin_recorded: true,
75
+ created: str(origin['created']) ?? undefined,
76
+ cwd: str(origin['cwd']) ?? undefined,
77
+ node: nodeId ?? undefined,
78
+ node_present: nodeId !== null ? node !== null : undefined,
79
+ node_kind: node?.kind ?? undefined,
80
+ node_mode: node?.mode ?? undefined,
81
+ node_status: node?.status ?? undefined,
82
+ node_description: node?.description ?? undefined,
83
+ session_file: sessionFile ?? undefined,
84
+ context_dir: nodeId !== null ? contextDir(nodeId) : undefined,
85
+ follow_up: followUp,
86
+ };
87
+ },
88
+ });
@@ -26,6 +26,14 @@ export declare function coerceReadWhen(raw: string): Record<string, unknown>;
26
26
  /** Coerce a `--applies-to` string to the schema's glob form: a comma-separated
27
27
  * list becomes an array, a single glob stays a string. */
28
28
  export declare function coerceAppliesTo(raw: string): unknown;
29
+ /** Provenance for a doc at the moment it is created: when, where, and which
30
+ * node's conversation authored it. Read from the env the runtime injects into
31
+ * every node's pi process (CRTR_NODE_ID/KIND/MODE/NODE_CWD); when invoked
32
+ * outside a node (a human at the CLI) only `created` + `cwd` are recorded.
33
+ * Stamped ONCE at create and preserved verbatim on every later update —
34
+ * `crtr memory origin <name>` derefs the `node` pointer back to the live node
35
+ * (its session conversation, context dir, current state). */
36
+ export declare function buildOrigin(): Record<string, unknown>;
29
37
  /** Serialize a substrate frontmatter record + body into a complete `.md`
30
38
  * document. Frontmatter is emitted as a `---` fenced YAML block (the `yaml`
31
39
  * package — the same one the parser uses — so nested gate maps and applies-to
@@ -102,7 +102,9 @@ export function coerceAppliesTo(raw) {
102
102
  return parts.length === 1 ? parts[0] : parts;
103
103
  }
104
104
  // Canonical frontmatter field order for a substrate document. Known fields come
105
- // first in this order; any preserved-on-update extras append after.
105
+ // first in this order; any preserved-on-update extras append after. `origin` is
106
+ // provenance the runtime stamps at creation (never the author) — it sorts last
107
+ // of the known fields so the authoring contract stays at the top of the block.
106
108
  const FRONTMATTER_ORDER = [
107
109
  'kind',
108
110
  'when-and-why-to-read',
@@ -112,7 +114,26 @@ const FRONTMATTER_ORDER = [
112
114
  'gate',
113
115
  'applies-to',
114
116
  'read-when',
117
+ 'origin',
115
118
  ];
119
+ /** Provenance for a doc at the moment it is created: when, where, and which
120
+ * node's conversation authored it. Read from the env the runtime injects into
121
+ * every node's pi process (CRTR_NODE_ID/KIND/MODE/NODE_CWD); when invoked
122
+ * outside a node (a human at the CLI) only `created` + `cwd` are recorded.
123
+ * Stamped ONCE at create and preserved verbatim on every later update —
124
+ * `crtr memory origin <name>` derefs the `node` pointer back to the live node
125
+ * (its session conversation, context dir, current state). */
126
+ export function buildOrigin() {
127
+ const env = process.env;
128
+ const origin = {
129
+ created: new Date().toISOString(),
130
+ cwd: env['CRTR_NODE_CWD'] ?? process.cwd(),
131
+ };
132
+ const nodeId = env['CRTR_NODE_ID'];
133
+ if (nodeId !== undefined && nodeId !== '')
134
+ origin['node'] = nodeId;
135
+ return origin;
136
+ }
116
137
  /** Serialize a substrate frontmatter record + body into a complete `.md`
117
138
  * document. Frontmatter is emitted as a `---` fenced YAML block (the `yaml`
118
139
  * package — the same one the parser uses — so nested gate maps and applies-to