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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (386) hide show
  1. package/README.md +133 -19
  2. package/RepairGuide.ouro/agent.json +5 -0
  3. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  4. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  5. package/RepairGuide.ouro/skills/diagnose-bootstrap-drift.md +54 -0
  6. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  7. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  8. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  9. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  12. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  13. package/changelog.json +3561 -0
  14. package/dist/arc/attention-types.js +8 -0
  15. package/dist/arc/cares.js +140 -0
  16. package/dist/arc/episodes.js +117 -0
  17. package/dist/arc/intentions.js +133 -0
  18. package/dist/arc/json-store.js +117 -0
  19. package/dist/arc/obligations.js +237 -0
  20. package/dist/arc/packets.js +193 -0
  21. package/dist/arc/presence.js +185 -0
  22. package/dist/arc/task-lifecycle.js +65 -0
  23. package/dist/heart/active-work.js +837 -26
  24. package/dist/heart/agent-entry.js +58 -3
  25. package/dist/heart/attachments/image-normalize.js +194 -0
  26. package/dist/heart/attachments/materialize.js +97 -0
  27. package/dist/heart/attachments/originals.js +88 -0
  28. package/dist/heart/attachments/render.js +29 -0
  29. package/dist/heart/attachments/sources/adapter.js +2 -0
  30. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  31. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  32. package/dist/heart/attachments/sources/index.js +16 -0
  33. package/dist/heart/attachments/store.js +103 -0
  34. package/dist/heart/attachments/types.js +93 -0
  35. package/dist/heart/auth/auth-flow.js +479 -0
  36. package/dist/heart/background-operations.js +281 -0
  37. package/dist/heart/bundle-state.js +168 -0
  38. package/dist/heart/commitments.js +111 -0
  39. package/dist/heart/config-registry.js +304 -0
  40. package/dist/heart/config.js +114 -118
  41. package/dist/heart/core.js +925 -246
  42. package/dist/heart/cross-chat-delivery.js +3 -18
  43. package/dist/heart/daemon/agent-config-check.js +512 -0
  44. package/dist/heart/daemon/agent-discovery.js +102 -3
  45. package/dist/heart/daemon/agent-service.js +522 -0
  46. package/dist/heart/daemon/agentic-repair.js +554 -0
  47. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  48. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  49. package/dist/heart/daemon/cadence.js +70 -0
  50. package/dist/heart/daemon/cli-defaults.js +665 -0
  51. package/dist/heart/daemon/cli-exec.js +7565 -0
  52. package/dist/heart/daemon/cli-help.js +498 -0
  53. package/dist/heart/daemon/cli-parse.js +1590 -0
  54. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  55. package/dist/heart/daemon/cli-render.js +775 -0
  56. package/dist/heart/daemon/cli-types.js +8 -0
  57. package/dist/heart/daemon/connect-bay.js +323 -0
  58. package/dist/heart/daemon/daemon-cli.js +29 -1672
  59. package/dist/heart/daemon/daemon-entry.js +417 -2
  60. package/dist/heart/daemon/daemon-health.js +183 -0
  61. package/dist/heart/daemon/daemon-rollup.js +58 -0
  62. package/dist/heart/daemon/daemon-runtime-sync.js +87 -13
  63. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  64. package/dist/heart/daemon/daemon.js +796 -71
  65. package/dist/heart/daemon/dns-workflow.js +394 -0
  66. package/dist/heart/daemon/doctor-types.js +8 -0
  67. package/dist/heart/daemon/doctor.js +844 -0
  68. package/dist/heart/daemon/drift-detection.js +146 -0
  69. package/dist/heart/daemon/health-monitor.js +122 -1
  70. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  71. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  72. package/dist/heart/daemon/http-health-probe.js +80 -0
  73. package/dist/heart/daemon/human-command-screens.js +234 -0
  74. package/dist/heart/daemon/human-readiness.js +114 -0
  75. package/dist/heart/daemon/inner-status.js +102 -0
  76. package/dist/heart/daemon/interactive-repair.js +394 -0
  77. package/dist/heart/daemon/launchd.js +37 -8
  78. package/dist/heart/daemon/log-tailer.js +82 -12
  79. package/dist/heart/daemon/logs-prune.js +110 -0
  80. package/dist/heart/daemon/mcp-canary.js +297 -0
  81. package/dist/heart/daemon/message-router.js +2 -2
  82. package/dist/heart/daemon/os-cron-deps.js +135 -0
  83. package/dist/heart/daemon/os-cron.js +14 -12
  84. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  85. package/dist/heart/daemon/ouro-entry.js +3 -1
  86. package/dist/heart/daemon/process-manager.js +375 -33
  87. package/dist/heart/daemon/provider-discovery.js +137 -0
  88. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  89. package/dist/heart/daemon/pulse.js +475 -0
  90. package/dist/heart/daemon/readiness-repair.js +365 -0
  91. package/dist/heart/daemon/run-hooks.js +2 -0
  92. package/dist/heart/daemon/runtime-logging.js +67 -16
  93. package/dist/heart/daemon/runtime-metadata.js +3 -31
  94. package/dist/heart/daemon/safe-mode.js +161 -0
  95. package/dist/heart/daemon/sense-manager.js +353 -38
  96. package/dist/heart/daemon/session-id-resolver.js +131 -0
  97. package/dist/heart/daemon/skill-management-installer.js +94 -0
  98. package/dist/heart/daemon/socket-client.js +158 -11
  99. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  100. package/dist/heart/daemon/startup-tui.js +330 -0
  101. package/dist/heart/daemon/task-scheduler.js +3 -25
  102. package/dist/heart/daemon/terminal-ui.js +499 -0
  103. package/dist/heart/daemon/thoughts.js +162 -17
  104. package/dist/heart/daemon/up-progress.js +366 -0
  105. package/dist/heart/daemon/vault-items.js +56 -0
  106. package/dist/heart/delegation.js +1 -1
  107. package/dist/heart/habits/habit-migration.js +189 -0
  108. package/dist/heart/habits/habit-parser.js +140 -0
  109. package/dist/heart/habits/habit-runtime-state.js +100 -0
  110. package/dist/heart/habits/habit-scheduler.js +372 -0
  111. package/dist/heart/{daemon → hatch}/hatch-flow.js +52 -117
  112. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  113. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  114. package/dist/heart/{daemon → hatch}/specialist-tools.js +35 -12
  115. package/dist/heart/identity.js +200 -51
  116. package/dist/heart/kept-notes.js +357 -0
  117. package/dist/heart/kicks.js +1 -1
  118. package/dist/heart/machine-identity.js +161 -0
  119. package/dist/heart/mail-import-discovery.js +353 -0
  120. package/dist/heart/mailbox/mailbox-http-hooks.js +66 -0
  121. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  122. package/dist/heart/mailbox/mailbox-http-routes.js +246 -0
  123. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  124. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  125. package/dist/heart/mailbox/mailbox-http.js +99 -0
  126. package/dist/heart/mailbox/mailbox-read.js +31 -0
  127. package/dist/heart/mailbox/mailbox-types.js +27 -0
  128. package/dist/heart/mailbox/mailbox-view.js +195 -0
  129. package/dist/heart/mailbox/readers/agent-machine.js +382 -0
  130. package/dist/heart/mailbox/readers/continuity-readers.js +338 -0
  131. package/dist/heart/mailbox/readers/mail.js +362 -0
  132. package/dist/heart/mailbox/readers/runtime-readers.js +651 -0
  133. package/dist/heart/mailbox/readers/sessions.js +232 -0
  134. package/dist/heart/mailbox/readers/shared.js +111 -0
  135. package/dist/heart/mcp/mcp-server.js +683 -0
  136. package/dist/heart/migrate-config.js +100 -0
  137. package/dist/heart/model-capabilities.js +19 -0
  138. package/dist/heart/platform.js +81 -0
  139. package/dist/heart/provider-attempt.js +134 -0
  140. package/dist/heart/provider-binding-resolver.js +255 -0
  141. package/dist/heart/provider-credentials.js +425 -0
  142. package/dist/heart/provider-failover.js +301 -0
  143. package/dist/heart/provider-models.js +81 -0
  144. package/dist/heart/provider-ping.js +262 -0
  145. package/dist/heart/provider-state.js +216 -0
  146. package/dist/heart/provider-visibility.js +188 -0
  147. package/dist/heart/providers/anthropic-token.js +131 -0
  148. package/dist/heart/providers/anthropic.js +139 -52
  149. package/dist/heart/providers/azure.js +97 -13
  150. package/dist/heart/providers/error-classification.js +127 -0
  151. package/dist/heart/providers/github-copilot.js +145 -0
  152. package/dist/heart/providers/minimax-vlm.js +189 -0
  153. package/dist/heart/providers/minimax.js +26 -8
  154. package/dist/heart/providers/openai-codex.js +55 -40
  155. package/dist/heart/runtime-capability-check.js +170 -0
  156. package/dist/heart/runtime-credentials.js +367 -0
  157. package/dist/heart/runtime-cwd.js +87 -0
  158. package/dist/heart/sense-truth.js +11 -4
  159. package/dist/heart/session-activity.js +43 -22
  160. package/dist/heart/session-events.js +1149 -0
  161. package/dist/heart/session-playback-cli-main.js +5 -0
  162. package/dist/heart/session-playback-cli.js +36 -0
  163. package/dist/heart/session-playback.js +231 -0
  164. package/dist/heart/session-stats-cli-main.js +5 -0
  165. package/dist/heart/session-stats.js +182 -0
  166. package/dist/heart/session-transcript.js +243 -0
  167. package/dist/heart/start-of-turn-packet.js +345 -0
  168. package/dist/heart/streaming.js +44 -27
  169. package/dist/heart/sync-classification.js +176 -0
  170. package/dist/heart/sync.js +449 -0
  171. package/dist/heart/target-resolution.js +9 -5
  172. package/dist/heart/tempo.js +93 -0
  173. package/dist/heart/temporal-view.js +41 -0
  174. package/dist/heart/timeouts.js +101 -0
  175. package/dist/heart/tool-activity-callbacks.js +59 -0
  176. package/dist/heart/tool-description.js +139 -0
  177. package/dist/heart/tool-friction.js +55 -0
  178. package/dist/heart/tool-loop.js +200 -0
  179. package/dist/heart/turn-context.js +381 -0
  180. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  181. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  182. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  183. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  184. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  185. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  186. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  187. package/dist/mailbox-ui/assets/index-BPr5vNuM.css +1 -0
  188. package/dist/mailbox-ui/assets/index-Cm51CY9W.js +61 -0
  189. package/dist/mailbox-ui/index.html +15 -0
  190. package/dist/mailroom/attention.js +167 -0
  191. package/dist/mailroom/autonomy.js +209 -0
  192. package/dist/mailroom/blob-store.js +674 -0
  193. package/dist/mailroom/body-cache.js +61 -0
  194. package/dist/mailroom/core.js +720 -0
  195. package/dist/mailroom/entry.js +160 -0
  196. package/dist/mailroom/file-store.js +430 -0
  197. package/dist/mailroom/mbox-import.js +383 -0
  198. package/dist/mailroom/outbound.js +380 -0
  199. package/dist/mailroom/policy.js +263 -0
  200. package/dist/mailroom/reader.js +233 -0
  201. package/dist/mailroom/search-cache.js +256 -0
  202. package/dist/mailroom/search-relevance.js +319 -0
  203. package/dist/mailroom/smtp-ingress.js +176 -0
  204. package/dist/mailroom/source-state.js +176 -0
  205. package/dist/mailroom/thread.js +109 -0
  206. package/dist/mailroom/travel-extract.js +89 -0
  207. package/dist/mind/bundle-manifest.js +7 -1
  208. package/dist/mind/context.js +165 -101
  209. package/dist/mind/diary-integrity.js +60 -0
  210. package/dist/mind/{memory.js → diary.js} +62 -75
  211. package/dist/mind/embedding-provider.js +60 -0
  212. package/dist/mind/file-state.js +179 -0
  213. package/dist/mind/friends/channel.js +30 -0
  214. package/dist/mind/friends/resolver.js +54 -2
  215. package/dist/mind/friends/store-file.js +39 -3
  216. package/dist/mind/friends/types.js +2 -2
  217. package/dist/mind/journal-index.js +161 -0
  218. package/dist/mind/note-search.js +268 -0
  219. package/dist/mind/obligation-steering.js +221 -0
  220. package/dist/mind/pending.js +4 -0
  221. package/dist/mind/prompt-refresh.js +3 -2
  222. package/dist/mind/prompt.js +995 -123
  223. package/dist/mind/provenance-trust.js +26 -0
  224. package/dist/mind/scrutiny.js +173 -0
  225. package/dist/nerves/cli-logging.js +7 -1
  226. package/dist/nerves/coverage/audit-rules.js +15 -6
  227. package/dist/nerves/coverage/audit.js +28 -2
  228. package/dist/nerves/coverage/cli.js +1 -1
  229. package/dist/nerves/coverage/contract.js +5 -5
  230. package/dist/nerves/coverage/file-completeness.js +139 -5
  231. package/dist/nerves/coverage/run-artifacts.js +1 -1
  232. package/dist/nerves/event-buffer.js +111 -0
  233. package/dist/nerves/index.js +224 -4
  234. package/dist/nerves/observation.js +20 -0
  235. package/dist/nerves/redact.js +79 -0
  236. package/dist/nerves/review/cli-main.js +5 -0
  237. package/dist/nerves/review/cli.js +156 -0
  238. package/dist/nerves/review/core.js +152 -0
  239. package/dist/nerves/runtime.js +5 -1
  240. package/dist/repertoire/ado-client.js +15 -56
  241. package/dist/repertoire/ado-semantic.js +11 -10
  242. package/dist/repertoire/api-client.js +97 -0
  243. package/dist/repertoire/bitwarden-store.js +816 -0
  244. package/dist/repertoire/bundle-templates.js +72 -0
  245. package/dist/repertoire/bw-installer.js +180 -0
  246. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  247. package/dist/repertoire/coding/context-pack.js +330 -0
  248. package/dist/repertoire/coding/feedback.js +197 -30
  249. package/dist/repertoire/coding/manager.js +158 -9
  250. package/dist/repertoire/coding/spawner.js +55 -9
  251. package/dist/repertoire/coding/tools.js +170 -7
  252. package/dist/repertoire/commerce-errors.js +109 -0
  253. package/dist/repertoire/commerce-self-test.js +156 -0
  254. package/dist/repertoire/credential-access.js +111 -0
  255. package/dist/repertoire/duffel-client.js +185 -0
  256. package/dist/repertoire/github-client.js +14 -55
  257. package/dist/repertoire/graph-client.js +11 -52
  258. package/dist/repertoire/guardrails.js +396 -0
  259. package/dist/repertoire/mcp-client.js +295 -0
  260. package/dist/repertoire/mcp-manager.js +362 -0
  261. package/dist/repertoire/mcp-tools.js +63 -0
  262. package/dist/repertoire/shell-sessions.js +133 -0
  263. package/dist/repertoire/skills.js +15 -24
  264. package/dist/repertoire/stripe-client.js +131 -0
  265. package/dist/repertoire/tasks/board.js +31 -5
  266. package/dist/repertoire/tasks/fix.js +182 -0
  267. package/dist/repertoire/tasks/index.js +16 -4
  268. package/dist/repertoire/tasks/lifecycle.js +2 -2
  269. package/dist/repertoire/tasks/parser.js +3 -2
  270. package/dist/repertoire/tasks/scanner.js +194 -37
  271. package/dist/repertoire/tasks/transitions.js +16 -78
  272. package/dist/repertoire/tool-results.js +29 -0
  273. package/dist/repertoire/tools-attachments.js +317 -0
  274. package/dist/repertoire/tools-base.js +47 -1075
  275. package/dist/repertoire/tools-bluebubbles.js +1 -0
  276. package/dist/repertoire/tools-bridge.js +142 -0
  277. package/dist/repertoire/tools-bundle.js +984 -0
  278. package/dist/repertoire/tools-config.js +185 -0
  279. package/dist/repertoire/tools-continuity.js +248 -0
  280. package/dist/repertoire/tools-credential.js +381 -0
  281. package/dist/repertoire/tools-files.js +342 -0
  282. package/dist/repertoire/tools-flight.js +224 -0
  283. package/dist/repertoire/tools-flow.js +119 -0
  284. package/dist/repertoire/tools-github.js +1 -7
  285. package/dist/repertoire/tools-mail.js +1857 -0
  286. package/dist/repertoire/tools-notes.js +421 -0
  287. package/dist/repertoire/tools-session.js +750 -0
  288. package/dist/repertoire/tools-shell.js +120 -0
  289. package/dist/repertoire/tools-stripe.js +180 -0
  290. package/dist/repertoire/tools-surface.js +243 -0
  291. package/dist/repertoire/tools-teams.js +9 -39
  292. package/dist/repertoire/tools-travel.js +125 -0
  293. package/dist/repertoire/tools-trip.js +604 -0
  294. package/dist/repertoire/tools-user-profile.js +144 -0
  295. package/dist/repertoire/tools-vault.js +40 -0
  296. package/dist/repertoire/tools.js +108 -100
  297. package/dist/repertoire/travel-api-client.js +360 -0
  298. package/dist/repertoire/user-profile.js +131 -0
  299. package/dist/repertoire/vault-setup.js +246 -0
  300. package/dist/repertoire/vault-unlock.js +561 -0
  301. package/dist/scripts/claude-code-hook.js +41 -0
  302. package/dist/scripts/claude-code-stop-hook.js +47 -0
  303. package/dist/senses/attention-queue.js +116 -0
  304. package/dist/senses/bluebubbles/active-turns.js +216 -0
  305. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  306. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  307. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  308. package/dist/senses/bluebubbles/entry.js +77 -0
  309. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  310. package/dist/senses/bluebubbles/index.js +2305 -0
  311. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  312. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  313. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  314. package/dist/senses/bluebubbles/processed-log.js +133 -0
  315. package/dist/senses/bluebubbles/replay.js +137 -0
  316. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  317. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  318. package/dist/senses/cli/bracketed-paste.js +82 -0
  319. package/dist/senses/cli/image-paste.js +287 -0
  320. package/dist/senses/cli/image-ref-navigation.js +75 -0
  321. package/dist/senses/cli/ink-app.js +156 -0
  322. package/dist/senses/cli/inline-diff.js +64 -0
  323. package/dist/senses/cli/input-keys.js +174 -0
  324. package/dist/senses/cli/kill-ring.js +86 -0
  325. package/dist/senses/cli/message-list.js +51 -0
  326. package/dist/senses/cli/ouro-tui.js +607 -0
  327. package/dist/senses/cli/spinner-imperative.js +135 -0
  328. package/dist/senses/cli/spinner.js +101 -0
  329. package/dist/senses/cli/status-line.js +60 -0
  330. package/dist/senses/cli/streaming-markdown.js +526 -0
  331. package/dist/senses/cli/tool-display.js +85 -0
  332. package/dist/senses/cli/tool-render.js +85 -0
  333. package/dist/senses/cli/tui-store.js +240 -0
  334. package/dist/senses/cli/virtual-list.js +35 -0
  335. package/dist/senses/cli-entry.js +60 -8
  336. package/dist/senses/cli-layout.js +187 -0
  337. package/dist/senses/cli.js +520 -209
  338. package/dist/senses/commands.js +66 -3
  339. package/dist/senses/habit-turn-message.js +108 -0
  340. package/dist/senses/inner-dialog-worker.js +175 -21
  341. package/dist/senses/inner-dialog.js +330 -27
  342. package/dist/senses/mail-entry.js +66 -0
  343. package/dist/senses/mail.js +379 -0
  344. package/dist/senses/pipeline.js +569 -182
  345. package/dist/senses/proactive-content-guard.js +51 -0
  346. package/dist/senses/shared-turn.js +248 -0
  347. package/dist/senses/surface-tool.js +68 -0
  348. package/dist/senses/teams-entry.js +60 -8
  349. package/dist/senses/teams.js +387 -98
  350. package/dist/senses/trust-gate.js +100 -5
  351. package/dist/trips/core.js +138 -0
  352. package/dist/trips/store.js +146 -0
  353. package/package.json +38 -7
  354. package/skills/agent-commerce.md +106 -0
  355. package/skills/browser-navigation.md +117 -0
  356. package/skills/commerce-setup-guide.md +116 -0
  357. package/skills/commerce-setup.md +84 -0
  358. package/skills/configure-dev-tools.md +101 -0
  359. package/skills/travel-planning.md +138 -0
  360. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  361. package/dist/heart/daemon/subagent-installer.js +0 -166
  362. package/dist/heart/session-recall.js +0 -116
  363. package/dist/mind/associative-recall.js +0 -209
  364. package/dist/senses/bluebubbles-entry.js +0 -13
  365. package/dist/senses/bluebubbles.js +0 -1177
  366. package/dist/senses/debug-activity.js +0 -148
  367. package/subagents/README.md +0 -86
  368. package/subagents/work-doer.md +0 -237
  369. package/subagents/work-merger.md +0 -618
  370. package/subagents/work-planner.md +0 -390
  371. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  372. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  373. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  374. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  375. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  376. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  377. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  378. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  379. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  380. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  381. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  382. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  383. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  384. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  385. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  386. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.shellToolDefinitions = void 0;
