@crouton-kit/crouter 0.3.33 → 0.3.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (617) hide show
  1. package/README.md +2 -2
  2. package/dist/build-root.js +3 -6
  3. package/dist/builtin-memory/crouter-development/marketplaces.md +6 -6
  4. package/dist/builtin-memory/crouter-development/plugins.md +13 -13
  5. package/dist/builtin-memory/internal/examples/imessage-assistant.md +3 -3
  6. package/dist/builtin-memory/internal/nodes-and-canvas.md +4 -4
  7. package/dist/builtin-personas/developer/PERSONA.md +1 -1
  8. package/dist/builtin-personas/orchestration-kernel.md +1 -1
  9. package/dist/builtin-personas/waiting.md +1 -1
  10. package/dist/builtin-pi-packages/pi-crtr-extensions/README.md +71 -0
  11. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/crtr-help-gate.test.ts +41 -0
  12. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/provider-rotation.test.ts +663 -0
  13. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +52 -0
  14. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +418 -0
  15. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crouter-help.ts +87 -0
  16. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crtr-commands/filters.json +7 -0
  17. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crtr-commands/index.ts +174 -0
  18. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crtr-help-gate.ts +408 -0
  19. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +442 -0
  20. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +119 -0
  21. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/nested-context.ts +327 -0
  22. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +574 -0
  23. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/statusline.ts +260 -0
  24. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/strip-skills-docs.ts +40 -0
  25. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/sysprompt-window.ts +19 -0
  26. package/dist/builtin-pi-packages/pi-crtr-extensions/lib/package.json +3 -0
  27. package/dist/builtin-pi-packages/pi-crtr-extensions/lib/subscription-state.js +1 -0
  28. package/dist/builtin-pi-packages/pi-crtr-extensions/lib/subscription-state.ts +479 -0
  29. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/LICENSE +13 -0
  30. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/README.md +172 -0
  31. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/bin.mjs +11 -0
  32. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-collection.js +88 -0
  33. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-doc.js +43 -0
  34. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-node.js +109 -0
  35. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-scalar.js +86 -0
  36. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/composer.js +219 -0
  37. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-block-map.js +115 -0
  38. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +198 -0
  39. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +49 -0
  40. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-end.js +37 -0
  41. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +207 -0
  42. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +225 -0
  43. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-props.js +146 -0
  44. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-contains-newline.js +34 -0
  45. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +26 -0
  46. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +15 -0
  47. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-map-includes.js +13 -0
  48. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/Document.js +335 -0
  49. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/anchors.js +71 -0
  50. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/applyReviver.js +55 -0
  51. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/createNode.js +88 -0
  52. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/directives.js +176 -0
  53. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/errors.js +57 -0
  54. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/index.js +17 -0
  55. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/log.js +11 -0
  56. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Alias.js +116 -0
  57. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Collection.js +147 -0
  58. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Node.js +38 -0
  59. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Pair.js +36 -0
  60. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Scalar.js +24 -0
  61. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/YAMLMap.js +144 -0
  62. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +113 -0
  63. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +63 -0
  64. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/identity.js +36 -0
  65. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/toJS.js +37 -0
  66. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst-scalar.js +214 -0
  67. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst-stringify.js +61 -0
  68. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst-visit.js +97 -0
  69. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst.js +98 -0
  70. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/lexer.js +721 -0
  71. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/line-counter.js +39 -0
  72. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/parser.js +975 -0
  73. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/public-api.js +102 -0
  74. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/Schema.js +37 -0
  75. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/map.js +17 -0
  76. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/null.js +15 -0
  77. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/seq.js +17 -0
  78. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/string.js +14 -0
  79. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/bool.js +19 -0
  80. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/float.js +43 -0
  81. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/int.js +38 -0
  82. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/schema.js +23 -0
  83. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/json/schema.js +62 -0
  84. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/tags.js +96 -0
  85. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +58 -0
  86. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +26 -0
  87. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +46 -0
  88. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +71 -0
  89. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +67 -0
  90. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +74 -0
  91. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +78 -0
  92. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +39 -0
  93. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +93 -0
  94. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +101 -0
  95. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +146 -0
  96. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringify.js +129 -0
  97. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +153 -0
  98. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyComment.js +20 -0
  99. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +85 -0
  100. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +25 -0
  101. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyPair.js +150 -0
  102. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyString.js +336 -0
  103. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/util.js +11 -0
  104. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/visit.js +233 -0
  105. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/index.js +5 -0
  106. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/package.json +3 -0
  107. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/cli.d.ts +8 -0
  108. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/cli.mjs +201 -0
  109. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-collection.d.ts +11 -0
  110. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-collection.js +90 -0
  111. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-doc.d.ts +7 -0
  112. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-doc.js +45 -0
  113. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-node.d.ts +29 -0
  114. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-node.js +112 -0
  115. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-scalar.d.ts +5 -0
  116. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-scalar.js +88 -0
  117. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/composer.d.ts +63 -0
  118. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/composer.js +224 -0
  119. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-map.d.ts +6 -0
  120. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-map.js +117 -0
  121. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +11 -0
  122. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-scalar.js +200 -0
  123. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +6 -0
  124. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-seq.js +51 -0
  125. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-end.d.ts +6 -0
  126. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-end.js +39 -0
  127. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +7 -0
  128. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-collection.js +209 -0
  129. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +10 -0
  130. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-scalar.js +227 -0
  131. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-props.d.ts +23 -0
  132. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-props.js +148 -0
  133. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-contains-newline.d.ts +2 -0
  134. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-contains-newline.js +36 -0
  135. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +2 -0
  136. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-empty-scalar-position.js +28 -0
  137. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +3 -0
  138. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-flow-indent-check.js +17 -0
  139. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-map-includes.d.ts +4 -0
  140. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-map-includes.js +15 -0
  141. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/Document.d.ts +141 -0
  142. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/Document.js +337 -0
  143. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/anchors.d.ts +24 -0
  144. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/anchors.js +76 -0
  145. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/applyReviver.d.ts +9 -0
  146. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/applyReviver.js +57 -0
  147. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/createNode.d.ts +17 -0
  148. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/createNode.js +90 -0
  149. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/directives.d.ts +49 -0
  150. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/directives.js +178 -0
  151. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/errors.d.ts +21 -0
  152. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/errors.js +62 -0
  153. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/index.d.ts +25 -0
  154. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/index.js +50 -0
  155. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/log.d.ts +3 -0
  156. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/log.js +19 -0
  157. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Alias.d.ts +29 -0
  158. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Alias.js +118 -0
  159. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Collection.d.ts +73 -0
  160. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Collection.js +151 -0
  161. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Node.d.ts +53 -0
  162. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Node.js +40 -0
  163. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Pair.d.ts +22 -0
  164. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Pair.js +39 -0
  165. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Scalar.d.ts +47 -0
  166. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Scalar.js +27 -0
  167. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLMap.d.ts +53 -0
  168. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLMap.js +147 -0
  169. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +60 -0
  170. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLSeq.js +115 -0
  171. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +4 -0
  172. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/addPairToJSMap.js +65 -0
  173. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/identity.d.ts +23 -0
  174. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/identity.js +53 -0
  175. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/toJS.d.ts +29 -0
  176. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/toJS.js +39 -0
  177. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/options.d.ts +350 -0
  178. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-scalar.d.ts +64 -0
  179. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-scalar.js +218 -0
  180. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-stringify.d.ts +8 -0
  181. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-stringify.js +63 -0
  182. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-visit.d.ts +39 -0
  183. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-visit.js +99 -0
  184. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst.d.ts +109 -0
  185. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst.js +112 -0
  186. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/lexer.d.ts +87 -0
  187. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/lexer.js +723 -0
  188. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/line-counter.d.ts +22 -0
  189. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/line-counter.js +41 -0
  190. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/parser.d.ts +84 -0
  191. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/parser.js +980 -0
  192. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/public-api.d.ts +44 -0
  193. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/public-api.js +107 -0
  194. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/Schema.d.ts +17 -0
  195. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/Schema.js +39 -0
  196. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/map.d.ts +2 -0
  197. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/map.js +19 -0
  198. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/null.d.ts +4 -0
  199. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/null.js +17 -0
  200. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/seq.d.ts +2 -0
  201. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/seq.js +19 -0
  202. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/string.d.ts +2 -0
  203. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/string.js +16 -0
  204. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/bool.d.ts +4 -0
  205. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/bool.js +21 -0
  206. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/float.d.ts +4 -0
  207. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/float.js +47 -0
  208. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/int.d.ts +4 -0
  209. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/int.js +42 -0
  210. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/schema.d.ts +1 -0
  211. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/schema.js +25 -0
  212. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/json/schema.d.ts +2 -0
  213. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/json/schema.js +64 -0
  214. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/json-schema.d.ts +69 -0
  215. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/tags.d.ts +48 -0
  216. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/tags.js +99 -0
  217. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/types.d.ts +92 -0
  218. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +2 -0
  219. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/binary.js +70 -0
  220. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +7 -0
  221. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/bool.js +29 -0
  222. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +4 -0
  223. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/float.js +50 -0
  224. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +5 -0
  225. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/int.js +76 -0
  226. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +9 -0
  227. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/merge.js +71 -0
  228. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +22 -0
  229. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/omap.js +77 -0
  230. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +10 -0
  231. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +82 -0
  232. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +1 -0
  233. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/schema.js +41 -0
  234. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +28 -0
  235. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/set.js +96 -0
  236. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +6 -0
  237. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +105 -0
  238. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +34 -0
  239. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/foldFlowLines.js +151 -0
  240. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringify.d.ts +21 -0
  241. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringify.js +132 -0
  242. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +17 -0
  243. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyCollection.js +155 -0
  244. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyComment.d.ts +10 -0
  245. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyComment.js +24 -0
  246. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +4 -0
  247. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyDocument.js +87 -0
  248. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +2 -0
  249. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyNumber.js +27 -0
  250. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyPair.d.ts +3 -0
  251. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyPair.js +152 -0
  252. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyString.d.ts +9 -0
  253. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyString.js +338 -0
  254. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/test-events.d.ts +4 -0
  255. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/test-events.js +134 -0
  256. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/util.d.ts +16 -0
  257. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/util.js +28 -0
  258. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/visit.d.ts +102 -0
  259. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/visit.js +236 -0
  260. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/package.json +97 -0
  261. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/util.js +2 -0
  262. package/dist/builtin-pi-packages/pi-crtr-extensions/package-lock.json +3385 -0
  263. package/dist/builtin-pi-packages/pi-crtr-extensions/package.json +25 -0
  264. package/dist/builtin-pi-packages/pi-mode-switch/README.md +64 -0
  265. package/dist/builtin-pi-packages/pi-mode-switch/bin/mode +40 -0
  266. package/dist/builtin-pi-packages/pi-mode-switch/extensions/index.ts +427 -0
  267. package/dist/builtin-pi-packages/pi-mode-switch/package.json +13 -0
  268. package/dist/clients/attach/__tests__/crtr-output-coverage.test.js +55 -0
  269. package/dist/clients/attach/__tests__/crtr-output-render.test.js +2340 -0
  270. package/dist/clients/attach/attach-cmd.js +843 -743
  271. package/dist/clients/attach/auth-pickers.js +2 -2
  272. package/dist/clients/attach/canvas-panels.js +1 -1
  273. package/dist/clients/attach/chat-view.d.ts +3 -2
  274. package/dist/clients/attach/chat-view.js +30 -10
  275. package/dist/clients/attach/clipboard-image.js +1 -1
  276. package/dist/clients/attach/clipboard-text.js +1 -1
  277. package/dist/clients/attach/config-load.js +1 -1
  278. package/dist/clients/attach/crtr-output-render.d.ts +48 -0
  279. package/dist/clients/attach/crtr-output-render.js +646 -0
  280. package/dist/clients/attach/extension-dialogs.js +1 -1
  281. package/dist/clients/attach/graph-overlay.js +3 -3
  282. package/dist/clients/attach/input-controller.js +1 -1
  283. package/dist/clients/attach/pickers.js +1 -1
  284. package/dist/clients/attach/slash-commands.js +5 -6
  285. package/dist/clients/attach/titled-editor.d.ts +4 -0
  286. package/dist/clients/attach/titled-editor.js +13 -1
  287. package/dist/clients/attach/view-socket.js +1 -1
  288. package/dist/clients/web/__tests__/source-cache.test.js +5 -5
  289. package/dist/clients/web/server.js +29 -5
  290. package/dist/clients/web/source-cache.js +3 -3
  291. package/dist/clients/web/web-cmd.js +7 -7
  292. package/dist/commands/canvas-issue.js +1 -1
  293. package/dist/commands/canvas-prune.js +24 -2
  294. package/dist/commands/canvas-snapshot.js +3 -0
  295. package/dist/commands/canvas-tmux-spread.js +3 -3
  296. package/dist/commands/human.js +1 -1
  297. package/dist/commands/memory/lint.js +15 -8
  298. package/dist/commands/memory/origin.d.ts +1 -0
  299. package/dist/commands/memory/origin.js +88 -0
  300. package/dist/commands/memory/shared.d.ts +8 -0
  301. package/dist/commands/memory/shared.js +22 -1
  302. package/dist/commands/memory/write.js +17 -12
  303. package/dist/commands/memory.js +4 -3
  304. package/dist/commands/node-context.js +4 -4
  305. package/dist/commands/node-snapshot.js +4 -1
  306. package/dist/commands/node.d.ts +2 -2
  307. package/dist/commands/node.js +814 -606
  308. package/dist/commands/pkg/market-inspect.d.ts +2 -1
  309. package/dist/commands/pkg/market-inspect.js +14 -32
  310. package/dist/commands/pkg/market-manage.d.ts +3 -1
  311. package/dist/commands/pkg/market-manage.js +58 -154
  312. package/dist/commands/pkg/market.js +7 -7
  313. package/dist/commands/pkg/plugin-inspect.d.ts +2 -1
  314. package/dist/commands/pkg/plugin-inspect.js +8 -24
  315. package/dist/commands/pkg/plugin-manage.d.ts +5 -1
  316. package/dist/commands/pkg/plugin-manage.js +245 -171
  317. package/dist/commands/pkg/plugin.js +6 -6
  318. package/dist/commands/pkg.js +5 -5
  319. package/dist/commands/revive.js +5 -3
  320. package/dist/commands/search/answer.js +1 -1
  321. package/dist/commands/search/contents.js +1 -1
  322. package/dist/commands/search/web.js +2 -2
  323. package/dist/commands/search.js +1 -1
  324. package/dist/commands/surface.d.ts +2 -0
  325. package/dist/commands/surface.js +43 -0
  326. package/dist/commands/sys/promptstudio.js +1 -1
  327. package/dist/commands/sys/settings.js +2 -2
  328. package/dist/commands/sys/setup-core.d.ts +88 -0
  329. package/dist/commands/sys/setup-core.js +352 -0
  330. package/dist/commands/sys/setup.d.ts +2 -0
  331. package/dist/commands/sys/setup.js +516 -0
  332. package/dist/commands/sys/sysprompt.js +3 -0
  333. package/dist/commands/sys.js +3 -2
  334. package/dist/commands/view-cycle.js +5 -5
  335. package/dist/commands/view-list.js +3 -3
  336. package/dist/commands/view-new.js +5 -5
  337. package/dist/commands/view-pick.js +6 -6
  338. package/dist/commands/view-run.js +14 -14
  339. package/dist/commands/view.js +3 -3
  340. package/dist/commands/workspace.js +10 -10
  341. package/dist/core/__tests__/boot.test.js +140 -0
  342. package/dist/core/__tests__/broker-sdk-wiring.test.js +6 -27
  343. package/dist/core/__tests__/daemon-boot.test.js +22 -0
  344. package/dist/core/__tests__/fixtures/fake-engine.js +19 -9
  345. package/dist/core/__tests__/flagship-lifecycle.test.js +4 -1
  346. package/dist/core/__tests__/full/broker-attach-limits.test.js +1 -1
  347. package/dist/core/__tests__/full/broker-attach-stream.test.js +1 -1
  348. package/dist/core/__tests__/full/broker-crash-teardown.test.js +10 -5
  349. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +1 -1
  350. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +2 -2
  351. package/dist/core/__tests__/full/broker-pane-resolution.test.js +1 -1
  352. package/dist/core/__tests__/full/cascade-close.test.js +31 -18
  353. package/dist/core/__tests__/full/detach-focus.test.js +17 -3
  354. package/dist/core/__tests__/hearth-bootstrap.test.js +136 -0
  355. package/dist/core/__tests__/helpers/harness.js +1 -1
  356. package/dist/core/__tests__/live-mutation-verbs.test.js +17 -11
  357. package/dist/core/__tests__/live-mutation.test.js +15 -10
  358. package/dist/core/__tests__/migration.test.js +124 -0
  359. package/dist/core/__tests__/on-read-dedup-resume.test.js +40 -0
  360. package/dist/core/__tests__/preview-registry-sync.test.js +36 -0
  361. package/dist/core/__tests__/prune-to-limit.test.js +91 -0
  362. package/dist/core/__tests__/revive.test.js +64 -21
  363. package/dist/core/__tests__/trigger-migration.test.js +48 -0
  364. package/dist/core/__tests__/wake-bearings.test.js +23 -21
  365. package/dist/core/__tests__/wake-origin.test.js +36 -33
  366. package/dist/core/canvas/boot.d.ts +48 -0
  367. package/dist/core/canvas/boot.js +157 -0
  368. package/dist/core/canvas/canvas.d.ts +27 -1
  369. package/dist/core/canvas/canvas.js +86 -5
  370. package/dist/core/canvas/db.js +86 -1
  371. package/dist/core/canvas/index.d.ts +1 -1
  372. package/dist/core/canvas/index.js +1 -1
  373. package/dist/core/canvas/nav-model.js +1 -1
  374. package/dist/core/canvas/pid.d.ts +6 -0
  375. package/dist/core/canvas/pid.js +13 -0
  376. package/dist/core/canvas/triggers.d.ts +108 -0
  377. package/dist/core/canvas/triggers.js +320 -0
  378. package/dist/core/canvas/types.d.ts +128 -46
  379. package/dist/core/command.js +13 -4
  380. package/dist/core/hearth/__tests__/model-auth-guest.test.js +151 -0
  381. package/dist/core/hearth/config.d.ts +1 -0
  382. package/dist/core/hearth/config.js +36 -3
  383. package/dist/core/hearth/guest-env.d.ts +7 -0
  384. package/dist/core/hearth/guest-env.js +17 -1
  385. package/dist/core/hearth/index.d.ts +0 -1
  386. package/dist/core/hearth/index.js +0 -1
  387. package/dist/core/hearth/model-auth-guest.d.ts +8 -0
  388. package/dist/core/hearth/model-auth-guest.js +430 -0
  389. package/dist/core/hearth/provider.d.ts +13 -6
  390. package/dist/core/hearth/providers/blaxel-bootstrap.d.ts +2 -0
  391. package/dist/core/hearth/providers/blaxel-bootstrap.js +127 -19
  392. package/dist/core/hearth/providers/blaxel-home.d.ts +8 -4
  393. package/dist/core/hearth/providers/blaxel-home.js +85 -75
  394. package/dist/core/hearth/providers/blaxel.d.ts +5 -0
  395. package/dist/core/hearth/providers/blaxel.js +86 -12
  396. package/dist/core/hearth/providers/types.d.ts +6 -1
  397. package/dist/core/hearth/types.d.ts +35 -1
  398. package/dist/core/help.d.ts +16 -0
  399. package/dist/core/help.js +2 -0
  400. package/dist/core/memory-resolver.d.ts +8 -8
  401. package/dist/core/memory-resolver.js +58 -26
  402. package/dist/core/preview-registry.d.ts +25 -0
  403. package/dist/core/preview-registry.js +2047 -0
  404. package/dist/core/resolver.d.ts +1 -0
  405. package/dist/core/resolver.js +23 -16
  406. package/dist/core/runtime/bearings.d.ts +11 -10
  407. package/dist/core/runtime/bearings.js +8 -8
  408. package/dist/core/runtime/broker-protocol.d.ts +2 -2
  409. package/dist/core/runtime/broker-protocol.js +2 -2
  410. package/dist/core/runtime/close.js +2 -2
  411. package/dist/core/runtime/kickoff.js +1 -1
  412. package/dist/core/runtime/launch.d.ts +9 -3
  413. package/dist/core/runtime/launch.js +17 -9
  414. package/dist/core/runtime/lifecycle.js +7 -7
  415. package/dist/core/runtime/model-swap.js +1 -1
  416. package/dist/core/runtime/placement.d.ts +5 -5
  417. package/dist/core/runtime/placement.js +10 -10
  418. package/dist/core/runtime/recycle.js +7 -7
  419. package/dist/core/runtime/reset.d.ts +1 -1
  420. package/dist/core/runtime/reset.js +3 -3
  421. package/dist/core/runtime/revive-all.d.ts +5 -2
  422. package/dist/core/runtime/revive-all.js +5 -2
  423. package/dist/core/runtime/revive.d.ts +15 -8
  424. package/dist/core/runtime/revive.js +52 -16
  425. package/dist/core/runtime/spawn.d.ts +1 -1
  426. package/dist/core/runtime/spawn.js +7 -7
  427. package/dist/core/runtime/stop-guard.js +5 -5
  428. package/dist/core/runtime/surface-bg.js +1 -1
  429. package/dist/core/runtime/tmux.d.ts +1 -1
  430. package/dist/core/runtime/tmux.js +4 -4
  431. package/dist/core/scope.d.ts +9 -0
  432. package/dist/core/scope.js +37 -15
  433. package/dist/core/substrate/on-read.js +23 -21
  434. package/dist/core/substrate/render.js +3 -3
  435. package/dist/core/view/loader.js +2 -2
  436. package/dist/core/wake.d.ts +2 -2
  437. package/dist/core/wake.js +7 -7
  438. package/dist/daemon/__tests__/predicate-eval.test.js +109 -0
  439. package/dist/daemon/crtrd.js +222 -103
  440. package/dist/daemon/predicate-eval.d.ts +52 -0
  441. package/dist/daemon/predicate-eval.js +248 -0
  442. package/dist/hearth/control-plane/__tests__/node-message.test.js +60 -0
  443. package/dist/hearth/control-plane/__tests__/rate-limit-recurrence.test.js +49 -0
  444. package/dist/hearth/control-plane/__tests__/relay-security.test.js +314 -0
  445. package/dist/hearth/control-plane/__tests__/scheduler-scan-loop.test.js +133 -0
  446. package/dist/hearth/control-plane/__tests__/trigger-delivery.test.js +170 -0
  447. package/dist/hearth/control-plane/__tests__/webhook-ingress.test.js +167 -0
  448. package/dist/hearth/control-plane/config.d.ts +21 -0
  449. package/dist/hearth/control-plane/config.js +77 -0
  450. package/dist/hearth/control-plane/db.d.ts +30 -0
  451. package/dist/hearth/control-plane/db.js +534 -0
  452. package/dist/hearth/control-plane/ingress/rate-limit.d.ts +24 -0
  453. package/dist/hearth/control-plane/ingress/rate-limit.js +100 -0
  454. package/dist/hearth/control-plane/ingress/route-store.d.ts +31 -0
  455. package/dist/hearth/control-plane/ingress/route-store.js +61 -0
  456. package/dist/hearth/control-plane/ingress/webhook-delivery-store.d.ts +41 -0
  457. package/dist/hearth/control-plane/ingress/webhook-delivery-store.js +69 -0
  458. package/dist/hearth/control-plane/ingress/webhook-route.d.ts +55 -0
  459. package/dist/hearth/control-plane/ingress/webhook-route.js +285 -0
  460. package/dist/hearth/control-plane/main.js +88 -0
  461. package/dist/hearth/control-plane/node-message.d.ts +31 -0
  462. package/dist/hearth/control-plane/node-message.js +98 -0
  463. package/dist/hearth/control-plane/register.d.ts +15 -0
  464. package/dist/hearth/control-plane/register.js +34 -0
  465. package/dist/hearth/control-plane/registry.d.ts +17 -0
  466. package/dist/hearth/control-plane/registry.js +161 -0
  467. package/dist/hearth/control-plane/relay.d.ts +40 -0
  468. package/dist/hearth/{wake-proxy/proxy.js → control-plane/relay.js} +201 -275
  469. package/dist/hearth/control-plane/scheduler/fire-store.d.ts +36 -0
  470. package/dist/hearth/control-plane/scheduler/fire-store.js +73 -0
  471. package/dist/hearth/control-plane/scheduler/recurrence.d.ts +7 -0
  472. package/dist/hearth/control-plane/scheduler/recurrence.js +58 -0
  473. package/dist/hearth/control-plane/scheduler/scan-loop.d.ts +38 -0
  474. package/dist/hearth/control-plane/scheduler/scan-loop.js +138 -0
  475. package/dist/hearth/control-plane/scheduler/schedule-store.d.ts +32 -0
  476. package/dist/hearth/control-plane/scheduler/schedule-store.js +66 -0
  477. package/dist/hearth/control-plane/secrets.d.ts +17 -0
  478. package/dist/hearth/control-plane/secrets.js +113 -0
  479. package/dist/hearth/control-plane/server.d.ts +27 -0
  480. package/dist/hearth/control-plane/server.js +346 -0
  481. package/dist/hearth/control-plane/session.d.ts +68 -0
  482. package/dist/hearth/control-plane/session.js +273 -0
  483. package/dist/hearth/control-plane/triggers/acl.d.ts +14 -0
  484. package/dist/hearth/control-plane/triggers/acl.js +52 -0
  485. package/dist/hearth/control-plane/triggers/audit-store.d.ts +38 -0
  486. package/dist/hearth/control-plane/triggers/audit-store.js +79 -0
  487. package/dist/hearth/control-plane/triggers/deliver.d.ts +43 -0
  488. package/dist/hearth/control-plane/triggers/deliver.js +76 -0
  489. package/dist/hearth/control-plane/triggers/envelope.d.ts +29 -0
  490. package/dist/hearth/control-plane/triggers/envelope.js +38 -0
  491. package/dist/hearth/control-plane/types.d.ts +66 -0
  492. package/dist/hearth/control-plane/wake.d.ts +80 -0
  493. package/dist/hearth/control-plane/wake.js +312 -0
  494. package/dist/pi-extensions/canvas-doc-substrate.js +28 -2
  495. package/dist/pi-extensions/canvas-nav.js +1 -1
  496. package/dist/prompts/view.js +7 -8
  497. package/dist/types.js +4 -4
  498. package/dist/web-client/assets/index-DUThOUzU.css +2 -0
  499. package/dist/web-client/assets/index-IAJVtuVe.js +80 -0
  500. package/dist/web-client/index.html +2 -2
  501. package/package.json +12 -9
  502. package/scripts/postinstall.mjs +8 -0
  503. package/dist/clients/attach/__tests__/action-parity.test.js +0 -48
  504. package/dist/clients/attach/__tests__/autocomplete-and-bash-mode.test.js +0 -96
  505. package/dist/clients/attach/__tests__/bash-bang-routing.test.js +0 -58
  506. package/dist/clients/attach/__tests__/bundle-pi-tui-dedup.test.js +0 -56
  507. package/dist/clients/attach/__tests__/clipboard-image.test.js +0 -76
  508. package/dist/clients/attach/__tests__/editor-newline.test.js +0 -82
  509. package/dist/clients/attach/__tests__/git-info.test.js +0 -31
  510. package/dist/clients/attach/__tests__/onrequest-wired.test.js +0 -20
  511. package/dist/clients/attach/__tests__/reconnect-giveup.test.js +0 -30
  512. package/dist/clients/attach/__tests__/slash-quit-copy.test.js +0 -42
  513. package/dist/clients/attach/__tests__/titled-editor.test.js +0 -60
  514. package/dist/commands/memory/__tests__/lint-schema.test.js +0 -52
  515. package/dist/core/__tests__/argv-parser.test.js +0 -217
  516. package/dist/core/__tests__/artifact-paths.test.js +0 -44
  517. package/dist/core/__tests__/draw-style.test.js +0 -258
  518. package/dist/core/__tests__/editor-label.test.d.ts +0 -1
  519. package/dist/core/__tests__/editor-label.test.js +0 -26
  520. package/dist/core/__tests__/fault-marker.test.d.ts +0 -1
  521. package/dist/core/__tests__/fault-marker.test.js +0 -112
  522. package/dist/core/__tests__/fault-retry-rewind.test.d.ts +0 -1
  523. package/dist/core/__tests__/fault-retry-rewind.test.js +0 -123
  524. package/dist/core/__tests__/frame-decoder-perf.test.d.ts +0 -1
  525. package/dist/core/__tests__/frame-decoder-perf.test.js +0 -224
  526. package/dist/core/__tests__/keystone.test.d.ts +0 -1
  527. package/dist/core/__tests__/keystone.test.js +0 -185
  528. package/dist/core/__tests__/listing-completeness.test.d.ts +0 -1
  529. package/dist/core/__tests__/listing-completeness.test.js +0 -31
  530. package/dist/core/__tests__/memory-resolver.test.d.ts +0 -1
  531. package/dist/core/__tests__/memory-resolver.test.js +0 -119
  532. package/dist/core/__tests__/memory.test.d.ts +0 -1
  533. package/dist/core/__tests__/memory.test.js +0 -60
  534. package/dist/core/__tests__/model-ladders.test.d.ts +0 -1
  535. package/dist/core/__tests__/model-ladders.test.js +0 -160
  536. package/dist/core/__tests__/node-env.test.d.ts +0 -1
  537. package/dist/core/__tests__/node-env.test.js +0 -26
  538. package/dist/core/__tests__/pane-column.test.d.ts +0 -1
  539. package/dist/core/__tests__/pane-column.test.js +0 -153
  540. package/dist/core/__tests__/persona-compose.test.d.ts +0 -1
  541. package/dist/core/__tests__/persona-compose.test.js +0 -53
  542. package/dist/core/__tests__/persona-subkind.test.d.ts +0 -1
  543. package/dist/core/__tests__/persona-subkind.test.js +0 -65
  544. package/dist/core/__tests__/persona.test.d.ts +0 -1
  545. package/dist/core/__tests__/persona.test.js +0 -107
  546. package/dist/core/__tests__/unknown-path.test.d.ts +0 -1
  547. package/dist/core/__tests__/unknown-path.test.js +0 -58
  548. package/dist/core/canvas/wakeups.d.ts +0 -76
  549. package/dist/core/canvas/wakeups.js +0 -185
  550. package/dist/core/hearth/registry.d.ts +0 -15
  551. package/dist/core/hearth/registry.js +0 -179
  552. package/dist/hearth/wake-proxy/__tests__/anthropic-oauth.test.d.ts +0 -1
  553. package/dist/hearth/wake-proxy/__tests__/anthropic-oauth.test.js +0 -289
  554. package/dist/hearth/wake-proxy/__tests__/config-timeout.test.d.ts +0 -1
  555. package/dist/hearth/wake-proxy/__tests__/config-timeout.test.js +0 -34
  556. package/dist/hearth/wake-proxy/__tests__/guest-source.test.d.ts +0 -1
  557. package/dist/hearth/wake-proxy/__tests__/guest-source.test.js +0 -203
  558. package/dist/hearth/wake-proxy/__tests__/hardening.test.d.ts +0 -1
  559. package/dist/hearth/wake-proxy/__tests__/hardening.test.js +0 -59
  560. package/dist/hearth/wake-proxy/__tests__/hearth-status-route.test.d.ts +0 -1
  561. package/dist/hearth/wake-proxy/__tests__/hearth-status-route.test.js +0 -372
  562. package/dist/hearth/wake-proxy/__tests__/http-running-route-fast-path.test.d.ts +0 -1
  563. package/dist/hearth/wake-proxy/__tests__/http-running-route-fast-path.test.js +0 -258
  564. package/dist/hearth/wake-proxy/__tests__/model-auth-routes.test.d.ts +0 -1
  565. package/dist/hearth/wake-proxy/__tests__/model-auth-routes.test.js +0 -437
  566. package/dist/hearth/wake-proxy/__tests__/source-bridge-gate.test.d.ts +0 -1
  567. package/dist/hearth/wake-proxy/__tests__/source-bridge-gate.test.js +0 -455
  568. package/dist/hearth/wake-proxy/__tests__/static-asset-allowlist.test.d.ts +0 -1
  569. package/dist/hearth/wake-proxy/__tests__/static-asset-allowlist.test.js +0 -15
  570. package/dist/hearth/wake-proxy/__tests__/warm-path-concurrency.test.d.ts +0 -1
  571. package/dist/hearth/wake-proxy/__tests__/warm-path-concurrency.test.js +0 -141
  572. package/dist/hearth/wake-proxy/__tests__/ws-teardown-accounting.test.d.ts +0 -1
  573. package/dist/hearth/wake-proxy/__tests__/ws-teardown-accounting.test.js +0 -143
  574. package/dist/hearth/wake-proxy/anthropic-oauth.d.ts +0 -58
  575. package/dist/hearth/wake-proxy/anthropic-oauth.js +0 -189
  576. package/dist/hearth/wake-proxy/auth.d.ts +0 -22
  577. package/dist/hearth/wake-proxy/auth.js +0 -128
  578. package/dist/hearth/wake-proxy/config.d.ts +0 -2
  579. package/dist/hearth/wake-proxy/config.js +0 -151
  580. package/dist/hearth/wake-proxy/guest-source.d.ts +0 -14
  581. package/dist/hearth/wake-proxy/guest-source.js +0 -130
  582. package/dist/hearth/wake-proxy/hearth-status.d.ts +0 -44
  583. package/dist/hearth/wake-proxy/hearth-status.js +0 -267
  584. package/dist/hearth/wake-proxy/home.d.ts +0 -67
  585. package/dist/hearth/wake-proxy/home.js +0 -297
  586. package/dist/hearth/wake-proxy/main.js +0 -134
  587. package/dist/hearth/wake-proxy/model-auth.d.ts +0 -13
  588. package/dist/hearth/wake-proxy/model-auth.js +0 -345
  589. package/dist/hearth/wake-proxy/proxy.d.ts +0 -35
  590. package/dist/hearth/wake-proxy/public-source-gate.d.ts +0 -9
  591. package/dist/hearth/wake-proxy/public-source-gate.js +0 -409
  592. package/dist/hearth/wake-proxy/redact.d.ts +0 -1
  593. package/dist/hearth/wake-proxy/redact.js +0 -17
  594. package/dist/hearth/wake-proxy/server.d.ts +0 -11
  595. package/dist/hearth/wake-proxy/server.js +0 -142
  596. package/dist/hearth/wake-proxy/state.d.ts +0 -18
  597. package/dist/hearth/wake-proxy/state.js +0 -342
  598. package/dist/hearth/wake-proxy/types.d.ts +0 -76
  599. package/dist/web-client/assets/index-BZUxTkv5.css +0 -2
  600. package/dist/web-client/assets/index-D36PNBj4.js +0 -80
  601. /package/dist/clients/attach/__tests__/{action-parity.test.d.ts → crtr-output-coverage.test.d.ts} +0 -0
  602. /package/dist/clients/attach/__tests__/{autocomplete-and-bash-mode.test.d.ts → crtr-output-render.test.d.ts} +0 -0
  603. /package/dist/{clients/attach/__tests__/bash-bang-routing.test.d.ts → core/__tests__/boot.test.d.ts} +0 -0
  604. /package/dist/{clients/attach/__tests__/bundle-pi-tui-dedup.test.d.ts → core/__tests__/hearth-bootstrap.test.d.ts} +0 -0
  605. /package/dist/{clients/attach/__tests__/clipboard-image.test.d.ts → core/__tests__/preview-registry-sync.test.d.ts} +0 -0
  606. /package/dist/{clients/attach/__tests__/editor-newline.test.d.ts → core/__tests__/prune-to-limit.test.d.ts} +0 -0
  607. /package/dist/{clients/attach/__tests__/git-info.test.d.ts → core/__tests__/trigger-migration.test.d.ts} +0 -0
  608. /package/dist/{clients/attach/__tests__/onrequest-wired.test.d.ts → core/hearth/__tests__/model-auth-guest.test.d.ts} +0 -0
  609. /package/dist/{clients/attach/__tests__/reconnect-giveup.test.d.ts → daemon/__tests__/predicate-eval.test.d.ts} +0 -0
  610. /package/dist/{clients/attach/__tests__/slash-quit-copy.test.d.ts → hearth/control-plane/__tests__/node-message.test.d.ts} +0 -0
  611. /package/dist/{clients/attach/__tests__/titled-editor.test.d.ts → hearth/control-plane/__tests__/rate-limit-recurrence.test.d.ts} +0 -0
  612. /package/dist/{commands/memory/__tests__/lint-schema.test.d.ts → hearth/control-plane/__tests__/relay-security.test.d.ts} +0 -0
  613. /package/dist/{core/__tests__/argv-parser.test.d.ts → hearth/control-plane/__tests__/scheduler-scan-loop.test.d.ts} +0 -0
  614. /package/dist/{core/__tests__/artifact-paths.test.d.ts → hearth/control-plane/__tests__/trigger-delivery.test.d.ts} +0 -0
  615. /package/dist/{core/__tests__/draw-style.test.d.ts → hearth/control-plane/__tests__/webhook-ingress.test.d.ts} +0 -0
  616. /package/dist/hearth/{wake-proxy → control-plane}/main.d.ts +0 -0
  617. /package/dist/hearth/{wake-proxy → control-plane}/types.js +0 -0
