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

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 +4209 -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 +67 -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,252 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.continuityToolDefinitions = void 0;
4
+ const identity_1 = require("../heart/identity");
5
+ const runtime_1 = require("../nerves/runtime");
6
+ const episodes_1 = require("../arc/episodes");
7
+ const cares_1 = require("../arc/cares");
8
+ const presence_1 = require("../arc/presence");
9
+ const intentions_1 = require("../arc/intentions");
10
+ exports.continuityToolDefinitions = [
11
+ // ── Continuity tools ──────────────────────────────────────────────
12
+ {
13
+ tool: {
14
+ type: "function",
15
+ function: {
16
+ name: "query_episodes",
17
+ description: "Query recent episodes from my continuity log. Returns timestamped records of significant events (obligation shifts, coding milestones, bridge events, care events, turning points).",
18
+ parameters: {
19
+ type: "object",
20
+ properties: {
21
+ limit: { type: "number", description: "Maximum episodes to return (default 20)" },
22
+ kind: { type: "string", description: "Filter by episode kind: obligation_shift, coding_milestone, bridge_event, care_event, tempo_shift, turning_point" },
23
+ since: { type: "string", description: "ISO timestamp — only return episodes after this time" },
24
+ },
25
+ },
26
+ },
27
+ },
28
+ handler: (a) => {
29
+ const agentRoot = (0, identity_1.getAgentRoot)();
30
+ const options = {};
31
+ if (a.limit)
32
+ options.limit = parseInt(a.limit, 10);
33
+ if (a.kind)
34
+ options.kinds = [a.kind];
35
+ if (a.since)
36
+ options.since = a.since;
37
+ const episodes = (0, episodes_1.readRecentEpisodes)(agentRoot, options);
38
+ (0, runtime_1.emitNervesEvent)({ component: "repertoire", event: "repertoire.query_episodes", message: `queried ${episodes.length} episodes`, meta: { count: episodes.length } });
39
+ return JSON.stringify(episodes, null, 2);
40
+ },
41
+ },
42
+ {
43
+ tool: {
44
+ type: "function",
45
+ function: {
46
+ name: "capture_episode",
47
+ description: "Record a turning point or significant moment. This is my tool for saying 'that was important — keep it.' Nearly frictionless: only summary and whyItMattered required.",
48
+ parameters: {
49
+ type: "object",
50
+ properties: {
51
+ summary: { type: "string", description: "What happened" },
52
+ whyItMattered: { type: "string", description: "Why this was significant" },
53
+ kind: { type: "string", description: "Episode kind (default: turning_point)" },
54
+ salience: { type: "string", description: "low, medium, high, or critical (default: medium)" },
55
+ },
56
+ required: ["summary", "whyItMattered"],
57
+ },
58
+ },
59
+ },
60
+ handler: (a) => {
61
+ const agentRoot = (0, identity_1.getAgentRoot)();
62
+ const episode = (0, episodes_1.emitEpisode)(agentRoot, {
63
+ kind: a.kind ?? "turning_point",
64
+ summary: a.summary,
65
+ whyItMattered: a.whyItMattered,
66
+ relatedEntities: [],
67
+ salience: a.salience ?? "medium",
68
+ });
69
+ (0, runtime_1.emitNervesEvent)({ component: "repertoire", event: "repertoire.capture_episode", message: `captured episode ${episode.id}`, meta: { id: episode.id } });
70
+ return JSON.stringify(episode, null, 2);
71
+ },
72
+ riskProfile: { mutates: "durable_state_write", risk: "high", reason: "writes continuity episode state" },
73
+ },
74
+ {
75
+ tool: {
76
+ type: "function",
77
+ function: {
78
+ name: "query_presence",
79
+ description: "Check who's around — my own availability/lane and known peer agents.",
80
+ parameters: { type: "object", properties: {} },
81
+ },
82
+ },
83
+ handler: () => {
84
+ const agentRoot = (0, identity_1.getAgentRoot)();
85
+ const agentName = (0, identity_1.getAgentName)();
86
+ const self = (0, presence_1.readPresence)(agentRoot, agentName);
87
+ const peers = (0, presence_1.readPeerPresence)(agentRoot);
88
+ (0, runtime_1.emitNervesEvent)({ component: "repertoire", event: "repertoire.query_presence", message: `presence: self + ${peers.length} peers`, meta: { peerCount: peers.length } });
89
+ return JSON.stringify({ self, peers }, null, 2);
90
+ },
91
+ },
92
+ {
93
+ tool: {
94
+ type: "function",
95
+ function: {
96
+ name: "query_cares",
97
+ description: "Query things I care about — ongoing concerns, watched situations, projects, people.",
98
+ parameters: {
99
+ type: "object",
100
+ properties: {
101
+ status: { type: "string", description: "Filter by status: 'active', 'watching', 'resolved', 'dormant', or 'all' (default: active cares only)" },
102
+ },
103
+ },
104
+ },
105
+ },
106
+ handler: (a) => {
107
+ const agentRoot = (0, identity_1.getAgentRoot)();
108
+ const cares = a.status === "all" ? (0, cares_1.readCares)(agentRoot) : (0, cares_1.readActiveCares)(agentRoot);
109
+ (0, runtime_1.emitNervesEvent)({ component: "repertoire", event: "repertoire.query_cares", message: `queried ${cares.length} cares`, meta: { count: cares.length } });
110
+ return JSON.stringify(cares, null, 2);
111
+ },
112
+ },
113
+ {
114
+ tool: {
115
+ type: "function",
116
+ function: {
117
+ name: "care_manage",
118
+ description: "Create, update, or resolve a care. Cares are things I watch over — people, projects, missions, system health.",
119
+ parameters: {
120
+ type: "object",
121
+ properties: {
122
+ action: { type: "string", enum: ["create", "update", "resolve"], description: "What to do" },
123
+ id: { type: "string", description: "Care ID (required for update/resolve)" },
124
+ label: { type: "string", description: "Short label for the care" },
125
+ why: { type: "string", description: "Why this matters" },
126
+ salience: { type: "string", description: "low, medium, high, or critical" },
127
+ kind: { type: "string", description: "person, agent, project, mission, or system" },
128
+ stewardship: { type: "string", description: "mine, shared, or delegated" },
129
+ },
130
+ required: ["action"],
131
+ },
132
+ },
133
+ },
134
+ handler: (a) => {
135
+ const agentRoot = (0, identity_1.getAgentRoot)();
136
+ let result;
137
+ if (a.action === "create") {
138
+ result = (0, cares_1.createCare)(agentRoot, {
139
+ label: a.label ?? "untitled",
140
+ why: a.why ?? "",
141
+ kind: a.kind ?? "project",
142
+ status: "active",
143
+ salience: a.salience ?? "medium",
144
+ steward: a.stewardship ?? "mine",
145
+ relatedFriendIds: [],
146
+ relatedAgentIds: [],
147
+ relatedObligationIds: [],
148
+ relatedEpisodeIds: [],
149
+ currentRisk: null,
150
+ nextCheckAt: null,
151
+ });
152
+ }
153
+ else if (a.action === "update") {
154
+ const updates = {};
155
+ if (a.label)
156
+ updates.label = a.label;
157
+ if (a.why)
158
+ updates.why = a.why;
159
+ if (a.salience)
160
+ updates.salience = a.salience;
161
+ result = (0, cares_1.updateCare)(agentRoot, a.id, updates);
162
+ }
163
+ else if (a.action === "resolve") {
164
+ result = (0, cares_1.resolveCare)(agentRoot, a.id);
165
+ }
166
+ (0, runtime_1.emitNervesEvent)({ component: "repertoire", event: "repertoire.care_manage", message: `care ${a.action}`, meta: { action: a.action, id: a.id } });
167
+ return JSON.stringify(result, null, 2);
168
+ },
169
+ riskProfile: { mutates: "durable_state_write", risk: "high", reason: "creates or updates care state" },
170
+ },
171
+ {
172
+ tool: {
173
+ type: "function",
174
+ function: {
175
+ name: "query_relationships",
176
+ description: "Query known agent relationships — familiarity, trust, shared missions, interaction history.",
177
+ parameters: {
178
+ type: "object",
179
+ properties: {
180
+ agentName: { type: "string", description: "Specific agent name to query (omit for all)" },
181
+ },
182
+ },
183
+ },
184
+ },
185
+ handler: async (a, ctx) => {
186
+ const allFriends = ctx?.friendStore?.listAll ? await ctx.friendStore.listAll() : [];
187
+ let agents = allFriends.filter((f) => f.kind === "agent");
188
+ if (a.agentName) {
189
+ const needle = a.agentName.toLowerCase();
190
+ agents = agents.filter((f) => f.name?.toLowerCase() === needle);
191
+ }
192
+ (0, runtime_1.emitNervesEvent)({ component: "repertoire", event: "repertoire.query_relationships", message: `queried relationships`, meta: { agentName: a.agentName ?? "all" } });
193
+ return JSON.stringify(agents, null, 2);
194
+ },
195
+ },
196
+ {
197
+ tool: {
198
+ type: "function",
199
+ function: {
200
+ name: "intention_capture",
201
+ description: "File a lightweight mental note — something I want to do or check later, below the ceremony threshold of tasks or cares. Cheap to create, easy to close.",
202
+ parameters: {
203
+ type: "object",
204
+ properties: {
205
+ content: { type: "string", description: "What I want to keep track of" },
206
+ salience: { type: "string", description: "low, medium, or high (default: low)" },
207
+ nudgeAfter: { type: "string", description: "ISO timestamp — nudge me after this time" },
208
+ },
209
+ required: ["content"],
210
+ },
211
+ },
212
+ },
213
+ handler: (a) => {
214
+ const agentRoot = (0, identity_1.getAgentRoot)();
215
+ const intention = (0, intentions_1.captureIntention)(agentRoot, {
216
+ content: a.content,
217
+ salience: a.salience ?? "low",
218
+ source: "tool",
219
+ ...(a.nudgeAfter ? { nudgeAfter: a.nudgeAfter } : {}),
220
+ });
221
+ (0, runtime_1.emitNervesEvent)({ component: "repertoire", event: "repertoire.intention_capture", message: `captured intention ${intention.id}`, meta: { id: intention.id } });
222
+ return JSON.stringify(intention, null, 2);
223
+ },
224
+ riskProfile: { mutates: "durable_state_write", risk: "high", reason: "writes intention state" },
225
+ },
226
+ {
227
+ tool: {
228
+ type: "function",
229
+ function: {
230
+ name: "intention_manage",
231
+ description: "Resolve or dismiss an intention. Resolve = done. Dismiss = no longer relevant. Both remove it from active list.",
232
+ parameters: {
233
+ type: "object",
234
+ properties: {
235
+ action: { type: "string", enum: ["resolve", "dismiss"], description: "What to do" },
236
+ id: { type: "string", description: "Intention ID" },
237
+ },
238
+ required: ["action", "id"],
239
+ },
240
+ },
241
+ },
242
+ handler: (a) => {
243
+ const agentRoot = (0, identity_1.getAgentRoot)();
244
+ const result = a.action === "resolve"
245
+ ? (0, intentions_1.resolveIntention)(agentRoot, a.id)
246
+ : (0, intentions_1.dismissIntention)(agentRoot, a.id);
247
+ (0, runtime_1.emitNervesEvent)({ component: "repertoire", event: "repertoire.intention_manage", message: `intention ${a.action}: ${a.id}`, meta: { action: a.action, id: a.id } });
248
+ return JSON.stringify(result, null, 2);
249
+ },
250
+ riskProfile: { mutates: "durable_state_write", risk: "high", reason: "updates intention state" },
251
+ },
252
+ ];
@@ -0,0 +1,383 @@
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.credentialToolDefinitions = void 0;
37
+ const crypto = __importStar(require("node:crypto"));
38
+ const credential_access_1 = require("./credential-access");
39
+ const bitwarden_store_1 = require("./bitwarden-store");
40
+ const runtime_1 = require("../nerves/runtime");
41
+ const DEFAULT_PASSWORD_LENGTH = 24;
42
+ const MIN_PASSWORD_LENGTH = 12;
43
+ const MAX_PASSWORD_LENGTH = 128;
44
+ const PASSWORD_CHARSETS = {
45
+ lower: "abcdefghijkmnopqrstuvwxyz",
46
+ upper: "ABCDEFGHJKLMNPQRSTUVWXYZ",
47
+ digits: "23456789",
48
+ symbols: "!@#$%^&*()-_=+[]{}:,.?",
49
+ };
50
+ function sanitizeCredentialToolError(err, secrets = []) {
51
+ const raw = err instanceof Error ? err.message : String(err);
52
+ return (0, bitwarden_store_1.sanitizeCredentialErrorDetail)(raw, { secrets });
53
+ }
54
+ function requireTrimmedText(value, fieldName) {
55
+ if (typeof value !== "string" || value.trim().length === 0) {
56
+ throw new Error(`${fieldName} must be a non-empty string.`);
57
+ }
58
+ return value.trim();
59
+ }
60
+ function requireNonBlankSecret(value, fieldName) {
61
+ if (typeof value !== "string" || value.trim().length === 0) {
62
+ throw new Error(`${fieldName} must be a non-empty string.`);
63
+ }
64
+ return value;
65
+ }
66
+ function optionalTrimmedText(value, fieldName) {
67
+ if (value === undefined)
68
+ return undefined;
69
+ if (typeof value !== "string") {
70
+ throw new Error(`${fieldName} must be a string if provided.`);
71
+ }
72
+ const trimmed = value.trim();
73
+ return trimmed.length > 0 ? trimmed : undefined;
74
+ }
75
+ function resolveVaultItemArg(args, legacyFieldName = "domain") {
76
+ if (args.item !== undefined)
77
+ return requireTrimmedText(args.item, "item");
78
+ return requireTrimmedText(args[legacyFieldName], legacyFieldName);
79
+ }
80
+ function parsePasswordLength(value) {
81
+ if (value === undefined || value === null || value === "")
82
+ return DEFAULT_PASSWORD_LENGTH;
83
+ const parsed = typeof value === "number" ? value : Number(value);
84
+ if (!Number.isInteger(parsed) || parsed < MIN_PASSWORD_LENGTH || parsed > MAX_PASSWORD_LENGTH) {
85
+ throw new Error(`length must be an integer between ${MIN_PASSWORD_LENGTH} and ${MAX_PASSWORD_LENGTH}.`);
86
+ }
87
+ return parsed;
88
+ }
89
+ function parseSymbolsFlag(value) {
90
+ if (value === undefined || value === null || value === "")
91
+ return true;
92
+ if (typeof value === "boolean")
93
+ return value;
94
+ /* v8 ignore next -- handler tests cover string "true"/"false"; branch mapping is noisy here @preserve */
95
+ if (typeof value === "string") {
96
+ const normalized = value.trim().toLowerCase();
97
+ if (normalized === "true")
98
+ return true;
99
+ if (normalized === "false")
100
+ return false;
101
+ }
102
+ throw new Error("symbols must be true or false.");
103
+ }
104
+ function randomChar(alphabet) {
105
+ /* v8 ignore next -- crypto.randomInt stays within bounds; fallback is defensive @preserve */
106
+ return alphabet[crypto.randomInt(0, alphabet.length)] ?? alphabet[0];
107
+ }
108
+ function secureShuffle(chars) {
109
+ for (let index = chars.length - 1; index > 0; index -= 1) {
110
+ const swapIndex = crypto.randomInt(0, index + 1);
111
+ [chars[index], chars[swapIndex]] = [chars[swapIndex], chars[index]];
112
+ }
113
+ }
114
+ function generatePassword(length, symbols) {
115
+ const charsets = [
116
+ PASSWORD_CHARSETS.lower,
117
+ PASSWORD_CHARSETS.upper,
118
+ PASSWORD_CHARSETS.digits,
119
+ ...(symbols ? [PASSWORD_CHARSETS.symbols] : []),
120
+ ];
121
+ const chars = charsets.map((alphabet) => randomChar(alphabet));
122
+ const combinedAlphabet = charsets.join("");
123
+ while (chars.length < length) {
124
+ chars.push(randomChar(combinedAlphabet));
125
+ }
126
+ secureShuffle(chars);
127
+ return chars.join("");
128
+ }
129
+ exports.credentialToolDefinitions = [
130
+ {
131
+ tool: {
132
+ type: "function",
133
+ function: {
134
+ name: "credential_get",
135
+ description: "Get credential metadata for a vault item name/path. Returns username, notes, and creation date. Never returns passwords — the credential gateway handles secret injection internally.",
136
+ parameters: {
137
+ type: "object",
138
+ properties: {
139
+ item: {
140
+ type: "string",
141
+ description: "Vault item name/path to look up (e.g. 'airbnb.com' or 'ops/porkbun/account')",
142
+ },
143
+ domain: {
144
+ type: "string",
145
+ description: "compatibility alias for item when the vault item name is a service domain",
146
+ },
147
+ },
148
+ required: ["domain"],
149
+ },
150
+ },
151
+ },
152
+ handler: async (args) => {
153
+ const itemName = resolveVaultItemArg(args);
154
+ (0, runtime_1.emitNervesEvent)({
155
+ component: "repertoire",
156
+ event: "repertoire.credential_tool_call",
157
+ message: "credential_get invoked",
158
+ meta: { tool: "credential_get", domain: itemName, item: itemName },
159
+ });
160
+ try {
161
+ const store = (0, credential_access_1.getCredentialStore)();
162
+ const meta = await store.get(itemName);
163
+ if (!meta) {
164
+ return `No credential found for "${itemName}".`;
165
+ }
166
+ return JSON.stringify(meta, null, 2);
167
+ }
168
+ catch (err) {
169
+ /* v8 ignore next -- defensive: store.get wraps errors @preserve */
170
+ return `Credential error: ${err instanceof Error ? err.message : String(err)}`;
171
+ }
172
+ },
173
+ summaryKeys: ["domain"],
174
+ },
175
+ {
176
+ tool: {
177
+ type: "function",
178
+ function: {
179
+ name: "credential_generate_password",
180
+ description: "Generate a strong password for a new account. Use it to complete signup, then immediately call credential_store with the exact accepted password so the vault becomes the source of truth.",
181
+ parameters: {
182
+ type: "object",
183
+ properties: {
184
+ domain: {
185
+ type: "string",
186
+ description: "Domain this password will be used for (e.g. 'airbnb.com')",
187
+ },
188
+ length: {
189
+ type: "integer",
190
+ description: "Optional password length. Defaults to 24. Allowed range: 12 to 128.",
191
+ },
192
+ symbols: {
193
+ type: "boolean",
194
+ description: "Whether to include punctuation symbols. Defaults to true.",
195
+ },
196
+ },
197
+ required: ["domain"],
198
+ },
199
+ },
200
+ },
201
+ handler: async (args) => {
202
+ let domain = "";
203
+ try {
204
+ domain = requireTrimmedText(args.domain, "domain");
205
+ const length = parsePasswordLength(args.length);
206
+ const symbols = parseSymbolsFlag(args.symbols);
207
+ (0, runtime_1.emitNervesEvent)({
208
+ component: "repertoire",
209
+ event: "repertoire.credential_tool_call",
210
+ message: "credential_generate_password invoked",
211
+ meta: { tool: "credential_generate_password", domain, length, symbols },
212
+ });
213
+ const password = generatePassword(length, symbols);
214
+ return JSON.stringify({
215
+ domain,
216
+ password,
217
+ length,
218
+ symbols,
219
+ nextStep: "Use this password for signup, then call credential_store with the exact accepted password.",
220
+ }, null, 2);
221
+ }
222
+ catch (err) {
223
+ return `Credential password generation error: ${sanitizeCredentialToolError(err)}`;
224
+ }
225
+ },
226
+ summaryKeys: ["domain", "length", "symbols"],
227
+ },
228
+ {
229
+ tool: {
230
+ type: "function",
231
+ function: {
232
+ name: "credential_store",
233
+ description: "Store credentials in a vault item name/path after the agent acquired or just used them successfully. Prefer credential_generate_password for new passwords, then call this tool once the site accepts the exact password. Stored passwords are never returned later — only metadata is visible.",
234
+ parameters: {
235
+ type: "object",
236
+ properties: {
237
+ item: {
238
+ type: "string",
239
+ description: "Vault item name/path to store under; domains are examples, not the schema",
240
+ },
241
+ domain: {
242
+ type: "string",
243
+ description: "compatibility alias for item when the vault item name is a service domain",
244
+ },
245
+ username: {
246
+ type: "string",
247
+ description: "Username or email for the account",
248
+ },
249
+ password: {
250
+ type: "string",
251
+ description: "Password for the account",
252
+ },
253
+ notes: {
254
+ type: "string",
255
+ description: "Optional human/agent orientation notes about this credential; not parsed by code",
256
+ },
257
+ },
258
+ required: ["domain", "username", "password"],
259
+ },
260
+ },
261
+ },
262
+ handler: async (args) => {
263
+ let domain = "";
264
+ let username = "";
265
+ let password = "";
266
+ let notes;
267
+ const itemNameForEvent = typeof args.item === "string" && args.item.trim() ? args.item.trim() : args.domain;
268
+ (0, runtime_1.emitNervesEvent)({
269
+ component: "repertoire",
270
+ event: "repertoire.credential_tool_call",
271
+ message: "credential_store invoked",
272
+ meta: { tool: "credential_store", domain: itemNameForEvent, item: itemNameForEvent },
273
+ });
274
+ try {
275
+ domain = resolveVaultItemArg(args);
276
+ username = requireTrimmedText(args.username, "username");
277
+ password = requireNonBlankSecret(args.password, "password");
278
+ notes = optionalTrimmedText(args.notes, "notes");
279
+ const store = (0, credential_access_1.getCredentialStore)();
280
+ await store.store(domain, {
281
+ username,
282
+ password,
283
+ notes,
284
+ });
285
+ return `Credentials stored and verified for "${domain}".`;
286
+ }
287
+ catch (err) {
288
+ /* v8 ignore next -- defensive: store.store wraps errors @preserve */
289
+ return `Credential store error: ${sanitizeCredentialToolError(err, [password, username, notes])}`;
290
+ }
291
+ },
292
+ summaryKeys: ["domain"],
293
+ riskProfile: { mutates: "durable_state_write", risk: "high", reason: "stores credential vault item" },
294
+ },
295
+ {
296
+ tool: {
297
+ type: "function",
298
+ function: {
299
+ name: "credential_list",
300
+ description: "List stored vault items. Returns metadata only (item/domain name, username, notes, creation date). Never returns passwords.",
301
+ parameters: {
302
+ type: "object",
303
+ properties: {
304
+ search: {
305
+ type: "string",
306
+ description: "Optional search filter to match against vault item names/paths",
307
+ },
308
+ },
309
+ },
310
+ },
311
+ },
312
+ handler: async (args) => {
313
+ (0, runtime_1.emitNervesEvent)({
314
+ component: "repertoire",
315
+ event: "repertoire.credential_tool_call",
316
+ message: "credential_list invoked",
317
+ meta: { tool: "credential_list" },
318
+ });
319
+ try {
320
+ const store = (0, credential_access_1.getCredentialStore)();
321
+ let items = await store.list();
322
+ // Client-side search filter
323
+ if (args.search) {
324
+ const term = args.search.toLowerCase();
325
+ items = items.filter((item) => item.domain.toLowerCase().includes(term) ||
326
+ (item.username && item.username.toLowerCase().includes(term)));
327
+ }
328
+ return JSON.stringify(items, null, 2);
329
+ }
330
+ catch (err) {
331
+ /* v8 ignore next -- defensive: store.list wraps errors @preserve */
332
+ return `Credential list error: ${err instanceof Error ? err.message : String(err)}`;
333
+ }
334
+ },
335
+ summaryKeys: ["search"],
336
+ },
337
+ {
338
+ tool: {
339
+ type: "function",
340
+ function: {
341
+ name: "credential_delete",
342
+ description: "Delete stored credentials for a vault item name/path.",
343
+ parameters: {
344
+ type: "object",
345
+ properties: {
346
+ item: {
347
+ type: "string",
348
+ description: "Vault item name/path whose credentials should be deleted",
349
+ },
350
+ domain: {
351
+ type: "string",
352
+ description: "compatibility alias for item when the vault item name is a service domain",
353
+ },
354
+ },
355
+ required: ["domain"],
356
+ },
357
+ },
358
+ },
359
+ handler: async (args) => {
360
+ (0, runtime_1.emitNervesEvent)({
361
+ component: "repertoire",
362
+ event: "repertoire.credential_tool_call",
363
+ message: "credential_delete invoked",
364
+ meta: { tool: "credential_delete", domain: args.domain },
365
+ });
366
+ try {
367
+ const itemName = resolveVaultItemArg(args);
368
+ const store = (0, credential_access_1.getCredentialStore)();
369
+ const deleted = await store.delete(itemName);
370
+ if (deleted) {
371
+ return `Credentials for "${itemName}" deleted.`;
372
+ }
373
+ return `No credential found for "${itemName}".`;
374
+ }
375
+ catch (err) {
376
+ /* v8 ignore next -- defensive: store.delete wraps errors @preserve */
377
+ return `Credential delete error: ${err instanceof Error ? err.message : String(err)}`;
378
+ }
379
+ },
380
+ summaryKeys: ["domain"],
381
+ riskProfile: { mutates: "durable_state_write", risk: "high", reason: "deletes credential vault item" },
382
+ },
383
+ ];