@ouro.bot/cli 0.1.0-alpha.99 → 0.1.0-alpha.990

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 (772) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +171 -23
  3. package/RepairGuide.ouro/agent.json +5 -0
  4. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  5. package/RepairGuide.ouro/psyche/SOUL.md +55 -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/assets/bluebubbles-host +264 -0
  14. package/assets/sanctuary-host-launcher.sh +16 -0
  15. package/changelog.json +6251 -16
  16. package/deploy/unraid/Dockerfile +58 -0
  17. package/deploy/unraid/INSTALL.md +64 -0
  18. package/deploy/unraid/README.txt +2997 -0
  19. package/deploy/unraid/audit-container-spec.sh +4 -0
  20. package/deploy/unraid/container-runtime.json +1 -0
  21. package/deploy/unraid/credit-gateway.md +95 -0
  22. package/deploy/unraid/docker-man-template-transaction.mjs +727 -0
  23. package/deploy/unraid/docker-man-template-xml.cjs +105 -0
  24. package/deploy/unraid/install.sh +274 -0
  25. package/deploy/unraid/migrate-sanctuary-bundle.mjs +63 -0
  26. package/deploy/unraid/ouro-events/bootstrap-spool.sh +92 -0
  27. package/deploy/unraid/ouro-events/emit-event.mjs +310 -0
  28. package/deploy/unraid/ouro-events/emit-usenet-event.sh +54 -0
  29. package/deploy/unraid/ouro-events/install-usenet-guard.sh +435 -0
  30. package/deploy/unraid/ouro-events/usenet-health.sh +176 -0
  31. package/deploy/unraid/sanctuary-acceptance-adapter.sh +43 -0
  32. package/deploy/unraid/sanctuary-acceptance-contract.json +198 -0
  33. package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
  34. package/deploy/unraid/sanctuary-authority-installation.json +36 -0
  35. package/deploy/unraid/sanctuary-authority-service.sh +30 -0
  36. package/deploy/unraid/sanctuary-butler-upgrade.mjs +1499 -0
  37. package/deploy/unraid/sanctuary-deployment-target.mjs +710 -0
  38. package/deploy/unraid/sanctuary-replay-gate.mjs +2114 -0
  39. package/deploy/unraid/sanctuary-safe-rename.py +24 -0
  40. package/deploy/unraid/sanctuary-unit16-host-broker.mjs +2088 -0
  41. package/deploy/unraid/sanctuary-unit16-run.sh +570 -0
  42. package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
  43. package/deploy/unraid/sanctuary.ouro/agent.json +66 -0
  44. package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
  45. package/deploy/unraid/sanctuary.ouro/awaiting/house-care-sweep.md +17 -0
  46. package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
  47. package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
  48. package/deploy/unraid/sanctuary.ouro/mcp/media-mcp.mjs +2255 -0
  49. package/deploy/unraid/sanctuary.ouro/product/PRODUCT.md +13 -0
  50. package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
  51. package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
  52. package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +7 -0
  53. package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +7 -0
  54. package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +15 -0
  55. package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +3 -0
  56. package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
  57. package/deploy/unraid/sanctuary.ouro/tool-profiles.json +232 -0
  58. package/deploy/unraid/sanctuary.xml +29 -0
  59. package/dist/a2a/card.js +57 -0
  60. package/dist/a2a/client.js +290 -0
  61. package/dist/a2a/config.js +50 -0
  62. package/dist/a2a/delegated-command-grants.js +93 -0
  63. package/dist/a2a/delegated-command.js +197 -0
  64. package/dist/a2a/delegation-stores.js +56 -0
  65. package/dist/a2a/did-resolution.js +205 -0
  66. package/dist/a2a/escalation-grants.js +84 -0
  67. package/dist/a2a/escalation-wiring.js +60 -0
  68. package/dist/a2a/identity.js +258 -0
  69. package/dist/a2a/inbound-share.js +131 -0
  70. package/dist/a2a/mission-result-wire.js +265 -0
  71. package/dist/a2a/onboarding.js +133 -0
  72. package/dist/a2a/operator-trust.js +399 -0
  73. package/dist/a2a/outbox-client.js +59 -0
  74. package/dist/a2a/outbox-store.js +188 -0
  75. package/dist/a2a/outbox-wire.js +106 -0
  76. package/dist/a2a/pin-store.js +167 -0
  77. package/dist/a2a/refusals.js +53 -0
  78. package/dist/a2a/relay-client.js +106 -0
  79. package/dist/a2a/relay-config-vault.js +64 -0
  80. package/dist/a2a/relay-contacts.js +120 -0
  81. package/dist/a2a/relay-inbox.js +360 -0
  82. package/dist/a2a/relay-retirements.js +89 -0
  83. package/dist/a2a/replay-grant-holders.js +33 -0
  84. package/dist/a2a/replay-harness.js +188 -0
  85. package/dist/a2a/resolution-proof.js +53 -0
  86. package/dist/a2a/sealed-chat.js +114 -0
  87. package/dist/a2a/seen-ledger.js +214 -0
  88. package/dist/a2a/server.js +808 -0
  89. package/dist/a2a/task-store.js +69 -0
  90. package/dist/a2a/transport.js +100 -0
  91. package/dist/a2a/trust-commands.js +203 -0
  92. package/dist/a2a/trusted-files.js +185 -0
  93. package/dist/a2a/types.js +3 -0
  94. package/dist/arc/attention-types.js +8 -0
  95. package/dist/arc/cares.js +360 -0
  96. package/dist/arc/episodes.js +118 -0
  97. package/dist/arc/evolution.js +490 -0
  98. package/dist/arc/flight-recorder.js +1034 -0
  99. package/dist/arc/intentions.js +134 -0
  100. package/dist/arc/json-store.js +117 -0
  101. package/dist/arc/obligations.js +386 -0
  102. package/dist/arc/packets.js +336 -0
  103. package/dist/arc/presence.js +185 -0
  104. package/dist/arc/task-lifecycle.js +57 -0
  105. package/dist/commerce/store.js +755 -0
  106. package/dist/commerce/types.js +3 -0
  107. package/dist/gateway/keys.js +117 -0
  108. package/dist/gateway/server.js +429 -0
  109. package/dist/heart/active-work.js +798 -40
  110. package/dist/heart/agent-entry.js +252 -3
  111. package/dist/heart/approval-files.js +113 -0
  112. package/dist/heart/approval-store.js +960 -0
  113. package/dist/heart/attachments/image-normalize.js +201 -0
  114. package/dist/heart/attachments/materialize.js +97 -0
  115. package/dist/heart/attachments/originals.js +88 -0
  116. package/dist/heart/attachments/render.js +29 -0
  117. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  118. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  119. package/dist/heart/attachments/sources/index.js +18 -0
  120. package/dist/heart/attachments/sources/telegram.js +71 -0
  121. package/dist/heart/attachments/store.js +132 -0
  122. package/dist/heart/attachments/types.js +93 -0
  123. package/dist/heart/auth/auth-flow.js +511 -0
  124. package/dist/heart/autonomy-budget.js +478 -0
  125. package/dist/heart/awaiting/a2a-await-delivery.js +109 -0
  126. package/dist/heart/awaiting/await-alert.js +152 -0
  127. package/dist/heart/awaiting/await-expiry.js +143 -0
  128. package/dist/heart/awaiting/await-loader.js +91 -0
  129. package/dist/heart/awaiting/await-parser.js +152 -0
  130. package/dist/heart/awaiting/await-runtime-state.js +130 -0
  131. package/dist/heart/awaiting/await-scheduler.js +391 -0
  132. package/dist/heart/background-operations.js +281 -0
  133. package/dist/heart/bluebubbles-host-account.js +78 -0
  134. package/dist/heart/bridges/manager.js +137 -17
  135. package/dist/heart/bridges/store.js +14 -2
  136. package/dist/heart/bundle-state.js +168 -0
  137. package/dist/heart/commitments.js +44 -18
  138. package/dist/heart/config-registry.js +331 -0
  139. package/dist/heart/config.js +178 -131
  140. package/dist/heart/context-loss-gauntlet.js +387 -0
  141. package/dist/heart/context-loss-sentinel.js +1204 -0
  142. package/dist/heart/core.js +2378 -586
  143. package/dist/heart/cross-chat-delivery.js +9 -22
  144. package/dist/heart/daemon/agent-config-check.js +474 -0
  145. package/dist/heart/daemon/agent-discovery.js +283 -3
  146. package/dist/heart/daemon/agent-home.js +319 -0
  147. package/dist/heart/daemon/agent-service.js +542 -0
  148. package/dist/heart/daemon/agentic-repair.js +547 -0
  149. package/dist/heart/daemon/await-private-wake.js +59 -0
  150. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  151. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  152. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  153. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  154. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  155. package/dist/heart/daemon/cadence.js +180 -0
  156. package/dist/heart/daemon/cli-arg-redaction.js +26 -0
  157. package/dist/heart/daemon/cli-defaults.js +881 -0
  158. package/dist/heart/daemon/cli-desk.js +331 -0
  159. package/dist/heart/daemon/cli-exec.js +9280 -0
  160. package/dist/heart/daemon/cli-help.js +754 -0
  161. package/dist/heart/daemon/cli-parse.js +3329 -0
  162. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  163. package/dist/heart/daemon/cli-render.js +819 -0
  164. package/dist/heart/daemon/cli-types.js +8 -0
  165. package/dist/heart/daemon/connect-bay.js +323 -0
  166. package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
  167. package/dist/heart/daemon/container-healthcheck.js +112 -0
  168. package/dist/heart/daemon/container-runtime.js +97 -0
  169. package/dist/heart/daemon/container-spec-auditor-main.js +171 -0
  170. package/dist/heart/daemon/container-spec-auditor.js +241 -0
  171. package/dist/heart/daemon/daemon-bootstrap-startup.js +115 -0
  172. package/dist/heart/daemon/daemon-cli.js +29 -2373
  173. package/dist/heart/daemon/daemon-entry.js +953 -11
  174. package/dist/heart/daemon/daemon-health.js +186 -0
  175. package/dist/heart/daemon/daemon-rollup.js +57 -0
  176. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  177. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  178. package/dist/heart/daemon/daemon.js +2110 -104
  179. package/dist/heart/daemon/desk-admin.js +420 -0
  180. package/dist/heart/daemon/dns-workflow.js +394 -0
  181. package/dist/heart/daemon/doctor-types.js +8 -0
  182. package/dist/heart/daemon/doctor.js +1766 -0
  183. package/dist/heart/daemon/freshness.js +345 -0
  184. package/dist/heart/daemon/habit-private-wake.js +61 -0
  185. package/dist/heart/daemon/health-monitor.js +154 -11
  186. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  187. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  188. package/dist/heart/daemon/http-health-probe.js +80 -0
  189. package/dist/heart/daemon/human-command-screens.js +234 -0
  190. package/dist/heart/daemon/human-readiness.js +114 -0
  191. package/dist/heart/daemon/inner-status.js +78 -0
  192. package/dist/heart/daemon/interactive-repair.js +394 -0
  193. package/dist/heart/daemon/launchd.js +37 -8
  194. package/dist/heart/daemon/log-tailer.js +79 -10
  195. package/dist/heart/daemon/logs-prune.js +132 -0
  196. package/dist/heart/daemon/mcp-canary.js +524 -0
  197. package/dist/heart/daemon/message-router.js +65 -5
  198. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  199. package/dist/heart/daemon/os-cron-deps.js +135 -0
  200. package/dist/heart/daemon/os-cron.js +22 -14
  201. package/dist/heart/daemon/ouro-bot-entry.js +6 -3
  202. package/dist/heart/daemon/ouro-entry.js +9 -3
  203. package/dist/heart/daemon/plugin-cli.js +432 -0
  204. package/dist/heart/daemon/process-manager.js +760 -61
  205. package/dist/heart/daemon/provider-discovery.js +137 -0
  206. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  207. package/dist/heart/daemon/prunable-bundle.js +144 -0
  208. package/dist/heart/daemon/pulse.js +511 -0
  209. package/dist/heart/daemon/readiness-repair.js +365 -0
  210. package/dist/heart/daemon/run-hooks.js +2 -0
  211. package/dist/heart/daemon/runtime-logging.js +47 -14
  212. package/dist/heart/daemon/runtime-metadata.js +2 -30
  213. package/dist/heart/daemon/runtime-mode.js +13 -2
  214. package/dist/heart/daemon/safe-mode.js +161 -0
  215. package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2662 -0
  216. package/dist/heart/daemon/sanctuary-acceptance-harness.js +1832 -0
  217. package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
  218. package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +956 -0
  219. package/dist/heart/daemon/sanctuary-authority-codec.js +86 -0
  220. package/dist/heart/daemon/sanctuary-authority-epoch.js +291 -0
  221. package/dist/heart/daemon/sanctuary-authority-installation.js +161 -0
  222. package/dist/heart/daemon/sanctuary-authority-ledger.js +241 -0
  223. package/dist/heart/daemon/sanctuary-authority-root-lifecycle.js +1332 -0
  224. package/dist/heart/daemon/sanctuary-authority-vault-migration.js +79 -0
  225. package/dist/heart/daemon/sanctuary-bundle-migration.js +878 -0
  226. package/dist/heart/daemon/sanctuary-host-authority.js +1008 -0
  227. package/dist/heart/daemon/sanctuary-host-detached-supervisor.js +493 -0
  228. package/dist/heart/daemon/sanctuary-host-executor.js +670 -0
  229. package/dist/heart/daemon/sanctuary-host-linux-kernel.js +334 -0
  230. package/dist/heart/daemon/sanctuary-host-supervisor-entry.js +207 -0
  231. package/dist/heart/daemon/sanctuary-host-supervisor.js +95 -0
  232. package/dist/heart/daemon/sanctuary-package-management.js +103 -0
  233. package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
  234. package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
  235. package/dist/heart/daemon/sanctuary-telegram-authority-entry.js +475 -0
  236. package/dist/heart/daemon/sanctuary-telegram-authority-gateway.js +585 -0
  237. package/dist/heart/daemon/sanctuary-telegram-authority-service.js +676 -0
  238. package/dist/heart/daemon/sense-manager.js +786 -48
  239. package/dist/heart/daemon/session-id-resolver.js +131 -0
  240. package/dist/heart/daemon/skill-management-installer.js +1 -1
  241. package/dist/heart/daemon/socket-client.js +180 -12
  242. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  243. package/dist/heart/daemon/startup-tui.js +339 -0
  244. package/dist/heart/daemon/supercronic-supervisor.js +282 -0
  245. package/dist/heart/daemon/task-scheduler.js +117 -39
  246. package/dist/heart/daemon/terminal-ui.js +503 -0
  247. package/dist/heart/daemon/thoughts.js +138 -54
  248. package/dist/heart/daemon/up-progress.js +366 -0
  249. package/dist/heart/daemon/vault-items.js +56 -0
  250. package/dist/heart/delegation.js +1 -4
  251. package/dist/heart/external-events/router.js +1531 -0
  252. package/dist/heart/failure-reports.js +336 -0
  253. package/dist/heart/file-lock.js +109 -0
  254. package/dist/heart/frontend-approval-runtime.js +506 -0
  255. package/dist/heart/frontend-journal.js +215 -0
  256. package/dist/heart/frontend-session-service.js +271 -0
  257. package/dist/heart/frontend-socket-client.js +173 -0
  258. package/dist/heart/frontend-socket.js +434 -0
  259. package/dist/heart/frontend-turn-errors.js +20 -0
  260. package/dist/heart/habits/habit-cancel.js +810 -0
  261. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  262. package/dist/heart/habits/habit-migration.js +194 -0
  263. package/dist/heart/habits/habit-parser.js +278 -0
  264. package/dist/heart/habits/habit-runtime-state.js +93 -0
  265. package/dist/heart/habits/habit-scheduler.js +653 -0
  266. package/dist/heart/habits/habit-session-summary.js +318 -0
  267. package/dist/heart/habits/habit-session.js +636 -0
  268. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
  269. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  270. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  271. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  272. package/dist/heart/identity.js +239 -59
  273. package/dist/heart/kept-notes.js +289 -0
  274. package/dist/heart/kicks.js +1 -1
  275. package/dist/heart/machine-identity.js +175 -0
  276. package/dist/heart/mail-import-discovery.js +356 -0
  277. package/dist/heart/mailbox/mailbox-http-hooks.js +99 -0
  278. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  279. package/dist/heart/mailbox/mailbox-http-routes.js +406 -0
  280. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  281. package/dist/heart/mailbox/mailbox-http-transport.js +272 -0
  282. package/dist/heart/mailbox/mailbox-http.js +99 -0
  283. package/dist/heart/mailbox/mailbox-read.js +41 -0
  284. package/dist/heart/mailbox/mailbox-supervision.js +131 -0
  285. package/dist/heart/mailbox/mailbox-types.js +27 -0
  286. package/dist/heart/mailbox/mailbox-view.js +197 -0
  287. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  288. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  289. package/dist/heart/mailbox/readers/mail.js +375 -0
  290. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  291. package/dist/heart/mailbox/readers/sessions.js +231 -0
  292. package/dist/heart/mailbox/readers/shared.js +111 -0
  293. package/dist/heart/mcp/mcp-server.js +760 -0
  294. package/dist/heart/migrate-config.js +100 -0
  295. package/dist/heart/model-capabilities.js +83 -16
  296. package/dist/heart/orientation-frame.js +376 -0
  297. package/dist/heart/platform.js +81 -0
  298. package/dist/heart/primitives.js +1 -1
  299. package/dist/heart/private-runtime/decision-renderer.js +158 -0
  300. package/dist/heart/private-runtime/index.js +18 -0
  301. package/dist/heart/private-runtime/ledger.js +221 -0
  302. package/dist/heart/private-runtime/policy.js +260 -0
  303. package/dist/heart/private-runtime/types.js +2 -0
  304. package/dist/heart/progress-story.js +1 -1
  305. package/dist/heart/provider-attempt.js +137 -0
  306. package/dist/heart/provider-binding-resolver.js +273 -0
  307. package/dist/heart/provider-credentials.js +449 -0
  308. package/dist/heart/provider-failover.js +311 -0
  309. package/dist/heart/provider-models.js +96 -0
  310. package/dist/heart/provider-ping.js +266 -0
  311. package/dist/heart/provider-readiness-cache.js +119 -0
  312. package/dist/heart/provider-visibility.js +188 -0
  313. package/dist/heart/providers/anthropic-token.js +131 -0
  314. package/dist/heart/providers/anthropic.js +248 -67
  315. package/dist/heart/providers/azure.js +23 -11
  316. package/dist/heart/providers/error-classification.js +129 -0
  317. package/dist/heart/providers/github-copilot.js +38 -39
  318. package/dist/heart/providers/minimax-vlm.js +189 -0
  319. package/dist/heart/providers/minimax.js +26 -8
  320. package/dist/heart/providers/openai-codex-token.js +349 -0
  321. package/dist/heart/providers/openai-codex.js +55 -40
  322. package/dist/heart/providers/openai-compatible.js +177 -0
  323. package/dist/heart/reach-channel.js +85 -0
  324. package/dist/heart/reply-style.js +52 -0
  325. package/dist/heart/run-ledger.js +247 -0
  326. package/dist/heart/runtime-capability-check.js +170 -0
  327. package/dist/heart/runtime-credentials.js +608 -0
  328. package/dist/heart/runtime-cwd.js +87 -0
  329. package/dist/heart/sense-truth.js +24 -4
  330. package/dist/heart/session-activity.js +94 -24
  331. package/dist/heart/session-events.js +1521 -0
  332. package/dist/heart/session-playback-cli-main.js +5 -0
  333. package/dist/heart/session-playback-cli.js +36 -0
  334. package/dist/heart/session-playback.js +231 -0
  335. package/dist/heart/session-redaction-repair-cli-main.js +31 -0
  336. package/dist/heart/session-redaction-repair.js +552 -0
  337. package/dist/heart/session-stats-cli-main.js +5 -0
  338. package/dist/heart/session-stats.js +183 -0
  339. package/dist/heart/session-transcript.js +133 -0
  340. package/dist/heart/shelf-claims.js +78 -0
  341. package/dist/heart/shepherd/custody-types.js +2 -0
  342. package/dist/heart/shepherd/mandates.js +352 -0
  343. package/dist/heart/shepherd/operation-commands.js +19 -0
  344. package/dist/heart/shepherd/operations.js +135 -0
  345. package/dist/heart/shepherd/supervision.js +114 -0
  346. package/dist/heart/shepherd/types.js +2 -0
  347. package/dist/heart/shepherd-config.js +123 -0
  348. package/dist/heart/source-grounding.js +313 -0
  349. package/dist/heart/start-of-turn-packet.js +372 -0
  350. package/dist/heart/steward-policy.js +656 -0
  351. package/dist/heart/streaming.js +631 -207
  352. package/dist/heart/structured-output.js +196 -0
  353. package/dist/heart/sync-classification.js +176 -0
  354. package/dist/heart/sync-health.js +152 -0
  355. package/dist/heart/sync.js +726 -0
  356. package/dist/heart/target-resolution.js +11 -7
  357. package/dist/heart/tempo.js +93 -0
  358. package/dist/heart/temporal-view.js +41 -0
  359. package/dist/heart/timeouts.js +101 -0
  360. package/dist/heart/tool-activity-callbacks.js +59 -0
  361. package/dist/heart/tool-approval.js +382 -0
  362. package/dist/heart/tool-description.js +155 -0
  363. package/dist/heart/tool-friction.js +55 -0
  364. package/dist/heart/tool-loop.js +206 -0
  365. package/dist/heart/tool-output-budget.js +41 -0
  366. package/dist/heart/turn-context.js +496 -0
  367. package/dist/heart/turn-execution-lease.js +30 -0
  368. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  369. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +3 -2
  370. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  371. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  372. package/dist/heart/versioning/ouro-version-manager.js +432 -0
  373. package/dist/heart/versioning/release-sources.js +173 -0
  374. package/dist/heart/versioning/self-update-defaults.js +294 -0
  375. package/dist/heart/versioning/self-update.js +196 -0
  376. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  377. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  378. package/dist/heart/versioning/update-hooks.js +154 -0
  379. package/dist/heart/versioning/update-state.js +126 -0
  380. package/dist/heart/versioning/updater-launchd.js +150 -0
  381. package/dist/heart/versioning/version-intent.js +114 -0
  382. package/dist/heart/work-card.js +380 -0
  383. package/dist/mailbox-ui/assets/index-Dbska1tZ.js +1 -0
  384. package/dist/mailbox-ui/assets/index-DsiKaPyH.css +1 -0
  385. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  386. package/dist/mailbox-ui/index.html +16 -0
  387. package/dist/mailroom/attention.js +167 -0
  388. package/dist/mailroom/autonomy.js +209 -0
  389. package/dist/mailroom/blob-store.js +889 -0
  390. package/dist/mailroom/body-cache.js +61 -0
  391. package/dist/mailroom/cache-sync-cli.js +58 -0
  392. package/dist/mailroom/core.js +803 -0
  393. package/dist/mailroom/entry.js +160 -0
  394. package/dist/mailroom/file-store.js +568 -0
  395. package/dist/mailroom/hosted-cache-sync.js +384 -0
  396. package/dist/mailroom/mbox-import.js +393 -0
  397. package/dist/mailroom/migration.js +164 -0
  398. package/dist/mailroom/outbound.js +380 -0
  399. package/dist/mailroom/policy.js +263 -0
  400. package/dist/mailroom/reader.js +292 -0
  401. package/dist/mailroom/search-cache.js +513 -0
  402. package/dist/mailroom/search-relevance.js +319 -0
  403. package/dist/mailroom/smtp-ingress.js +176 -0
  404. package/dist/mailroom/source-state.js +176 -0
  405. package/dist/mailroom/thread.js +109 -0
  406. package/dist/mailroom/travel-extract.js +89 -0
  407. package/dist/mind/bundle-manifest.js +25 -2
  408. package/dist/mind/context.js +328 -139
  409. package/dist/mind/desk-section.js +362 -0
  410. package/dist/mind/diary-integrity.js +60 -0
  411. package/dist/mind/{memory.js → diary.js} +68 -77
  412. package/dist/mind/embedding-provider.js +60 -0
  413. package/dist/mind/file-state.js +179 -0
  414. package/dist/mind/friend-link-codes.js +209 -0
  415. package/dist/mind/friend-merge.js +336 -0
  416. package/dist/mind/house-names.js +43 -0
  417. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  418. package/dist/mind/obligation-steering.js +199 -3
  419. package/dist/mind/outbound-record.js +168 -0
  420. package/dist/mind/pending.js +36 -10
  421. package/dist/mind/prompt-budget.js +479 -0
  422. package/dist/mind/prompt-refresh.js +3 -2
  423. package/dist/mind/prompt.js +1152 -206
  424. package/dist/mind/provenance-trust.js +26 -0
  425. package/dist/mind/record-paths.js +312 -0
  426. package/dist/mind/scrutiny.js +173 -0
  427. package/dist/mind/session-transaction.js +622 -0
  428. package/dist/nerves/cli-logging.js +7 -1
  429. package/dist/nerves/coverage/audit-rules.js +15 -6
  430. package/dist/nerves/coverage/audit.js +28 -2
  431. package/dist/nerves/coverage/cli.js +1 -1
  432. package/dist/nerves/coverage/contract.js +5 -5
  433. package/dist/nerves/coverage/file-completeness.js +143 -5
  434. package/dist/nerves/coverage/run-artifacts.js +55 -35
  435. package/dist/nerves/coverage/source-scanner.js +4 -4
  436. package/dist/nerves/event-buffer.js +111 -0
  437. package/dist/nerves/index.js +293 -9
  438. package/dist/nerves/observation.js +20 -0
  439. package/dist/nerves/redact.js +79 -0
  440. package/dist/nerves/review/cli-main.js +5 -0
  441. package/dist/nerves/review/cli.js +156 -0
  442. package/dist/nerves/review/core.js +159 -0
  443. package/dist/nerves/runtime.js +17 -1
  444. package/dist/repertoire/ado-client.js +15 -56
  445. package/dist/repertoire/ado-semantic.js +16 -10
  446. package/dist/repertoire/api-client.js +97 -0
  447. package/dist/repertoire/bitwarden-store.js +1199 -0
  448. package/dist/repertoire/bundle-templates.js +71 -0
  449. package/dist/repertoire/bw-installer.js +231 -0
  450. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  451. package/dist/repertoire/coding/context-pack.js +331 -0
  452. package/dist/repertoire/coding/feedback.js +146 -34
  453. package/dist/repertoire/coding/index.js +15 -3
  454. package/dist/repertoire/coding/manager.js +159 -10
  455. package/dist/repertoire/coding/spawner.js +40 -11
  456. package/dist/repertoire/coding/tools.js +182 -18
  457. package/dist/repertoire/coding/workbench-client.js +272 -0
  458. package/dist/repertoire/coding/workbench-manager.js +346 -0
  459. package/dist/repertoire/commerce-errors.js +109 -0
  460. package/dist/repertoire/commerce-self-test.js +156 -0
  461. package/dist/repertoire/credential-access.js +183 -0
  462. package/dist/repertoire/desk/classifier.js +362 -0
  463. package/dist/repertoire/duffel-client.js +185 -0
  464. package/dist/repertoire/github-client.js +14 -55
  465. package/dist/repertoire/graph-client.js +11 -52
  466. package/dist/repertoire/guardrails.js +1196 -20
  467. package/dist/repertoire/house-sweep.js +471 -0
  468. package/dist/repertoire/mcp-client.js +58 -5
  469. package/dist/repertoire/mcp-manager.js +427 -139
  470. package/dist/repertoire/mcp-tools.js +132 -0
  471. package/dist/repertoire/mcp-write-guard.js +46 -0
  472. package/dist/repertoire/plugin-mcp.js +175 -0
  473. package/dist/repertoire/plugins.js +253 -0
  474. package/dist/repertoire/relationship-authorization.js +322 -0
  475. package/dist/repertoire/sanctuary-container-policy.js +50 -0
  476. package/dist/repertoire/shell-sessions.js +134 -0
  477. package/dist/repertoire/skills.js +48 -4
  478. package/dist/repertoire/stripe-client.js +131 -0
  479. package/dist/repertoire/tool-arguments.js +182 -0
  480. package/dist/repertoire/tool-results.js +29 -0
  481. package/dist/repertoire/tools-a2a.js +742 -0
  482. package/dist/repertoire/tools-attachments.js +322 -0
  483. package/dist/repertoire/tools-awaiting.js +897 -0
  484. package/dist/repertoire/tools-base.js +83 -1168
  485. package/dist/repertoire/tools-bluebubbles.js +2 -0
  486. package/dist/repertoire/tools-bridge.js +144 -0
  487. package/dist/repertoire/tools-bundle.js +995 -0
  488. package/dist/repertoire/tools-commerce.js +253 -0
  489. package/dist/repertoire/tools-config.js +186 -0
  490. package/dist/repertoire/tools-continuity.js +588 -0
  491. package/dist/repertoire/tools-credential.js +383 -0
  492. package/dist/repertoire/tools-escalation.js +84 -0
  493. package/dist/repertoire/tools-evolution.js +527 -0
  494. package/dist/repertoire/tools-files.js +362 -0
  495. package/dist/repertoire/tools-flight.js +290 -0
  496. package/dist/repertoire/tools-flow.js +119 -0
  497. package/dist/repertoire/tools-friend-link.js +57 -0
  498. package/dist/repertoire/tools-github.js +3 -8
  499. package/dist/repertoire/tools-habits.js +103 -0
  500. package/dist/repertoire/tools-house-care.js +174 -0
  501. package/dist/repertoire/tools-mail.js +1828 -0
  502. package/dist/repertoire/tools-notes.js +501 -0
  503. package/dist/repertoire/tools-obligations.js +182 -0
  504. package/dist/repertoire/tools-orientation.js +31 -0
  505. package/dist/repertoire/tools-record.js +482 -0
  506. package/dist/repertoire/tools-rsvp.js +139 -0
  507. package/dist/repertoire/tools-runtime.js +238 -0
  508. package/dist/repertoire/tools-sanctuary-host.js +202 -0
  509. package/dist/repertoire/tools-session.js +1141 -0
  510. package/dist/repertoire/tools-shell.js +154 -0
  511. package/dist/repertoire/tools-shepherd-guidance.js +171 -0
  512. package/dist/repertoire/tools-shepherd.js +325 -0
  513. package/dist/repertoire/tools-steward-policy.js +147 -0
  514. package/dist/repertoire/tools-stripe.js +224 -0
  515. package/dist/repertoire/tools-surface.js +369 -0
  516. package/dist/repertoire/tools-teams.js +50 -39
  517. package/dist/repertoire/tools-telegram-contacts.js +37 -0
  518. package/dist/repertoire/tools-travel.js +125 -0
  519. package/dist/repertoire/tools-trip.js +982 -0
  520. package/dist/repertoire/tools-unraid.js +556 -0
  521. package/dist/repertoire/tools-user-profile.js +146 -0
  522. package/dist/repertoire/tools-vault.js +40 -0
  523. package/dist/repertoire/tools-voice-local.js +198 -0
  524. package/dist/repertoire/tools-voice.js +145 -0
  525. package/dist/repertoire/tools.js +519 -156
  526. package/dist/repertoire/travel-api-client.js +360 -0
  527. package/dist/repertoire/unraid-client.js +155 -0
  528. package/dist/repertoire/unraid-restart.js +339 -0
  529. package/dist/repertoire/user-profile.js +131 -0
  530. package/dist/repertoire/vault-setup.js +246 -0
  531. package/dist/repertoire/vault-unlock.js +686 -0
  532. package/dist/rsvp/aisleplanner-client.js +354 -0
  533. package/dist/rsvp/cli.js +936 -0
  534. package/dist/rsvp/config.js +327 -0
  535. package/dist/rsvp/cutover.js +453 -0
  536. package/dist/rsvp/diagnostics.js +232 -0
  537. package/dist/rsvp/diff-renderer.js +176 -0
  538. package/dist/rsvp/habit-policy.js +110 -0
  539. package/dist/rsvp/habit-stage.js +123 -0
  540. package/dist/rsvp/incident-bundle.js +97 -0
  541. package/dist/rsvp/migration.js +204 -0
  542. package/dist/rsvp/native-habit-runner.js +630 -0
  543. package/dist/rsvp/outbound-state.js +628 -0
  544. package/dist/rsvp/query.js +118 -0
  545. package/dist/rsvp/replay.js +233 -0
  546. package/dist/rsvp/snapshot.js +232 -0
  547. package/dist/rsvp/spend-ledger.js +175 -0
  548. package/dist/scripts/claude-code-hook.js +41 -0
  549. package/dist/scripts/claude-code-stop-hook.js +47 -0
  550. package/dist/senses/a2a-entry.js +140 -0
  551. package/dist/senses/acp-server.js +386 -0
  552. package/dist/senses/attention-queue.js +186 -0
  553. package/dist/senses/await-turn-message.js +65 -0
  554. package/dist/senses/bluebubbles/active-turns.js +216 -0
  555. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  556. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  557. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +393 -43
  558. package/dist/senses/bluebubbles/context-packet.js +207 -0
  559. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  560. package/dist/senses/bluebubbles/entry.js +90 -0
  561. package/dist/senses/bluebubbles/host-account-verifier.js +88 -0
  562. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
  563. package/dist/senses/bluebubbles/index.js +4054 -0
  564. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  565. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  566. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
  567. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
  568. package/dist/senses/bluebubbles/outbound-state.js +335 -0
  569. package/dist/senses/bluebubbles/processed-log.js +133 -0
  570. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  571. package/dist/senses/bluebubbles/replay.js +284 -0
  572. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  573. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  574. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  575. package/dist/senses/bluebubbles/webhook-registration.js +257 -0
  576. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  577. package/dist/senses/cli/bracketed-paste.js +82 -0
  578. package/dist/senses/cli/image-paste.js +287 -0
  579. package/dist/senses/cli/image-ref-navigation.js +75 -0
  580. package/dist/senses/cli/ink-app.js +156 -0
  581. package/dist/senses/cli/inline-diff.js +64 -0
  582. package/dist/senses/cli/input-keys.js +174 -0
  583. package/dist/senses/cli/kill-ring.js +86 -0
  584. package/dist/senses/cli/message-list.js +51 -0
  585. package/dist/senses/cli/ouro-tui.js +607 -0
  586. package/dist/senses/cli/spinner-imperative.js +135 -0
  587. package/dist/senses/cli/spinner.js +101 -0
  588. package/dist/senses/cli/status-line.js +60 -0
  589. package/dist/senses/cli/streaming-markdown.js +526 -0
  590. package/dist/senses/cli/tool-display.js +85 -0
  591. package/dist/senses/cli/tool-render.js +85 -0
  592. package/dist/senses/cli/tui-store.js +241 -0
  593. package/dist/senses/cli/virtual-list.js +35 -0
  594. package/dist/senses/cli-entry.js +60 -8
  595. package/dist/senses/cli.js +570 -309
  596. package/dist/senses/commands.js +66 -3
  597. package/dist/senses/context-packet-ledger.js +371 -0
  598. package/dist/senses/context-packets.js +154 -0
  599. package/dist/senses/habit-lifecycle-guard.js +24 -0
  600. package/dist/senses/habit-turn-message.js +160 -0
  601. package/dist/senses/ingress-evidence.js +2 -0
  602. package/dist/senses/mail-entry.js +66 -0
  603. package/dist/senses/mail.js +524 -0
  604. package/dist/senses/pipeline.js +1158 -204
  605. package/dist/senses/private-runtime-worker.js +857 -0
  606. package/dist/senses/private-runtime.js +1627 -0
  607. package/dist/senses/proactive-content-guard.js +51 -0
  608. package/dist/senses/root-host-approval-port.js +345 -0
  609. package/dist/senses/root-host-approval-runtime.js +393 -0
  610. package/dist/senses/sanctuary-authority-resident.js +102 -0
  611. package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
  612. package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
  613. package/dist/senses/sanctuary-grounding.js +118 -0
  614. package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
  615. package/dist/senses/sanctuary-health-acceptance-probe.js +786 -0
  616. package/dist/senses/sanctuary-health-runner.js +106 -0
  617. package/dist/senses/sanctuary-health.js +442 -0
  618. package/dist/senses/sanctuary-house.js +97 -0
  619. package/dist/senses/sanctuary-install-state-contract.js +169 -0
  620. package/dist/senses/sanctuary-interactive-control.js +410 -0
  621. package/dist/senses/sanctuary-media-catalog-contract.js +268 -0
  622. package/dist/senses/sanctuary-media-optimization.js +517 -0
  623. package/dist/senses/sanctuary-runtime.js +390 -0
  624. package/dist/senses/sanctuary-sab.js +85 -0
  625. package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
  626. package/dist/senses/shared-turn.js +832 -0
  627. package/dist/senses/shepherd/agent-presentation.js +88 -0
  628. package/dist/senses/shepherd/attention-page.js +166 -0
  629. package/dist/senses/shepherd/attention-sidebar.js +76 -0
  630. package/dist/senses/shepherd/attention.js +295 -0
  631. package/dist/senses/shepherd/checkin-config.js +76 -0
  632. package/dist/senses/shepherd/checkin-store.js +386 -0
  633. package/dist/senses/shepherd/client.js +196 -0
  634. package/dist/senses/shepherd/cmux.js +483 -0
  635. package/dist/senses/shepherd/composer.js +336 -0
  636. package/dist/senses/shepherd/copilot-app.js +648 -0
  637. package/dist/senses/shepherd/feedback-reply.js +108 -0
  638. package/dist/senses/shepherd/feedback-source.js +20 -0
  639. package/dist/senses/shepherd/feedback-store.js +331 -0
  640. package/dist/senses/shepherd/feedback-submit.js +182 -0
  641. package/dist/senses/shepherd/feedback-worker.js +208 -0
  642. package/dist/senses/shepherd/guidance.js +273 -0
  643. package/dist/senses/shepherd/herdr.js +427 -0
  644. package/dist/senses/shepherd/host.js +17 -0
  645. package/dist/senses/shepherd/human-decision-guard.js +29 -0
  646. package/dist/senses/shepherd/judge-evaluation-command.js +183 -0
  647. package/dist/senses/shepherd/judge-evaluation-entry.js +13 -0
  648. package/dist/senses/shepherd/judge-evaluation.js +155 -0
  649. package/dist/senses/shepherd/judge.js +210 -0
  650. package/dist/senses/shepherd/notice-outbox.js +262 -0
  651. package/dist/senses/shepherd/observation-publisher.js +320 -0
  652. package/dist/senses/shepherd/operations-defaults.js +86 -0
  653. package/dist/senses/shepherd/operations.js +159 -0
  654. package/dist/senses/shepherd/owner-notice.js +489 -0
  655. package/dist/senses/shepherd/prompt-state.js +60 -0
  656. package/dist/senses/shepherd/recovery.js +543 -0
  657. package/dist/senses/shepherd/redact.js +66 -0
  658. package/dist/senses/shepherd/returns.js +79 -0
  659. package/dist/senses/shepherd/sense.js +849 -0
  660. package/dist/senses/shepherd/shepherd-judge-corpus-v1.json +170 -0
  661. package/dist/senses/shepherd/surface.js +123 -0
  662. package/dist/senses/shepherd/target-binding.js +13 -0
  663. package/dist/senses/shepherd/terminal-process.js +147 -0
  664. package/dist/senses/shepherd-entry.js +98 -0
  665. package/dist/senses/surface-tool.js +109 -0
  666. package/dist/senses/teams-entry.js +68 -8
  667. package/dist/senses/teams-image.js +119 -0
  668. package/dist/senses/teams.js +998 -337
  669. package/dist/senses/telegram-admission.js +718 -0
  670. package/dist/senses/telegram-approval-runtime.js +793 -0
  671. package/dist/senses/telegram-attachments.js +186 -0
  672. package/dist/senses/telegram-audit-ledger.js +220 -0
  673. package/dist/senses/telegram-authority-transport.js +231 -0
  674. package/dist/senses/telegram-client.js +1755 -0
  675. package/dist/senses/telegram-effect-adapter.js +904 -0
  676. package/dist/senses/telegram-entry.js +83 -0
  677. package/dist/senses/telegram-handoff.js +154 -0
  678. package/dist/senses/telegram.js +2474 -0
  679. package/dist/senses/trust-gate.js +104 -9
  680. package/dist/senses/voice/audio-playback.js +237 -0
  681. package/dist/senses/voice/audio-routing.js +119 -0
  682. package/dist/senses/voice/call-auth.js +250 -0
  683. package/dist/senses/voice/elevenlabs.js +202 -0
  684. package/dist/senses/voice/floor-control.js +431 -0
  685. package/dist/senses/voice/floor-controller.js +115 -0
  686. package/dist/senses/voice/golden-path.js +116 -0
  687. package/dist/senses/voice/index.js +29 -0
  688. package/dist/senses/voice/local-audio-control.js +344 -0
  689. package/dist/senses/voice/local-audio-devices.js +516 -0
  690. package/dist/senses/voice/local-audio-disclosure.js +174 -0
  691. package/dist/senses/voice/local-audio-identity.js +103 -0
  692. package/dist/senses/voice/local-audio-join.js +325 -0
  693. package/dist/senses/voice/local-audio-mute.js +199 -0
  694. package/dist/senses/voice/local-audio-notify.js +124 -0
  695. package/dist/senses/voice/local-audio-prompts.js +116 -0
  696. package/dist/senses/voice/local-audio-transport.js +427 -0
  697. package/dist/senses/voice/local-audio.js +281 -0
  698. package/dist/senses/voice/local-media-stream.js +145 -0
  699. package/dist/senses/voice/meeting.js +113 -0
  700. package/dist/senses/voice/outbound.js +190 -0
  701. package/dist/senses/voice/phone.js +33 -0
  702. package/dist/senses/voice/playback.js +139 -0
  703. package/dist/senses/voice/process-guards.js +51 -0
  704. package/dist/senses/voice/realtime-eval.js +496 -0
  705. package/dist/senses/voice/realtime-tool-schema.js +195 -0
  706. package/dist/senses/voice/realtime-trace.js +531 -0
  707. package/dist/senses/voice/transcript.js +70 -0
  708. package/dist/senses/voice/turn.js +191 -0
  709. package/dist/senses/voice/twilio-phone-runtime.js +836 -0
  710. package/dist/senses/voice/twilio-phone.js +5454 -0
  711. package/dist/senses/voice/types.js +2 -0
  712. package/dist/senses/voice/whisper.js +161 -0
  713. package/dist/senses/voice-entry.js +83 -0
  714. package/dist/senses/voice-realtime-eval-command.js +99 -0
  715. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  716. package/dist/senses/voice-twilio-entry.js +87 -0
  717. package/dist/trips/core.js +138 -0
  718. package/dist/trips/store.js +265 -0
  719. package/dist/util/frontmatter.js +69 -0
  720. package/npm-shrinkwrap.json +8342 -0
  721. package/package.json +76 -13
  722. package/skills/agent-commerce.md +113 -0
  723. package/skills/browser-navigation.md +117 -0
  724. package/skills/commerce-setup-guide.md +116 -0
  725. package/skills/commerce-setup.md +84 -0
  726. package/skills/configure-dev-tools.md +99 -0
  727. package/skills/travel-planning.md +138 -0
  728. package/dist/heart/daemon/auth-flow.js +0 -430
  729. package/dist/heart/daemon/ouro-path-installer.js +0 -260
  730. package/dist/heart/daemon/ouro-version-manager.js +0 -171
  731. package/dist/heart/daemon/update-hooks.js +0 -138
  732. package/dist/heart/obligations.js +0 -191
  733. package/dist/heart/safe-workspace.js +0 -381
  734. package/dist/heart/session-recall.js +0 -116
  735. package/dist/mind/friends/channel.js +0 -84
  736. package/dist/mind/friends/group-context.js +0 -144
  737. package/dist/mind/friends/resolver.js +0 -84
  738. package/dist/mind/friends/store-file.js +0 -190
  739. package/dist/mind/friends/store.js +0 -4
  740. package/dist/mind/friends/tokens.js +0 -26
  741. package/dist/mind/friends/trust-explanation.js +0 -74
  742. package/dist/mind/friends/types.js +0 -29
  743. package/dist/repertoire/tasks/board.js +0 -134
  744. package/dist/repertoire/tasks/index.js +0 -224
  745. package/dist/repertoire/tasks/lifecycle.js +0 -80
  746. package/dist/repertoire/tasks/middleware.js +0 -65
  747. package/dist/repertoire/tasks/parser.js +0 -173
  748. package/dist/repertoire/tasks/scanner.js +0 -132
  749. package/dist/repertoire/tasks/transitions.js +0 -144
  750. package/dist/senses/bluebubbles-entry.js +0 -13
  751. package/dist/senses/bluebubbles.js +0 -1181
  752. package/dist/senses/debug-activity.js +0 -154
  753. package/dist/senses/inner-dialog-worker.js +0 -90
  754. package/dist/senses/inner-dialog.js +0 -525
  755. package/subagents/README.md +0 -7
  756. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  757. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  758. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  759. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  760. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  761. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  762. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  763. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  764. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  765. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  766. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  767. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  768. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  769. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  770. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  771. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  772. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,483 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.QUIET_MAX_MS = exports.HOOKED_QUIET_MS = exports.QUIET_MS = exports.POLL_MS = exports.BACKGROUND_GRACE_MS = exports.GRACE_MS = exports.CMUX_STATUS_KEY = void 0;
