@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,109 @@
1
+ // Regression for final-integrated-verdict Major #1: a predicate whose script
2
+ // writes more than STDOUT_CAP_BYTES to stdout AND exits non-zero must be
3
+ // RESCHEDULED (stay armed), never fired and never stuck running. Before the
4
+ // fix, `finish()` in `src/daemon/predicate-eval.ts` checked `overflowed`
5
+ // BEFORE the exit-code branch, so any verbose non-zero predicate got consumed
6
+ // on its first poll. The fix gates the overflow check on `code === 0 &&
7
+ // stdoutIsBody`. Drives the REAL `evaluateDuePredicates` — no child_process
8
+ // mocking, a real subprocess is spawned.
9
+ import { test, before, beforeEach, after } from 'node:test';
10
+ import assert from 'node:assert/strict';
11
+ import { mkdtempSync, rmSync } from 'node:fs';
12
+ import { tmpdir } from 'node:os';
13
+ import { join } from 'node:path';
14
+ import { createNode, closeDb, armTrigger, listTriggers } from '../../core/canvas/index.js';
15
+ import { evaluateDuePredicates } from '../predicate-eval.js';
16
+ let home;
17
+ function node(id, cwd) {
18
+ return {
19
+ node_id: id,
20
+ name: id,
21
+ created: new Date().toISOString(),
22
+ cwd,
23
+ kind: 'general',
24
+ mode: 'base',
25
+ lifecycle: 'terminal',
26
+ status: 'active',
27
+ };
28
+ }
29
+ before(() => {
30
+ home = mkdtempSync(join(tmpdir(), 'crtr-predicate-eval-'));
31
+ process.env['CRTR_HOME'] = home;
32
+ });
33
+ beforeEach(() => {
34
+ closeDb();
35
+ rmSync(home, { recursive: true, force: true });
36
+ });
37
+ after(() => {
38
+ closeDb();
39
+ rmSync(home, { recursive: true, force: true });
40
+ delete process.env['CRTR_HOME'];
41
+ });
42
+ /** Poll a trigger's row (via listTriggers) until an evaluation has completed
43
+ * (`last_exit` set) or the timeout elapses. Fire-and-forget evaluation
44
+ * settles asynchronously off a real child process. */
45
+ async function waitForEvalSettled(nodeId, timeoutMs = 5000) {
46
+ const start = Date.now();
47
+ for (;;) {
48
+ const rows = listTriggers({ node: nodeId });
49
+ if (rows.length > 0 && rows[0].last_exit !== null)
50
+ return;
51
+ if (Date.now() - start > timeoutMs)
52
+ throw new Error('timed out waiting for predicate evaluation to settle');
53
+ await new Promise((r) => setTimeout(r, 50));
54
+ }
55
+ }
56
+ test('a >16KiB-stdout, non-zero-exit predicate stays armed (rescheduled, not fired/stuck)', async () => {
57
+ const meta = createNode(node('target-1', home));
58
+ const trigger_id = 'trig-overflow-nonzero';
59
+ armTrigger({
60
+ trigger_id,
61
+ node_id: meta.node_id,
62
+ owner_id: meta.node_id,
63
+ action: 'msg',
64
+ action_mode: 'inbox_message',
65
+ trigger_type: 'when',
66
+ when_script: `node -e "process.stdout.write('x'.repeat(20000)); process.exit(1)"`,
67
+ eval_every: JSON.stringify({ every: '1m' }),
68
+ next_eval_at: new Date(Date.now() - 1000).toISOString(),
69
+ payload: { label: 'test' },
70
+ });
71
+ const outcomes = [];
72
+ evaluateDuePredicates(Date.now(), (o) => outcomes.push(o));
73
+ await waitForEvalSettled(meta.node_id);
74
+ // Nothing fired/canceled: onDone was never invoked for this trigger.
75
+ assert.equal(outcomes.length, 0);
76
+ // The trigger row still exists (still armed), rescheduled to idle with the
77
+ // non-zero exit recorded — not stuck 'running'.
78
+ const rows = listTriggers({ node: meta.node_id });
79
+ assert.equal(rows.length, 1);
80
+ assert.equal(rows[0].trigger_id, trigger_id);
81
+ assert.equal(rows[0].eval_state, 'idle');
82
+ assert.notEqual(rows[0].last_exit, 0);
83
+ });
84
+ test('sanity: a small-output exit-0 predicate fires and is consumed', async () => {
85
+ const meta = createNode(node('target-2', home));
86
+ const trigger_id = 'trig-fires-clean';
87
+ armTrigger({
88
+ trigger_id,
89
+ node_id: meta.node_id,
90
+ owner_id: meta.node_id,
91
+ action: 'msg',
92
+ action_mode: 'inbox_message',
93
+ trigger_type: 'when',
94
+ when_script: `echo ok`,
95
+ eval_every: JSON.stringify({ every: '1m' }),
96
+ next_eval_at: new Date(Date.now() - 1000).toISOString(),
97
+ payload: { label: 'test' },
98
+ });
99
+ const outcomes = [];
100
+ evaluateDuePredicates(Date.now(), (o) => outcomes.push(o));
101
+ const start = Date.now();
102
+ while (outcomes.length === 0 && Date.now() - start < 5000) {
103
+ await new Promise((r) => setTimeout(r, 50));
104
+ }
105
+ assert.equal(outcomes.length, 1);
106
+ assert.equal(outcomes[0].kind, 'fired');
107
+ // Consumed: the trigger row is gone.
108
+ assert.equal(listTriggers({ node: meta.node_id }).length, 0);
109
+ });
@@ -50,13 +50,14 @@ import { writeFileSync, readFileSync, rmSync, existsSync, mkdirSync, statSync, }
50
50
  import { dirname, join } from 'node:path';
