@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,66 @@
1
+ import type { GuestNodeId, MachineId, TenantId } from '../../core/hearth/types.js';
2
+ export type HearthProvider = 'blaxel';
3
+ export type HomeId = string;
4
+ export type UserId = string;
5
+ export type ProviderSandboxId = MachineId;
6
+ export type ProviderVolumeId = string;
7
+ export type PreviewEndpoint = string;
8
+ export type RelayAuthRef = string;
9
+ export type HomeStatus = 'provisioning' | 'running' | 'suspended' | 'restoring' | 'terminating' | 'terminated' | 'unknown';
10
+ export type HomeHealthVerdict = 'healthy' | 'degraded' | 'unknown';
11
+ export interface Home {
12
+ home_id: HomeId;
13
+ tenant_id: TenantId;
14
+ user_id: UserId;
15
+ provider: HearthProvider;
16
+ provider_sandbox_id: ProviderSandboxId | null;
17
+ provider_volume_id: ProviderVolumeId | null;
18
+ preview_endpoint: PreviewEndpoint | null;
19
+ home_agent_target: GuestNodeId | null;
20
+ relay_auth_ref: RelayAuthRef | null;
21
+ status: HomeStatus;
22
+ template_version: string | null;
23
+ last_ready_at: string | null;
24
+ last_wake_at: string | null;
25
+ last_suspend_at: string | null;
26
+ last_wake_latency_ms: number | null;
27
+ health_verdict: HomeHealthVerdict;
28
+ created_at: string;
29
+ updated_at: string;
30
+ }
31
+ export type ResolvedHome = Home;
32
+ export interface CreateHomeInput {
33
+ home_id: HomeId;
34
+ tenant_id: TenantId;
35
+ user_id: UserId;
36
+ provider?: HearthProvider;
37
+ provider_sandbox_id?: ProviderSandboxId | null;
38
+ provider_volume_id?: ProviderVolumeId | null;
39
+ preview_endpoint?: PreviewEndpoint | null;
40
+ home_agent_target?: GuestNodeId | null;
41
+ relay_auth_ref?: RelayAuthRef | null;
42
+ status?: HomeStatus;
43
+ template_version?: string | null;
44
+ last_ready_at?: string | null;
45
+ last_wake_at?: string | null;
46
+ last_suspend_at?: string | null;
47
+ last_wake_latency_ms?: number | null;
48
+ health_verdict?: HomeHealthVerdict;
49
+ created_at?: string;
50
+ updated_at?: string;
51
+ }
52
+ export interface RefreshProviderPointersInput {
53
+ provider_sandbox_id: ProviderSandboxId | null;
54
+ preview_endpoint: PreviewEndpoint | null;
55
+ status?: HomeStatus;
56
+ template_version?: string | null;
57
+ }
58
+ export interface TouchWakeInput {
59
+ at?: string;
60
+ latency_ms?: number | null;
61
+ }
62
+ export type HomePatch = Partial<Pick<Home, 'provider_sandbox_id' | 'provider_volume_id' | 'preview_endpoint' | 'relay_auth_ref' | 'status' | 'template_version' | 'last_ready_at' | 'last_wake_at' | 'last_suspend_at' | 'last_wake_latency_ms' | 'health_verdict'>>;
63
+ export interface TenantSession {
64
+ tenant_id: TenantId;
65
+ user_id: UserId;
66
+ }
@@ -0,0 +1,80 @@
1
+ import { type HomeBackend } from '../../core/hearth/provider.js';
2
+ import type { M0Config } from '../../core/hearth/types.js';
3
+ import { type ControlPlaneConfig } from './config.js';
4
+ import { getHomeById, refreshProviderPointers, setHomeStatus, touchReady, touchWake } from './registry.js';
5
+ import { resolveSecret } from './secrets.js';
6
+ import type { HomeId, HomeStatus } from './types.js';
7
+ export interface WakeResult {
8
+ preview_endpoint: string;
9
+ relayToken: string;
10
+ }
11
+ /** Normalize a provider-observed runtime status into the CP `HomeStatus`
12
+ * vocabulary before it is ever persisted (Q3 / P3.4 review Minor finding):
13
+ * the provider's `MachineState` is broad (and may include future
14
+ * pause/suspend/standby spellings the SDK doesn't expose yet); CP's
15
+ * `HomeStatus` enum does not have a `'paused'` member. Anything
16
+ * pause/suspend/standby-shaped collapses to `'suspended'`; an exact
17
+ * `'running'` passes through; everything else (provisioning, terminating,
18
+ * terminated, restoring, unrecognized) becomes `'unknown'` rather than
19
+ * guessing a more specific CP status from a provider-specific string. */
20
+ export declare function normalizeProviderStatus(providerStatus: string | null | undefined): HomeStatus;
21
+ /** One bounded attempt: open a WebSocket to `/node/<target>` carrying the
22
+ * relay token and require the upgrade to both succeed AND survive a short
23
+ * settle window (or yield a first frame) within `attemptTimeoutMs` — proof
24
+ * the in-guest web server answered AND relayed to a live broker `view.sock`
25
+ * (R-WAKE-2), not just that the SPA shell route is up. Every branch
26
+ * (success, handshake rejection, error, premature close, attempt timeout)
27
+ * closes the socket and resolves exactly once — a success closes gracefully
28
+ * (code 1000) so the guest relay does not record a false fault, anything
29
+ * else terminates it. */
30
+ declare function probeNodeOnce(previewEndpoint: string, target: string, relayToken: string, attemptTimeoutMs: number): Promise<boolean>;
31
+ /** Retry the single-shot probe until it confirms `/node/<target>` is serving
32
+ * or `windowMs` elapses. Always runs at least one attempt (R-WAKE-1: "a
33
+ * single failed probe does not abort"). Every timer this loop starts
34
+ * (the per-attempt abort timeout, the inter-attempt backoff) is cleared/
35
+ * resolved before the loop returns — nothing is left armed. */
36
+ declare function probeNodeReady(previewEndpoint: string, target: string, relayToken: string, windowMs: number): Promise<boolean>;
37
+ /** Indirection seam so a smoke/test script can swap any step (the provider
38
+ * backend, the registry setters, the secret resolver, the probe itself, the
39
+ * clock) without touching a real DB/provider/filesystem. Production code
40
+ * never reassigns these; only ad hoc verification scripts do. */
41
+ export declare const wakeInternals: {
42
+ getHomeById: typeof getHomeById;
43
+ refreshProviderPointers: typeof refreshProviderPointers;
44
+ setHomeStatus: typeof setHomeStatus;
45
+ touchWake: typeof touchWake;
46
+ touchReady: typeof touchReady;
47
+ resolveSecret: typeof resolveSecret;
48
+ getHomeBackend: (config: M0Config) => HomeBackend;
49
+ loadM0Config: () => M0Config;
50
+ loadControlPlaneConfig: () => ControlPlaneConfig;
51
+ probeNodeOnce: typeof probeNodeOnce;
52
+ probeNodeReady: typeof probeNodeReady;
53
+ now: () => number;
54
+ };
55
+ /** Cheap, non-probing fast path: return a still-fresh warm-verdict cache hit
56
+ * for `home_id`, or `null` if there is none (expired or never confirmed).
57
+ * Never reads the registry and never calls the provider — callers fall back
58
+ * to `ensureAwake` on a `null` (Q1: "no call to provider"). */
59
+ export declare function resolveRunning(home_id: HomeId): WakeResult | null;
60
+ /** Drop the cached warm verdict for a home (e.g. an upstream relay forward
61
+ * failed) so the next `ensureAwake`/`resolveRunning` re-checks instead of
62
+ * trusting a stale "ready" answer. */
63
+ export declare function invalidateWarmVerdict(home_id: HomeId): void;
64
+ /** Clear all warm verdicts and in-flight wake coalescing. Test/smoke-script
65
+ * hygiene only — production never needs this (one CP process, S2). */
66
+ export declare function resetWakeCacheForTests(): void;
67
+ /** Bring a home up and ready, returning the route to relay to once it is.
68
+ * Reads the registry, resolves the relay token, calls the provider
69
+ * wake/resume seam, ready-probes `/node/<home_agent_target>`, refreshes
70
+ * provider pointers on a recreate, records wake/ready timing, and returns
71
+ * `{ preview_endpoint, relayToken }`. Throws on a ready-probe timeout
72
+ * (wake-failure UX is deferred — gap note 2 — a throw is the accepted
73
+ * cutover behavior).
74
+ *
75
+ * A fresh warm-verdict cache hit short-circuits without re-entering this
76
+ * pipeline at all. Otherwise concurrent callers for the SAME `home_id`
77
+ * coalesce onto one in-flight wake (Q1) instead of each driving their own
78
+ * provider call. */
79
+ export declare function ensureAwake(home_id: HomeId): Promise<WakeResult>;
80
+ export {};
@@ -0,0 +1,312 @@
1
+ // control-plane/wake.ts — CP wake orchestration (P4.2 / part-plan T3.1).
2
+ //
3
+ // Generalizes M0 `wake-proxy/home.ts` (`ensureAwake`/`resolveRunningHome`/
4
+ // `probeRelayServing`) onto the CP `home` registry, with one deliberate
5
+ // behavior drop: NO idle-pause machinery (S3 — the provider owns
6
+ // idle->suspend; M0's `scheduleIdlePause`/`pauseNow` timer chain is not
7
+ // reproduced here, by design, not oversight).
8
+ //
9
+ // Pipeline (R-WAKE-1): read the `home` row -> resolve the relay token handle
10
+ // -> call the provider wake/resume seam (`HomeBackend.wake`, owned by the
11
+ // home/provider slice, IP-1) -> ready-probe the in-guest web server on
12
+ // `/node/<home_agent_target>` over a short retried window, carrying the
13
+ // relay token -> if the provider returned a new sandbox/preview (a
14
+ // recreate), persist the refreshed pointers; `home_agent_target` is NEVER
15
+ // part of that patch (R-WAKE-6 — `refreshProviderPointers` doesn't accept it)
16
+ // -> record wake/ready timing -> return the route. Readiness here means the
17
+ // guest web server answers `/node/<target>` AND relays to a live broker
18
+ // `view.sock` (R-WAKE-2 — not "the SPA shell renders"). `src/clients/web/
19
+ // server.ts` only proves that second half on a WS upgrade: `bridgeConnection`
20
+ // opens `view.sock` AFTER the 101 response and closes the socket with 1011
21
+ // the instant that fails (ECONNREFUSED/ENOENT — "no running broker"), so an
22
+ // HTTP GET 200 on `/node/<target>` (the SPA static/fallback route) proves
23
+ // only that the guest web server is up, not that the broker is. The probe
24
+ // therefore opens a real WebSocket to `/node/<target>` and requires a
25
+ // successful upgrade that SURVIVES a short settle window (or yields a first
26
+ // frame) before declaring readiness.
27
+ //
28
+ // All timers used during a probe retry window are cleared before the
29
+ // function that started them returns — there is no `setTimeout`/`setInterval`
30
+ // left armed once `ensureAwake`/`resolveRunning` resolve (S3 regression bar).
31
+ import { setTimeout as delay } from 'node:timers/promises';
32
+ import { WebSocket } from 'ws';
33
+ import { general } from '../../core/errors.js';
34
+ import { loadM0Config } from '../../core/hearth/config.js';
35
+ import { getHomeBackend } from '../../core/hearth/provider.js';
36
+ import { loadControlPlaneConfig } from './config.js';
37
+ import { getHomeById, refreshProviderPointers, setHomeStatus, touchReady, touchWake } from './registry.js';
38
+ import { resolveSecret } from './secrets.js';
39
+ // Individual probe attempt timeout — bounded short so a dead route fails
40
+ // fast and the retry loop gets multiple attempts inside the overall window,
41
+ // rather than one attempt eating the whole window (mirrors M0's
42
+ // `READY_PROBE_TIMEOUT_MS`).
43
+ const READY_PROBE_ATTEMPT_TIMEOUT_MS = 1_500;
44
+ // Backoff between probe attempts (Q1: "500ms backoff between attempts").
45
+ const READY_PROBE_BACKOFF_MS = 500;
46
+ // How long a confirmed-ready verdict is trusted before `resolveRunning`/
47
+ // `ensureAwake` re-checks instead of trusting a stale answer (Q1: "10s TTL,
48
+ // in-process"). Single CP process, no distributed cache (S2).
49
+ const WARM_VERDICT_TTL_MS = 10_000;
50
+ /** Normalize a provider-observed runtime status into the CP `HomeStatus`
51
+ * vocabulary before it is ever persisted (Q3 / P3.4 review Minor finding):
52
+ * the provider's `MachineState` is broad (and may include future
53
+ * pause/suspend/standby spellings the SDK doesn't expose yet); CP's
54
+ * `HomeStatus` enum does not have a `'paused'` member. Anything
55
+ * pause/suspend/standby-shaped collapses to `'suspended'`; an exact
56
+ * `'running'` passes through; everything else (provisioning, terminating,
57
+ * terminated, restoring, unrecognized) becomes `'unknown'` rather than
58
+ * guessing a more specific CP status from a provider-specific string. */
59
+ export function normalizeProviderStatus(providerStatus) {
60
+ if (providerStatus === null || providerStatus === undefined)
61
+ return 'unknown';
62
+ const normalized = providerStatus.trim().toLowerCase();
63
+ if (normalized === 'paused' || normalized === 'suspended' || normalized === 'standby')
64
+ return 'suspended';
65
+ if (normalized === 'running')
66
+ return 'running';
67
+ return 'unknown';
68
+ }
69
+ function requireHomeField(value, field, home_id) {
70
+ if (value === null || value === undefined || (typeof value === 'string' && value.trim() === '')) {
71
+ throw general(`home ${home_id} is missing ${field} — cannot wake`, { home_id, field });
72
+ }
73
+ return value;
74
+ }
75
+ function buildDescriptor(home, relayToken) {
76
+ return {
77
+ homeId: home.home_id,
78
+ tenantId: home.tenant_id,
79
+ userId: home.user_id,
80
+ providerName: home.provider,
81
+ providerSandboxId: requireHomeField(home.provider_sandbox_id, 'provider_sandbox_id', home.home_id),
82
+ providerVolumeId: requireHomeField(home.provider_volume_id, 'provider_volume_id', home.home_id),
83
+ previewEndpoint: home.preview_endpoint,
84
+ homeAgentTarget: requireHomeField(home.home_agent_target, 'home_agent_target', home.home_id),
85
+ relayAuthRef: home.relay_auth_ref,
86
+ relayToken,
87
+ status: home.status,
88
+ templateVersion: home.template_version,
89
+ };
90
+ }
91
+ // After a successful 101 upgrade, `bridgeConnection` (server.ts) still has to
92
+ // dial the broker's `view.sock` and can close the socket (1011, "no running
93
+ // broker") the instant that dial fails. That happens fast on a local unix
94
+ // socket (ECONNREFUSED/ENOENT are immediate), so a settle window this short
95
+ // is enough to let a dead-broker close win the race against a false-positive
96
+ // `open` before the probe declares readiness.
97
+ const READY_PROBE_WS_SETTLE_MS = 300;
98
+ function wsUrlForNode(previewEndpoint, target) {
99
+ const url = new URL(`/node/${encodeURIComponent(target)}`, previewEndpoint);
100
+ url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:';
101
+ return url;
102
+ }
103
+ /** One bounded attempt: open a WebSocket to `/node/<target>` carrying the
104
+ * relay token and require the upgrade to both succeed AND survive a short
105
+ * settle window (or yield a first frame) within `attemptTimeoutMs` — proof
106
+ * the in-guest web server answered AND relayed to a live broker `view.sock`
107
+ * (R-WAKE-2), not just that the SPA shell route is up. Every branch
108
+ * (success, handshake rejection, error, premature close, attempt timeout)
109
+ * closes the socket and resolves exactly once — a success closes gracefully
110
+ * (code 1000) so the guest relay does not record a false fault, anything
111
+ * else terminates it. */
112
+ async function probeNodeOnce(previewEndpoint, target, relayToken, attemptTimeoutMs) {
113
+ return new Promise((resolveProbe) => {
114
+ let settled = false;
115
+ let settleTimer = null;
116
+ let ws;
117
+ try {
118
+ ws = new WebSocket(wsUrlForNode(previewEndpoint, target), {
119
+ headers: { authorization: `Bearer ${relayToken}` },
120
+ perMessageDeflate: false,
121
+ });
122
+ }
123
+ catch {
124
+ resolveProbe(false);
125
+ return;
126
+ }
127
+ const finish = (ready) => {
128
+ if (settled)
129
+ return;
130
+ settled = true;
131
+ if (settleTimer !== null)
132
+ clearTimeout(settleTimer);
133
+ clearTimeout(attemptTimer);
134
+ try {
135
+ // A confirmed-ready probe closes gracefully (code 1000) so the guest
136
+ // relay's `bridgeConnection` sees a normal browser close and does NOT
137
+ // record a false browser<->relay fault (P4.2 re-review Major). `close()`
138
+ // sends the close frame synchronously off the OPEN socket, so resolving
139
+ // right after calling it still delivers a normal close to the guest —
140
+ // the probe does not need to wait for the closing handshake to finish.
141
+ // Failure/timeout/error paths still abort hard via `terminate()`: there
142
+ // is nothing graceful to negotiate when the socket never proved ready.
143
+ if (ready) {
144
+ ws.close(1000, 'readiness probe complete');
145
+ }
146
+ else {
147
+ ws.terminate();
148
+ }
149
+ }
150
+ catch {
151
+ /* ignore */
152
+ }
153
+ resolveProbe(ready);
154
+ };
155
+ const attemptTimer = setTimeout(() => finish(false), attemptTimeoutMs);
156
+ ws.once('open', () => {
157
+ // The attempt timer (above) still bounds the total wait, so it is safe
158
+ // to always arm the full settle window here — whichever timer fires
159
+ // first wins via `finish`'s once-only guard.
160
+ settleTimer = setTimeout(() => finish(true), Math.min(READY_PROBE_WS_SETTLE_MS, attemptTimeoutMs));
161
+ });
162
+ ws.once('message', () => finish(true));
163
+ ws.once('unexpected-response', () => finish(false));
164
+ ws.once('error', () => finish(false));
165
+ ws.once('close', () => finish(false));
166
+ });
167
+ }
168
+ /** Retry the single-shot probe until it confirms `/node/<target>` is serving
169
+ * or `windowMs` elapses. Always runs at least one attempt (R-WAKE-1: "a
170
+ * single failed probe does not abort"). Every timer this loop starts
171
+ * (the per-attempt abort timeout, the inter-attempt backoff) is cleared/
172
+ * resolved before the loop returns — nothing is left armed. */
173
+ async function probeNodeReady(previewEndpoint, target, relayToken, windowMs) {
174
+ const deadline = Date.now() + Math.max(0, windowMs);
175
+ let firstAttempt = true;
176
+ for (;;) {
177
+ const remaining = deadline - Date.now();
178
+ // Past the first attempt, an already-expired budget ends the loop here
179
+ // instead of spending one more full attempt timeout (P4.2 re-review
180
+ // Minor) — only the very first attempt is unconditional (R-WAKE-1: "a
181
+ // single failed probe does not abort"/at-least-one-attempt).
182
+ if (!firstAttempt && remaining <= 0)
183
+ return false;
184
+ const attemptTimeoutMs = firstAttempt
185
+ ? Math.max(250, Math.min(READY_PROBE_ATTEMPT_TIMEOUT_MS, windowMs))
186
+ : Math.min(READY_PROBE_ATTEMPT_TIMEOUT_MS, remaining);
187
+ firstAttempt = false;
188
+ if (await wakeInternals.probeNodeOnce(previewEndpoint, target, relayToken, attemptTimeoutMs))
189
+ return true;
190
+ const remainingAfter = deadline - Date.now();
191
+ if (remainingAfter <= 0)
192
+ return false;
193
+ await delay(Math.min(READY_PROBE_BACKOFF_MS, remainingAfter));
194
+ }
195
+ }
196
+ /** Indirection seam so a smoke/test script can swap any step (the provider
197
+ * backend, the registry setters, the secret resolver, the probe itself, the
198
+ * clock) without touching a real DB/provider/filesystem. Production code
199
+ * never reassigns these; only ad hoc verification scripts do. */
200
+ export const wakeInternals = {
201
+ getHomeById,
202
+ refreshProviderPointers,
203
+ setHomeStatus,
204
+ touchWake,
205
+ touchReady,
206
+ resolveSecret,
207
+ getHomeBackend: (config) => getHomeBackend(config),
208
+ loadM0Config: () => loadM0Config(),
209
+ loadControlPlaneConfig: () => loadControlPlaneConfig(),
210
+ probeNodeOnce,
211
+ probeNodeReady,
212
+ now: () => Date.now(),
213
+ };
214
+ const warmVerdicts = new Map();
215
+ const inflightWakes = new Map();
216
+ /** Cheap, non-probing fast path: return a still-fresh warm-verdict cache hit
217
+ * for `home_id`, or `null` if there is none (expired or never confirmed).
218
+ * Never reads the registry and never calls the provider — callers fall back
219
+ * to `ensureAwake` on a `null` (Q1: "no call to provider"). */
220
+ export function resolveRunning(home_id) {
221
+ const warm = warmVerdicts.get(home_id);
222
+ if (warm === undefined)
223
+ return null;
224
+ if (wakeInternals.now() - warm.confirmedAt >= WARM_VERDICT_TTL_MS)
225
+ return null;
226
+ return warm.result;
227
+ }
228
+ /** Drop the cached warm verdict for a home (e.g. an upstream relay forward
229
+ * failed) so the next `ensureAwake`/`resolveRunning` re-checks instead of
230
+ * trusting a stale "ready" answer. */
231
+ export function invalidateWarmVerdict(home_id) {
232
+ warmVerdicts.delete(home_id);
233
+ }
234
+ /** Clear all warm verdicts and in-flight wake coalescing. Test/smoke-script
235
+ * hygiene only — production never needs this (one CP process, S2). */
236
+ export function resetWakeCacheForTests() {
237
+ warmVerdicts.clear();
238
+ inflightWakes.clear();
239
+ }
240
+ async function runEnsureAwake(home_id) {
241
+ const home = wakeInternals.getHomeById(home_id);
242
+ if (home === null)
243
+ throw general(`home not found: ${home_id}`, { home_id });
244
+ const relayAuthRef = requireHomeField(home.relay_auth_ref, 'relay_auth_ref', home_id);
245
+ const relayToken = wakeInternals.resolveSecret(relayAuthRef);
246
+ const target = requireHomeField(home.home_agent_target, 'home_agent_target', home_id);
247
+ const descriptor = buildDescriptor(home, relayToken);
248
+ const startedAt = wakeInternals.now();
249
+ const m0 = wakeInternals.loadM0Config();
250
+ const refresh = await wakeInternals.getHomeBackend(m0).wake(descriptor);
251
+ const normalizedStatus = normalizeProviderStatus(refresh.status);
252
+ const recreated = refresh.providerSandboxId !== home.provider_sandbox_id || (refresh.previewEndpoint ?? null) !== home.preview_endpoint;
253
+ let previewEndpoint;
254
+ if (recreated) {
255
+ // R-WAKE-6, non-negotiable: persist the new sandbox/preview pointers but
256
+ // never the home node target — `refreshProviderPointers`'s input shape
257
+ // has no `home_agent_target` field, so there is no way for this call to
258
+ // touch it even by accident.
259
+ const updated = wakeInternals.refreshProviderPointers(home_id, {
260
+ provider_sandbox_id: refresh.providerSandboxId,
261
+ preview_endpoint: refresh.previewEndpoint ?? null,
262
+ status: normalizedStatus,
263
+ template_version: refresh.templateVersion ?? home.template_version,
264
+ });
265
+ previewEndpoint = updated.preview_endpoint;
266
+ }
267
+ else {
268
+ wakeInternals.setHomeStatus(home_id, normalizedStatus);
269
+ previewEndpoint = home.preview_endpoint;
270
+ }
271
+ const resolvedPreviewEndpoint = requireHomeField(previewEndpoint, 'preview_endpoint', home_id);
272
+ const controlPlaneConfig = wakeInternals.loadControlPlaneConfig();
273
+ const ready = await wakeInternals.probeNodeReady(resolvedPreviewEndpoint, target, relayToken, controlPlaneConfig.readyTimeoutMs);
274
+ if (!ready) {
275
+ throw general(`guest web relay did not become ready before timeout: ${home_id}`, { home_id, previewEndpoint: resolvedPreviewEndpoint });
276
+ }
277
+ const readyAt = new Date().toISOString();
278
+ wakeInternals.touchWake(home_id, { at: new Date(startedAt).toISOString(), latency_ms: wakeInternals.now() - startedAt });
279
+ wakeInternals.touchReady(home_id, readyAt);
280
+ return { preview_endpoint: resolvedPreviewEndpoint, relayToken };
281
+ }
282
+ /** Bring a home up and ready, returning the route to relay to once it is.
283
+ * Reads the registry, resolves the relay token, calls the provider
284
+ * wake/resume seam, ready-probes `/node/<home_agent_target>`, refreshes
285
+ * provider pointers on a recreate, records wake/ready timing, and returns
286
+ * `{ preview_endpoint, relayToken }`. Throws on a ready-probe timeout
287
+ * (wake-failure UX is deferred — gap note 2 — a throw is the accepted
288
+ * cutover behavior).
289
+ *
290
+ * A fresh warm-verdict cache hit short-circuits without re-entering this
291
+ * pipeline at all. Otherwise concurrent callers for the SAME `home_id`
292
+ * coalesce onto one in-flight wake (Q1) instead of each driving their own
293
+ * provider call. */
294
+ export async function ensureAwake(home_id) {
295
+ const warm = resolveRunning(home_id);
296
+ if (warm !== null)
297
+ return warm;
298
+ const inflight = inflightWakes.get(home_id);
299
+ if (inflight !== undefined)
300
+ return inflight;
301
+ const promise = runEnsureAwake(home_id)
302
+ .then((result) => {
303
+ warmVerdicts.set(home_id, { result, confirmedAt: wakeInternals.now() });
304
+ return result;
305
+ })
306
+ .finally(() => {
307
+ if (inflightWakes.get(home_id) === promise)
308
+ inflightWakes.delete(home_id);
309
+ });
310
+ inflightWakes.set(home_id, promise);
311
+ return promise;
312
+ }
@@ -97,7 +97,7 @@ test('runGuestSource releases activity on wake timeout', async () => {
97
97
  throw new Error('fetch should not run after wake timeout');
98
98
  },
99
99
  });
