@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,273 @@
1
+ import { createHash, timingSafeEqual } from 'node:crypto';
2
+ import { general } from '../../core/errors.js';
3
+ export const HEARTH_SESSION_COOKIE = 'hearth_session';
4
+ const SESSION_TOKENS_ENV = 'CRTR_HEARTH_CP_SESSION_TOKENS';
5
+ // Real Hearth login seam (not implemented in this cutover increment): the
6
+ // future login/issuance flow plugs in by creating or resolving a tenant and
7
+ // minting one of the token records consumed by `createTenantSessionStore`.
8
+ // This module only validates pre-provisioned records and performs the optional
9
+ // one-time query-token-to-cookie swap for the M0 handoff.
10
+ function sha256Hex(token) {
11
+ return createHash('sha256').update(token, 'utf8').digest('hex');
12
+ }
13
+ function normalizeHash(hash) {
14
+ const trimmed = hash.trim();
15
+ const body = trimmed.startsWith('sha256:') ? trimmed.slice('sha256:'.length) : trimmed;
16
+ return /^[0-9a-fA-F]{64}$/.test(body) ? body.toLowerCase() : '';
17
+ }
18
+ function tokenHash(seed, field) {
19
+ const fromHash = seed.token_hash === undefined ? '' : normalizeHash(seed.token_hash);
20
+ if (fromHash !== '')
21
+ return fromHash;
22
+ const token = seed.token?.trim() ?? '';
23
+ if (token !== '')
24
+ return sha256Hex(token);
25
+ throw general(`${field} requires token or token_hash`);
26
+ }
27
+ function optionalQueryTokenHash(seed) {
28
+ if (seed.query_token_hash !== undefined) {
29
+ const normalized = normalizeHash(seed.query_token_hash);
30
+ if (normalized === '')
31
+ throw general('query_token_hash must be a sha256 hash');
32
+ return normalized;
33
+ }
34
+ const token = seed.query_token?.trim() ?? '';
35
+ return token === '' ? null : sha256Hex(token);
36
+ }
37
+ function nonEmpty(name, value) {
38
+ const trimmed = value.trim();
39
+ if (trimmed === '')
40
+ throw general(`${name} must not be empty`, { field: name });
41
+ return trimmed;
42
+ }
43
+ export function createTenantSessionStore(seeds) {
44
+ const sessionHashes = new Set();
45
+ const queryHashes = new Set();
46
+ const records = seeds.map((seed) => {
47
+ const normalized = {
48
+ tenant_id: nonEmpty('tenant_id', seed.tenant_id),
49
+ user_id: nonEmpty('user_id', seed.user_id),
50
+ token_hash: tokenHash(seed, 'tenant session token'),
51
+ token: seed.token?.trim() || null,
52
+ query_token_hash: optionalQueryTokenHash(seed),
53
+ };
54
+ if (sessionHashes.has(normalized.token_hash))
55
+ throw general('duplicate tenant session token hash');
56
+ sessionHashes.add(normalized.token_hash);
57
+ if (normalized.query_token_hash !== null) {
58
+ if (queryHashes.has(normalized.query_token_hash))
59
+ throw general('duplicate tenant query token hash');
60
+ queryHashes.add(normalized.query_token_hash);
61
+ }
62
+ return normalized;
63
+ });
64
+ return { records, consumed_query_token_hashes: new Set() };
65
+ }
66
+ let envStoreCache = null;
67
+ export function loadTenantSessionStore(env = process.env) {
68
+ const raw = env[SESSION_TOKENS_ENV];
69
+ if (envStoreCache !== null && envStoreCache.raw === raw)
70
+ return envStoreCache.store;
71
+ if (raw === undefined || raw.trim() === '') {
72
+ const empty = createTenantSessionStore([]);
73
+ envStoreCache = { raw, store: empty };
74
+ return empty;
75
+ }
76
+ let parsed;
77
+ try {
78
+ parsed = JSON.parse(raw);
79
+ }
80
+ catch {
81
+ throw general(`${SESSION_TOKENS_ENV} must be JSON`);
82
+ }
83
+ if (!Array.isArray(parsed))
84
+ throw general(`${SESSION_TOKENS_ENV} must be a JSON array`);
85
+ const store = createTenantSessionStore(parsed);
86
+ envStoreCache = { raw, store };
87
+ return store;
88
+ }
89
+ function parseCookieHeader(header) {
90
+ const out = {};
91
+ if (header === undefined || header.trim() === '')
92
+ return out;
93
+ for (const part of header.split(';')) {
94
+ const idx = part.indexOf('=');
95
+ if (idx <= 0)
96
+ continue;
97
+ const key = part.slice(0, idx).trim();
98
+ const value = part.slice(idx + 1).trim();
99
+ if (key !== '')
100
+ out[key] = value;
101
+ }
102
+ return out;
103
+ }
104
+ function requestUrl(req) {
105
+ return new URL(req.url ?? '/', 'http://127.0.0.1');
106
+ }
107
+ function queryToken(req) {
108
+ const token = requestUrl(req).searchParams.get('token')?.trim() ?? '';
109
+ return token === '' ? null : token;
110
+ }
111
+ function bearerToken(req) {
112
+ const authorization = req.headers.authorization;
113
+ if (typeof authorization !== 'string')
114
+ return null;
115
+ const match = /^Bearer\s+(.+)$/.exec(authorization.trim());
116
+ const token = match?.[1]?.trim() ?? '';
117
+ return token === '' ? null : token;
118
+ }
119
+ function cookieToken(req) {
120
+ const token = parseCookieHeader(req.headers.cookie)[HEARTH_SESSION_COOKIE];
121
+ if (token === undefined || token.trim() === '')
122
+ return null;
123
+ try {
124
+ return decodeURIComponent(token.trim());
125
+ }
126
+ catch {
127
+ return null;
128
+ }
129
+ }
130
+ function constantTimeMatch(expectedHash, candidateHash) {
131
+ if (expectedHash === '')
132
+ return false;
133
+ return timingSafeEqual(Buffer.from(expectedHash, 'hex'), Buffer.from(candidateHash, 'hex'));
134
+ }
135
+ function lookupBySessionToken(token, store) {
136
+ const trimmed = token.trim();
137
+ if (trimmed === '')
138
+ return null;
139
+ const candidate = sha256Hex(trimmed);
140
+ let match = null;
141
+ for (const record of store.records) {
142
+ if (constantTimeMatch(record.token_hash, candidate)) {
143
+ match = { tenant_id: record.tenant_id, user_id: record.user_id };
144
+ }
145
+ }
146
+ return match;
147
+ }
148
+ function lookupByQueryToken(token, store) {
149
+ const trimmed = token.trim();
150
+ if (trimmed === '')
151
+ return null;
152
+ const candidate = sha256Hex(trimmed);
153
+ let match = null;
154
+ for (const record of store.records) {
155
+ if (record.query_token_hash !== null && constantTimeMatch(record.query_token_hash, candidate)) {
156
+ match = record;
157
+ }
158
+ }
159
+ return match;
160
+ }
161
+ function trustedOrigin(req, publicOrigin) {
162
+ const expected = publicOrigin.trim();
163
+ if (expected === '')
164
+ throw general('publicOrigin is required for tenant session origin checks');
165
+ const origin = req.headers.origin?.trim() ?? '';
166
+ return origin !== '' && origin === expected;
167
+ }
168
+ /** Origin policy for the one-time query-token swap on a safe top-level
169
+ * GET/HEAD navigation. Ordinary top-level navigations (the only way this
170
+ * swap is reachable — see `swapQueryTokenForCookie`) do not reliably carry
171
+ * an `Origin` header at all, so requiring one regressed the M0 open-link
172
+ * handoff into an unusable 401. The token itself is a one-time secret: a
173
+ * party that can already supply the correct `?token=` value has already
174
+ * obtained the secret, so Origin adds no protection against that. If a
175
+ * browser-style `Origin` header IS present (e.g. a cross-origin fetch/XHR
176
+ * rather than a plain top-level navigation), it must still match
177
+ * `publicOrigin` exactly — this only relaxes the "no Origin header at all"
178
+ * case, it does not accept a mismatched one. */
179
+ function originAcceptableForQueryTokenSwap(req, publicOrigin) {
180
+ const origin = req.headers.origin?.trim() ?? '';
181
+ if (origin === '')
182
+ return true;
183
+ return origin === publicOrigin.trim();
184
+ }
185
+ export function setSessionCookie(res, token, options = {}) {
186
+ const maxAge = options.maxAgeSeconds ?? 365 * 24 * 60 * 60;
187
+ const path = options.path ?? '/';
188
+ const sameSite = options.sameSite ?? 'Lax';
189
+ const secure = options.secure ?? true;
190
+ const parts = [
191
+ `${HEARTH_SESSION_COOKIE}=${encodeURIComponent(token)}`,
192
+ `Path=${path}`,
193
+ 'HttpOnly',
194
+ `SameSite=${sameSite}`,
195
+ `Max-Age=${maxAge}`,
196
+ ];
197
+ if (secure)
198
+ parts.push('Secure');
199
+ res.setHeader('Set-Cookie', parts.join('; '));
200
+ }
201
+ export function clearSessionCookie(res, options = {}) {
202
+ setSessionCookie(res, '', { ...options, maxAgeSeconds: 0 });
203
+ }
204
+ /** Validate durable session credentials only: HttpOnly cookie for browsers or
205
+ * Bearer for non-browser clients. Query tokens are intentionally ignored here
206
+ * so a copied `?token=` URL is never durable authorization. */
207
+ export function resolveTenantSession(req, options = {}) {
208
+ const store = options.store ?? loadTenantSessionStore();
209
+ const cookie = cookieToken(req);
210
+ if (cookie !== null) {
211
+ const session = lookupBySessionToken(cookie, store);
212
+ return session === null ? null : { ...session, source: 'cookie' };
213
+ }
214
+ const bearer = bearerToken(req);
215
+ if (bearer !== null) {
216
+ if ((req.headers.origin?.trim() ?? '') !== '')
217
+ return null;
218
+ const session = lookupBySessionToken(bearer, store);
219
+ return session === null ? null : { ...session, source: 'bearer' };
220
+ }
221
+ return null;
222
+ }
223
+ /** State-changing browser lanes require a valid session AND a trusted Origin;
224
+ * query tokens are not accepted here. Bearer remains available only to
225
+ * non-browser clients (no Origin header). */
226
+ export function resolveTenantWriteAuth(req, options) {
227
+ const auth = resolveTenantSession(req, options);
228
+ if (auth === null)
229
+ return null;
230
+ if (auth.source === 'cookie')
231
+ return trustedOrigin(req, options.publicOrigin) ? auth : null;
232
+ return auth.source === 'bearer' ? auth : null;
233
+ }
234
+ /** Consume an optional M0 handoff `?token=` exactly once and swap it to the
235
+ * HttpOnly/Secure/SameSite Hearth session cookie. This is the only query-token
236
+ * path. Safe top-level navigations (`GET`/`HEAD`) are permitted without a
237
+ * matching `Origin` header (see `originAcceptableForQueryTokenSwap`); any
238
+ * other method still requires a trusted Origin, matching the write-lane
239
+ * policy. Returns null on replay, invalid token, missing token, or a
240
+ * rejected Origin. */
241
+ export function swapQueryTokenForCookie(req, res, options) {
242
+ const method = req.method ?? 'GET';
243
+ const isSafeTopLevelNavigation = method === 'GET' || method === 'HEAD';
244
+ const originOk = isSafeTopLevelNavigation
245
+ ? originAcceptableForQueryTokenSwap(req, options.publicOrigin)
246
+ : trustedOrigin(req, options.publicOrigin);
247
+ if (!originOk)
248
+ return null;
249
+ const store = options.store ?? loadTenantSessionStore();
250
+ const token = queryToken(req);
251
+ if (token === null)
252
+ return null;
253
+ const record = lookupByQueryToken(token, store);
254
+ if (record === null || record.query_token_hash === null)
255
+ return null;
256
+ if (store.consumed_query_token_hashes.has(record.query_token_hash))
257
+ return null;
258
+ if (record.token === null) {
259
+ throw general('query token swap requires a raw pre-provisioned session token for Set-Cookie');
260
+ }
261
+ store.consumed_query_token_hashes.add(record.query_token_hash);
262
+ setSessionCookie(res, record.token, options.cookie);
263
+ return { tenant_id: record.tenant_id, user_id: record.user_id, source: 'query-swap' };
264
+ }
265
+ export function tenantSessionAuthRedactedMessage(message) {
266
+ return message
267
+ .replace(/(Authorization:\s*Bearer\s+)[^\s]+/gi, '$1[redacted]')
268
+ .replace(/([?&]token=)[^&#\s]+/gi, '$1[redacted]')
269
+ .replace(new RegExp(`(${HEARTH_SESSION_COOKIE}=)[^;\\s]+`, 'gi'), '$1[redacted]');
270
+ }
271
+ export function resetTenantSessionStoreCacheForTests() {
272
+ envStoreCache = null;
273
+ }
@@ -0,0 +1,14 @@
1
+ import type { HomeId } from '../types.js';
2
+ import type { TriggerSource } from './envelope.js';
3
+ export interface AuthorizeTriggerResult {
4
+ ok: boolean;
5
+ reason?: string;
6
+ }
7
+ /**
8
+ * Structural authorization for delivering `source`/`sourceRef` to `homeId`.
9
+ * Rejects when the source row is absent, when the target `homeId` differs from
10
+ * the source-bound home (cross-home targeting), or when the target home is
11
+ * absent or terminated. Returns `{ ok: true }` only for a source whose FK
12
+ * home matches the target and resolves to a live home.
13
+ */
14
+ export declare function authorizeTrigger(source: TriggerSource, sourceRef: string, homeId: HomeId): AuthorizeTriggerResult;
@@ -0,0 +1,52 @@
1
+ // control-plane/triggers/acl.ts — the R-TRIG-4 STRUCTURAL trigger authorization
2
+ // guard (master plan P5.2). This is the FK-integrity check only: "which source
3
+ // may target which home". The permission/ownership POLICY beyond this
4
+ // (per-user grants, capability scoping, etc.) is explicitly post-cutover
5
+ // (part-plan gap note 11) and is NOT implemented here.
6
+ //
7
+ // The guard: a trigger's bound source row (`schedule_fire` for cron,
8
+ // `ingress_route` for webhook) carries a `home_id` FK. A delivery is
9
+ // authorized only when the target `home_id` EQUALS that source-bound home_id
10
+ // (no cross-home targeting) AND that home resolves to an existing,
11
+ // non-terminated `home` row. Anything else is rejected before any wake/exec.
12
+ import { getControlPlaneDb } from '../db.js';
13
+ import { getHomeById } from '../registry.js';
14
+ /** Terminated/terminating homes are not valid delivery targets — a trigger
15
+ * must never wake or exec against a home that is being torn down. */
16
+ const DEAD_HOME_STATUSES = new Set(['terminating', 'terminated']);
17
+ /** Read the `home_id` a source row (`schedule_fire.fire_id` for cron,
18
+ * `ingress_route.route_id` for webhook) is bound to. `null` when the source
19
+ * row does not exist — a hard reject (no home to target). */
20
+ function sourceBoundHomeId(source, sourceRef) {
21
+ const db = getControlPlaneDb();
22
+ if (source === 'cron') {
23
+ const row = db.prepare('SELECT home_id FROM schedule_fire WHERE fire_id = ?').get(sourceRef);
24
+ return row === undefined ? null : row.home_id;
25
+ }
26
+ const row = db.prepare('SELECT home_id FROM ingress_route WHERE route_id = ?').get(sourceRef);
27
+ return row === undefined ? null : row.home_id;
28
+ }
29
+ /**
30
+ * Structural authorization for delivering `source`/`sourceRef` to `homeId`.
31
+ * Rejects when the source row is absent, when the target `homeId` differs from
32
+ * the source-bound home (cross-home targeting), or when the target home is
33
+ * absent or terminated. Returns `{ ok: true }` only for a source whose FK
34
+ * home matches the target and resolves to a live home.
35
+ */
36
+ export function authorizeTrigger(source, sourceRef, homeId) {
37
+ const boundHomeId = sourceBoundHomeId(source, sourceRef);
38
+ if (boundHomeId === null) {
39
+ return { ok: false, reason: 'source not found' };
40
+ }
41
+ if (boundHomeId !== homeId) {
42
+ return { ok: false, reason: 'cross-home targeting rejected' };
43
+ }
44
+ const home = getHomeById(homeId);
45
+ if (home === null) {
46
+ return { ok: false, reason: 'target home not found' };
47
+ }
48
+ if (DEAD_HOME_STATUSES.has(home.status)) {
49
+ return { ok: false, reason: `target home ${home.status}` };
50
+ }
51
+ return { ok: true };
52
+ }
@@ -0,0 +1,38 @@
1
+ export type TriggerSource = 'cron' | 'webhook';
2
+ export type TriggerTier = 'critical' | 'urgent' | 'normal' | 'deferred';
3
+ export type TriggerOutcome = 'delivered' | 'rejected' | 'failed';
4
+ export interface TriggerAuditRow {
5
+ audit_id: string;
6
+ tenant_id: string;
7
+ user_id: string;
8
+ home_id: string;
9
+ source: TriggerSource;
10
+ source_ref: string;
11
+ trigger_id: string;
12
+ tier: TriggerTier;
13
+ outcome: TriggerOutcome;
14
+ reason: string | null;
15
+ payload_sha256: string | null;
16
+ metadata_json: Record<string, unknown> | null;
17
+ at: string;
18
+ }
19
+ export interface RecordTriggerAuditInput {
20
+ audit_id?: string;
21
+ source: TriggerSource;
22
+ source_ref: string;
23
+ trigger_id: string;
24
+ tier: TriggerTier;
25
+ outcome: TriggerOutcome;
26
+ reason?: string | null;
27
+ payload_sha256?: string | null;
28
+ metadata_json?: Record<string, unknown> | null;
29
+ at?: string;
30
+ }
31
+ export interface ListTriggerAuditOptions {
32
+ from?: string;
33
+ to?: string;
34
+ limit?: number;
35
+ }
36
+ export declare function recordTriggerAudit(input: RecordTriggerAuditInput): TriggerAuditRow;
37
+ export declare function getTriggerAuditById(auditId: string): TriggerAuditRow | null;
38
+ export declare function listTriggerAudit(homeId: string, options?: ListTriggerAuditOptions): TriggerAuditRow[];
@@ -0,0 +1,79 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { getControlPlaneDb } from '../db.js';
3
+ function nowIso() {
4
+ return new Date().toISOString();
5
+ }
6
+ function sourceIdentity(source, sourceRef) {
7
+ if (source === 'cron') {
8
+ const row = getControlPlaneDb()
9
+ .prepare('SELECT home_id, tenant_id, user_id FROM schedule_fire WHERE fire_id = ?')
10
+ .get(sourceRef);
11
+ if (row === undefined)
12
+ throw new Error(`schedule fire not found: ${sourceRef}`);
13
+ return row;
14
+ }
15
+ const row = getControlPlaneDb()
16
+ .prepare('SELECT home_id, tenant_id, user_id FROM ingress_route WHERE route_id = ?')
17
+ .get(sourceRef);
18
+ if (row === undefined)
19
+ throw new Error(`ingress route not found: ${sourceRef}`);
20
+ return row;
21
+ }
22
+ function auditFrom(row) {
23
+ const metadata = row['metadata_json'];
24
+ return {
25
+ audit_id: row['audit_id'],
26
+ tenant_id: row['tenant_id'],
27
+ user_id: row['user_id'],
28
+ home_id: row['home_id'],
29
+ source: row['source'],
30
+ source_ref: row['source_ref'],
31
+ trigger_id: row['trigger_id'],
32
+ tier: row['tier'],
33
+ outcome: row['outcome'],
34
+ reason: row['reason'] ?? null,
35
+ payload_sha256: row['payload_sha256'] ?? null,
36
+ metadata_json: metadata === null ? null : JSON.parse(metadata),
37
+ at: row['at'],
38
+ };
39
+ }
40
+ export function recordTriggerAudit(input) {
41
+ const auditId = input.audit_id ?? `audit-${randomUUID()}`;
42
+ const at = input.at ?? nowIso();
43
+ const identity = sourceIdentity(input.source, input.source_ref);
44
+ getControlPlaneDb()
45
+ .prepare(`INSERT INTO trigger_audit (
46
+ audit_id, tenant_id, user_id, home_id, source, source_ref, trigger_id,
47
+ tier, outcome, reason, payload_sha256, metadata_json, at
48
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
49
+ .run(auditId, identity.tenant_id, identity.user_id, identity.home_id, input.source, input.source_ref, input.trigger_id, input.tier, input.outcome, input.reason ?? null, input.payload_sha256 ?? null, input.metadata_json == null ? null : JSON.stringify(input.metadata_json), at);
50
+ return getTriggerAuditById(auditId);
51
+ }
52
+ export function getTriggerAuditById(auditId) {
53
+ const row = getControlPlaneDb().prepare('SELECT * FROM trigger_audit WHERE audit_id = ?').get(auditId);
54
+ return row === undefined ? null : auditFrom(row);
55
+ }
56
+ export function listTriggerAudit(homeId, options = {}) {
57
+ const limit = options.limit ?? 100;
58
+ const db = getControlPlaneDb();
59
+ let rows;
60
+ if (options.from !== undefined && options.to !== undefined) {
61
+ rows = db
62
+ .prepare('SELECT * FROM trigger_audit WHERE home_id = ? AND at >= ? AND at <= ? ORDER BY at DESC LIMIT ?')
63
+ .all(homeId, options.from, options.to, limit);
64
+ }
65
+ else if (options.from !== undefined) {
66
+ rows = db
67
+ .prepare('SELECT * FROM trigger_audit WHERE home_id = ? AND at >= ? ORDER BY at DESC LIMIT ?')
68
+ .all(homeId, options.from, limit);
69
+ }
70
+ else if (options.to !== undefined) {
71
+ rows = db
72
+ .prepare('SELECT * FROM trigger_audit WHERE home_id = ? AND at <= ? ORDER BY at DESC LIMIT ?')
73
+ .all(homeId, options.to, limit);
74
+ }
75
+ else {
76
+ rows = db.prepare('SELECT * FROM trigger_audit WHERE home_id = ? ORDER BY at DESC LIMIT ?').all(homeId, limit);
77
+ }
78
+ return rows.map(auditFrom);
79
+ }
@@ -0,0 +1,43 @@
1
+ import type { HomeId } from '../types.js';
2
+ import { recordTriggerAudit } from './audit-store.js';
3
+ import { authorizeTrigger } from './acl.js';
4
+ import { type TriggerEnvelope } from './envelope.js';
5
+ import { wakeAndExecNodeMessage, type NodeMessageTier } from '../node-message.js';
6
+ export type DeliveryOutcome = 'delivered' | 'rejected' | 'failed';
7
+ export interface DeliverTriggerInput {
8
+ home_id: HomeId;
9
+ /** The source row this delivery is bound to: `schedule_fire.fire_id` (cron)
10
+ * or `ingress_route.route_id` (webhook). Used for both the ACL FK guard and
11
+ * the audit `source_ref`. */
12
+ source_ref: string;
13
+ envelope: TriggerEnvelope;
14
+ tier: NodeMessageTier;
15
+ /** Optional pre-computed payload hash (e.g. webhook raw-body sha256). When
16
+ * omitted, a hash over the serialized envelope payload is recorded. The raw
17
+ * payload itself is NEVER stored. */
18
+ payload_sha256?: string;
19
+ /** Bounded, non-sensitive audit metadata (e.g. byte length, content-type).
20
+ * Never the raw payload. */
21
+ metadata?: Record<string, unknown>;
22
+ }
23
+ export interface DeliverTriggerResult {
24
+ outcome: DeliveryOutcome;
25
+ reason?: string;
26
+ }
27
+ /** Indirection seam so a test/smoke script can fake the guard, the exec
28
+ * primitive, and the audit writer without a real DB/provider. Production
29
+ * never reassigns these. */
30
+ export declare const deliverInternals: {
31
+ authorizeTrigger: typeof authorizeTrigger;
32
+ wakeAndExecNodeMessage: typeof wakeAndExecNodeMessage;
33
+ recordTriggerAudit: typeof recordTriggerAudit;
34
+ };
35
+ /**
36
+ * Deliver `input.envelope` to `input.home_id` through the P4.4 wake+exec
37
+ * primitive, gated by the FK-integrity ACL and recorded in the trigger audit.
38
+ * Returns `{ outcome: 'rejected' }` (no wake/exec) for an unauthorized target,
39
+ * `{ outcome: 'delivered' }` after a successful in-guest `node msg`, or
40
+ * `{ outcome: 'failed' }` when the wake/exec threw. Every path writes exactly
41
+ * one audit row (rejected/delivered/failed).
42
+ */
43
+ export declare function deliverTrigger(input: DeliverTriggerInput): Promise<DeliverTriggerResult>;
@@ -0,0 +1,76 @@
1
+ // control-plane/triggers/deliver.ts — the single SEAM-5 trigger delivery
2
+ // chokepoint (master plan P5.3). BOTH producers (cron scan loop, webhook
3
+ // ingress) deliver through here and only here, so the R-TRIG-4 hooks
4
+ // (authorize + audit) can never be bypassed by a producer.
5
+ //
6
+ // Flow: (1) `authorizeTrigger` (FK-integrity guard, acl.ts) — an unauthorized
7
+ // trigger records a `rejected` audit row and returns WITHOUT ever waking or
8
+ // exec'ing a home; (2) on authorize, call the P4.4 primitive
9
+ // `wakeAndExecNodeMessage(home_id, serializeEnvelope(envelope), tier)` — which
10
+ // wakes the home FIRST, then runs `crtr node msg --to <target> --tier <tier>`
11
+ // in-guest with the serialized envelope on STDIN (never in argv/heredoc/
12
+ // base64); (3) record a `delivered` or `failed` audit row.
13
+ //
14
+ // This module NEVER touches provider exec directly and NEVER writes a home's
15
+ // inbox file — the P4.4 primitive is the only delivery path. It also never
16
+ // persists the raw untrusted payload: the audit row carries a content HASH and
17
+ // bounded metadata only (R-CP-8 / audit-is-metadata-only).
18
+ import { createHash } from 'node:crypto';
19
+ import { redactSecrets } from '../secrets.js';
20
+ import { recordTriggerAudit } from './audit-store.js';
21
+ import { authorizeTrigger } from './acl.js';
22
+ import { serializeEnvelope } from './envelope.js';
23
+ import { wakeAndExecNodeMessage } from '../node-message.js';
24
+ /** Indirection seam so a test/smoke script can fake the guard, the exec
25
+ * primitive, and the audit writer without a real DB/provider. Production
26
+ * never reassigns these. */
27
+ export const deliverInternals = {
28
+ authorizeTrigger,
29
+ wakeAndExecNodeMessage,
30
+ recordTriggerAudit,
31
+ };
32
+ function hashPayload(payload) {
33
+ return createHash('sha256').update(JSON.stringify(payload ?? null)).digest('hex');
34
+ }
35
+ /** Bound + redact an error into an audit `reason`. The P4.4 primitive's error
36
+ * messages do not include the payload body, but this is defense-in-depth:
37
+ * truncate and strip any resolved secret before it lands in a DB row. */
38
+ function auditReason(error) {
39
+ const raw = error instanceof Error ? error.message : String(error);
40
+ return redactSecrets(raw).slice(0, 200);
41
+ }
42
+ /**
43
+ * Deliver `input.envelope` to `input.home_id` through the P4.4 wake+exec
44
+ * primitive, gated by the FK-integrity ACL and recorded in the trigger audit.
45
+ * Returns `{ outcome: 'rejected' }` (no wake/exec) for an unauthorized target,
46
+ * `{ outcome: 'delivered' }` after a successful in-guest `node msg`, or
47
+ * `{ outcome: 'failed' }` when the wake/exec threw. Every path writes exactly
48
+ * one audit row (rejected/delivered/failed).
49
+ */
50
+ export async function deliverTrigger(input) {
51
+ const { home_id, source_ref, envelope, tier } = input;
52
+ const payloadSha256 = input.payload_sha256 ?? hashPayload(envelope.payload);
53
+ const auditBase = {
54
+ source: envelope.source,
55
+ source_ref,
56
+ trigger_id: envelope.trigger_id,
57
+ tier,
58
+ payload_sha256: payloadSha256,
59
+ metadata_json: input.metadata ?? null,
60
+ };
61
+ const authorized = deliverInternals.authorizeTrigger(envelope.source, source_ref, home_id);
62
+ if (!authorized.ok) {
63
+ deliverInternals.recordTriggerAudit({ ...auditBase, outcome: 'rejected', reason: authorized.reason ?? 'unauthorized' });
64
+ return { outcome: 'rejected', reason: authorized.reason };
65
+ }
66
+ try {
67
+ await deliverInternals.wakeAndExecNodeMessage(home_id, serializeEnvelope(envelope), tier);
68
+ }
69
+ catch (error) {
70
+ const reason = auditReason(error);
71
+ deliverInternals.recordTriggerAudit({ ...auditBase, outcome: 'failed', reason });
72
+ return { outcome: 'failed', reason };
73
+ }
74
+ deliverInternals.recordTriggerAudit({ ...auditBase, outcome: 'delivered' });
75
+ return { outcome: 'delivered' };
76
+ }
@@ -0,0 +1,29 @@
1
+ export type TriggerSource = 'cron' | 'webhook';
2
+ /**
3
+ * The delivered envelope. `payload` is deliberately `unknown` — it is
4
+ * untrusted external content and callers/home-side code must narrow it
5
+ * defensively. `trigger_id` is the home-side dedupe key: the durable
6
+ * `schedule_fire.fire_id` for cron, a stable route-derived id for webhook.
7
+ */
8
+ export interface TriggerEnvelope {
9
+ source: TriggerSource;
10
+ trigger_id: string;
11
+ payload: unknown;
12
+ received_at: string;
13
+ }
14
+ export interface BuildTriggerEnvelopeInput {
15
+ source: TriggerSource;
16
+ trigger_id: string;
17
+ payload: unknown;
18
+ /** Override the received-at stamp (tests/replays); defaults to now. */
19
+ received_at?: string;
20
+ }
21
+ /** Build a canonical envelope. Takes NO routing-key argument by construction
22
+ * (R-ING-3) — `payload` is channel-shaped content only. */
23
+ export declare function buildTriggerEnvelope(input: BuildTriggerEnvelopeInput): TriggerEnvelope;
24
+ /** Serialize an envelope to the compact JSON body carried on the `node msg`
25
+ * stdin. Emits EXACTLY the four canonical fields in a fixed order — any
26
+ * extra property on the passed object (e.g. a stray routing key) is dropped
27
+ * here, so the home only ever sees `{source, trigger_id, payload,
28
+ * received_at}`. */
29
+ export declare function serializeEnvelope(envelope: TriggerEnvelope): string;
@@ -0,0 +1,38 @@
1
+ // control-plane/triggers/envelope.ts — the R-TRIG-2 trigger delivery envelope
2
+ // (master plan P5.1). The exact JSON shape delivered in-guest to a home agent
3
+ // over `crtr node msg --to <target>` (stdin body), for both cron and webhook
4
+ // sources.
5
+ //
6
+ // Two hard invariants this module encodes:
7
+ // 1. `payload` is UNTRUSTED external data. For a webhook it is attacker-
8
+ // controlled request-body content; for cron it is the operator-authored
9
+ // `schedule.delivery_payload`. Home agents / scaffolding must treat it as
10
+ // data, never as instructions (the C7 image defaults say so too).
11
+ // 2. The envelope NEVER carries the ingress routing key (R-ING-3). The
12
+ // builder takes no routing-key argument, and `serializeEnvelope` emits
13
+ // ONLY the four canonical fields, so a routing key can never leak to a
14
+ // home even if a caller stuffed one into an ad-hoc object.
15
+ /** Build a canonical envelope. Takes NO routing-key argument by construction
16
+ * (R-ING-3) — `payload` is channel-shaped content only. */
17
+ export function buildTriggerEnvelope(input) {
18
+ return {
19
+ source: input.source,
20
+ trigger_id: input.trigger_id,
21
+ payload: input.payload,
22
+ received_at: input.received_at ?? new Date().toISOString(),
23
+ };
24
+ }
25
+ /** Serialize an envelope to the compact JSON body carried on the `node msg`
26
+ * stdin. Emits EXACTLY the four canonical fields in a fixed order — any
27
+ * extra property on the passed object (e.g. a stray routing key) is dropped
28
+ * here, so the home only ever sees `{source, trigger_id, payload,
29
+ * received_at}`. */
30
+ export function serializeEnvelope(envelope) {
31
+ const canonical = {
32
+ source: envelope.source,
33
+ trigger_id: envelope.trigger_id,
34
+ payload: envelope.payload,
35
+ received_at: envelope.received_at,
36
+ };
37
+ return JSON.stringify(canonical);
38
+ }