@ouro.bot/cli 0.1.0-alpha.73 → 0.1.0-alpha.730

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 (527) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +146 -23
  3. package/RepairGuide.ouro/agent.json +5 -0
  4. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  5. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  6. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  7. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  8. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  9. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  12. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  13. package/assets/bluebubbles-host +264 -0
  14. package/changelog.json +4633 -14
  15. package/dist/a2a/card.js +57 -0
  16. package/dist/a2a/client.js +180 -0
  17. package/dist/a2a/config.js +50 -0
  18. package/dist/a2a/delegation-stores.js +56 -0
  19. package/dist/a2a/did-resolution.js +93 -0
  20. package/dist/a2a/identity.js +170 -0
  21. package/dist/a2a/inbound-share.js +107 -0
  22. package/dist/a2a/mission-result-wire.js +196 -0
  23. package/dist/a2a/onboarding.js +115 -0
  24. package/dist/a2a/pin-store.js +132 -0
  25. package/dist/a2a/seen-ledger.js +120 -0
  26. package/dist/a2a/server.js +604 -0
  27. package/dist/a2a/task-store.js +69 -0
  28. package/dist/a2a/transport.js +45 -0
  29. package/dist/a2a/types.js +3 -0
  30. package/dist/arc/attention-types.js +8 -0
  31. package/dist/arc/cares.js +144 -0
  32. package/dist/arc/episodes.js +118 -0
  33. package/dist/arc/evolution.js +490 -0
  34. package/dist/arc/flight-recorder.js +1034 -0
  35. package/dist/arc/intentions.js +134 -0
  36. package/dist/arc/json-store.js +117 -0
  37. package/dist/arc/obligations.js +348 -0
  38. package/dist/arc/packets.js +336 -0
  39. package/dist/arc/presence.js +185 -0
  40. package/dist/arc/task-lifecycle.js +57 -0
  41. package/dist/commerce/store.js +755 -0
  42. package/dist/commerce/types.js +3 -0
  43. package/dist/heart/active-work.js +874 -43
  44. package/dist/heart/agent-entry.js +190 -3
  45. package/dist/heart/approval-store.js +791 -0
  46. package/dist/heart/attachments/image-normalize.js +194 -0
  47. package/dist/heart/attachments/materialize.js +97 -0
  48. package/dist/heart/attachments/originals.js +88 -0
  49. package/dist/heart/attachments/render.js +29 -0
  50. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  51. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  52. package/dist/heart/attachments/sources/index.js +16 -0
  53. package/dist/heart/attachments/store.js +103 -0
  54. package/dist/heart/attachments/types.js +93 -0
  55. package/dist/heart/auth/auth-flow.js +479 -0
  56. package/dist/heart/autonomy-budget.js +434 -0
  57. package/dist/heart/awaiting/await-alert.js +146 -0
  58. package/dist/heart/awaiting/await-expiry.js +108 -0
  59. package/dist/heart/awaiting/await-loader.js +91 -0
  60. package/dist/heart/awaiting/await-parser.js +141 -0
  61. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  62. package/dist/heart/awaiting/await-scheduler.js +378 -0
  63. package/dist/heart/background-operations.js +281 -0
  64. package/dist/heart/bridges/manager.js +137 -17
  65. package/dist/heart/bridges/store.js +14 -2
  66. package/dist/heart/bundle-state.js +168 -0
  67. package/dist/heart/commitments.js +135 -0
  68. package/dist/heart/config-registry.js +331 -0
  69. package/dist/heart/config.js +120 -129
  70. package/dist/heart/context-loss-gauntlet.js +354 -0
  71. package/dist/heart/context-loss-sentinel.js +1155 -0
  72. package/dist/heart/core.js +1763 -320
  73. package/dist/heart/cross-chat-delivery.js +8 -22
  74. package/dist/heart/daemon/agent-config-check.js +451 -0
  75. package/dist/heart/daemon/agent-discovery.js +185 -3
  76. package/dist/heart/daemon/agent-service.js +542 -0
  77. package/dist/heart/daemon/agentic-repair.js +547 -0
  78. package/dist/heart/daemon/await-private-wake.js +59 -0
  79. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  80. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  81. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  82. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  83. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  84. package/dist/heart/daemon/cadence.js +180 -0
  85. package/dist/heart/daemon/cli-defaults.js +832 -0
  86. package/dist/heart/daemon/cli-desk.js +322 -0
  87. package/dist/heart/daemon/cli-exec.js +8586 -0
  88. package/dist/heart/daemon/cli-help.js +700 -0
  89. package/dist/heart/daemon/cli-parse.js +2688 -0
  90. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  91. package/dist/heart/daemon/cli-render.js +777 -0
  92. package/dist/heart/daemon/cli-types.js +8 -0
  93. package/dist/heart/daemon/connect-bay.js +323 -0
  94. package/dist/heart/daemon/daemon-cli.js +29 -2093
  95. package/dist/heart/daemon/daemon-entry.js +842 -10
  96. package/dist/heart/daemon/daemon-health.js +176 -0
  97. package/dist/heart/daemon/daemon-rollup.js +57 -0
  98. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  99. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  100. package/dist/heart/daemon/daemon.js +1610 -87
  101. package/dist/heart/daemon/dns-workflow.js +394 -0
  102. package/dist/heart/daemon/doctor-types.js +8 -0
  103. package/dist/heart/daemon/doctor.js +1440 -0
  104. package/dist/heart/daemon/freshness.js +343 -0
  105. package/dist/heart/daemon/habit-private-wake.js +61 -0
  106. package/dist/heart/daemon/health-monitor.js +142 -11
  107. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  108. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  109. package/dist/heart/daemon/http-health-probe.js +80 -0
  110. package/dist/heart/daemon/human-command-screens.js +234 -0
  111. package/dist/heart/daemon/human-readiness.js +114 -0
  112. package/dist/heart/daemon/inner-status.js +78 -0
  113. package/dist/heart/daemon/interactive-repair.js +394 -0
  114. package/dist/heart/daemon/launchd.js +37 -8
  115. package/dist/heart/daemon/log-tailer.js +79 -10
  116. package/dist/heart/daemon/logs-prune.js +110 -0
  117. package/dist/heart/daemon/mcp-canary.js +524 -0
  118. package/dist/heart/daemon/message-router.js +45 -5
  119. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  120. package/dist/heart/daemon/os-cron-deps.js +135 -0
  121. package/dist/heart/daemon/os-cron.js +22 -14
  122. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  123. package/dist/heart/daemon/ouro-entry.js +3 -1
  124. package/dist/heart/daemon/plugin-cli.js +432 -0
  125. package/dist/heart/daemon/process-manager.js +624 -61
  126. package/dist/heart/daemon/provider-discovery.js +137 -0
  127. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  128. package/dist/heart/daemon/pulse.js +511 -0
  129. package/dist/heart/daemon/readiness-repair.js +365 -0
  130. package/dist/heart/daemon/run-hooks.js +2 -0
  131. package/dist/heart/daemon/runtime-logging.js +41 -14
  132. package/dist/heart/daemon/runtime-metadata.js +2 -30
  133. package/dist/heart/daemon/safe-mode.js +161 -0
  134. package/dist/heart/daemon/sense-manager.js +670 -48
  135. package/dist/heart/daemon/session-id-resolver.js +131 -0
  136. package/dist/heart/daemon/skill-management-installer.js +1 -1
  137. package/dist/heart/daemon/socket-client.js +180 -12
  138. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  139. package/dist/heart/daemon/startup-tui.js +338 -0
  140. package/dist/heart/daemon/task-scheduler.js +117 -39
  141. package/dist/heart/daemon/terminal-ui.js +499 -0
  142. package/dist/heart/daemon/thoughts.js +255 -43
  143. package/dist/heart/daemon/up-progress.js +366 -0
  144. package/dist/heart/daemon/vault-items.js +56 -0
  145. package/dist/heart/delegation.js +1 -4
  146. package/dist/heart/external-events/router.js +121 -0
  147. package/dist/heart/habits/habit-cancel.js +810 -0
  148. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  149. package/dist/heart/habits/habit-migration.js +194 -0
  150. package/dist/heart/habits/habit-parser.js +278 -0
  151. package/dist/heart/habits/habit-runtime-state.js +93 -0
  152. package/dist/heart/habits/habit-scheduler.js +649 -0
  153. package/dist/heart/habits/habit-session-summary.js +318 -0
  154. package/dist/heart/habits/habit-session.js +636 -0
  155. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
  156. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  157. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  158. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  159. package/dist/heart/identity.js +174 -59
  160. package/dist/heart/kept-notes.js +289 -0
  161. package/dist/heart/kicks.js +1 -1
  162. package/dist/heart/machine-identity.js +161 -0
  163. package/dist/heart/mail-import-discovery.js +353 -0
  164. package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
  165. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  166. package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
  167. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  168. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  169. package/dist/heart/mailbox/mailbox-http.js +99 -0
  170. package/dist/heart/mailbox/mailbox-read.js +39 -0
  171. package/dist/heart/mailbox/mailbox-types.js +27 -0
  172. package/dist/heart/mailbox/mailbox-view.js +197 -0
  173. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  174. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  175. package/dist/heart/mailbox/readers/mail.js +375 -0
  176. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  177. package/dist/heart/mailbox/readers/sessions.js +232 -0
  178. package/dist/heart/mailbox/readers/shared.js +111 -0
  179. package/dist/heart/mcp/mcp-server.js +696 -0
  180. package/dist/heart/migrate-config.js +100 -0
  181. package/dist/heart/model-capabilities.js +11 -0
  182. package/dist/heart/orientation-frame.js +345 -0
  183. package/dist/heart/platform.js +81 -0
  184. package/dist/heart/primitives.js +1 -1
  185. package/dist/heart/private-runtime/decision-renderer.js +156 -0
  186. package/dist/heart/private-runtime/index.js +18 -0
  187. package/dist/heart/private-runtime/ledger.js +218 -0
  188. package/dist/heart/private-runtime/policy.js +214 -0
  189. package/dist/heart/private-runtime/types.js +2 -0
  190. package/dist/heart/progress-story.js +1 -1
  191. package/dist/heart/provider-attempt.js +137 -0
  192. package/dist/heart/provider-binding-resolver.js +273 -0
  193. package/dist/heart/provider-credentials.js +441 -0
  194. package/dist/heart/provider-failover.js +311 -0
  195. package/dist/heart/provider-models.js +81 -0
  196. package/dist/heart/provider-ping.js +262 -0
  197. package/dist/heart/provider-readiness-cache.js +119 -0
  198. package/dist/heart/provider-visibility.js +188 -0
  199. package/dist/heart/providers/anthropic-token.js +131 -0
  200. package/dist/heart/providers/anthropic.js +173 -60
  201. package/dist/heart/providers/azure.js +23 -11
  202. package/dist/heart/providers/error-classification.js +127 -0
  203. package/dist/heart/providers/github-copilot.js +34 -38
  204. package/dist/heart/providers/minimax-vlm.js +189 -0
  205. package/dist/heart/providers/minimax.js +26 -8
  206. package/dist/heart/providers/openai-codex-token.js +349 -0
  207. package/dist/heart/providers/openai-codex.js +55 -40
  208. package/dist/heart/run-ledger.js +247 -0
  209. package/dist/heart/runtime-capability-check.js +170 -0
  210. package/dist/heart/runtime-credentials.js +398 -0
  211. package/dist/heart/runtime-cwd.js +87 -0
  212. package/dist/heart/sense-truth.js +20 -4
  213. package/dist/heart/session-activity.js +90 -24
  214. package/dist/heart/session-events.js +1300 -0
  215. package/dist/heart/session-playback-cli-main.js +5 -0
  216. package/dist/heart/session-playback-cli.js +36 -0
  217. package/dist/heart/session-playback.js +231 -0
  218. package/dist/heart/session-stats-cli-main.js +5 -0
  219. package/dist/heart/session-stats.js +182 -0
  220. package/dist/heart/session-transcript.js +133 -0
  221. package/dist/heart/start-of-turn-packet.js +368 -0
  222. package/dist/heart/streaming.js +604 -207
  223. package/dist/heart/structured-output.js +196 -0
  224. package/dist/heart/sync-classification.js +176 -0
  225. package/dist/heart/sync.js +449 -0
  226. package/dist/heart/target-resolution.js +11 -7
  227. package/dist/heart/tempo.js +93 -0
  228. package/dist/heart/temporal-view.js +41 -0
  229. package/dist/heart/timeouts.js +101 -0
  230. package/dist/heart/tool-activity-callbacks.js +59 -0
  231. package/dist/heart/tool-approval.js +339 -0
  232. package/dist/heart/tool-description.js +155 -0
  233. package/dist/heart/tool-friction.js +55 -0
  234. package/dist/heart/tool-loop.js +200 -0
  235. package/dist/heart/turn-context.js +472 -0
  236. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  237. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  238. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  239. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  240. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  241. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  242. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  243. package/dist/heart/versioning/update-hooks.js +154 -0
  244. package/dist/heart/versioning/version-intent.js +114 -0
  245. package/dist/heart/work-card.js +380 -0
  246. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  247. package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
  248. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  249. package/dist/mailbox-ui/index.html +16 -0
  250. package/dist/mailroom/attention.js +167 -0
  251. package/dist/mailroom/autonomy.js +209 -0
  252. package/dist/mailroom/blob-store.js +715 -0
  253. package/dist/mailroom/body-cache.js +61 -0
  254. package/dist/mailroom/core.js +788 -0
  255. package/dist/mailroom/entry.js +160 -0
  256. package/dist/mailroom/file-store.js +568 -0
  257. package/dist/mailroom/mbox-import.js +393 -0
  258. package/dist/mailroom/migration.js +164 -0
  259. package/dist/mailroom/outbound.js +380 -0
  260. package/dist/mailroom/policy.js +263 -0
  261. package/dist/mailroom/reader.js +233 -0
  262. package/dist/mailroom/search-cache.js +334 -0
  263. package/dist/mailroom/search-relevance.js +319 -0
  264. package/dist/mailroom/smtp-ingress.js +176 -0
  265. package/dist/mailroom/source-state.js +176 -0
  266. package/dist/mailroom/thread.js +109 -0
  267. package/dist/mailroom/travel-extract.js +89 -0
  268. package/dist/mind/bundle-manifest.js +24 -2
  269. package/dist/mind/context.js +273 -111
  270. package/dist/mind/desk-section.js +362 -0
  271. package/dist/mind/diary-integrity.js +60 -0
  272. package/dist/mind/{memory.js → diary.js} +68 -77
  273. package/dist/mind/embedding-provider.js +60 -0
  274. package/dist/mind/file-state.js +179 -0
  275. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  276. package/dist/mind/obligation-steering.js +227 -0
  277. package/dist/mind/pending.js +13 -8
  278. package/dist/mind/prompt-budget.js +479 -0
  279. package/dist/mind/prompt-refresh.js +3 -2
  280. package/dist/mind/prompt.js +1058 -172
  281. package/dist/mind/provenance-trust.js +26 -0
  282. package/dist/mind/record-paths.js +312 -0
  283. package/dist/mind/scrutiny.js +173 -0
  284. package/dist/mind/session-transaction.js +379 -0
  285. package/dist/nerves/cli-logging.js +7 -1
  286. package/dist/nerves/coverage/audit-rules.js +15 -6
  287. package/dist/nerves/coverage/audit.js +28 -2
  288. package/dist/nerves/coverage/cli.js +1 -1
  289. package/dist/nerves/coverage/contract.js +5 -5
  290. package/dist/nerves/coverage/file-completeness.js +139 -5
  291. package/dist/nerves/coverage/run-artifacts.js +55 -35
  292. package/dist/nerves/event-buffer.js +111 -0
  293. package/dist/nerves/index.js +234 -4
  294. package/dist/nerves/observation.js +20 -0
  295. package/dist/nerves/redact.js +79 -0
  296. package/dist/nerves/review/cli-main.js +5 -0
  297. package/dist/nerves/review/cli.js +156 -0
  298. package/dist/nerves/review/core.js +159 -0
  299. package/dist/nerves/runtime.js +5 -1
  300. package/dist/repertoire/ado-client.js +15 -56
  301. package/dist/repertoire/ado-semantic.js +16 -10
  302. package/dist/repertoire/api-client.js +97 -0
  303. package/dist/repertoire/bitwarden-store.js +1045 -0
  304. package/dist/repertoire/bundle-templates.js +71 -0
  305. package/dist/repertoire/bw-installer.js +180 -0
  306. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  307. package/dist/repertoire/coding/context-pack.js +331 -0
  308. package/dist/repertoire/coding/feedback.js +218 -30
  309. package/dist/repertoire/coding/index.js +15 -3
  310. package/dist/repertoire/coding/manager.js +166 -10
  311. package/dist/repertoire/coding/spawner.js +58 -11
  312. package/dist/repertoire/coding/tools.js +242 -14
  313. package/dist/repertoire/coding/workbench-client.js +272 -0
  314. package/dist/repertoire/coding/workbench-manager.js +346 -0
  315. package/dist/repertoire/commerce-errors.js +109 -0
  316. package/dist/repertoire/commerce-self-test.js +156 -0
  317. package/dist/repertoire/credential-access.js +178 -0
  318. package/dist/repertoire/desk/classifier.js +362 -0
  319. package/dist/repertoire/duffel-client.js +185 -0
  320. package/dist/repertoire/github-client.js +14 -55
  321. package/dist/repertoire/graph-client.js +11 -52
  322. package/dist/repertoire/guardrails.js +138 -18
  323. package/dist/repertoire/mcp-client.js +44 -3
  324. package/dist/repertoire/mcp-manager.js +259 -20
  325. package/dist/repertoire/mcp-tools.js +83 -0
  326. package/dist/repertoire/plugin-mcp.js +175 -0
  327. package/dist/repertoire/plugins.js +253 -0
  328. package/dist/repertoire/shell-sessions.js +133 -0
  329. package/dist/repertoire/skills.js +48 -4
  330. package/dist/repertoire/stripe-client.js +131 -0
  331. package/dist/repertoire/tool-arguments.js +104 -0
  332. package/dist/repertoire/tool-results.js +29 -0
  333. package/dist/repertoire/tools-a2a.js +699 -0
  334. package/dist/repertoire/tools-attachments.js +317 -0
  335. package/dist/repertoire/tools-awaiting.js +372 -0
  336. package/dist/repertoire/tools-base.js +67 -1095
  337. package/dist/repertoire/tools-bluebubbles.js +2 -0
  338. package/dist/repertoire/tools-bridge.js +144 -0
  339. package/dist/repertoire/tools-bundle.js +993 -0
  340. package/dist/repertoire/tools-commerce.js +253 -0
  341. package/dist/repertoire/tools-config.js +186 -0
  342. package/dist/repertoire/tools-continuity.js +252 -0
  343. package/dist/repertoire/tools-credential.js +383 -0
  344. package/dist/repertoire/tools-evolution.js +527 -0
  345. package/dist/repertoire/tools-files.js +344 -0
  346. package/dist/repertoire/tools-flight.js +290 -0
  347. package/dist/repertoire/tools-flow.js +119 -0
  348. package/dist/repertoire/tools-github.js +3 -8
  349. package/dist/repertoire/tools-habits.js +103 -0
  350. package/dist/repertoire/tools-mail.js +1975 -0
  351. package/dist/repertoire/tools-notes.js +459 -0
  352. package/dist/repertoire/tools-obligations.js +182 -0
  353. package/dist/repertoire/tools-orientation.js +31 -0
  354. package/dist/repertoire/tools-record.js +482 -0
  355. package/dist/repertoire/tools-rsvp.js +139 -0
  356. package/dist/repertoire/tools-runtime.js +150 -0
  357. package/dist/repertoire/tools-session.js +881 -0
  358. package/dist/repertoire/tools-shell.js +133 -0
  359. package/dist/repertoire/tools-stripe.js +224 -0
  360. package/dist/repertoire/tools-surface.js +355 -0
  361. package/dist/repertoire/tools-teams.js +12 -39
  362. package/dist/repertoire/tools-travel.js +125 -0
  363. package/dist/repertoire/tools-trip.js +982 -0
  364. package/dist/repertoire/tools-user-profile.js +146 -0
  365. package/dist/repertoire/tools-vault.js +40 -0
  366. package/dist/repertoire/tools-voice.js +145 -0
  367. package/dist/repertoire/tools.js +258 -79
  368. package/dist/repertoire/travel-api-client.js +360 -0
  369. package/dist/repertoire/user-profile.js +131 -0
  370. package/dist/repertoire/vault-setup.js +246 -0
  371. package/dist/repertoire/vault-unlock.js +594 -0
  372. package/dist/rsvp/aisleplanner-client.js +354 -0
  373. package/dist/rsvp/cli.js +926 -0
  374. package/dist/rsvp/config.js +327 -0
  375. package/dist/rsvp/cutover.js +433 -0
  376. package/dist/rsvp/diagnostics.js +232 -0
  377. package/dist/rsvp/diff-renderer.js +176 -0
  378. package/dist/rsvp/habit-policy.js +110 -0
  379. package/dist/rsvp/habit-stage.js +123 -0
  380. package/dist/rsvp/incident-bundle.js +97 -0
  381. package/dist/rsvp/migration.js +204 -0
  382. package/dist/rsvp/native-habit-runner.js +630 -0
  383. package/dist/rsvp/outbound-state.js +628 -0
  384. package/dist/rsvp/query.js +118 -0
  385. package/dist/rsvp/replay.js +233 -0
  386. package/dist/rsvp/snapshot.js +232 -0
  387. package/dist/rsvp/spend-ledger.js +175 -0
  388. package/dist/scripts/claude-code-hook.js +41 -0
  389. package/dist/scripts/claude-code-stop-hook.js +47 -0
  390. package/dist/senses/a2a-entry.js +115 -0
  391. package/dist/senses/attention-queue.js +186 -0
  392. package/dist/senses/await-turn-message.js +58 -0
  393. package/dist/senses/bluebubbles/active-turns.js +216 -0
  394. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  395. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  396. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +355 -40
  397. package/dist/senses/bluebubbles/context-packet.js +207 -0
  398. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  399. package/dist/senses/bluebubbles/entry.js +90 -0
  400. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
  401. package/dist/senses/bluebubbles/index.js +3839 -0
  402. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  403. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  404. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
  405. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
  406. package/dist/senses/bluebubbles/outbound-state.js +308 -0
  407. package/dist/senses/bluebubbles/processed-log.js +133 -0
  408. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  409. package/dist/senses/bluebubbles/replay.js +284 -0
  410. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  411. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  412. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  413. package/dist/senses/bluebubbles/webhook-registration.js +228 -0
  414. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  415. package/dist/senses/cli/bracketed-paste.js +82 -0
  416. package/dist/senses/cli/image-paste.js +287 -0
  417. package/dist/senses/cli/image-ref-navigation.js +75 -0
  418. package/dist/senses/cli/ink-app.js +156 -0
  419. package/dist/senses/cli/inline-diff.js +64 -0
  420. package/dist/senses/cli/input-keys.js +174 -0
  421. package/dist/senses/cli/kill-ring.js +86 -0
  422. package/dist/senses/cli/message-list.js +51 -0
  423. package/dist/senses/cli/ouro-tui.js +607 -0
  424. package/dist/senses/cli/spinner-imperative.js +135 -0
  425. package/dist/senses/cli/spinner.js +101 -0
  426. package/dist/senses/cli/status-line.js +60 -0
  427. package/dist/senses/cli/streaming-markdown.js +526 -0
  428. package/dist/senses/cli/tool-display.js +85 -0
  429. package/dist/senses/cli/tool-render.js +85 -0
  430. package/dist/senses/cli/tui-store.js +241 -0
  431. package/dist/senses/cli/virtual-list.js +35 -0
  432. package/dist/senses/cli-entry.js +60 -8
  433. package/dist/senses/cli-layout.js +100 -0
  434. package/dist/senses/cli.js +640 -312
  435. package/dist/senses/commands.js +66 -3
  436. package/dist/senses/context-packet-ledger.js +371 -0
  437. package/dist/senses/context-packets.js +154 -0
  438. package/dist/senses/habit-lifecycle-guard.js +24 -0
  439. package/dist/senses/habit-turn-message.js +160 -0
  440. package/dist/senses/ingress-evidence.js +2 -0
  441. package/dist/senses/mail-entry.js +66 -0
  442. package/dist/senses/mail.js +524 -0
  443. package/dist/senses/pipeline.js +1075 -176
  444. package/dist/senses/private-runtime-worker.js +740 -0
  445. package/dist/senses/private-runtime.js +1212 -0
  446. package/dist/senses/proactive-content-guard.js +51 -0
  447. package/dist/senses/shared-turn.js +424 -0
  448. package/dist/senses/surface-tool.js +109 -0
  449. package/dist/senses/teams-entry.js +60 -8
  450. package/dist/senses/teams.js +515 -217
  451. package/dist/senses/trust-gate.js +104 -9
  452. package/dist/senses/voice/audio-playback.js +237 -0
  453. package/dist/senses/voice/audio-routing.js +119 -0
  454. package/dist/senses/voice/elevenlabs.js +202 -0
  455. package/dist/senses/voice/floor-control.js +431 -0
  456. package/dist/senses/voice/floor-controller.js +115 -0
  457. package/dist/senses/voice/golden-path.js +116 -0
  458. package/dist/senses/voice/index.js +29 -0
  459. package/dist/senses/voice/meeting.js +113 -0
  460. package/dist/senses/voice/outbound.js +190 -0
  461. package/dist/senses/voice/phone.js +33 -0
  462. package/dist/senses/voice/playback.js +139 -0
  463. package/dist/senses/voice/realtime-eval.js +496 -0
  464. package/dist/senses/voice/realtime-trace.js +531 -0
  465. package/dist/senses/voice/transcript.js +70 -0
  466. package/dist/senses/voice/turn.js +191 -0
  467. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  468. package/dist/senses/voice/twilio-phone.js +5081 -0
  469. package/dist/senses/voice/types.js +2 -0
  470. package/dist/senses/voice/whisper.js +161 -0
  471. package/dist/senses/voice-entry.js +81 -0
  472. package/dist/senses/voice-realtime-eval-command.js +99 -0
  473. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  474. package/dist/senses/voice-twilio-entry.js +87 -0
  475. package/dist/trips/core.js +138 -0
  476. package/dist/trips/store.js +265 -0
  477. package/dist/util/frontmatter.js +69 -0
  478. package/package.json +65 -12
  479. package/skills/agent-commerce.md +113 -0
  480. package/skills/browser-navigation.md +117 -0
  481. package/skills/commerce-setup-guide.md +116 -0
  482. package/skills/commerce-setup.md +84 -0
  483. package/skills/configure-dev-tools.md +99 -0
  484. package/skills/travel-planning.md +138 -0
  485. package/dist/heart/daemon/auth-flow.js +0 -430
  486. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  487. package/dist/heart/daemon/update-hooks.js +0 -138
  488. package/dist/heart/safe-workspace.js +0 -228
  489. package/dist/heart/session-recall.js +0 -116
  490. package/dist/mind/friends/channel.js +0 -84
  491. package/dist/mind/friends/group-context.js +0 -144
  492. package/dist/mind/friends/resolver.js +0 -84
  493. package/dist/mind/friends/store-file.js +0 -190
  494. package/dist/mind/friends/store.js +0 -4
  495. package/dist/mind/friends/tokens.js +0 -26
  496. package/dist/mind/friends/trust-explanation.js +0 -74
  497. package/dist/mind/friends/types.js +0 -29
  498. package/dist/repertoire/tasks/board.js +0 -134
  499. package/dist/repertoire/tasks/index.js +0 -224
  500. package/dist/repertoire/tasks/lifecycle.js +0 -80
  501. package/dist/repertoire/tasks/middleware.js +0 -65
  502. package/dist/repertoire/tasks/parser.js +0 -173
  503. package/dist/repertoire/tasks/scanner.js +0 -132
  504. package/dist/repertoire/tasks/transitions.js +0 -144
  505. package/dist/senses/bluebubbles-entry.js +0 -13
  506. package/dist/senses/bluebubbles.js +0 -1180
  507. package/dist/senses/debug-activity.js +0 -148
  508. package/dist/senses/inner-dialog-worker.js +0 -90
  509. package/dist/senses/inner-dialog.js +0 -480
  510. package/subagents/README.md +0 -7
  511. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  512. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  513. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  514. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  515. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  516. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  517. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  518. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  519. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  520. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  521. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  522. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  523. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  524. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  525. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  526. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  527. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -7,61 +7,20 @@ exports.graphRequest = graphRequest;
