@crouton-kit/crouter 0.3.33 → 0.3.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (566) hide show
  1. package/README.md +2 -2
  2. package/dist/build-root.js +3 -6
  3. package/dist/builtin-memory/crouter-development/marketplaces.md +6 -6
  4. package/dist/builtin-memory/crouter-development/plugins.md +13 -13
  5. package/dist/builtin-memory/internal/examples/imessage-assistant.md +3 -3
  6. package/dist/builtin-memory/internal/nodes-and-canvas.md +4 -4
  7. package/dist/builtin-personas/developer/PERSONA.md +1 -1
  8. package/dist/builtin-personas/orchestration-kernel.md +1 -1
  9. package/dist/builtin-personas/waiting.md +1 -1
  10. package/dist/builtin-pi-packages/pi-crtr-extensions/README.md +71 -0
  11. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/crtr-help-gate.test.ts +41 -0
  12. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/provider-rotation.test.ts +663 -0
  13. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +52 -0
  14. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +418 -0
  15. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crouter-help.ts +87 -0
  16. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crtr-commands/filters.json +7 -0
  17. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crtr-commands/index.ts +174 -0
  18. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crtr-help-gate.ts +408 -0
  19. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +442 -0
  20. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +119 -0
  21. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/nested-context.ts +327 -0
  22. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +574 -0
  23. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/statusline.ts +260 -0
  24. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/strip-skills-docs.ts +40 -0
  25. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/sysprompt-window.ts +19 -0
  26. package/dist/builtin-pi-packages/pi-crtr-extensions/lib/package.json +3 -0
  27. package/dist/builtin-pi-packages/pi-crtr-extensions/lib/subscription-state.js +1 -0
  28. package/dist/builtin-pi-packages/pi-crtr-extensions/lib/subscription-state.ts +479 -0
  29. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/LICENSE +13 -0
  30. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/README.md +172 -0
  31. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/bin.mjs +11 -0
  32. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-collection.js +88 -0
  33. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-doc.js +43 -0
  34. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-node.js +109 -0
  35. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-scalar.js +86 -0
  36. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/composer.js +219 -0
  37. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-block-map.js +115 -0
  38. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +198 -0
  39. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +49 -0
  40. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-end.js +37 -0
  41. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +207 -0
  42. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +225 -0
  43. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-props.js +146 -0
  44. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-contains-newline.js +34 -0
  45. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +26 -0
  46. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +15 -0
  47. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-map-includes.js +13 -0
  48. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/Document.js +335 -0
  49. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/anchors.js +71 -0
  50. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/applyReviver.js +55 -0
  51. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/createNode.js +88 -0
  52. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/directives.js +176 -0
  53. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/errors.js +57 -0
  54. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/index.js +17 -0
  55. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/log.js +11 -0
  56. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Alias.js +116 -0
  57. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Collection.js +147 -0
  58. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Node.js +38 -0
  59. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Pair.js +36 -0
  60. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Scalar.js +24 -0
  61. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/YAMLMap.js +144 -0
  62. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +113 -0
  63. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +63 -0
  64. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/identity.js +36 -0
  65. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/toJS.js +37 -0
  66. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst-scalar.js +214 -0
  67. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst-stringify.js +61 -0
  68. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst-visit.js +97 -0
  69. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst.js +98 -0
  70. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/lexer.js +721 -0
  71. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/line-counter.js +39 -0
  72. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/parser.js +975 -0
  73. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/public-api.js +102 -0
  74. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/Schema.js +37 -0
  75. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/map.js +17 -0
  76. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/null.js +15 -0
  77. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/seq.js +17 -0
  78. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/string.js +14 -0
  79. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/bool.js +19 -0
  80. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/float.js +43 -0
  81. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/int.js +38 -0
  82. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/schema.js +23 -0
  83. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/json/schema.js +62 -0
  84. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/tags.js +96 -0
  85. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +58 -0
  86. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +26 -0
  87. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +46 -0
  88. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +71 -0
  89. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +67 -0
  90. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +74 -0
  91. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +78 -0
  92. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +39 -0
  93. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +93 -0
  94. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +101 -0
  95. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +146 -0
  96. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringify.js +129 -0
  97. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +153 -0
  98. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyComment.js +20 -0
  99. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +85 -0
  100. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +25 -0
  101. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyPair.js +150 -0
  102. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyString.js +336 -0
  103. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/util.js +11 -0
  104. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/visit.js +233 -0
  105. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/index.js +5 -0
  106. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/package.json +3 -0
  107. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/cli.d.ts +8 -0
  108. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/cli.mjs +201 -0
  109. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-collection.d.ts +11 -0
  110. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-collection.js +90 -0
  111. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-doc.d.ts +7 -0
  112. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-doc.js +45 -0
  113. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-node.d.ts +29 -0
  114. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-node.js +112 -0
  115. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-scalar.d.ts +5 -0
  116. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-scalar.js +88 -0
  117. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/composer.d.ts +63 -0
  118. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/composer.js +224 -0
  119. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-map.d.ts +6 -0
  120. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-map.js +117 -0
  121. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +11 -0
  122. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-scalar.js +200 -0
  123. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +6 -0
  124. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-seq.js +51 -0
  125. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-end.d.ts +6 -0
  126. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-end.js +39 -0
  127. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +7 -0
  128. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-collection.js +209 -0
  129. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +10 -0
  130. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-scalar.js +227 -0
  131. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-props.d.ts +23 -0
  132. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-props.js +148 -0
  133. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-contains-newline.d.ts +2 -0
  134. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-contains-newline.js +36 -0
  135. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +2 -0
  136. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-empty-scalar-position.js +28 -0
  137. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +3 -0
  138. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-flow-indent-check.js +17 -0
  139. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-map-includes.d.ts +4 -0
  140. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-map-includes.js +15 -0
  141. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/Document.d.ts +141 -0
  142. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/Document.js +337 -0
  143. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/anchors.d.ts +24 -0
  144. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/anchors.js +76 -0
  145. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/applyReviver.d.ts +9 -0
  146. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/applyReviver.js +57 -0
  147. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/createNode.d.ts +17 -0
  148. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/createNode.js +90 -0
  149. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/directives.d.ts +49 -0
  150. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/directives.js +178 -0
  151. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/errors.d.ts +21 -0
  152. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/errors.js +62 -0
  153. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/index.d.ts +25 -0
  154. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/index.js +50 -0
  155. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/log.d.ts +3 -0
  156. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/log.js +19 -0
  157. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Alias.d.ts +29 -0
  158. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Alias.js +118 -0
  159. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Collection.d.ts +73 -0
  160. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Collection.js +151 -0
  161. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Node.d.ts +53 -0
  162. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Node.js +40 -0
  163. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Pair.d.ts +22 -0
  164. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Pair.js +39 -0
  165. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Scalar.d.ts +47 -0
  166. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Scalar.js +27 -0
  167. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLMap.d.ts +53 -0
  168. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLMap.js +147 -0
  169. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +60 -0
  170. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLSeq.js +115 -0
  171. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +4 -0
  172. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/addPairToJSMap.js +65 -0
  173. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/identity.d.ts +23 -0
  174. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/identity.js +53 -0
  175. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/toJS.d.ts +29 -0
  176. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/toJS.js +39 -0
  177. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/options.d.ts +350 -0
  178. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-scalar.d.ts +64 -0
  179. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-scalar.js +218 -0
  180. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-stringify.d.ts +8 -0
  181. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-stringify.js +63 -0
  182. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-visit.d.ts +39 -0
  183. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-visit.js +99 -0
  184. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst.d.ts +109 -0
  185. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst.js +112 -0
  186. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/lexer.d.ts +87 -0
  187. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/lexer.js +723 -0
  188. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/line-counter.d.ts +22 -0
  189. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/line-counter.js +41 -0
  190. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/parser.d.ts +84 -0
  191. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/parser.js +980 -0
  192. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/public-api.d.ts +44 -0
  193. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/public-api.js +107 -0
  194. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/Schema.d.ts +17 -0
  195. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/Schema.js +39 -0
  196. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/map.d.ts +2 -0
  197. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/map.js +19 -0
  198. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/null.d.ts +4 -0
  199. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/null.js +17 -0
  200. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/seq.d.ts +2 -0
  201. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/seq.js +19 -0
  202. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/string.d.ts +2 -0
  203. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/string.js +16 -0
  204. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/bool.d.ts +4 -0
  205. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/bool.js +21 -0
  206. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/float.d.ts +4 -0
  207. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/float.js +47 -0
  208. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/int.d.ts +4 -0
  209. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/int.js +42 -0
  210. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/schema.d.ts +1 -0
  211. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/schema.js +25 -0
  212. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/json/schema.d.ts +2 -0
  213. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/json/schema.js +64 -0
  214. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/json-schema.d.ts +69 -0
  215. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/tags.d.ts +48 -0
  216. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/tags.js +99 -0
  217. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/types.d.ts +92 -0
  218. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +2 -0
  219. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/binary.js +70 -0
  220. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +7 -0
  221. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/bool.js +29 -0
  222. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +4 -0
  223. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/float.js +50 -0
  224. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +5 -0
  225. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/int.js +76 -0
  226. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +9 -0
  227. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/merge.js +71 -0
  228. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +22 -0
  229. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/omap.js +77 -0
  230. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +10 -0
  231. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +82 -0
  232. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +1 -0
  233. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/schema.js +41 -0
  234. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +28 -0
  235. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/set.js +96 -0
  236. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +6 -0
  237. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +105 -0
  238. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +34 -0
  239. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/foldFlowLines.js +151 -0
  240. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringify.d.ts +21 -0
  241. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringify.js +132 -0
  242. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +17 -0
  243. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyCollection.js +155 -0
  244. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyComment.d.ts +10 -0
  245. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyComment.js +24 -0
  246. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +4 -0
  247. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyDocument.js +87 -0
  248. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +2 -0
  249. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyNumber.js +27 -0
  250. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyPair.d.ts +3 -0
  251. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyPair.js +152 -0
  252. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyString.d.ts +9 -0
  253. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyString.js +338 -0
  254. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/test-events.d.ts +4 -0
  255. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/test-events.js +134 -0
  256. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/util.d.ts +16 -0
  257. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/util.js +28 -0
  258. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/visit.d.ts +102 -0
  259. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/visit.js +236 -0
  260. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/package.json +97 -0
  261. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/util.js +2 -0
  262. package/dist/builtin-pi-packages/pi-crtr-extensions/package-lock.json +3385 -0
  263. package/dist/builtin-pi-packages/pi-crtr-extensions/package.json +25 -0
  264. package/dist/builtin-pi-packages/pi-mode-switch/README.md +64 -0
  265. package/dist/builtin-pi-packages/pi-mode-switch/bin/mode +40 -0
  266. package/dist/builtin-pi-packages/pi-mode-switch/extensions/index.ts +422 -0
  267. package/dist/builtin-pi-packages/pi-mode-switch/package.json +13 -0
  268. package/dist/clients/attach/__tests__/crtr-output-coverage.test.js +55 -0
  269. package/dist/clients/attach/__tests__/crtr-output-render.test.js +2340 -0
  270. package/dist/clients/attach/attach-cmd.js +826 -754
  271. package/dist/clients/attach/auth-pickers.js +2 -2
  272. package/dist/clients/attach/canvas-panels.js +1 -1
  273. package/dist/clients/attach/chat-view.d.ts +3 -2
  274. package/dist/clients/attach/chat-view.js +30 -10
  275. package/dist/clients/attach/clipboard-image.js +1 -1
  276. package/dist/clients/attach/clipboard-text.js +1 -1
  277. package/dist/clients/attach/config-load.js +1 -1
  278. package/dist/clients/attach/crtr-output-render.d.ts +48 -0
  279. package/dist/clients/attach/crtr-output-render.js +646 -0
  280. package/dist/clients/attach/extension-dialogs.js +1 -1
  281. package/dist/clients/attach/graph-overlay.js +3 -3
  282. package/dist/clients/attach/input-controller.js +1 -1
  283. package/dist/clients/attach/pickers.js +1 -1
  284. package/dist/clients/attach/slash-commands.js +5 -6
  285. package/dist/clients/attach/titled-editor.d.ts +4 -0
  286. package/dist/clients/attach/titled-editor.js +13 -1
  287. package/dist/clients/attach/view-socket.js +1 -1
  288. package/dist/clients/web/__tests__/source-cache.test.js +5 -5
  289. package/dist/clients/web/server.js +29 -5
  290. package/dist/clients/web/source-cache.js +3 -3
  291. package/dist/clients/web/web-cmd.js +7 -7
  292. package/dist/commands/canvas-issue.js +1 -1
  293. package/dist/commands/canvas-prune.js +24 -2
  294. package/dist/commands/canvas-snapshot.js +3 -0
  295. package/dist/commands/canvas-tmux-spread.js +3 -3
  296. package/dist/commands/human.js +1 -1
  297. package/dist/commands/memory/lint.js +15 -8
  298. package/dist/commands/memory/origin.d.ts +1 -0
  299. package/dist/commands/memory/origin.js +88 -0
  300. package/dist/commands/memory/shared.d.ts +8 -0
  301. package/dist/commands/memory/shared.js +22 -1
  302. package/dist/commands/memory/write.js +17 -12
  303. package/dist/commands/memory.js +4 -3
  304. package/dist/commands/node-context.js +4 -4
  305. package/dist/commands/node-snapshot.js +4 -1
  306. package/dist/commands/node.d.ts +2 -2
  307. package/dist/commands/node.js +814 -606
  308. package/dist/commands/pkg/market-inspect.d.ts +2 -1
  309. package/dist/commands/pkg/market-inspect.js +14 -32
  310. package/dist/commands/pkg/market-manage.d.ts +3 -1
  311. package/dist/commands/pkg/market-manage.js +58 -154
  312. package/dist/commands/pkg/market.js +7 -7
  313. package/dist/commands/pkg/plugin-inspect.d.ts +2 -1
  314. package/dist/commands/pkg/plugin-inspect.js +8 -24
  315. package/dist/commands/pkg/plugin-manage.d.ts +5 -1
  316. package/dist/commands/pkg/plugin-manage.js +245 -171
  317. package/dist/commands/pkg/plugin.js +6 -6
  318. package/dist/commands/pkg.js +5 -5
  319. package/dist/commands/revive.js +5 -3
  320. package/dist/commands/search/answer.js +1 -1
  321. package/dist/commands/search/contents.js +1 -1
  322. package/dist/commands/search/web.js +2 -2
  323. package/dist/commands/search.js +1 -1
  324. package/dist/commands/surface.d.ts +2 -0
  325. package/dist/commands/surface.js +43 -0
  326. package/dist/commands/sys/promptstudio.js +1 -1
  327. package/dist/commands/sys/settings.js +2 -2
  328. package/dist/commands/sys/setup-core.d.ts +88 -0
  329. package/dist/commands/sys/setup-core.js +352 -0
  330. package/dist/commands/sys/setup.d.ts +2 -0
  331. package/dist/commands/sys/setup.js +516 -0
  332. package/dist/commands/sys/sysprompt.js +3 -0
  333. package/dist/commands/sys.js +3 -2
  334. package/dist/commands/view-cycle.js +5 -5
  335. package/dist/commands/view-list.js +3 -3
  336. package/dist/commands/view-new.js +5 -5
  337. package/dist/commands/view-pick.js +6 -6
  338. package/dist/commands/view-run.js +14 -14
  339. package/dist/commands/view.js +3 -3
  340. package/dist/commands/workspace.js +10 -10
  341. package/dist/core/__tests__/boot.test.js +140 -0
  342. package/dist/core/__tests__/broker-sdk-wiring.test.js +6 -27
  343. package/dist/core/__tests__/daemon-boot.test.js +22 -0
  344. package/dist/core/__tests__/fixtures/fake-engine.js +1 -1
  345. package/dist/core/__tests__/full/broker-attach-limits.test.js +1 -1
  346. package/dist/core/__tests__/full/broker-attach-stream.test.js +1 -1
  347. package/dist/core/__tests__/full/broker-crash-teardown.test.js +10 -5
  348. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +1 -1
  349. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +1 -1
  350. package/dist/core/__tests__/full/broker-pane-resolution.test.js +1 -1
  351. package/dist/core/__tests__/full/cascade-close.test.js +31 -18
  352. package/dist/core/__tests__/full/detach-focus.test.js +2 -2
  353. package/dist/core/__tests__/hearth-bootstrap.test.js +136 -0
  354. package/dist/core/__tests__/helpers/harness.js +1 -1
  355. package/dist/core/__tests__/live-mutation-verbs.test.js +10 -10
  356. package/dist/core/__tests__/live-mutation.test.js +8 -8
  357. package/dist/core/__tests__/migration.test.js +124 -0
  358. package/dist/core/__tests__/on-read-dedup-resume.test.js +40 -0
  359. package/dist/core/__tests__/preview-registry-sync.test.js +36 -0
  360. package/dist/core/__tests__/prune-to-limit.test.js +91 -0
  361. package/dist/core/__tests__/revive.test.js +64 -21
  362. package/dist/core/__tests__/trigger-migration.test.js +48 -0
  363. package/dist/core/__tests__/wake-bearings.test.js +23 -21
  364. package/dist/core/__tests__/wake-origin.test.js +36 -33
  365. package/dist/core/canvas/boot.d.ts +48 -0
  366. package/dist/core/canvas/boot.js +157 -0
  367. package/dist/core/canvas/canvas.d.ts +27 -1
  368. package/dist/core/canvas/canvas.js +86 -5
  369. package/dist/core/canvas/db.js +86 -1
  370. package/dist/core/canvas/index.d.ts +1 -1
  371. package/dist/core/canvas/index.js +1 -1
  372. package/dist/core/canvas/nav-model.js +1 -1
  373. package/dist/core/canvas/pid.d.ts +6 -0
  374. package/dist/core/canvas/pid.js +13 -0
  375. package/dist/core/canvas/triggers.d.ts +108 -0
  376. package/dist/core/canvas/triggers.js +320 -0
  377. package/dist/core/canvas/types.d.ts +128 -46
  378. package/dist/core/command.js +13 -4
  379. package/dist/core/hearth/__tests__/model-auth-guest.test.js +151 -0
  380. package/dist/core/hearth/config.d.ts +1 -0
  381. package/dist/core/hearth/config.js +36 -0
  382. package/dist/core/hearth/guest-env.d.ts +7 -0
  383. package/dist/core/hearth/guest-env.js +17 -1
  384. package/dist/core/hearth/model-auth-guest.d.ts +8 -0
  385. package/dist/core/hearth/model-auth-guest.js +435 -0
  386. package/dist/core/hearth/provider.d.ts +13 -6
  387. package/dist/core/hearth/providers/blaxel-bootstrap.d.ts +2 -0
  388. package/dist/core/hearth/providers/blaxel-bootstrap.js +127 -19
  389. package/dist/core/hearth/providers/blaxel-home.d.ts +8 -4
  390. package/dist/core/hearth/providers/blaxel-home.js +85 -75
  391. package/dist/core/hearth/providers/blaxel.d.ts +5 -0
  392. package/dist/core/hearth/providers/blaxel.js +86 -12
  393. package/dist/core/hearth/providers/types.d.ts +6 -1
  394. package/dist/core/hearth/registry.js +2 -1
  395. package/dist/core/hearth/types.d.ts +35 -0
  396. package/dist/core/help.d.ts +16 -0
  397. package/dist/core/help.js +2 -0
  398. package/dist/core/memory-resolver.d.ts +8 -8
  399. package/dist/core/memory-resolver.js +58 -26
  400. package/dist/core/preview-registry.d.ts +25 -0
  401. package/dist/core/preview-registry.js +2047 -0
  402. package/dist/core/resolver.d.ts +1 -0
  403. package/dist/core/resolver.js +23 -16
  404. package/dist/core/runtime/bearings.d.ts +11 -10
  405. package/dist/core/runtime/bearings.js +8 -8
  406. package/dist/core/runtime/broker-protocol.d.ts +2 -2
  407. package/dist/core/runtime/broker-protocol.js +2 -2
  408. package/dist/core/runtime/close.js +2 -2
  409. package/dist/core/runtime/kickoff.js +1 -1
  410. package/dist/core/runtime/launch.d.ts +9 -3
  411. package/dist/core/runtime/launch.js +17 -9
  412. package/dist/core/runtime/lifecycle.js +7 -7
  413. package/dist/core/runtime/model-swap.js +1 -1
  414. package/dist/core/runtime/placement.d.ts +5 -5
  415. package/dist/core/runtime/placement.js +10 -10
  416. package/dist/core/runtime/recycle.js +7 -7
  417. package/dist/core/runtime/reset.d.ts +1 -1
  418. package/dist/core/runtime/reset.js +3 -3
  419. package/dist/core/runtime/revive-all.d.ts +5 -2
  420. package/dist/core/runtime/revive-all.js +5 -2
  421. package/dist/core/runtime/revive.d.ts +15 -8
  422. package/dist/core/runtime/revive.js +52 -16
  423. package/dist/core/runtime/spawn.d.ts +1 -1
  424. package/dist/core/runtime/spawn.js +7 -7
  425. package/dist/core/runtime/stop-guard.js +5 -5
  426. package/dist/core/runtime/surface-bg.js +1 -1
  427. package/dist/core/runtime/tmux.d.ts +1 -1
  428. package/dist/core/runtime/tmux.js +4 -4
  429. package/dist/core/scope.d.ts +9 -0
  430. package/dist/core/scope.js +37 -15
  431. package/dist/core/substrate/on-read.js +23 -21
  432. package/dist/core/substrate/render.js +3 -3
  433. package/dist/core/view/loader.js +2 -2
  434. package/dist/core/wake.d.ts +2 -2
  435. package/dist/core/wake.js +7 -7
  436. package/dist/daemon/__tests__/predicate-eval.test.js +109 -0
  437. package/dist/daemon/crtrd.js +222 -103
  438. package/dist/daemon/predicate-eval.d.ts +52 -0
  439. package/dist/daemon/predicate-eval.js +248 -0
  440. package/dist/hearth/control-plane/__tests__/node-message.test.js +60 -0
  441. package/dist/hearth/control-plane/__tests__/rate-limit-recurrence.test.js +49 -0
  442. package/dist/hearth/control-plane/__tests__/relay-security.test.js +314 -0
  443. package/dist/hearth/control-plane/__tests__/scheduler-scan-loop.test.js +133 -0
  444. package/dist/hearth/control-plane/__tests__/trigger-delivery.test.js +170 -0
  445. package/dist/hearth/control-plane/__tests__/webhook-ingress.test.js +167 -0
  446. package/dist/hearth/control-plane/config.d.ts +21 -0
  447. package/dist/hearth/control-plane/config.js +77 -0
  448. package/dist/hearth/control-plane/db.d.ts +30 -0
  449. package/dist/hearth/control-plane/db.js +534 -0
  450. package/dist/hearth/control-plane/ingress/rate-limit.d.ts +24 -0
  451. package/dist/hearth/control-plane/ingress/rate-limit.js +100 -0
  452. package/dist/hearth/control-plane/ingress/route-store.d.ts +31 -0
  453. package/dist/hearth/control-plane/ingress/route-store.js +61 -0
  454. package/dist/hearth/control-plane/ingress/webhook-delivery-store.d.ts +41 -0
  455. package/dist/hearth/control-plane/ingress/webhook-delivery-store.js +69 -0
  456. package/dist/hearth/control-plane/ingress/webhook-route.d.ts +55 -0
  457. package/dist/hearth/control-plane/ingress/webhook-route.js +285 -0
  458. package/dist/hearth/control-plane/main.js +88 -0
  459. package/dist/hearth/control-plane/node-message.d.ts +31 -0
  460. package/dist/hearth/control-plane/node-message.js +98 -0
  461. package/dist/hearth/control-plane/register.d.ts +15 -0
  462. package/dist/hearth/control-plane/register.js +34 -0
  463. package/dist/hearth/control-plane/registry.d.ts +17 -0
  464. package/dist/hearth/control-plane/registry.js +161 -0
  465. package/dist/hearth/control-plane/relay.d.ts +40 -0
  466. package/dist/hearth/control-plane/relay.js +642 -0
  467. package/dist/hearth/control-plane/scheduler/fire-store.d.ts +36 -0
  468. package/dist/hearth/control-plane/scheduler/fire-store.js +73 -0
  469. package/dist/hearth/control-plane/scheduler/recurrence.d.ts +7 -0
  470. package/dist/hearth/control-plane/scheduler/recurrence.js +58 -0
  471. package/dist/hearth/control-plane/scheduler/scan-loop.d.ts +38 -0
  472. package/dist/hearth/control-plane/scheduler/scan-loop.js +138 -0
  473. package/dist/hearth/control-plane/scheduler/schedule-store.d.ts +32 -0
  474. package/dist/hearth/control-plane/scheduler/schedule-store.js +66 -0
  475. package/dist/hearth/control-plane/secrets.d.ts +17 -0
  476. package/dist/hearth/control-plane/secrets.js +113 -0
  477. package/dist/hearth/control-plane/server.d.ts +27 -0
  478. package/dist/hearth/control-plane/server.js +346 -0
  479. package/dist/hearth/control-plane/session.d.ts +68 -0
  480. package/dist/hearth/control-plane/session.js +273 -0
  481. package/dist/hearth/control-plane/triggers/acl.d.ts +14 -0
  482. package/dist/hearth/control-plane/triggers/acl.js +52 -0
  483. package/dist/hearth/control-plane/triggers/audit-store.d.ts +38 -0
  484. package/dist/hearth/control-plane/triggers/audit-store.js +79 -0
  485. package/dist/hearth/control-plane/triggers/deliver.d.ts +43 -0
  486. package/dist/hearth/control-plane/triggers/deliver.js +76 -0
  487. package/dist/hearth/control-plane/triggers/envelope.d.ts +29 -0
  488. package/dist/hearth/control-plane/triggers/envelope.js +38 -0
  489. package/dist/hearth/control-plane/types.d.ts +66 -0
  490. package/dist/hearth/control-plane/wake.d.ts +80 -0
  491. package/dist/hearth/control-plane/wake.js +312 -0
  492. package/dist/hearth/wake-proxy/__tests__/guest-source.test.js +2 -2
  493. package/dist/hearth/wake-proxy/home.d.ts +2 -8
  494. package/dist/hearth/wake-proxy/home.js +48 -12
  495. package/dist/pi-extensions/canvas-doc-substrate.js +28 -2
  496. package/dist/pi-extensions/canvas-nav.js +1 -1
  497. package/dist/prompts/view.js +7 -8
  498. package/dist/types.js +4 -4
  499. package/dist/web-client/assets/{index-D36PNBj4.js → index-BRKxe-hy.js} +2 -2
  500. package/dist/web-client/index.html +1 -1
  501. package/package.json +12 -8
  502. package/scripts/postinstall.mjs +8 -0
  503. package/dist/clients/attach/__tests__/action-parity.test.js +0 -48
  504. package/dist/clients/attach/__tests__/autocomplete-and-bash-mode.test.js +0 -96
  505. package/dist/clients/attach/__tests__/bash-bang-routing.test.js +0 -58
  506. package/dist/clients/attach/__tests__/bundle-pi-tui-dedup.test.js +0 -56
  507. package/dist/clients/attach/__tests__/clipboard-image.test.js +0 -76
  508. package/dist/clients/attach/__tests__/editor-newline.test.js +0 -82
  509. package/dist/clients/attach/__tests__/git-info.test.js +0 -31
  510. package/dist/clients/attach/__tests__/onrequest-wired.test.js +0 -20
  511. package/dist/clients/attach/__tests__/reconnect-giveup.test.js +0 -30
  512. package/dist/clients/attach/__tests__/slash-quit-copy.test.js +0 -42
  513. package/dist/clients/attach/__tests__/titled-editor.test.js +0 -60
  514. package/dist/commands/memory/__tests__/lint-schema.test.js +0 -52
  515. package/dist/core/__tests__/argv-parser.test.js +0 -217
  516. package/dist/core/__tests__/artifact-paths.test.js +0 -44
  517. package/dist/core/__tests__/draw-style.test.js +0 -258
  518. package/dist/core/__tests__/editor-label.test.js +0 -26
  519. package/dist/core/__tests__/fault-marker.test.js +0 -112
  520. package/dist/core/__tests__/fault-retry-rewind.test.d.ts +0 -1
  521. package/dist/core/__tests__/fault-retry-rewind.test.js +0 -123
  522. package/dist/core/__tests__/frame-decoder-perf.test.d.ts +0 -1
  523. package/dist/core/__tests__/frame-decoder-perf.test.js +0 -224
  524. package/dist/core/__tests__/keystone.test.d.ts +0 -1
  525. package/dist/core/__tests__/keystone.test.js +0 -185
  526. package/dist/core/__tests__/listing-completeness.test.d.ts +0 -1
  527. package/dist/core/__tests__/listing-completeness.test.js +0 -31
  528. package/dist/core/__tests__/memory-resolver.test.d.ts +0 -1
  529. package/dist/core/__tests__/memory-resolver.test.js +0 -119
  530. package/dist/core/__tests__/memory.test.d.ts +0 -1
  531. package/dist/core/__tests__/memory.test.js +0 -60
  532. package/dist/core/__tests__/model-ladders.test.d.ts +0 -1
  533. package/dist/core/__tests__/model-ladders.test.js +0 -160
  534. package/dist/core/__tests__/node-env.test.d.ts +0 -1
  535. package/dist/core/__tests__/node-env.test.js +0 -26
  536. package/dist/core/__tests__/pane-column.test.d.ts +0 -1
  537. package/dist/core/__tests__/pane-column.test.js +0 -153
  538. package/dist/core/__tests__/persona-compose.test.d.ts +0 -1
  539. package/dist/core/__tests__/persona-compose.test.js +0 -53
  540. package/dist/core/__tests__/persona-subkind.test.d.ts +0 -1
  541. package/dist/core/__tests__/persona-subkind.test.js +0 -65
  542. package/dist/core/__tests__/persona.test.d.ts +0 -1
  543. package/dist/core/__tests__/persona.test.js +0 -107
  544. package/dist/core/__tests__/unknown-path.test.d.ts +0 -1
  545. package/dist/core/__tests__/unknown-path.test.js +0 -58
  546. package/dist/core/canvas/wakeups.d.ts +0 -76
  547. package/dist/core/canvas/wakeups.js +0 -185
  548. package/dist/hearth/wake-proxy/__tests__/source-bridge-gate.test.d.ts +0 -1
  549. package/dist/hearth/wake-proxy/__tests__/source-bridge-gate.test.js +0 -455
  550. /package/dist/clients/attach/__tests__/{action-parity.test.d.ts → crtr-output-coverage.test.d.ts} +0 -0
  551. /package/dist/clients/attach/__tests__/{autocomplete-and-bash-mode.test.d.ts → crtr-output-render.test.d.ts} +0 -0
  552. /package/dist/{clients/attach/__tests__/bash-bang-routing.test.d.ts → core/__tests__/boot.test.d.ts} +0 -0
  553. /package/dist/{clients/attach/__tests__/bundle-pi-tui-dedup.test.d.ts → core/__tests__/hearth-bootstrap.test.d.ts} +0 -0
  554. /package/dist/{clients/attach/__tests__/clipboard-image.test.d.ts → core/__tests__/preview-registry-sync.test.d.ts} +0 -0
  555. /package/dist/{clients/attach/__tests__/editor-newline.test.d.ts → core/__tests__/prune-to-limit.test.d.ts} +0 -0
  556. /package/dist/{clients/attach/__tests__/git-info.test.d.ts → core/__tests__/trigger-migration.test.d.ts} +0 -0
  557. /package/dist/{clients/attach/__tests__/onrequest-wired.test.d.ts → core/hearth/__tests__/model-auth-guest.test.d.ts} +0 -0
  558. /package/dist/{clients/attach/__tests__/reconnect-giveup.test.d.ts → daemon/__tests__/predicate-eval.test.d.ts} +0 -0
  559. /package/dist/{clients/attach/__tests__/slash-quit-copy.test.d.ts → hearth/control-plane/__tests__/node-message.test.d.ts} +0 -0
  560. /package/dist/{clients/attach/__tests__/titled-editor.test.d.ts → hearth/control-plane/__tests__/rate-limit-recurrence.test.d.ts} +0 -0
  561. /package/dist/{commands/memory/__tests__/lint-schema.test.d.ts → hearth/control-plane/__tests__/relay-security.test.d.ts} +0 -0
  562. /package/dist/{core/__tests__/argv-parser.test.d.ts → hearth/control-plane/__tests__/scheduler-scan-loop.test.d.ts} +0 -0
  563. /package/dist/{core/__tests__/artifact-paths.test.d.ts → hearth/control-plane/__tests__/trigger-delivery.test.d.ts} +0 -0
  564. /package/dist/{core/__tests__/draw-style.test.d.ts → hearth/control-plane/__tests__/webhook-ingress.test.d.ts} +0 -0
  565. /package/dist/{core/__tests__/editor-label.test.d.ts → hearth/control-plane/main.d.ts} +0 -0
  566. /package/dist/{core/__tests__/fault-marker.test.d.ts → hearth/control-plane/types.js} +0 -0
