@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,160 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildHabitTurnMessage = buildHabitTurnMessage;
4
+ const runtime_1 = require("../nerves/runtime");
5
+ const PRIOR_SESSION_SUMMARY_LIMIT = 1600;
6
+ const PRIOR_SESSION_TRUNCATION_SUFFIX = "\n[truncated]";
7
+ function formatElapsed(ms) {
8
+ const minutes = Math.floor(ms / 60000);
9
+ if (minutes < 60) {
10
+ return `${minutes} ${minutes === 1 ? "minute" : "minutes"}`;
11
+ }
12
+ const hours = Math.floor(minutes / 60);
13
+ return `${hours} ${hours === 1 ? "hour" : "hours"}`;
14
+ }
15
+ function buildHabitTurnMessage(options) {
16
+ const { habitName, habitTitle, habitBody, lastRun, checkpoint, alsoDue, staleObligations, parseErrors, degradedComponents, arcResume, deskOrientation, surfacePolicy, priorSessionSummary, now, } = options;
17
+ const hasBody = habitBody !== undefined && habitBody !== "";
18
+ const leadingSections = buildLeadingSections(arcResume, deskOrientation, surfacePolicy, priorSessionSummary);
19
+ // First beat: lastRun is null
20
+ if (lastRun === null) {
21
+ // Cold start: no checkpoint, no body — bare awareness
22
+ if (!checkpoint && !hasBody) {
23
+ (0, runtime_1.emitNervesEvent)({
24
+ component: "senses",
25
+ event: "senses.habit_turn_message_built",
26
+ message: "habit turn message built (cold start)",
27
+ meta: { habitName, coldStart: true },
28
+ });
29
+ return joinSections(leadingSections, ["...time passing. anything stirring?"]);
30
+ }
31
+ if (!hasBody) {
32
+ // First beat with no body: nudge
33
+ const sections = [
34
+ `your ${habitTitle} fired but has no instructions \u2014 add a body to \`habits/${habitName}.md\``,
35
+ ];
36
+ appendTrailingExtras(sections, alsoDue, staleObligations, parseErrors, degradedComponents);
37
+ (0, runtime_1.emitNervesEvent)({
38
+ component: "senses",
39
+ event: "senses.habit_turn_message_built",
40
+ message: "habit turn message built (first beat, no body)",
41
+ meta: { habitName, firstBeat: true, hasBody: false },
42
+ });
43
+ return joinSections(leadingSections, sections);
44
+ }
45
+ const sections = [
46
+ `your ${habitTitle} is alive. this is its first breath.`,
47
+ habitBody,
48
+ ];
49
+ appendTrailingExtras(sections, alsoDue, staleObligations, parseErrors, degradedComponents);
50
+ (0, runtime_1.emitNervesEvent)({
51
+ component: "senses",
52
+ event: "senses.habit_turn_message_built",
53
+ message: "habit turn message built (first beat)",
54
+ meta: { habitName, firstBeat: true },
55
+ });
56
+ return joinSections(leadingSections, sections);
57
+ }
58
+ // Normal turn
59
+ const sections = [];
60
+ // 1. Checkpoint
61
+ if (checkpoint) {
62
+ sections.push(`you were thinking about ${checkpoint}.`);
63
+ }
64
+ // 2. Elapsed time
65
+ const nowMs = now().getTime();
66
+ const lastRunMs = new Date(lastRun).getTime();
67
+ const elapsed = nowMs - lastRunMs;
68
+ sections.push(`${formatElapsed(elapsed)} have passed.`);
69
+ // 3. Body or no-body nudge
70
+ if (hasBody) {
71
+ sections.push(habitBody);
72
+ }
73
+ else {
74
+ sections.push(`your ${habitTitle} fired but has no instructions \u2014 add a body to \`habits/${habitName}.md\``);
75
+ }
76
+ // 4-7. Trailing extras
77
+ appendTrailingExtras(sections, alsoDue, staleObligations, parseErrors, degradedComponents);
78
+ (0, runtime_1.emitNervesEvent)({
79
+ component: "senses",
80
+ event: "senses.habit_turn_message_built",
81
+ message: "habit turn message built",
82
+ meta: {
83
+ habitName,
84
+ hasCheckpoint: !!checkpoint,
85
+ hasBody: hasBody,
86
+ staleObligationCount: staleObligations.length,
87
+ },
88
+ });
89
+ return joinSections(leadingSections, sections);
90
+ }
91
+ function buildLeadingSections(arcResume, deskOrientation, surfacePolicy, priorSessionSummary) {
92
+ const sections = [];
93
+ if (arcResume?.trim())
94
+ sections.push(arcResume.trim());
95
+ if (deskOrientation?.trim())
96
+ sections.push(deskOrientation.trim());
97
+ if (surfacePolicy?.trim())
98
+ sections.push(surfacePolicy.trim());
99
+ const priorSummary = buildPriorSessionSummarySection(priorSessionSummary);
100
+ if (priorSummary)
101
+ sections.push(priorSummary);
102
+ return sections;
103
+ }
104
+ function joinSections(leadingSections, sections) {
105
+ return [...leadingSections, ...sections].filter((section) => section.trim().length > 0).join("\n\n");
106
+ }
107
+ function truncatePriorSummary(summary) {
108
+ if (summary.length <= PRIOR_SESSION_SUMMARY_LIMIT)
109
+ return summary;
110
+ return `${summary.slice(0, PRIOR_SESSION_SUMMARY_LIMIT - PRIOR_SESSION_TRUNCATION_SUFFIX.length)}${PRIOR_SESSION_TRUNCATION_SUFFIX}`;
111
+ }
112
+ function buildPriorSessionSummarySection(priorSessionSummary) {
113
+ if (!priorSessionSummary || priorSessionSummary.mode !== "stateful")
114
+ return null;
115
+ const lines = ["## Prior habit session summary"];
116
+ const summary = priorSessionSummary.summary?.trim();
117
+ if (summary) {
118
+ lines.push(truncatePriorSummary(summary));
119
+ }
120
+ else {
121
+ lines.push("No prior stateful habit summary found for this operation.");
122
+ }
123
+ const sourceLines = ["receipt", "session", "pending", "runtimeState"]
124
+ .flatMap((key) => {
125
+ const value = cleanSourceLocator(priorSessionSummary.sources[key]);
126
+ return value ? [`${key}: ${value}`] : [];
127
+ });
128
+ if (sourceLines.length > 0)
129
+ lines.push(...sourceLines);
130
+ if (priorSessionSummary.warnings.length > 0)
131
+ lines.push(`warnings: ${priorSessionSummary.warnings.join("; ")}`);
132
+ return lines.join("\n");
133
+ }
134
+ function cleanSourceLocator(value) {
135
+ if (typeof value !== "string")
136
+ return null;
137
+ const trimmed = value.trim();
138
+ return trimmed.length > 0 ? trimmed : null;
139
+ }
140
+ function appendTrailingExtras(sections, alsoDue, staleObligations, parseErrors, degradedComponents) {
141
+ // 4. Also-due
142
+ if (alsoDue) {
143
+ sections.push(alsoDue);
144
+ }
145
+ // 5. Stale obligations
146
+ if (staleObligations.length > 0) {
147
+ const lines = staleObligations.map((o) => `[internal] obligation: ${o.friendName} — waiting ${formatElapsed(o.stalenessMs)}`);
148
+ sections.push(lines.join("\n"));
149
+ }
150
+ // 6. Parse errors
151
+ if (parseErrors.length > 0) {
152
+ const lines = parseErrors.map((e) => `I noticed my habit file \`${e.file}\` has invalid frontmatter \u2014 I should fix it. (${e.error})`);
153
+ sections.push(lines.join("\n"));
154
+ }
155
+ // 7. Degraded state
156
+ if (degradedComponents.length > 0) {
157
+ const reasons = degradedComponents.map((d) => `${d.component}: ${d.reason}`).join("; ");
158
+ sections.push(`[note: my scheduling is degraded: ${reasons}]`);
159
+ }
160
+ }
@@ -0,0 +1,66 @@
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
+ const agentArgIndex = process.argv.indexOf("--agent");
37
+ const agentName = agentArgIndex >= 0 ? process.argv[agentArgIndex + 1] : undefined;
38
+ if (!agentName) {
39
+ // eslint-disable-next-line no-console -- pre-boot guard: --agent check before imports
40
+ console.error("Missing required --agent <name> argument.\nUsage: node dist/senses/mail-entry.js --agent ouroboros");
41
+ process.exit(1);
42
+ }
43
+ const runtime_logging_1 = require("../heart/daemon/runtime-logging");
44
+ const runtime_1 = require("../nerves/runtime");
45
+ (0, runtime_logging_1.configureDaemonRuntimeLogger)("mail");
46
+ (0, runtime_1.emitNervesEvent)({
47
+ component: "senses",
48
+ event: "senses.entry_boot",
49
+ message: "booting Mail entrypoint",
50
+ meta: { entry: "mail", agentName },
51
+ });
52
+ Promise.resolve().then(() => __importStar(require("./mail"))).then(async ({ startMailSenseApp }) => {
53
+ await startMailSenseApp({ agentName });
54
+ })
55
+ .catch((error) => {
56
+ (0, runtime_1.emitNervesEvent)({
57
+ level: "error",
58
+ component: "senses",
59
+ event: "senses.entry_error",
60
+ message: "Mail entrypoint failed",
61
+ meta: { entry: "mail", agentName, error: error instanceof Error ? error.message : String(error) },
62
+ });
63
+ // eslint-disable-next-line no-console -- fatal startup guard for sense process
64
+ console.error(error instanceof Error ? error.message : String(error));
65
+ process.exit(1);
66
+ });
@@ -0,0 +1,395 @@
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.scanMailImportDiscoveryAttention = scanMailImportDiscoveryAttention;
37
+ exports.startMailSenseApp = startMailSenseApp;
38
+ const fs = __importStar(require("node:fs"));
39
+ const path = __importStar(require("node:path"));
40
+ const runtime_1 = require("../nerves/runtime");
41
+ const identity_1 = require("../heart/identity");
42
+ const runtime_credentials_1 = require("../heart/runtime-credentials");
43
+ const pending_1 = require("../mind/pending");
44
+ const socket_client_1 = require("../heart/daemon/socket-client");
45
+ const background_operations_1 = require("../heart/background-operations");
46
+ const mail_import_discovery_1 = require("../heart/mail-import-discovery");
47
+ const attention_1 = require("../mailroom/attention");
48
+ const reader_1 = require("../mailroom/reader");
49
+ const smtp_ingress_1 = require("../mailroom/smtp-ingress");
50
+ function readRegistry(registryPath) {
51
+ return JSON.parse(fs.readFileSync(registryPath, "utf-8"));
52
+ }
53
+ function validPort(value) {
54
+ return typeof value === "number" && Number.isInteger(value) && value >= 0 && value <= 65535 ? value : 0;
55
+ }
56
+ function serverAddress(server) {
57
+ const direct = server;
58
+ if (typeof direct.address === "function")
59
+ return direct.address();
60
+ const wrapped = server;
61
+ if (typeof wrapped.server?.address === "function")
62
+ return wrapped.server.address();
63
+ return null;
64
+ }
65
+ function serverPort(server) {
66
+ const address = serverAddress(server);
67
+ if (!address || typeof address !== "object")
68
+ return null;
69
+ return typeof address.port === "number" ? address.port : null;
70
+ }
71
+ function listeningServer(server) {
72
+ const wrapped = server;
73
+ if (typeof wrapped.server?.once === "function")
74
+ return wrapped.server;
75
+ const direct = server;
76
+ return typeof direct.once === "function" ? direct : null;
77
+ }
78
+ function waitForListening(server) {
79
+ if (serverAddress(server))
80
+ return Promise.resolve();
81
+ const listening = listeningServer(server);
82
+ if (!listening)
83
+ return new Promise((resolve) => setImmediate(resolve));
84
+ if (listening.listening)
85
+ return Promise.resolve();
86
+ return new Promise((resolve) => listening.once?.("listening", resolve));
87
+ }
88
+ function runtimeStatePath(agentName) {
89
+ return path.join((0, identity_1.getAgentRoot)(agentName), "state", "senses", "mail", "runtime.json");
90
+ }
91
+ function attentionStatePath(agentName) {
92
+ return path.join((0, identity_1.getAgentRoot)(agentName), "state", "senses", "mail", "attention.json");
93
+ }
94
+ function importDiscoveryStatePath(agentName) {
95
+ return path.join((0, identity_1.getAgentRoot)(agentName), "state", "senses", "mail", "import-discovery.json");
96
+ }
97
+ function writeRuntimeState(filePath, state) {
98
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
99
+ fs.writeFileSync(filePath, `${JSON.stringify(state, null, 2)}\n`, "utf-8");
100
+ (0, runtime_1.emitNervesEvent)({
101
+ component: "senses",
102
+ event: "senses.mail_sense_runtime_state_written",
103
+ message: "mail sense runtime state written",
104
+ meta: { agentName: state.agentName, status: state.status, lastQueuedCount: state.lastQueuedCount },
105
+ });
106
+ }
107
+ function emptyImportDiscoveryState(updatedAt) {
108
+ return {
109
+ schemaVersion: 1,
110
+ lastNotifiedFingerprint: null,
111
+ updatedAt,
112
+ };
113
+ }
114
+ function readImportDiscoveryState(filePath, updatedAt) {
115
+ try {
116
+ const parsed = JSON.parse(fs.readFileSync(filePath, "utf-8"));
117
+ return {
118
+ schemaVersion: 1,
119
+ lastNotifiedFingerprint: typeof parsed.lastNotifiedFingerprint === "string" && parsed.lastNotifiedFingerprint.trim().length > 0
120
+ ? parsed.lastNotifiedFingerprint
121
+ : null,
122
+ updatedAt: typeof parsed.updatedAt === "string" ? parsed.updatedAt : updatedAt,
123
+ };
124
+ }
125
+ catch {
126
+ return emptyImportDiscoveryState(updatedAt);
127
+ }
128
+ }
129
+ function writeImportDiscoveryState(filePath, state) {
130
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
131
+ fs.writeFileSync(filePath, `${JSON.stringify(state, null, 2)}\n`, "utf-8");
132
+ }
133
+ function stringArray(value) {
134
+ if (!Array.isArray(value))
135
+ return [];
136
+ return value.filter((entry) => typeof entry === "string" && entry.trim().length > 0);
137
+ }
138
+ function candidateDescriptors(value) {
139
+ if (!Array.isArray(value))
140
+ return [];
141
+ return value
142
+ .filter((entry) => !!entry && typeof entry === "object" && !Array.isArray(entry))
143
+ .map((entry) => ({
144
+ path: typeof entry.path === "string" ? entry.path : "",
145
+ originKind: typeof entry.originKind === "string" ? entry.originKind : undefined,
146
+ originLabel: typeof entry.originLabel === "string" ? entry.originLabel : undefined,
147
+ }))
148
+ .filter((entry) => entry.path.trim().length > 0);
149
+ }
150
+ function renderImportDiscoveryContent(candidatePaths, descriptors) {
151
+ const renderedCandidates = descriptors.length > 0
152
+ ? descriptors.map((descriptor) => `- [${descriptor.originLabel ?? descriptor.originKind ?? "filesystem"}] ${descriptor.path}`)
153
+ : candidatePaths.map((candidatePath) => `- ${candidatePath}`);
154
+ return [
155
+ "[Mail Import Ready]",
156
+ "A local MBOX archive is ready for delegated-mail backfill.",
157
+ "This may live in a worktree-local Playwright sandbox rather than ~/Downloads.",
158
+ "",
159
+ "recent candidates:",
160
+ ...renderedCandidates,
161
+ "",
162
+ "If this matches an expected mailbox backfill, run `ouro mail import-mbox --discover --owner-email <email> --source hey --agent <agent>` first so Ouro can pick the matching archive or report ambiguity.",
163
+ ].join("\n");
164
+ }
165
+ function buildMailImportDiscoveryPrivateWakeOptions(input) {
166
+ return {
167
+ reason: "mail import discovery private attention",
168
+ triggerSource: "mail-import-discovery",
169
+ budgetClass: "interactive",
170
+ idempotencyKey: `mail-import-discovery:${input.agentName}:${input.fingerprint}`,
171
+ originRefs: [
172
+ { kind: "mail-import-discovery", id: input.fingerprint },
173
+ ...input.candidatePaths.map((candidatePath) => ({ kind: "mail-import-candidate", id: candidatePath })),
174
+ ],
175
+ };
176
+ }
177
+ async function scanMailImportDiscoveryAttention(input) {
178
+ const nowMs = input.now?.() ?? Date.now();
179
+ const updatedAt = new Date(nowMs).toISOString();
180
+ const statePath = input.statePath ?? importDiscoveryStatePath(input.agentName);
181
+ const pendingDir = input.pendingDir ?? (0, pending_1.getPrivateRuntimePendingDir)(input.agentName);
182
+ const state = readImportDiscoveryState(statePath, updatedAt);
183
+ const existingOperations = (0, background_operations_1.listBackgroundOperations)({
184
+ agentName: input.agentName,
185
+ agentRoot: (0, identity_1.getAgentRoot)(input.agentName),
186
+ limit: 10,
187
+ });
188
+ const discovered = (0, mail_import_discovery_1.listAmbientMailImportOperations)({
189
+ agentName: input.agentName,
190
+ agentRoot: (0, identity_1.getAgentRoot)(input.agentName),
191
+ existingOperations,
192
+ repoRoot: (0, identity_1.getRepoRoot)(),
193
+ homeDir: process.env.HOME,
194
+ nowMs,
195
+ })[0] ?? null;
196
+ const fingerprint = typeof discovered?.spec?.fingerprint === "string" && discovered.spec.fingerprint.trim().length > 0
197
+ ? discovered.spec.fingerprint
198
+ : null;
199
+ const candidatePaths = stringArray(discovered?.spec?.candidatePaths);
200
+ const descriptors = candidateDescriptors(discovered?.spec?.candidateDescriptors);
201
+ const shouldQueue = Boolean(discovered && fingerprint && fingerprint !== state.lastNotifiedFingerprint);
202
+ if (shouldQueue && fingerprint) {
203
+ (0, pending_1.queuePendingMessage)(pendingDir, {
204
+ from: "mailroom",
205
+ friendId: "self",
206
+ channel: "mail",
207
+ key: "import-ready",
208
+ content: renderImportDiscoveryContent(candidatePaths, descriptors),
209
+ timestamp: nowMs,
210
+ mode: "reflect",
211
+ });
212
+ await (0, socket_client_1.requestPrivateWake)(input.agentName, undefined, buildMailImportDiscoveryPrivateWakeOptions({
213
+ agentName: input.agentName,
214
+ fingerprint,
215
+ candidatePaths,
216
+ })).catch(() => undefined);
217
+ }
218
+ writeImportDiscoveryState(statePath, {
219
+ schemaVersion: 1,
220
+ lastNotifiedFingerprint: shouldQueue ? fingerprint : state.lastNotifiedFingerprint,
221
+ updatedAt,
222
+ });
223
+ (0, runtime_1.emitNervesEvent)({
224
+ component: "senses",
225
+ event: "senses.mail_import_discovery_scanned",
226
+ message: "mail import discovery scanned",
227
+ meta: {
228
+ agentName: input.agentName,
229
+ queued: shouldQueue,
230
+ candidateCount: candidatePaths.length,
231
+ fingerprint,
232
+ },
233
+ });
234
+ return {
235
+ queued: shouldQueue,
236
+ fingerprint,
237
+ candidatePaths,
238
+ };
239
+ }
240
+ function closeServer(server) {
241
+ return new Promise((resolve) => {
242
+ server.close(resolve);
243
+ });
244
+ }
245
+ async function startMailSenseApp(options) {
246
+ const now = options.now ?? (() => Date.now());
247
+ /* v8 ignore next -- production wiring uses the default vault refresh; tests inject a deterministic refresh. @preserve */
248
+ const refreshRuntime = options.refreshRuntime ?? runtime_credentials_1.refreshRuntimeCredentialConfig;
249
+ await refreshRuntime(options.agentName, { preserveCachedOnFailure: true }).catch(() => undefined);
250
+ const resolved = options.resolveReader
251
+ ? options.resolveReader(options.agentName)
252
+ : (0, reader_1.resolveMailroomReader)(options.agentName);
253
+ if (!resolved.ok) {
254
+ throw new Error(resolved.error);
255
+ }
256
+ const hostedReaderOnly = resolved.storeKind === "azure-blob" && !resolved.config.registryPath;
257
+ if (!resolved.config.registryPath && !hostedReaderOnly) {
258
+ throw new Error(`missing mailroom.registryPath for ${options.agentName}; agent-runnable repair: 'ouro connect mail --agent ${options.agentName}'`);
259
+ }
260
+ const host = resolved.config.host ?? "127.0.0.1";
261
+ const ingress = hostedReaderOnly
262
+ ? null
263
+ : (options.startIngress ?? smtp_ingress_1.startMailroomIngress)({
264
+ registry: readRegistry(resolved.config.registryPath),
265
+ store: resolved.store,
266
+ smtpPort: validPort(resolved.config.smtpPort),
267
+ httpPort: validPort(resolved.config.httpPort),
268
+ host,
269
+ });
270
+ if (ingress) {
271
+ await Promise.all([
272
+ waitForListening(ingress.smtp),
273
+ waitForListening(ingress.health),
274
+ ]);
275
+ }
276
+ const activeSmtpPort = () => ingress ? serverPort(ingress.smtp) : null;
277
+ const activeHttpPort = () => ingress ? serverPort(ingress.health) : null;
278
+ const runtimePath = runtimeStatePath(options.agentName);
279
+ const attentionPath = attentionStatePath(options.agentName);
280
+ const importDiscoveryPath = importDiscoveryStatePath(options.agentName);
281
+ let lastScanAt = null;
282
+ let lastQueuedCount = 0;
283
+ const scan = async () => {
284
+ const scanStartedAt = new Date(now()).toISOString();
285
+ let queuedCount = 0;
286
+ try {
287
+ const screener = await (0, attention_1.scanMailScreenerAttention)({
288
+ agentName: options.agentName,
289
+ store: resolved.store,
290
+ pendingDir: (0, pending_1.getPrivateRuntimePendingDir)(options.agentName),
291
+ statePath: attentionPath,
292
+ now,
293
+ });
294
+ queuedCount += screener.queued.length;
295
+ }
296
+ catch (error) {
297
+ (0, runtime_1.emitNervesEvent)({
298
+ level: "error",
299
+ component: "senses",
300
+ event: "senses.mail_sense_scan_error",
301
+ message: "mail sense attention scan failed",
302
+ meta: { agentName: options.agentName, error: error instanceof Error ? error.message : String(error) },
303
+ });
304
+ }
305
+ try {
306
+ const importDiscovery = await scanMailImportDiscoveryAttention({
307
+ agentName: options.agentName,
308
+ pendingDir: (0, pending_1.getPrivateRuntimePendingDir)(options.agentName),
309
+ statePath: importDiscoveryPath,
310
+ now,
311
+ });
312
+ if (importDiscovery.queued) {
313
+ queuedCount += 1;
314
+ }
315
+ }
316
+ catch (error) {
317
+ (0, runtime_1.emitNervesEvent)({
318
+ level: "error",
319
+ component: "senses",
320
+ event: "senses.mail_import_discovery_scan_error",
321
+ message: "mail import discovery scan failed",
322
+ meta: { agentName: options.agentName, error: error instanceof Error ? error.message : String(error) },
323
+ });
324
+ }
325
+ lastScanAt = scanStartedAt;
326
+ lastQueuedCount = queuedCount;
327
+ writeRuntimeState(runtimePath, {
328
+ schemaVersion: 1,
329
+ agentName: options.agentName,
330
+ status: "running",
331
+ mailboxAddress: resolved.config.mailboxAddress,
332
+ smtpPort: activeSmtpPort(),
333
+ httpPort: activeHttpPort(),
334
+ host,
335
+ storeKind: resolved.storeKind,
336
+ storeLabel: resolved.storeLabel,
337
+ lastScanAt,
338
+ lastQueuedCount,
339
+ updatedAt: new Date(now()).toISOString(),
340
+ });
341
+ };
342
+ await scan();
343
+ const intervalMs = Math.max(5_000, resolved.config.attentionIntervalMs ?? 30_000);
344
+ const timer = (options.setIntervalFn ?? ((callback, ms) => setInterval(callback, ms)))(() => {
345
+ void scan();
346
+ }, intervalMs);
347
+ (0, runtime_1.emitNervesEvent)({
348
+ component: "senses",
349
+ event: "senses.mail_sense_started",
350
+ message: "mail sense started",
351
+ meta: {
352
+ agentName: options.agentName,
353
+ mailboxAddress: resolved.config.mailboxAddress,
354
+ smtpPort: activeSmtpPort(),
355
+ httpPort: activeHttpPort(),
356
+ intervalMs,
357
+ },
358
+ });
359
+ return {
360
+ runtimeStatePath: runtimePath,
361
+ attentionStatePath: attentionPath,
362
+ smtpPort: activeSmtpPort(),
363
+ httpPort: activeHttpPort(),
364
+ async stop() {
365
+ ;
366
+ (options.clearIntervalFn ?? ((activeTimer) => clearInterval(activeTimer)))(timer);
367
+ if (ingress) {
368
+ await Promise.all([
369
+ closeServer(ingress.smtp),
370
+ closeServer(ingress.health),
371
+ ]);
372
+ }
373
+ writeRuntimeState(runtimePath, {
374
+ schemaVersion: 1,
375
+ agentName: options.agentName,
376
+ status: "stopped",
377
+ mailboxAddress: resolved.config.mailboxAddress,
378
+ smtpPort: activeSmtpPort(),
379
+ httpPort: activeHttpPort(),
380
+ host,
381
+ storeKind: resolved.storeKind,
382
+ storeLabel: resolved.storeLabel,
383
+ lastScanAt,
384
+ lastQueuedCount,
385
+ updatedAt: new Date(now()).toISOString(),
386
+ });
387
+ (0, runtime_1.emitNervesEvent)({
388
+ component: "senses",
389
+ event: "senses.mail_sense_stopped",
390
+ message: "mail sense stopped",
391
+ meta: { agentName: options.agentName },
392
+ });
393
+ },
394
+ };
395
+ }