@ouro.bot/cli 0.1.0-alpha.66 → 0.1.0-alpha.661

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 (449) hide show
  1. package/README.md +127 -23
  2. package/RepairGuide.ouro/agent.json +5 -0
  3. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  4. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  5. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  6. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  7. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  8. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  9. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  12. package/changelog.json +4216 -13
  13. package/dist/a2a/card.js +56 -0
  14. package/dist/a2a/client.js +143 -0
  15. package/dist/a2a/config.js +50 -0
  16. package/dist/a2a/onboarding.js +111 -0
  17. package/dist/a2a/server.js +498 -0
  18. package/dist/a2a/task-store.js +69 -0
  19. package/dist/a2a/types.js +3 -0
  20. package/dist/arc/attention-types.js +8 -0
  21. package/dist/arc/cares.js +144 -0
  22. package/dist/arc/episodes.js +118 -0
  23. package/dist/arc/evolution.js +487 -0
  24. package/dist/arc/flight-recorder.js +369 -0
  25. package/dist/arc/intentions.js +134 -0
  26. package/dist/arc/json-store.js +117 -0
  27. package/dist/arc/obligations.js +292 -0
  28. package/dist/arc/packets.js +288 -0
  29. package/dist/arc/presence.js +185 -0
  30. package/dist/arc/task-lifecycle.js +57 -0
  31. package/dist/commerce/store.js +755 -0
  32. package/dist/commerce/types.js +3 -0
  33. package/dist/heart/active-work.js +860 -43
  34. package/dist/heart/agent-entry.js +69 -3
  35. package/dist/heart/attachments/image-normalize.js +194 -0
  36. package/dist/heart/attachments/materialize.js +97 -0
  37. package/dist/heart/attachments/originals.js +88 -0
  38. package/dist/heart/attachments/render.js +29 -0
  39. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  40. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  41. package/dist/heart/attachments/sources/index.js +16 -0
  42. package/dist/heart/attachments/store.js +103 -0
  43. package/dist/heart/attachments/types.js +93 -0
  44. package/dist/heart/auth/auth-flow.js +479 -0
  45. package/dist/heart/awaiting/await-alert.js +146 -0
  46. package/dist/heart/awaiting/await-expiry.js +108 -0
  47. package/dist/heart/awaiting/await-loader.js +91 -0
  48. package/dist/heart/awaiting/await-parser.js +141 -0
  49. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  50. package/dist/heart/awaiting/await-scheduler.js +377 -0
  51. package/dist/heart/background-operations.js +281 -0
  52. package/dist/heart/bridges/manager.js +137 -17
  53. package/dist/heart/bridges/store.js +14 -2
  54. package/dist/heart/bundle-state.js +168 -0
  55. package/dist/heart/commitments.js +135 -0
  56. package/dist/heart/config-registry.js +331 -0
  57. package/dist/heart/config.js +118 -119
  58. package/dist/heart/context-loss-gauntlet.js +354 -0
  59. package/dist/heart/core.js +1123 -247
  60. package/dist/heart/cross-chat-delivery.js +3 -18
  61. package/dist/heart/daemon/agent-config-check.js +419 -0
  62. package/dist/heart/daemon/agent-discovery.js +102 -3
  63. package/dist/heart/daemon/agent-service.js +523 -0
  64. package/dist/heart/daemon/agentic-repair.js +547 -0
  65. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  66. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  67. package/dist/heart/daemon/cadence.js +70 -0
  68. package/dist/heart/daemon/cli-defaults.js +780 -0
  69. package/dist/heart/daemon/cli-desk.js +322 -0
  70. package/dist/heart/daemon/cli-exec.js +7767 -0
  71. package/dist/heart/daemon/cli-help.js +558 -0
  72. package/dist/heart/daemon/cli-parse.js +1688 -0
  73. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  74. package/dist/heart/daemon/cli-render.js +763 -0
  75. package/dist/heart/daemon/cli-types.js +8 -0
  76. package/dist/heart/daemon/connect-bay.js +323 -0
  77. package/dist/heart/daemon/daemon-cli.js +29 -1750
  78. package/dist/heart/daemon/daemon-entry.js +485 -2
  79. package/dist/heart/daemon/daemon-health.js +176 -0
  80. package/dist/heart/daemon/daemon-rollup.js +57 -0
  81. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  82. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  83. package/dist/heart/daemon/daemon.js +937 -74
  84. package/dist/heart/daemon/dns-workflow.js +394 -0
  85. package/dist/heart/daemon/doctor-types.js +8 -0
  86. package/dist/heart/daemon/doctor.js +873 -0
  87. package/dist/heart/daemon/health-monitor.js +122 -1
  88. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  89. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  90. package/dist/heart/daemon/http-health-probe.js +80 -0
  91. package/dist/heart/daemon/human-command-screens.js +234 -0
  92. package/dist/heart/daemon/human-readiness.js +114 -0
  93. package/dist/heart/daemon/inner-status.js +78 -0
  94. package/dist/heart/daemon/interactive-repair.js +394 -0
  95. package/dist/heart/daemon/launchd.js +37 -8
  96. package/dist/heart/daemon/log-tailer.js +79 -10
  97. package/dist/heart/daemon/logs-prune.js +110 -0
  98. package/dist/heart/daemon/mcp-canary.js +297 -0
  99. package/dist/heart/daemon/message-router.js +6 -2
  100. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  101. package/dist/heart/daemon/os-cron-deps.js +135 -0
  102. package/dist/heart/daemon/os-cron.js +14 -12
  103. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  104. package/dist/heart/daemon/ouro-entry.js +3 -1
  105. package/dist/heart/daemon/plugin-cli.js +432 -0
  106. package/dist/heart/daemon/process-manager.js +511 -40
  107. package/dist/heart/daemon/provider-discovery.js +137 -0
  108. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  109. package/dist/heart/daemon/pulse.js +475 -0
  110. package/dist/heart/daemon/readiness-repair.js +365 -0
  111. package/dist/heart/daemon/run-hooks.js +2 -0
  112. package/dist/heart/daemon/runtime-logging.js +35 -14
  113. package/dist/heart/daemon/runtime-metadata.js +2 -30
  114. package/dist/heart/daemon/safe-mode.js +161 -0
  115. package/dist/heart/daemon/sense-manager.js +564 -38
  116. package/dist/heart/daemon/session-id-resolver.js +131 -0
  117. package/dist/heart/daemon/skill-management-installer.js +1 -1
  118. package/dist/heart/daemon/socket-client.js +158 -11
  119. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  120. package/dist/heart/daemon/startup-tui.js +330 -0
  121. package/dist/heart/daemon/task-scheduler.js +117 -39
  122. package/dist/heart/daemon/terminal-ui.js +499 -0
  123. package/dist/heart/daemon/thoughts.js +229 -17
  124. package/dist/heart/daemon/up-progress.js +366 -0
  125. package/dist/heart/daemon/vault-items.js +56 -0
  126. package/dist/heart/delegation.js +1 -4
  127. package/dist/heart/habits/habit-migration.js +189 -0
  128. package/dist/heart/habits/habit-parser.js +203 -0
  129. package/dist/heart/habits/habit-runtime-state.js +100 -0
  130. package/dist/heart/habits/habit-scheduler.js +372 -0
  131. package/dist/heart/{daemon → hatch}/hatch-flow.js +40 -56
  132. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  133. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  134. package/dist/heart/{daemon → hatch}/specialist-tools.js +45 -18
  135. package/dist/heart/identity.js +174 -57
  136. package/dist/heart/kept-notes.js +289 -0
  137. package/dist/heart/kicks.js +1 -1
  138. package/dist/heart/machine-identity.js +161 -0
  139. package/dist/heart/mail-import-discovery.js +353 -0
  140. package/dist/heart/mailbox/mailbox-http-hooks.js +67 -0
  141. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  142. package/dist/heart/mailbox/mailbox-http-routes.js +250 -0
  143. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  144. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  145. package/dist/heart/mailbox/mailbox-http.js +99 -0
  146. package/dist/heart/mailbox/mailbox-read.js +32 -0
  147. package/dist/heart/mailbox/mailbox-types.js +27 -0
  148. package/dist/heart/mailbox/mailbox-view.js +197 -0
  149. package/dist/heart/mailbox/readers/agent-machine.js +418 -0
  150. package/dist/heart/mailbox/readers/continuity-readers.js +324 -0
  151. package/dist/heart/mailbox/readers/mail.js +375 -0
  152. package/dist/heart/mailbox/readers/runtime-readers.js +728 -0
  153. package/dist/heart/mailbox/readers/sessions.js +232 -0
  154. package/dist/heart/mailbox/readers/shared.js +111 -0
  155. package/dist/heart/mcp/mcp-server.js +696 -0
  156. package/dist/heart/migrate-config.js +100 -0
  157. package/dist/heart/model-capabilities.js +19 -0
  158. package/dist/heart/orientation-frame.js +217 -0
  159. package/dist/heart/platform.js +81 -0
  160. package/dist/heart/provider-attempt.js +134 -0
  161. package/dist/heart/provider-binding-resolver.js +272 -0
  162. package/dist/heart/provider-credentials.js +425 -0
  163. package/dist/heart/provider-failover.js +311 -0
  164. package/dist/heart/provider-models.js +81 -0
  165. package/dist/heart/provider-ping.js +262 -0
  166. package/dist/heart/provider-readiness-cache.js +40 -0
  167. package/dist/heart/provider-visibility.js +188 -0
  168. package/dist/heart/providers/anthropic-token.js +131 -0
  169. package/dist/heart/providers/anthropic.js +139 -52
  170. package/dist/heart/providers/azure.js +23 -11
  171. package/dist/heart/providers/error-classification.js +127 -0
  172. package/dist/heart/providers/github-copilot.js +145 -0
  173. package/dist/heart/providers/minimax-vlm.js +189 -0
  174. package/dist/heart/providers/minimax.js +26 -8
  175. package/dist/heart/providers/openai-codex-token.js +349 -0
  176. package/dist/heart/providers/openai-codex.js +55 -40
  177. package/dist/heart/runtime-capability-check.js +170 -0
  178. package/dist/heart/runtime-credentials.js +367 -0
  179. package/dist/heart/runtime-cwd.js +87 -0
  180. package/dist/heart/sense-truth.js +17 -4
  181. package/dist/heart/session-activity.js +48 -24
  182. package/dist/heart/session-events.js +1133 -0
  183. package/dist/heart/session-playback-cli-main.js +5 -0
  184. package/dist/heart/session-playback-cli.js +36 -0
  185. package/dist/heart/session-playback.js +231 -0
  186. package/dist/heart/session-stats-cli-main.js +5 -0
  187. package/dist/heart/session-stats.js +182 -0
  188. package/dist/heart/session-transcript.js +133 -0
  189. package/dist/heart/start-of-turn-packet.js +351 -0
  190. package/dist/heart/streaming.js +44 -27
  191. package/dist/heart/structured-output.js +196 -0
  192. package/dist/heart/sync-classification.js +176 -0
  193. package/dist/heart/sync.js +449 -0
  194. package/dist/heart/target-resolution.js +9 -5
  195. package/dist/heart/tempo.js +93 -0
  196. package/dist/heart/temporal-view.js +41 -0
  197. package/dist/heart/timeouts.js +101 -0
  198. package/dist/heart/tool-activity-callbacks.js +59 -0
  199. package/dist/heart/tool-description.js +155 -0
  200. package/dist/heart/tool-friction.js +55 -0
  201. package/dist/heart/tool-loop.js +200 -0
  202. package/dist/heart/turn-context.js +430 -0
  203. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  204. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  205. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  206. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  207. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  208. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  209. package/dist/heart/versioning/update-hooks.js +154 -0
  210. package/dist/heart/work-card.js +386 -0
  211. package/dist/mailbox-ui/assets/index-B-V9vRQ0.js +61 -0
  212. package/dist/mailbox-ui/assets/index-BOZbGbkL.css +1 -0
  213. package/dist/mailbox-ui/index.html +15 -0
  214. package/dist/mailroom/attention.js +167 -0
  215. package/dist/mailroom/autonomy.js +209 -0
  216. package/dist/mailroom/blob-store.js +715 -0
  217. package/dist/mailroom/body-cache.js +61 -0
  218. package/dist/mailroom/core.js +788 -0
  219. package/dist/mailroom/entry.js +160 -0
  220. package/dist/mailroom/file-store.js +568 -0
  221. package/dist/mailroom/mbox-import.js +393 -0
  222. package/dist/mailroom/migration.js +164 -0
  223. package/dist/mailroom/outbound.js +380 -0
  224. package/dist/mailroom/policy.js +263 -0
  225. package/dist/mailroom/reader.js +233 -0
  226. package/dist/mailroom/search-cache.js +334 -0
  227. package/dist/mailroom/search-relevance.js +319 -0
  228. package/dist/mailroom/smtp-ingress.js +176 -0
  229. package/dist/mailroom/source-state.js +176 -0
  230. package/dist/mailroom/thread.js +109 -0
  231. package/dist/mailroom/travel-extract.js +89 -0
  232. package/dist/mind/bundle-manifest.js +21 -2
  233. package/dist/mind/context.js +250 -101
  234. package/dist/mind/desk-section.js +362 -0
  235. package/dist/mind/diary-integrity.js +60 -0
  236. package/dist/mind/{memory.js → diary.js} +68 -77
  237. package/dist/mind/embedding-provider.js +60 -0
  238. package/dist/mind/file-state.js +179 -0
  239. package/dist/mind/friends/channel.js +48 -0
  240. package/dist/mind/friends/resolver.js +107 -4
  241. package/dist/mind/friends/store-file.js +61 -4
  242. package/dist/mind/friends/types.js +2 -2
  243. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  244. package/dist/mind/obligation-steering.js +221 -0
  245. package/dist/mind/pending.js +6 -1
  246. package/dist/mind/prompt-refresh.js +3 -2
  247. package/dist/mind/prompt.js +1015 -140
  248. package/dist/mind/provenance-trust.js +26 -0
  249. package/dist/mind/record-paths.js +312 -0
  250. package/dist/mind/scrutiny.js +173 -0
  251. package/dist/nerves/cli-logging.js +7 -1
  252. package/dist/nerves/coverage/audit-rules.js +15 -6
  253. package/dist/nerves/coverage/audit.js +28 -2
  254. package/dist/nerves/coverage/cli.js +1 -1
  255. package/dist/nerves/coverage/contract.js +5 -5
  256. package/dist/nerves/coverage/file-completeness.js +139 -5
  257. package/dist/nerves/event-buffer.js +111 -0
  258. package/dist/nerves/index.js +224 -4
  259. package/dist/nerves/observation.js +20 -0
  260. package/dist/nerves/redact.js +79 -0
  261. package/dist/nerves/review/cli-main.js +5 -0
  262. package/dist/nerves/review/cli.js +156 -0
  263. package/dist/nerves/review/core.js +152 -0
  264. package/dist/nerves/runtime.js +5 -1
  265. package/dist/repertoire/ado-client.js +15 -56
  266. package/dist/repertoire/ado-semantic.js +16 -10
  267. package/dist/repertoire/api-client.js +97 -0
  268. package/dist/repertoire/bitwarden-store.js +1041 -0
  269. package/dist/repertoire/bundle-templates.js +71 -0
  270. package/dist/repertoire/bw-installer.js +180 -0
  271. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  272. package/dist/repertoire/coding/context-pack.js +331 -0
  273. package/dist/repertoire/coding/feedback.js +197 -30
  274. package/dist/repertoire/coding/manager.js +166 -10
  275. package/dist/repertoire/coding/spawner.js +55 -9
  276. package/dist/repertoire/coding/tools.js +219 -7
  277. package/dist/repertoire/commerce-errors.js +109 -0
  278. package/dist/repertoire/commerce-self-test.js +156 -0
  279. package/dist/repertoire/credential-access.js +178 -0
  280. package/dist/repertoire/desk/classifier.js +362 -0
  281. package/dist/repertoire/duffel-client.js +185 -0
  282. package/dist/repertoire/github-client.js +14 -55
  283. package/dist/repertoire/graph-client.js +11 -52
  284. package/dist/repertoire/guardrails.js +159 -25
  285. package/dist/repertoire/mcp-client.js +295 -0
  286. package/dist/repertoire/mcp-manager.js +434 -0
  287. package/dist/repertoire/mcp-tools.js +83 -0
  288. package/dist/repertoire/plugin-mcp.js +175 -0
  289. package/dist/repertoire/plugins.js +253 -0
  290. package/dist/repertoire/shell-sessions.js +133 -0
  291. package/dist/repertoire/skills.js +48 -4
  292. package/dist/repertoire/stripe-client.js +131 -0
  293. package/dist/repertoire/tool-results.js +29 -0
  294. package/dist/repertoire/tools-a2a.js +283 -0
  295. package/dist/repertoire/tools-attachments.js +317 -0
  296. package/dist/repertoire/tools-awaiting.js +372 -0
  297. package/dist/repertoire/tools-base.js +63 -1082
  298. package/dist/repertoire/tools-bluebubbles.js +2 -0
  299. package/dist/repertoire/tools-bridge.js +144 -0
  300. package/dist/repertoire/tools-bundle.js +993 -0
  301. package/dist/repertoire/tools-commerce.js +253 -0
  302. package/dist/repertoire/tools-config.js +186 -0
  303. package/dist/repertoire/tools-continuity.js +252 -0
  304. package/dist/repertoire/tools-credential.js +383 -0
  305. package/dist/repertoire/tools-evolution.js +527 -0
  306. package/dist/repertoire/tools-files.js +344 -0
  307. package/dist/repertoire/tools-flight.js +290 -0
  308. package/dist/repertoire/tools-flow.js +119 -0
  309. package/dist/repertoire/tools-github.js +3 -8
  310. package/dist/repertoire/tools-mail.js +1975 -0
  311. package/dist/repertoire/tools-notes.js +418 -0
  312. package/dist/repertoire/tools-obligations.js +143 -0
  313. package/dist/repertoire/tools-orientation.js +31 -0
  314. package/dist/repertoire/tools-record.js +469 -0
  315. package/dist/repertoire/tools-runtime.js +150 -0
  316. package/dist/repertoire/tools-session.js +766 -0
  317. package/dist/repertoire/tools-shell.js +120 -0
  318. package/dist/repertoire/tools-stripe.js +224 -0
  319. package/dist/repertoire/tools-surface.js +344 -0
  320. package/dist/repertoire/tools-teams.js +12 -39
  321. package/dist/repertoire/tools-travel.js +125 -0
  322. package/dist/repertoire/tools-trip.js +982 -0
  323. package/dist/repertoire/tools-user-profile.js +146 -0
  324. package/dist/repertoire/tools-vault.js +40 -0
  325. package/dist/repertoire/tools-voice.js +145 -0
  326. package/dist/repertoire/tools.js +243 -79
  327. package/dist/repertoire/travel-api-client.js +360 -0
  328. package/dist/repertoire/user-profile.js +131 -0
  329. package/dist/repertoire/vault-setup.js +246 -0
  330. package/dist/repertoire/vault-unlock.js +594 -0
  331. package/dist/scripts/claude-code-hook.js +41 -0
  332. package/dist/scripts/claude-code-stop-hook.js +47 -0
  333. package/dist/senses/a2a-entry.js +78 -0
  334. package/dist/senses/attention-queue.js +186 -0
  335. package/dist/senses/await-turn-message.js +58 -0
  336. package/dist/senses/bluebubbles/active-turns.js +216 -0
  337. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  338. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  339. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  340. package/dist/senses/bluebubbles/entry.js +77 -0
  341. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  342. package/dist/senses/bluebubbles/index.js +2737 -0
  343. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  344. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  345. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  346. package/dist/senses/bluebubbles/processed-log.js +133 -0
  347. package/dist/senses/bluebubbles/replay.js +137 -0
  348. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  349. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  350. package/dist/senses/bluebubbles-meta-guard.js +40 -0
  351. package/dist/senses/cli/bracketed-paste.js +82 -0
  352. package/dist/senses/cli/image-paste.js +287 -0
  353. package/dist/senses/cli/image-ref-navigation.js +75 -0
  354. package/dist/senses/cli/ink-app.js +156 -0
  355. package/dist/senses/cli/inline-diff.js +64 -0
  356. package/dist/senses/cli/input-keys.js +174 -0
  357. package/dist/senses/cli/kill-ring.js +86 -0
  358. package/dist/senses/cli/message-list.js +51 -0
  359. package/dist/senses/cli/ouro-tui.js +607 -0
  360. package/dist/senses/cli/spinner-imperative.js +135 -0
  361. package/dist/senses/cli/spinner.js +101 -0
  362. package/dist/senses/cli/status-line.js +60 -0
  363. package/dist/senses/cli/streaming-markdown.js +526 -0
  364. package/dist/senses/cli/tool-display.js +85 -0
  365. package/dist/senses/cli/tool-render.js +85 -0
  366. package/dist/senses/cli/tui-store.js +240 -0
  367. package/dist/senses/cli/virtual-list.js +35 -0
  368. package/dist/senses/cli-entry.js +60 -8
  369. package/dist/senses/cli-layout.js +100 -0
  370. package/dist/senses/cli.js +517 -204
  371. package/dist/senses/commands.js +66 -3
  372. package/dist/senses/habit-turn-message.js +122 -0
  373. package/dist/senses/inner-dialog-worker.js +303 -22
  374. package/dist/senses/inner-dialog.js +525 -41
  375. package/dist/senses/mail-entry.js +66 -0
  376. package/dist/senses/mail.js +379 -0
  377. package/dist/senses/pipeline.js +857 -180
  378. package/dist/senses/proactive-content-guard.js +51 -0
  379. package/dist/senses/shared-turn.js +419 -0
  380. package/dist/senses/surface-tool.js +108 -0
  381. package/dist/senses/teams-entry.js +60 -8
  382. package/dist/senses/teams.js +390 -98
  383. package/dist/senses/trust-gate.js +100 -5
  384. package/dist/senses/voice/audio-playback.js +237 -0
  385. package/dist/senses/voice/audio-routing.js +119 -0
  386. package/dist/senses/voice/elevenlabs.js +202 -0
  387. package/dist/senses/voice/floor-control.js +431 -0
  388. package/dist/senses/voice/floor-controller.js +115 -0
  389. package/dist/senses/voice/golden-path.js +116 -0
  390. package/dist/senses/voice/index.js +29 -0
  391. package/dist/senses/voice/meeting.js +113 -0
  392. package/dist/senses/voice/outbound.js +190 -0
  393. package/dist/senses/voice/phone.js +33 -0
  394. package/dist/senses/voice/playback.js +139 -0
  395. package/dist/senses/voice/realtime-eval.js +496 -0
  396. package/dist/senses/voice/realtime-trace.js +531 -0
  397. package/dist/senses/voice/transcript.js +70 -0
  398. package/dist/senses/voice/turn.js +191 -0
  399. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  400. package/dist/senses/voice/twilio-phone.js +5079 -0
  401. package/dist/senses/voice/types.js +2 -0
  402. package/dist/senses/voice/whisper.js +161 -0
  403. package/dist/senses/voice-entry.js +81 -0
  404. package/dist/senses/voice-realtime-eval-command.js +99 -0
  405. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  406. package/dist/senses/voice-twilio-entry.js +87 -0
  407. package/dist/trips/core.js +138 -0
  408. package/dist/trips/store.js +265 -0
  409. package/dist/util/frontmatter.js +69 -0
  410. package/package.json +55 -12
  411. package/skills/agent-commerce.md +113 -0
  412. package/skills/browser-navigation.md +117 -0
  413. package/skills/commerce-setup-guide.md +116 -0
  414. package/skills/commerce-setup.md +84 -0
  415. package/skills/configure-dev-tools.md +99 -0
  416. package/skills/travel-planning.md +138 -0
  417. package/dist/heart/daemon/auth-flow.js +0 -351
  418. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  419. package/dist/heart/daemon/update-hooks.js +0 -138
  420. package/dist/heart/safe-workspace.js +0 -228
  421. package/dist/heart/session-recall.js +0 -116
  422. package/dist/repertoire/tasks/board.js +0 -134
  423. package/dist/repertoire/tasks/index.js +0 -224
  424. package/dist/repertoire/tasks/lifecycle.js +0 -80
  425. package/dist/repertoire/tasks/middleware.js +0 -65
  426. package/dist/repertoire/tasks/parser.js +0 -173
  427. package/dist/repertoire/tasks/scanner.js +0 -132
  428. package/dist/repertoire/tasks/transitions.js +0 -144
  429. package/dist/senses/bluebubbles-entry.js +0 -13
  430. package/dist/senses/bluebubbles.js +0 -1177
  431. package/dist/senses/debug-activity.js +0 -148
  432. package/subagents/README.md +0 -7
  433. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  434. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  435. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  436. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  437. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  438. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  439. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  440. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  441. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  442. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  443. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  444. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  445. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  446. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  447. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  448. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  449. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,344 @@
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 packets_1 = require("../arc/packets");
42
+ const session_activity_1 = require("../heart/session-activity");
43
+ const bluebubbles_meta_guard_1 = require("../senses/bluebubbles-meta-guard");
44
+ const runtime_1 = require("../nerves/runtime");
45
+ const path = __importStar(require("path"));
46
+ const outbound_1 = require("../senses/voice/outbound");
47
+ /* v8 ignore start -- surface voice delivery hints are covered at the outbound voice bridge; this adapter only normalizes optional tool args @preserve */
48
+ function normalizeSurfaceDeliveryChannel(value) {
49
+ if (typeof value !== "string")
50
+ return "auto";
51
+ const normalized = value.trim().toLowerCase();
52
+ return normalized === "voice" ? "voice" : "auto";
53
+ }
54
+ function parseSurfaceVoiceInitialAudio(args) {
55
+ const source = args.voiceAudioSource === "url" || args.voiceAudioSource === "file" || args.voiceAudioSource === "tone"
56
+ ? args.voiceAudioSource
57
+ : undefined;
58
+ const hasAudioHint = Boolean(source
59
+ || args.voiceAudioUrl?.trim()
60
+ || args.voiceAudioPath?.trim()
61
+ || args.voiceAudioLabel?.trim()
62
+ || args.voiceAudioToneHz?.trim()
63
+ || args.voiceAudioDurationMs?.trim());
64
+ if (!hasAudioHint)
65
+ return undefined;
66
+ const toneHz = args.voiceAudioToneHz?.trim() ? Number(args.voiceAudioToneHz) : undefined;
67
+ const durationMs = args.voiceAudioDurationMs?.trim() ? Number(args.voiceAudioDurationMs) : undefined;
68
+ return {
69
+ source: source ?? "tone",
70
+ ...(args.voiceAudioUrl?.trim() ? { url: args.voiceAudioUrl.trim() } : {}),
71
+ ...(args.voiceAudioPath?.trim() ? { path: args.voiceAudioPath.trim() } : {}),
72
+ ...(args.voiceAudioLabel?.trim() ? { label: args.voiceAudioLabel.trim() } : {}),
73
+ ...(Number.isFinite(toneHz) ? { toneHz } : {}),
74
+ ...(Number.isFinite(durationMs) ? { durationMs } : {}),
75
+ };
76
+ }
77
+ /* v8 ignore stop */
78
+ // Surface tool schema — canonical home. Handler lives in senses/surface-tool.ts.
79
+ exports.surfaceToolDef = {
80
+ type: "function",
81
+ function: {
82
+ name: "surface",
83
+ description: "return a ready thought to a friend or active session without publishing private inner work to BlueBubbles. pass delegationId to address a held thought (see your attention queue above), or friendId for spontaneous outreach. Surface delivers tool responses to the active session. BlueBubbles is a dedicated channel - use send_message with channel=\"bluebubbles\" for intentional iMessage delivery. set channel=voice only when you intentionally want a live phone call; content becomes the call reason/opening context. does not end your turn.",
84
+ parameters: {
85
+ type: "object",
86
+ properties: {
87
+ content: {
88
+ type: "string",
89
+ description: "the message to deliver",
90
+ },
91
+ delegationId: {
92
+ type: "string",
93
+ description: "ID from your attention queue — addresses a specific held thought",
94
+ },
95
+ friendId: {
96
+ type: "string",
97
+ description: "friend to reach out to spontaneously (when not addressing a held thought)",
98
+ },
99
+ channel: {
100
+ type: "string",
101
+ enum: ["auto", "voice"],
102
+ description: "optional delivery channel; use voice for a live phone call to a trusted friend, otherwise omit",
103
+ },
104
+ phoneNumber: {
105
+ type: "string",
106
+ description: "optional E.164 phone override for channel=voice when the trusted friend's record has no usable phone handle",
107
+ },
108
+ voiceAudioSource: {
109
+ type: "string",
110
+ enum: ["tone", "url", "file"],
111
+ description: "optional initial non-speech audio to play after the opening greeting when channel=voice",
112
+ },
113
+ voiceAudioUrl: {
114
+ type: "string",
115
+ description: "short audio URL for voiceAudioSource=url",
116
+ },
117
+ voiceAudioPath: {
118
+ type: "string",
119
+ description: "local audio file path for voiceAudioSource=file",
120
+ },
121
+ voiceAudioLabel: {
122
+ type: "string",
123
+ description: "short label for the initial voice audio",
124
+ },
125
+ voiceAudioToneHz: {
126
+ type: "number",
127
+ description: "tone frequency for voiceAudioSource=tone",
128
+ },
129
+ voiceAudioDurationMs: {
130
+ type: "number",
131
+ description: "initial audio duration in milliseconds",
132
+ },
133
+ },
134
+ required: ["content"],
135
+ },
136
+ },
137
+ };
138
+ // Surface tool handler: routes content to friend's freshest session
139
+ /* v8 ignore start -- surface handler wiring: core logic tested via surface-tool.test.ts; this wires identity/routing deps @preserve */
140
+ exports.surfaceToolDefinition = {
141
+ tool: exports.surfaceToolDef,
142
+ handler: async (args, ctx) => {
143
+ const rawContent = args.content ?? "";
144
+ const deliveryHint = {
145
+ channel: normalizeSurfaceDeliveryChannel(args.channel),
146
+ phoneNumber: typeof args.phoneNumber === "string" ? args.phoneNumber : undefined,
147
+ initialAudio: parseSurfaceVoiceInitialAudio(args),
148
+ };
149
+ if ((0, bluebubbles_meta_guard_1.containsInternalMetaMarkers)(rawContent)) {
150
+ (0, runtime_1.emitNervesEvent)({
151
+ level: "warn",
152
+ component: "repertoire",
153
+ event: "tools.surface_meta_blocked",
154
+ message: "surface tool blocked: internal meta markers in content",
155
+ meta: {
156
+ hasDelegationId: Boolean(args.delegationId),
157
+ hasFriendId: Boolean(args.friendId),
158
+ contentLength: rawContent.length,
159
+ },
160
+ });
161
+ return "failed — blocked: contains internal meta markers";
162
+ }
163
+ const queue = ctx?.delegatedOrigins ?? [];
164
+ const agentName = (() => { try {
165
+ return (0, identity_1.getAgentName)();
166
+ }
167
+ catch {
168
+ return "unknown";
169
+ } })();
170
+ const routeToFriend = async (friendId, content, queueItem, hint) => {
171
+ /* v8 ignore start -- routing: integration path tested via inner-dialog routing tests @preserve */
172
+ try {
173
+ const agentRoot = (0, identity_1.getAgentRoot)();
174
+ const sessionsDir = path.join(agentRoot, "state", "sessions");
175
+ const friendsDir = path.join(agentRoot, "friends");
176
+ // Resolve friend name → UUID if needed (agents may pass name instead of UUID)
177
+ let resolvedFriendId = friendId;
178
+ if (!fs.existsSync(path.join(sessionsDir, friendId))) {
179
+ try {
180
+ const friendFiles = fs.readdirSync(friendsDir).filter((f) => f.endsWith(".json"));
181
+ for (const file of friendFiles) {
182
+ const raw = fs.readFileSync(path.join(friendsDir, file), "utf-8");
183
+ const record = JSON.parse(raw);
184
+ if (record.name?.toLowerCase() === friendId.toLowerCase() && record.id) {
185
+ resolvedFriendId = record.id;
186
+ break;
187
+ }
188
+ }
189
+ }
190
+ catch { /* friends dir unreadable — continue with original friendId */ }
191
+ }
192
+ friendId = resolvedFriendId;
193
+ if (hint?.channel === "voice") {
194
+ const voiceResult = await (0, outbound_1.placeTrustedFriendVoiceOutboundCall)({
195
+ agentName,
196
+ agentRoot,
197
+ friendId,
198
+ reason: content,
199
+ phoneNumber: hint.phoneNumber,
200
+ ...(hint.initialAudio ? { initialAudio: hint.initialAudio } : {}),
201
+ });
202
+ return voiceResult.status === "placed"
203
+ ? { status: "delivered", detail: voiceResult.detail }
204
+ : { status: "failed", detail: voiceResult.detail };
205
+ }
206
+ // Priority 1: Bridge-preferred session (if queue item has a bridgeId)
207
+ if (queueItem?.bridgeId) {
208
+ const { createBridgeManager } = await Promise.resolve().then(() => __importStar(require("../heart/bridges/manager")));
209
+ const bridge = createBridgeManager().getBridge(queueItem.bridgeId);
210
+ if (bridge && bridge.lifecycle !== "completed" && bridge.lifecycle !== "cancelled") {
211
+ const allSessions = (0, session_activity_1.listSessionActivity)({ sessionsDir, friendsDir, agentName, activeThresholdMs: Number.MAX_SAFE_INTEGER });
212
+ const bridgeTarget = allSessions.find((activity) => activity.friendId === friendId
213
+ && activity.channel !== "inner"
214
+ && bridge.attachedSessions.some((s) => s.friendId === activity.friendId && s.channel === activity.channel && s.key === activity.key));
215
+ if (bridgeTarget) {
216
+ const { queuePendingMessage, getPendingDir } = await Promise.resolve().then(() => __importStar(require("../mind/pending")));
217
+ const pendingDir = getPendingDir(agentName, bridgeTarget.friendId, bridgeTarget.channel, bridgeTarget.key);
218
+ queuePendingMessage(pendingDir, {
219
+ from: agentName,
220
+ friendId: bridgeTarget.friendId,
221
+ channel: bridgeTarget.channel,
222
+ key: bridgeTarget.key,
223
+ content,
224
+ timestamp: Date.now(),
225
+ });
226
+ return { status: "queued", detail: `for next interaction via ${bridgeTarget.channel}` };
227
+ }
228
+ }
229
+ }
230
+ // Priority 1.5: exact held-work origin.
231
+ // A delegated return has a concrete reply address. Preserve that
232
+ // address before considering fresher sessions for the same friend,
233
+ // especially MCP sessions where check_response drains this path.
234
+ if (queueItem?.channel && queueItem.key && queueItem.channel !== "inner") {
235
+ const { queuePendingMessage, getPendingDir } = await Promise.resolve().then(() => __importStar(require("../mind/pending")));
236
+ const pendingDir = getPendingDir(agentName, friendId, queueItem.channel, queueItem.key);
237
+ queuePendingMessage(pendingDir, {
238
+ from: agentName,
239
+ friendId,
240
+ channel: queueItem.channel,
241
+ key: queueItem.key,
242
+ content,
243
+ timestamp: Date.now(),
244
+ });
245
+ return { status: "queued", detail: `for originating ${queueItem.channel} session` };
246
+ }
247
+ // Priority 2: Try proactive delivery first, then queue to freshest session
248
+ const allFriendSessions = (0, session_activity_1.listSessionActivity)({ sessionsDir, friendsDir, agentName, activeThresholdMs: Number.MAX_SAFE_INTEGER })
249
+ .filter((s) => s.friendId === friendId && s.channel !== "inner");
250
+ // Priority 2: Queue to freshest non-inner session
251
+ const freshest = allFriendSessions[0];
252
+ if (freshest) {
253
+ const { queuePendingMessage, getPendingDir } = await Promise.resolve().then(() => __importStar(require("../mind/pending")));
254
+ const pendingDir = getPendingDir(agentName, freshest.friendId, freshest.channel, freshest.key);
255
+ queuePendingMessage(pendingDir, {
256
+ from: agentName,
257
+ friendId: freshest.friendId,
258
+ channel: freshest.channel,
259
+ key: freshest.key,
260
+ content,
261
+ timestamp: Date.now(),
262
+ });
263
+ return { status: "queued", detail: `for next interaction via ${freshest.channel}` };
264
+ }
265
+ // Priority 3: Deferred — no active session found
266
+ const { getDeferredReturnDir } = await Promise.resolve().then(() => __importStar(require("../mind/pending")));
267
+ const { queuePendingMessage: queueDeferred } = await Promise.resolve().then(() => __importStar(require("../mind/pending")));
268
+ const deferredDir = getDeferredReturnDir(agentName, friendId);
269
+ queueDeferred(deferredDir, {
270
+ from: agentName,
271
+ friendId,
272
+ channel: "deferred",
273
+ key: "return",
274
+ content,
275
+ timestamp: Date.now(),
276
+ });
277
+ return { status: "deferred", detail: "they'll see it next time" };
278
+ }
279
+ catch {
280
+ return { status: "failed" };
281
+ }
282
+ /* v8 ignore stop */
283
+ };
284
+ return (0, surface_tool_1.handleSurface)({
285
+ content: args.content ?? "",
286
+ delegationId: args.delegationId,
287
+ friendId: args.friendId,
288
+ deliveryHint: deliveryHint.channel === "voice" || deliveryHint.phoneNumber ? deliveryHint : undefined,
289
+ queue,
290
+ routeToFriend,
291
+ advanceObligation: (obligationId, update) => {
292
+ /* v8 ignore start -- obligation advance: tested via attention-queue tests @preserve */
293
+ try {
294
+ const name = (() => { try {
295
+ return (0, identity_1.getAgentName)();
296
+ }
297
+ catch {
298
+ return "unknown";
299
+ } })();
300
+ (0, obligations_1.advanceReturnObligation)(name, obligationId, {
301
+ status: update.status,
302
+ ...(update.returnedAt !== undefined ? { returnedAt: update.returnedAt } : {}),
303
+ ...(update.returnTarget !== undefined ? { returnTarget: update.returnTarget } : {}),
304
+ });
305
+ }
306
+ catch {
307
+ // swallowed — obligation advance must never break surface delivery
308
+ }
309
+ /* v8 ignore stop */
310
+ },
311
+ completePonderPacket: (packetId) => {
312
+ /* v8 ignore start -- packet completion: tested via surface-tool and arc packet unit tests @preserve */
313
+ try {
314
+ (0, packets_1.completePonderPacket)((0, identity_1.getAgentRoot)(), packetId);
315
+ }
316
+ catch {
317
+ // swallowed — packet completion must never break surface delivery
318
+ }
319
+ /* v8 ignore stop */
320
+ },
321
+ fulfillHeartObligation: (origin) => {
322
+ /* v8 ignore start -- heart obligation fulfillment: tested via surface-tool.test.ts @preserve */
323
+ try {
324
+ const agentRoot = (0, identity_1.getAgentRoot)();
325
+ const heartObligation = (0, obligations_1.findPendingObligationForOrigin)(agentRoot, origin);
326
+ if (heartObligation) {
327
+ (0, obligations_1.fulfillObligation)(agentRoot, heartObligation.id);
328
+ }
329
+ }
330
+ catch {
331
+ // swallowed — heart obligation fulfillment must never break surface delivery
332
+ }
333
+ /* v8 ignore stop */
334
+ },
335
+ });
336
+ },
337
+ summaryKeys: ["content", "delegationId", "friendId", "channel"],
338
+ riskProfile: {
339
+ mutates: ["durable_state_write", "external_side_effect"],
340
+ risk: "high",
341
+ reason: "queues or delivers surfaced responses and may fulfill obligations",
342
+ },
343
+ };
344
+ /* 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,8 @@ 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
+ riskProfile: { mutates: "external_side_effect", risk: "high", reason: "mutates Microsoft Graph resources" },
68
69
  },
69
70
  // -- Generic ADO tools --
70
71
  {
@@ -94,6 +95,7 @@ exports.teamsToolDefinitions = [
94
95
  return (0, ado_client_1.adoRequest)(ctx.adoToken, method, args.organization, args.path, args.body, args.host);
95
96
  },
96
97
  integration: "ado",
98
+ summaryKeys: ["method", "organization", "path"],
97
99
  },
98
100
  {
99
101
  tool: {
@@ -124,7 +126,8 @@ exports.teamsToolDefinitions = [
124
126
  return (0, ado_client_1.adoRequest)(ctx.adoToken, args.method, args.organization, args.path, args.body, args.host);
125
127
  },
126
128
  integration: "ado",
127
- confirmationRequired: true,
129
+ summaryKeys: ["method", "organization", "path"],
130
+ riskProfile: { mutates: "external_side_effect", risk: "high", reason: "mutates Azure DevOps resources" },
128
131
  },
129
132
  // -- Convenience aliases (backward compat) --
130
133
  {
@@ -143,6 +146,7 @@ exports.teamsToolDefinitions = [
143
146
  return (0, graph_client_1.getProfile)(ctx.graphToken);
144
147
  },
145
148
  integration: "graph",
149
+ summaryKeys: [],
146
150
  },
147
151
  {
148
152
  tool: {
@@ -186,6 +190,7 @@ exports.teamsToolDefinitions = [
186
190
  return (0, ado_client_1.queryWorkItems)(ctx.adoToken, org, query);
187
191
  },
188
192
  integration: "ado",
193
+ summaryKeys: ["organization", "query"],
189
194
  },
190
195
  // -- Proactive messaging --
191
196
  {
@@ -232,7 +237,8 @@ exports.teamsToolDefinitions = [
232
237
  }
233
238
  },
234
239
  /* v8 ignore stop */
