@ouro.bot/cli 0.1.0-alpha.71 → 0.1.0-alpha.711

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 (505) hide show
  1. package/README.md +133 -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 +4516 -14
  13. package/dist/a2a/card.js +57 -0
  14. package/dist/a2a/client.js +180 -0
  15. package/dist/a2a/config.js +50 -0
  16. package/dist/a2a/delegation-stores.js +56 -0
  17. package/dist/a2a/did-resolution.js +93 -0
  18. package/dist/a2a/identity.js +170 -0
  19. package/dist/a2a/inbound-share.js +107 -0
  20. package/dist/a2a/mission-result-wire.js +196 -0
  21. package/dist/a2a/onboarding.js +115 -0
  22. package/dist/a2a/pin-store.js +132 -0
  23. package/dist/a2a/seen-ledger.js +120 -0
  24. package/dist/a2a/server.js +604 -0
  25. package/dist/a2a/task-store.js +69 -0
  26. package/dist/a2a/transport.js +45 -0
  27. package/dist/a2a/types.js +3 -0
  28. package/dist/arc/attention-types.js +8 -0
  29. package/dist/arc/cares.js +144 -0
  30. package/dist/arc/episodes.js +118 -0
  31. package/dist/arc/evolution.js +490 -0
  32. package/dist/arc/flight-recorder.js +928 -0
  33. package/dist/arc/intentions.js +134 -0
  34. package/dist/arc/json-store.js +117 -0
  35. package/dist/arc/obligations.js +348 -0
  36. package/dist/arc/packets.js +336 -0
  37. package/dist/arc/presence.js +185 -0
  38. package/dist/arc/task-lifecycle.js +57 -0
  39. package/dist/commerce/store.js +755 -0
  40. package/dist/commerce/types.js +3 -0
  41. package/dist/heart/active-work.js +867 -43
  42. package/dist/heart/agent-entry.js +190 -3
  43. package/dist/heart/attachments/image-normalize.js +194 -0
  44. package/dist/heart/attachments/materialize.js +97 -0
  45. package/dist/heart/attachments/originals.js +88 -0
  46. package/dist/heart/attachments/render.js +29 -0
  47. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  48. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  49. package/dist/heart/attachments/sources/index.js +16 -0
  50. package/dist/heart/attachments/store.js +103 -0
  51. package/dist/heart/attachments/types.js +93 -0
  52. package/dist/heart/auth/auth-flow.js +479 -0
  53. package/dist/heart/autonomy-budget.js +434 -0
  54. package/dist/heart/awaiting/await-alert.js +146 -0
  55. package/dist/heart/awaiting/await-expiry.js +108 -0
  56. package/dist/heart/awaiting/await-loader.js +91 -0
  57. package/dist/heart/awaiting/await-parser.js +141 -0
  58. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  59. package/dist/heart/awaiting/await-scheduler.js +378 -0
  60. package/dist/heart/background-operations.js +281 -0
  61. package/dist/heart/bridges/manager.js +137 -17
  62. package/dist/heart/bridges/store.js +14 -2
  63. package/dist/heart/bundle-state.js +168 -0
  64. package/dist/heart/commitments.js +135 -0
  65. package/dist/heart/config-registry.js +331 -0
  66. package/dist/heart/config.js +119 -127
  67. package/dist/heart/context-loss-gauntlet.js +354 -0
  68. package/dist/heart/context-loss-sentinel.js +1155 -0
  69. package/dist/heart/core.js +1306 -278
  70. package/dist/heart/cross-chat-delivery.js +8 -22
  71. package/dist/heart/daemon/agent-config-check.js +451 -0
  72. package/dist/heart/daemon/agent-discovery.js +185 -3
  73. package/dist/heart/daemon/agent-service.js +523 -0
  74. package/dist/heart/daemon/agentic-repair.js +547 -0
  75. package/dist/heart/daemon/await-private-wake.js +59 -0
  76. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  77. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  78. package/dist/heart/daemon/cadence.js +180 -0
  79. package/dist/heart/daemon/cli-defaults.js +825 -0
  80. package/dist/heart/daemon/cli-desk.js +322 -0
  81. package/dist/heart/daemon/cli-exec.js +8194 -0
  82. package/dist/heart/daemon/cli-help.js +678 -0
  83. package/dist/heart/daemon/cli-parse.js +2476 -0
  84. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  85. package/dist/heart/daemon/cli-render.js +770 -0
  86. package/dist/heart/daemon/cli-types.js +8 -0
  87. package/dist/heart/daemon/connect-bay.js +323 -0
  88. package/dist/heart/daemon/daemon-cli.js +29 -1943
  89. package/dist/heart/daemon/daemon-entry.js +842 -10
  90. package/dist/heart/daemon/daemon-health.js +176 -0
  91. package/dist/heart/daemon/daemon-rollup.js +57 -0
  92. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  93. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  94. package/dist/heart/daemon/daemon.js +1289 -84
  95. package/dist/heart/daemon/dns-workflow.js +394 -0
  96. package/dist/heart/daemon/doctor-types.js +8 -0
  97. package/dist/heart/daemon/doctor.js +1126 -0
  98. package/dist/heart/daemon/habit-private-wake.js +56 -0
  99. package/dist/heart/daemon/health-monitor.js +142 -11
  100. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  101. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  102. package/dist/heart/daemon/http-health-probe.js +80 -0
  103. package/dist/heart/daemon/human-command-screens.js +234 -0
  104. package/dist/heart/daemon/human-readiness.js +114 -0
  105. package/dist/heart/daemon/inner-status.js +78 -0
  106. package/dist/heart/daemon/interactive-repair.js +394 -0
  107. package/dist/heart/daemon/launchd.js +37 -8
  108. package/dist/heart/daemon/log-tailer.js +79 -10
  109. package/dist/heart/daemon/logs-prune.js +110 -0
  110. package/dist/heart/daemon/mcp-canary.js +297 -0
  111. package/dist/heart/daemon/message-router.js +45 -5
  112. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  113. package/dist/heart/daemon/os-cron-deps.js +135 -0
  114. package/dist/heart/daemon/os-cron.js +22 -14
  115. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  116. package/dist/heart/daemon/ouro-entry.js +3 -1
  117. package/dist/heart/daemon/plugin-cli.js +432 -0
  118. package/dist/heart/daemon/process-manager.js +519 -40
  119. package/dist/heart/daemon/provider-discovery.js +137 -0
  120. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  121. package/dist/heart/daemon/pulse.js +511 -0
  122. package/dist/heart/daemon/readiness-repair.js +365 -0
  123. package/dist/heart/daemon/run-hooks.js +2 -0
  124. package/dist/heart/daemon/runtime-logging.js +41 -14
  125. package/dist/heart/daemon/runtime-metadata.js +2 -30
  126. package/dist/heart/daemon/safe-mode.js +161 -0
  127. package/dist/heart/daemon/sense-manager.js +670 -48
  128. package/dist/heart/daemon/session-id-resolver.js +131 -0
  129. package/dist/heart/daemon/skill-management-installer.js +1 -1
  130. package/dist/heart/daemon/socket-client.js +171 -12
  131. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  132. package/dist/heart/daemon/startup-tui.js +338 -0
  133. package/dist/heart/daemon/task-scheduler.js +117 -39
  134. package/dist/heart/daemon/terminal-ui.js +499 -0
  135. package/dist/heart/daemon/thoughts.js +255 -43
  136. package/dist/heart/daemon/up-progress.js +366 -0
  137. package/dist/heart/daemon/vault-items.js +56 -0
  138. package/dist/heart/delegation.js +1 -4
  139. package/dist/heart/external-events/router.js +121 -0
  140. package/dist/heart/habits/habit-migration.js +189 -0
  141. package/dist/heart/habits/habit-parser.js +214 -0
  142. package/dist/heart/habits/habit-runtime-state.js +114 -0
  143. package/dist/heart/habits/habit-scheduler.js +431 -0
  144. package/dist/heart/habits/habit-session-summary.js +318 -0
  145. package/dist/heart/habits/habit-session.js +617 -0
  146. package/dist/heart/{daemon → hatch}/hatch-flow.js +51 -60
  147. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  148. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  149. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  150. package/dist/heart/identity.js +174 -59
  151. package/dist/heart/kept-notes.js +289 -0
  152. package/dist/heart/kicks.js +1 -1
  153. package/dist/heart/machine-identity.js +161 -0
  154. package/dist/heart/mail-import-discovery.js +353 -0
  155. package/dist/heart/mailbox/mailbox-http-hooks.js +96 -0
  156. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  157. package/dist/heart/mailbox/mailbox-http-routes.js +375 -0
  158. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  159. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  160. package/dist/heart/mailbox/mailbox-http.js +99 -0
  161. package/dist/heart/mailbox/mailbox-read.js +37 -0
  162. package/dist/heart/mailbox/mailbox-types.js +27 -0
  163. package/dist/heart/mailbox/mailbox-view.js +197 -0
  164. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  165. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  166. package/dist/heart/mailbox/readers/mail.js +375 -0
  167. package/dist/heart/mailbox/readers/runtime-readers.js +815 -0
  168. package/dist/heart/mailbox/readers/sessions.js +232 -0
  169. package/dist/heart/mailbox/readers/shared.js +111 -0
  170. package/dist/heart/mcp/mcp-server.js +696 -0
  171. package/dist/heart/migrate-config.js +100 -0
  172. package/dist/heart/model-capabilities.js +11 -0
  173. package/dist/heart/orientation-frame.js +217 -0
  174. package/dist/heart/platform.js +81 -0
  175. package/dist/heart/primitives.js +1 -1
  176. package/dist/heart/private-runtime/decision-renderer.js +156 -0
  177. package/dist/heart/private-runtime/index.js +18 -0
  178. package/dist/heart/private-runtime/ledger.js +218 -0
  179. package/dist/heart/private-runtime/policy.js +214 -0
  180. package/dist/heart/private-runtime/types.js +2 -0
  181. package/dist/heart/progress-story.js +1 -1
  182. package/dist/heart/provider-attempt.js +134 -0
  183. package/dist/heart/provider-binding-resolver.js +273 -0
  184. package/dist/heart/provider-credentials.js +441 -0
  185. package/dist/heart/provider-failover.js +311 -0
  186. package/dist/heart/provider-models.js +81 -0
  187. package/dist/heart/provider-ping.js +262 -0
  188. package/dist/heart/provider-readiness-cache.js +119 -0
  189. package/dist/heart/provider-visibility.js +188 -0
  190. package/dist/heart/providers/anthropic-token.js +131 -0
  191. package/dist/heart/providers/anthropic.js +139 -52
  192. package/dist/heart/providers/azure.js +23 -11
  193. package/dist/heart/providers/error-classification.js +127 -0
  194. package/dist/heart/providers/github-copilot.js +34 -38
  195. package/dist/heart/providers/minimax-vlm.js +189 -0
  196. package/dist/heart/providers/minimax.js +26 -8
  197. package/dist/heart/providers/openai-codex-token.js +349 -0
  198. package/dist/heart/providers/openai-codex.js +55 -40
  199. package/dist/heart/run-ledger.js +247 -0
  200. package/dist/heart/runtime-capability-check.js +170 -0
  201. package/dist/heart/runtime-credentials.js +398 -0
  202. package/dist/heart/runtime-cwd.js +87 -0
  203. package/dist/heart/sense-truth.js +20 -4
  204. package/dist/heart/session-activity.js +90 -24
  205. package/dist/heart/session-events.js +1133 -0
  206. package/dist/heart/session-playback-cli-main.js +5 -0
  207. package/dist/heart/session-playback-cli.js +36 -0
  208. package/dist/heart/session-playback.js +231 -0
  209. package/dist/heart/session-stats-cli-main.js +5 -0
  210. package/dist/heart/session-stats.js +182 -0
  211. package/dist/heart/session-transcript.js +133 -0
  212. package/dist/heart/start-of-turn-packet.js +365 -0
  213. package/dist/heart/streaming.js +44 -27
  214. package/dist/heart/structured-output.js +196 -0
  215. package/dist/heart/sync-classification.js +176 -0
  216. package/dist/heart/sync.js +449 -0
  217. package/dist/heart/target-resolution.js +11 -7
  218. package/dist/heart/tempo.js +93 -0
  219. package/dist/heart/temporal-view.js +41 -0
  220. package/dist/heart/timeouts.js +101 -0
  221. package/dist/heart/tool-activity-callbacks.js +59 -0
  222. package/dist/heart/tool-description.js +155 -0
  223. package/dist/heart/tool-friction.js +55 -0
  224. package/dist/heart/tool-loop.js +200 -0
  225. package/dist/heart/turn-context.js +472 -0
  226. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  227. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  228. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  229. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  230. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  231. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  232. package/dist/heart/versioning/update-hooks.js +154 -0
  233. package/dist/heart/work-card.js +380 -0
  234. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  235. package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
  236. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  237. package/dist/mailbox-ui/index.html +16 -0
  238. package/dist/mailroom/attention.js +167 -0
  239. package/dist/mailroom/autonomy.js +209 -0
  240. package/dist/mailroom/blob-store.js +715 -0
  241. package/dist/mailroom/body-cache.js +61 -0
  242. package/dist/mailroom/core.js +788 -0
  243. package/dist/mailroom/entry.js +160 -0
  244. package/dist/mailroom/file-store.js +568 -0
  245. package/dist/mailroom/mbox-import.js +393 -0
  246. package/dist/mailroom/migration.js +164 -0
  247. package/dist/mailroom/outbound.js +380 -0
  248. package/dist/mailroom/policy.js +263 -0
  249. package/dist/mailroom/reader.js +233 -0
  250. package/dist/mailroom/search-cache.js +334 -0
  251. package/dist/mailroom/search-relevance.js +319 -0
  252. package/dist/mailroom/smtp-ingress.js +176 -0
  253. package/dist/mailroom/source-state.js +176 -0
  254. package/dist/mailroom/thread.js +109 -0
  255. package/dist/mailroom/travel-extract.js +89 -0
  256. package/dist/mind/bundle-manifest.js +24 -2
  257. package/dist/mind/context.js +250 -101
  258. package/dist/mind/desk-section.js +362 -0
  259. package/dist/mind/diary-integrity.js +60 -0
  260. package/dist/mind/{memory.js → diary.js} +68 -77
  261. package/dist/mind/embedding-provider.js +60 -0
  262. package/dist/mind/file-state.js +179 -0
  263. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  264. package/dist/mind/obligation-steering.js +221 -0
  265. package/dist/mind/pending.js +13 -8
  266. package/dist/mind/prompt-budget.js +380 -0
  267. package/dist/mind/prompt-refresh.js +3 -2
  268. package/dist/mind/prompt.js +1028 -169
  269. package/dist/mind/provenance-trust.js +26 -0
  270. package/dist/mind/record-paths.js +312 -0
  271. package/dist/mind/scrutiny.js +173 -0
  272. package/dist/nerves/cli-logging.js +7 -1
  273. package/dist/nerves/coverage/audit-rules.js +15 -6
  274. package/dist/nerves/coverage/audit.js +28 -2
  275. package/dist/nerves/coverage/cli.js +1 -1
  276. package/dist/nerves/coverage/contract.js +5 -5
  277. package/dist/nerves/coverage/file-completeness.js +139 -5
  278. package/dist/nerves/event-buffer.js +111 -0
  279. package/dist/nerves/index.js +234 -4
  280. package/dist/nerves/observation.js +20 -0
  281. package/dist/nerves/redact.js +79 -0
  282. package/dist/nerves/review/cli-main.js +5 -0
  283. package/dist/nerves/review/cli.js +156 -0
  284. package/dist/nerves/review/core.js +152 -0
  285. package/dist/nerves/runtime.js +5 -1
  286. package/dist/repertoire/ado-client.js +15 -56
  287. package/dist/repertoire/ado-semantic.js +16 -10
  288. package/dist/repertoire/api-client.js +97 -0
  289. package/dist/repertoire/bitwarden-store.js +1045 -0
  290. package/dist/repertoire/bundle-templates.js +71 -0
  291. package/dist/repertoire/bw-installer.js +180 -0
  292. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  293. package/dist/repertoire/coding/context-pack.js +331 -0
  294. package/dist/repertoire/coding/feedback.js +218 -30
  295. package/dist/repertoire/coding/index.js +15 -3
  296. package/dist/repertoire/coding/manager.js +166 -10
  297. package/dist/repertoire/coding/spawner.js +58 -11
  298. package/dist/repertoire/coding/tools.js +242 -14
  299. package/dist/repertoire/coding/workbench-client.js +272 -0
  300. package/dist/repertoire/coding/workbench-manager.js +346 -0
  301. package/dist/repertoire/commerce-errors.js +109 -0
  302. package/dist/repertoire/commerce-self-test.js +156 -0
  303. package/dist/repertoire/credential-access.js +178 -0
  304. package/dist/repertoire/desk/classifier.js +362 -0
  305. package/dist/repertoire/duffel-client.js +185 -0
  306. package/dist/repertoire/github-client.js +14 -55
  307. package/dist/repertoire/graph-client.js +11 -52
  308. package/dist/repertoire/guardrails.js +156 -27
  309. package/dist/repertoire/mcp-client.js +44 -3
  310. package/dist/repertoire/mcp-manager.js +259 -20
  311. package/dist/repertoire/mcp-tools.js +83 -0
  312. package/dist/repertoire/plugin-mcp.js +175 -0
  313. package/dist/repertoire/plugins.js +253 -0
  314. package/dist/repertoire/shell-sessions.js +133 -0
  315. package/dist/repertoire/skills.js +48 -4
  316. package/dist/repertoire/stripe-client.js +131 -0
  317. package/dist/repertoire/tool-results.js +29 -0
  318. package/dist/repertoire/tools-a2a.js +699 -0
  319. package/dist/repertoire/tools-attachments.js +317 -0
  320. package/dist/repertoire/tools-awaiting.js +372 -0
  321. package/dist/repertoire/tools-base.js +65 -1095
  322. package/dist/repertoire/tools-bluebubbles.js +2 -0
  323. package/dist/repertoire/tools-bridge.js +144 -0
  324. package/dist/repertoire/tools-bundle.js +993 -0
  325. package/dist/repertoire/tools-commerce.js +253 -0
  326. package/dist/repertoire/tools-config.js +186 -0
  327. package/dist/repertoire/tools-continuity.js +252 -0
  328. package/dist/repertoire/tools-credential.js +383 -0
  329. package/dist/repertoire/tools-evolution.js +527 -0
  330. package/dist/repertoire/tools-files.js +344 -0
  331. package/dist/repertoire/tools-flight.js +290 -0
  332. package/dist/repertoire/tools-flow.js +119 -0
  333. package/dist/repertoire/tools-github.js +3 -8
  334. package/dist/repertoire/tools-mail.js +1975 -0
  335. package/dist/repertoire/tools-notes.js +459 -0
  336. package/dist/repertoire/tools-obligations.js +182 -0
  337. package/dist/repertoire/tools-orientation.js +31 -0
  338. package/dist/repertoire/tools-record.js +482 -0
  339. package/dist/repertoire/tools-rsvp.js +139 -0
  340. package/dist/repertoire/tools-runtime.js +150 -0
  341. package/dist/repertoire/tools-session.js +881 -0
  342. package/dist/repertoire/tools-shell.js +120 -0
  343. package/dist/repertoire/tools-stripe.js +224 -0
  344. package/dist/repertoire/tools-surface.js +355 -0
  345. package/dist/repertoire/tools-teams.js +12 -39
  346. package/dist/repertoire/tools-travel.js +125 -0
  347. package/dist/repertoire/tools-trip.js +982 -0
  348. package/dist/repertoire/tools-user-profile.js +146 -0
  349. package/dist/repertoire/tools-vault.js +40 -0
  350. package/dist/repertoire/tools-voice.js +145 -0
  351. package/dist/repertoire/tools.js +250 -80
  352. package/dist/repertoire/travel-api-client.js +360 -0
  353. package/dist/repertoire/user-profile.js +131 -0
  354. package/dist/repertoire/vault-setup.js +246 -0
  355. package/dist/repertoire/vault-unlock.js +594 -0
  356. package/dist/rsvp/aisleplanner-client.js +354 -0
  357. package/dist/rsvp/cli.js +758 -0
  358. package/dist/rsvp/config.js +327 -0
  359. package/dist/rsvp/cutover.js +433 -0
  360. package/dist/rsvp/diagnostics.js +222 -0
  361. package/dist/rsvp/diff-renderer.js +161 -0
  362. package/dist/rsvp/habit-policy.js +85 -0
  363. package/dist/rsvp/habit-stage.js +98 -0
  364. package/dist/rsvp/incident-bundle.js +97 -0
  365. package/dist/rsvp/migration.js +204 -0
  366. package/dist/rsvp/native-habit-runner.js +321 -0
  367. package/dist/rsvp/outbound-state.js +268 -0
  368. package/dist/rsvp/query.js +118 -0
  369. package/dist/rsvp/replay.js +233 -0
  370. package/dist/rsvp/snapshot.js +232 -0
  371. package/dist/rsvp/spend-ledger.js +175 -0
  372. package/dist/scripts/claude-code-hook.js +41 -0
  373. package/dist/scripts/claude-code-stop-hook.js +47 -0
  374. package/dist/senses/a2a-entry.js +115 -0
  375. package/dist/senses/attention-queue.js +186 -0
  376. package/dist/senses/await-turn-message.js +58 -0
  377. package/dist/senses/bluebubbles/active-turns.js +216 -0
  378. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  379. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  380. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +226 -19
  381. package/dist/senses/bluebubbles/context-packet.js +101 -0
  382. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  383. package/dist/senses/bluebubbles/entry.js +77 -0
  384. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  385. package/dist/senses/bluebubbles/index.js +2881 -0
  386. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  387. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  388. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  389. package/dist/senses/bluebubbles/outbound-state.js +304 -0
  390. package/dist/senses/bluebubbles/processed-log.js +133 -0
  391. package/dist/senses/bluebubbles/replay.js +284 -0
  392. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  393. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  394. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  395. package/dist/senses/cli/bracketed-paste.js +82 -0
  396. package/dist/senses/cli/image-paste.js +287 -0
  397. package/dist/senses/cli/image-ref-navigation.js +75 -0
  398. package/dist/senses/cli/ink-app.js +156 -0
  399. package/dist/senses/cli/inline-diff.js +64 -0
  400. package/dist/senses/cli/input-keys.js +174 -0
  401. package/dist/senses/cli/kill-ring.js +86 -0
  402. package/dist/senses/cli/message-list.js +51 -0
  403. package/dist/senses/cli/ouro-tui.js +607 -0
  404. package/dist/senses/cli/spinner-imperative.js +135 -0
  405. package/dist/senses/cli/spinner.js +101 -0
  406. package/dist/senses/cli/status-line.js +60 -0
  407. package/dist/senses/cli/streaming-markdown.js +526 -0
  408. package/dist/senses/cli/tool-display.js +85 -0
  409. package/dist/senses/cli/tool-render.js +85 -0
  410. package/dist/senses/cli/tui-store.js +240 -0
  411. package/dist/senses/cli/virtual-list.js +35 -0
  412. package/dist/senses/cli-entry.js +60 -8
  413. package/dist/senses/cli-layout.js +100 -0
  414. package/dist/senses/cli.js +521 -214
  415. package/dist/senses/commands.js +66 -3
  416. package/dist/senses/context-packet-ledger.js +245 -0
  417. package/dist/senses/context-packets.js +154 -0
  418. package/dist/senses/habit-turn-message.js +160 -0
  419. package/dist/senses/mail-entry.js +66 -0
  420. package/dist/senses/mail.js +395 -0
  421. package/dist/senses/pipeline.js +952 -178
  422. package/dist/senses/private-runtime-worker.js +739 -0
  423. package/dist/senses/private-runtime.js +1157 -0
  424. package/dist/senses/proactive-content-guard.js +51 -0
  425. package/dist/senses/shared-turn.js +416 -0
  426. package/dist/senses/surface-tool.js +109 -0
  427. package/dist/senses/teams-entry.js +60 -8
  428. package/dist/senses/teams.js +397 -112
  429. package/dist/senses/trust-gate.js +104 -9
  430. package/dist/senses/voice/audio-playback.js +237 -0
  431. package/dist/senses/voice/audio-routing.js +119 -0
  432. package/dist/senses/voice/elevenlabs.js +202 -0
  433. package/dist/senses/voice/floor-control.js +431 -0
  434. package/dist/senses/voice/floor-controller.js +115 -0
  435. package/dist/senses/voice/golden-path.js +116 -0
  436. package/dist/senses/voice/index.js +29 -0
  437. package/dist/senses/voice/meeting.js +113 -0
  438. package/dist/senses/voice/outbound.js +190 -0
  439. package/dist/senses/voice/phone.js +33 -0
  440. package/dist/senses/voice/playback.js +139 -0
  441. package/dist/senses/voice/realtime-eval.js +496 -0
  442. package/dist/senses/voice/realtime-trace.js +531 -0
  443. package/dist/senses/voice/transcript.js +70 -0
  444. package/dist/senses/voice/turn.js +191 -0
  445. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  446. package/dist/senses/voice/twilio-phone.js +5081 -0
  447. package/dist/senses/voice/types.js +2 -0
  448. package/dist/senses/voice/whisper.js +161 -0
  449. package/dist/senses/voice-entry.js +81 -0
  450. package/dist/senses/voice-realtime-eval-command.js +99 -0
  451. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  452. package/dist/senses/voice-twilio-entry.js +87 -0
  453. package/dist/trips/core.js +138 -0
  454. package/dist/trips/store.js +265 -0
  455. package/dist/util/frontmatter.js +69 -0
  456. package/package.json +57 -12
  457. package/skills/agent-commerce.md +113 -0
  458. package/skills/browser-navigation.md +117 -0
  459. package/skills/commerce-setup-guide.md +116 -0
  460. package/skills/commerce-setup.md +84 -0
  461. package/skills/configure-dev-tools.md +99 -0
  462. package/skills/travel-planning.md +138 -0
  463. package/dist/heart/daemon/auth-flow.js +0 -409
  464. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  465. package/dist/heart/daemon/update-hooks.js +0 -138
  466. package/dist/heart/safe-workspace.js +0 -228
  467. package/dist/heart/session-recall.js +0 -116
  468. package/dist/mind/friends/channel.js +0 -84
  469. package/dist/mind/friends/group-context.js +0 -144
  470. package/dist/mind/friends/resolver.js +0 -84
  471. package/dist/mind/friends/store-file.js +0 -190
  472. package/dist/mind/friends/store.js +0 -4
  473. package/dist/mind/friends/tokens.js +0 -26
  474. package/dist/mind/friends/trust-explanation.js +0 -74
  475. package/dist/mind/friends/types.js +0 -29
  476. package/dist/repertoire/tasks/board.js +0 -134
  477. package/dist/repertoire/tasks/index.js +0 -224
  478. package/dist/repertoire/tasks/lifecycle.js +0 -80
  479. package/dist/repertoire/tasks/middleware.js +0 -65
  480. package/dist/repertoire/tasks/parser.js +0 -173
  481. package/dist/repertoire/tasks/scanner.js +0 -132
  482. package/dist/repertoire/tasks/transitions.js +0 -144
  483. package/dist/senses/bluebubbles-entry.js +0 -13
  484. package/dist/senses/bluebubbles.js +0 -1180
  485. package/dist/senses/debug-activity.js +0 -148
  486. package/dist/senses/inner-dialog-worker.js +0 -90
  487. package/dist/senses/inner-dialog.js +0 -480
  488. package/subagents/README.md +0 -7
  489. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  490. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  491. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  492. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  493. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  494. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  495. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  496. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  497. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  498. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  499. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  500. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  501. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  502. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  503. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  504. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  505. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,331 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CONFIG_REGISTRY = void 0;
