@ouro.bot/cli 0.1.0-alpha.7 → 0.1.0-alpha.700

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 (514) hide show
  1. package/README.md +235 -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 +4827 -0
  15. package/dist/a2a/card.js +57 -0
  16. package/dist/a2a/client.js +180 -0
  17. package/dist/a2a/config.js +50 -0
  18. package/dist/a2a/delegation-stores.js +56 -0
  19. package/dist/a2a/did-resolution.js +93 -0
  20. package/dist/a2a/identity.js +170 -0
  21. package/dist/a2a/inbound-share.js +107 -0
  22. package/dist/a2a/mission-result-wire.js +196 -0
  23. package/dist/a2a/onboarding.js +115 -0
  24. package/dist/a2a/pin-store.js +132 -0
  25. package/dist/a2a/seen-ledger.js +120 -0
  26. package/dist/a2a/server.js +604 -0
  27. package/dist/a2a/task-store.js +69 -0
  28. package/dist/a2a/transport.js +45 -0
  29. package/dist/a2a/types.js +3 -0
  30. package/dist/arc/attention-types.js +8 -0
  31. package/dist/arc/cares.js +144 -0
  32. package/dist/arc/episodes.js +118 -0
  33. package/dist/arc/evolution.js +490 -0
  34. package/dist/arc/flight-recorder.js +928 -0
  35. package/dist/arc/intentions.js +134 -0
  36. package/dist/arc/json-store.js +117 -0
  37. package/dist/arc/obligations.js +348 -0
  38. package/dist/arc/packets.js +336 -0
  39. package/dist/arc/presence.js +185 -0
  40. package/dist/arc/task-lifecycle.js +57 -0
  41. package/dist/commerce/store.js +755 -0
  42. package/dist/commerce/types.js +3 -0
  43. package/dist/heart/active-work.js +1002 -0
  44. package/dist/heart/agent-entry.js +190 -3
  45. package/dist/heart/attachments/image-normalize.js +194 -0
  46. package/dist/heart/attachments/materialize.js +97 -0
  47. package/dist/heart/attachments/originals.js +88 -0
  48. package/dist/heart/attachments/render.js +29 -0
  49. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  50. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  51. package/dist/heart/attachments/sources/index.js +16 -0
  52. package/dist/heart/attachments/store.js +103 -0
  53. package/dist/heart/attachments/types.js +93 -0
  54. package/dist/heart/auth/auth-flow.js +479 -0
  55. package/dist/heart/autonomy-budget.js +434 -0
  56. package/dist/heart/awaiting/await-alert.js +146 -0
  57. package/dist/heart/awaiting/await-expiry.js +108 -0
  58. package/dist/heart/awaiting/await-loader.js +91 -0
  59. package/dist/heart/awaiting/await-parser.js +141 -0
  60. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  61. package/dist/heart/awaiting/await-scheduler.js +378 -0
  62. package/dist/heart/background-operations.js +281 -0
  63. package/dist/heart/bridges/manager.js +478 -0
  64. package/dist/heart/bridges/state-machine.js +135 -0
  65. package/dist/heart/bridges/store.js +135 -0
  66. package/dist/heart/bundle-state.js +168 -0
  67. package/dist/heart/commitments.js +135 -0
  68. package/dist/heart/config-registry.js +331 -0
  69. package/dist/heart/config.js +172 -135
  70. package/dist/heart/context-loss-gauntlet.js +354 -0
  71. package/dist/heart/context-loss-sentinel.js +1155 -0
  72. package/dist/heart/core.js +1480 -262
  73. package/dist/heart/cross-chat-delivery.js +132 -0
  74. package/dist/heart/daemon/agent-config-check.js +451 -0
  75. package/dist/heart/daemon/agent-discovery.js +263 -0
  76. package/dist/heart/daemon/agent-service.js +523 -0
  77. package/dist/heart/daemon/agentic-repair.js +547 -0
  78. package/dist/heart/daemon/await-private-wake.js +59 -0
  79. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  80. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  81. package/dist/heart/daemon/cadence.js +180 -0
  82. package/dist/heart/daemon/cli-defaults.js +780 -0
  83. package/dist/heart/daemon/cli-desk.js +322 -0
  84. package/dist/heart/daemon/cli-exec.js +8142 -0
  85. package/dist/heart/daemon/cli-help.js +675 -0
  86. package/dist/heart/daemon/cli-parse.js +2461 -0
  87. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  88. package/dist/heart/daemon/cli-render.js +770 -0
  89. package/dist/heart/daemon/cli-types.js +8 -0
  90. package/dist/heart/daemon/connect-bay.js +323 -0
  91. package/dist/heart/daemon/daemon-cli.js +30 -784
  92. package/dist/heart/daemon/daemon-entry.js +874 -13
  93. package/dist/heart/daemon/daemon-health.js +176 -0
  94. package/dist/heart/daemon/daemon-rollup.js +57 -0
  95. package/dist/heart/daemon/daemon-runtime-sync.js +287 -0
  96. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  97. package/dist/heart/daemon/daemon.js +1412 -26
  98. package/dist/heart/daemon/dns-workflow.js +394 -0
  99. package/dist/heart/daemon/doctor-types.js +8 -0
  100. package/dist/heart/daemon/doctor.js +1126 -0
  101. package/dist/heart/daemon/habit-private-wake.js +56 -0
  102. package/dist/heart/daemon/health-monitor.js +142 -11
  103. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  104. package/dist/heart/daemon/hooks/bundle-meta.js +226 -0
  105. package/dist/heart/daemon/http-health-probe.js +80 -0
  106. package/dist/heart/daemon/human-command-screens.js +234 -0
  107. package/dist/heart/daemon/human-readiness.js +114 -0
  108. package/dist/heart/daemon/inner-status.js +78 -0
  109. package/dist/heart/daemon/interactive-repair.js +394 -0
  110. package/dist/heart/daemon/launchd.js +188 -0
  111. package/dist/heart/daemon/log-tailer.js +82 -12
  112. package/dist/heart/daemon/logs-prune.js +110 -0
  113. package/dist/heart/daemon/mcp-canary.js +297 -0
  114. package/dist/heart/daemon/message-router.js +60 -11
  115. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  116. package/dist/heart/daemon/os-cron-deps.js +135 -0
  117. package/dist/heart/daemon/os-cron.js +22 -14
  118. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  119. package/dist/heart/daemon/ouro-entry.js +3 -1
  120. package/dist/heart/daemon/plugin-cli.js +432 -0
  121. package/dist/heart/daemon/process-manager.js +525 -33
  122. package/dist/heart/daemon/provider-discovery.js +137 -0
  123. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  124. package/dist/heart/daemon/pulse.js +511 -0
  125. package/dist/heart/daemon/readiness-repair.js +365 -0
  126. package/dist/heart/daemon/run-hooks.js +39 -0
  127. package/dist/heart/daemon/runtime-logging.js +86 -16
  128. package/dist/heart/daemon/runtime-metadata.js +191 -0
  129. package/dist/{repertoire/tasks/lifecycle.js → heart/daemon/runtime-mode.js} +26 -39
  130. package/dist/heart/daemon/safe-mode.js +161 -0
  131. package/dist/heart/daemon/sense-manager.js +929 -0
  132. package/dist/heart/daemon/session-id-resolver.js +131 -0
  133. package/dist/heart/daemon/skill-management-installer.js +94 -0
  134. package/dist/heart/daemon/socket-client.js +361 -0
  135. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  136. package/dist/heart/daemon/startup-tui.js +338 -0
  137. package/dist/heart/daemon/task-scheduler.js +117 -39
  138. package/dist/heart/daemon/terminal-ui.js +499 -0
  139. package/dist/heart/daemon/thoughts.js +591 -0
  140. package/dist/heart/daemon/up-progress.js +366 -0
  141. package/dist/heart/daemon/vault-items.js +56 -0
  142. package/dist/heart/delegation.js +59 -0
  143. package/dist/heart/external-events/router.js +121 -0
  144. package/dist/heart/habits/habit-migration.js +189 -0
  145. package/dist/heart/habits/habit-parser.js +214 -0
  146. package/dist/heart/habits/habit-runtime-state.js +114 -0
  147. package/dist/heart/habits/habit-scheduler.js +431 -0
  148. package/dist/heart/habits/habit-session-summary.js +318 -0
  149. package/dist/heart/habits/habit-session.js +617 -0
  150. package/dist/heart/{daemon → hatch}/hatch-animation.js +10 -3
  151. package/dist/heart/{daemon → hatch}/hatch-flow.js +53 -137
  152. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  153. package/dist/heart/hatch/specialist-orchestrator.js +129 -0
  154. package/dist/heart/hatch/specialist-prompt.js +102 -0
  155. package/dist/heart/hatch/specialist-tools.js +318 -0
  156. package/dist/heart/identity.js +287 -67
  157. package/dist/heart/kept-notes.js +289 -0
  158. package/dist/heart/kicks.js +2 -20
  159. package/dist/heart/machine-identity.js +161 -0
  160. package/dist/heart/mail-import-discovery.js +353 -0
  161. package/dist/heart/mailbox/mailbox-http-hooks.js +96 -0
  162. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  163. package/dist/heart/mailbox/mailbox-http-routes.js +375 -0
  164. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  165. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  166. package/dist/heart/mailbox/mailbox-http.js +99 -0
  167. package/dist/heart/mailbox/mailbox-read.js +37 -0
  168. package/dist/heart/mailbox/mailbox-types.js +27 -0
  169. package/dist/heart/mailbox/mailbox-view.js +197 -0
  170. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  171. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  172. package/dist/heart/mailbox/readers/mail.js +375 -0
  173. package/dist/heart/mailbox/readers/runtime-readers.js +815 -0
  174. package/dist/heart/mailbox/readers/sessions.js +232 -0
  175. package/dist/heart/mailbox/readers/shared.js +111 -0
  176. package/dist/heart/mcp/mcp-server.js +696 -0
  177. package/dist/heart/migrate-config.js +100 -0
  178. package/dist/heart/model-capabilities.js +59 -0
  179. package/dist/heart/orientation-frame.js +217 -0
  180. package/dist/heart/platform.js +81 -0
  181. package/dist/heart/primitives.js +1 -1
  182. package/dist/heart/private-runtime/decision-renderer.js +156 -0
  183. package/dist/heart/private-runtime/index.js +18 -0
  184. package/dist/heart/private-runtime/ledger.js +218 -0
  185. package/dist/heart/private-runtime/policy.js +214 -0
  186. package/dist/heart/private-runtime/types.js +2 -0
  187. package/dist/heart/progress-story.js +42 -0
  188. package/dist/heart/provider-attempt.js +134 -0
  189. package/dist/heart/provider-binding-resolver.js +273 -0
  190. package/dist/heart/provider-credentials.js +441 -0
  191. package/dist/heart/provider-failover.js +311 -0
  192. package/dist/heart/provider-models.js +81 -0
  193. package/dist/heart/provider-ping.js +262 -0
  194. package/dist/heart/provider-readiness-cache.js +119 -0
  195. package/dist/heart/provider-visibility.js +188 -0
  196. package/dist/heart/providers/anthropic-token.js +131 -0
  197. package/dist/heart/providers/anthropic.js +202 -50
  198. package/dist/heart/providers/azure.js +104 -13
  199. package/dist/heart/providers/error-classification.js +127 -0
  200. package/dist/heart/providers/github-copilot.js +145 -0
  201. package/dist/heart/providers/minimax-vlm.js +189 -0
  202. package/dist/heart/providers/minimax.js +29 -7
  203. package/dist/heart/providers/openai-codex-token.js +349 -0
  204. package/dist/heart/providers/openai-codex.js +63 -39
  205. package/dist/heart/run-ledger.js +247 -0
  206. package/dist/heart/runtime-capability-check.js +170 -0
  207. package/dist/heart/runtime-credentials.js +398 -0
  208. package/dist/heart/runtime-cwd.js +87 -0
  209. package/dist/heart/sense-truth.js +77 -0
  210. package/dist/heart/session-activity.js +235 -0
  211. package/dist/heart/session-events.js +1133 -0
  212. package/dist/heart/session-playback-cli-main.js +5 -0
  213. package/dist/heart/session-playback-cli.js +36 -0
  214. package/dist/heart/session-playback.js +231 -0
  215. package/dist/heart/session-stats-cli-main.js +5 -0
  216. package/dist/heart/session-stats.js +182 -0
  217. package/dist/heart/session-transcript.js +133 -0
  218. package/dist/heart/start-of-turn-packet.js +365 -0
  219. package/dist/heart/streaming.js +129 -34
  220. package/dist/heart/structured-output.js +196 -0
  221. package/dist/heart/sync-classification.js +176 -0
  222. package/dist/heart/sync.js +449 -0
  223. package/dist/heart/target-resolution.js +127 -0
  224. package/dist/heart/tempo.js +93 -0
  225. package/dist/heart/temporal-view.js +41 -0
  226. package/dist/heart/timeouts.js +101 -0
  227. package/dist/heart/tool-activity-callbacks.js +59 -0
  228. package/dist/heart/tool-description.js +155 -0
  229. package/dist/heart/tool-friction.js +55 -0
  230. package/dist/heart/tool-loop.js +200 -0
  231. package/dist/heart/turn-context.js +472 -0
  232. package/dist/heart/turn-coordinator.js +28 -0
  233. package/dist/heart/versioning/ouro-bot-global-installer.js +129 -0
  234. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  235. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  236. package/dist/heart/{daemon → versioning}/ouro-uti.js +11 -2
  237. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  238. package/dist/heart/versioning/staged-restart.js +146 -0
  239. package/dist/heart/versioning/update-checker.js +116 -0
  240. package/dist/heart/versioning/update-hooks.js +154 -0
  241. package/dist/heart/versioning/wrapper-publish-guard.js +86 -0
  242. package/dist/heart/work-card.js +380 -0
  243. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  244. package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
  245. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  246. package/dist/mailbox-ui/index.html +16 -0
  247. package/dist/mailroom/attention.js +167 -0
  248. package/dist/mailroom/autonomy.js +209 -0
  249. package/dist/mailroom/blob-store.js +715 -0
  250. package/dist/mailroom/body-cache.js +61 -0
  251. package/dist/mailroom/core.js +788 -0
  252. package/dist/mailroom/entry.js +160 -0
  253. package/dist/mailroom/file-store.js +568 -0
  254. package/dist/mailroom/mbox-import.js +393 -0
  255. package/dist/mailroom/migration.js +164 -0
  256. package/dist/mailroom/outbound.js +380 -0
  257. package/dist/mailroom/policy.js +263 -0
  258. package/dist/mailroom/reader.js +233 -0
  259. package/dist/mailroom/search-cache.js +334 -0
  260. package/dist/mailroom/search-relevance.js +319 -0
  261. package/dist/mailroom/smtp-ingress.js +176 -0
  262. package/dist/mailroom/source-state.js +176 -0
  263. package/dist/mailroom/thread.js +109 -0
  264. package/dist/mailroom/travel-extract.js +89 -0
  265. package/dist/mind/bundle-manifest.js +93 -1
  266. package/dist/mind/context.js +259 -94
  267. package/dist/mind/desk-section.js +362 -0
  268. package/dist/mind/diary-integrity.js +60 -0
  269. package/dist/mind/{memory.js → diary.js} +90 -98
  270. package/dist/mind/embedding-provider.js +60 -0
  271. package/dist/mind/file-state.js +179 -0
  272. package/dist/mind/first-impressions.js +16 -2
  273. package/dist/mind/{associative-recall.js → note-search.js} +61 -60
  274. package/dist/mind/obligation-steering.js +221 -0
  275. package/dist/mind/pending.js +77 -9
  276. package/dist/mind/phrases.js +1 -0
  277. package/dist/mind/prompt-budget.js +380 -0
  278. package/dist/mind/prompt-refresh.js +3 -2
  279. package/dist/mind/prompt.js +1279 -139
  280. package/dist/mind/provenance-trust.js +26 -0
  281. package/dist/mind/record-paths.js +312 -0
  282. package/dist/mind/scrutiny.js +173 -0
  283. package/dist/mind/token-estimate.js +8 -12
  284. package/dist/nerves/cli-logging.js +22 -3
  285. package/dist/nerves/coverage/audit-rules.js +15 -6
  286. package/dist/nerves/coverage/audit.js +28 -2
  287. package/dist/nerves/coverage/cli.js +1 -1
  288. package/dist/nerves/coverage/contract.js +5 -5
  289. package/dist/nerves/coverage/file-completeness.js +139 -5
  290. package/dist/nerves/coverage/run-artifacts.js +1 -1
  291. package/dist/nerves/event-buffer.js +111 -0
  292. package/dist/nerves/index.js +234 -4
  293. package/dist/nerves/observation.js +20 -0
  294. package/dist/nerves/redact.js +79 -0
  295. package/dist/nerves/review/cli-main.js +5 -0
  296. package/dist/nerves/review/cli.js +156 -0
  297. package/dist/nerves/review/core.js +152 -0
  298. package/dist/nerves/runtime.js +5 -1
  299. package/dist/repertoire/ado-client.js +17 -56
  300. package/dist/repertoire/ado-semantic.js +16 -10
  301. package/dist/repertoire/api-client.js +97 -0
  302. package/dist/repertoire/bitwarden-store.js +1042 -0
  303. package/dist/repertoire/bundle-templates.js +71 -0
  304. package/dist/repertoire/bw-installer.js +180 -0
  305. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  306. package/dist/repertoire/coding/context-pack.js +331 -0
  307. package/dist/repertoire/coding/feedback.js +322 -0
  308. package/dist/repertoire/coding/index.js +18 -3
  309. package/dist/repertoire/coding/manager.js +228 -14
  310. package/dist/repertoire/coding/spawner.js +61 -14
  311. package/dist/repertoire/coding/tools.js +279 -12
  312. package/dist/repertoire/coding/workbench-client.js +272 -0
  313. package/dist/repertoire/coding/workbench-manager.js +346 -0
  314. package/dist/repertoire/commerce-errors.js +109 -0
  315. package/dist/repertoire/commerce-self-test.js +156 -0
  316. package/dist/repertoire/credential-access.js +178 -0
  317. package/dist/repertoire/data/ado-endpoints.json +188 -0
  318. package/dist/repertoire/desk/classifier.js +362 -0
  319. package/dist/repertoire/duffel-client.js +185 -0
  320. package/dist/repertoire/github-client.js +14 -55
  321. package/dist/repertoire/graph-client.js +11 -52
  322. package/dist/repertoire/guardrails.js +408 -0
  323. package/dist/repertoire/mcp-client.js +295 -0
  324. package/dist/repertoire/mcp-manager.js +434 -0
  325. package/dist/repertoire/mcp-tools.js +83 -0
  326. package/dist/repertoire/plugin-mcp.js +175 -0
  327. package/dist/repertoire/plugins.js +253 -0
  328. package/dist/repertoire/shell-sessions.js +133 -0
  329. package/dist/repertoire/skills.js +45 -24
  330. package/dist/repertoire/stripe-client.js +131 -0
  331. package/dist/repertoire/tool-results.js +29 -0
  332. package/dist/repertoire/tools-a2a.js +699 -0
  333. package/dist/repertoire/tools-attachments.js +317 -0
  334. package/dist/repertoire/tools-awaiting.js +372 -0
  335. package/dist/repertoire/tools-base.js +68 -707
  336. package/dist/repertoire/tools-bluebubbles.js +95 -0
  337. package/dist/repertoire/tools-bridge.js +144 -0
  338. package/dist/repertoire/tools-bundle.js +993 -0
  339. package/dist/repertoire/tools-commerce.js +253 -0
  340. package/dist/repertoire/tools-config.js +186 -0
  341. package/dist/repertoire/tools-continuity.js +252 -0
  342. package/dist/repertoire/tools-credential.js +383 -0
  343. package/dist/repertoire/tools-evolution.js +527 -0
  344. package/dist/repertoire/tools-files.js +344 -0
  345. package/dist/repertoire/tools-flight.js +290 -0
  346. package/dist/repertoire/tools-flow.js +119 -0
  347. package/dist/repertoire/tools-github.js +3 -8
  348. package/dist/repertoire/tools-mail.js +1975 -0
  349. package/dist/repertoire/tools-notes.js +459 -0
  350. package/dist/repertoire/tools-obligations.js +182 -0
  351. package/dist/repertoire/tools-orientation.js +31 -0
  352. package/dist/repertoire/tools-record.js +482 -0
  353. package/dist/repertoire/tools-rsvp.js +139 -0
  354. package/dist/repertoire/tools-runtime.js +150 -0
  355. package/dist/repertoire/tools-session.js +881 -0
  356. package/dist/repertoire/tools-shell.js +120 -0
  357. package/dist/repertoire/tools-stripe.js +224 -0
  358. package/dist/repertoire/tools-surface.js +355 -0
  359. package/dist/repertoire/tools-teams.js +67 -61
  360. package/dist/repertoire/tools-travel.js +125 -0
  361. package/dist/repertoire/tools-trip.js +982 -0
  362. package/dist/repertoire/tools-user-profile.js +146 -0
  363. package/dist/repertoire/tools-vault.js +40 -0
  364. package/dist/repertoire/tools-voice.js +145 -0
  365. package/dist/repertoire/tools.js +313 -102
  366. package/dist/repertoire/travel-api-client.js +360 -0
  367. package/dist/repertoire/user-profile.js +131 -0
  368. package/dist/repertoire/vault-setup.js +246 -0
  369. package/dist/repertoire/vault-unlock.js +594 -0
  370. package/dist/rsvp/aisleplanner-client.js +354 -0
  371. package/dist/rsvp/cli.js +704 -0
  372. package/dist/rsvp/config.js +327 -0
  373. package/dist/rsvp/cutover.js +431 -0
  374. package/dist/rsvp/diagnostics.js +222 -0
  375. package/dist/rsvp/diff-renderer.js +161 -0
  376. package/dist/rsvp/habit-policy.js +85 -0
  377. package/dist/rsvp/habit-stage.js +93 -0
  378. package/dist/rsvp/incident-bundle.js +97 -0
  379. package/dist/rsvp/migration.js +204 -0
  380. package/dist/rsvp/outbound-state.js +254 -0
  381. package/dist/rsvp/query.js +118 -0
  382. package/dist/rsvp/replay.js +233 -0
  383. package/dist/rsvp/snapshot.js +232 -0
  384. package/dist/scripts/claude-code-hook.js +41 -0
  385. package/dist/scripts/claude-code-stop-hook.js +47 -0
  386. package/dist/senses/a2a-entry.js +115 -0
  387. package/dist/senses/attention-queue.js +186 -0
  388. package/dist/senses/await-turn-message.js +58 -0
  389. package/dist/senses/bluebubbles/active-turns.js +216 -0
  390. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  391. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  392. package/dist/senses/bluebubbles/client.js +691 -0
  393. package/dist/senses/bluebubbles/entry.js +77 -0
  394. package/dist/senses/bluebubbles/inbound-log.js +126 -0
  395. package/dist/senses/bluebubbles/index.js +2937 -0
  396. package/dist/senses/bluebubbles/media.js +389 -0
  397. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +45 -16
  398. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +46 -6
  399. package/dist/senses/bluebubbles/outbound-state.js +304 -0
  400. package/dist/senses/bluebubbles/processed-log.js +133 -0
  401. package/dist/senses/bluebubbles/replay.js +284 -0
  402. package/dist/senses/bluebubbles/runtime-state.js +137 -0
  403. package/dist/senses/bluebubbles/session-cleanup.js +72 -0
  404. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  405. package/dist/senses/cli/bracketed-paste.js +82 -0
  406. package/dist/senses/cli/image-paste.js +287 -0
  407. package/dist/senses/cli/image-ref-navigation.js +75 -0
  408. package/dist/senses/cli/ink-app.js +156 -0
  409. package/dist/senses/cli/inline-diff.js +64 -0
  410. package/dist/senses/cli/input-keys.js +174 -0
  411. package/dist/senses/cli/kill-ring.js +86 -0
  412. package/dist/senses/cli/message-list.js +51 -0
  413. package/dist/senses/cli/ouro-tui.js +607 -0
  414. package/dist/senses/cli/spinner-imperative.js +135 -0
  415. package/dist/senses/cli/spinner.js +101 -0
  416. package/dist/senses/cli/status-line.js +60 -0
  417. package/dist/senses/cli/streaming-markdown.js +526 -0
  418. package/dist/senses/cli/tool-display.js +85 -0
  419. package/dist/senses/cli/tool-render.js +85 -0
  420. package/dist/senses/cli/tui-store.js +240 -0
  421. package/dist/senses/cli/virtual-list.js +35 -0
  422. package/dist/senses/cli-entry.js +60 -8
  423. package/dist/senses/cli-layout.js +187 -0
  424. package/dist/senses/cli.js +780 -269
  425. package/dist/senses/commands.js +66 -3
  426. package/dist/senses/context-packet-ledger.js +245 -0
  427. package/dist/senses/context-packets.js +154 -0
  428. package/dist/senses/continuity.js +94 -0
  429. package/dist/senses/habit-turn-message.js +160 -0
  430. package/dist/senses/mail-entry.js +66 -0
  431. package/dist/senses/mail.js +395 -0
  432. package/dist/senses/pipeline.js +1052 -0
  433. package/dist/senses/private-runtime-worker.js +723 -0
  434. package/dist/senses/private-runtime.js +1157 -0
  435. package/dist/senses/proactive-content-guard.js +51 -0
  436. package/dist/senses/shared-turn.js +416 -0
  437. package/dist/senses/surface-tool.js +109 -0
  438. package/dist/senses/teams-entry.js +60 -8
  439. package/dist/senses/teams.js +928 -199
  440. package/dist/senses/trust-gate.js +207 -2
  441. package/dist/senses/voice/audio-playback.js +237 -0
  442. package/dist/senses/voice/audio-routing.js +119 -0
  443. package/dist/senses/voice/elevenlabs.js +202 -0
  444. package/dist/senses/voice/floor-control.js +431 -0
  445. package/dist/senses/voice/floor-controller.js +115 -0
  446. package/dist/senses/voice/golden-path.js +116 -0
  447. package/dist/senses/voice/index.js +29 -0
  448. package/dist/senses/voice/meeting.js +113 -0
  449. package/dist/senses/voice/outbound.js +190 -0
  450. package/dist/senses/voice/phone.js +33 -0
  451. package/dist/senses/voice/playback.js +139 -0
  452. package/dist/senses/voice/realtime-eval.js +496 -0
  453. package/dist/senses/voice/realtime-trace.js +531 -0
  454. package/dist/senses/voice/transcript.js +70 -0
  455. package/dist/senses/voice/turn.js +191 -0
  456. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  457. package/dist/senses/voice/twilio-phone.js +5081 -0
  458. package/dist/senses/voice/types.js +2 -0
  459. package/dist/senses/voice/whisper.js +161 -0
  460. package/dist/senses/voice-entry.js +81 -0
  461. package/dist/senses/voice-realtime-eval-command.js +99 -0
  462. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  463. package/dist/senses/voice-twilio-entry.js +87 -0
  464. package/dist/trips/core.js +138 -0
  465. package/dist/trips/store.js +265 -0
  466. package/dist/util/frontmatter.js +69 -0
  467. package/package.json +67 -11
  468. package/skills/agent-commerce.md +113 -0
  469. package/skills/browser-navigation.md +117 -0
  470. package/skills/commerce-setup-guide.md +116 -0
  471. package/skills/commerce-setup.md +84 -0
  472. package/skills/configure-dev-tools.md +99 -0
  473. package/skills/travel-planning.md +138 -0
  474. package/AdoptionSpecialist.ouro/agent.json +0 -20
  475. package/AdoptionSpecialist.ouro/psyche/SOUL.md +0 -22
  476. package/dist/heart/daemon/specialist-orchestrator.js +0 -160
  477. package/dist/heart/daemon/specialist-prompt.js +0 -40
  478. package/dist/heart/daemon/specialist-session.js +0 -142
  479. package/dist/heart/daemon/specialist-tools.js +0 -128
  480. package/dist/heart/daemon/subagent-installer.js +0 -125
  481. package/dist/inner-worker-entry.js +0 -4
  482. package/dist/mind/friends/channel.js +0 -49
  483. package/dist/mind/friends/resolver.js +0 -84
  484. package/dist/mind/friends/store-file.js +0 -171
  485. package/dist/mind/friends/store.js +0 -4
  486. package/dist/mind/friends/tokens.js +0 -26
  487. package/dist/mind/friends/types.js +0 -21
  488. package/dist/repertoire/tasks/board.js +0 -122
  489. package/dist/repertoire/tasks/index.js +0 -210
  490. package/dist/repertoire/tasks/middleware.js +0 -65
  491. package/dist/repertoire/tasks/parser.js +0 -173
  492. package/dist/repertoire/tasks/scanner.js +0 -132
  493. package/dist/repertoire/tasks/transitions.js +0 -145
  494. package/dist/senses/bluebubbles-client.js +0 -279
  495. package/dist/senses/bluebubbles-entry.js +0 -11
  496. package/dist/senses/bluebubbles.js +0 -332
  497. package/dist/senses/inner-dialog-worker.js +0 -61
  498. package/dist/senses/inner-dialog.js +0 -231
  499. package/subagents/README.md +0 -73
  500. package/subagents/work-doer.md +0 -233
  501. package/subagents/work-merger.md +0 -624
  502. package/subagents/work-planner.md +0 -373
  503. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  504. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  505. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  506. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  507. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  508. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  509. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  510. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  511. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  512. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  513. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  514. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SENSITIVE_PATTERNS = exports.SENSITIVE_KEYS = void 0;