51
51
  import { homedir } from 'node:os';
52
52
  import { crtrHome, nodeDir, jobDir } from '../core/canvas/paths.js';
53
- import { listNodes, getRow, getNode, dueWakes, consumeWake, advanceWake, listFocuses, closeFocusRow, } from '../core/canvas/index.js';
53
+ import { listNodes, getRow, getNode, dueClockTriggers, consumeTrigger, advanceTrigger, listFocuses, closeFocusRow, pruneToLimit, } from '../core/canvas/index.js';
54
54
  import { transition } from '../core/runtime/lifecycle.js';
55
55
  import { isBusy } from '../core/runtime/busy.js';
56
56
  import { FAULT_QUIET_MS } from '../core/runtime/fault.js';
57
57
  import { logger } from '../core/log.js';
58
58
  export { FAULT_QUIET_MS };
59
59
  import { isPidAlive } from '../core/canvas/pid.js';
60
+ import { reconcileBootLiveness } from '../core/canvas/boot.js';
60
61
  import { listLivePanes, tearDownNode } from '../core/runtime/placement.js';
61
62
  import { reviveNode } from '../core/runtime/revive.js';
62
63
  import { isBrokerLive } from '../core/runtime/model-swap.js';
@@ -66,6 +67,7 @@ import { wakeOriginFrom } from '../core/runtime/bearings.js';
66
67
  import { pushUrgent } from '../core/feed/feed.js';
67
68
  import { appendInbox, readInboxSince, readCursor } from '../core/feed/inbox.js';
68
69
  import { nextSlotAfter } from '../core/wake.js';