4
+ exports.getRegistryEntries = getRegistryEntries;
5
+ exports.getRegistryEntriesByTier = getRegistryEntriesByTier;
6
+ exports.getRegistryEntriesByTopic = getRegistryEntriesByTopic;
7
+ exports.getRegistryEntry = getRegistryEntry;
8
+ const runtime_1 = require("../nerves/runtime");
9
+ // --- Validation helpers ---
10
+ const KNOWN_PROVIDERS = ["anthropic", "azure", "minimax", "openai-codex", "github-copilot"];
11
+ function validateNumber(value) {
12
+ if (typeof value !== "number")
13
+ return `expected number, got ${typeof value}`;
14
+ return undefined;
15
+ }
16
+ function validateBoolean(value) {
17
+ if (typeof value !== "boolean")
18
+ return `expected boolean, got ${typeof value}`;
19
+ return undefined;
20
+ }
21
+ function validateString(value) {
22
+ if (typeof value !== "string")
23
+ return `expected string, got ${typeof value}`;
24
+ return undefined;
25
+ }
26
+ function validateStringEnum(allowed) {
27
+ return (value) => {
28
+ if (typeof value !== "string")
29
+ return `expected string, got ${typeof value}`;
30
+ if (!allowed.includes(value))
31
+ return `expected one of [${allowed.join(", ")}], got "${value}"`;
32
+ return undefined;
33
+ };
34
+ }
35
+ function validateInteger(min, max) {
36
+ return (value) => {
37
+ if (typeof value !== "number")
38
+ return `expected number, got ${typeof value}`;
39
+ if (!Number.isInteger(value))
40
+ return `expected integer, got ${value}`;
41
+ if (value < min || value > max)
42
+ return `expected integer between ${min} and ${max}, got ${value}`;
43
+ return undefined;
44
+ };
45
+ }
46
+ function validateStringArray(value) {
47
+ if (!Array.isArray(value))
48
+ return `expected array, got ${typeof value}`;
49
+ for (let i = 0; i < value.length; i++) {
50
+ if (typeof value[i] !== "string")
51
+ return `expected string at index ${i}, got ${typeof value[i]}`;
52
+ }
53
+ return undefined;
54
+ }
55
+ function validateStringEnumArray(allowed) {
56
+ return (value) => {
57
+ if (!Array.isArray(value))
58
+ return `expected array, got ${typeof value}`;
59
+ for (let i = 0; i < value.length; i++) {
60
+ if (typeof value[i] !== "string")
61
+ return `expected string at index ${i}, got ${typeof value[i]}`;
62
+ if (!allowed.includes(value[i]))
63
+ return `expected one of [${allowed.join(", ")}] at index ${i}, got "${value[i]}"`;
64
+ }
65
+ return undefined;
66
+ };
67
+ }
68
+ function validateObject(requiredFields) {
69
+ return (value) => {
70
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
71
+ return `expected object, got ${Array.isArray(value) ? "array" : typeof value}`;
72
+ }
73
+ const obj = value;
74
+ for (const [field, validator] of Object.entries(requiredFields)) {
75
+ if (!(field in obj))
76
+ return `missing required field "${field}"`;
77
+ const err = validator(obj[field]);
78
+ if (err)
79
+ return `field "${field}": ${err}`;
80
+ }
81
+ return undefined;
82
+ };
83
+ }
84
+ const registryData = [
85
+ // --- Managed: harness-only ---
86
+ {
87
+ path: "version",
88
+ tier: "managed",
89
+ description: "Agent config schema version. Managed by the harness. Must be an integer >= 1.",
90
+ default: 2,
91
+ effects: "Controls which config migrations apply on load. Changing incorrectly can corrupt config.",
92
+ topics: ["schema", "migration"],
93
+ validate: validateNumber,
94
+ },
95
+ {
96
+ path: "enabled",
97
+ tier: "managed",
98
+ description: "Whether the agent is enabled. Managed by the harness. When false, the agent refuses to start.",
99
+ default: true,
100
+ effects: "Disables all agent functionality when set to false.",
101
+ topics: ["lifecycle", "activation"],
102
+ validate: validateBoolean,
103
+ },
104
+ // --- Self: agent-configurable ---
105
+ {
106
+ path: "mcpServers",
107
+ tier: "self",
108
+ description: "MCP server configurations. Maps server name to command, args, and env. The agent can add or remove MCP servers.",
109
+ default: undefined,
110
+ effects: "Adds or removes MCP tool servers.",
111
+ topics: ["tools", "mcp", "servers", "extensions"],
112
+ },
113
+ {
114
+ path: "humanFacing.provider",
115
+ tier: "self",
116
+ description: "Provider for human-facing interactions (CLI, Teams, BlueBubbles).",
117
+ default: "anthropic",
118
+ effects: "Changes the LLM provider used for all human-facing conversations. Affects quality, latency, and cost.",
119
+ topics: ["model", "provider", "llm", "human"],
120
+ validate: validateStringEnum(KNOWN_PROVIDERS),
121
+ },
122
+ {
123
+ path: "humanFacing.model",
124
+ tier: "self",
125
+ description: "Model name for human-facing interactions.",
126
+ default: "claude-opus-4-6",
127
+ effects: "Changes the specific model used for human-facing conversations.",
128
+ topics: ["model", "provider", "llm", "human"],
129
+ validate: validateString,
130
+ },
131
+ {
132
+ path: "agentFacing.provider",
133
+ tier: "self",
134
+ description: "Provider for agent-facing interactions (inner lane, delegation).",
135
+ default: "anthropic",
136
+ effects: "Changes the LLM provider used for private agent-facing turns and agent-to-agent communication.",
137
+ topics: ["model", "provider", "llm", "agent", "inner-lane"],
138
+ validate: validateStringEnum(KNOWN_PROVIDERS),
139
+ },
140
+ {
141
+ path: "agentFacing.model",
142
+ tier: "self",
143
+ description: "Model name for agent-facing interactions.",
144
+ default: "claude-opus-4-6",
145
+ effects: "Changes the specific model used for private agent-facing turns and agent-to-agent communication.",
146
+ topics: ["model", "provider", "llm", "agent", "inner-lane"],
147
+ validate: validateString,
148
+ },
149
+ {
150
+ path: "context.maxTokens",
151
+ tier: "self",
152
+ description: "Maximum context window size in tokens.",
153
+ default: 80000,
154
+ effects: "Larger values allow more context but increase cost and latency. Must match model capability.",
155
+ topics: ["context", "tokens", "notes", "performance"],
156
+ validate: validateInteger(1000, 1000000),
157
+ },
158
+ {
159
+ path: "senses.cli",
160
+ tier: "self",
161
+ description: "CLI sense configuration. Controls whether the CLI interface is enabled.",
162
+ default: { enabled: true },
163
+ effects: "Enables or disables the CLI (terminal) interaction channel.",
164
+ topics: ["senses", "cli", "channels", "interface"],
165
+ validate: validateObject({ enabled: validateBoolean }),
166
+ },
167
+ {
168
+ path: "senses.teams",
169
+ tier: "self",
170
+ description: "Teams sense configuration. Controls whether the Teams interface is enabled.",
171
+ default: { enabled: false },
172
+ effects: "Enables or disables the Microsoft Teams interaction channel.",
173
+ topics: ["senses", "teams", "channels", "interface"],
174
+ validate: validateObject({ enabled: validateBoolean }),
175
+ },
176
+ {
177
+ path: "senses.bluebubbles",
178
+ tier: "self",
179
+ description: "BlueBubbles sense configuration. Controls whether the iMessage interface is enabled.",
180
+ default: { enabled: false },
181
+ effects: "Enables or disables the BlueBubbles (iMessage) interaction channel.",
182
+ topics: ["senses", "bluebubbles", "imessage", "channels", "interface"],
183
+ validate: validateObject({ enabled: validateBoolean }),
184
+ },
185
+ {
186
+ path: "senses.mail",
187
+ tier: "self",
188
+ description: "Mail sense configuration. Controls whether the agent-owned Mailroom mailbox is enabled.",
189
+ default: { enabled: false },
190
+ effects: "Enables or disables the agent mail sense. Runtime credentials still live in the agent vault.",
191
+ topics: ["senses", "mail", "mailroom", "channels", "interface"],
192
+ validate: validateObject({ enabled: validateBoolean }),
193
+ },
194
+ {
195
+ path: "senses.voice",
196
+ tier: "self",
197
+ description: "Voice sense configuration. Controls whether conversational audio sessions are enabled.",
198
+ default: { enabled: false },
199
+ effects: "Enables or disables voice sessions. STT/TTS credentials and local audio attachments are configured separately.",
200
+ topics: ["senses", "voice", "audio", "speech", "channels", "interface"],
201
+ validate: validateObject({ enabled: validateBoolean }),
202
+ },
203
+ {
204
+ path: "senses.workbench",
205
+ tier: "self",
206
+ description: "Legacy Workbench sense marker. Runtime-injected Workbench tools do not require this bundle entry.",
207
+ default: { enabled: false },
208
+ effects: "Kept only for old bundles; modern Workbench launches the boss with --workbench-mcp and injects tools per turn.",
209
+ topics: ["senses", "workbench", "mcp", "terminal", "channels", "interface"],
210
+ validate: validateObject({ enabled: validateBoolean }),
211
+ },
212
+ {
213
+ path: "sync.enabled",
214
+ tier: "self",
215
+ description: "Whether git-based bundle sync is enabled.",
216
+ default: false,
217
+ effects: "Enables automatic synchronization of agent state via git. Requires sync.remote to be configured.",
218
+ topics: ["sync", "git", "state", "backup"],
219
+ validate: validateBoolean,
220
+ },
221
+ {
222
+ path: "sync.remote",
223
+ tier: "self",
224
+ description: "Git remote name used for bundle sync.",
225
+ default: "origin",
226
+ effects: "Controls which git remote is used when sync is enabled.",
227
+ topics: ["sync", "git", "remote"],
228
+ validate: validateString,
229
+ },
230
+ {
231
+ path: "context.contextMargin",
232
+ tier: "self",
233
+ description: "Percentage of context window reserved as margin before compaction triggers.",
234
+ default: 20,
235
+ effects: "Higher values trigger compaction earlier, preserving more headroom. Lower values use more context.",
236
+ topics: ["context", "compaction", "notes", "performance"],
237
+ validate: validateInteger(0, 100),
238
+ },
239
+ {
240
+ path: "phrases.thinking",
241
+ tier: "self",
242
+ description: "Array of phrases displayed while the agent is thinking.",
243
+ default: ["working"],
244
+ effects: "Changes the thinking indicator text shown to users. Purely cosmetic.",
245
+ topics: ["phrases", "ux", "display", "personality"],
246
+ validate: validateStringArray,
247
+ },
248
+ {
249
+ path: "phrases.tool",
250
+ tier: "self",
251
+ description: "Array of phrases displayed while the agent is running a tool.",
252
+ default: ["running tool"],
253
+ effects: "Changes the tool-use indicator text shown to users. Purely cosmetic.",
254
+ topics: ["phrases", "ux", "display", "personality"],
255
+ validate: validateStringArray,
256
+ },
257
+ {
258
+ path: "phrases.followup",
259
+ tier: "self",
260
+ description: "Array of phrases displayed during follow-up processing.",
261
+ default: ["processing"],
262
+ effects: "Changes the follow-up indicator text shown to users. Purely cosmetic.",
263
+ topics: ["phrases", "ux", "display", "personality"],
264
+ validate: validateStringArray,
265
+ },
266
+ {
267
+ path: "shell.defaultTimeout",
268
+ tier: "self",
269
+ description: "Default timeout in milliseconds for shell command execution.",
270
+ default: undefined,
271
+ effects: "Controls how long shell commands run before timing out. Undefined uses system default.",
272
+ topics: ["shell", "timeout", "execution", "tools"],
273
+ validate: validateInteger(1000, 600000),
274
+ },
275
+ {
276
+ path: "logging.level",
277
+ tier: "self",
278
+ description: "Minimum log level: debug, info, warn, or error.",
279
+ default: undefined,
280
+ effects: "Controls verbosity of runtime logging. Lower levels produce more output.",
281
+ topics: ["logging", "debug", "diagnostics"],
282
+ validate: validateStringEnum(["debug", "info", "warn", "error"]),
283
+ },
284
+ {
285
+ path: "logging.sinks",
286
+ tier: "self",
287
+ description: "Array of log sink types: 'terminal' and/or 'ndjson'.",
288
+ default: undefined,
289
+ effects: "Controls where log output is directed. Terminal shows in console, ndjson writes structured logs.",
290
+ topics: ["logging", "output", "diagnostics"],
291
+ validate: validateStringEnumArray(["terminal", "ndjson"]),
292
+ },
293
+ ];
294
+ exports.CONFIG_REGISTRY = new Map(registryData.map((entry) => [entry.path, entry]));
295
+ function getRegistryEntries() {
296
+ (0, runtime_1.emitNervesEvent)({
297
+ component: "heart",
298
+ event: "config_registry.access",
299
+ message: "listing all registry entries",
300
+ meta: { count: exports.CONFIG_REGISTRY.size },
301
+ });
302
+ return [...exports.CONFIG_REGISTRY.values()];
303
+ }
304
+ function getRegistryEntriesByTier(tier) {
305
+ (0, runtime_1.emitNervesEvent)({
306
+ component: "heart",
307
+ event: "config_registry.access",
308
+ message: `filtering registry entries by tier ${tier}`,
309
+ meta: { tier },
310
+ });
311
+ return [...exports.CONFIG_REGISTRY.values()].filter((entry) => entry.tier === tier);
312
+ }
313
+ function getRegistryEntriesByTopic(topic) {
314
+ const needle = topic.toLowerCase();
315
+ (0, runtime_1.emitNervesEvent)({
316
+ component: "heart",
317
+ event: "config_registry.access",
318
+ message: `filtering registry entries by topic "${topic}"`,
319
+ meta: { topic },
320
+ });
321
+ return [...exports.CONFIG_REGISTRY.values()].filter((entry) => entry.topics.some((t) => t.toLowerCase().includes(needle)));
322
+ }
323
+ function getRegistryEntry(path) {
324
+ (0, runtime_1.emitNervesEvent)({
325
+ component: "heart",
326
+ event: "config_registry.access",
327
+ message: `looking up registry entry for "${path}"`,
328
+ meta: { path },
329
+ });
330
+ return exports.CONFIG_REGISTRY.get(path);
331
+ }
@@ -35,6 +35,8 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.loadConfig = loadConfig;
37
37
  exports.resetConfigCache = resetConfigCache;