100
- const raw = await runGuestSource(tenantId, { kind: 'exec', bin: 'crtr', args: ['view', 'list'] }, deps);
100
+ const raw = await runGuestSource(tenantId, { kind: 'exec', bin: 'crtr', args: ['surface', 'view', 'list'] }, deps);
101
101
  assert.equal(raw.ok, false);
102
102
  assert.equal(raw.stdout, '');
103
103
  assert.match(raw.stderr, /timed out/i);
@@ -118,7 +118,7 @@ test('runGuestSource releases activity when the bridge fetch aborts on timeout',
118
118
  });
119
119
  }),
120
120
  });
121
- const raw = await runGuestSource(tenantId, { kind: 'exec', bin: 'crtr', args: ['view', 'list'] }, deps);
121
+ const raw = await runGuestSource(tenantId, { kind: 'exec', bin: 'crtr', args: ['surface', 'view', 'list'] }, deps);
122
122
  assert.equal(raw.ok, false);
123
123
  assert.equal(raw.stdout, '');
124
124
  assert.doesNotMatch(raw.stderr, /Bearer secret/);
@@ -20,13 +20,7 @@ declare function captureAwakeHome(tenantId: string): AwakenedHome;
20
20
  * place that turns "a known-running home" into a forwardable route without the heavy gate.