235
- confirmationRequired: true,
240
+ summaryKeys: ["user_name", "user_id"],
241
+ riskProfile: { mutates: "external_side_effect", risk: "high", reason: "sends a proactive Teams message" },
236
242
  },
237
243
  // -- Documentation tools --
238
244
  {
@@ -254,6 +260,7 @@ exports.teamsToolDefinitions = [
254
260
  return searchEndpoints(graph_endpoints_json_1.default, args.query || "");
255
261
  },
256
262
  integration: "graph",
263
+ summaryKeys: ["query"],
257
264
  },
258
265
  {
259
266
  tool: {
@@ -274,6 +281,7 @@ exports.teamsToolDefinitions = [
274
281
  return searchEndpoints(ado_endpoints_json_1.default, args.query || "");
275
282
  },
276
283
  integration: "ado",
284
+ summaryKeys: ["query"],
277
285
  },
278
286
  ];
279
287
  function searchEndpoints(entries, query) {
@@ -304,38 +312,3 @@ function searchEndpoints(entries, query) {
304
312
  return lines.join("\n");
305
313
  }).join("\n\n");
306
314
  }
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
- }
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.travelToolDefinitions = void 0;
4
+ const travel_api_client_1 = require("./travel-api-client");
5
+ const runtime_1 = require("../nerves/runtime");
6
+ exports.travelToolDefinitions = [
7
+ {
8
+ tool: {
9
+ type: "function",
10
+ function: {
11
+ name: "weather_lookup",
12
+ description: "Get current weather for a location. Provide either a city name or lat/lon coordinates.",
13
+ parameters: {
14
+ type: "object",
15
+ properties: {
16
+ city: { type: "string", description: "City name (e.g. 'London', 'New York')" },
17
+ lat: { type: "string", description: "Latitude (decimal)" },
18
+ lon: { type: "string", description: "Longitude (decimal)" },
19
+ },
20
+ },
21
+ },
22
+ },
23
+ handler: async (args) => {
24
+ (0, runtime_1.emitNervesEvent)({
25
+ component: "repertoire",
26
+ event: "repertoire.travel_tool_call",
27
+ message: "weather_lookup invoked",
28
+ meta: { tool: "weather_lookup" },
29
+ });
30
+ try {
31
+ if (args.city) {
32
+ const data = await (0, travel_api_client_1.getWeatherByCity)(args.city);
33
+ return JSON.stringify(data, null, 2);
34
+ }
35
+ if (args.lat && args.lon) {
36
+ const data = await (0, travel_api_client_1.getWeather)(parseFloat(args.lat), parseFloat(args.lon));
37
+ return JSON.stringify(data, null, 2);
38
+ }
39
+ return "Please provide either a city name or lat/lon coordinates.";
40
+ }
41
+ catch (err) {
42
+ /* v8 ignore next -- defensive: callers throw Error instances @preserve */
43
+ return `Weather lookup error: ${err instanceof Error ? err.message : String(err)}`;
44
+ }
45
+ },
46
+ summaryKeys: ["city", "lat", "lon"],
47
+ },
48
+ {
49
+ tool: {
50
+ type: "function",
51
+ function: {
52
+ name: "travel_advisory",
53
+ description: "Get US State Department travel advisory for a country. Returns advisory level (1-4) and description.",
54
+ parameters: {
55
+ type: "object",
56
+ properties: {
57
+ country_code: {
58
+ type: "string",
59
+ description: "ISO 3166 alpha-2 country code (e.g. 'US', 'GB', 'AF')",
60
+ },
61
+ },
62
+ required: ["country_code"],
63
+ },
64
+ },
65
+ },
66
+ handler: async (args) => {
67
+ (0, runtime_1.emitNervesEvent)({
68
+ component: "repertoire",
69
+ event: "repertoire.travel_tool_call",
70
+ message: "travel_advisory invoked",
71
+ meta: { tool: "travel_advisory" },
72
+ });
73
+ try {
74
+ const data = await (0, travel_api_client_1.getTravelAdvisory)(args.country_code.toUpperCase());
75
+ return JSON.stringify(data, null, 2);
76
+ }
77
+ catch (err) {
78
+ /* v8 ignore next -- defensive: callers throw Error instances @preserve */
79
+ return `Travel advisory error: ${err instanceof Error ? err.message : String(err)}`;
80
+ }
81
+ },
82
+ summaryKeys: ["country_code"],
83
+ },
84
+ {
85
+ tool: {
86
+ type: "function",
87
+ function: {
88
+ name: "geocode_search",
89
+ description: "Search for locations, addresses, or points of interest. Returns coordinates and display names.",
90
+ parameters: {
91
+ type: "object",
92
+ properties: {
93
+ query: { type: "string", description: "Search query (e.g. 'Eiffel Tower', '123 Main St')" },
94
+ near_lat: { type: "string", description: "Latitude to search near (for POI search)" },
95
+ near_lon: { type: "string", description: "Longitude to search near (for POI search)" },
96
+ radius_km: { type: "string", description: "Search radius in km (default 10)" },
97
+ },
98
+ required: ["query"],
99
+ },
100
+ },
101
+ },
102
+ handler: async (args) => {
103
+ (0, runtime_1.emitNervesEvent)({
104
+ component: "repertoire",
105
+ event: "repertoire.travel_tool_call",
106
+ message: "geocode_search invoked",
107
+ meta: { tool: "geocode_search" },
108
+ });
109
+ try {
110
+ if (args.near_lat && args.near_lon) {
111
+ const radiusKm = args.radius_km ? parseFloat(args.radius_km) : undefined;
112
+ const data = await (0, travel_api_client_1.searchPOI)(args.query, parseFloat(args.near_lat), parseFloat(args.near_lon), radiusKm);
113
+ return JSON.stringify(data, null, 2);
114
+ }
115
+ const data = await (0, travel_api_client_1.geocode)(args.query);
116
+ return JSON.stringify(data, null, 2);
117
+ }
118
+ catch (err) {
119
+ /* v8 ignore next -- defensive: callers throw Error instances @preserve */
120
+ return `Geocode error: ${err instanceof Error ? err.message : String(err)}`;
121
+ }
122
+ },
123
+ summaryKeys: ["query"],
124
+ },
125
+ ];