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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (386) hide show
  1. package/README.md +133 -19
  2. package/RepairGuide.ouro/agent.json +5 -0
  3. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  4. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  5. package/RepairGuide.ouro/skills/diagnose-bootstrap-drift.md +54 -0
  6. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  7. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  8. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  9. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  12. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  13. package/changelog.json +3555 -0
  14. package/dist/arc/attention-types.js +8 -0
  15. package/dist/arc/cares.js +140 -0
  16. package/dist/arc/episodes.js +117 -0
  17. package/dist/arc/intentions.js +133 -0
  18. package/dist/arc/json-store.js +117 -0
  19. package/dist/arc/obligations.js +237 -0
  20. package/dist/arc/packets.js +193 -0
  21. package/dist/arc/presence.js +185 -0
  22. package/dist/arc/task-lifecycle.js +65 -0
  23. package/dist/heart/active-work.js +837 -26
  24. package/dist/heart/agent-entry.js +58 -3
  25. package/dist/heart/attachments/image-normalize.js +194 -0
  26. package/dist/heart/attachments/materialize.js +97 -0
  27. package/dist/heart/attachments/originals.js +88 -0
  28. package/dist/heart/attachments/render.js +29 -0
  29. package/dist/heart/attachments/sources/adapter.js +2 -0
  30. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  31. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  32. package/dist/heart/attachments/sources/index.js +16 -0
  33. package/dist/heart/attachments/store.js +103 -0
  34. package/dist/heart/attachments/types.js +93 -0
  35. package/dist/heart/auth/auth-flow.js +479 -0
  36. package/dist/heart/background-operations.js +281 -0
  37. package/dist/heart/bundle-state.js +168 -0
  38. package/dist/heart/commitments.js +111 -0
  39. package/dist/heart/config-registry.js +304 -0
  40. package/dist/heart/config.js +114 -118
  41. package/dist/heart/core.js +925 -246
  42. package/dist/heart/cross-chat-delivery.js +3 -18
  43. package/dist/heart/daemon/agent-config-check.js +512 -0
  44. package/dist/heart/daemon/agent-discovery.js +102 -3
  45. package/dist/heart/daemon/agent-service.js +522 -0
  46. package/dist/heart/daemon/agentic-repair.js +554 -0
  47. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  48. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  49. package/dist/heart/daemon/cadence.js +70 -0
  50. package/dist/heart/daemon/cli-defaults.js +665 -0
  51. package/dist/heart/daemon/cli-exec.js +7565 -0
  52. package/dist/heart/daemon/cli-help.js +498 -0
  53. package/dist/heart/daemon/cli-parse.js +1590 -0
  54. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  55. package/dist/heart/daemon/cli-render.js +775 -0
  56. package/dist/heart/daemon/cli-types.js +8 -0
  57. package/dist/heart/daemon/connect-bay.js +323 -0
  58. package/dist/heart/daemon/daemon-cli.js +29 -1672
  59. package/dist/heart/daemon/daemon-entry.js +417 -2
  60. package/dist/heart/daemon/daemon-health.js +183 -0
  61. package/dist/heart/daemon/daemon-rollup.js +58 -0
  62. package/dist/heart/daemon/daemon-runtime-sync.js +87 -13
  63. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  64. package/dist/heart/daemon/daemon.js +758 -71
  65. package/dist/heart/daemon/dns-workflow.js +394 -0
  66. package/dist/heart/daemon/doctor-types.js +8 -0
  67. package/dist/heart/daemon/doctor.js +844 -0
  68. package/dist/heart/daemon/drift-detection.js +146 -0
  69. package/dist/heart/daemon/health-monitor.js +122 -1
  70. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  71. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  72. package/dist/heart/daemon/http-health-probe.js +80 -0
  73. package/dist/heart/daemon/human-command-screens.js +234 -0
  74. package/dist/heart/daemon/human-readiness.js +114 -0
  75. package/dist/heart/daemon/inner-status.js +102 -0
  76. package/dist/heart/daemon/interactive-repair.js +394 -0
  77. package/dist/heart/daemon/launchd.js +37 -8
  78. package/dist/heart/daemon/log-tailer.js +82 -12
  79. package/dist/heart/daemon/logs-prune.js +110 -0
  80. package/dist/heart/daemon/mcp-canary.js +297 -0
  81. package/dist/heart/daemon/message-router.js +2 -2
  82. package/dist/heart/daemon/os-cron-deps.js +135 -0
  83. package/dist/heart/daemon/os-cron.js +14 -12
  84. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  85. package/dist/heart/daemon/ouro-entry.js +3 -1
  86. package/dist/heart/daemon/process-manager.js +375 -33
  87. package/dist/heart/daemon/provider-discovery.js +137 -0
  88. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  89. package/dist/heart/daemon/pulse.js +475 -0
  90. package/dist/heart/daemon/readiness-repair.js +365 -0
  91. package/dist/heart/daemon/run-hooks.js +2 -0
  92. package/dist/heart/daemon/runtime-logging.js +67 -16
  93. package/dist/heart/daemon/runtime-metadata.js +3 -31
  94. package/dist/heart/daemon/safe-mode.js +161 -0
  95. package/dist/heart/daemon/sense-manager.js +353 -38
  96. package/dist/heart/daemon/session-id-resolver.js +131 -0
  97. package/dist/heart/daemon/skill-management-installer.js +94 -0
  98. package/dist/heart/daemon/socket-client.js +158 -11
  99. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  100. package/dist/heart/daemon/startup-tui.js +330 -0
  101. package/dist/heart/daemon/task-scheduler.js +3 -25
  102. package/dist/heart/daemon/terminal-ui.js +499 -0
  103. package/dist/heart/daemon/thoughts.js +162 -17
  104. package/dist/heart/daemon/up-progress.js +366 -0
  105. package/dist/heart/daemon/vault-items.js +56 -0
  106. package/dist/heart/delegation.js +1 -1
  107. package/dist/heart/habits/habit-migration.js +189 -0
  108. package/dist/heart/habits/habit-parser.js +140 -0
  109. package/dist/heart/habits/habit-runtime-state.js +100 -0
  110. package/dist/heart/habits/habit-scheduler.js +372 -0
  111. package/dist/heart/{daemon → hatch}/hatch-flow.js +52 -117
  112. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  113. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  114. package/dist/heart/{daemon → hatch}/specialist-tools.js +35 -12
  115. package/dist/heart/identity.js +200 -51
  116. package/dist/heart/kept-notes.js +357 -0
  117. package/dist/heart/kicks.js +1 -1
  118. package/dist/heart/machine-identity.js +161 -0
  119. package/dist/heart/mail-import-discovery.js +353 -0
  120. package/dist/heart/mailbox/mailbox-http-hooks.js +66 -0
  121. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  122. package/dist/heart/mailbox/mailbox-http-routes.js +246 -0
  123. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  124. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  125. package/dist/heart/mailbox/mailbox-http.js +99 -0
  126. package/dist/heart/mailbox/mailbox-read.js +31 -0
  127. package/dist/heart/mailbox/mailbox-types.js +27 -0
  128. package/dist/heart/mailbox/mailbox-view.js +195 -0
  129. package/dist/heart/mailbox/readers/agent-machine.js +382 -0
  130. package/dist/heart/mailbox/readers/continuity-readers.js +338 -0
  131. package/dist/heart/mailbox/readers/mail.js +362 -0
  132. package/dist/heart/mailbox/readers/runtime-readers.js +651 -0
  133. package/dist/heart/mailbox/readers/sessions.js +232 -0
  134. package/dist/heart/mailbox/readers/shared.js +111 -0
  135. package/dist/heart/mcp/mcp-server.js +683 -0
  136. package/dist/heart/migrate-config.js +100 -0
  137. package/dist/heart/model-capabilities.js +19 -0
  138. package/dist/heart/platform.js +81 -0
  139. package/dist/heart/provider-attempt.js +134 -0
  140. package/dist/heart/provider-binding-resolver.js +255 -0
  141. package/dist/heart/provider-credentials.js +425 -0
  142. package/dist/heart/provider-failover.js +301 -0
  143. package/dist/heart/provider-models.js +81 -0
  144. package/dist/heart/provider-ping.js +262 -0
  145. package/dist/heart/provider-state.js +216 -0
  146. package/dist/heart/provider-visibility.js +188 -0
  147. package/dist/heart/providers/anthropic-token.js +131 -0
  148. package/dist/heart/providers/anthropic.js +139 -52
  149. package/dist/heart/providers/azure.js +97 -13
  150. package/dist/heart/providers/error-classification.js +127 -0
  151. package/dist/heart/providers/github-copilot.js +145 -0
  152. package/dist/heart/providers/minimax-vlm.js +189 -0
  153. package/dist/heart/providers/minimax.js +26 -8
  154. package/dist/heart/providers/openai-codex.js +55 -40
  155. package/dist/heart/runtime-capability-check.js +170 -0
  156. package/dist/heart/runtime-credentials.js +367 -0
  157. package/dist/heart/runtime-cwd.js +87 -0
  158. package/dist/heart/sense-truth.js +11 -4
  159. package/dist/heart/session-activity.js +43 -22
  160. package/dist/heart/session-events.js +1149 -0
  161. package/dist/heart/session-playback-cli-main.js +5 -0
  162. package/dist/heart/session-playback-cli.js +36 -0
  163. package/dist/heart/session-playback.js +231 -0
  164. package/dist/heart/session-stats-cli-main.js +5 -0
  165. package/dist/heart/session-stats.js +182 -0
  166. package/dist/heart/session-transcript.js +243 -0
  167. package/dist/heart/start-of-turn-packet.js +345 -0
  168. package/dist/heart/streaming.js +44 -27
  169. package/dist/heart/sync-classification.js +176 -0
  170. package/dist/heart/sync.js +449 -0
  171. package/dist/heart/target-resolution.js +9 -5
  172. package/dist/heart/tempo.js +93 -0
  173. package/dist/heart/temporal-view.js +41 -0
  174. package/dist/heart/timeouts.js +101 -0
  175. package/dist/heart/tool-activity-callbacks.js +59 -0
  176. package/dist/heart/tool-description.js +139 -0
  177. package/dist/heart/tool-friction.js +55 -0
  178. package/dist/heart/tool-loop.js +200 -0
  179. package/dist/heart/turn-context.js +381 -0
  180. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  181. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  182. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  183. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  184. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  185. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  186. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  187. package/dist/mailbox-ui/assets/index-BPr5vNuM.css +1 -0
  188. package/dist/mailbox-ui/assets/index-Cm51CY9W.js +61 -0
  189. package/dist/mailbox-ui/index.html +15 -0
  190. package/dist/mailroom/attention.js +167 -0
  191. package/dist/mailroom/autonomy.js +209 -0
  192. package/dist/mailroom/blob-store.js +674 -0
  193. package/dist/mailroom/body-cache.js +61 -0
  194. package/dist/mailroom/core.js +720 -0
  195. package/dist/mailroom/entry.js +160 -0
  196. package/dist/mailroom/file-store.js +430 -0
  197. package/dist/mailroom/mbox-import.js +383 -0
  198. package/dist/mailroom/outbound.js +380 -0
  199. package/dist/mailroom/policy.js +263 -0
  200. package/dist/mailroom/reader.js +233 -0
  201. package/dist/mailroom/search-cache.js +256 -0
  202. package/dist/mailroom/search-relevance.js +319 -0
  203. package/dist/mailroom/smtp-ingress.js +176 -0
  204. package/dist/mailroom/source-state.js +176 -0
  205. package/dist/mailroom/thread.js +109 -0
  206. package/dist/mailroom/travel-extract.js +89 -0
  207. package/dist/mind/bundle-manifest.js +7 -1
  208. package/dist/mind/context.js +165 -101
  209. package/dist/mind/diary-integrity.js +60 -0
  210. package/dist/mind/{memory.js → diary.js} +62 -75
  211. package/dist/mind/embedding-provider.js +60 -0
  212. package/dist/mind/file-state.js +179 -0
  213. package/dist/mind/friends/channel.js +30 -0
  214. package/dist/mind/friends/resolver.js +54 -2
  215. package/dist/mind/friends/store-file.js +39 -3
  216. package/dist/mind/friends/types.js +2 -2
  217. package/dist/mind/journal-index.js +161 -0
  218. package/dist/mind/note-search.js +268 -0
  219. package/dist/mind/obligation-steering.js +221 -0
  220. package/dist/mind/pending.js +4 -0
  221. package/dist/mind/prompt-refresh.js +3 -2
  222. package/dist/mind/prompt.js +995 -123
  223. package/dist/mind/provenance-trust.js +26 -0
  224. package/dist/mind/scrutiny.js +173 -0
  225. package/dist/nerves/cli-logging.js +7 -1
  226. package/dist/nerves/coverage/audit-rules.js +15 -6
  227. package/dist/nerves/coverage/audit.js +28 -2
  228. package/dist/nerves/coverage/cli.js +1 -1
  229. package/dist/nerves/coverage/contract.js +5 -5
  230. package/dist/nerves/coverage/file-completeness.js +139 -5
  231. package/dist/nerves/coverage/run-artifacts.js +1 -1
  232. package/dist/nerves/event-buffer.js +111 -0
  233. package/dist/nerves/index.js +224 -4
  234. package/dist/nerves/observation.js +20 -0
  235. package/dist/nerves/redact.js +79 -0
  236. package/dist/nerves/review/cli-main.js +5 -0
  237. package/dist/nerves/review/cli.js +156 -0
  238. package/dist/nerves/review/core.js +152 -0
  239. package/dist/nerves/runtime.js +5 -1
  240. package/dist/repertoire/ado-client.js +15 -56
  241. package/dist/repertoire/ado-semantic.js +11 -10
  242. package/dist/repertoire/api-client.js +97 -0
  243. package/dist/repertoire/bitwarden-store.js +816 -0
  244. package/dist/repertoire/bundle-templates.js +72 -0
  245. package/dist/repertoire/bw-installer.js +180 -0
  246. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  247. package/dist/repertoire/coding/context-pack.js +330 -0
  248. package/dist/repertoire/coding/feedback.js +197 -30
  249. package/dist/repertoire/coding/manager.js +158 -9
  250. package/dist/repertoire/coding/spawner.js +55 -9
  251. package/dist/repertoire/coding/tools.js +170 -7
  252. package/dist/repertoire/commerce-errors.js +109 -0
  253. package/dist/repertoire/commerce-self-test.js +156 -0
  254. package/dist/repertoire/credential-access.js +111 -0
  255. package/dist/repertoire/duffel-client.js +185 -0
  256. package/dist/repertoire/github-client.js +14 -55
  257. package/dist/repertoire/graph-client.js +11 -52
  258. package/dist/repertoire/guardrails.js +396 -0
  259. package/dist/repertoire/mcp-client.js +295 -0
  260. package/dist/repertoire/mcp-manager.js +362 -0
  261. package/dist/repertoire/mcp-tools.js +63 -0
  262. package/dist/repertoire/shell-sessions.js +133 -0
  263. package/dist/repertoire/skills.js +15 -24
  264. package/dist/repertoire/stripe-client.js +131 -0
  265. package/dist/repertoire/tasks/board.js +31 -5
  266. package/dist/repertoire/tasks/fix.js +182 -0
  267. package/dist/repertoire/tasks/index.js +16 -4
  268. package/dist/repertoire/tasks/lifecycle.js +2 -2
  269. package/dist/repertoire/tasks/parser.js +3 -2
  270. package/dist/repertoire/tasks/scanner.js +194 -37
  271. package/dist/repertoire/tasks/transitions.js +16 -78
  272. package/dist/repertoire/tool-results.js +29 -0
  273. package/dist/repertoire/tools-attachments.js +317 -0
  274. package/dist/repertoire/tools-base.js +47 -1075
  275. package/dist/repertoire/tools-bluebubbles.js +1 -0
  276. package/dist/repertoire/tools-bridge.js +142 -0
  277. package/dist/repertoire/tools-bundle.js +984 -0
  278. package/dist/repertoire/tools-config.js +185 -0
  279. package/dist/repertoire/tools-continuity.js +248 -0
  280. package/dist/repertoire/tools-credential.js +381 -0
  281. package/dist/repertoire/tools-files.js +342 -0
  282. package/dist/repertoire/tools-flight.js +224 -0
  283. package/dist/repertoire/tools-flow.js +119 -0
  284. package/dist/repertoire/tools-github.js +1 -7
  285. package/dist/repertoire/tools-mail.js +1857 -0
  286. package/dist/repertoire/tools-notes.js +421 -0
  287. package/dist/repertoire/tools-session.js +750 -0
  288. package/dist/repertoire/tools-shell.js +120 -0
  289. package/dist/repertoire/tools-stripe.js +180 -0
  290. package/dist/repertoire/tools-surface.js +243 -0
  291. package/dist/repertoire/tools-teams.js +9 -39
  292. package/dist/repertoire/tools-travel.js +125 -0
  293. package/dist/repertoire/tools-trip.js +604 -0
  294. package/dist/repertoire/tools-user-profile.js +144 -0
  295. package/dist/repertoire/tools-vault.js +40 -0
  296. package/dist/repertoire/tools.js +108 -100
  297. package/dist/repertoire/travel-api-client.js +360 -0
  298. package/dist/repertoire/user-profile.js +131 -0
  299. package/dist/repertoire/vault-setup.js +246 -0
  300. package/dist/repertoire/vault-unlock.js +561 -0
  301. package/dist/scripts/claude-code-hook.js +41 -0
  302. package/dist/scripts/claude-code-stop-hook.js +47 -0
  303. package/dist/senses/attention-queue.js +116 -0
  304. package/dist/senses/bluebubbles/active-turns.js +216 -0
  305. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  306. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  307. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  308. package/dist/senses/bluebubbles/entry.js +77 -0
  309. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  310. package/dist/senses/bluebubbles/index.js +2305 -0
  311. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  312. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  313. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  314. package/dist/senses/bluebubbles/processed-log.js +133 -0
  315. package/dist/senses/bluebubbles/replay.js +137 -0
  316. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  317. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  318. package/dist/senses/cli/bracketed-paste.js +82 -0
  319. package/dist/senses/cli/image-paste.js +287 -0
  320. package/dist/senses/cli/image-ref-navigation.js +75 -0
  321. package/dist/senses/cli/ink-app.js +156 -0
  322. package/dist/senses/cli/inline-diff.js +64 -0
  323. package/dist/senses/cli/input-keys.js +174 -0
  324. package/dist/senses/cli/kill-ring.js +86 -0
  325. package/dist/senses/cli/message-list.js +51 -0
  326. package/dist/senses/cli/ouro-tui.js +607 -0
  327. package/dist/senses/cli/spinner-imperative.js +135 -0
  328. package/dist/senses/cli/spinner.js +101 -0
  329. package/dist/senses/cli/status-line.js +60 -0
  330. package/dist/senses/cli/streaming-markdown.js +526 -0
  331. package/dist/senses/cli/tool-display.js +85 -0
  332. package/dist/senses/cli/tool-render.js +85 -0
  333. package/dist/senses/cli/tui-store.js +240 -0
  334. package/dist/senses/cli/virtual-list.js +35 -0
  335. package/dist/senses/cli-entry.js +60 -8
  336. package/dist/senses/cli-layout.js +187 -0
  337. package/dist/senses/cli.js +520 -209
  338. package/dist/senses/commands.js +66 -3
  339. package/dist/senses/habit-turn-message.js +108 -0
  340. package/dist/senses/inner-dialog-worker.js +175 -21
  341. package/dist/senses/inner-dialog.js +330 -27
  342. package/dist/senses/mail-entry.js +66 -0
  343. package/dist/senses/mail.js +379 -0
  344. package/dist/senses/pipeline.js +569 -182
  345. package/dist/senses/proactive-content-guard.js +51 -0
  346. package/dist/senses/shared-turn.js +248 -0
  347. package/dist/senses/surface-tool.js +68 -0
  348. package/dist/senses/teams-entry.js +60 -8
  349. package/dist/senses/teams.js +387 -98
  350. package/dist/senses/trust-gate.js +100 -5
  351. package/dist/trips/core.js +138 -0
  352. package/dist/trips/store.js +146 -0
  353. package/package.json +38 -7
  354. package/skills/agent-commerce.md +106 -0
  355. package/skills/browser-navigation.md +117 -0
  356. package/skills/commerce-setup-guide.md +116 -0
  357. package/skills/commerce-setup.md +84 -0
  358. package/skills/configure-dev-tools.md +101 -0
  359. package/skills/travel-planning.md +138 -0
  360. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  361. package/dist/heart/daemon/subagent-installer.js +0 -166
  362. package/dist/heart/session-recall.js +0 -116
  363. package/dist/mind/associative-recall.js +0 -209
  364. package/dist/senses/bluebubbles-entry.js +0 -13
  365. package/dist/senses/bluebubbles.js +0 -1177
  366. package/dist/senses/debug-activity.js +0 -148
  367. package/subagents/README.md +0 -86
  368. package/subagents/work-doer.md +0 -237
  369. package/subagents/work-merger.md +0 -618
  370. package/subagents/work-planner.md +0 -390
  371. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  372. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  373. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  374. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  375. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  376. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  377. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  378. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  379. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  380. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  381. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  382. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  383. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  384. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  385. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  386. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,216 @@
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.validateProviderState = validateProviderState;
37
+ exports.getProviderStatePath = getProviderStatePath;
38
+ exports.readProviderState = readProviderState;
39
+ exports.writeProviderState = writeProviderState;
40
+ exports.bootstrapProviderStateFromAgentConfig = bootstrapProviderStateFromAgentConfig;
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const runtime_1 = require("../nerves/runtime");
44
+ const identity_1 = require("./identity");
45
+ const LANES = ["outward", "inner"];
46
+ const VALID_SOURCES = new Set(["bootstrap", "local"]);
47
+ const VALID_READINESS = new Set(["ready", "failed", "stale", "unknown"]);
48
+ function isProvider(value) {
49
+ return typeof value === "string" && Object.prototype.hasOwnProperty.call(identity_1.PROVIDER_CREDENTIALS, value);
50
+ }
51
+ function isNonEmptyString(value) {
52
+ return typeof value === "string" && value.trim().length > 0;
53
+ }
54
+ function validateBinding(value, label) {
55
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
56
+ throw new Error(`${label} must be an object`);
57
+ }
58
+ const record = value;
59
+ if (!isProvider(record.provider))
60
+ throw new Error(`${label}.provider must be a valid provider`);
61
+ if (!isNonEmptyString(record.model))
62
+ throw new Error(`${label}.model must be a non-empty string`);
63
+ if (!VALID_SOURCES.has(record.source)) {
64
+ throw new Error(`${label}.source must be bootstrap or local`);
65
+ }
66
+ if (!isNonEmptyString(record.updatedAt))
67
+ throw new Error(`${label}.updatedAt must be a non-empty string`);
68
+ return {
69
+ provider: record.provider,
70
+ model: record.model,
71
+ source: record.source,
72
+ updatedAt: record.updatedAt,
73
+ };
74
+ }
75
+ function validateReadiness(value, label) {
76
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
77
+ throw new Error(`${label} must be an object`);
78
+ }
79
+ const record = value;
80
+ if (!VALID_READINESS.has(record.status)) {
81
+ throw new Error(`${label}.status must be ready, failed, stale, or unknown`);
82
+ }
83
+ if (!isProvider(record.provider))
84
+ throw new Error(`${label}.provider must be a valid provider`);
85
+ if (!isNonEmptyString(record.model))
86
+ throw new Error(`${label}.model must be a non-empty string`);
87
+ if (record.checkedAt !== undefined && typeof record.checkedAt !== "string") {
88
+ throw new Error(`${label}.checkedAt must be a string when present`);
89
+ }
90
+ if (record.credentialRevision !== undefined && typeof record.credentialRevision !== "string") {
91
+ throw new Error(`${label}.credentialRevision must be a string when present`);
92
+ }
93
+ if (record.error !== undefined && typeof record.error !== "string") {
94
+ throw new Error(`${label}.error must be a string when present`);
95
+ }
96
+ if (record.attempts !== undefined && typeof record.attempts !== "number") {
97
+ throw new Error(`${label}.attempts must be a number when present`);
98
+ }
99
+ return {
100
+ status: record.status,
101
+ provider: record.provider,
102
+ model: record.model,
103
+ ...(record.checkedAt !== undefined ? { checkedAt: record.checkedAt } : {}),
104
+ ...(record.credentialRevision !== undefined ? { credentialRevision: record.credentialRevision } : {}),
105
+ ...(record.error !== undefined ? { error: record.error } : {}),
106
+ ...(record.attempts !== undefined ? { attempts: record.attempts } : {}),
107
+ };
108
+ }
109
+ function validateProviderState(value) {
110
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
111
+ throw new Error("provider state must be an object");
112
+ }
113
+ const record = value;
114
+ if (record.schemaVersion !== 1)
115
+ throw new Error("schemaVersion must be 1");
116
+ if (!isNonEmptyString(record.machineId))
117
+ throw new Error("machineId must be a non-empty string");
118
+ if (!isNonEmptyString(record.updatedAt))
119
+ throw new Error("updatedAt must be a non-empty string");
120
+ if (!record.lanes || typeof record.lanes !== "object" || Array.isArray(record.lanes)) {
121
+ throw new Error("lanes must be an object");
122
+ }
123
+ const rawLanes = record.lanes;
124
+ const lanes = {
125
+ outward: validateBinding(rawLanes.outward, "outward"),
126
+ inner: validateBinding(rawLanes.inner, "inner"),
127
+ };
128
+ if (!record.readiness || typeof record.readiness !== "object" || Array.isArray(record.readiness)) {
129
+ throw new Error("readiness must be an object");
130
+ }
131
+ const rawReadiness = record.readiness;
132
+ const readiness = {};
133
+ for (const lane of LANES) {
134
+ if (rawReadiness[lane] !== undefined) {
135
+ readiness[lane] = validateReadiness(rawReadiness[lane], `${lane}.readiness`);
136
+ }
137
+ }
138
+ return {
139
+ schemaVersion: 1,
140
+ machineId: record.machineId,
141
+ updatedAt: record.updatedAt,
142
+ lanes,
143
+ readiness,
144
+ };
145
+ }
146
+ function getProviderStatePath(agentRoot) {
147
+ return path.join(agentRoot, "state", "providers.json");
148
+ }
149
+ function readProviderState(agentRoot) {
150
+ const statePath = getProviderStatePath(agentRoot);
151
+ let raw;
152
+ try {
153
+ if (!fs.existsSync(statePath)) {
154
+ return { ok: false, reason: "missing", statePath, error: "provider state not found" };
155
+ }
156
+ }
157
+ catch (error) {
158
+ return { ok: false, reason: "invalid", statePath, error: String(error) };
159
+ }
160
+ try {
161
+ raw = fs.readFileSync(statePath, "utf-8");
162
+ }
163
+ catch (error) {
164
+ const code = error.code;
165
+ if (code === "ENOENT") {
166
+ return { ok: false, reason: "missing", statePath, error: "provider state not found" };
167
+ }
168
+ return { ok: false, reason: "invalid", statePath, error: String(error) };
169
+ }
170
+ try {
171
+ const state = validateProviderState(JSON.parse(raw));
172
+ (0, runtime_1.emitNervesEvent)({
173
+ component: "config/identity",
174
+ event: "config.provider_state_read",
175
+ message: "read provider state",
176
+ meta: { statePath, machineId: state.machineId },
177
+ });
178
+ return { ok: true, statePath, state };
179
+ }
180
+ catch (error) {
181
+ return { ok: false, reason: "invalid", statePath, error: String(error) };
182
+ }
183
+ }
184
+ function writeProviderState(agentRoot, state) {
185
+ const statePath = getProviderStatePath(agentRoot);
186
+ const validated = validateProviderState(state);
187
+ fs.mkdirSync(path.dirname(statePath), { recursive: true });
188
+ fs.writeFileSync(statePath, `${JSON.stringify(validated, null, 2)}\n`, "utf-8");
189
+ (0, runtime_1.emitNervesEvent)({
190
+ component: "config/identity",
191
+ event: "config.provider_state_written",
192
+ message: "wrote provider state",
193
+ meta: { statePath, machineId: validated.machineId },
194
+ });
195
+ }
196
+ function binding(provider, model, updatedAt) {
197
+ return {
198
+ provider,
199
+ model,
200
+ source: "bootstrap",
201
+ updatedAt,
202
+ };
203
+ }
204
+ function bootstrapProviderStateFromAgentConfig(input) {
205
+ const updatedAt = input.now.toISOString();
206
+ return {
207
+ schemaVersion: 1,
208
+ machineId: input.machineId,
209
+ updatedAt,
210
+ lanes: {
211
+ outward: binding(input.agentConfig.humanFacing.provider, input.agentConfig.humanFacing.model, updatedAt),
212
+ inner: binding(input.agentConfig.agentFacing.provider, input.agentConfig.agentFacing.model, updatedAt),
213
+ },
214
+ readiness: {},
215
+ };
216
+ }
@@ -0,0 +1,188 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildAgentProviderVisibility = buildAgentProviderVisibility;
4
+ exports.formatProviderVisibilityLine = formatProviderVisibilityLine;
5
+ exports.formatAgentProviderVisibilityForPrompt = formatAgentProviderVisibilityForPrompt;
6
+ exports.formatAgentProviderVisibilityForStartOfTurn = formatAgentProviderVisibilityForStartOfTurn;
7
+ exports.formatAgentProviderVisibilityForPulse = formatAgentProviderVisibilityForPulse;
8
+ exports.providerVisibilityStatusRows = providerVisibilityStatusRows;
9
+ exports.isAgentProviderVisibility = isAgentProviderVisibility;
10
+ const runtime_1 = require("../nerves/runtime");
11
+ const provider_binding_resolver_1 = require("./provider-binding-resolver");
12
+ const LANES = ["outward", "inner"];
13
+ function credentialVisibility(binding) {
14
+ const credential = binding.credential;
15
+ if (credential.status === "present") {
16
+ return {
17
+ status: "present",
18
+ source: credential.source,
19
+ revision: credential.revision,
20
+ };
21
+ }
22
+ return {
23
+ status: credential.status,
24
+ ...("repair" in credential ? { repairCommand: credential.repair.command } : {}),
25
+ };
26
+ }
27
+ function readinessVisibility(binding) {
28
+ return {
29
+ status: binding.readiness.status,
30
+ ...(binding.readiness.checkedAt ? { checkedAt: binding.readiness.checkedAt } : {}),
31
+ ...(binding.readiness.error ? { error: binding.readiness.error } : {}),
32
+ ...(binding.readiness.reason ? { reason: binding.readiness.reason } : {}),
33
+ ...(binding.readiness.attempts !== undefined ? { attempts: binding.readiness.attempts } : {}),
34
+ };
35
+ }
36
+ function visibilityForLane(input, lane) {
37
+ const resolved = (0, provider_binding_resolver_1.resolveEffectiveProviderBinding)({ ...input, lane });
38
+ if (!resolved.ok) {
39
+ return {
40
+ lane,
41
+ status: "unconfigured",
42
+ provider: "unconfigured",
43
+ model: "-",
44
+ source: "missing",
45
+ readiness: {
46
+ status: "unknown",
47
+ reason: resolved.reason,
48
+ },
49
+ credential: {
50
+ status: "missing",
51
+ repairCommand: resolved.repair.command,
52
+ },
53
+ repairCommand: resolved.repair.command,
54
+ reason: resolved.reason,
55
+ warnings: resolved.warnings.map((warning) => warning.message),
56
+ };
57
+ }
58
+ return {
59
+ lane,
60
+ status: "configured",
61
+ provider: resolved.binding.provider,
62
+ model: resolved.binding.model,
63
+ source: resolved.binding.source,
64
+ readiness: readinessVisibility(resolved.binding),
65
+ credential: credentialVisibility(resolved.binding),
66
+ warnings: resolved.binding.warnings.map((warning) => warning.message),
67
+ };
68
+ }
69
+ function buildAgentProviderVisibility(input) {
70
+ const visibility = {
71
+ agentName: input.agentName,
72
+ lanes: LANES.map((lane) => visibilityForLane(input, lane)),
73
+ };
74
+ (0, runtime_1.emitNervesEvent)({
75
+ component: "config/identity",
76
+ event: "config.provider_visibility_built",
77
+ message: "built provider visibility summary",
78
+ meta: {
79
+ agentName: input.agentName,
80
+ laneStatuses: visibility.lanes.map((lane) => `${lane.lane}:${lane.status}`).join(","),
81
+ },
82
+ });
83
+ return visibility;
84
+ }
85
+ function credentialLabel(credential) {
86
+ if (credential.status === "present")
87
+ return credential.source ?? "vault";
88
+ if (credential.status === "invalid-pool")
89
+ return "vault unavailable";
90
+ if (credential.status === "not-loaded")
91
+ return "checked previously";
92
+ return "missing";
93
+ }
94
+ function readinessLabel(readiness) {
95
+ if (readiness.status === "failed") {
96
+ return readiness.error ? `failed: ${readiness.error}` : "failed";
97
+ }
98
+ if (readiness.status === "stale") {
99
+ return readiness.reason ? `stale: ${readiness.reason}` : "stale";
100
+ }
101
+ if (readiness.status === "unknown") {
102
+ return readiness.reason ? `unknown: ${readiness.reason}` : "unknown";
103
+ }
104
+ return readiness.status;
105
+ }
106
+ function providerStatusDetail(lane) {
107
+ if (lane.credential.status === "missing" || lane.credential.status === "invalid-pool")
108
+ return undefined;
109
+ return lane.readiness.error;
110
+ }
111
+ function formatProviderVisibilityLine(lane) {
112
+ if (lane.status === "unconfigured") {
113
+ return `${lane.lane}: unconfigured (${lane.reason}); repair: ${lane.repairCommand}`;
114
+ }
115
+ const parts = [
116
+ readinessLabel(lane.readiness),
117
+ `source: ${lane.source}`,
118
+ `credentials: ${credentialLabel(lane.credential)}`,
119
+ ];
120
+ if (lane.credential.revision)
121
+ parts.push(`revision: ${lane.credential.revision}`);
122
+ if (lane.credential.repairCommand)
123
+ parts.push(`repair: ${lane.credential.repairCommand}`);
124
+ if (lane.warnings.length > 0)
125
+ parts.push(`warnings: ${lane.warnings.join("; ")}`);
126
+ return `${lane.lane}: ${lane.provider} / ${lane.model} [${parts.join("; ")}]`;
127
+ }
128
+ function formatAgentProviderVisibilityForPrompt(visibility) {
129
+ if (visibility.lanes.every((lane) => lane.status === "unconfigured")) {
130
+ return [
131
+ "provider bindings are not configured on this machine.",
132
+ ...visibility.lanes.map((lane) => `- ${formatProviderVisibilityLine(lane)}`),
133
+ ].join("\n");
134
+ }
135
+ return [
136
+ "runtime uses local provider bindings for this machine:",
137
+ ...visibility.lanes.map((lane) => `- ${formatProviderVisibilityLine(lane)}`),
138
+ ].join("\n");
139
+ }
140
+ function formatAgentProviderVisibilityForStartOfTurn(visibility) {
141
+ return visibility.lanes.map((lane) => `- ${formatProviderVisibilityLine(lane)}`).join("\n");
142
+ }
143
+ function formatAgentProviderVisibilityForPulse(visibility) {
144
+ return visibility.lanes.map((lane) => formatProviderVisibilityLine(lane)).join("; ");
145
+ }
146
+ function providerVisibilityStatusRows(visibility) {
147
+ return visibility.lanes.map((lane) => {
148
+ if (lane.status === "unconfigured") {
149
+ return {
150
+ agent: visibility.agentName,
151
+ lane: lane.lane,
152
+ provider: "unconfigured",
153
+ model: "-",
154
+ source: "missing",
155
+ readiness: "unknown",
156
+ detail: lane.repairCommand,
157
+ credential: "missing",
158
+ };
159
+ }
160
+ const detail = providerStatusDetail(lane);
161
+ return {
162
+ agent: visibility.agentName,
163
+ lane: lane.lane,
164
+ provider: lane.provider,
165
+ model: lane.model,
166
+ source: lane.source,
167
+ readiness: lane.readiness.status,
168
+ ...(detail ? { detail } : {}),
169
+ credential: credentialLabel(lane.credential),
170
+ };
171
+ });
172
+ }
173
+ function isAgentProviderVisibility(value) {
174
+ if (!value || typeof value !== "object" || Array.isArray(value))
175
+ return false;
176
+ const record = value;
177
+ if (typeof record.agentName !== "string")
178
+ return false;
179
+ if (!Array.isArray(record.lanes))
180
+ return false;
181
+ return record.lanes.every((lane) => {
182
+ if (!lane || typeof lane !== "object" || Array.isArray(lane))
183
+ return false;
184
+ const laneRecord = lane;
185
+ return (laneRecord.lane === "outward" || laneRecord.lane === "inner")
186
+ && (laneRecord.status === "configured" || laneRecord.status === "unconfigured");
187
+ });
188
+ }
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.needsRefresh = needsRefresh;
4
+ exports.refreshAnthropicToken = refreshAnthropicToken;
5
+ exports.persistTokenState = persistTokenState;
6
+ exports.ensureFreshToken = ensureFreshToken;
7
+ /* v8 ignore start -- OAuth token lifecycle: requires live API calls, tested via integration @preserve */
8
+ const runtime_1 = require("../../nerves/runtime");
9
+ const provider_credentials_1 = require("../provider-credentials");
10
+ const OAUTH_TOKEN_ENDPOINT = "https://console.anthropic.com/v1/oauth/token";
11
+ const OAUTH_CLIENT_ID = "9d1c250a-e61b-44d9-88ed-5944d1962f5e";
12
+ const REFRESH_MARGIN_MS = 5 * 60 * 1000; // refresh 5 minutes before expiry
13
+ /**
14
+ * Check if the Anthropic OAuth token needs refreshing.
15
+ * Returns true if no expiresAt is set (legacy token) or if within 5 min of expiry.
16
+ */
17
+ function needsRefresh(expiresAt) {
18
+ if (!expiresAt)
19
+ return true; // legacy token with no expiry — always try refresh
20
+ return Date.now() > expiresAt - REFRESH_MARGIN_MS;
21
+ }
22
+ /**
23
+ * Refresh an Anthropic OAuth access token using the refresh token.
24
+ * Returns the new token state or null if refresh fails.
25
+ */
26
+ async function refreshAnthropicToken(refreshToken, fetchImpl = fetch) {
27
+ try {
28
+ const response = await fetchImpl(OAUTH_TOKEN_ENDPOINT, {
29
+ method: "POST",
30
+ headers: { "Content-Type": "application/json" },
31
+ body: JSON.stringify({
32
+ grant_type: "refresh_token",
33
+ refresh_token: refreshToken,
34
+ client_id: OAUTH_CLIENT_ID,
35
+ }),
36
+ });
37
+ if (!response.ok) {
38
+ (0, runtime_1.emitNervesEvent)({
39
+ level: "warn",
40
+ component: "engine",
41
+ event: "engine.anthropic_token_refresh_failed",
42
+ message: `token refresh failed: ${response.status}`,
43
+ meta: { status: response.status },
44
+ });
45
+ return null;
46
+ }
47
+ const json = await response.json();
48
+ if (!json.access_token) {
49
+ (0, runtime_1.emitNervesEvent)({
50
+ level: "warn",
51
+ component: "engine",
52
+ event: "engine.anthropic_token_refresh_failed",
53
+ message: "token refresh returned no access_token",
54
+ meta: {},
55
+ });
56
+ return null;
57
+ }
58
+ const state = {
59
+ accessToken: json.access_token,
60
+ refreshToken: json.refresh_token ?? refreshToken, // keep old if not returned
61
+ expiresAt: Date.now() + (json.expires_in ?? 28800) * 1000, // default 8h
62
+ };
63
+ (0, runtime_1.emitNervesEvent)({
64
+ component: "engine",
65
+ event: "engine.anthropic_token_refreshed",
66
+ message: "anthropic OAuth token refreshed",
67
+ meta: { expiresAt: new Date(state.expiresAt).toISOString() },
68
+ });
69
+ return state;
70
+ }
71
+ catch (error) {
72
+ (0, runtime_1.emitNervesEvent)({
73
+ level: "warn",
74
+ component: "engine",
75
+ event: "engine.anthropic_token_refresh_error",
76
+ message: "token refresh threw",
77
+ meta: { error: error instanceof Error ? error.message : String(error) },
78
+ });
79
+ return null;
80
+ }
81
+ }
82
+ /**
83
+ * Persist refreshed token state back to the agent vault.
84
+ */
85
+ async function persistTokenState(agentName, state) {
86
+ try {
87
+ await (0, provider_credentials_1.upsertProviderCredential)({
88
+ agentName,
89
+ provider: "anthropic",
90
+ credentials: {
91
+ setupToken: state.accessToken,
92
+ refreshToken: state.refreshToken,
93
+ expiresAt: state.expiresAt,
94
+ },
95
+ config: {},
96
+ provenance: { source: "auth-flow" },
97
+ });
98
+ /* v8 ignore start -- defensive: persistence failure must not crash the provider @preserve */
99
+ }
100
+ catch (error) {
101
+ (0, runtime_1.emitNervesEvent)({
102
+ level: "warn",
103
+ component: "engine",
104
+ event: "engine.anthropic_token_persist_error",
105
+ message: "failed to persist refreshed token",
106
+ meta: { error: error instanceof Error ? error.message : String(error) },
107
+ });
108
+ }
109
+ /* v8 ignore stop */
110
+ }
111
+ /**
112
+ * Ensure the Anthropic token is fresh. If expired, refresh and persist.
113
+ * Returns the current valid access token, or null if refresh failed and
114
+ * the existing token is expired.
115
+ */
116
+ async function ensureFreshToken(currentToken, refreshToken, expiresAt, agentName, fetchImpl) {
117
+ if (!needsRefresh(expiresAt)) {
118
+ return currentToken; // still fresh
119
+ }
120
+ if (!refreshToken) {
121
+ // No refresh token — use the current token as-is (may be expired)
122
+ return currentToken;
123
+ }
124
+ const newState = await refreshAnthropicToken(refreshToken, fetchImpl);
125
+ if (!newState) {
126
+ return currentToken; // refresh failed — try the old token
127
+ }
128
+ await persistTokenState(agentName, newState);
129
+ return newState.accessToken;
130
+ }
131
+ /* v8 ignore stop */