@@ -0,0 +1,157 @@
1
+ // Detects a boot change (a host reboot, or — the case this exists for — a
2
+ // Blaxel/Firecracker microVM destroy+recreate) so callers can stop trusting any
3
+ // `pi_pid` recorded before it.
4
+ //
5
+ // canvas.db is durable — it survives a VM/sandbox destroy+recreate or a host
6
+ // reboot on whatever volume it lives on (see paths.ts / the storage-tiers
7
+ // doc) — but `pi_pid` is a raw OS pid: once the process table resets, a small
8
+ // stale pid can coincidentally collide with an unrelated process that now
9
+ // happens to hold that number, so `isPidAlive` reads it "alive" when the
10
+ // broker it once named is long gone. Left unchecked this fools BOTH the
11
+ // daemon's own liveness poll (crtrd.ts) and reviveNode's double-launch guard
12
+ // (revive.ts) into believing a dead broker is still running — the node then
13
+ // stays permanently unrevivable until a human runs `canvas revive --fresh`.
14
+ //
15
+ // The signal (primary): the Linux kernel's per-boot identity at
16
+ // `/proc/sys/kernel/random/boot_id` — a fresh random UUID minted on every
17
+ // kernel boot. A Firecracker microVM recreate (Blaxel's deployment shape) boots
18
+ // a brand-new kernel, so `boot_id` changes; a plain daemon restart within the
19
+ // same boot leaves it identical. This is an EXACT identity, so on Linux we need
20
+ // no wall-clock window at all. NOTE this detects a *kernel boot*, not an
21
+ // arbitrary container recreate: an ordinary container that shares the host
22
+ // kernel keeps the host's `boot_id` across recreation, so this would NOT fire
23
+ // there — that shape is out of scope (Hearth runs on Firecracker microVMs).
24
+ //
25
+ // The signal (fallback, non-Linux dev only): `os.uptime()` resets to ~0 on a
26
+ // reboot and is otherwise monotonic, so `now - uptime` estimates the current
27
+ // boot's wall-clock start (the "boot epoch"). Used only when `boot_id` is
28
+ // unavailable (e.g. macOS dev), where a genuine reboot/recreate is not a
29
+ // production concern; the epoch comparison keeps a generous tolerance there.
30
+ //
31
+ // The last-seen identity is persisted in canvas.db (the same durable tier the
32
+ // pids live in) as a single `canvas_meta` row, and the compare+sweep runs in
33
+ // ONE `BEGIN IMMEDIATE` transaction so concurrent callers (daemon startup and a
34
+ // manual/direct revive in another process) are serialized: a second caller
35
+ // blocks on the write lock, then reads the marker the first already updated and
36
+ // no-ops, so it can never clear a pid the first just recorded (single-writer).
37
+ import { readFileSync } from 'node:fs';
38
+ import { uptime } from 'node:os';
39
+ import { openDb } from './db.js';
40
+ /** Wall-clock epoch drift (fallback signal only) beyond which two boot-start
41
+ * estimates are called DIFFERENT boots. Absorbs clock-sync jitter (NTP, a VM's
42
+ * first sync after boot) and `os.uptime()`'s ~1s resolution. Only consulted
43
+ * when the exact kernel `boot_id` is unavailable on BOTH sides (non-Linux
44
+ * dev). A false positive would clear a genuinely live pid and let reviveNode
45
+ * double-spawn onto the same session; a false negative just falls back to the
46
+ * manual `--fresh` status quo — so it is kept generous, biased against the
47
+ * dangerous direction. The production target (Linux/Firecracker) never reaches
48
+ * this branch; there `boot_id` is exact. */
49
+ const BOOT_EPOCH_TOLERANCE_MS = 60_000;
50
+ function readKernelBootId() {
51
+ try {
52
+ const id = readFileSync('/proc/sys/kernel/random/boot_id', 'utf8').trim();
53
+ return id.length > 0 ? id : null;
54
+ }
55
+ catch {
56
+ return null; // non-Linux, or unreadable — fall back to the wall-clock epoch
57
+ }
58
+ }
59
+ /** Identity of the CURRENT OS boot. `now` is injectable for tests. */
60
+ export function currentBootIdentity(now = Date.now()) {
61
+ return { bootId: readKernelBootId(), bootEpochMs: now - Math.round(uptime() * 1000) };
62
+ }
63
+ /** Pure decision core: does `current` belong to a DIFFERENT boot than the
64
+ * persisted `known`? `known === null` (no history — a fresh install, or the
65
+ * first run of a build that added this marker) is never a boot change: there
66
+ * is nothing to contradict it, and treating "no history" as a change could
67
+ * clear genuinely live pids that predate this feature.
68
+ *
69
+ * When BOTH sides carry a kernel `boot_id`, that exact identity decides it — no
70
+ * wall-clock window, so a real quick reboot/recreate (a short-lived prior boot
71
+ * whose start is <60s away) is still detected. Only when a `boot_id` is missing
72
+ * on either side (non-Linux dev) does it fall back to the epoch-drift window.
73
+ * Unit-testable without real uptime/fs. */
74
+ export function bootChanged(current, known) {
75
+ if (known === null)
76
+ return false;
77
+ if (current.bootId !== null && known.bootId !== null) {
78
+ return current.bootId !== known.bootId;
79
+ }
80
+ return Math.abs(current.bootEpochMs - known.bootEpochMs) > BOOT_EPOCH_TOLERANCE_MS;
81
+ }
82
+ const BOOT_MARKER_KEY = 'boot_identity';
83
+ function readBootMarker(db) {
84
+ const row = db
85
+ .prepare('SELECT value FROM canvas_meta WHERE key = ?')
86
+ .get(BOOT_MARKER_KEY);
87
+ if (row === undefined)
88
+ return null;
89
+ try {
90
+ const parsed = JSON.parse(row.value);
91
+ if (typeof parsed.bootEpochMs !== 'number')
92
+ return null;
93
+ return {
94
+ bootId: typeof parsed.bootId === 'string' ? parsed.bootId : null,
95
+ bootEpochMs: parsed.bootEpochMs,
96
+ };
97
+ }
98
+ catch {
99
+ return null; // malformed — treat as "no history yet"
100
+ }
101
+ }
102
+ function writeBootMarker(db, identity) {
103
+ db.prepare('INSERT INTO canvas_meta (key, value) VALUES (?, ?) ' +
104
+ 'ON CONFLICT(key) DO UPDATE SET value = excluded.value').run(BOOT_MARKER_KEY, JSON.stringify(identity));
105
+ }
106
+ /** Idempotent and safe to call from every revive entry point (daemon startup,
107
+ * reviveNode): compares the current boot's identity against the last one
108
+ * recorded, and if they differ, clears `pi_pid` on every node that has one —
109
+ * regardless of status, since reviveNode's double-launch guard reads `pi_pid`
110
+ * unconditionally, not just on active/idle rows. The first caller after a
111
+ * genuine boot change does the sweep and persists the new marker; every call
112
+ * after that (in this process or another) reads a matching marker and no-ops.
113
+ *
114
+ * SINGLE-WRITER: the whole read-marker + sweep + write-marker runs in one
115
+ * `BEGIN IMMEDIATE` transaction. A concurrent caller (a manual revive racing
116
+ * daemon startup, in a separate process) blocks on the SQLite write lock until
117
+ * this commits, then reads the already-updated marker and no-ops — so it can
118
+ * never `clearPid` a broker pid the first caller's revive just recorded, which
119
+ * would otherwise hide a live broker behind `pi_pid=NULL` and risk a second
120
+ * broker on the same session.
121
+ *
122
+ * `current` defaults to the real identity; tests inject a synthetic one against
123
+ * an isolated CRTR_HOME to simulate a boot change without a real reboot. */
124
+ export function reconcileBootLiveness(current = currentBootIdentity()) {
125
+ const db = openDb();
126
+ db.exec('BEGIN IMMEDIATE');
127
+ try {
128
+ const known = readBootMarker(db);
129
+ if (!bootChanged(current, known)) {
130
+ if (known === null)
131
+ writeBootMarker(db, current); // seed first-ever marker
132
+ db.exec('COMMIT');
133
+ return { changed: false, cleared: [] };
134
+ }
135
+ const rows = db
136
+ .prepare('SELECT node_id FROM nodes WHERE pi_pid IS NOT NULL')
137
+ .all();
138
+ const upd = db.prepare('UPDATE nodes SET pi_pid = NULL WHERE node_id = ?');
139
+ const cleared = [];
140
+ for (const row of rows) {
141
+ upd.run(row.node_id);
142
+ cleared.push(row.node_id);
143
+ }
144
+ writeBootMarker(db, current);
145
+ db.exec('COMMIT');
146
+ return { changed: true, cleared };
147
+ }
148
+ catch (err) {
149
+ try {
150
+ db.exec('ROLLBACK');
151
+ }
152
+ catch {
153
+ /* best-effort — nothing was committed */
154
+ }
155
+ throw err;
156
+ }
157
+ }
@@ -87,7 +87,12 @@ export interface PruneResult {
87
87
  * analogue of {@link pruneNodes}, for IMMEDIATE reaping — e.g. an empty node the
88
88
  * user closed or detached from. Pure persisted-state removal: the caller MUST
89
89
  * have already torn down the broker engine + viewer (this does not signal any
90
- * process). Best-effort dir removal after the row delete, mirroring pruneNodes. */
90
+ * process). Reaps this node's triggers FIRST (spec §Deterministic removal,
91
+ * criterion 15: target deletion kills any in-flight predicate process group and
92
+ * consumes target-bound + owner-armed trigger rows, instead of leaving them to
93
+ * the FK cascade alone with no kill and no notice) via the same
94
+ * `cancelTriggersFor` seam `close`/`cancel` already use. Best-effort dir removal
95
+ * after the row delete, mirroring pruneNodes. */
91
96
  export declare function deleteNode(nodeId: string): void;
