@crouton-kit/crouter 0.3.33 → 0.3.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (617) hide show
  1. package/README.md +2 -2
  2. package/dist/build-root.js +3 -6
  3. package/dist/builtin-memory/crouter-development/marketplaces.md +6 -6
  4. package/dist/builtin-memory/crouter-development/plugins.md +13 -13
  5. package/dist/builtin-memory/internal/examples/imessage-assistant.md +3 -3
  6. package/dist/builtin-memory/internal/nodes-and-canvas.md +4 -4
  7. package/dist/builtin-personas/developer/PERSONA.md +1 -1
  8. package/dist/builtin-personas/orchestration-kernel.md +1 -1
  9. package/dist/builtin-personas/waiting.md +1 -1
  10. package/dist/builtin-pi-packages/pi-crtr-extensions/README.md +71 -0
  11. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/crtr-help-gate.test.ts +41 -0
  12. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/provider-rotation.test.ts +663 -0
  13. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +52 -0
  14. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +418 -0
  15. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crouter-help.ts +87 -0
  16. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crtr-commands/filters.json +7 -0
  17. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crtr-commands/index.ts +174 -0
  18. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crtr-help-gate.ts +408 -0
  19. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +442 -0
  20. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +119 -0
  21. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/nested-context.ts +327 -0
  22. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +574 -0
  23. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/statusline.ts +260 -0
  24. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/strip-skills-docs.ts +40 -0
  25. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/sysprompt-window.ts +19 -0
  26. package/dist/builtin-pi-packages/pi-crtr-extensions/lib/package.json +3 -0
  27. package/dist/builtin-pi-packages/pi-crtr-extensions/lib/subscription-state.js +1 -0
  28. package/dist/builtin-pi-packages/pi-crtr-extensions/lib/subscription-state.ts +479 -0
  29. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/LICENSE +13 -0
  30. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/README.md +172 -0
  31. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/bin.mjs +11 -0
  32. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-collection.js +88 -0
  33. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-doc.js +43 -0
  34. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-node.js +109 -0
  35. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-scalar.js +86 -0
  36. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/composer.js +219 -0
  37. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-block-map.js +115 -0
  38. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +198 -0
  39. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +49 -0
  40. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-end.js +37 -0
  41. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +207 -0
  42. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +225 -0
  43. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-props.js +146 -0
  44. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-contains-newline.js +34 -0
  45. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +26 -0
  46. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +15 -0
  47. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-map-includes.js +13 -0
  48. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/Document.js +335 -0
  49. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/anchors.js +71 -0
  50. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/applyReviver.js +55 -0
  51. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/createNode.js +88 -0
  52. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/directives.js +176 -0
  53. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/errors.js +57 -0
  54. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/index.js +17 -0
  55. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/log.js +11 -0
  56. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Alias.js +116 -0
  57. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Collection.js +147 -0
  58. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Node.js +38 -0
  59. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Pair.js +36 -0
  60. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Scalar.js +24 -0
  61. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/YAMLMap.js +144 -0
  62. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +113 -0
  63. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +63 -0
  64. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/identity.js +36 -0
  65. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/toJS.js +37 -0
  66. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst-scalar.js +214 -0
  67. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst-stringify.js +61 -0
  68. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst-visit.js +97 -0
  69. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst.js +98 -0
  70. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/lexer.js +721 -0
  71. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/line-counter.js +39 -0
  72. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/parser.js +975 -0
  73. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/public-api.js +102 -0
  74. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/Schema.js +37 -0
  75. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/map.js +17 -0
  76. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/null.js +15 -0
  77. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/seq.js +17 -0
  78. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/string.js +14 -0
  79. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/bool.js +19 -0
  80. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/float.js +43 -0
  81. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/int.js +38 -0
  82. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/schema.js +23 -0
  83. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/json/schema.js +62 -0
  84. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/tags.js +96 -0
  85. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +58 -0
  86. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +26 -0
  87. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +46 -0
  88. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +71 -0
  89. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +67 -0
  90. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +74 -0
  91. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +78 -0
  92. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +39 -0
  93. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +93 -0
  94. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +101 -0
  95. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +146 -0
  96. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringify.js +129 -0
  97. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +153 -0
  98. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyComment.js +20 -0
  99. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +85 -0
  100. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +25 -0
  101. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyPair.js +150 -0
  102. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyString.js +336 -0
  103. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/util.js +11 -0
  104. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/visit.js +233 -0
  105. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/index.js +5 -0
  106. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/package.json +3 -0
  107. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/cli.d.ts +8 -0
  108. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/cli.mjs +201 -0
  109. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-collection.d.ts +11 -0
  110. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-collection.js +90 -0
  111. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-doc.d.ts +7 -0
  112. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-doc.js +45 -0
  113. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-node.d.ts +29 -0
  114. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-node.js +112 -0
  115. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-scalar.d.ts +5 -0
  116. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-scalar.js +88 -0
  117. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/composer.d.ts +63 -0
  118. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/composer.js +224 -0
  119. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-map.d.ts +6 -0
  120. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-map.js +117 -0
  121. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +11 -0
  122. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-scalar.js +200 -0
  123. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +6 -0
  124. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-seq.js +51 -0
  125. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-end.d.ts +6 -0
  126. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-end.js +39 -0
  127. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +7 -0
  128. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-collection.js +209 -0
  129. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +10 -0
  130. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-scalar.js +227 -0
  131. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-props.d.ts +23 -0
  132. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-props.js +148 -0
  133. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-contains-newline.d.ts +2 -0
  134. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-contains-newline.js +36 -0
  135. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +2 -0
  136. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-empty-scalar-position.js +28 -0
  137. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +3 -0
  138. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-flow-indent-check.js +17 -0
  139. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-map-includes.d.ts +4 -0
  140. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-map-includes.js +15 -0
  141. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/Document.d.ts +141 -0
  142. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/Document.js +337 -0
  143. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/anchors.d.ts +24 -0
  144. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/anchors.js +76 -0
  145. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/applyReviver.d.ts +9 -0
  146. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/applyReviver.js +57 -0
  147. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/createNode.d.ts +17 -0
  148. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/createNode.js +90 -0
  149. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/directives.d.ts +49 -0
  150. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/directives.js +178 -0
  151. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/errors.d.ts +21 -0
  152. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/errors.js +62 -0
  153. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/index.d.ts +25 -0
  154. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/index.js +50 -0
  155. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/log.d.ts +3 -0
  156. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/log.js +19 -0
  157. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Alias.d.ts +29 -0
  158. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Alias.js +118 -0
  159. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Collection.d.ts +73 -0
  160. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Collection.js +151 -0
  161. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Node.d.ts +53 -0
  162. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Node.js +40 -0
  163. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Pair.d.ts +22 -0
  164. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Pair.js +39 -0
  165. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Scalar.d.ts +47 -0
  166. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Scalar.js +27 -0
  167. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLMap.d.ts +53 -0
  168. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLMap.js +147 -0
  169. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +60 -0
  170. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLSeq.js +115 -0
  171. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +4 -0
  172. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/addPairToJSMap.js +65 -0
  173. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/identity.d.ts +23 -0
  174. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/identity.js +53 -0
  175. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/toJS.d.ts +29 -0
  176. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/toJS.js +39 -0
  177. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/options.d.ts +350 -0
  178. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-scalar.d.ts +64 -0
  179. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-scalar.js +218 -0
  180. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-stringify.d.ts +8 -0
  181. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-stringify.js +63 -0
  182. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-visit.d.ts +39 -0
  183. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-visit.js +99 -0
  184. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst.d.ts +109 -0
  185. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst.js +112 -0
  186. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/lexer.d.ts +87 -0
  187. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/lexer.js +723 -0
  188. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/line-counter.d.ts +22 -0
  189. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/line-counter.js +41 -0
  190. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/parser.d.ts +84 -0
  191. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/parser.js +980 -0
  192. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/public-api.d.ts +44 -0
  193. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/public-api.js +107 -0
  194. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/Schema.d.ts +17 -0
  195. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/Schema.js +39 -0
  196. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/map.d.ts +2 -0
  197. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/map.js +19 -0
  198. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/null.d.ts +4 -0
  199. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/null.js +17 -0
  200. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/seq.d.ts +2 -0
  201. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/seq.js +19 -0
  202. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/string.d.ts +2 -0
  203. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/string.js +16 -0
  204. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/bool.d.ts +4 -0
  205. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/bool.js +21 -0
  206. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/float.d.ts +4 -0
  207. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/float.js +47 -0
  208. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/int.d.ts +4 -0
  209. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/int.js +42 -0
  210. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/schema.d.ts +1 -0
  211. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/schema.js +25 -0
  212. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/json/schema.d.ts +2 -0
  213. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/json/schema.js +64 -0
  214. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/json-schema.d.ts +69 -0
  215. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/tags.d.ts +48 -0
  216. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/tags.js +99 -0
  217. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/types.d.ts +92 -0
  218. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +2 -0
  219. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/binary.js +70 -0
  220. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +7 -0
  221. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/bool.js +29 -0
  222. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +4 -0
  223. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/float.js +50 -0
  224. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +5 -0
  225. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/int.js +76 -0
  226. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +9 -0
  227. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/merge.js +71 -0
  228. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +22 -0
  229. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/omap.js +77 -0
  230. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +10 -0
  231. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +82 -0
  232. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +1 -0
  233. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/schema.js +41 -0
  234. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +28 -0
  235. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/set.js +96 -0
  236. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +6 -0
  237. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +105 -0
  238. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +34 -0
  239. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/foldFlowLines.js +151 -0
  240. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringify.d.ts +21 -0
  241. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringify.js +132 -0
  242. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +17 -0
  243. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyCollection.js +155 -0
  244. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyComment.d.ts +10 -0
  245. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyComment.js +24 -0
  246. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +4 -0
  247. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyDocument.js +87 -0
  248. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +2 -0
  249. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyNumber.js +27 -0
  250. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyPair.d.ts +3 -0
  251. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyPair.js +152 -0
  252. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyString.d.ts +9 -0
  253. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyString.js +338 -0
  254. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/test-events.d.ts +4 -0
  255. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/test-events.js +134 -0
  256. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/util.d.ts +16 -0
  257. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/util.js +28 -0
  258. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/visit.d.ts +102 -0
  259. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/visit.js +236 -0
  260. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/package.json +97 -0
  261. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/util.js +2 -0
  262. package/dist/builtin-pi-packages/pi-crtr-extensions/package-lock.json +3385 -0
  263. package/dist/builtin-pi-packages/pi-crtr-extensions/package.json +25 -0
  264. package/dist/builtin-pi-packages/pi-mode-switch/README.md +64 -0
  265. package/dist/builtin-pi-packages/pi-mode-switch/bin/mode +40 -0
  266. package/dist/builtin-pi-packages/pi-mode-switch/extensions/index.ts +427 -0
  267. package/dist/builtin-pi-packages/pi-mode-switch/package.json +13 -0
  268. package/dist/clients/attach/__tests__/crtr-output-coverage.test.js +55 -0
  269. package/dist/clients/attach/__tests__/crtr-output-render.test.js +2340 -0
  270. package/dist/clients/attach/attach-cmd.js +843 -743
  271. package/dist/clients/attach/auth-pickers.js +2 -2
  272. package/dist/clients/attach/canvas-panels.js +1 -1
  273. package/dist/clients/attach/chat-view.d.ts +3 -2
  274. package/dist/clients/attach/chat-view.js +30 -10
  275. package/dist/clients/attach/clipboard-image.js +1 -1
  276. package/dist/clients/attach/clipboard-text.js +1 -1
  277. package/dist/clients/attach/config-load.js +1 -1
  278. package/dist/clients/attach/crtr-output-render.d.ts +48 -0
  279. package/dist/clients/attach/crtr-output-render.js +646 -0
  280. package/dist/clients/attach/extension-dialogs.js +1 -1
  281. package/dist/clients/attach/graph-overlay.js +3 -3
  282. package/dist/clients/attach/input-controller.js +1 -1
  283. package/dist/clients/attach/pickers.js +1 -1
  284. package/dist/clients/attach/slash-commands.js +5 -6
  285. package/dist/clients/attach/titled-editor.d.ts +4 -0
  286. package/dist/clients/attach/titled-editor.js +13 -1
  287. package/dist/clients/attach/view-socket.js +1 -1
  288. package/dist/clients/web/__tests__/source-cache.test.js +5 -5
  289. package/dist/clients/web/server.js +29 -5
  290. package/dist/clients/web/source-cache.js +3 -3
  291. package/dist/clients/web/web-cmd.js +7 -7
  292. package/dist/commands/canvas-issue.js +1 -1
  293. package/dist/commands/canvas-prune.js +24 -2
  294. package/dist/commands/canvas-snapshot.js +3 -0
  295. package/dist/commands/canvas-tmux-spread.js +3 -3
  296. package/dist/commands/human.js +1 -1
  297. package/dist/commands/memory/lint.js +15 -8
  298. package/dist/commands/memory/origin.d.ts +1 -0
  299. package/dist/commands/memory/origin.js +88 -0
  300. package/dist/commands/memory/shared.d.ts +8 -0
  301. package/dist/commands/memory/shared.js +22 -1
  302. package/dist/commands/memory/write.js +17 -12
  303. package/dist/commands/memory.js +4 -3
  304. package/dist/commands/node-context.js +4 -4
  305. package/dist/commands/node-snapshot.js +4 -1
  306. package/dist/commands/node.d.ts +2 -2
  307. package/dist/commands/node.js +814 -606
  308. package/dist/commands/pkg/market-inspect.d.ts +2 -1
  309. package/dist/commands/pkg/market-inspect.js +14 -32
  310. package/dist/commands/pkg/market-manage.d.ts +3 -1
  311. package/dist/commands/pkg/market-manage.js +58 -154
  312. package/dist/commands/pkg/market.js +7 -7
  313. package/dist/commands/pkg/plugin-inspect.d.ts +2 -1
  314. package/dist/commands/pkg/plugin-inspect.js +8 -24
  315. package/dist/commands/pkg/plugin-manage.d.ts +5 -1
  316. package/dist/commands/pkg/plugin-manage.js +245 -171
  317. package/dist/commands/pkg/plugin.js +6 -6
  318. package/dist/commands/pkg.js +5 -5
  319. package/dist/commands/revive.js +5 -3
  320. package/dist/commands/search/answer.js +1 -1
  321. package/dist/commands/search/contents.js +1 -1
  322. package/dist/commands/search/web.js +2 -2
  323. package/dist/commands/search.js +1 -1
  324. package/dist/commands/surface.d.ts +2 -0
  325. package/dist/commands/surface.js +43 -0
  326. package/dist/commands/sys/promptstudio.js +1 -1
  327. package/dist/commands/sys/settings.js +2 -2
  328. package/dist/commands/sys/setup-core.d.ts +88 -0
  329. package/dist/commands/sys/setup-core.js +352 -0
  330. package/dist/commands/sys/setup.d.ts +2 -0
  331. package/dist/commands/sys/setup.js +516 -0
  332. package/dist/commands/sys/sysprompt.js +3 -0
  333. package/dist/commands/sys.js +3 -2
  334. package/dist/commands/view-cycle.js +5 -5
  335. package/dist/commands/view-list.js +3 -3
  336. package/dist/commands/view-new.js +5 -5
  337. package/dist/commands/view-pick.js +6 -6
  338. package/dist/commands/view-run.js +14 -14
  339. package/dist/commands/view.js +3 -3
  340. package/dist/commands/workspace.js +10 -10
  341. package/dist/core/__tests__/boot.test.js +140 -0
  342. package/dist/core/__tests__/broker-sdk-wiring.test.js +6 -27
  343. package/dist/core/__tests__/daemon-boot.test.js +22 -0
  344. package/dist/core/__tests__/fixtures/fake-engine.js +19 -9
  345. package/dist/core/__tests__/flagship-lifecycle.test.js +4 -1
  346. package/dist/core/__tests__/full/broker-attach-limits.test.js +1 -1
  347. package/dist/core/__tests__/full/broker-attach-stream.test.js +1 -1
  348. package/dist/core/__tests__/full/broker-crash-teardown.test.js +10 -5
  349. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +1 -1
  350. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +2 -2
  351. package/dist/core/__tests__/full/broker-pane-resolution.test.js +1 -1
  352. package/dist/core/__tests__/full/cascade-close.test.js +31 -18
  353. package/dist/core/__tests__/full/detach-focus.test.js +17 -3
  354. package/dist/core/__tests__/hearth-bootstrap.test.js +136 -0
  355. package/dist/core/__tests__/helpers/harness.js +1 -1
  356. package/dist/core/__tests__/live-mutation-verbs.test.js +17 -11
  357. package/dist/core/__tests__/live-mutation.test.js +15 -10
  358. package/dist/core/__tests__/migration.test.js +124 -0
  359. package/dist/core/__tests__/on-read-dedup-resume.test.js +40 -0
  360. package/dist/core/__tests__/preview-registry-sync.test.js +36 -0
  361. package/dist/core/__tests__/prune-to-limit.test.js +91 -0
  362. package/dist/core/__tests__/revive.test.js +64 -21
  363. package/dist/core/__tests__/trigger-migration.test.js +48 -0
  364. package/dist/core/__tests__/wake-bearings.test.js +23 -21
  365. package/dist/core/__tests__/wake-origin.test.js +36 -33
  366. package/dist/core/canvas/boot.d.ts +48 -0
  367. package/dist/core/canvas/boot.js +157 -0
  368. package/dist/core/canvas/canvas.d.ts +27 -1
  369. package/dist/core/canvas/canvas.js +86 -5
  370. package/dist/core/canvas/db.js +86 -1
  371. package/dist/core/canvas/index.d.ts +1 -1
  372. package/dist/core/canvas/index.js +1 -1
  373. package/dist/core/canvas/nav-model.js +1 -1
  374. package/dist/core/canvas/pid.d.ts +6 -0
  375. package/dist/core/canvas/pid.js +13 -0
  376. package/dist/core/canvas/triggers.d.ts +108 -0
  377. package/dist/core/canvas/triggers.js +320 -0
  378. package/dist/core/canvas/types.d.ts +128 -46
  379. package/dist/core/command.js +13 -4
  380. package/dist/core/hearth/__tests__/model-auth-guest.test.js +151 -0
  381. package/dist/core/hearth/config.d.ts +1 -0
  382. package/dist/core/hearth/config.js +36 -3
  383. package/dist/core/hearth/guest-env.d.ts +7 -0
  384. package/dist/core/hearth/guest-env.js +17 -1
  385. package/dist/core/hearth/index.d.ts +0 -1
  386. package/dist/core/hearth/index.js +0 -1
  387. package/dist/core/hearth/model-auth-guest.d.ts +8 -0
  388. package/dist/core/hearth/model-auth-guest.js +430 -0
  389. package/dist/core/hearth/provider.d.ts +13 -6
  390. package/dist/core/hearth/providers/blaxel-bootstrap.d.ts +2 -0
  391. package/dist/core/hearth/providers/blaxel-bootstrap.js +127 -19
  392. package/dist/core/hearth/providers/blaxel-home.d.ts +8 -4
  393. package/dist/core/hearth/providers/blaxel-home.js +85 -75
  394. package/dist/core/hearth/providers/blaxel.d.ts +5 -0
  395. package/dist/core/hearth/providers/blaxel.js +86 -12
  396. package/dist/core/hearth/providers/types.d.ts +6 -1
  397. package/dist/core/hearth/types.d.ts +35 -1
  398. package/dist/core/help.d.ts +16 -0
  399. package/dist/core/help.js +2 -0
  400. package/dist/core/memory-resolver.d.ts +8 -8
  401. package/dist/core/memory-resolver.js +58 -26
  402. package/dist/core/preview-registry.d.ts +25 -0
  403. package/dist/core/preview-registry.js +2047 -0
  404. package/dist/core/resolver.d.ts +1 -0
  405. package/dist/core/resolver.js +23 -16
  406. package/dist/core/runtime/bearings.d.ts +11 -10
  407. package/dist/core/runtime/bearings.js +8 -8
  408. package/dist/core/runtime/broker-protocol.d.ts +2 -2
  409. package/dist/core/runtime/broker-protocol.js +2 -2
  410. package/dist/core/runtime/close.js +2 -2
  411. package/dist/core/runtime/kickoff.js +1 -1
  412. package/dist/core/runtime/launch.d.ts +9 -3
  413. package/dist/core/runtime/launch.js +17 -9
  414. package/dist/core/runtime/lifecycle.js +7 -7
  415. package/dist/core/runtime/model-swap.js +1 -1
  416. package/dist/core/runtime/placement.d.ts +5 -5
  417. package/dist/core/runtime/placement.js +10 -10
  418. package/dist/core/runtime/recycle.js +7 -7
  419. package/dist/core/runtime/reset.d.ts +1 -1
  420. package/dist/core/runtime/reset.js +3 -3
  421. package/dist/core/runtime/revive-all.d.ts +5 -2
  422. package/dist/core/runtime/revive-all.js +5 -2
  423. package/dist/core/runtime/revive.d.ts +15 -8
  424. package/dist/core/runtime/revive.js +52 -16
  425. package/dist/core/runtime/spawn.d.ts +1 -1
  426. package/dist/core/runtime/spawn.js +7 -7
  427. package/dist/core/runtime/stop-guard.js +5 -5
  428. package/dist/core/runtime/surface-bg.js +1 -1
  429. package/dist/core/runtime/tmux.d.ts +1 -1
  430. package/dist/core/runtime/tmux.js +4 -4
  431. package/dist/core/scope.d.ts +9 -0
  432. package/dist/core/scope.js +37 -15
  433. package/dist/core/substrate/on-read.js +23 -21
  434. package/dist/core/substrate/render.js +3 -3
  435. package/dist/core/view/loader.js +2 -2
  436. package/dist/core/wake.d.ts +2 -2
  437. package/dist/core/wake.js +7 -7
  438. package/dist/daemon/__tests__/predicate-eval.test.js +109 -0
  439. package/dist/daemon/crtrd.js +222 -103
  440. package/dist/daemon/predicate-eval.d.ts +52 -0
  441. package/dist/daemon/predicate-eval.js +248 -0
  442. package/dist/hearth/control-plane/__tests__/node-message.test.js +60 -0
  443. package/dist/hearth/control-plane/__tests__/rate-limit-recurrence.test.js +49 -0
  444. package/dist/hearth/control-plane/__tests__/relay-security.test.js +314 -0
  445. package/dist/hearth/control-plane/__tests__/scheduler-scan-loop.test.js +133 -0
  446. package/dist/hearth/control-plane/__tests__/trigger-delivery.test.js +170 -0
  447. package/dist/hearth/control-plane/__tests__/webhook-ingress.test.js +167 -0
  448. package/dist/hearth/control-plane/config.d.ts +21 -0
  449. package/dist/hearth/control-plane/config.js +77 -0
  450. package/dist/hearth/control-plane/db.d.ts +30 -0
  451. package/dist/hearth/control-plane/db.js +534 -0
  452. package/dist/hearth/control-plane/ingress/rate-limit.d.ts +24 -0
  453. package/dist/hearth/control-plane/ingress/rate-limit.js +100 -0
  454. package/dist/hearth/control-plane/ingress/route-store.d.ts +31 -0
  455. package/dist/hearth/control-plane/ingress/route-store.js +61 -0
  456. package/dist/hearth/control-plane/ingress/webhook-delivery-store.d.ts +41 -0
  457. package/dist/hearth/control-plane/ingress/webhook-delivery-store.js +69 -0
  458. package/dist/hearth/control-plane/ingress/webhook-route.d.ts +55 -0
  459. package/dist/hearth/control-plane/ingress/webhook-route.js +285 -0
  460. package/dist/hearth/control-plane/main.js +88 -0
  461. package/dist/hearth/control-plane/node-message.d.ts +31 -0
  462. package/dist/hearth/control-plane/node-message.js +98 -0
  463. package/dist/hearth/control-plane/register.d.ts +15 -0
  464. package/dist/hearth/control-plane/register.js +34 -0
  465. package/dist/hearth/control-plane/registry.d.ts +17 -0
  466. package/dist/hearth/control-plane/registry.js +161 -0
  467. package/dist/hearth/control-plane/relay.d.ts +40 -0
  468. package/dist/hearth/{wake-proxy/proxy.js → control-plane/relay.js} +201 -275
  469. package/dist/hearth/control-plane/scheduler/fire-store.d.ts +36 -0
  470. package/dist/hearth/control-plane/scheduler/fire-store.js +73 -0
  471. package/dist/hearth/control-plane/scheduler/recurrence.d.ts +7 -0
  472. package/dist/hearth/control-plane/scheduler/recurrence.js +58 -0
  473. package/dist/hearth/control-plane/scheduler/scan-loop.d.ts +38 -0
  474. package/dist/hearth/control-plane/scheduler/scan-loop.js +138 -0
  475. package/dist/hearth/control-plane/scheduler/schedule-store.d.ts +32 -0
  476. package/dist/hearth/control-plane/scheduler/schedule-store.js +66 -0
  477. package/dist/hearth/control-plane/secrets.d.ts +17 -0
  478. package/dist/hearth/control-plane/secrets.js +113 -0
  479. package/dist/hearth/control-plane/server.d.ts +27 -0
  480. package/dist/hearth/control-plane/server.js +346 -0
  481. package/dist/hearth/control-plane/session.d.ts +68 -0
  482. package/dist/hearth/control-plane/session.js +273 -0
  483. package/dist/hearth/control-plane/triggers/acl.d.ts +14 -0
  484. package/dist/hearth/control-plane/triggers/acl.js +52 -0
  485. package/dist/hearth/control-plane/triggers/audit-store.d.ts +38 -0
  486. package/dist/hearth/control-plane/triggers/audit-store.js +79 -0
  487. package/dist/hearth/control-plane/triggers/deliver.d.ts +43 -0
  488. package/dist/hearth/control-plane/triggers/deliver.js +76 -0
  489. package/dist/hearth/control-plane/triggers/envelope.d.ts +29 -0
  490. package/dist/hearth/control-plane/triggers/envelope.js +38 -0
  491. package/dist/hearth/control-plane/types.d.ts +66 -0
  492. package/dist/hearth/control-plane/wake.d.ts +80 -0
  493. package/dist/hearth/control-plane/wake.js +312 -0
  494. package/dist/pi-extensions/canvas-doc-substrate.js +28 -2
  495. package/dist/pi-extensions/canvas-nav.js +1 -1
  496. package/dist/prompts/view.js +7 -8
  497. package/dist/types.js +4 -4
  498. package/dist/web-client/assets/index-DUThOUzU.css +2 -0
  499. package/dist/web-client/assets/index-IAJVtuVe.js +80 -0
  500. package/dist/web-client/index.html +2 -2
  501. package/package.json +12 -9
  502. package/scripts/postinstall.mjs +8 -0
  503. package/dist/clients/attach/__tests__/action-parity.test.js +0 -48
  504. package/dist/clients/attach/__tests__/autocomplete-and-bash-mode.test.js +0 -96
  505. package/dist/clients/attach/__tests__/bash-bang-routing.test.js +0 -58
  506. package/dist/clients/attach/__tests__/bundle-pi-tui-dedup.test.js +0 -56
  507. package/dist/clients/attach/__tests__/clipboard-image.test.js +0 -76
  508. package/dist/clients/attach/__tests__/editor-newline.test.js +0 -82
  509. package/dist/clients/attach/__tests__/git-info.test.js +0 -31
  510. package/dist/clients/attach/__tests__/onrequest-wired.test.js +0 -20
  511. package/dist/clients/attach/__tests__/reconnect-giveup.test.js +0 -30
  512. package/dist/clients/attach/__tests__/slash-quit-copy.test.js +0 -42
  513. package/dist/clients/attach/__tests__/titled-editor.test.js +0 -60
  514. package/dist/commands/memory/__tests__/lint-schema.test.js +0 -52
  515. package/dist/core/__tests__/argv-parser.test.js +0 -217
  516. package/dist/core/__tests__/artifact-paths.test.js +0 -44
  517. package/dist/core/__tests__/draw-style.test.js +0 -258
  518. package/dist/core/__tests__/editor-label.test.d.ts +0 -1
  519. package/dist/core/__tests__/editor-label.test.js +0 -26
  520. package/dist/core/__tests__/fault-marker.test.d.ts +0 -1
  521. package/dist/core/__tests__/fault-marker.test.js +0 -112
  522. package/dist/core/__tests__/fault-retry-rewind.test.d.ts +0 -1
  523. package/dist/core/__tests__/fault-retry-rewind.test.js +0 -123
  524. package/dist/core/__tests__/frame-decoder-perf.test.d.ts +0 -1
  525. package/dist/core/__tests__/frame-decoder-perf.test.js +0 -224
  526. package/dist/core/__tests__/keystone.test.d.ts +0 -1
  527. package/dist/core/__tests__/keystone.test.js +0 -185
  528. package/dist/core/__tests__/listing-completeness.test.d.ts +0 -1
  529. package/dist/core/__tests__/listing-completeness.test.js +0 -31
  530. package/dist/core/__tests__/memory-resolver.test.d.ts +0 -1
  531. package/dist/core/__tests__/memory-resolver.test.js +0 -119
  532. package/dist/core/__tests__/memory.test.d.ts +0 -1
  533. package/dist/core/__tests__/memory.test.js +0 -60
  534. package/dist/core/__tests__/model-ladders.test.d.ts +0 -1
  535. package/dist/core/__tests__/model-ladders.test.js +0 -160
  536. package/dist/core/__tests__/node-env.test.d.ts +0 -1
  537. package/dist/core/__tests__/node-env.test.js +0 -26
  538. package/dist/core/__tests__/pane-column.test.d.ts +0 -1
  539. package/dist/core/__tests__/pane-column.test.js +0 -153
  540. package/dist/core/__tests__/persona-compose.test.d.ts +0 -1
  541. package/dist/core/__tests__/persona-compose.test.js +0 -53
  542. package/dist/core/__tests__/persona-subkind.test.d.ts +0 -1
  543. package/dist/core/__tests__/persona-subkind.test.js +0 -65
  544. package/dist/core/__tests__/persona.test.d.ts +0 -1
  545. package/dist/core/__tests__/persona.test.js +0 -107
  546. package/dist/core/__tests__/unknown-path.test.d.ts +0 -1
  547. package/dist/core/__tests__/unknown-path.test.js +0 -58
  548. package/dist/core/canvas/wakeups.d.ts +0 -76
  549. package/dist/core/canvas/wakeups.js +0 -185
  550. package/dist/core/hearth/registry.d.ts +0 -15
  551. package/dist/core/hearth/registry.js +0 -179
  552. package/dist/hearth/wake-proxy/__tests__/anthropic-oauth.test.d.ts +0 -1
  553. package/dist/hearth/wake-proxy/__tests__/anthropic-oauth.test.js +0 -289
  554. package/dist/hearth/wake-proxy/__tests__/config-timeout.test.d.ts +0 -1
  555. package/dist/hearth/wake-proxy/__tests__/config-timeout.test.js +0 -34
  556. package/dist/hearth/wake-proxy/__tests__/guest-source.test.d.ts +0 -1
  557. package/dist/hearth/wake-proxy/__tests__/guest-source.test.js +0 -203
  558. package/dist/hearth/wake-proxy/__tests__/hardening.test.d.ts +0 -1
  559. package/dist/hearth/wake-proxy/__tests__/hardening.test.js +0 -59
  560. package/dist/hearth/wake-proxy/__tests__/hearth-status-route.test.d.ts +0 -1
  561. package/dist/hearth/wake-proxy/__tests__/hearth-status-route.test.js +0 -372
  562. package/dist/hearth/wake-proxy/__tests__/http-running-route-fast-path.test.d.ts +0 -1
  563. package/dist/hearth/wake-proxy/__tests__/http-running-route-fast-path.test.js +0 -258
  564. package/dist/hearth/wake-proxy/__tests__/model-auth-routes.test.d.ts +0 -1
  565. package/dist/hearth/wake-proxy/__tests__/model-auth-routes.test.js +0 -437
  566. package/dist/hearth/wake-proxy/__tests__/source-bridge-gate.test.d.ts +0 -1
  567. package/dist/hearth/wake-proxy/__tests__/source-bridge-gate.test.js +0 -455
  568. package/dist/hearth/wake-proxy/__tests__/static-asset-allowlist.test.d.ts +0 -1
  569. package/dist/hearth/wake-proxy/__tests__/static-asset-allowlist.test.js +0 -15
  570. package/dist/hearth/wake-proxy/__tests__/warm-path-concurrency.test.d.ts +0 -1
  571. package/dist/hearth/wake-proxy/__tests__/warm-path-concurrency.test.js +0 -141
  572. package/dist/hearth/wake-proxy/__tests__/ws-teardown-accounting.test.d.ts +0 -1
  573. package/dist/hearth/wake-proxy/__tests__/ws-teardown-accounting.test.js +0 -143
  574. package/dist/hearth/wake-proxy/anthropic-oauth.d.ts +0 -58
  575. package/dist/hearth/wake-proxy/anthropic-oauth.js +0 -189
  576. package/dist/hearth/wake-proxy/auth.d.ts +0 -22
  577. package/dist/hearth/wake-proxy/auth.js +0 -128
  578. package/dist/hearth/wake-proxy/config.d.ts +0 -2
  579. package/dist/hearth/wake-proxy/config.js +0 -151
  580. package/dist/hearth/wake-proxy/guest-source.d.ts +0 -14
  581. package/dist/hearth/wake-proxy/guest-source.js +0 -130
  582. package/dist/hearth/wake-proxy/hearth-status.d.ts +0 -44
  583. package/dist/hearth/wake-proxy/hearth-status.js +0 -267
  584. package/dist/hearth/wake-proxy/home.d.ts +0 -67
  585. package/dist/hearth/wake-proxy/home.js +0 -297
  586. package/dist/hearth/wake-proxy/main.js +0 -134
  587. package/dist/hearth/wake-proxy/model-auth.d.ts +0 -13
  588. package/dist/hearth/wake-proxy/model-auth.js +0 -345
  589. package/dist/hearth/wake-proxy/proxy.d.ts +0 -35
  590. package/dist/hearth/wake-proxy/public-source-gate.d.ts +0 -9
  591. package/dist/hearth/wake-proxy/public-source-gate.js +0 -409
  592. package/dist/hearth/wake-proxy/redact.d.ts +0 -1
  593. package/dist/hearth/wake-proxy/redact.js +0 -17
  594. package/dist/hearth/wake-proxy/server.d.ts +0 -11
  595. package/dist/hearth/wake-proxy/server.js +0 -142
  596. package/dist/hearth/wake-proxy/state.d.ts +0 -18
  597. package/dist/hearth/wake-proxy/state.js +0 -342
  598. package/dist/hearth/wake-proxy/types.d.ts +0 -76
  599. package/dist/web-client/assets/index-BZUxTkv5.css +0 -2
  600. package/dist/web-client/assets/index-D36PNBj4.js +0 -80
  601. /package/dist/clients/attach/__tests__/{action-parity.test.d.ts → crtr-output-coverage.test.d.ts} +0 -0
  602. /package/dist/clients/attach/__tests__/{autocomplete-and-bash-mode.test.d.ts → crtr-output-render.test.d.ts} +0 -0
  603. /package/dist/{clients/attach/__tests__/bash-bang-routing.test.d.ts → core/__tests__/boot.test.d.ts} +0 -0
  604. /package/dist/{clients/attach/__tests__/bundle-pi-tui-dedup.test.d.ts → core/__tests__/hearth-bootstrap.test.d.ts} +0 -0
  605. /package/dist/{clients/attach/__tests__/clipboard-image.test.d.ts → core/__tests__/preview-registry-sync.test.d.ts} +0 -0
  606. /package/dist/{clients/attach/__tests__/editor-newline.test.d.ts → core/__tests__/prune-to-limit.test.d.ts} +0 -0
  607. /package/dist/{clients/attach/__tests__/git-info.test.d.ts → core/__tests__/trigger-migration.test.d.ts} +0 -0
  608. /package/dist/{clients/attach/__tests__/onrequest-wired.test.d.ts → core/hearth/__tests__/model-auth-guest.test.d.ts} +0 -0
  609. /package/dist/{clients/attach/__tests__/reconnect-giveup.test.d.ts → daemon/__tests__/predicate-eval.test.d.ts} +0 -0
  610. /package/dist/{clients/attach/__tests__/slash-quit-copy.test.d.ts → hearth/control-plane/__tests__/node-message.test.d.ts} +0 -0
  611. /package/dist/{clients/attach/__tests__/titled-editor.test.d.ts → hearth/control-plane/__tests__/rate-limit-recurrence.test.d.ts} +0 -0
  612. /package/dist/{commands/memory/__tests__/lint-schema.test.d.ts → hearth/control-plane/__tests__/relay-security.test.d.ts} +0 -0
  613. /package/dist/{core/__tests__/argv-parser.test.d.ts → hearth/control-plane/__tests__/scheduler-scan-loop.test.d.ts} +0 -0
  614. /package/dist/{core/__tests__/artifact-paths.test.d.ts → hearth/control-plane/__tests__/trigger-delivery.test.d.ts} +0 -0
  615. /package/dist/{core/__tests__/draw-style.test.d.ts → hearth/control-plane/__tests__/webhook-ingress.test.d.ts} +0 -0
  616. /package/dist/hearth/{wake-proxy → control-plane}/main.d.ts +0 -0
  617. /package/dist/hearth/{wake-proxy → control-plane}/types.js +0 -0
