@ouro.bot/cli 0.1.0-alpha.6 → 0.1.0-alpha.600

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 (440) hide show
  1. package/README.md +229 -183
  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/SerpentGuide.ouro/agent.json +83 -0
  10. package/SerpentGuide.ouro/psyche/SOUL.md +25 -0
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +2 -2
  12. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  13. package/assets/ouroboros.png +0 -0
  14. package/changelog.json +4182 -0
  15. package/dist/arc/attention-types.js +8 -0
  16. package/dist/arc/cares.js +140 -0
  17. package/dist/arc/episodes.js +117 -0
  18. package/dist/arc/intentions.js +133 -0
  19. package/dist/arc/json-store.js +117 -0
  20. package/dist/arc/obligations.js +254 -0
  21. package/dist/arc/packets.js +193 -0
  22. package/dist/arc/presence.js +185 -0
  23. package/dist/arc/task-lifecycle.js +65 -0
  24. package/dist/heart/active-work.js +989 -0
  25. package/dist/heart/agent-entry.js +69 -3
  26. package/dist/heart/attachments/image-normalize.js +194 -0
  27. package/dist/heart/attachments/materialize.js +97 -0
  28. package/dist/heart/attachments/originals.js +88 -0
  29. package/dist/heart/attachments/render.js +29 -0
  30. package/dist/heart/attachments/sources/adapter.js +2 -0
  31. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  32. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  33. package/dist/heart/attachments/sources/index.js +16 -0
  34. package/dist/heart/attachments/store.js +103 -0
  35. package/dist/heart/attachments/types.js +93 -0
  36. package/dist/heart/auth/auth-flow.js +479 -0
  37. package/dist/heart/awaiting/await-alert.js +146 -0
  38. package/dist/heart/awaiting/await-expiry.js +108 -0
  39. package/dist/heart/awaiting/await-loader.js +91 -0
  40. package/dist/heart/awaiting/await-parser.js +141 -0
  41. package/dist/heart/awaiting/await-runtime-state.js +97 -0
  42. package/dist/heart/awaiting/await-scheduler.js +377 -0
  43. package/dist/heart/background-operations.js +281 -0
  44. package/dist/heart/bridges/manager.js +358 -0
  45. package/dist/heart/bridges/state-machine.js +135 -0
  46. package/dist/heart/bridges/store.js +123 -0
  47. package/dist/heart/bundle-state.js +168 -0
  48. package/dist/heart/commitments.js +142 -0
  49. package/dist/heart/config-registry.js +322 -0
  50. package/dist/heart/config.js +164 -135
  51. package/dist/heart/core.js +1069 -260
  52. package/dist/heart/cross-chat-delivery.js +131 -0
  53. package/dist/heart/daemon/agent-config-check.js +419 -0
  54. package/dist/heart/daemon/agent-discovery.js +180 -0
  55. package/dist/heart/daemon/agent-service.js +522 -0
  56. package/dist/heart/daemon/agentic-repair.js +547 -0
  57. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  58. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  59. package/dist/heart/daemon/cadence.js +70 -0
  60. package/dist/heart/daemon/cli-defaults.js +776 -0
  61. package/dist/heart/daemon/cli-exec.js +7571 -0
  62. package/dist/heart/daemon/cli-help.js +498 -0
  63. package/dist/heart/daemon/cli-parse.js +1599 -0
  64. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  65. package/dist/heart/daemon/cli-render.js +763 -0
  66. package/dist/heart/daemon/cli-types.js +8 -0
  67. package/dist/heart/daemon/connect-bay.js +323 -0
  68. package/dist/heart/daemon/daemon-cli.js +30 -758
  69. package/dist/heart/daemon/daemon-entry.js +540 -8
  70. package/dist/heart/daemon/daemon-health.js +176 -0
  71. package/dist/heart/daemon/daemon-rollup.js +57 -0
  72. package/dist/heart/daemon/daemon-runtime-sync.js +287 -0
  73. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  74. package/dist/heart/daemon/daemon.js +972 -20
  75. package/dist/heart/daemon/dns-workflow.js +394 -0
  76. package/dist/heart/daemon/doctor-types.js +8 -0
  77. package/dist/heart/daemon/doctor.js +873 -0
  78. package/dist/heart/daemon/health-monitor.js +122 -1
  79. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  80. package/dist/heart/daemon/hooks/bundle-meta.js +206 -0
  81. package/dist/heart/daemon/http-health-probe.js +80 -0
  82. package/dist/heart/daemon/human-command-screens.js +234 -0
  83. package/dist/heart/daemon/human-readiness.js +114 -0
  84. package/dist/heart/daemon/inner-status.js +89 -0
  85. package/dist/heart/daemon/interactive-repair.js +394 -0
  86. package/dist/heart/daemon/launchd.js +188 -0
  87. package/dist/heart/daemon/log-tailer.js +82 -12
  88. package/dist/heart/daemon/logs-prune.js +110 -0
  89. package/dist/heart/daemon/mcp-canary.js +297 -0
  90. package/dist/heart/daemon/message-router.js +17 -8
  91. package/dist/heart/daemon/os-cron-deps.js +135 -0
  92. package/dist/heart/daemon/os-cron.js +14 -12
  93. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  94. package/dist/heart/daemon/ouro-entry.js +3 -1
  95. package/dist/heart/daemon/process-manager.js +381 -26
  96. package/dist/heart/daemon/provider-discovery.js +137 -0
  97. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  98. package/dist/heart/daemon/pulse.js +475 -0
  99. package/dist/heart/daemon/readiness-repair.js +365 -0
  100. package/dist/heart/daemon/run-hooks.js +39 -0
  101. package/dist/heart/daemon/runtime-logging.js +67 -16
  102. package/dist/heart/daemon/runtime-metadata.js +191 -0
  103. package/dist/heart/daemon/runtime-mode.js +67 -0
  104. package/dist/heart/daemon/safe-mode.js +161 -0
  105. package/dist/heart/daemon/sense-manager.js +731 -0
  106. package/dist/heart/daemon/session-id-resolver.js +131 -0
  107. package/dist/heart/daemon/skill-management-installer.js +94 -0
  108. package/dist/heart/daemon/socket-client.js +349 -0
  109. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  110. package/dist/heart/daemon/startup-tui.js +330 -0
  111. package/dist/heart/daemon/task-scheduler.js +3 -25
  112. package/dist/heart/daemon/terminal-ui.js +499 -0
  113. package/dist/heart/daemon/thoughts.js +524 -0
  114. package/dist/heart/daemon/up-progress.js +366 -0
  115. package/dist/heart/daemon/vault-items.js +56 -0
  116. package/dist/heart/delegation.js +62 -0
  117. package/dist/heart/habits/habit-migration.js +189 -0
  118. package/dist/heart/habits/habit-parser.js +140 -0
  119. package/dist/heart/habits/habit-runtime-state.js +100 -0
  120. package/dist/heart/habits/habit-scheduler.js +372 -0
  121. package/dist/heart/{daemon → hatch}/hatch-animation.js +10 -3
  122. package/dist/heart/{daemon → hatch}/hatch-flow.js +34 -136
  123. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  124. package/dist/heart/hatch/specialist-orchestrator.js +129 -0
  125. package/dist/heart/hatch/specialist-prompt.js +102 -0
  126. package/dist/heart/hatch/specialist-tools.js +306 -0
  127. package/dist/heart/identity.js +281 -67
  128. package/dist/heart/kept-notes.js +357 -0
  129. package/dist/heart/kicks.js +2 -20
  130. package/dist/heart/machine-identity.js +161 -0
  131. package/dist/heart/mail-import-discovery.js +353 -0
  132. package/dist/heart/mailbox/mailbox-http-hooks.js +66 -0
  133. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  134. package/dist/heart/mailbox/mailbox-http-routes.js +246 -0
  135. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  136. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  137. package/dist/heart/mailbox/mailbox-http.js +99 -0
  138. package/dist/heart/mailbox/mailbox-read.js +31 -0
  139. package/dist/heart/mailbox/mailbox-types.js +27 -0
  140. package/dist/heart/mailbox/mailbox-view.js +195 -0
  141. package/dist/heart/mailbox/readers/agent-machine.js +382 -0
  142. package/dist/heart/mailbox/readers/continuity-readers.js +338 -0
  143. package/dist/heart/mailbox/readers/mail.js +367 -0
  144. package/dist/heart/mailbox/readers/runtime-readers.js +651 -0
  145. package/dist/heart/mailbox/readers/sessions.js +232 -0
  146. package/dist/heart/mailbox/readers/shared.js +111 -0
  147. package/dist/heart/mcp/mcp-server.js +656 -0
  148. package/dist/heart/migrate-config.js +100 -0
  149. package/dist/heart/model-capabilities.js +59 -0
  150. package/dist/heart/platform.js +81 -0
  151. package/dist/heart/progress-story.js +42 -0
  152. package/dist/heart/provider-attempt.js +134 -0
  153. package/dist/heart/provider-binding-resolver.js +267 -0
  154. package/dist/heart/provider-credentials.js +425 -0
  155. package/dist/heart/provider-failover.js +301 -0
  156. package/dist/heart/provider-models.js +81 -0
  157. package/dist/heart/provider-ping.js +262 -0
  158. package/dist/heart/provider-readiness-cache.js +40 -0
  159. package/dist/heart/provider-visibility.js +188 -0
  160. package/dist/heart/providers/anthropic-token.js +131 -0
  161. package/dist/heart/providers/anthropic.js +202 -50
  162. package/dist/heart/providers/azure.js +104 -13
  163. package/dist/heart/providers/error-classification.js +127 -0
  164. package/dist/heart/providers/github-copilot.js +145 -0
  165. package/dist/heart/providers/minimax-vlm.js +189 -0
  166. package/dist/heart/providers/minimax.js +29 -7
  167. package/dist/heart/providers/openai-codex.js +63 -39
  168. package/dist/heart/runtime-capability-check.js +170 -0
  169. package/dist/heart/runtime-credentials.js +367 -0
  170. package/dist/heart/runtime-cwd.js +87 -0
  171. package/dist/heart/sense-truth.js +70 -0
  172. package/dist/heart/session-activity.js +190 -0
  173. package/dist/heart/session-events.js +1149 -0
  174. package/dist/heart/session-playback-cli-main.js +5 -0
  175. package/dist/heart/session-playback-cli.js +36 -0
  176. package/dist/heart/session-playback.js +231 -0
  177. package/dist/heart/session-stats-cli-main.js +5 -0
  178. package/dist/heart/session-stats.js +182 -0
  179. package/dist/heart/session-transcript.js +243 -0
  180. package/dist/heart/start-of-turn-packet.js +345 -0
  181. package/dist/heart/streaming.js +129 -34
  182. package/dist/heart/sync-classification.js +176 -0
  183. package/dist/heart/sync.js +449 -0
  184. package/dist/heart/target-resolution.js +127 -0
  185. package/dist/heart/tempo.js +93 -0
  186. package/dist/heart/temporal-view.js +41 -0
  187. package/dist/heart/timeouts.js +101 -0
  188. package/dist/heart/tool-activity-callbacks.js +59 -0
  189. package/dist/heart/tool-description.js +143 -0
  190. package/dist/heart/tool-friction.js +55 -0
  191. package/dist/heart/tool-loop.js +200 -0
  192. package/dist/heart/turn-context.js +421 -0
  193. package/dist/heart/turn-coordinator.js +28 -0
  194. package/dist/heart/versioning/ouro-bot-global-installer.js +129 -0
  195. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  196. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  197. package/dist/heart/{daemon → versioning}/ouro-uti.js +11 -2
  198. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  199. package/dist/heart/versioning/staged-restart.js +146 -0
  200. package/dist/heart/versioning/update-checker.js +116 -0
  201. package/dist/heart/versioning/update-hooks.js +142 -0
  202. package/dist/heart/versioning/wrapper-publish-guard.js +86 -0
  203. package/dist/mailbox-ui/assets/index-B-461hes.js +61 -0
  204. package/dist/mailbox-ui/assets/index-BPr5vNuM.css +1 -0
  205. package/dist/mailbox-ui/index.html +15 -0
  206. package/dist/mailroom/attention.js +167 -0
  207. package/dist/mailroom/autonomy.js +209 -0
  208. package/dist/mailroom/blob-store.js +700 -0
  209. package/dist/mailroom/body-cache.js +61 -0
  210. package/dist/mailroom/core.js +788 -0
  211. package/dist/mailroom/entry.js +160 -0
  212. package/dist/mailroom/file-store.js +457 -0
  213. package/dist/mailroom/mbox-import.js +393 -0
  214. package/dist/mailroom/migration.js +164 -0
  215. package/dist/mailroom/outbound.js +380 -0
  216. package/dist/mailroom/policy.js +263 -0
  217. package/dist/mailroom/reader.js +233 -0
  218. package/dist/mailroom/search-cache.js +268 -0
  219. package/dist/mailroom/search-relevance.js +319 -0
  220. package/dist/mailroom/smtp-ingress.js +176 -0
  221. package/dist/mailroom/source-state.js +176 -0
  222. package/dist/mailroom/thread.js +109 -0
  223. package/dist/mailroom/travel-extract.js +89 -0
  224. package/dist/mind/bundle-manifest.js +77 -1
  225. package/dist/mind/context.js +174 -94
  226. package/dist/mind/diary-integrity.js +60 -0
  227. package/dist/mind/{memory.js → diary.js} +84 -96
  228. package/dist/mind/embedding-provider.js +60 -0
  229. package/dist/mind/file-state.js +179 -0
  230. package/dist/mind/first-impressions.js +16 -2
  231. package/dist/mind/friends/channel.js +74 -0
  232. package/dist/mind/friends/group-context.js +144 -0
  233. package/dist/mind/friends/resolver.js +54 -2
  234. package/dist/mind/friends/store-file.js +58 -3
  235. package/dist/mind/friends/trust-explanation.js +74 -0
  236. package/dist/mind/friends/types.js +10 -2
  237. package/dist/mind/journal-index.js +161 -0
  238. package/dist/mind/note-search.js +268 -0
  239. package/dist/mind/obligation-steering.js +221 -0
  240. package/dist/mind/pending.js +76 -9
  241. package/dist/mind/phrases.js +1 -0
  242. package/dist/mind/prompt-refresh.js +3 -2
  243. package/dist/mind/prompt.js +1267 -130
  244. package/dist/mind/provenance-trust.js +26 -0
  245. package/dist/mind/scrutiny.js +173 -0
  246. package/dist/mind/token-estimate.js +8 -12
  247. package/dist/nerves/cli-logging.js +22 -3
  248. package/dist/nerves/coverage/audit-rules.js +15 -6
  249. package/dist/nerves/coverage/audit.js +28 -2
  250. package/dist/nerves/coverage/cli.js +1 -1
  251. package/dist/nerves/coverage/contract.js +5 -5
  252. package/dist/nerves/coverage/file-completeness.js +129 -5
  253. package/dist/nerves/coverage/run-artifacts.js +1 -1
  254. package/dist/nerves/event-buffer.js +111 -0
  255. package/dist/nerves/index.js +224 -4
  256. package/dist/nerves/observation.js +20 -0
  257. package/dist/nerves/redact.js +79 -0
  258. package/dist/nerves/review/cli-main.js +5 -0
  259. package/dist/nerves/review/cli.js +156 -0
  260. package/dist/nerves/review/core.js +152 -0
  261. package/dist/nerves/runtime.js +5 -1
  262. package/dist/repertoire/ado-client.js +17 -56
  263. package/dist/repertoire/ado-semantic.js +11 -10
  264. package/dist/repertoire/api-client.js +97 -0
  265. package/dist/repertoire/bitwarden-store.js +997 -0
  266. package/dist/repertoire/bundle-templates.js +72 -0
  267. package/dist/repertoire/bw-installer.js +180 -0
  268. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  269. package/dist/repertoire/coding/context-pack.js +330 -0
  270. package/dist/repertoire/coding/feedback.js +301 -0
  271. package/dist/repertoire/coding/index.js +4 -1
  272. package/dist/repertoire/coding/manager.js +220 -13
  273. package/dist/repertoire/coding/spawner.js +58 -12
  274. package/dist/repertoire/coding/tools.js +209 -7
  275. package/dist/repertoire/commerce-errors.js +109 -0
  276. package/dist/repertoire/commerce-self-test.js +156 -0
  277. package/dist/repertoire/credential-access.js +178 -0
  278. package/dist/repertoire/data/ado-endpoints.json +188 -0
  279. package/dist/repertoire/duffel-client.js +185 -0
  280. package/dist/repertoire/github-client.js +14 -55
  281. package/dist/repertoire/graph-client.js +11 -52
  282. package/dist/repertoire/guardrails.js +396 -0
  283. package/dist/repertoire/mcp-client.js +295 -0
  284. package/dist/repertoire/mcp-manager.js +362 -0
  285. package/dist/repertoire/mcp-tools.js +63 -0
  286. package/dist/repertoire/shell-sessions.js +133 -0
  287. package/dist/repertoire/skills.js +15 -24
  288. package/dist/repertoire/stripe-client.js +131 -0
  289. package/dist/repertoire/tasks/board.js +43 -5
  290. package/dist/repertoire/tasks/fix.js +182 -0
  291. package/dist/repertoire/tasks/index.js +39 -13
  292. package/dist/repertoire/tasks/lifecycle.js +2 -2
  293. package/dist/repertoire/tasks/parser.js +3 -2
  294. package/dist/repertoire/tasks/scanner.js +194 -37
  295. package/dist/repertoire/tasks/transitions.js +16 -79
  296. package/dist/repertoire/tool-results.js +29 -0
  297. package/dist/repertoire/tools-attachments.js +317 -0
  298. package/dist/repertoire/tools-awaiting.js +360 -0
  299. package/dist/repertoire/tools-base.js +56 -707
  300. package/dist/repertoire/tools-bluebubbles.js +94 -0
  301. package/dist/repertoire/tools-bridge.js +142 -0
  302. package/dist/repertoire/tools-bundle.js +984 -0
  303. package/dist/repertoire/tools-config.js +185 -0
  304. package/dist/repertoire/tools-continuity.js +248 -0
  305. package/dist/repertoire/tools-credential.js +381 -0
  306. package/dist/repertoire/tools-files.js +342 -0
  307. package/dist/repertoire/tools-flight.js +224 -0
  308. package/dist/repertoire/tools-flow.js +119 -0
  309. package/dist/repertoire/tools-github.js +1 -7
  310. package/dist/repertoire/tools-mail.js +1916 -0
  311. package/dist/repertoire/tools-notes.js +421 -0
  312. package/dist/repertoire/tools-obligations.js +142 -0
  313. package/dist/repertoire/tools-runtime.js +61 -0
  314. package/dist/repertoire/tools-session.js +809 -0
  315. package/dist/repertoire/tools-shell.js +120 -0
  316. package/dist/repertoire/tools-stripe.js +180 -0
  317. package/dist/repertoire/tools-surface.js +345 -0
  318. package/dist/repertoire/tools-teams.js +64 -61
  319. package/dist/repertoire/tools-travel.js +125 -0
  320. package/dist/repertoire/tools-trip.js +604 -0
  321. package/dist/repertoire/tools-user-profile.js +144 -0
  322. package/dist/repertoire/tools-vault.js +40 -0
  323. package/dist/repertoire/tools-voice.js +144 -0
  324. package/dist/repertoire/tools.js +154 -98
  325. package/dist/repertoire/travel-api-client.js +360 -0
  326. package/dist/repertoire/user-profile.js +131 -0
  327. package/dist/repertoire/vault-setup.js +246 -0
  328. package/dist/repertoire/vault-unlock.js +594 -0
  329. package/dist/scripts/claude-code-hook.js +41 -0
  330. package/dist/scripts/claude-code-stop-hook.js +47 -0
  331. package/dist/senses/attention-queue.js +116 -0
  332. package/dist/senses/await-turn-message.js +58 -0
  333. package/dist/senses/bluebubbles/active-turns.js +216 -0
  334. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  335. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  336. package/dist/senses/bluebubbles/client.js +685 -0
  337. package/dist/senses/bluebubbles/entry.js +77 -0
  338. package/dist/senses/bluebubbles/inbound-log.js +126 -0
  339. package/dist/senses/bluebubbles/index.js +2548 -0
  340. package/dist/senses/bluebubbles/media.js +389 -0
  341. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +45 -16
  342. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +46 -6
  343. package/dist/senses/bluebubbles/processed-log.js +133 -0
  344. package/dist/senses/bluebubbles/replay.js +137 -0
  345. package/dist/senses/bluebubbles/runtime-state.js +137 -0
  346. package/dist/senses/bluebubbles/session-cleanup.js +72 -0
  347. package/dist/senses/bluebubbles-meta-guard.js +40 -0
  348. package/dist/senses/cli/bracketed-paste.js +82 -0
  349. package/dist/senses/cli/image-paste.js +287 -0
  350. package/dist/senses/cli/image-ref-navigation.js +75 -0
  351. package/dist/senses/cli/ink-app.js +156 -0
  352. package/dist/senses/cli/inline-diff.js +64 -0
  353. package/dist/senses/cli/input-keys.js +174 -0
  354. package/dist/senses/cli/kill-ring.js +86 -0
  355. package/dist/senses/cli/message-list.js +51 -0
  356. package/dist/senses/cli/ouro-tui.js +607 -0
  357. package/dist/senses/cli/spinner-imperative.js +135 -0
  358. package/dist/senses/cli/spinner.js +101 -0
  359. package/dist/senses/cli/status-line.js +60 -0
  360. package/dist/senses/cli/streaming-markdown.js +526 -0
  361. package/dist/senses/cli/tool-display.js +85 -0
  362. package/dist/senses/cli/tool-render.js +85 -0
  363. package/dist/senses/cli/tui-store.js +240 -0
  364. package/dist/senses/cli/virtual-list.js +35 -0
  365. package/dist/senses/cli-entry.js +60 -8
  366. package/dist/senses/cli-layout.js +187 -0
  367. package/dist/senses/cli.js +777 -264
  368. package/dist/senses/commands.js +66 -3
  369. package/dist/senses/continuity.js +94 -0
  370. package/dist/senses/habit-turn-message.js +108 -0
  371. package/dist/senses/inner-dialog-worker.js +209 -16
  372. package/dist/senses/inner-dialog.js +682 -91
  373. package/dist/senses/mail-entry.js +66 -0
  374. package/dist/senses/mail.js +379 -0
  375. package/dist/senses/pipeline.js +751 -0
  376. package/dist/senses/proactive-content-guard.js +51 -0
  377. package/dist/senses/shared-turn.js +392 -0
  378. package/dist/senses/surface-tool.js +70 -0
  379. package/dist/senses/teams-entry.js +60 -8
  380. package/dist/senses/teams.js +925 -195
  381. package/dist/senses/trust-gate.js +207 -2
  382. package/dist/senses/voice/audio-playback.js +237 -0
  383. package/dist/senses/voice/audio-routing.js +119 -0
  384. package/dist/senses/voice/elevenlabs.js +202 -0
  385. package/dist/senses/voice/floor-control.js +431 -0
  386. package/dist/senses/voice/floor-controller.js +115 -0
  387. package/dist/senses/voice/golden-path.js +116 -0
  388. package/dist/senses/voice/index.js +29 -0
  389. package/dist/senses/voice/meeting.js +113 -0
  390. package/dist/senses/voice/outbound.js +190 -0
  391. package/dist/senses/voice/phone.js +33 -0
  392. package/dist/senses/voice/playback.js +139 -0
  393. package/dist/senses/voice/realtime-eval.js +496 -0
  394. package/dist/senses/voice/realtime-trace.js +531 -0
  395. package/dist/senses/voice/transcript.js +70 -0
  396. package/dist/senses/voice/turn.js +191 -0
  397. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  398. package/dist/senses/voice/twilio-phone.js +5077 -0
  399. package/dist/senses/voice/types.js +2 -0
  400. package/dist/senses/voice/whisper.js +161 -0
  401. package/dist/senses/voice-entry.js +81 -0
  402. package/dist/senses/voice-realtime-eval-command.js +99 -0
  403. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  404. package/dist/senses/voice-twilio-entry.js +87 -0
  405. package/dist/trips/core.js +138 -0
  406. package/dist/trips/store.js +265 -0
  407. package/package.json +52 -7
  408. package/skills/agent-commerce.md +106 -0
  409. package/skills/browser-navigation.md +117 -0
  410. package/skills/commerce-setup-guide.md +116 -0
  411. package/skills/commerce-setup.md +84 -0
  412. package/skills/configure-dev-tools.md +99 -0
  413. package/skills/travel-planning.md +138 -0
  414. package/AdoptionSpecialist.ouro/agent.json +0 -20
  415. package/AdoptionSpecialist.ouro/psyche/SOUL.md +0 -22
  416. package/dist/heart/daemon/specialist-orchestrator.js +0 -160
  417. package/dist/heart/daemon/specialist-prompt.js +0 -40
  418. package/dist/heart/daemon/specialist-session.js +0 -142
  419. package/dist/heart/daemon/specialist-tools.js +0 -128
  420. package/dist/heart/daemon/subagent-installer.js +0 -125
  421. package/dist/inner-worker-entry.js +0 -4
  422. package/dist/mind/associative-recall.js +0 -197
  423. package/dist/senses/bluebubbles-client.js +0 -279
  424. package/dist/senses/bluebubbles-entry.js +0 -11
  425. package/dist/senses/bluebubbles.js +0 -332
  426. package/subagents/README.md +0 -73
  427. package/subagents/work-doer.md +0 -233
  428. package/subagents/work-merger.md +0 -624
  429. package/subagents/work-planner.md +0 -373
  430. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  431. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  432. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  433. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  434. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  435. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  436. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  437. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  438. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  439. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  440. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
