@ouro.bot/cli 0.1.0-alpha.55 → 0.1.0-alpha.550

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 (386) hide show
  1. package/README.md +133 -19
  2. package/RepairGuide.ouro/agent.json +5 -0
  3. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  4. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  5. package/RepairGuide.ouro/skills/diagnose-bootstrap-drift.md +54 -0
  6. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  7. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  8. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  9. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  12. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  13. package/changelog.json +3555 -0
  14. package/dist/arc/attention-types.js +8 -0
  15. package/dist/arc/cares.js +140 -0
  16. package/dist/arc/episodes.js +117 -0
  17. package/dist/arc/intentions.js +133 -0
  18. package/dist/arc/json-store.js +117 -0
  19. package/dist/arc/obligations.js +237 -0
  20. package/dist/arc/packets.js +193 -0
  21. package/dist/arc/presence.js +185 -0
  22. package/dist/arc/task-lifecycle.js +65 -0
  23. package/dist/heart/active-work.js +837 -26
  24. package/dist/heart/agent-entry.js +58 -3
  25. package/dist/heart/attachments/image-normalize.js +194 -0
  26. package/dist/heart/attachments/materialize.js +97 -0
  27. package/dist/heart/attachments/originals.js +88 -0
  28. package/dist/heart/attachments/render.js +29 -0
  29. package/dist/heart/attachments/sources/adapter.js +2 -0
  30. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  31. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  32. package/dist/heart/attachments/sources/index.js +16 -0
  33. package/dist/heart/attachments/store.js +103 -0
  34. package/dist/heart/attachments/types.js +93 -0
  35. package/dist/heart/auth/auth-flow.js +479 -0
  36. package/dist/heart/background-operations.js +281 -0
  37. package/dist/heart/bundle-state.js +168 -0
  38. package/dist/heart/commitments.js +111 -0
  39. package/dist/heart/config-registry.js +304 -0
  40. package/dist/heart/config.js +114 -118
  41. package/dist/heart/core.js +925 -246
  42. package/dist/heart/cross-chat-delivery.js +3 -18
  43. package/dist/heart/daemon/agent-config-check.js +512 -0
  44. package/dist/heart/daemon/agent-discovery.js +102 -3
  45. package/dist/heart/daemon/agent-service.js +522 -0
  46. package/dist/heart/daemon/agentic-repair.js +554 -0
  47. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  48. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  49. package/dist/heart/daemon/cadence.js +70 -0
  50. package/dist/heart/daemon/cli-defaults.js +665 -0
  51. package/dist/heart/daemon/cli-exec.js +7565 -0
  52. package/dist/heart/daemon/cli-help.js +498 -0
  53. package/dist/heart/daemon/cli-parse.js +1590 -0
  54. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  55. package/dist/heart/daemon/cli-render.js +775 -0
  56. package/dist/heart/daemon/cli-types.js +8 -0
  57. package/dist/heart/daemon/connect-bay.js +323 -0
  58. package/dist/heart/daemon/daemon-cli.js +29 -1672
  59. package/dist/heart/daemon/daemon-entry.js +417 -2
  60. package/dist/heart/daemon/daemon-health.js +183 -0
  61. package/dist/heart/daemon/daemon-rollup.js +58 -0
  62. package/dist/heart/daemon/daemon-runtime-sync.js +87 -13
  63. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  64. package/dist/heart/daemon/daemon.js +758 -71
  65. package/dist/heart/daemon/dns-workflow.js +394 -0
  66. package/dist/heart/daemon/doctor-types.js +8 -0
  67. package/dist/heart/daemon/doctor.js +844 -0
  68. package/dist/heart/daemon/drift-detection.js +146 -0
  69. package/dist/heart/daemon/health-monitor.js +122 -1
  70. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  71. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  72. package/dist/heart/daemon/http-health-probe.js +80 -0
  73. package/dist/heart/daemon/human-command-screens.js +234 -0
  74. package/dist/heart/daemon/human-readiness.js +114 -0
  75. package/dist/heart/daemon/inner-status.js +102 -0
  76. package/dist/heart/daemon/interactive-repair.js +394 -0
  77. package/dist/heart/daemon/launchd.js +37 -8
  78. package/dist/heart/daemon/log-tailer.js +82 -12
  79. package/dist/heart/daemon/logs-prune.js +110 -0
  80. package/dist/heart/daemon/mcp-canary.js +297 -0
  81. package/dist/heart/daemon/message-router.js +2 -2
  82. package/dist/heart/daemon/os-cron-deps.js +135 -0
  83. package/dist/heart/daemon/os-cron.js +14 -12
  84. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  85. package/dist/heart/daemon/ouro-entry.js +3 -1
  86. package/dist/heart/daemon/process-manager.js +375 -33
  87. package/dist/heart/daemon/provider-discovery.js +137 -0
  88. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  89. package/dist/heart/daemon/pulse.js +475 -0
  90. package/dist/heart/daemon/readiness-repair.js +365 -0
  91. package/dist/heart/daemon/run-hooks.js +2 -0
  92. package/dist/heart/daemon/runtime-logging.js +67 -16
  93. package/dist/heart/daemon/runtime-metadata.js +3 -31
  94. package/dist/heart/daemon/safe-mode.js +161 -0
  95. package/dist/heart/daemon/sense-manager.js +353 -38
  96. package/dist/heart/daemon/session-id-resolver.js +131 -0
  97. package/dist/heart/daemon/skill-management-installer.js +94 -0
  98. package/dist/heart/daemon/socket-client.js +158 -11
  99. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  100. package/dist/heart/daemon/startup-tui.js +330 -0
  101. package/dist/heart/daemon/task-scheduler.js +3 -25
  102. package/dist/heart/daemon/terminal-ui.js +499 -0
  103. package/dist/heart/daemon/thoughts.js +162 -17
  104. package/dist/heart/daemon/up-progress.js +366 -0
  105. package/dist/heart/daemon/vault-items.js +56 -0
  106. package/dist/heart/delegation.js +1 -1
  107. package/dist/heart/habits/habit-migration.js +189 -0
  108. package/dist/heart/habits/habit-parser.js +140 -0
  109. package/dist/heart/habits/habit-runtime-state.js +100 -0
  110. package/dist/heart/habits/habit-scheduler.js +372 -0
  111. package/dist/heart/{daemon → hatch}/hatch-flow.js +52 -117
  112. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  113. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  114. package/dist/heart/{daemon → hatch}/specialist-tools.js +35 -12
  115. package/dist/heart/identity.js +200 -51
  116. package/dist/heart/kept-notes.js +357 -0
  117. package/dist/heart/kicks.js +1 -1
  118. package/dist/heart/machine-identity.js +161 -0
  119. package/dist/heart/mail-import-discovery.js +353 -0
  120. package/dist/heart/mailbox/mailbox-http-hooks.js +66 -0
  121. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  122. package/dist/heart/mailbox/mailbox-http-routes.js +246 -0
  123. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  124. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  125. package/dist/heart/mailbox/mailbox-http.js +99 -0
  126. package/dist/heart/mailbox/mailbox-read.js +31 -0
  127. package/dist/heart/mailbox/mailbox-types.js +27 -0
  128. package/dist/heart/mailbox/mailbox-view.js +195 -0
  129. package/dist/heart/mailbox/readers/agent-machine.js +382 -0
  130. package/dist/heart/mailbox/readers/continuity-readers.js +338 -0
  131. package/dist/heart/mailbox/readers/mail.js +362 -0
  132. package/dist/heart/mailbox/readers/runtime-readers.js +651 -0
  133. package/dist/heart/mailbox/readers/sessions.js +232 -0
  134. package/dist/heart/mailbox/readers/shared.js +111 -0
  135. package/dist/heart/mcp/mcp-server.js +683 -0
  136. package/dist/heart/migrate-config.js +100 -0
  137. package/dist/heart/model-capabilities.js +19 -0
  138. package/dist/heart/platform.js +81 -0
  139. package/dist/heart/provider-attempt.js +134 -0
  140. package/dist/heart/provider-binding-resolver.js +255 -0
  141. package/dist/heart/provider-credentials.js +425 -0
  142. package/dist/heart/provider-failover.js +301 -0
  143. package/dist/heart/provider-models.js +81 -0
  144. package/dist/heart/provider-ping.js +262 -0
  145. package/dist/heart/provider-state.js +216 -0
  146. package/dist/heart/provider-visibility.js +188 -0
  147. package/dist/heart/providers/anthropic-token.js +131 -0
  148. package/dist/heart/providers/anthropic.js +139 -52
  149. package/dist/heart/providers/azure.js +97 -13
  150. package/dist/heart/providers/error-classification.js +127 -0
  151. package/dist/heart/providers/github-copilot.js +145 -0
  152. package/dist/heart/providers/minimax-vlm.js +189 -0
  153. package/dist/heart/providers/minimax.js +26 -8
  154. package/dist/heart/providers/openai-codex.js +55 -40
  155. package/dist/heart/runtime-capability-check.js +170 -0
  156. package/dist/heart/runtime-credentials.js +367 -0
  157. package/dist/heart/runtime-cwd.js +87 -0
  158. package/dist/heart/sense-truth.js +11 -4
  159. package/dist/heart/session-activity.js +43 -22
  160. package/dist/heart/session-events.js +1149 -0
  161. package/dist/heart/session-playback-cli-main.js +5 -0
  162. package/dist/heart/session-playback-cli.js +36 -0
  163. package/dist/heart/session-playback.js +231 -0
  164. package/dist/heart/session-stats-cli-main.js +5 -0
  165. package/dist/heart/session-stats.js +182 -0
  166. package/dist/heart/session-transcript.js +243 -0
  167. package/dist/heart/start-of-turn-packet.js +345 -0
  168. package/dist/heart/streaming.js +44 -27
  169. package/dist/heart/sync-classification.js +176 -0
  170. package/dist/heart/sync.js +449 -0
  171. package/dist/heart/target-resolution.js +9 -5
  172. package/dist/heart/tempo.js +93 -0
  173. package/dist/heart/temporal-view.js +41 -0
  174. package/dist/heart/timeouts.js +101 -0
  175. package/dist/heart/tool-activity-callbacks.js +59 -0
  176. package/dist/heart/tool-description.js +139 -0
  177. package/dist/heart/tool-friction.js +55 -0
  178. package/dist/heart/tool-loop.js +200 -0
  179. package/dist/heart/turn-context.js +381 -0
  180. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  181. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  182. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  183. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  184. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  185. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  186. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  187. package/dist/mailbox-ui/assets/index-BPr5vNuM.css +1 -0
  188. package/dist/mailbox-ui/assets/index-Cm51CY9W.js +61 -0
  189. package/dist/mailbox-ui/index.html +15 -0
  190. package/dist/mailroom/attention.js +167 -0
  191. package/dist/mailroom/autonomy.js +209 -0
  192. package/dist/mailroom/blob-store.js +674 -0
  193. package/dist/mailroom/body-cache.js +61 -0
  194. package/dist/mailroom/core.js +720 -0
  195. package/dist/mailroom/entry.js +160 -0
  196. package/dist/mailroom/file-store.js +430 -0
  197. package/dist/mailroom/mbox-import.js +383 -0
  198. package/dist/mailroom/outbound.js +380 -0
  199. package/dist/mailroom/policy.js +263 -0
  200. package/dist/mailroom/reader.js +233 -0
  201. package/dist/mailroom/search-cache.js +256 -0
  202. package/dist/mailroom/search-relevance.js +319 -0
  203. package/dist/mailroom/smtp-ingress.js +176 -0
  204. package/dist/mailroom/source-state.js +176 -0
  205. package/dist/mailroom/thread.js +109 -0
  206. package/dist/mailroom/travel-extract.js +89 -0
  207. package/dist/mind/bundle-manifest.js +7 -1
  208. package/dist/mind/context.js +165 -101
  209. package/dist/mind/diary-integrity.js +60 -0
  210. package/dist/mind/{memory.js → diary.js} +62 -75
  211. package/dist/mind/embedding-provider.js +60 -0
  212. package/dist/mind/file-state.js +179 -0
  213. package/dist/mind/friends/channel.js +30 -0
  214. package/dist/mind/friends/resolver.js +54 -2
  215. package/dist/mind/friends/store-file.js +39 -3
  216. package/dist/mind/friends/types.js +2 -2
  217. package/dist/mind/journal-index.js +161 -0
  218. package/dist/mind/note-search.js +268 -0
  219. package/dist/mind/obligation-steering.js +221 -0
  220. package/dist/mind/pending.js +4 -0
  221. package/dist/mind/prompt-refresh.js +3 -2
  222. package/dist/mind/prompt.js +995 -123
  223. package/dist/mind/provenance-trust.js +26 -0
  224. package/dist/mind/scrutiny.js +173 -0
  225. package/dist/nerves/cli-logging.js +7 -1
  226. package/dist/nerves/coverage/audit-rules.js +15 -6
  227. package/dist/nerves/coverage/audit.js +28 -2
  228. package/dist/nerves/coverage/cli.js +1 -1
  229. package/dist/nerves/coverage/contract.js +5 -5
  230. package/dist/nerves/coverage/file-completeness.js +139 -5
  231. package/dist/nerves/coverage/run-artifacts.js +1 -1
  232. package/dist/nerves/event-buffer.js +111 -0
  233. package/dist/nerves/index.js +224 -4
  234. package/dist/nerves/observation.js +20 -0
  235. package/dist/nerves/redact.js +79 -0
  236. package/dist/nerves/review/cli-main.js +5 -0
  237. package/dist/nerves/review/cli.js +156 -0
  238. package/dist/nerves/review/core.js +152 -0
  239. package/dist/nerves/runtime.js +5 -1
  240. package/dist/repertoire/ado-client.js +15 -56
  241. package/dist/repertoire/ado-semantic.js +11 -10
  242. package/dist/repertoire/api-client.js +97 -0
  243. package/dist/repertoire/bitwarden-store.js +816 -0
  244. package/dist/repertoire/bundle-templates.js +72 -0
  245. package/dist/repertoire/bw-installer.js +180 -0
  246. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  247. package/dist/repertoire/coding/context-pack.js +330 -0
  248. package/dist/repertoire/coding/feedback.js +197 -30
  249. package/dist/repertoire/coding/manager.js +158 -9
  250. package/dist/repertoire/coding/spawner.js +55 -9
  251. package/dist/repertoire/coding/tools.js +170 -7
  252. package/dist/repertoire/commerce-errors.js +109 -0
  253. package/dist/repertoire/commerce-self-test.js +156 -0
  254. package/dist/repertoire/credential-access.js +111 -0
  255. package/dist/repertoire/duffel-client.js +185 -0
  256. package/dist/repertoire/github-client.js +14 -55
  257. package/dist/repertoire/graph-client.js +11 -52
  258. package/dist/repertoire/guardrails.js +396 -0
  259. package/dist/repertoire/mcp-client.js +295 -0
  260. package/dist/repertoire/mcp-manager.js +362 -0
  261. package/dist/repertoire/mcp-tools.js +63 -0
  262. package/dist/repertoire/shell-sessions.js +133 -0
  263. package/dist/repertoire/skills.js +15 -24
  264. package/dist/repertoire/stripe-client.js +131 -0
  265. package/dist/repertoire/tasks/board.js +31 -5
  266. package/dist/repertoire/tasks/fix.js +182 -0
  267. package/dist/repertoire/tasks/index.js +16 -4
  268. package/dist/repertoire/tasks/lifecycle.js +2 -2
  269. package/dist/repertoire/tasks/parser.js +3 -2
  270. package/dist/repertoire/tasks/scanner.js +194 -37
  271. package/dist/repertoire/tasks/transitions.js +16 -78
  272. package/dist/repertoire/tool-results.js +29 -0
  273. package/dist/repertoire/tools-attachments.js +317 -0
  274. package/dist/repertoire/tools-base.js +47 -1075
  275. package/dist/repertoire/tools-bluebubbles.js +1 -0
  276. package/dist/repertoire/tools-bridge.js +142 -0
  277. package/dist/repertoire/tools-bundle.js +984 -0
  278. package/dist/repertoire/tools-config.js +185 -0
  279. package/dist/repertoire/tools-continuity.js +248 -0
  280. package/dist/repertoire/tools-credential.js +381 -0
  281. package/dist/repertoire/tools-files.js +342 -0
  282. package/dist/repertoire/tools-flight.js +224 -0
  283. package/dist/repertoire/tools-flow.js +119 -0
  284. package/dist/repertoire/tools-github.js +1 -7
  285. package/dist/repertoire/tools-mail.js +1857 -0
  286. package/dist/repertoire/tools-notes.js +421 -0
  287. package/dist/repertoire/tools-session.js +750 -0
  288. package/dist/repertoire/tools-shell.js +120 -0
  289. package/dist/repertoire/tools-stripe.js +180 -0
  290. package/dist/repertoire/tools-surface.js +243 -0
  291. package/dist/repertoire/tools-teams.js +9 -39
  292. package/dist/repertoire/tools-travel.js +125 -0
  293. package/dist/repertoire/tools-trip.js +604 -0
  294. package/dist/repertoire/tools-user-profile.js +144 -0
  295. package/dist/repertoire/tools-vault.js +40 -0
  296. package/dist/repertoire/tools.js +108 -100
  297. package/dist/repertoire/travel-api-client.js +360 -0
  298. package/dist/repertoire/user-profile.js +131 -0
  299. package/dist/repertoire/vault-setup.js +246 -0
  300. package/dist/repertoire/vault-unlock.js +561 -0
  301. package/dist/scripts/claude-code-hook.js +41 -0
  302. package/dist/scripts/claude-code-stop-hook.js +47 -0
  303. package/dist/senses/attention-queue.js +116 -0
  304. package/dist/senses/bluebubbles/active-turns.js +216 -0
  305. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  306. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  307. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  308. package/dist/senses/bluebubbles/entry.js +77 -0
  309. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  310. package/dist/senses/bluebubbles/index.js +2305 -0
  311. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  312. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  313. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  314. package/dist/senses/bluebubbles/processed-log.js +133 -0
  315. package/dist/senses/bluebubbles/replay.js +137 -0
  316. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  317. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  318. package/dist/senses/cli/bracketed-paste.js +82 -0
  319. package/dist/senses/cli/image-paste.js +287 -0
  320. package/dist/senses/cli/image-ref-navigation.js +75 -0
  321. package/dist/senses/cli/ink-app.js +156 -0
  322. package/dist/senses/cli/inline-diff.js +64 -0
  323. package/dist/senses/cli/input-keys.js +174 -0
  324. package/dist/senses/cli/kill-ring.js +86 -0
  325. package/dist/senses/cli/message-list.js +51 -0
  326. package/dist/senses/cli/ouro-tui.js +607 -0
  327. package/dist/senses/cli/spinner-imperative.js +135 -0
  328. package/dist/senses/cli/spinner.js +101 -0
  329. package/dist/senses/cli/status-line.js +60 -0
  330. package/dist/senses/cli/streaming-markdown.js +526 -0
  331. package/dist/senses/cli/tool-display.js +85 -0
  332. package/dist/senses/cli/tool-render.js +85 -0
  333. package/dist/senses/cli/tui-store.js +240 -0
  334. package/dist/senses/cli/virtual-list.js +35 -0
  335. package/dist/senses/cli-entry.js +60 -8
  336. package/dist/senses/cli-layout.js +187 -0
  337. package/dist/senses/cli.js +520 -209
  338. package/dist/senses/commands.js +66 -3
  339. package/dist/senses/habit-turn-message.js +108 -0
  340. package/dist/senses/inner-dialog-worker.js +175 -21
  341. package/dist/senses/inner-dialog.js +330 -27
  342. package/dist/senses/mail-entry.js +66 -0
  343. package/dist/senses/mail.js +379 -0
  344. package/dist/senses/pipeline.js +569 -182
  345. package/dist/senses/proactive-content-guard.js +51 -0
  346. package/dist/senses/shared-turn.js +248 -0
  347. package/dist/senses/surface-tool.js +68 -0
  348. package/dist/senses/teams-entry.js +60 -8
  349. package/dist/senses/teams.js +387 -98
  350. package/dist/senses/trust-gate.js +100 -5
  351. package/dist/trips/core.js +138 -0
  352. package/dist/trips/store.js +146 -0
  353. package/package.json +38 -7
  354. package/skills/agent-commerce.md +106 -0
  355. package/skills/browser-navigation.md +117 -0
  356. package/skills/commerce-setup-guide.md +116 -0
  357. package/skills/commerce-setup.md +84 -0
  358. package/skills/configure-dev-tools.md +101 -0
  359. package/skills/travel-planning.md +138 -0
  360. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  361. package/dist/heart/daemon/subagent-installer.js +0 -166
  362. package/dist/heart/session-recall.js +0 -116
  363. package/dist/mind/associative-recall.js +0 -209
  364. package/dist/senses/bluebubbles-entry.js +0 -13
  365. package/dist/senses/bluebubbles.js +0 -1177
  366. package/dist/senses/debug-activity.js +0 -148
  367. package/subagents/README.md +0 -86
  368. package/subagents/work-doer.md +0 -237
  369. package/subagents/work-merger.md +0 -618
  370. package/subagents/work-planner.md +0 -390
  371. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  372. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  373. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  374. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  375. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  376. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  377. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  378. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  379. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  380. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  381. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  382. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  383. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  384. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  385. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  386. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,526 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.StreamingMarkdown = StreamingMarkdown;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const react_1 = __importDefault(require("react"));