@@ -20,6 +20,7 @@ import { mkdtempSync, mkdirSync, rmSync, writeFileSync, existsSync } from 'node:
20
20
  import { tmpdir } from 'node:os';
21
21
  import { join } from 'node:path';
22
22
  import { closeDb } from '../canvas/db.js';
23
+ import { resetScopeCache } from '../scope.js';
23
24
  import { injectedDocsPath } from '../canvas/paths.js';
24
25
  import { spawnNode } from '../runtime/nodes.js';
25
26
  import { renderOnReadDocs } from '../substrate/on-read.js';
@@ -27,20 +28,32 @@ import { loadInjectedDocs, saveInjectedDocs, clearInjectedDocs, } from '../subst
27
28
  const FIXTURE_BODY = 'Fixture body that must surface exactly once.';
28
29
  let home;
29
30
  let work;
31
+ let prevHomeEnv;
30
32
  before(() => {
31
33
  home = mkdtempSync(join(tmpdir(), 'crtr-onread-home-'));
32
34
  process.env['CRTR_HOME'] = home;
35
+ prevHomeEnv = process.env['HOME'];
33
36
  });
34
37
  beforeEach(() => {
35
38
  closeDb();
39
+ resetScopeCache();
36
40
  rmSync(home, { recursive: true, force: true });
41
+ if (prevHomeEnv === undefined)
42
+ delete process.env['HOME'];
43
+ else
44
+ process.env['HOME'] = prevHomeEnv;
37
45
  work = mkdtempSync(join(tmpdir(), 'crtr-onread-work-'));
38
46
  });
