@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
@@ -1,185 +0,0 @@
1
- // wakeups.ts — the WAKEUPS table data-access layer (canvas.db, migration v7).
2
- //
3
- // One-module-per-table (the focuses.ts precedent): ALL SQL that touches the
4
- // `wakeups` table lives HERE and nowhere else — never appended to canvas.ts,
5
- // which keeps the node/edge model. A WAKEUP is one durable row = "do <kind> at
6
- // fire_at [every recur]", carrying a fire time, a kind, an optional payload, an
7
- // optional recurrence cadence, a nullable TARGET node_id, and the owner_id of
8
- // the node that ARMED it.
9
- //
10
- // Two anchors, two reap rules (design D1/D2):
11
- // - node_id → the revive target AND the node-anchored cancel anchor; it
12
- // carries the `ON DELETE CASCADE` FK, so a pruned node's node-anchored wakes
13
- // are reaped FOR FREE in pruneNodes' same `DELETE FROM nodes` (canvas.ts is
14
- // UNTOUCHED — the cascade does it; there is no pruneNodes wakeups code).
15
- // NULL = canvas-detached (a deferred spawn / spawn-cron).
16
- // - owner_id → the armer; a PLAIN indexed column with NO FK, so a crashed-
17
- // then-pruned armer's detached cron is NOT cascade-dropped (Invariant E).
18
- // Reaped only by the explicit cancelWakesFor DELETE on deliberate close.
19
- //
20
- // Each function is a single-statement query mirroring the canvas.ts atomic-setter
21
- // pattern (setStatus/setIntent/setPresence) — no read-modify-write, serialized by
22
- // WAL. The data-access layer OWNS payload serialization: armWake JSON.stringifies
23
- // the typed per-kind union on write; dueWakes/listWakes JSON.parse it back on read
24
- // (Maj-1), so callers consume `payload.body` / `payload as SpawnChildOpts` directly.
25
- //
26
- // `wakeup_id` is CALLER-SUPPLIED (the command surface mints `wk-${newNodeId()}`):
27
- // the canvas layer never imports newNodeId from runtime/nodes.ts — that would
28
- // force a canvas → runtime → canvas import cycle (Min-1).
29
- import { openDb } from './db.js';
30
- /** A thrown integrity-backstop error from armWake. `code` is the AC-N3 code the
31
- * command surface (the ONLY sanctioned caller of armWake) maps to a rendered
32
- * error block — armWake carries integrity backstops only (empty body / recur-on-
33
- * deadline / unknown kind); target-resolvability + recoverable-state + the
34
- * per-owner cap live in the surface (Min-6), so a non-surface armer could insert
35
- * a dangling wake — every armer MUST route through the surface. */
36
- export class WakeArmError extends Error {
37
- code;
38
- constructor(code, message) {
39
- super(message);
40
- this.code = code;
41
- this.name = 'WakeArmError';
42
- }
43
- }
44
- /** Hydrate a raw row into a Wakeup, JSON.parsing `payload` back into the typed
45
- * per-kind union (NULL column → null). */
46
- function wakeupFrom(r) {
47
- const raw = r['payload'];
48
- return {
49
- wakeup_id: r['wakeup_id'],
50
- node_id: r['node_id'] ?? null,
51
- owner_id: r['owner_id'],
52
- fire_at: r['fire_at'],
53
- kind: r['kind'],
54
- recur: r['recur'] ?? null,
55
- payload: raw == null ? null : JSON.parse(raw),
56
- created: r['created'],
57
- };
58
- }
59
- // ---------------------------------------------------------------------------
60
- // Writes — each a single-statement INSERT/UPDATE/DELETE.
61
- // ---------------------------------------------------------------------------
62
- /** INSERT one wakeup row from the pinned spec, returning its (caller-supplied)
63
- * `wakeup_id`. JSON.stringifies the typed `payload` union into the TEXT column
64
- * and stamps `created`.
65
- *
66
- * Deadline upsert (design Q3, "≤1 deadline per node"): for `kind === 'deadline'`
67
- * the node's existing deadline is canceled first, then the new one inserted — the
68
- * partial unique index `idx_wakeups_deadline` is the schema-level backstop.
69
- *
70
- * Integrity backstops (throw WakeArmError; the surface maps the code to AC-N3):
71
- * - empty/whitespace note `body` for `noted`/`deadline` → `empty_note`.
72
- * - non-NULL `recur` on a `deadline` → `deadline_cannot_recur`.
73
- * - unknown `kind` → `bad_kind`.
74
- * NO target-resolvability / recoverable-state / cap backstop here (Min-6). */
75
- export function armWake(spec) {
76
- const { kind } = spec;
77
- if (kind !== 'bare' && kind !== 'noted' && kind !== 'deadline' && kind !== 'spawn') {
78
- throw new WakeArmError('bad_kind', `unknown wake kind: ${String(kind)}`);
79
- }
80
- if (kind === 'noted' || kind === 'deadline') {
81
- const body = spec.payload?.body;
82
- if (typeof body !== 'string' || body.trim() === '') {
83
- throw new WakeArmError('empty_note', `a ${kind} wake requires a non-empty note body.`);
84
- }
85
- }
86
- if (kind === 'deadline' && spec.recur != null) {
87
- throw new WakeArmError('deadline_cannot_recur', 'a deadline wake cannot recur.');
88
- }
89
- // Deadline upsert: clear the node's existing deadline before inserting the new one.
90
- if (kind === 'deadline' && spec.node_id != null) {
91
- cancelDeadlinesFor(spec.node_id);
92
- }
93
- const payloadText = spec.payload == null ? null : JSON.stringify(spec.payload);
94
- openDb()
95
- .prepare(`INSERT INTO wakeups (wakeup_id, node_id, owner_id, fire_at, kind, recur, payload, created)
96
- VALUES (?, ?, ?, ?, ?, ?, ?, ?)`)
97
- .run(spec.wakeup_id, spec.node_id ?? null, spec.owner_id, spec.fire_at, kind, spec.recur ?? null, payloadText, new Date().toISOString());
98
- return spec.wakeup_id;
99
- }
100
- /** UPDATE the next fire time — recurrence advancement (the daemon settles a
101
- * recurring row to its next slot BEFORE enacting, crash-safe; design D4). */
102
- export function advanceWake(wakeup_id, nextFireIso) {
103
- openDb().prepare('UPDATE wakeups SET fire_at = ? WHERE wakeup_id = ?').run(nextFireIso, wakeup_id);
104
- }
105
- /** DELETE one wakeup by id — one-shot consumption (the daemon settles a one-shot
106
- * row BEFORE enacting, crash-safe; design D4). */
107
- export function consumeWake(wakeup_id) {
108
- openDb().prepare('DELETE FROM wakeups WHERE wakeup_id = ?').run(wakeup_id);
109
- }
110
- /** DELETE one wakeup by id — the explicit user/surface cancel. Idempotent:
111
- * 0 rows ⇒ no error (AC-C2). */
112
- export function cancelWake(wakeup_id) {
113
- openDb().prepare('DELETE FROM wakeups WHERE wakeup_id = ?').run(wakeup_id);
114
- }
115
- /** DELETE every wake anchored to this node AND every detached wake it ARMED —
116
- * deliberate close/reap (ruling A). Hooked at transition('cancel'). */
117
- export function cancelWakesFor(node_id) {
118
- openDb()
119
- .prepare('DELETE FROM wakeups WHERE node_id = ? OR owner_id = ?')
120
- .run(node_id, node_id);
121
- }
122
- /** DELETE this node's one-shot self-alarms (recur IS NULL); node-anchored crons
123
- * SURVIVE — finalize is the instance finishing, not a teardown of standing
124
- * schedules (design Q1). Hooked at transition('finalize'). */
125
- export function cancelSelfAlarms(node_id) {
126
- openDb().prepare('DELETE FROM wakeups WHERE node_id = ? AND recur IS NULL').run(node_id);
127
- }
128
- /** DELETE this node's pending deadline(s) — cancel-on-wake (design §6.4).
129
- * Hooked at reviveNode, so the deadline always belongs to the dormancy left. */
130
- export function cancelDeadlinesFor(node_id) {
131
- openDb().prepare("DELETE FROM wakeups WHERE node_id = ? AND kind = 'deadline'").run(node_id);
132
- }
133
- // ---------------------------------------------------------------------------
134
- // Reads.
135
- // ---------------------------------------------------------------------------
136
- /** The daemon's per-tick due query: every row whose fire_at has arrived, in
137
- * fire_at order, with `payload` parsed into the typed union. Returns exactly ONE
138
- * row per recurring wake regardless of missed slots — coalescing is structural
139
- * (AC-E2). */
140
- export function dueWakes(nowIso) {
141
- return openDb()
142
- .prepare('SELECT * FROM wakeups WHERE fire_at <= ? ORDER BY fire_at')
143
- .all(nowIso).map(wakeupFrom);
144
- }
145
- /** List wakes for a scope (node / owner / subtree / due / canvas), `payload`
146
- * parsed as in dueWakes. The subtree variant binds the id set with `?`
147
- * placeholders (mirroring listNodes — the codebase's one safe dynamic-IN spot);
148
- * ids are NEVER string-concatenated (Min-10). */
149
- export function listWakes(scope) {
150
- const db = openDb();
151
- let rows;
152
- if ('node' in scope) {
153
- rows = db
154
- .prepare('SELECT * FROM wakeups WHERE node_id = ? ORDER BY fire_at')
155
- .all(scope.node);
156
- }
157
- else if ('owner' in scope) {
158
- rows = db
159
- .prepare('SELECT * FROM wakeups WHERE owner_id = ? ORDER BY fire_at')
160
- .all(scope.owner);
161
- }
162
- else if ('subtree' in scope) {
163
- if (scope.subtree.length === 0)
164
- return [];
165
- const placeholders = scope.subtree.map(() => '?').join(',');
166
- rows = db
167
- .prepare(`SELECT * FROM wakeups WHERE node_id IN (${placeholders}) ORDER BY fire_at`)
168
- .all(...scope.subtree);
169
- }
170
- else if ('due' in scope) {
171
- rows = db
172
- .prepare('SELECT * FROM wakeups WHERE fire_at <= ? ORDER BY fire_at')
173
- .all(scope.due);
174
- }
175
- else {
176
- rows = db.prepare('SELECT * FROM wakeups ORDER BY fire_at').all();
177
- }
178
- return rows.map(wakeupFrom);
179
- }
180
- /** True if the node has ANY pending self-anchored wake (of any kind). Consumed by
181
- * the stop-guard self-wake seam so a no-child poll node releases dormant after
182
- * arming instead of being nagged to finish (AC-X3/AC-R1). */
183
- export function hasPendingSelfWake(node_id) {
184
- return (openDb().prepare('SELECT 1 FROM wakeups WHERE node_id = ? LIMIT 1').get(node_id) !== undefined);
185
- }
@@ -1,455 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import { createHash } from 'node:crypto';
3
- import { spawnSync } from 'node:child_process';
4
- import { linkSync, mkdtempSync, mkdirSync, realpathSync, symlinkSync, writeFileSync } from 'node:fs';
5
- import { tmpdir } from 'node:os';
6
- import { join } from 'node:path';
7
- import { Readable } from 'node:stream';
8
- import { test } from 'node:test';
9
- import { PUBLIC_SOURCE_FILE_READ_SCRIPT, handlePublicSourceRequest } from '../public-source-gate.js';
10
- import { guestEnv } from '../../../core/hearth/guest-env.js';
11
- import { routeRequest } from '../server.js';
12
- const ownerToken = 'owner-secret-token';
13
- const ownerTokenHash = createHash('sha256').update(ownerToken, 'utf8').digest('hex');
14
- const publicOrigin = 'https://hearth.example';
15
- const guestHome = '/home/agent';
16
- const tenantId = 'tenant-source-gate';
17
- const nodeId = 'mqt64sus-e71caa94';
18
- function makeRuntime(statePath) {
19
- return {
20
- proxy: {
21
- host: '127.0.0.1',
22
- port: 7878,
23
- publicOrigin,
24
- statePath,
25
- m0RegistryPath: join(statePath, 'homes.json'),
26
- ownerUserId: 'owner-user',
27
- defaultTenantId: tenantId,
28
- ownerTokenHash,
29
- idlePauseMs: 60_000,
30
- wakeTimeoutMs: 30_000,
31
- readyTimeoutMs: 2_000,
32
- cookieSecure: true,
33
- seedHome: null,
34
- },
35
- m0: {
36
- providerName: 'none',
37
- registryPath: join(statePath, 'homes.json'),
38
- guestUser: 'agent',
39
- guestHome,
40
- guestCodePath: '/opt/crouter',
41
- webPort: 7878,
42
- nodeKind: 'general',
43
- piPackages: [],
44
- piAuthJson: null,
45
- relayToken: null,
46
- },
47
- };
48
- }
49
- function writeState(statePath) {
50
- writeFileSync(statePath, `${JSON.stringify({
51
- version: 1,
52
- owner: {
53
- ownerUserId: 'owner-user',
54
- defaultTenantId: tenantId,
55
- tokenHash: ownerTokenHash,
56
- createdAt: '2026-06-26T00:00:00.000Z',
57
- },
58
- tenants: {},
59
- }, null, 2)}\n`, 'utf8');
60
- }
61
- function makeRequest(method, url, headers = {}, body = '') {
62
- const req = new Readable({ read() { } });
63
- req.method = method;
64
- req.url = url;
65
- req.headers = headers;
66
- process.nextTick(() => {
67
- if (body !== '')
68
- req.push(body);
69
- req.push(null);
70
- });
71
- return req;
72
- }
73
- function makeResponse() {
74
- return {
75
- statusCode: 200,
76
- headersSent: false,
77
- headers: {},
78
- body: '',
79
- writeHead(statusCode, headers) {
80
- this.statusCode = statusCode;
81
- this.headers = { ...this.headers, ...headers };
82
- this.headersSent = true;
83
- return this;
84
- },
85
- setHeader(name, value) {
86
- this.headers[name.toLowerCase()] = value;
87
- },
88
- end(chunk) {
89
- if (chunk !== undefined)
90
- this.body += Buffer.isBuffer(chunk) ? chunk.toString('utf8') : chunk;
91
- this.headersSent = true;
92
- return this;
93
- },
94
- destroy() {
95
- this.headersSent = true;
96
- },
97
- };
98
- }
99
- function parseBody(res) {
100
- return JSON.parse(res.body);
101
- }
102
- function helperResult(input) {
103
- const parsed = JSON.parse(String(input));
104
- return parsed;
105
- }
106
- function runArtifactHelper(canvasHomePath, piAgentDirPath, artifactPath) {
107
- const proc = spawnSync(process.execPath, ['--input-type=module', '-e', PUBLIC_SOURCE_FILE_READ_SCRIPT], {
108
- input: JSON.stringify({ canvasHome: canvasHomePath, piAgentDir: piAgentDirPath, path: artifactPath }),
109
- encoding: 'utf8',
110
- });
111
- return {
112
- status: proc.status,
113
- stdout: proc.stdout,
114
- stderr: proc.stderr,
115
- };
116
- }
117
- test('regression: public source gate allows stdin only on crtr node new/msg writes (fixes MAJOR 1)', async () => {
118
- const tempDir = mkdtempSync(join(tmpdir(), 'crouter-source-gate-'));
119
- const statePath = join(tempDir, 'state.json');
120
- writeState(statePath);
121
- const runtime = makeRuntime(statePath);
122
- const calls = [];
123
- const allowedExecCases = [
124
- { kind: 'exec', bin: 'crtr', args: ['canvas', 'snapshot', '--json'] },
125
- { kind: 'exec', bin: 'crtr', args: ['node', 'inspect', 'show', nodeId, '--json'] },
126
- { kind: 'exec', bin: 'crtr', args: ['node', 'snapshot', nodeId, '--json'] },
127
- { kind: 'exec', bin: 'crtr', args: ['node', 'new', '--kind', 'developer', '--cwd', '/home/agent/project', '--name', 'spawned-child', '--model', 'claude-sonnet-4', '--parent', nodeId, '--json'], stdin: 'spawn prompt body' },
128
- { kind: 'exec', bin: 'crtr', args: ['node', 'msg', nodeId, '--json'], stdin: 'ping the node body' },
129
- { kind: 'exec', bin: 'crtr', args: ['node', 'msg', nodeId, '--tier', 'urgent', '--json'], stdin: 'ping the node with tier' },
130
- { kind: 'exec', bin: 'crtr', args: ['canvas', 'revive', nodeId, '--json'] },
131
- { kind: 'exec', bin: 'crtr', args: ['canvas', 'revive', nodeId, '--fresh', '--json'] },
132
- { kind: 'exec', bin: 'crtr', args: ['node', 'close', '--node', nodeId, '--json'] },
133
- { kind: 'exec', bin: 'crtr', args: ['view', 'list', '--json'] },
134
- ];
135
- const guestSource = async (_tenantId, request) => {
136
- calls.push({ tenantId: _tenantId, request });
137
- const typed = request;
138
- if (typed.kind === 'exec' && typed.bin === 'node' && Array.isArray(typed.args) && typed.args.includes(PUBLIC_SOURCE_FILE_READ_SCRIPT)) {
139
- const payload = JSON.parse(typed.stdin ?? '{}');
140
- const fileContent = payload.path?.endsWith('/reports/report.md') ? 'reports artifact contents' : 'context artifact contents';
141
- return {
142
- ok: true,
143
- exitCode: 0,
144
- stdout: JSON.stringify({ ok: true, stdout: fileContent }),
145
- stderr: '',
146
- };
147
- }
148
- return {
149
- ok: true,
150
- exitCode: 0,
151
- stdout: 'allowed exec ok',
152
- stderr: '',
153
- };
154
- };
155
- for (const request of allowedExecCases) {
156
- const res = makeResponse();
157
- const handled = await handlePublicSourceRequest(makeRequest('POST', '/__crtr/source', { authorization: `Bearer ${ownerToken}` }, JSON.stringify(request)), res, runtime, { guestSource });
158
- assert.equal(handled, true);
159
- assert.equal(res.statusCode, 200);
160
- assert.deepEqual(parseBody(res), {
161
- ok: true,
162
- exitCode: 0,
163
- stdout: 'allowed exec ok',
164
- stderr: '',
165
- });
166
- }
167
- const env = guestEnv(runtime.m0);
168
- const contextPath = `${env.CRTR_HOME}/nodes/${nodeId}/context/note.md`;
169
- const reportsPath = `${env.CRTR_HOME}/nodes/${nodeId}/reports/report.md`;
170
- for (const filePath of [contextPath, reportsPath]) {
171
- const res = makeResponse();
172
- const handled = await handlePublicSourceRequest(makeRequest('POST', '/__crtr/source', { authorization: `Bearer ${ownerToken}` }, JSON.stringify({ kind: 'file', path: filePath })), res, runtime, { guestSource });
173
- assert.equal(handled, true);
174
- assert.equal(res.statusCode, 200);
175
- assert.deepEqual(parseBody(res), {
176
- ok: true,
177
- stdout: filePath.endsWith('/reports/report.md') ? 'reports artifact contents' : 'context artifact contents',
178
- stderr: '',
179
- exitCode: 0,
180
- });
181
- }
182
- const helperCall = calls.find((call) => {
183
- const request = call.request;
184
- return request.kind === 'exec' && request.bin === 'node' && Array.isArray(request.args) && request.args.includes(PUBLIC_SOURCE_FILE_READ_SCRIPT);
185
- });
186
- assert.ok(helperCall);
187
- const helperRequest = helperCall?.request;
188
- assert.ok(helperRequest.stdin);
189
- const helperPayload = JSON.parse(helperRequest.stdin ?? '{}');
190
- assert.equal(helperPayload.canvasHome, env.CRTR_HOME);
191
- assert.equal(helperPayload.piAgentDir, env.PI_CODING_AGENT_DIR);
192
- assert.ok(helperPayload.path?.startsWith(`${env.CRTR_HOME}/nodes/${nodeId}/`));
193
- const invalidRequests = [
194
- { kind: 'exec', bin: 'node', args: ['-v'], stdin: 'browser-supplied stdin' },
195
- { kind: 'exec', bin: 'sh', args: ['-c', 'pwd'] },
196
- { kind: 'exec', bin: 'git', args: ['status', '--json'], stdin: 'browser-supplied stdin' },
197
- { kind: 'exec', bin: 'gh', args: ['issue', 'list', '--json'] },
198
- { kind: 'exec', bin: 'capture', args: ['shot', '--json'] },
199
- { kind: 'exec', bin: 'tmux', args: ['list-sessions', '--json'] },
200
- { kind: 'exec', bin: 'pwd', args: ['--json'] },
201
- { kind: 'exec', bin: 'crtr', args: ['canvas', 'status', '--json'] },
202
- { kind: 'exec', bin: 'crtr', args: ['canvas', 'snapshot', '--extra', '--json'] },
203
- { kind: 'exec', bin: 'crtr', args: ['node', 'inspect', 'show', nodeId, '--extra', '--json'] },
204
- { kind: 'exec', bin: 'crtr', args: ['node', 'new', '--kind', 'developer', '--json'], stdin: 'x'.repeat(16 * 1024 + 1) },
205
- { kind: 'exec', bin: 'crtr', args: ['view', 'list', '--extra', '--json'] },
206
- { kind: 'exec', bin: 'crtr', args: ['view', 'list', '--json'], cwd: '/tmp' },
207
- { kind: 'exec', bin: 'crtr', args: ['view', 'list', '--json'], stdin: 'browser-supplied stdin' },
208
- { kind: 'exec', bin: 'crtr', args: ['node', 'close', '--node', nodeId] },
209
- { kind: 'http', method: 'GET', url: 'https://example.invalid' },
210
- { kind: 'file', path: `${env.PI_CODING_AGENT_DIR}/auth.json` },
211
- { kind: 'file', path: '/etc/passwd' },
212
- { kind: 'file', path: `${env.CRTR_HOME}/nodes/${nodeId}/context/../reports/report.md` },
213
- { kind: 'file', path: `${env.CRTR_HOME}/nodes/${nodeId}/secret/x.md` },
214
- { kind: 'file', path: `${env.CRTR_HOME}\\nodes\\${nodeId}\\context\\note.md` },
215
- ];
216
- for (const request of invalidRequests) {
217
- const res = makeResponse();
218
- let called = 0;
219
- const handled = await handlePublicSourceRequest(makeRequest('POST', '/__crtr/source', { authorization: `Bearer ${ownerToken}` }, JSON.stringify(request)), res, runtime, {
220
- guestSource: async () => {
221
- called += 1;
222
- throw new Error('guest should not run for rejected source requests');
223
- },
224
- });
225
- assert.equal(handled, true);
226
- assert.equal(called, 0);
227
- assert.equal(res.statusCode, 403);
228
- }
229
- });
230
- test('routeRequest dispatches source and model-auth before proxy fallback', async () => {
231
- const tempDir = mkdtempSync(join(tmpdir(), 'crouter-source-route-'));
232
- const statePath = join(tempDir, 'state.json');
233
- writeState(statePath);
234
- const runtime = makeRuntime(statePath);
235
- let sourceCalls = 0;
236
- const sourceRes = makeResponse();
237
- await routeRequest(makeRequest('POST', '/__crtr/source', { authorization: `Bearer ${ownerToken}` }, JSON.stringify({ kind: 'exec', bin: 'crtr', args: ['view', 'list', '--json'] })), sourceRes, runtime, {
238
- sourceGate: {
239
- guestSource: async () => {
240
- sourceCalls += 1;
241
- return { ok: true, exitCode: 0, stdout: 'source routed', stderr: '' };
242
- },
243
- },
244
- });
245
- assert.equal(sourceCalls, 1);
246
- assert.equal(sourceRes.statusCode, 200);
247
- assert.deepEqual(parseBody(sourceRes), {
248
- ok: true,
249
- exitCode: 0,
250
- stdout: 'source routed',
251
- stderr: ''
252
- });
253
- let modelCalls = 0;
254
- const modelRes = makeResponse();
255
- await routeRequest(makeRequest('GET', '/__hearth/model-auth/anthropic/status', { authorization: `Bearer ${ownerToken}` }), modelRes, runtime, {
256
- modelAuth: {
257
- guestSource: async () => {
258
- modelCalls += 1;
259
- return {
260
- ok: true,
261
- exitCode: 0,
262
- stdout: JSON.stringify({ storedOauth: false, expiresAt: null, adapterConfigured: true }),
263
- stderr: '',
264
- };
265
- },
266
- },
267
- });
268
- assert.equal(modelCalls, 1);
269
- assert.equal(modelRes.statusCode, 200);
270
- assert.deepEqual(parseBody(modelRes), {
271
- storedOauth: false,
272
- expiresAt: null,
273
- adapterConfigured: true,
274
- });
275
- });
276
- test('public source gate enforces owner write auth and leaves non-source chat routes alone', async () => {
277
- const tempDir = mkdtempSync(join(tmpdir(), 'crouter-source-auth-'));
278
- const statePath = join(tempDir, 'state.json');
279
- writeState(statePath);
280
- const runtime = makeRuntime(statePath);
281
- let rejectedGuestCalls = 0;
282
- const rejectingGuestSource = async () => {
283
- rejectedGuestCalls += 1;
284
- return { ok: true, exitCode: 0, stdout: 'ok', stderr: '' };
285
- };
286
- {
287
- const res = makeResponse();
288
- const handled = await handlePublicSourceRequest(makeRequest('POST', '/__crtr/source?token=' + encodeURIComponent(ownerToken), {}, JSON.stringify({ kind: 'exec', bin: 'crtr', args: ['view', 'list', '--json'] })), res, runtime, { guestSource: rejectingGuestSource });
289
- assert.equal(handled, true);
290
- assert.equal(rejectedGuestCalls, 0);
291
- assert.equal(res.statusCode, 401);
292
- }
293
- {
294
- rejectedGuestCalls = 0;
295
- const res = makeResponse();
296
- const handled = await handlePublicSourceRequest(makeRequest('POST', '/__crtr/source', {
297
- cookie: `hearth_owner=${encodeURIComponent(ownerToken)}`,
298
- }, JSON.stringify({ kind: 'exec', bin: 'crtr', args: ['view', 'list', '--json'] })), res, runtime, { guestSource: rejectingGuestSource });
299
- assert.equal(handled, true);
300
- assert.equal(rejectedGuestCalls, 0);
301
- assert.equal(res.statusCode, 403);
302
- }
303
- {
304
- const res = makeResponse();
305
- const handled = await handlePublicSourceRequest(makeRequest('POST', '/__crtr/source', {
306
- cookie: `hearth_owner=${encodeURIComponent(ownerToken)}`,
307
- origin: publicOrigin,
308
- }, JSON.stringify({ kind: 'exec', bin: 'crtr', args: ['view', 'list', '--json'] })), res, runtime, { guestSource: async () => ({ ok: true, exitCode: 0, stdout: 'ok', stderr: '' }) });
309
- assert.equal(handled, true);
310
- assert.equal(res.statusCode, 200);
311
- }
312
- {
313
- const res = makeResponse();
314
- const handled = await handlePublicSourceRequest(makeRequest('POST', '/__crtr/source', {
315
- authorization: `Bearer ${ownerToken}`,
316
- }, JSON.stringify({ kind: 'exec', bin: 'crtr', args: ['view', 'list', '--json'] })), res, runtime, { guestSource: async () => ({ ok: true, exitCode: 0, stdout: 'ok', stderr: '' }) });
317
- assert.equal(handled, true);
318
- assert.equal(res.statusCode, 200);
319
- }
320
- {
321
- const res = makeResponse();
322
- const handled = await handlePublicSourceRequest(makeRequest('GET', '/node/' + nodeId, { authorization: `Bearer ${ownerToken}` }), res, runtime, { guestSource: async () => ({ ok: true, exitCode: 0, stdout: 'ok', stderr: '' }) });
323
- assert.equal(handled, false);
324
- assert.equal(res.headersSent, false);
325
- }
326
- });
327
- test('the guest artifact helper enforces realpath containment before reading', () => {
328
- const tempDir = mkdtempSync(join(tmpdir(), 'crouter-source-helper-'));
329
- const canvasHomePath = join(tempDir, '.crtr-local', 'canvas');
330
- const piAgentDirPath = join(tempDir, '.crtr-local', 'pi', 'agent');
331
- mkdirSync(canvasHomePath, { recursive: true });
332
- mkdirSync(piAgentDirPath, { recursive: true });
333
- const canonicalCanvasHomePath = realpathSync(canvasHomePath);
334
- const canonicalPiAgentDirPath = realpathSync(piAgentDirPath);
335
- const contextDir = join(canonicalCanvasHomePath, 'nodes', nodeId, 'context');
336
- const reportsDir = join(canonicalCanvasHomePath, 'nodes', nodeId, 'reports');
337
- mkdirSync(contextDir, { recursive: true });
338
- mkdirSync(reportsDir, { recursive: true });
339
- const contextFile = join(contextDir, 'note.md');
340
- const reportsFile = join(reportsDir, 'report.md');
341
- writeFileSync(contextFile, 'context artifact contents', 'utf8');
342
- writeFileSync(reportsFile, 'reports artifact contents', 'utf8');
343
- const outsideFile = join(tempDir, 'outside.txt');
344
- writeFileSync(outsideFile, 'sensitive contents', 'utf8');
345
- const leakLink = join(contextDir, 'leak.md');
346
- symlinkSync(outsideFile, leakLink);
347
- const contextRun = runArtifactHelper(canonicalCanvasHomePath, canonicalPiAgentDirPath, contextFile);
348
- assert.equal(contextRun.status, 0);
349
- const contextResult = helperResult(contextRun.stdout.trim());
350
- assert.equal(contextResult.ok, true);
351
- assert.equal(contextResult.stdout, 'context artifact contents');
352
- const reportsRun = runArtifactHelper(canonicalCanvasHomePath, canonicalPiAgentDirPath, reportsFile);
353
- assert.equal(reportsRun.status, 0);
354
- const reportsResult = helperResult(reportsRun.stdout.trim());
355
- assert.equal(reportsResult.ok, true);
356
- assert.equal(reportsResult.stdout, 'reports artifact contents');
357
- const mixedSeparatorPath = `${canonicalCanvasHomePath}/nodes\\${nodeId}\\context\\note.md`;
358
- const mixedSeparatorRun = runArtifactHelper(canonicalCanvasHomePath, canonicalPiAgentDirPath, mixedSeparatorPath);
359
- assert.equal(mixedSeparatorRun.status, 0);
360
- const mixedSeparatorResult = helperResult(mixedSeparatorRun.stdout.trim());
361
- assert.equal(mixedSeparatorResult.ok, false);
362
- assert.equal(mixedSeparatorResult.status, 403);
363
- const leakRun = runArtifactHelper(canonicalCanvasHomePath, canonicalPiAgentDirPath, leakLink);
364
- assert.equal(leakRun.status, 0);
365
- const leakResult = helperResult(leakRun.stdout.trim());
366
- assert.equal(leakResult.ok, false);
367
- assert.equal(leakResult.status, 403);
368
- assert.ok(!leakResult.error?.includes('sensitive'));
369
- });
370
- test('the guest artifact helper rejects hard-linked aliases to secrets under an allowed artifact root', () => {
371
- // Regression for the hard-link alias bypass found in the public source gate.
372
- const tempDir = mkdtempSync(join(tmpdir(), 'crouter-source-helper-hardlink-'));
373
- const canvasHomePath = join(tempDir, '.crtr-local', 'canvas');
374
- const piAgentDirPath = join(tempDir, '.crtr-local', 'pi', 'agent');
375
- mkdirSync(canvasHomePath, { recursive: true });
376
- mkdirSync(piAgentDirPath, { recursive: true });
377
- const canonicalCanvasHomePath = realpathSync(canvasHomePath);
378
- const canonicalPiAgentDirPath = realpathSync(piAgentDirPath);
379
- const contextDir = join(canonicalCanvasHomePath, 'nodes', nodeId, 'context');
380
- mkdirSync(contextDir, { recursive: true });
381
- const secretPath = join(piAgentDirPath, 'auth.json');
382
- writeFileSync(secretPath, 'super-secret-token', 'utf8');
383
- const hardLinkPath = join(contextDir, 'auth.json');
384
- linkSync(secretPath, hardLinkPath);
385
- const run = runArtifactHelper(canonicalCanvasHomePath, canonicalPiAgentDirPath, hardLinkPath);
386
- assert.equal(run.status, 0);
387
- const result = helperResult(run.stdout.trim());
388
- assert.equal(result.ok, false);
389
- assert.equal(result.status, 403);
390
- assert.ok(!result.error?.includes('super-secret-token'));
391
- });
392
- test('the guest artifact helper rejects a symlinked nodesBase root', () => {
393
- const tempDir = mkdtempSync(join(tmpdir(), 'crouter-source-helper-nodes-base-'));
394
- const canvasHomePath = join(tempDir, '.crtr-local', 'canvas');
395
- const piAgentDirPath = join(tempDir, '.crtr-local', 'pi', 'agent');
396
- mkdirSync(canvasHomePath, { recursive: true });
397
- mkdirSync(piAgentDirPath, { recursive: true });
398
- const canonicalCanvasHomePath = realpathSync(canvasHomePath);
399
- const canonicalPiAgentDirPath = realpathSync(piAgentDirPath);
400
- const nodesDir = join(canonicalCanvasHomePath, 'nodes');
401
- mkdirSync(canonicalCanvasHomePath, { recursive: true });
402
- const outsideNodes = join(tempDir, 'outside-nodes');
403
- const canonicalNodeId = 'evil-node';
404
- mkdirSync(join(outsideNodes, canonicalNodeId, 'context'), { recursive: true });
405
- writeFileSync(join(outsideNodes, canonicalNodeId, 'context', 'note.md'), 'sensitive nodesBase contents', 'utf8');
406
- symlinkSync(outsideNodes, nodesDir);
407
- const run = runArtifactHelper(canonicalCanvasHomePath, canonicalPiAgentDirPath, join(nodesDir, canonicalNodeId, 'context', 'note.md'));
408
- assert.equal(run.status, 0);
409
- const result = helperResult(run.stdout.trim());
410
- assert.equal(result.ok, false);
411
- assert.equal(result.status, 403);
412
- assert.ok(!result.error?.includes('sensitive'));
413
- });
414
- test('the guest artifact helper rejects symlinked roots, ancestor subdirectories, and symlinked node directories that escape the canonical nodes tree', () => {
415
- const tempDir = mkdtempSync(join(tmpdir(), 'crouter-source-helper-symlink-'));
416
- const canvasHomePath = join(tempDir, '.crtr-local', 'canvas');
417
- const piAgentDirPath = join(tempDir, '.crtr-local', 'pi', 'agent');
418
- mkdirSync(canvasHomePath, { recursive: true });
419
- mkdirSync(piAgentDirPath, { recursive: true });
420
- const canonicalCanvasHomePath = realpathSync(canvasHomePath);
421
- const canonicalPiAgentDirPath = realpathSync(piAgentDirPath);
422
- const nodesDir = join(canonicalCanvasHomePath, 'nodes');
423
- const canonicalNodeId = 'evil-node';
424
- const canonicalNodeDir = join(nodesDir, canonicalNodeId);
425
- mkdirSync(canonicalNodeDir, { recursive: true });
426
- const assertBlockedArtifact = (artifactPath) => {
427
- const run = runArtifactHelper(canonicalCanvasHomePath, canonicalPiAgentDirPath, artifactPath);
428
- assert.equal(run.status, 0);
429
- const result = helperResult(run.stdout.trim());
430
- assert.equal(result.ok, false);
431
- assert.equal(result.status, 403);
432
- assert.ok(!result.error?.includes('sensitive'));
433
- };
434
- const contextOutside = join(tempDir, 'outside-context');
435
- mkdirSync(contextOutside, { recursive: true });
436
- writeFileSync(join(contextOutside, 'note.md'), 'sensitive context contents', 'utf8');
437
- symlinkSync(contextOutside, join(canonicalNodeDir, 'context'));
438
- assertBlockedArtifact(join(canonicalNodeDir, 'context', 'note.md'));
439
- const contextSubOutside = join(tempDir, 'outside-context-sub');
440
- mkdirSync(contextSubOutside, { recursive: true });
441
- writeFileSync(join(contextSubOutside, 'file'), 'sensitive ancestor subdir contents', 'utf8');
442
- symlinkSync(contextSubOutside, join(canonicalNodeDir, 'context', 'sub'));
443
- assertBlockedArtifact(join(canonicalNodeDir, 'context', 'sub', 'file'));
444
- const reportsOutside = join(tempDir, 'outside-reports');
445
- mkdirSync(reportsOutside, { recursive: true });
446
- writeFileSync(join(reportsOutside, 'report.md'), 'sensitive reports contents', 'utf8');
447
- symlinkSync(reportsOutside, join(canonicalNodeDir, 'reports'));
448
- assertBlockedArtifact(join(canonicalNodeDir, 'reports', 'report.md'));
449
- const symlinkedNodeId = 'evil-node-link';
450
- const outsideNodeDir = join(tempDir, 'outside-node');
451
- mkdirSync(join(outsideNodeDir, 'context'), { recursive: true });
452
- writeFileSync(join(outsideNodeDir, 'context', 'note.md'), 'sensitive node contents', 'utf8');
453
- symlinkSync(outsideNodeDir, join(nodesDir, symlinkedNodeId));
454
- assertBlockedArtifact(join(nodesDir, symlinkedNodeId, 'context', 'note.md'));
455
- });