@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
@@ -0,0 +1,157 @@
1
+ // Detects a boot change (a host reboot, or — the case this exists for — a
2
+ // Blaxel/Firecracker microVM destroy+recreate) so callers can stop trusting any
3
+ // `pi_pid` recorded before it.
4
+ //
5
+ // canvas.db is durable — it survives a VM/sandbox destroy+recreate or a host
6
+ // reboot on whatever volume it lives on (see paths.ts / the storage-tiers
7
+ // doc) — but `pi_pid` is a raw OS pid: once the process table resets, a small
8
+ // stale pid can coincidentally collide with an unrelated process that now
9
+ // happens to hold that number, so `isPidAlive` reads it "alive" when the
10
+ // broker it once named is long gone. Left unchecked this fools BOTH the
11
+ // daemon's own liveness poll (crtrd.ts) and reviveNode's double-launch guard
12
+ // (revive.ts) into believing a dead broker is still running — the node then
13
+ // stays permanently unrevivable until a human runs `canvas revive --fresh`.
14
+ //
15
+ // The signal (primary): the Linux kernel's per-boot identity at
16
+ // `/proc/sys/kernel/random/boot_id` — a fresh random UUID minted on every
17
+ // kernel boot. A Firecracker microVM recreate (Blaxel's deployment shape) boots
18
+ // a brand-new kernel, so `boot_id` changes; a plain daemon restart within the
19
+ // same boot leaves it identical. This is an EXACT identity, so on Linux we need
20
+ // no wall-clock window at all. NOTE this detects a *kernel boot*, not an
21
+ // arbitrary container recreate: an ordinary container that shares the host
22
+ // kernel keeps the host's `boot_id` across recreation, so this would NOT fire
23
+ // there — that shape is out of scope (Hearth runs on Firecracker microVMs).
24
+ //
25
+ // The signal (fallback, non-Linux dev only): `os.uptime()` resets to ~0 on a
26
+ // reboot and is otherwise monotonic, so `now - uptime` estimates the current
27
+ // boot's wall-clock start (the "boot epoch"). Used only when `boot_id` is
28
+ // unavailable (e.g. macOS dev), where a genuine reboot/recreate is not a
29
+ // production concern; the epoch comparison keeps a generous tolerance there.
30
+ //
31
+ // The last-seen identity is persisted in canvas.db (the same durable tier the
32
+ // pids live in) as a single `canvas_meta` row, and the compare+sweep runs in
33
+ // ONE `BEGIN IMMEDIATE` transaction so concurrent callers (daemon startup and a
34
+ // manual/direct revive in another process) are serialized: a second caller
35
+ // blocks on the write lock, then reads the marker the first already updated and
36
+ // no-ops, so it can never clear a pid the first just recorded (single-writer).
37
+ import { readFileSync } from 'node:fs';
38
+ import { uptime } from 'node:os';
39
+ import { openDb } from './db.js';
40
+ /** Wall-clock epoch drift (fallback signal only) beyond which two boot-start
41
+ * estimates are called DIFFERENT boots. Absorbs clock-sync jitter (NTP, a VM's
42
+ * first sync after boot) and `os.uptime()`'s ~1s resolution. Only consulted
43
+ * when the exact kernel `boot_id` is unavailable on BOTH sides (non-Linux
44
+ * dev). A false positive would clear a genuinely live pid and let reviveNode
45
+ * double-spawn onto the same session; a false negative just falls back to the
46
+ * manual `--fresh` status quo — so it is kept generous, biased against the
47
+ * dangerous direction. The production target (Linux/Firecracker) never reaches
48
+ * this branch; there `boot_id` is exact. */
49
+ const BOOT_EPOCH_TOLERANCE_MS = 60_000;
50
+ function readKernelBootId() {
51
+ try {
52
+ const id = readFileSync('/proc/sys/kernel/random/boot_id', 'utf8').trim();
53
+ return id.length > 0 ? id : null;
54
+ }
55
+ catch {
56
+ return null; // non-Linux, or unreadable — fall back to the wall-clock epoch
57
+ }
58
+ }
59
+ /** Identity of the CURRENT OS boot. `now` is injectable for tests. */
60
+ export function currentBootIdentity(now = Date.now()) {
61
+ return { bootId: readKernelBootId(), bootEpochMs: now - Math.round(uptime() * 1000) };
62
+ }
63
+ /** Pure decision core: does `current` belong to a DIFFERENT boot than the
64
+ * persisted `known`? `known === null` (no history — a fresh install, or the
65
+ * first run of a build that added this marker) is never a boot change: there
66
+ * is nothing to contradict it, and treating "no history" as a change could
67
+ * clear genuinely live pids that predate this feature.
68
+ *
69
+ * When BOTH sides carry a kernel `boot_id`, that exact identity decides it — no
70
+ * wall-clock window, so a real quick reboot/recreate (a short-lived prior boot
71
+ * whose start is <60s away) is still detected. Only when a `boot_id` is missing
72
+ * on either side (non-Linux dev) does it fall back to the epoch-drift window.
73
+ * Unit-testable without real uptime/fs. */
74
+ export function bootChanged(current, known) {
75
+ if (known === null)
76
+ return false;
77
+ if (current.bootId !== null && known.bootId !== null) {
78
+ return current.bootId !== known.bootId;
79
+ }
80
+ return Math.abs(current.bootEpochMs - known.bootEpochMs) > BOOT_EPOCH_TOLERANCE_MS;
81
+ }
82
+ const BOOT_MARKER_KEY = 'boot_identity';
83
+ function readBootMarker(db) {
84
+ const row = db
85
+ .prepare('SELECT value FROM canvas_meta WHERE key = ?')
86
+ .get(BOOT_MARKER_KEY);
87
+ if (row === undefined)
88
+ return null;
89
+ try {
90
+ const parsed = JSON.parse(row.value);
91
+ if (typeof parsed.bootEpochMs !== 'number')
92
+ return null;
93
+ return {
94
+ bootId: typeof parsed.bootId === 'string' ? parsed.bootId : null,
95
+ bootEpochMs: parsed.bootEpochMs,
96
+ };
97
+ }
98
+ catch {
99
+ return null; // malformed — treat as "no history yet"
100
+ }
101
+ }
102
+ function writeBootMarker(db, identity) {
103
+ db.prepare('INSERT INTO canvas_meta (key, value) VALUES (?, ?) ' +
104
+ 'ON CONFLICT(key) DO UPDATE SET value = excluded.value').run(BOOT_MARKER_KEY, JSON.stringify(identity));
105
+ }
106
+ /** Idempotent and safe to call from every revive entry point (daemon startup,
107
+ * reviveNode): compares the current boot's identity against the last one
108
+ * recorded, and if they differ, clears `pi_pid` on every node that has one —
109
+ * regardless of status, since reviveNode's double-launch guard reads `pi_pid`
110
+ * unconditionally, not just on active/idle rows. The first caller after a
111
+ * genuine boot change does the sweep and persists the new marker; every call
112
+ * after that (in this process or another) reads a matching marker and no-ops.
113
+ *
114
+ * SINGLE-WRITER: the whole read-marker + sweep + write-marker runs in one
115
+ * `BEGIN IMMEDIATE` transaction. A concurrent caller (a manual revive racing
116
+ * daemon startup, in a separate process) blocks on the SQLite write lock until
117
+ * this commits, then reads the already-updated marker and no-ops — so it can
118
+ * never `clearPid` a broker pid the first caller's revive just recorded, which
119
+ * would otherwise hide a live broker behind `pi_pid=NULL` and risk a second
120
+ * broker on the same session.
121
+ *
122
+ * `current` defaults to the real identity; tests inject a synthetic one against
123
+ * an isolated CRTR_HOME to simulate a boot change without a real reboot. */
124
+ export function reconcileBootLiveness(current = currentBootIdentity()) {
125
+ const db = openDb();
126
+ db.exec('BEGIN IMMEDIATE');
127
+ try {
128
+ const known = readBootMarker(db);
129
+ if (!bootChanged(current, known)) {
130
+ if (known === null)
131
+ writeBootMarker(db, current); // seed first-ever marker
132
+ db.exec('COMMIT');
133
+ return { changed: false, cleared: [] };
134
+ }
135
+ const rows = db
136
+ .prepare('SELECT node_id FROM nodes WHERE pi_pid IS NOT NULL')
137
+ .all();
138
+ const upd = db.prepare('UPDATE nodes SET pi_pid = NULL WHERE node_id = ?');
139
+ const cleared = [];
140
+ for (const row of rows) {
141
+ upd.run(row.node_id);
142
+ cleared.push(row.node_id);
143
+ }
144
+ writeBootMarker(db, current);
145
+ db.exec('COMMIT');
146
+ return { changed: true, cleared };
147
+ }
148
+ catch (err) {
149
+ try {
150
+ db.exec('ROLLBACK');
151
+ }
152
+ catch {
153
+ /* best-effort — nothing was committed */
154
+ }
155
+ throw err;
156
+ }
157
+ }
@@ -1,6 +1,6 @@
1
1
  import { test } from 'node:test';
