@ouro.bot/cli 0.1.0-alpha.55 → 0.1.0-alpha.551

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 (386) hide show
  1. package/README.md +133 -19
  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-bootstrap-drift.md +54 -0
  6. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  7. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  8. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  9. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  12. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  13. package/changelog.json +3561 -0
  14. package/dist/arc/attention-types.js +8 -0
  15. package/dist/arc/cares.js +140 -0
  16. package/dist/arc/episodes.js +117 -0
  17. package/dist/arc/intentions.js +133 -0
  18. package/dist/arc/json-store.js +117 -0
  19. package/dist/arc/obligations.js +237 -0
  20. package/dist/arc/packets.js +193 -0
  21. package/dist/arc/presence.js +185 -0
  22. package/dist/arc/task-lifecycle.js +65 -0
  23. package/dist/heart/active-work.js +837 -26
  24. package/dist/heart/agent-entry.js +58 -3
  25. package/dist/heart/attachments/image-normalize.js +194 -0
  26. package/dist/heart/attachments/materialize.js +97 -0
  27. package/dist/heart/attachments/originals.js +88 -0
  28. package/dist/heart/attachments/render.js +29 -0
  29. package/dist/heart/attachments/sources/adapter.js +2 -0
  30. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  31. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  32. package/dist/heart/attachments/sources/index.js +16 -0
  33. package/dist/heart/attachments/store.js +103 -0
  34. package/dist/heart/attachments/types.js +93 -0
  35. package/dist/heart/auth/auth-flow.js +479 -0
  36. package/dist/heart/background-operations.js +281 -0
  37. package/dist/heart/bundle-state.js +168 -0
  38. package/dist/heart/commitments.js +111 -0
  39. package/dist/heart/config-registry.js +304 -0
  40. package/dist/heart/config.js +114 -118
  41. package/dist/heart/core.js +925 -246
  42. package/dist/heart/cross-chat-delivery.js +3 -18
  43. package/dist/heart/daemon/agent-config-check.js +512 -0
  44. package/dist/heart/daemon/agent-discovery.js +102 -3
  45. package/dist/heart/daemon/agent-service.js +522 -0
  46. package/dist/heart/daemon/agentic-repair.js +554 -0
  47. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  48. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  49. package/dist/heart/daemon/cadence.js +70 -0
  50. package/dist/heart/daemon/cli-defaults.js +665 -0
  51. package/dist/heart/daemon/cli-exec.js +7565 -0
  52. package/dist/heart/daemon/cli-help.js +498 -0
  53. package/dist/heart/daemon/cli-parse.js +1590 -0
  54. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  55. package/dist/heart/daemon/cli-render.js +775 -0
  56. package/dist/heart/daemon/cli-types.js +8 -0
  57. package/dist/heart/daemon/connect-bay.js +323 -0
  58. package/dist/heart/daemon/daemon-cli.js +29 -1672
  59. package/dist/heart/daemon/daemon-entry.js +417 -2
  60. package/dist/heart/daemon/daemon-health.js +183 -0
  61. package/dist/heart/daemon/daemon-rollup.js +58 -0
  62. package/dist/heart/daemon/daemon-runtime-sync.js +87 -13
  63. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  64. package/dist/heart/daemon/daemon.js +796 -71
  65. package/dist/heart/daemon/dns-workflow.js +394 -0
  66. package/dist/heart/daemon/doctor-types.js +8 -0
  67. package/dist/heart/daemon/doctor.js +844 -0
  68. package/dist/heart/daemon/drift-detection.js +146 -0
  69. package/dist/heart/daemon/health-monitor.js +122 -1
  70. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  71. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  72. package/dist/heart/daemon/http-health-probe.js +80 -0
  73. package/dist/heart/daemon/human-command-screens.js +234 -0
  74. package/dist/heart/daemon/human-readiness.js +114 -0
  75. package/dist/heart/daemon/inner-status.js +102 -0
  76. package/dist/heart/daemon/interactive-repair.js +394 -0
  77. package/dist/heart/daemon/launchd.js +37 -8
  78. package/dist/heart/daemon/log-tailer.js +82 -12
  79. package/dist/heart/daemon/logs-prune.js +110 -0
  80. package/dist/heart/daemon/mcp-canary.js +297 -0
  81. package/dist/heart/daemon/message-router.js +2 -2
  82. package/dist/heart/daemon/os-cron-deps.js +135 -0
  83. package/dist/heart/daemon/os-cron.js +14 -12
  84. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  85. package/dist/heart/daemon/ouro-entry.js +3 -1
  86. package/dist/heart/daemon/process-manager.js +375 -33
  87. package/dist/heart/daemon/provider-discovery.js +137 -0
  88. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  89. package/dist/heart/daemon/pulse.js +475 -0
  90. package/dist/heart/daemon/readiness-repair.js +365 -0
  91. package/dist/heart/daemon/run-hooks.js +2 -0
  92. package/dist/heart/daemon/runtime-logging.js +67 -16
  93. package/dist/heart/daemon/runtime-metadata.js +3 -31
  94. package/dist/heart/daemon/safe-mode.js +161 -0
  95. package/dist/heart/daemon/sense-manager.js +353 -38
  96. package/dist/heart/daemon/session-id-resolver.js +131 -0
  97. package/dist/heart/daemon/skill-management-installer.js +94 -0
  98. package/dist/heart/daemon/socket-client.js +158 -11
  99. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  100. package/dist/heart/daemon/startup-tui.js +330 -0
  101. package/dist/heart/daemon/task-scheduler.js +3 -25
  102. package/dist/heart/daemon/terminal-ui.js +499 -0
  103. package/dist/heart/daemon/thoughts.js +162 -17
  104. package/dist/heart/daemon/up-progress.js +366 -0
  105. package/dist/heart/daemon/vault-items.js +56 -0
  106. package/dist/heart/delegation.js +1 -1
  107. package/dist/heart/habits/habit-migration.js +189 -0
  108. package/dist/heart/habits/habit-parser.js +140 -0
  109. package/dist/heart/habits/habit-runtime-state.js +100 -0
  110. package/dist/heart/habits/habit-scheduler.js +372 -0
  111. package/dist/heart/{daemon → hatch}/hatch-flow.js +52 -117
  112. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  113. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  114. package/dist/heart/{daemon → hatch}/specialist-tools.js +35 -12
  115. package/dist/heart/identity.js +200 -51
  116. package/dist/heart/kept-notes.js +357 -0
  117. package/dist/heart/kicks.js +1 -1
  118. package/dist/heart/machine-identity.js +161 -0
  119. package/dist/heart/mail-import-discovery.js +353 -0
  120. package/dist/heart/mailbox/mailbox-http-hooks.js +66 -0
  121. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  122. package/dist/heart/mailbox/mailbox-http-routes.js +246 -0
  123. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  124. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  125. package/dist/heart/mailbox/mailbox-http.js +99 -0
  126. package/dist/heart/mailbox/mailbox-read.js +31 -0
  127. package/dist/heart/mailbox/mailbox-types.js +27 -0
  128. package/dist/heart/mailbox/mailbox-view.js +195 -0
  129. package/dist/heart/mailbox/readers/agent-machine.js +382 -0
  130. package/dist/heart/mailbox/readers/continuity-readers.js +338 -0
  131. package/dist/heart/mailbox/readers/mail.js +362 -0
  132. package/dist/heart/mailbox/readers/runtime-readers.js +651 -0
  133. package/dist/heart/mailbox/readers/sessions.js +232 -0
  134. package/dist/heart/mailbox/readers/shared.js +111 -0
  135. package/dist/heart/mcp/mcp-server.js +683 -0
  136. package/dist/heart/migrate-config.js +100 -0
  137. package/dist/heart/model-capabilities.js +19 -0
  138. package/dist/heart/platform.js +81 -0
  139. package/dist/heart/provider-attempt.js +134 -0
  140. package/dist/heart/provider-binding-resolver.js +255 -0
  141. package/dist/heart/provider-credentials.js +425 -0
  142. package/dist/heart/provider-failover.js +301 -0
  143. package/dist/heart/provider-models.js +81 -0
  144. package/dist/heart/provider-ping.js +262 -0
  145. package/dist/heart/provider-state.js +216 -0
  146. package/dist/heart/provider-visibility.js +188 -0
  147. package/dist/heart/providers/anthropic-token.js +131 -0
  148. package/dist/heart/providers/anthropic.js +139 -52
  149. package/dist/heart/providers/azure.js +97 -13
  150. package/dist/heart/providers/error-classification.js +127 -0
  151. package/dist/heart/providers/github-copilot.js +145 -0
  152. package/dist/heart/providers/minimax-vlm.js +189 -0
  153. package/dist/heart/providers/minimax.js +26 -8
  154. package/dist/heart/providers/openai-codex.js +55 -40
  155. package/dist/heart/runtime-capability-check.js +170 -0
  156. package/dist/heart/runtime-credentials.js +367 -0
  157. package/dist/heart/runtime-cwd.js +87 -0
  158. package/dist/heart/sense-truth.js +11 -4
  159. package/dist/heart/session-activity.js +43 -22
  160. package/dist/heart/session-events.js +1149 -0
  161. package/dist/heart/session-playback-cli-main.js +5 -0
  162. package/dist/heart/session-playback-cli.js +36 -0
  163. package/dist/heart/session-playback.js +231 -0
  164. package/dist/heart/session-stats-cli-main.js +5 -0
  165. package/dist/heart/session-stats.js +182 -0
  166. package/dist/heart/session-transcript.js +243 -0
  167. package/dist/heart/start-of-turn-packet.js +345 -0
  168. package/dist/heart/streaming.js +44 -27
  169. package/dist/heart/sync-classification.js +176 -0
  170. package/dist/heart/sync.js +449 -0
  171. package/dist/heart/target-resolution.js +9 -5
  172. package/dist/heart/tempo.js +93 -0
  173. package/dist/heart/temporal-view.js +41 -0
  174. package/dist/heart/timeouts.js +101 -0
  175. package/dist/heart/tool-activity-callbacks.js +59 -0
  176. package/dist/heart/tool-description.js +139 -0
  177. package/dist/heart/tool-friction.js +55 -0
  178. package/dist/heart/tool-loop.js +200 -0
  179. package/dist/heart/turn-context.js +381 -0
  180. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  181. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  182. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  183. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  184. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  185. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  186. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  187. package/dist/mailbox-ui/assets/index-BPr5vNuM.css +1 -0
  188. package/dist/mailbox-ui/assets/index-Cm51CY9W.js +61 -0
  189. package/dist/mailbox-ui/index.html +15 -0
  190. package/dist/mailroom/attention.js +167 -0
  191. package/dist/mailroom/autonomy.js +209 -0
  192. package/dist/mailroom/blob-store.js +674 -0
  193. package/dist/mailroom/body-cache.js +61 -0
  194. package/dist/mailroom/core.js +720 -0
  195. package/dist/mailroom/entry.js +160 -0
  196. package/dist/mailroom/file-store.js +430 -0
  197. package/dist/mailroom/mbox-import.js +383 -0
  198. package/dist/mailroom/outbound.js +380 -0
  199. package/dist/mailroom/policy.js +263 -0
  200. package/dist/mailroom/reader.js +233 -0
  201. package/dist/mailroom/search-cache.js +256 -0
  202. package/dist/mailroom/search-relevance.js +319 -0
  203. package/dist/mailroom/smtp-ingress.js +176 -0
  204. package/dist/mailroom/source-state.js +176 -0
  205. package/dist/mailroom/thread.js +109 -0
  206. package/dist/mailroom/travel-extract.js +89 -0
  207. package/dist/mind/bundle-manifest.js +7 -1
  208. package/dist/mind/context.js +165 -101
  209. package/dist/mind/diary-integrity.js +60 -0
  210. package/dist/mind/{memory.js → diary.js} +62 -75
  211. package/dist/mind/embedding-provider.js +60 -0
  212. package/dist/mind/file-state.js +179 -0
  213. package/dist/mind/friends/channel.js +30 -0
  214. package/dist/mind/friends/resolver.js +54 -2
  215. package/dist/mind/friends/store-file.js +39 -3
  216. package/dist/mind/friends/types.js +2 -2
  217. package/dist/mind/journal-index.js +161 -0
  218. package/dist/mind/note-search.js +268 -0
  219. package/dist/mind/obligation-steering.js +221 -0
  220. package/dist/mind/pending.js +4 -0
  221. package/dist/mind/prompt-refresh.js +3 -2
  222. package/dist/mind/prompt.js +995 -123
  223. package/dist/mind/provenance-trust.js +26 -0
  224. package/dist/mind/scrutiny.js +173 -0
  225. package/dist/nerves/cli-logging.js +7 -1
  226. package/dist/nerves/coverage/audit-rules.js +15 -6
  227. package/dist/nerves/coverage/audit.js +28 -2
  228. package/dist/nerves/coverage/cli.js +1 -1
  229. package/dist/nerves/coverage/contract.js +5 -5
  230. package/dist/nerves/coverage/file-completeness.js +139 -5
  231. package/dist/nerves/coverage/run-artifacts.js +1 -1
  232. package/dist/nerves/event-buffer.js +111 -0
  233. package/dist/nerves/index.js +224 -4
  234. package/dist/nerves/observation.js +20 -0
  235. package/dist/nerves/redact.js +79 -0
  236. package/dist/nerves/review/cli-main.js +5 -0
  237. package/dist/nerves/review/cli.js +156 -0
  238. package/dist/nerves/review/core.js +152 -0
  239. package/dist/nerves/runtime.js +5 -1
  240. package/dist/repertoire/ado-client.js +15 -56
  241. package/dist/repertoire/ado-semantic.js +11 -10
  242. package/dist/repertoire/api-client.js +97 -0
  243. package/dist/repertoire/bitwarden-store.js +816 -0
  244. package/dist/repertoire/bundle-templates.js +72 -0
  245. package/dist/repertoire/bw-installer.js +180 -0
  246. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  247. package/dist/repertoire/coding/context-pack.js +330 -0
  248. package/dist/repertoire/coding/feedback.js +197 -30
  249. package/dist/repertoire/coding/manager.js +158 -9
  250. package/dist/repertoire/coding/spawner.js +55 -9
  251. package/dist/repertoire/coding/tools.js +170 -7
  252. package/dist/repertoire/commerce-errors.js +109 -0
  253. package/dist/repertoire/commerce-self-test.js +156 -0
  254. package/dist/repertoire/credential-access.js +111 -0
  255. package/dist/repertoire/duffel-client.js +185 -0
  256. package/dist/repertoire/github-client.js +14 -55
  257. package/dist/repertoire/graph-client.js +11 -52
  258. package/dist/repertoire/guardrails.js +396 -0
  259. package/dist/repertoire/mcp-client.js +295 -0
  260. package/dist/repertoire/mcp-manager.js +362 -0
  261. package/dist/repertoire/mcp-tools.js +63 -0
  262. package/dist/repertoire/shell-sessions.js +133 -0
  263. package/dist/repertoire/skills.js +15 -24
  264. package/dist/repertoire/stripe-client.js +131 -0
  265. package/dist/repertoire/tasks/board.js +31 -5
  266. package/dist/repertoire/tasks/fix.js +182 -0
  267. package/dist/repertoire/tasks/index.js +16 -4
  268. package/dist/repertoire/tasks/lifecycle.js +2 -2
  269. package/dist/repertoire/tasks/parser.js +3 -2
  270. package/dist/repertoire/tasks/scanner.js +194 -37
  271. package/dist/repertoire/tasks/transitions.js +16 -78
  272. package/dist/repertoire/tool-results.js +29 -0
  273. package/dist/repertoire/tools-attachments.js +317 -0
  274. package/dist/repertoire/tools-base.js +47 -1075
  275. package/dist/repertoire/tools-bluebubbles.js +1 -0
  276. package/dist/repertoire/tools-bridge.js +142 -0
  277. package/dist/repertoire/tools-bundle.js +984 -0
  278. package/dist/repertoire/tools-config.js +185 -0
  279. package/dist/repertoire/tools-continuity.js +248 -0
  280. package/dist/repertoire/tools-credential.js +381 -0
  281. package/dist/repertoire/tools-files.js +342 -0
  282. package/dist/repertoire/tools-flight.js +224 -0
  283. package/dist/repertoire/tools-flow.js +119 -0
  284. package/dist/repertoire/tools-github.js +1 -7
  285. package/dist/repertoire/tools-mail.js +1857 -0
  286. package/dist/repertoire/tools-notes.js +421 -0
  287. package/dist/repertoire/tools-session.js +750 -0
  288. package/dist/repertoire/tools-shell.js +120 -0
  289. package/dist/repertoire/tools-stripe.js +180 -0
  290. package/dist/repertoire/tools-surface.js +243 -0
  291. package/dist/repertoire/tools-teams.js +9 -39
  292. package/dist/repertoire/tools-travel.js +125 -0
  293. package/dist/repertoire/tools-trip.js +604 -0
  294. package/dist/repertoire/tools-user-profile.js +144 -0
  295. package/dist/repertoire/tools-vault.js +40 -0
  296. package/dist/repertoire/tools.js +108 -100
  297. package/dist/repertoire/travel-api-client.js +360 -0
  298. package/dist/repertoire/user-profile.js +131 -0
  299. package/dist/repertoire/vault-setup.js +246 -0
  300. package/dist/repertoire/vault-unlock.js +561 -0
  301. package/dist/scripts/claude-code-hook.js +41 -0
  302. package/dist/scripts/claude-code-stop-hook.js +47 -0
  303. package/dist/senses/attention-queue.js +116 -0
  304. package/dist/senses/bluebubbles/active-turns.js +216 -0
  305. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  306. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  307. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  308. package/dist/senses/bluebubbles/entry.js +77 -0
  309. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  310. package/dist/senses/bluebubbles/index.js +2305 -0
  311. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  312. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  313. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  314. package/dist/senses/bluebubbles/processed-log.js +133 -0
  315. package/dist/senses/bluebubbles/replay.js +137 -0
  316. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  317. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  318. package/dist/senses/cli/bracketed-paste.js +82 -0
  319. package/dist/senses/cli/image-paste.js +287 -0
  320. package/dist/senses/cli/image-ref-navigation.js +75 -0
  321. package/dist/senses/cli/ink-app.js +156 -0
  322. package/dist/senses/cli/inline-diff.js +64 -0
  323. package/dist/senses/cli/input-keys.js +174 -0
  324. package/dist/senses/cli/kill-ring.js +86 -0
  325. package/dist/senses/cli/message-list.js +51 -0
  326. package/dist/senses/cli/ouro-tui.js +607 -0
  327. package/dist/senses/cli/spinner-imperative.js +135 -0
  328. package/dist/senses/cli/spinner.js +101 -0
  329. package/dist/senses/cli/status-line.js +60 -0
  330. package/dist/senses/cli/streaming-markdown.js +526 -0
  331. package/dist/senses/cli/tool-display.js +85 -0
  332. package/dist/senses/cli/tool-render.js +85 -0
  333. package/dist/senses/cli/tui-store.js +240 -0
  334. package/dist/senses/cli/virtual-list.js +35 -0
  335. package/dist/senses/cli-entry.js +60 -8
  336. package/dist/senses/cli-layout.js +187 -0
  337. package/dist/senses/cli.js +520 -209
  338. package/dist/senses/commands.js +66 -3
  339. package/dist/senses/habit-turn-message.js +108 -0
  340. package/dist/senses/inner-dialog-worker.js +175 -21
  341. package/dist/senses/inner-dialog.js +330 -27
  342. package/dist/senses/mail-entry.js +66 -0
  343. package/dist/senses/mail.js +379 -0
  344. package/dist/senses/pipeline.js +569 -182
  345. package/dist/senses/proactive-content-guard.js +51 -0
  346. package/dist/senses/shared-turn.js +248 -0
  347. package/dist/senses/surface-tool.js +68 -0
  348. package/dist/senses/teams-entry.js +60 -8
  349. package/dist/senses/teams.js +387 -98
  350. package/dist/senses/trust-gate.js +100 -5
  351. package/dist/trips/core.js +138 -0
  352. package/dist/trips/store.js +146 -0
  353. package/package.json +38 -7
  354. package/skills/agent-commerce.md +106 -0
  355. package/skills/browser-navigation.md +117 -0
  356. package/skills/commerce-setup-guide.md +116 -0
  357. package/skills/commerce-setup.md +84 -0
  358. package/skills/configure-dev-tools.md +101 -0
  359. package/skills/travel-planning.md +138 -0
  360. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  361. package/dist/heart/daemon/subagent-installer.js +0 -166
  362. package/dist/heart/session-recall.js +0 -116
  363. package/dist/mind/associative-recall.js +0 -209
  364. package/dist/senses/bluebubbles-entry.js +0 -13
  365. package/dist/senses/bluebubbles.js +0 -1177
  366. package/dist/senses/debug-activity.js +0 -148
  367. package/subagents/README.md +0 -86
  368. package/subagents/work-doer.md +0 -237
  369. package/subagents/work-merger.md +0 -618
  370. package/subagents/work-planner.md +0 -390
  371. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  372. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  373. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  374. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  375. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  376. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  377. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  378. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  379. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  380. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  381. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  382. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  383. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  384. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  385. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  386. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,319 @@