70
+ import { evaluateDuePredicates, reapTimedOutPredicates, recoverStalePredicateLeases, predicateCapacity, } from './predicate-eval.js';
69
71
  /** Surface a vehicle that never booted.
70
72
  *
71
73
  * `spawnChild` returns status="active" the instant the tmux window opens — it
@@ -87,6 +89,18 @@ async function surfaceBootFailure(meta) {
87
89
  await pushUrgent(meta.node_id, body, { from: meta.node_id });
88
90
  }
89
91
  const DEFAULT_INTERVAL_MS = 2000;
92
+ // Count-based auto-prune of the canvas (pruneToLimit). The canvas grows
93
+ // unbounded — the TTL `crtr canvas prune` is manual, so without this a long-lived
94
+ // daemon's canvas accumulates thousands of terminal nodes, making every scan +
95
+ // `canvas snapshot` expensive. Keep the AUTO_PRUNE_MAX most-recently-active nodes
96
+ // (live nodes are NEVER deleted, so the real floor is max(AUTO_PRUNE_MAX,
97
+ // liveCount)). It's a DB sweep, not per-tick work — throttled to PRUNE_INTERVAL_MS.
98
+ const AUTO_PRUNE_MAX = 2000;
99
+ const PRUNE_INTERVAL_MS = 60 * 60 * 1000;
100
+ // Last auto-prune wall-clock. -Infinity so the FIRST tick after start runs it
101
+ // (the canvas may already be huge at boot); thereafter every PRUNE_INTERVAL_MS.
102
+ // In-memory only — a daemon restart re-runs it once, which is harmless.
103
+ let lastPruneAt = Number.NEGATIVE_INFINITY;
90
104
  const log = logger('crtrd');
91
105
  // How long a node's broker pid may be observed dead before the daemon revives
92
106
  // it. MUST exceed worst-case broker boot time: a refresh / crash-revive
@@ -116,13 +130,13 @@ const KILL_ESCALATE_MS = 20_000;
116
130
  // unhealthySince — a daemon restart resets them (worst case: one extra grace).
117
131
  const yieldStallSince = new Map();
118
132
  const yieldTermAt = new Map();
119
- // Wake-failure dedup latch (third pass): wakeup_ids we've already fail-loud
133
+ // Trigger-failure dedup latch (third pass): trigger_ids we've already fail-loud
120
134
  // notified about, so a permanently-broken spawn-cron (or a quarantined recurrence)
121
135
  // notifies the armer ONCE and then stays quiet until the next success or cancel —
122
136
  // the unrotated, append-only inbox.jsonl must not be flooded (Min-9). In-memory
123
137
  // only, like unhealthySince; a daemon restart resets it (worst case: one repeat
124
138
  // notice). A successful spawn clears its entry so a future failure re-notifies.
125
- const notifiedWakeFailures = new Set();
139
+ const notifiedTriggerFailures = new Set();
126
140
  /** Refresh-stall decision (§H refresh-authority; audit 2026-06-09, Bug 1 — node
127
141
  * mq5v9hfa-74493d45 and siblings; stuck-refresh — parent mq7s5o93): a `node
128
142
  * yield` / refresh records intent='refresh' and relies on the in-process
@@ -293,6 +307,11 @@ export function livenessVerdict(piPidAlive, deadFor) {
293
307
  * revives it fresh. Fault recovery now runs in a separate pass: live,
294
308
  * daemon-owned provider faults are retried by inbox nudge, while dead-pid
295
309
  * crashes still fall through the ordinary resume path below.
310
+ * • pid null + intent==='idle-release' → dormant by choice; its pid may have
311
+ * just been cleared by boot reconciliation, but a null pid here is still
312
+ * that chosen dormancy, not a stranded relaunch — leave it, the second pass
313
+ * revives (resume) on the next unseen inbox entry (mirrors the dead-pid
314
+ * idle-release case).
296
315
  * • pid null + pi_session_id set (a relaunch in flight — reviveNode clears
297
316
  * pi_pid right after launch) → leave through a boot grace; a healthy engine
298
317
  * re-records its pid well within it. If the grace ELAPSES with still no pid,
@@ -345,6 +364,18 @@ async function handleNodeLiveness(row, now, revivedThisTick) {
345
364
  unhealthySince.delete(id); // row gone from meta — nothing to supervise
346
365
  return;
347
366
  }
367
+ // Dormant by choice: an idle-release node freed itself while dormant. Boot
368
+ // reconciliation may have just cleared its recorded pid to null, but a null
369
+ // pid here is still that chosen dormancy — NOT a stranded relaunch and NOT a
370
+ // failed boot. Honor it exactly like the dead-pid idle-release branch below:
371
+ // leave it idle; the second pass revives it (resume) the moment its inbox
372
+ // gains an unseen entry. Without this, boot reconciliation clearing the pid
373
+ // would drop this node into the boot-grace path and spuriously wake it after
374
+ // the grace with no work waiting.
375
+ if (row.intent === 'idle-release') {
376
+ unhealthySince.delete(id);
377
+ return;
378
+ }
348
379
  const since = unhealthySince.get(id);
349
380
  if (since === undefined) {
350
381
  unhealthySince.set(id, now); // start the boot grace clock
@@ -405,19 +436,20 @@ async function handleNodeLiveness(row, now, revivedThisTick) {
405
436
  reviveNode(id, { resume: true });
406
437
  revivedThisTick.add(id); // third-pass bare double-spawn guard (Maj-4)
407
438
  }
408
- /** Fail loud for a drifted/broken wake (design §6.6/Q5): wake the ARMER DIRECTLY
409
- * via appendInbox — NOT pushUrgent, which fans to subscribersOf(owner), and a
410
- * DETACHED spawn has no subscribers (so the armer would never be reached); the
411
- * literal {from:null} is also a type error for pushUrgent. Deduped per wakeup_id
412
- * (notify once, suppress until the next success/cancel via notifiedWakeFailures)
413
- * so a broken spawn-cron can't flood the unrotated inbox.jsonl. Falls back to a
414
- * loud daemon-log line when the owner no longer resolves to a node. */
415
- function failLoudWake(w, label, body) {
416
- if (notifiedWakeFailures.has(w.wakeup_id))
439
+ /** Fail loud for a drifted/broken trigger (design §6.6/Q5): wake the ARMER
440
+ * DIRECTLY via appendInbox — NOT pushUrgent, which fans to subscribersOf(owner),
441
+ * and a DETACHED spawn has no subscribers (so the armer would never be
442
+ * reached); the literal {from:null} is also a type error for pushUrgent.
443
+ * Deduped per trigger_id (notify once, suppress until the next success/cancel
444
+ * via notifiedTriggerFailures) so a broken spawn-cron can't flood the
445
+ * unrotated inbox.jsonl. Falls back to a loud daemon-log line when the owner
446
+ * no longer resolves to a node. */
447
+ function failLoudTrigger(t, label, body) {
448
+ if (notifiedTriggerFailures.has(t.trigger_id))
417
449
  return;
418
- notifiedWakeFailures.add(w.wakeup_id);
419
- if (getRow(w.owner_id) !== null) {
420
- appendInbox(w.owner_id, {
450
+ notifiedTriggerFailures.add(t.trigger_id);
451
+ if (getRow(t.owner_id) !== null) {
452
+ appendInbox(t.owner_id, {
421
453
  from: null,
422
454
  tier: 'urgent',
423
455
  kind: 'urgent',
@@ -426,7 +458,63 @@ function failLoudWake(w, label, body) {
426
458
  });
427
459
  }
428
460
  else {
429
- process.stderr.write(`[crtrd] wake ${w.wakeup_id} failed (owner ${w.owner_id} gone): ${body}\n`);
461
+ process.stderr.write(`[crtrd] trigger ${t.trigger_id} failed (owner ${t.owner_id} gone): ${body}\n`);
462
+ }
463
+ }
464
+ /** Notify the owner once for a settled (already-consumed) predicate outcome —
465
+ * never deduped like failLoudTrigger, because the trigger is gone by the time
466
+ * this fires so there is no repeat-notification risk to guard against. */
467
+ function notifyOwnerUrgent(t, label, body) {
468
+ if (getRow(t.owner_id) !== null) {
469
+ appendInbox(t.owner_id, { from: null, tier: 'urgent', kind: 'urgent', label, data: { body } });
470
+ }
471
+ else {
472
+ process.stderr.write(`[crtrd] trigger ${t.trigger_id} notice undelivered (owner ${t.owner_id} gone): ${body}\n`);
473
+ }
474
+ }
475
+ /** Settle a predicate outcome onto the SAME enactment paths pass 3 uses
476
+ * (appendInbox / spawnChild) — fresh_revive/deadline_message never reach here
477
+ * (the command surface never pairs `--when` with those action_modes; see the
478
+ * spec's valid flag matrix). stdout_overflow/target_gone are terminal
479
+ * failures the trigger was already consumed for by predicate-eval.ts — this
480
+ * only sends the owner notice. */
481
+ async function handlePredicateOutcome(outcome) {
482
+ const t = outcome.trigger;
483
+ if (outcome.kind === 'stdout_overflow') {
484
+ notifyOwnerUrgent(t, '⚠ predicate stdout too large', `Trigger ${t.trigger_id}'s predicate exceeded the 16 KiB stdout limit — the action was not delivered and the trigger has been canceled.`);
485
+ return;
486
+ }
487
+ if (outcome.kind === 'target_gone') {
488
+ notifyOwnerUrgent(t, '⚠ predicate target gone', `Trigger ${t.trigger_id}'s target no longer exists — the trigger has been canceled.`);
489
+ return;
490
+ }
491
+ // outcome.kind === 'fired'
492
+ if (t.action === 'msg' && t.action_mode === 'inbox_message') {
493
+ const p = t.payload;
494
+ const body = (p.body ?? outcome.stdout).trim();
495
+ if (body === '') {
496
+ notifyOwnerUrgent(t, '⚠ predicate fired with no message', `Trigger ${t.trigger_id}'s predicate exited 0 but produced no body (no supplied body, empty stdout) — nothing was delivered.`);
497
+ return;
498
+ }
499
+ if (t.node_id == null)
500
+ return; // integrity backstop only — armTrigger requires a target here
501
+ appendInbox(t.node_id, {
502
+ from: t.owner_id ?? null,
503
+ tier: p.tier ?? 'normal',
504
+ kind: 'message',
505
+ label: `⏰ predicate fired — ${p.label}`,
506
+ data: { body },
507
+ });
508
+ }
509
+ else if (t.action === 'new' && t.action_mode === 'node_birth') {
510
+ const recipe = t.payload;
511
+ try {
512
+ await spawnChild({ ...recipe, wakeOrigin: wakeOriginFrom(t) });
513
+ }
514
+ catch (err) {
515
+ failLoudTrigger(t, '⚠ deferred predicate spawn failed', `Deferred spawn (${recipe.kind} @ ${recipe.cwd}) failed after its predicate fired: ` +
516
+ `${err.message}\n\nRe-home (fix the cwd/parent) or re-arm the trigger.`);
517
+ }
430
518
  }
431
519
  }
432
520
  // How long a dead node's on-disk record must have been QUIET (no meta/telemetry
@@ -642,143 +730,142 @@ export async function superviseTick(now = Date.now()) {
642
730
  process.stderr.write(`[crtrd] error polling inbox ${row.node_id}: ${err.message}\n`);
643
731
  }
644
732
  }
645
- // Third pass: FIRE DUE SCHEDULED WAKES (the wakeups engine, migration v7).
733
+ // Third pass: FIRE DUE CLOCK TRIGGERS (the triggers engine, migration v9).
646
734
  // Runs immediately AFTER the inbox second pass — the ordering is load-bearing
647
735
  // (design §6.4): a same-tick inbox revive runs cancelDeadlinesFor (inside
648
- // reviveNode) BEFORE this pass's dueWakes query, so an event that wins a
649
- // deadline deletes its row before it can fire. The pass-2 inbox loop above is
650
- // otherwise untouched (design D3) — it stays the generic wake-on-message path
651
- // that noted/deadline rely on; the only addition is the revivedThisTick.add
652
- // observation that the bare branch below needs to avoid a double-spawn.
736
+ // reviveNode) BEFORE this pass's dueClockTriggers query, so an event that wins
737
+ // a deadline deletes its row before it can fire. The pass-2 inbox loop above
738
+ // is otherwise untouched (design D3) — it stays the generic wake-on-message
739
+ // path that inbox_message/deadline_message rely on; the only addition is the
740
+ // revivedThisTick.add observation that the fresh_revive branch below needs to
741
+ // avoid a double-spawn.
653
742
  // For each due row, in fire_at order, settle the row FIRST (advance-or-consume
654
- // — crash-safety, design D4) THEN enact by kind, wrapped per-row so one bad
655
- // wake never kills the tick.
743
+ // — crash-safety, design D4) THEN enact by action/action_mode, wrapped per-row
744
+ // so one bad trigger never kills the tick.
656
745
  const nowIso = new Date(now).toISOString();
657
746
  const nowDate = new Date(now);
658
747
  let due;
659
748
  try {
660
- due = dueWakes(nowIso);
749
+ due = dueClockTriggers(nowIso);
661
750
  }
662
751
  catch (err) {
663
- process.stderr.write(`[crtrd] dueWakes error: ${err.message}\n`);
752
+ process.stderr.write(`[crtrd] dueClockTriggers error: ${err.message}\n`);
664
753
  due = [];
665
754
  }
666
- for (const w of due) {
755
+ for (const t of due) {
667
756
  try {
668
- // 1. Advance-or-consume FIRST (design D4): settle the row's pending state
669
- // before ANY side effect, so a daemon crash mid-fire can never double-
670
- // fire (a double SPAWN is the worst case — structurally prevented here).
671
- if (w.recur == null) {
672
- consumeWake(w.wakeup_id);
757
+ // 1. Settle FIRST: crash-safety advance/consume the trigger before
758
+ // enacting it, so a crash between settle and enact never re-fires.
759
+ if (t.recur == null) {
760
+ consumeTrigger(t.trigger_id);
673
761
  }
674
762
  else {
675
763
  let nextFire;
676
764
  try {
677
- nextFire = nextSlotAfter(w.recur, nowDate);
765
+ nextFire = nextSlotAfter(t.recur, nowDate);
678
766
  }
679
767
  catch (err) {
680
- // The recur is unparseable (parseCadence validates at arm time, so this
681
- // is a rare backstop a corrupted/foreign row). Leaving a past-fire_at
682
- // row pending would re-qualify it EVERY tick (silent CPU spin, enact
683
- // never reached), so quarantine it (consume) + fail loud ONCE; never
684
- // re-query it each tick (Min-8).
685
- consumeWake(w.wakeup_id);
686
- failLoudWake(w, '⚠ recurrence quarantined', `Scheduled wake ${w.wakeup_id} has an unparseable recurrence and was removed: ` +
768
+ consumeTrigger(t.trigger_id);
769
+ failLoudTrigger(t, '⚠ recurrence quarantined', `Scheduled trigger ${t.trigger_id} has an unparseable recurrence and was removed: ` +
687
770
  `${err.message}\n\nRe-arm it with a valid cadence.`);
688
771
  continue;
689
772
  }
690
- advanceWake(w.wakeup_id, nextFire);
773
+ advanceTrigger(t.trigger_id, nextFire);
691
774
  }
692
- // 2. Enact by kind.
693
- if (w.kind === 'bare') {
694
- // A bare wake leaves NO inbox entry, so pass 2 can never wake it — it
695
- // must revive DIRECTLY with resume:false (re-reads roadmap; AC-N2).
696
- const target = w.node_id == null ? null : getRow(w.node_id);
697
- if (target === null)
698
- continue; // target gone (the FK cascade reaped it)
699
- // Same-tick double-spawn guard (Maj-4): pass 1/2 (or an earlier bare row
700
- // this pass) may have revived this node THIS tick — reviveNode clears
701
- // pi_pid to NULL before the fresh pi re-records it, so the pi_pid==null
702
- // liveness check below would falsely read "not live" and a second
703
- // reviveNode would launch a SECOND pi on the same .jsonl (corruption).
704
- // (Pane-existence is the WRONG guard — it would no-op a frozen-focus bare
705
- // wake, which is pane-alive/pi-dead by design.)
775
+ // 2. Enact by action/action_mode.
776
+ if (t.action === 'msg' && t.action_mode === 'fresh_revive') {
777
+ const target = t.node_id == null ? null : getRow(t.node_id);
778
+ if (target === null) {
779
+ notifyOwnerUrgent(t, '⚠ scheduled trigger target gone', `Trigger ${t.trigger_id}'s target no longer exists no revive happened.`);
780
+ continue;
781
+ }
706
782
  if (revivedThisTick.has(target.node_id))
707
783
  continue;
708
- // pi live → no-op (AC-E3 bare): an already-awake node needs no revive.
709
784
  if (target.pi_pid != null && isPidAlive(target.pi_pid))
710
785
  continue;
711
786
  process.stderr.write(`[crtrd] wake ${target.node_id} (bare alarm)\n`);
712
- // wakeReason carries the timer provenance so the fresh-revive kickoff
713
- // leads with a <crtr-wake> block (Invariant B/D: the node learns a clock,
714
- // not an event, woke it) instead of a generic context-refresh framing.
715
- reviveNode(target.node_id, { resume: false, wakeReason: wakeOriginFrom(w) });
787
+ reviveNode(target.node_id, { resume: false, wakeReason: wakeOriginFrom(t) });
716
788
  revivedThisTick.add(target.node_id);
717
789
  }
718
- else if (w.kind === 'noted') {
719
- // Deliver the note; the UNMODIFIED pass 2 wakes the dormant target next
720
- // tick (AC-N1), or its live in-process watcher delivers it (AC-E3 noted).
721
- if (w.node_id == null)
790
+ else if (t.action === 'msg' && t.action_mode === 'inbox_message') {
791
+ if (t.node_id == null) {
792
+ notifyOwnerUrgent(t, '⚠ scheduled trigger target gone', `Trigger ${t.trigger_id}'s target no longer exists nothing was delivered.`);
722
793
  continue;
723
- const p = w.payload;
724
- // Mark the delivery as a SCHEDULED wake (Invariant D): the woken node sees
725
- // only the rendered digest (inbox inlines label/body, never arbitrary
726
- // data keys), so the timer signal MUST ride the visible label — the same
727
- // family deadline uses — so a noted wake is distinguishable from a plain
728
- // `node msg`, not indistinguishable from it.
729
- appendInbox(w.node_id, {
730
- from: w.owner_id ?? null,
731
- tier: 'normal',
794
+ }
795
+ const p = t.payload;
796
+ appendInbox(t.node_id, {
797
+ from: t.owner_id ?? null,
798
+ tier: p.tier ?? 'normal',
732
799
  kind: 'message',
733
800
  label: `⏰ scheduled wake — ${p.label}`,
734
- data: { body: p.body },
801
+ data: { body: p.body ?? '' },
735
802
  });
736
803
  }
737
- else if (w.kind === 'deadline') {
738
- // Same delivery as noted but URGENT tier. The woken node sees only the
739
- // RENDERED digest (inbox inlines label/body, NEVER arbitrary data keys),
740
- // so the timeout signal MUST ride the visible label/body (Maj-8);
741
- // data.timeout is a machine-readable mirror only. body is always non-
742
- // empty (the surface supplies a default timeout note when none is
743
- // authored, Maj-7). One-shot — already consumed in step 1.
744
- if (w.node_id == null)
804
+ else if (t.action === 'msg' && t.action_mode === 'deadline_message') {
805
+ if (t.node_id == null) {
806
+ notifyOwnerUrgent(t, '⚠ scheduled trigger target gone', `Trigger ${t.trigger_id}'s target no longer exists — nothing was delivered.`);
745
807
  continue;
746
- const p = w.payload;
747
- appendInbox(w.node_id, {
748
- from: w.owner_id ?? null,
808
+ }
809
+ const p = t.payload;
810
+ appendInbox(t.node_id, {
811
+ from: t.owner_id ?? null,
749
812
  tier: 'urgent',
750
813
  kind: 'message',
751
814
  label: `⏰ deadline reached — ${p.label}`,
752
815
  data: { body: p.body, timeout: true },
753
816
  });
754
817
  }
755
- else if (w.kind === 'spawn') {
756
- // Re-derives LaunchSpec live (AC-W2); payload.parent is the non-null
757
- // resolved armer id (T2/T7 guarantee it), so spawnChild never throws the
758
- // "requires a calling node" error even for a --root recipe.
759
- const recipe = w.payload;
818
+ else if (t.action === 'new' && t.action_mode === 'node_birth') {
819
+ const recipe = t.payload;
760
820
  try {
761
- // Spread in the wake provenance at fire time (in-memory only; never the
762
- // stored recipe) so the born node's kickoff leads with a <crtr-wake>
763
- // block — it learns, by construction, that a timer birthed it (and, for
764
- // a spawn-cron, that it is one run of a standing job).
765
- await spawnChild({ ...recipe, wakeOrigin: wakeOriginFrom(w) });
766
- notifiedWakeFailures.delete(w.wakeup_id); // success clears the dedup latch
821
+ await spawnChild({ ...recipe, wakeOrigin: wakeOriginFrom(t) });
822
+ notifiedTriggerFailures.delete(t.trigger_id);
767
823
  }
768
824
  catch (err) {
769
- // Fail loud by waking the ARMER DIRECTLY (design §6.6/Q5). The row was
770
- // already settled in step 1, so this is never a hot retry loop; a
771
- // permanently-broken spawn-cron stays deduped-noisy until cancel.
772
- failLoudWake(w, '⚠ deferred spawn failed', `Deferred spawn (${recipe.kind} @ ${recipe.cwd}) failed: ` +
773
- `${err.message}\n\nRe-home (fix the cwd/parent) or re-arm the wake.`);
825
+ failLoudTrigger(t, '⚠ deferred spawn failed', `Deferred spawn (${recipe.kind} @ ${recipe.cwd}) failed: ` +
826
+ `${err.message}\n\nRe-home (fix the cwd/parent) or re-arm the trigger.`);
774
827
  }
775
828
  }
776
829
  }
777
830
  catch (err) {
778
- // One bad wake never kills the tick.
779
- process.stderr.write(`[crtrd] error firing wake ${w.wakeup_id}: ${err.message}\n`);
831
+ process.stderr.write(`[crtrd] error firing trigger ${t.trigger_id}: ${err.message}\n`);
780
832
  }
781
833
  }
834
+ // Pass 3a: recover stale predicate leases stranded by a PRIOR daemon
835
+ // instance (crash/restart mid-evaluation) — BEFORE 3b/3c, so a row a dead
836
+ // daemon left `eval_state='running'` forever can rejoin the idle pool
837
+ // instead of being wedged out of duePredicateTriggers' idle-only filter
838
+ // (spec §Daemon-behavior step 1, acceptance criterion 9: survives restart).
839
+ try {
840
+ recoverStalePredicateLeases(now, predicateCapacity());
841
+ }
842
+ catch (err) {
843
+ process.stderr.write(`[crtrd] recoverStalePredicateLeases error: ${err.message}\n`);
844
+ }
845
+ // Pass 3b: wall-clock predicate timeouts — reap regardless of eval_state,
846
+ // BEFORE selecting fresh evaluations (so a timed-out row can never also be
847
+ // evaluated this same tick — consumeTrigger removes it from the due query).
848
+ try {
849
+ reapTimedOutPredicates(now, (t) => {
850
+ notifyOwnerUrgent(t, '⚠ predicate timed out', `Trigger ${t.trigger_id}'s wall-clock timeout was reached before its predicate ever fired — it has been canceled.`);
851
+ });
852
+ }
853
+ catch (err) {
854
+ process.stderr.write(`[crtrd] reapTimedOutPredicates error: ${err.message}\n`);
855
+ }
856
+ // Pass 3c: kick off due predicate evaluations. Fire-and-forget — settlement
857
+ // happens async via onDone, decoupled from this tick (never awaited; a slow/
858
+ // hung predicate must never block supervision, spec §Predicate triggers).
859
+ try {
860
+ evaluateDuePredicates(now, (outcome) => {
861
+ handlePredicateOutcome(outcome).catch((err) => {
862
+ process.stderr.write(`[crtrd] predicate outcome error: ${err.message}\n`);
863
+ });
864
+ });
865
+ }
866
+ catch (err) {
867
+ process.stderr.write(`[crtrd] evaluateDuePredicates error: ${err.message}\n`);
868
+ }
782
869
  // Fourth pass: reap the leftover placement of long-dead nodes (Bug 3), then
783
870
  // sweep focus rows whose pane died outside the sanctioned teardown paths
784
871
  // (Bug 5). Reap first so the GC also catches any focus row a reaped pane
@@ -786,6 +873,25 @@ export async function superviseTick(now = Date.now()) {
786
873
  // re-anchored.
787
874
  reapDeadResidue(now);
788
875
  gcStaleFocuses();
876
+ // Fifth pass: count-based auto-prune, throttled to once per PRUNE_INTERVAL_MS
877
+ // (NOT every 2s tick — it's a full-canvas DB sweep). Keeps the AUTO_PRUNE_MAX
878
+ // most-recently-active nodes; live nodes are never deleted (pruneToLimit's
879
+ // floor is max(AUTO_PRUNE_MAX, liveCount)). Wrapped so a sweep failure never
880
+ // crashes the tick; the tick is already serialized (recursive setTimeout), so
881
+ // this runs sequentially within it.
882
+ if (now - lastPruneAt >= PRUNE_INTERVAL_MS) {
883
+ lastPruneAt = now;
884
+ try {
885
+ const before = listNodes().length;
886
+ const { pruned } = pruneToLimit({ maxNodes: AUTO_PRUNE_MAX });
887
+ if (pruned.length > 0) {
888
+ process.stderr.write(`[crtrd] auto-prune: removed ${pruned.length} nodes (kept ${before - pruned.length})\n`);
889
+ }
890
+ }
891
+ catch (err) {
892
+ process.stderr.write(`[crtrd] auto-prune error: ${err.message}\n`);
893
+ }
894
+ }
789
895
  }
790
896
  /** Start the supervisor loop.
791
897
  *
@@ -802,6 +908,19 @@ export function runDaemon(opts = {}) {
802
908
  process.exit(0);
803
909
  }
804
910
  const interval = opts.intervalMs ?? DEFAULT_INTERVAL_MS;
911
+ // Once, before the first tick ever inspects a single `pi_pid`: detect a boot
912
+ // change (a host reboot, or a sandbox/VM destroy+recreate — canvas.db is
913
+ // durable and survives either, but every `pi_pid` it carries is a raw OS pid
914
+ // from the process table THAT reset) and clear every stale pid up front. This
915
+ // must run before the tick loop, not lazily inside reviveNode: the daemon's
916
+ // OWN liveness poll (handleNodeLiveness) treats `isPidAlive(pid) === true` as
917
+ // "leave it, nothing to revive" and never calls reviveNode at all — a
918
+ // pid-reuse collision on the first post-boot tick would silently no-op
919
+ // forever with no revive attempt to even hit reviveNode's own reconcile call.
920
+ const { changed, cleared } = reconcileBootLiveness();
921
+ if (changed) {
922
+ process.stderr.write(`[crtrd] boot change detected — cleared ${cleared.length} stale pi_pid(s) recorded before this boot\n`);
923
+ }
805
924
  writePidfile();
806
925
  log.info(`started (pid ${process.pid}, interval ${interval}ms)`);
807
926
  let running = true;
@@ -0,0 +1,52 @@
1
+ import { type Trigger } from '../core/canvas/index.js';
2
+ export declare const STDOUT_CAP_BYTES: number;
3
+ export declare const STDERR_TAIL_BYTES: number;
4
+ export interface PredicateCapacity {
5
+ maxCanvas: number;
6
+ maxPerOwner: number;
7
+ evalTimeoutMs: number;
8
+ }
9
+ /** Read fresh each pass (not cached at module load) so a test/operator can
10
+ * tune it via env without a daemon restart mid-run. */
11
+ export declare function predicateCapacity(): PredicateCapacity;
12
+ /** One id per daemon PROCESS instance — distinguishes THIS process's own
13
+ * in-flight leases from a stale 'running' row a prior (crashed/restarted)
14
+ * daemon left behind (spec §Lease / in-flight contract, daemon-restart
15
+ * recovery). Generated once per process; tests that want deterministic
16
+ * recovery behavior can ignore it (recovery only special-cases OWN leases). */
17
+ export declare const daemonInstanceId: `${string}-${string}-${string}-${string}-${string}`;
18
+ export type PredicateOutcome = {
19
+ kind: 'fired';
20
+ trigger: Trigger;
21
+ stdout: string;
22
+ } | {
23
+ kind: 'stdout_overflow';
24
+ trigger: Trigger;
25
+ } | {
26
+ kind: 'target_gone';
27
+ trigger: Trigger;
28
+ };
29
+ /** Recover stale in-flight rows left by a PRIOR daemon instance (crash/
30
+ * restart): a still-alive process group past its own eval timeout is killed +
31
+ * recorded as a timeout; a dead pid resets straight to idle with no
32
+ * diagnostics (spec: "if not alive, the row is reset to idle and eligible for
33
+ * the next evaluation slot"). Rows this SAME instance owns are left alone —
34
+ * they are genuinely in flight, not stale. */
35
+ export declare function recoverStalePredicateLeases(now: number, config: PredicateCapacity): void;
36
+ /** Wall-clock `timeout_at` reap — independent of eval_state/next_eval_at.
37
+ * Kills any in-flight process group for a timed-out row, consumes it, and
38
+ * invokes `onTimeout` once per row so the caller can send the owner urgent
39
+ * notice (spec: "consume and notify owner"). Call BEFORE
40
+ * evaluateDuePredicates each tick so a timed-out row can never also be
41
+ * freshly evaluated in the same tick (consumeTrigger removes it from the due
42
+ * query). */
43
+ export declare function reapTimedOutPredicates(now: number, onTimeout: (t: Trigger) => void): void;
44
+ /** Pass 3c: select due idle predicates (deterministic order from the DAO),
45
+ * enforce capacity in-memory (seeded from the current running-row snapshot),
46
+ * and kick off evaluations — NEVER awaited. `onDone` fires per trigger,
47
+ * whenever it settles (possibly after this call returns). Rows over capacity,
48
+ * or whose owner is at its per-owner cap, are left untouched (idle,
49
+ * next_eval_at unchanged) and are retried next tick. A `msg` trigger whose
50
+ * target no longer exists is reaped here (consumed + `target_gone`) instead
51
+ * of being spawned against a dangling id. */
52
+ export declare function evaluateDuePredicates(now: number, onDone: (o: PredicateOutcome) => void): void;