92
97
  /** Retention sweep: remove TERMINAL nodes (status dead | done | canceled) whose
93
98
  * `created` is older than `ttlDays`, bounding the otherwise-unbounded growth of
@@ -111,3 +116,24 @@ export declare function pruneNodes(opts: {
111
116
  dryRun?: boolean;
112
117
  includeStale?: boolean;
113
118
  }): PruneResult;
119
+ /** Count-based retention sweep: keep at most `maxNodes` of the MOST-RECENTLY-
120
+ * ACTIVE nodes, but NEVER delete a live node — so the real retained floor is
121
+ * `max(maxNodes, liveCount)`. Bounds the otherwise-unbounded growth the TTL
122
+ * sweep can't (a canvas that never crosses the TTL still grows without limit).
123
+ *
124
+ * Liveness (protected, always kept): status active|idle AND a live `pi_pid` —
125
+ * the SAME signal `pruneNodes`'s `includeStale` and placement use (`isPidAlive`).
126
+ * The caller ($CRTR_NODE_ID) is also always protected.
127
+ *
128
+ * Algorithm: order ALL nodes by recency DESC (telemetry.json mtime, falling back
129
+ * to `created`); `target = max(maxNodes, liveCount)`; delete every node ranked
130
+ * beyond `target` (0-indexed rank >= target) that is NOT live and NOT the caller.
131
+ * Retained = all live + the newest terminal nodes up to `target`.
132
+ *
133
+ * Mirrors {@link pruneNodes} exactly for the delete (shared `deletePrunedNodes`:
134
+ * transactioned row sweep + FK edge cascade + best-effort dir removal). `dryRun`
135
+ * reports the candidate set and deletes NOTHING. */
136
+ export declare function pruneToLimit(opts: {
137
+ maxNodes: number;
138
+ dryRun?: boolean;
139
+ }): PruneResult;
@@ -4,11 +4,12 @@
4
4
  // Source-of-truth split: a node's meta.json is canonical for its own fields;