@@ -0,0 +1,61 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { getControlPlaneDb } from '../db.js';
3
+ function nowIso() {
4
+ return new Date().toISOString();
5
+ }
6
+ function homeIdentity(homeId) {
7
+ const row = getControlPlaneDb().prepare('SELECT tenant_id, user_id FROM home WHERE home_id = ?').get(homeId);
8
+ if (row === undefined)
9
+ throw new Error(`home not found: ${homeId}`);
10
+ return row;
11
+ }
12
+ function routeFrom(row) {
13
+ return {
14
+ route_id: row['route_id'],
15
+ tenant_id: row['tenant_id'],
16
+ user_id: row['user_id'],
17
+ home_id: row['home_id'],
18
+ channel: row['channel'],
19
+ routing_key: row['routing_key'],
20
+ routing_key_kind: row['routing_key_kind'],
21
+ channel_secret_ref: row['channel_secret_ref'] ?? null,
22
+ delivery_template: JSON.parse(row['delivery_template']),
23
+ enabled: Number(row['enabled']) !== 0,
24
+ created_at: row['created_at'],
25
+ updated_at: row['updated_at'],
26
+ };
27
+ }
28
+ export function registerRoute(input) {
29
+ const routeId = input.route_id ?? `route-${randomUUID()}`;
30
+ const stamped = input.now ?? nowIso();
31
+ const identity = homeIdentity(input.home_id);
32
+ getControlPlaneDb()
33
+ .prepare(`INSERT INTO ingress_route (
34
+ route_id, tenant_id, user_id, home_id, channel, routing_key,
35
+ routing_key_kind, channel_secret_ref, delivery_template, enabled,
36
+ created_at, updated_at
37
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
38
+ .run(routeId, identity.tenant_id, identity.user_id, input.home_id, input.channel, input.routing_key, input.routing_key_kind, input.channel_secret_ref ?? null, JSON.stringify(input.delivery_template), input.enabled === false ? 0 : 1, stamped, stamped);
39
+ return getRouteById(routeId);
40
+ }
41
+ export function getRouteById(routeId) {
42
+ const row = getControlPlaneDb().prepare('SELECT * FROM ingress_route WHERE route_id = ?').get(routeId);
43
+ return row === undefined ? null : routeFrom(row);
44
+ }
45
+ export function resolveRoute(channel, routingKey) {
46
+ const row = getControlPlaneDb()
47
+ .prepare('SELECT * FROM ingress_route WHERE channel = ? AND routing_key = ? AND enabled = 1')
48
+ .get(channel, routingKey);
49
+ return row === undefined ? null : routeFrom(row);
50
+ }
51
+ export function listRoutesForUser(tenantId, userId) {
52
+ const rows = getControlPlaneDb()
53
+ .prepare('SELECT * FROM ingress_route WHERE tenant_id = ? AND user_id = ? ORDER BY channel, routing_key')
54
+ .all(tenantId, userId);
55
+ return rows.map(routeFrom);
56
+ }
57
+ export function setRouteEnabled(routeId, enabled, now = nowIso()) {
58
+ getControlPlaneDb()
59
+ .prepare('UPDATE ingress_route SET enabled = ?, updated_at = ? WHERE route_id = ?')
60
+ .run(enabled ? 1 : 0, now, routeId);
61
+ }
@@ -0,0 +1,41 @@
1
+ export type WebhookDeliveryState = 'received' | 'delivered' | 'rejected' | 'failed';
2
+ export interface WebhookDeliveryRow {
3
+ delivery_id: string;
4
+ route_id: string;
5
+ tenant_id: string;
6
+ user_id: string;
7
+ home_id: string;
8
+ replay_key: string;
9
+ replay_window_start: string;
10
+ payload_sha256: string | null;
11
+ signature_sha256: string | null;
12
+ state: WebhookDeliveryState;
13
+ received_at: string;
14
+ delivered_at: string | null;
15
+ last_error: string | null;
16
+ created_at: string;
17
+ updated_at: string;
18
+ }
19
+ export interface ClaimWebhookDeliveryInput {
20
+ delivery_id?: string;
21
+ route_id: string;
22
+ replay_key: string;
23
+ replay_window_start: string;
24
+ payload_sha256?: string | null;
25
+ signature_sha256?: string | null;
26
+ received_at?: string;
27
+ now?: string;
28
+ }
29
+ export interface ClaimWebhookDeliveryResult {
30
+ delivery: WebhookDeliveryRow;
31
+ claimed: boolean;
32
+ }
33
+ export interface SetWebhookDeliveryStateOptions {
34
+ delivered_at?: string | null;
35
+ last_error?: string | null;
36
+ now?: string;
37
+ }
38
+ export declare function claimWebhookDelivery(input: ClaimWebhookDeliveryInput): ClaimWebhookDeliveryResult;
39
+ export declare function getWebhookDeliveryById(deliveryId: string): WebhookDeliveryRow | null;
40
+ export declare function getWebhookDeliveryByReplayKey(routeId: string, replayKey: string, replayWindowStart: string): WebhookDeliveryRow | null;
41
+ export declare function setWebhookDeliveryState(deliveryId: string, state: WebhookDeliveryState, options?: SetWebhookDeliveryStateOptions): void;
@@ -0,0 +1,69 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { getControlPlaneDb } from '../db.js';
3
+ function nowIso() {
4
+ return new Date().toISOString();
5
+ }
6
+ function routeIdentity(routeId) {
7
+ const row = getControlPlaneDb()
8
+ .prepare('SELECT home_id, tenant_id, user_id FROM ingress_route WHERE route_id = ?')
9
+ .get(routeId);
10
+ if (row === undefined)
11
+ throw new Error(`ingress route not found: ${routeId}`);
12
+ return row;
13
+ }
14
+ function deliveryFrom(row) {
15
+ return {
16
+ delivery_id: row['delivery_id'],
17
+ route_id: row['route_id'],
18
+ tenant_id: row['tenant_id'],
19
+ user_id: row['user_id'],
20
+ home_id: row['home_id'],
21
+ replay_key: row['replay_key'],
22
+ replay_window_start: row['replay_window_start'],
23
+ payload_sha256: row['payload_sha256'] ?? null,
24
+ signature_sha256: row['signature_sha256'] ?? null,
25
+ state: row['state'],
26
+ received_at: row['received_at'],
27
+ delivered_at: row['delivered_at'] ?? null,
28
+ last_error: row['last_error'] ?? null,
29
+ created_at: row['created_at'],
30
+ updated_at: row['updated_at'],
31
+ };
32
+ }
33
+ export function claimWebhookDelivery(input) {
34
+ const deliveryId = input.delivery_id ?? `whdel-${randomUUID()}`;
35
+ const stamped = input.now ?? nowIso();
36
+ const receivedAt = input.received_at ?? stamped;
37
+ const identity = routeIdentity(input.route_id);
38
+ const result = getControlPlaneDb()
39
+ .prepare(`INSERT OR IGNORE INTO webhook_delivery (
40
+ delivery_id, route_id, tenant_id, user_id, home_id, replay_key,
41
+ replay_window_start, payload_sha256, signature_sha256, state,
42
+ received_at, delivered_at, last_error, created_at, updated_at
43
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 'received', ?, NULL, NULL, ?, ?)`)
44
+ .run(deliveryId, input.route_id, identity.tenant_id, identity.user_id, identity.home_id, input.replay_key, input.replay_window_start, input.payload_sha256 ?? null, input.signature_sha256 ?? null, receivedAt, stamped, stamped);
45
+ const delivery = getWebhookDeliveryByReplayKey(input.route_id, input.replay_key, input.replay_window_start);
46
+ if (delivery === null) {
47
+ throw new Error(`failed to claim webhook delivery for route ${input.route_id} replay key ${input.replay_key}`);
48
+ }
49
+ return { delivery, claimed: result.changes === 1 };
50
+ }
51
+ export function getWebhookDeliveryById(deliveryId) {
52
+ const row = getControlPlaneDb().prepare('SELECT * FROM webhook_delivery WHERE delivery_id = ?').get(deliveryId);
53
+ return row === undefined ? null : deliveryFrom(row);
54
+ }
55
+ export function getWebhookDeliveryByReplayKey(routeId, replayKey, replayWindowStart) {
56
+ const row = getControlPlaneDb()
57
+ .prepare('SELECT * FROM webhook_delivery WHERE route_id = ? AND replay_key = ? AND replay_window_start = ?')
58
+ .get(routeId, replayKey, replayWindowStart);
59
+ return row === undefined ? null : deliveryFrom(row);
60
+ }
61
+ export function setWebhookDeliveryState(deliveryId, state, options = {}) {
62
+ const stamped = options.now ?? nowIso();
63
+ const deliveredAt = options.delivered_at === undefined ? (state === 'delivered' ? stamped : null) : options.delivered_at;
64
+ getControlPlaneDb()
65
+ .prepare(`UPDATE webhook_delivery
66
+ SET state = ?, delivered_at = COALESCE(?, delivered_at), last_error = ?, updated_at = ?
67
+ WHERE delivery_id = ?`)
68
+ .run(state, deliveredAt, options.last_error ?? null, stamped, deliveryId);
69
+ }
@@ -0,0 +1,55 @@
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
+ import { buildTriggerEnvelope } from '../triggers/envelope.js';
3
+ import { type DeliverTriggerResult } from '../triggers/deliver.js';
4
+ import { type IngressRouteRow } from './route-store.js';
5
+ import { claimWebhookDelivery, setWebhookDeliveryState } from './webhook-delivery-store.js';
6
+ import { type RateCheckResult } from './rate-limit.js';
7
+ export interface WebhookProcessDeps {
8
+ checkRate: (key: string) => RateCheckResult;
9
+ resolveRoute: (channel: 'webhook', routingKey: string) => IngressRouteRow | null;
10
+ resolveSecret: (ref: string) => string;
11
+ claimWebhookDelivery: typeof claimWebhookDelivery;
12
+ setWebhookDeliveryState: typeof setWebhookDeliveryState;
13
+ deliverTrigger: (input: {
14
+ home_id: string;
15
+ source_ref: string;
16
+ envelope: ReturnType<typeof buildTriggerEnvelope>;
17
+ tier: 'urgent';
18
+ payload_sha256?: string;
19
+ metadata?: Record<string, unknown>;
20
+ }) => Promise<DeliverTriggerResult>;
21
+ now: () => Date;
22
+ }
23
+ export interface WebhookRequest {
24
+ routingKey: string;
25
+ rawBody: Buffer;
26
+ signatureHeader: string | null;
27
+ deliveryIdHeader: string | null;
28
+ contentType: string | null;
29
+ }
30
+ export interface WebhookResult {
31
+ status: number;
32
+ message: string;
33
+ retryAfterMs?: number;
34
+ }
35
+ /** Production defaults — real rate limiter, stores, secret resolver, and
36
+ * delivery chokepoint. Tests inject fakes. */
37
+ export declare function defaultWebhookProcessDeps(): WebhookProcessDeps;
38
+ /**
39
+ * The verification + delivery core, independent of HTTP plumbing so the
40
+ * security invariants (signature, replay, no-routing-key) are directly
41
+ * testable. Returns the status + message the HTTP layer writes back.
42
+ */
43
+ export declare function processWebhookDelivery(req: WebhookRequest, deps: WebhookProcessDeps): Promise<WebhookResult>;
44
+ /** Extract the single `routing_key` path segment from `/webhook/<key>`.
45
+ * Rejects an empty key, extra segments, embedded slash/backslash, or
46
+ * malformed percent-encoding. */
47
+ export declare function extractRoutingKey(pathname: string): string | null;
48
+ /**
49
+ * HTTP handler for `POST /webhook/:routing_key`. Reads the raw body (bounded),
50
+ * extracts the routing key + signature/delivery headers, runs
51
+ * `processWebhookDelivery`, and writes the resulting status. This is a PUBLIC
52
+ * endpoint — its only authentication is the per-route HMAC signature, so it
53
+ * must be mounted OUTSIDE the session/registry gate.
54
+ */
55
+ export declare function handleWebhook(req: IncomingMessage, res: ServerResponse, deps?: WebhookProcessDeps): Promise<void>;
@@ -0,0 +1,285 @@
1
+ // control-plane/ingress/webhook-route.ts — the generic webhook ingress
2
+ // endpoint (master plan P5.5 / part-plan T-C3): `POST /webhook/:routing_key`.
3
+ // The ONLY ingress channel mounted this increment (SMS/email/chat/persistent-
4
+ // socket connectors are out of scope).
5
+ //
6
+ // Order of operations (security-load-bearing):
7
+ // 1. PRE-RESOLUTION rate limit on the routing key — a flood is shed before
8
+ // any DB lookup / secret resolution / write.
9
+ // 2. Route lookup (`resolveRoute('webhook', key)`) — unknown key → 404, no
10
+ // delivery.
11
+ // 3. HMAC-SHA256 over the RAW request body using the route's resolved
12
+ // signing secret (`channel_secret_ref` → `resolveSecret`), constant-time
13
+ // compared. The secret is DISTINCT from the routing key (the key is
14
+ // public/demux-only). Missing/invalid signature → reject, no delivery.
15
+ // A bad signature never writes a `webhook_delivery` row (no amplification).
16
+ // 4. Replay/idempotency via `webhook_delivery` (unique per route + replay
17
+ // key + window). A duplicate is acknowledged idempotently and NOT
18
+ // re-delivered.
19
+ // 5. Build the trigger envelope — `trigger_id` is route-derived + per-
20
+ // delivery (`<route_id>:<replay_key>`) for stable home-side dedupe. The
21
+ // ROUTING KEY IS NEVER PLACED IN THE ENVELOPE (R-ING-3).
22
+ // 6. Deliver through the shared `deliverTrigger` chokepoint at tier
23
+ // `urgent` (R-TRIG-3) — which authorizes, wakes, exec's in-guest, audits.
24
+ //
25
+ // The raw public body is never persisted: `webhook_delivery`/`trigger_audit`
26
+ // carry only content hashes + bounded metadata.
27
+ import { createHash, createHmac, timingSafeEqual } from 'node:crypto';
28
+ import { buildTriggerEnvelope } from '../triggers/envelope.js';
29
+ import { deliverTrigger } from '../triggers/deliver.js';
30
+ import { resolveSecret } from '../secrets.js';
31
+ import { resolveRoute } from './route-store.js';
32
+ import { claimWebhookDelivery, setWebhookDeliveryState, } from './webhook-delivery-store.js';
33
+ import { createRateLimiter, loadRateLimiterConfig } from './rate-limit.js';
34
+ const ENV = {
35
+ maxBodyBytes: 'CRTR_HEARTH_CP_WEBHOOK_MAX_BODY_BYTES',
36
+ };
37
+ const DEFAULT_MAX_BODY_BYTES = 1_048_576; // 1 MiB
38
+ /** Canonical signing header (hex HMAC-SHA256 of the raw body). The GitHub-
39
+ * style `x-hub-signature-256: sha256=<hex>` header is also accepted for
40
+ * compatibility; both are verified identically against the raw body. */
41
+ const SIGNATURE_HEADERS = ['x-hearth-signature-256', 'x-hub-signature-256', 'x-signature-256'];
42
+ const DELIVERY_ID_HEADERS = ['x-hearth-delivery-id', 'x-idempotency-key', 'x-github-delivery'];
43
+ const sharedRateLimiter = createRateLimiter(loadRateLimiterConfig());
44
+ /** Production defaults — real rate limiter, stores, secret resolver, and
45
+ * delivery chokepoint. Tests inject fakes. */
46
+ export function defaultWebhookProcessDeps() {
47
+ return {
48
+ checkRate: (key) => sharedRateLimiter.checkRate(key),
49
+ resolveRoute: (channel, routingKey) => resolveRoute(channel, routingKey),
50
+ resolveSecret,
51
+ claimWebhookDelivery,
52
+ setWebhookDeliveryState,
53
+ deliverTrigger: (input) => deliverTrigger(input),
54
+ now: () => new Date(),
55
+ };
56
+ }
57
+ /** Coarse hour bucket bounding the replay table + defining the replay window. */
58
+ function replayWindowStart(now) {
59
+ const bucket = new Date(now.getTime());
60
+ bucket.setUTCMinutes(0, 0, 0);
61
+ return bucket.toISOString();
62
+ }
63
+ /** Strip an optional `sha256=` prefix and normalize to lowercase hex. */
64
+ function normalizeSignature(raw) {
65
+ const trimmed = raw.trim();
66
+ const eq = trimmed.indexOf('=');
67
+ const value = trimmed.slice(0, eq).toLowerCase() === 'sha256' ? trimmed.slice(eq + 1) : trimmed;
68
+ return value.trim().toLowerCase();
69
+ }
70
+ /** Constant-time HMAC-SHA256 verification over the raw body. Returns false on
71
+ * any malformed/absent signature or length mismatch — never throws. */
72
+ function verifySignature(secret, rawBody, signatureHeader) {
73
+ if (signatureHeader === null || signatureHeader.trim() === '')
74
+ return false;
75
+ const provided = normalizeSignature(signatureHeader);
76
+ if (!/^[0-9a-f]+$/.test(provided) || provided.length % 2 !== 0)
77
+ return false;
78
+ const expected = createHmac('sha256', secret).update(rawBody).digest('hex');
79
+ const providedBuf = Buffer.from(provided, 'hex');
80
+ const expectedBuf = Buffer.from(expected, 'hex');
81
+ if (providedBuf.length !== expectedBuf.length)
82
+ return false;
83
+ return timingSafeEqual(providedBuf, expectedBuf);
84
+ }
85
+ function sha256Hex(input) {
86
+ return createHash('sha256').update(input).digest('hex');
87
+ }
88
+ /** Parse the untrusted body into the envelope payload. JSON when the content
89
+ * type is JSON and it parses; otherwise the raw UTF-8 string. Malformed JSON
90
+ * is delivered as the raw string rather than rejected — payload is untrusted
91
+ * data the home narrows defensively, not something ingress validates. */
92
+ function parsePayload(rawBody, contentType) {
93
+ const text = rawBody.toString('utf8');
94
+ if (contentType !== null && /application\/(?:[\w.+-]+\+)?json/i.test(contentType)) {
95
+ try {
96
+ return JSON.parse(text);
97
+ }
98
+ catch {
99
+ return text;
100
+ }
101
+ }
102
+ return text;
103
+ }
104
+ /**
105
+ * The verification + delivery core, independent of HTTP plumbing so the
106
+ * security invariants (signature, replay, no-routing-key) are directly
107
+ * testable. Returns the status + message the HTTP layer writes back.
108
+ */
109
+ export async function processWebhookDelivery(req, deps) {
110
+ // 1. Pre-resolution rate limit.
111
+ const rate = deps.checkRate(req.routingKey);
112
+ if (!rate.ok) {
113
+ return { status: 429, message: 'rate limited', retryAfterMs: rate.retryAfterMs };
114
+ }
115
+ // 2. Route lookup.
116
+ const route = deps.resolveRoute('webhook', req.routingKey);
117
+ if (route === null || route.channel !== 'webhook') {
118
+ return { status: 404, message: 'unknown webhook route' };
119
+ }
120
+ // 3. Signature verification over the raw body. A route with no signing
121
+ // secret cannot be verified and is treated as unverifiable — no delivery.
122
+ if (route.channel_secret_ref === null || route.channel_secret_ref.trim() === '') {
123
+ return { status: 503, message: 'webhook route not verifiable' };
124
+ }
125
+ let secret;
126
+ try {
127
+ secret = deps.resolveSecret(route.channel_secret_ref);
128
+ }
129
+ catch {
130
+ return { status: 503, message: 'webhook route not verifiable' };
131
+ }
132
+ if (!verifySignature(secret, req.rawBody, req.signatureHeader)) {
133
+ return { status: 401, message: 'invalid signature' };
134
+ }
135
+ // 4. Replay / idempotency. A bad signature never reached here, so no
136
+ // delivery row is ever written for an unverified request.
137
+ const now = deps.now();
138
+ const payloadSha256 = sha256Hex(req.rawBody);
139
+ const signatureSha256 = req.signatureHeader === null ? null : sha256Hex(req.signatureHeader);
140
+ const replayKey = req.deliveryIdHeader !== null && req.deliveryIdHeader.trim() !== '' ? req.deliveryIdHeader.trim() : payloadSha256;
141
+ const windowStart = replayWindowStart(now);
142
+ const claim = deps.claimWebhookDelivery({
143
+ route_id: route.route_id,
144
+ replay_key: replayKey,
145
+ replay_window_start: windowStart,
146
+ payload_sha256: payloadSha256,
147
+ signature_sha256: signatureSha256,
148
+ received_at: now.toISOString(),
149
+ });
150
+ if (!claim.claimed) {
151
+ return { status: 200, message: 'duplicate delivery ignored' };
152
+ }
153
+ // 5. Envelope — routing key deliberately absent (R-ING-3); trigger_id is
154
+ // route-derived + per-delivery for stable home-side dedupe.
155
+ const envelope = buildTriggerEnvelope({
156
+ source: 'webhook',
157
+ trigger_id: `${route.route_id}:${replayKey}`,
158
+ payload: parsePayload(req.rawBody, req.contentType),
159
+ received_at: now.toISOString(),
160
+ });
161
+ // 6. Deliver through the shared chokepoint (authorize + wake + exec + audit).
162
+ const outcome = await deps.deliverTrigger({
163
+ home_id: route.home_id,
164
+ source_ref: route.route_id,
165
+ envelope,
166
+ tier: 'urgent',
167
+ payload_sha256: payloadSha256,
168
+ metadata: { byte_length: req.rawBody.length, content_type: req.contentType },
169
+ });
170
+ if (outcome.outcome === 'delivered') {
171
+ deps.setWebhookDeliveryState(claim.delivery.delivery_id, 'delivered');
172
+ return { status: 202, message: 'delivered' };
173
+ }
174
+ if (outcome.outcome === 'rejected') {
175
+ deps.setWebhookDeliveryState(claim.delivery.delivery_id, 'rejected', { last_error: outcome.reason ?? 'rejected' });
176
+ return { status: 403, message: 'delivery rejected' };
177
+ }
178
+ deps.setWebhookDeliveryState(claim.delivery.delivery_id, 'failed', { last_error: outcome.reason ?? 'failed' });
179
+ return { status: 502, message: 'delivery failed' };
180
+ }
181
+ /** Extract the single `routing_key` path segment from `/webhook/<key>`.
182
+ * Rejects an empty key, extra segments, embedded slash/backslash, or
183
+ * malformed percent-encoding. */
184
+ export function extractRoutingKey(pathname) {
185
+ const match = /^\/webhook\/([^/]+)$/.exec(pathname);
186
+ if (match === null)
187
+ return null;
188
+ const raw = match[1];
189
+ if (raw.includes('\\'))
190
+ return null;
191
+ let key;
192
+ try {
193
+ key = decodeURIComponent(raw);
194
+ }
195
+ catch {
196
+ return null;
197
+ }
198
+ if (key === '' || /[/\\]/.test(key))
199
+ return null;
200
+ return key;
201
+ }
202
+ function firstHeader(req, names) {
203
+ for (const name of names) {
204
+ const value = req.headers[name];
205
+ if (typeof value === 'string' && value.trim() !== '')
206
+ return value;
207
+ if (Array.isArray(value) && value.length > 0 && value[0].trim() !== '')
208
+ return value[0];
209
+ }
210
+ return null;
211
+ }
212
+ function readBody(req, maxBytes) {
213
+ return new Promise((resolve, reject) => {
214
+ const chunks = [];
215
+ let total = 0;
216
+ let tooLarge = false;
217
+ req.on('data', (chunk) => {
218
+ total += chunk.length;
219
+ if (total > maxBytes) {
220
+ tooLarge = true;
221
+ req.destroy();
222
+ return;
223
+ }
224
+ chunks.push(chunk);
225
+ });
226
+ req.on('end', () => resolve({ body: Buffer.concat(chunks), tooLarge }));
227
+ req.on('error', (error) => {
228
+ if (tooLarge) {
229
+ resolve({ body: Buffer.alloc(0), tooLarge: true });
230
+ return;
231
+ }
232
+ reject(error instanceof Error ? error : new Error(String(error)));
233
+ });
234
+ });
235
+ }
236
+ function maxBodyBytes(env = process.env) {
237
+ const raw = env[ENV.maxBodyBytes]?.trim();
238
+ if (raw === undefined || raw === '')
239
+ return DEFAULT_MAX_BODY_BYTES;
240
+ const parsed = Number(raw);
241
+ if (!Number.isInteger(parsed) || parsed <= 0)
242
+ return DEFAULT_MAX_BODY_BYTES;
243
+ return parsed;
244
+ }
245
+ function sendText(res, status, message, retryAfterMs) {
246
+ const headers = {
247
+ 'content-type': 'text/plain; charset=utf-8',
248
+ 'cache-control': 'no-store',
249
+ 'referrer-policy': 'no-referrer',
250
+ };
251
+ if (retryAfterMs !== undefined)
252
+ headers['retry-after'] = String(Math.ceil(retryAfterMs / 1000));
253
+ const body = `${message}\n`;
254
+ headers['content-length'] = String(Buffer.byteLength(body));
255
+ res.writeHead(status, headers);
256
+ res.end(body);
257
+ }
258
+ /**
259
+ * HTTP handler for `POST /webhook/:routing_key`. Reads the raw body (bounded),
260
+ * extracts the routing key + signature/delivery headers, runs
261
+ * `processWebhookDelivery`, and writes the resulting status. This is a PUBLIC
262
+ * endpoint — its only authentication is the per-route HMAC signature, so it
263
+ * must be mounted OUTSIDE the session/registry gate.
264
+ */
265
+ export async function handleWebhook(req, res, deps = defaultWebhookProcessDeps()) {
266
+ const url = new URL(req.url ?? '/', 'http://127.0.0.1');
267
+ const routingKey = extractRoutingKey(url.pathname);
268
+ if (routingKey === null) {
269
+ sendText(res, 404, 'unknown webhook route');
270
+ return;
271
+ }
272
+ const { body, tooLarge } = await readBody(req, maxBodyBytes());
273
+ if (tooLarge) {
274
+ sendText(res, 413, 'payload too large');
275
+ return;
276
+ }
277
+ const result = await processWebhookDelivery({
278
+ routingKey,
279
+ rawBody: body,
280
+ signatureHeader: firstHeader(req, SIGNATURE_HEADERS),
281
+ deliveryIdHeader: firstHeader(req, DELIVERY_ID_HEADERS),
282
+ contentType: firstHeader(req, ['content-type']),
283
+ }, deps);
284
+ sendText(res, result.status, result.message, result.retryAfterMs);
285
+ }
@@ -0,0 +1,88 @@
1
+ // control-plane/main.ts — the CP process entrypoint. Generalizes the
2
+ // wake-proxy's main.ts startup shape (load config, build server, install
3
+ // signal handling, listen) onto the CP modules: config.ts, db.ts (open +
4
+ // migrate, never seed), and server.ts. Run via the `hearth:control-plane`
5
+ // package script.
6
+ import { general } from '../../core/errors.js';
7
+ import { loadControlPlaneConfig } from './config.js';
8
+ import { getControlPlaneDb } from './db.js';
9
+ import { redactSecrets } from './secrets.js';
10
+ import { tenantSessionAuthRedactedMessage } from './session.js';
11
+ import { createControlPlaneServer } from './server.js';
12
+ import { controlPlaneRelay } from './relay.js';
13
+ import { startSchedulerIngress } from './register.js';
14
+ function redact(message) {
15
+ return redactSecrets(tenantSessionAuthRedactedMessage(message));
16
+ }
17
+ function log(level, message, details = {}) {
18
+ process.stderr.write(`${JSON.stringify({ level, message, details })}\n`);
19
+ }
20
+ async function shutdown(server, scheduler, signal) {
21
+ log('info', 'hearth control plane shutting down', { signal });
22
+ scheduler.stop();
23
+ server.closeIdleConnections?.();
24
+ server.closeAllConnections?.();
25
+ await new Promise((resolve) => {
26
+ server.close(() => resolve());
27
+ });
28
+ process.exit(0);
29
+ }
30
+ async function main() {
31
+ const config = loadControlPlaneConfig();
32
+ // Opens (or reuses) the CP db and runs the schema migration gate only —
33
+ // no row is ever written here. The control plane registers no homes at
34
+ // startup; `home` rows are created by the provisioner (P3.2) via
35
+ // `createHome`, not by this process.
36
+ const db = getControlPlaneDb();
37
+ const server = createControlPlaneServer(config, { db, relay: controlPlaneRelay });
38
+ // Start the always-on cron scan loop. Webhook ingress is mounted inside the
39
+ // server route tree (register.ts); the scheduler is the one background loop
40
+ // that needs an explicit start/stop handle.
41
+ const scheduler = startSchedulerIngress();
42
+ let shuttingDown = false;
43
+ const beginShutdown = (signal) => {
44
+ if (shuttingDown)
45
+ return;
46
+ shuttingDown = true;
47
+ void shutdown(server, scheduler, signal).catch((error) => {
48
+ const message = error instanceof Error ? (error.stack ?? error.message) : String(error);
49
+ log('error', 'hearth control plane shutdown failed', { error: redact(message) });
50
+ process.exit(1);
51
+ });
52
+ };
53
+ process.on('SIGINT', () => beginShutdown('SIGINT'));
54
+ process.on('SIGTERM', () => beginShutdown('SIGTERM'));
55
+ process.on('uncaughtException', (error) => {
56
+ log('error', 'hearth control plane uncaught exception', { error: redact(error instanceof Error ? (error.stack ?? error.message) : String(error)) });
57
+ process.exit(1);
58
+ });
59
+ process.on('unhandledRejection', (reason) => {
60
+ log('error', 'hearth control plane unhandled rejection', { error: redact(reason instanceof Error ? (reason.stack ?? reason.message) : String(reason)) });
61
+ process.exit(1);
62
+ });
63
+ await new Promise((resolve, reject) => {
64
+ server.once('error', reject);
65
+ server.listen(config.port, config.host, () => {
66
+ log('info', 'hearth control plane listening', {
67
+ host: config.host,
68
+ port: config.port,
69
+ publicOrigin: config.publicOrigin,
70
+ cookieSecure: config.cookieSecure,
71
+ wakeTimeoutMs: config.wakeTimeoutMs,
72
+ readyTimeoutMs: config.readyTimeoutMs,
73
+ });
74
+ resolve();
75
+ });
76
+ }).catch((error) => {
77
+ throw general(`hearth control plane failed to bind ${config.host}:${config.port}`, {
78
+ host: config.host,
79
+ port: config.port,
80
+ error: error instanceof Error ? error.message : String(error),
81
+ });
82
+ });
83
+ }
84
+ void main().catch((error) => {
85
+ const message = error instanceof Error ? (error.stack ?? error.message) : String(error);
86
+ log('error', 'hearth control plane failed to start', { error: redact(message) });
87
+ process.exit(1);
88
+ });
@@ -0,0 +1,31 @@
1
+ import { type HomeBackend } from '../../core/hearth/provider.js';
2
+ import type { M0Config } from '../../core/hearth/types.js';
3
+ import { getHomeById } from './registry.js';
4
+ import type { HomeId } from './types.js';
5
+ import { ensureAwake } from './wake.js';
6
+ export type NodeMessageTier = 'critical' | 'urgent' | 'normal' | 'deferred';
7
+ /** Indirection seam so a smoke script can fake `ensureAwake`/the registry/the
8
+ * provider backend without a real DB/provider (mirrors `wake.ts`'s
9
+ * `wakeInternals`). Production code never reassigns these. */
10
+ export declare const nodeMessageInternals: {
11
+ ensureAwake: typeof ensureAwake;
12
+ getHomeById: typeof getHomeById;
13
+ getHomeBackend: (config: M0Config) => HomeBackend;
14
+ loadM0Config: () => M0Config;
15
+ };
16
+ /**
17
+ * Wake `home_id` then deliver `body` to its home agent by running
18
+ * `crtr node msg --to <home_agent_target> --tier <tier>` in-guest, through
19
+ * the provider exec stdin seam (P2.6) — `body` is the exec `stdin`, never
20
+ * part of `argv`/command text.
21
+ *
22
+ * Exec happens only AFTER `ensureAwake` resolves (R-TRIG-1), so the in-guest
23
+ * broker + inbox watcher exist to receive it. `home_agent_target` is read
24
+ * fresh from the registry both before and after the wake and asserted equal
25
+ * — a provider recreate during `ensureAwake` may refresh
26
+ * `provider_sandbox_id`/`preview_endpoint`, but the target node id is stable
27
+ * across recreate (R-WAKE-6) and this primitive refuses to deliver if that
28
+ * invariant is ever violated. The sandbox id used for exec is read
29
+ * POST-wake, since a recreate makes the pre-wake sandbox id stale.
30
+ */
31
+ export declare function wakeAndExecNodeMessage(home_id: HomeId, body: string, tier: string): Promise<void>;