21
21
  */
22
22
  export declare function resolveRunningHome(tenantId: string): AwakenedHome | null;
23
- /**
24
- * Wake the tenant's home through the configured backend seam. The backend owns the restore-vs-
25
- * recreate decision and persists the refreshed `webRoute`/`relayToken` to the registry. Until the
26
- * Blaxel backend is wired, `getHomeBackend` throws a 503 "no provider
27
- * configured" — so a cold home cannot be woken, while an already-serving home still forwards via
28
- * the fast path above (which never calls this).
29
- */
23
+ /** Wake the tenant's home through the configured backend seam and persist returned pointers. */
30
24
  declare function wakeHome(tenantId: string): Promise<void>;
31
25
  export declare const wakeProxyInternals: {
32
26
  probeRelayReady: typeof probeRelayReady;
@@ -52,7 +46,7 @@ export declare function releaseActivity(handle: ActivityHandle): TenantActivityS
52
46
  export declare function scheduleIdlePause(tenantId: string): void;
53
47
  /**
54
48
  * Pause the tenant's home through the backend seam. We never drive a sandbox SDK directly here —
55
- * the backend owns the registry write and state transition. Serialized under the per-tenant
49
+ * the backend returns provider pointer/state changes and this layer persists them. Serialized under the per-tenant
56
50
  * in-process lock; the single-process deployment invariant (one wake-proxy machine per tenant)
57
51
  * makes this lock authoritative.
58
52
  */
@@ -121,15 +121,51 @@ export function resolveRunningHome(tenantId) {
121
121
  webPort: getRuntime().m0.webPort,
122
122
  };
123
123
  }