38
+ exports.cacheRuntimeConfigForTests = cacheRuntimeConfigForTests;
39
+ exports.cacheMachineRuntimeConfigForTests = cacheMachineRuntimeConfigForTests;
38
40
  exports.patchRuntimeConfig = patchRuntimeConfig;
39
41
  exports.getAzureConfig = getAzureConfig;
40
42
  exports.getMinimaxConfig = getMinimaxConfig;
@@ -50,6 +52,7 @@ exports.getTeamsChannelConfig = getTeamsChannelConfig;
50
52
  exports.getBlueBubblesConfig = getBlueBubblesConfig;
51
53
  exports.getBlueBubblesChannelConfig = getBlueBubblesChannelConfig;
52
54
  exports.getIntegrationsConfig = getIntegrationsConfig;
55
+ exports.getSyncConfig = getSyncConfig;
53
56
  exports.getOpenAIEmbeddingsApiKey = getOpenAIEmbeddingsApiKey;
54
57
  exports.getLogsDir = getLogsDir;
55
58
  exports.sanitizeKey = sanitizeKey;
@@ -60,37 +63,10 @@ exports.logPath = logPath;
60
63
  const fs = __importStar(require("fs"));
61
64
  const path = __importStar(require("path"));
62
65
  const identity_1 = require("./identity");
