@ouro.bot/cli 0.1.0-alpha.37 → 0.1.0-alpha.371

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 (329) hide show
  1. package/README.md +106 -14
  2. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +3 -2
  3. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +1 -1
  4. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  5. package/changelog.json +2230 -0
  6. package/dist/arc/attention-types.js +8 -0
  7. package/dist/arc/cares.js +140 -0
  8. package/dist/arc/episodes.js +117 -0
  9. package/dist/arc/intentions.js +133 -0
  10. package/dist/arc/json-store.js +117 -0
  11. package/dist/arc/obligations.js +237 -0
  12. package/dist/arc/packets.js +193 -0
  13. package/dist/arc/presence.js +185 -0
  14. package/dist/arc/task-lifecycle.js +65 -0
  15. package/dist/heart/active-work.js +832 -0
  16. package/dist/heart/agent-entry.js +37 -2
  17. package/dist/heart/attachments/image-normalize.js +194 -0
  18. package/dist/heart/attachments/materialize.js +97 -0
  19. package/dist/heart/attachments/originals.js +88 -0
  20. package/dist/heart/attachments/render.js +29 -0
  21. package/dist/heart/attachments/sources/adapter.js +2 -0
  22. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  23. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  24. package/dist/heart/attachments/sources/index.js +16 -0
  25. package/dist/heart/attachments/store.js +103 -0
  26. package/dist/heart/attachments/types.js +93 -0
  27. package/dist/heart/auth/auth-flow.js +378 -0
  28. package/dist/heart/bridges/manager.js +358 -0
  29. package/dist/heart/bridges/state-machine.js +135 -0
  30. package/dist/heart/bridges/store.js +123 -0
  31. package/dist/heart/bundle-state.js +168 -0
  32. package/dist/heart/commitments.js +111 -0
  33. package/dist/heart/config-registry.js +304 -0
  34. package/dist/heart/config.js +107 -61
  35. package/dist/heart/core.js +803 -259
  36. package/dist/heart/cross-chat-delivery.js +131 -0
  37. package/dist/heart/daemon/agent-config-check.js +382 -0
  38. package/dist/heart/daemon/agent-discovery.js +79 -3
  39. package/dist/heart/daemon/agent-service.js +360 -0
  40. package/dist/heart/daemon/agentic-repair.js +205 -0
  41. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  42. package/dist/heart/daemon/cadence.js +70 -0
  43. package/dist/heart/daemon/cli-defaults.js +538 -0
  44. package/dist/heart/daemon/cli-exec.js +3114 -0
  45. package/dist/heart/daemon/cli-help.js +312 -0
  46. package/dist/heart/daemon/cli-parse.js +1023 -0
  47. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  48. package/dist/heart/daemon/cli-render.js +560 -0
  49. package/dist/heart/daemon/cli-types.js +8 -0
  50. package/dist/heart/daemon/daemon-cli.js +29 -1171
  51. package/dist/heart/daemon/daemon-entry.js +356 -3
  52. package/dist/heart/daemon/daemon-health.js +141 -0
  53. package/dist/heart/daemon/daemon-runtime-sync.js +157 -12
  54. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  55. package/dist/heart/daemon/daemon.js +757 -58
  56. package/dist/heart/daemon/doctor-types.js +8 -0
  57. package/dist/heart/daemon/doctor.js +445 -0
  58. package/dist/heart/daemon/health-monitor.js +79 -1
  59. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  60. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  61. package/dist/heart/daemon/http-health-probe.js +80 -0
  62. package/dist/heart/daemon/inner-status.js +89 -0
  63. package/dist/heart/daemon/interactive-repair.js +148 -0
  64. package/dist/heart/daemon/launchd.js +46 -9
  65. package/dist/heart/daemon/log-tailer.js +82 -12
  66. package/dist/heart/daemon/logs-prune.js +105 -0
  67. package/dist/heart/daemon/message-router.js +17 -8
  68. package/dist/heart/daemon/os-cron-deps.js +134 -0
  69. package/dist/heart/daemon/ouro-bot-entry.js +1 -1
  70. package/dist/heart/daemon/process-manager.js +201 -0
  71. package/dist/heart/daemon/provider-discovery.js +113 -0
  72. package/dist/heart/daemon/pulse.js +475 -0
  73. package/dist/heart/daemon/run-hooks.js +2 -0
  74. package/dist/heart/daemon/runtime-logging.js +67 -16
  75. package/dist/heart/daemon/runtime-metadata.js +101 -0
  76. package/dist/heart/daemon/runtime-mode.js +67 -0
  77. package/dist/heart/daemon/safe-mode.js +161 -0
  78. package/dist/heart/daemon/sense-manager.js +72 -3
  79. package/dist/heart/daemon/session-id-resolver.js +131 -0
  80. package/dist/heart/daemon/skill-management-installer.js +94 -0
  81. package/dist/heart/daemon/socket-client.js +307 -0
  82. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  83. package/dist/heart/daemon/startup-tui.js +237 -0
  84. package/dist/heart/daemon/task-scheduler.js +3 -25
  85. package/dist/heart/daemon/thoughts.js +510 -0
  86. package/dist/heart/daemon/up-progress.js +135 -0
  87. package/dist/heart/delegation.js +62 -0
  88. package/dist/heart/habits/habit-migration.js +181 -0
  89. package/dist/heart/habits/habit-parser.js +140 -0
  90. package/dist/heart/habits/habit-scheduler.js +371 -0
  91. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -126
  92. package/dist/heart/{daemon → hatch}/hatch-specialist.js +3 -3
  93. package/dist/heart/{daemon → hatch}/specialist-prompt.js +11 -8
  94. package/dist/heart/{daemon → hatch}/specialist-tools.js +77 -11
  95. package/dist/heart/identity.js +154 -59
  96. package/dist/heart/kept-notes.js +357 -0
  97. package/dist/heart/kicks.js +2 -20
  98. package/dist/heart/machine-identity.js +161 -0
  99. package/dist/heart/mcp/mcp-server.js +653 -0
  100. package/dist/heart/migrate-config.js +100 -0
  101. package/dist/heart/model-capabilities.js +59 -0
  102. package/dist/heart/outlook/outlook-http-hooks.js +64 -0
  103. package/dist/heart/outlook/outlook-http-response.js +7 -0
  104. package/dist/heart/outlook/outlook-http-routes.js +232 -0
  105. package/dist/heart/outlook/outlook-http-static.js +99 -0
  106. package/dist/heart/outlook/outlook-http-transport.js +116 -0
  107. package/dist/heart/outlook/outlook-http.js +99 -0
  108. package/dist/heart/outlook/outlook-read.js +28 -0
  109. package/dist/heart/outlook/outlook-types.js +27 -0
  110. package/dist/heart/outlook/outlook-view.js +195 -0
  111. package/dist/heart/outlook/readers/agent-machine.js +359 -0
  112. package/dist/heart/outlook/readers/continuity-readers.js +332 -0
  113. package/dist/heart/outlook/readers/runtime-readers.js +660 -0
  114. package/dist/heart/outlook/readers/sessions.js +232 -0
  115. package/dist/heart/outlook/readers/shared.js +111 -0
  116. package/dist/heart/platform.js +81 -0
  117. package/dist/heart/progress-story.js +42 -0
  118. package/dist/heart/provider-attempt.js +133 -0
  119. package/dist/heart/provider-binding-resolver.js +239 -0
  120. package/dist/heart/provider-credentials.js +379 -0
  121. package/dist/heart/provider-failover.js +266 -0
  122. package/dist/heart/provider-models.js +81 -0
  123. package/dist/heart/provider-ping.js +237 -0
  124. package/dist/heart/provider-state.js +216 -0
  125. package/dist/heart/provider-visibility.js +180 -0
  126. package/dist/heart/providers/anthropic-token.js +131 -0
  127. package/dist/heart/providers/anthropic.js +193 -55
  128. package/dist/heart/providers/azure.js +103 -12
  129. package/dist/heart/providers/error-classification.js +63 -0
  130. package/dist/heart/providers/github-copilot.js +145 -0
  131. package/dist/heart/providers/minimax-vlm.js +189 -0
  132. package/dist/heart/providers/minimax.js +29 -7
  133. package/dist/heart/providers/openai-codex.js +39 -29
  134. package/dist/heart/session-activity.js +190 -0
  135. package/dist/heart/session-events.js +855 -0
  136. package/dist/heart/session-transcript.js +167 -0
  137. package/dist/heart/start-of-turn-packet.js +345 -0
  138. package/dist/heart/streaming.js +36 -27
  139. package/dist/heart/sync.js +332 -0
  140. package/dist/heart/target-resolution.js +127 -0
  141. package/dist/heart/tempo.js +93 -0
  142. package/dist/heart/temporal-view.js +41 -0
  143. package/dist/heart/tool-activity-callbacks.js +36 -0
  144. package/dist/heart/tool-description.js +135 -0
  145. package/dist/heart/tool-friction.js +55 -0
  146. package/dist/heart/tool-loop.js +200 -0
  147. package/dist/heart/turn-context.js +362 -0
  148. package/dist/heart/turn-coordinator.js +28 -0
  149. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +1 -1
  150. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  151. package/dist/heart/versioning/ouro-path-installer.js +301 -0
  152. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  153. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  154. package/dist/heart/{daemon → versioning}/update-checker.js +12 -2
  155. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  156. package/dist/mind/bundle-manifest.js +7 -1
  157. package/dist/mind/context.js +141 -94
  158. package/dist/mind/diary-integrity.js +60 -0
  159. package/dist/mind/{memory.js → diary.js} +84 -96
  160. package/dist/mind/embedding-provider.js +60 -0
  161. package/dist/mind/file-state.js +179 -0
  162. package/dist/mind/first-impressions.js +14 -1
  163. package/dist/mind/friends/channel.js +56 -0
  164. package/dist/mind/friends/group-context.js +144 -0
  165. package/dist/mind/friends/resolver.js +38 -1
  166. package/dist/mind/friends/store-file.js +58 -3
  167. package/dist/mind/friends/trust-explanation.js +74 -0
  168. package/dist/mind/friends/types.js +9 -1
  169. package/dist/mind/journal-index.js +161 -0
  170. package/dist/mind/note-search.js +268 -0
  171. package/dist/mind/obligation-steering.js +221 -0
  172. package/dist/mind/pending.js +74 -7
  173. package/dist/mind/prompt-refresh.js +3 -2
  174. package/dist/mind/prompt.js +1030 -118
  175. package/dist/mind/provenance-trust.js +26 -0
  176. package/dist/mind/scrutiny.js +173 -0
  177. package/dist/mind/token-estimate.js +8 -12
  178. package/dist/nerves/cli-logging.js +7 -1
  179. package/dist/nerves/coverage/audit-rules.js +15 -6
  180. package/dist/nerves/coverage/audit.js +28 -2
  181. package/dist/nerves/coverage/cli.js +1 -1
  182. package/dist/nerves/coverage/file-completeness.js +83 -5
  183. package/dist/nerves/coverage/run-artifacts.js +1 -1
  184. package/dist/nerves/event-buffer.js +111 -0
  185. package/dist/nerves/index.js +224 -4
  186. package/dist/nerves/observation.js +20 -0
  187. package/dist/nerves/redact.js +79 -0
  188. package/dist/nerves/runtime.js +5 -1
  189. package/dist/outlook-ui/assets/index-LwChZTgL.css +1 -0
  190. package/dist/outlook-ui/assets/index-xTdv64BV.js +61 -0
  191. package/dist/outlook-ui/index.html +15 -0
  192. package/dist/repertoire/ado-client.js +15 -56
  193. package/dist/repertoire/ado-semantic.js +11 -10
  194. package/dist/repertoire/api-client.js +97 -0
  195. package/dist/repertoire/bitwarden-store.js +365 -0
  196. package/dist/repertoire/bundle-templates.js +72 -0
  197. package/dist/repertoire/bw-installer.js +79 -0
  198. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  199. package/dist/repertoire/coding/context-pack.js +330 -0
  200. package/dist/repertoire/coding/feedback.js +197 -30
  201. package/dist/repertoire/coding/manager.js +158 -9
  202. package/dist/repertoire/coding/spawner.js +55 -9
  203. package/dist/repertoire/coding/tools.js +170 -7
  204. package/dist/repertoire/commerce-errors.js +109 -0
  205. package/dist/repertoire/commerce-self-test.js +156 -0
  206. package/dist/repertoire/credential-access.js +107 -0
  207. package/dist/repertoire/duffel-client.js +185 -0
  208. package/dist/repertoire/github-client.js +14 -55
  209. package/dist/repertoire/graph-client.js +11 -52
  210. package/dist/repertoire/guardrails.js +375 -0
  211. package/dist/repertoire/mcp-client.js +255 -0
  212. package/dist/repertoire/mcp-manager.js +305 -0
  213. package/dist/repertoire/mcp-tools.js +63 -0
  214. package/dist/repertoire/shell-sessions.js +133 -0
  215. package/dist/repertoire/skills.js +15 -24
  216. package/dist/repertoire/stripe-client.js +131 -0
  217. package/dist/repertoire/tasks/board.js +43 -5
  218. package/dist/repertoire/tasks/fix.js +182 -0
  219. package/dist/repertoire/tasks/index.js +28 -10
  220. package/dist/repertoire/tasks/lifecycle.js +2 -2
  221. package/dist/repertoire/tasks/parser.js +3 -2
  222. package/dist/repertoire/tasks/scanner.js +194 -37
  223. package/dist/repertoire/tasks/transitions.js +16 -79
  224. package/dist/repertoire/tool-results.js +29 -0
  225. package/dist/repertoire/tools-attachments.js +317 -0
  226. package/dist/repertoire/tools-base.js +45 -771
  227. package/dist/repertoire/tools-bluebubbles.js +1 -0
  228. package/dist/repertoire/tools-bridge.js +141 -0
  229. package/dist/repertoire/tools-bundle.js +984 -0
  230. package/dist/repertoire/tools-config.js +185 -0
  231. package/dist/repertoire/tools-continuity.js +248 -0
  232. package/dist/repertoire/tools-credential.js +182 -0
  233. package/dist/repertoire/tools-files.js +342 -0
  234. package/dist/repertoire/tools-flight.js +224 -0
  235. package/dist/repertoire/tools-flow.js +105 -0
  236. package/dist/repertoire/tools-github.js +1 -7
  237. package/dist/repertoire/tools-notes.js +376 -0
  238. package/dist/repertoire/tools-session.js +739 -0
  239. package/dist/repertoire/tools-shell.js +120 -0
  240. package/dist/repertoire/tools-stripe.js +180 -0
  241. package/dist/repertoire/tools-surface.js +243 -0
  242. package/dist/repertoire/tools-teams.js +12 -62
  243. package/dist/repertoire/tools-travel.js +125 -0
  244. package/dist/repertoire/tools-user-profile.js +144 -0
  245. package/dist/repertoire/tools-vault.js +40 -0
  246. package/dist/repertoire/tools.js +144 -138
  247. package/dist/repertoire/travel-api-client.js +360 -0
  248. package/dist/repertoire/user-profile.js +118 -0
  249. package/dist/repertoire/vault-setup.js +241 -0
  250. package/dist/repertoire/vault-unlock.js +359 -0
  251. package/dist/scripts/claude-code-hook.js +41 -0
  252. package/dist/scripts/claude-code-stop-hook.js +47 -0
  253. package/dist/senses/attention-queue.js +116 -0
  254. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  255. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  256. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +260 -9
  257. package/dist/senses/bluebubbles/entry.js +13 -0
  258. package/dist/senses/bluebubbles/inbound-log.js +113 -0
  259. package/dist/senses/bluebubbles/index.js +1620 -0
  260. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  261. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +43 -12
  262. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +46 -6
  263. package/dist/senses/bluebubbles/replay.js +129 -0
  264. package/dist/senses/bluebubbles/runtime-state.js +109 -0
  265. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  266. package/dist/senses/cli/bracketed-paste.js +82 -0
  267. package/dist/senses/cli/image-paste.js +287 -0
  268. package/dist/senses/cli/image-ref-navigation.js +75 -0
  269. package/dist/senses/cli/ink-app.js +156 -0
  270. package/dist/senses/cli/inline-diff.js +64 -0
  271. package/dist/senses/cli/input-keys.js +174 -0
  272. package/dist/senses/cli/kill-ring.js +86 -0
  273. package/dist/senses/cli/message-list.js +51 -0
  274. package/dist/senses/cli/ouro-tui.js +605 -0
  275. package/dist/senses/cli/spinner-imperative.js +135 -0
  276. package/dist/senses/cli/spinner.js +101 -0
  277. package/dist/senses/cli/status-line.js +60 -0
  278. package/dist/senses/cli/streaming-markdown.js +526 -0
  279. package/dist/senses/cli/tool-display.js +83 -0
  280. package/dist/senses/cli/tool-render.js +85 -0
  281. package/dist/senses/cli/tui-store.js +240 -0
  282. package/dist/senses/cli/virtual-list.js +35 -0
  283. package/dist/senses/cli-entry.js +1 -1
  284. package/dist/senses/cli-layout.js +187 -0
  285. package/dist/senses/cli.js +588 -250
  286. package/dist/senses/commands.js +66 -3
  287. package/dist/senses/continuity.js +94 -0
  288. package/dist/senses/habit-turn-message.js +108 -0
  289. package/dist/senses/inner-dialog-worker.js +112 -19
  290. package/dist/senses/inner-dialog.js +636 -86
  291. package/dist/senses/pipeline.js +602 -0
  292. package/dist/senses/proactive-content-guard.js +51 -0
  293. package/dist/senses/shared-turn.js +205 -0
  294. package/dist/senses/surface-tool.js +68 -0
  295. package/dist/senses/teams.js +693 -160
  296. package/dist/senses/trust-gate.js +112 -2
  297. package/package.json +29 -7
  298. package/skills/agent-commerce.md +106 -0
  299. package/skills/browser-navigation.md +110 -0
  300. package/skills/commerce-setup-guide.md +116 -0
  301. package/skills/commerce-setup.md +84 -0
  302. package/skills/configure-dev-tools.md +101 -0
  303. package/skills/travel-planning.md +138 -0
  304. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  305. package/dist/heart/daemon/subagent-installer.js +0 -134
  306. package/dist/mind/associative-recall.js +0 -197
  307. package/dist/senses/bluebubbles-entry.js +0 -11
  308. package/dist/senses/bluebubbles.js +0 -558
  309. package/dist/senses/debug-activity.js +0 -127
  310. package/subagents/README.md +0 -60
  311. package/subagents/work-doer.md +0 -235
  312. package/subagents/work-merger.md +0 -618
  313. package/subagents/work-planner.md +0 -382
  314. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  315. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  316. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  317. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  318. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  319. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  320. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  321. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  322. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  323. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  324. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  325. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  326. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  327. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  328. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  329. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -40,6 +40,7 @@ exports.getAzureConfig = getAzureConfig;
