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

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 (777) 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 +6257 -16
  16. package/deploy/unraid/Dockerfile +71 -0
  17. package/deploy/unraid/INSTALL.md +64 -0
  18. package/deploy/unraid/README.txt +3032 -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/github_known_hosts +3 -0
  25. package/deploy/unraid/install.sh +274 -0
  26. package/deploy/unraid/migrate-sanctuary-bundle.mjs +63 -0
  27. package/deploy/unraid/ouro-events/bootstrap-spool.sh +92 -0
  28. package/deploy/unraid/ouro-events/emit-event.mjs +310 -0
  29. package/deploy/unraid/ouro-events/emit-usenet-event.sh +54 -0
  30. package/deploy/unraid/ouro-events/install-usenet-guard.sh +435 -0
  31. package/deploy/unraid/ouro-events/usenet-health.sh +176 -0
  32. package/deploy/unraid/ouro-sync-ssh +98 -0
  33. package/deploy/unraid/ouro-sync.sudoers +3 -0
  34. package/deploy/unraid/sanctuary-acceptance-adapter.sh +43 -0
  35. package/deploy/unraid/sanctuary-acceptance-contract.json +198 -0
  36. package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
  37. package/deploy/unraid/sanctuary-authority-installation.json +36 -0
  38. package/deploy/unraid/sanctuary-authority-service.sh +30 -0
  39. package/deploy/unraid/sanctuary-butler-upgrade.mjs +1523 -0
  40. package/deploy/unraid/sanctuary-deployment-target.mjs +710 -0
  41. package/deploy/unraid/sanctuary-replay-gate.mjs +2467 -0
  42. package/deploy/unraid/sanctuary-safe-rename.py +24 -0
  43. package/deploy/unraid/sanctuary-sync-cutover.sh +1039 -0
  44. package/deploy/unraid/sanctuary-unit16-host-broker.mjs +2088 -0
  45. package/deploy/unraid/sanctuary-unit16-run.sh +570 -0
  46. package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
  47. package/deploy/unraid/sanctuary.ouro/agent.json +67 -0
  48. package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
  49. package/deploy/unraid/sanctuary.ouro/awaiting/house-care-sweep.md +17 -0
  50. package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
  51. package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
  52. package/deploy/unraid/sanctuary.ouro/mcp/media-mcp.mjs +2255 -0
  53. package/deploy/unraid/sanctuary.ouro/product/PRODUCT.md +13 -0
  54. package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
  55. package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
  56. package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +7 -0
  57. package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +7 -0
  58. package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +15 -0
  59. package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +3 -0
  60. package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
  61. package/deploy/unraid/sanctuary.ouro/tool-profiles.json +234 -0
  62. package/deploy/unraid/sanctuary.xml +30 -0
  63. package/dist/a2a/card.js +57 -0
  64. package/dist/a2a/client.js +290 -0
  65. package/dist/a2a/config.js +50 -0
  66. package/dist/a2a/delegated-command-grants.js +93 -0
  67. package/dist/a2a/delegated-command.js +197 -0
  68. package/dist/a2a/delegation-stores.js +56 -0
  69. package/dist/a2a/did-resolution.js +205 -0
  70. package/dist/a2a/escalation-grants.js +84 -0
  71. package/dist/a2a/escalation-wiring.js +60 -0
  72. package/dist/a2a/identity.js +258 -0
  73. package/dist/a2a/inbound-share.js +131 -0
  74. package/dist/a2a/mission-result-wire.js +265 -0
  75. package/dist/a2a/onboarding.js +133 -0
  76. package/dist/a2a/operator-trust.js +399 -0
  77. package/dist/a2a/outbox-client.js +59 -0
  78. package/dist/a2a/outbox-store.js +188 -0
  79. package/dist/a2a/outbox-wire.js +106 -0
  80. package/dist/a2a/pin-store.js +167 -0
  81. package/dist/a2a/refusals.js +53 -0
  82. package/dist/a2a/relay-client.js +106 -0
  83. package/dist/a2a/relay-config-vault.js +64 -0
  84. package/dist/a2a/relay-contacts.js +120 -0
  85. package/dist/a2a/relay-inbox.js +360 -0
  86. package/dist/a2a/relay-retirements.js +89 -0
  87. package/dist/a2a/replay-grant-holders.js +33 -0
  88. package/dist/a2a/replay-harness.js +188 -0
  89. package/dist/a2a/resolution-proof.js +53 -0
  90. package/dist/a2a/sealed-chat.js +114 -0
  91. package/dist/a2a/seen-ledger.js +214 -0
  92. package/dist/a2a/server.js +808 -0
  93. package/dist/a2a/task-store.js +69 -0
  94. package/dist/a2a/transport.js +100 -0
  95. package/dist/a2a/trust-commands.js +203 -0
  96. package/dist/a2a/trusted-files.js +185 -0
  97. package/dist/a2a/types.js +3 -0
  98. package/dist/arc/attention-types.js +8 -0
  99. package/dist/arc/cares.js +360 -0
  100. package/dist/arc/episodes.js +118 -0
  101. package/dist/arc/evolution.js +490 -0
  102. package/dist/arc/flight-recorder.js +1034 -0
  103. package/dist/arc/intentions.js +134 -0
  104. package/dist/arc/json-store.js +117 -0
  105. package/dist/arc/obligations.js +386 -0
  106. package/dist/arc/packets.js +336 -0
  107. package/dist/arc/presence.js +185 -0
  108. package/dist/arc/task-lifecycle.js +57 -0
  109. package/dist/commerce/store.js +755 -0
  110. package/dist/commerce/types.js +3 -0
  111. package/dist/gateway/keys.js +117 -0
  112. package/dist/gateway/server.js +429 -0
  113. package/dist/heart/active-work.js +798 -40
  114. package/dist/heart/agent-entry.js +252 -3
  115. package/dist/heart/approval-files.js +113 -0
  116. package/dist/heart/approval-store.js +960 -0
  117. package/dist/heart/attachments/image-normalize.js +201 -0
  118. package/dist/heart/attachments/materialize.js +97 -0
  119. package/dist/heart/attachments/originals.js +88 -0
  120. package/dist/heart/attachments/render.js +29 -0
  121. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  122. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  123. package/dist/heart/attachments/sources/index.js +18 -0
  124. package/dist/heart/attachments/sources/telegram.js +71 -0
  125. package/dist/heart/attachments/store.js +132 -0
  126. package/dist/heart/attachments/types.js +93 -0
  127. package/dist/heart/auth/auth-flow.js +511 -0
  128. package/dist/heart/autonomy-budget.js +478 -0
  129. package/dist/heart/awaiting/a2a-await-delivery.js +109 -0
  130. package/dist/heart/awaiting/await-alert.js +152 -0
  131. package/dist/heart/awaiting/await-expiry.js +143 -0
  132. package/dist/heart/awaiting/await-loader.js +91 -0
  133. package/dist/heart/awaiting/await-parser.js +152 -0
  134. package/dist/heart/awaiting/await-runtime-state.js +130 -0
  135. package/dist/heart/awaiting/await-scheduler.js +391 -0
  136. package/dist/heart/background-operations.js +281 -0
  137. package/dist/heart/bluebubbles-host-account.js +78 -0
  138. package/dist/heart/bridges/manager.js +137 -17
  139. package/dist/heart/bridges/store.js +14 -2
  140. package/dist/heart/bundle-state.js +168 -0
  141. package/dist/heart/commitments.js +44 -18
  142. package/dist/heart/config-registry.js +331 -0
  143. package/dist/heart/config.js +179 -131
  144. package/dist/heart/context-loss-gauntlet.js +387 -0
  145. package/dist/heart/context-loss-sentinel.js +1204 -0
  146. package/dist/heart/core.js +2378 -586
  147. package/dist/heart/cross-chat-delivery.js +9 -22
  148. package/dist/heart/daemon/agent-config-check.js +474 -0
  149. package/dist/heart/daemon/agent-discovery.js +287 -3
  150. package/dist/heart/daemon/agent-home.js +355 -0
  151. package/dist/heart/daemon/agent-service.js +542 -0
  152. package/dist/heart/daemon/agentic-repair.js +547 -0
  153. package/dist/heart/daemon/await-private-wake.js +59 -0
  154. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  155. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  156. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  157. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  158. package/dist/heart/daemon/boot-sync-probe.js +223 -0
  159. package/dist/heart/daemon/cadence.js +180 -0
  160. package/dist/heart/daemon/cli-arg-redaction.js +26 -0
  161. package/dist/heart/daemon/cli-defaults.js +881 -0
  162. package/dist/heart/daemon/cli-desk.js +331 -0
  163. package/dist/heart/daemon/cli-exec.js +9339 -0
  164. package/dist/heart/daemon/cli-help.js +766 -0
  165. package/dist/heart/daemon/cli-parse.js +3343 -0
  166. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  167. package/dist/heart/daemon/cli-render.js +819 -0
  168. package/dist/heart/daemon/cli-types.js +8 -0
  169. package/dist/heart/daemon/connect-bay.js +323 -0
  170. package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
  171. package/dist/heart/daemon/container-healthcheck.js +112 -0
  172. package/dist/heart/daemon/container-runtime.js +97 -0
  173. package/dist/heart/daemon/container-spec-auditor-main.js +187 -0
  174. package/dist/heart/daemon/container-spec-auditor.js +257 -0
  175. package/dist/heart/daemon/daemon-bootstrap-startup.js +115 -0
  176. package/dist/heart/daemon/daemon-cli.js +29 -2373
  177. package/dist/heart/daemon/daemon-entry.js +975 -11
  178. package/dist/heart/daemon/daemon-health.js +186 -0
  179. package/dist/heart/daemon/daemon-rollup.js +57 -0
  180. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  181. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  182. package/dist/heart/daemon/daemon.js +2110 -104
  183. package/dist/heart/daemon/desk-admin.js +420 -0
  184. package/dist/heart/daemon/dns-workflow.js +394 -0
  185. package/dist/heart/daemon/doctor-types.js +8 -0
  186. package/dist/heart/daemon/doctor.js +1766 -0
  187. package/dist/heart/daemon/freshness.js +345 -0
  188. package/dist/heart/daemon/habit-private-wake.js +61 -0
  189. package/dist/heart/daemon/health-monitor.js +154 -11
  190. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  191. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  192. package/dist/heart/daemon/http-health-probe.js +80 -0
  193. package/dist/heart/daemon/human-command-screens.js +234 -0
  194. package/dist/heart/daemon/human-readiness.js +114 -0
  195. package/dist/heart/daemon/inner-status.js +78 -0
  196. package/dist/heart/daemon/interactive-repair.js +394 -0
  197. package/dist/heart/daemon/launchd.js +37 -8
  198. package/dist/heart/daemon/log-tailer.js +79 -10
  199. package/dist/heart/daemon/logs-prune.js +132 -0
  200. package/dist/heart/daemon/mcp-canary.js +524 -0
  201. package/dist/heart/daemon/message-router.js +65 -5
  202. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  203. package/dist/heart/daemon/os-cron-deps.js +135 -0
  204. package/dist/heart/daemon/os-cron.js +22 -14
  205. package/dist/heart/daemon/ouro-bot-entry.js +6 -3
  206. package/dist/heart/daemon/ouro-entry.js +9 -3
  207. package/dist/heart/daemon/plugin-cli.js +432 -0
  208. package/dist/heart/daemon/process-manager.js +760 -61
  209. package/dist/heart/daemon/provider-discovery.js +137 -0
  210. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  211. package/dist/heart/daemon/prunable-bundle.js +144 -0
  212. package/dist/heart/daemon/pulse.js +511 -0
  213. package/dist/heart/daemon/readiness-repair.js +365 -0
  214. package/dist/heart/daemon/run-hooks.js +2 -0
  215. package/dist/heart/daemon/runtime-logging.js +47 -14
  216. package/dist/heart/daemon/runtime-metadata.js +2 -30
  217. package/dist/heart/daemon/runtime-mode.js +13 -2
  218. package/dist/heart/daemon/safe-mode.js +161 -0
  219. package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2662 -0
  220. package/dist/heart/daemon/sanctuary-acceptance-harness.js +1832 -0
  221. package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
  222. package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +956 -0
  223. package/dist/heart/daemon/sanctuary-authority-codec.js +86 -0
  224. package/dist/heart/daemon/sanctuary-authority-epoch.js +291 -0
  225. package/dist/heart/daemon/sanctuary-authority-installation.js +161 -0
  226. package/dist/heart/daemon/sanctuary-authority-ledger.js +241 -0
  227. package/dist/heart/daemon/sanctuary-authority-root-lifecycle.js +1332 -0
  228. package/dist/heart/daemon/sanctuary-authority-vault-migration.js +79 -0
  229. package/dist/heart/daemon/sanctuary-bundle-migration.js +974 -0
  230. package/dist/heart/daemon/sanctuary-host-authority.js +1008 -0
  231. package/dist/heart/daemon/sanctuary-host-detached-supervisor.js +493 -0
  232. package/dist/heart/daemon/sanctuary-host-executor.js +670 -0
  233. package/dist/heart/daemon/sanctuary-host-linux-kernel.js +334 -0
  234. package/dist/heart/daemon/sanctuary-host-supervisor-entry.js +207 -0
  235. package/dist/heart/daemon/sanctuary-host-supervisor.js +95 -0
  236. package/dist/heart/daemon/sanctuary-package-management.js +113 -0
  237. package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
  238. package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
  239. package/dist/heart/daemon/sanctuary-telegram-authority-entry.js +475 -0
  240. package/dist/heart/daemon/sanctuary-telegram-authority-gateway.js +585 -0
  241. package/dist/heart/daemon/sanctuary-telegram-authority-service.js +676 -0
  242. package/dist/heart/daemon/sense-manager.js +786 -48
  243. package/dist/heart/daemon/session-id-resolver.js +131 -0
  244. package/dist/heart/daemon/skill-management-installer.js +1 -1
  245. package/dist/heart/daemon/socket-client.js +180 -12
  246. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  247. package/dist/heart/daemon/startup-tui.js +339 -0
  248. package/dist/heart/daemon/supercronic-supervisor.js +282 -0
  249. package/dist/heart/daemon/task-scheduler.js +117 -39
  250. package/dist/heart/daemon/terminal-ui.js +503 -0
  251. package/dist/heart/daemon/thoughts.js +138 -54
  252. package/dist/heart/daemon/up-progress.js +366 -0
  253. package/dist/heart/daemon/vault-items.js +56 -0
  254. package/dist/heart/delegation.js +1 -4
  255. package/dist/heart/external-events/router.js +1531 -0
  256. package/dist/heart/failure-reports.js +336 -0
  257. package/dist/heart/file-lock.js +109 -0
  258. package/dist/heart/frontend-approval-runtime.js +506 -0
  259. package/dist/heart/frontend-journal.js +215 -0
  260. package/dist/heart/frontend-session-service.js +271 -0
  261. package/dist/heart/frontend-socket-client.js +173 -0
  262. package/dist/heart/frontend-socket.js +434 -0
  263. package/dist/heart/frontend-turn-errors.js +20 -0
  264. package/dist/heart/habits/habit-cancel.js +810 -0
  265. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  266. package/dist/heart/habits/habit-migration.js +194 -0
  267. package/dist/heart/habits/habit-parser.js +278 -0
  268. package/dist/heart/habits/habit-runtime-state.js +93 -0
  269. package/dist/heart/habits/habit-scheduler.js +653 -0
  270. package/dist/heart/habits/habit-session-summary.js +318 -0
  271. package/dist/heart/habits/habit-session.js +636 -0
  272. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
  273. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  274. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  275. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  276. package/dist/heart/identity.js +239 -59
  277. package/dist/heart/kept-notes.js +289 -0
  278. package/dist/heart/kicks.js +1 -1
  279. package/dist/heart/machine-identity.js +175 -0
  280. package/dist/heart/mail-import-discovery.js +356 -0
  281. package/dist/heart/mailbox/mailbox-http-hooks.js +99 -0
  282. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  283. package/dist/heart/mailbox/mailbox-http-routes.js +406 -0
  284. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  285. package/dist/heart/mailbox/mailbox-http-transport.js +272 -0
  286. package/dist/heart/mailbox/mailbox-http.js +99 -0
  287. package/dist/heart/mailbox/mailbox-read.js +41 -0
  288. package/dist/heart/mailbox/mailbox-supervision.js +131 -0
  289. package/dist/heart/mailbox/mailbox-types.js +27 -0
  290. package/dist/heart/mailbox/mailbox-view.js +197 -0
  291. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  292. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  293. package/dist/heart/mailbox/readers/mail.js +375 -0
  294. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  295. package/dist/heart/mailbox/readers/sessions.js +231 -0
  296. package/dist/heart/mailbox/readers/shared.js +111 -0
  297. package/dist/heart/mcp/mcp-server.js +760 -0
  298. package/dist/heart/migrate-config.js +100 -0
  299. package/dist/heart/model-capabilities.js +83 -16
  300. package/dist/heart/orientation-frame.js +376 -0
  301. package/dist/heart/platform.js +81 -0
  302. package/dist/heart/primitives.js +1 -1
  303. package/dist/heart/private-runtime/decision-renderer.js +158 -0
  304. package/dist/heart/private-runtime/index.js +18 -0
  305. package/dist/heart/private-runtime/ledger.js +221 -0
  306. package/dist/heart/private-runtime/policy.js +260 -0
  307. package/dist/heart/private-runtime/types.js +2 -0
  308. package/dist/heart/progress-story.js +1 -1
  309. package/dist/heart/provider-attempt.js +137 -0
  310. package/dist/heart/provider-binding-resolver.js +273 -0
  311. package/dist/heart/provider-credentials.js +449 -0
  312. package/dist/heart/provider-failover.js +311 -0
  313. package/dist/heart/provider-models.js +96 -0
  314. package/dist/heart/provider-ping.js +266 -0
  315. package/dist/heart/provider-readiness-cache.js +119 -0
  316. package/dist/heart/provider-visibility.js +188 -0
  317. package/dist/heart/providers/anthropic-token.js +131 -0
  318. package/dist/heart/providers/anthropic.js +248 -67
  319. package/dist/heart/providers/azure.js +23 -11
  320. package/dist/heart/providers/error-classification.js +129 -0
  321. package/dist/heart/providers/github-copilot.js +38 -39
  322. package/dist/heart/providers/minimax-vlm.js +189 -0
  323. package/dist/heart/providers/minimax.js +26 -8
  324. package/dist/heart/providers/openai-codex-token.js +349 -0
  325. package/dist/heart/providers/openai-codex.js +55 -40
  326. package/dist/heart/providers/openai-compatible.js +177 -0
  327. package/dist/heart/reach-channel.js +85 -0
  328. package/dist/heart/reply-style.js +52 -0
  329. package/dist/heart/run-ledger.js +247 -0
  330. package/dist/heart/runtime-capability-check.js +170 -0
  331. package/dist/heart/runtime-credentials.js +608 -0
  332. package/dist/heart/runtime-cwd.js +87 -0
  333. package/dist/heart/sense-truth.js +24 -4
  334. package/dist/heart/session-activity.js +94 -24
  335. package/dist/heart/session-events.js +1521 -0
  336. package/dist/heart/session-playback-cli-main.js +5 -0
  337. package/dist/heart/session-playback-cli.js +36 -0
  338. package/dist/heart/session-playback.js +231 -0
  339. package/dist/heart/session-redaction-repair-cli-main.js +31 -0
  340. package/dist/heart/session-redaction-repair.js +552 -0
  341. package/dist/heart/session-stats-cli-main.js +5 -0
  342. package/dist/heart/session-stats.js +183 -0
  343. package/dist/heart/session-transcript.js +133 -0
  344. package/dist/heart/shelf-claims.js +78 -0
  345. package/dist/heart/shepherd/custody-types.js +2 -0
  346. package/dist/heart/shepherd/mandates.js +352 -0
  347. package/dist/heart/shepherd/operation-commands.js +19 -0
  348. package/dist/heart/shepherd/operations.js +135 -0
  349. package/dist/heart/shepherd/supervision.js +114 -0
  350. package/dist/heart/shepherd/types.js +2 -0
  351. package/dist/heart/shepherd-config.js +123 -0
  352. package/dist/heart/source-grounding.js +313 -0
  353. package/dist/heart/start-of-turn-packet.js +372 -0
  354. package/dist/heart/steward-policy.js +656 -0
  355. package/dist/heart/streaming.js +631 -207
  356. package/dist/heart/structured-output.js +196 -0
  357. package/dist/heart/sync-classification.js +176 -0
  358. package/dist/heart/sync-health.js +152 -0
  359. package/dist/heart/sync-lock.js +431 -0
  360. package/dist/heart/sync.js +1579 -0
  361. package/dist/heart/target-resolution.js +11 -7
  362. package/dist/heart/tempo.js +93 -0
  363. package/dist/heart/temporal-view.js +41 -0
  364. package/dist/heart/timeouts.js +101 -0
  365. package/dist/heart/tool-activity-callbacks.js +59 -0
  366. package/dist/heart/tool-approval.js +382 -0
  367. package/dist/heart/tool-description.js +155 -0
  368. package/dist/heart/tool-friction.js +55 -0
  369. package/dist/heart/tool-loop.js +206 -0
  370. package/dist/heart/tool-output-budget.js +41 -0
  371. package/dist/heart/turn-context.js +496 -0
  372. package/dist/heart/turn-execution-lease.js +30 -0
  373. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  374. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +3 -2
  375. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  376. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  377. package/dist/heart/versioning/ouro-version-manager.js +432 -0
  378. package/dist/heart/versioning/release-sources.js +173 -0
  379. package/dist/heart/versioning/self-update-defaults.js +294 -0
  380. package/dist/heart/versioning/self-update.js +196 -0
  381. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  382. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  383. package/dist/heart/versioning/update-hooks.js +154 -0
  384. package/dist/heart/versioning/update-state.js +126 -0
  385. package/dist/heart/versioning/updater-launchd.js +150 -0
  386. package/dist/heart/versioning/version-intent.js +114 -0
  387. package/dist/heart/work-card.js +380 -0
  388. package/dist/mailbox-ui/assets/index-Dbska1tZ.js +1 -0
  389. package/dist/mailbox-ui/assets/index-DsiKaPyH.css +1 -0
  390. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  391. package/dist/mailbox-ui/index.html +16 -0
  392. package/dist/mailroom/attention.js +167 -0
  393. package/dist/mailroom/autonomy.js +209 -0
  394. package/dist/mailroom/blob-store.js +889 -0
  395. package/dist/mailroom/body-cache.js +61 -0
  396. package/dist/mailroom/cache-sync-cli.js +58 -0
  397. package/dist/mailroom/core.js +803 -0
  398. package/dist/mailroom/entry.js +160 -0
  399. package/dist/mailroom/file-store.js +568 -0
  400. package/dist/mailroom/hosted-cache-sync.js +384 -0
  401. package/dist/mailroom/mbox-import.js +393 -0
  402. package/dist/mailroom/migration.js +164 -0
  403. package/dist/mailroom/outbound.js +380 -0
  404. package/dist/mailroom/policy.js +263 -0
  405. package/dist/mailroom/reader.js +292 -0
  406. package/dist/mailroom/search-cache.js +513 -0
  407. package/dist/mailroom/search-relevance.js +319 -0
  408. package/dist/mailroom/smtp-ingress.js +176 -0
  409. package/dist/mailroom/source-state.js +176 -0
  410. package/dist/mailroom/thread.js +109 -0
  411. package/dist/mailroom/travel-extract.js +89 -0
  412. package/dist/mind/bundle-manifest.js +25 -2
  413. package/dist/mind/context.js +328 -139
  414. package/dist/mind/desk-section.js +362 -0
  415. package/dist/mind/diary-integrity.js +60 -0
  416. package/dist/mind/{memory.js → diary.js} +68 -77
  417. package/dist/mind/embedding-provider.js +60 -0
  418. package/dist/mind/file-state.js +179 -0
  419. package/dist/mind/friend-link-codes.js +209 -0
  420. package/dist/mind/friend-merge.js +336 -0
  421. package/dist/mind/house-names.js +43 -0
  422. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  423. package/dist/mind/obligation-steering.js +199 -3
  424. package/dist/mind/outbound-record.js +168 -0
  425. package/dist/mind/pending.js +36 -10
  426. package/dist/mind/prompt-budget.js +479 -0
  427. package/dist/mind/prompt-refresh.js +3 -2
  428. package/dist/mind/prompt.js +1222 -203
  429. package/dist/mind/provenance-trust.js +26 -0
  430. package/dist/mind/record-paths.js +312 -0
  431. package/dist/mind/scrutiny.js +173 -0
  432. package/dist/mind/session-transaction.js +622 -0
  433. package/dist/nerves/cli-logging.js +7 -1
  434. package/dist/nerves/coverage/audit-rules.js +15 -6
  435. package/dist/nerves/coverage/audit.js +28 -2
  436. package/dist/nerves/coverage/cli.js +1 -1
  437. package/dist/nerves/coverage/contract.js +5 -5
  438. package/dist/nerves/coverage/file-completeness.js +143 -5
  439. package/dist/nerves/coverage/run-artifacts.js +55 -35
  440. package/dist/nerves/coverage/source-scanner.js +4 -4
  441. package/dist/nerves/event-buffer.js +111 -0
  442. package/dist/nerves/index.js +293 -9
  443. package/dist/nerves/observation.js +20 -0
  444. package/dist/nerves/redact.js +79 -0
  445. package/dist/nerves/review/cli-main.js +5 -0
  446. package/dist/nerves/review/cli.js +156 -0
  447. package/dist/nerves/review/core.js +159 -0
  448. package/dist/nerves/runtime.js +17 -1
  449. package/dist/repertoire/ado-client.js +15 -56
  450. package/dist/repertoire/ado-semantic.js +16 -10
  451. package/dist/repertoire/api-client.js +97 -0
  452. package/dist/repertoire/bitwarden-store.js +1199 -0
  453. package/dist/repertoire/bundle-templates.js +71 -0
  454. package/dist/repertoire/bw-installer.js +231 -0
  455. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  456. package/dist/repertoire/coding/context-pack.js +331 -0
  457. package/dist/repertoire/coding/feedback.js +146 -34
  458. package/dist/repertoire/coding/index.js +15 -3
  459. package/dist/repertoire/coding/manager.js +159 -10
  460. package/dist/repertoire/coding/spawner.js +40 -11
  461. package/dist/repertoire/coding/tools.js +182 -18
  462. package/dist/repertoire/coding/workbench-client.js +272 -0
  463. package/dist/repertoire/coding/workbench-manager.js +346 -0
  464. package/dist/repertoire/commerce-errors.js +109 -0
  465. package/dist/repertoire/commerce-self-test.js +156 -0
  466. package/dist/repertoire/credential-access.js +183 -0
  467. package/dist/repertoire/desk/classifier.js +362 -0
  468. package/dist/repertoire/duffel-client.js +185 -0
  469. package/dist/repertoire/github-client.js +14 -55
  470. package/dist/repertoire/graph-client.js +11 -52
  471. package/dist/repertoire/guardrails.js +1480 -22
  472. package/dist/repertoire/house-sweep.js +471 -0
  473. package/dist/repertoire/mcp-client.js +58 -5
  474. package/dist/repertoire/mcp-manager.js +427 -139
  475. package/dist/repertoire/mcp-tools.js +132 -0
  476. package/dist/repertoire/mcp-write-guard.js +46 -0
  477. package/dist/repertoire/plugin-mcp.js +175 -0
  478. package/dist/repertoire/plugins.js +253 -0
  479. package/dist/repertoire/relationship-authorization.js +322 -0
  480. package/dist/repertoire/sanctuary-container-policy.js +50 -0
  481. package/dist/repertoire/shell-sessions.js +134 -0
  482. package/dist/repertoire/skills.js +48 -4
  483. package/dist/repertoire/stripe-client.js +131 -0
  484. package/dist/repertoire/tool-arguments.js +182 -0
  485. package/dist/repertoire/tool-results.js +29 -0
  486. package/dist/repertoire/tools-a2a.js +742 -0
  487. package/dist/repertoire/tools-attachments.js +322 -0
  488. package/dist/repertoire/tools-awaiting.js +897 -0
  489. package/dist/repertoire/tools-base.js +83 -1168
  490. package/dist/repertoire/tools-bluebubbles.js +2 -0
  491. package/dist/repertoire/tools-bridge.js +144 -0
  492. package/dist/repertoire/tools-bundle.js +917 -0
  493. package/dist/repertoire/tools-commerce.js +253 -0
  494. package/dist/repertoire/tools-config.js +186 -0
  495. package/dist/repertoire/tools-continuity.js +588 -0
  496. package/dist/repertoire/tools-credential.js +383 -0
  497. package/dist/repertoire/tools-escalation.js +84 -0
  498. package/dist/repertoire/tools-evolution.js +527 -0
  499. package/dist/repertoire/tools-files.js +362 -0
  500. package/dist/repertoire/tools-flight.js +290 -0
  501. package/dist/repertoire/tools-flow.js +119 -0
  502. package/dist/repertoire/tools-friend-link.js +57 -0
  503. package/dist/repertoire/tools-github.js +3 -8
  504. package/dist/repertoire/tools-habits.js +103 -0
  505. package/dist/repertoire/tools-house-care.js +174 -0
  506. package/dist/repertoire/tools-mail.js +1828 -0
  507. package/dist/repertoire/tools-notes.js +501 -0
  508. package/dist/repertoire/tools-obligations.js +182 -0
  509. package/dist/repertoire/tools-orientation.js +31 -0
  510. package/dist/repertoire/tools-record.js +482 -0
  511. package/dist/repertoire/tools-rsvp.js +139 -0
  512. package/dist/repertoire/tools-runtime.js +238 -0
  513. package/dist/repertoire/tools-sanctuary-host.js +202 -0
  514. package/dist/repertoire/tools-session.js +1141 -0
  515. package/dist/repertoire/tools-shell.js +154 -0
  516. package/dist/repertoire/tools-shepherd-guidance.js +171 -0
  517. package/dist/repertoire/tools-shepherd.js +325 -0
  518. package/dist/repertoire/tools-steward-policy.js +147 -0
  519. package/dist/repertoire/tools-stripe.js +224 -0
  520. package/dist/repertoire/tools-surface.js +369 -0
  521. package/dist/repertoire/tools-teams.js +50 -39
  522. package/dist/repertoire/tools-telegram-contacts.js +37 -0
  523. package/dist/repertoire/tools-travel.js +125 -0
  524. package/dist/repertoire/tools-trip.js +982 -0
  525. package/dist/repertoire/tools-unraid.js +556 -0
  526. package/dist/repertoire/tools-user-profile.js +146 -0
  527. package/dist/repertoire/tools-vault.js +40 -0
  528. package/dist/repertoire/tools-voice-local.js +198 -0
  529. package/dist/repertoire/tools-voice.js +145 -0
  530. package/dist/repertoire/tools.js +523 -156
  531. package/dist/repertoire/travel-api-client.js +360 -0
  532. package/dist/repertoire/unraid-client.js +155 -0
  533. package/dist/repertoire/unraid-restart.js +339 -0
  534. package/dist/repertoire/user-profile.js +131 -0
  535. package/dist/repertoire/vault-setup.js +246 -0
  536. package/dist/repertoire/vault-unlock.js +686 -0
  537. package/dist/rsvp/aisleplanner-client.js +354 -0
  538. package/dist/rsvp/cli.js +936 -0
  539. package/dist/rsvp/config.js +327 -0
  540. package/dist/rsvp/cutover.js +453 -0
  541. package/dist/rsvp/diagnostics.js +232 -0
  542. package/dist/rsvp/diff-renderer.js +176 -0
  543. package/dist/rsvp/habit-policy.js +110 -0
  544. package/dist/rsvp/habit-stage.js +123 -0
  545. package/dist/rsvp/incident-bundle.js +97 -0
  546. package/dist/rsvp/migration.js +204 -0
  547. package/dist/rsvp/native-habit-runner.js +630 -0
  548. package/dist/rsvp/outbound-state.js +628 -0
  549. package/dist/rsvp/query.js +118 -0
  550. package/dist/rsvp/replay.js +233 -0
  551. package/dist/rsvp/snapshot.js +232 -0
  552. package/dist/rsvp/spend-ledger.js +175 -0
  553. package/dist/scripts/claude-code-hook.js +41 -0
  554. package/dist/scripts/claude-code-stop-hook.js +47 -0
  555. package/dist/senses/a2a-entry.js +140 -0
  556. package/dist/senses/acp-server.js +386 -0
  557. package/dist/senses/attention-queue.js +186 -0
  558. package/dist/senses/await-turn-message.js +65 -0
  559. package/dist/senses/bluebubbles/active-turns.js +216 -0
  560. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  561. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  562. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +393 -43
  563. package/dist/senses/bluebubbles/context-packet.js +207 -0
  564. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  565. package/dist/senses/bluebubbles/entry.js +90 -0
  566. package/dist/senses/bluebubbles/host-account-verifier.js +88 -0
  567. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
  568. package/dist/senses/bluebubbles/index.js +4054 -0
  569. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  570. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  571. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
  572. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
  573. package/dist/senses/bluebubbles/outbound-state.js +335 -0
  574. package/dist/senses/bluebubbles/processed-log.js +133 -0
  575. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  576. package/dist/senses/bluebubbles/replay.js +284 -0
  577. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  578. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  579. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  580. package/dist/senses/bluebubbles/webhook-registration.js +257 -0
  581. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  582. package/dist/senses/cli/bracketed-paste.js +82 -0
  583. package/dist/senses/cli/image-paste.js +287 -0
  584. package/dist/senses/cli/image-ref-navigation.js +75 -0
  585. package/dist/senses/cli/ink-app.js +156 -0
  586. package/dist/senses/cli/inline-diff.js +64 -0
  587. package/dist/senses/cli/input-keys.js +174 -0
  588. package/dist/senses/cli/kill-ring.js +86 -0
  589. package/dist/senses/cli/message-list.js +51 -0
  590. package/dist/senses/cli/ouro-tui.js +607 -0
  591. package/dist/senses/cli/spinner-imperative.js +135 -0
  592. package/dist/senses/cli/spinner.js +101 -0
  593. package/dist/senses/cli/status-line.js +60 -0
  594. package/dist/senses/cli/streaming-markdown.js +526 -0
  595. package/dist/senses/cli/tool-display.js +85 -0
  596. package/dist/senses/cli/tool-render.js +85 -0
  597. package/dist/senses/cli/tui-store.js +241 -0
  598. package/dist/senses/cli/virtual-list.js +35 -0
  599. package/dist/senses/cli-entry.js +60 -8
  600. package/dist/senses/cli.js +570 -309
  601. package/dist/senses/commands.js +66 -3
  602. package/dist/senses/context-packet-ledger.js +371 -0
  603. package/dist/senses/context-packets.js +154 -0
  604. package/dist/senses/habit-lifecycle-guard.js +24 -0
  605. package/dist/senses/habit-turn-message.js +160 -0
  606. package/dist/senses/ingress-evidence.js +2 -0
  607. package/dist/senses/mail-entry.js +66 -0
  608. package/dist/senses/mail.js +524 -0
  609. package/dist/senses/pipeline.js +1192 -204
  610. package/dist/senses/private-runtime-worker.js +857 -0
  611. package/dist/senses/private-runtime.js +1622 -0
  612. package/dist/senses/proactive-content-guard.js +51 -0
  613. package/dist/senses/root-host-approval-port.js +345 -0
  614. package/dist/senses/root-host-approval-runtime.js +393 -0
  615. package/dist/senses/sanctuary-authority-resident.js +102 -0
  616. package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
  617. package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
  618. package/dist/senses/sanctuary-grounding.js +118 -0
  619. package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
  620. package/dist/senses/sanctuary-health-acceptance-probe.js +786 -0
  621. package/dist/senses/sanctuary-health-runner.js +106 -0
  622. package/dist/senses/sanctuary-health.js +442 -0
  623. package/dist/senses/sanctuary-house.js +97 -0
  624. package/dist/senses/sanctuary-install-state-contract.js +169 -0
  625. package/dist/senses/sanctuary-interactive-control.js +410 -0
  626. package/dist/senses/sanctuary-media-catalog-contract.js +268 -0
  627. package/dist/senses/sanctuary-media-optimization.js +517 -0
  628. package/dist/senses/sanctuary-runtime.js +390 -0
  629. package/dist/senses/sanctuary-sab.js +85 -0
  630. package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
  631. package/dist/senses/shared-turn.js +832 -0
  632. package/dist/senses/shepherd/agent-presentation.js +88 -0
  633. package/dist/senses/shepherd/attention-page.js +166 -0
  634. package/dist/senses/shepherd/attention-sidebar.js +76 -0
  635. package/dist/senses/shepherd/attention.js +295 -0
  636. package/dist/senses/shepherd/checkin-config.js +76 -0
  637. package/dist/senses/shepherd/checkin-store.js +386 -0
  638. package/dist/senses/shepherd/client.js +196 -0
  639. package/dist/senses/shepherd/cmux.js +483 -0
  640. package/dist/senses/shepherd/composer.js +336 -0
  641. package/dist/senses/shepherd/copilot-app.js +648 -0
  642. package/dist/senses/shepherd/feedback-reply.js +108 -0
  643. package/dist/senses/shepherd/feedback-source.js +20 -0
  644. package/dist/senses/shepherd/feedback-store.js +331 -0
  645. package/dist/senses/shepherd/feedback-submit.js +182 -0
  646. package/dist/senses/shepherd/feedback-worker.js +208 -0
  647. package/dist/senses/shepherd/guidance.js +273 -0
  648. package/dist/senses/shepherd/herdr.js +427 -0
  649. package/dist/senses/shepherd/host.js +17 -0
  650. package/dist/senses/shepherd/human-decision-guard.js +29 -0
  651. package/dist/senses/shepherd/judge-evaluation-command.js +183 -0
  652. package/dist/senses/shepherd/judge-evaluation-entry.js +13 -0
  653. package/dist/senses/shepherd/judge-evaluation.js +155 -0
  654. package/dist/senses/shepherd/judge.js +210 -0
  655. package/dist/senses/shepherd/notice-outbox.js +262 -0
  656. package/dist/senses/shepherd/observation-publisher.js +320 -0
  657. package/dist/senses/shepherd/operations-defaults.js +86 -0
  658. package/dist/senses/shepherd/operations.js +159 -0
  659. package/dist/senses/shepherd/owner-notice.js +489 -0
  660. package/dist/senses/shepherd/prompt-state.js +60 -0
  661. package/dist/senses/shepherd/recovery.js +543 -0
  662. package/dist/senses/shepherd/redact.js +66 -0
  663. package/dist/senses/shepherd/returns.js +79 -0
  664. package/dist/senses/shepherd/sense.js +849 -0
  665. package/dist/senses/shepherd/shepherd-judge-corpus-v1.json +170 -0
  666. package/dist/senses/shepherd/surface.js +123 -0
  667. package/dist/senses/shepherd/target-binding.js +13 -0
  668. package/dist/senses/shepherd/terminal-process.js +147 -0
  669. package/dist/senses/shepherd-entry.js +98 -0
  670. package/dist/senses/surface-tool.js +109 -0
  671. package/dist/senses/teams-entry.js +68 -8
  672. package/dist/senses/teams-image.js +119 -0
  673. package/dist/senses/teams.js +998 -337
  674. package/dist/senses/telegram-admission.js +718 -0
  675. package/dist/senses/telegram-approval-runtime.js +793 -0
  676. package/dist/senses/telegram-attachments.js +186 -0
  677. package/dist/senses/telegram-audit-ledger.js +220 -0
  678. package/dist/senses/telegram-authority-transport.js +231 -0
  679. package/dist/senses/telegram-client.js +1755 -0
  680. package/dist/senses/telegram-effect-adapter.js +904 -0
  681. package/dist/senses/telegram-entry.js +83 -0
  682. package/dist/senses/telegram-handoff.js +154 -0
  683. package/dist/senses/telegram.js +2474 -0
  684. package/dist/senses/trust-gate.js +104 -9
  685. package/dist/senses/voice/audio-playback.js +237 -0
  686. package/dist/senses/voice/audio-routing.js +119 -0
  687. package/dist/senses/voice/call-auth.js +250 -0
  688. package/dist/senses/voice/elevenlabs.js +202 -0
  689. package/dist/senses/voice/floor-control.js +431 -0
  690. package/dist/senses/voice/floor-controller.js +115 -0
  691. package/dist/senses/voice/golden-path.js +116 -0
  692. package/dist/senses/voice/index.js +29 -0
  693. package/dist/senses/voice/local-audio-control.js +344 -0
  694. package/dist/senses/voice/local-audio-devices.js +516 -0
  695. package/dist/senses/voice/local-audio-disclosure.js +174 -0
  696. package/dist/senses/voice/local-audio-identity.js +103 -0
  697. package/dist/senses/voice/local-audio-join.js +325 -0
  698. package/dist/senses/voice/local-audio-mute.js +199 -0
  699. package/dist/senses/voice/local-audio-notify.js +124 -0
  700. package/dist/senses/voice/local-audio-prompts.js +116 -0
  701. package/dist/senses/voice/local-audio-transport.js +427 -0
  702. package/dist/senses/voice/local-audio.js +281 -0
  703. package/dist/senses/voice/local-media-stream.js +145 -0
  704. package/dist/senses/voice/meeting.js +113 -0
  705. package/dist/senses/voice/outbound.js +190 -0
  706. package/dist/senses/voice/phone.js +33 -0
  707. package/dist/senses/voice/playback.js +139 -0
  708. package/dist/senses/voice/process-guards.js +51 -0
  709. package/dist/senses/voice/realtime-eval.js +496 -0
  710. package/dist/senses/voice/realtime-tool-schema.js +195 -0
  711. package/dist/senses/voice/realtime-trace.js +531 -0
  712. package/dist/senses/voice/transcript.js +70 -0
  713. package/dist/senses/voice/turn.js +191 -0
  714. package/dist/senses/voice/twilio-phone-runtime.js +836 -0
  715. package/dist/senses/voice/twilio-phone.js +5454 -0
  716. package/dist/senses/voice/types.js +2 -0
  717. package/dist/senses/voice/whisper.js +161 -0
  718. package/dist/senses/voice-entry.js +83 -0
  719. package/dist/senses/voice-realtime-eval-command.js +99 -0
  720. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  721. package/dist/senses/voice-twilio-entry.js +87 -0
  722. package/dist/trips/core.js +138 -0
  723. package/dist/trips/store.js +265 -0
  724. package/dist/util/frontmatter.js +69 -0
  725. package/npm-shrinkwrap.json +8342 -0
  726. package/package.json +76 -13
  727. package/skills/agent-commerce.md +113 -0
  728. package/skills/browser-navigation.md +117 -0
  729. package/skills/commerce-setup-guide.md +116 -0
  730. package/skills/commerce-setup.md +84 -0
  731. package/skills/configure-dev-tools.md +99 -0
  732. package/skills/travel-planning.md +138 -0
  733. package/dist/heart/daemon/auth-flow.js +0 -430
  734. package/dist/heart/daemon/ouro-path-installer.js +0 -260
  735. package/dist/heart/daemon/ouro-version-manager.js +0 -171
  736. package/dist/heart/daemon/update-hooks.js +0 -138
  737. package/dist/heart/obligations.js +0 -191
  738. package/dist/heart/safe-workspace.js +0 -381
  739. package/dist/heart/session-recall.js +0 -116
  740. package/dist/mind/friends/channel.js +0 -84
  741. package/dist/mind/friends/group-context.js +0 -144
  742. package/dist/mind/friends/resolver.js +0 -84
  743. package/dist/mind/friends/store-file.js +0 -190
  744. package/dist/mind/friends/store.js +0 -4
  745. package/dist/mind/friends/tokens.js +0 -26
  746. package/dist/mind/friends/trust-explanation.js +0 -74
  747. package/dist/mind/friends/types.js +0 -29
  748. package/dist/repertoire/tasks/board.js +0 -134
  749. package/dist/repertoire/tasks/index.js +0 -224
  750. package/dist/repertoire/tasks/lifecycle.js +0 -80
  751. package/dist/repertoire/tasks/middleware.js +0 -65
  752. package/dist/repertoire/tasks/parser.js +0 -173
  753. package/dist/repertoire/tasks/scanner.js +0 -132
  754. package/dist/repertoire/tasks/transitions.js +0 -144
  755. package/dist/senses/bluebubbles-entry.js +0 -13
  756. package/dist/senses/bluebubbles.js +0 -1181
  757. package/dist/senses/debug-activity.js +0 -154
  758. package/dist/senses/inner-dialog-worker.js +0 -90
  759. package/dist/senses/inner-dialog.js +0 -525
  760. package/subagents/README.md +0 -7
  761. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  762. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  763. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  764. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  765. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  766. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  767. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  768. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  769. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  770. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  771. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  772. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  773. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  774. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  775. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  776. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  777. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,832 @@