37
+ exports.realSchedule = realSchedule;
38
+ exports.readCmuxHookSession = readCmuxHookSession;
39
+ exports.createCmuxHost = createCmuxHost;
40
+ const node_crypto_1 = require("node:crypto");
41
+ const fs = __importStar(require("node:fs"));
42
+ const os = __importStar(require("node:os"));
43
+ const path = __importStar(require("node:path"));
44
+ const runtime_1 = require("../../nerves/runtime");
45
+ const terminal_process_1 = require("./terminal-process");
46
+ const prompt_state_1 = require("./prompt-state");
47
+ const redact_1 = require("./redact");
48
+ /**
49
+ * The cmux host (0.64.22 or later). A return is cmux's own "agent stopped" signal: an
50
+ * `agent.hook.Stop` event, which cmux publishes for every agent its hooks cover (Claude Code,
51
+ * Codex, Copilot and more). After a short grace period, a stop is dropped if the agent resumed. A
52
+ * stop that cmux's session store says left background work running waits longer, and is then
53
+ * passed on marked as such: the agent is still working, not handing back control. Every terminal
54
+ * whose agent is not idle is also polled: output that stops changing for a quiet window counts
55
+ * as a return. That covers an agent cmux does not hook, and a hooked agent sitting mid-turn at a
56
+ * prompt that fires no stop (a permission or trust question); a hooked agent gets a longer window,
57
+ * because its stop normally speaks first. cmux has no bell or output event, so polling is the fallback.
58
+ */
59
+ exports.CMUX_STATUS_KEY = "ouro";
60
+ exports.GRACE_MS = 3_000;
61
+ /** A stop with background work still running waits this much longer before it is judged (as working, unless the work finished). */
62
+ exports.BACKGROUND_GRACE_MS = 30_000;
63
+ exports.POLL_MS = 4_000;
64
+ exports.QUIET_MS = 8_000;
65
+ /** A hooked agent mid-turn: long enough that a stop hook or a spinner normally speaks before the quiet screen does. */
66
+ exports.HOOKED_QUIET_MS = 20_000;
67
+ /** A quiet terminal judged as still working or not an agent is checked less often, doubling up to this. */
68
+ exports.QUIET_MAX_MS = 60_000;
69
+ const POLL_LINES = 40;
70
+ const RECONNECT_DELAYS_MS = [1_000, 2_000, 5_000, 10_000, 30_000];
71
+ const STOP_HOOKS = new Set(["Stop", "StopFailure"]);
72
+ /** Hooks after which the agent waits for the human: a stop, or a session that has not been given work yet. */
73
+ const IDLE_HOOKS = new Set([...STOP_HOOKS, "SessionStart"]);
74
+ /** Hooks that say nothing about whether the main agent is working. */
75
+ const NEUTRAL_HOOKS = new Set(["SubagentStop", "Notification"]);
76
+ /** Keys cmux presses with `surface.send_key`, by its own names; every other key is typed as its character. */
77
+ const NAMED_KEYS = { enter: "enter", escape: "escape", up: "up", down: "down", tab: "tab", "ctrl-c": "ctrl+c" };
78
+ const SUBMIT_DELAY_MS = 300;
79
+ /** A timer that can be cancelled; the sense and the host take it as an option so tests can drive time. */
80
+ function realSchedule(fn, ms) {
81
+ const timer = setTimeout(fn, ms);
82
+ return () => clearTimeout(timer);
83
+ }
84
+ function isRecord(value) {
85
+ return !!value && typeof value === "object" && !Array.isArray(value);
86
+ }
87
+ function str(value) {
88
+ return typeof value === "string" && value.length > 0 ? value : null;
89
+ }
90
+ function list(value) {
91
+ return Array.isArray(value) ? value.filter(isRecord) : [];
92
+ }
93
+ /** A v1 socket argument: quoted, with the characters cmux's tokenizer treats as special escaped. */
94
+ function socketQuote(value) {
95
+ return `"${value.replace(/\\/g, "\\\\").replace(/"/g, "\\\"")}"`;
96
+ }
97
+ /** cmux keeps each hooked agent's session in `~/.cmuxterm/<agent>-hook-sessions.json`, keyed by the agent's own session id. */
98
+ function readCmuxHookSession(homeDir, agent, sessionId) {
99
+ try {
100
+ const store = JSON.parse(fs.readFileSync(path.join(homeDir, ".cmuxterm", `${path.basename(agent)}-hook-sessions.json`), "utf-8"));
101
+ const sessions = isRecord(store) && isRecord(store.sessions) ? store.sessions : {};
102
+ // Hook events name the session `<agent>-<id>`; the store keys it by the bare id.
103
+ const key = [sessionId, sessionId.replace(`${agent}-`, "")].find((candidate) => isRecord(sessions[candidate]));
104
+ return key ? sessions[key] : null;
105
+ }
106
+ catch {
107
+ return null;
108
+ }
109
+ }
110
+ function createCmuxHost(client, options = {}) {
111
+ const homeDir = options.homeDir ?? os.homedir();
112
+ const now = options.now ?? Date.now;
113
+ const schedule = options.schedule ?? realSchedule;
114
+ /** What hook events taught: which surface a session runs in, and which agent and folder it has. */
115
+ const hooked = new Map();
116
+ const sessionSurface = new Map();
117
+ /** Terminals showing a Shepherd status, so it can be cleared when the agent resumes. */
118
+ const statused = new Map();
119
+ /** Quiet windows stretched by `pace`. */
120
+ const quietMs = new Map();
121
+ // Keep only an opaque digest, never a second private screen store. A copied/forged
122
+ // inspection has no original-screen authority and is conservatively refused.
123
+ const inspectedScreens = new WeakMap();
124
+ /** One status entry per terminal: cmux keys status pills per workspace, and a workspace can hold several agents. */
125
+ const statusKey = (surface) => `${exports.CMUX_STATUS_KEY}_${surface.ref.replace(/\W/g, "_")}`;
126
+ const clearStatus = (surfaceId) => {
127
+ const entry = statused.get(surfaceId);
128
+ if (!entry)
129
+ return;
130
+ statused.delete(surfaceId);
131
+ client.command(`clear_status ${entry.key} --tab=${entry.workspaceId}`).catch((error) => {
132
+ (0, runtime_1.emitNervesEvent)({ level: "warn", component: "senses", event: "senses.shepherd_cmux_status_error", message: "could not clear a Shepherd status", meta: { error: error.message } });
133
+ });
134
+ };
135
+ async function surfaceEntries(strict = false) {
136
+ const tree = await client.call("system.tree", { all_windows: true });
137
+ const records = (value) => {
138
+ if (strict && (!Array.isArray(value) || !value.every(isRecord)))
139
+ throw new Error("invalid cmux terminal inventory");
140
+ return list(value);
141
+ };
142
+ const seen = new Set();
143
+ return records(tree.windows).flatMap((window) => records(window.workspaces).map((workspace) => ({ window, workspace }))).flatMap(({ window, workspace }) => records(workspace.panes).flatMap((pane) => records(pane.surfaces)).map((surface) => {
144
+ if (strict && (typeof surface.id !== "string" || !surface.id.trim() || typeof surface.type !== "string"
145
+ || !["terminal", "browser"].includes(surface.type) || seen.has(surface.id)))
146
+ throw new Error("invalid cmux terminal inventory identity");
147
+ seen.add(str(surface.id) ?? "");
148
+ return {
149
+ id: str(surface.id) ?? "",
150
+ ref: str(surface.ref) ?? "",
151
+ workspace: str(workspace.ref),
152
+ workspaceTitle: str(workspace.title),
153
+ workspaceId: str(workspace.id) ?? "",
154
+ title: str(surface.title) ?? "",
155
+ tty: str(surface.tty),
156
+ type: str(surface.type) ?? "",
157
+ agent: hooked.get(str(surface.id) ?? "")?.agent ?? null,
158
+ cwd: hooked.get(str(surface.id) ?? "")?.cwd ?? null,
159
+ // The human's terminal: the focused surface of the selected workspace in a visible window.
160
+ focused: surface.focused === true && workspace.selected === true && window.visible !== false,
161
+ ...(surface.focused === true && workspace.selected === true && window.visible !== false && window.key === true
162
+ ? { selected: true } : {}),
163
+ };
164
+ }));
165
+ }
166
+ async function retirementInventory() {
167
+ return (await surfaceEntries(true)).filter(surface => surface.type === "terminal").map(surface => surface.id);
168
+ }
169
+ async function surfaces(freshFocus = false, strictInventory = false) {
170
+ const entries = await surfaceEntries(strictInventory);
171
+ const identities = await (options.identifyTerminals ?? terminal_process_1.identifyTerminalProcesses)(entries.filter((entry) => entry.type === "terminal" && entry.tty).map((entry) => entry.tty));
172
+ // Process lookup is awaited. On inspection paths, do not return focus from
173
+ // the tree sampled before that await. A moved/rebound TTY loses authority.
174
+ const current = freshFocus ? await surfaceEntries(strictInventory) : entries;
175
+ return current.map((entry) => {
176
+ const bound = entries.some(before => before.id === entry.id && before.tty === entry.tty && before.workspaceId === entry.workspaceId && before.type === entry.type);
177
+ const identity = entry.tty && bound ? identities.get(entry.tty.replace(/^\/dev\//, "")) : undefined;
178
+ return { ...entry, agent: identity?.agent ?? entry.agent, cwd: identity?.cwd ?? entry.cwd, ...(identity?.instance ? { instance: identity.instance } : {}) };
179
+ });
180
+ }
181
+ async function locate(sessionId) {
182
+ const surface = (await surfaces()).find((entry) => entry.id === sessionId || entry.ref === sessionId);
183
+ if (!surface)
184
+ throw new Error(`no cmux terminal ${sessionId}`);
185
+ return surface;
186
+ }
187
+ async function read(sessionId, lines) {
188
+ const result = await client.call("surface.read_text", { surface_id: sessionId, lines, scrollback: true });
189
+ return typeof result.text === "string" ? result.text : "";
190
+ }
191
+ const sameBinding = (a, b) => a.id.toLowerCase() === b.id.toLowerCase() && a.workspaceId.toLowerCase() === b.workspaceId.toLowerCase() &&
192
+ a.type === b.type && a.tty === b.tty && a.instance === b.instance && a.cwd === b.cwd &&
193
+ a.agent === b.agent && a.focused === b.focused && a.title === b.title &&
194
+ a.ref === b.ref && a.workspace === b.workspace && a.workspaceTitle === b.workspaceTitle && a.selected === b.selected;
195
+ async function explicitTarget(sessionId) {
196
+ if (!/^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/i.test(sessionId))
197
+ throw new Error("cmux inspection requires a surface UUID");
198
+ const target = (await surfaces(true)).find(entry => entry.id.toLowerCase() === sessionId.toLowerCase() && entry.type === "terminal");
199
+ if (!target)
200
+ throw new Error("cmux inspection target disappeared");
201
+ return target;
202
+ }
203
+ async function boundRead(target) {
204
+ const result = await client.call("surface.read_text", { surface_id: target.id, workspace_id: target.workspaceId, lines: 80, scrollback: false });
205
+ if (str(result.surface_id)?.toLowerCase() !== target.id.toLowerCase() ||
206
+ str(result.workspace_id)?.toLowerCase() !== target.workspaceId.toLowerCase() ||
207
+ typeof result.text !== "string")
208
+ throw new Error("cmux inspection target echo or text unavailable");
209
+ return result.text;
210
+ }
211
+ async function inspect(sessionId) {
212
+ const before = await explicitTarget(sessionId);
213
+ const first = await boundRead(before);
214
+ const current = await explicitTarget(sessionId);
215
+ const screen = await boundRead(current);
216
+ const after = await explicitTarget(sessionId);
217
+ const stable = sameBinding(before, current) && sameBinding(current, after) && first === screen;
218
+ const state = stable ? (0, prompt_state_1.inspectCodingPrompt)(after.agent ?? "unknown", screen) : { activity: "unknown", composer: "unknown" };
219
+ const { workspaceId: _workspaceId, type: _type, ...session } = after;
220
+ const screenFingerprint = (0, node_crypto_1.createHash)("sha256").update(screen).digest("hex");
221
+ const inspection = {
222
+ session, instance: after.instance ?? null, screen: (0, redact_1.redactSecrets)(screen), ...state,
223
+ screenFingerprint,
224
+ backgroundWork: state.activity === "unknown" ? null : state.activity === "working",
225
+ };
226
+ inspectedScreens.set(inspection, { hash: screenFingerprint, target: after });
227
+ return inspection;
228
+ }
229
+ return {
230
+ name: "cmux",
231
+ async list() {
232
+ return (await surfaces()).filter((surface) => surface.type === "terminal").map(({ workspaceId: _workspaceId, type: _type, ...session }) => session);
233
+ },
234
+ retirementInventory,
235
+ read,
236
+ inspect,
237
+ async promptIfUnchanged(sessionId, line, expected, canSend) {
238
+ // Resolve first, then re-inspect. No server-side atomic CAS exists in cmux
239
+ // 0.64: these are fresh client-side observations, not a lock on a human's UI.
240
+ const target = await explicitTarget(sessionId);
241
+ const current = await inspect(sessionId);
242
+ const original = inspectedScreens.get(expected);
243
+ const fresh = inspectedScreens.get(current);
244
+ if (!expected.instance || expected.activity !== "idle" || expected.composer !== "empty" ||
245
+ expected.backgroundWork !== false || expected.session.focused ||
246
+ current.instance !== expected.instance || current.activity !== "idle" ||
247
+ current.composer !== "empty" || current.backgroundWork !== false || current.session.focused ||
248
+ !current.session.tty || !current.session.cwd ||
249
+ current.session.id !== expected.session.id || current.session.tty !== expected.session.tty ||
250
+ current.session.cwd !== expected.session.cwd || current.session.agent !== expected.session.agent ||
251
+ current.session.workspace !== expected.session.workspace || current.screen !== expected.screen ||
252
+ !sameBinding(target, fresh.target) || !original || !sameBinding(original.target, fresh.target) ||
253
+ fresh.hash !== original.hash) {
254
+ return { state: "not_sent", reason: "inspection changed or lacks idle empty unfocused instance authority" };
255
+ }
256
+ const inputTarget = { workspace_id: target.workspaceId, surface_id: target.id };
257
+ // The sense owns generation, shutdown, recent focus and guidance. Its
258
+ // synchronous last check closes invalidation during the awaited host reads.
259
+ if (canSend && !canSend())
260
+ return { state: "not_sent", reason: "parent dispatch guard invalidated" };
261
+ // From this point every exception is uncertain, including a rejected or
262
+ // partially accepted paste. Never turn it into a definite not_sent.
263
+ await client.call("terminal.paste", { ...inputTarget, text: line, submit_key: "none" });
264
+ await new Promise(resolve => schedule(() => resolve(undefined), SUBMIT_DELAY_MS));
265
+ await client.call("surface.send_key", { ...inputTarget, key: "enter" });
266
+ (0, runtime_1.emitNervesEvent)({ component: "senses", event: "senses.shepherd_cmux_prompted", message: "typed a guarded line into a cmux terminal", meta: { chars: line.length } });
267
+ return { state: "sent" };
268
+ },
269
+ async prompt(sessionId, line) {
270
+ const surface = await locate(sessionId);
271
+ const target = { workspace_id: surface.workspaceId, surface_id: surface.id };
272
+ // A paste lands as one block, so no character of it is read as a keystroke; Enter follows on its own.
273
+ await client.call("terminal.paste", { ...target, text: line, submit_key: "none" });
274
+ await new Promise((resolve) => schedule(() => resolve(undefined), SUBMIT_DELAY_MS));
275
+ await client.call("surface.send_key", { ...target, key: "enter" });
276
+ (0, runtime_1.emitNervesEvent)({ component: "senses", event: "senses.shepherd_cmux_prompted", message: "typed a line into a cmux terminal", meta: { chars: line.length } });
277
+ },
278
+ async key(sessionId, key) {
279
+ const surface = await locate(sessionId);
280
+ const target = { workspace_id: surface.workspaceId, surface_id: surface.id };
281
+ const named = NAMED_KEYS[key];
282
+ if (named)
283
+ await client.call("surface.send_key", { ...target, key: named });
284
+ else
285
+ await client.call("surface.send_text", { ...target, text: key });
286
+ },
287
+ async signal(sessionId, status, notification) {
288
+ const surface = await locate(sessionId);
289
+ const key = statusKey(surface);
290
+ await client.command(status
291
+ ? `set_status ${key} ${socketQuote(status)} --tab=${surface.workspaceId} --panel=${surface.id}`
292
+ : `clear_status ${key} --tab=${surface.workspaceId}`);
293
+ if (status)
294
+ statused.set(surface.id, { key, workspaceId: surface.workspaceId });
295
+ else
296
+ statused.delete(surface.id);
297
+ if (notification)
298
+ await client.call("notification.create", { title: notification.title, subtitle: "", body: notification.body, workspace_id: surface.workspaceId });
299
+ },
300
+ pace(sessionId, slower) {
301
+ if (slower)
302
+ quietMs.set(sessionId, Math.min((quietMs.get(sessionId) ?? exports.QUIET_MS) * 2, exports.QUIET_MAX_MS));
303
+ else
304
+ quietMs.delete(sessionId);
305
+ },
306
+ watch(handlers) {
307
+ let closed = false;
308
+ let cursor = null;
309
+ let attempt = 0;
310
+ let stream = null;
311
+ let cancelReconnect = null;
312
+ let cancelPoll = null;
313
+ const pending = new Map();
314
+ const screens = new Map();
315
+ const forget = (surfaceId) => {
316
+ hooked.delete(surfaceId);
317
+ for (const [session, surface] of sessionSurface)
318
+ if (surface === surfaceId)
319
+ sessionSurface.delete(session);
320
+ };
321
+ const cancelPending = (surfaceId) => {
322
+ pending.get(surfaceId)?.();
323
+ pending.delete(surfaceId);
324
+ };
325
+ /** A stop becomes a return only if nothing resumed it within the grace period; background work earns it a longer wait. */
326
+ const stopped = (surfaceId, transitionId, agent, sessionId, cwd, waited = false) => {
327
+ cancelPending(surfaceId);
328
+ pending.set(surfaceId, schedule(() => {
329
+ pending.delete(surfaceId);
330
+ const session = sessionId ? readCmuxHookSession(homeDir, agent, sessionId) : null;
331
+ const backgroundWork = session?.hadPendingBackgroundWorkAtStop === true || session?.agentLifecycle === "backgroundWorkPending" || session?.agentLifecycle === "running";
332
+ if (backgroundWork && !waited) {
333
+ (0, runtime_1.emitNervesEvent)({ component: "senses", event: "senses.shepherd_stop_deferred", message: "a cmux stop left background work running; waiting longer", meta: { agent } });
334
+ return stopped(surfaceId, transitionId, agent, sessionId, cwd, true);
335
+ }
336
+ handlers.returned({ sessionId: surfaceId, transitionId, agent, cwd: str(session?.cwd) ?? cwd, lastBody: str(session?.lastBody), backgroundWork });
337
+ }, waited ? exports.BACKGROUND_GRACE_MS : exports.GRACE_MS));
338
+ };
339
+ const onEvent = (frame) => {
340
+ const name = str(frame.name) ?? "";
341
+ const payload = isRecord(frame.payload) ? frame.payload : {};
342
+ const surfaceId = str(payload.surface_id) ?? str(frame.surface_id);
343
+ if (name === "surface.focused" && surfaceId) {
344
+ quietMs.delete(surfaceId);
345
+ return handlers.focused(surfaceId);
346
+ }
347
+ if (name === "surface.closed" && surfaceId) {
348
+ cancelPending(surfaceId);
349
+ forget(surfaceId);
350
+ screens.delete(surfaceId);
351
+ statused.delete(surfaceId);
352
+ return;
353
+ }
354
+ if (!name.startsWith("agent.hook.") || (payload.phase !== undefined && payload.phase !== "received"))
355
+ return;
356
+ const hook = name.slice("agent.hook.".length);
357
+ const sessionId = str(payload.session_id);
358
+ if (sessionId && surfaceId)
359
+ sessionSurface.set(sessionId, surfaceId);
360
+ const surface = surfaceId ?? (sessionId ? sessionSurface.get(sessionId) : undefined);
361
+ if (!surface)
362
+ return;
363
+ const agent = str(payload._source) ?? str(frame.source) ?? "unknown";
364
+ const cwd = str(payload.cwd);
365
+ const neutral = NEUTRAL_HOOKS.has(hook);
366
+ // An idle agent's return came from its stop; the quiet-screen poll leaves it alone until it works again.
367
+ hooked.set(surface, { agent, cwd, sessionId, idle: IDLE_HOOKS.has(hook) || (neutral && hooked.get(surface)?.idle === true) });
368
+ if (STOP_HOOKS.has(hook))
369
+ return stopped(surface, `cmux:${String(frame.boot_id)}:${String(frame.seq)}`, agent, sessionId, cwd);
370
+ if (neutral || hook === "SessionStart")
371
+ return;
372
+ // The agent is working again: no pending stop, no stale status, and its quiet screen is checked at the normal pace.
373
+ cancelPending(surface);
374
+ clearStatus(surface);
375
+ quietMs.delete(surface);
376
+ // An agent that exited leaves a plain terminal, which the quiet-screen fallback watches again.
377
+ if (hook === "SessionEnd")
378
+ forget(surface);
379
+ };
380
+ const connect = () => {
381
+ cancelReconnect = null;
382
+ stream = client.stream({ ...(cursor !== null ? { after_seq: cursor } : {}), categories: ["agent", "surface"], include_heartbeats: false }, {
383
+ onFrame: (frame) => {
384
+ if (frame.type === "ack") {
385
+ attempt = 0;
386
+ const resume = isRecord(frame.resume) ? frame.resume : {};
387
+ // A first connection, a restart or a gap starts from cmux's latest event: old stops are not replayed as new returns.
388
+ if (cursor === null || resume.gap === true)
389
+ cursor = typeof resume.latest_seq === "number" ? resume.latest_seq : cursor;
390
+ (0, runtime_1.emitNervesEvent)({ component: "senses", event: "senses.shepherd_cmux_connected", message: "cmux event stream connected", meta: { gap: resume.gap === true } });
391
+ return;
392
+ }
393
+ if (frame.type !== "event" || typeof frame.seq !== "number" || (cursor !== null && frame.seq <= cursor))
394
+ return;
395
+ cursor = frame.seq;
396
+ onEvent(frame);
397
+ },
398
+ onClose: (error) => {
399
+ stream = null;
400
+ if (closed)
401
+ return;
402
+ const delay = RECONNECT_DELAYS_MS[Math.min(attempt, RECONNECT_DELAYS_MS.length - 1)];
403
+ attempt += 1;
404
+ (0, runtime_1.emitNervesEvent)({ level: "warn", component: "senses", event: "senses.shepherd_cmux_closed", message: "cmux event stream closed; reconnecting", meta: { delay, error: error?.message ?? null } });
405
+ cancelReconnect = schedule(connect, delay);
406
+ },
407
+ });
408
+ };
409
+ let lastObserved = [];
410
+ /** Inventory reads stay outside the judge queue; idle-hook terminals are observed but never rejudged here. */
411
+ const poll = async () => {
412
+ try {
413
+ const terminals = (await surfaces(false, !!handlers.observed)).filter((surface) => surface.type === "terminal");
414
+ if (closed)
415
+ return;
416
+ const seen = new Set(terminals.map((surface) => surface.id));
417
+ for (const id of screens.keys())
418
+ if (!seen.has(id))
419
+ screens.delete(id);
420
+ const rows = [];
421
+ for (const surface of terminals) {
422
+ const idle = hooked.get(surface.id)?.idle === true;
423
+ if (idle)
424
+ screens.delete(surface.id);
425
+ if (idle && !handlers.observed)
426
+ continue;
427
+ let text;
428
+ try {
429
+ text = await read(surface.id, POLL_LINES);
430
+ }
431
+ catch (error) {
432
+ rows.push({ session: surface, activity: "unknown", observedAt: null, error: "read_failed" });
433
+ (0, runtime_1.emitNervesEvent)({ level: "warn", component: "senses", event: "senses.shepherd_cmux_poll_error",
434
+ message: "could not read one cmux terminal; other terminals remain observable", meta: { error: (0, redact_1.redactSecrets)(String(error)) } });
435
+ continue;
436
+ }
437
+ if (closed)
438
+ return;
439
+ rows.push({ session: surface, activity: surface.agent ? (0, prompt_state_1.inspectCodingPrompt)(surface.agent, text).activity : "unknown", observedAt: now() });
440
+ if (idle)
441
+ continue;
442
+ const hash = (0, node_crypto_1.createHash)("sha256").update(text).digest("hex");
443
+ const last = screens.get(surface.id);
444
+ const at = now();
445
+ if (!last)
446
+ screens.set(surface.id, { hash, changedAt: at, active: false });
447
+ else if (last.hash !== hash) {
448
+ screens.set(surface.id, { hash, changedAt: at, active: true });
449
+ clearStatus(surface.id);
450
+ }
451
+ else if (last.active && at - last.changedAt >= Math.max(quietMs.get(surface.id) ?? exports.QUIET_MS, hooked.has(surface.id) ? exports.HOOKED_QUIET_MS : 0)) {
452
+ last.active = false;
453
+ handlers.returned({ sessionId: surface.id, transitionId: `cmux:quiet:${surface.id}:${last.changedAt}`, agent: surface.agent, cwd: surface.cwd ?? null, title: surface.title, workspaceTitle: surface.workspaceTitle, lastBody: null, backgroundWork: null });
454
+ }
455
+ }
456
+ if (closed)
457
+ return;
458
+ lastObserved = rows;
459
+ handlers.observed?.({ at: now(), sessions: rows });
460
+ }
461
+ catch (error) {
462
+ (0, runtime_1.emitNervesEvent)({ level: "warn", component: "senses", event: "senses.shepherd_cmux_poll_error", message: "could not poll cmux terminals; the next poll retries", meta: { error: error.message } });
463
+ if (!closed)
464
+ handlers.observed?.({ at: now(), sessions: lastObserved, error: "host_unavailable" });
465
+ }
466
+ if (!closed)
467
+ cancelPoll = schedule(() => void poll(), exports.POLL_MS);
468
+ };
469
+ connect();
470
+ void poll();
471
+ return {
472
+ close() {
473
+ closed = true;
474
+ cancelReconnect?.();
475
+ cancelPoll?.();
476
+ for (const cancel of pending.values())
477
+ cancel();
478
+ stream?.close();
479
+ },
480
+ };
481
+ },
482
+ };
483
+ }