2
2
  import assert from 'node:assert/strict';
3
- import { buildTree, flatten, fuzzyMatch, tabPredicate, TABS, attentionTier, attentionMtime } from '../model.js';
3
+ import { buildTree, flatten, fuzzyMatch, pruneNode, tabPredicate, TABS, attentionTier, attentionMtime } from '../model.js';
4
4
  // ── Fixture canvas ───────────────────────────────────────────────────────────
5
5
  // root1 (active) ← rank 0
6
6
  // child-a (idle)
@@ -73,6 +73,40 @@ test('buildTree: unknown child ids are dropped (missing meta safe)', () => {
73
73
  assert.deepEqual(t.nodes.get('root1').childIds, ['child-a']);
74
74
  assert.equal(t.nodes.has('ghost'), false);
75
75
  });
76
+ // ── pruneNode ────────────────────────────────────────────────────────────────
77
+ // Regression: pressing `x` in canvas browse on an EMPTY active node looked like a
78
+ // no-op — closeNode hard-deletes (reaps) an empty node, but doClose never removed
79
+ // it from the in-memory tree, so the stale active row kept painting. pruneNode is
80
+ // the splice doClose now applies for a reaped (getNode===null) close.
81
+ test('pruneNode: reaping a leaf removes it from its parent and the node map', () => {
82
+ const t = tree();
83
+ pruneNode(t, 'grand-x'); // leaf under child-a
84
+ assert.equal(t.nodes.has('grand-x'), false);
85
+ assert.deepEqual(t.nodes.get('child-a').childIds, []);
86
+ });
87
+ test('pruneNode: reaping a mid-tree node re-homes its children to its parent', () => {
88
+ const t = tree();
89
+ pruneNode(t, 'child-a'); // child-a (under root1) owns grand-x
90
+ assert.equal(t.nodes.has('child-a'), false);
91
+ // grand-x lifts into child-a's slot in root1's child order (before child-b).
92
+ assert.deepEqual(t.nodes.get('root1').childIds, ['grand-x', 'child-b']);
93
+ assert.equal(t.nodes.get('grand-x').parentId, 'root1');
94
+ });
95
+ test('pruneNode: reaping a root lifts its children into the root list', () => {
96
+ const t = tree();
97
+ const rootIdx = t.roots.indexOf('root2');
98
+ pruneNode(t, 'root2'); // root2 owns child-c
99
+ assert.equal(t.nodes.has('root2'), false);
100
+ assert.equal(t.roots.includes('root2'), false);
101
+ assert.equal(t.roots[rootIdx], 'child-c'); // child-c took root2's slot
102
+ assert.equal(t.nodes.get('child-c').parentId, null);
103
+ });
104
+ test('pruneNode: absent id is a no-op', () => {
105
+ const t = tree();
106
+ const before = t.nodes.size;
107
+ pruneNode(t, 'ghost');
108
+ assert.equal(t.nodes.size, before);
109
+ });
76
110
  // ── tab predicates ───────────────────────────────────────────────────────────