124
- /**
125
- * Wake the tenant's home through the configured backend seam. The backend owns the restore-vs-
126
- * recreate decision and persists the refreshed `webRoute`/`relayToken` to the registry. Until the
127
- * Blaxel backend is wired, `getHomeBackend` throws a 503 "no provider
128
- * configured" — so a cold home cannot be woken, while an already-serving home still forwards via
129
- * the fast path above (which never calls this).
130
- */
124
+ function homeProviderDescriptor(home) {
125
+ return {
126
+ homeId: home.tenantId,
127
+ tenantId: home.tenantId,
128
+ providerName: 'blaxel',
129
+ providerSandboxId: home.machineId,
130
+ providerVolumeId: home.homeStorage.volumeId,
131
+ previewEndpoint: home.webRoute?.concreteUrl ?? home.webRoute?.url ?? null,
132
+ homeAgentTarget: home.nodeId ?? '',
133
+ relayToken: home.relayToken ?? '',
134
+ status: home.state,
135
+ templateVersion: home.templateVersion ?? null,
136
+ };
137
+ }
138
+ function persistProviderRefresh(m0, tenantId, refresh) {
139
+ updateHome(m0.registryPath, tenantId, (draft) => ({
140
+ ...draft,
141
+ providerName: refresh.providerName,
142
+ machineId: refresh.providerSandboxId,
143
+ homeStorage: {
144
+ ...draft.homeStorage,
145
+ ownerMachineId: refresh.providerSandboxId,
146
+ volumeId: refresh.providerVolumeId,
147
+ guestHome: m0.guestHome,
148
+ mountPath: m0.guestHome,
149
+ },
150
+ state: refresh.status,
151
+ nodeId: refresh.homeAgentTarget,
152
+ webRoute: refresh.route ?? draft.webRoute,
153
+ templateVersion: refresh.templateVersion,
154
+ updatedAt: refresh.updatedAt,
155
+ }));
156
+ }
157
+ async function loadHomeDescriptor(tenantId) {
158
+ const home = getHome(getRuntime().m0.registryPath, tenantId);
159
+ if (home === null) {
160
+ throw general(`no home for tenant ${tenantId} — run the existing provision/bootstrap flow`, { tenantId });
161
+ }
162
+ return homeProviderDescriptor(home);
163
+ }
164
+ /** Wake the tenant's home through the configured backend seam and persist returned pointers. */
131
165
  async function wakeHome(tenantId) {
132
- await getHomeBackend(getRuntime().m0).wake(tenantId);
166
+ const m0 = getRuntime().m0;
167
+ const refresh = await getHomeBackend(m0).wake(await loadHomeDescriptor(tenantId));
168
+ persistProviderRefresh(m0, tenantId, refresh);
133
169
  }