4
+ const child_process_1 = require("child_process");
5
+ const shell_sessions_1 = require("./shell-sessions");
6
+ const identity_1 = require("../heart/identity");
7
+ const runtime_1 = require("../nerves/runtime");
8
+ exports.shellToolDefinitions = [
9
+ {
10
+ tool: {
11
+ type: "function",
12
+ function: {
13
+ name: "shell",
14
+ description: "Run a shell command and return stdout/stderr. Working directory persists between calls. Use dedicated tools instead of shell when available: read_file instead of cat, edit_file instead of sed, glob instead of find, grep instead of grep/rg. Reserve shell for operations that genuinely need the shell: installing packages, running builds/tests, git operations, process management. Be careful with destructive commands -- consider reversibility before running. If a command fails, read the error output before retrying with a different approach.",
15
+ parameters: {
16
+ type: "object",
17
+ properties: {
18
+ command: { type: "string" },
19
+ timeout_ms: {
20
+ type: "number",
21
+ description: "Timeout in milliseconds. Default: 30000. Max: 600000.",
22
+ },
23
+ background: {
24
+ type: "boolean",
25
+ description: "Run in background. Returns immediately with a process ID. Use shell_status/shell_tail to monitor.",
26
+ },
27
+ },
28
+ required: ["command"],
29
+ },
30
+ },
31
+ },
32
+ handler: (a) => {
33
+ // Destructive pattern detection (friction, not a block)
34
+ const destructivePatterns = (0, shell_sessions_1.detectDestructivePatterns)(a.command);
35
+ if (destructivePatterns.length > 0) {
36
+ (0, runtime_1.emitNervesEvent)({
37
+ level: "warn",
38
+ event: "tool.shell.destructive_detected",
39
+ component: "tools",
40
+ message: `destructive pattern detected: ${destructivePatterns.join(", ")}`,
41
+ meta: { command: a.command, patterns: destructivePatterns },
42
+ });
43
+ }
44
+ // Background mode: spawn and return immediately
45
+ if (a.background === "true") {
46
+ const session = (0, shell_sessions_1.spawnBackgroundShell)(a.command);
47
+ return JSON.stringify({ id: session.id, command: session.command, status: session.status });
48
+ }
49
+ const MAX_TIMEOUT = 600000;
50
+ const requestedTimeout = Number(a.timeout_ms) || 0;
51
+ let configDefault = 30000;
52
+ try {
53
+ configDefault = (0, identity_1.loadAgentConfig)().shell?.defaultTimeout ?? 30000;
54
+ }
55
+ catch { /* test env: no --agent flag */ }
56
+ const baseTimeout = requestedTimeout > 0 ? requestedTimeout : configDefault;
57
+ const timeout = Math.min(baseTimeout, MAX_TIMEOUT);
58
+ const output = (0, child_process_1.execSync)(a.command, {
59
+ encoding: "utf-8",
60
+ timeout,
61
+ });
62
+ if (destructivePatterns.length > 0) {
63
+ return `${output}\n\n--- destructive pattern detected: ${destructivePatterns.join(", ")} ---`;
64
+ }
65
+ return output;
66
+ },
67
+ summaryKeys: ["command"],
68
+ },
69
+ {
70
+ tool: {
71
+ type: "function",
72
+ function: {
73
+ name: "shell_status",
74
+ description: "Check status of background shell processes. Omit id to list all.",
75
+ parameters: {
76
+ type: "object",
77
+ properties: {
78
+ id: { type: "string", description: "Background shell process ID" },
79
+ },
80
+ },
81
+ },
82
+ },
83
+ handler: (a) => {
84
+ if (!a.id) {
85
+ return JSON.stringify((0, shell_sessions_1.listShellSessions)());
86
+ }
87
+ const session = (0, shell_sessions_1.getShellSession)(a.id);
88
+ if (!session)
89
+ return `process not found: ${a.id}`;
90
+ return JSON.stringify(session);
91
+ },
92
+ summaryKeys: ["id"],
93
+ },
94
+ {
95
+ tool: {
96
+ type: "function",
97
+ function: {
98
+ name: "shell_tail",
99
+ description: "Show recent output from a background shell process.",
100
+ parameters: {
101
+ type: "object",
102
+ properties: {
103
+ id: { type: "string", description: "Background shell process ID" },
104
+ },
105
+ required: ["id"],
106
+ },
107
+ },
108
+ },
109
+ handler: (a) => {
110
+ /* v8 ignore next -- schema requires id, defensive guard @preserve */
111
+ if (!a.id)
112
+ return "id is required";
113
+ const output = (0, shell_sessions_1.tailShellSession)(a.id);
114
+ if (output === undefined)
115
+ return `process not found: ${a.id}`;
116
+ return output || "(no output yet)";
117
+ },
118
+ summaryKeys: ["id"],
119
+ },
120
+ ];
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.stripeToolDefinitions = void 0;
4
+ exports.resetStripeClient = resetStripeClient;
5
+ const stripe_client_1 = require("./stripe-client");
6
+ const runtime_1 = require("../nerves/runtime");
7
+ // Lazy-initialized Stripe client singleton
8
+ let _stripeClient = null;
9
+ async function getStripeClient() {
10
+ if (!_stripeClient) {
11
+ _stripeClient = await (0, stripe_client_1.createStripeClient)();
12
+ }
13
+ return _stripeClient;
14
+ }
15
+ function requireFamilyContext(ctx) {
16
+ if (!ctx?.context?.friend?.id) {
17
+ return "no friend context — cannot access payment tools.";
18
+ }
19
+ if (ctx.context.friend.trustLevel !== "family") {
20
+ return "payment tools require family trust level.";
21
+ }
22
+ return { friendId: ctx.context.friend.id };
23
+ }
24
+ exports.stripeToolDefinitions = [
25
+ {
26
+ tool: {
27
+ type: "function",
28
+ function: {
29
+ name: "stripe_create_card",
30
+ description: "Create a virtual card for a transaction. Returns card ID and last 4 digits (never the full card number). Requires family trust level.",
31
+ parameters: {
32
+ type: "object",
33
+ properties: {
34
+ type: {
35
+ type: "string",
36
+ enum: ["single_use", "persistent"],
37
+ description: "Card type: single_use (one transaction) or persistent (recurring)",
38
+ },
39
+ spend_limit: {
40
+ type: "string",
41
+ description: "Maximum spend limit in dollars (e.g. '500')",
42
+ },
43
+ currency: {
44
+ type: "string",
45
+ description: "Currency code (e.g. 'usd')",
46
+ },
47
+ merchant_categories: {
48
+ type: "string",
49
+ description: "Comma-separated allowed merchant categories (optional)",
50
+ },
51
+ },
52
+ required: ["type", "spend_limit", "currency"],
53
+ },
54
+ },
55
+ },
56
+ handler: async (args, ctx) => {
57
+ (0, runtime_1.emitNervesEvent)({
58
+ component: "repertoire",
59
+ event: "repertoire.tool_stripe_create_card",
60
+ message: "stripe_create_card invoked",
61
+ meta: { tool: "stripe_create_card" },
62
+ });
63
+ const guard = requireFamilyContext(ctx);
64
+ if (typeof guard === "string")
65
+ return guard;
66
+ try {
67
+ const client = await getStripeClient();
68
+ const categories = args.merchant_categories
69
+ ? args.merchant_categories.split(",").map((c) => c.trim())
70
+ : undefined;
71
+ const card = await client.createVirtualCard({
72
+ type: args.type,
73
+ spendLimit: parseFloat(args.spend_limit),
74
+ currency: args.currency,
75
+ merchantCategories: categories,
76
+ });
77
+ return JSON.stringify({
78
+ cardId: card.cardId,
79
+ last4: card.last4,
80
+ status: card.status,
81
+ spendLimit: args.spend_limit,
82
+ });
83
+ }
84
+ catch (err) {
85
+ /* v8 ignore next -- defensive: Stripe errors are always Error instances @preserve */
86
+ return `card creation error: ${err instanceof Error ? err.message : String(err)}`;
87
+ }
88
+ },
89
+ summaryKeys: ["type", "spend_limit", "currency"],
90
+ },
91
+ {
92
+ tool: {
93
+ type: "function",
94
+ function: {
95
+ name: "stripe_deactivate_card",
96
+ description: "Deactivate (cancel) a virtual card. Use after a transaction is complete or to revoke access. Requires family trust level.",
97
+ parameters: {
98
+ type: "object",
99
+ properties: {
100
+ card_id: {
101
+ type: "string",
102
+ description: "The Stripe card ID to deactivate (e.g. 'ic_...')",
103
+ },
104
+ },
105
+ required: ["card_id"],
106
+ },
107
+ },
108
+ },
109
+ handler: async (args, ctx) => {
110
+ (0, runtime_1.emitNervesEvent)({
111
+ component: "repertoire",
112
+ event: "repertoire.tool_stripe_deactivate_card",
113
+ message: "stripe_deactivate_card invoked",
114
+ meta: { tool: "stripe_deactivate_card", cardId: args.card_id },
115
+ });
116
+ const guard = requireFamilyContext(ctx);
117
+ if (typeof guard === "string")
118
+ return guard;
119
+ try {
120
+ const client = await getStripeClient();
121
+ const card = await client.deactivateCard(args.card_id);
122
+ return JSON.stringify({
123
+ cardId: card.cardId,
124
+ last4: card.last4,
125
+ status: card.status,
126
+ });
127
+ }
128
+ catch (err) {
129
+ /* v8 ignore next -- defensive: Stripe errors are always Error instances @preserve */
130
+ return `card deactivation error: ${err instanceof Error ? err.message : String(err)}`;
131
+ }
132
+ },
133
+ summaryKeys: ["card_id"],
134
+ },
135
+ {
136
+ tool: {
137
+ type: "function",
138
+ function: {
139
+ name: "stripe_list_cards",
140
+ description: "List all active virtual cards. Shows card IDs and last 4 digits only. Requires family trust level.",
141
+ parameters: {
142
+ type: "object",
143
+ properties: {},
144
+ },
145
+ },
146
+ },
147
+ handler: async (_args, ctx) => {
148
+ (0, runtime_1.emitNervesEvent)({
149
+ component: "repertoire",
150
+ event: "repertoire.tool_stripe_list_cards",
151
+ message: "stripe_list_cards invoked",
152
+ meta: { tool: "stripe_list_cards" },
153
+ });
154
+ const guard = requireFamilyContext(ctx);
155
+ if (typeof guard === "string")
156
+ return guard;
157
+ try {
158
+ const client = await getStripeClient();
159
+ const cards = await client.listCards();
160
+ if (cards.length === 0) {
161
+ return "no active cards.";
162
+ }
163
+ return JSON.stringify(cards.map((c) => ({
164
+ cardId: c.cardId,
165
+ last4: c.last4,
166
+ status: c.status,
167
+ })));
168
+ }
169
+ catch (err) {
170
+ /* v8 ignore next -- defensive: Stripe errors are always Error instances @preserve */
171
+ return `card listing error: ${err instanceof Error ? err.message : String(err)}`;
172
+ }
173
+ },
174
+ summaryKeys: [],
175
+ },
176
+ ];
177
+ /** Reset the Stripe client singleton (for testing). */
178
+ function resetStripeClient() {
179
+ _stripeClient = null;
180
+ }
@@ -0,0 +1,243 @@
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.surfaceToolDefinition = exports.surfaceToolDef = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const identity_1 = require("../heart/identity");
39
+ const surface_tool_1 = require("../senses/surface-tool");
40
+ const obligations_1 = require("../arc/obligations");
41
+ const session_activity_1 = require("../heart/session-activity");
42
+ const path = __importStar(require("path"));
43
+ // Surface tool schema — canonical home. Handler lives in senses/surface-tool.ts.
44
+ exports.surfaceToolDef = {
45
+ type: "function",
46
+ function: {
47
+ name: "surface",
48
+ description: "send a message to someone — write it the way you'd text a friend. pass delegationId to address a held thought (see your attention queue above), or friendId for spontaneous outreach. does not end your turn.",
49
+ parameters: {
50
+ type: "object",
51
+ properties: {
52
+ content: {
53
+ type: "string",
54
+ description: "the message to deliver",
55
+ },
56
+ delegationId: {
57
+ type: "string",
58
+ description: "ID from your attention queue — addresses a specific held thought",
59
+ },
60
+ friendId: {
61
+ type: "string",
62
+ description: "friend to reach out to spontaneously (when not addressing a held thought)",
63
+ },
64
+ },
65
+ required: ["content"],
66
+ },
67
+ },
68
+ };
69
+ // Surface tool handler: routes content to friend's freshest session
70
+ /* v8 ignore start -- surface handler wiring: core logic tested via surface-tool.test.ts; this wires identity/routing deps @preserve */
71
+ exports.surfaceToolDefinition = {
72
+ tool: exports.surfaceToolDef,
73
+ handler: async (args, ctx) => {
74
+ const queue = ctx?.delegatedOrigins ?? [];
75
+ const agentName = (() => { try {
76
+ return (0, identity_1.getAgentName)();
77
+ }
78
+ catch {
79
+ return "unknown";
80
+ } })();
81
+ const routeToFriend = async (friendId, content, queueItem) => {
82
+ /* v8 ignore start -- routing: integration path tested via inner-dialog routing tests @preserve */
83
+ try {
84
+ const agentRoot = (0, identity_1.getAgentRoot)();
85
+ const sessionsDir = path.join(agentRoot, "state", "sessions");
86
+ const friendsDir = path.join(agentRoot, "friends");
87
+ // Resolve friend name → UUID if needed (agents may pass name instead of UUID)
88
+ let resolvedFriendId = friendId;
89
+ if (!fs.existsSync(path.join(sessionsDir, friendId))) {
90
+ try {
91
+ const friendFiles = fs.readdirSync(friendsDir).filter((f) => f.endsWith(".json"));
92
+ for (const file of friendFiles) {
93
+ const raw = fs.readFileSync(path.join(friendsDir, file), "utf-8");
94
+ const record = JSON.parse(raw);
95
+ if (record.name?.toLowerCase() === friendId.toLowerCase() && record.id) {
96
+ resolvedFriendId = record.id;
97
+ break;
98
+ }
99
+ }
100
+ }
101
+ catch { /* friends dir unreadable — continue with original friendId */ }
102
+ }
103
+ friendId = resolvedFriendId;
104
+ // Priority 1: Bridge-preferred session (if queue item has a bridgeId)
105
+ if (queueItem?.bridgeId) {
106
+ const { createBridgeManager } = await Promise.resolve().then(() => __importStar(require("../heart/bridges/manager")));
107
+ const bridge = createBridgeManager().getBridge(queueItem.bridgeId);
108
+ if (bridge && bridge.lifecycle !== "completed" && bridge.lifecycle !== "cancelled") {
109
+ const allSessions = (0, session_activity_1.listSessionActivity)({ sessionsDir, friendsDir, agentName, activeThresholdMs: Number.MAX_SAFE_INTEGER });
110
+ const bridgeTarget = allSessions.find((activity) => activity.friendId === friendId
111
+ && activity.channel !== "inner"
112
+ && bridge.attachedSessions.some((s) => s.friendId === activity.friendId && s.channel === activity.channel && s.key === activity.key));
113
+ if (bridgeTarget) {
114
+ // Attempt proactive BB delivery for bridge target
115
+ if (bridgeTarget.channel === "bluebubbles") {
116
+ const { sendProactiveBlueBubblesMessageToSession } = await Promise.resolve().then(() => __importStar(require("../senses/bluebubbles")));
117
+ const proactiveResult = await sendProactiveBlueBubblesMessageToSession({
118
+ friendId: bridgeTarget.friendId,
119
+ sessionKey: bridgeTarget.key,
120
+ text: content,
121
+ intent: "explicit_cross_chat",
122
+ });
123
+ if (proactiveResult.delivered) {
124
+ // Inject surfaced content into the target session so it knows what was delivered
125
+ const { appendSyntheticAssistantMessage } = await Promise.resolve().then(() => __importStar(require("../mind/context")));
126
+ const sessionFilePath = path.join(sessionsDir, bridgeTarget.friendId, bridgeTarget.channel, `${bridgeTarget.key}.json`);
127
+ appendSyntheticAssistantMessage(sessionFilePath, content);
128
+ return { status: "delivered", detail: "via iMessage" };
129
+ }
130
+ }
131
+ // Fall back to pending queue for bridge target
132
+ const { queuePendingMessage, getPendingDir } = await Promise.resolve().then(() => __importStar(require("../mind/pending")));
133
+ const pendingDir = getPendingDir(agentName, bridgeTarget.friendId, bridgeTarget.channel, bridgeTarget.key);
134
+ queuePendingMessage(pendingDir, {
135
+ from: agentName,
136
+ friendId: bridgeTarget.friendId,
137
+ channel: bridgeTarget.channel,
138
+ key: bridgeTarget.key,
139
+ content,
140
+ timestamp: Date.now(),
141
+ });
142
+ return { status: "queued", detail: `for next interaction via ${bridgeTarget.channel}` };
143
+ }
144
+ }
145
+ }
146
+ // Priority 2: Try proactive delivery first, then queue to freshest session
147
+ const allFriendSessions = (0, session_activity_1.listSessionActivity)({ sessionsDir, friendsDir, agentName, activeThresholdMs: Number.MAX_SAFE_INTEGER })
148
+ .filter((s) => s.friendId === friendId && s.channel !== "inner");
149
+ // 2a: Attempt proactive BB delivery on a DM session (;-; = individual, never ;+; = group)
150
+ const bbSession = allFriendSessions.find((s) => s.channel === "bluebubbles" && s.key.includes(";-;"));
151
+ if (bbSession) {
152
+ const { sendProactiveBlueBubblesMessageToSession } = await Promise.resolve().then(() => __importStar(require("../senses/bluebubbles")));
153
+ const proactiveResult = await sendProactiveBlueBubblesMessageToSession({
154
+ friendId: bbSession.friendId,
155
+ sessionKey: bbSession.key,
156
+ text: content,
157
+ });
158
+ if (proactiveResult.delivered) {
159
+ const { appendSyntheticAssistantMessage } = await Promise.resolve().then(() => __importStar(require("../mind/context")));
160
+ const sessionFilePath = path.join(sessionsDir, bbSession.friendId, bbSession.channel, `${bbSession.key}.json`);
161
+ appendSyntheticAssistantMessage(sessionFilePath, content);
162
+ return { status: "delivered", detail: "via iMessage" };
163
+ }
164
+ }
165
+ // 2b: No proactive delivery — queue to freshest non-inner session
166
+ const freshest = allFriendSessions[0];
167
+ if (freshest) {
168
+ const { queuePendingMessage, getPendingDir } = await Promise.resolve().then(() => __importStar(require("../mind/pending")));
169
+ const pendingDir = getPendingDir(agentName, freshest.friendId, freshest.channel, freshest.key);
170
+ queuePendingMessage(pendingDir, {
171
+ from: agentName,
172
+ friendId: freshest.friendId,
173
+ channel: freshest.channel,
174
+ key: freshest.key,
175
+ content,
176
+ timestamp: Date.now(),
177
+ });
178
+ return { status: "queued", detail: `for next interaction via ${freshest.channel}` };
179
+ }
180
+ // Priority 3: Deferred — no active session found
181
+ const { getDeferredReturnDir } = await Promise.resolve().then(() => __importStar(require("../mind/pending")));
182
+ const { queuePendingMessage: queueDeferred } = await Promise.resolve().then(() => __importStar(require("../mind/pending")));
183
+ const deferredDir = getDeferredReturnDir(agentName, friendId);
184
+ queueDeferred(deferredDir, {
185
+ from: agentName,
186
+ friendId,
187
+ channel: "deferred",
188
+ key: "return",
189
+ content,
190
+ timestamp: Date.now(),
191
+ });
192
+ return { status: "deferred", detail: "they'll see it next time" };
193
+ }
194
+ catch {
195
+ return { status: "failed" };
196
+ }
197
+ /* v8 ignore stop */
198
+ };
199
+ return (0, surface_tool_1.handleSurface)({
200
+ content: args.content ?? "",
201
+ delegationId: args.delegationId,
202
+ friendId: args.friendId,
203
+ queue,
204
+ routeToFriend,
205
+ advanceObligation: (obligationId, update) => {
206
+ /* v8 ignore start -- obligation advance: tested via attention-queue tests @preserve */
207
+ try {
208
+ const name = (() => { try {
209
+ return (0, identity_1.getAgentName)();
210
+ }
211
+ catch {
212
+ return "unknown";
213
+ } })();
214
+ (0, obligations_1.advanceReturnObligation)(name, obligationId, {
215
+ status: update.status,
216
+ ...(update.returnedAt !== undefined ? { returnedAt: update.returnedAt } : {}),
217
+ ...(update.returnTarget !== undefined ? { returnTarget: update.returnTarget } : {}),
218
+ });
219
+ }
220
+ catch {
221
+ // swallowed — obligation advance must never break surface delivery
222
+ }
223
+ /* v8 ignore stop */
224
+ },
225
+ fulfillHeartObligation: (origin) => {
226
+ /* v8 ignore start -- heart obligation fulfillment: tested via surface-tool.test.ts @preserve */
227
+ try {
228
+ const agentRoot = (0, identity_1.getAgentRoot)();
229
+ const heartObligation = (0, obligations_1.findPendingObligationForOrigin)(agentRoot, origin);
230
+ if (heartObligation) {
231
+ (0, obligations_1.fulfillObligation)(agentRoot, heartObligation.id);
232
+ }
233
+ }
234
+ catch {
235
+ // swallowed — heart obligation fulfillment must never break surface delivery
236
+ }
237
+ /* v8 ignore stop */
238
+ },
239
+ });
240
+ },
241
+ summaryKeys: ["content", "delegationId"],
242
+ };
243
+ /* v8 ignore stop */
@@ -4,7 +4,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.teamsToolDefinitions = void 0;
7
- exports.summarizeTeamsArgs = summarizeTeamsArgs;
8
7
  const graph_client_1 = require("./graph-client");