66
+ const provider_credentials_1 = require("./provider-credentials");
67
+ const runtime_credentials_1 = require("./runtime-credentials");
63
68
  const runtime_1 = require("../nerves/runtime");
64
- const DEFAULT_SECRETS_TEMPLATE = {
65
- providers: {
66
- // Keep provider field ordering consistent: model first, then auth credentials,
67
- // then provider-specific transport fields.
68
- azure: {
69
- modelName: "",
70
- apiKey: "",
71
- endpoint: "",
72
- deployment: "",
73
- apiVersion: "2025-04-01-preview",
74
- managedIdentityClientId: "",
75
- },
76
- minimax: {
77
- model: "",
78
- apiKey: "",
79
- },
80
- anthropic: {
81
- model: "claude-opus-4-6",
82
- setupToken: "",
83
- },
84
- "openai-codex": {
85
- model: "gpt-5.4",
86
- oauthAccessToken: "",
87
- },
88
- "github-copilot": {
89
- model: "claude-sonnet-4.6",
90
- githubToken: "",
91
- baseUrl: "",
92
- },
93
- },
69
+ const DEFAULT_LOCAL_RUNTIME_CONFIG = {
94
70
  teams: {
95
71
  clientId: "",
96
72
  clientSecret: "",
@@ -116,41 +92,41 @@ const DEFAULT_SECRETS_TEMPLATE = {
116
92
  serverUrl: "",
117
93
  password: "",
118
94
  accountId: "default",
95
+ ownHandles: [],
119
96
  },
120
97
  bluebubblesChannel: {
121
98
  port: 18790,
122
99
  webhookPath: "/bluebubbles-webhook",
123
100
  requestTimeoutMs: 30000,
124
101
  },
102
+ vault: {
103
+ masterPassword: "",
104
+ },
125
105
  integrations: {
126
106
  perplexityApiKey: "",
127
107
  openaiEmbeddingsApiKey: "",
128
108
  },
109
+ features: {
110
+ workbenchCoding: false,
111
+ },
129
112
  };
130
113
  function defaultRuntimeConfig() {
131
114
  return {
132
- providers: {
133
- azure: { ...DEFAULT_SECRETS_TEMPLATE.providers.azure },
134
- minimax: { ...DEFAULT_SECRETS_TEMPLATE.providers.minimax },
135
- anthropic: { ...DEFAULT_SECRETS_TEMPLATE.providers.anthropic },
136
- "openai-codex": { ...DEFAULT_SECRETS_TEMPLATE.providers["openai-codex"] },
137
- "github-copilot": { ...DEFAULT_SECRETS_TEMPLATE.providers["github-copilot"] },
138
- },
139
- teams: { ...DEFAULT_SECRETS_TEMPLATE.teams },
140
- teamsSecondary: { ...DEFAULT_SECRETS_TEMPLATE.teamsSecondary },
141
- oauth: { ...DEFAULT_SECRETS_TEMPLATE.oauth },
115
+ teams: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.teams },
116
+ teamsSecondary: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.teamsSecondary },
117
+ oauth: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.oauth },
142
118
  context: { ...identity_1.DEFAULT_AGENT_CONTEXT },
143
- teamsChannel: { ...DEFAULT_SECRETS_TEMPLATE.teamsChannel },
144
- bluebubbles: { ...DEFAULT_SECRETS_TEMPLATE.bluebubbles },
145
- bluebubblesChannel: { ...DEFAULT_SECRETS_TEMPLATE.bluebubblesChannel },
146
- integrations: { ...DEFAULT_SECRETS_TEMPLATE.integrations },
119
+ teamsChannel: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.teamsChannel },
120
+ bluebubbles: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.bluebubbles },
121
+ bluebubblesChannel: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.bluebubblesChannel },
122
+ vault: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.vault },
123
+ integrations: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.integrations },
124
+ features: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.features },
147
125
  };
