@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,534 @@
1
+ // control-plane.db — the CP's own SQLite store, separate from canvas.db. This
2
+ // module is the SOLE owner of the cached `DatabaseSync` connection and the
3
+ // migration gate: every other CP store (registry, scheduler, ingress) imports
4
+ // `getControlPlaneDb()` from here rather than opening a second connection
5
+ // (master plan decision 9 / orchestration brief non-negotiable). It lives on
6
+ // the CP's own data volume — NOT canvas home, NOT `canvasDbPath()` — because
7
+ // the control plane is a separate always-on process from any home/node.
8
+ //
9
+ // Mirrors `src/core/canvas/db.ts` exactly: `DatabaseSync` + WAL, schema
10
+ // expressed as a forward-only `MIGRATIONS` list gated by `PRAGMA user_version`.
11
+ // Migrations are append-only — never edit a shipped step.
12
+ import { DatabaseSync } from 'node:sqlite';
13
+ import { existsSync, mkdirSync } from 'node:fs';
14
+ import { homedir } from 'node:os';
15
+ import { dirname, join, resolve } from 'node:path';
16
+ const ENV = {
17
+ // Same data-dir convention `secrets.ts` (P1.3) uses, so the CP's SQLite db
18
+ // and its secrets file default to living side by side on one data volume.
19
+ dataDir: 'CRTR_HEARTH_CP_DATA_DIR',
20
+ // Explicit override for the db file itself, for deployments that want the
21
+ // db on a different mount than the rest of the CP data dir.
22
+ dbPath: 'CRTR_HEARTH_CP_DB_PATH',
23
+ };
24
+ const DB_FILE_NAME = 'control-plane.db';
25
+ function expandHomePath(input) {
26
+ if (input.startsWith('~'))
27
+ return join(homedir(), input.slice(1));
28
+ return resolve(input);
29
+ }
30
+ function defaultDataDir(env) {
31
+ const dataDir = env[ENV.dataDir]?.trim();
32
+ return dataDir !== undefined && dataDir !== ''
33
+ ? expandHomePath(dataDir)
34
+ : expandHomePath('~/.crouter/hearth-control-plane');
35
+ }
36
+ /** Resolve the CP SQLite db file path: an explicit `CRTR_HEARTH_CP_DB_PATH`
37
+ * override, else `<dataDir>/control-plane.db` where `dataDir` follows the
38
+ * same `CRTR_HEARTH_CP_DATA_DIR` convention `secrets.ts` uses. Deliberately
39
+ * independent of `canvasDbPath()` / `CRTR_HOME` — the control plane is not a
40
+ * canvas node and must not share or collide with a home's canvas db. */
41
+ export function controlPlaneDbPath(env = process.env) {
42
+ const override = env[ENV.dbPath]?.trim();
43
+ if (override !== undefined && override !== '')
44
+ return expandHomePath(override);
45
+ return join(defaultDataDir(env), DB_FILE_NAME);
46
+ }
47
+ // --- Schema as a forward-only migration list ------------------------------
48
+ /** v1 — the `home` registry table (design.md §5.1). `home_id` is the stable
49
+ * PK, independent of provider sandbox/node churn; `schedule` and
50
+ * `ingress_route` (added by later sibling migrations against this same
51
+ * handle) FK to it. Every secret is stored as a HANDLE
52
+ * (`relay_auth_ref`) — never a model credential, never an inline value
53
+ * (R-REG-3 / R-CP-8). `IF NOT EXISTS` makes this a no-op on re-open. */
54
+ function homeTable(db) {
55
+ db.exec(`
56
+ CREATE TABLE IF NOT EXISTS home (
57
+ home_id TEXT PRIMARY KEY,
58
+ tenant_id TEXT NOT NULL,
59
+ user_id TEXT NOT NULL,
60
+ provider TEXT NOT NULL DEFAULT 'blaxel',
61
+ provider_sandbox_id TEXT,
62
+ provider_volume_id TEXT,
63
+ preview_endpoint TEXT,
64
+ home_agent_target TEXT,
65
+ relay_auth_ref TEXT,
66
+ status TEXT NOT NULL DEFAULT 'provisioning',
67
+ template_version TEXT,
68
+ last_ready_at TEXT,
69
+ last_wake_at TEXT,
70
+ last_suspend_at TEXT,
71
+ last_wake_latency_ms INTEGER,
72
+ health_verdict TEXT NOT NULL DEFAULT 'unknown',
73
+ created_at TEXT NOT NULL,
74
+ updated_at TEXT NOT NULL
75
+ );
76
+
77
+ CREATE INDEX IF NOT EXISTS idx_home_tenant_user ON home(tenant_id, user_id);
78
+ CREATE INDEX IF NOT EXISTS idx_home_provider_sandbox ON home(provider_sandbox_id);
79
+ `);
80
+ }
81
+ /** v2 — cron schedule definitions. `next_fire_at` is the durable timer the CP
82
+ * scan loop selects on; home agents keep no cron scheduler state. */
83
+ function scheduleTable(db) {
84
+ db.exec(`
85
+ CREATE TABLE IF NOT EXISTS schedule (
86
+ schedule_id TEXT PRIMARY KEY,
87
+ tenant_id TEXT NOT NULL,
88
+ user_id TEXT NOT NULL,
89
+ home_id TEXT NOT NULL,
90
+ label TEXT NOT NULL,
91
+ recurrence TEXT NOT NULL,
92
+ timezone TEXT NOT NULL,
93
+ delivery_payload TEXT NOT NULL,
94
+ next_fire_at TEXT NOT NULL,
95
+ last_fired_at TEXT,
96
+ enabled INTEGER NOT NULL DEFAULT 1,
97
+ created_at TEXT NOT NULL,
98
+ updated_at TEXT NOT NULL,
99
+ FOREIGN KEY (home_id) REFERENCES home(home_id) ON DELETE CASCADE,
100
+ CHECK (enabled IN (0, 1))
101
+ );
102
+
103
+ CREATE INDEX IF NOT EXISTS idx_schedule_next_fire_at ON schedule(next_fire_at);
104
+ CREATE INDEX IF NOT EXISTS idx_schedule_tenant_user ON schedule(tenant_id, user_id);
105
+ CREATE INDEX IF NOT EXISTS idx_schedule_home ON schedule(home_id);
106
+ `);
107
+ }
108
+ /** v3 — cron fire idempotency ledger. The unique slot key is the load-bearing
109
+ * restart/double-scan guard: one schedule can own only one fire per instant. */
110
+ function scheduleFireTable(db) {
111
+ db.exec(`
112
+ CREATE TABLE IF NOT EXISTS schedule_fire (
113
+ fire_id TEXT PRIMARY KEY,
114
+ schedule_id TEXT NOT NULL,
115
+ home_id TEXT NOT NULL,
116
+ tenant_id TEXT NOT NULL,
117
+ user_id TEXT NOT NULL,
118
+ scheduled_for TEXT NOT NULL,
119
+ state TEXT NOT NULL DEFAULT 'pending',
120
+ attempts INTEGER NOT NULL DEFAULT 0,
121
+ last_error TEXT,
122
+ delivered_at TEXT,
123
+ created_at TEXT NOT NULL,
124
+ updated_at TEXT NOT NULL,
125
+ FOREIGN KEY (schedule_id) REFERENCES schedule(schedule_id) ON DELETE CASCADE,
126
+ FOREIGN KEY (home_id) REFERENCES home(home_id) ON DELETE CASCADE,
127
+ UNIQUE (schedule_id, scheduled_for),
128
+ CHECK (state IN ('pending', 'waking', 'delivered', 'failed')),
129
+ CHECK (attempts >= 0)
130
+ );
131
+
132
+ CREATE INDEX IF NOT EXISTS idx_schedule_fire_schedule ON schedule_fire(schedule_id);
133
+ CREATE INDEX IF NOT EXISTS idx_schedule_fire_home ON schedule_fire(home_id);
134
+ CREATE INDEX IF NOT EXISTS idx_schedule_fire_resumable ON schedule_fire(state, scheduled_for);
135
+ CREATE INDEX IF NOT EXISTS idx_schedule_fire_tenant_user ON schedule_fire(tenant_id, user_id);
136
+ `);
137
+ }
138
+ /** v4 — public ingress demux routes. `(channel, routing_key)` is deliberately
139
+ * globally unique because public webhook/phone/email addresses are global. */
140
+ function ingressRouteTable(db) {
141
+ db.exec(`
142
+ CREATE TABLE IF NOT EXISTS ingress_route (
143
+ route_id TEXT PRIMARY KEY,
144
+ tenant_id TEXT NOT NULL,
145
+ user_id TEXT NOT NULL,
146
+ home_id TEXT NOT NULL,
147
+ channel TEXT NOT NULL,
148
+ routing_key TEXT NOT NULL,
149
+ routing_key_kind TEXT NOT NULL,
150
+ channel_secret_ref TEXT,
151
+ delivery_template TEXT NOT NULL,
152
+ enabled INTEGER NOT NULL DEFAULT 1,
153
+ created_at TEXT NOT NULL,
154
+ updated_at TEXT NOT NULL,
155
+ FOREIGN KEY (home_id) REFERENCES home(home_id) ON DELETE CASCADE,
156
+ UNIQUE (channel, routing_key),
157
+ CHECK (enabled IN (0, 1))
158
+ );
159
+
160
+ CREATE INDEX IF NOT EXISTS idx_ingress_route_lookup ON ingress_route(channel, routing_key);
161
+ CREATE INDEX IF NOT EXISTS idx_ingress_route_tenant_user ON ingress_route(tenant_id, user_id);
162
+ CREATE INDEX IF NOT EXISTS idx_ingress_route_home ON ingress_route(home_id);
163
+ `);
164
+ }
165
+ /** v5 — webhook replay/idempotency ledger. Stores delivery identity and hashes
166
+ * only; raw public webhook bodies belong in the transient request path. */
167
+ function webhookDeliveryTable(db) {
168
+ db.exec(`
169
+ CREATE TABLE IF NOT EXISTS webhook_delivery (
170
+ delivery_id TEXT PRIMARY KEY,
171
+ route_id TEXT NOT NULL,
172
+ tenant_id TEXT NOT NULL,
173
+ user_id TEXT NOT NULL,
174
+ home_id TEXT NOT NULL,
175
+ replay_key TEXT NOT NULL,
176
+ replay_window_start TEXT NOT NULL,
177
+ payload_sha256 TEXT,
178
+ signature_sha256 TEXT,
179
+ state TEXT NOT NULL DEFAULT 'received',
180
+ received_at TEXT NOT NULL,
181
+ delivered_at TEXT,
182
+ last_error TEXT,
183
+ created_at TEXT NOT NULL,
184
+ updated_at TEXT NOT NULL,
185
+ FOREIGN KEY (route_id) REFERENCES ingress_route(route_id) ON DELETE CASCADE,
186
+ FOREIGN KEY (home_id) REFERENCES home(home_id) ON DELETE CASCADE,
187
+ UNIQUE (route_id, replay_key, replay_window_start),
188
+ CHECK (state IN ('received', 'delivered', 'rejected', 'failed'))
189
+ );
190
+
191
+ CREATE INDEX IF NOT EXISTS idx_webhook_delivery_route ON webhook_delivery(route_id, received_at);
192
+ CREATE INDEX IF NOT EXISTS idx_webhook_delivery_home ON webhook_delivery(home_id, received_at);
193
+ CREATE INDEX IF NOT EXISTS idx_webhook_delivery_tenant_user ON webhook_delivery(tenant_id, user_id);
194
+ `);
195
+ }
196
+ /** v6 — append-only trigger delivery audit. Stores operational metadata and
197
+ * content hashes; no public payload body and no secret literal columns. */
198
+ function triggerAuditTable(db) {
199
+ db.exec(`
200
+ CREATE TABLE IF NOT EXISTS trigger_audit (
201
+ audit_id TEXT PRIMARY KEY,
202
+ tenant_id TEXT NOT NULL,
203
+ user_id TEXT NOT NULL,
204
+ home_id TEXT NOT NULL,
205
+ source TEXT NOT NULL,
206
+ source_ref TEXT NOT NULL,
207
+ trigger_id TEXT NOT NULL,
208
+ tier TEXT NOT NULL,
209
+ outcome TEXT NOT NULL,
210
+ reason TEXT,
211
+ payload_sha256 TEXT,
212
+ metadata_json TEXT,
213
+ at TEXT NOT NULL,
214
+ FOREIGN KEY (home_id) REFERENCES home(home_id) ON DELETE CASCADE,
215
+ CHECK (source IN ('cron', 'webhook')),
216
+ CHECK (tier IN ('critical', 'urgent', 'normal', 'deferred')),
217
+ CHECK (outcome IN ('delivered', 'rejected', 'failed'))
218
+ );
219
+
220
+ CREATE INDEX IF NOT EXISTS idx_trigger_audit_home_at ON trigger_audit(home_id, at);
221
+ CREATE INDEX IF NOT EXISTS idx_trigger_audit_tenant_user_at ON trigger_audit(tenant_id, user_id, at);
222
+ CREATE INDEX IF NOT EXISTS idx_trigger_audit_trigger ON trigger_audit(trigger_id);
223
+ `);
224
+ }
225
+ /** v7 — DB-level consistency guards for denormalized tenant/user/home keys.
226
+ * Stores derive these values from parents; these triggers keep direct SQL from
227
+ * making tenant/user columns untrustworthy query or security boundaries. */
228
+ function tenantIdentityTriggers(db) {
229
+ db.exec(`
230
+ CREATE TRIGGER IF NOT EXISTS trg_schedule_identity_insert
231
+ BEFORE INSERT ON schedule
232
+ FOR EACH ROW
233
+ WHEN NOT EXISTS (
234
+ SELECT 1 FROM home
235
+ WHERE home_id = NEW.home_id AND tenant_id = NEW.tenant_id AND user_id = NEW.user_id
236
+ )
237
+ BEGIN
238
+ SELECT RAISE(ABORT, 'schedule tenant/user/home mismatch');
239
+ END;
240
+
241
+ CREATE TRIGGER IF NOT EXISTS trg_schedule_identity_update
242
+ BEFORE UPDATE OF home_id, tenant_id, user_id ON schedule
243
+ FOR EACH ROW
244
+ WHEN NOT EXISTS (
245
+ SELECT 1 FROM home
246
+ WHERE home_id = NEW.home_id AND tenant_id = NEW.tenant_id AND user_id = NEW.user_id
247
+ )
248
+ BEGIN
249
+ SELECT RAISE(ABORT, 'schedule tenant/user/home mismatch');
250
+ END;
251
+
252
+ CREATE TRIGGER IF NOT EXISTS trg_schedule_fire_identity_insert
253
+ BEFORE INSERT ON schedule_fire
254
+ FOR EACH ROW
255
+ WHEN NOT EXISTS (
256
+ SELECT 1 FROM schedule
257
+ WHERE schedule_id = NEW.schedule_id
258
+ AND home_id = NEW.home_id
259
+ AND tenant_id = NEW.tenant_id
260
+ AND user_id = NEW.user_id
261
+ )
262
+ BEGIN
263
+ SELECT RAISE(ABORT, 'schedule_fire schedule identity mismatch');
264
+ END;
265
+
266
+ CREATE TRIGGER IF NOT EXISTS trg_schedule_fire_identity_update
267
+ BEFORE UPDATE OF schedule_id, home_id, tenant_id, user_id ON schedule_fire
268
+ FOR EACH ROW
269
+ WHEN NOT EXISTS (
270
+ SELECT 1 FROM schedule
271
+ WHERE schedule_id = NEW.schedule_id
272
+ AND home_id = NEW.home_id
273
+ AND tenant_id = NEW.tenant_id
274
+ AND user_id = NEW.user_id
275
+ )
276
+ BEGIN
277
+ SELECT RAISE(ABORT, 'schedule_fire schedule identity mismatch');
278
+ END;
279
+
280
+ CREATE TRIGGER IF NOT EXISTS trg_ingress_route_identity_insert
281
+ BEFORE INSERT ON ingress_route
282
+ FOR EACH ROW
283
+ WHEN NOT EXISTS (
284
+ SELECT 1 FROM home
285
+ WHERE home_id = NEW.home_id AND tenant_id = NEW.tenant_id AND user_id = NEW.user_id
286
+ )
287
+ BEGIN
288
+ SELECT RAISE(ABORT, 'ingress_route tenant/user/home mismatch');
289
+ END;
290
+
291
+ CREATE TRIGGER IF NOT EXISTS trg_ingress_route_identity_update
292
+ BEFORE UPDATE OF home_id, tenant_id, user_id ON ingress_route
293
+ FOR EACH ROW
294
+ WHEN NOT EXISTS (
295
+ SELECT 1 FROM home
296
+ WHERE home_id = NEW.home_id AND tenant_id = NEW.tenant_id AND user_id = NEW.user_id
297
+ )
298
+ BEGIN
299
+ SELECT RAISE(ABORT, 'ingress_route tenant/user/home mismatch');
300
+ END;
301
+
302
+ CREATE TRIGGER IF NOT EXISTS trg_webhook_delivery_identity_insert
303
+ BEFORE INSERT ON webhook_delivery
304
+ FOR EACH ROW
305
+ WHEN NOT EXISTS (
306
+ SELECT 1 FROM ingress_route
307
+ WHERE route_id = NEW.route_id
308
+ AND home_id = NEW.home_id
309
+ AND tenant_id = NEW.tenant_id
310
+ AND user_id = NEW.user_id
311
+ )
312
+ BEGIN
313
+ SELECT RAISE(ABORT, 'webhook_delivery route identity mismatch');
314
+ END;
315
+
316
+ CREATE TRIGGER IF NOT EXISTS trg_webhook_delivery_identity_update
317
+ BEFORE UPDATE OF route_id, home_id, tenant_id, user_id ON webhook_delivery
318
+ FOR EACH ROW
319
+ WHEN NOT EXISTS (
320
+ SELECT 1 FROM ingress_route
321
+ WHERE route_id = NEW.route_id
322
+ AND home_id = NEW.home_id
323
+ AND tenant_id = NEW.tenant_id
324
+ AND user_id = NEW.user_id
325
+ )
326
+ BEGIN
327
+ SELECT RAISE(ABORT, 'webhook_delivery route identity mismatch');
328
+ END;
329
+
330
+ CREATE TRIGGER IF NOT EXISTS trg_trigger_audit_identity_insert
331
+ BEFORE INSERT ON trigger_audit
332
+ FOR EACH ROW
333
+ WHEN (
334
+ NEW.source = 'cron'
335
+ AND NOT EXISTS (
336
+ SELECT 1 FROM schedule_fire
337
+ WHERE fire_id = NEW.source_ref
338
+ AND home_id = NEW.home_id
339
+ AND tenant_id = NEW.tenant_id
340
+ AND user_id = NEW.user_id
341
+ )
342
+ ) OR (
343
+ NEW.source = 'webhook'
344
+ AND NOT EXISTS (
345
+ SELECT 1 FROM ingress_route
346
+ WHERE route_id = NEW.source_ref
347
+ AND home_id = NEW.home_id
348
+ AND tenant_id = NEW.tenant_id
349
+ AND user_id = NEW.user_id
350
+ )
351
+ )
352
+ BEGIN
353
+ SELECT RAISE(ABORT, 'trigger_audit source identity mismatch');
354
+ END;
355
+
356
+ CREATE TRIGGER IF NOT EXISTS trg_trigger_audit_identity_update
357
+ BEFORE UPDATE OF source, source_ref, home_id, tenant_id, user_id ON trigger_audit
358
+ FOR EACH ROW
359
+ WHEN (
360
+ NEW.source = 'cron'
361
+ AND NOT EXISTS (
362
+ SELECT 1 FROM schedule_fire
363
+ WHERE fire_id = NEW.source_ref
364
+ AND home_id = NEW.home_id
365
+ AND tenant_id = NEW.tenant_id
366
+ AND user_id = NEW.user_id
367
+ )
368
+ ) OR (
369
+ NEW.source = 'webhook'
370
+ AND NOT EXISTS (
371
+ SELECT 1 FROM ingress_route
372
+ WHERE route_id = NEW.source_ref
373
+ AND home_id = NEW.home_id
374
+ AND tenant_id = NEW.tenant_id
375
+ AND user_id = NEW.user_id
376
+ )
377
+ )
378
+ BEGIN
379
+ SELECT RAISE(ABORT, 'trigger_audit source identity mismatch');
380
+ END;
381
+ `);
382
+ }
383
+ /** v8 — parent-identity update guards. v7 validates a child row's own
384
+ * denormalized tenant/user/home tuple against its immediate parent on
385
+ * INSERT/UPDATE, but said nothing about editing the PARENT side: nothing
386
+ * stopped `UPDATE home SET tenant_id = ...` (or schedule/ingress_route/
387
+ * schedule_fire identity columns) out from under existing children, which
388
+ * would strand them with stale denormalized keys without tripping any
389
+ * v7 check (those only fire on the child table). These triggers reject an
390
+ * identity-column update on a parent row whenever a dependent child row
391
+ * already exists, so identity is write-once after first child creation;
392
+ * non-identity columns (status, timestamps, next_fire_at, metadata, etc.)
393
+ * are untouched by these triggers and remain freely updatable. Each guard
394
+ * checks only its immediate denormalizing child(ren) — sufficient because
395
+ * v7 already keeps every deeper descendant's copy in lockstep with that
396
+ * immediate child for as long as the immediate child row exists. */
397
+ function parentIdentityUpdateGuards(db) {
398
+ db.exec(`
399
+ CREATE TRIGGER IF NOT EXISTS trg_home_identity_update_guard
400
+ BEFORE UPDATE OF tenant_id, user_id ON home
401
+ FOR EACH ROW
402
+ WHEN (NEW.tenant_id IS NOT OLD.tenant_id OR NEW.user_id IS NOT OLD.user_id)
403
+ AND (
404
+ EXISTS (SELECT 1 FROM schedule WHERE home_id = OLD.home_id)
405
+ OR EXISTS (SELECT 1 FROM ingress_route WHERE home_id = OLD.home_id)
406
+ OR EXISTS (SELECT 1 FROM trigger_audit WHERE home_id = OLD.home_id)
407
+ )
408
+ BEGIN
409
+ SELECT RAISE(ABORT, 'home identity update blocked: dependent schedule/ingress_route/trigger_audit rows exist');
410
+ END;
411
+
412
+ CREATE TRIGGER IF NOT EXISTS trg_schedule_identity_update_guard
413
+ BEFORE UPDATE OF home_id, tenant_id, user_id ON schedule
414
+ FOR EACH ROW
415
+ WHEN (
416
+ NEW.home_id IS NOT OLD.home_id
417
+ OR NEW.tenant_id IS NOT OLD.tenant_id
418
+ OR NEW.user_id IS NOT OLD.user_id
419
+ )
420
+ AND EXISTS (SELECT 1 FROM schedule_fire WHERE schedule_id = OLD.schedule_id)
421
+ BEGIN
422
+ SELECT RAISE(ABORT, 'schedule identity update blocked: dependent schedule_fire rows exist');
423
+ END;
424
+
425
+ CREATE TRIGGER IF NOT EXISTS trg_ingress_route_identity_update_guard
426
+ BEFORE UPDATE OF home_id, tenant_id, user_id ON ingress_route
427
+ FOR EACH ROW
428
+ WHEN (
429
+ NEW.home_id IS NOT OLD.home_id
430
+ OR NEW.tenant_id IS NOT OLD.tenant_id
431
+ OR NEW.user_id IS NOT OLD.user_id
432
+ )
433
+ AND (
434
+ EXISTS (SELECT 1 FROM webhook_delivery WHERE route_id = OLD.route_id)
435
+ OR EXISTS (
436
+ SELECT 1 FROM trigger_audit WHERE source = 'webhook' AND source_ref = OLD.route_id
437
+ )
438
+ )
439
+ BEGIN
440
+ SELECT RAISE(ABORT, 'ingress_route identity update blocked: dependent webhook_delivery/trigger_audit rows exist');
441
+ END;
442
+
443
+ CREATE TRIGGER IF NOT EXISTS trg_schedule_fire_identity_update_guard
444
+ BEFORE UPDATE OF schedule_id, home_id, tenant_id, user_id ON schedule_fire
445
+ FOR EACH ROW
446
+ WHEN (
447
+ NEW.schedule_id IS NOT OLD.schedule_id
448
+ OR NEW.home_id IS NOT OLD.home_id
449
+ OR NEW.tenant_id IS NOT OLD.tenant_id
450
+ OR NEW.user_id IS NOT OLD.user_id
451
+ )
452
+ AND EXISTS (
453
+ SELECT 1 FROM trigger_audit WHERE source = 'cron' AND source_ref = OLD.fire_id
454
+ )
455
+ BEGIN
456
+ SELECT RAISE(ABORT, 'schedule_fire identity update blocked: dependent trigger_audit rows exist');
457
+ END;
458
+ `);
459
+ }
460
+ /** The ordered migration list. Index `i` is migration version `i + 1`; the
461
+ * db's `user_version` tracks how many have been applied. Append only. */
462
+ export const MIGRATIONS = [
463
+ /* v1 */ homeTable,
464
+ /* v2 */ scheduleTable,
465
+ /* v3 */ scheduleFireTable,
466
+ /* v4 */ ingressRouteTable,
467
+ /* v5 */ webhookDeliveryTable,
468
+ /* v6 */ triggerAuditTable,
469
+ /* v7 */ tenantIdentityTriggers,
470
+ /* v8 */ parentIdentityUpdateGuards,
471
+ ];
472
+ /** Bring `db` up to the latest schema version. Reads `user_version`, runs
473
+ * each pending migration in order, and bumps `user_version` after each so
474
+ * the work is gated and idempotent: re-running is a no-op once
475
+ * `user_version` reaches `MIGRATIONS.length`. Forward-only. */
476
+ export function migrate(db) {
477
+ let v = db.prepare('PRAGMA user_version').get().user_version;
478
+ for (; v < MIGRATIONS.length; v++) {
479
+ MIGRATIONS[v](db);
480
+ // `user_version` takes no bound parameters; v is a controlled integer.
481
+ db.exec(`PRAGMA user_version = ${v + 1}`);
482
+ }
483
+ }
484
+ const handles = new Map();
485
+ /** Open (or reuse) the CP db at `path`, initializing WAL + schema on first
486
+ * open. This is the SOLE function in the codebase that may construct a
487
+ * `DatabaseSync` against the CP db file — every CP store goes through this
488
+ * (directly or via `getControlPlaneDb()`) and never opens its own
489
+ * connection. Keyed by path so tests with distinct temp dbs get independent
490
+ * handles, exactly like `src/core/canvas/db.ts`'s `openDb()`. */
491
+ export function openControlPlaneDb(path) {
492
+ const existing = handles.get(path);
493
+ if (existing) {
494
+ try {
495
+ existing.prepare('PRAGMA database_list').all();
496
+ return existing;
497
+ }
498
+ catch {
499
+ try {
500
+ existing.close();
501
+ }
502
+ catch {
503
+ /* ignore */
504
+ }
505
+ handles.delete(path);
506
+ }
507
+ }
508
+ const dir = dirname(path);
509
+ if (!existsSync(dir))
510
+ mkdirSync(dir, { recursive: true });
511
+ const db = new DatabaseSync(path);
512
+ db.exec('PRAGMA journal_mode = WAL;');
513
+ db.exec('PRAGMA foreign_keys = ON;');
514
+ db.exec('PRAGMA busy_timeout = 5000;');
515
+ migrate(db);
516
+ handles.set(path, db);
517
+ return db;
518
+ }
519
+ /** The cached handle accessor every CP store (registry, scheduler, ingress)
520
+ * imports — resolves the db path the standard way and opens/reuses the one
521
+ * connection for it. Never construct a second `DatabaseSync` against the CP
522
+ * db elsewhere in the codebase. */
523
+ export function getControlPlaneDb(env = process.env) {
524
+ return openControlPlaneDb(controlPlaneDbPath(env));
525
+ }
526
+ /** Close and forget the handle for `path` (defaults to the standard
527
+ * resolved path). Mainly for tests. */
528
+ export function closeControlPlaneDb(path = controlPlaneDbPath()) {
529
+ const db = handles.get(path);
530
+ if (db) {
531
+ db.close();
532
+ handles.delete(path);
533
+ }
534
+ }
@@ -0,0 +1,24 @@
1
+ export interface RateLimiterConfig {
2
+ /** Per-key burst size (max tokens for one routing key). */
3
+ capacity: number;
4
+ /** Per-key steady-state refill rate (tokens/second). */
5
+ refillPerSec: number;
6
+ /** Global burst ceiling across all keys. */
7
+ globalCapacity: number;
8
+ /** Global steady-state refill rate (tokens/second). */
9
+ globalRefillPerSec: number;
10
+ /** Injectable clock for tests. Defaults to `Date.now`. */
11
+ now?: () => number;
12
+ }
13
+ export interface RateCheckResult {
14
+ ok: boolean;
15
+ retryAfterMs?: number;
16
+ }
17
+ export declare function loadRateLimiterConfig(env?: NodeJS.ProcessEnv): RateLimiterConfig;
18
+ export interface RateLimiter {
19
+ checkRate(key: string): RateCheckResult;
20
+ }
21
+ /** Build a token-bucket rate limiter. Each distinct `key` gets its own bucket
22
+ * plus a single shared global bucket; a request must draw one token from BOTH
23
+ * to pass. */
24
+ export declare function createRateLimiter(config: RateLimiterConfig): RateLimiter;
@@ -0,0 +1,100 @@
1
+ // control-plane/ingress/rate-limit.ts — the R-TRIG-4 pre-resolution ingress
2
+ // rate limiter (master plan P5.2). Burst protection on inbound ingress ONLY,
3
+ // evaluated BEFORE any route lookup / secret resolution / DB write, so a flood
4
+ // against an unknown or unverified routing key is shed cheaply and can never
5
+ // amplify into DB work.
6
+ //
7
+ // An in-memory token bucket keyed by the caller-supplied key (the ingress
8
+ // `routing_key`) plus a coarse GLOBAL ceiling. In-memory is acceptable this
9
+ // increment because the CP is a single always-on instance (design D1 / R-CP-1,
10
+ // HA out of scope) — there is no distributed limiter to coordinate. Detailed
11
+ // backoff tuning is out of scope (part-plan gap note 3): sane defaults only.
12
+ const ENV = {
13
+ capacity: 'CRTR_HEARTH_CP_WEBHOOK_RATE_CAPACITY',
14
+ refillPerSec: 'CRTR_HEARTH_CP_WEBHOOK_RATE_REFILL_PER_SEC',
15
+ globalCapacity: 'CRTR_HEARTH_CP_WEBHOOK_RATE_GLOBAL_CAPACITY',
16
+ globalRefillPerSec: 'CRTR_HEARTH_CP_WEBHOOK_RATE_GLOBAL_REFILL_PER_SEC',
17
+ };
18
+ const DEFAULTS = {
19
+ capacity: 20,
20
+ refillPerSec: 5,
21
+ globalCapacity: 200,
22
+ globalRefillPerSec: 50,
23
+ };
24
+ function parsePositive(value, fallback) {
25
+ if (value === undefined || value.trim() === '')
26
+ return fallback;
27
+ const parsed = Number(value);
28
+ if (!Number.isFinite(parsed) || parsed <= 0)
29
+ return fallback;
30
+ return parsed;
31
+ }
32
+ export function loadRateLimiterConfig(env = process.env) {
33
+ return {
34
+ capacity: parsePositive(env[ENV.capacity], DEFAULTS.capacity),
35
+ refillPerSec: parsePositive(env[ENV.refillPerSec], DEFAULTS.refillPerSec),
36
+ globalCapacity: parsePositive(env[ENV.globalCapacity], DEFAULTS.globalCapacity),
37
+ globalRefillPerSec: parsePositive(env[ENV.globalRefillPerSec], DEFAULTS.globalRefillPerSec),
38
+ };
39
+ }
40
+ /** Bound on distinct live per-key buckets before an idle sweep runs. A sweep
41
+ * drops any bucket that has refilled back to full capacity (i.e. been idle
42
+ * long enough to be indistinguishable from a fresh one), so an attacker
43
+ * cycling through unbounded distinct routing keys cannot grow the map without
44
+ * limit — they are already shed by the global ceiling. */
45
+ const MAX_KEY_BUCKETS = 10_000;
46
+ /** Build a token-bucket rate limiter. Each distinct `key` gets its own bucket
47
+ * plus a single shared global bucket; a request must draw one token from BOTH
48
+ * to pass. */
49
+ export function createRateLimiter(config) {
50
+ const now = config.now ?? (() => Date.now());
51
+ const keyBuckets = new Map();
52
+ const globalBucket = { tokens: config.globalCapacity, lastRefillMs: now() };
53
+ function refill(bucket, capacity, refillPerSec, atMs) {
54
+ const elapsedSec = Math.max(0, (atMs - bucket.lastRefillMs) / 1000);
55
+ bucket.tokens = Math.min(capacity, bucket.tokens + elapsedSec * refillPerSec);
56
+ bucket.lastRefillMs = atMs;
57
+ }
58
+ function retryAfterMs(deficit, refillPerSec) {
59
+ return Math.max(1, Math.ceil((deficit / refillPerSec) * 1000));
60
+ }
61
+ /** Drop every key bucket that has refilled to full capacity as of `atMs` —
62
+ * such a bucket is behaviourally identical to a fresh one, so removing it
63
+ * loses no rate state while reclaiming memory. Active (partially-drained)
64
+ * buckets are kept so their limits still bite. */
65
+ function sweepIdle(atMs) {
66
+ for (const [key, bucket] of keyBuckets) {
67
+ refill(bucket, config.capacity, config.refillPerSec, atMs);
68
+ if (bucket.tokens >= config.capacity)
69
+ keyBuckets.delete(key);
70
+ }
71
+ }
72
+ return {
73
+ checkRate(key) {
74
+ const atMs = now();
75
+ // Global ceiling first — a flood across many keys is shed even if each
76
+ // individual key is under its own limit.
77
+ refill(globalBucket, config.globalCapacity, config.globalRefillPerSec, atMs);
78
+ if (globalBucket.tokens < 1) {
79
+ return { ok: false, retryAfterMs: retryAfterMs(1 - globalBucket.tokens, config.globalRefillPerSec) };
80
+ }
81
+ let bucket = keyBuckets.get(key);
82
+ if (bucket === undefined) {
83
+ if (keyBuckets.size >= MAX_KEY_BUCKETS)
84
+ sweepIdle(atMs);
85
+ bucket = { tokens: config.capacity, lastRefillMs: atMs };
86
+ keyBuckets.set(key, bucket);
87
+ }
88
+ else {
89
+ refill(bucket, config.capacity, config.refillPerSec, atMs);
90
+ }
91
+ if (bucket.tokens < 1) {
92
+ return { ok: false, retryAfterMs: retryAfterMs(1 - bucket.tokens, config.refillPerSec) };
93
+ }
94
+ // Draw from both buckets only when both admit the request.
95
+ bucket.tokens -= 1;
96
+ globalBucket.tokens -= 1;
97
+ return { ok: true };
98
+ },
99
+ };
100
+ }
@@ -0,0 +1,31 @@
1
+ export type IngressChannel = 'webhook' | 'sms' | 'email' | `chat-${string}` | 'discord-gateway' | 'imap-idle';
2
+ export interface IngressRouteRow {
3
+ route_id: string;
4
+ tenant_id: string;
5
+ user_id: string;
6
+ home_id: string;
7
+ channel: IngressChannel;
8
+ routing_key: string;
9
+ routing_key_kind: string;
10
+ channel_secret_ref: string | null;
11
+ delivery_template: unknown;
12
+ enabled: boolean;
13
+ created_at: string;
14
+ updated_at: string;
15
+ }
16
+ export interface RegisterRouteInput {
17
+ route_id?: string;
18
+ home_id: string;
19
+ channel: IngressChannel;
20
+ routing_key: string;
21
+ routing_key_kind: string;
22
+ channel_secret_ref?: string | null;
23
+ delivery_template: unknown;
24
+ enabled?: boolean;
25
+ now?: string;
26
+ }
27
+ export declare function registerRoute(input: RegisterRouteInput): IngressRouteRow;
28
+ export declare function getRouteById(routeId: string): IngressRouteRow | null;
29
+ export declare function resolveRoute(channel: IngressChannel, routingKey: string): IngressRouteRow | null;
30
+ export declare function listRoutesForUser(tenantId: string, userId: string): IngressRouteRow[];
31
+ export declare function setRouteEnabled(routeId: string, enabled: boolean, now?: string): void;