39
47
  after(() => {
40
48
  closeDb();
49
+ resetScopeCache();
41
50
  rmSync(home, { recursive: true, force: true });
42
51
  rmSync(work, { recursive: true, force: true });
43
52
  delete process.env['CRTR_HOME'];
53
+ if (prevHomeEnv === undefined)
54
+ delete process.env['HOME'];
55
+ else
56
+ process.env['HOME'] = prevHomeEnv;
44
57
  });
45
58
  test('injected-store round-trips and clears', () => {
46
59
  const node = spawnNode({ kind: 'general', cwd: work, parent: null }).node_id;
@@ -51,6 +64,33 @@ test('injected-store round-trips and clears', () => {
51
64
  assert.ok(!existsSync(injectedDocsPath(node)), 'clear removes the file');
52
65
  assert.deepEqual([...loadInjectedDocs(node)], [], 'load after clear is empty');
53
66
  });
67
+ test('user-global memory docs do not fire positionally for every file under home', () => {
68
+ const fakeHome = mkdtempSync(join(tmpdir(), 'crtr-onread-user-home-'));
69
+ process.env['HOME'] = fakeHome;
70
+ resetScopeCache();
71
+ const node = spawnNode({ kind: 'general', cwd: join(fakeHome, 'work'), parent: null }).node_id;
72
+ const userMemDir = join(fakeHome, '.crouter', 'memory');
73
+ mkdirSync(userMemDir, { recursive: true });
74
+ writeFileSync(join(userMemDir, 'noisy-global.md'), '---\nkind: preference\n' +
75
+ 'when-and-why-to-read: When reading any file, this preference should be read because this fixture must not fire positionally\n' +
76
+ 'file-read-visibility: content\n---\n' +
77
+ 'NOISY USER BODY\n');
78
+ const projectMemDir = join(fakeHome, 'work', '.crouter', 'memory');
79
+ mkdirSync(projectMemDir, { recursive: true });
80
+ writeFileSync(join(projectMemDir, 'local.md'), '---\nkind: knowledge\n' +
81
+ 'when-and-why-to-read: When reading project files, this reference should be read because local project memories remain positional\n' +
82
+ 'file-read-visibility: content\n---\n' +
83
+ 'LOCAL PROJECT BODY\n');
84
+ const readFile = join(fakeHome, 'work', 'ideas.md');
85
+ writeFileSync(readFile, 'turn off xml closer\n');
86
+ const rendered = renderOnReadDocs(node, readFile, new Set());
87
+ assert.ok(!rendered.includes('NOISY USER BODY'), 'user-global doc is not positional');
88
+ assert.ok(rendered.includes('LOCAL PROJECT BODY'), 'project doc still fires positionally');
89
+ assert.ok(rendered.includes('<memory kind="knowledge" name="local"'), 'memory docs render as memory tags');
90
+ assert.ok(!rendered.includes('triggered-by='), 'read target is not repeated on child items');
91
+ assert.ok(!rendered.includes('<auto-loaded-context file='), 'read target is not repeated on the wrapper');
92
+ rmSync(fakeHome, { recursive: true, force: true });
93
+ });
54
94
  test('on-read doc surfaces once, stays deduped across a revive(resume), re-surfaces after a fresh launch', () => {
55
95
  const node = spawnNode({ kind: 'general', cwd: work, parent: null }).node_id;
56
96
  // A positional substrate doc in a `.crouter/memory/` ancestor of the read file.
@@ -0,0 +1,36 @@
1
+ // Drift guard for the attach-viewer's bundle-safe preview registry.
2
+ // Run with: node --import tsx/esm --test src/core/__tests__/preview-registry-sync.test.ts
3
+ //
4
+ // src/core/preview-registry.ts is a hand-maintained, zero-import mirror of
5
+ // every leaf's `help.preview.suppressOutput` — it has to be hand-maintained
6
+ // (not computed) because the attach viewer can never import the live command
7
+ // tree (build-root.ts pulls in every subtree, including the web client's
8
+ // Tailwind native binary — see command-preview-implementation.md). This test
9
+ // is the only thing that keeps the mirror honest: it walks the real,
10
+ // buildRoot()-assembled tree (safe here — this is a test, not the attach
11
+ // bundle) and asserts the set of leaves declaring `suppressOutput: true`
12
+ // matches the registry exactly.
13
+ import { test } from 'node:test';
14
+ import assert from 'node:assert/strict';
15
+ import { buildRoot } from '../../build-root.js';
16
+ import { SUPPRESS_OUTPUT_LEAVES } from '../preview-registry.js';
17
+ test('preview-registry.ts matches every leaf declaring help.preview.suppressOutput', async () => {
18
+ const root = await buildRoot();
19
+ const declared = new Set();
20
+ const walk = (branch) => {
21
+ for (const child of branch.children) {
22
+ if (child.kind === 'branch') {
23
+ walk(child);
24
+ }
25
+ else {
26
+ const leaf = child;
27
+ if (leaf.help.preview?.suppressOutput === true)
28
+ declared.add(leaf.help.name);
29
+ }
30
+ }
31
+ };
32
+ for (const subtree of root.subtrees)
33
+ walk(subtree);
34
+ assert.deepEqual([...declared].sort(), [...SUPPRESS_OUTPUT_LEAVES].sort(), 'src/core/preview-registry.ts is out of sync with the leaves that declare ' +
35
+ 'help.preview.suppressOutput — update SUPPRESS_OUTPUT_LEAVES to match.');
36
+ });
@@ -0,0 +1,91 @@
1
+ import { test, before, after, beforeEach } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { mkdtempSync, rmSync, existsSync } from 'node:fs';
4
+ import { tmpdir } from 'node:os';
5
+ import { join } from 'node:path';
6
+ import { createNode, getRow, recordPid, pruneToLimit, } from '../canvas/canvas.js';
7
+ import { closeDb } from '../canvas/db.js';
8
+ import { nodeDir } from '../canvas/paths.js';
9
+ let home;
10
+ // A timestamp `secondsAgo` before now — created order doubles as recency order
11
+ // here (no telemetry.json is written, so recencyMs falls back to created epoch).
12
+ const at = (secondsAgo) => new Date(Date.now() - secondsAgo * 1000).toISOString();
13
+ function node(id, over = {}) {
14
+ return {
15
+ node_id: id,
16
+ name: id,
17
+ created: at(0),
18
+ cwd: '/tmp/work',
19
+ kind: 'general',
20
+ mode: 'base',
21
+ lifecycle: 'terminal',
22
+ status: 'dead',
23
+ ...over,
24
+ };
25
+ }
26
+ before(() => {
27
+ home = mkdtempSync(join(tmpdir(), 'crtr-prune-limit-'));
28
+ process.env['CRTR_HOME'] = home;
29
+ });
30
+ beforeEach(() => {
31
+ closeDb();
32
+ rmSync(home, { recursive: true, force: true });
33
+ });
34
+ after(() => {
35
+ closeDb();
36
+ rmSync(home, { recursive: true, force: true });
37
+ delete process.env['CRTR_HOME'];
38
+ delete process.env['CRTR_NODE_ID'];
39
+ });
40
+ test('keeps all live nodes even when liveCount exceeds the cap', () => {
41
+ // 5 live (active/idle with a running pi) + 2 old terminal; cap of 3.
42
+ // target = max(3, 5) = 5, so NO live node is ever deleted; the 2 terminal
43
+ // fall beyond rank 5 and are pruned.
44
+ for (let i = 0; i < 5; i++) {
45
+ createNode(node(`live-${i}`, { status: 'active', created: at(i) }));
46
+ recordPid(`live-${i}`, process.pid); // process.pid is alive → isPidAlive true
47
+ }
48
+ createNode(node('old-a', { status: 'dead', created: at(100) }));
49
+ createNode(node('old-b', { status: 'done', created: at(101) }));
50
+ const result = pruneToLimit({ maxNodes: 3 });
51
+ assert.equal(result.dryRun, false);
52
+ assert.deepEqual(result.pruned.map((p) => p.node_id).sort(), ['old-a', 'old-b']);
53
+ for (let i = 0; i < 5; i++) {
54
+ assert.ok(getRow(`live-${i}`) !== null, `live-${i} must survive past the cap`);
55
+ }
56
+ });
57
+ test('deletes the oldest terminal nodes beyond max(cap, liveCount)', () => {
58
+ // 1 live + 5 terminal of descending recency; cap of 3 → target = max(3,1) = 3.
59
+ // Ranked by recency DESC: live-0, term-0, term-1 (top 3, kept), then
60
+ // term-2, term-3, term-4 (rank >= 3, pruned).
61
+ createNode(node('live-0', { status: 'idle', created: at(0) }));
62
+ recordPid('live-0', process.pid);
63
+ for (let i = 0; i < 5; i++) {
64
+ createNode(node(`term-${i}`, { status: 'dead', created: at(10 + i) }));
65
+ }
66
+ const result = pruneToLimit({ maxNodes: 3 });
67
+ assert.deepEqual(result.pruned.map((p) => p.node_id).sort(), ['term-2', 'term-3', 'term-4']);
68
+ // The kept set: the live node + the two newest terminal.
69
+ for (const id of ['live-0', 'term-0', 'term-1']) {
70
+ assert.ok(getRow(id) !== null, `${id} must survive`);
71
+ assert.ok(existsSync(nodeDir(id)), `${id} dir must survive`);
72
+ }
73
+ // The pruned set: rows AND dirs gone.
74
+ for (const id of ['term-2', 'term-3', 'term-4']) {
75
+ assert.equal(getRow(id), null, `${id} row should be pruned`);
76
+ assert.ok(!existsSync(nodeDir(id)), `${id} dir should be removed`);
77
+ }
78
+ });
79
+ test('--dry-run reports candidates but deletes nothing', () => {
80
+ for (let i = 0; i < 5; i++) {
81
+ createNode(node(`term-${i}`, { status: 'dead', created: at(i) }));
82
+ }
83
+ const result = pruneToLimit({ maxNodes: 3, dryRun: true });
84
+ assert.equal(result.dryRun, true);
85
+ assert.deepEqual(result.pruned.map((p) => p.node_id).sort(), ['term-3', 'term-4']);
86
+ // Nothing deleted — all rows + dirs intact.
87
+ for (let i = 0; i < 5; i++) {
88
+ assert.ok(getRow(`term-${i}`) !== null, `term-${i} must survive a dry run`);
89
+ assert.ok(existsSync(nodeDir(`term-${i}`)), `term-${i} dir must survive a dry run`);
90
+ }
91
+ });
@@ -93,41 +93,54 @@ after(() => {
93
93
  // ---------------------------------------------------------------------------
94
94
  // resumeArgs — the pure resume-source selection
95
95
  // ---------------------------------------------------------------------------
96
- test('resumeArgs prefers the absolute file path and keeps the id as fallback', () => {
97
- const m = node('n', { pi_session_id: 'uuid-123', pi_session_file: '/abs/sess.jsonl' });
98
- assert.deepEqual(resumeArgs(m, true), {
99
- resumeSessionId: 'uuid-123',
100
- resumeSessionPath: '/abs/sess.jsonl',
101
- });
96
+ test('resumeArgs resumes by the absolute file path when it exists on disk', () => {
97
+ mkdirSync(home, { recursive: true });
98
+ const sessionFile = join(home, 'resume-args-exists.jsonl');
99
+ writeFileSync(sessionFile, '{}\n', 'utf8');
100
+ const m = node('n', { pi_session_id: 'uuid-123', pi_session_file: sessionFile });
101
+ assert.deepEqual(resumeArgs(m, true), { resumeSessionPath: sessionFile });
102
102
  });
103
- test('resumeArgs falls back to the bare id when no file was captured (older node)', () => {
103
+ test('resumeArgs selects nothing (falls through to fresh) when no file was ever captured (older node)', () => {
104
104
  const m = node('n', { pi_session_id: 'uuid-123', pi_session_file: null });
105
- assert.deepEqual(resumeArgs(m, true), {
106
- resumeSessionId: 'uuid-123',
107
- resumeSessionPath: undefined,
105
+ assert.deepEqual(resumeArgs(m, true), {});
106
+ });
107
+ test('resumeArgs selects nothing (falls through to fresh) when the recorded file does not exist on disk', () => {
108
+ // The related P6 finding: pi_session_file can be recorded in meta with
109
+ // nothing ever written there (the first-boot engine died before
110
+ // session_start). A bare id is NOT a safe fallback either —
111
+ // headlessBrokerHost's preflight fatally rejects it — so this must select
112
+ // NEITHER source, not silently hand pi a path that isn't there.
113
+ const m = node('n', {
114
+ pi_session_id: 'uuid-123',
115
+ pi_session_file: join(home, 'never-written.jsonl'),
108
116
  });
117
+ assert.deepEqual(resumeArgs(m, true), {});
109
118
  });
110
119
  test('resumeArgs selects neither source on a no-resume (refresh) revive', () => {
111
- const m = node('n', { pi_session_id: 'uuid-123', pi_session_file: '/abs/sess.jsonl' });
120
+ mkdirSync(home, { recursive: true });
121
+ const sessionFile = join(home, 'resume-args-refresh.jsonl');
122
+ writeFileSync(sessionFile, '{}\n', 'utf8');
123
+ const m = node('n', { pi_session_id: 'uuid-123', pi_session_file: sessionFile });
112
124
  assert.deepEqual(resumeArgs(m, false), {});
113
125
  });
114
126
  // ---------------------------------------------------------------------------
115
127
  // buildPiArgv — the `--session` argument the revive builds
116
128
  // ---------------------------------------------------------------------------
117
- test('buildPiArgv resumes by ABSOLUTE path when pi_session_file is set (not the uuid)', () => {
118
- const m = node('n', { pi_session_id: 'uuid-123', pi_session_file: '/abs/sess.jsonl' });
129
+ test('buildPiArgv resumes by ABSOLUTE path when pi_session_file exists on disk', () => {
130
+ mkdirSync(home, { recursive: true });
131
+ const sessionFile = join(home, 'build-argv-exists.jsonl');
132
+ writeFileSync(sessionFile, '{}\n', 'utf8');
133
+ const m = node('n', { pi_session_id: 'uuid-123', pi_session_file: sessionFile });
119
134
  const { argv } = buildPiArgv(m, resumeArgs(m, true));
120
135
  const i = argv.indexOf('--session');
121
136
  assert.ok(i >= 0, 'argv carries --session');
122
- assert.equal(argv[i + 1], '/abs/sess.jsonl', 'resumes by absolute file path');
123
- assert.ok(!argv.includes('uuid-123'), 'the bare uuid is NOT used when a path exists');
137
+ assert.equal(argv[i + 1], sessionFile, 'resumes by absolute file path');
138
+ assert.ok(!argv.includes('uuid-123'), 'the bare uuid is never used to resume');
124
139
  });
125
- test('buildPiArgv falls back to --session <uuid> when no path is stored', () => {
140
+ test('buildPiArgv passes no --session when no path is stored (falls through to fresh)', () => {
126
141
  const m = node('n', { pi_session_id: 'uuid-123', pi_session_file: null });
127
142
  const { argv } = buildPiArgv(m, resumeArgs(m, true));
128
- const i = argv.indexOf('--session');
129
- assert.ok(i >= 0, 'argv carries --session');
130
- assert.equal(argv[i + 1], 'uuid-123', 'resumes by bare uuid (older node)');
143
+ assert.ok(!argv.includes('--session'), 'no bare-uuid resume — a bare id is fatally rejected by broker preflight');
131
144
  });
132
145
  test('buildPiArgv passes no --session on a fresh (no-resume) launch', () => {
133
146
  const m = node('n', { pi_session_id: 'uuid-123', pi_session_file: '/abs/sess.jsonl' });
@@ -140,11 +153,14 @@ test('buildPiArgv passes no --session on a fresh (no-resume) launch', () => {
140
153
  // (kind/mode/lifecycle come back as the node's *current* self).
141
154
  // ---------------------------------------------------------------------------
142
155
  test('a resumed revive replays the persisted LaunchSpec (model, tools, extensions, prompt, env)', () => {
156
+ mkdirSync(home, { recursive: true });
157
+ const sessionFile = join(home, 'launchspec-replay.jsonl');
158
+ writeFileSync(sessionFile, '{}\n', 'utf8');
143
159
  const m = node('n', {
144
160
  kind: 'developer',
145
161
  mode: 'orchestrator',
146
162
  pi_session_id: 'uuid-9',
147
- pi_session_file: '/abs/sess.jsonl',
163
+ pi_session_file: sessionFile,
148
164
  launch: {
149
165
  model: 'anthropic/sonnet',
150
166
  tools: ['bash', 'read'],
@@ -167,7 +183,7 @@ test('a resumed revive replays the persisted LaunchSpec (model, tools, extension
167
183
  assert.equal(argv[ti + 1], 'bash,read');
168
184
  assert.ok(argv.includes('--append-system-prompt'), 'system prompt replayed');
169
185
  const si = argv.indexOf('--session');
170
- assert.equal(argv[si + 1], '/abs/sess.jsonl', 'still resumes by file path');
186
+ assert.equal(argv[si + 1], sessionFile, 'still resumes by file path');
171
187
  // Env contract: launch-spec env merged over the node identity env.
172
188
  assert.equal(env['FOO'], 'bar');
173
189
  assert.equal(env['CRTR_NODE_ID'], 'n');
@@ -230,6 +246,33 @@ test('reviveNode PROCEEDS when the broker engine is DOWN (dead pid) — cycle co
230
246
  await h.dispose();
231
247
  }
232
248
  });
249
+ test('reviveNode fresh-fallback clears the stale session identity (Major-3: no phantom stranded-relaunch)', async () => {
250
+ const h = await createHarness({ headless: true, sessionPrefix: 'crtr-revive-freshfb' });
251
+ try {
252
+ // resume=true was ASKED, but the recorded .jsonl is gone from disk, so
253
+ // resumeArgs falls through to a FRESH launch. The stale pi_session_id /
254
+ // pi_session_file must be cleared BEFORE launch: if this fresh broker then
255
+ // dies before session_start (no new pid, no new session), the daemon keys on
256
+ // pi_session_id — a leftover id would be misread as a stranded relaunch and
257
+ // retried forever instead of surfaced as a boot failure.
258
+ const missingFile = join(home, 'sessions', 'never-written.jsonl');
259
+ const M = h.fabricateBrokerNode({
260
+ status: 'active',
261
+ intent: null,
262
+ pi_pid: deadPid(),
263
+ pi_session_id: 'uuid-stale',
264
+ pi_session_file: missingFile,
265
+ });
266
+ const res = reviveNode(M, { resume: true });
267
+ assert.equal(res.resumed, false, 'a missing .jsonl forces a fresh (non-resuming) launch');
268
+ const after = h.node(M);
269
+ assert.equal(after.pi_session_id, null, 'stale pi_session_id cleared before the fresh launch');
270
+ assert.equal(after.pi_session_file, null, 'stale pi_session_file cleared before the fresh launch');
271
+ }
272
+ finally {
273
+ await h.dispose();
274
+ }
275
+ });
233
276
  test('reviveNode crashes and clears pid when launch/preflight throws', async () => {
234
277
  const h = await createHarness({ headless: true, sessionPrefix: 'crtr-revive-fail' });
235
278
  const originalLaunch = headlessBrokerHost.launch;
@@ -0,0 +1,48 @@
1
+ // Regression for final-integrated-verdict finding #3: the v7 (`wakeups`) →
2
+ // v9 (`triggers`) migration must preserve a deadline wakeup's `fire_at`
3
+ // exactly, not just its `trigger_type`/`node_id`. Drives the real migration
4
+ // steps (`MIGRATIONS[6]` = appendWakeupsTable/v7, `MIGRATIONS[8]` =
5
+ // migrateWakeupsToTriggers/v9) directly against a bare `DatabaseSync`, seeding
6
+ // a v7-shaped `wakeups` row by hand — see `src/core/canvas/db.ts`.
7
+ import { test, before, after } from 'node:test';
8
+ import assert from 'node:assert/strict';
9
+ import { mkdtempSync, rmSync } from 'node:fs';
10
+ import { tmpdir } from 'node:os';
11
+ import { join } from 'node:path';
12
+ import { DatabaseSync } from 'node:sqlite';
13
+ import { MIGRATIONS } from '../canvas/db.js';
14
+ let home;
15
+ before(() => {
16
+ home = mkdtempSync(join(tmpdir(), 'crtr-trigger-migration-'));
17
+ });
18
+ after(() => {
19
+ rmSync(home, { recursive: true, force: true });
20
+ });
21
+ test('v7->v9 migration preserves a deadline wakeup\'s fire_at exactly', () => {
22
+ const db = new DatabaseSync(join(home, 'migration.db'));
23
+ try {
24
+ db.exec('PRAGMA foreign_keys = ON;');
25
+ // v1 — nodes/edges baseline (MIGRATIONS[0]); triggers.node_id's FK needs a
26
+ // real nodes row to reference.
27
+ MIGRATIONS[0](db);
28
+ const created = new Date().toISOString();
29
+ db.prepare(`INSERT INTO nodes (node_id, name, kind, cwd, created) VALUES (?, ?, ?, ?, ?)`).run('target-node', 'target-node', 'general', '/tmp/work', created);
30
+ // v7 — the wakeups table (MIGRATIONS[6]).
31
+ MIGRATIONS[6](db);
32
+ const fireAt = '2026-01-01T12:34:56.000Z';
33
+ db.prepare(`INSERT INTO wakeups (wakeup_id, node_id, owner_id, fire_at, kind, recur, payload, created)
34
+ VALUES (?, ?, ?, ?, 'deadline', NULL, ?, ?)`).run('wk-1', 'target-node', 'target-node', fireAt, JSON.stringify({ body: 'time is up', timeout: true, label: 'deadline' }), created);
35
+ // v9 — generalize wakeups into triggers (MIGRATIONS[8]).
36
+ MIGRATIONS[8](db);
37
+ const row = db.prepare('SELECT * FROM triggers WHERE trigger_id = ?').get('wk-1');
38
+ assert.ok(row, 'migrated trigger row should exist under the preserved wakeup_id');
39
+ assert.equal(row['trigger_type'], 'until');
40
+ assert.equal(row['action_mode'], 'deadline_message');
41
+ // The literal required assertion (verdict finding #3): fire_at must survive
42
+ // the migration byte-for-byte, not just the trigger_type/action_mode shape.
43
+ assert.equal(row['fire_at'], fireAt);
44
+ }
45
+ finally {
46
+ db.close();
47
+ }
48
+ });
@@ -1,12 +1,13 @@
1
1
  // Run with: node --import tsx/esm --test src/core/__tests__/wake-bearings.test.ts
2
2
  //
3
- // Wake-origin self-knowledge (the <crtr-wake> provenance block). Regression
3
+ // Trigger-origin self-knowledge (the <crtr-wake> provenance block). Regression
4
4
  // guard for the observed gap: a node woken or BORN by a scheduled TIMER could
5
- // not tell it came from a timer — a scheduled wake arrived indistinguishable
5
+ // not tell it came from a timer — a fired trigger arrived indistinguishable
6
6
  // from an ordinary refresh/message (the Invariant B/D anti-goal). These lock:
7
- // • buildWakeBearings renders the right decision-first block per wake kind /
8
- // cadence, and never crashes when the armer was reaped (no resolved name);
9
- // • the bare-wake revive kickoff carries that block (so a scheduled alarm is
7
+ // • buildWakeBearings renders the right decision-first block per trigger
8
+ // kind / cadence, and never crashes when the armer was reaped (no resolved
9
+ // name);
10
+ // • the fresh-revive kickoff carries that block (so a scheduled alarm is
10
11
  // distinguishable from a generic context-refresh), placed AFTER the kickoff
11
12
  // sentinel (goal-capture keys on it) and BEFORE the roadmap/disk bearings;
12
13
  // • an ordinary fresh revive (no wakeReason) carries NO block.
@@ -47,9 +48,9 @@ after(() => {
47
48
  delete process.env['CRTR_HOME'];
48
49
  });
49
50
  // --- buildWakeBearings: one per kind / cadence variant ----------------------
50
- test('spawn one-shot: names a deferred birth + the armer, and says it does not recur', () => {
51
+ test('node_birth one-shot: names a deferred birth + the armer, and says it does not recur', () => {
51
52
  const o = {
52
- kind: 'spawn',
53
+ kind: 'node_birth',
53
54
  ownerId: 'arm-1',
54
55
  ownerName: 'release-orch',
55
56
  armedAt: ARMED,
@@ -64,9 +65,9 @@ test('spawn one-shot: names a deferred birth + the armer, and says it does not r
64
65
  assert.match(b, /only run, not a recurring job/);
65
66
  assert.match(b, /Your task follows\./);
66
67
  });
67
- test('spawn cron: surfaces the cadence + frames it as one run of a standing job', () => {
68
+ test('node_birth cron: surfaces the cadence + frames it as one run of a standing job', () => {
68
69
  const o = {
69
- kind: 'spawn',
70
+ kind: 'node_birth',
70
71
  ownerId: 'arm-1',
71
72
  ownerName: 'nightly',
72
73
  armedAt: ARMED,
@@ -79,9 +80,9 @@ test('spawn cron: surfaces the cadence + frames it as one run of a standing job'
79
80
  assert.match(b, /one run of a standing job, not a one-off/);
80
81
  assert.match(b, /inherit nothing from prior runs but this task/);
81
82
  });
82
- test('spawn interval cron: renders the every-N cadence', () => {
83
+ test('node_birth interval cron: renders the every-N cadence', () => {
83
84
  const o = {
84
- kind: 'spawn',
85
+ kind: 'node_birth',
85
86
  ownerId: 'arm-1',
86
87
  ownerName: 'poller',
87
88
  armedAt: ARMED,
@@ -89,9 +90,9 @@ test('spawn interval cron: renders the every-N cadence', () => {
89
90
  };
90
91
  assert.match(buildWakeBearings(o), /firing every 6h/);
91
92
  });
92
- test('spawn with a reaped armer: renders the bare id, no name, never crashes', () => {
93
+ test('node_birth with a reaped armer: renders the bare id, no name, never crashes', () => {
93
94
  const o = {
94
- kind: 'spawn',
95
+ kind: 'node_birth',
95
96
  ownerId: 'gone-9',
96
97
  ownerName: undefined, // armer no longer exists → no resolved name
97
98
  armedAt: ARMED,
@@ -101,20 +102,21 @@ test('spawn with a reaped armer: renders the bare id, no name, never crashes', (
101
102
  assert.match(b, /armed by node gone-9 \(now gone\)/); // bare id, flagged reaped
102
103
  assert.doesNotMatch(b, /\("/); // never an empty/dangling name
103
104
  });
104
- test('bare one-shot: frames a timed re-check, NOT a new request', () => {
105
- const o = { kind: 'bare', ownerId: 'n1', ownerName: 'n1', armedAt: ARMED, recur: null };
105
+ test('fresh_revive one-shot: frames a timed re-check, NOT a new request', () => {
106
+ const o = { kind: 'fresh_revive', ownerId: 'n1', ownerName: 'n1', armedAt: ARMED, recur: null };
106
107
  const b = buildWakeBearings(o);
107
108
  assert.match(b, /a scheduled alarm fired/);
108
109
  assert.match(b, /a timer, NOT a new message or request/);
109
110
  assert.match(b, /timed re-check, not a new task/);
110
111
  assert.match(b, /re-read your roadmap/);
111
- // No armer attribution on bare (could be `--node`-armed by another), no ISO.
112
+ // No armer attribution on a bare revive (could be `--node`-armed by another),
113
+ // no ISO.
112
114
  assert.doesNotMatch(b, /you set/);
113
115
  assert.doesNotMatch(b, new RegExp(ARMED));
114
116
  });
115
- test('bare recurring: frames one tick of a standing re-check + the cadence', () => {
117
+ test('fresh_revive recurring: frames one tick of a standing re-check + the cadence', () => {
116
118
  const o = {
117
- kind: 'bare',
119
+ kind: 'fresh_revive',
118
120
  ownerId: 'n1',
119
121
  ownerName: 'n1',
120
122
  armedAt: ARMED,
@@ -124,12 +126,12 @@ test('bare recurring: frames one tick of a standing re-check + the cadence', ()
124
126
  assert.match(b, /recurring scheduled alarm fired \(every 6h\)/);
125
127
  assert.match(b, /one tick of a standing re-check/);
126
128
  });
127
- // --- the bare-wake revive seam (Seam 2) -------------------------------------
128
- test('a bare scheduled wake makes the fresh-revive kickoff distinguishable from a refresh', () => {
129
+ // --- the fresh-revive kickoff seam -------------------------------------
130
+ test('a fresh_revive trigger makes the fresh-revive kickoff distinguishable from a refresh', () => {
129
131
  const id = 'b1';
130
132
  const meta = createNode(node(id));
131
133
  const wakeReason = {
132
- kind: 'bare',
134
+ kind: 'fresh_revive',
133
135
  ownerId: id,
134
136
  ownerName: id,
135
137
  armedAt: ARMED,
@@ -1,37 +1,37 @@
1
1
  // Run with: node --import tsx/esm --test src/core/__tests__/wake-origin.test.ts
2
2
  //
3
- // HEADLESS RETARGET (foundation-spec §C.16 + §E). Wake-origin self-knowledge at
4
- // the DAEMON FIRING seams (the other half of the regression — wake-bearings.test.ts
5
- // covers the pure block in isolation). The observed gap: a scheduled wake arrived
6
- // indistinguishable from an ordinary message/spawn (Invariant D). Both seams are
7
- // now driven model-only — ZERO tmux, ZERO boot:
3
+ // HEADLESS RETARGET (foundation-spec §C.16 + §E). Trigger-origin self-knowledge
4
+ // at the DAEMON FIRING seams (the other half of the regression — wake-bearings.
5
+ // test.ts covers the pure block in isolation). The observed gap: a node woken
6
+ // or born by a scheduled trigger arrived indistinguishable from an ordinary
7
+ // message/spawn (Invariant D). Both seams are driven model-only — ZERO tmux,
8
+ // ZERO boot:
8
9
  //
9
- // (1) BUG LOCKED — a node woken or BORN by a TIMER must, by construction, learn a
10
- // CLOCK (not an event) caused it: a noted wake rides a ⏰-marked inbox label
11
- // (distinct from a plain `node msg`), and a spawn wake prepends the
12
- // <crtr-wake> birth block (armer + cadence) to the newborn's kickoff while an
13
- // ordinary `node new` carries none.
10
+ // (1) BUG LOCKED — a node woken or BORN by a TIMER must, by construction, learn
11
+ // a CLOCK (not an event) caused it: an inbox_message trigger rides a
12
+ // ⏰-marked inbox label (distinct from a plain `node msg`), and a node_birth
13
+ // trigger prepends the <crtr-wake> birth block (armer + cadence) to the
14
+ // newborn's kickoff while an ordinary `node new` carries none.
14
15
  //
15
- // (2) WHY MODEL-LEVEL, NOT TMUX CHROME — the noted seam is pure data layer
16
- // (superviseTick's third pass → appendInbox; readInboxSince reads it back).
17
- // The spawn-birth seam (spawn.ts) assembles the kickoff as
16
+ // (2) WHY MODEL-LEVEL, NOT TMUX CHROME — the inbox_message seam is pure data
17
+ // layer (superviseTick's third pass → appendInbox; readInboxSince reads it
18
+ // back). The spawn-birth seam (spawn.ts) assembles the kickoff as
18
19
  // `${buildWakeBearings(wakeOrigin)}\n\n${idBlock}${prompt}` ONLY when a
19
20
  // wakeOrigin is present; `node new` passes none → no block. The load-bearing
20
- // fact is the PURE rendering of buildWakeBearings for a spawn origin (and its
21
- // absence without one) — reading it off a real booted pi's prompt was pure
22
- // tmux/SDK overhead for a string a pure call already returns.
21
+ // fact is the PURE rendering of buildWakeBearings for a node_birth origin
22
+ // (and its absence without one) — reading it off a real booted pi's prompt
23
+ // was pure tmux/SDK overhead for a string a pure call already returns.
23
24
  //
24
25
  // (3) HOW THE DRIVE STILL FAILS IF THE BUG REGRESSES — drop the ⏰ label marker
25
- // and the noted assert goes RED; drop the spawn-kind <crtr-wake> rendering
26
- // and the spawn assert goes RED (the block / armer / cadence vanish).
26
+ // and the inbox_message assert goes RED; drop the node_birth <crtr-wake>
27
+ // rendering and the spawn assert goes RED (the block / armer / cadence
28
+ // vanish).
27
29
  import { test, before, after, beforeEach } from 'node:test';
28
30
  import assert from 'node:assert/strict';
29
31
  import { mkdtempSync, rmSync } from 'node:fs';
30
32
  import { tmpdir } from 'node:os';
31
33
  import { join } from 'node:path';
32
- import { createNode } from '../canvas/canvas.js';
33
- import { armWake } from '../canvas/wakeups.js';
34
- import { closeDb } from '../canvas/db.js';
34
+ import { createNode, armTrigger, closeDb } from '../canvas/index.js';
35
35
  import { readInboxSince } from '../feed/inbox.js';
36
36
  import { superviseTick } from '../../daemon/crtrd.js';
37
37
  import { buildWakeBearings } from '../runtime/bearings.js';
@@ -62,16 +62,18 @@ after(() => {
62
62
  rmSync(home, { recursive: true, force: true });
63
63
  delete process.env['CRTR_HOME'];
64
64
  });
65
- // --- noted seam (the daemon's third pass → inbox) ---------------------------
66
- test('a noted scheduled wake delivers a ⏰-marked inbox label, distinct from a plain message', async () => {
65
+ // --- inbox_message seam (the daemon's third pass → inbox) -------------------
66
+ test('a due inbox_message trigger delivers a ⏰-marked inbox label, distinct from a plain message', async () => {
67
67
  const armer = createNode(node('armer'));
68
68
  const target = createNode(node('tgt')); // no tmux placement → pass 1 skips it
69
- armWake({
70
- wakeup_id: 'wk-noted-1',
69
+ armTrigger({
70
+ trigger_id: 'trg-noted-1',
71
71
  node_id: target.node_id,
72
72
  owner_id: armer.node_id,
73
+ action: 'msg',
74
+ action_mode: 'inbox_message',
75
+ trigger_type: 'at',
73
76
  fire_at: new Date(Date.now() - 1000).toISOString(),
74
- kind: 'noted',
75
77
  recur: null,
76
78
  payload: { body: 'CI should be green by now — check it', label: 'check CI' },
77
79
  });
@@ -79,22 +81,23 @@ test('a noted scheduled wake delivers a ⏰-marked inbox label, distinct from a
79
81
  await superviseTick(Date.now());
80
82
  closeDb();
81
83
  const entries = readInboxSince(target.node_id);
82
- assert.equal(entries.length, 1, 'the noted wake delivered exactly one inbox entry');
84
+ assert.equal(entries.length, 1, 'the due trigger delivered exactly one inbox entry');
83
85
  // Invariant D: the timer signal rides the VISIBLE label (digests never surface
84
86
  // arbitrary data keys), so this is distinguishable from a plain `node msg`.
85
87
  assert.equal(entries[0].label, '⏰ scheduled wake — check CI');
86
88
  assert.notEqual(entries[0].label, 'check CI', 'a plain message would carry the bare label');
87
89
  });
88
- // --- spawn-birth seam (the headline; spawn.ts kickoff assembly) -------------
89
- test('a spawn scheduled wake renders a <crtr-wake> birth block (armer + cadence); a plain node new renders none', async () => {
90
+ // --- node_birth seam (the headline; spawn.ts kickoff assembly) --------------
91
+ test('a node_birth trigger renders a <crtr-wake> birth block (armer + cadence); a plain node new renders none', async () => {
90
92
  const armer = createNode(node('armer'));
91
93
  // The spawn-birth seam (spawn.ts): the newborn's pi kickoff is
92
94
  // `${buildWakeBearings(wakeOrigin)}\n\n${idBlock}${prompt}`
93
95
  // when a wakeOrigin is present, and just `${idBlock}${prompt}` (no block)
94
- // when it is not. The daemon's third pass builds the WakeOrigin from the fired
95
- // recurring `spawn` row via wakeOriginFrom; here we assert the block it yields.
96
+ // when it is not. The daemon's third pass builds the WakeOrigin from the
97
+ // fired recurring node_birth trigger row via wakeOriginFrom; here we assert
98
+ // the block it yields.
96
99
  const origin = {
97
- kind: 'spawn',
100
+ kind: 'node_birth',
98
101
  ownerId: armer.node_id,
99
102
  ownerName: 'armer',
100
103
  armedAt: new Date(Date.now() - 1000).toISOString(),
@@ -110,5 +113,5 @@ test('a spawn scheduled wake renders a <crtr-wake> birth block (armer + cadence)
110
113
  // prepends nothing — no <crtr-wake> in the newborn's kickoff.
111
114
  const wakeBlock = (o) => (o !== undefined ? `${buildWakeBearings(o)}\n\n` : '');
112
115
  assert.equal(wakeBlock(undefined), '', 'node new (no wakeOrigin) prepends no wake block');
113
- assert.match(wakeBlock(origin), /<crtr-wake>/, 'a spawn wake prepends the block');
116
+ assert.match(wakeBlock(origin), /<crtr-wake>/, 'a node_birth trigger prepends the block');
114
117
  });