7
7
  exports.getProfile = getProfile;
8
8
  const api_error_1 = require("../heart/api-error");
9
9
  const runtime_1 = require("../nerves/runtime");
10
+ const api_client_1 = require("./api-client");
10
11
  const GRAPH_BASE = "https://graph.microsoft.com/v1.0";
11
12
  // Generic Graph API request. Returns response body as pretty-printed JSON string.
12
13
  async function graphRequest(token, method, path, body) {
13
- try {
14
- (0, runtime_1.emitNervesEvent)({
15
- event: "client.request_start",
16
- component: "clients",
17
- message: "starting Graph request",
18
- meta: { client: "graph", method, path },
19
- });
20
- const url = `${GRAPH_BASE}${path}`;
21
- const opts = {
22
- method,
23
- headers: {
24
- Authorization: `Bearer ${token}`,
25
- "Content-Type": "application/json",
26
- },
27
- };
28
- if (body)
29
- opts.body = body;
30
- const res = await fetch(url, opts);
31
- if (!res.ok) {
32
- (0, runtime_1.emitNervesEvent)({
33
- level: "error",
34
- event: "client.error",
35
- component: "clients",
36
- message: "Graph request failed",
37
- meta: { client: "graph", method, path, status: res.status },
38
- });
39
- return (0, api_error_1.handleApiError)(res, "Graph", "graph");
40
- }
41
- const data = await res.json();
42
- (0, runtime_1.emitNervesEvent)({
43
- event: "client.request_end",
44
- component: "clients",
45
- message: "Graph request completed",
46
- meta: { client: "graph", method, path, success: true },
47
- });
48
- return JSON.stringify(data, null, 2);
49
- }
50
- catch (err) {
51
- (0, runtime_1.emitNervesEvent)({
52
- level: "error",
53
- event: "client.error",
54
- component: "clients",
55
- message: "Graph request threw exception",
56
- meta: {
57
- client: "graph",
58
- method,
59
- path,
60
- reason: err instanceof Error ? err.message : String(err),
61
- },
62
- });
63
- return (0, api_error_1.handleApiError)(err, "Graph", "graph");
64
- }
14
+ return (0, api_client_1.apiRequest)({
15
+ baseUrl: GRAPH_BASE,
16
+ method,
17
+ path,
18
+ token,
19
+ clientName: "graph",
20
+ serviceLabel: "Graph",
21
+ connectionName: "graph",
22
+ body,
23
+ });
65
24
  }