9
8
  const ado_client_1 = require("./ado-client");
10
9
  const graph_endpoints_json_1 = __importDefault(require("./data/graph-endpoints.json"));
@@ -36,6 +35,7 @@ exports.teamsToolDefinitions = [
36
35
  return (0, graph_client_1.graphRequest)(ctx.graphToken, "GET", args.path);
37
36
  },
38
37
  integration: "graph",
38
+ summaryKeys: ["path"],
39
39
  },
40
40
  {
41
41
  tool: {
@@ -64,7 +64,7 @@ exports.teamsToolDefinitions = [
64
64
  return (0, graph_client_1.graphRequest)(ctx.graphToken, args.method, args.path, args.body);
65
65
  },
66
66
  integration: "graph",
67
- confirmationRequired: true,
67
+ summaryKeys: ["method", "path"],
68
68
  },
69
69
  // -- Generic ADO tools --
70
70
  {
@@ -94,6 +94,7 @@ exports.teamsToolDefinitions = [
94
94
  return (0, ado_client_1.adoRequest)(ctx.adoToken, method, args.organization, args.path, args.body, args.host);
95
95
  },
96
96
  integration: "ado",
97
+ summaryKeys: ["method", "organization", "path"],
97
98
  },
98
99
  {
99
100
  tool: {
@@ -124,7 +125,7 @@ exports.teamsToolDefinitions = [
124
125
  return (0, ado_client_1.adoRequest)(ctx.adoToken, args.method, args.organization, args.path, args.body, args.host);
125
126
  },
126
127
  integration: "ado",
127
- confirmationRequired: true,
128
+ summaryKeys: ["method", "organization", "path"],
128
129
  },
129
130
  // -- Convenience aliases (backward compat) --
130
131
  {
@@ -143,6 +144,7 @@ exports.teamsToolDefinitions = [
143
144
  return (0, graph_client_1.getProfile)(ctx.graphToken);
144
145
  },
145
146
  integration: "graph",
147
+ summaryKeys: [],
146
148
  },
147
149
  {
148
150
  tool: {
@@ -186,6 +188,7 @@ exports.teamsToolDefinitions = [
186
188
  return (0, ado_client_1.queryWorkItems)(ctx.adoToken, org, query);
187
189
  },
188
190
  integration: "ado",
191
+ summaryKeys: ["organization", "query"],
189
192
  },
190
193
  // -- Proactive messaging --
191
194
  {
@@ -232,7 +235,7 @@ exports.teamsToolDefinitions = [
232
235
  }
233
236
  },
234
237
  /* v8 ignore stop */
235
- confirmationRequired: true,
238
+ summaryKeys: ["user_name", "user_id"],
236
239
  },
237
240
  // -- Documentation tools --
238
241
  {
@@ -254,6 +257,7 @@ exports.teamsToolDefinitions = [
254
257
  return searchEndpoints(graph_endpoints_json_1.default, args.query || "");
255
258
  },
256
259
  integration: "graph",
260
+ summaryKeys: ["query"],
257
261
  },
258
262
  {
259
263
  tool: {
@@ -274,6 +278,7 @@ exports.teamsToolDefinitions = [
274
278
  return searchEndpoints(ado_endpoints_json_1.default, args.query || "");
275
279
  },
276
280
  integration: "ado",
281
+ summaryKeys: ["query"],
277
282
  },
278
283
  ];
279
284
  function searchEndpoints(entries, query) {
@@ -304,38 +309,3 @@ function searchEndpoints(entries, query) {
304
309
  return lines.join("\n");
305
310
  }).join("\n\n");
306
311
  }
307
- function summarizeTeamsArgs(name, args) {
308
- function summarizeKeyValues(keys) {
309
- const parts = [];
310
- for (const key of keys) {
311
- const raw = args[key];
312
- if (raw === undefined || raw === null)
313
- continue;
314
- const compact = String(raw).replace(/\s+/g, " ").trim();
315
- if (!compact)
316
- continue;
317
- const clipped = compact.length > 60 ? compact.slice(0, 60) + "..." : compact;
318
- parts.push(`${key}=${clipped}`);
319
- }
320
- return parts.join(" ");
321
- }
322
- if (name === "graph_profile")
323
- return "";
324
- if (name === "ado_work_items")
325
- return summarizeKeyValues(["organization", "query"]);
326
- if (name === "graph_query")
327
- return summarizeKeyValues(["path"]);
328
- if (name === "graph_mutate")
329
- return summarizeKeyValues(["method", "path"]);
330
- if (name === "ado_query")
331
- return summarizeKeyValues(["method", "organization", "path"]);
332
- if (name === "ado_mutate")
333
- return summarizeKeyValues(["method", "organization", "path"]);
334
- if (name === "graph_docs")
335
- return summarizeKeyValues(["query"]);
336
- if (name === "ado_docs")
337
- return summarizeKeyValues(["query"]);
338
- if (name === "teams_send_message")
339
- return summarizeKeyValues(["user_name", "user_id"]);
340
- return undefined;
341
- }