@crouton-kit/crouter 0.3.32 → 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 (852) hide show
  1. package/README.md +10 -2
  2. package/dist/build-root.js +4 -6
  3. package/dist/builtin-memory/crouter-development/marketplaces.md +8 -8
  4. package/dist/builtin-memory/crouter-development/personas/base-prompt.md +2 -2
  5. package/dist/builtin-memory/crouter-development/personas/orchestrator-prompt.md +5 -5
  6. package/dist/builtin-memory/crouter-development/personas.md +3 -4
  7. package/dist/builtin-memory/crouter-development/plugins.md +31 -31
  8. package/dist/builtin-memory/design.md +4 -1
  9. package/dist/builtin-memory/development.md +4 -1
  10. package/dist/builtin-memory/internal/INDEX.md +1 -1
  11. package/dist/builtin-memory/internal/examples/imessage-assistant.md +3 -3
  12. package/dist/builtin-memory/internal/nodes-and-canvas.md +9 -9
  13. package/dist/builtin-memory/internal/storage-tiers.md +5 -5
  14. package/dist/builtin-memory/planning.md +4 -1
  15. package/dist/builtin-memory/product.md +80 -0
  16. package/dist/builtin-memory/spec.md +4 -1
  17. package/dist/builtin-personas/advisor/PERSONA.md +10 -0
  18. package/dist/builtin-personas/design/PERSONA.md +2 -2
  19. package/dist/builtin-personas/design/orchestrator.md +3 -3
  20. package/dist/builtin-personas/developer/PERSONA.md +1 -1
  21. package/dist/builtin-personas/developer/orchestrator.md +2 -2
  22. package/dist/builtin-personas/explore/PERSONA.md +3 -3
  23. package/dist/builtin-personas/explore/orchestrator.md +4 -2
  24. package/dist/builtin-personas/general/PERSONA.md +1 -1
  25. package/dist/builtin-personas/general/orchestrator.md +1 -1
  26. package/dist/builtin-personas/orchestration-kernel.md +8 -15
  27. package/dist/builtin-personas/plan/PERSONA.md +1 -1
  28. package/dist/builtin-personas/plan/orchestrator.md +2 -2
  29. package/dist/builtin-personas/plan/reviewers/architecture-fit/PERSONA.md +1 -1
  30. package/dist/builtin-personas/plan/reviewers/code-smells/PERSONA.md +1 -1
  31. package/dist/builtin-personas/plan/reviewers/pattern-consistency/PERSONA.md +1 -1
  32. package/dist/builtin-personas/plan/reviewers/requirements-coverage/PERSONA.md +1 -1
  33. package/dist/builtin-personas/plan/reviewers/security/PERSONA.md +1 -1
  34. package/dist/builtin-personas/product/PERSONA.md +18 -0
  35. package/dist/builtin-personas/product/orchestrator.md +14 -0
  36. package/dist/builtin-personas/product/teardown/PERSONA.md +13 -0
  37. package/dist/builtin-personas/review/PERSONA.md +1 -1
  38. package/dist/builtin-personas/review/orchestrator.md +1 -1
  39. package/dist/builtin-personas/runtime-base.md +5 -0
  40. package/dist/builtin-personas/spec/PERSONA.md +1 -1
  41. package/dist/builtin-personas/spec/orchestrator.md +2 -2
  42. package/dist/builtin-personas/spec/requirements/PERSONA.md +1 -1
  43. package/dist/builtin-personas/waiting.md +1 -1
  44. package/dist/builtin-pi-packages/pi-crtr-extensions/README.md +71 -0
  45. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/crtr-help-gate.test.ts +41 -0
  46. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/provider-rotation.test.ts +663 -0
  47. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +52 -0
  48. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +418 -0
  49. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crouter-help.ts +87 -0
  50. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crtr-commands/filters.json +7 -0
  51. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crtr-commands/index.ts +174 -0
  52. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crtr-help-gate.ts +408 -0
  53. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +442 -0
  54. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +119 -0
  55. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/nested-context.ts +327 -0
  56. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +574 -0
  57. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/statusline.ts +260 -0
  58. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/strip-skills-docs.ts +40 -0
  59. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/sysprompt-window.ts +19 -0
  60. package/dist/builtin-pi-packages/pi-crtr-extensions/lib/package.json +3 -0
  61. package/dist/builtin-pi-packages/pi-crtr-extensions/lib/subscription-state.js +1 -0
  62. package/dist/builtin-pi-packages/pi-crtr-extensions/lib/subscription-state.ts +479 -0
  63. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/LICENSE +13 -0
  64. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/README.md +172 -0
  65. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/bin.mjs +11 -0
  66. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-collection.js +88 -0
  67. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-doc.js +43 -0
  68. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-node.js +109 -0
  69. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-scalar.js +86 -0
  70. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/composer.js +219 -0
  71. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-block-map.js +115 -0
  72. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +198 -0
  73. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +49 -0
  74. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-end.js +37 -0
  75. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +207 -0
  76. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +225 -0
  77. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-props.js +146 -0
  78. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-contains-newline.js +34 -0
  79. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +26 -0
  80. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +15 -0
  81. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-map-includes.js +13 -0
  82. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/Document.js +335 -0
  83. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/anchors.js +71 -0
  84. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/applyReviver.js +55 -0
  85. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/createNode.js +88 -0
  86. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/directives.js +176 -0
  87. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/errors.js +57 -0
  88. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/index.js +17 -0
  89. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/log.js +11 -0
  90. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Alias.js +116 -0
  91. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Collection.js +147 -0
  92. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Node.js +38 -0
  93. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Pair.js +36 -0
  94. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Scalar.js +24 -0
  95. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/YAMLMap.js +144 -0
  96. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +113 -0
  97. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +63 -0
  98. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/identity.js +36 -0
  99. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/toJS.js +37 -0
  100. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst-scalar.js +214 -0
  101. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst-stringify.js +61 -0
  102. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst-visit.js +97 -0
  103. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst.js +98 -0
  104. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/lexer.js +721 -0
  105. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/line-counter.js +39 -0
  106. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/parser.js +975 -0
  107. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/public-api.js +102 -0
  108. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/Schema.js +37 -0
  109. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/map.js +17 -0
  110. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/null.js +15 -0
  111. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/seq.js +17 -0
  112. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/string.js +14 -0
  113. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/bool.js +19 -0
  114. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/float.js +43 -0
  115. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/int.js +38 -0
  116. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/schema.js +23 -0
  117. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/json/schema.js +62 -0
  118. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/tags.js +96 -0
  119. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +58 -0
  120. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +26 -0
  121. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +46 -0
  122. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +71 -0
  123. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +67 -0
  124. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +74 -0
  125. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +78 -0
  126. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +39 -0
  127. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +93 -0
  128. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +101 -0
  129. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +146 -0
  130. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringify.js +129 -0
  131. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +153 -0
  132. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyComment.js +20 -0
  133. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +85 -0
  134. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +25 -0
  135. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyPair.js +150 -0
  136. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyString.js +336 -0
  137. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/util.js +11 -0
  138. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/visit.js +233 -0
  139. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/index.js +5 -0
  140. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/package.json +3 -0
  141. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/cli.d.ts +8 -0
  142. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/cli.mjs +201 -0
  143. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-collection.d.ts +11 -0
  144. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-collection.js +90 -0
  145. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-doc.d.ts +7 -0
  146. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-doc.js +45 -0
  147. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-node.d.ts +29 -0
  148. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-node.js +112 -0
  149. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-scalar.d.ts +5 -0
  150. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-scalar.js +88 -0
  151. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/composer.d.ts +63 -0
  152. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/composer.js +224 -0
  153. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-map.d.ts +6 -0
  154. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-map.js +117 -0
  155. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +11 -0
  156. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-scalar.js +200 -0
  157. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +6 -0
  158. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-seq.js +51 -0
  159. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-end.d.ts +6 -0
  160. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-end.js +39 -0
  161. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +7 -0
  162. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-collection.js +209 -0
  163. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +10 -0
  164. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-scalar.js +227 -0
  165. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-props.d.ts +23 -0
  166. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-props.js +148 -0
  167. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-contains-newline.d.ts +2 -0
  168. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-contains-newline.js +36 -0
  169. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +2 -0
  170. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-empty-scalar-position.js +28 -0
  171. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +3 -0
  172. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-flow-indent-check.js +17 -0
  173. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-map-includes.d.ts +4 -0
  174. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-map-includes.js +15 -0
  175. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/Document.d.ts +141 -0
  176. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/Document.js +337 -0
  177. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/anchors.d.ts +24 -0
  178. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/anchors.js +76 -0
  179. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/applyReviver.d.ts +9 -0
  180. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/applyReviver.js +57 -0
  181. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/createNode.d.ts +17 -0
  182. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/createNode.js +90 -0
  183. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/directives.d.ts +49 -0
  184. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/directives.js +178 -0
  185. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/errors.d.ts +21 -0
  186. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/errors.js +62 -0
  187. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/index.d.ts +25 -0
  188. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/index.js +50 -0
  189. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/log.d.ts +3 -0
  190. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/log.js +19 -0
  191. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Alias.d.ts +29 -0
  192. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Alias.js +118 -0
  193. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Collection.d.ts +73 -0
  194. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Collection.js +151 -0
  195. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Node.d.ts +53 -0
  196. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Node.js +40 -0
  197. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Pair.d.ts +22 -0
  198. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Pair.js +39 -0
  199. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Scalar.d.ts +47 -0
  200. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Scalar.js +27 -0
  201. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLMap.d.ts +53 -0
  202. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLMap.js +147 -0
  203. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +60 -0
  204. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLSeq.js +115 -0
  205. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +4 -0
  206. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/addPairToJSMap.js +65 -0
  207. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/identity.d.ts +23 -0
  208. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/identity.js +53 -0
  209. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/toJS.d.ts +29 -0
  210. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/toJS.js +39 -0
  211. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/options.d.ts +350 -0
  212. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-scalar.d.ts +64 -0
  213. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-scalar.js +218 -0
  214. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-stringify.d.ts +8 -0
  215. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-stringify.js +63 -0
  216. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-visit.d.ts +39 -0
  217. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-visit.js +99 -0
  218. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst.d.ts +109 -0
  219. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst.js +112 -0
  220. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/lexer.d.ts +87 -0
  221. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/lexer.js +723 -0
  222. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/line-counter.d.ts +22 -0
  223. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/line-counter.js +41 -0
  224. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/parser.d.ts +84 -0
  225. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/parser.js +980 -0
  226. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/public-api.d.ts +44 -0
  227. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/public-api.js +107 -0
  228. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/Schema.d.ts +17 -0
  229. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/Schema.js +39 -0
  230. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/map.d.ts +2 -0
  231. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/map.js +19 -0
  232. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/null.d.ts +4 -0
  233. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/null.js +17 -0
  234. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/seq.d.ts +2 -0
  235. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/seq.js +19 -0
  236. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/string.d.ts +2 -0
  237. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/string.js +16 -0
  238. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/bool.d.ts +4 -0
  239. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/bool.js +21 -0
  240. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/float.d.ts +4 -0
  241. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/float.js +47 -0
  242. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/int.d.ts +4 -0
  243. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/int.js +42 -0
  244. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/schema.d.ts +1 -0
  245. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/schema.js +25 -0
  246. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/json/schema.d.ts +2 -0
  247. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/json/schema.js +64 -0
  248. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/json-schema.d.ts +69 -0
  249. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/tags.d.ts +48 -0
  250. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/tags.js +99 -0
  251. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/types.d.ts +92 -0
  252. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +2 -0
  253. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/binary.js +70 -0
  254. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +7 -0
  255. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/bool.js +29 -0
  256. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +4 -0
  257. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/float.js +50 -0
  258. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +5 -0
  259. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/int.js +76 -0
  260. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +9 -0
  261. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/merge.js +71 -0
  262. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +22 -0
  263. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/omap.js +77 -0
  264. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +10 -0
  265. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +82 -0
  266. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +1 -0
  267. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/schema.js +41 -0
  268. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +28 -0
  269. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/set.js +96 -0
  270. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +6 -0
  271. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +105 -0
  272. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +34 -0
  273. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/foldFlowLines.js +151 -0
  274. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringify.d.ts +21 -0
  275. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringify.js +132 -0
  276. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +17 -0
  277. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyCollection.js +155 -0
  278. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyComment.d.ts +10 -0
  279. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyComment.js +24 -0
  280. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +4 -0
  281. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyDocument.js +87 -0
  282. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +2 -0
  283. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyNumber.js +27 -0
  284. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyPair.d.ts +3 -0
  285. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyPair.js +152 -0
  286. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyString.d.ts +9 -0
  287. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyString.js +338 -0
  288. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/test-events.d.ts +4 -0
  289. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/test-events.js +134 -0
  290. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/util.d.ts +16 -0
  291. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/util.js +28 -0
  292. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/visit.d.ts +102 -0
  293. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/visit.js +236 -0
  294. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/package.json +97 -0
  295. package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/util.js +2 -0
  296. package/dist/builtin-pi-packages/pi-crtr-extensions/package-lock.json +3385 -0
  297. package/dist/builtin-pi-packages/pi-crtr-extensions/package.json +25 -0
  298. package/dist/builtin-pi-packages/pi-mode-switch/README.md +64 -0
  299. package/dist/builtin-pi-packages/pi-mode-switch/bin/mode +40 -0
  300. package/dist/builtin-pi-packages/pi-mode-switch/extensions/index.ts +422 -0
  301. package/dist/builtin-pi-packages/pi-mode-switch/package.json +13 -0
  302. package/dist/builtin-views/canvas/core.mjs +82 -1
  303. package/dist/builtin-views/canvas/tui.mjs +9 -5
  304. package/dist/builtin-views/canvas/web.jsx +3 -2
  305. package/dist/builtin-views/chat/core.mjs +725 -0
  306. package/dist/builtin-views/chat/text.mjs +101 -0
  307. package/dist/builtin-views/chat/tui.mjs +368 -0
  308. package/dist/builtin-views/chat/web.jsx +367 -0
  309. package/dist/builtin-views/prompt-review/core.mjs +863 -0
  310. package/dist/builtin-views/prompt-review/text.mjs +15 -0
  311. package/dist/builtin-views/prompt-review/tui.mjs +196 -0
  312. package/dist/builtin-views/prompt-review/web.jsx +484 -0
  313. package/dist/builtin-views/settings/core.mjs +397 -0
  314. package/dist/builtin-views/settings/text.mjs +40 -0
  315. package/dist/builtin-views/settings/tui.mjs +95 -0
  316. package/dist/builtin-views/settings/web.jsx +167 -0
  317. package/dist/cli.js +16 -3
  318. package/dist/clients/attach/__tests__/crtr-output-coverage.test.js +55 -0
  319. package/dist/clients/attach/__tests__/crtr-output-render.test.js +2340 -0
  320. package/dist/clients/attach/attach-cmd.d.ts +18 -0
  321. package/dist/clients/attach/attach-cmd.js +1797 -797
  322. package/dist/clients/attach/auth-pickers.js +2 -2
  323. package/dist/clients/attach/canvas-panels.js +3 -3
  324. package/dist/clients/attach/chat-view.d.ts +13 -2
  325. package/dist/clients/attach/chat-view.js +53 -10
  326. package/dist/clients/attach/clipboard-image.js +1 -1
  327. package/dist/clients/attach/clipboard-text.js +1 -1
  328. package/dist/clients/attach/config-load.d.ts +8 -4
  329. package/dist/clients/attach/config-load.js +3 -1
  330. package/dist/clients/attach/crtr-output-render.d.ts +48 -0
  331. package/dist/clients/attach/crtr-output-render.js +646 -0
  332. package/dist/clients/attach/extension-dialogs.d.ts +2 -3
  333. package/dist/clients/attach/extension-dialogs.js +8 -10
  334. package/dist/clients/attach/graph-overlay.js +6 -5
  335. package/dist/clients/attach/input-controller.d.ts +4 -3
  336. package/dist/clients/attach/input-controller.js +25 -4
  337. package/dist/clients/attach/pickers.js +1 -1
  338. package/dist/clients/attach/slash-commands.d.ts +7 -7
  339. package/dist/clients/attach/slash-commands.js +40 -17
  340. package/dist/clients/attach/titled-editor.d.ts +4 -0
  341. package/dist/clients/attach/titled-editor.js +31 -15
  342. package/dist/clients/attach/view-socket.d.ts +2 -1
  343. package/dist/clients/attach/view-socket.js +28 -9
  344. package/dist/clients/web/__tests__/source-cache.test.js +32 -0
  345. package/dist/clients/web/dev-server.js +1 -0
  346. package/dist/clients/web/events.js +9 -11
  347. package/dist/clients/web/server.d.ts +4 -3
  348. package/dist/clients/web/server.js +166 -35
  349. package/dist/clients/web/source-cache.d.ts +10 -0
  350. package/dist/clients/web/source-cache.js +57 -0
  351. package/dist/clients/web/web-cmd.js +32 -13
  352. package/dist/commands/__tests__/human.test.js +30 -28
  353. package/dist/commands/canvas-history/search.js +1 -1
  354. package/dist/commands/canvas-history.js +5 -8
  355. package/dist/commands/canvas-issue.d.ts +2 -0
  356. package/dist/commands/canvas-issue.js +148 -0
  357. package/dist/commands/canvas-prune.js +43 -2
  358. package/dist/commands/canvas-rebuild-index.d.ts +2 -0
  359. package/dist/commands/canvas-rebuild-index.js +57 -0
  360. package/dist/commands/canvas-snapshot.d.ts +2 -0
  361. package/dist/commands/canvas-snapshot.js +51 -0
  362. package/dist/commands/canvas-tmux-spread.d.ts +2 -0
  363. package/dist/commands/canvas-tmux-spread.js +188 -0
  364. package/dist/commands/canvas.d.ts +1 -0
  365. package/dist/commands/canvas.js +16 -1
  366. package/dist/commands/chord.js +143 -48
  367. package/dist/commands/daemon.js +3 -3
  368. package/dist/commands/human/prompts.d.ts +0 -1
  369. package/dist/commands/human/prompts.js +39 -54
  370. package/dist/commands/human/queue.d.ts +12 -1
  371. package/dist/commands/human/queue.js +468 -73
  372. package/dist/commands/human/shared.d.ts +3 -4
  373. package/dist/commands/human/shared.js +3 -3
  374. package/dist/commands/human.js +12 -11
  375. package/dist/commands/memory/find.js +3 -2
  376. package/dist/commands/memory/lint.js +15 -8
  377. package/dist/commands/memory/list.js +4 -3
  378. package/dist/commands/memory/origin.d.ts +1 -0
  379. package/dist/commands/memory/origin.js +88 -0
  380. package/dist/commands/memory/read.js +3 -3
  381. package/dist/commands/memory/shared.d.ts +9 -4
  382. package/dist/commands/memory/shared.js +28 -10
  383. package/dist/commands/memory/write.js +19 -14
  384. package/dist/commands/memory.js +6 -8
  385. package/dist/commands/node-context.d.ts +2 -0
  386. package/dist/commands/node-context.js +172 -0
  387. package/dist/commands/node-snapshot.d.ts +2 -0
  388. package/dist/commands/node-snapshot.js +126 -0
  389. package/dist/commands/node.d.ts +2 -2
  390. package/dist/commands/node.js +987 -603
  391. package/dist/commands/pkg/market-inspect.d.ts +2 -1
  392. package/dist/commands/pkg/market-inspect.js +14 -32
  393. package/dist/commands/pkg/market-manage.d.ts +3 -1
  394. package/dist/commands/pkg/market-manage.js +58 -154
  395. package/dist/commands/pkg/market.js +7 -7
  396. package/dist/commands/pkg/plugin-inspect.d.ts +2 -1
  397. package/dist/commands/pkg/plugin-inspect.js +13 -29
  398. package/dist/commands/pkg/plugin-manage.d.ts +5 -1
  399. package/dist/commands/pkg/plugin-manage.js +246 -172
  400. package/dist/commands/pkg/plugin.js +6 -6
  401. package/dist/commands/pkg.js +7 -7
  402. package/dist/commands/push.d.ts +2 -0
  403. package/dist/commands/push.js +79 -11
  404. package/dist/commands/revive.js +79 -4
  405. package/dist/commands/search/answer.d.ts +1 -0
  406. package/dist/commands/search/answer.js +50 -0
  407. package/dist/commands/search/contents.d.ts +1 -0
  408. package/dist/commands/search/contents.js +96 -0
  409. package/dist/commands/search/exa.d.ts +53 -0
  410. package/dist/commands/search/exa.js +155 -0
  411. package/dist/commands/search/puremd.d.ts +11 -0
  412. package/dist/commands/search/puremd.js +53 -0
  413. package/dist/commands/search/web.d.ts +1 -0
  414. package/dist/commands/search/web.js +65 -0
  415. package/dist/commands/search.d.ts +2 -0
  416. package/dist/commands/search.js +24 -0
  417. package/dist/commands/surface.d.ts +2 -0
  418. package/dist/commands/surface.js +43 -0
  419. package/dist/commands/sys/__tests__/sync-import.test.js +72 -0
  420. package/dist/commands/sys/config.js +59 -10
  421. package/dist/commands/sys/doctor.js +56 -4
  422. package/dist/commands/sys/prompt-review.d.ts +1 -0
  423. package/dist/commands/sys/prompt-review.js +178 -0
  424. package/dist/commands/sys/promptstudio.d.ts +2 -0
  425. package/dist/commands/sys/promptstudio.js +65 -0
  426. package/dist/commands/sys/settings.d.ts +2 -0
  427. package/dist/commands/sys/settings.js +16 -0
  428. package/dist/commands/sys/setup-core.d.ts +88 -0
  429. package/dist/commands/sys/setup-core.js +352 -0
  430. package/dist/commands/sys/setup.d.ts +2 -0
  431. package/dist/commands/sys/setup.js +516 -0
  432. package/dist/commands/sys/sync.js +311 -159
  433. package/dist/commands/sys/sysprompt.d.ts +1 -0
  434. package/dist/commands/sys/sysprompt.js +89 -0
  435. package/dist/commands/sys.js +10 -5
  436. package/dist/commands/view-cycle.js +5 -5
  437. package/dist/commands/view-list.js +3 -3
  438. package/dist/commands/view-new.js +6 -6
  439. package/dist/commands/view-pick.js +6 -6
  440. package/dist/commands/view-run.js +14 -14
  441. package/dist/commands/view.js +3 -3
  442. package/dist/commands/workspace.js +10 -10
  443. package/dist/core/__tests__/boot.test.js +140 -0
  444. package/dist/core/__tests__/broker-preflight.test.js +85 -0
  445. package/dist/core/__tests__/broker-sdk-wiring.test.js +10 -16
  446. package/dist/core/__tests__/canvas.test.js +37 -1
  447. package/dist/core/__tests__/chat-view-reconnect.test.js +70 -0
  448. package/dist/core/__tests__/child-death-wake.test.js +11 -2
  449. package/dist/core/__tests__/close.test.js +39 -1
  450. package/dist/core/__tests__/connection-reconnect-resume.test.js +37 -0
  451. package/dist/core/__tests__/context-intro.test.js +48 -14
  452. package/dist/core/__tests__/daemon-boot.test.js +204 -9
  453. package/dist/core/__tests__/fixtures/fake-engine.d.ts +30 -4
  454. package/dist/core/__tests__/fixtures/fake-engine.js +157 -18
  455. package/dist/core/__tests__/fixtures/fake-pi-host.js +10 -1
  456. package/dist/core/__tests__/full/broker-attach-limits.test.js +1 -1
  457. package/dist/core/__tests__/full/broker-attach-stream.test.js +1 -1
  458. package/dist/core/__tests__/full/broker-crash-teardown.test.js +10 -5
  459. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +1 -1
  460. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +1 -1
  461. package/dist/core/__tests__/full/broker-pane-resolution.test.js +1 -1
  462. package/dist/core/__tests__/full/cascade-close.test.js +31 -18
  463. package/dist/core/__tests__/full/detach-focus.test.js +2 -2
  464. package/dist/core/__tests__/full/human-new-window-regression.test.js +1 -1
  465. package/dist/core/__tests__/hearth-bootstrap.test.js +136 -0
  466. package/dist/core/__tests__/helpers/harness.d.ts +1 -1
  467. package/dist/core/__tests__/helpers/harness.js +3 -3
  468. package/dist/core/__tests__/human-stranded-deliver.test.js +38 -1
  469. package/dist/core/__tests__/human-surface-target.test.js +1 -1
  470. package/dist/core/__tests__/kickoff.test.js +18 -19
  471. package/dist/core/__tests__/live-mutation-verbs.test.js +10 -10
  472. package/dist/core/__tests__/live-mutation.test.js +8 -8
  473. package/dist/core/__tests__/migration.test.js +172 -13
  474. package/dist/core/__tests__/on-read-dedup-resume.test.js +40 -0
  475. package/dist/core/__tests__/preview-registry-sync.test.js +36 -0
  476. package/dist/core/__tests__/prune-to-limit.test.js +91 -0
  477. package/dist/core/__tests__/push-final-guard.test.js +7 -1
  478. package/dist/core/__tests__/relaunch-root.test.js +9 -9
  479. package/dist/core/__tests__/revive.test.js +100 -27
  480. package/dist/core/__tests__/spawn-root.test.js +24 -1
  481. package/dist/core/__tests__/stop-guard.test.js +10 -0
  482. package/dist/core/__tests__/stranded-relaunch.test.js +72 -0
  483. package/dist/core/__tests__/tmux-surface.test.js +5 -1
  484. package/dist/core/__tests__/trigger-migration.test.js +48 -0
  485. package/dist/core/__tests__/wake-bearings.test.js +23 -21
  486. package/dist/core/__tests__/wake-origin.test.js +36 -33
  487. package/dist/core/__tests__/yield-ensures-daemon.test.js +54 -0
  488. package/dist/core/artifact.d.ts +2 -33
  489. package/dist/core/artifact.js +27 -87
  490. package/dist/core/bootstrap.js +2 -0
  491. package/dist/core/canvas/boot.d.ts +48 -0
  492. package/dist/core/canvas/boot.js +157 -0
  493. package/dist/core/canvas/browse/__tests__/model.test.js +35 -1
  494. package/dist/core/canvas/browse/app.js +87 -17
  495. package/dist/core/canvas/browse/model.d.ts +10 -1
  496. package/dist/core/canvas/browse/model.js +37 -1
  497. package/dist/core/canvas/browse/render.js +35 -33
  498. package/dist/core/canvas/canvas.d.ts +33 -0
  499. package/dist/core/canvas/canvas.js +138 -8
  500. package/dist/core/canvas/db.js +121 -9
  501. package/dist/core/canvas/index.d.ts +1 -1
  502. package/dist/core/canvas/index.js +1 -1
  503. package/dist/core/canvas/labels.d.ts +6 -8
  504. package/dist/core/canvas/labels.js +8 -11
  505. package/dist/core/canvas/nav-model.d.ts +5 -4
  506. package/dist/core/canvas/nav-model.js +32 -18
  507. package/dist/core/canvas/paths.d.ts +18 -1
  508. package/dist/core/canvas/paths.js +31 -2
  509. package/dist/core/canvas/pid.d.ts +6 -0
  510. package/dist/core/canvas/pid.js +13 -0
  511. package/dist/core/canvas/render.d.ts +25 -0
  512. package/dist/core/canvas/render.js +96 -13
  513. package/dist/core/canvas/status-glyph.d.ts +35 -0
  514. package/dist/core/canvas/status-glyph.js +104 -0
  515. package/dist/core/canvas/triggers.d.ts +108 -0
  516. package/dist/core/canvas/triggers.js +320 -0
  517. package/dist/core/canvas/types.d.ts +130 -48
  518. package/dist/core/command.js +13 -4
  519. package/dist/core/config.js +114 -16
  520. package/dist/core/fault-classifier.d.ts +41 -0
  521. package/dist/core/fault-classifier.js +110 -0
  522. package/dist/core/feed/inbox.d.ts +15 -0
  523. package/dist/core/feed/inbox.js +40 -14
  524. package/dist/core/frontmatter.d.ts +1 -11
  525. package/dist/core/frontmatter.js +1 -55
  526. package/dist/core/hearth/__tests__/model-auth-guest.test.js +151 -0
  527. package/dist/core/hearth/config.d.ts +3 -0
  528. package/dist/core/hearth/config.js +111 -0
  529. package/dist/core/hearth/guest-env.d.ts +9 -0
  530. package/dist/core/hearth/guest-env.js +27 -0
  531. package/dist/core/hearth/index.d.ts +5 -0
  532. package/dist/core/hearth/index.js +5 -0
  533. package/dist/core/hearth/model-auth-guest.d.ts +8 -0
  534. package/dist/core/hearth/model-auth-guest.js +435 -0
  535. package/dist/core/hearth/provider.d.ts +28 -0
  536. package/dist/core/hearth/provider.js +10 -0
  537. package/dist/core/hearth/providers/blaxel-bootstrap.d.ts +12 -0
  538. package/dist/core/hearth/providers/blaxel-bootstrap.js +147 -0
  539. package/dist/core/hearth/providers/blaxel-home.d.ts +15 -0
  540. package/dist/core/hearth/providers/blaxel-home.js +136 -0
  541. package/dist/core/hearth/providers/blaxel.d.ts +31 -0
  542. package/dist/core/hearth/providers/blaxel.js +282 -0
  543. package/dist/core/hearth/providers/types.d.ts +77 -0
  544. package/dist/core/hearth/registry.d.ts +15 -0
  545. package/dist/core/hearth/registry.js +180 -0
  546. package/dist/core/hearth/types.d.ts +156 -0
  547. package/dist/core/help.d.ts +16 -0
  548. package/dist/core/help.js +2 -0
  549. package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.js +79 -0
  550. package/dist/core/{skill-sync → host-exports}/builtins.d.ts +21 -13
  551. package/dist/core/host-exports/builtins.js +68 -0
  552. package/dist/core/{skill-sync → host-exports}/export.d.ts +9 -6
  553. package/dist/core/{skill-sync → host-exports}/export.js +37 -14
  554. package/dist/core/io.js +1 -1
  555. package/dist/core/log.d.ts +9 -0
  556. package/dist/core/log.js +113 -0
  557. package/dist/core/memory-resolver.d.ts +13 -13
  558. package/dist/core/memory-resolver.js +70 -51
  559. package/dist/core/personas/index.d.ts +4 -4
  560. package/dist/core/personas/index.js +2 -2
  561. package/dist/core/personas/loader.d.ts +51 -0
  562. package/dist/core/personas/loader.js +54 -50
  563. package/dist/core/personas/resolve.d.ts +43 -27
  564. package/dist/core/personas/resolve.js +336 -94
  565. package/dist/core/preview-registry.d.ts +25 -0
  566. package/dist/core/preview-registry.js +2047 -0
  567. package/dist/core/resolver.d.ts +1 -0
  568. package/dist/core/resolver.js +23 -16
  569. package/dist/core/runtime/auth-reload.d.ts +7 -0
  570. package/dist/core/runtime/auth-reload.js +69 -0
  571. package/dist/core/runtime/bearings.d.ts +46 -25
  572. package/dist/core/runtime/bearings.js +313 -52
  573. package/dist/core/runtime/branded-host.d.ts +4 -2
  574. package/dist/core/runtime/branded-host.js +66 -4
  575. package/dist/core/runtime/broker-protocol.d.ts +40 -5
  576. package/dist/core/runtime/broker-protocol.js +2 -2
  577. package/dist/core/runtime/broker.js +343 -18
  578. package/dist/core/runtime/close.js +39 -31
  579. package/dist/core/runtime/connectivity.d.ts +12 -0
  580. package/dist/core/runtime/connectivity.js +73 -0
  581. package/dist/core/runtime/fault-recovery-nudge.d.ts +2 -0
  582. package/dist/core/runtime/fault-recovery-nudge.js +2 -0
  583. package/dist/core/runtime/fault-recovery.d.ts +23 -0
  584. package/dist/core/runtime/fault-recovery.js +74 -0
  585. package/dist/core/runtime/fault.d.ts +25 -0
  586. package/dist/core/runtime/fault.js +176 -0
  587. package/dist/core/runtime/front-door.d.ts +1 -1
  588. package/dist/core/runtime/front-door.js +2 -2
  589. package/dist/core/runtime/host.d.ts +10 -0
  590. package/dist/core/runtime/host.js +71 -9
  591. package/dist/core/runtime/kickoff.js +32 -46
  592. package/dist/core/runtime/launch.d.ts +41 -21
  593. package/dist/core/runtime/launch.js +165 -52
  594. package/dist/core/runtime/lifecycle.js +7 -7
  595. package/dist/core/runtime/model-swap.d.ts +18 -0
  596. package/dist/core/runtime/model-swap.js +95 -0
  597. package/dist/core/runtime/naming.d.ts +7 -0
  598. package/dist/core/runtime/naming.js +61 -9
  599. package/dist/core/runtime/nodes.js +6 -1
  600. package/dist/core/runtime/persona.js +16 -17
  601. package/dist/core/runtime/placement.d.ts +41 -36
  602. package/dist/core/runtime/placement.js +159 -74
  603. package/dist/core/runtime/promote.d.ts +2 -0
  604. package/dist/core/runtime/promote.js +23 -3
  605. package/dist/core/runtime/recycle.js +13 -11
  606. package/dist/core/runtime/reset.d.ts +6 -3
  607. package/dist/core/runtime/reset.js +5 -5
  608. package/dist/core/runtime/revive-all.d.ts +5 -2
  609. package/dist/core/runtime/revive-all.js +5 -2
  610. package/dist/core/runtime/revive.d.ts +19 -8
  611. package/dist/core/runtime/revive.js +79 -25
  612. package/dist/core/runtime/roadmap.d.ts +1 -1
  613. package/dist/core/runtime/roadmap.js +1 -1
  614. package/dist/core/runtime/spawn.d.ts +3 -3
  615. package/dist/core/runtime/spawn.js +37 -13
  616. package/dist/core/runtime/stop-guard.js +11 -6
  617. package/dist/core/runtime/surface-bg.js +1 -1
  618. package/dist/core/runtime/tmux-chrome.d.ts +1 -1
  619. package/dist/core/runtime/tmux-chrome.js +1 -1
  620. package/dist/core/runtime/tmux.d.ts +30 -7
  621. package/dist/core/runtime/tmux.js +138 -84
  622. package/dist/core/runtime/view-socket-client.d.ts +46 -0
  623. package/dist/core/runtime/view-socket-client.js +203 -0
  624. package/dist/core/scope.d.ts +9 -0
  625. package/dist/core/scope.js +37 -15
  626. package/dist/core/substrate/index.d.ts +1 -1
  627. package/dist/core/substrate/index.js +1 -1
  628. package/dist/core/substrate/on-read.js +39 -25
  629. package/dist/core/substrate/render.d.ts +10 -13
  630. package/dist/core/substrate/render.js +56 -51
  631. package/dist/core/tui/host.js +83 -18
  632. package/dist/core/view/__tests__/transport-cache.test.js +62 -0
  633. package/dist/core/view/contract.d.ts +20 -0
  634. package/dist/core/view/loader.js +2 -2
  635. package/dist/core/view/stream-local.d.ts +3 -0
  636. package/dist/core/view/stream-local.js +184 -0
  637. package/dist/core/view/transport-cache.d.ts +8 -0
  638. package/dist/core/view/transport-cache.js +38 -0
  639. package/dist/core/view/transport-local.js +4 -0
  640. package/dist/core/view/transport.d.ts +7 -1
  641. package/dist/core/wake.d.ts +2 -2
  642. package/dist/core/wake.js +7 -7
  643. package/dist/daemon/__tests__/predicate-eval.test.js +109 -0
  644. package/dist/daemon/crtrd.d.ts +3 -19
  645. package/dist/daemon/crtrd.js +360 -280
  646. package/dist/daemon/manage.d.ts +18 -1
  647. package/dist/daemon/manage.js +54 -9
  648. package/dist/daemon/predicate-eval.d.ts +52 -0
  649. package/dist/daemon/predicate-eval.js +248 -0
  650. package/dist/hearth/control-plane/__tests__/node-message.test.js +60 -0
  651. package/dist/hearth/control-plane/__tests__/rate-limit-recurrence.test.js +49 -0
  652. package/dist/hearth/control-plane/__tests__/relay-security.test.js +314 -0
  653. package/dist/hearth/control-plane/__tests__/scheduler-scan-loop.test.d.ts +1 -0
  654. package/dist/hearth/control-plane/__tests__/scheduler-scan-loop.test.js +133 -0
  655. package/dist/hearth/control-plane/__tests__/trigger-delivery.test.d.ts +1 -0
  656. package/dist/hearth/control-plane/__tests__/trigger-delivery.test.js +170 -0
  657. package/dist/hearth/control-plane/__tests__/webhook-ingress.test.d.ts +1 -0
  658. package/dist/hearth/control-plane/__tests__/webhook-ingress.test.js +167 -0
  659. package/dist/hearth/control-plane/config.d.ts +21 -0
  660. package/dist/hearth/control-plane/config.js +77 -0
  661. package/dist/hearth/control-plane/db.d.ts +30 -0
  662. package/dist/hearth/control-plane/db.js +534 -0
  663. package/dist/hearth/control-plane/ingress/rate-limit.d.ts +24 -0
  664. package/dist/hearth/control-plane/ingress/rate-limit.js +100 -0
  665. package/dist/hearth/control-plane/ingress/route-store.d.ts +31 -0
  666. package/dist/hearth/control-plane/ingress/route-store.js +61 -0
  667. package/dist/hearth/control-plane/ingress/webhook-delivery-store.d.ts +41 -0
  668. package/dist/hearth/control-plane/ingress/webhook-delivery-store.js +69 -0
  669. package/dist/hearth/control-plane/ingress/webhook-route.d.ts +55 -0
  670. package/dist/hearth/control-plane/ingress/webhook-route.js +285 -0
  671. package/dist/hearth/control-plane/main.d.ts +1 -0
  672. package/dist/hearth/control-plane/main.js +88 -0
  673. package/dist/hearth/control-plane/node-message.d.ts +31 -0
  674. package/dist/hearth/control-plane/node-message.js +98 -0
  675. package/dist/hearth/control-plane/register.d.ts +15 -0
  676. package/dist/hearth/control-plane/register.js +34 -0
  677. package/dist/hearth/control-plane/registry.d.ts +17 -0
  678. package/dist/hearth/control-plane/registry.js +161 -0
  679. package/dist/hearth/control-plane/relay.d.ts +40 -0
  680. package/dist/hearth/control-plane/relay.js +642 -0
  681. package/dist/hearth/control-plane/scheduler/fire-store.d.ts +36 -0
  682. package/dist/hearth/control-plane/scheduler/fire-store.js +73 -0
  683. package/dist/hearth/control-plane/scheduler/recurrence.d.ts +7 -0
  684. package/dist/hearth/control-plane/scheduler/recurrence.js +58 -0
  685. package/dist/hearth/control-plane/scheduler/scan-loop.d.ts +38 -0
  686. package/dist/hearth/control-plane/scheduler/scan-loop.js +138 -0
  687. package/dist/hearth/control-plane/scheduler/schedule-store.d.ts +32 -0
  688. package/dist/hearth/control-plane/scheduler/schedule-store.js +66 -0
  689. package/dist/hearth/control-plane/secrets.d.ts +17 -0
  690. package/dist/hearth/control-plane/secrets.js +113 -0
  691. package/dist/hearth/control-plane/server.d.ts +27 -0
  692. package/dist/hearth/control-plane/server.js +346 -0
  693. package/dist/hearth/control-plane/session.d.ts +68 -0
  694. package/dist/hearth/control-plane/session.js +273 -0
  695. package/dist/hearth/control-plane/triggers/acl.d.ts +14 -0
  696. package/dist/hearth/control-plane/triggers/acl.js +52 -0
  697. package/dist/hearth/control-plane/triggers/audit-store.d.ts +38 -0
  698. package/dist/hearth/control-plane/triggers/audit-store.js +79 -0
  699. package/dist/hearth/control-plane/triggers/deliver.d.ts +43 -0
  700. package/dist/hearth/control-plane/triggers/deliver.js +76 -0
  701. package/dist/hearth/control-plane/triggers/envelope.d.ts +29 -0
  702. package/dist/hearth/control-plane/triggers/envelope.js +38 -0
  703. package/dist/hearth/control-plane/types.d.ts +66 -0
  704. package/dist/hearth/control-plane/types.js +1 -0
  705. package/dist/hearth/control-plane/wake.d.ts +80 -0
  706. package/dist/hearth/control-plane/wake.js +312 -0
  707. package/dist/hearth/wake-proxy/__tests__/anthropic-oauth.test.d.ts +1 -0
  708. package/dist/hearth/wake-proxy/__tests__/anthropic-oauth.test.js +289 -0
  709. package/dist/hearth/wake-proxy/__tests__/config-timeout.test.d.ts +1 -0
  710. package/dist/hearth/wake-proxy/__tests__/config-timeout.test.js +34 -0
  711. package/dist/hearth/wake-proxy/__tests__/guest-source.test.d.ts +1 -0
  712. package/dist/hearth/wake-proxy/__tests__/guest-source.test.js +203 -0
  713. package/dist/hearth/wake-proxy/__tests__/hardening.test.d.ts +1 -0
  714. package/dist/hearth/wake-proxy/__tests__/hardening.test.js +59 -0
  715. package/dist/hearth/wake-proxy/__tests__/hearth-status-route.test.d.ts +1 -0
  716. package/dist/hearth/wake-proxy/__tests__/hearth-status-route.test.js +372 -0
  717. package/dist/hearth/wake-proxy/__tests__/http-running-route-fast-path.test.d.ts +1 -0
  718. package/dist/hearth/wake-proxy/__tests__/http-running-route-fast-path.test.js +258 -0
  719. package/dist/hearth/wake-proxy/__tests__/model-auth-routes.test.d.ts +1 -0
  720. package/dist/hearth/wake-proxy/__tests__/model-auth-routes.test.js +437 -0
  721. package/dist/hearth/wake-proxy/__tests__/static-asset-allowlist.test.d.ts +1 -0
  722. package/dist/hearth/wake-proxy/__tests__/static-asset-allowlist.test.js +15 -0
  723. package/dist/hearth/wake-proxy/__tests__/warm-path-concurrency.test.d.ts +1 -0
  724. package/dist/hearth/wake-proxy/__tests__/warm-path-concurrency.test.js +141 -0
  725. package/dist/hearth/wake-proxy/__tests__/ws-teardown-accounting.test.d.ts +1 -0
  726. package/dist/hearth/wake-proxy/__tests__/ws-teardown-accounting.test.js +143 -0
  727. package/dist/hearth/wake-proxy/anthropic-oauth.d.ts +58 -0
  728. package/dist/hearth/wake-proxy/anthropic-oauth.js +189 -0
  729. package/dist/hearth/wake-proxy/auth.d.ts +22 -0
  730. package/dist/hearth/wake-proxy/auth.js +128 -0
  731. package/dist/hearth/wake-proxy/config.d.ts +2 -0
  732. package/dist/hearth/wake-proxy/config.js +151 -0
  733. package/dist/hearth/wake-proxy/guest-source.d.ts +14 -0
  734. package/dist/hearth/wake-proxy/guest-source.js +130 -0
  735. package/dist/hearth/wake-proxy/hearth-status.d.ts +44 -0
  736. package/dist/hearth/wake-proxy/hearth-status.js +267 -0
  737. package/dist/hearth/wake-proxy/home.d.ts +61 -0
  738. package/dist/hearth/wake-proxy/home.js +333 -0
  739. package/dist/hearth/wake-proxy/main.d.ts +1 -0
  740. package/dist/hearth/wake-proxy/main.js +134 -0
  741. package/dist/hearth/wake-proxy/model-auth.d.ts +13 -0
  742. package/dist/hearth/wake-proxy/model-auth.js +345 -0
  743. package/dist/hearth/wake-proxy/proxy.d.ts +35 -0
  744. package/dist/hearth/wake-proxy/proxy.js +716 -0
  745. package/dist/hearth/wake-proxy/public-source-gate.d.ts +9 -0
  746. package/dist/hearth/wake-proxy/public-source-gate.js +409 -0
  747. package/dist/hearth/wake-proxy/redact.d.ts +1 -0
  748. package/dist/hearth/wake-proxy/redact.js +17 -0
  749. package/dist/hearth/wake-proxy/server.d.ts +11 -0
  750. package/dist/hearth/wake-proxy/server.js +142 -0
  751. package/dist/hearth/wake-proxy/state.d.ts +18 -0
  752. package/dist/hearth/wake-proxy/state.js +342 -0
  753. package/dist/hearth/wake-proxy/types.d.ts +76 -0
  754. package/dist/hearth/wake-proxy/types.js +1 -0
  755. package/dist/index.js +3 -2
  756. package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +6 -5
  757. package/dist/pi-extensions/canvas-context-intro.js +7 -7
  758. package/dist/pi-extensions/canvas-doc-substrate.js +47 -24
  759. package/dist/pi-extensions/canvas-nav.js +16 -9
  760. package/dist/pi-extensions/canvas-stophook.d.ts +1 -1
  761. package/dist/pi-extensions/canvas-stophook.js +78 -11
  762. package/dist/prompts/view.js +7 -8
  763. package/dist/types.d.ts +39 -20
  764. package/dist/types.js +38 -13
  765. package/dist/web/runtime.js +141 -42
  766. package/dist/web/transport-http.js +7 -5
  767. package/dist/web/transport-stream.d.ts +3 -0
  768. package/dist/web/transport-stream.js +204 -0
  769. package/dist/web-client/assets/fragment-mono-latin-400-normal-BYwT3kSJ.woff +0 -0
  770. package/dist/web-client/assets/fragment-mono-latin-400-normal-yxdJ5AmL.woff2 +0 -0
  771. package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-BbKYyvR9.woff2 +0 -0
  772. package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-CT4YFKeK.woff +0 -0
  773. package/dist/web-client/assets/fraunces-latin-ext-wght-normal-Ca2vKHc0.woff2 +0 -0
  774. package/dist/web-client/assets/fraunces-latin-wght-normal-ukD16Tqj.woff2 +0 -0
  775. package/dist/web-client/assets/fraunces-vietnamese-wght-normal-CnvboYUG.woff2 +0 -0
  776. package/dist/web-client/assets/index-BRKxe-hy.js +80 -0
  777. package/dist/web-client/assets/index-BZUxTkv5.css +2 -0
  778. package/dist/web-client/assets/instrument-sans-latin-ext-wght-normal-B5bTHO_g.woff2 +0 -0
  779. package/dist/web-client/assets/instrument-sans-latin-wght-normal-BbzFLZTg.woff2 +0 -0
  780. package/dist/web-client/assets/martian-mono-cyrillic-wght-normal-B84CD5C_.woff2 +0 -0
  781. package/dist/web-client/assets/martian-mono-latin-ext-wght-normal-DlL6xMw5.woff2 +0 -0
  782. package/dist/web-client/assets/martian-mono-latin-wght-normal-5W32yIyr.woff2 +0 -0
  783. package/dist/web-client/index.html +3 -2
  784. package/package.json +37 -11
  785. package/scripts/postinstall.mjs +8 -0
  786. package/dist/clients/attach/__tests__/action-parity.test.js +0 -48
  787. package/dist/clients/attach/__tests__/clipboard-image.test.js +0 -76
  788. package/dist/clients/attach/__tests__/editor-newline.test.js +0 -82
  789. package/dist/clients/attach/__tests__/git-info.test.js +0 -31
  790. package/dist/clients/attach/__tests__/onrequest-wired.test.js +0 -20
  791. package/dist/clients/attach/__tests__/reconnect-giveup.test.js +0 -30
  792. package/dist/clients/attach/__tests__/slash-quit-copy.test.js +0 -42
  793. package/dist/clients/attach/__tests__/titled-editor.test.js +0 -39
  794. package/dist/commands/memory/__tests__/lint-schema.test.js +0 -52
  795. package/dist/core/__tests__/argv-parser.test.js +0 -217
  796. package/dist/core/__tests__/draw-style.test.js +0 -258
  797. package/dist/core/__tests__/error-stall-recycle.test.js +0 -141
  798. package/dist/core/__tests__/frame-decoder-perf.test.js +0 -224
  799. package/dist/core/__tests__/keystone.test.js +0 -185
  800. package/dist/core/__tests__/listing-completeness.test.js +0 -31
  801. package/dist/core/__tests__/memory-resolver.test.js +0 -108
  802. package/dist/core/__tests__/memory.test.js +0 -60
  803. package/dist/core/__tests__/pane-column.test.js +0 -153
  804. package/dist/core/__tests__/persona-compose.test.js +0 -53
  805. package/dist/core/__tests__/persona-subkind.test.js +0 -65
  806. package/dist/core/__tests__/persona.test.js +0 -107
  807. package/dist/core/__tests__/unknown-path.test.js +0 -58
  808. package/dist/core/canvas/wakeups.d.ts +0 -76
  809. package/dist/core/canvas/wakeups.js +0 -185
  810. package/dist/core/skill-sync/__tests__/dry-run-wrote-count.test.js +0 -57
  811. package/dist/core/skill-sync/builtins.js +0 -112
  812. package/dist/core/skill-sync/claude-plugins.d.ts +0 -23
  813. package/dist/core/skill-sync/claude-plugins.js +0 -71
  814. package/dist/core/skill-sync/engine.d.ts +0 -42
  815. package/dist/core/skill-sync/engine.js +0 -633
  816. package/dist/core/skill-sync/manifest.d.ts +0 -64
  817. package/dist/core/skill-sync/manifest.js +0 -181
  818. package/dist/core/skill-sync/profile.d.ts +0 -76
  819. package/dist/core/skill-sync/profile.js +0 -173
  820. package/dist/core/skill-sync/snapshot.d.ts +0 -57
  821. package/dist/core/skill-sync/snapshot.js +0 -120
  822. package/dist/pi-extensions/canvas-commands.d.ts +0 -37
  823. package/dist/pi-extensions/canvas-commands.js +0 -113
  824. package/dist/pi-extensions/canvas-resume.d.ts +0 -21
  825. package/dist/pi-extensions/canvas-resume.js +0 -83
  826. package/dist/pi-extensions/canvas-view.d.ts +0 -21
  827. package/dist/pi-extensions/canvas-view.js +0 -76
  828. package/dist/web-client/assets/index-BUvQb4hR.css +0 -2
  829. package/dist/web-client/assets/index-ClLQXYAE.js +0 -10
  830. /package/dist/clients/attach/__tests__/{action-parity.test.d.ts → crtr-output-coverage.test.d.ts} +0 -0
  831. /package/dist/clients/attach/__tests__/{clipboard-image.test.d.ts → crtr-output-render.test.d.ts} +0 -0
  832. /package/dist/clients/{attach/__tests__/editor-newline.test.d.ts → web/__tests__/source-cache.test.d.ts} +0 -0
  833. /package/dist/{clients/attach/__tests__/git-info.test.d.ts → commands/sys/__tests__/sync-import.test.d.ts} +0 -0
  834. /package/dist/{clients/attach/__tests__/onrequest-wired.test.d.ts → core/__tests__/boot.test.d.ts} +0 -0
  835. /package/dist/{clients/attach/__tests__/reconnect-giveup.test.d.ts → core/__tests__/broker-preflight.test.d.ts} +0 -0
  836. /package/dist/{clients/attach/__tests__/slash-quit-copy.test.d.ts → core/__tests__/chat-view-reconnect.test.d.ts} +0 -0
  837. /package/dist/{clients/attach/__tests__/titled-editor.test.d.ts → core/__tests__/connection-reconnect-resume.test.d.ts} +0 -0
  838. /package/dist/{commands/memory/__tests__/lint-schema.test.d.ts → core/__tests__/hearth-bootstrap.test.d.ts} +0 -0
  839. /package/dist/core/__tests__/{argv-parser.test.d.ts → preview-registry-sync.test.d.ts} +0 -0
  840. /package/dist/core/__tests__/{draw-style.test.d.ts → prune-to-limit.test.d.ts} +0 -0
  841. /package/dist/core/__tests__/{error-stall-recycle.test.d.ts → stranded-relaunch.test.d.ts} +0 -0
  842. /package/dist/core/__tests__/{frame-decoder-perf.test.d.ts → trigger-migration.test.d.ts} +0 -0
  843. /package/dist/core/__tests__/{keystone.test.d.ts → yield-ensures-daemon.test.d.ts} +0 -0
  844. /package/dist/core/{__tests__/listing-completeness.test.d.ts → hearth/__tests__/model-auth-guest.test.d.ts} +0 -0
  845. /package/dist/core/{__tests__/memory-resolver.test.d.ts → hearth/providers/types.js} +0 -0
  846. /package/dist/core/{__tests__/memory.test.d.ts → hearth/types.js} +0 -0
  847. /package/dist/core/{__tests__/pane-column.test.d.ts → host-exports/__tests__/export-prunes-boot-skill.test.d.ts} +0 -0
  848. /package/dist/core/{__tests__/persona-compose.test.d.ts → view/__tests__/transport-cache.test.d.ts} +0 -0
  849. /package/dist/{core/__tests__/persona-subkind.test.d.ts → daemon/__tests__/predicate-eval.test.d.ts} +0 -0
  850. /package/dist/{core/__tests__/persona.test.d.ts → hearth/control-plane/__tests__/node-message.test.d.ts} +0 -0
  851. /package/dist/{core/__tests__/unknown-path.test.d.ts → hearth/control-plane/__tests__/rate-limit-recurrence.test.d.ts} +0 -0
  852. /package/dist/{core/skill-sync/__tests__/dry-run-wrote-count.test.d.ts → hearth/control-plane/__tests__/relay-security.test.d.ts} +0 -0