148
126
  }
149
127
  let _runtimeConfigOverride = null;
150
128
  let _testContextOverride = null;
151
- function resolveConfigPath() {
152
- return (0, identity_1.getAgentSecretsPath)();
153
- }
129
+ let _providerConfigOverride = null;
154
130
  function deepMerge(defaults, partial) {
155
131
  const result = { ...defaults };
156
132
  for (const key of Object.keys(partial)) {
@@ -167,79 +143,31 @@ function deepMerge(defaults, partial) {
167
143
  }
168
144
  return result;
169
145
  }
146
+ function localRuntimeFields(config) {
147
+ const { providers: _providers, context: _context, ...localFields } = config;
148
+ return localFields;
149
+ }
170
150
  function loadConfig() {
171
- const configPath = resolveConfigPath();
172
- // Auto-create config directory if it doesn't exist
173
- const configDir = path.dirname(configPath);
174
- fs.mkdirSync(configDir, { recursive: true });
175
- let fileData = {};
176
- try {
177
- const raw = fs.readFileSync(configPath, "utf-8");
178
- fileData = JSON.parse(raw);
179
- }
180
- catch (error) {
181
- const errorCode = error &&
182
- typeof error === "object" &&
183
- "code" in error &&
184
- typeof error.code === "string"
185
- ? error.code
186
- : undefined;
187
- if (errorCode === "ENOENT") {
188
- try {
189
- fs.writeFileSync(configPath, JSON.stringify(DEFAULT_SECRETS_TEMPLATE, null, 2) + "\n", "utf-8");
190
- }
191
- catch (writeError) {
192
- (0, runtime_1.emitNervesEvent)({
193
- level: "warn",
194
- event: "config_identity.error",
195
- component: "config/identity",
196
- message: "failed writing default secrets config",
197
- meta: {
198
- phase: "loadConfig",
199
- path: configPath,
200
- reason: writeError instanceof Error ? writeError.message : String(writeError),
201
- },
202
- });
203
- }
204
- }
205
- (0, runtime_1.emitNervesEvent)({
206
- level: "warn",
207
- event: "config_identity.error",
208
- component: "config/identity",
209
- message: "config read failed; defaults applied",
210
- meta: {
211
- phase: "loadConfig",
212
- reason: error instanceof Error ? error.message : String(error),
213
- },
214
- });
215
- // ENOENT or parse error -- use defaults
216
- }
217
- const sanitizedFileData = { ...fileData };
218
- if ("context" in sanitizedFileData) {
219
- delete sanitizedFileData.context;
220
- (0, runtime_1.emitNervesEvent)({
221
- level: "warn",
222
- event: "config_identity.error",
223
- component: "config/identity",
224
- message: "ignored legacy context block in secrets config",
225
- meta: {
226
- phase: "loadConfig",
227
- path: configPath,
228
- },
229
- });
230
- }
231
- const mergedConfig = deepMerge(defaultRuntimeConfig(), sanitizedFileData);
151
+ const agentName = (0, identity_1.getAgentName)();
152
+ const runtimeResult = (0, runtime_credentials_1.readRuntimeCredentialConfig)(agentName);
153
+ const machineRuntimeResult = (0, runtime_credentials_1.readMachineRuntimeCredentialConfig)(agentName);
154
+ const vaultData = runtimeResult.ok ? localRuntimeFields(runtimeResult.config) : {};
155
+ const machineVaultData = machineRuntimeResult.ok ? localRuntimeFields(machineRuntimeResult.config) : {};
156
+ const mergedConfig = deepMerge(defaultRuntimeConfig(), vaultData);
157
+ const mergedWithMachineConfig = deepMerge(mergedConfig, machineVaultData);
232
158
  const config = _runtimeConfigOverride
233
- ? deepMerge(mergedConfig, _runtimeConfigOverride)
234
- : mergedConfig;
159
+ ? deepMerge(mergedWithMachineConfig, _runtimeConfigOverride)
160
+ : mergedWithMachineConfig;
235
161
  (0, runtime_1.emitNervesEvent)({
236
162
  event: "config.load",
237
163
  component: "config/identity",
238
- message: "config loaded from disk",
164
+ message: "config loaded from runtime credential cache",
239
165
  meta: {
240
- source: "disk",
241
- used_defaults_only: Object.keys(fileData).length === 0,
166
+ source: runtimeResult.ok ? "vault-cache" : "defaults",
167
+ used_defaults_only: !runtimeResult.ok,
168
+ machine_runtime_credentials: machineRuntimeResult.ok ? "available" : machineRuntimeResult.reason,
242
169
  override_applied: _runtimeConfigOverride !== null,
170
+ runtime_credentials: runtimeResult.ok ? "available" : runtimeResult.reason,
243
171
  },
244
172
  });
245
173
  return config;
@@ -247,34 +175,78 @@ function loadConfig() {
247
175
  function resetConfigCache() {
248
176
  _runtimeConfigOverride = null;
249
177
  _testContextOverride = null;
178
+ _providerConfigOverride = null;
179
+ (0, provider_credentials_1.resetProviderCredentialCache)();
180
+ (0, runtime_credentials_1.resetRuntimeCredentialConfigCache)();
181
+ }
182
+ function cacheRuntimeConfigForTests(agentName, config) {
183
+ (0, runtime_credentials_1.cacheRuntimeCredentialConfig)(agentName, config, new Date(0));
184
+ }
185
+ function cacheMachineRuntimeConfigForTests(agentName, config) {
186
+ (0, runtime_credentials_1.cacheMachineRuntimeCredentialConfig)(agentName, config, new Date(0), "machine_test");
187
+ }
188
+ function seedProviderCredentialCache(providers) {
189
+ if (!providers)
190
+ return;
191
+ _providerConfigOverride = deepMerge((_providerConfigOverride ?? {}), providers);
192
+ const records = Object.entries(_providerConfigOverride).map(([provider, rawConfig]) => {
193
+ const split = (0, provider_credentials_1.splitProviderCredentialFields)(provider, rawConfig);
194
+ return (0, provider_credentials_1.createProviderCredentialRecord)({
195
+ provider: provider,
196
+ credentials: split.credentials,
197
+ config: split.config,
198
+ provenance: { source: "manual" },
199
+ now: new Date(0),
200
+ });
201
+ });
202
+ (0, provider_credentials_1.cacheProviderCredentialRecords)((0, identity_1.getAgentName)(), records, new Date(0));
250
203
  }
251
204
  function patchRuntimeConfig(partial) {
205
+ const { providers, ...runtimePartial } = partial;
206
+ seedProviderCredentialCache(providers);
252
207
  const contextPatch = partial.context;
253
208
  if (contextPatch) {
254
209
  const base = _testContextOverride ?? identity_1.DEFAULT_AGENT_CONTEXT;
255
210
  _testContextOverride = deepMerge(base, contextPatch);
256
211
  }
257
- _runtimeConfigOverride = deepMerge((_runtimeConfigOverride ?? {}), partial);
212
+ _runtimeConfigOverride = deepMerge((_runtimeConfigOverride ?? {}), runtimePartial);
213
+ }
214
+ function readProviderConfig(provider) {
215
+ const cached = (0, provider_credentials_1.readCachedProviderCredentialRecord)((0, identity_1.getAgentName)(), provider);
216
+ return cached.ok ? { ...cached.record.config, ...cached.record.credentials } : {};
258
217
  }
259
218
  function getAzureConfig() {
260
- const config = loadConfig();
261
- return { ...config.providers.azure };
219
+ const raw = readProviderConfig("azure");
220
+ return {
221
+ apiKey: typeof raw.apiKey === "string" ? raw.apiKey : "",
222
+ endpoint: typeof raw.endpoint === "string" ? raw.endpoint : "",
223
+ deployment: typeof raw.deployment === "string" ? raw.deployment : "",
224
+ apiVersion: typeof raw.apiVersion === "string" ? raw.apiVersion : "2025-04-01-preview",
225
+ managedIdentityClientId: typeof raw.managedIdentityClientId === "string" ? raw.managedIdentityClientId : "",
226
+ };
262
227
  }
263
228
  function getMinimaxConfig() {
264
- const config = loadConfig();
265
- return { ...config.providers.minimax };
229
+ const raw = readProviderConfig("minimax");
230
+ return { apiKey: typeof raw.apiKey === "string" ? raw.apiKey : "" };
266
231
  }
267
232
  function getAnthropicConfig() {
268
- const config = loadConfig();
269
- return { ...config.providers.anthropic };
233
+ const raw = readProviderConfig("anthropic");
234
+ return { setupToken: typeof raw.setupToken === "string" ? raw.setupToken : "" };
270
235
  }
271
236
  function getOpenAICodexConfig() {
272
- const config = loadConfig();
273
- return { ...config.providers["openai-codex"] };
237
+ const raw = readProviderConfig("openai-codex");
238
+ return {
239
+ oauthAccessToken: typeof raw.oauthAccessToken === "string" ? raw.oauthAccessToken : "",
240
+ ...(typeof raw.refreshToken === "string" ? { refreshToken: raw.refreshToken } : {}),
241
+ ...(typeof raw.expiresAt === "number" ? { expiresAt: raw.expiresAt } : {}),
242
+ };
274
243
  }
275
244
  function getGithubCopilotConfig() {
276
- const config = loadConfig();
277
- return { ...config.providers["github-copilot"] };
245
+ const raw = readProviderConfig("github-copilot");
246
+ return {
247
+ githubToken: typeof raw.githubToken === "string" ? raw.githubToken : "",
248
+ baseUrl: typeof raw.baseUrl === "string" ? raw.baseUrl : "",
249
+ };
278
250
  }
279
251
  function getTeamsConfig() {
280
252
  const config = loadConfig();
@@ -321,17 +293,24 @@ function getTeamsChannelConfig() {
321
293
  }
322
294
  function getBlueBubblesConfig() {
323
295
  const config = loadConfig();
324
- const { serverUrl, password, accountId } = config.bluebubbles;
296
+ const { serverUrl, password, accountId, ownHandles } = config.bluebubbles;
325
297
  if (!serverUrl.trim()) {
326
- throw new Error("bluebubbles.serverUrl is required in secrets.json to run the BlueBubbles sense.");
298
+ throw new Error("bluebubbles.serverUrl is required in this machine's agent-vault runtime config. Run `ouro connect bluebubbles --agent <agent>`.");
327
299
  }
328
300
  if (!password.trim()) {
329
- throw new Error("bluebubbles.password is required in secrets.json to run the BlueBubbles sense.");
301
+ throw new Error("bluebubbles.password is required in this machine's agent-vault runtime config. Run `ouro connect bluebubbles --agent <agent>`.");
302
+ }
303
+ const normalizedHandles = [];
304
+ for (const handle of ownHandles) {
305
+ const trimmed = handle.trim();
306
+ if (trimmed.length > 0)
307
+ normalizedHandles.push(trimmed);
330
308
  }
331
309
  return {
332
310
  serverUrl: serverUrl.trim(),
333
311
  password: password.trim(),
334
312
  accountId: accountId.trim() || "default",
313
+ ownHandles: normalizedHandles,
335
314
  };
336
315
  }
337
316
  function getBlueBubblesChannelConfig() {
@@ -343,6 +322,19 @@ function getIntegrationsConfig() {
343
322
  const config = loadConfig();
344
323
  return { ...config.integrations };
345
324
  }
325
+ function getSyncConfig() {
326
+ try {
327
+ const agentConfig = (0, identity_1.loadAgentConfig)();
328
+ return {
329
+ enabled: agentConfig.sync?.enabled ?? false,
330
+ remote: agentConfig.sync?.remote ?? "origin",
331
+ };
332
+ }
333
+ catch {
334
+ /* v8 ignore next -- defensive: loadAgentConfig failure in test/bootstrap @preserve */
335
+ return { enabled: false, remote: "origin" };
336
+ }
337
+ }
346
338
  function getOpenAIEmbeddingsApiKey() {
347
339
  return getIntegrationsConfig().openaiEmbeddingsApiKey;
348
340
  }