@ouro.bot/cli 0.1.0-alpha.62 → 0.1.0-alpha.637

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 (432) hide show
  1. package/README.md +127 -23
  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-broken-remote.md +63 -0
  6. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  7. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  8. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  9. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  12. package/changelog.json +4087 -13
  13. package/dist/arc/attention-types.js +8 -0
  14. package/dist/arc/cares.js +144 -0
  15. package/dist/arc/episodes.js +118 -0
  16. package/dist/arc/evolution.js +487 -0
  17. package/dist/arc/intentions.js +134 -0
  18. package/dist/arc/json-store.js +117 -0
  19. package/dist/arc/obligations.js +270 -0
  20. package/dist/arc/packets.js +288 -0
  21. package/dist/arc/presence.js +185 -0
  22. package/dist/arc/task-lifecycle.js +57 -0
  23. package/dist/heart/active-work.js +860 -43
  24. package/dist/heart/agent-entry.js +69 -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/bluebubbles.js +156 -0
  30. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  31. package/dist/heart/attachments/sources/index.js +16 -0
  32. package/dist/heart/attachments/store.js +103 -0
  33. package/dist/heart/attachments/types.js +93 -0
  34. package/dist/heart/auth/auth-flow.js +479 -0
  35. package/dist/heart/awaiting/await-alert.js +146 -0
  36. package/dist/heart/awaiting/await-expiry.js +108 -0
  37. package/dist/heart/awaiting/await-loader.js +91 -0
  38. package/dist/heart/awaiting/await-parser.js +141 -0
  39. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  40. package/dist/heart/awaiting/await-scheduler.js +377 -0
  41. package/dist/heart/background-operations.js +281 -0
  42. package/dist/heart/bridges/manager.js +137 -17
  43. package/dist/heart/bridges/store.js +14 -2
  44. package/dist/heart/bundle-state.js +168 -0
  45. package/dist/heart/commitments.js +135 -0
  46. package/dist/heart/config-registry.js +322 -0
  47. package/dist/heart/config.js +114 -119
  48. package/dist/heart/core.js +1028 -248
  49. package/dist/heart/cross-chat-delivery.js +3 -18
  50. package/dist/heart/daemon/agent-config-check.js +419 -0
  51. package/dist/heart/daemon/agent-discovery.js +102 -3
  52. package/dist/heart/daemon/agent-service.js +522 -0
  53. package/dist/heart/daemon/agentic-repair.js +547 -0
  54. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  55. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  56. package/dist/heart/daemon/cadence.js +70 -0
  57. package/dist/heart/daemon/cli-defaults.js +776 -0
  58. package/dist/heart/daemon/cli-desk.js +322 -0
  59. package/dist/heart/daemon/cli-exec.js +7468 -0
  60. package/dist/heart/daemon/cli-help.js +505 -0
  61. package/dist/heart/daemon/cli-parse.js +1554 -0
  62. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  63. package/dist/heart/daemon/cli-render.js +763 -0
  64. package/dist/heart/daemon/cli-types.js +8 -0
  65. package/dist/heart/daemon/connect-bay.js +323 -0
  66. package/dist/heart/daemon/daemon-cli.js +29 -1700
  67. package/dist/heart/daemon/daemon-entry.js +485 -2
  68. package/dist/heart/daemon/daemon-health.js +176 -0
  69. package/dist/heart/daemon/daemon-rollup.js +57 -0
  70. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  71. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  72. package/dist/heart/daemon/daemon.js +906 -71
  73. package/dist/heart/daemon/dns-workflow.js +394 -0
  74. package/dist/heart/daemon/doctor-types.js +8 -0
  75. package/dist/heart/daemon/doctor.js +873 -0
  76. package/dist/heart/daemon/health-monitor.js +122 -1
  77. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  78. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  79. package/dist/heart/daemon/http-health-probe.js +80 -0
  80. package/dist/heart/daemon/human-command-screens.js +234 -0
  81. package/dist/heart/daemon/human-readiness.js +114 -0
  82. package/dist/heart/daemon/inner-status.js +89 -0
  83. package/dist/heart/daemon/interactive-repair.js +394 -0
  84. package/dist/heart/daemon/launchd.js +37 -8
  85. package/dist/heart/daemon/log-tailer.js +79 -10
  86. package/dist/heart/daemon/logs-prune.js +110 -0
  87. package/dist/heart/daemon/mcp-canary.js +297 -0
  88. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  89. package/dist/heart/daemon/os-cron-deps.js +135 -0
  90. package/dist/heart/daemon/os-cron.js +14 -12
  91. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  92. package/dist/heart/daemon/ouro-entry.js +3 -1
  93. package/dist/heart/daemon/plugin-cli.js +432 -0
  94. package/dist/heart/daemon/process-manager.js +501 -35
  95. package/dist/heart/daemon/provider-discovery.js +137 -0
  96. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  97. package/dist/heart/daemon/pulse.js +475 -0
  98. package/dist/heart/daemon/readiness-repair.js +365 -0
  99. package/dist/heart/daemon/run-hooks.js +2 -0
  100. package/dist/heart/daemon/runtime-logging.js +11 -3
  101. package/dist/heart/daemon/runtime-metadata.js +2 -30
  102. package/dist/heart/daemon/safe-mode.js +161 -0
  103. package/dist/heart/daemon/sense-manager.js +493 -38
  104. package/dist/heart/daemon/session-id-resolver.js +131 -0
  105. package/dist/heart/daemon/skill-management-installer.js +22 -9
  106. package/dist/heart/daemon/socket-client.js +158 -11
  107. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  108. package/dist/heart/daemon/startup-tui.js +330 -0
  109. package/dist/heart/daemon/task-scheduler.js +117 -39
  110. package/dist/heart/daemon/terminal-ui.js +499 -0
  111. package/dist/heart/daemon/thoughts.js +229 -17
  112. package/dist/heart/daemon/up-progress.js +366 -0
  113. package/dist/heart/daemon/vault-items.js +56 -0
  114. package/dist/heart/delegation.js +1 -4
  115. package/dist/heart/habits/habit-migration.js +189 -0
  116. package/dist/heart/habits/habit-parser.js +140 -0
  117. package/dist/heart/habits/habit-runtime-state.js +100 -0
  118. package/dist/heart/habits/habit-scheduler.js +372 -0
  119. package/dist/heart/{daemon → hatch}/hatch-flow.js +32 -56
  120. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  121. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  122. package/dist/heart/{daemon → hatch}/specialist-tools.js +37 -14
  123. package/dist/heart/identity.js +168 -57
  124. package/dist/heart/kept-notes.js +357 -0
  125. package/dist/heart/kicks.js +1 -1
  126. package/dist/heart/machine-identity.js +161 -0
  127. package/dist/heart/mail-import-discovery.js +353 -0
  128. package/dist/heart/mailbox/mailbox-http-hooks.js +66 -0
  129. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  130. package/dist/heart/mailbox/mailbox-http-routes.js +246 -0
  131. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  132. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  133. package/dist/heart/mailbox/mailbox-http.js +99 -0
  134. package/dist/heart/mailbox/mailbox-read.js +31 -0
  135. package/dist/heart/mailbox/mailbox-types.js +27 -0
  136. package/dist/heart/mailbox/mailbox-view.js +197 -0
  137. package/dist/heart/mailbox/readers/agent-machine.js +418 -0
  138. package/dist/heart/mailbox/readers/continuity-readers.js +319 -0
  139. package/dist/heart/mailbox/readers/mail.js +375 -0
  140. package/dist/heart/mailbox/readers/runtime-readers.js +756 -0
  141. package/dist/heart/mailbox/readers/sessions.js +232 -0
  142. package/dist/heart/mailbox/readers/shared.js +111 -0
  143. package/dist/heart/mcp/mcp-server.js +692 -0
  144. package/dist/heart/migrate-config.js +100 -0
  145. package/dist/heart/model-capabilities.js +19 -0
  146. package/dist/heart/orientation-frame.js +217 -0
  147. package/dist/heart/platform.js +81 -0
  148. package/dist/heart/provider-attempt.js +134 -0
  149. package/dist/heart/provider-binding-resolver.js +272 -0
  150. package/dist/heart/provider-credentials.js +425 -0
  151. package/dist/heart/provider-failover.js +301 -0
  152. package/dist/heart/provider-models.js +81 -0
  153. package/dist/heart/provider-ping.js +262 -0
  154. package/dist/heart/provider-readiness-cache.js +40 -0
  155. package/dist/heart/provider-visibility.js +188 -0
  156. package/dist/heart/providers/anthropic-token.js +131 -0
  157. package/dist/heart/providers/anthropic.js +139 -52
  158. package/dist/heart/providers/azure.js +23 -11
  159. package/dist/heart/providers/error-classification.js +127 -0
  160. package/dist/heart/providers/github-copilot.js +145 -0
  161. package/dist/heart/providers/minimax-vlm.js +189 -0
  162. package/dist/heart/providers/minimax.js +26 -8
  163. package/dist/heart/providers/openai-codex.js +55 -40
  164. package/dist/heart/runtime-capability-check.js +170 -0
  165. package/dist/heart/runtime-credentials.js +367 -0
  166. package/dist/heart/runtime-cwd.js +87 -0
  167. package/dist/heart/sense-truth.js +13 -4
  168. package/dist/heart/session-activity.js +48 -24
  169. package/dist/heart/session-events.js +1163 -0
  170. package/dist/heart/session-playback-cli-main.js +5 -0
  171. package/dist/heart/session-playback-cli.js +36 -0
  172. package/dist/heart/session-playback.js +231 -0
  173. package/dist/heart/session-stats-cli-main.js +5 -0
  174. package/dist/heart/session-stats.js +182 -0
  175. package/dist/heart/session-transcript.js +133 -0
  176. package/dist/heart/start-of-turn-packet.js +345 -0
  177. package/dist/heart/streaming.js +44 -27
  178. package/dist/heart/structured-output.js +196 -0
  179. package/dist/heart/sync-classification.js +176 -0
  180. package/dist/heart/sync.js +449 -0
  181. package/dist/heart/target-resolution.js +9 -5
  182. package/dist/heart/tempo.js +93 -0
  183. package/dist/heart/temporal-view.js +41 -0
  184. package/dist/heart/timeouts.js +101 -0
  185. package/dist/heart/tool-activity-callbacks.js +59 -0
  186. package/dist/heart/tool-description.js +143 -0
  187. package/dist/heart/tool-friction.js +55 -0
  188. package/dist/heart/tool-loop.js +200 -0
  189. package/dist/heart/turn-context.js +389 -0
  190. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  191. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  192. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  193. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  194. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  195. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  196. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  197. package/dist/mailbox-ui/assets/index-9-AxCxuB.js +61 -0
  198. package/dist/mailbox-ui/assets/index-CWzt267f.css +1 -0
  199. package/dist/mailbox-ui/index.html +15 -0
  200. package/dist/mailroom/attention.js +167 -0
  201. package/dist/mailroom/autonomy.js +209 -0
  202. package/dist/mailroom/blob-store.js +715 -0
  203. package/dist/mailroom/body-cache.js +61 -0
  204. package/dist/mailroom/core.js +788 -0
  205. package/dist/mailroom/entry.js +160 -0
  206. package/dist/mailroom/file-store.js +568 -0
  207. package/dist/mailroom/mbox-import.js +393 -0
  208. package/dist/mailroom/migration.js +164 -0
  209. package/dist/mailroom/outbound.js +380 -0
  210. package/dist/mailroom/policy.js +263 -0
  211. package/dist/mailroom/reader.js +233 -0
  212. package/dist/mailroom/search-cache.js +334 -0
  213. package/dist/mailroom/search-relevance.js +319 -0
  214. package/dist/mailroom/smtp-ingress.js +176 -0
  215. package/dist/mailroom/source-state.js +176 -0
  216. package/dist/mailroom/thread.js +109 -0
  217. package/dist/mailroom/travel-extract.js +89 -0
  218. package/dist/mind/bundle-manifest.js +14 -1
  219. package/dist/mind/context.js +251 -101
  220. package/dist/mind/desk-section.js +310 -0
  221. package/dist/mind/diary-integrity.js +60 -0
  222. package/dist/mind/{memory.js → diary.js} +68 -76
  223. package/dist/mind/embedding-provider.js +60 -0
  224. package/dist/mind/file-state.js +179 -0
  225. package/dist/mind/friends/channel.js +39 -0
  226. package/dist/mind/friends/resolver.js +54 -2
  227. package/dist/mind/friends/store-file.js +48 -4
  228. package/dist/mind/friends/types.js +2 -2
  229. package/dist/mind/journal-index.js +162 -0
  230. package/dist/mind/note-search.js +268 -0
  231. package/dist/mind/obligation-steering.js +221 -0
  232. package/dist/mind/pending.js +6 -1
  233. package/dist/mind/prompt-refresh.js +3 -2
  234. package/dist/mind/prompt.js +1075 -146
  235. package/dist/mind/provenance-trust.js +26 -0
  236. package/dist/mind/scrutiny.js +173 -0
  237. package/dist/nerves/cli-logging.js +7 -1
  238. package/dist/nerves/coverage/audit-rules.js +15 -6
  239. package/dist/nerves/coverage/audit.js +28 -2
  240. package/dist/nerves/coverage/cli.js +1 -1
  241. package/dist/nerves/coverage/contract.js +5 -5
  242. package/dist/nerves/coverage/file-completeness.js +139 -5
  243. package/dist/nerves/event-buffer.js +111 -0
  244. package/dist/nerves/index.js +224 -4
  245. package/dist/nerves/observation.js +20 -0
  246. package/dist/nerves/redact.js +79 -0
  247. package/dist/nerves/review/cli-main.js +5 -0
  248. package/dist/nerves/review/cli.js +156 -0
  249. package/dist/nerves/review/core.js +152 -0
  250. package/dist/nerves/runtime.js +5 -1
  251. package/dist/repertoire/ado-client.js +15 -56
  252. package/dist/repertoire/ado-semantic.js +16 -10
  253. package/dist/repertoire/api-client.js +97 -0
  254. package/dist/repertoire/bitwarden-store.js +1040 -0
  255. package/dist/repertoire/bundle-templates.js +72 -0
  256. package/dist/repertoire/bw-installer.js +180 -0
  257. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  258. package/dist/repertoire/coding/context-pack.js +331 -0
  259. package/dist/repertoire/coding/feedback.js +197 -30
  260. package/dist/repertoire/coding/manager.js +166 -10
  261. package/dist/repertoire/coding/spawner.js +55 -9
  262. package/dist/repertoire/coding/tools.js +219 -7
  263. package/dist/repertoire/commerce-errors.js +109 -0
  264. package/dist/repertoire/commerce-self-test.js +156 -0
  265. package/dist/repertoire/credential-access.js +178 -0
  266. package/dist/repertoire/desk/classifier.js +362 -0
  267. package/dist/repertoire/duffel-client.js +185 -0
  268. package/dist/repertoire/github-client.js +14 -55
  269. package/dist/repertoire/graph-client.js +11 -52
  270. package/dist/repertoire/guardrails.js +385 -0
  271. package/dist/repertoire/mcp-client.js +295 -0
  272. package/dist/repertoire/mcp-manager.js +403 -0
  273. package/dist/repertoire/mcp-tools.js +83 -0
  274. package/dist/repertoire/plugin-mcp.js +175 -0
  275. package/dist/repertoire/plugins.js +253 -0
  276. package/dist/repertoire/shell-sessions.js +133 -0
  277. package/dist/repertoire/skills.js +48 -4
  278. package/dist/repertoire/stripe-client.js +131 -0
  279. package/dist/repertoire/tool-results.js +29 -0
  280. package/dist/repertoire/tools-attachments.js +317 -0
  281. package/dist/repertoire/tools-awaiting.js +372 -0
  282. package/dist/repertoire/tools-base.js +59 -1082
  283. package/dist/repertoire/tools-bluebubbles.js +2 -0
  284. package/dist/repertoire/tools-bridge.js +144 -0
  285. package/dist/repertoire/tools-bundle.js +993 -0
  286. package/dist/repertoire/tools-config.js +186 -0
  287. package/dist/repertoire/tools-continuity.js +252 -0
  288. package/dist/repertoire/tools-credential.js +383 -0
  289. package/dist/repertoire/tools-evolution.js +527 -0
  290. package/dist/repertoire/tools-files.js +344 -0
  291. package/dist/repertoire/tools-flight.js +227 -0
  292. package/dist/repertoire/tools-flow.js +119 -0
  293. package/dist/repertoire/tools-github.js +3 -8
  294. package/dist/repertoire/tools-mail.js +1975 -0
  295. package/dist/repertoire/tools-notes.js +438 -0
  296. package/dist/repertoire/tools-obligations.js +143 -0
  297. package/dist/repertoire/tools-orientation.js +31 -0
  298. package/dist/repertoire/tools-record.js +464 -0
  299. package/dist/repertoire/tools-runtime.js +150 -0
  300. package/dist/repertoire/tools-session.js +766 -0
  301. package/dist/repertoire/tools-shell.js +120 -0
  302. package/dist/repertoire/tools-stripe.js +182 -0
  303. package/dist/repertoire/tools-surface.js +344 -0
  304. package/dist/repertoire/tools-teams.js +12 -39
  305. package/dist/repertoire/tools-travel.js +125 -0
  306. package/dist/repertoire/tools-trip.js +982 -0
  307. package/dist/repertoire/tools-user-profile.js +146 -0
  308. package/dist/repertoire/tools-vault.js +40 -0
  309. package/dist/repertoire/tools-voice.js +145 -0
  310. package/dist/repertoire/tools.js +215 -103
  311. package/dist/repertoire/travel-api-client.js +360 -0
  312. package/dist/repertoire/user-profile.js +131 -0
  313. package/dist/repertoire/vault-setup.js +246 -0
  314. package/dist/repertoire/vault-unlock.js +594 -0
  315. package/dist/scripts/claude-code-hook.js +41 -0
  316. package/dist/scripts/claude-code-stop-hook.js +47 -0
  317. package/dist/senses/attention-queue.js +186 -0
  318. package/dist/senses/await-turn-message.js +58 -0
  319. package/dist/senses/bluebubbles/active-turns.js +216 -0
  320. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  321. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  322. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  323. package/dist/senses/bluebubbles/entry.js +77 -0
  324. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  325. package/dist/senses/bluebubbles/index.js +2737 -0
  326. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  327. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  328. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  329. package/dist/senses/bluebubbles/processed-log.js +133 -0
  330. package/dist/senses/bluebubbles/replay.js +137 -0
  331. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  332. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  333. package/dist/senses/bluebubbles-meta-guard.js +40 -0
  334. package/dist/senses/cli/bracketed-paste.js +82 -0
  335. package/dist/senses/cli/image-paste.js +287 -0
  336. package/dist/senses/cli/image-ref-navigation.js +75 -0
  337. package/dist/senses/cli/ink-app.js +156 -0
  338. package/dist/senses/cli/inline-diff.js +64 -0
  339. package/dist/senses/cli/input-keys.js +174 -0
  340. package/dist/senses/cli/kill-ring.js +86 -0
  341. package/dist/senses/cli/message-list.js +51 -0
  342. package/dist/senses/cli/ouro-tui.js +607 -0
  343. package/dist/senses/cli/spinner-imperative.js +135 -0
  344. package/dist/senses/cli/spinner.js +101 -0
  345. package/dist/senses/cli/status-line.js +60 -0
  346. package/dist/senses/cli/streaming-markdown.js +526 -0
  347. package/dist/senses/cli/tool-display.js +85 -0
  348. package/dist/senses/cli/tool-render.js +85 -0
  349. package/dist/senses/cli/tui-store.js +240 -0
  350. package/dist/senses/cli/virtual-list.js +35 -0
  351. package/dist/senses/cli-entry.js +60 -8
  352. package/dist/senses/cli-layout.js +100 -0
  353. package/dist/senses/cli.js +517 -204
  354. package/dist/senses/commands.js +66 -3
  355. package/dist/senses/habit-turn-message.js +108 -0
  356. package/dist/senses/inner-dialog-worker.js +254 -22
  357. package/dist/senses/inner-dialog.js +505 -40
  358. package/dist/senses/mail-entry.js +66 -0
  359. package/dist/senses/mail.js +379 -0
  360. package/dist/senses/pipeline.js +666 -181
  361. package/dist/senses/proactive-content-guard.js +51 -0
  362. package/dist/senses/shared-turn.js +393 -0
  363. package/dist/senses/surface-tool.js +108 -0
  364. package/dist/senses/teams-entry.js +60 -8
  365. package/dist/senses/teams.js +388 -98
  366. package/dist/senses/trust-gate.js +100 -5
  367. package/dist/senses/voice/audio-playback.js +237 -0
  368. package/dist/senses/voice/audio-routing.js +119 -0
  369. package/dist/senses/voice/elevenlabs.js +202 -0
  370. package/dist/senses/voice/floor-control.js +431 -0
  371. package/dist/senses/voice/floor-controller.js +115 -0
  372. package/dist/senses/voice/golden-path.js +116 -0
  373. package/dist/senses/voice/index.js +29 -0
  374. package/dist/senses/voice/meeting.js +113 -0
  375. package/dist/senses/voice/outbound.js +190 -0
  376. package/dist/senses/voice/phone.js +33 -0
  377. package/dist/senses/voice/playback.js +139 -0
  378. package/dist/senses/voice/realtime-eval.js +496 -0
  379. package/dist/senses/voice/realtime-trace.js +531 -0
  380. package/dist/senses/voice/transcript.js +70 -0
  381. package/dist/senses/voice/turn.js +191 -0
  382. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  383. package/dist/senses/voice/twilio-phone.js +5079 -0
  384. package/dist/senses/voice/types.js +2 -0
  385. package/dist/senses/voice/whisper.js +161 -0
  386. package/dist/senses/voice-entry.js +81 -0
  387. package/dist/senses/voice-realtime-eval-command.js +99 -0
  388. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  389. package/dist/senses/voice-twilio-entry.js +87 -0
  390. package/dist/trips/core.js +138 -0
  391. package/dist/trips/store.js +265 -0
  392. package/dist/util/frontmatter.js +53 -0
  393. package/package.json +48 -8
  394. package/skills/agent-commerce.md +106 -0
  395. package/skills/browser-navigation.md +117 -0
  396. package/skills/commerce-setup-guide.md +116 -0
  397. package/skills/commerce-setup.md +84 -0
  398. package/skills/configure-dev-tools.md +99 -0
  399. package/skills/travel-planning.md +138 -0
  400. package/dist/heart/daemon/auth-flow.js +0 -351
  401. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  402. package/dist/heart/safe-workspace.js +0 -228
  403. package/dist/heart/session-recall.js +0 -116
  404. package/dist/mind/associative-recall.js +0 -209
  405. package/dist/repertoire/tasks/board.js +0 -134
  406. package/dist/repertoire/tasks/index.js +0 -224
  407. package/dist/repertoire/tasks/lifecycle.js +0 -80
  408. package/dist/repertoire/tasks/middleware.js +0 -65
  409. package/dist/repertoire/tasks/parser.js +0 -173
  410. package/dist/repertoire/tasks/scanner.js +0 -132
  411. package/dist/repertoire/tasks/transitions.js +0 -144
  412. package/dist/senses/bluebubbles-entry.js +0 -13
  413. package/dist/senses/bluebubbles.js +0 -1177
  414. package/dist/senses/debug-activity.js +0 -148
  415. package/subagents/README.md +0 -7
  416. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  417. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  418. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  419. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  420. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  421. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  422. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  423. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  424. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  425. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  426. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  427. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  428. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  429. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  430. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  431. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  432. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,692 @@
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._senseTurnCommandTimeoutMs = exports._senseTurnRetryDelays = exports.SENSE_TURN_COMMAND_TIMEOUT_MS = exports.SENSE_TURN_RETRY_DELAYS_MS = exports.SENSE_TURN_MAX_RETRIES = void 0;
37
+ exports._setSenseTurnRetryDelays = _setSenseTurnRetryDelays;
38
+ exports._setSenseTurnCommandTimeoutMs = _setSenseTurnCommandTimeoutMs;
39
+ exports.createMcpServer = createMcpServer;
40
+ exports.getToolSchemas = getToolSchemas;
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const socket_client_1 = require("../daemon/socket-client");
44
+ const agentService = __importStar(require("../daemon/agent-service"));
45
+ const identity_1 = require("../identity");
46
+ const runtime_1 = require("../../nerves/runtime");
47
+ const session_id_resolver_1 = require("../daemon/session-id-resolver");
48
+ const pending_1 = require("../../mind/pending");
49
+ exports.SENSE_TURN_MAX_RETRIES = 3;
50
+ exports.SENSE_TURN_RETRY_DELAYS_MS = [1000, 2000, 4000];
51
+ exports.SENSE_TURN_COMMAND_TIMEOUT_MS = 10 * 60 * 1000;
52
+ // Allow test override
53
+ exports._senseTurnRetryDelays = exports.SENSE_TURN_RETRY_DELAYS_MS;
54
+ function _setSenseTurnRetryDelays(delays) { exports._senseTurnRetryDelays = delays; }
55
+ exports._senseTurnCommandTimeoutMs = exports.SENSE_TURN_COMMAND_TIMEOUT_MS;
56
+ function _setSenseTurnCommandTimeoutMs(timeoutMs) { exports._senseTurnCommandTimeoutMs = timeoutMs; }
57
+ async function withSenseTurnTimeout(promise, timeoutMs, command) {
58
+ let timer = null;
59
+ try {
60
+ return await Promise.race([
61
+ promise,
62
+ new Promise((_, reject) => {
63
+ timer = setTimeout(() => {
64
+ const error = new Error(`MCP conversation turn for ${command.agent} timed out after ${timeoutMs}ms waiting for daemon response; command status is unknown.`);
65
+ (0, runtime_1.emitNervesEvent)({
66
+ level: "error",
67
+ component: "daemon",
68
+ event: "daemon.mcp_sense_turn_timeout",
69
+ message: "MCP senseTurn timed out waiting for daemon response",
70
+ meta: { agent: command.agent, friendId: command.friendId, sessionKey: command.sessionKey, timeoutMs },
71
+ });
72
+ reject(error);
73
+ }, timeoutMs);
74
+ }),
75
+ ]);
76
+ }
77
+ finally {
78
+ /* v8 ignore next -- Promise.race installs the timer synchronously; null is only a defensive cleanup guard @preserve */
79
+ if (timer)
80
+ clearTimeout(timer);
81
+ }
82
+ }
83
+ /**
84
+ * Send a senseTurn command to the daemon with retry logic.
85
+ * Retries on transient failures: empty response (daemon mid-restart),
86
+ * ECONNREFUSED (daemon not yet listening), ENOENT (socket not yet created).
87
+ */
88
+ async function sendSenseTurnWithRetry(socketPath, command) {
89
+ let lastError = null;
90
+ /* v8 ignore start -- retry loop: functionally tested via mcp-send-message retry tests @preserve */
91
+ for (let attempt = 0; attempt <= exports.SENSE_TURN_MAX_RETRIES; attempt++) {
92
+ try {
93
+ const response = await withSenseTurnTimeout((0, socket_client_1.sendDaemonCommand)(socketPath, command), exports._senseTurnCommandTimeoutMs, command);
94
+ return response;
95
+ }
96
+ catch (error) {
97
+ lastError = error instanceof Error ? error : new Error(String(error));
98
+ const msg = lastError.message;
99
+ const isTransient = msg.includes("ECONNREFUSED")
100
+ || msg.includes("ENOENT")
101
+ || msg.includes("empty response")
102
+ || msg.includes("Empty response");
103
+ if (!isTransient || attempt >= exports.SENSE_TURN_MAX_RETRIES) {
104
+ throw lastError;
105
+ }
106
+ const delay = exports._senseTurnRetryDelays[attempt] ?? 4000;
107
+ (0, runtime_1.emitNervesEvent)({
108
+ component: "daemon",
109
+ event: "daemon.mcp_sense_turn_retry",
110
+ message: `senseTurn attempt ${attempt + 1} failed, retrying in ${delay}ms`,
111
+ meta: { attempt: attempt + 1, error: msg, delay },
112
+ });
113
+ await new Promise((resolve) => setTimeout(resolve, delay));
114
+ }
115
+ }
116
+ throw lastError ?? new Error("senseTurn failed after retries");
117
+ /* v8 ignore stop */
118
+ }
119
+ /**
120
+ * Maps MCP tool names to daemon command kinds.
121
+ */
122
+ const TOOL_TO_COMMAND = {
123
+ status: "agent.status",
124
+ catchup: "agent.catchup",
125
+ get_context: "agent.getContext",
126
+ search_notes: "agent.searchNotes",
127
+ get_task: "agent.getTask",
128
+ };
129
+ const UUID_PREFIX_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-/i;
130
+ function canonicalizeMcpFriendId(agent, rawFriendId) {
131
+ if (UUID_PREFIX_RE.test(rawFriendId))
132
+ return rawFriendId;
133
+ const localExternalId = rawFriendId.startsWith("local-")
134
+ ? rawFriendId.slice("local-".length)
135
+ : rawFriendId;
136
+ try {
137
+ const friendsDir = path.join((0, identity_1.getAgentRoot)(agent), "friends");
138
+ const friendFiles = fs.readdirSync(friendsDir).filter((entry) => entry.endsWith(".json"));
139
+ for (const file of friendFiles) {
140
+ const raw = fs.readFileSync(path.join(friendsDir, file), "utf-8");
141
+ const record = JSON.parse(raw);
142
+ if (!record.id)
143
+ continue;
144
+ if (record.id === rawFriendId || record.name?.toLowerCase() === rawFriendId.toLowerCase()) {
145
+ return record.id;
146
+ }
147
+ const localMatch = record.externalIds?.some((externalId) => externalId.provider === "local"
148
+ && (externalId.externalId === rawFriendId
149
+ || externalId.externalId === localExternalId
150
+ || externalId.externalId?.startsWith(`${localExternalId}@`)));
151
+ if (localMatch)
152
+ return record.id;
153
+ }
154
+ }
155
+ catch {
156
+ // Best effort only. If the bundle is unreadable, preserve the explicit id.
157
+ }
158
+ return rawFriendId;
159
+ }
160
+ /**
161
+ * Create an MCP server that speaks JSON-RPC 2.0 over stdio.
162
+ * Handles initialize, initialized, tools/list, and tools/call.
163
+ * Forwards tool calls to the daemon via Unix socket.
164
+ */
165
+ function createMcpServer(options) {
166
+ const { agent, socketPath, stdin, stdout } = options;
167
+ const rawFriendId = options.friendId;
168
+ const friendId = canonicalizeMcpFriendId(agent, rawFriendId);
169
+ let buffer = "";
170
+ let running = false;
171
+ let useContentLengthFraming = true; // default to Content-Length, auto-detect from first message
172
+ // Resolve session ID once per MCP server instance for conversation continuity
173
+ const sessionId = (0, session_id_resolver_1.resolveSessionId)();
174
+ function writeResponse(response) {
175
+ const body = JSON.stringify(response);
176
+ if (useContentLengthFraming) {
177
+ const header = `Content-Length: ${Buffer.byteLength(body)}\r\n\r\n`;
178
+ stdout.write(header + body);
179
+ }
180
+ else {
181
+ stdout.write(body + "\n");
182
+ }
183
+ }
184
+ function tryParseContentLength() {
185
+ const headerEnd = buffer.indexOf("\r\n\r\n");
186
+ /* v8 ignore start -- partial header delivery only in real I/O */
187
+ if (headerEnd === -1)
188
+ return false;
189
+ /* v8 ignore stop */
190
+ const headerSection = buffer.slice(0, headerEnd);
191
+ const contentLengthMatch = headerSection.match(/Content-Length:\s*(\d+)/i);
192
+ if (!contentLengthMatch) {
193
+ buffer = buffer.slice(headerEnd + 4);
194
+ return true; // consumed invalid header, try again
195
+ }
196
+ const contentLength = parseInt(contentLengthMatch[1], 10);
197
+ const bodyStart = headerEnd + 4;
198
+ /* v8 ignore start -- partial body delivery only in real I/O */
199
+ if (buffer.length < bodyStart + contentLength)
200
+ return false;
201
+ /* v8 ignore stop */
202
+ const body = buffer.slice(bodyStart, bodyStart + contentLength);
203
+ buffer = buffer.slice(bodyStart + contentLength);
204
+ parseAndDispatch(body);
205
+ return true;
206
+ }
207
+ function tryParseNewlineDelimited() {
208
+ const newlineIdx = buffer.indexOf("\n");
209
+ /* v8 ignore start -- partial line delivery only in real I/O */
210
+ if (newlineIdx === -1)
211
+ return false;
212
+ /* v8 ignore stop */
213
+ const line = buffer.slice(0, newlineIdx).trim();
214
+ buffer = buffer.slice(newlineIdx + 1);
215
+ if (line.length === 0)
216
+ return true; // skip blank lines
217
+ parseAndDispatch(line);
218
+ return true;
219
+ }
220
+ function parseAndDispatch(body) {
221
+ let request;
222
+ try {
223
+ request = JSON.parse(body);
224
+ }
225
+ catch {
226
+ writeResponse({
227
+ jsonrpc: "2.0",
228
+ id: null,
229
+ error: { code: -32700, message: "Parse error" },
230
+ });
231
+ return;
232
+ }
233
+ void handleRequest(request);
234
+ }
235
+ let framingDetected = false;
236
+ function handleData(chunk) {
237
+ buffer += chunk.toString("utf-8");
238
+ // Auto-detect framing from first message and mirror it in responses
239
+ if (!framingDetected && buffer.length > 0) {
240
+ useContentLengthFraming = buffer.startsWith("Content-Length:");
241
+ framingDetected = true;
242
+ }
243
+ // Support both Content-Length framing (Claude Code) and newline-delimited JSON (Codex)
244
+ while (buffer.length > 0) {
245
+ const hasContentLength = buffer.startsWith("Content-Length:");
246
+ const parsed = hasContentLength ? tryParseContentLength() : tryParseNewlineDelimited();
247
+ /* v8 ignore start -- break on partial message only in real I/O */
248
+ if (!parsed)
249
+ break;
250
+ /* v8 ignore stop */
251
+ }
252
+ }
253
+ async function handleRequest(request) {
254
+ (0, runtime_1.emitNervesEvent)({
255
+ component: "daemon",
256
+ event: "daemon.mcp_request_start",
257
+ message: "handling MCP request",
258
+ meta: { method: request.method, agent },
259
+ });
260
+ // Notifications (no id) don't get responses
261
+ if (request.id === undefined) {
262
+ (0, runtime_1.emitNervesEvent)({
263
+ component: "daemon",
264
+ event: "daemon.mcp_request_end",
265
+ message: "handled MCP notification",
266
+ meta: { method: request.method, agent },
267
+ });
268
+ return;
269
+ }
270
+ switch (request.method) {
271
+ case "initialize":
272
+ await handleInitialize(request);
273
+ break;
274
+ case "tools/list":
275
+ handleToolsList(request);
276
+ break;
277
+ case "tools/call":
278
+ await handleToolsCall(request);
279
+ break;
280
+ default:
281
+ writeResponse({
282
+ jsonrpc: "2.0",
283
+ id: request.id,
284
+ error: {
285
+ code: -32601,
286
+ message: `Method not found: ${request.method}`,
287
+ },
288
+ });
289
+ break;
290
+ }
291
+ (0, runtime_1.emitNervesEvent)({
292
+ component: "daemon",
293
+ event: "daemon.mcp_request_end",
294
+ message: "completed MCP request",
295
+ meta: { method: request.method, agent },
296
+ });
297
+ }
298
+ async function handleInitialize(request) {
299
+ // MCP server works standalone (agent-service reads filesystem directly)
300
+ // Daemon is optional — only needed for commands without a direct service handler
301
+ writeResponse({
302
+ jsonrpc: "2.0",
303
+ id: request.id,
304
+ result: {
305
+ protocolVersion: "2024-11-05",
306
+ serverInfo: {
307
+ name: "ouro-mcp-server",
308
+ version: "0.1.0",
309
+ },
310
+ capabilities: {
311
+ tools: { listChanged: false },
312
+ },
313
+ },
314
+ });
315
+ }
316
+ function handleToolsList(request) {
317
+ const tools = getToolSchemas();
318
+ writeResponse({
319
+ jsonrpc: "2.0",
320
+ id: request.id,
321
+ result: { tools },
322
+ });
323
+ }
324
+ /** Map tool name → agent-service handler function name */
325
+ const TOOL_TO_SERVICE = {
326
+ status: "handleAgentStatus",
327
+ catchup: "handleAgentCatchup",
328
+ get_context: "handleAgentGetContext",
329
+ search_notes: "handleAgentSearchNotes",
330
+ get_task: "handleAgentGetTask",
331
+ };
332
+ function stringArg(args, key) {
333
+ const value = args[key];
334
+ return typeof value === "string" ? value : "";
335
+ }
336
+ /* v8 ignore start -- MCP conversation-message shaping is covered by individual tool routing tests; sparse option variants are defensive copy formatting @preserve */
337
+ function buildConversationMessage(toolName, toolArgs) {
338
+ switch (toolName) {
339
+ case "send_message":
340
+ return stringArg(toolArgs, "message");
341
+ case "ask":
342
+ return stringArg(toolArgs, "question");
343
+ case "delegate": {
344
+ const task = stringArg(toolArgs, "task");
345
+ const context = stringArg(toolArgs, "context");
346
+ return context ? `[delegate] ${task}\n\ncontext: ${context}` : `[delegate] ${task}`;
347
+ }
348
+ case "request_decision": {
349
+ const topic = stringArg(toolArgs, "topic");
350
+ const options = stringArg(toolArgs, "options");
351
+ return options ? `[request_decision] ${topic}\n\noptions: ${options}` : `[request_decision] ${topic}`;
352
+ }
353
+ case "check_scope":
354
+ return `[check_scope] ${stringArg(toolArgs, "item")}`;
355
+ case "check_guidance":
356
+ return `[check_guidance] ${stringArg(toolArgs, "topic")}`;
357
+ case "report_progress":
358
+ return `[report_progress] ${stringArg(toolArgs, "summary")}`;
359
+ case "report_blocker":
360
+ return `[report_blocker] ${stringArg(toolArgs, "blocker")}`;
361
+ case "report_complete":
362
+ return `[report_complete] ${stringArg(toolArgs, "summary")}`;
363
+ default:
364
+ return null;
365
+ }
366
+ }
367
+ /* v8 ignore stop */
368
+ async function runConversationTool(request, message) {
369
+ try {
370
+ const response = await sendSenseTurnWithRetry(socketPath, {
371
+ kind: "agent.senseTurn",
372
+ agent,
373
+ friendId,
374
+ channel: "mcp",
375
+ sessionKey: sessionId,
376
+ message,
377
+ });
378
+ /* v8 ignore next -- branch: ?? fallback for empty daemon response @preserve */
379
+ const text = response.message ?? "(empty response)";
380
+ writeResponse({
381
+ jsonrpc: "2.0",
382
+ id: request.id,
383
+ result: {
384
+ content: [{ type: "text", text }],
385
+ isError: !response.ok,
386
+ },
387
+ });
388
+ }
389
+ catch (error) {
390
+ /* v8 ignore start — instanceof guard defensive; thrown errors are always Error */
391
+ const errorMessage = error instanceof Error ? error.message : String(error);
392
+ /* v8 ignore stop */
393
+ /* v8 ignore start -- daemon-down detection: only triggers with real socket I/O @preserve */
394
+ const isDaemonDown = errorMessage.includes("ECONNREFUSED") || errorMessage.includes("ENOENT");
395
+ const userMessage = isDaemonDown
396
+ ? "The daemon is not running. Start it with `ouro up` (production) or `ouro dev` (development), then retry."
397
+ : `Error: ${errorMessage}`;
398
+ /* v8 ignore stop */
399
+ writeResponse({
400
+ jsonrpc: "2.0",
401
+ id: request.id,
402
+ result: {
403
+ content: [{ type: "text", text: userMessage }],
404
+ isError: true,
405
+ },
406
+ });
407
+ }
408
+ }
409
+ async function handleToolsCall(request) {
410
+ /* v8 ignore start — ?? fallbacks are defensive; MCP clients always send params */
411
+ const params = request.params ?? {};
412
+ const toolName = params.name;
413
+ const toolArgs = (params.arguments ?? {});
414
+ /* v8 ignore stop */
415
+ // ── Conversation tools: these run a real agent turn ──
416
+ const conversationMessage = buildConversationMessage(toolName, toolArgs);
417
+ if (conversationMessage !== null) {
418
+ await runConversationTool(request, conversationMessage);
419
+ return;
420
+ }
421
+ if (toolName === "check_response") {
422
+ const pendingDir = (0, pending_1.getPendingDir)(agent, friendId, "mcp", sessionId);
423
+ const pending = (0, pending_1.drainPending)(pendingDir);
424
+ if (pending.length === 0) {
425
+ writeResponse({
426
+ jsonrpc: "2.0",
427
+ id: request.id,
428
+ result: {
429
+ content: [{ type: "text", text: "no pending messages" }],
430
+ isError: false,
431
+ },
432
+ });
433
+ }
434
+ else {
435
+ const text = pending.map((m) => m.content).join("\n\n---\n\n");
436
+ writeResponse({
437
+ jsonrpc: "2.0",
438
+ id: request.id,
439
+ result: {
440
+ content: [{ type: "text", text }],
441
+ isError: false,
442
+ },
443
+ });
444
+ }
445
+ return;
446
+ }
447
+ // ── Legacy daemon/service tools ──
448
+ const commandKind = TOOL_TO_COMMAND[toolName];
449
+ if (!commandKind) {
450
+ writeResponse({
451
+ jsonrpc: "2.0",
452
+ id: request.id,
453
+ result: {
454
+ content: [{ type: "text", text: `Unknown tool: ${toolName}` }],
455
+ isError: true,
456
+ },
457
+ });
458
+ return;
459
+ }
460
+ // Call agent-service directly (no daemon roundtrip needed for read-only ops)
461
+ const serviceHandler = TOOL_TO_SERVICE[toolName];
462
+ let response;
463
+ /* v8 ignore start — typeof guard always true; instanceof check defensive; else branch unreachable for known tools */
464
+ if (serviceHandler && typeof agentService[serviceHandler] === "function") {
465
+ const handlerFn = agentService[serviceHandler];
466
+ try {
467
+ response = await handlerFn({ agent, friendId, socketPath, ...toolArgs });
468
+ }
469
+ catch (error) {
470
+ const errorMessage = error instanceof Error ? error.message : String(error);
471
+ response = { ok: false, error: `Service error: ${errorMessage}` };
472
+ }
473
+ }
474
+ else {
475
+ try {
476
+ response = await (0, socket_client_1.sendDaemonCommand)(socketPath, {
477
+ kind: commandKind, agent, friendId, ...toolArgs,
478
+ });
479
+ }
480
+ catch (error) {
481
+ const errorMessage = error instanceof Error ? error.message : String(error);
482
+ response = { ok: false, error: `Daemon error: ${errorMessage}` };
483
+ }
484
+ }
485
+ /* v8 ignore stop */
486
+ const text = response.message
487
+ ?? response.summary
488
+ ?? JSON.stringify(response.data ?? { ok: response.ok });
489
+ writeResponse({
490
+ jsonrpc: "2.0",
491
+ id: request.id,
492
+ result: {
493
+ content: [{ type: "text", text }],
494
+ isError: !response.ok,
495
+ },
496
+ });
497
+ }
498
+ function onData(chunk) {
499
+ handleData(chunk);
500
+ }
501
+ return {
502
+ agent,
503
+ friendId,
504
+ start() {
505
+ if (running)
506
+ return;
507
+ running = true;
508
+ stdin.on("data", onData);
509
+ (0, runtime_1.emitNervesEvent)({
510
+ component: "daemon",
511
+ event: "daemon.mcp_server_start",
512
+ message: "MCP server started",
513
+ meta: { agent, friendId, rawFriendId, socketPath },
514
+ });
515
+ },
516
+ stop() {
517
+ if (!running)
518
+ return;
519
+ running = false;
520
+ stdin.removeListener("data", onData);
521
+ // `_end` (not `_stop`) to satisfy the nerves audit's start/end
522
+ // pairing rule — counterpart to `daemon.mcp_server_start`.
523
+ (0, runtime_1.emitNervesEvent)({
524
+ component: "daemon",
525
+ event: "daemon.mcp_server_end",
526
+ message: "MCP server stopped",
527
+ meta: { agent, friendId },
528
+ });
529
+ },
530
+ };
531
+ }
532
+ /**
533
+ * Returns the list of MCP tool schemas for all 15 agent tools.
534
+ * Each schema follows JSON Schema for inputSchema as required by MCP.
535
+ */
536
+ function getToolSchemas() {
537
+ return [
538
+ {
539
+ name: "ask",
540
+ description: "Ask the agent a question through a full conversation turn. This has the same identity, tools, and session continuity as send_message; use search_notes for read-only note lookup.",
541
+ inputSchema: {
542
+ type: "object",
543
+ properties: {
544
+ question: { type: "string", description: "The question to ask the agent" },
545
+ },
546
+ required: ["question"],
547
+ },
548
+ },
549
+ {
550
+ name: "status",
551
+ description: "Get the agent's current status including active sessions, diary and journal state, and activity level.",
552
+ inputSchema: {
553
+ type: "object",
554
+ properties: {},
555
+ },
556
+ },
557
+ {
558
+ name: "catchup",
559
+ description: "Get a summary of the agent's recent activity including recent sessions and what it has been working on.",
560
+ inputSchema: {
561
+ type: "object",
562
+ properties: {},
563
+ },
564
+ },
565
+ {
566
+ name: "delegate",
567
+ description: "Ask the agent to handle a task through a full conversation turn. The agent decides whether to act, queue, ask, or respond using its normal tools and identity.",
568
+ inputSchema: {
569
+ type: "object",
570
+ properties: {
571
+ task: { type: "string", description: "Description of the task to delegate" },
572
+ context: { type: "string", description: "Additional context about the task" },
573
+ },
574
+ required: ["task"],
575
+ },
576
+ },
577
+ {
578
+ name: "get_context",
579
+ description: "Get the agent's current working context including note summary, active tasks, and relevant state.",
580
+ inputSchema: {
581
+ type: "object",
582
+ properties: {},
583
+ },
584
+ },
585
+ {
586
+ name: "search_notes",
587
+ description: "Read-only note search. Returns matching diary lines without running an agent turn or treating missing matches as absence of agent belief.",
588
+ inputSchema: {
589
+ type: "object",
590
+ properties: {
591
+ query: { type: "string", description: "Search term to look for in agent notes" },
592
+ },
593
+ required: ["query"],
594
+ },
595
+ },
596
+ {
597
+ name: "get_task",
598
+ description: "Get details about the agent's current task or list of active tasks.",
599
+ inputSchema: {
600
+ type: "object",
601
+ properties: {},
602
+ },
603
+ },
604
+ {
605
+ name: "check_scope",
606
+ description: "Ask the agent whether a proposed item or change is in scope through a full conversation turn.",
607
+ inputSchema: {
608
+ type: "object",
609
+ properties: {
610
+ item: { type: "string", description: "The item or change to check scope for" },
611
+ },
612
+ required: ["item"],
613
+ },
614
+ },
615
+ {
616
+ name: "request_decision",
617
+ description: "Ask the agent to make a decision through a full conversation turn. Optionally provide a list of options to consider.",
618
+ inputSchema: {
619
+ type: "object",
620
+ properties: {
621
+ topic: { type: "string", description: "The topic requiring a decision" },
622
+ options: { type: "string", description: "Comma-separated list of options to consider" },
623
+ },
624
+ required: ["topic"],
625
+ },
626
+ },
627
+ {
628
+ name: "check_guidance",
629
+ description: "Ask the agent for guidance through a full conversation turn, using the same identity, tools, and session continuity as send_message.",
630
+ inputSchema: {
631
+ type: "object",
632
+ properties: {
633
+ topic: { type: "string", description: "The topic to get guidance on" },
634
+ },
635
+ required: ["topic"],
636
+ },
637
+ },
638
+ {
639
+ name: "report_progress",
640
+ description: "Tell the agent about delegated-work progress through a full conversation turn so it can respond, record, or act normally.",
641
+ inputSchema: {
642
+ type: "object",
643
+ properties: {
644
+ summary: { type: "string", description: "Summary of progress made" },
645
+ },
646
+ required: ["summary"],
647
+ },
648
+ },
649
+ {
650
+ name: "report_blocker",
651
+ description: "Tell the agent about a delegated-work blocker through a full conversation turn so it can respond, record, or act normally.",
652
+ inputSchema: {
653
+ type: "object",
654
+ properties: {
655
+ blocker: { type: "string", description: "Description of the blocker" },
656
+ },
657
+ required: ["blocker"],
658
+ },
659
+ },
660
+ {
661
+ name: "report_complete",
662
+ description: "Tell the agent delegated work is complete through a full conversation turn so it can respond, record, or act normally.",
663
+ inputSchema: {
664
+ type: "object",
665
+ properties: {
666
+ summary: { type: "string", description: "Summary of what was completed" },
667
+ },
668
+ required: ["summary"],
669
+ },
670
+ },
671
+ {
672
+ name: "send_message",
673
+ description: "Send a message to the agent and get a synchronous response. This runs a full agent turn — the agent can use tools, think, and respond. For multi-turn conversations, call repeatedly — the agent keeps prior turns in this session.",
674
+ inputSchema: {
675
+ type: "object",
676
+ properties: {
677
+ message: { type: "string", description: "The message to send to the agent" },
678
+ },
679
+ required: ["message"],
680
+ },
681
+ },
682
+ {
683
+ name: "check_response",
684
+ description: "Check for pending messages from the agent. Use this after send_message returns a ponder deferral, or to pick up proactive messages the agent has surfaced to you.",
685
+ inputSchema: {
686
+ type: "object",
687
+ properties: {},
688
+ },
689
+ },
690
+ ];
691
+ }
692
+ // MCP server v0.1.0-alpha.140