40
40
  exports.getMinimaxConfig = getMinimaxConfig;
41
41
  exports.getAnthropicConfig = getAnthropicConfig;
42
42
  exports.getOpenAICodexConfig = getOpenAICodexConfig;
43
+ exports.getGithubCopilotConfig = getGithubCopilotConfig;
43
44
  exports.getTeamsConfig = getTeamsConfig;
44
45
  exports.getTeamsSecondaryConfig = getTeamsSecondaryConfig;
45
46
  exports.getContextConfig = getContextConfig;
@@ -49,39 +50,20 @@ exports.getTeamsChannelConfig = getTeamsChannelConfig;
49
50
  exports.getBlueBubblesConfig = getBlueBubblesConfig;
50
51
  exports.getBlueBubblesChannelConfig = getBlueBubblesChannelConfig;
51
52
  exports.getIntegrationsConfig = getIntegrationsConfig;
53
+ exports.getSyncConfig = getSyncConfig;
52
54
  exports.getOpenAIEmbeddingsApiKey = getOpenAIEmbeddingsApiKey;
53
55
  exports.getLogsDir = getLogsDir;
56
+ exports.sanitizeKey = sanitizeKey;
57
+ exports.slugify = slugify;
54
58
  exports.resolveSessionPath = resolveSessionPath;