@@ -35,61 +35,55 @@ 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.setTestConfig = setTestConfig;
38
+ exports.cacheRuntimeConfigForTests = cacheRuntimeConfigForTests;
39
+ exports.cacheMachineRuntimeConfigForTests = cacheMachineRuntimeConfigForTests;
40
+ exports.patchRuntimeConfig = patchRuntimeConfig;
39
41
  exports.getAzureConfig = getAzureConfig;
40
42
  exports.getMinimaxConfig = getMinimaxConfig;
41
43
  exports.getAnthropicConfig = getAnthropicConfig;
42
44
  exports.getOpenAICodexConfig = getOpenAICodexConfig;
45
+ exports.getGithubCopilotConfig = getGithubCopilotConfig;
43
46
  exports.getTeamsConfig = getTeamsConfig;
47
+ exports.getTeamsSecondaryConfig = getTeamsSecondaryConfig;
44
48
  exports.getContextConfig = getContextConfig;
45
49
  exports.getOAuthConfig = getOAuthConfig;
50
+ exports.resolveOAuthForTenant = resolveOAuthForTenant;
46
51
  exports.getTeamsChannelConfig = getTeamsChannelConfig;
47
52
  exports.getBlueBubblesConfig = getBlueBubblesConfig;
48
53
  exports.getBlueBubblesChannelConfig = getBlueBubblesChannelConfig;