1
+ "use strict";
2
+ // Shared turn runner for non-interactive senses (MCP, future senses).
3
+ // Follows the CLI pattern: resolves context, constructs InboundTurnInput,
4
+ // calls handleInboundTurn, collects response text, detects ponder deferral.
5
+ //
6
+ // Does NOT refactor CLI — CLI is stable with 2280+ tests. This is a new
7
+ // code path for new senses that follows the same pipeline pattern.
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.stripThinkBlocks = stripThinkBlocks;
43
+ exports.extractOutwardSenseDeliveryText = extractOutwardSenseDeliveryText;
44
+ exports.getSenseSessionPath = getSenseSessionPath;
45
+ exports.erroredTurnReply = erroredTurnReply;
46
+ exports.runSenseTurn = runSenseTurn;
47
+ const os = __importStar(require("os"));
48
+ const path = __importStar(require("path"));
49
+ const fs = __importStar(require("fs"));
50
+ const delegated_command_1 = require("../a2a/delegated-command");
51
+ const core_1 = require("../heart/core");
52
+ const identity_1 = require("../heart/identity");
53
+ const config_1 = require("../heart/config");
54
+ const session_events_1 = require("../heart/session-events");
55
+ const context_1 = require("../mind/context");
56
+ const prompt_1 = require("../mind/prompt");
57
+ const friends_1 = require("@ouro.bot/friends");
58
+ const pending_1 = require("../mind/pending");
59
+ const context_2 = require("../mind/context");
60
+ const trust_gate_1 = require("./trust-gate");
61
+ const pipeline_1 = require("./pipeline");
62
+ const mcp_manager_1 = require("../repertoire/mcp-manager");
63
+ const runtime_1 = require("../nerves/runtime");
64
+ const session_transaction_1 = require("../mind/session-transaction");
65
+ const orientation_frame_1 = require("../heart/orientation-frame");
66
+ const turn_execution_lease_1 = require("../heart/turn-execution-lease");
67
+ const RESPONSE_CAP = 50_000;
68
+ const OUTWARD_DELIVERY_TOOL_ACKS = new Map([
69
+ ["settle", "(delivered)"],
70
+ ["speak", "(spoken)"],
71
+ ]);
72
+ async function releaseRuntimeMcpServersAfterTurn(owner) {
73
+ const manager = await Promise.resolve().then(() => __importStar(require("../repertoire/mcp-manager")));
74
+ await manager.releaseRuntimeMcpServers(owner);
75
+ }
76
+ /**
77
+ * Strip MiniMax-style `<think>...</think>` reasoning blocks from a response
78
+ * string. Handles unclosed open tags (treats everything from `<think>` to
79
+ * end of string as reasoning) and multiple blocks in sequence. Returns the
80
+ * trimmed remainder.
81
+ */
82
+ function stripThinkBlocks(input) {
83
+ let out = input;
84
+ // Closed blocks first (greedy match removed by repeatedly slicing the leftmost pair).
85
+ for (;;) {
86
+ const open = out.indexOf("<think>");
87
+ if (open === -1)
88
+ break;
89
+ const close = out.indexOf("</think>", open + "<think>".length);
90
+ if (close === -1) {
91
+ // Unclosed — drop everything from <think> onward.
92
+ out = out.slice(0, open);
93
+ break;
94
+ }
95
+ out = out.slice(0, open) + out.slice(close + "</think>".length);
96
+ }
97
+ return out.trim();
98
+ }
99
+ function assistantContentText(content) {
100
+ if (typeof content !== "string")
101
+ return null;
102
+ const trimmed = content.trim();
103
+ return trimmed ? trimmed : null;
104
+ }
105
+ function parseToolStringArg(toolCall, toolName, argName) {
106
+ if (!toolCall || typeof toolCall !== "object")
107
+ return null;
108
+ const fn = toolCall.function;
109
+ if (fn?.name !== toolName || typeof fn.arguments !== "string")
110
+ return null;
111
+ try {
112
+ const parsed = JSON.parse(fn.arguments);
113
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
114
+ return null;
115
+ const value = parsed[argName];
116
+ if (typeof value !== "string")
117
+ return null;
118
+ const trimmed = value.trim();
119
+ return trimmed ? trimmed : null;
120
+ }
121
+ catch {
122
+ return null;
123
+ }
124
+ }
125
+ function hasDeliveredToolResult(messages, assistantIndex, toolCallId, toolName) {
126
+ if (typeof toolCallId !== "string" || !toolCallId.trim())
127
+ return false;
128
+ const expectedAck = OUTWARD_DELIVERY_TOOL_ACKS.get(toolName);
129
+ for (let index = assistantIndex + 1; index < messages.length; index++) {
130
+ const message = messages[index];
131
+ if (message.role !== "tool")
132
+ return false;
133
+ if (message.tool_call_id === toolCallId
134
+ && typeof message.content === "string"
135
+ && message.content.trim() === expectedAck) {
136
+ return true;
137
+ }
138
+ }
139
+ return false;
140
+ }
141
+ function outwardDeliveryTextFromAssistantTools(messages, assistantIndex) {
142
+ const assistant = messages[assistantIndex];
143
+ const toolCalls = assistant.tool_calls;
144
+ const delivered = [];
145
+ for (let index = 0; index < toolCalls.length; index++) {
146
+ const toolCall = toolCalls[index];
147
+ const toolCallId = toolCall && typeof toolCall === "object"
148
+ ? toolCall.id
149
+ : undefined;
150
+ const settleAnswer = parseToolStringArg(toolCall, "settle", "answer");
151
+ if (settleAnswer && hasDeliveredToolResult(messages, assistantIndex, toolCallId, "settle")) {
152
+ delivered.push(settleAnswer);
153
+ continue;
154
+ }
155
+ const spokenMessage = parseToolStringArg(toolCall, "speak", "message");
156
+ if (spokenMessage && hasDeliveredToolResult(messages, assistantIndex, toolCallId, "speak")) {
157
+ delivered.push(spokenMessage);
158
+ }
159
+ }
160
+ return delivered.length > 0 ? delivered.join("\n") : null;
161
+ }
162
+ /**
163
+ * Recover the text that actually reached a friend in an outward sense turn.
164
+ *
165
+ * Ouro runs outward channels in tool-required mode. That means the visible
166
+ * response may be a `settle({ answer })` or `speak({ message })` tool call
167
+ * whose assistant message has `content: null`. The authoritative delivery
168
+ * signal is the following tool ack:
169
+ *
170
+ * - `(delivered)` for `settle.answer`
171
+ * - `(spoken)` for `speak.message`
172
+ *
173
+ * Private-runtime `(settled)`, malformed tool arguments, rejected tools, and
174
+ * interrupted tool-call sequences are not outward speech. Sense transports
175
+ * that need to replay the turn later (Voice/Twilio TTS, future meeting audio)
176
+ * should use this helper instead of reading `assistant.content` directly.
177
+ */
178
+ function extractOutwardSenseDeliveryText(messages) {
179
+ const assistantIndex = messages.findLastIndex((message) => message.role === "assistant");
180
+ if (assistantIndex < 0)
181
+ return null;
182
+ const assistant = messages[assistantIndex];
183
+ return Array.isArray(assistant.tool_calls) && assistant.tool_calls.length > 0
184
+ ? outwardDeliveryTextFromAssistantTools(messages, assistantIndex)
185
+ : assistantContentText(assistant.content);
186
+ }
187
+ function hasAcceptedOutwardSessionAck(events, assistantIndex, toolCallId, toolName) {
188
+ if (typeof toolCallId !== "string" || !toolCallId.trim())
189
+ return false;
190
+ const expectedAck = OUTWARD_DELIVERY_TOOL_ACKS.get(toolName);
191
+ for (let index = assistantIndex + 1; index < events.length; index++) {
192
+ const candidate = events[index];
193
+ if (candidate.role !== "tool")
194
+ return false;
195
+ if (candidate.toolCallId !== toolCallId && candidate.relations?.toolCallId !== toolCallId)
196
+ continue;
197
+ return candidate.toolCallId === toolCallId
198
+ && candidate.relations?.toolCallId === toolCallId
199
+ && candidate.provenance?.captureKind === "live"
200
+ && Array.isArray(candidate.toolCalls)
201
+ && candidate.toolCalls.length === 0
202
+ && typeof candidate.content === "string"
203
+ && candidate.content === expectedAck;
204
+ }
205
+ return false;
206
+ }
207
+ function newOutwardCoordinates(events, existingEventIds, boundaryIndex) {
208
+ return events.flatMap((event, eventIndex) => {
209
+ if (eventIndex <= boundaryIndex || existingEventIds.has(event.id) || event.role !== "assistant" || event.provenance?.captureKind !== "live" || !Array.isArray(event.toolCalls))
210
+ return [];
211
+ const outwardTools = event.toolCalls.flatMap((call) => {
212
+ const toolName = call?.function?.name;
213
+ if (toolName !== "speak" && toolName !== "settle")
214
+ return [];
215
+ if (!hasAcceptedOutwardSessionAck(events, eventIndex, call.id, toolName))
216
+ return [];
217
+ const text = stripThinkBlocks(parseToolStringArg(call, toolName, toolName === "speak" ? "message" : "answer") ?? "");
218
+ return text ? [{ kind: toolName, eventId: event.id, eventIndex, text }] : [];
219
+ });
220
+ if (outwardTools.length > 0)
221
+ return outwardTools;
222
+ if (event.toolCalls.length > 0)
223
+ return [];
224
+ const text = stripThinkBlocks(typeof event.content === "string" ? event.content : "");
225
+ return text ? [{ kind: "text", eventId: event.id, eventIndex, text }] : [];
226
+ });
227
+ }
228
+ function alignedDeliveryCoordinates(view, attempts, finalAttemptIndex, finalCoordinate) {
229
+ if (!view)
230
+ return attempts.flatMap((attempt) => attempt.delivered ? [null] : []);
231
+ const terminalCoordinate = finalCoordinate ?? (finalAttemptIndex === undefined ? view.terminal : undefined);
232
+ const reservedAttemptIndex = terminalCoordinate
233
+ ? finalAttemptIndex !== undefined
234
+ ? (attempts[finalAttemptIndex]?.delivered && attempts[finalAttemptIndex]?.kind === terminalCoordinate.kind && attempts[finalAttemptIndex]?.text === terminalCoordinate.text ? finalAttemptIndex : -1)
235
+ : attempts.findLastIndex((attempt) => attempt.delivered && attempt.kind === terminalCoordinate.kind && attempt.text === terminalCoordinate.text)
236
+ : -1;
237
+ const availableCoordinates = terminalCoordinate ? view.coordinates.filter((coordinate) => coordinate !== terminalCoordinate) : view.coordinates;
238
+ let nextCoordinate = 0;
239
+ return attempts.flatMap((attempt, attemptIndex) => {
240
+ if (!attempt.delivered)
241
+ return [];
242
+ if (attemptIndex === finalAttemptIndex)
243
+ return finalCoordinate && finalCoordinate.kind === attempt.kind && finalCoordinate.text === attempt.text ? [finalCoordinate] : [null];
244
+ if (attemptIndex === reservedAttemptIndex && terminalCoordinate)
245
+ return [terminalCoordinate];
246
+ const coordinateIndex = availableCoordinates.findIndex((coordinate, index) => index >= nextCoordinate && coordinate.kind === attempt.kind && coordinate.text === attempt.text);
247
+ if (coordinateIndex < 0)
248
+ return [null];
249
+ nextCoordinate = coordinateIndex + 1;
250
+ return [availableCoordinates[coordinateIndex]];
251
+ });
252
+ }
253
+ function causalSessionEventIds(view, attempts, finalAttemptIndex, finalCoordinate) {
254
+ return alignedDeliveryCoordinates(view, attempts, finalAttemptIndex, finalCoordinate).map((coordinate) => coordinate?.eventId ?? null);
255
+ }
256
+ function currentIngressEventId(events, existingEventIds, userMessage, precommittedIngress, ingressRelations) {
257
+ const reference = ingressRelations?.references[0];
258
+ const carriesReference = (event, expected) => Array.isArray(event.relations?.references) && event.relations.references.includes(expected);
259
+ const matches = (0, session_events_1.selectEffectiveSessionEvents)(events).filter((event) => (event.role === "user"
260
+ && event.content === userMessage
261
+ && event.provenance?.captureKind === "live"
262
+ && (precommittedIngress
263
+ ? ((event.id === precommittedIngress.eventId && carriesReference(event, precommittedIngress.reference))
264
+ || (!existingEventIds.has(event.id) && carriesReference(event, precommittedIngress.reference)))
265
+ : !existingEventIds.has(event.id) && (!reference || carriesReference(event, reference)))));
266
+ return matches.length === 1 ? matches[0].id : undefined;
267
+ }
268
+ function rawSessionEvents(value) {
269
+ if (!value || typeof value !== "object" || Array.isArray(value))
270
+ return [];
271
+ const record = value;
272
+ return record.version === 2 && Array.isArray(record.events) ? record.events : [];
273
+ }
274
+ // What the agent said in a replied-to message: the settle answer it delivered, else its text.
275
+ // Only the agent's own messages are quoted; a control card or notice is not something it asked.
276
+ function spokenText(event) {
277
+ if (event?.role !== "assistant")
278
+ return "";
279
+ for (const call of event.toolCalls) {
280
+ if (call.function.name !== "settle")
281
+ continue;
282
+ try {
283
+ const answer = JSON.parse(call.function.arguments).answer;
284
+ if (typeof answer === "string" && answer.trim())
285
+ return answer.trim().slice(0, 1200);
286
+ }
287
+ catch { /* a malformed settle names nothing */ }
288
+ }
289
+ return typeof event.content === "string" ? event.content.trim().slice(0, 1200) : "";
290
+ }
291
+ function exactProjectedIngressMessage(existing, messages, eventId, nativeValue) {
292
+ if (!nativeValue || typeof nativeValue !== "object" || Array.isArray(nativeValue))
293
+ return null;
294
+ const native = nativeValue;
295
+ if (native.version !== 2 || !native.projection || typeof native.projection !== "object" || Array.isArray(native.projection))
296
+ return null;
297
+ const projection = native.projection;
298
+ if (!Array.isArray(projection.eventIds))
299
+ return null;
300
+ // Authorization must inspect stored IDs before a reader filters unresolved entries.
301
+ const projectionIds = projection.eventIds.length > 0
302
+ ? projection.eventIds
303
+ : projection.trimmed === true ? [] : existing.projectionEventIds;
304
+ const eventsById = new Map(existing.events.map((event) => [event.id, event]));
305
+ if (eventsById.size !== existing.events.length)
306
+ return null;
307
+ const seenProjectionIds = new Set();
308
+ const effectiveIds = new Set((0, session_events_1.selectEffectiveSessionEvents)(existing.events).map((event) => event.id));
309
+ const projectedEvents = [];
310
+ for (const projectedId of projectionIds) {
311
+ if (typeof projectedId !== "string" || !projectedId.trim() || seenProjectionIds.has(projectedId))
312
+ return null;
313
+ const event = eventsById.get(projectedId);
314
+ if (!event)
315
+ return null;
316
+ seenProjectionIds.add(projectedId);
317
+ if (effectiveIds.has(event.id))
318
+ projectedEvents.push(event);
319
+ }
320
+ if (projectionIds.filter((projectedId) => projectedId === eventId).length !== 1)
321
+ return null;
322
+ const projectedUsers = projectedEvents.filter((event) => event.role === "user");
323
+ const providerUsers = messages.filter((message) => message.role === "user");
324
+ if (projectedUsers.at(-1)?.id !== eventId || projectedUsers.length !== providerUsers.length)
325
+ return null;
326
+ return providerUsers.at(-1);
327
+ }
328
+ function currentTurnEventView(events, existingEventIds, userMessage, precommittedIngress, ingressRelations) {
329
+ const eventIds = new Set();
330
+ let previousSequence = 0;
331
+ for (const event of events) {
332
+ if (!event || typeof event !== "object" || typeof event.id !== "string" || !event.id.trim() || eventIds.has(event.id) || !Number.isSafeInteger(event.sequence) || event.sequence <= previousSequence)
333
+ return null;
334
+ eventIds.add(event.id);
335
+ previousSequence = event.sequence;
336
+ }
337
+ const ingressEventId = currentIngressEventId(events, existingEventIds, userMessage, precommittedIngress, ingressRelations);
338
+ if (!ingressEventId)
339
+ return null;
340
+ const ingressIndex = events.findIndex((event) => event.id === ingressEventId);
341
+ if (events.some((event, eventIndex) => eventIndex > ingressIndex && existingEventIds.has(event.id)))
342
+ return null;
343
+ const coordinates = newOutwardCoordinates(events, existingEventIds, ingressIndex);
344
+ const newestAssistantIndex = events.findLastIndex((event, eventIndex) => eventIndex > ingressIndex && event.role === "assistant");
345
+ const terminal = coordinates.findLast((coordinate) => coordinate.eventIndex === newestAssistantIndex);
346
+ return { coordinates, ...(terminal ? { terminal } : {}) };
347
+ }
348
+ function getSenseSessionPath(agentName, friendId, channel, sessionKey, agentRootOverride) {
349
+ return path.join(agentRootOverride ?? (0, identity_1.getAgentRoot)(agentName), "state", "sessions", friendId, channel, `${(0, config_1.sanitizeKey)(sessionKey)}.json`);
350
+ }
351
+ /**
352
+ * Run a single agent turn through the inbound pipeline.
353
+ * Caller provides channel, session key, friend, and message;
354
+ * this function handles all pipeline wiring.
355
+ */
356
+ /**
357
+ * What an outward sense says when a turn errors and provider failover has nothing to say.
358
+ * Such turns used to end in silence: the owner saw no reply, prodded, and later got
359
+ * the late answer followed by a greeting to a prod (D-004); the step-limit stop was the
360
+ * observed cause (D-007). The engine still refuses to answer without evidence.
361
+ */
362
+ function erroredTurnReply(errorMessage) {
363
+ return /iteration limit exhausted/u.test(errorMessage ?? "")
364
+ ? "I hit my step limit in the middle of that job and couldn't finish it. Tell me to continue and I'll pick up from where I stopped."
365
+ : "I couldn't finish that one: something went wrong before I had an answer. Ask me again and I'll retry.";
366
+ }
367
+ async function runSenseTurn(options) {
368
+ options = { ...options, ...(options.shepherdSession ? { shepherdSession: Object.freeze({ ...options.shepherdSession }) } : {}) };
369
+ return (0, turn_execution_lease_1.withTurnExecutionLease)(async () => {
370
+ const owner = Object.freeze({ agentName: options.agentName, agentRoot: (0, identity_1.getAgentRoot)(options.agentName) });
371
+ (0, identity_1.setAgentName)(owner.agentName);
372
+ try {
373
+ return await runSenseTurnExclusive(options, owner);
374
+ }
375
+ finally {
376
+ if (options.runtimeMcpServers && !options.disableTools) {
377
+ await releaseRuntimeMcpServersAfterTurn(owner);
378
+ }
379
+ }
380
+ });
381
+ }
382
+ async function runSenseTurnExclusive(options, owner) {
383
+ const { channel, sessionKey, friendId } = options;
384
+ const { agentName, agentRoot } = owner;
385
+ // Only the A2A server writes the delegated-command banner, in front of a command it admitted (its body is shielded there). On every
386
+ // other turn, on any channel, a typed banner is marked as the sender's own words. A precommitted ingress is already stored verbatim.
387
+ const userMessage = options.precommittedIngress || options.toolContext?.delegatedCommand ? options.userMessage : (0, delegated_command_1.shieldDelegatedBanner)(options.userMessage);
388
+ (0, runtime_1.emitNervesEvent)({
389
+ component: "senses",
390
+ event: "senses.shared_turn_start",
391
+ message: "shared turn runner starting",
392
+ meta: { agentName, channel, sessionKey, friendId },
393
+ });
394
+ // Resolve context
395
+ const friendsPath = path.join(agentRoot, "friends");
396
+ const friendStore = new friends_1.FileFriendStore(friendsPath);
397
+ const capabilities = (0, friends_1.getChannelCapabilities)(channel);
398
+ // If friendId looks like a UUID, look up the friend record directly and use its identity.
399
+ // Otherwise, resolve as a local user (same pattern as CLI sense).
400
+ const isUuid = /^[0-9a-f]{8}-[0-9a-f]{4}-/.test(friendId);
401
+ let resolverParams;
402
+ if (options.identity) {
403
+ resolverParams = {
404
+ provider: options.identity.provider,
405
+ externalId: options.identity.externalId,
406
+ displayName: options.identity.displayName,
407
+ channel,
408
+ ...(options.identity.tenantId ? { tenantId: options.identity.tenantId } : {}),
409
+ };
410
+ }
411
+ else if (isUuid) {
412
+ const existingFriend = await friendStore.get(friendId);
413
+ if (existingFriend) {
414
+ // Use the friend's first external ID for resolver context
415
+ const ext = existingFriend.externalIds?.[0];
416
+ resolverParams = {
417
+ provider: (ext?.provider ?? "local"),
418
+ externalId: ext?.externalId ?? friendId,
419
+ displayName: existingFriend.name ?? friendId,
420
+ channel,
421
+ };
422
+ }
423
+ else {
424
+ resolverParams = { provider: "local", externalId: friendId, displayName: friendId, channel };
425
+ }
426
+ }
427
+ else {
428
+ // Treat as local user identity (username@hostname pattern)
429
+ const username = os.userInfo().username;
430
+ resolverParams = { provider: "local", externalId: username, displayName: username, channel };
431
+ }
432
+ const resolver = new friends_1.FriendResolver(friendStore, resolverParams);
433
+ // Initialize MCP manager so MCP tools appear as first-class tools in the agent's tool list.
434
+ // Runtime MCP servers (e.g. Workbench's ouro_workbench) are passed per-turn for THIS agent only.
435
+ const mcpManager = options.disableTools
436
+ ? undefined
437
+ : await (0, mcp_manager_1.getSharedMcpManager)({ ...owner, runtimeServers: options.runtimeMcpServers }) ?? undefined;
438
+ // Session path and loading
439
+ const ephemeralRoot = options.disablePersistence
440
+ ? fs.mkdtempSync(path.join(os.tmpdir(), "ouro-observe-only-"))
441
+ : null;
442
+ const sessionDir = ephemeralRoot ?? path.join(agentRoot, "state", "sessions", friendId, channel);
443
+ fs.mkdirSync(sessionDir, { recursive: true });
444
+ const sessPath = ephemeralRoot
445
+ ? path.join(ephemeralRoot, "session.json")
446
+ : getSenseSessionPath(agentName, friendId, channel, sessionKey, agentRoot);
447
+ const reportedSessionPath = ephemeralRoot ? undefined : sessPath;
448
+ const runWithLease = options._withSessionTurnLease ?? session_transaction_1.withSessionTurnLease;
449
+ try {
450
+ return await runWithLease(sessPath, async (sessionTurnLease) => {
451
+ const baseSession = (0, session_transaction_1.readSessionTransaction)(sessPath, sessionTurnLease);
452
+ const baseSessionRevision = baseSession.revision;
453
+ const existing = options.disablePersistence ? undefined : (0, context_1.loadSession)(sessPath);
454
+ const precommittedIngressEvent = options.precommittedIngress
455
+ ? existing?.events?.find((candidate) => candidate.id === options.precommittedIngress.eventId)
456
+ : undefined;
457
+ if (options.precommittedIngress) {
458
+ const latestUserEvent = (0, session_events_1.selectEffectiveSessionEvents)(existing?.events ?? []).filter((candidate) => candidate.role === "user").at(-1);
459
+ if (!precommittedIngressEvent || precommittedIngressEvent !== latestUserEvent || precommittedIngressEvent.role !== "user" || precommittedIngressEvent.content !== userMessage
460
+ || !precommittedIngressEvent.relations.references.includes(options.precommittedIngress.reference)) {
461
+ throw new Error("shared turn precommitted ingress is missing, mismatched, or no longer current");
462
+ }
463
+ }
464
+ const existingEventIds = new Set(existing?.events?.map((event) => event.id) ?? []);
465
+ const existingStructuredOutputIds = new Set(existing?.structuredOutputs?.map((output) => output.id) ?? []);
466
+ let sessionState = existing?.state;
467
+ let persistPromise;
468
+ const sessionMessages = existing?.messages && existing.messages.length > 0
469
+ ? existing.messages
470
+ : [{
471
+ role: "system",
472
+ content: (0, prompt_1.flattenSystemPrompt)(await (0, prompt_1.buildSystem)(channel, options.disableTools ? { tools: [], hardDisableTools: true } : {}, undefined)),
473
+ }];
474
+ if (options.shepherdSession) {
475
+ // Replace rather than accumulate context as the conversation reloads. It is bounded
476
+ // metadata, not a human instruction, and focus changes cannot alter its stable UUID.
477
+ const marker = "[Ouro Shepherd terminal context]";
478
+ const system = sessionMessages.find(message => message.role === "system");
479
+ if (system && typeof system.content === "string") {
480
+ system.content = system.content.split(`\n${marker}`)[0] + `\n${marker}\n${JSON.stringify(options.shepherdSession)}\nUse this exact UUID for shepherd_read/shepherd_send. If gone, fail explicitly; never substitute a short ref. This locator grants no authority.`;
481
+ }
482
+ }
483
+ const replyToEventId = precommittedIngressEvent?.relations.replyToEventId ?? options.ingressRelations?.replyToEventId;
484
+ const matchedReplyText = spokenText(existing?.events?.find((event) => event.id === replyToEventId));
485
+ const fallbackReplyText = options.replyingTo?.text.trim().slice(0, 1200) ?? "";
486
+ const repliedTo = matchedReplyText
487
+ ? { text: matchedReplyText, author: "agent" }
488
+ : fallbackReplyText ? { text: fallbackReplyText, author: options.replyingTo.author } : undefined;
489
+ if (precommittedIngressEvent) {
490
+ const projectedIngress = exactProjectedIngressMessage(existing, sessionMessages, precommittedIngressEvent.id, baseSession.value);
491
+ if (!projectedIngress || projectedIngress.role !== "user" || projectedIngress.content !== userMessage)
492
+ throw new Error("shared turn precommitted ingress is absent from the provider projection");
493
+ (0, session_events_1.stampIngressRelations)(projectedIngress, {
494
+ replyToEventId: precommittedIngressEvent.relations.replyToEventId,
495
+ threadRootEventId: precommittedIngressEvent.relations.threadRootEventId,
496
+ references: precommittedIngressEvent.relations.references,
497
+ });
498
+ if (repliedTo)
499
+ (0, orientation_frame_1.stampReplyingToText)(projectedIngress, repliedTo.text, repliedTo.author);
500
+ }
501
+ // Pending dir
502
+ const pendingDir = (0, pending_1.getPendingDir)(agentName, friendId, channel, sessionKey);
503
+ // Accumulate outward text through the same callback boundary used by chat
504
+ // channels. `speak` flushes pending text immediately; `settle` is delivered
505
+ // once the turn completes.
506
+ let committedResponseText = "";
507
+ let pendingResponseText = "";
508
+ let terminalErrorMessage;
509
+ let terminalDeliveryKind = "text";
510
+ const deliveries = [];
511
+ const deliveryFailures = [];
512
+ const deliveryAttempts = [];
513
+ let providerInvocationCount = 0;
514
+ let toolInvocationCount = 0;
515
+ let hadReasoningChunk = false;
516
+ const commitResponseText = (text) => {
517
+ const cleaned = stripThinkBlocks(text);
518
+ /* v8 ignore next -- deliverPending strips first; this is a defensive direct-call guard @preserve */
519
+ if (!cleaned)
520
+ return;
521
+ committedResponseText = committedResponseText
522
+ ? `${committedResponseText}\n${cleaned}`
523
+ : cleaned;
524
+ };
525
+ const deliveryErrorMessage = (error) => error instanceof Error ? error.message : String(error);
526
+ const emitFrontendEvent = (event) => {
527
+ options.frontendEventSink?.onEvent(event);
528
+ };
529
+ const deliverPending = async (kind, optionsForDelivery) => {
530
+ const text = stripThinkBlocks(pendingResponseText);
531
+ pendingResponseText = "";
532
+ if (!text)
533
+ return undefined;
534
+ const delivery = { kind, text };
535
+ const attempt = { kind, text, delivered: false };
536
+ const attemptIndex = deliveryAttempts.length;
537
+ deliveryAttempts.push(attempt);
538
+ try {
539
+ await options.deliverySink?.onDelivery(delivery);
540
+ attempt.delivered = true;
541
+ deliveries.push(delivery);
542
+ commitResponseText(text);
543
+ emitFrontendEvent({ type: "assistant_delivery", data: { kind, text } });
544
+ }
545
+ catch (error) {
546
+ const failure = { ...delivery, error: deliveryErrorMessage(error) };
547
+ deliveryFailures.push(failure);
548
+ (0, runtime_1.emitNervesEvent)({
549
+ level: "error",
550
+ component: "senses",
551
+ event: "senses.shared_turn_delivery_error",
552
+ message: "shared turn outward delivery failed",
553
+ meta: { agentName, channel, sessionKey, friendId, kind, error: failure.error, textLength: text.length },
554
+ });
555
+ if (optionsForDelivery.throwOnError)
556
+ throw error;
557
+ commitResponseText(text);
558
+ }
559
+ return attemptIndex;
560
+ };
561
+ /* v8 ignore start — callback stubs are exercised through the pipeline integration */
562
+ const callbacks = {
563
+ settleOutputMode: "retractable_buffer",
564
+ onModelStart: () => {
565
+ providerInvocationCount += 1;
566
+ if (options.turnMetricsObserver)
567
+ options.turnMetricsObserver.providerInvocationCount += 1;
568
+ emitFrontendEvent({ type: "model_started", data: {} });
569
+ },
570
+ onModelStreamStart: () => emitFrontendEvent({ type: "model_stream_started", data: {} }),
571
+ onTextChunk: (chunk) => {
572
+ pendingResponseText += chunk;
573
+ emitFrontendEvent({ type: "text_delta", data: { text: chunk } });
574
+ },
575
+ onReasoningChunk: (chunk) => {
576
+ hadReasoningChunk = true;
577
+ emitFrontendEvent({ type: "reasoning_delta", data: { text: chunk } });
578
+ },
579
+ onToolStart: (name, args) => {
580
+ toolInvocationCount += 1;
581
+ if (options.turnMetricsObserver)
582
+ options.turnMetricsObserver.toolInvocationCount += 1;
583
+ emitFrontendEvent({ type: "tool_started", data: { name, args } });
584
+ },
585
+ onToolEnd: (name, _summary, success) => {
586
+ if (name === "settle" && success)
587
+ terminalDeliveryKind = "settle";
588
+ emitFrontendEvent({ type: "tool_completed", data: { name, summary: _summary, success } });
589
+ },
590
+ onError: (error, severity) => {
591
+ if (severity === "terminal")
592
+ terminalErrorMessage = error.message;
593
+ emitFrontendEvent({ type: "error", data: { message: error.message, severity } });
594
+ },
595
+ onClearText: () => {
596
+ pendingResponseText = "";
597
+ emitFrontendEvent({ type: "text_cleared", data: {} });
598
+ },
599
+ flushNow: async () => { await deliverPending("speak", { throwOnError: true }); },
600
+ };
601
+ /* v8 ignore stop */
602
+ // Run the pipeline
603
+ const inboundMessages = [];
604
+ if (!options.precommittedIngress) {
605
+ const userMsg = { role: "user", content: userMessage };
606
+ (0, session_events_1.stampIngressTime)(userMsg);
607
+ if (options.ingressRelations)
608
+ (0, session_events_1.stampIngressRelations)(userMsg, options.ingressRelations);
609
+ if (repliedTo)
610
+ (0, orientation_frame_1.stampReplyingToText)(userMsg, repliedTo.text, repliedTo.author);
611
+ inboundMessages.push(userMsg);
612
+ }
613
+ const turnResult = await (0, pipeline_1.handleInboundTurn)({
614
+ channel,
615
+ latencyMode: options.latencyMode,
616
+ sessionKey,
617
+ capabilities,
618
+ messages: inboundMessages,
619
+ callbacks,
620
+ sessionTurnLease,
621
+ /* v8 ignore start — delegation wrappers; pipeline integration tested separately */
622
+ friendResolver: { resolve: () => resolver.resolve() },
623
+ sessionLoader: {
624
+ loadOrCreate: () => Promise.resolve({
625
+ messages: sessionMessages,
626
+ sessionPath: sessPath,
627
+ state: sessionState,
628
+ events: existing?.events,
629
+ structuredOutputs: existing?.structuredOutputs,
630
+ }),
631
+ },
632
+ /* v8 ignore stop */
633
+ pendingDir,
634
+ friendStore,
635
+ signal: options.signal,
636
+ provider: resolverParams.provider,
637
+ externalId: resolverParams.externalId,
638
+ tenantId: resolverParams.tenantId,
639
+ enforceTrustGate: trust_gate_1.enforceTrustGate,
640
+ drainPending: options.disablePersistence ? () => [] : pending_1.drainPending,
641
+ runAgentOptions: {
642
+ mcpManager,
643
+ ...(options.disableTools ? { tools: [], hardDisableTools: true } : {}),
644
+ ...(options.approvalCoordinatorFactory && !options.disablePersistence ? { approvalCoordinator: options.approvalCoordinatorFactory({ sessionPath: sessPath, baseSessionRevision }) } : {}),
645
+ ...(options.latencyMode === "live" ? { skipKeptNotes: true } : {}),
646
+ ...(options.orientationFrame ? { orientationFrame: options.orientationFrame } : {}),
647
+ toolContext: {
648
+ signin: async () => undefined,
649
+ ...(options.toolContext ? options.toolContext : {}),
650
+ agentName,
651
+ agentRoot,
652
+ currentUserMessage: userMessage,
653
+ ...(options.shepherdSession ? { currentShepherdSurface: Object.freeze({ ...options.shepherdSession }) } : {}),
654
+ },
655
+ },
656
+ ...(options.prepareRunAgentOptions ? { prepareRunAgentOptions: options.prepareRunAgentOptions } : {}),
657
+ /* v8 ignore start — delegation wrappers; these just forward to the real functions */
658
+ runAgent: (msgs, cb, ch, sig, opts) => (0, core_1.runAgent)(msgs, cb, ch, sig, opts),
659
+ postTurn: (turnMessages, sessionPathArg, usage, hooks, state) => {
660
+ const prepared = (0, context_2.postTurnTrim)(turnMessages, usage, hooks);
661
+ sessionState = state;
662
+ if (options.disablePersistence)
663
+ return;
664
+ persistPromise = (0, context_2.deferPostTurnPersist)(sessionPathArg, prepared, usage, state);
665
+ },
666
+ /* v8 ignore stop */
667
+ accumulateFriendTokens: options.disablePersistence ? async () => undefined : friends_1.accumulateFriendTokens,
668
+ });
669
+ if (turnResult.gateResult && !turnResult.gateResult.allowed) {
670
+ const blockedResponse = "autoReply" in turnResult.gateResult
671
+ ? turnResult.gateResult.autoReply
672
+ : `(blocked by trust gate: ${turnResult.gateResult.reason})`;
673
+ return {
674
+ response: blockedResponse,
675
+ ponderDeferred: false,
676
+ deliveries,
677
+ deliveryFailures,
678
+ providerInvocationCount,
679
+ toolInvocationCount,
680
+ sessionPath: reportedSessionPath,
681
+ turnOutcome: turnResult.turnOutcome ?? "blocked",
682
+ };
683
+ }
684
+ if (turnResult.turnOutcome === "aborted") {
685
+ pendingResponseText = "";
686
+ if (persistPromise)
687
+ await persistPromise;
688
+ return {
689
+ response: "",
690
+ ponderDeferred: false,
691
+ deliveries,
692
+ deliveryFailures,
693
+ providerInvocationCount,
694
+ toolInvocationCount,
695
+ sessionPath: reportedSessionPath,
696
+ turnOutcome: "aborted",
697
+ };
698
+ }
699
+ if (turnResult.turnOutcome === "suspended") {
700
+ if (!turnResult.suspension)
701
+ throw new Error("suspended shared turn omitted durable approval suspension");
702
+ pendingResponseText = "";
703
+ return {
704
+ response: "",
705
+ ponderDeferred: false,
706
+ deliveries,
707
+ deliveryFailures,
708
+ providerInvocationCount,
709
+ toolInvocationCount,
710
+ sessionPath: reportedSessionPath,
711
+ turnOutcome: "suspended",
712
+ suspension: turnResult.suspension,
713
+ };
714
+ }
715
+ const persistedEvents = persistPromise ? await persistPromise : [];
716
+ const terminalEvents = persistedEvents.length > 0
717
+ ? persistedEvents
718
+ : rawSessionEvents((0, session_transaction_1.readSessionTransaction)(sessPath, sessionTurnLease).value);
719
+ const eventView = currentTurnEventView(terminalEvents, existingEventIds, userMessage, options.precommittedIngress, options.ingressRelations);
720
+ let finalDeliveryKind = terminalDeliveryKind;
721
+ const acceptedTerminalOutcome = turnResult.turnOutcome === "settled" || turnResult.turnOutcome === "blocked";
722
+ const failoverText = turnResult.turnOutcome === "errored"
723
+ ? turnResult.failoverMessage?.trim() || (channel === "inner" ? undefined : erroredTurnReply(terminalErrorMessage))
724
+ : undefined;
725
+ const expectsOutwardResponse = acceptedTerminalOutcome || turnResult.turnOutcome === "command" || Boolean(failoverText);
726
+ let finalCausalCoordinate;
727
+ if (acceptedTerminalOutcome) {
728
+ const completionText = stripThinkBlocks(turnResult.completion?.answer ?? "");
729
+ let authoritativeText = completionText;
730
+ if (!authoritativeText && eventView?.terminal) {
731
+ authoritativeText = eventView.terminal.text;
732
+ finalDeliveryKind = eventView.terminal.kind;
733
+ }
734
+ if (eventView?.terminal?.kind === finalDeliveryKind && eventView.terminal.text === authoritativeText)
735
+ finalCausalCoordinate = eventView.terminal;
736
+ const terminalAlreadyDelivered = finalCausalCoordinate
737
+ ? alignedDeliveryCoordinates(eventView, deliveryAttempts).includes(finalCausalCoordinate)
738
+ : false;
739
+ pendingResponseText = authoritativeText && !terminalAlreadyDelivered ? authoritativeText : "";
740
+ }
741
+ else if (turnResult.turnOutcome === "command") {
742
+ // Slash-command text is emitted directly by the pipeline and has no assistant event.
743
+ }
744
+ else if (failoverText) {
745
+ pendingResponseText = failoverText;
746
+ }
747
+ else {
748
+ pendingResponseText = "";
749
+ }
750
+ if (persistPromise && options.frontendEventSink && !options.disablePersistence) {
751
+ const currentStructuredOutputs = (0, context_1.loadSession)(sessPath)?.structuredOutputs ?? [];
752
+ for (const output of currentStructuredOutputs) {
753
+ if (!existingStructuredOutputIds.has(output.id)) {
754
+ emitFrontendEvent({ type: "structured_output", data: { output } });
755
+ }
756
+ }
757
+ }
758
+ const finalDeliveryAttemptIndex = await deliverPending(finalDeliveryKind, { throwOnError: false });
759
+ const ponderDeferred = false;
760
+ // Build response
761
+ let finalResponse;
762
+ const finalDeliveryAttempt = finalDeliveryAttemptIndex === undefined ? undefined : deliveryAttempts[finalDeliveryAttemptIndex];
763
+ const responseDeliveryFailure = finalDeliveryAttempt && !finalDeliveryAttempt.delivered ? deliveryFailures.at(-1) : undefined;
764
+ const responseCausalSessionEventId = finalDeliveryAttempt && !finalDeliveryAttempt.delivered ? finalCausalCoordinate?.eventId : undefined;
765
+ if (committedResponseText.length === 0) {
766
+ if (!expectsOutwardResponse) {
767
+ finalResponse = "";
768
+ }
769
+ else {
770
+ const emptyFallback = options.emptyResponseFallback?.();
771
+ finalResponse = emptyFallback ?? (hadReasoningChunk ? "" : "(agent responded but response was empty)");
772
+ }
773
+ }
774
+ else {
775
+ finalResponse = committedResponseText;
776
+ }
777
+ // Strip MiniMax-style <think>...</think> blocks from the final response.
778
+ // When a reasoning-style model emits only a think block and no final answer
779
+ // (no settle tool call, no post-think text), the readback path above
780
+ // surfaces the raw saved assistant content — which includes the think tags
781
+ // and renders as empty (or as raw reasoning) on MCP/CLI clients. Strip
782
+ // here so the caller sees the actual delivered text. If only reasoning
783
+ // came through and nothing else, surface a clear diagnostic message
784
+ // instead of a blank response so the operator knows what happened.
785
+ finalResponse = stripThinkBlocks(finalResponse);
786
+ if (finalResponse.length === 0 && expectsOutwardResponse) {
787
+ (0, runtime_1.emitNervesEvent)({
788
+ level: "warn",
789
+ component: "senses",
790
+ event: "senses.shared_turn_only_reasoning",
791
+ message: "agent produced only <think> reasoning with no final answer — likely a model that closed the think tag without continuing",
792
+ meta: { agentName, channel, sessionKey, friendId },
793
+ });
794
+ finalResponse = "(agent produced reasoning but no final answer this turn — try again, or check the session transcript for the trace)";
795
+ }
796
+ // Cap response length
797
+ if (finalResponse.length > RESPONSE_CAP) {
798
+ finalResponse = finalResponse.slice(0, RESPONSE_CAP) + "\n\n[truncated — response exceeded 50K characters]";
799
+ }
800
+ (0, runtime_1.emitNervesEvent)({
801
+ component: "senses",
802
+ event: "senses.shared_turn_end",
803
+ message: "shared turn runner complete",
804
+ meta: { agentName, channel, sessionKey, friendId, ponderDeferred, responseLength: finalResponse.length },
805
+ });
806
+ return {
807
+ response: finalResponse,
808
+ ponderDeferred,
809
+ deliveries,
810
+ deliveryFailures,
811
+ ...(responseDeliveryFailure ? { responseDeliveryFailure } : {}),
812
+ providerInvocationCount,
813
+ toolInvocationCount,
814
+ sessionPath: reportedSessionPath,
815
+ turnOutcome: turnResult.turnOutcome,
816
+ ...(deliveries.length > 0 ? { causalSessionEventIds: causalSessionEventIds(eventView, deliveryAttempts, finalDeliveryAttemptIndex, finalCausalCoordinate) } : {}),
817
+ ...(responseCausalSessionEventId ? { responseCausalSessionEventId } : {}),
818
+ };
819
+ });
820
+ }
821
+ finally {
822
+ if (ephemeralRoot) {
823
+ for (const entry of fs.readdirSync(ephemeralRoot, { withFileTypes: true })) {
824
+ if (!entry.isFile() && !entry.isSymbolicLink()) {
825
+ throw new Error(`observe-only session cleanup found unexpected entry: ${entry.name}`);
826
+ }
827
+ fs.unlinkSync(path.join(ephemeralRoot, entry.name));
828
+ }
829
+ fs.rmdirSync(ephemeralRoot);
830
+ }
831
+ }
832
+ }