55
59
  exports.sessionPath = sessionPath;
56
60
  exports.logPath = logPath;
57
61
  const fs = __importStar(require("fs"));
58
62
  const path = __importStar(require("path"));
59
63
  const identity_1 = require("./identity");
64
+ const provider_credentials_1 = require("./provider-credentials");
60
65
  const runtime_1 = require("../nerves/runtime");
61
- const DEFAULT_SECRETS_TEMPLATE = {
62
- providers: {
63
- // Keep provider field ordering consistent: model first, then auth credentials,
64
- // then provider-specific transport fields.
65
- azure: {
66
- modelName: "",
67
- apiKey: "",
68
- endpoint: "",
69
- deployment: "",
70
- apiVersion: "2025-04-01-preview",
71
- },
72
- minimax: {
73
- model: "",
74
- apiKey: "",
75
- },
76
- anthropic: {
77
- model: "claude-opus-4-6",
78
- setupToken: "",
79
- },
80
- "openai-codex": {
81
- model: "gpt-5.4",
82
- oauthAccessToken: "",
83
- },
84
- },
66
+ const DEFAULT_LOCAL_RUNTIME_CONFIG = {
85
67
  teams: {
86
68
  clientId: "",
87
69
  clientSecret: "",
@@ -113,6 +95,9 @@ const DEFAULT_SECRETS_TEMPLATE = {
113
95
  webhookPath: "/bluebubbles-webhook",
114
96
  requestTimeoutMs: 30000,
115
97
  },
98
+ vault: {
99
+ masterPassword: "",
100
+ },
116
101
  integrations: {
117
102
  perplexityApiKey: "",
118
103
  openaiEmbeddingsApiKey: "",
@@ -120,24 +105,20 @@ const DEFAULT_SECRETS_TEMPLATE = {
120
105
  };
121
106
  function defaultRuntimeConfig() {
122
107
  return {
123
- providers: {
124
- azure: { ...DEFAULT_SECRETS_TEMPLATE.providers.azure },
125
- minimax: { ...DEFAULT_SECRETS_TEMPLATE.providers.minimax },
126
- anthropic: { ...DEFAULT_SECRETS_TEMPLATE.providers.anthropic },
127
- "openai-codex": { ...DEFAULT_SECRETS_TEMPLATE.providers["openai-codex"] },
128
- },
129
- teams: { ...DEFAULT_SECRETS_TEMPLATE.teams },
130
- teamsSecondary: { ...DEFAULT_SECRETS_TEMPLATE.teamsSecondary },
131
- oauth: { ...DEFAULT_SECRETS_TEMPLATE.oauth },
108
+ teams: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.teams },
109
+ teamsSecondary: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.teamsSecondary },
110
+ oauth: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.oauth },
132
111
  context: { ...identity_1.DEFAULT_AGENT_CONTEXT },
133
- teamsChannel: { ...DEFAULT_SECRETS_TEMPLATE.teamsChannel },
134
- bluebubbles: { ...DEFAULT_SECRETS_TEMPLATE.bluebubbles },
135
- bluebubblesChannel: { ...DEFAULT_SECRETS_TEMPLATE.bluebubblesChannel },
136
- integrations: { ...DEFAULT_SECRETS_TEMPLATE.integrations },
112
+ teamsChannel: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.teamsChannel },
113
+ bluebubbles: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.bluebubbles },
114
+ bluebubblesChannel: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.bluebubblesChannel },
115
+ vault: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.vault },
116
+ integrations: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.integrations },
137
117
  };