5
5
  // the db row is a queryable index re-derivable from it. The subscribes_to edges
6
6
  // are db-authoritative (mutable, many-writers — what WAL is for).
7
- import { existsSync, readFileSync, renameSync, readdirSync, rmSync, openSync, writeSync, fsyncSync, closeSync, } from 'node:fs';
7
+ import { existsSync, readFileSync, renameSync, readdirSync, rmSync, openSync, writeSync, fsyncSync, closeSync, statSync, } from 'node:fs';
8
8
  import { join, dirname } from 'node:path';
9
9
  import { openDb } from './db.js';
10
10
  import { isPidAlive } from './pid.js';
11
- import { ensureHome, ensureNodeDirs, nodeMetaPath, nodeDir, nodesRoot, } from './paths.js';
11
+ import { cancelTriggersFor } from './triggers.js';
12
+ import { ensureHome, ensureNodeDirs, nodeMetaPath, nodeDir, nodesRoot, jobDir, } from './paths.js';
12
13
  // ---------------------------------------------------------------------------
13
14
  // meta.json (durable identity — the source of truth for what PERSISTS)
14
15
  //
@@ -400,8 +401,14 @@ export function rebuildIndex() {
400
401
  * analogue of {@link pruneNodes}, for IMMEDIATE reaping — e.g. an empty node the
401
402
  * user closed or detached from. Pure persisted-state removal: the caller MUST
402
403
  * have already torn down the broker engine + viewer (this does not signal any
403
- * process). Best-effort dir removal after the row delete, mirroring pruneNodes. */
404
+ * process). Reaps this node's triggers FIRST (spec §Deterministic removal,
405
+ * criterion 15: target deletion kills any in-flight predicate process group and
406
+ * consumes target-bound + owner-armed trigger rows, instead of leaving them to
407
+ * the FK cascade alone with no kill and no notice) via the same
408
+ * `cancelTriggersFor` seam `close`/`cancel` already use. Best-effort dir removal
409
+ * after the row delete, mirroring pruneNodes. */
404
410
  export function deleteNode(nodeId) {
411
+ cancelTriggersFor(nodeId);
405
412
  openDb().prepare('DELETE FROM nodes WHERE node_id = ?').run(nodeId);
406
413
  rmSync(nodeDir(nodeId), { recursive: true, force: true });
407
414
  }
