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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (386) hide show
  1. package/README.md +133 -19
  2. package/RepairGuide.ouro/agent.json +5 -0
  3. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  4. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  5. package/RepairGuide.ouro/skills/diagnose-bootstrap-drift.md +54 -0
  6. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  7. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  8. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  9. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  12. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  13. package/changelog.json +3561 -0
  14. package/dist/arc/attention-types.js +8 -0
  15. package/dist/arc/cares.js +140 -0
  16. package/dist/arc/episodes.js +117 -0
  17. package/dist/arc/intentions.js +133 -0
  18. package/dist/arc/json-store.js +117 -0
  19. package/dist/arc/obligations.js +237 -0
  20. package/dist/arc/packets.js +193 -0
  21. package/dist/arc/presence.js +185 -0
  22. package/dist/arc/task-lifecycle.js +65 -0
  23. package/dist/heart/active-work.js +837 -26
  24. package/dist/heart/agent-entry.js +58 -3
  25. package/dist/heart/attachments/image-normalize.js +194 -0
  26. package/dist/heart/attachments/materialize.js +97 -0
  27. package/dist/heart/attachments/originals.js +88 -0
  28. package/dist/heart/attachments/render.js +29 -0
  29. package/dist/heart/attachments/sources/adapter.js +2 -0
  30. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  31. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  32. package/dist/heart/attachments/sources/index.js +16 -0
  33. package/dist/heart/attachments/store.js +103 -0
  34. package/dist/heart/attachments/types.js +93 -0
  35. package/dist/heart/auth/auth-flow.js +479 -0
  36. package/dist/heart/background-operations.js +281 -0
  37. package/dist/heart/bundle-state.js +168 -0
  38. package/dist/heart/commitments.js +111 -0
  39. package/dist/heart/config-registry.js +304 -0
  40. package/dist/heart/config.js +114 -118
  41. package/dist/heart/core.js +925 -246
  42. package/dist/heart/cross-chat-delivery.js +3 -18
  43. package/dist/heart/daemon/agent-config-check.js +512 -0
  44. package/dist/heart/daemon/agent-discovery.js +102 -3
  45. package/dist/heart/daemon/agent-service.js +522 -0
  46. package/dist/heart/daemon/agentic-repair.js +554 -0
  47. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  48. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  49. package/dist/heart/daemon/cadence.js +70 -0
  50. package/dist/heart/daemon/cli-defaults.js +665 -0
  51. package/dist/heart/daemon/cli-exec.js +7565 -0
  52. package/dist/heart/daemon/cli-help.js +498 -0
  53. package/dist/heart/daemon/cli-parse.js +1590 -0
  54. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  55. package/dist/heart/daemon/cli-render.js +775 -0
  56. package/dist/heart/daemon/cli-types.js +8 -0
  57. package/dist/heart/daemon/connect-bay.js +323 -0
  58. package/dist/heart/daemon/daemon-cli.js +29 -1672
  59. package/dist/heart/daemon/daemon-entry.js +417 -2
  60. package/dist/heart/daemon/daemon-health.js +183 -0
  61. package/dist/heart/daemon/daemon-rollup.js +58 -0
  62. package/dist/heart/daemon/daemon-runtime-sync.js +87 -13
  63. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  64. package/dist/heart/daemon/daemon.js +796 -71
  65. package/dist/heart/daemon/dns-workflow.js +394 -0
  66. package/dist/heart/daemon/doctor-types.js +8 -0
  67. package/dist/heart/daemon/doctor.js +844 -0
  68. package/dist/heart/daemon/drift-detection.js +146 -0
  69. package/dist/heart/daemon/health-monitor.js +122 -1
  70. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  71. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  72. package/dist/heart/daemon/http-health-probe.js +80 -0
  73. package/dist/heart/daemon/human-command-screens.js +234 -0
  74. package/dist/heart/daemon/human-readiness.js +114 -0
  75. package/dist/heart/daemon/inner-status.js +102 -0
  76. package/dist/heart/daemon/interactive-repair.js +394 -0
  77. package/dist/heart/daemon/launchd.js +37 -8
  78. package/dist/heart/daemon/log-tailer.js +82 -12
  79. package/dist/heart/daemon/logs-prune.js +110 -0
  80. package/dist/heart/daemon/mcp-canary.js +297 -0
  81. package/dist/heart/daemon/message-router.js +2 -2
  82. package/dist/heart/daemon/os-cron-deps.js +135 -0
  83. package/dist/heart/daemon/os-cron.js +14 -12
  84. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  85. package/dist/heart/daemon/ouro-entry.js +3 -1
  86. package/dist/heart/daemon/process-manager.js +375 -33
  87. package/dist/heart/daemon/provider-discovery.js +137 -0
  88. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  89. package/dist/heart/daemon/pulse.js +475 -0
  90. package/dist/heart/daemon/readiness-repair.js +365 -0
  91. package/dist/heart/daemon/run-hooks.js +2 -0
  92. package/dist/heart/daemon/runtime-logging.js +67 -16
  93. package/dist/heart/daemon/runtime-metadata.js +3 -31
  94. package/dist/heart/daemon/safe-mode.js +161 -0
  95. package/dist/heart/daemon/sense-manager.js +353 -38
  96. package/dist/heart/daemon/session-id-resolver.js +131 -0
  97. package/dist/heart/daemon/skill-management-installer.js +94 -0
  98. package/dist/heart/daemon/socket-client.js +158 -11
  99. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  100. package/dist/heart/daemon/startup-tui.js +330 -0
  101. package/dist/heart/daemon/task-scheduler.js +3 -25
  102. package/dist/heart/daemon/terminal-ui.js +499 -0
  103. package/dist/heart/daemon/thoughts.js +162 -17
  104. package/dist/heart/daemon/up-progress.js +366 -0
  105. package/dist/heart/daemon/vault-items.js +56 -0
  106. package/dist/heart/delegation.js +1 -1
  107. package/dist/heart/habits/habit-migration.js +189 -0
  108. package/dist/heart/habits/habit-parser.js +140 -0
  109. package/dist/heart/habits/habit-runtime-state.js +100 -0
  110. package/dist/heart/habits/habit-scheduler.js +372 -0
  111. package/dist/heart/{daemon → hatch}/hatch-flow.js +52 -117
  112. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  113. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  114. package/dist/heart/{daemon → hatch}/specialist-tools.js +35 -12
  115. package/dist/heart/identity.js +200 -51
  116. package/dist/heart/kept-notes.js +357 -0
  117. package/dist/heart/kicks.js +1 -1
  118. package/dist/heart/machine-identity.js +161 -0
  119. package/dist/heart/mail-import-discovery.js +353 -0
  120. package/dist/heart/mailbox/mailbox-http-hooks.js +66 -0
  121. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  122. package/dist/heart/mailbox/mailbox-http-routes.js +246 -0
  123. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  124. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  125. package/dist/heart/mailbox/mailbox-http.js +99 -0
  126. package/dist/heart/mailbox/mailbox-read.js +31 -0
  127. package/dist/heart/mailbox/mailbox-types.js +27 -0
  128. package/dist/heart/mailbox/mailbox-view.js +195 -0
  129. package/dist/heart/mailbox/readers/agent-machine.js +382 -0
  130. package/dist/heart/mailbox/readers/continuity-readers.js +338 -0
  131. package/dist/heart/mailbox/readers/mail.js +362 -0
  132. package/dist/heart/mailbox/readers/runtime-readers.js +651 -0
  133. package/dist/heart/mailbox/readers/sessions.js +232 -0
  134. package/dist/heart/mailbox/readers/shared.js +111 -0
  135. package/dist/heart/mcp/mcp-server.js +683 -0
  136. package/dist/heart/migrate-config.js +100 -0
  137. package/dist/heart/model-capabilities.js +19 -0
  138. package/dist/heart/platform.js +81 -0
  139. package/dist/heart/provider-attempt.js +134 -0
  140. package/dist/heart/provider-binding-resolver.js +255 -0
  141. package/dist/heart/provider-credentials.js +425 -0
  142. package/dist/heart/provider-failover.js +301 -0
  143. package/dist/heart/provider-models.js +81 -0
  144. package/dist/heart/provider-ping.js +262 -0
  145. package/dist/heart/provider-state.js +216 -0
  146. package/dist/heart/provider-visibility.js +188 -0
  147. package/dist/heart/providers/anthropic-token.js +131 -0
  148. package/dist/heart/providers/anthropic.js +139 -52
  149. package/dist/heart/providers/azure.js +97 -13
  150. package/dist/heart/providers/error-classification.js +127 -0
  151. package/dist/heart/providers/github-copilot.js +145 -0
  152. package/dist/heart/providers/minimax-vlm.js +189 -0
  153. package/dist/heart/providers/minimax.js +26 -8
  154. package/dist/heart/providers/openai-codex.js +55 -40
  155. package/dist/heart/runtime-capability-check.js +170 -0
  156. package/dist/heart/runtime-credentials.js +367 -0
  157. package/dist/heart/runtime-cwd.js +87 -0
  158. package/dist/heart/sense-truth.js +11 -4
  159. package/dist/heart/session-activity.js +43 -22
  160. package/dist/heart/session-events.js +1149 -0
  161. package/dist/heart/session-playback-cli-main.js +5 -0
  162. package/dist/heart/session-playback-cli.js +36 -0
  163. package/dist/heart/session-playback.js +231 -0
  164. package/dist/heart/session-stats-cli-main.js +5 -0
  165. package/dist/heart/session-stats.js +182 -0
  166. package/dist/heart/session-transcript.js +243 -0
  167. package/dist/heart/start-of-turn-packet.js +345 -0
  168. package/dist/heart/streaming.js +44 -27
  169. package/dist/heart/sync-classification.js +176 -0
  170. package/dist/heart/sync.js +449 -0
  171. package/dist/heart/target-resolution.js +9 -5
  172. package/dist/heart/tempo.js +93 -0
  173. package/dist/heart/temporal-view.js +41 -0
  174. package/dist/heart/timeouts.js +101 -0
  175. package/dist/heart/tool-activity-callbacks.js +59 -0
  176. package/dist/heart/tool-description.js +139 -0
  177. package/dist/heart/tool-friction.js +55 -0
  178. package/dist/heart/tool-loop.js +200 -0
  179. package/dist/heart/turn-context.js +381 -0
  180. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  181. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  182. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  183. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  184. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  185. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  186. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  187. package/dist/mailbox-ui/assets/index-BPr5vNuM.css +1 -0
  188. package/dist/mailbox-ui/assets/index-Cm51CY9W.js +61 -0
  189. package/dist/mailbox-ui/index.html +15 -0
  190. package/dist/mailroom/attention.js +167 -0
  191. package/dist/mailroom/autonomy.js +209 -0
  192. package/dist/mailroom/blob-store.js +674 -0
  193. package/dist/mailroom/body-cache.js +61 -0
  194. package/dist/mailroom/core.js +720 -0
  195. package/dist/mailroom/entry.js +160 -0
  196. package/dist/mailroom/file-store.js +430 -0
  197. package/dist/mailroom/mbox-import.js +383 -0
  198. package/dist/mailroom/outbound.js +380 -0
  199. package/dist/mailroom/policy.js +263 -0
  200. package/dist/mailroom/reader.js +233 -0
  201. package/dist/mailroom/search-cache.js +256 -0
  202. package/dist/mailroom/search-relevance.js +319 -0
  203. package/dist/mailroom/smtp-ingress.js +176 -0
  204. package/dist/mailroom/source-state.js +176 -0
  205. package/dist/mailroom/thread.js +109 -0
  206. package/dist/mailroom/travel-extract.js +89 -0
  207. package/dist/mind/bundle-manifest.js +7 -1
  208. package/dist/mind/context.js +165 -101
  209. package/dist/mind/diary-integrity.js +60 -0
  210. package/dist/mind/{memory.js → diary.js} +62 -75
  211. package/dist/mind/embedding-provider.js +60 -0
  212. package/dist/mind/file-state.js +179 -0
  213. package/dist/mind/friends/channel.js +30 -0
  214. package/dist/mind/friends/resolver.js +54 -2
  215. package/dist/mind/friends/store-file.js +39 -3
  216. package/dist/mind/friends/types.js +2 -2
  217. package/dist/mind/journal-index.js +161 -0
  218. package/dist/mind/note-search.js +268 -0
  219. package/dist/mind/obligation-steering.js +221 -0
  220. package/dist/mind/pending.js +4 -0
  221. package/dist/mind/prompt-refresh.js +3 -2
  222. package/dist/mind/prompt.js +995 -123
  223. package/dist/mind/provenance-trust.js +26 -0
  224. package/dist/mind/scrutiny.js +173 -0
  225. package/dist/nerves/cli-logging.js +7 -1
  226. package/dist/nerves/coverage/audit-rules.js +15 -6
  227. package/dist/nerves/coverage/audit.js +28 -2
  228. package/dist/nerves/coverage/cli.js +1 -1
  229. package/dist/nerves/coverage/contract.js +5 -5
  230. package/dist/nerves/coverage/file-completeness.js +139 -5
  231. package/dist/nerves/coverage/run-artifacts.js +1 -1
  232. package/dist/nerves/event-buffer.js +111 -0
  233. package/dist/nerves/index.js +224 -4
  234. package/dist/nerves/observation.js +20 -0
  235. package/dist/nerves/redact.js +79 -0
  236. package/dist/nerves/review/cli-main.js +5 -0
  237. package/dist/nerves/review/cli.js +156 -0
  238. package/dist/nerves/review/core.js +152 -0
  239. package/dist/nerves/runtime.js +5 -1
  240. package/dist/repertoire/ado-client.js +15 -56
  241. package/dist/repertoire/ado-semantic.js +11 -10
  242. package/dist/repertoire/api-client.js +97 -0
  243. package/dist/repertoire/bitwarden-store.js +816 -0
  244. package/dist/repertoire/bundle-templates.js +72 -0
  245. package/dist/repertoire/bw-installer.js +180 -0
  246. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  247. package/dist/repertoire/coding/context-pack.js +330 -0
  248. package/dist/repertoire/coding/feedback.js +197 -30
  249. package/dist/repertoire/coding/manager.js +158 -9
  250. package/dist/repertoire/coding/spawner.js +55 -9
  251. package/dist/repertoire/coding/tools.js +170 -7
  252. package/dist/repertoire/commerce-errors.js +109 -0
  253. package/dist/repertoire/commerce-self-test.js +156 -0
  254. package/dist/repertoire/credential-access.js +111 -0
  255. package/dist/repertoire/duffel-client.js +185 -0
  256. package/dist/repertoire/github-client.js +14 -55
  257. package/dist/repertoire/graph-client.js +11 -52
  258. package/dist/repertoire/guardrails.js +396 -0
  259. package/dist/repertoire/mcp-client.js +295 -0
  260. package/dist/repertoire/mcp-manager.js +362 -0
  261. package/dist/repertoire/mcp-tools.js +63 -0
  262. package/dist/repertoire/shell-sessions.js +133 -0
  263. package/dist/repertoire/skills.js +15 -24
  264. package/dist/repertoire/stripe-client.js +131 -0
  265. package/dist/repertoire/tasks/board.js +31 -5
  266. package/dist/repertoire/tasks/fix.js +182 -0
  267. package/dist/repertoire/tasks/index.js +16 -4
  268. package/dist/repertoire/tasks/lifecycle.js +2 -2
  269. package/dist/repertoire/tasks/parser.js +3 -2
  270. package/dist/repertoire/tasks/scanner.js +194 -37
  271. package/dist/repertoire/tasks/transitions.js +16 -78
  272. package/dist/repertoire/tool-results.js +29 -0
  273. package/dist/repertoire/tools-attachments.js +317 -0
  274. package/dist/repertoire/tools-base.js +47 -1075
  275. package/dist/repertoire/tools-bluebubbles.js +1 -0
  276. package/dist/repertoire/tools-bridge.js +142 -0
  277. package/dist/repertoire/tools-bundle.js +984 -0
  278. package/dist/repertoire/tools-config.js +185 -0
  279. package/dist/repertoire/tools-continuity.js +248 -0
  280. package/dist/repertoire/tools-credential.js +381 -0
  281. package/dist/repertoire/tools-files.js +342 -0
  282. package/dist/repertoire/tools-flight.js +224 -0
  283. package/dist/repertoire/tools-flow.js +119 -0
  284. package/dist/repertoire/tools-github.js +1 -7
  285. package/dist/repertoire/tools-mail.js +1857 -0
  286. package/dist/repertoire/tools-notes.js +421 -0
  287. package/dist/repertoire/tools-session.js +750 -0
  288. package/dist/repertoire/tools-shell.js +120 -0
  289. package/dist/repertoire/tools-stripe.js +180 -0
  290. package/dist/repertoire/tools-surface.js +243 -0
  291. package/dist/repertoire/tools-teams.js +9 -39
  292. package/dist/repertoire/tools-travel.js +125 -0
  293. package/dist/repertoire/tools-trip.js +604 -0
  294. package/dist/repertoire/tools-user-profile.js +144 -0
  295. package/dist/repertoire/tools-vault.js +40 -0
  296. package/dist/repertoire/tools.js +108 -100
  297. package/dist/repertoire/travel-api-client.js +360 -0
  298. package/dist/repertoire/user-profile.js +131 -0
  299. package/dist/repertoire/vault-setup.js +246 -0
  300. package/dist/repertoire/vault-unlock.js +561 -0
  301. package/dist/scripts/claude-code-hook.js +41 -0
  302. package/dist/scripts/claude-code-stop-hook.js +47 -0
  303. package/dist/senses/attention-queue.js +116 -0
  304. package/dist/senses/bluebubbles/active-turns.js +216 -0
  305. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  306. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  307. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  308. package/dist/senses/bluebubbles/entry.js +77 -0
  309. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  310. package/dist/senses/bluebubbles/index.js +2305 -0
  311. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  312. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  313. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  314. package/dist/senses/bluebubbles/processed-log.js +133 -0
  315. package/dist/senses/bluebubbles/replay.js +137 -0
  316. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  317. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  318. package/dist/senses/cli/bracketed-paste.js +82 -0
  319. package/dist/senses/cli/image-paste.js +287 -0
  320. package/dist/senses/cli/image-ref-navigation.js +75 -0
  321. package/dist/senses/cli/ink-app.js +156 -0
  322. package/dist/senses/cli/inline-diff.js +64 -0
  323. package/dist/senses/cli/input-keys.js +174 -0
  324. package/dist/senses/cli/kill-ring.js +86 -0
  325. package/dist/senses/cli/message-list.js +51 -0
  326. package/dist/senses/cli/ouro-tui.js +607 -0
  327. package/dist/senses/cli/spinner-imperative.js +135 -0
  328. package/dist/senses/cli/spinner.js +101 -0
  329. package/dist/senses/cli/status-line.js +60 -0
  330. package/dist/senses/cli/streaming-markdown.js +526 -0
  331. package/dist/senses/cli/tool-display.js +85 -0
  332. package/dist/senses/cli/tool-render.js +85 -0
  333. package/dist/senses/cli/tui-store.js +240 -0
  334. package/dist/senses/cli/virtual-list.js +35 -0
  335. package/dist/senses/cli-entry.js +60 -8
  336. package/dist/senses/cli-layout.js +187 -0
  337. package/dist/senses/cli.js +520 -209
  338. package/dist/senses/commands.js +66 -3
  339. package/dist/senses/habit-turn-message.js +108 -0
  340. package/dist/senses/inner-dialog-worker.js +175 -21
  341. package/dist/senses/inner-dialog.js +330 -27
  342. package/dist/senses/mail-entry.js +66 -0
  343. package/dist/senses/mail.js +379 -0
  344. package/dist/senses/pipeline.js +569 -182
  345. package/dist/senses/proactive-content-guard.js +51 -0
  346. package/dist/senses/shared-turn.js +248 -0
  347. package/dist/senses/surface-tool.js +68 -0
  348. package/dist/senses/teams-entry.js +60 -8
  349. package/dist/senses/teams.js +387 -98
  350. package/dist/senses/trust-gate.js +100 -5
  351. package/dist/trips/core.js +138 -0
  352. package/dist/trips/store.js +146 -0
  353. package/package.json +38 -7
  354. package/skills/agent-commerce.md +106 -0
  355. package/skills/browser-navigation.md +117 -0
  356. package/skills/commerce-setup-guide.md +116 -0
  357. package/skills/commerce-setup.md +84 -0
  358. package/skills/configure-dev-tools.md +101 -0
  359. package/skills/travel-planning.md +138 -0
  360. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  361. package/dist/heart/daemon/subagent-installer.js +0 -166
  362. package/dist/heart/session-recall.js +0 -116
  363. package/dist/mind/associative-recall.js +0 -209
  364. package/dist/senses/bluebubbles-entry.js +0 -13
  365. package/dist/senses/bluebubbles.js +0 -1177
  366. package/dist/senses/debug-activity.js +0 -148
  367. package/subagents/README.md +0 -86
  368. package/subagents/work-doer.md +0 -237
  369. package/subagents/work-merger.md +0 -618
  370. package/subagents/work-planner.md +0 -390
  371. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  372. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  373. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  374. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  375. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  376. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  377. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  378. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  379. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  380. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  381. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  382. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  383. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  384. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  385. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  386. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,750 @@
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.sessionToolDefinitions = void 0;
37
+ exports.renderInnerProgressStatus = renderInnerProgressStatus;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const config_1 = require("../heart/config");
41
+ const identity_1 = require("../heart/identity");
42
+ const runtime_1 = require("../nerves/runtime");
43
+ const socket_client_1 = require("../heart/daemon/socket-client");
44
+ const thoughts_1 = require("../heart/daemon/thoughts");
45
+ const manager_1 = require("../heart/bridges/manager");
46
+ const session_transcript_1 = require("../heart/session-transcript");
47
+ const session_activity_1 = require("../heart/session-activity");
48
+ const active_work_1 = require("../heart/active-work");
49
+ const coding_1 = require("./coding");
50
+ const tasks_1 = require("./tasks");
51
+ const pending_1 = require("../mind/pending");
52
+ const obligations_1 = require("../arc/obligations");
53
+ const progress_story_1 = require("../heart/progress-story");
54
+ const cross_chat_delivery_1 = require("../heart/cross-chat-delivery");
55
+ const mail_import_discovery_1 = require("../heart/mail-import-discovery");
56
+ const NO_SESSION_FOUND_MESSAGE = "no session found for that friend/channel/key combination.";
57
+ const EMPTY_SESSION_MESSAGE = "session exists but has no non-system messages.";
58
+ async function summarizeSessionTailSafely(options) {
59
+ try {
60
+ return await (0, session_transcript_1.summarizeSessionTail)(options);
61
+ }
62
+ catch (error) {
63
+ if (options.summarize) {
64
+ (0, runtime_1.emitNervesEvent)({
65
+ component: "daemon",
66
+ event: "daemon.session_tail_summary_summary_fallback",
67
+ message: "session tail summarization failed; using raw transcript",
68
+ meta: {
69
+ friendId: options.friendId,
70
+ channel: options.channel,
71
+ key: options.key,
72
+ error: error instanceof Error ? error.message : String(error),
73
+ },
74
+ });
75
+ try {
76
+ return await (0, session_transcript_1.summarizeSessionTail)({
77
+ ...options,
78
+ summarize: undefined,
79
+ });
80
+ /* v8 ignore start -- defensive: session tail fallback @preserve */
81
+ }
82
+ catch {
83
+ return { kind: "missing" };
84
+ }
85
+ /* v8 ignore stop */
86
+ }
87
+ return { kind: "missing" };
88
+ }
89
+ }
90
+ async function searchSessionSafely(options) {
91
+ try {
92
+ return await (0, session_transcript_1.searchSessionTranscript)(options);
93
+ }
94
+ catch {
95
+ return { kind: "missing" };
96
+ }
97
+ }
98
+ function normalizeProgressOutcome(text) {
99
+ const trimmed = text.trim();
100
+ /* v8 ignore next -- defensive: normalizeProgressOutcome null branch @preserve */
101
+ if (!trimmed || trimmed === "nothing yet" || trimmed === "nothing recent") {
102
+ return null;
103
+ }
104
+ if (trimmed.startsWith("\"") && trimmed.endsWith("\"") && trimmed.length >= 2) {
105
+ return trimmed.slice(1, -1);
106
+ }
107
+ return trimmed;
108
+ }
109
+ function writePendingEnvelope(queueDir, message) {
110
+ fs.mkdirSync(queueDir, { recursive: true });
111
+ const fileName = `${message.timestamp}-${Math.random().toString(36).slice(2, 10)}.json`;
112
+ const filePath = path.join(queueDir, fileName);
113
+ fs.writeFileSync(filePath, JSON.stringify(message, null, 2));
114
+ }
115
+ function renderCrossChatDeliveryStatus(target, result) {
116
+ const phase = result.status === "delivered_now"
117
+ ? "completed"
118
+ : result.status === "queued_for_later"
119
+ ? "queued"
120
+ : result.status === "blocked"
121
+ ? "blocked"
122
+ : "errored";
123
+ const lead = result.status === "delivered_now"
124
+ ? "delivered now"
125
+ : result.status === "queued_for_later"
126
+ ? "queued for later"
127
+ : result.status === "blocked"
128
+ ? "blocked"
129
+ : "failed";
130
+ return (0, progress_story_1.renderProgressStory)((0, progress_story_1.buildProgressStory)({
131
+ scope: "shared-work",
132
+ phase,
133
+ objective: `message to ${target}`,
134
+ outcomeText: `${lead}\n${result.detail}`,
135
+ }));
136
+ }
137
+ function emptyTaskBoard() {
138
+ return {
139
+ compact: "",
140
+ full: "",
141
+ byStatus: {
142
+ drafting: [],
143
+ processing: [],
144
+ validating: [],
145
+ collaborating: [],
146
+ paused: [],
147
+ blocked: [],
148
+ done: [],
149
+ cancelled: [],
150
+ },
151
+ issues: [],
152
+ actionRequired: [],
153
+ unresolvedDependencies: [],
154
+ activeSessions: [],
155
+ activeBridges: [],
156
+ };
157
+ }
158
+ function isLiveCodingSessionStatus(status) {
159
+ return status === "spawning"
160
+ || status === "running"
161
+ || status === "waiting_input"
162
+ || status === "stalled";
163
+ }
164
+ function readActiveWorkInnerState() {
165
+ const defaultJob = {
166
+ status: "idle",
167
+ content: null,
168
+ origin: null,
169
+ mode: "reflect",
170
+ obligationStatus: null,
171
+ surfacedResult: null,
172
+ queuedAt: null,
173
+ startedAt: null,
174
+ surfacedAt: null,
175
+ };
176
+ try {
177
+ const agentRoot = (0, identity_1.getAgentRoot)();
178
+ const pendingDir = (0, pending_1.getInnerDialogPendingDir)((0, identity_1.getAgentName)());
179
+ const sessionPath = (0, thoughts_1.getInnerDialogSessionPath)(agentRoot);
180
+ const { pendingMessages, turns, runtimeState } = (0, thoughts_1.readInnerDialogRawData)(sessionPath, pendingDir);
181
+ const dialogStatus = (0, thoughts_1.deriveInnerDialogStatus)(pendingMessages, turns, runtimeState);
182
+ const job = (0, thoughts_1.deriveInnerJob)(pendingMessages, turns, runtimeState);
183
+ const storeObligationPending = (0, obligations_1.readPendingObligations)(agentRoot).length > 0;
184
+ return {
185
+ status: dialogStatus.processing === "started" ? "running" : "idle",
186
+ hasPending: dialogStatus.queue !== "clear",
187
+ origin: dialogStatus.origin,
188
+ contentSnippet: dialogStatus.contentSnippet,
189
+ obligationPending: dialogStatus.obligationPending || storeObligationPending,
190
+ job,
191
+ };
192
+ }
193
+ catch {
194
+ return {
195
+ status: "idle",
196
+ hasPending: false,
197
+ job: defaultJob,
198
+ };
199
+ }
200
+ }
201
+ async function buildToolActiveWorkFrame(ctx) {
202
+ const currentSession = ctx?.currentSession
203
+ ? {
204
+ friendId: ctx.currentSession.friendId,
205
+ channel: ctx.currentSession.channel,
206
+ key: ctx.currentSession.key,
207
+ sessionPath: (0, config_1.resolveSessionPath)(ctx.currentSession.friendId, ctx.currentSession.channel, ctx.currentSession.key),
208
+ }
209
+ : null;
210
+ const agentRoot = (0, identity_1.getAgentRoot)();
211
+ const bridges = currentSession
212
+ ? (0, manager_1.createBridgeManager)().findBridgesForSession({
213
+ friendId: currentSession.friendId,
214
+ channel: currentSession.channel,
215
+ key: currentSession.key,
216
+ })
217
+ : [];
218
+ let friendActivity = [];
219
+ try {
220
+ friendActivity = (0, session_activity_1.listSessionActivity)({
221
+ sessionsDir: `${agentRoot}/state/sessions`,
222
+ friendsDir: `${agentRoot}/friends`,
223
+ agentName: (0, identity_1.getAgentName)(),
224
+ currentSession,
225
+ });
226
+ }
227
+ catch {
228
+ friendActivity = [];
229
+ }
230
+ const pendingObligations = (() => {
231
+ try {
232
+ return (0, obligations_1.readPendingObligations)(agentRoot);
233
+ }
234
+ catch {
235
+ return [];
236
+ }
237
+ })();
238
+ let codingSessions = [];
239
+ let otherCodingSessions = [];
240
+ try {
241
+ const liveCodingSessions = (0, coding_1.getCodingSessionManager)()
242
+ .listSessions()
243
+ .filter((session) => isLiveCodingSessionStatus(session.status) && Boolean(session.originSession));
244
+ if (currentSession) {
245
+ codingSessions = liveCodingSessions.filter((session) => session.originSession?.friendId === currentSession.friendId
246
+ && session.originSession.channel === currentSession.channel
247
+ && session.originSession.key === currentSession.key);
248
+ otherCodingSessions = liveCodingSessions.filter((session) => !(session.originSession?.friendId === currentSession.friendId
249
+ && session.originSession.channel === currentSession.channel
250
+ && session.originSession.key === currentSession.key));
251
+ }
252
+ else {
253
+ codingSessions = [];
254
+ otherCodingSessions = liveCodingSessions;
255
+ }
256
+ }
257
+ catch {
258
+ codingSessions = [];
259
+ otherCodingSessions = [];
260
+ }
261
+ const currentObligation = currentSession
262
+ ? pendingObligations.find((obligation) => obligation.status !== "fulfilled"
263
+ && obligation.origin.friendId === currentSession.friendId
264
+ && obligation.origin.channel === currentSession.channel
265
+ && obligation.origin.key === currentSession.key)?.content ?? null
266
+ : null;
267
+ const backgroundOperations = (0, mail_import_discovery_1.listVisibleBackgroundOperations)({
268
+ agentName: (0, identity_1.getAgentName)(),
269
+ agentRoot,
270
+ repoRoot: process.cwd(),
271
+ homeDir: process.env.HOME,
272
+ nowMs: Date.now(),
273
+ limit: 5,
274
+ });
275
+ return (0, active_work_1.buildActiveWorkFrame)({
276
+ currentSession,
277
+ currentObligation,
278
+ mustResolveBeforeHandoff: false,
279
+ inner: readActiveWorkInnerState(),
280
+ bridges,
281
+ codingSessions,
282
+ backgroundOperations,
283
+ otherCodingSessions,
284
+ pendingObligations,
285
+ taskBoard: (() => {
286
+ try {
287
+ return (0, tasks_1.getTaskModule)().getBoard();
288
+ }
289
+ catch {
290
+ return emptyTaskBoard();
291
+ }
292
+ })(),
293
+ friendActivity,
294
+ targetCandidates: [],
295
+ });
296
+ }
297
+ function findDelegatingBridgeId(ctx) {
298
+ const currentSession = ctx?.currentSession;
299
+ if (!currentSession)
300
+ return undefined;
301
+ return ctx?.activeBridges?.find((bridge) => bridge.lifecycle === "active"
302
+ && bridge.attachedSessions.some((session) => session.friendId === currentSession.friendId
303
+ && session.channel === currentSession.channel
304
+ && session.key === currentSession.key))?.id;
305
+ }
306
+ function renderInnerProgressStatus(status) {
307
+ if (status.processing === "pending") {
308
+ return "i've queued this thought for private attention. it'll come up when my inner dialog is free.";
309
+ }
310
+ if (status.processing === "started") {
311
+ return "i'm working through this privately right now.";
312
+ }
313
+ // processed / completed
314
+ if (status.surfaced && status.surfaced !== "nothing recent" && status.surfaced !== "no outward result") {
315
+ return `i thought about this privately and came to something: ${status.surfaced}`;
316
+ }
317
+ return "i thought about this privately. i'll bring it back when the time is right.";
318
+ }
319
+ exports.sessionToolDefinitions = [
320
+ {
321
+ tool: {
322
+ type: "function",
323
+ function: {
324
+ name: "query_active_work",
325
+ description: "read the current live world-state across visible sessions, coding lanes, inner work, and return obligations. use this instead of piecing status together from separate session and coding tools.",
326
+ parameters: {
327
+ type: "object",
328
+ properties: {},
329
+ },
330
+ },
331
+ },
332
+ handler: async (_args, ctx) => {
333
+ const frame = await buildToolActiveWorkFrame(ctx);
334
+ return `this is my current top-level live world-state.\nanswer whole-self status questions from this before drilling into individual sessions.\n\n${(0, active_work_1.formatActiveWorkFrame)(frame)}`;
335
+ },
336
+ },
337
+ {
338
+ tool: {
339
+ type: "function",
340
+ function: {
341
+ name: "query_session",
342
+ description: "inspect another session. use transcript for recent context, status for self/inner progress, or search to find older history by query.",
343
+ parameters: {
344
+ type: "object",
345
+ properties: {
346
+ friendId: { type: "string", description: "the friend UUID (or 'self')" },
347
+ channel: { type: "string", description: "the channel: cli, teams, bluebubbles, inner, or mcp" },
348
+ key: { type: "string", description: "session key (defaults to 'session')" },
349
+ messageCount: { type: "string", description: "how many recent messages to return (default 20)" },
350
+ mode: {
351
+ type: "string",
352
+ enum: ["transcript", "status", "search"],
353
+ description: "transcript (default), lightweight status for self/inner checks, or search for older history",
354
+ },
355
+ query: { type: "string", description: "required when mode=search; search term for older session history" },
356
+ },
357
+ required: ["friendId", "channel"],
358
+ },
359
+ },
360
+ },
361
+ handler: async (args, ctx) => {
362
+ let friendId = args.friendId;
363
+ const channel = args.channel;
364
+ const key = args.key || "session";
365
+ const count = parseInt(args.messageCount || "20", 10);
366
+ const mode = args.mode || "transcript";
367
+ // Resolve friend name -> UUID if not already a UUID or "self"
368
+ if (friendId && friendId !== "self" && !/^[0-9a-f]{8}-[0-9a-f]{4}-/.test(friendId) && ctx?.friendStore?.listAll) {
369
+ const allFriends = await ctx.friendStore.listAll();
370
+ const match = allFriends.find(f => f.name.toLowerCase() === friendId.toLowerCase());
371
+ if (match) {
372
+ friendId = match.id;
373
+ }
374
+ }
375
+ if (mode === "status") {
376
+ if (friendId !== "self" || channel !== "inner") {
377
+ return "status mode is only available for self/inner dialog.";
378
+ }
379
+ const sessionPath = (0, thoughts_1.getInnerDialogSessionPath)((0, identity_1.getAgentRoot)());
380
+ const pendingDir = (0, pending_1.getInnerDialogPendingDir)((0, identity_1.getAgentName)());
381
+ return renderInnerProgressStatus((0, thoughts_1.readInnerDialogStatus)(sessionPath, pendingDir));
382
+ }
383
+ if (mode === "search") {
384
+ const query = (args.query || "").trim();
385
+ if (!query) {
386
+ return "search mode requires a non-empty query.";
387
+ }
388
+ const search = await searchSessionSafely({
389
+ sessionPath: (0, config_1.resolveSessionPath)(friendId, channel, key),
390
+ friendId,
391
+ channel,
392
+ key,
393
+ query,
394
+ });
395
+ if (search.kind === "missing") {
396
+ return NO_SESSION_FOUND_MESSAGE;
397
+ }
398
+ if (search.kind === "empty") {
399
+ return EMPTY_SESSION_MESSAGE;
400
+ }
401
+ if (search.kind === "no_match") {
402
+ return `no matches for "${search.query}" in that session.\n\n${search.snapshot}`;
403
+ }
404
+ return [
405
+ `history search: "${search.query}"`,
406
+ search.snapshot,
407
+ ...search.matches.map((match, index) => `match ${index + 1}\n${match}`),
408
+ ].join("\n\n");
409
+ }
410
+ const sessFile = (0, config_1.resolveSessionPath)(friendId, channel, key);
411
+ const sessionTail = await summarizeSessionTailSafely({
412
+ sessionPath: sessFile,
413
+ friendId,
414
+ channel,
415
+ key,
416
+ messageCount: count,
417
+ trustLevel: ctx?.context?.friend?.trustLevel,
418
+ summarize: ctx?.summarize,
419
+ archiveFallback: true,
420
+ });
421
+ if (sessionTail.kind === "missing") {
422
+ return NO_SESSION_FOUND_MESSAGE;
423
+ }
424
+ if (sessionTail.kind === "empty") {
425
+ return EMPTY_SESSION_MESSAGE;
426
+ }
427
+ return sessionTail.summary;
428
+ },
429
+ },
430
+ {
431
+ tool: {
432
+ type: "function",
433
+ function: {
434
+ name: "send_message",
435
+ description: "send a message to a friend's session. when the request is explicitly authorized from a trusted live chat, the harness will try to deliver immediately; otherwise it reports truthful queued/block/failure state.",
436
+ parameters: {
437
+ type: "object",
438
+ properties: {
439
+ friendId: { type: "string", description: "the friend UUID (or 'self')" },
440
+ channel: { type: "string", description: "the channel: cli, teams, bluebubbles, inner, or mcp" },
441
+ key: { type: "string", description: "session key (defaults to 'session')" },
442
+ content: { type: "string", description: "the message content to send" },
443
+ },
444
+ required: ["friendId", "channel", "content"],
445
+ },
446
+ },
447
+ },
448
+ handler: async (args, ctx) => {
449
+ let friendId = args.friendId;
450
+ const channel = args.channel;
451
+ const key = args.key || "session";
452
+ const content = args.content;
453
+ const now = Date.now();
454
+ const agentName = (0, identity_1.getAgentName)();
455
+ // Resolve friend name → UUID if needed
456
+ /* v8 ignore start -- name resolution: reads real filesystem, tested via live integration @preserve */
457
+ if (friendId !== "self") {
458
+ const originalFriendId = friendId;
459
+ try {
460
+ const agentRoot = (0, identity_1.getAgentRoot)();
461
+ const sessionsDir = path.join(agentRoot, "state", "sessions");
462
+ const friendsDir = path.join(agentRoot, "friends");
463
+ const sessionDirExists = fs.existsSync(path.join(sessionsDir, friendId));
464
+ if (!sessionDirExists) {
465
+ const friendFiles = fs.readdirSync(friendsDir).filter((f) => f.endsWith(".json"));
466
+ for (const file of friendFiles) {
467
+ const raw = fs.readFileSync(path.join(friendsDir, file), "utf-8");
468
+ const record = JSON.parse(raw);
469
+ if (record.name?.toLowerCase() === friendId.toLowerCase() && record.id) {
470
+ friendId = record.id;
471
+ break;
472
+ }
473
+ }
474
+ (0, runtime_1.emitNervesEvent)({
475
+ component: "repertoire",
476
+ event: "repertoire.send_message_name_resolve",
477
+ message: friendId !== originalFriendId ? "resolved friend name to UUID" : "friend name resolution failed",
478
+ meta: { original: originalFriendId, resolved: friendId, friendsDir, fileCount: friendFiles.length },
479
+ });
480
+ }
481
+ }
482
+ catch (err) {
483
+ (0, runtime_1.emitNervesEvent)({
484
+ level: "warn",
485
+ component: "repertoire",
486
+ event: "repertoire.send_message_name_resolve_error",
487
+ message: "friend name resolution threw",
488
+ meta: { friendId: originalFriendId, error: err instanceof Error ? err.message : String(err) },
489
+ });
490
+ }
491
+ }
492
+ /* v8 ignore stop */
493
+ // Self-routing: messages to "self" always go to inner dialog pending dir,
494
+ // regardless of the channel or key the agent specified.
495
+ const isSelf = friendId === "self";
496
+ const pendingDir = isSelf
497
+ ? (0, pending_1.getInnerDialogPendingDir)(agentName)
498
+ : (0, pending_1.getPendingDir)(agentName, friendId, channel, key);
499
+ const delegatingBridgeId = findDelegatingBridgeId(ctx);
500
+ const delegatedFrom = isSelf
501
+ && ctx?.currentSession
502
+ && !(ctx.currentSession.friendId === "self" && ctx.currentSession.channel === "inner")
503
+ ? {
504
+ friendId: ctx.currentSession.friendId,
505
+ channel: ctx.currentSession.channel,
506
+ key: ctx.currentSession.key,
507
+ ...(delegatingBridgeId ? { bridgeId: delegatingBridgeId } : {}),
508
+ }
509
+ : undefined;
510
+ const obligationId = delegatedFrom ? (0, obligations_1.generateObligationId)(now) : undefined;
511
+ const envelope = {
512
+ from: agentName,
513
+ friendId,
514
+ channel,
515
+ key,
516
+ content,
517
+ timestamp: now,
518
+ ...(delegatedFrom ? { delegatedFrom, obligationStatus: "pending" } : {}),
519
+ ...(obligationId ? { obligationId } : {}),
520
+ };
521
+ if (isSelf) {
522
+ writePendingEnvelope(pendingDir, envelope);
523
+ if (delegatedFrom) {
524
+ try {
525
+ (0, obligations_1.createObligation)((0, identity_1.getAgentRoot)(), {
526
+ origin: {
527
+ friendId: delegatedFrom.friendId,
528
+ channel: delegatedFrom.channel,
529
+ key: delegatedFrom.key,
530
+ },
531
+ ...(delegatedFrom.bridgeId ? { bridgeId: delegatedFrom.bridgeId } : {}),
532
+ content,
533
+ });
534
+ }
535
+ catch {
536
+ /* v8 ignore next -- defensive: obligation store write failure should not break send_message @preserve */
537
+ }
538
+ /* v8 ignore next -- obligationId always set when delegatedFrom is set (see generateObligationId above) @preserve */
539
+ if (obligationId) {
540
+ (0, obligations_1.createReturnObligation)(agentName, {
541
+ id: obligationId,
542
+ origin: delegatedFrom,
543
+ status: "queued",
544
+ delegatedContent: content.length > 120 ? `${content.slice(0, 117)}...` : content,
545
+ createdAt: now,
546
+ });
547
+ }
548
+ (0, runtime_1.emitNervesEvent)({
549
+ event: "repertoire.obligation_created",
550
+ component: "repertoire",
551
+ message: "obligation created for inner dialog delegation",
552
+ meta: {
553
+ friendId: delegatedFrom.friendId,
554
+ channel: delegatedFrom.channel,
555
+ key: delegatedFrom.key,
556
+ },
557
+ });
558
+ }
559
+ let wakeResponse = null;
560
+ try {
561
+ wakeResponse = await (0, socket_client_1.requestInnerWake)(agentName);
562
+ }
563
+ catch {
564
+ wakeResponse = null;
565
+ }
566
+ if (!wakeResponse?.ok) {
567
+ const { runInnerDialogTurn } = await Promise.resolve().then(() => __importStar(require("../senses/inner-dialog")));
568
+ if (ctx?.context?.channel.channel === "inner") {
569
+ queueMicrotask(() => {
570
+ void runInnerDialogTurn({ reason: "instinct" });
571
+ });
572
+ return renderInnerProgressStatus({
573
+ queue: "queued to inner/dialog",
574
+ wake: "inline scheduled",
575
+ processing: "pending",
576
+ surfaced: "nothing yet",
577
+ });
578
+ }
579
+ else {
580
+ const turnResult = await runInnerDialogTurn({ reason: "instinct" });
581
+ const surfacedPreview = normalizeProgressOutcome((0, thoughts_1.formatSurfacedValue)((0, thoughts_1.extractThoughtResponseFromMessages)(turnResult?.messages ?? [])));
582
+ return (0, progress_story_1.renderProgressStory)((0, progress_story_1.buildProgressStory)({
583
+ scope: "inner-delegation",
584
+ phase: "completed",
585
+ objective: "queued to inner/dialog",
586
+ outcomeText: `wake: inline fallback\n${surfacedPreview}`,
587
+ }));
588
+ }
589
+ }
590
+ return renderInnerProgressStatus({
591
+ queue: "queued to inner/dialog",
592
+ wake: "daemon requested",
593
+ processing: "pending",
594
+ surfaced: "nothing yet",
595
+ });
596
+ }
597
+ // Resolve BB session key if using default — agents don't know the real session key
598
+ /* v8 ignore start -- BB session key resolution: reads real filesystem @preserve */
599
+ let resolvedKey = key;
600
+ if (channel === "bluebubbles" && key === "session") {
601
+ try {
602
+ const agentRoot = (0, identity_1.getAgentRoot)();
603
+ const bbDir = path.join(agentRoot, "state", "sessions", friendId, "bluebubbles");
604
+ if (fs.existsSync(bbDir)) {
605
+ const files = fs.readdirSync(bbDir).filter((f) => f.endsWith(".json"));
606
+ // Only use DM sessions (;-;) for proactive delivery — never group chats (;+;)
607
+ const dmFile = files.find((f) => f.includes(";-;"));
608
+ if (dmFile) {
609
+ resolvedKey = dmFile.replace(/\.json$/, "");
610
+ }
611
+ }
612
+ }
613
+ catch { /* continue with default key */ }
614
+ }
615
+ /* v8 ignore stop */
616
+ const deliveryResult = await (0, cross_chat_delivery_1.deliverCrossChatMessage)({
617
+ friendId,
618
+ channel,
619
+ key: resolvedKey,
620
+ content,
621
+ intent: ctx?.currentSession && ctx.currentSession.friendId !== "self"
622
+ ? "explicit_cross_chat"
623
+ : "generic_outreach",
624
+ ...(ctx?.currentSession && ctx.currentSession.friendId !== "self"
625
+ ? {
626
+ authorizingSession: {
627
+ friendId: ctx.currentSession.friendId,
628
+ channel: ctx.currentSession.channel,
629
+ key: ctx.currentSession.key,
630
+ trustLevel: ctx?.context?.friend?.trustLevel,
631
+ },
632
+ }
633
+ : {}),
634
+ }, {
635
+ agentName,
636
+ queuePending: (message) => writePendingEnvelope(pendingDir, message),
637
+ deliverers: {
638
+ bluebubbles: async (request) => {
639
+ const { sendProactiveBlueBubblesMessageToSession } = await Promise.resolve().then(() => __importStar(require("../senses/bluebubbles")));
640
+ const result = await sendProactiveBlueBubblesMessageToSession({
641
+ friendId: request.friendId,
642
+ sessionKey: request.key,
643
+ text: request.content,
644
+ intent: request.intent,
645
+ authorizingSession: request.authorizingSession,
646
+ });
647
+ if (result.delivered) {
648
+ return {
649
+ status: "delivered_now",
650
+ detail: "sent to the active bluebubbles chat now",
651
+ };
652
+ }
653
+ if (result.reason === "missing_target") {
654
+ return {
655
+ status: "blocked",
656
+ detail: "bluebubbles could not resolve a routable target for that session",
657
+ };
658
+ }
659
+ if (result.reason === "send_error") {
660
+ return {
661
+ status: "failed",
662
+ detail: "bluebubbles send failed",
663
+ };
664
+ }
665
+ return {
666
+ status: "unavailable",
667
+ detail: "live delivery unavailable right now; queued for the next active turn",
668
+ };
669
+ },
670
+ teams: async (request) => {
671
+ if (!ctx?.botApi) {
672
+ return {
673
+ status: "unavailable",
674
+ detail: "live delivery unavailable right now; queued for the next active turn",
675
+ };
676
+ }
677
+ const { sendProactiveTeamsMessageToSession } = await Promise.resolve().then(() => __importStar(require("../senses/teams")));
678
+ const result = await sendProactiveTeamsMessageToSession({
679
+ friendId: request.friendId,
680
+ sessionKey: request.key,
681
+ text: request.content,
682
+ intent: request.intent,
683
+ authorizingSession: request.authorizingSession,
684
+ }, {
685
+ botApi: ctx.botApi,
686
+ });
687
+ if (result.delivered) {
688
+ return {
689
+ status: "delivered_now",
690
+ detail: "sent to the active teams chat now",
691
+ };
692
+ }
693
+ if (result.reason === "missing_target") {
694
+ return {
695
+ status: "blocked",
696
+ detail: "teams could not resolve a routable target for that session",
697
+ };
698
+ }
699
+ if (result.reason === "send_error") {
700
+ return {
701
+ status: "failed",
702
+ detail: "teams send failed",
703
+ };
704
+ }
705
+ return {
706
+ status: "unavailable",
707
+ detail: "live delivery unavailable right now; queued for the next active turn",
708
+ };
709
+ },
710
+ },
711
+ });
712
+ return renderCrossChatDeliveryStatus(`${friendId} on ${channel}/${key}`, deliveryResult);
713
+ },
714
+ },
715
+ {
716
+ tool: {
717
+ type: "function",
718
+ function: {
719
+ name: "set_reasoning_effort",
720
+ description: "adjust your own reasoning depth for subsequent turns. use higher effort for complex analysis, lower for simple tasks.",
721
+ parameters: {
722
+ type: "object",
723
+ properties: {
724
+ level: { type: "string", description: "the reasoning effort level to set" },
725
+ },
726
+ required: ["level"],
727
+ },
728
+ },
729
+ },
730
+ handler: (args, ctx) => {
731
+ if (!ctx?.supportedReasoningEfforts || !ctx.setReasoningEffort) {
732
+ return "reasoning effort adjustment is not available in this context.";
733
+ }
734
+ const level = (args.level || "").trim();
735
+ if (!ctx.supportedReasoningEfforts.includes(level)) {
736
+ return `invalid reasoning effort level "${level}". accepted levels: ${ctx.supportedReasoningEfforts.join(", ")}`;
737
+ }
738
+ ctx.setReasoningEffort(level);
739
+ (0, runtime_1.emitNervesEvent)({
740
+ component: "repertoire",
741
+ event: "repertoire.reasoning_effort_changed",
742
+ message: `reasoning effort set to ${level}`,
743
+ meta: { level },
744
+ });
745
+ return `reasoning effort set to "${level}".`;
746
+ },
747
+ requiredCapability: "reasoning-effort",
748
+ summaryKeys: ["level"],
749
+ },
750
+ ];