138
118
  }
139
- let _cachedConfig = null;
119
+ let _runtimeConfigOverride = null;
140
120
  let _testContextOverride = null;
121
+ let _providerConfigOverride = null;
141
122
  function resolveConfigPath() {
142
123
  return (0, identity_1.getAgentSecretsPath)();
143
124
  }
@@ -158,15 +139,6 @@ function deepMerge(defaults, partial) {
158
139
  return result;
159
140
  }
160
141
  function loadConfig() {
161
- if (_cachedConfig) {
162
- (0, runtime_1.emitNervesEvent)({
163
- event: "config.load",
164
- component: "config/identity",
165
- message: "config loaded from cache",
166
- meta: { source: "cache" },
167
- });
168
- return _cachedConfig;
169
- }
170
142
  const configPath = resolveConfigPath();
171
143
  // Auto-create config directory if it doesn't exist
172
144
  const configDir = path.dirname(configPath);
@@ -185,7 +157,7 @@ function loadConfig() {
185
157
  : undefined;
186
158
  if (errorCode === "ENOENT") {
187
159
  try {
188
- fs.writeFileSync(configPath, JSON.stringify(DEFAULT_SECRETS_TEMPLATE, null, 2) + "\n", "utf-8");
160
+ fs.writeFileSync(configPath, JSON.stringify(DEFAULT_LOCAL_RUNTIME_CONFIG, null, 2) + "\n", "utf-8");
189
161
  }
190
162
  catch (writeError) {
191
163
  (0, runtime_1.emitNervesEvent)({
@@ -214,6 +186,19 @@ function loadConfig() {
214
186
  // ENOENT or parse error -- use defaults
215
187
  }
216
188
  const sanitizedFileData = { ...fileData };
189
+ if ("providers" in sanitizedFileData) {
190
+ delete sanitizedFileData.providers;
191
+ (0, runtime_1.emitNervesEvent)({
192
+ level: "warn",
193
+ event: "config_identity.error",
194
+ component: "config/identity",
195
+ message: "ignored legacy providers block in secrets config",
196
+ meta: {
197
+ phase: "loadConfig",
198
+ path: configPath,
199
+ },
200
+ });
201
+ }
217
202
  if ("context" in sanitizedFileData) {
218
203
  delete sanitizedFileData.context;
219
204
  (0, runtime_1.emitNervesEvent)({
@@ -227,7 +212,10 @@ function loadConfig() {
227
212
  },
228
213
  });
229
214
  }
230
- _cachedConfig = deepMerge(defaultRuntimeConfig(), sanitizedFileData);
215
+ const mergedConfig = deepMerge(defaultRuntimeConfig(), sanitizedFileData);
216
+ const config = _runtimeConfigOverride
217
+ ? deepMerge(mergedConfig, _runtimeConfigOverride)
218
+ : mergedConfig;
231
219
  (0, runtime_1.emitNervesEvent)({
232
220
  event: "config.load",
233
221
  component: "config/identity",
@@ -235,38 +223,75 @@ function loadConfig() {
235
223
  meta: {
236
224
  source: "disk",
237
225
  used_defaults_only: Object.keys(fileData).length === 0,
226
+ override_applied: _runtimeConfigOverride !== null,
238
227
  },
239
228
  });
240
- return _cachedConfig;
229
+ return config;
241
230
  }
242
231
  function resetConfigCache() {
243
- _cachedConfig = null;
232
+ _runtimeConfigOverride = null;
244
233
  _testContextOverride = null;
234
+ _providerConfigOverride = null;
235
+ (0, provider_credentials_1.resetProviderCredentialCache)();
236
+ }
237
+ function seedProviderCredentialCache(providers) {
238
+ if (!providers)
239
+ return;
240
+ _providerConfigOverride = deepMerge((_providerConfigOverride ?? {}), providers);
241
+ const records = Object.entries(_providerConfigOverride).map(([provider, rawConfig]) => {
242
+ const split = (0, provider_credentials_1.splitProviderCredentialFields)(provider, rawConfig);
243
+ return (0, provider_credentials_1.createProviderCredentialRecord)({
244
+ provider: provider,
245
+ credentials: split.credentials,
246
+ config: split.config,
247
+ provenance: { source: "manual" },
248
+ now: new Date(0),
249
+ });
250
+ });
251
+ (0, provider_credentials_1.cacheProviderCredentialRecords)((0, identity_1.getAgentName)(), records, new Date(0));
245
252
  }
246
253
  function patchRuntimeConfig(partial) {
247
- loadConfig(); // ensure _cachedConfig exists
254
+ const { providers, ...runtimePartial } = partial;
255
+ seedProviderCredentialCache(providers);
248
256
  const contextPatch = partial.context;
249
257
  if (contextPatch) {
250
258
  const base = _testContextOverride ?? identity_1.DEFAULT_AGENT_CONTEXT;
251
259
  _testContextOverride = deepMerge(base, contextPatch);
252
260
  }
253
- _cachedConfig = deepMerge(_cachedConfig, partial);
261
+ _runtimeConfigOverride = deepMerge((_runtimeConfigOverride ?? {}), runtimePartial);
262
+ }
263
+ function readProviderConfig(provider) {
264
+ const cached = (0, provider_credentials_1.readCachedProviderCredentialRecord)((0, identity_1.getAgentName)(), provider);
265
+ return cached.ok ? { ...cached.record.config, ...cached.record.credentials } : {};
254
266
  }
255
267
  function getAzureConfig() {
256
- const config = loadConfig();
257
- return { ...config.providers.azure };
268
+ const raw = readProviderConfig("azure");
269
+ return {
270
+ apiKey: typeof raw.apiKey === "string" ? raw.apiKey : "",
271
+ endpoint: typeof raw.endpoint === "string" ? raw.endpoint : "",
272
+ deployment: typeof raw.deployment === "string" ? raw.deployment : "",
273
+ apiVersion: typeof raw.apiVersion === "string" ? raw.apiVersion : "2025-04-01-preview",
274
+ managedIdentityClientId: typeof raw.managedIdentityClientId === "string" ? raw.managedIdentityClientId : "",
275
+ };
258
276
  }
259
277
  function getMinimaxConfig() {
260
- const config = loadConfig();
261
- return { ...config.providers.minimax };
278
+ const raw = readProviderConfig("minimax");
279
+ return { apiKey: typeof raw.apiKey === "string" ? raw.apiKey : "" };
262
280
  }
263
281
  function getAnthropicConfig() {
264
- const config = loadConfig();
265
- return { ...config.providers.anthropic };
282
+ const raw = readProviderConfig("anthropic");
283
+ return { setupToken: typeof raw.setupToken === "string" ? raw.setupToken : "" };
266
284
  }
267
285
  function getOpenAICodexConfig() {
268
- const config = loadConfig();
269
- return { ...config.providers["openai-codex"] };
286
+ const raw = readProviderConfig("openai-codex");
287
+ return { oauthAccessToken: typeof raw.oauthAccessToken === "string" ? raw.oauthAccessToken : "" };
288
+ }
289
+ function getGithubCopilotConfig() {
290
+ const raw = readProviderConfig("github-copilot");
291
+ return {
292
+ githubToken: typeof raw.githubToken === "string" ? raw.githubToken : "",
293
+ baseUrl: typeof raw.baseUrl === "string" ? raw.baseUrl : "",
294
+ };
270
295
  }
271
296
  function getTeamsConfig() {
272
297
  const config = loadConfig();
@@ -335,6 +360,19 @@ function getIntegrationsConfig() {
335
360
  const config = loadConfig();
336
361
  return { ...config.integrations };
337
362
  }
363
+ function getSyncConfig() {
364
+ try {
365
+ const agentConfig = (0, identity_1.loadAgentConfig)();
366
+ return {
367
+ enabled: agentConfig.sync?.enabled ?? false,
368
+ remote: agentConfig.sync?.remote ?? "origin",
369
+ };
370
+ }
371
+ catch {
372
+ /* v8 ignore next -- defensive: loadAgentConfig failure in test/bootstrap @preserve */
373
+ return { enabled: false, remote: "origin" };
374
+ }
375
+ }
338
376
  function getOpenAIEmbeddingsApiKey() {
339
377
  return getIntegrationsConfig().openaiEmbeddingsApiKey;
340
378
  }
@@ -344,6 +382,14 @@ function getLogsDir() {
344
382
  function sanitizeKey(key) {
345
383
  return key.replace(/[/:]/g, "_");
346
384
  }
385
+ function slugify(value) {
386
+ return value
387
+ .trim()
388
+ .toLowerCase()
389
+ .replace(/[^a-z0-9]+/g, "-")
390
+ .replace(/^-+/, "")
391
+ .replace(/-+$/, "");
392
+ }
347
393
  function resolveSessionPath(friendId, channel, key, options) {
348
394
  const dir = path.join((0, identity_1.getAgentRoot)(), "state", "sessions", friendId, channel);
349
395
  if (options?.ensureDir) {