1
+ "use strict";
2
+ // Booking-intent relevance for mail search.
3
+ //
4
+ // Today the agent's mail search ranks by recency only — `searchText.includes(term)`
5
+ // then `receivedAt` desc. That works for "give me the latest message" but fails
6
+ // the workflow Slugger actually does most: "find the decisive booking message
7
+ // in this delegated mailbox so I can update a travel doc from real evidence."
8
+ // Recent newsletter / itinerary chatter from the same sender drowns the older
9
+ // confirmation.
10
+ //
11
+ // This module adds a small additive score per document. Signals are heuristic
12
+ // and intentionally legible — not learned. Each signal is also exposed so the
13
+ // renderer can surface a "matched on" hint to the agent for triage.
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.scoreMailSearchDocument = scoreMailSearchDocument;
16
+ exports.compareByRelevanceThenRecency = compareByRelevanceThenRecency;
17
+ exports.formatRelevanceHint = formatRelevanceHint;
18
+ const BOOKING_INTENT_TOKENS = [
19
+ "booking confirmation",
20
+ "booked",
21
+ "your booking",
22
+ "your reservation",
23
+ "your stay",
24
+ "your trip",
25
+ "reservation confirmation",
26
+ "reservation confirmed",
27
+ "confirmation number",
28
+ "e-ticket",
29
+ "eticket",
30
+ "itinerary",
31
+ "receipt",
32
+ "invoice",
33
+ "check-in",
34
+ "check in",
35
+ "departure",
36
+ "arrival",
37
+ "boarding pass",
38
+ "confirmed",
39
+ "confirmation",
40
+ "reservation",
41
+ ];
42
+ // Subject-only tokens get an extra bump because subjects rarely include them
43
+ // for non-decisive mail.
44
+ const SUBJECT_DECISIVE_TOKENS = [
45
+ "booking confirmation",
46
+ "reservation confirmation",
47
+ "your booking",
48
+ "your reservation",
49
+ "your stay",
50
+ "e-ticket",
51
+ "eticket",
52
+ "boarding pass",
53
+ "confirmed",
54
+ "itinerary",
55
+ "receipt",
56
+ ];
57
+ // Known travel-domain senders. Substring match against the from list. Kept
58
+ // short on purpose — the score still works without exhaustive coverage; this
59
+ // just reinforces obvious cases.
60
+ const KNOWN_TRAVEL_SENDER_PATTERNS = [
61
+ "booking.com",
62
+ "hotels.com",
63
+ "expedia",
64
+ "airbnb",
65
+ "marriott",
66
+ "hilton",
67
+ "hyatt",
68
+ "ihg",
69
+ "accorhotels",
70
+ "kayak",
71
+ "agoda",
72
+ "trivago",
73
+ "vrbo",
74
+ "swiss.com",
75
+ "lufthansa",
76
+ "ryanair",
77
+ "easyjet",
78
+ "ba.com",
79
+ "delta.com",
80
+ "united.com",
81
+ "aa.com",
82
+ "alaskaair",
83
+ "klm.com",
84
+ "airfrance",
85
+ "iberia",
86
+ "sas.se",
87
+ "norwegian.com",
88
+ "sbb.ch",
89
+ "sncf",
90
+ "trenitalia",
91
+ "renfe",
92
+ "eurail",
93
+ "trainline",
94
+ "omio",
95
+ "raileurope",
96
+ "amtrak",
97
+ "viarail",
98
+ "rentalcars",
99
+ "hertz",
100
+ "avis",
101
+ "europcar",
102
+ "sixt",
103
+ "uber.com",
104
+ "lyft.com",
105
+ "lime",
106
+ "tripit",
107
+ "kiwi.com",
108
+ "tap.pt",
109
+ ];
110
+ // Confirmation-number-shaped tokens. Two flavors:
111
+ // - alphanumeric mix at least 6 long: PNRs, hotel confirmation codes
112
+ // - long pure-digit runs (>= 8): airline ref numbers, OTA references
113
+ const ALPHANUM_CONF_RE = /\b(?=[A-Z0-9]*[A-Z])(?=[A-Z0-9]*\d)[A-Z0-9]{6,12}\b/g;
114
+ const LONG_DIGIT_RE = /\b\d{8,}\b/g;
115
+ // Currency amounts. Symbol or ISO 3-letter currency immediately followed by
116
+ // (or following) a number. Catches "$420", "€189.50", "CHF 320", "USD 199".
117
+ const CURRENCY_RE = /(?:[$£€¥₣]\s?\d{1,3}(?:[,.\s]\d{3})*(?:[.,]\d{2})?|\b(?:USD|EUR|GBP|CHF|JPY|CAD|AUD|SEK|NOK|DKK)\s?\d{1,3}(?:[,.\s]\d{3})*(?:[.,]\d{2})?)/g;
118
+ // ISO-8601 dates and "January 2[, 2026]" / "2 January 2026" forms.
119
+ const ISO_DATE_RE = /\b\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])\b/g;
120
+ const MONTH_DAY_RE = /\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s+\d{1,2}(?:,?\s+\d{4})?\b/gi;
121
+ const DAY_MONTH_RE = /\b\d{1,2}\s+(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)(?:,?\s+\d{4})?\b/gi;
122
+ // Status tokens — decisive truth signals. These often determine whether a
123
+ // "this trip is on" reading is correct. Lowercased substring match.
124
+ const STATUS_TOKENS = [
125
+ "confirmed",
126
+ "booked",
127
+ "cancelled",
128
+ "canceled",
129
+ "changed",
130
+ "rescheduled",
131
+ "refunded",
132
+ "refund",
133
+ "pending",
134
+ "tentative",
135
+ "waitlist",
136
+ "no longer",
137
+ "rebooked",
138
+ "modified",
139
+ ];
140
+ function uniqueLowercaseHits(text, regex) {
141
+ const hits = text.match(regex);
142
+ if (!hits)
143
+ return [];
144
+ const seen = new Set();
145
+ const out = [];
146
+ for (const hit of hits) {
147
+ const norm = hit.toLowerCase();
148
+ if (seen.has(norm))
149
+ continue;
150
+ seen.add(norm);
151
+ out.push(hit);
152
+ }
153
+ return out;
154
+ }
155
+ function findKnownTravelSender(fromList) {
156
+ for (const from of fromList) {
157
+ const lower = from.toLowerCase();
158
+ for (const pattern of KNOWN_TRAVEL_SENDER_PATTERNS) {
159
+ if (lower.includes(pattern))
160
+ return pattern;
161
+ }
162
+ }
163
+ return undefined;
164
+ }
165
+ function countOccurrences(haystack, needle) {
166
+ /* v8 ignore start -- defensive: BOOKING_INTENT_TOKENS are non-empty by construction */
167
+ if (!needle)
168
+ return 0;
169
+ /* v8 ignore stop */
170
+ let count = 0;
171
+ let from = 0;
172
+ while (true) {
173
+ const idx = haystack.indexOf(needle, from);
174
+ if (idx === -1)
175
+ break;
176
+ count++;
177
+ from = idx + needle.length;
178
+ }
179
+ return count;
180
+ }
181
+ /**
182
+ * Score a cached search document for booking-intent relevance against a list
183
+ * of (already lowercased, non-empty) query terms.
184
+ *
185
+ * Signals (additive, all small integers so the result stays interpretable):
186
+ * - +6 per query term hit in subject
187
+ * - +4 per query term hit in any from address
188
+ * - +2 per query term hit in body
189
+ * - +5 per booking-intent token in subject (extra +3 for decisive subject tokens)
190
+ * - +2 per booking-intent token in body
191
+ * - +4 if any confirmation-number-shaped token appears
192
+ * - +3 if any currency amount appears
193
+ * - +6 if any from address matches a known travel-sender pattern
194
+ *
195
+ * The numbers are tunable. They are chosen so that a noisy newsletter that
196
+ * mentions the query terms in body but has no booking signals scores below
197
+ * a decisive booking confirmation that has the query terms + booking tokens
198
+ * in subject + a confirmation code, even if the booking confirmation is older.
199
+ */
200
+ function scoreMailSearchDocument(document, queryTerms) {
201
+ const subjectLower = document.subject.toLowerCase();
202
+ const bodyLower = document.textExcerpt.toLowerCase();
203
+ const fromLower = document.from.join(" ").toLowerCase();
204
+ let score = 0;
205
+ const matchedFields = new Set();
206
+ for (const term of queryTerms) {
207
+ /* v8 ignore start -- defensive: callers always normalize/filter empty terms */
208
+ if (!term)
209
+ continue;
210
+ /* v8 ignore stop */
211
+ if (subjectLower.includes(term)) {
212
+ score += 6;
213
+ matchedFields.add("subject");
214
+ }
215
+ if (fromLower.includes(term)) {
216
+ score += 4;
217
+ matchedFields.add("from");
218
+ }
219
+ if (bodyLower.includes(term)) {
220
+ score += 2;
221
+ matchedFields.add("body");
222
+ }
223
+ }
224
+ const bookingHits = new Set();
225
+ for (const token of BOOKING_INTENT_TOKENS) {
226
+ const inSubject = countOccurrences(subjectLower, token);
227
+ const inBody = countOccurrences(bodyLower, token);
228
+ if (inSubject > 0) {
229
+ score += 5 * inSubject;
230
+ bookingHits.add(token);
231
+ }
232
+ if (inBody > 0) {
233
+ score += 2 * inBody;
234
+ bookingHits.add(token);
235
+ }
236
+ }
237
+ for (const decisive of SUBJECT_DECISIVE_TOKENS) {
238
+ if (subjectLower.includes(decisive))
239
+ score += 3;
240
+ }
241
+ const subjectAndBody = `${document.subject}\n${document.textExcerpt}`;
242
+ const subjectAndBodyLower = subjectAndBody.toLowerCase();
243
+ const confirmationTokens = [
244
+ ...uniqueLowercaseHits(subjectAndBody, ALPHANUM_CONF_RE),
245
+ ...uniqueLowercaseHits(subjectAndBody, LONG_DIGIT_RE),
246
+ ];
247
+ if (confirmationTokens.length > 0)
248
+ score += 4;
249
+ const currencyTokens = uniqueLowercaseHits(subjectAndBody, CURRENCY_RE);
250
+ if (currencyTokens.length > 0)
251
+ score += 3;
252
+ const dateTokens = [
253
+ ...uniqueLowercaseHits(subjectAndBody, ISO_DATE_RE),
254
+ ...uniqueLowercaseHits(subjectAndBody, MONTH_DAY_RE),
255
+ ...uniqueLowercaseHits(subjectAndBody, DAY_MONTH_RE),
256
+ ];
257
+ const statusTokens = [];
258
+ for (const token of STATUS_TOKENS) {
259
+ if (subjectAndBodyLower.includes(token))
260
+ statusTokens.push(token);
261
+ }
262
+ const travelSenderHint = findKnownTravelSender(document.from);
263
+ if (travelSenderHint)
264
+ score += 6;
265
+ const signal = {
266
+ score,
267
+ matchedFields: Array.from(matchedFields),
268
+ bookingTokens: Array.from(bookingHits),
269
+ confirmationTokens,
270
+ currencyTokens,
271
+ statusTokens,
272
+ dateTokens,
273
+ };
274
+ if (travelSenderHint)
275
+ signal.travelSenderHint = travelSenderHint;
276
+ return signal;
277
+ }
278
+ /**
279
+ * Sort comparator: booking relevance first, recency as tiebreaker.
280
+ * Returns negative when `a` should come before `b`.
281
+ */
282
+ function compareByRelevanceThenRecency(a, b) {
283
+ if (b.relevance.score !== a.relevance.score)
284
+ return b.relevance.score - a.relevance.score;
285
+ return b.document.receivedAt.localeCompare(a.document.receivedAt);
286
+ }
287
+ /**
288
+ * Render a short "matched on" hint for surfacing under a search result.
289
+ * Empty string when nothing notable to report (no signals, no fields). The
290
+ * caller decides whether to display the line.
291
+ */
292
+ function formatRelevanceHint(signal) {
293
+ if (signal.score === 0)
294
+ return "";
295
+ const parts = [];
296
+ if (signal.matchedFields.length > 0) {
297
+ parts.push(`fields: ${signal.matchedFields.join("+")}`);
298
+ }
299
+ if (signal.bookingTokens.length > 0) {
300
+ const preview = signal.bookingTokens.slice(0, 3).join(", ");
301
+ parts.push(`booking signals: ${preview}`);
302
+ }
303
+ if (signal.statusTokens.length > 0) {
304
+ parts.push(`status: ${signal.statusTokens.slice(0, 3).join(", ")}`);
305
+ }
306
+ if (signal.confirmationTokens.length > 0) {
307
+ parts.push(`conf token: ${signal.confirmationTokens[0]}`);
308
+ }
309
+ if (signal.currencyTokens.length > 0) {
310
+ parts.push(`amount: ${signal.currencyTokens[0]}`);
311
+ }
312
+ if (signal.dateTokens.length > 0) {
313
+ parts.push(`dates: ${signal.dateTokens.slice(0, 3).join(", ")}`);
314
+ }
315
+ if (signal.travelSenderHint) {
316
+ parts.push(`sender: ${signal.travelSenderHint}`);
317
+ }
318
+ return parts.join(" | ");
319
+ }
@@ -0,0 +1,176 @@
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.createMailroomSmtpServer = createMailroomSmtpServer;
37
+ exports.createMailroomHealthServer = createMailroomHealthServer;
38
+ exports.startMailroomIngress = startMailroomIngress;
39
+ const http = __importStar(require("node:http"));
40
+ const smtp_server_1 = require("smtp-server");
41
+ const runtime_1 = require("../nerves/runtime");
42
+ const core_1 = require("./core");
43
+ const file_store_1 = require("./file-store");
44
+ function collectStream(stream, maxBytes) {
45
+ return new Promise((resolve, reject) => {
46
+ const chunks = [];
47
+ let total = 0;
48
+ stream.on("data", (chunk) => {
49
+ total += chunk.byteLength;
50
+ if (total > maxBytes) {
51
+ reject(new Error(`message exceeds max size ${maxBytes}`));
52
+ stream.destroy();
53
+ return;
54
+ }
55
+ chunks.push(chunk);
56
+ });
57
+ stream.on("error", reject);
58
+ stream.on("end", () => resolve(Buffer.concat(chunks)));
59
+ });
60
+ }
61
+ function sessionRecipients(session) {
62
+ /* v8 ignore next -- smtp-server supplies rcptTo during DATA; fallback is a defensive harness edge. @preserve */
63
+ return (session.envelope.rcptTo ?? []).map((address) => (0, core_1.normalizeMailAddress)(address.address));
64
+ }
65
+ function createMailroomSmtpServer(options) {
66
+ const maxMessageBytes = options.maxMessageBytes ?? 25 * 1024 * 1024;
67
+ const server = new smtp_server_1.SMTPServer({
68
+ disabledCommands: ["AUTH", "STARTTLS"],
69
+ logger: false,
70
+ onRcptTo(address, _session, callback) {
71
+ const normalized = (0, core_1.normalizeMailAddress)(address.address);
72
+ const resolved = (0, core_1.resolveMailAddress)(options.registry, normalized);
73
+ if (!resolved) {
74
+ (0, runtime_1.emitNervesEvent)({
75
+ component: "senses",
76
+ event: "senses.mail_smtp_recipient_rejected",
77
+ message: "smtp recipient rejected",
78
+ meta: { address: normalized },
79
+ });
80
+ const error = new Error(`unknown recipient ${normalized}`);
81
+ error.responseCode = 550;
82
+ callback(error);
83
+ return;
84
+ }
85
+ (0, runtime_1.emitNervesEvent)({
86
+ component: "senses",
87
+ event: "senses.mail_smtp_recipient_accepted",
88
+ message: "smtp recipient accepted",
89
+ meta: { address: normalized, agentId: resolved.agentId },
90
+ });
91
+ callback();
92
+ },
93
+ async onData(stream, session, callback) {
94
+ try {
95
+ const raw = await collectStream(stream, maxMessageBytes);
96
+ const mailFrom = session.envelope.mailFrom;
97
+ /* v8 ignore next -- smtp-server exposes normal and null senders as address objects; false/undefined are defensive direct-call states. @preserve */
98
+ const rawMailFrom = mailFrom === false ? "" : mailFrom?.address ?? "";
99
+ const envelope = {
100
+ mailFrom: rawMailFrom ? (0, core_1.normalizeMailAddress)(rawMailFrom) : "",
101
+ rcptTo: sessionRecipients(session),
102
+ /* v8 ignore next -- smtp-server network sessions carry remoteAddress; fallback is a defensive direct-call edge. @preserve */
103
+ ...(session.remoteAddress ? { remoteAddress: session.remoteAddress } : {}),
104
+ };
105
+ const result = await (0, file_store_1.ingestRawMailToStore)({
106
+ registry: options.registry,
107
+ store: options.store,
108
+ envelope,
109
+ rawMime: raw,
110
+ });
111
+ (0, runtime_1.emitNervesEvent)({
112
+ component: "senses",
113
+ event: "senses.mail_smtp_data_stored",
114
+ message: "smtp data stored",
115
+ meta: { accepted: result.accepted.length, rejected: result.rejectedRecipients.length },
116
+ });
117
+ callback();
118
+ }
119
+ catch (error) {
120
+ (0, runtime_1.emitNervesEvent)({
121
+ level: "error",
122
+ component: "senses",
123
+ event: "senses.mail_smtp_data_error",
124
+ message: "smtp data handling failed",
125
+ meta: { error: error instanceof Error ? error.message : String(error) },
126
+ });
127
+ callback(error instanceof Error ? error : new Error(String(error)));
128
+ }
129
+ },
130
+ });
131
+ (0, runtime_1.emitNervesEvent)({
132
+ component: "senses",
133
+ event: "senses.mail_smtp_server_created",
134
+ message: "mailroom smtp server created",
135
+ meta: { maxMessageBytes },
136
+ });
137
+ return server;
138
+ }
139
+ function createMailroomHealthServer(registry) {
140
+ const server = http.createServer((_request, response) => {
141
+ const body = JSON.stringify({
142
+ ok: true,
143
+ service: "ouro-mailroom",
144
+ domain: registry.domain,
145
+ mailboxes: registry.mailboxes.length,
146
+ sourceGrants: registry.sourceGrants.length,
147
+ });
148
+ response.writeHead(200, {
149
+ "content-type": "application/json",
150
+ "content-length": Buffer.byteLength(body),
151
+ });
152
+ response.end(body);
153
+ });
154
+ (0, runtime_1.emitNervesEvent)({
155
+ component: "senses",
156
+ event: "senses.mail_health_server_created",
157
+ message: "mailroom health server created",
158
+ meta: { domain: registry.domain },
159
+ });
160
+ return server;
161
+ }
162
+ function startMailroomIngress(options) {
163
+ const smtp = createMailroomSmtpServer(options);
164
+ const health = createMailroomHealthServer(options.registry);
165
+ /* v8 ignore next -- production/container entrypoints may omit host; unit tests bind loopback explicitly. @preserve */
166
+ const host = options.host ?? "0.0.0.0";
167
+ smtp.listen(options.smtpPort, host);
168
+ health.listen(options.httpPort, host);
169
+ (0, runtime_1.emitNervesEvent)({
170
+ component: "senses",
171
+ event: "senses.mail_ingress_started",
172
+ message: "mailroom ingress started",
173
+ meta: { smtpPort: options.smtpPort, httpPort: options.httpPort, host },
174
+ });
175
+ return { smtp, health };
176
+ }
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createDelegatedMailSourceState = createDelegatedMailSourceState;
4
+ exports.markMboxBackfillComplete = markMboxBackfillComplete;
5
+ exports.markForwardingProbeResult = markForwardingProbeResult;
6
+ exports.renderDelegatedMailSourceNextStep = renderDelegatedMailSourceNextStep;
7
+ const runtime_1 = require("../nerves/runtime");
8
+ const core_1 = require("./core");
9
+ const HUMAN_REQUIRED = [
10
+ "browser_auth",
11
+ "mfa_or_captcha",
12
+ "export_download",
13
+ "forwarding_confirmation",
14
+ ];
15
+ function normalizedSource(source) {
16
+ const value = source.trim().toLowerCase();
17
+ return value || "hey";
18
+ }
19
+ function normalizedAgentId(agentId) {
20
+ return agentId.trim().toLowerCase();
21
+ }
22
+ function createDelegatedMailSourceState(input) {
23
+ const aliasAddress = (0, core_1.normalizeMailAddress)(input.aliasAddress);
24
+ const state = {
25
+ schemaVersion: 1,
26
+ agentId: normalizedAgentId(input.agentId),
27
+ ownerEmail: (0, core_1.normalizeMailAddress)(input.ownerEmail),
28
+ source: normalizedSource(input.source),
29
+ aliasAddress,
30
+ backfill: {
31
+ status: "not_started",
32
+ },
33
+ forwarding: {
34
+ status: "blocked_by_human",
35
+ targetAlias: aliasAddress,
36
+ browserAutomationOwner: "agent",
37
+ humanRequired: [...HUMAN_REQUIRED],
38
+ },
39
+ };
40
+ (0, runtime_1.emitNervesEvent)({
41
+ component: "senses",
42
+ event: "senses.mail_delegated_source_state_created",
43
+ message: "delegated mail source setup state created",
44
+ meta: {
45
+ agentId: state.agentId,
46
+ source: state.source,
47
+ forwardingStatus: state.forwarding.status,
48
+ backfillStatus: state.backfill.status,
49
+ },
50
+ });
51
+ return state;
52
+ }
53
+ function markMboxBackfillComplete(state, input) {
54
+ const nextState = {
55
+ ...state,
56
+ backfill: {
57
+ status: "ready",
58
+ scanned: input.scanned,
59
+ imported: input.imported,
60
+ duplicates: input.duplicates,
61
+ sourceFreshThrough: input.sourceFreshThrough,
62
+ completedAt: input.completedAt,
63
+ },
64
+ };
65
+ (0, runtime_1.emitNervesEvent)({
66
+ component: "senses",
67
+ event: "senses.mail_delegated_source_backfill_ready",
68
+ message: "delegated mail source archive backfill marked ready",
69
+ meta: {
70
+ agentId: nextState.agentId,
71
+ source: nextState.source,
72
+ scanned: input.scanned,
73
+ imported: input.imported,
74
+ duplicates: input.duplicates,
75
+ sourceFreshThroughKnown: input.sourceFreshThrough !== null,
76
+ },
77
+ });
78
+ return nextState;
79
+ }
80
+ function markForwardingProbeResult(state, input) {
81
+ const expectedRecipient = (0, core_1.normalizeMailAddress)(state.forwarding.targetAlias);
82
+ if (!input.observedRecipient) {
83
+ const nextState = {
84
+ ...state,
85
+ forwarding: {
86
+ ...state.forwarding,
87
+ status: "pending_propagation",
88
+ observedRecipient: null,
89
+ expectedRecipient,
90
+ recoveryAction: "Wait briefly, then have Slugger re-check the delegated source alias before asking the human to change HEY again.",
91
+ },
92
+ };
93
+ (0, runtime_1.emitNervesEvent)({
94
+ component: "senses",
95
+ event: "senses.mail_delegated_source_forwarding_probe",
96
+ message: "delegated mail source forwarding probe checked",
97
+ meta: {
98
+ agentId: nextState.agentId,
99
+ source: nextState.source,
100
+ status: nextState.forwarding.status,
101
+ observedRecipientPresent: false,
102
+ expectedRecipientDomain: expectedRecipient.split("@")[1],
103
+ messageIdPresent: Boolean(input.messageId),
104
+ },
105
+ });
106
+ return nextState;
107
+ }
108
+ const observedRecipient = (0, core_1.normalizeMailAddress)(input.observedRecipient);
109
+ if (observedRecipient !== expectedRecipient) {
110
+ const nextState = {
111
+ ...state,
112
+ forwarding: {
113
+ ...state.forwarding,
114
+ status: "failed_recoverable",
115
+ observedRecipient,
116
+ expectedRecipient,
117
+ ...(input.messageId ? { lastProbeMessageId: input.messageId } : {}),
118
+ recoveryAction: `HEY is forwarding to ${observedRecipient}. Slugger must correct the HEY forwarding target to ${expectedRecipient}; do not import or label that probe as delegated Ari HEY mail.`,
119
+ },
120
+ };
121
+ (0, runtime_1.emitNervesEvent)({
122
+ component: "senses",
123
+ event: "senses.mail_delegated_source_forwarding_probe",
124
+ message: "delegated mail source forwarding probe checked",
125
+ meta: {
126
+ agentId: nextState.agentId,
127
+ source: nextState.source,
128
+ status: nextState.forwarding.status,
129
+ observedRecipientPresent: true,
130
+ observedRecipientMatches: false,
131
+ expectedRecipientDomain: expectedRecipient.split("@")[1],
132
+ observedRecipientDomain: observedRecipient.split("@")[1],
133
+ messageIdPresent: Boolean(input.messageId),
134
+ },
135
+ });
136
+ return nextState;
137
+ }
138
+ const nextState = {
139
+ ...state,
140
+ forwarding: {
141
+ ...state.forwarding,
142
+ status: "ready",
143
+ observedRecipient,
144
+ expectedRecipient,
145
+ verifiedAt: input.checkedAt,
146
+ ...(input.messageId ? { lastProbeMessageId: input.messageId } : {}),
147
+ },
148
+ };
149
+ (0, runtime_1.emitNervesEvent)({
150
+ component: "senses",
151
+ event: "senses.mail_delegated_source_forwarding_probe",
152
+ message: "delegated mail source forwarding probe checked",
153
+ meta: {
154
+ agentId: nextState.agentId,
155
+ source: nextState.source,
156
+ status: nextState.forwarding.status,
157
+ observedRecipientPresent: true,
158
+ observedRecipientMatches: true,
159
+ expectedRecipientDomain: expectedRecipient.split("@")[1],
160
+ observedRecipientDomain: observedRecipient.split("@")[1],
161
+ messageIdPresent: Boolean(input.messageId),
162
+ },
163
+ });
164
+ return nextState;
165
+ }
166
+ function renderDelegatedMailSourceNextStep(state) {
167
+ if (state.forwarding.status === "ready") {
168
+ return `${state.source} forwarding is verified for ${state.aliasAddress}.`;
169
+ }
170
+ return [
171
+ `Slugger should continue ${state.source.toUpperCase()} setup with browser automation where it is safe.`,
172
+ "The human remains at the keyboard for login, MFA/CAPTCHA, export download, and final forwarding confirmation.",
173
+ `Forward ${state.ownerEmail}'s ${state.source} mailbox to ${state.aliasAddress}.`,
174
+ "Do not use the native agent mailbox as the forwarding target.",
175
+ ].join(" ");
176
+ }