77
111
  test('tabPredicate: All / Live / Dormant / Flagged', () => {
78
112
  assert.deepEqual([...TABS], ['All', 'Live', 'Dormant', 'Flagged']);
@@ -6,14 +6,14 @@
6
6
  //
7
7
  // Resume is one action: Enter routes the chosen node through `crtr node focus`,
8
8
  // which goes via reviveNode() — the ONLY sanctioned open. NEVER spawn
9
- // `pi --session` directly (see canvas-resume.ts header for the desync hazard).
9
+ // `pi --session` directly (see reviveNode() in revive.ts for the desync hazard).
10
10
  import { execFileSync } from 'node:child_process';
11
11
  import { resolve } from 'node:path';
12
12
  import { dashboardRowsAll, enrichRows, loadPreview, renderForest } from '../render.js';
13
13
  import { listNodes, subscriptionsOf, getNode } from '../canvas.js';
14
14
  import { closeNode } from '../../runtime/close.js';
15
15
  import { setupTerminal, restoreTerminal, getTerminalSize, parseKeypress, } from '../../tui/terminal.js';
16
- import { buildTree, flatten, TABS } from './model.js';
16
+ import { buildTree, flatten, pruneNode, TABS } from './model.js';
17
17
  // Sort cycle for the `s` key. Starts on the default `attention` ordering; one `s`
18
18
  // press restores the structural `tree` view, then relevance/recency, then back.
19
19
  const SORT_CYCLE = ['attention', 'tree', 'relevance', 'recency'];
@@ -34,7 +34,7 @@ export async function runBrowse(opts = {}) {
34
34
  }
35
35
  // Snapshot the canvas. Drop kind:'human' control-plane decks — they have no pi
36
36
  // session, so `node focus` refuses them; they are never a navigation/resume
37
- // target (mirrors canvas-resume.ts / the node focus guard).
37
+ // target (mirrors the node focus guard).
38
38
  const rows = dashboardRowsAll().filter((r) => r.kind !== 'human');
39
39
  const rootIds = listNodes()
40
40
  .filter((n) => n.parent === null && n.kind !== 'human')
@@ -80,6 +80,17 @@ export async function runBrowse(opts = {}) {
80
80
  // Safety net: an uncaught throw in the (un-unit-tested) keystroke path must
81
81
  // never strand the tty in raw + alt-screen + hidden-cursor.
82
82
  process.once('exit', cleanup);
83
+ /** On-demand kick of a hanging node: shell `canvas revive <id> --now` (which
84
+ * SIGTERMs the live broker — the daemon resumes it). Synchronous + quiet
85
+ * (stdio ignored) so it never takes over the TUI; best-effort. */
86
+ const reviveNow = (id) => {
87
+ try {
88
+ execFileSync('crtr', ['canvas', 'revive', id, '--now'], { stdio: 'ignore' });
89
+ }
90
+ catch {
91
+ /* best-effort — the SIGTERM is what matters; the daemon owns the resume */
92
+ }
93
+ };
83
94
  /** Open the chosen node — the ONLY sanctioned path (reviveNode via node focus). */
84
95
  const selectAndFocus = (id) => {
85
96
  cleanup();
@@ -188,16 +199,26 @@ export async function runBrowse(opts = {}) {
188
199
  return; // unknown/already-gone node — nothing to reflect
189
200
  }
190
201
  for (const cid of closed) {
202
+ const m = getNode(cid);
203
+ if (m === null) {
204
+ // Reaped, not parked: an EMPTY node (0k ctx, no assistant message) is
205
+ // hard-deleted by closeNode (row + dir gone). Splice it out of the tree so
206
+ // its row disappears — otherwise the stale active husk lingers on screen and
207
+ // `x` looks like a no-op (the row was the only thing that ever changed).
208
+ pruneNode(tree, cid);
209
+ continue;
210
+ }
191
211
  const n = tree.nodes.get(cid);
192
212
  if (n === undefined)
193
213
  continue;
194
- const m = getNode(cid);
195
- if (m !== null)
196
- n.row.status = m.status; // real post-close status (done / canceled)
214
+ n.row.status = m.status; // real post-close status (done / canceled)
197
215
  n.row.streaming = false;
198
216
  n.row.viewed = false;
199
217
  }
200
- recompute(id);
218
+ // Keep the cursor at the same INDEX (the row that shifts up into the closed
219
+ // slot), not pinned to the now-gone node — recompute() leaves state.cursor
220
+ // put and clamps it to the new bounds.
221
+ recompute();
201
222
  };
202
223
  const cycleTab = (dir) => {
203
224
  const i = TABS.indexOf(state.tab);
@@ -228,10 +249,29 @@ export async function runBrowse(opts = {}) {
228
249
  state.residentsOnly = !state.residentsOnly;
229
250
  recompute(keep);
230
251
  };
252
+ // Coalesced search repaint. The expensive work per keystroke is recompute()
253
+ // (a fuzzyMatch flatten over the whole corpus) + a full renderFrame. Doing it
254
+ // synchronously on every key blocks the event loop, so fast typing batches into
255
+ // the stdin reads — and batched chunks used to be dropped (see onKeySearch).
256
+ // Instead, each key only mutates state.query (cheap) and marks the view dirty;
257
+ // a single setImmediate drains AFTER every queued stdin 'data' callback (poll
258
+ // phase) has appended its chars, so N rapid keys collapse to ONE recompute+paint
259
+ // and no keystroke is ignored. The sort may still take a moment — that's fine.
260
+ let searchRepaintScheduled = false;
261
+ const scheduleSearchRepaint = () => {
262
+ if (searchRepaintScheduled)
263
+ return;
264
+ searchRepaintScheduled = true;
265
+ setImmediate(() => {
266
+ searchRepaintScheduled = false;
267
+ recompute();
268
+ flush();
269
+ });
270
+ };
231
271
  const onKeySearch = (input, key) => {
232
272
  if (key.escape) {
233
273
  // Cancel the search: drop the query AND the relevance ranking it switched
234
- // on, returning to the tree.
274
+ // on, returning to the tree. Synchronous: we're leaving search mode.
235
275
  state.search = false;
236
276
  state.query = '';
237
277
  state.sort = 'tree';
@@ -240,19 +280,20 @@ export async function runBrowse(opts = {}) {
240
280
  return;
241
281
  }
242
282
  if (key.return) {
243
- // Commit: keep the filter, drop search mode, land on the first match.
283
+ // Commit: keep the filter, drop search mode, land on the first match. Must
284
+ // recompute synchronously first so the match index reflects the final query
285
+ // even if a coalesced repaint is still pending.
244
286
  state.search = false;
287
+ recompute();
245
288
  const firstMatch = visible.findIndex((v) => v.matched);
246
289
  if (firstMatch >= 0)
247
290
  state.cursor = firstMatch;
248
- recompute();
249
291
  flush();
250
292
  return;
251
293
  }
252
294
  if (key.backspace) {
253
295
  state.query = state.query.slice(0, -1);
254
- recompute();
255
- flush();
296
+ scheduleSearchRepaint();
256
297
  return;
257
298
  }
258
299
  // Any ctrl-combo: Ctrl+C quits; everything else is swallowed (never typed).
@@ -261,11 +302,15 @@ export async function runBrowse(opts = {}) {
261
302
  quit();
262
303
  return;
263
304
  }
264
- // Printable single char append. Ignore multi-byte / control chunks.
265
- if (input.length === 1 && input >= ' ') {
266
- state.query += input;
267
- recompute();
268
- flush();
305
+ // Append every printable char in the chunk. Fast typing batches multiple
306
+ // chars into one stdin read, so we must take them all (not just a length-1
307
+ // chunk) or keystrokes get dropped. Filtering to >= ' ' strips control/escape
308
+ // bytes (e.g. stray \x1b from an unrecognised sequence) but keeps real input,
309
+ // including multi-byte UTF-8 code points.
310
+ const printable = [...input].filter((c) => c >= ' ').join('');
311
+ if (printable.length > 0) {
312
+ state.query += printable;
313
+ scheduleSearchRepaint();
269
314
  }
270
315
  };
271
316
  const onKeyNav = (input, key) => {
@@ -424,6 +469,20 @@ export async function runBrowse(opts = {}) {
424
469
  flush();
425
470
  return;
426
471
  }
472
+ // Revive now (on-demand kick): for a HANGING node, SIGTERM the live broker so
473
+ // the daemon's crash→grace→resume path brings it back in ~20s instead of
474
+ // waiting out the 5-min auto-revive grace. Shells `canvas revive <id> --now`
475
+ // (browse goes through commands, never touching the runtime directly). 'k' is
476
+ // vim-up here, so the kick is on SHIFT-K.
477
+ if (input === 'K') {
478
+ if (row !== undefined) {
479
+ const r = rowOf(row.id);
480
+ if (r?.hanging != null)
481
+ reviveNow(row.id);
482
+ }
483
+ flush();
484
+ return;
485
+ }
427
486
  // Resume.
428
487
  if (key.return) {
429
488
  if (row !== undefined)
@@ -445,6 +504,17 @@ export async function runBrowse(opts = {}) {
445
504
  state.cwdScope = null;
446
505
  recompute();
447
506
  }
507
+ // Open with the cursor on the CURRENT node (the one browse was launched from),
508
+ // not the top of the tree. Expand its ancestors so the row is actually visible,
509
+ // then home the cursor onto it. No-op when launched outside a node, or when the
510
+ // node is filtered out of the current tab/scope.
511
+ const selfId = process.env['CRTR_NODE_ID'];
512
+ if (selfId !== undefined && selfId !== '' && tree.nodes.has(selfId)) {
513
+ for (let p = tree.nodes.get(selfId)?.parentId ?? null; p !== null; p = tree.nodes.get(p)?.parentId ?? null) {
514
+ state.collapsed.delete(p);
515
+ }
516
+ recompute(selfId);
517
+ }
448
518
  setupTerminal();
449
519
  flush();
450
520
  // Background corpus warmer: after the instant first paint, progressively enrich
@@ -28,7 +28,7 @@ export interface Tree {
28
28
  nodes: Map<string, TreeNode>;
29
29
  }
30
30
  /** Sort rank for roots/stragglers — live first (active, then idle), dormant
31
- * after. Mirrors render.ts / canvas-resume.ts statusRank. */
31
+ * after. Mirrors render.ts statusRank. */
32
32
  export declare function statusRank(status: NodeStatus): number;
33
33
  /**
34
34
  * Build a spanning tree of the whole canvas.
@@ -43,6 +43,15 @@ export declare function statusRank(status: NodeStatus): number;
43
43
  * appended as a depth-0 straggler so "All" is genuinely the whole canvas.
44
44
  */
45
45
  export declare function buildTree(rows: DashboardRow[], rootIds: string[], childIdsOf: (id: string) => string[]): Tree;
46
+ /** Splice a node out of an already-built tree in place (mutates `tree`). Used when
47
+ * a close REAPED an empty node (row + dir hard-deleted) rather than parking it:
48
+ * the node is gone from the db, so it must vanish from the in-memory tree too or
49
+ * its stale row lingers on screen (the "press x, nothing happens" bug — an empty
50
+ * active husk reaped by closeNode but never dropped from `tree.nodes`, so the
51
+ * attention/flat view kept painting it). Surviving children are re-homed to the
52
+ * reaped node's parent so a non-leaf reap never orphans them out of view. No-op
53
+ * if the id is absent. */
54
+ export declare function pruneNode(tree: Tree, id: string): void;
46
55
  /** Case-insensitive subsequence match: every char of `query` appears in `text`
47
56
  * in order (gaps allowed). Empty query matches everything. Substrings are a
48
57
  * subsequence, so this subsumes substring matching too. */
@@ -20,7 +20,7 @@ export function tabPredicate(tab, row) {
20
20
  }
21
21
  }
22
22
  /** Sort rank for roots/stragglers — live first (active, then idle), dormant
23
- * after. Mirrors render.ts / canvas-resume.ts statusRank. */
23
+ * after. Mirrors render.ts statusRank. */
24
24
  export function statusRank(status) {
25
25
  switch (status) {
26
26
  case 'active': return 0;
@@ -85,6 +85,42 @@ export function buildTree(rows, rootIds, childIdsOf) {
85
85
  }
86
86
  return { roots: orderedRoots, nodes };
87
87
  }
88
+ /** Splice a node out of an already-built tree in place (mutates `tree`). Used when
89
+ * a close REAPED an empty node (row + dir hard-deleted) rather than parking it:
90
+ * the node is gone from the db, so it must vanish from the in-memory tree too or
91
+ * its stale row lingers on screen (the "press x, nothing happens" bug — an empty
92
+ * active husk reaped by closeNode but never dropped from `tree.nodes`, so the
93
+ * attention/flat view kept painting it). Surviving children are re-homed to the
94
+ * reaped node's parent so a non-leaf reap never orphans them out of view. No-op
95
+ * if the id is absent. */
96
+ export function pruneNode(tree, id) {
97
+ const node = tree.nodes.get(id);
98
+ if (node === undefined)
99
+ return;
100
+ const parentId = node.parentId;
101
+ // Children still present (their own reap, if any, already removed them) lift up
102
+ // to this node's parent, taking its slot in the child order.
103
+ const survivingKids = node.childIds.filter((c) => tree.nodes.has(c));
104
+ for (const c of survivingKids) {
105
+ const kid = tree.nodes.get(c);
106
+ if (kid !== undefined)
107
+ kid.parentId = parentId;
108
+ }
109
+ if (parentId !== null) {
110
+ const p = tree.nodes.get(parentId);
111
+ if (p !== undefined) {
112
+ const i = p.childIds.indexOf(id);
113
+ if (i >= 0)
114
+ p.childIds.splice(i, 1, ...survivingKids);
115
+ }
116
+ }
117
+ else {
118
+ const i = tree.roots.indexOf(id);
119
+ if (i >= 0)
120
+ tree.roots.splice(i, 1, ...survivingKids);
121
+ }
122
+ tree.nodes.delete(id);
123
+ }
88
124
  // ---------------------------------------------------------------------------
89
125
  // Fuzzy match
90
126
  // ---------------------------------------------------------------------------
@@ -11,6 +11,7 @@
11
11
  // Every hue (fg / bg color) is gated on `caps.color`; structural SGR (bold/dim/
12
12
  // reverse) is allowed always. See detectColorCaps() for the gate, and the
13
13
  // canvas-browse color spec for the rationale + palette.
14
+ import { STATUS_GLYPH, STATUS_COLOR, resolveNodeVisual, faultSummary } from '../status-glyph.js';
14
15
  import { TABS, matchIndices, promptText, previewSnippet } from './model.js';
15
16
  // Span/color primitives live in core/tui/draw.ts (one copy, shared with the
16
17
  // `crtr view` host). Re-export the color caps so browse's importers + tests keep
@@ -50,30 +51,17 @@ const DIM = `${ESC}2m`;
50
51
  const BOLD = `${ESC}1m`;
51
52
  const CURSOR_BG = `${ESC}48;5;236m`; // subtle dark-gray cursor-row bg (256-color)
52
53
  // Basic-16 ANSI fg codes used by the palette.
53
- const FG_GREEN = '32';
54
54
  const FG_YELLOW = '33';
55
55
  const FG_RED = '31';
56
56
  const FG_CYAN = '36';
57
57
  const FG_GRAY = '90'; // bright-black
58
58
  const FG_BRIGHT_YELLOW = '93';
59
- const FG_BRIGHT_GREEN = '92'; // streaming pulse (brighter than the active-status green)
60
59
  const FG_BRIGHT_CYAN = '96'; // query-match highlight (ties to the cyan search accent)
61
- const STATUS_GLYPH = {
62
- active: '●',
63
- idle: '○',
64
- done: '✓',
65
- dead: '✗',
66
- canceled: '⊘',
67
- };
68
- /** The load-bearing color: glyph hue per status. Single source of truth, mirrors
69
- * STATUS_GLYPH. Reinforces the glyph everywhere it appears (rows + summary). */
70
- const STATUS_COLOR = {
71
- active: FG_GREEN,
72
- idle: FG_YELLOW,
73
- done: FG_CYAN,
74
- dead: FG_RED,
75
- canceled: FG_GRAY,
76
- };
60
+ // STATUS_GLYPH + STATUS_COLOR are imported from ../status-glyph.js (the shared
61
+ // canvas-graph map). STATUS_COLOR there is NUMERIC SGR (e.g. 32) — wrap with
62
+ // `sgr()` where a string ANSI code is needed (Span fg / template literals accept
63
+ // the number directly).
64
+ const FG = (code) => String(code);
77
65
  function fmtCtx(tokens) {
78
66
  if (tokens <= 0)
79
67
  return '0k';
@@ -194,16 +182,17 @@ function spansWidth(spans) {
194
182
  * node is genuinely mid-turn; otherwise the lifecycle word. The word is what makes
195
183
  * state legible at a glance and survives NO_COLOR (the glyph is the second cue). */
196
184
  function statusRail(r) {
197
- const streaming = r.streaming === true;
198
- const word = streaming
199
- ? 'live'
200
- : ({ active: 'active', idle: 'idle', done: 'done', dead: 'dead', canceled: 'cancel' }[r.status] ?? r.status);
201
- const fg = streaming ? FG_BRIGHT_GREEN : STATUS_COLOR[r.status];
202
- const glyph = streaming ? '' : (STATUS_GLYPH[r.status] ?? '?');
203
- const text = `${glyph} ${word}`;
185
+ const v = resolveNodeVisual(r.status, { streaming: r.streaming === true, hanging: r.hanging ?? null });
186
+ // Plain status keeps browse's own status WORD; overlays (hanging/⟳)
187
+ // carry their own word from resolveNodeVisual. A hanging kind label can exceed
188
+ // STATUS_W acceptable: the rare, attention-demanding row gets a slightly
189
+ // wider rail (Math.max(1,…) keeps a gap), which draws the eye.
190
+ const word = v.word ?? ({ active: 'active', idle: 'idle', done: 'done', dead: 'dead', canceled: 'cancel' }[r.status] ?? r.status);
191
+ const fg = FG(v.color);
192
+ const text = `${v.glyph} ${word}`;
204
193
  const pad = Math.max(1, STATUS_W - [...text].length);
205
194
  return [
206
- { text, style: { fg, bold: streaming } },
195
+ { text, style: { fg, bold: v.bold === true } },
207
196
  { text: ' '.repeat(pad) },
208
197
  ];
209
198
  }
@@ -256,11 +245,15 @@ function rowLine(row, tree, width, isCursor, query, caps, showCwd, now) {
256
245
  const gutter = r.viewed === true
257
246
  ? { text: '◉ ', style: { fg: FG_BRIGHT_CYAN, bold: true } }
258
247
  : { text: ' ' };
259
- // Inline attention flag that travels with the name (streaming lives in the rail,
248
+ // Inline attention flag that travels with the name (fault summary lives in the rail,
260
249
  // attached lives in the gutter).
261
250
  const flags = [];
262
251
  if (r.asks > 0)
263
252
  flags.push({ text: ` ⚑${r.asks}`, style: { fg: FG_BRIGHT_YELLOW, bold: true } }); // pending asks
253
+ // Hanging: the fault summary travels with the name (the ⚠ + kind
254
+ // label live in the rail). Dim yellow so it reads as secondary detail.
255
+ if (r.hanging != null)
256
+ flags.push({ text: ` · ${faultSummary(r.hanging, now)}`, style: { fg: FG_YELLOW, dim: true } });
264
257
  const status = statusRail(r);
265
258
  const right = metaCluster(r, now, showCwd);
266
259
  const treeLead = `${indent}${collapse} `;
@@ -348,7 +341,7 @@ function snippetLine(ln, width, caps) {
348
341
  return assemble(spans, width, caps.color, '', false);
349
342
  }
350
343
  /** The bottom preview panel — exactly PREVIEW_HEIGHT lines: a separator, a meta
351
- * line (status · kind/mode · project · age · ctx · asks · streaming/viewing), then
344
+ * line (status · kind/mode · project · age · ctx · asks · fault/viewing), then
352
345
  * TWO blocks — the spawn prompt / query-match (PROMPT_LINES) and the node's LAST
353
346
  * assistant reply (REPLY_LINES, prefixed `↩`). Under a live query the prompt block
354
347
  * is WINDOWED to the matching prompt (anywhere in the conversation) with the match
@@ -362,14 +355,17 @@ function previewPanel(r, width, caps, now, query) {
362
355
  out.push('');
363
356
  return out;
364
357
  }
358
+ const v = resolveNodeVisual(r.status, { streaming: r.streaming === true, hanging: r.hanging ?? null });
365
359
  const glyph = caps.color
366
- ? `${ESC}${STATUS_COLOR[r.status]}m${STATUS_GLYPH[r.status]}${RESET}`
367
- : (STATUS_GLYPH[r.status] ?? '?');
360
+ ? `${ESC}${v.color}m${v.glyph}${RESET}`
361
+ : v.glyph;
368
362
  const metaPieces = [`${r.status} ${r.kind}/${r.mode}`, baseDir(r.cwd), relAge(r.created, now), `ctx ${fmtCtx(r.ctx_tokens)}`];
369
363
  if (r.asks > 0)
370
364
  metaPieces.push(`⚑${r.asks}`);
365
+ if (r.hanging != null)
366
+ metaPieces.push(faultSummary(r.hanging, now));
371
367
  if (r.streaming === true)
372
- metaPieces.push('⟳ streaming');
368
+ metaPieces.push('⟳');
373
369
  if (r.viewed === true)
374
370
  metaPieces.push('◉ viewing');
375
371
  const metaText = clip(metaPieces.filter((p) => p !== '').join(' · '), Math.max(0, width - 2));
@@ -471,13 +467,19 @@ export function renderFrame(state, size, caps = { color: false, color256: false
471
467
  if (state.pendingClose !== null && state.pendingClose !== undefined) {
472
468
  const node = state.tree.nodes.get(state.pendingClose);
473
469
  const who = node !== undefined ? node.row.name : state.pendingClose;
474
- const warn = `⚠ ${who} is actively streaming — close it (and its subtree) anyway? y / n`;
470
+ const warn = `⚠ ${who} is — close it (and its subtree) anyway? y / n`;
475
471
  lines.push(caps.color ? `${BOLD}${ESC}${FG_BRIGHT_YELLOW}m${clip(warn, width)}${RESET}` : `${REVERSE}${clip(warn, width)}${RESET}`);
476
472
  }
477
473
  else {
474
+ // When the cursor row has an active fault, lead the footer with the on-demand kick
475
+ // hint (K shells `canvas revive <id> --now` — immediate revive instead of
476
+ // waiting for the daemon's retry schedule).
477
+ const selRow = state.visible[state.cursor];
478
+ const cursorRow = selRow !== undefined ? state.tree.nodes.get(selRow.id)?.row : undefined;
479
+ const hangingHint = cursorRow?.hanging != null ? 'K revive now ' : '';
478
480
  const footer = state.search
479
481
  ? '⏎ commit Esc cancel ⌫ delete'
480
- : '↑↓ move →/← tree ⏎ resume x close Tab tabs / search s sort c cwd r residents p preview q quit';
482
+ : `${hangingHint}↑↓ move →/← tree ⏎ resume x close Tab tabs / search s sort c cwd r residents p preview q quit`;
481
483
  lines.push(`${DIM}${clip(footer, width)}${RESET}`);
482
484
  }
483
485
  // Assemble: home, each line cleared to EOL, then clear below.
@@ -82,6 +82,18 @@ export interface PruneResult {
82
82
  pruned: PrunedNode[];
83
83
  dryRun: boolean;
84
84
  }
85
+ /** Hard-delete ONE node: drop its row (the edges→nodes FK, ON DELETE CASCADE,
86
+ * GCs its edges) and remove its on-disk `nodes/<id>/` dir. The single-node
87
+ * analogue of {@link pruneNodes}, for IMMEDIATE reaping — e.g. an empty node the
88
+ * user closed or detached from. Pure persisted-state removal: the caller MUST
89
+ * have already torn down the broker engine + viewer (this does not signal any
90
+ * process). Reaps this node's triggers FIRST (spec §Deterministic removal,
91
+ * criterion 15: target deletion kills any in-flight predicate process group and
92
+ * consumes target-bound + owner-armed trigger rows, instead of leaving them to
93
+ * the FK cascade alone with no kill and no notice) via the same
94
+ * `cancelTriggersFor` seam `close`/`cancel` already use. Best-effort dir removal
95
+ * after the row delete, mirroring pruneNodes. */
96
+ export declare function deleteNode(nodeId: string): void;
85
97
  /** Retention sweep: remove TERMINAL nodes (status dead | done | canceled) whose
86
98
  * `created` is older than `ttlDays`, bounding the otherwise-unbounded growth of
87
99
  * node rows + dirs. The edges→nodes FK (`ON DELETE CASCADE`, migration v4) GCs
@@ -104,3 +116,24 @@ export declare function pruneNodes(opts: {
104
116
  dryRun?: boolean;
105
117
  includeStale?: boolean;
106
118
  }): PruneResult;
119
+ /** Count-based retention sweep: keep at most `maxNodes` of the MOST-RECENTLY-
120
+ * ACTIVE nodes, but NEVER delete a live node — so the real retained floor is
121
+ * `max(maxNodes, liveCount)`. Bounds the otherwise-unbounded growth the TTL
122
+ * sweep can't (a canvas that never crosses the TTL still grows without limit).
123
+ *
124
+ * Liveness (protected, always kept): status active|idle AND a live `pi_pid` —
125
+ * the SAME signal `pruneNodes`'s `includeStale` and placement use (`isPidAlive`).
126
+ * The caller ($CRTR_NODE_ID) is also always protected.
127
+ *
128
+ * Algorithm: order ALL nodes by recency DESC (telemetry.json mtime, falling back
129
+ * to `created`); `target = max(maxNodes, liveCount)`; delete every node ranked
130
+ * beyond `target` (0-indexed rank >= target) that is NOT live and NOT the caller.
131
+ * Retained = all live + the newest terminal nodes up to `target`.
132
+ *
133
+ * Mirrors {@link pruneNodes} exactly for the delete (shared `deletePrunedNodes`:
134
+ * transactioned row sweep + FK edge cascade + best-effort dir removal). `dryRun`
135
+ * reports the candidate set and deletes NOTHING. */
136
+ export declare function pruneToLimit(opts: {
137
+ maxNodes: number;
138
+ dryRun?: boolean;
139
+ }): PruneResult;