@@ -20,6 +20,7 @@ import { mkdtempSync, mkdirSync, rmSync, writeFileSync, existsSync } from 'node:
20
20
  import { tmpdir } from 'node:os';
21
21
  import { join } from 'node:path';
22
22
  import { closeDb } from '../canvas/db.js';
23
+ import { resetScopeCache } from '../scope.js';
23
24
  import { injectedDocsPath } from '../canvas/paths.js';
24
25
  import { spawnNode } from '../runtime/nodes.js';
25
26
  import { renderOnReadDocs } from '../substrate/on-read.js';
@@ -27,20 +28,32 @@ import { loadInjectedDocs, saveInjectedDocs, clearInjectedDocs, } from '../subst
27
28
  const FIXTURE_BODY = 'Fixture body that must surface exactly once.';
28
29
  let home;
29
30
  let work;
31
+ let prevHomeEnv;
30
32
  before(() => {
31
33
  home = mkdtempSync(join(tmpdir(), 'crtr-onread-home-'));
32
34
  process.env['CRTR_HOME'] = home;
35
+ prevHomeEnv = process.env['HOME'];
33
36
  });
34
37
  beforeEach(() => {
35
38
  closeDb();
39
+ resetScopeCache();
36
40
  rmSync(home, { recursive: true, force: true });
41
+ if (prevHomeEnv === undefined)
42
+ delete process.env['HOME'];
43
+ else
44
+ process.env['HOME'] = prevHomeEnv;
37
45
  work = mkdtempSync(join(tmpdir(), 'crtr-onread-work-'));
38
46
  });