49
54
  exports.getIntegrationsConfig = getIntegrationsConfig;
55
+ exports.getSyncConfig = getSyncConfig;
50
56
  exports.getOpenAIEmbeddingsApiKey = getOpenAIEmbeddingsApiKey;
51
57
  exports.getLogsDir = getLogsDir;
58
+ exports.sanitizeKey = sanitizeKey;
59
+ exports.slugify = slugify;
60
+ exports.resolveSessionPath = resolveSessionPath;
52
61
  exports.sessionPath = sessionPath;
53
62
  exports.logPath = logPath;
54
63
  const fs = __importStar(require("fs"));
55
64
  const path = __importStar(require("path"));
56
- const os = __importStar(require("os"));
57
65
  const identity_1 = require("./identity");
66
+ const provider_credentials_1 = require("./provider-credentials");
67
+ const runtime_credentials_1 = require("./runtime-credentials");
58
68
  const runtime_1 = require("../nerves/runtime");
59
- const DEFAULT_SECRETS_TEMPLATE = {
60
- providers: {
61
- // Keep provider field ordering consistent: model first, then auth credentials,
62
- // then provider-specific transport fields.
63
- azure: {
64
- modelName: "",
65
- apiKey: "",
66
- endpoint: "",
67
- deployment: "",
68
- apiVersion: "2025-04-01-preview",
69
- },
70
- minimax: {
71
- model: "",
72
- apiKey: "",
73
- },
74
- anthropic: {
75
- model: "claude-opus-4-6",
76
- setupToken: "",
77
- },
78
- "openai-codex": {
79
- model: "gpt-5.2",
80
- oauthAccessToken: "",
81
- },
82
- },
69
+ const DEFAULT_LOCAL_RUNTIME_CONFIG = {
83
70
  teams: {
84
71
  clientId: "",
85
72
  clientSecret: "",
86
73
  tenantId: "",
74
+ managedIdentityClientId: "",
87
75
  },
88
76
  oauth: {
89
77
  graphConnectionName: "graph",
90
78
  adoConnectionName: "ado",
91
79
  githubConnectionName: "",
92
80
  },
81
+ teamsSecondary: {
82
+ clientId: "",
83
+ clientSecret: "",
84
+ tenantId: "",
85
+ managedIdentityClientId: "",
86
+ },
93
87
  teamsChannel: {
94
88
  skipConfirmation: true,
95
89
  port: 3978,
@@ -98,12 +92,16 @@ const DEFAULT_SECRETS_TEMPLATE = {
98
92
  serverUrl: "",
99
93
  password: "",
100
94
  accountId: "default",
95
+ ownHandles: [],
101
96
  },
102
97
  bluebubblesChannel: {
103
98
  port: 18790,
104
99
  webhookPath: "/bluebubbles-webhook",
105
100
  requestTimeoutMs: 30000,
106
101
  },
102
+ vault: {
103
+ masterPassword: "",
104
+ },
107
105
  integrations: {
108
106
  perplexityApiKey: "",
109
107
  openaiEmbeddingsApiKey: "",
@@ -111,26 +109,20 @@ const DEFAULT_SECRETS_TEMPLATE = {
111
109
  };
112
110
  function defaultRuntimeConfig() {
113
111
  return {
114
- providers: {
115
- azure: { ...DEFAULT_SECRETS_TEMPLATE.providers.azure },
116
- minimax: { ...DEFAULT_SECRETS_TEMPLATE.providers.minimax },
117
- anthropic: { ...DEFAULT_SECRETS_TEMPLATE.providers.anthropic },
118
- "openai-codex": { ...DEFAULT_SECRETS_TEMPLATE.providers["openai-codex"] },
119
- },
120
- teams: { ...DEFAULT_SECRETS_TEMPLATE.teams },
121
- oauth: { ...DEFAULT_SECRETS_TEMPLATE.oauth },
112
+ teams: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.teams },
113
+ teamsSecondary: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.teamsSecondary },
114
+ oauth: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.oauth },
122
115
  context: { ...identity_1.DEFAULT_AGENT_CONTEXT },
123
- teamsChannel: { ...DEFAULT_SECRETS_TEMPLATE.teamsChannel },
124
- bluebubbles: { ...DEFAULT_SECRETS_TEMPLATE.bluebubbles },
125
- bluebubblesChannel: { ...DEFAULT_SECRETS_TEMPLATE.bluebubblesChannel },
126
- integrations: { ...DEFAULT_SECRETS_TEMPLATE.integrations },
116
+ teamsChannel: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.teamsChannel },
117
+ bluebubbles: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.bluebubbles },
118
+ bluebubblesChannel: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.bluebubblesChannel },
119
+ vault: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.vault },
120
+ integrations: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.integrations },
127
121
  };