134
170
  export const wakeProxyInternals = {
135
171
  probeRelayReady,
@@ -194,7 +230,7 @@ export function scheduleIdlePause(tenantId) {
194
230
  }
195
231
  /**
196
232
  * Pause the tenant's home through the backend seam. We never drive a sandbox SDK directly here —
197
- * the backend owns the registry write and state transition. Serialized under the per-tenant
233
+ * the backend returns provider pointer/state changes and this layer persists them. Serialized under the per-tenant
198
234
  * in-process lock; the single-process deployment invariant (one wake-proxy machine per tenant)
199
235
  * makes this lock authoritative.
200
236
  */
@@ -213,7 +249,8 @@ export async function pauseNow(tenantId) {
213
249
  }
214
250
  if (home.state !== 'running')
215
251
  return;
216
- await getHomeBackend(m0).suspend(tenantId);
252
+ const refresh = await getHomeBackend(m0).suspend(homeProviderDescriptor(home));
253
+ persistProviderRefresh(m0, tenantId, refresh);
217
254
  touchTenantPause(cfg, tenantId);
218
255
  clearTenantIdleTimer(tenantId);
219
256
  });
@@ -279,8 +316,7 @@ async function runEnsureAwake(tenantId) {
279
316
  return wakeProxyInternals.captureAwakeHome(tenantId);
280
317
  }