39
47
  after(() => {
40
48
  closeDb();
49
+ resetScopeCache();
41
50
  rmSync(home, { recursive: true, force: true });
42
51
  rmSync(work, { recursive: true, force: true });
43
52
  delete process.env['CRTR_HOME'];
53
+ if (prevHomeEnv === undefined)
54
+ delete process.env['HOME'];
55
+ else
56
+ process.env['HOME'] = prevHomeEnv;
44
57
  });
45
58
  test('injected-store round-trips and clears', () => {
46
59
  const node = spawnNode({ kind: 'general', cwd: work, parent: null }).node_id;
@@ -51,6 +64,33 @@ test('injected-store round-trips and clears', () => {
51
64
  assert.ok(!existsSync(injectedDocsPath(node)), 'clear removes the file');
52
65
  assert.deepEqual([...loadInjectedDocs(node)], [], 'load after clear is empty');
53
66
  });
67
+ test('user-global memory docs do not fire positionally for every file under home', () => {
68
+ const fakeHome = mkdtempSync(join(tmpdir(), 'crtr-onread-user-home-'));
69
+ process.env['HOME'] = fakeHome;
70
+ resetScopeCache();
71
+ const node = spawnNode({ kind: 'general', cwd: join(fakeHome, 'work'), parent: null }).node_id;
72
+ const userMemDir = join(fakeHome, '.crouter', 'memory');
73
+ mkdirSync(userMemDir, { recursive: true });
74
+ writeFileSync(join(userMemDir, 'noisy-global.md'), '---\nkind: preference\n' +
75
+ 'when-and-why-to-read: When reading any file, this preference should be read because this fixture must not fire positionally\n' +
76
+ 'file-read-visibility: content\n---\n' +
77
+ 'NOISY USER BODY\n');
78
+ const projectMemDir = join(fakeHome, 'work', '.crouter', 'memory');
79
+ mkdirSync(projectMemDir, { recursive: true });
80
+ writeFileSync(join(projectMemDir, 'local.md'), '---\nkind: knowledge\n' +
81
+ 'when-and-why-to-read: When reading project files, this reference should be read because local project memories remain positional\n' +
82
+ 'file-read-visibility: content\n---\n' +
83
+ 'LOCAL PROJECT BODY\n');
84
+ const readFile = join(fakeHome, 'work', 'ideas.md');
85
+ writeFileSync(readFile, 'turn off xml closer\n');
86
+ const rendered = renderOnReadDocs(node, readFile, new Set());
87
+ assert.ok(!rendered.includes('NOISY USER BODY'), 'user-global doc is not positional');
88
+ assert.ok(rendered.includes('LOCAL PROJECT BODY'), 'project doc still fires positionally');
89
+ assert.ok(rendered.includes('<memory kind="knowledge" name="local"'), 'memory docs render as memory tags');
90
+ assert.ok(!rendered.includes('triggered-by='), 'read target is not repeated on child items');
91
+ assert.ok(!rendered.includes('<auto-loaded-context file='), 'read target is not repeated on the wrapper');
92
+ rmSync(fakeHome, { recursive: true, force: true });
93
+ });
54
94
  test('on-read doc surfaces once, stays deduped across a revive(resume), re-surfaces after a fresh launch', () => {
55
95
  const node = spawnNode({ kind: 'general', cwd: work, parent: null }).node_id;
56
96
  // A positional substrate doc in a `.crouter/memory/` ancestor of the read file.
@@ -0,0 +1,36 @@
1
+ // Drift guard for the attach-viewer's bundle-safe preview registry.
2
+ // Run with: node --import tsx/esm --test src/core/__tests__/preview-registry-sync.test.ts
3
+ //
4
+ // src/core/preview-registry.ts is a hand-maintained, zero-import mirror of
5
+ // every leaf's `help.preview.suppressOutput` — it has to be hand-maintained
6
+ // (not computed) because the attach viewer can never import the live command
7
+ // tree (build-root.ts pulls in every subtree, including the web client's
8
+ // Tailwind native binary — see command-preview-implementation.md). This test
9
+ // is the only thing that keeps the mirror honest: it walks the real,
10
+ // buildRoot()-assembled tree (safe here — this is a test, not the attach
11
+ // bundle) and asserts the set of leaves declaring `suppressOutput: true`
12
+ // matches the registry exactly.
13
+ import { test } from 'node:test';
14
+ import assert from 'node:assert/strict';
15
+ import { buildRoot } from '../../build-root.js';
16
+ import { SUPPRESS_OUTPUT_LEAVES } from '../preview-registry.js';
17
+ test('preview-registry.ts matches every leaf declaring help.preview.suppressOutput', async () => {
18
+ const root = await buildRoot();
19
+ const declared = new Set();
20
+ const walk = (branch) => {
21
+ for (const child of branch.children) {
22
+ if (child.kind === 'branch') {
23
+ walk(child);
24
+ }
25
+ else {
26
+ const leaf = child;
27
+ if (leaf.help.preview?.suppressOutput === true)
28
+ declared.add(leaf.help.name);
29
+ }
30
+ }
31
+ };
32
+ for (const subtree of root.subtrees)
33
+ walk(subtree);
34
+ assert.deepEqual([...declared].sort(), [...SUPPRESS_OUTPUT_LEAVES].sort(), 'src/core/preview-registry.ts is out of sync with the leaves that declare ' +
35
+ 'help.preview.suppressOutput — update SUPPRESS_OUTPUT_LEAVES to match.');
36
+ });
@@ -0,0 +1,91 @@
1
+ import { test, before, after, beforeEach } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { mkdtempSync, rmSync, existsSync } from 'node:fs';
4
+ import { tmpdir } from 'node:os';
5
+ import { join } from 'node:path';
6
+ import { createNode, getRow, recordPid, pruneToLimit, } from '../canvas/canvas.js';
7
+ import { closeDb } from '../canvas/db.js';
8
+ import { nodeDir } from '../canvas/paths.js';
9
+ let home;
10
+ // A timestamp `secondsAgo` before now — created order doubles as recency order
11
+ // here (no telemetry.json is written, so recencyMs falls back to created epoch).
12
+ const at = (secondsAgo) => new Date(Date.now() - secondsAgo * 1000).toISOString();
13
+ function node(id, over = {}) {
14
+ return {
15
+ node_id: id,
16
+ name: id,
17
+ created: at(0),
18
+ cwd: '/tmp/work',
19
+ kind: 'general',
20
+ mode: 'base',
21
+ lifecycle: 'terminal',
22
+ status: 'dead',
23
+ ...over,
24
+ };
25
+ }
26
+ before(() => {
27
+ home = mkdtempSync(join(tmpdir(), 'crtr-prune-limit-'));
28
+ process.env['CRTR_HOME'] = home;
29
+ });
30
+ beforeEach(() => {
31
+ closeDb();
32
+ rmSync(home, { recursive: true, force: true });
33
+ });
34
+ after(() => {
35
+ closeDb();
36
+ rmSync(home, { recursive: true, force: true });
37
+ delete process.env['CRTR_HOME'];
38
+ delete process.env['CRTR_NODE_ID'];
39
+ });
40
+ test('keeps all live nodes even when liveCount exceeds the cap', () => {
41
+ // 5 live (active/idle with a running pi) + 2 old terminal; cap of 3.
42
+ // target = max(3, 5) = 5, so NO live node is ever deleted; the 2 terminal
43
+ // fall beyond rank 5 and are pruned.
44
+ for (let i = 0; i < 5; i++) {
45
+ createNode(node(`live-${i}`, { status: 'active', created: at(i) }));
46
+ recordPid(`live-${i}`, process.pid); // process.pid is alive → isPidAlive true
47
+ }
48
+ createNode(node('old-a', { status: 'dead', created: at(100) }));
49
+ createNode(node('old-b', { status: 'done', created: at(101) }));
50
+ const result = pruneToLimit({ maxNodes: 3 });
51
+ assert.equal(result.dryRun, false);
52
+ assert.deepEqual(result.pruned.map((p) => p.node_id).sort(), ['old-a', 'old-b']);
53
+ for (let i = 0; i < 5; i++) {
54
+ assert.ok(getRow(`live-${i}`) !== null, `live-${i} must survive past the cap`);
55
+ }
56
+ });
57
+ test('deletes the oldest terminal nodes beyond max(cap, liveCount)', () => {
58
+ // 1 live + 5 terminal of descending recency; cap of 3 → target = max(3,1) = 3.
59
+ // Ranked by recency DESC: live-0, term-0, term-1 (top 3, kept), then
60
+ // term-2, term-3, term-4 (rank >= 3, pruned).
61
+ createNode(node('live-0', { status: 'idle', created: at(0) }));
62
+ recordPid('live-0', process.pid);
63
+ for (let i = 0; i < 5; i++) {
64
+ createNode(node(`term-${i}`, { status: 'dead', created: at(10 + i) }));
65
+ }
66
+ const result = pruneToLimit({ maxNodes: 3 });
67
+ assert.deepEqual(result.pruned.map((p) => p.node_id).sort(), ['term-2', 'term-3', 'term-4']);
68
+ // The kept set: the live node + the two newest terminal.
69
+ for (const id of ['live-0', 'term-0', 'term-1']) {
70
+ assert.ok(getRow(id) !== null, `${id} must survive`);
71
+ assert.ok(existsSync(nodeDir(id)), `${id} dir must survive`);
72
+ }
73
+ // The pruned set: rows AND dirs gone.
74
+ for (const id of ['term-2', 'term-3', 'term-4']) {
75
+ assert.equal(getRow(id), null, `${id} row should be pruned`);
76
+ assert.ok(!existsSync(nodeDir(id)), `${id} dir should be removed`);
77
+ }
78
+ });
79
+ test('--dry-run reports candidates but deletes nothing', () => {
80
+ for (let i = 0; i < 5; i++) {
81
+ createNode(node(`term-${i}`, { status: 'dead', created: at(i) }));
82
+ }
83
+ const result = pruneToLimit({ maxNodes: 3, dryRun: true });
84
+ assert.equal(result.dryRun, true);
85
+ assert.deepEqual(result.pruned.map((p) => p.node_id).sort(), ['term-3', 'term-4']);
86
+ // Nothing deleted — all rows + dirs intact.
87
+ for (let i = 0; i < 5; i++) {
88
+ assert.ok(getRow(`term-${i}`) !== null, `term-${i} must survive a dry run`);
89
+ assert.ok(existsSync(nodeDir(`term-${i}`)), `term-${i} dir must survive a dry run`);
90
+ }
91
+ });
@@ -11,7 +11,7 @@ import { tmpdir } from 'node:os';
11
11
  import { join } from 'node:path';
12
12
  import { createNode, setStatus } from '../canvas/canvas.js';
13
13
  import { closeDb } from '../canvas/db.js';
14
- import { registerPush } from '../../commands/push.js';
14
+ import { registerPush, mapFinalizeTransitionRaceError } from '../../commands/push.js';
15
15
  import { InputError } from '../io.js';
16
16
  let home;
17
17
  const prevNodeId = process.env['CRTR_NODE_ID'];
@@ -69,3 +69,9 @@ test('push final on a dead node is also caught cleanly', async () => {
69
69
  process.env['CRTR_NODE_ID'] = id;
70
70
  await assert.rejects(() => finalLeaf().run({ body: 'x' }), (e) => e instanceof InputError && e.payload.error === 'already_finalized');
71
71
  });
72
+ test('a raw finalize-transition race is normalized to already_finalized', () => {
73
+ const mapped = mapFinalizeTransitionRaceError('canceled', new Error("illegal lifecycle transition: 'finalize' from status='canceled' (node raceNode)"));
74
+ assert.ok(mapped instanceof InputError, 'the raw transition error is converted');
75
+ assert.equal(mapped?.payload.error, 'already_finalized');
76
+ assert.equal(mapped?.payload.message, 'This node is already canceled — `push final` finishes a node once and cannot finalize it again.');
77
+ });
@@ -36,7 +36,7 @@ function makeDeps(pid) {
36
36
  const deps = {
37
37
  launchBroker: (nodeId) => {
38
38
  launched.push(nodeId);
39
- return { pid };
39
+ return { pid, exited: new Promise(() => { }) };
40
40
  },
41
41
  waitForViewSocket: () => true,
42
42
  respawnViewer: () => true,
@@ -57,7 +57,7 @@ after(() => {
57
57
  rmSync(home, { recursive: true, force: true });
58
58
  delete process.env['CRTR_HOME'];
59
59
  });
60
- test('relaunchRoot parks the old root done and mints a fresh active root, reaping descendants', () => {
60
+ test('relaunchRoot parks the old root done and mints a fresh active root, reaping descendants', async () => {
61
61
  // root → child → grandchild (a parent that subscribes to its workers).
62
62
  createNode(node('root', { parent: null, lifecycle: 'resident', cwd: '/tmp/proj' }));
63
63
  createNode(node('child', { parent: 'root' }));
@@ -65,7 +65,7 @@ test('relaunchRoot parks the old root done and mints a fresh active root, reapin
65
65
  subscribe('root', 'child', true);
66
66
  subscribe('child', 'grand', true);
67
67
  const { deps, launched } = makeDeps(4242);
68
- const res = relaunchRoot('root', deps);
68
+ const res = await relaunchRoot('root', deps);
69
69
  // A fresh, DIFFERENT node id was minted and booted.
70
70
  assert.ok(res, 'relaunchRoot returns the new node id');
71
71
  const newId = res.newNodeId;
@@ -86,14 +86,14 @@ test('relaunchRoot parks the old root done and mints a fresh active root, reapin
86
86
  assert.equal(getNode('child')?.status, 'canceled', 'descendant child canceled');
87
87
  assert.equal(getNode('grand')?.status, 'canceled', 'descendant grandchild canceled');
88
88
  });
89
- test('relaunchRoot on a boot failure leaves the old root + descendants fully intact', () => {
89
+ test('relaunchRoot on a boot failure leaves the old root + descendants fully intact', async () => {
90
90
  // The mint-and-boot-FIRST ordering: a launch failure (pid=null) must occur
91
91
  // BEFORE the old root is parked or its descendants reaped.
92
92
  createNode(node('root', { parent: null, lifecycle: 'resident' }));
93
93
  createNode(node('child', { parent: 'root' }));
94
94
  subscribe('root', 'child', true);
95
95
  const { deps, launched } = makeDeps(null); // broker never starts
96
- const res = relaunchRoot('root', deps);
96
+ const res = await relaunchRoot('root', deps);
97
97
  assert.equal(res, null, 'a boot failure returns null');
98
98
  // Old root + descendant untouched: still live, ready to keep running.
99
99
  assert.equal(getNode('root')?.status, 'active', 'old root left active + untouched');
@@ -102,13 +102,13 @@ test('relaunchRoot on a boot failure leaves the old root + descendants fully int
102
102
  assert.equal(launched.length, 1, 'one broker launch was attempted');
103
103
  assert.equal(getNode(launched[0])?.status, 'dead', 'the half-born new node is crashed (dead)');
104
104
  });
105
- test('relaunchRoot is a no-op for a non-root child and an already-parked root', () => {
105
+ test('relaunchRoot is a no-op for a non-root child and an already-parked root', async () => {
106
106
  createNode(node('root', { parent: null, lifecycle: 'resident' }));
107
107
  createNode(node('child', { parent: 'root' }));
108
108
  createNode(node('done-root', { parent: null, status: 'done' }));
109
109
  const { deps, launched } = makeDeps(1);
110
- assert.equal(relaunchRoot('child', deps), null, 'a child is not a relaunchable root');
111
- assert.equal(relaunchRoot('done-root', deps), null, 'a done root is not relaunched again (double /new)');
112
- assert.equal(relaunchRoot('ghost', deps), null, 'an unknown node is a no-op');
110
+ assert.equal(await relaunchRoot('child', deps), null, 'a child is not a relaunchable root');
111
+ assert.equal(await relaunchRoot('done-root', deps), null, 'a done root is not relaunched again (double /new)');
112
+ assert.equal(await relaunchRoot('ghost', deps), null, 'an unknown node is a no-op');
113
113
  assert.deepEqual(launched, [], 'no broker was booted for any of the no-op cases');
114
114
  });
@@ -1,11 +1,11 @@
1
1
  // Run with: node --import tsx/esm --test src/core/__tests__/revive.test.ts
2
2
  //
3
3
  // HEADLESS RETARGET (foundation-spec §C.13 + §E). Covers the session-picker fix
4
- // (resume by ABSOLUTE session-file path, cwd-immune, falling back to the bare
5
- // uuid for older nodes) AND the double-revive guard that keeps two pi processes
6
- // off one session file. The argv selection is unit-tested via the pure
7
- // `resumeArgs` + `buildPiArgv`; the guard + the cycle-counter bump are now driven
8
- // against a fabricated BROKER-hosted node — ZERO real tmux, ZERO real boot.
4
+ // (resume by ABSOLUTE session-file path, cwd-immune) and the double-revive guard
5
+ // that keeps two pi processes off one session file. The argv selection is
6
+ // unit-tested via the pure `resumeArgs` + `buildPiArgv`; the guard + the
7
+ // cycle-counter bump are now driven against a fabricated BROKER-hosted node —
8
+ // ZERO real tmux, ZERO real boot.
9
9
  //
10
10
  // (1) BUG LOCKED — the double-revive guard (revive.ts:114): a node already up
11
11
  // (its engine container alive AND its pi pid live) must NOT be re-launched —
@@ -30,13 +30,14 @@
30
30
  // goes RED.
31
31
  import { test, before, after, beforeEach } from 'node:test';
32
32
  import assert from 'node:assert/strict';
33
- import { mkdtempSync, rmSync } from 'node:fs';
33
+ import { mkdtempSync, rmSync, writeFileSync, mkdirSync } from 'node:fs';
34
34
  import { tmpdir } from 'node:os';
35
35
  import { join } from 'node:path';
36
36
  import { spawn, spawnSync } from 'node:child_process';
37
37
  import { createNode } from '../canvas/canvas.js';
38
38
  import { closeDb } from '../canvas/db.js';
39
39
  import { buildPiArgv } from '../runtime/launch.js';
40
+ import { headlessBrokerHost } from '../runtime/host.js';
40
41
  import { resumeArgs, reviveNode } from '../runtime/revive.js';
41
42
  import { createHarness } from './helpers/harness.js';
42
43
  let home;
@@ -92,41 +93,54 @@ after(() => {
92
93
  // ---------------------------------------------------------------------------
93
94
  // resumeArgs — the pure resume-source selection
94
95
  // ---------------------------------------------------------------------------
95
- test('resumeArgs prefers the absolute file path and keeps the id as fallback', () => {
96
- const m = node('n', { pi_session_id: 'uuid-123', pi_session_file: '/abs/sess.jsonl' });
97
- assert.deepEqual(resumeArgs(m, true), {
98
- resumeSessionId: 'uuid-123',
99
- resumeSessionPath: '/abs/sess.jsonl',
100
- });
96
+ test('resumeArgs resumes by the absolute file path when it exists on disk', () => {
97
+ mkdirSync(home, { recursive: true });
98
+ const sessionFile = join(home, 'resume-args-exists.jsonl');
99
+ writeFileSync(sessionFile, '{}\n', 'utf8');
100
+ const m = node('n', { pi_session_id: 'uuid-123', pi_session_file: sessionFile });
101
+ assert.deepEqual(resumeArgs(m, true), { resumeSessionPath: sessionFile });
101
102
  });
102
- test('resumeArgs falls back to the bare id when no file was captured (older node)', () => {
103
+ test('resumeArgs selects nothing (falls through to fresh) when no file was ever captured (older node)', () => {
103
104
  const m = node('n', { pi_session_id: 'uuid-123', pi_session_file: null });
104
- assert.deepEqual(resumeArgs(m, true), {
105
- resumeSessionId: 'uuid-123',
106
- resumeSessionPath: undefined,
105
+ assert.deepEqual(resumeArgs(m, true), {});
106
+ });
107
+ test('resumeArgs selects nothing (falls through to fresh) when the recorded file does not exist on disk', () => {
108
+ // The related P6 finding: pi_session_file can be recorded in meta with
109
+ // nothing ever written there (the first-boot engine died before
110
+ // session_start). A bare id is NOT a safe fallback either —
111
+ // headlessBrokerHost's preflight fatally rejects it — so this must select
112
+ // NEITHER source, not silently hand pi a path that isn't there.
113
+ const m = node('n', {
114
+ pi_session_id: 'uuid-123',
115
+ pi_session_file: join(home, 'never-written.jsonl'),
107
116
  });
117
+ assert.deepEqual(resumeArgs(m, true), {});
108
118
  });
109
119
  test('resumeArgs selects neither source on a no-resume (refresh) revive', () => {
110
- const m = node('n', { pi_session_id: 'uuid-123', pi_session_file: '/abs/sess.jsonl' });
120
+ mkdirSync(home, { recursive: true });
121
+ const sessionFile = join(home, 'resume-args-refresh.jsonl');
122
+ writeFileSync(sessionFile, '{}\n', 'utf8');
123
+ const m = node('n', { pi_session_id: 'uuid-123', pi_session_file: sessionFile });
111
124
  assert.deepEqual(resumeArgs(m, false), {});
112
125
  });
113
126
  // ---------------------------------------------------------------------------
114
127
  // buildPiArgv — the `--session` argument the revive builds
115
128
  // ---------------------------------------------------------------------------
116
- test('buildPiArgv resumes by ABSOLUTE path when pi_session_file is set (not the uuid)', () => {
117
- const m = node('n', { pi_session_id: 'uuid-123', pi_session_file: '/abs/sess.jsonl' });
129
+ test('buildPiArgv resumes by ABSOLUTE path when pi_session_file exists on disk', () => {
130
+ mkdirSync(home, { recursive: true });
131
+ const sessionFile = join(home, 'build-argv-exists.jsonl');
132
+ writeFileSync(sessionFile, '{}\n', 'utf8');
133
+ const m = node('n', { pi_session_id: 'uuid-123', pi_session_file: sessionFile });
118
134
  const { argv } = buildPiArgv(m, resumeArgs(m, true));
119
135
  const i = argv.indexOf('--session');
120
136
  assert.ok(i >= 0, 'argv carries --session');
121
- assert.equal(argv[i + 1], '/abs/sess.jsonl', 'resumes by absolute file path');
122
- assert.ok(!argv.includes('uuid-123'), 'the bare uuid is NOT used when a path exists');
137
+ assert.equal(argv[i + 1], sessionFile, 'resumes by absolute file path');
138
+ assert.ok(!argv.includes('uuid-123'), 'the bare uuid is never used to resume');
123
139
  });
124
- test('buildPiArgv falls back to --session <uuid> when no path is stored', () => {
140
+ test('buildPiArgv passes no --session when no path is stored (falls through to fresh)', () => {
125
141
  const m = node('n', { pi_session_id: 'uuid-123', pi_session_file: null });
126
142
  const { argv } = buildPiArgv(m, resumeArgs(m, true));
127
- const i = argv.indexOf('--session');
128
- assert.ok(i >= 0, 'argv carries --session');
129
- assert.equal(argv[i + 1], 'uuid-123', 'resumes by bare uuid (older node)');
143
+ assert.ok(!argv.includes('--session'), 'no bare-uuid resume — a bare id is fatally rejected by broker preflight');
130
144
  });
131
145
  test('buildPiArgv passes no --session on a fresh (no-resume) launch', () => {
132
146
  const m = node('n', { pi_session_id: 'uuid-123', pi_session_file: '/abs/sess.jsonl' });
@@ -139,11 +153,14 @@ test('buildPiArgv passes no --session on a fresh (no-resume) launch', () => {
139
153
  // (kind/mode/lifecycle come back as the node's *current* self).
140
154
  // ---------------------------------------------------------------------------
141
155
  test('a resumed revive replays the persisted LaunchSpec (model, tools, extensions, prompt, env)', () => {
156
+ mkdirSync(home, { recursive: true });
157
+ const sessionFile = join(home, 'launchspec-replay.jsonl');
158
+ writeFileSync(sessionFile, '{}\n', 'utf8');
142
159
  const m = node('n', {
143
160
  kind: 'developer',
144
161
  mode: 'orchestrator',
145
162
  pi_session_id: 'uuid-9',
146
- pi_session_file: '/abs/sess.jsonl',
163
+ pi_session_file: sessionFile,
147
164
  launch: {
148
165
  model: 'anthropic/sonnet',
149
166
  tools: ['bash', 'read'],
@@ -166,7 +183,7 @@ test('a resumed revive replays the persisted LaunchSpec (model, tools, extension
166
183
  assert.equal(argv[ti + 1], 'bash,read');
167
184
  assert.ok(argv.includes('--append-system-prompt'), 'system prompt replayed');
168
185
  const si = argv.indexOf('--session');
169
- assert.equal(argv[si + 1], '/abs/sess.jsonl', 'still resumes by file path');
186
+ assert.equal(argv[si + 1], sessionFile, 'still resumes by file path');
170
187
  // Env contract: launch-spec env merged over the node identity env.
171
188
  assert.equal(env['FOO'], 'bar');
172
189
  assert.equal(env['CRTR_NODE_ID'], 'n');
@@ -211,11 +228,15 @@ test('reviveNode PROCEEDS when the broker engine is DOWN (dead pid) — cycle co
211
228
  // circuit → reviveNode proceeds. It bumps cycles BEFORE the detached (fake-
212
229
  // engine) launch, so the bump is observable instantly; the throwaway broker is
213
230
  // killed by dispose().
231
+ const sessionFile = join(home, 'sessions', 'crtr-revive-proceed.jsonl');
232
+ mkdirSync(join(home, 'sessions'), { recursive: true });
233
+ writeFileSync(sessionFile, '{}\n', 'utf8');
214
234
  const M = h.fabricateBrokerNode({
215
235
  status: 'active',
216
236
  intent: null,
217
237
  pi_pid: deadPid(),
218
238
  pi_session_id: 'uuid-1',
239
+ pi_session_file: sessionFile,
219
240
  });
220
241
  assert.equal(h.node(M).cycles ?? 0, 0, 'fabricated at cycle 0 (no revive yet)');
221
242
  reviveNode(M, { resume: true });
@@ -225,3 +246,55 @@ test('reviveNode PROCEEDS when the broker engine is DOWN (dead pid) — cycle co
225
246
  await h.dispose();
226
247
  }
227
248
  });
249
+ test('reviveNode fresh-fallback clears the stale session identity (Major-3: no phantom stranded-relaunch)', async () => {
250
+ const h = await createHarness({ headless: true, sessionPrefix: 'crtr-revive-freshfb' });
251
+ try {
252
+ // resume=true was ASKED, but the recorded .jsonl is gone from disk, so
253
+ // resumeArgs falls through to a FRESH launch. The stale pi_session_id /
254
+ // pi_session_file must be cleared BEFORE launch: if this fresh broker then
255
+ // dies before session_start (no new pid, no new session), the daemon keys on
256
+ // pi_session_id — a leftover id would be misread as a stranded relaunch and
257
+ // retried forever instead of surfaced as a boot failure.
258
+ const missingFile = join(home, 'sessions', 'never-written.jsonl');
259
+ const M = h.fabricateBrokerNode({
260
+ status: 'active',
261
+ intent: null,
262
+ pi_pid: deadPid(),
263
+ pi_session_id: 'uuid-stale',
264
+ pi_session_file: missingFile,
265
+ });
266
+ const res = reviveNode(M, { resume: true });
267
+ assert.equal(res.resumed, false, 'a missing .jsonl forces a fresh (non-resuming) launch');
268
+ const after = h.node(M);
269
+ assert.equal(after.pi_session_id, null, 'stale pi_session_id cleared before the fresh launch');
270
+ assert.equal(after.pi_session_file, null, 'stale pi_session_file cleared before the fresh launch');
271
+ }
272
+ finally {
273
+ await h.dispose();
274
+ }
275
+ });
276
+ test('reviveNode crashes and clears pid when launch/preflight throws', async () => {
277
+ const h = await createHarness({ headless: true, sessionPrefix: 'crtr-revive-fail' });
278
+ const originalLaunch = headlessBrokerHost.launch;
279
+ try {
280
+ const sessionFile = join(home, 'sessions', 'crtr-revive-fail.jsonl');
281
+ mkdirSync(join(home, 'sessions'), { recursive: true });
282
+ writeFileSync(sessionFile, '{}\n', 'utf8');
283
+ const M = h.fabricateBrokerNode({
284
+ status: 'active',
285
+ intent: null,
286
+ pi_pid: deadPid(),
287
+ pi_session_id: 'uuid-2',
288
+ pi_session_file: sessionFile,
289
+ });
290
+ headlessBrokerHost.launch = (_nodeId, _inv, _opts) => { throw new Error('boom'); };
291
+ assert.throws(() => reviveNode(M, { resume: true }), /refusing to revive/i);
292
+ const after = h.node(M);
293
+ assert.equal(after.status, 'dead', 'failed revive marks the node dead');
294
+ assert.equal(after.pi_pid, null, 'failed revive clears the stale pid');
295
+ }
296
+ finally {
297
+ headlessBrokerHost.launch = originalLaunch;
298
+ await h.dispose();
299
+ }
300
+ });
@@ -10,7 +10,8 @@ import { createNode, getNode, getRow, subscribersOf } from '../canvas/canvas.js'
10
10
  import { closeDb } from '../canvas/db.js';
11
11
  import { nodeDir } from '../canvas/paths.js';
12
12
  import { spawnNode } from '../runtime/nodes.js';
13
- import { resolveSpawner } from '../runtime/spawn.js';
13
+ import { spawnChild, resolveSpawner } from '../runtime/spawn.js';
14
+ import { headlessBrokerHost } from '../runtime/host.js';
14
15
  let home;
15
16
  function spawner(id) {
16
17
  return {
@@ -81,3 +82,25 @@ test('unknown parent: spawnNode throws and mints NO node dir / row (validate bef
81
82
  assert.equal(getRow(orphanId), null, 'no index row written for the orphan');
82
83
  assert.equal(existsSync(nodeDir(orphanId)), false, 'no node dir scaffolded for the orphan');
83
84
  });
85
+ test('spawnChild crashes the node when launch/preflight throws', async () => {
86
+ const parentId = 'A';
87
+ createNode(spawner(parentId));
88
+ const originalLaunch = headlessBrokerHost.launch;
89
+ let launchedNodeId = null;
90
+ try {
91
+ headlessBrokerHost.launch = (nodeId, _inv, _opts) => {
92
+ launchedNodeId = nodeId;
93
+ throw new Error('boom');
94
+ };
95
+ await assert.rejects(async () => spawnChild({ kind: 'developer', cwd: '/tmp/work', parent: parentId, prompt: 'task' }), /refusing to launch/i);
96
+ assert.ok(launchedNodeId !== null, 'the launch hook saw the spawned node id');
97
+ const after = getNode(launchedNodeId);
98
+ assert.equal(after.status, 'dead', 'failed spawn marks the node dead');
99
+ assert.equal(after.pi_pid, null, 'failed spawn clears the stale pid');
100
+ }
101
+ finally {
102
+ headlessBrokerHost.launch = originalLaunch;
103
+ closeDb();
104
+ rmSync(home, { recursive: true, force: true });
105
+ }
106
+ });
@@ -80,3 +80,13 @@ test('pushedFinal → finished; askedHuman → escalated (both short-circuit bef
80
80
  assert.deepEqual(evaluateStop('t', { pushedFinal: true, askedHuman: false }), { action: 'allow', reason: 'finished' });
81
81
  assert.deepEqual(evaluateStop('t', { pushedFinal: false, askedHuman: true }), { action: 'allow', reason: 'escalated' });
82
82
  });
83
+ test('already-terminal stored statuses are allowed without a stall reprompt', () => {
84
+ for (const [id, status] of [
85
+ ['doneNode', 'done'],
86
+ ['deadNode', 'dead'],
87
+ ['canceledNode', 'canceled'],
88
+ ]) {
89
+ createNode(node(id, { parent: 'mgr', lifecycle: 'terminal', status }));
90
+ assert.deepEqual(evaluateStop(id, noSignals), { action: 'allow', reason: 'finished' });
91
+ }
92
+ });
@@ -0,0 +1,72 @@
1
+ // Run with: node --import tsx/esm --test src/core/__tests__/stranded-relaunch.test.ts
2
+ //
3
+ // BUG-REGRESSION (observed 2026-06-15 on the live canvas). A broker-hosted node
4
+ // whose row carries pi_pid=NULL but pi_session_id SET was read by
5
+ // handleNodeLiveness as "a relaunch in flight — leave it" UNCONDITIONALLY, with
6
+ // no timeout. reviveNode clears pi_pid right after launch and the fresh engine
7
+ // re-records it within a tick or two — but a relaunch whose broker DIED in that
8
+ // gap (after the pid-clear, before re-record) never re-records, so the node sat
9
+ // 'active' with no engine FOREVER and its parent waited on a dead child. Six such
10
+ // stranded resident roots had accumulated and the daemon would never recover or
11
+ // reap any of them.
12
+ //
13
+ // THE FIX — give the pid==null + session-set case the SAME REVIVE_GRACE_MS boot
14
+ // grace as the never-booted case: a healthy relaunch always re-records its pid
15
+ // well inside the grace (and the pid-alive branch clears the clock); if the grace
16
+ // ELAPSES with still no pid, the relaunch is dead → grace-revive RESUME on the
17
+ // saved session. The 20s grace doubles as the double-spawn guard.
18
+ //
19
+ // WHY MODEL-LEVEL, NOT TMUX CHROME — the stranding lives entirely in pure daemon
20
+ // logic (the pid==null branch of handleNodeLiveness + the unhealthySince clock).
21
+ // A fabricated broker row carrying pi_pid=null + a recorded pi_session_id
22
+ // reproduces the exact stranded state with no process at all; h.tick(now) walks a
23
+ // deterministic clock across the grace boundary and getNode().cycles (reviveNode
24
+ // bumps cycles + transition('revive') BEFORE the detached spawn) makes the revive
25
+ // observable instantly.
26
+ //
27
+ // HOW IT FAILS IF THE BUG REGRESSES — restore the unconditional
28
+ // `if (meta.pi_session_id != null) return;` and the PAST-grace tick never revives
29
+ // → cycles stays 0 → the final assert goes RED.
30
+ import { test } from 'node:test';
31
+ import assert from 'node:assert/strict';
32
+ import { createHarness } from './helpers/harness.js';
33
+ // REVIVE_GRACE_MS is 20_000 (crtrd.ts). Offsets well inside / well past it keep
34
+ // the test robust to the exact value without importing it.
35
+ const NOW = 7_000_000;
36
+ const WITHIN_GRACE = NOW + 10_000; // < 20s after first-observed-null → still pending
37
+ const PAST_GRACE = NOW + 25_000; // > 20s after first-observed-null → revive
38
+ test('stranded relaunch: pid=null + session set is revived once the boot grace elapses, not left active forever', { timeout: 30_000 }, async () => {
39
+ const h = await createHarness({ headless: true, sessionPrefix: 'crtr-stranded' });
40
+ try {
41
+ // The EXACT stranded state: a broker row that booted once (pi_session_id
42
+ // captured) whose relaunch then died after the pid-clear — pi_pid NULL,
43
+ // intent null (so it is neither the refresh nor the idle-release path).
44
+ const B = h.fabricateBrokerNode({
45
+ kind: 'developer',
46
+ status: 'active',
47
+ intent: null,
48
+ pi_pid: null,
49
+ pi_session_id: 'sess-stranded-B',
50
+ });
51
+ const b0 = h.node(B);
52
+ assert.equal(b0.host_kind, 'broker', 'B is broker-hosted (paneless)');
53
+ assert.equal(b0.pi_pid ?? null, null, 'row pi_pid is null (relaunch never re-recorded)');
54
+ assert.equal(b0.pi_session_id, 'sess-stranded-B', 'session is set (booted once)');
55
+ assert.equal(b0.cycles ?? 0, 0, 'no revive yet — cycles at 0');
56
+ // --- TICK 1 @ NOW: first observation of null pid → start the boot grace
57
+ // clock, do NOT revive (a healthy relaunch re-records its pid here). ---
58
+ await h.tick(NOW);
59
+ assert.equal(h.node(B).cycles ?? 0, 0, 'first tick: no revive — grace clock started');
60
+ // --- TICK 2 @ NOW+10s (WITHIN grace): still pending. This is the
61
+ // double-spawn guard — a healthy relaunch would have re-recorded by now. ---
62
+ await h.tick(WITHIN_GRACE);
63
+ assert.equal(h.node(B).cycles ?? 0, 0, 'within REVIVE_GRACE_MS: still no revive (healthy relaunch grace, not a strand yet)');
64
+ // --- TICK 3 @ NOW+25s (PAST grace): the relaunch is dead → grace-revive
65
+ // RESUME on the saved session; reviveNode bumps cycles immediately. ---
66
+ await h.tick(PAST_GRACE);
67
+ assert.equal(h.node(B).cycles ?? 0, 1, 'past REVIVE_GRACE_MS: the stranded relaunch is revived (cycles bumped) — NOT left active forever');
68
+ }
69
+ finally {
70
+ await h.dispose();
71
+ }
72
+ });
@@ -68,7 +68,11 @@ test('§2.2 driver invariant: every placement verb in tmux.ts passes an explicit
68
68
  found++;
69
69
  const verb = m[1];
70
70
  const arr = enclosingArray(src, m.index);
71
- assert.ok(arr.includes(`'-t'`), `tmux verb '${verb}' is invoked WITHOUT an explicit -t target a latent ` +
71
+ // The invariant is "name a specific tmux object, never fall back to the
72
+ // GLOBAL current one". `-t` targets a destination; `break-pane` (and the
73
+ // deleted swap/join/move-pane) instead name their SOURCE with `-s` — which
74
+ // satisfies the invariant identically. Accept either explicit target flag.
75
+ assert.ok(arr.includes(`'-t'`) || arr.includes(`'-s'`), `tmux verb '${verb}' is invoked WITHOUT an explicit -t/-s target — a latent ` +
72
76
  `instance of the unbidden-window bug (§2.2). Offending args array:\n${arr}`);
73
77
  }
74
78
  // Sanity: the driver really does contain placement verbs (so a refactor that