128
122
  }
129
- let _cachedConfig = null;
123
+ let _runtimeConfigOverride = null;
130
124
  let _testContextOverride = null;
131
- function resolveConfigPath() {
132
- return (0, identity_1.getAgentSecretsPath)();
133
- }
125
+ let _providerConfigOverride = null;
134
126
  function deepMerge(defaults, partial) {
135
127
  const result = { ...defaults };
136
128
  for (const key of Object.keys(partial)) {
@@ -147,121 +139,115 @@ function deepMerge(defaults, partial) {
147
139
  }
148
140
  return result;
149
141
  }
142
+ function localRuntimeFields(config) {
143
+ const { providers: _providers, context: _context, ...localFields } = config;
144
+ return localFields;
145
+ }
150
146
  function loadConfig() {
151
- if (_cachedConfig) {
152
- (0, runtime_1.emitNervesEvent)({
153
- event: "config.load",
154
- component: "config/identity",
155
- message: "config loaded from cache",
156
- meta: { source: "cache" },
157
- });
158
- return _cachedConfig;
159
- }
160
- const configPath = resolveConfigPath();
161
- // Auto-create config directory if it doesn't exist
162
- const configDir = path.dirname(configPath);
163
- fs.mkdirSync(configDir, { recursive: true });
164
- let fileData = {};
165
- try {
166
- const raw = fs.readFileSync(configPath, "utf-8");
167
- fileData = JSON.parse(raw);
168
- }
169
- catch (error) {
170
- const errorCode = error &&
171
- typeof error === "object" &&
172
- "code" in error &&
173
- typeof error.code === "string"
174
- ? error.code
175
- : undefined;
176
- if (errorCode === "ENOENT") {
177
- try {
178
- fs.writeFileSync(configPath, JSON.stringify(DEFAULT_SECRETS_TEMPLATE, null, 2) + "\n", "utf-8");
179
- }
180
- catch (writeError) {
181
- (0, runtime_1.emitNervesEvent)({
182
- level: "warn",
183
- event: "config_identity.error",
184
- component: "config/identity",
185
- message: "failed writing default secrets config",
186
- meta: {
187
- phase: "loadConfig",
188
- path: configPath,
189
- reason: writeError instanceof Error ? writeError.message : String(writeError),
190
- },
191
- });
192
- }
193
- }
194
- (0, runtime_1.emitNervesEvent)({
195
- level: "warn",
196
- event: "config_identity.error",
197
- component: "config/identity",
198
- message: "config read failed; defaults applied",
199
- meta: {
200
- phase: "loadConfig",
201
- reason: error instanceof Error ? error.message : String(error),
202
- },
203
- });
204
- // ENOENT or parse error -- use defaults
205
- }
206
- const sanitizedFileData = { ...fileData };
207
- if ("context" in sanitizedFileData) {
208
- delete sanitizedFileData.context;
209
- (0, runtime_1.emitNervesEvent)({
210
- level: "warn",
211
- event: "config_identity.error",
212
- component: "config/identity",
213
- message: "ignored legacy context block in secrets config",
214
- meta: {
215
- phase: "loadConfig",
216
- path: configPath,
217
- },
218
- });
219
- }
220
- _cachedConfig = deepMerge(defaultRuntimeConfig(), sanitizedFileData);
147
+ const agentName = (0, identity_1.getAgentName)();
148
+ const runtimeResult = (0, runtime_credentials_1.readRuntimeCredentialConfig)(agentName);
149
+ const machineRuntimeResult = (0, runtime_credentials_1.readMachineRuntimeCredentialConfig)(agentName);
150
+ const vaultData = runtimeResult.ok ? localRuntimeFields(runtimeResult.config) : {};
151
+ const machineVaultData = machineRuntimeResult.ok ? localRuntimeFields(machineRuntimeResult.config) : {};
152
+ const mergedConfig = deepMerge(defaultRuntimeConfig(), vaultData);
153
+ const mergedWithMachineConfig = deepMerge(mergedConfig, machineVaultData);
154
+ const config = _runtimeConfigOverride
155
+ ? deepMerge(mergedWithMachineConfig, _runtimeConfigOverride)
156
+ : mergedWithMachineConfig;
221
157
  (0, runtime_1.emitNervesEvent)({
222
158
  event: "config.load",
223
159
  component: "config/identity",
224
- message: "config loaded from disk",
160
+ message: "config loaded from runtime credential cache",
225
161
  meta: {
226
- source: "disk",
227
- used_defaults_only: Object.keys(fileData).length === 0,
162
+ source: runtimeResult.ok ? "vault-cache" : "defaults",
163
+ used_defaults_only: !runtimeResult.ok,
164
+ machine_runtime_credentials: machineRuntimeResult.ok ? "available" : machineRuntimeResult.reason,
165
+ override_applied: _runtimeConfigOverride !== null,
166
+ runtime_credentials: runtimeResult.ok ? "available" : runtimeResult.reason,
228
167
  },
229
168
  });
230
- return _cachedConfig;
169
+ return config;
231
170
  }
232
171
  function resetConfigCache() {
233
- _cachedConfig = null;
172
+ _runtimeConfigOverride = null;
234
173
  _testContextOverride = null;
174
+ _providerConfigOverride = null;
175
+ (0, provider_credentials_1.resetProviderCredentialCache)();
176
+ (0, runtime_credentials_1.resetRuntimeCredentialConfigCache)();
177
+ }
178
+ function cacheRuntimeConfigForTests(agentName, config) {
179
+ (0, runtime_credentials_1.cacheRuntimeCredentialConfig)(agentName, config, new Date(0));
180
+ }
181
+ function cacheMachineRuntimeConfigForTests(agentName, config) {
182
+ (0, runtime_credentials_1.cacheMachineRuntimeCredentialConfig)(agentName, config, new Date(0), "machine_test");
183
+ }
184
+ function seedProviderCredentialCache(providers) {
185
+ if (!providers)
186
+ return;
187
+ _providerConfigOverride = deepMerge((_providerConfigOverride ?? {}), providers);
188
+ const records = Object.entries(_providerConfigOverride).map(([provider, rawConfig]) => {
189
+ const split = (0, provider_credentials_1.splitProviderCredentialFields)(provider, rawConfig);
190
+ return (0, provider_credentials_1.createProviderCredentialRecord)({
191
+ provider: provider,
192
+ credentials: split.credentials,
193
+ config: split.config,
194
+ provenance: { source: "manual" },
195
+ now: new Date(0),
196
+ });
197
+ });
198
+ (0, provider_credentials_1.cacheProviderCredentialRecords)((0, identity_1.getAgentName)(), records, new Date(0));
235
199
  }
236
- function setTestConfig(partial) {
237
- loadConfig(); // ensure _cachedConfig exists
200
+ function patchRuntimeConfig(partial) {
201
+ const { providers, ...runtimePartial } = partial;
202
+ seedProviderCredentialCache(providers);
238
203
  const contextPatch = partial.context;
239
204
  if (contextPatch) {
240
205
  const base = _testContextOverride ?? identity_1.DEFAULT_AGENT_CONTEXT;
241
206
  _testContextOverride = deepMerge(base, contextPatch);
242
207
  }
243
- _cachedConfig = deepMerge(_cachedConfig, partial);
208
+ _runtimeConfigOverride = deepMerge((_runtimeConfigOverride ?? {}), runtimePartial);
209
+ }
210
+ function readProviderConfig(provider) {
211
+ const cached = (0, provider_credentials_1.readCachedProviderCredentialRecord)((0, identity_1.getAgentName)(), provider);
212
+ return cached.ok ? { ...cached.record.config, ...cached.record.credentials } : {};
244
213
  }
245
214
  function getAzureConfig() {
246
- const config = loadConfig();
247
- return { ...config.providers.azure };
215
+ const raw = readProviderConfig("azure");
216
+ return {
217
+ apiKey: typeof raw.apiKey === "string" ? raw.apiKey : "",
218
+ endpoint: typeof raw.endpoint === "string" ? raw.endpoint : "",
219
+ deployment: typeof raw.deployment === "string" ? raw.deployment : "",
220
+ apiVersion: typeof raw.apiVersion === "string" ? raw.apiVersion : "2025-04-01-preview",
221
+ managedIdentityClientId: typeof raw.managedIdentityClientId === "string" ? raw.managedIdentityClientId : "",
222
+ };
248
223
  }
249
224
  function getMinimaxConfig() {
250
- const config = loadConfig();
251
- return { ...config.providers.minimax };
225
+ const raw = readProviderConfig("minimax");
226
+ return { apiKey: typeof raw.apiKey === "string" ? raw.apiKey : "" };
252
227
  }
253
228
  function getAnthropicConfig() {
254
- const config = loadConfig();
255
- return { ...config.providers.anthropic };
229
+ const raw = readProviderConfig("anthropic");
230
+ return { setupToken: typeof raw.setupToken === "string" ? raw.setupToken : "" };
256
231
  }
257
232
  function getOpenAICodexConfig() {
258
- const config = loadConfig();
259
- return { ...config.providers["openai-codex"] };
233
+ const raw = readProviderConfig("openai-codex");
234
+ return { oauthAccessToken: typeof raw.oauthAccessToken === "string" ? raw.oauthAccessToken : "" };
235
+ }
236
+ function getGithubCopilotConfig() {
237
+ const raw = readProviderConfig("github-copilot");
238
+ return {
239
+ githubToken: typeof raw.githubToken === "string" ? raw.githubToken : "",
240
+ baseUrl: typeof raw.baseUrl === "string" ? raw.baseUrl : "",
241
+ };
260
242
  }
261
243
  function getTeamsConfig() {
262
244
  const config = loadConfig();
263
245
  return { ...config.teams };
264
246
  }
247
+ function getTeamsSecondaryConfig() {
248
+ const config = loadConfig();
249
+ return { ...config.teamsSecondary };
250
+ }
265
251
  function getContextConfig() {
266
252
  if (_testContextOverride) {
267
253
  return { ..._testContextOverride };
@@ -282,6 +268,16 @@ function getOAuthConfig() {
282
268
  const config = loadConfig();
283
269
  return { ...config.oauth };
284
270
  }
271
+ /** Resolve OAuth connection names for a specific tenant, falling back to defaults. */
272
+ function resolveOAuthForTenant(tenantId) {
273
+ const base = getOAuthConfig();
274
+ const overrides = tenantId ? base.tenantOverrides?.[tenantId] : undefined;
275
+ return {
276
+ graphConnectionName: overrides?.graphConnectionName ?? base.graphConnectionName,
277
+ adoConnectionName: overrides?.adoConnectionName ?? base.adoConnectionName,
278
+ githubConnectionName: overrides?.githubConnectionName ?? base.githubConnectionName,
279
+ };
280
+ }
285
281
  function getTeamsChannelConfig() {
286
282
  const config = loadConfig();
287
283
  const { skipConfirmation, flushIntervalMs, port } = config.teamsChannel;
@@ -289,17 +285,24 @@ function getTeamsChannelConfig() {
289
285
  }
290
286
  function getBlueBubblesConfig() {
291
287
  const config = loadConfig();
292
- const { serverUrl, password, accountId } = config.bluebubbles;
288
+ const { serverUrl, password, accountId, ownHandles } = config.bluebubbles;
293
289
  if (!serverUrl.trim()) {
294
- throw new Error("bluebubbles.serverUrl is required in secrets.json to run the BlueBubbles sense.");
290
+ throw new Error("bluebubbles.serverUrl is required in this machine's agent-vault runtime config. Run `ouro connect bluebubbles --agent <agent>`.");
295
291
  }
296
292
  if (!password.trim()) {
297
- throw new Error("bluebubbles.password is required in secrets.json to run the BlueBubbles sense.");
293
+ throw new Error("bluebubbles.password is required in this machine's agent-vault runtime config. Run `ouro connect bluebubbles --agent <agent>`.");
294
+ }
295
+ const normalizedHandles = [];
296
+ for (const handle of ownHandles) {
297
+ const trimmed = handle.trim();
298
+ if (trimmed.length > 0)
299
+ normalizedHandles.push(trimmed);
298
300
  }
299
301
  return {
300
302
  serverUrl: serverUrl.trim(),
301
303
  password: password.trim(),
302
304
  accountId: accountId.trim() || "default",
305
+ ownHandles: normalizedHandles,
303
306
  };
304
307
  }
305
308
  function getBlueBubblesChannelConfig() {
@@ -311,20 +314,46 @@ function getIntegrationsConfig() {
311
314
  const config = loadConfig();
312
315
  return { ...config.integrations };
313
316
  }
317
+ function getSyncConfig() {
318
+ try {
319
+ const agentConfig = (0, identity_1.loadAgentConfig)();
320
+ return {
321
+ enabled: agentConfig.sync?.enabled ?? false,
322
+ remote: agentConfig.sync?.remote ?? "origin",
323
+ };
324
+ }
325
+ catch {
326
+ /* v8 ignore next -- defensive: loadAgentConfig failure in test/bootstrap @preserve */
327
+ return { enabled: false, remote: "origin" };
328
+ }
329
+ }
314
330
  function getOpenAIEmbeddingsApiKey() {
315
331
  return getIntegrationsConfig().openaiEmbeddingsApiKey;
316
332
  }
317
333
  function getLogsDir() {
318
- return path.join(os.homedir(), ".agentstate", (0, identity_1.getAgentName)(), "logs");
334
+ return path.join((0, identity_1.getAgentRoot)(), "state", "logs");
319
335
  }
320
336
  function sanitizeKey(key) {
321
337
  return key.replace(/[/:]/g, "_");
322
338
  }
323
- function sessionPath(friendId, channel, key) {
324
- const dir = path.join(os.homedir(), ".agentstate", (0, identity_1.getAgentName)(), "sessions", friendId, channel);
325
- fs.mkdirSync(dir, { recursive: true });
339
+ function slugify(value) {
340
+ return value
341
+ .trim()
342
+ .toLowerCase()
343
+ .replace(/[^a-z0-9]+/g, "-")
344
+ .replace(/^-+/, "")
345
+ .replace(/-+$/, "");
346
+ }
347
+ function resolveSessionPath(friendId, channel, key, options) {
348
+ const dir = path.join((0, identity_1.getAgentRoot)(), "state", "sessions", friendId, channel);
349
+ if (options?.ensureDir) {
350
+ fs.mkdirSync(dir, { recursive: true });
351
+ }
326
352
  return path.join(dir, sanitizeKey(key) + ".json");
327
353
  }
354
+ function sessionPath(friendId, channel, key) {
355
+ return resolveSessionPath(friendId, channel, key, { ensureDir: true });
356
+ }
328
357
  function logPath(channel, key) {
329
358
  return path.join(getLogsDir(), channel, sanitizeKey(key) + ".ndjson");
330
359
  }