281
318
  }
282
- // Not serving: drive the backend seam to bring the home up and refresh its route. The backend
283
- // owns the warm-resume-vs-recreate decision and persists webRoute/relayToken to the registry.
319
+ // Not serving: drive the backend seam to bring the home up, then persist the returned route.
284
320
  await wakeProxyInternals.wakeHome(tenantId);
285
321
  const refreshed = getHome(m0.registryPath, tenantId);
286
322
  const relayUrl = refreshed?.webRoute?.concreteUrl ?? refreshed?.webRoute?.url ?? null;
@@ -45,6 +45,31 @@ import { loadInjectedDocs, saveInjectedDocs } from '../core/substrate/injected-s
45
45
  * to reach for while reading the tools, so memory docs/preferences must sit
46
46
  * there, not far below. Mirrors crouter-help.ts. Falls back to appending if absent. */
47
47
  const TOOLS_ANCHOR = '\n\nGuidelines:';
48
+ const AUTO_CONTEXT_RE = /<auto-loaded-context(?:\s[^>]*)?>\n([\s\S]*?)\n<\/auto-loaded-context>/;
49
+ function mergeAutoLoadedContext(injected, content) {
50
+ const match = injected.match(AUTO_CONTEXT_RE);
51
+ const inner = match?.[1]?.trim();
52
+ if (!inner)
53
+ return content;
54
+ const existingText = content.map((block) => block.text ?? '').join('\n');
55
+ if (existingText.includes(inner))
56
+ return content;
57
+ const existingIdx = content.findIndex((block) => typeof block.text === 'string' && AUTO_CONTEXT_RE.test(block.text));
58
+ if (existingIdx !== -1) {
59
+ return content.map((block, idx) => {
60
+ if (idx !== existingIdx || typeof block.text !== 'string')
61
+ return block;
62
+ return {
63
+ ...block,
64
+ text: block.text.replace(AUTO_CONTEXT_RE, (_whole, current) => {
65
+ const trimmed = String(current).trim();
66
+ return `<auto-loaded-context>\n${inner}${trimmed === '' ? '' : `\n${trimmed}`}\n</auto-loaded-context>`;
67
+ }),
68
+ };
69
+ });
70
+ }
71
+ return [{ type: 'text', text: `<auto-loaded-context>\n${inner}\n</auto-loaded-context>` }, ...content];
72
+ }
48
73
  /**
49
74
  * Register the document substrate's two render hooks on `pi`.
50
75
  *
@@ -115,8 +140,9 @@ export function registerCanvasDocSubstrate(pi) {
115
140
  // A doc surfaced → renderOnReadDocs grew injectedDocs; persist the set so
116
141
  // the dedup survives a later dormancy → revive(resume).
117
142
  saveInjectedDocs(nodeId, injectedDocs);
118
- // Prepend the surfacing docs ahead of the file contents.
119
- return { content: [{ type: 'text', text: injected }, ...event.content] };
143
+ // Fold into any existing auto-loaded-context block from sibling read hooks;
144
+ // otherwise prepend one quiet block ahead of the file contents.
145
+ return { content: mergeAutoLoadedContext(injected, event.content) };
120
146
  }
121
147
  catch {
122
148
  return; // inert on error — a bug must degrade a read, never break it
@@ -473,7 +473,7 @@ export function registerCanvasNav(pi) {
473
473
  const target = cursorId ?? nodeId;
474
474
  const n = cNode(target);
475
475
  const nm = n !== null ? fullName(n) : shortId(target);
476
- pendingConfirm = { label: `kill ${nm}?`, action: () => shellCrtr(['node', 'close', '--node', target], render) };
476
+ pendingConfirm = { label: `kill ${nm}?`, action: () => shellCrtr(['node', 'lifecycle', 'close', '--node', target], render) };
477
477
  render();
478
478
  return { consume: true };
479
479
  }