66
25
  // Backward-compatible thin wrapper: fetches /me and formats as human-readable text.
67
26
  async function getProfile(token) {
@@ -36,9 +36,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.OURO_CLI_TRUST_MANIFEST = void 0;
37
37
  exports.guardInvocation = guardInvocation;
38
38
  const fs = __importStar(require("node:fs"));
39
- const os = __importStar(require("node:os"));
40
- const types_1 = require("../mind/friends/types");
39
+ const path = __importStar(require("node:path"));
40
+ const friends_1 = require("@ouro.bot/friends");
41
41
  const runtime_1 = require("../nerves/runtime");
42
+ const store_1 = require("../commerce/store");
42
43
  const deny = (reason) => ({ allowed: false, reason });
43
44
  const allow = { allowed: true };
44
45
  // --- reason templates ---
@@ -55,17 +56,19 @@ const REASONS = {
55
56
  // --- read-only tools that never need guardrails ---
56
57
  const READ_ONLY_TOOLS = new Set(["read_file", "glob", "grep"]);
57
58
  // --- protected path detection ---
58
- const PROTECTED_PATH_SEGMENTS = [".git/"];
59
- function getProtectedAbsolutePrefixes() {
60
- return [`${os.homedir()}/.agentsecrets/`];
61
- }
59
+ const PROTECTED_PATH_SEGMENTS = [
60
+ ".git/",
61
+ ".ouro-cli/vault-unlock/",
62
+ ".ouro-cli/vault-unlock-dpapi/",
63
+ ];
64
+ const PROTECTED_FILENAMES = ["agent.json"];
62
65
  function isProtectedPath(filePath) {
63
66
  for (const segment of PROTECTED_PATH_SEGMENTS) {
64
67
  if (filePath.includes(`/${segment}`) || filePath.startsWith(segment))
65
68
  return true;
66
69
  }
67
- for (const prefix of getProtectedAbsolutePrefixes()) {
68
- if (filePath.startsWith(prefix))
70
+ for (const name of PROTECTED_FILENAMES) {
71
+ if (path.basename(filePath) === name)
69
72
  return true;
70
73
  }
71
74
  return false;
@@ -155,18 +158,10 @@ exports.OURO_CLI_TRUST_MANIFEST = {
155
158
  whoami: "acquaintance",
156
159
  changelog: "acquaintance",
157
160
  "session list": "acquaintance",
158
- "task board": "friend",
159
- "task create": "friend",
160
- "task update": "friend",
161
- "task show": "friend",
162
- "task actionable": "friend",
163
- "task deps": "friend",
164
- "task sessions": "friend",
165
161
  "friend list": "friend",
166
162
  "friend show": "friend",
167
163
  "friend create": "friend",
168
164
  "friend update": "family",
169
- "reminder create": "friend",
170
165
  "config model": "friend",
171
166
  "config models": "friend",
172
167
  "mcp list": "acquaintance",
@@ -174,6 +169,8 @@ exports.OURO_CLI_TRUST_MANIFEST = {
174
169
  auth: "family",
175
170
  "auth verify": "family",
176
171
  "auth switch": "family",
172
+ rollback: "family",
173
+ versions: "acquaintance",
177
174
  };
178
175
  // --- trust level comparison ---
179
176
  const LEVEL_ORDER = {
@@ -208,6 +205,26 @@ function resolveOuroSubcommand(command) {
208
205
  return tokens[0];
209
206
  return null;
210
207
  }
208
+ // --- MCP server-specific trust rules ---
209
+ const MCP_SERVER_TRUST = {
210
+ browser: { minTrust: "friend", blockGroupChat: true },
211
+ };
212
+ function checkMcpServerTrust(command, context) {
213
+ const match = command.match(/^ouro\s+mcp\s+call\s+(\S+)/);
214
+ if (!match)
215
+ return allow;
216
+ const serverName = match[1];
217
+ const rules = MCP_SERVER_TRUST[serverName];
218
+ if (!rules)
219
+ return allow; // no special rules for this server
220
+ if (!trustLevelSatisfied(rules.minTrust, context.trustLevel ?? "friend")) {
221
+ return deny(REASONS.needsTrust);
222
+ }
223
+ if (rules.blockGroupChat && context.isGroupChat) {
224
+ return deny("browser tools are only available in 1:1 conversations, not group chats.");
225
+ }
226
+ return allow;
227
+ }
211
228
  function checkSingleShellCommandTrust(command, trustLevel) {
212
229
  const trimmed = command.trim();
213
230
  const tokens = trimmed.split(/\s+/);
@@ -259,9 +276,112 @@ function checkWriteTrustGuardrails(toolName, args, context) {
259
276
  return allow;
260
277
  return deny(REASONS.needsTrustForWrite);
261
278
  }
279
+ // --- credential tool trust gating ---
280
+ // Credential write tools: family only
281
+ const CREDENTIAL_FAMILY_TOOLS = new Set([
282
+ "credential_generate_password", "credential_store", "credential_delete", "vault_setup",
283
+ // User profile tools: family only
284
+ "user_profile_store", "user_profile_get", "user_profile_delete",
285
+ // Payment tools: family only
286
+ "stripe_create_card", "stripe_deactivate_card", "stripe_list_cards",
287
+ // Booking tools that involve payment: family only
288
+ "flight_book", "flight_hold", "flight_cancel",
289
+ ]);
290
+ // Credential read tools: friend+
291
+ const CREDENTIAL_TRUSTED_TOOLS = new Set(["credential_get", "credential_list"]);
292
+ // Travel tools: friend+ (weather_lookup accesses vault credentials indirectly;
293
+ // advisory and geocode are public APIs but gated for consistency)
294
+ // Flight search is also friend+ (read-only, no payment)
295
+ const TRAVEL_TRUSTED_TOOLS = new Set(["weather_lookup", "travel_advisory", "geocode_search", "flight_search"]);
296
+ const A2A_TRUSTED_TOOLS = new Set(["a2a_list_peers", "a2a_send_message", "a2a_get_task"]);
297
+ const COMMERCE_FAMILY_TOOLS = new Set(["commerce_checkout_preview", "commerce_checkout_commit", "commerce_receipt_get", "commerce_access_log"]);
298
+ const COMMERCE_AUTHORITY_TOOLS = new Set(["stripe_create_card", "flight_hold", "flight_book"]);
299
+ const MAIL_FAMILY_TOOLS = new Set(["mail_screener", "mail_decide", "mail_access_log", "mail_send", "mail_index_refresh"]);
300
+ const MAIL_DELEGATED_READ_TOOLS = new Set(["mail_recent", "mail_search"]);
301
+ function mailTrustGuardrail(toolName, args, context) {
302
+ if (MAIL_FAMILY_TOOLS.has(toolName)) {
303
+ if (context.trustLevel === undefined || context.trustLevel === "family")
304
+ return allow;
305
+ if (toolName === "mail_send")
306
+ return deny("outbound mail sends require family trust.");
307
+ return deny(toolName === "mail_decide"
308
+ ? "mail screener decisions require family trust."
309
+ : "delegated human mail requires family trust.");
310
+ }
311
+ if (MAIL_DELEGATED_READ_TOOLS.has(toolName)) {
312
+ const scope = (args.scope ?? "").trim().toLowerCase();
313
+ if (scope === "delegated" || scope === "all") {
314
+ if (context.trustLevel === undefined || context.trustLevel === "family")
315
+ return allow;
316
+ return deny("delegated human mail requires family trust.");
317
+ }
318
+ }
319
+ return allow;
320
+ }
321
+ function checkCredentialTrustGuardrails(toolName, context) {
322
+ if (CREDENTIAL_FAMILY_TOOLS.has(toolName) || COMMERCE_FAMILY_TOOLS.has(toolName)) {
323
+ if (context.trustLevel === "family")
324
+ return allow;
325
+ return deny(REASONS.needsTrust);
326
+ }
327
+ if (CREDENTIAL_TRUSTED_TOOLS.has(toolName) || TRAVEL_TRUSTED_TOOLS.has(toolName) || A2A_TRUSTED_TOOLS.has(toolName)) {
328
+ if ((0, friends_1.isTrustedLevel)(context.trustLevel))
329
+ return allow;
330
+ return deny(REASONS.needsTrust);
331
+ }
332
+ return allow;
333
+ }
334
+ function checkCommerceAuthorityGuardrails(toolName, args, context) {
335
+ if (!COMMERCE_AUTHORITY_TOOLS.has(toolName))
336
+ return allow;
337
+ if (!context.agentRoot)
338
+ return deny("commerce authority unavailable: agent root could not be resolved.");
339
+ const result = (0, store_1.validateCommerceAuthority)({
340
+ agentRoot: context.agentRoot,
341
+ token: args.commerce_authority,
342
+ toolName,
343
+ args,
344
+ friendId: context.friendId,
345
+ });
346
+ if (result.ok)
347
+ return allow;
348
+ return deny(`commerce authority required: ${result.reason}`);
349
+ }
350
+ function checkFirstClassMcpTrust(context) {
351
+ if (!context.mcpServerName)
352
+ return allow;
353
+ const rules = MCP_SERVER_TRUST[context.mcpServerName] ?? { minTrust: "friend", blockGroupChat: false };
354
+ if (!trustLevelSatisfied(rules.minTrust, context.trustLevel ?? "friend")) {
355
+ return deny(REASONS.needsTrust);
356
+ }
357
+ if (rules.blockGroupChat && context.isGroupChat) {
358
+ return deny("browser tools are only available in 1:1 conversations, not group chats.");
359
+ }
360
+ return allow;
361
+ }
262
362
  function checkTrustLevelGuardrails(toolName, args, context) {
263
- // Trusted levels (family/friend) — no trust guardrails. Undefined defaults to friend.
264
- if ((0, types_1.isTrustedLevel)(context.trustLevel))
363
+ const mailResult = mailTrustGuardrail(toolName, args, context);
364
+ if (!mailResult.allowed)
365
+ return mailResult;
366
+ // Credential tools have their own trust rules that apply at all levels
367
+ const credentialResult = checkCredentialTrustGuardrails(toolName, context);
368
+ if (!credentialResult.allowed)
369
+ return credentialResult;
370
+ const commerceAuthorityResult = checkCommerceAuthorityGuardrails(toolName, args, context);
371
+ if (!commerceAuthorityResult.allowed)
372
+ return commerceAuthorityResult;
373
+ // First-class MCP tool trust (e.g. browser_navigate) — applies at all trust levels
374
+ const firstClassMcpResult = checkFirstClassMcpTrust(context);
375
+ if (!firstClassMcpResult.allowed)
376
+ return firstClassMcpResult;
377
+ // MCP server-specific trust via shell (e.g. ouro mcp call browser) — applies at all trust levels
378
+ if (toolName === "shell") {
379
+ const mcpResult = checkMcpServerTrust(args.command || "", context);
380
+ if (!mcpResult.allowed)
381
+ return mcpResult;
382
+ }
383
+ // Trusted levels (family/friend) — no further trust guardrails. Undefined defaults to friend.
384
+ if ((0, friends_1.isTrustedLevel)(context.trustLevel))
265
385
  return allow;
266
386
  if (toolName === "shell") {
267
387
  return checkShellTrustGuardrails(args.command || "", context.trustLevel);
@@ -1,11 +1,27 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.McpClient = void 0;
4
+ exports.isMcpTransportError = isMcpTransportError;
4
5
  const child_process_1 = require("child_process");
5
6
  const readline_1 = require("readline");
6
7
  const runtime_1 = require("../nerves/runtime");
8
+ const runtime_cwd_1 = require("../heart/runtime-cwd");
7
9
  const MCP_PROTOCOL_VERSION = "2024-11-05";
10
+ const DEFAULT_REQUEST_TIMEOUT = 10_000;
8
11
  const DEFAULT_TOOL_CALL_TIMEOUT = 30_000;
12
+ function isMcpTransportError(error) {
13
+ const message = error instanceof Error ? error.message : String(error);
14
+ const normalized = message.toLowerCase();
15
+ return normalized.includes("disconnected")
16
+ || normalized.includes("transport")
17
+ || normalized.includes("closed")
18
+ || normalized.includes("econnreset")
19
+ || normalized.includes("econnrefused")
20
+ || normalized.includes("enoent")
21
+ || normalized.includes("epipe")
22
+ || normalized.includes("broken pipe")
23
+ || normalized.includes("not writable");
24
+ }
9
25
  class McpClient {
10
26
  config;
11
27
  process = null;
@@ -18,6 +34,9 @@ class McpClient {
18
34
  this.config = config;
19
35
  }
20
36
  async connect() {
37
+ if (this.connected)
38
+ return;
39
+ this.shutdownProcessOnly();
21
40
  (0, runtime_1.emitNervesEvent)({
22
41
  event: "mcp.connect_start",
23
42
  component: "repertoire",
@@ -25,9 +44,11 @@ class McpClient {
25
44
  meta: { command: this.config.command },
26
45
  });
27
46
  const env = { ...process.env, ...this.config.env };
47
+ const spawnCwd = this.config.cwd ?? (0, runtime_cwd_1.recoverRuntimeCwd)();
28
48
  this.process = (0, child_process_1.spawn)(this.config.command, this.config.args ?? [], {
29
49
  env,
30
50
  stdio: ["pipe", "pipe", "pipe"],
51
+ cwd: spawnCwd,
31
52
  });
32
53
  this.setupLineReader();
33
54
  this.setupProcessHandlers();
@@ -43,6 +64,7 @@ class McpClient {
43
64
  }
44
65
  catch (error) {
45
66
  this.connected = false;
67
+ this.shutdownProcessOnly();
46
68
  (0, runtime_1.emitNervesEvent)({
47
69
  level: "error",
48
70
  event: "mcp.connect_error",
@@ -75,6 +97,10 @@ class McpClient {
75
97
  this.cachedTools = allTools;
76
98
  return allTools;
77
99
  }
100
+ async refreshTools() {
101
+ this.cachedTools = null;
102
+ return this.listTools();
103
+ }
78
104
  async callTool(name, args, timeout = DEFAULT_TOOL_CALL_TIMEOUT) {
79
105
  (0, runtime_1.emitNervesEvent)({
80
106
  event: "mcp.tool_call_start",
@@ -138,7 +164,7 @@ class McpClient {
138
164
  });
139
165
  return result;
140
166
  }
141
- sendRequest(method, params, timeout) {
167
+ sendRequest(method, params, timeout = DEFAULT_REQUEST_TIMEOUT) {
142
168
  return new Promise((resolve, reject) => {
143
169
  if (!this.process || !this.connected && method !== "initialize") {
144
170
  reject(new Error("MCP client is disconnected"));
@@ -159,14 +185,21 @@ class McpClient {
159
185
  method,
160
186
  params,
161
187
  };
162
- this.writeMessage(request);
188
+ if (!this.writeMessage(request)) {
189
+ this.pending.delete(id);
190
+ if (pending.timer) {
191
+ clearTimeout(pending.timer);
192
+ }
193
+ reject(new Error(`MCP transport is not writable for request: ${method}`));
194
+ }
163
195
  });
164
196
  }
165
197
  writeMessage(message) {
166
- /* v8 ignore next -- defensive: stdin always writable during active connection @preserve */
167
198
  if (this.process?.stdin?.writable) {
168
199
  this.process.stdin.write(JSON.stringify(message) + "\n");
200
+ return true;
169
201
  }
202
+ return false;
170
203
  }
171
204
  setupLineReader() {
172
205
  /* v8 ignore next -- defensive: stdout always exists after spawn @preserve */
@@ -250,5 +283,13 @@ class McpClient {
250
283
  this.pending.delete(id);
251
284
  }
252
285
  }
286
+ shutdownProcessOnly() {
287
+ this.rejectAllPending(new Error("MCP transport closed during reconnect"));
288
+ /* v8 ignore next -- defensive: process may already be absent @preserve */
289
+ if (this.process && !this.process.killed) {
290
+ this.process.kill();
291
+ }
292
+ this.process = null;
293
+ }
253
294
  }
254
295
  exports.McpClient = McpClient;