4
+ exports.redactMeta = redactMeta;
5
+ exports.redactString = redactString;
6
+ exports.redactLogEntry = redactLogEntry;
7
+ /**
8
+ * Lowercase key names that trigger structured redaction.
9
+ * Matched case-insensitively against meta object keys.
10
+ */
11
+ exports.SENSITIVE_KEYS = new Set([
12
+ "password",
13
+ "secret",
14
+ "token",
15
+ "accesstoken",
16
+ "refreshtoken",
17
+ "clientsecret",
18
+ "apikey",
19
+ "oauthaccesstoken",
20
+ "authorization",
21
+ "cookie",
22
+ "set-cookie",
23
+ ]);
24
+ /**
25
+ * Regex patterns for string-level fallback redaction.
26
+ * Applied in order; each match is replaced with `[REDACTED:name]`.
27
+ */
28
+ exports.SENSITIVE_PATTERNS = [
29
+ { name: "anthropic_key", pattern: /sk-ant-[A-Za-z0-9_-]+/g },
30
+ { name: "openai_key", pattern: /sk-proj-[A-Za-z0-9_-]+/g },
31
+ { name: "bearer_token", pattern: /Bearer [A-Za-z0-9\-_.]+/g },
32
+ { name: "api_key_assignment", pattern: /api[_-]?key[=:]\s*["']?[A-Za-z0-9\-_.]+/g },
33
+ { name: "url_token", pattern: /[?&](?:token|key|api_key|access_token)=[A-Za-z0-9\-_.%]+/g },
34
+ ];
35
+ /**
36
+ * Deep-clone meta and replace values at sensitive keys with `[REDACTED:key_name]`.
37
+ * Recurses into nested objects. Case-insensitive key matching.
38
+ */
39
+ function redactMeta(meta) {
40
+ const result = {};
41
+ for (const key of Object.keys(meta)) {
42
+ const value = meta[key];
43
+ if (exports.SENSITIVE_KEYS.has(key.toLowerCase())) {
44
+ result[key] = `[REDACTED:${key}]`;
45
+ }
46
+ else if (value !== null && typeof value === "object" && !Array.isArray(value)) {
47
+ result[key] = redactMeta(value);
48
+ }
49
+ else {
50
+ result[key] = value;
51
+ }
52
+ }
53
+ return result;
54
+ }
55
+ /**
56
+ * Apply all regex patterns to a string, replacing matches with `[REDACTED:pattern_name]`.
57
+ */
58
+ function redactString(text) {
59
+ let result = text;
60
+ for (const { name, pattern } of exports.SENSITIVE_PATTERNS) {
61
+ // Reset lastIndex for global regexes reused across calls
62
+ pattern.lastIndex = 0;
63
+ result = result.replace(pattern, `[REDACTED:${name}]`);
64
+ }
65
+ return result;
66
+ }
67
+ /**
68
+ * Full redaction pipeline: redact meta (structured keys), then redact message (regex patterns).
69
+ * Returns a new LogEvent -- never mutates the input.
70
+ */
71
+ function redactLogEntry(entry) {
72
+ const redactedMeta = redactMeta(entry.meta);
73
+ const redactedMessage = redactString(entry.message);
74
+ return {
75
+ ...entry,
76
+ meta: redactedMeta,
77
+ message: redactedMessage,
78
+ };
79
+ }
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const cli_1 = require("./cli");
4
+ const code = (0, cli_1.runNervesReviewCli)(process.argv.slice(2));
5
+ process.exit(code);
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.runNervesReviewCli = runNervesReviewCli;
37
+ const path = __importStar(require("node:path"));
38
+ const identity_1 = require("../../heart/identity");
39
+ const core_1 = require("./core");
40
+ function parseArgs(argv) {
41
+ const args = { process: "daemon", json: false, help: false };
42
+ for (let i = 0; i < argv.length; i++) {
43
+ const token = argv[i];
44
+ const next = argv[i + 1];
45
+ switch (token) {
46
+ case "--help":
47
+ case "-h":
48
+ args.help = true;
49
+ break;
50
+ case "--process":
51
+ if (next)
52
+ args.process = next;
53
+ i++;
54
+ break;
55
+ case "--agent":
56
+ if (next)
57
+ args.agent = next;
58
+ i++;
59
+ break;
60
+ case "--component":
61
+ if (next)
62
+ args.componentSubstring = next;
63
+ i++;
64
+ break;
65
+ case "--event":
66
+ if (next)
67
+ args.eventSubstring = next;
68
+ i++;
69
+ break;
70
+ case "--level":
71
+ if (next)
72
+ args.level = next;
73
+ i++;
74
+ break;
75
+ case "--since":
76
+ if (next)
77
+ args.since = next;
78
+ i++;
79
+ break;
80
+ case "--limit":
81
+ if (next) {
82
+ const parsed = Number.parseInt(next, 10);
83
+ if (Number.isFinite(parsed) && parsed > 0)
84
+ args.limit = parsed;
85
+ }
86
+ i++;
87
+ break;
88
+ case "--json":
89
+ args.json = true;
90
+ break;
91
+ }
92
+ }
93
+ return args;
94
+ }
95
+ function printHelp() {
96
+ // eslint-disable-next-line no-console -- meta-tooling
97
+ console.log([
98
+ "usage: ouro nerves-review [options]",
99
+ "",
100
+ "Tail the agent's nerves ndjson and filter recent events. Read-only.",
101
+ "",
102
+ "options:",
103
+ " --process <name> log stream to read (default: daemon)",
104
+ " --agent <name> agent bundle to read from (default: current)",
105
+ " --component <substr> filter by component substring (case-insensitive)",
106
+ " --event <substr> filter by event-name substring (case-insensitive)",
107
+ " --level <level> filter by exact level (debug|info|warn|error)",
108
+ " --since <duration> only events newer than e.g. 5m, 2h, 1d",
109
+ " --limit <N> cap returned events (default: 50)",
110
+ " --json output one JSON object per line",
111
+ ].join("\n"));
112
+ }
113
+ function runNervesReviewCli(argv) {
114
+ const args = parseArgs(argv);
115
+ if (args.help) {
116
+ printHelp();
117
+ return 0;
118
+ }
119
+ let sinceMs;
120
+ if (args.since) {
121
+ const parsed = (0, core_1.parseDuration)(args.since);
122
+ if (parsed === null) {
123
+ // eslint-disable-next-line no-console -- meta-tooling
124
+ console.error(`nerves-review: --since '${args.since}' is not a valid duration (e.g. 5m, 2h, 1d)`);
125
+ return 2;
126
+ }
127
+ sinceMs = parsed;
128
+ }
129
+ const logsDir = (0, identity_1.getAgentDaemonLogsDir)(args.agent);
130
+ const filePath = path.join(logsDir, `${args.process}.ndjson`);
131
+ const filter = {
132
+ componentSubstring: args.componentSubstring,
133
+ eventSubstring: args.eventSubstring,
134
+ level: args.level,
135
+ sinceMs,
136
+ limit: args.limit,
137
+ nowMs: Date.now(),
138
+ };
139
+ const entries = (0, core_1.reviewNerveEvents)(filePath, filter);
140
+ if (entries.length === 0) {
141
+ // eslint-disable-next-line no-console -- meta-tooling
142
+ console.log(`(no matching nerves events in ${filePath})`);
143
+ return 0;
144
+ }
145
+ for (const entry of entries) {
146
+ if (args.json) {
147
+ // eslint-disable-next-line no-console -- meta-tooling
148
+ console.log(entry.raw);
149
+ }
150
+ else {
151
+ // eslint-disable-next-line no-console -- meta-tooling
152
+ console.log((0, core_1.formatNerveEntry)(entry));
153
+ }
154
+ }
155
+ return 0;
156
+ }
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.parseDuration = parseDuration;
37
+ exports.reviewNerveEvents = reviewNerveEvents;
38
+ exports.formatNerveEntry = formatNerveEntry;
39
+ const fs = __importStar(require("node:fs"));
40
+ const DURATION_PATTERN = /^(\d+(?:\.\d+)?)(ms|s|m|h|d)$/;
41
+ function parseDuration(value) {
42
+ const match = DURATION_PATTERN.exec(value.trim().toLowerCase());
43
+ if (!match)
44
+ return null;
45
+ const amount = Number.parseFloat(match[1]);
46
+ if (!Number.isFinite(amount) || amount < 0)
47
+ return null;
48
+ switch (match[2]) {
49
+ case "ms": return amount;
50
+ case "s": return amount * 1_000;
51
+ case "m": return amount * 60_000;
52
+ case "h": return amount * 3_600_000;
53
+ case "d": return amount * 86_400_000;
54
+ /* v8 ignore start -- exhaustive switch over the regex group; unreachable */
55
+ default: return null;
56
+ /* v8 ignore stop */
57
+ }
58
+ }
59
+ function entryTimeMs(parsed) {
60
+ if (!parsed)
61
+ return null;
62
+ const time = parsed.time;
63
+ if (typeof time === "string") {
64
+ const ms = Date.parse(time);
65
+ return Number.isFinite(ms) ? ms : null;
66
+ }
67
+ return null;
68
+ }
69
+ function readLastNLines(filePath, maxLines, maxBytes = 8 * 1024 * 1024) {
70
+ let text;
71
+ try {
72
+ const stat = fs.statSync(filePath);
73
+ if (stat.size > maxBytes) {
74
+ const fd = fs.openSync(filePath, "r");
75
+ try {
76
+ const buf = Buffer.alloc(maxBytes);
77
+ fs.readSync(fd, buf, 0, maxBytes, stat.size - maxBytes);
78
+ text = buf.toString("utf-8");
79
+ }
80
+ finally {
81
+ fs.closeSync(fd);
82
+ }
83
+ }
84
+ else {
85
+ text = fs.readFileSync(filePath, "utf-8");
86
+ }
87
+ }
88
+ catch {
89
+ return [];
90
+ }
91
+ const lines = text.split("\n").filter((line) => line.length > 0);
92
+ return lines.slice(-maxLines);
93
+ }
94
+ function reviewNerveEvents(filePath, filter = {}) {
95
+ const limit = filter.limit ?? 50;
96
+ const candidateLineCount = Math.max(limit * 4, 200);
97
+ const lines = readLastNLines(filePath, candidateLineCount);
98
+ const cutoffMs = filter.sinceMs !== undefined && filter.nowMs !== undefined
99
+ ? filter.nowMs - filter.sinceMs
100
+ : null;
101
+ const matched = [];
102
+ for (let i = lines.length - 1; i >= 0; i--) {
103
+ const raw = lines[i];
104
+ let parsed = null;
105
+ try {
106
+ const value = JSON.parse(raw);
107
+ if (value && typeof value === "object" && !Array.isArray(value)) {
108
+ parsed = value;
109
+ }
110
+ }
111
+ catch {
112
+ parsed = null;
113
+ }
114
+ if (!parsed)
115
+ continue;
116
+ if (filter.componentSubstring) {
117
+ const component = String(parsed.component ?? "");
118
+ if (!component.toLowerCase().includes(filter.componentSubstring.toLowerCase()))
119
+ continue;
120
+ }
121
+ if (filter.eventSubstring) {
122
+ const event = String(parsed.event ?? "");
123
+ if (!event.toLowerCase().includes(filter.eventSubstring.toLowerCase()))
124
+ continue;
125
+ }
126
+ if (filter.level) {
127
+ const level = String(parsed.level ?? "info");
128
+ if (level !== filter.level)
129
+ continue;
130
+ }
131
+ if (cutoffMs !== null) {
132
+ const eventMs = entryTimeMs(parsed);
133
+ if (eventMs === null || eventMs < cutoffMs)
134
+ continue;
135
+ }
136
+ matched.push({ raw, parsed });
137
+ if (matched.length >= limit)
138
+ break;
139
+ }
140
+ return matched.reverse();
141
+ }
142
+ function formatNerveEntry(entry) {
143
+ const parsed = entry.parsed;
144
+ if (!parsed)
145
+ return entry.raw;
146
+ const time = String(parsed.time ?? "");
147
+ const level = String(parsed.level ?? "info");
148
+ const component = String(parsed.component ?? "?");
149
+ const event = String(parsed.event ?? "?");
150
+ const message = String(parsed.message ?? "");
151
+ return `${time} [${level.padEnd(5)}] ${component}/${event} — ${message}`;
152
+ }
@@ -6,7 +6,11 @@ const index_1 = require("./index");
6
6
  let runtimeLogger = null;
7
7
  function getRuntimeLogger() {
8
8
  if (!runtimeLogger) {
9
- runtimeLogger = (0, index_1.createLogger)({ level: "info" });
9
+ // Default logger has no sinks — events emitted before the real logger is
10
+ // configured (e.g. identity resolution during startup) are silently dropped.
11
+ // This prevents INFO lines from leaking to stderr and interleaving with
12
+ // the CLI spinner when the ouro subprocess hasn't configured its logger yet.
13
+ runtimeLogger = (0, index_1.createLogger)({ level: "info", sinks: [] });
10
14
  }
11
15
  return runtimeLogger;
12
16
  }
@@ -9,6 +9,7 @@ exports.discoverOrganizations = discoverOrganizations;
9
9
  exports.discoverProjects = discoverProjects;
10
10
  const api_error_1 = require("../heart/api-error");
11
11
  const runtime_1 = require("../nerves/runtime");
12
+ const api_client_1 = require("./api-client");
12
13
  const ADO_BASE = "https://dev.azure.com";
13
14
  const VSSPS_BASE = "https://app.vssps.visualstudio.com";
14
15
  const DEFAULT_API_VERSION = "api-version=7.1";
@@ -28,62 +29,22 @@ function resolveContentType(method, path) {
28
29
  : "application/json";
29
30
  }
30
31
  // Generic ADO API request. Returns response body as pretty-printed JSON string.
31
- async function adoRequest(token, method, org, path, body) {
32
- try {
33
- (0, runtime_1.emitNervesEvent)({
34
- event: "client.request_start",
35
- component: "clients",
36
- message: "starting ADO request",
37
- meta: { client: "ado", method, org, path },
38
- });
39
- const fullPath = ensureApiVersion(path);
40
- const url = `${ADO_BASE}/${org}${fullPath}`;
41
- const contentType = resolveContentType(method, path);
42
- const opts = {
43
- method,
44
- headers: {
45
- Authorization: `Bearer ${token}`,
46
- "Content-Type": contentType,
47
- },
48
- };
49
- if (body)
50
- opts.body = body;
51
- const res = await fetch(url, opts);
52
- if (!res.ok) {
53
- (0, runtime_1.emitNervesEvent)({
54
- level: "error",
55
- event: "client.error",
56
- component: "clients",
57
- message: "ADO request failed",
58
- meta: { client: "ado", method, org, path, status: res.status },
59
- });
60
- return (0, api_error_1.handleApiError)(res, "ADO", "ado");
61
- }
62
- const data = await res.json();
63
- (0, runtime_1.emitNervesEvent)({
64
- event: "client.request_end",
65
- component: "clients",
66
- message: "ADO request completed",
67
- meta: { client: "ado", method, org, path, success: true },
68
- });
69
- return JSON.stringify(data, null, 2);
70
- }
71
- catch (err) {
72
- (0, runtime_1.emitNervesEvent)({
73
- level: "error",
74
- event: "client.error",
75
- component: "clients",
76
- message: "ADO request threw exception",
77
- meta: {
78
- client: "ado",
79
- method,
80
- org,
81
- path,
82
- reason: err instanceof Error ? err.message : String(err),
83
- },
84
- });
85
- return (0, api_error_1.handleApiError)(err, "ADO", "ado");
86
- }
32
+ // `host` overrides the base URL for non-standard APIs (e.g. "vsapm.dev.azure.com", "vssps.dev.azure.com").
33
+ async function adoRequest(token, method, org, path, body, host) {
34
+ const base = host ? `https://${host}/${org}` : `${ADO_BASE}/${org}`;
35
+ const fullPath = ensureApiVersion(path);
36
+ return (0, api_client_1.apiRequest)({
37
+ baseUrl: base,
38
+ method,
39
+ path: fullPath,
40
+ token,
41
+ clientName: "ado",
42
+ serviceLabel: "ADO",
43
+ connectionName: "ado",
44
+ body,
45
+ contentType: resolveContentType(method, path),
46
+ eventMeta: { org },
47
+ });
87
48
  }
88
49
  // Backward-compatible thin wrapper: runs WIQL query and returns formatted work items.
89
50
  async function queryWorkItems(token, org, query) {
@@ -221,7 +221,7 @@ exports.adoSemanticToolDefinitions = [
221
221
  type: "function",
222
222
  function: {
223
223
  name: "ado_backlog_list",
224
- description: "Query the backlog and return enriched work items with hierarchy, type, parent, assignee, area path, and iteration. Supports filtering. Use this instead of raw WIQL queries.",
224
+ description: "Query the backlog and return enriched work items with hierarchy, type, parent, assignee, area path, and iteration. Supports filtering. Use this instead of raw WIQL queries. Provides enriched results with hierarchy.",
225
225
  parameters: {
226
226
  type: "object",
227
227
  properties: {
@@ -279,6 +279,7 @@ exports.adoSemanticToolDefinitions = [
279
279
  return formatForChannel(items, ctx, organization, project);
280
280
  },
281
281
  integration: "ado",
282
+ summaryKeys: ["organization", "project"],
282
283
  },
283
284
  // -- ado_create_epic --
284
285
  {
@@ -286,7 +287,7 @@ exports.adoSemanticToolDefinitions = [
286
287
  type: "function",
287
288
  function: {
288
289
  name: "ado_create_epic",
289
- description: "Create an epic in Azure DevOps with title, description, area path, and optional parent.",
290
+ description: "Create an epic in Azure DevOps with title, description, area path, and optional parent. Use ado_preview_changes first to dry-run the operation.",
290
291
  parameters: {
291
292
  type: "object",
292
293
  properties: {
@@ -317,7 +318,8 @@ exports.adoSemanticToolDefinitions = [
317
318
  return result;
318
319
  },
319
320
  integration: "ado",
320
- confirmationRequired: true,
321
+ summaryKeys: ["organization", "project", "title"],
322
+ riskProfile: { mutates: "external_side_effect", risk: "high", reason: "creates an Azure DevOps epic" },
321
323
  },
322
324
  // -- ado_create_issue --
323
325
  {
@@ -325,7 +327,7 @@ exports.adoSemanticToolDefinitions = [
325
327
  type: "function",
326
328
  function: {
327
329
  name: "ado_create_issue",
328
- description: "Create an issue or user story in Azure DevOps with title, description, area path, and parent epic.",
330
+ description: "Create an issue or user story in Azure DevOps with title, description, area path, and parent epic. Use ado_preview_changes first to dry-run the operation.",
329
331
  parameters: {
330
332
  type: "object",
331
333
  properties: {
@@ -358,7 +360,8 @@ exports.adoSemanticToolDefinitions = [
358
360
  return result;
359
361
  },
360
362
  integration: "ado",
361
- confirmationRequired: true,
363
+ summaryKeys: ["organization", "project", "title"],
364
+ riskProfile: { mutates: "external_side_effect", risk: "high", reason: "creates an Azure DevOps work item" },
362
365
  },
363
366
  // -- ado_move_items --
364
367
  {
@@ -366,7 +369,7 @@ exports.adoSemanticToolDefinitions = [
366
369
  type: "function",
367
370
  function: {
368
371
  name: "ado_move_items",
369
- description: "Reparent work items -- move them to a new parent epic or feature.",
372
+ description: "Reparent work items -- move them to a new parent epic or feature. Use ado_preview_changes first. These mutations affect real work items.",
370
373
  parameters: {
371
374
  type: "object",
372
375
  properties: {
@@ -412,7 +415,8 @@ exports.adoSemanticToolDefinitions = [
412
415
  return JSON.stringify({ moved, errors, organization: adoCtx.organization, project: adoCtx.project });
413
416
  },
414
417
  integration: "ado",
415
- confirmationRequired: true,
418
+ summaryKeys: ["organization", "project", "workItemIds"],
419
+ riskProfile: { mutates: "external_side_effect", risk: "high", reason: "reparents Azure DevOps work items" },
416
420
  },
417
421
  // -- ado_restructure_backlog --
418
422
  {
@@ -420,7 +424,7 @@ exports.adoSemanticToolDefinitions = [
420
424
  type: "function",
421
425
  function: {
422
426
  name: "ado_restructure_backlog",
423
- description: "Bulk restructure: reparent multiple work items in a single logical operation.",
427
+ description: "Bulk restructure: reparent multiple work items in a single logical operation. Use ado_preview_changes first. These mutations affect real work items.",
424
428
  parameters: {
425
429
  type: "object",
426
430
  properties: {
@@ -470,7 +474,8 @@ exports.adoSemanticToolDefinitions = [
470
474
  return JSON.stringify({ results, organization: adoCtx.organization, project: adoCtx.project });
471
475
  },
472
476
  integration: "ado",
473
- confirmationRequired: true,
477
+ summaryKeys: ["organization", "project"],
478
+ riskProfile: { mutates: "external_side_effect", risk: "high", reason: "bulk-reparents Azure DevOps work items" },
474
479
  },
475
480
  // -- ado_validate_structure --
476
481
  {
@@ -671,7 +676,8 @@ exports.adoSemanticToolDefinitions = [
671
676
  return JSON.stringify({ results, organization: adoCtx.organization, project: adoCtx.project });
672
677
  },
673
678
  integration: "ado",
674
- confirmationRequired: true,
679
+ summaryKeys: ["organization", "project"],
680
+ riskProfile: { mutates: "external_side_effect", risk: "high", reason: "executes Azure DevOps batch mutations" },
675
681
  },
676
682
  // -- ado_detect_orphans --
677
683
  {