@@ -458,7 +465,24 @@ export function pruneNodes(opts) {
458
465
  const candidates = [...terminal, ...stale];
459
466
  if (dryRun || candidates.length === 0)
460
467
  return { pruned: candidates, dryRun };
461
- // One transactioned sweep — delete the rows; the FK cascades their edges.
468
+ deletePrunedNodes(candidates);
469
+ return { pruned: candidates, dryRun };
470
+ }
471
+ /** Hard-delete a set of pruned nodes: reaps each node's triggers (killing any
472
+ * in-flight predicate process group and consuming target-bound + owner-armed
473
+ * rows — spec criterion 15, the same reap {@link deleteNode} does) BEFORE the
474
+ * transactioned row sweep (the edges→nodes FK, ON DELETE CASCADE, GCs their
475
+ * edges), followed by best-effort on-disk `nodes/<id>/` dir removal. Shared by
476
+ * {@link pruneNodes} (TTL) and {@link pruneToLimit} (count) so the delete
477
+ * semantics never drift. The fs isn't transactional, so dirs are removed AFTER
478
+ * COMMIT — by then the rows are gone, so a re-run never re-finds a
479
+ * half-deleted node. */
480
+ function deletePrunedNodes(candidates) {
481
+ if (candidates.length === 0)
482
+ return;
483
+ for (const c of candidates)
484
+ cancelTriggersFor(c.node_id);
485
+ const db = openDb();
462
486
  db.exec('BEGIN');
463
487
  try {
464
488
  const del = db.prepare('DELETE FROM nodes WHERE node_id = ?');
@@ -470,9 +494,66 @@ export function pruneNodes(opts) {
470
494
  db.exec('ROLLBACK');
471
495
  throw e;
472
496
  }
473
- // Remove each pruned node's on-disk dir (best-effort, after COMMIT).
474
497
  for (const c of candidates) {
475
498
  rmSync(nodeDir(c.node_id), { recursive: true, force: true });
476
499
  }
500
+ }
501
+ /** "Most recent activity" sort key (epoch ms) read CHEAPLY: a `statSync` (no file
502
+ * read, no parse) of the node's `job/telemetry.json` — rewritten on every
503
+ * turn_end at a deterministic path, so it tracks last-message recency without a
504
+ * meta read. Falls back to `created`'s epoch when a node never ran a turn.
505
+ * Mirrors render.ts's `sessionMtime` (the same key the snapshot roster surfaces
506
+ * as `last_activity`). Never throws. */
507
+ function recencyMs(nodeId, created) {
508
+ try {
509
+ const st = statSync(join(jobDir(nodeId), 'telemetry.json'), { throwIfNoEntry: false });
510
+ if (st !== undefined)
511
+ return st.mtimeMs;
512
+ }
513
+ catch {
514
+ /* fall through to created */
515
+ }
516
+ const t = Date.parse(created);
517
+ return Number.isNaN(t) ? 0 : t;
518
+ }
519
+ /** Count-based retention sweep: keep at most `maxNodes` of the MOST-RECENTLY-
520
+ * ACTIVE nodes, but NEVER delete a live node — so the real retained floor is
521
+ * `max(maxNodes, liveCount)`. Bounds the otherwise-unbounded growth the TTL
522
+ * sweep can't (a canvas that never crosses the TTL still grows without limit).
523
+ *
524
+ * Liveness (protected, always kept): status active|idle AND a live `pi_pid` —
525
+ * the SAME signal `pruneNodes`'s `includeStale` and placement use (`isPidAlive`).
526
+ * The caller ($CRTR_NODE_ID) is also always protected.
527
+ *
528
+ * Algorithm: order ALL nodes by recency DESC (telemetry.json mtime, falling back
529
+ * to `created`); `target = max(maxNodes, liveCount)`; delete every node ranked
530
+ * beyond `target` (0-indexed rank >= target) that is NOT live and NOT the caller.
531
+ * Retained = all live + the newest terminal nodes up to `target`.
532
+ *
533
+ * Mirrors {@link pruneNodes} exactly for the delete (shared `deletePrunedNodes`:
534
+ * transactioned row sweep + FK edge cascade + best-effort dir removal). `dryRun`
535
+ * reports the candidate set and deletes NOTHING. */
536
+ export function pruneToLimit(opts) {
537
+ const dryRun = opts.dryRun ?? false;
538
+ const selfId = process.env['CRTR_NODE_ID'] ?? '';
539
+ const rows = listNodes();
540
+ // Rank ALL nodes by recency DESC, tagging liveness as we go.
541
+ const ranked = rows
542
+ .map((r) => ({
543
+ node_id: r.node_id,
544
+ status: r.status,
545
+ created: r.created,
546
+ recency: recencyMs(r.node_id, r.created),
547
+ live: (r.status === 'active' || r.status === 'idle') && isPidAlive(r.pi_pid),
548
+ }))
549
+ .sort((a, b) => b.recency - a.recency);
550
+ const liveCount = ranked.filter((r) => r.live).length;
551
+ const target = Math.max(opts.maxNodes, liveCount);
552
+ const candidates = ranked
553
+ .filter((r, rank) => rank >= target && !r.live && r.node_id !== selfId)
554
+ .map((r) => ({ node_id: r.node_id, status: r.status, created: r.created }));
555
+ if (dryRun || candidates.length === 0)
556
+ return { pruned: candidates, dryRun };
557
+ deletePrunedNodes(candidates);
477
558
  return { pruned: candidates, dryRun };
478
559
  }
@@ -232,7 +232,7 @@ CREATE TABLE IF NOT EXISTS focuses (
232
232
  * `owner_id` is the ARMER, set on EVERY row, and is deliberately a PLAIN indexed
233
233
  * column with NO FK (design D1/D2): an FK on `owner_id` would cascade-drop a
234
234
  * crashed-then-pruned armer's detached cron, violating Invariant E. A detached
235
- * wake is reaped only by the explicit `cancelWakesFor` DELETE, never by cascade.
235
+ * wake is reaped only by the explicit `cancelTriggersFor` DELETE, never by cascade.
236
236
  *
237
237
  * `fire_at` is an ISO 8601 UTC string for the NEXT occurrence, so the per-tick
238
238
  * due query is a lexicographic `<=` compare. The partial unique index
@@ -256,6 +256,76 @@ CREATE INDEX IF NOT EXISTS idx_wakeups_owner ON wakeups(owner_id);
256
256
  CREATE UNIQUE INDEX IF NOT EXISTS idx_wakeups_deadline ON wakeups(node_id) WHERE kind = 'deadline';
257
257
  `);
258
258
  }
259
+ /** v9 — generalize the `wakeups` table (v7) into the `triggers` table (the
260
+ * unified node-trigger-grammar substrate). The old `kind` axis (bare/noted/
261
+ * deadline/spawn) splits into three orthogonal axes: `action` (what enacts:
262
+ * 'msg'|'new') x `action_mode` (how: 'inbox_message'|'fresh_revive'|
263
+ * 'deadline_message'|'node_birth') x `trigger_type` (when: 'at'|'every'|
264
+ * 'when'|'until') — so a daemon-owned predicate (`--when`) trigger can live in
265
+ * the same table as a clock trigger. Predicate-only columns (`when_script`
266
+ * through `last_stderr`) are additive null/idle for every migrated clock row.
267
+ *
268
+ * Migration mapping, preserving every existing `wakeup_id` as `trigger_id`
269
+ * (so an old wake's id stays cancelable): bare→fresh_revive, noted→
270
+ * inbox_message, deadline→deadline_message (trigger_type='until'), spawn→
271
+ * node_birth. `payload` JSON carries over unchanged — the old per-kind
272
+ * payload shapes (plus SpawnChildOpts) map 1:1 onto the new payload union at
273
+ * the TS layer (triggers.ts), no JSON transform needed. The `wakeups` table
274
+ * is then DROPPED — not kept as a parallel table. Additive, forward-only. */
275
+ function migrateWakeupsToTriggers(db) {
276
+ db.exec(`
277
+ CREATE TABLE IF NOT EXISTS triggers (
278
+ trigger_id TEXT PRIMARY KEY,
279
+ owner_id TEXT NOT NULL,
280
+ node_id TEXT, -- TARGET + node-anchored cancel anchor; NULL = canvas-detached
281
+ action TEXT NOT NULL, -- 'msg' | 'new'
282
+ action_mode TEXT NOT NULL, -- 'inbox_message' | 'fresh_revive' | 'deadline_message' | 'node_birth'
283
+ trigger_type TEXT NOT NULL, -- 'at' | 'every' | 'when' | 'until'
284
+ fire_at TEXT, -- clock triggers: NEXT occurrence, ISO 8601 UTC; lexicographic <=
285
+ recur TEXT, -- NULL = one-shot; else the recur JSON the daemon advances
286
+ payload TEXT, -- JSON action payload, discriminated by action_mode
287
+ when_script TEXT, -- predicate triggers: the --when bash source
288
+ eval_every TEXT, -- predicate triggers: evaluation cadence (recur-shaped JSON)
289
+ next_eval_at TEXT, -- predicate triggers: next evaluation instant
290
+ timeout_at TEXT, -- predicate triggers: wall-clock expiry
291
+ eval_state TEXT NOT NULL DEFAULT 'idle', -- 'idle' | 'running'
292
+ eval_started_at TEXT,
293
+ eval_pid INTEGER,
294
+ eval_lease_owner TEXT,
295
+ last_eval_at TEXT,
296
+ last_exit INTEGER,
297
+ last_stderr TEXT,
298
+ created TEXT NOT NULL,
299
+ FOREIGN KEY (node_id) REFERENCES nodes(node_id) ON DELETE CASCADE
300
+ );
301
+ CREATE INDEX IF NOT EXISTS idx_triggers_fire ON triggers(fire_at); -- clock per-tick due query
302
+ CREATE INDEX IF NOT EXISTS idx_triggers_node ON triggers(node_id); -- by-node cancel / list
303
+ CREATE INDEX IF NOT EXISTS idx_triggers_owner ON triggers(owner_id); -- by-owner reap
304
+ CREATE INDEX IF NOT EXISTS idx_triggers_eval ON triggers(eval_state, next_eval_at); -- predicate due query
305
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_triggers_deadline ON triggers(node_id) WHERE action_mode = 'deadline_message';
306
+
307
+ INSERT INTO triggers (trigger_id, owner_id, node_id, action, action_mode, trigger_type, fire_at, recur, payload, created)
308
+ SELECT
309
+ wakeup_id,
310
+ owner_id,
311
+ node_id,
312
+ CASE kind WHEN 'spawn' THEN 'new' ELSE 'msg' END,
313
+ CASE kind
314
+ WHEN 'bare' THEN 'fresh_revive'
315
+ WHEN 'noted' THEN 'inbox_message'
316
+ WHEN 'deadline' THEN 'deadline_message'
317
+ WHEN 'spawn' THEN 'node_birth'
318
+ END,
319
+ CASE WHEN kind = 'deadline' THEN 'until' WHEN recur IS NULL THEN 'at' ELSE 'every' END,
320
+ fire_at,
321
+ recur,
322
+ payload,
323
+ created
324
+ FROM wakeups;
325
+
326
+ DROP TABLE wakeups;
327
+ `);
328
+ }
259
329
  /** v8 — additive identity column `host_kind`: which HOST launches + supervises a
260
330
  * node — `'tmux'` (a pane) or `'broker'` (the headless in-process engine). It is
261
331
  * durable IDENTITY mirrored from meta.json like `cwd` (NOT runtime like `pane`),
@@ -266,6 +336,19 @@ function addHostKindColumn(db) {
266
336
  const columns = nodeColumns(db);
267
337
  addNodeColumnIfMissing(db, columns, 'host_kind', `ALTER TABLE nodes ADD COLUMN host_kind TEXT;`);
268
338
  }
339
+ /** v10 — the `canvas_meta` key/value table: a single durable place for
340
+ * small, cross-process canvas-wide scalars that aren't node rows. First user:
341
+ * the boot marker (boot.ts), which records the last-seen kernel boot identity
342
+ * so boot-liveness reconciliation is a single-writer SQLite transaction on
343
+ * this row rather than a race-prone JSON file. Additive, forward-only. */
344
+ function addCanvasMetaTable(db) {
345
+ db.exec(`
346
+ CREATE TABLE IF NOT EXISTS canvas_meta (
347
+ key TEXT PRIMARY KEY,
348
+ value TEXT NOT NULL
349
+ );
350
+ `);
351
+ }
269
352
  /** The ordered migration list. Index `i` is migration version `i + 1`; the db's
270
353
  * `user_version` tracks how many have been applied. Append only. */
271
354
  export const MIGRATIONS = [
@@ -277,6 +360,8 @@ export const MIGRATIONS = [
277
360
  /* v6 */ addFocusesTable,
278
361
  /* v7 */ appendWakeupsTable,
279
362
  /* v8 */ addHostKindColumn,
363
+ /* v9 */ migrateWakeupsToTriggers,
364
+ /* v10 */ addCanvasMetaTable,
280
365
  ];
281
366
  /** Bring `db` up to the latest schema version. Reads `user_version`, runs each
282
367
  * pending migration in order, and bumps `user_version` after each so the work
@@ -4,6 +4,6 @@ export * from './paths.js';
4
4
  export * from './canvas.js';
5
5
  export * from './history.js';
6
6
  export * from './focuses.js';
7
- export * from './wakeups.js';
7
+ export * from './triggers.js';
8
8
  export * from './telemetry.js';
9
9
  export { openDb, closeDb } from './db.js';
@@ -6,6 +6,6 @@ export * from './paths.js';
6
6
  export * from './canvas.js';
7
7
  export * from './history.js';
8
8
  export * from './focuses.js';
9
- export * from './wakeups.js';
9
+ export * from './triggers.js';
10
10
  export * from './telemetry.js';
11
11
  export { openDb, closeDb } from './db.js';
@@ -1,7 +1,7 @@
1
1
  // nav-model.ts — the pure model/render layer of the canvas graph-nav chrome.
2
2
  //
3
3
  // Extracted from src/pi-extensions/canvas-nav.ts so a SINGLE source feeds both
4
- // the legacy pi extension (canvas-nav) and the headless `crtr attach` viewer.
4
+ // the legacy pi extension (canvas-nav) and the headless `crtr surface attach` viewer.
5
5
  // Everything here is pi-API-free: it reads the canvas (sqlite + meta.json + node
6
6
  // telemetry) and produces ANSI-styled strings + a flattened graph model. The
7
7
  // extension-host wiring (widgets, key taps, the ask-poll timer, run/focus
@@ -2,3 +2,9 @@
2
2
  * 0)` throws ESRCH when the process is gone; EPERM means it exists but isn't
3
3
  * ours — still alive. A null/undefined pid (legacy / never-booted) reads dead. */
4
4
  export declare function isPidAlive(pid: number | null | undefined): boolean;
5
+ /** SIGTERM a process GROUP by pid (the negative-pid convention) — best-effort,
6
+ * swallowing ESRCH (already gone). Shared by triggers.ts (cancel-time reap of
7
+ * an in-flight predicate evaluation) and daemon/predicate-eval.ts (per-eval
8
+ * timeout + stale-lease recovery kills). Lives beside isPidAlive: canvas/ is
9
+ * the lowest shared layer every process-liveness/-teardown primitive sits at. */
10
+ export declare function killProcessGroup(pid: number, signal?: NodeJS.Signals): void;
@@ -21,3 +21,16 @@ export function isPidAlive(pid) {
21
21
  return e.code === 'EPERM';
22
22
  }
23
23
  }
24
+ /** SIGTERM a process GROUP by pid (the negative-pid convention) — best-effort,
25
+ * swallowing ESRCH (already gone). Shared by triggers.ts (cancel-time reap of
26
+ * an in-flight predicate evaluation) and daemon/predicate-eval.ts (per-eval
27
+ * timeout + stale-lease recovery kills). Lives beside isPidAlive: canvas/ is
28
+ * the lowest shared layer every process-liveness/-teardown primitive sits at. */
29
+ export function killProcessGroup(pid, signal = 'SIGTERM') {
30
+ try {
31
+ process.kill(-pid, signal);
32
+ }
33
+ catch {
34
+ /* already gone */
35
+ }
36
+ }
@@ -0,0 +1,108 @@
1
+ import type { ArmTriggerSpec, Trigger, TriggerScope } from './types.js';
2
+ /** A thrown integrity-backstop error from armTrigger. `code` is mapped by the
3
+ * command surface to a rendered error block — armTrigger carries integrity
4
+ * backstops only (empty body / recur-on-deadline / unknown action_mode);
5
+ * target-resolvability + recoverable-state + per-owner cap checks live in the
6
+ * surface, so a non-surface armer could insert a dangling trigger — every
7
+ * armer MUST route through the surface. */
8
+ export declare class TriggerArmError extends Error {
9
+ readonly code: string;
10
+ constructor(code: string, message: string);
11
+ }
12
+ /** INSERT one trigger row from the pinned spec, returning its (caller-supplied)
13
+ * `trigger_id`. JSON.stringifies the typed `payload` union into the TEXT
14
+ * column and stamps `created`.
15
+ *
16
+ * Deadline upsert (≤1 deadline per node): for `action_mode === 'deadline_message'`
17
+ * the node's existing deadline is canceled first, then the new one inserted —
18
+ * the partial unique index `idx_triggers_deadline` is the schema-level
19
+ * backstop.
20
+ *
21
+ * Integrity backstops (throw TriggerArmError):
22
+ * - empty/whitespace payload `body` for inbox_message/deadline_message → `empty_body`
23
+ * (a `trigger_type='when'` inbox_message may omit body entirely instead —
24
+ * that is the stdout-as-body case, not a violation).
25
+ * - non-NULL `recur` on a deadline_message → `deadline_cannot_recur`.
26
+ * - unknown `action_mode` → `bad_action_mode`. */
27
+ export declare function armTrigger(spec: ArmTriggerSpec): string;
28
+ /** UPDATE the next fire time — clock recurrence advancement (the daemon settles
29
+ * a recurring row to its next slot BEFORE enacting, crash-safe). */
30
+ export declare function advanceTrigger(trigger_id: string, nextFireIso: string): void;
31
+ /** DELETE one trigger by id — one-shot consumption (the daemon settles a
32
+ * one-shot row BEFORE enacting, crash-safe). */
33
+ /** Deletes the row and reports whether it actually removed a LIVE one (vs a
34
+ * no-op on an already-gone trigger) — callers racing another consumer of the
35
+ * same trigger (e.g. predicate-eval.ts's close handler racing a wall-clock
36
+ * reaper's kill) use the return value to no-op instead of double-enacting. */
37
+ export declare function consumeTrigger(trigger_id: string): boolean;
38
+ /** DELETE one trigger by id — the explicit user/surface cancel. Idempotent:
39
+ * 0 rows ⇒ no error. Kills any in-flight predicate process group for this
40
+ * trigger before deleting. */
41
+ export declare function cancelTrigger(trigger_id: string): void;
42
+ /** DELETE every trigger anchored to this node AND every detached trigger it
43
+ * ARMED — deliberate close/reap. Hooked at transition('cancel'). */
44
+ export declare function cancelTriggersFor(node_id: string): void;
45
+ /** DELETE this node's one-shot self-alarms (recur IS NULL); node-anchored
46
+ * recurring triggers SURVIVE — finalize is the instance finishing, not a
47
+ * teardown of standing schedules. Hooked at transition('finalize'). */
48
+ export declare function cancelSelfAlarms(node_id: string): void;
49
+ /** DELETE this node's pending deadline(s) — cancel-on-wake. Hooked at
50
+ * reviveNode, so the deadline always belongs to the dormancy left. */
51
+ export declare function cancelDeadlinesFor(node_id: string): void;
52
+ /** The daemon's per-tick due query for CLOCK triggers only (`at`/`every`/
53
+ * `until` — predicate `when` triggers fire via next_eval_at, see
54
+ * duePredicateTriggers): every row whose fire_at has arrived, in fire_at
55
+ * order, with `payload` parsed into the typed union. Returns exactly ONE row
56
+ * per recurring trigger regardless of missed slots — coalescing is structural. */
57
+ export declare function dueClockTriggers(nowIso: string): Trigger[];
58
+ /** List triggers for a scope (node / owner / subtree / due / canvas), `payload`
59
+ * parsed as in dueClockTriggers. The subtree variant binds the id set with `?`
60
+ * placeholders (mirroring listNodes — the codebase's one safe dynamic-IN
61
+ * spot); ids are NEVER string-concatenated. The `due` scope is clock-only,
62
+ * matching dueClockTriggers' filter. */
63
+ export declare function listTriggers(scope: TriggerScope): Trigger[];
64
+ /** True if the node has ANY pending self-anchored trigger (of any type).
65
+ * Consumed by the stop-guard self-wake seam so a no-child poll node releases
66
+ * dormant after arming instead of being nagged to finish. */
67
+ export declare function hasPendingSelfTrigger(node_id: string): boolean;
68
+ /** Predicate triggers due for evaluation: idle, `next_eval_at` arrived,
69
+ * deterministic order (`next_eval_at`, then `created`, then `trigger_id` —
70
+ * spec §Daemon behavior step 3). Capacity enforcement (max concurrent
71
+ * canvas-wide / per-owner) is the daemon's job, not this query's. */
72
+ export declare function duePredicateTriggers(nowIso: string): Trigger[];
73
+ /** Atomically acquire the idle lease for one predicate evaluation: flips
74
+ * `eval_state` to 'running' and records lease/pid metadata, but ONLY if the
75
+ * row is still idle (the `WHERE eval_state = 'idle'` guard is the atomicity —
76
+ * two daemons racing the same row can't both win). Returns whether THIS call
77
+ * acquired it. */
78
+ export declare function acquirePredicateLease(trigger_id: string, leaseOwner: string, pid: number, startedAtIso: string): boolean;
79
+ /** The settled outcome of one predicate evaluation, to be recorded by
80
+ * recordPredicateEvalResult. `exitCode` null means the evaluation timed out
81
+ * (no exit was observed). */
82
+ export interface PredicateEvalResult {
83
+ completedAtIso: string;
84
+ /** When the row should next be checked (completed_at + eval_every). */
85
+ nextEvalAtIso: string;
86
+ exitCode: number | null;
87
+ stderrTail: string | null;
88
+ }
89
+ /** Record a non-firing predicate evaluation result (exit non-zero, or a
90
+ * per-eval timeout): releases the lease back to idle and schedules the next
91
+ * check. Exit-0 (fire) is NOT recorded here — the spec's settle-before-enact
92
+ * rule means a firing predicate is consumed (consumeTrigger) then enacted,
93
+ * never left as an idle row. */
94
+ export declare function recordPredicateEvalResult(trigger_id: string, result: PredicateEvalResult): void;
95
+ /** Every predicate trigger currently marked 'running' — the daemon's stale-
96
+ * lease recovery scan on restart checks each recorded `eval_pid` for
97
+ * liveness and calls resetPredicateLease for any that's gone. */
98
+ export declare function runningPredicateTriggers(): Trigger[];
99
+ /** Reset a predicate trigger's lease back to idle without recording a result —
100
+ * stale-lease recovery for a row whose recorded eval_pid is no longer alive
101
+ * (the prior daemon instance died mid-evaluation). */
102
+ export declare function resetPredicateLease(trigger_id: string): void;
103
+ /** Predicate triggers whose WALL-CLOCK timeout has arrived, regardless of
104
+ * eval_state (an in-flight evaluation past its own trigger's timeout_at is
105
+ * still reaped — the caller kills the process group itself since this is a
106
+ * read, not a mutation). Spec §Predicate triggers: "Wall-clock timeout_at
107
+ * reached: consume and notify owner." */
108
+ export declare function duePredicateTimeouts(nowIso: string): Trigger[];