9
+ const ink_1 = require("ink");
10
+ // ─── Block Parser ──────────────────────────────────────────────────
11
+ const HR_PATTERN = /^(\s*[-*_]){3,}\s*$/;
12
+ /** Detect if a line is a diff header or hunk marker. */
13
+ function isDiffLine(line) {
14
+ return (line.startsWith("diff --git") ||
15
+ line.startsWith("index ") ||
16
+ line.startsWith("--- ") ||
17
+ line.startsWith("+++ ") ||
18
+ line.startsWith("@@") ||
19
+ line.startsWith("+") ||
20
+ line.startsWith("-"));
21
+ }
22
+ /** Check if a block of consecutive lines looks like a unified diff. */
23
+ function looksLikeDiff(lines) {
24
+ return lines.some(l => l.startsWith("diff --git") ||
25
+ l.startsWith("@@") ||
26
+ l.startsWith("--- a/") ||
27
+ l.startsWith("+++ b/"));
28
+ }
29
+ /** Check if a line is a table row (starts and ends with pipe, has inner pipes). */
30
+ function isTableRow(line) {
31
+ const trimmed = line.trim();
32
+ return trimmed.startsWith("|") && trimmed.endsWith("|") && trimmed.length > 2;
33
+ }
34
+ /** Check if a line is a table separator (e.g., |---|---|). */
35
+ function isTableSeparator(line) {
36
+ const trimmed = line.trim();
37
+ if (!trimmed.startsWith("|") || !trimmed.endsWith("|"))
38
+ return false;
39
+ // Between outer pipes, each cell must be only dashes, colons, and spaces
40
+ const inner = trimmed.slice(1, -1);
41
+ return inner.split("|").every(cell => /^\s*:?-+:?\s*$/.test(cell));
42
+ }
43
+ function parseBlocks(input) {
44
+ const rawLines = input.split("\n");
45
+ const blocks = [];
46
+ let i = 0;
47
+ while (i < rawLines.length) {
48
+ const line = rawLines[i];
49
+ // Fenced code block (``` with optional language)
50
+ if (line.trimStart().startsWith("```")) {
51
+ const langMatch = line.trimStart().match(/^```(\S*)/);
52
+ const language = langMatch?.[1] ?? "";
53
+ // Special case: ```diff -> render as diff block
54
+ if (language === "diff") {
55
+ const codeLines = [];
56
+ i++;
57
+ while (i < rawLines.length && !rawLines[i].trimStart().startsWith("```")) {
58
+ codeLines.push(rawLines[i]);
59
+ i++;
60
+ }
61
+ if (i < rawLines.length)
62
+ i++;
63
+ blocks.push({ type: "diff", lines: codeLines });
64
+ continue;
65
+ }
66
+ const codeLines = [];
67
+ i++;
68
+ while (i < rawLines.length && !rawLines[i].trimStart().startsWith("```")) {
69
+ codeLines.push(rawLines[i]);
70
+ i++;
71
+ }
72
+ // Skip closing fence if present (if not, it's a streaming partial)
73
+ if (i < rawLines.length)
74
+ i++;
75
+ blocks.push({ type: "codeblock", language, lines: codeLines });
76
+ continue;
77
+ }
78
+ // Horizontal rule (---, ***, ___) -- must come before heading check
79
+ // to avoid "---" being treated differently
80
+ if (HR_PATTERN.test(line)) {
81
+ blocks.push({ type: "hr", lines: [line] });
82
+ i++;
83
+ continue;
84
+ }
85
+ // Heading (# through ######)
86
+ const headingMatch = line.match(/^(#{1,6})\s+(.*)$/);
87
+ if (headingMatch) {
88
+ blocks.push({ type: "heading", level: headingMatch[1].length, lines: [headingMatch[2]] });
89
+ i++;
90
+ continue;
91
+ }
92
+ // Blockquote (> text) -- handle nested levels
93
+ if (/^>/.test(line)) {
94
+ const quoteLines = [];
95
+ // Determine nesting depth from first line
96
+ const depthMatch = line.match(/^(>+)\s?/);
97
+ const depth = depthMatch ? depthMatch[1].length : 1;
98
+ while (i < rawLines.length && /^>/.test(rawLines[i])) {
99
+ // Strip the leading > markers (up to depth levels)
100
+ let stripped = rawLines[i];
101
+ for (let d = 0; d < depth; d++) {
102
+ stripped = stripped.replace(/^>\s?/, "");
103
+ }
104
+ quoteLines.push(stripped);
105
+ i++;
106
+ }
107
+ blocks.push({ type: "blockquote", level: depth, lines: quoteLines });
108
+ continue;
109
+ }
110
+ // Table detection: line is a table row, and next line (or line after) is a separator
111
+ if (isTableRow(line)) {
112
+ const tableLines = [];
113
+ const startI = i;
114
+ // Collect consecutive table-like rows
115
+ while (i < rawLines.length && isTableRow(rawLines[i])) {
116
+ tableLines.push(rawLines[i]);
117
+ i++;
118
+ }
119
+ // Validate: must have at least a header, separator, and one data row
120
+ if (tableLines.length >= 2 && tableLines.some(l => isTableSeparator(l))) {
121
+ blocks.push({ type: "table", lines: tableLines });
122
+ continue;
123
+ }
124
+ // Not a valid table, backtrack
125
+ i = startI;
126
+ }
127
+ // Diff block detection: consecutive diff-like lines with a strong signal
128
+ if (isDiffLine(line)) {
129
+ const diffLines = [];
130
+ const startI = i;
131
+ while (i < rawLines.length && isDiffLine(rawLines[i])) {
132
+ diffLines.push(rawLines[i]);
133
+ i++;
134
+ }
135
+ if (looksLikeDiff(diffLines)) {
136
+ blocks.push({ type: "diff", lines: diffLines });
137
+ continue;
138
+ }
139
+ // Not actually a diff -- backtrack and treat as paragraph
140
+ i = startI;
141
+ }
142
+ // Blank line
143
+ if (line.trim() === "") {
144
+ blocks.push({ type: "blank", lines: [""] });
145
+ i++;
146
+ continue;
147
+ }
148
+ // Regular paragraph (collect consecutive non-special lines)
149
+ const paraLines = [];
150
+ while (i < rawLines.length &&
151
+ rawLines[i].trim() !== "" &&
152
+ !rawLines[i].trimStart().startsWith("```") &&
153
+ !rawLines[i].match(/^#{1,6}\s/) &&
154
+ !/^>/.test(rawLines[i]) &&
155
+ !HR_PATTERN.test(rawLines[i])) {
156
+ paraLines.push(rawLines[i]);
157
+ i++;
158
+ }
159
+ if (paraLines.length > 0) {
160
+ blocks.push({ type: "paragraph", lines: paraLines });
161
+ }
162
+ }
163
+ return blocks;
164
+ }
165
+ // ─── HTML Entity Decoding ─────────────────────────────────────────
166
+ const HTML_ENTITIES = {
167
+ "&lt;": "<",
168
+ "&gt;": ">",
169
+ "&amp;": "&",
170
+ "&quot;": "\"",
171
+ "&#39;": "'",
172
+ "&apos;": "'",
173
+ "&nbsp;": " ",
174
+ };
175
+ function decodeHtmlEntities(text) {
176
+ return text.replace(/&(?:#39|lt|gt|amp|quot|apos|nbsp);/g, match => HTML_ENTITIES[match] ?? match);
177
+ }
178
+ // ─── Escape Handling ──────────────────────────────────────────────
179
+ /** Sentinel character for protected escapes. */
180
+ const ESC_SENTINEL = "\x01";
181
+ /** Replace \*, \_, \`, \\ with sentinels before inline parsing. */
182
+ function protectEscapes(text) {
183
+ const escapes = [];
184
+ const processed = text.replace(/\\([*_`\\[\]()~<>])/g, (_m, char) => {
185
+ const idx = escapes.length;
186
+ escapes.push(char);
187
+ return `${ESC_SENTINEL}ESC${idx}${ESC_SENTINEL}`;
188
+ });
189
+ return { text: processed, escapes };
190
+ }
191
+ /** Restore escape sentinels to their literal characters. */
192
+ function restoreEscapes(text, escapes) {
193
+ return text.replace(new RegExp(`${ESC_SENTINEL}ESC(\\d+)${ESC_SENTINEL}`, "g"), (_m, idx) => {
194
+ return escapes[parseInt(idx)] ?? "";
195
+ });
196
+ }
197
+ // ─── Inline Parser ─────────────────────────────────────────────────
198
+ /**
199
+ * Parse inline markdown (bold, italic, bold-italic, code, links,
200
+ * autolinks, strikethrough, escapes, HTML entities) from a single line.
201
+ */
202
+ function parseInline(text) {
203
+ // Step 0: decode HTML entities
204
+ let processed = decodeHtmlEntities(text);
205
+ // Step 1: protect escape sequences
206
+ const { text: escaped, escapes } = protectEscapes(processed);
207
+ processed = escaped;
208
+ const segments = [];
209
+ const placeholders = [];
210
+ // Step 2: extract inline code
211
+ processed = processed.replace(/`([^`\n]+)`/g, (_m, code) => {
212
+ const idx = placeholders.length;
213
+ placeholders.push({ idx, segment: { text: restoreEscapes(code, escapes), code: true } });
214
+ return `\x00PH${idx}\x00`;
215
+ });
216
+ // Step 3a: extract image references ![alt](url) -> placeholder
217
+ processed = processed.replace(/!\[([^\]]*)\]\(([^)]*)\)/g, (_m, alt, _url) => {
218
+ const idx = placeholders.length;
219
+ const label = alt ? `\ud83d\uddbc ${restoreEscapes(alt, escapes)}` : "\ud83d\uddbc image";
220
+ placeholders.push({ idx, segment: { text: label, image: true } });
221
+ return `\x00PH${idx}\x00`;
222
+ });
223
+ // Step 3b: extract [Image: ...] references
224
+ processed = processed.replace(/\[Image:\s*([^\]]*)\]/gi, (_m, desc) => {
225
+ const idx = placeholders.length;
226
+ const label = desc.trim() ? `\ud83d\uddbc ${restoreEscapes(desc.trim(), escapes)}` : "\ud83d\uddbc image";
227
+ placeholders.push({ idx, segment: { text: label, image: true } });
228
+ return `\x00PH${idx}\x00`;
229
+ });
230
+ // Step 3c: extract links [text](url)
231
+ processed = processed.replace(/\[([^\]]*)\]\(([^)]*)\)/g, (_m, linkText, url) => {
232
+ const idx = placeholders.length;
233
+ const restoredText = restoreEscapes(linkText, escapes);
234
+ const restoredUrl = restoreEscapes(url, escapes);
235
+ placeholders.push({ idx, segment: { text: restoredText, link: { text: restoredText, url: restoredUrl } } });
236
+ return `\x00PH${idx}\x00`;
237
+ });
238
+ // Step 4: extract autolinks <https://...>
239
+ processed = processed.replace(/<(https?:\/\/[^>]+)>/g, (_m, url) => {
240
+ const idx = placeholders.length;
241
+ const restoredUrl = restoreEscapes(url, escapes);
242
+ placeholders.push({ idx, segment: { text: restoredUrl, autolink: true } });
243
+ return `\x00PH${idx}\x00`;
244
+ });
245
+ // Step 5: extract strikethrough ~~text~~
246
+ processed = processed.replace(/~~(.+?)~~/g, (_m, content) => {
247
+ const idx = placeholders.length;
248
+ placeholders.push({ idx, segment: { text: restoreEscapes(content, escapes), strikethrough: true } });
249
+ return `\x00PH${idx}\x00`;
250
+ });
251
+ // Step 6: parse bold-italic, bold, and italic from remaining text
252
+ const parts = processed.split(/(\x00PH\d+\x00)/);
253
+ for (const part of parts) {
254
+ const phMatch = part.match(/^\x00PH(\d+)\x00$/);
255
+ if (phMatch) {
256
+ segments.push(placeholders[parseInt(phMatch[1])].segment);
257
+ continue;
258
+ }
259
+ // Parse ***bold italic***, **bold**, *italic*, _italic_
260
+ parseInlineStyles(part, segments, escapes);
261
+ }
262
+ return segments;
263
+ }
264
+ function parseInlineStyles(text, segments, escapes) {
265
+ // Match ***bold italic***, **_bold italic_**, **bold**, *italic*, _italic_
266
+ // Order matters: triple-star before double-star before single-star
267
+ const pattern = /(\*\*\*(.+?)\*\*\*)|(\*\*_(.+?)_\*\*)|(\*\*(.+?)\*\*)|(\*(.+?)\*)|(_(.+?)_)/g;
268
+ let lastIndex = 0;
269
+ let match;
270
+ while ((match = pattern.exec(text)) !== null) {
271
+ if (match.index > lastIndex) {
272
+ const plain = restoreEscapes(text.slice(lastIndex, match.index), escapes);
273
+ if (plain)
274
+ segments.push({ text: plain });
275
+ }
276
+ if (match[2]) {
277
+ // ***bold italic***
278
+ segments.push({ text: restoreEscapes(match[2], escapes), bold: true, italic: true });
279
+ }
280
+ else if (match[4]) {
281
+ // **_bold italic_**
282
+ segments.push({ text: restoreEscapes(match[4], escapes), bold: true, italic: true });
283
+ }
284
+ else if (match[6]) {
285
+ // **bold**
286
+ segments.push({ text: restoreEscapes(match[6], escapes), bold: true });
287
+ }
288
+ else if (match[8]) {
289
+ // *italic*
290
+ segments.push({ text: restoreEscapes(match[8], escapes), italic: true });
291
+ }
292
+ else if (match[10]) {
293
+ // _italic_
294
+ segments.push({ text: restoreEscapes(match[10], escapes), italic: true });
295
+ }
296
+ lastIndex = match.index + match[0].length;
297
+ }
298
+ if (lastIndex < text.length) {
299
+ const plain = restoreEscapes(text.slice(lastIndex), escapes);
300
+ if (plain)
301
+ segments.push({ text: plain });
302
+ }
303
+ }
304
+ function parseTaskListItem(line) {
305
+ const match = line.match(/^(\s*)-\s+\[([ xX])\]\s(.*)$/);
306
+ if (!match)
307
+ return null;
308
+ return {
309
+ indent: match[1],
310
+ checked: match[2].toLowerCase() === "x",
311
+ text: match[3],
312
+ };
313
+ }
314
+ function parseTable(lines) {
315
+ if (lines.length < 2)
316
+ return null;
317
+ // Find the separator row
318
+ let sepIdx = -1;
319
+ for (let i = 0; i < lines.length; i++) {
320
+ if (isTableSeparator(lines[i])) {
321
+ sepIdx = i;
322
+ break;
323
+ }
324
+ }
325
+ if (sepIdx < 1)
326
+ return null; // separator must not be the first line
327
+ const parseCells = (line) => {
328
+ const trimmed = line.trim();
329
+ // Remove leading and trailing pipes, split by pipe
330
+ const inner = trimmed.slice(1, -1);
331
+ return inner.split("|").map(c => c.trim());
332
+ };
333
+ const headers = parseCells(lines[sepIdx - 1]);
334
+ const rows = [];
335
+ for (let i = sepIdx + 1; i < lines.length; i++) {
336
+ if (!isTableSeparator(lines[i])) {
337
+ rows.push(parseCells(lines[i]));
338
+ }
339
+ }
340
+ // Calculate column widths
341
+ const columnWidths = headers.map((h, ci) => {
342
+ let max = h.length;
343
+ for (const row of rows) {
344
+ const cell = row[ci] ?? "";
345
+ if (cell.length > max)
346
+ max = cell.length;
347
+ }
348
+ return Math.max(max, 3); // minimum width of 3
349
+ });
350
+ return { headers, rows, columnWidths };
351
+ }
352
+ // ─── Word Wrap ─────────────────────────────────────────────────────
353
+ function wrapText(text, maxWidth) {
354
+ /* v8 ignore next -- defensive guard for non-positive width @preserve */
355
+ if (maxWidth <= 0)
356
+ return text;
357
+ const lines = text.split("\n");
358
+ const result = [];
359
+ for (const line of lines) {
360
+ if (line.length <= maxWidth) {
361
+ result.push(line);
362
+ }
363
+ else {
364
+ let remaining = line;
365
+ while (remaining.length > maxWidth) {
366
+ let breakAt = remaining.lastIndexOf(" ", maxWidth);
367
+ if (breakAt <= 0)
368
+ breakAt = maxWidth;
369
+ result.push(remaining.slice(0, breakAt));
370
+ remaining = remaining.slice(breakAt).replace(/^ /, "");
371
+ }
372
+ /* v8 ignore next -- defensive guard for empty remaining after word-wrap @preserve */
373
+ if (remaining)
374
+ result.push(remaining);
375
+ }
376
+ }
377
+ return result.join("\n");
378
+ }
379
+ // ─── Segment Renderer ──────────────────────────────────────────────
380
+ function SegmentRenderer({ segment }) {
381
+ if (segment.image) {
382
+ return (0, jsx_runtime_1.jsx)(ink_1.Text, { dimColor: true, children: segment.text });
383
+ }
384
+ if (segment.codeBlock) {
385
+ return (0, jsx_runtime_1.jsx)(ink_1.Text, { dimColor: true, children: segment.text });
386
+ }
387
+ if (segment.code) {
388
+ return (0, jsx_runtime_1.jsx)(ink_1.Text, { color: "cyan", children: segment.text });
389
+ }
390
+ if (segment.autolink) {
391
+ return (0, jsx_runtime_1.jsx)(ink_1.Text, { color: "cyan", children: segment.text });
392
+ }
393
+ if (segment.link) {
394
+ return ((0, jsx_runtime_1.jsxs)(ink_1.Text, { children: [(0, jsx_runtime_1.jsx)(ink_1.Text, { children: segment.link.text }), (0, jsx_runtime_1.jsx)(ink_1.Text, { color: "cyan", dimColor: true, children: ` (${segment.link.url})` })] }));
395
+ }
396
+ if (segment.strikethrough) {
397
+ return (0, jsx_runtime_1.jsx)(ink_1.Text, { dimColor: true, strikethrough: true, children: segment.text });
398
+ }
399
+ if (segment.bold && segment.italic) {
400
+ return (0, jsx_runtime_1.jsx)(ink_1.Text, { bold: true, italic: true, children: segment.text });
401
+ }
402
+ if (segment.bold) {
403
+ return (0, jsx_runtime_1.jsx)(ink_1.Text, { bold: true, children: segment.text });
404
+ }
405
+ if (segment.italic) {
406
+ return (0, jsx_runtime_1.jsx)(ink_1.Text, { italic: true, children: segment.text });
407
+ }
408
+ return (0, jsx_runtime_1.jsx)(ink_1.Text, { children: segment.text });
409
+ }
410
+ // ─── Inline Line Renderer ──────────────────────────────────────────
411
+ function InlineLine({ text: lineText }) {
412
+ const segs = parseInline(lineText);
413
+ return ((0, jsx_runtime_1.jsx)(ink_1.Text, { children: segs.map((seg, i) => ((0, jsx_runtime_1.jsx)(SegmentRenderer, { segment: seg }, i))) }));
414
+ }
415
+ // ─── Diff Line Renderer ───────────────────────────────────────────
416
+ function DiffLine({ line }) {
417
+ if (line.startsWith("@@")) {
418
+ return (0, jsx_runtime_1.jsx)(ink_1.Text, { color: "cyan", children: line });
419
+ }
420
+ if (line.startsWith("diff --git") ||
421
+ line.startsWith("index ") ||
422
+ line.startsWith("--- ") ||
423
+ line.startsWith("+++ ")) {
424
+ return (0, jsx_runtime_1.jsx)(ink_1.Text, { bold: true, children: line });
425
+ }
426
+ if (line.startsWith("+")) {
427
+ return (0, jsx_runtime_1.jsx)(ink_1.Text, { color: "green", children: line });
428
+ }
429
+ if (line.startsWith("-")) {
430
+ return (0, jsx_runtime_1.jsx)(ink_1.Text, { color: "red", children: line });
431
+ }
432
+ return (0, jsx_runtime_1.jsx)(ink_1.Text, { children: line });
433
+ }
434
+ // ─── Table Renderer ───────────────────────────────────────────────
435
+ function TableRenderer({ lines }) {
436
+ const table = parseTable(lines);
437
+ if (!table) {
438
+ // Fallback: render raw lines
439
+ return ((0, jsx_runtime_1.jsx)(ink_1.Box, { flexDirection: "column", children: lines.map((line, i) => ((0, jsx_runtime_1.jsx)(ink_1.Text, { children: line }, i))) }));
440
+ }
441
+ const { headers, rows, columnWidths } = table;
442
+ const padCell = (text, width) => {
443
+ return text + " ".repeat(Math.max(0, width - text.length));
444
+ };
445
+ const renderRow = (cells, bold) => {
446
+ const cellTexts = columnWidths.map((w, ci) => padCell(cells[ci] ?? "", w));
447
+ const rowText = "| " + cellTexts.join(" | ") + " |";
448
+ if (bold)
449
+ return (0, jsx_runtime_1.jsx)(ink_1.Text, { bold: true, children: rowText });
450
+ return (0, jsx_runtime_1.jsx)(InlineLine, { text: rowText });
451
+ };
452
+ const separatorRow = "| " + columnWidths.map(w => "-".repeat(w)).join(" | ") + " |";
453
+ return ((0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "column", children: [renderRow(headers, true), (0, jsx_runtime_1.jsx)(ink_1.Text, { dimColor: true, children: separatorRow }), rows.map((row, i) => ((0, jsx_runtime_1.jsx)(react_1.default.Fragment, { children: renderRow(row, false) }, i)))] }));
454
+ }
455
+ // ─── Block Renderer ────────────────────────────────────────────────
456
+ function BlockRenderer({ block, isFirst, isLast, maxWidth }) {
457
+ switch (block.type) {
458
+ case "blank":
459
+ return (0, jsx_runtime_1.jsx)(ink_1.Text, { children: "" });
460
+ case "hr":
461
+ return ((0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "column", children: [!isFirst && (0, jsx_runtime_1.jsx)(ink_1.Text, { children: "" }), (0, jsx_runtime_1.jsx)(ink_1.Text, { dimColor: true, children: "\u2500".repeat(40) }), !isLast && (0, jsx_runtime_1.jsx)(ink_1.Text, { children: "" })] }));
462
+ case "heading": {
463
+ const text = block.lines.join(" ");
464
+ return ((0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "column", children: [!isFirst && (0, jsx_runtime_1.jsx)(ink_1.Text, { children: "" }), (block.level ?? 1) === 1
465
+ ? (0, jsx_runtime_1.jsx)(ink_1.Text, { bold: true, underline: true, children: text })
466
+ : (0, jsx_runtime_1.jsx)(ink_1.Text, { bold: true, children: text }), !isLast && (0, jsx_runtime_1.jsx)(ink_1.Text, { children: "" })] }));
467
+ }
468
+ case "codeblock": {
469
+ const langLabel = block.language || undefined;
470
+ return ((0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "column", children: [!isFirst && (0, jsx_runtime_1.jsx)(ink_1.Text, { children: "" }), langLabel && (0, jsx_runtime_1.jsx)(ink_1.Text, { dimColor: true, children: langLabel }), block.lines.map((line, i) => ((0, jsx_runtime_1.jsx)(ink_1.Text, { dimColor: true, children: line }, i))), !isLast && (0, jsx_runtime_1.jsx)(ink_1.Text, { children: "" })] }));
471
+ }
472
+ case "diff":
473
+ return ((0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "column", children: [!isFirst && (0, jsx_runtime_1.jsx)(ink_1.Text, { children: "" }), (0, jsx_runtime_1.jsx)(ink_1.Text, { dimColor: true, children: "\u2500".repeat(40) }), block.lines.map((line, i) => ((0, jsx_runtime_1.jsx)(DiffLine, { line: line }, i))), (0, jsx_runtime_1.jsx)(ink_1.Text, { dimColor: true, children: "\u2500".repeat(40) }), !isLast && (0, jsx_runtime_1.jsx)(ink_1.Text, { children: "" })] }));
474
+ case "table":
475
+ return ((0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "column", children: [!isFirst && (0, jsx_runtime_1.jsx)(ink_1.Text, { children: "" }), (0, jsx_runtime_1.jsx)(TableRenderer, { lines: block.lines }), !isLast && (0, jsx_runtime_1.jsx)(ink_1.Text, { children: "" })] }));
476
+ case "blockquote": {
477
+ const depth = block.level ?? 1;
478
+ const barPrefix = "\u2502 ".repeat(depth);
479
+ const barLen = barPrefix.length;
480
+ const effectiveMax = maxWidth || 80;
481
+ const wrapWidth = Math.max(effectiveMax - barLen, 10);
482
+ // Pre-wrap each line so continuation lines also get the bar prefix
483
+ const wrappedLines = [];
484
+ for (const line of block.lines) {
485
+ if (line.length <= wrapWidth) {
486
+ wrappedLines.push(line);
487
+ }
488
+ else {
489
+ // Simple word wrap
490
+ let remaining = line;
491
+ while (remaining.length > wrapWidth) {
492
+ let breakAt = remaining.lastIndexOf(" ", wrapWidth);
493
+ if (breakAt <= 0)
494
+ breakAt = wrapWidth;
495
+ wrappedLines.push(remaining.slice(0, breakAt));
496
+ remaining = remaining.slice(breakAt).trimStart();
497
+ }
498
+ if (remaining)
499
+ wrappedLines.push(remaining);
500
+ }
501
+ }
502
+ return ((0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "column", children: [!isFirst && (0, jsx_runtime_1.jsx)(ink_1.Text, { children: "" }), wrappedLines.map((line, i) => ((0, jsx_runtime_1.jsxs)(ink_1.Text, { children: [(0, jsx_runtime_1.jsx)(ink_1.Text, { dimColor: true, children: barPrefix }), (0, jsx_runtime_1.jsx)(ink_1.Text, { italic: true, children: (0, jsx_runtime_1.jsx)(InlineLine, { text: line }) })] }, i))), !isLast && (0, jsx_runtime_1.jsx)(ink_1.Text, { children: "" })] }));
503
+ }
504
+ case "paragraph": {
505
+ // Check for task list items and render them specially
506
+ const renderedLines = block.lines.map((line, i) => {
507
+ const task = parseTaskListItem(line);
508
+ if (task) {
509
+ const checkbox = task.checked ? "\u2611" : "\u2610";
510
+ return ((0, jsx_runtime_1.jsxs)(ink_1.Text, { children: [(0, jsx_runtime_1.jsxs)(ink_1.Text, { children: [task.indent, checkbox, " "] }), (0, jsx_runtime_1.jsx)(InlineLine, { text: task.text })] }, i));
511
+ }
512
+ return (0, jsx_runtime_1.jsx)(InlineLine, { text: line }, i);
513
+ });
514
+ return ((0, jsx_runtime_1.jsx)(ink_1.Box, { flexDirection: "column", children: renderedLines }));
515
+ }
516
+ }
517
+ }
518
+ // ─── Main Component ────────────────────────────────────────────────
519
+ function StreamingMarkdown({ text, maxWidth }) {
520
+ const processed = maxWidth ? wrapText(text, maxWidth) : text;
521
+ const blocks = parseBlocks(processed);
522
+ if (blocks.length === 0) {
523
+ return (0, jsx_runtime_1.jsx)(ink_1.Text, { children: "" });
524
+ }
525
+ return ((0, jsx_runtime_1.jsx)(ink_1.Box, { flexDirection: "column", children: blocks.map((block, i) => ((0, jsx_runtime_1.jsx)(BlockRenderer, { block: block, isFirst: i === 0, isLast: i === blocks.length - 1, maxWidth: maxWidth }, i))) }));
526
+ }
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ /**
3
+ * Imperative tool result rendering for the CLI.
4
+ *
5
+ * Writes colored one-liners to stderr — no React, no Ink.
6
+ * Features:
7
+ * - Green check / red cross prefix
8
+ * - Tool name in ouroboros teal
9
+ * - Parsed first argument (file path, command, query) dimmed
10
+ * - For edit_file: compact inline diff summary (+N/-M lines)
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.writeToolStart = writeToolStart;
14
+ exports.writeToolEnd = writeToolEnd;
15
+ const runtime_1 = require("../../nerves/runtime");
16
+ // Flow control tools are invisible to the user — internal agent mechanics.
17
+ // `speak` is included because its visible output is the message itself (delivered
18
+ // via onTextChunk/flushNow), not a "running speak..." spinner or tool-end status line.
19
+ const FLOW_CONTROL_TOOLS = new Set(["settle", "ponder", "observe", "rest", "speak"]);
20
+ // Ouroboros teal: #4ec9b0 -> RGB escape
21
+ const OURO_TEAL = "\x1b[38;2;78;201;176m";
22
+ const GREEN = "\x1b[32m";
23
+ const RED = "\x1b[31m";
24
+ const DIM = "\x1b[2m";
25
+ const BOLD = "\x1b[1m";
26
+ const RESET = "\x1b[0m";
27
+ // Tool name -> primary parameter key mapping
28
+ const PRIMARY_PARAM = {
29
+ edit_file: "path",
30
+ write_file: "path",
31
+ read_file: "path",
32
+ glob: "pattern",
33
+ grep: "pattern",
34
+ shell: "command",
35
+ coding_spawn: "task",
36
+ coding_status: "session_id",
37
+ coding_tail: "session_id",
38
+ };
39
+ function truncate(s, max) {
40
+ return s.length > max ? s.slice(0, max - 3) + "..." : s;
41
+ }
42
+ /**
43
+ * Extract the primary display parameter from tool args.
44
+ */
45
+ function getPrimaryArg(name, args) {
46
+ const primaryKey = PRIMARY_PARAM[name];
47
+ if (primaryKey && typeof args[primaryKey] === "string") {
48
+ return truncate(args[primaryKey], 80);
49
+ }
50
+ // Fallback: show first string value
51
+ for (const val of Object.values(args)) {
52
+ if (typeof val === "string") {
53
+ return truncate(val, 80);
54
+ }
55
+ }
56
+ return "";
57
+ }
58
+ /**
59
+ * Format and write a tool start line to stderr.
60
+ * Shows: [teal tool name] [dim primary arg]
61
+ */
62
+ function writeToolStart(name, args) {
63
+ if (FLOW_CONTROL_TOOLS.has(name))
64
+ return;
65
+ const primary = getPrimaryArg(name, args);
66
+ const argDisplay = primary ? ` ${DIM}${primary}${RESET}` : "";
67
+ process.stderr.write(`\r\x1b[K${OURO_TEAL}${BOLD}${name}${RESET}${argDisplay}\n`);
68
+ }
69
+ /**
70
+ * Format and write a tool result line to stderr.
71
+ * Shows: [green check / red cross] [teal tool name] [dim summary]
72
+ */
73
+ function writeToolEnd(name, argSummary, success) {
74
+ if (FLOW_CONTROL_TOOLS.has(name))
75
+ return;
76
+ const icon = success ? `${GREEN}\u2713` : `${RED}\u2717`;
77
+ const summary = argSummary ? ` ${DIM}${truncate(argSummary, 100)}${RESET}` : "";
78
+ process.stderr.write(`${icon}${RESET} ${OURO_TEAL}${name}${RESET}${summary}\n`);
79
+ (0, runtime_1.emitNervesEvent)({
80
+ component: "senses",
81
+ event: "senses.tool_display",
82
+ message: "tool result displayed",
83
+ meta: { name, success },
84
+ });
85
+ }