@ouro.bot/cli 0.1.0-alpha.95 → 0.1.0-alpha.950

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 (755) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +154 -23
  3. package/RepairGuide.ouro/agent.json +5 -0
  4. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  5. package/RepairGuide.ouro/psyche/SOUL.md +55 -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/assets/bluebubbles-host +264 -0
  14. package/assets/sanctuary-host-launcher.sh +16 -0
  15. package/changelog.json +6015 -16
  16. package/deploy/unraid/Dockerfile +58 -0
  17. package/deploy/unraid/README.txt +2997 -0
  18. package/deploy/unraid/audit-container-spec.sh +4 -0
  19. package/deploy/unraid/container-runtime.json +1 -0
  20. package/deploy/unraid/docker-man-template-transaction.mjs +711 -0
  21. package/deploy/unraid/docker-man-template-xml.cjs +105 -0
  22. package/deploy/unraid/migrate-sanctuary-bundle.mjs +60 -0
  23. package/deploy/unraid/ouro-events/bootstrap-spool.sh +92 -0
  24. package/deploy/unraid/ouro-events/emit-event.mjs +310 -0
  25. package/deploy/unraid/ouro-events/emit-usenet-event.sh +54 -0
  26. package/deploy/unraid/ouro-events/install-usenet-guard.sh +435 -0
  27. package/deploy/unraid/ouro-events/usenet-health.sh +176 -0
  28. package/deploy/unraid/sanctuary-acceptance-adapter.sh +43 -0
  29. package/deploy/unraid/sanctuary-acceptance-contract.json +198 -0
  30. package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
  31. package/deploy/unraid/sanctuary-authority-installation.json +36 -0
  32. package/deploy/unraid/sanctuary-authority-service.sh +30 -0
  33. package/deploy/unraid/sanctuary-butler-upgrade.mjs +1274 -0
  34. package/deploy/unraid/sanctuary-deployment-target.mjs +710 -0
  35. package/deploy/unraid/sanctuary-replay-gate.mjs +1586 -0
  36. package/deploy/unraid/sanctuary-safe-rename.py +24 -0
  37. package/deploy/unraid/sanctuary-unit16-host-broker.mjs +2086 -0
  38. package/deploy/unraid/sanctuary-unit16-run.sh +560 -0
  39. package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
  40. package/deploy/unraid/sanctuary.ouro/agent.json +66 -0
  41. package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
  42. package/deploy/unraid/sanctuary.ouro/awaiting/house-care-sweep.md +17 -0
  43. package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
  44. package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
  45. package/deploy/unraid/sanctuary.ouro/mcp/media-mcp.mjs +2231 -0
  46. package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
  47. package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
  48. package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +5 -0
  49. package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +33 -0
  50. package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +27 -0
  51. package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +22 -0
  52. package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
  53. package/deploy/unraid/sanctuary.ouro/tool-profiles.json +232 -0
  54. package/deploy/unraid/sanctuary.xml +30 -0
  55. package/dist/a2a/card.js +57 -0
  56. package/dist/a2a/client.js +250 -0
  57. package/dist/a2a/config.js +50 -0
  58. package/dist/a2a/delegated-command-grants.js +93 -0
  59. package/dist/a2a/delegated-command.js +197 -0
  60. package/dist/a2a/delegation-stores.js +56 -0
  61. package/dist/a2a/did-resolution.js +93 -0
  62. package/dist/a2a/escalation-grants.js +84 -0
  63. package/dist/a2a/escalation-wiring.js +60 -0
  64. package/dist/a2a/identity.js +258 -0
  65. package/dist/a2a/inbound-share.js +110 -0
  66. package/dist/a2a/mission-result-wire.js +196 -0
  67. package/dist/a2a/onboarding.js +133 -0
  68. package/dist/a2a/operator-trust.js +399 -0
  69. package/dist/a2a/outbox-client.js +57 -0
  70. package/dist/a2a/outbox-store.js +188 -0
  71. package/dist/a2a/outbox-wire.js +95 -0
  72. package/dist/a2a/pin-store.js +132 -0
  73. package/dist/a2a/replay-grant-holders.js +33 -0
  74. package/dist/a2a/replay-harness.js +188 -0
  75. package/dist/a2a/resolution-proof.js +53 -0
  76. package/dist/a2a/sealed-chat.js +113 -0
  77. package/dist/a2a/seen-ledger.js +120 -0
  78. package/dist/a2a/server.js +771 -0
  79. package/dist/a2a/task-store.js +69 -0
  80. package/dist/a2a/transport.js +45 -0
  81. package/dist/a2a/trust-commands.js +203 -0
  82. package/dist/a2a/trusted-files.js +185 -0
  83. package/dist/a2a/types.js +3 -0
  84. package/dist/arc/attention-types.js +8 -0
  85. package/dist/arc/cares.js +360 -0
  86. package/dist/arc/episodes.js +118 -0
  87. package/dist/arc/evolution.js +490 -0
  88. package/dist/arc/flight-recorder.js +1034 -0
  89. package/dist/arc/intentions.js +134 -0
  90. package/dist/arc/json-store.js +117 -0
  91. package/dist/arc/obligations.js +386 -0
  92. package/dist/arc/packets.js +336 -0
  93. package/dist/arc/presence.js +185 -0
  94. package/dist/arc/task-lifecycle.js +57 -0
  95. package/dist/commerce/store.js +755 -0
  96. package/dist/commerce/types.js +3 -0
  97. package/dist/heart/active-work.js +798 -40
  98. package/dist/heart/agent-entry.js +252 -3
  99. package/dist/heart/approval-files.js +113 -0
  100. package/dist/heart/approval-store.js +960 -0
  101. package/dist/heart/attachments/image-normalize.js +201 -0
  102. package/dist/heart/attachments/materialize.js +97 -0
  103. package/dist/heart/attachments/originals.js +88 -0
  104. package/dist/heart/attachments/render.js +29 -0
  105. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  106. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  107. package/dist/heart/attachments/sources/index.js +18 -0
  108. package/dist/heart/attachments/sources/telegram.js +71 -0
  109. package/dist/heart/attachments/store.js +132 -0
  110. package/dist/heart/attachments/types.js +93 -0
  111. package/dist/heart/auth/auth-flow.js +497 -0
  112. package/dist/heart/autonomy-budget.js +478 -0
  113. package/dist/heart/awaiting/a2a-await-delivery.js +109 -0
  114. package/dist/heart/awaiting/await-alert.js +152 -0
  115. package/dist/heart/awaiting/await-expiry.js +143 -0
  116. package/dist/heart/awaiting/await-loader.js +91 -0
  117. package/dist/heart/awaiting/await-parser.js +152 -0
  118. package/dist/heart/awaiting/await-runtime-state.js +111 -0
  119. package/dist/heart/awaiting/await-scheduler.js +391 -0
  120. package/dist/heart/background-operations.js +281 -0
  121. package/dist/heart/bluebubbles-host-account.js +78 -0
  122. package/dist/heart/bridges/manager.js +137 -17
  123. package/dist/heart/bridges/store.js +14 -2
  124. package/dist/heart/bundle-state.js +168 -0
  125. package/dist/heart/commitments.js +44 -18
  126. package/dist/heart/config-registry.js +331 -0
  127. package/dist/heart/config.js +174 -131
  128. package/dist/heart/context-loss-gauntlet.js +387 -0
  129. package/dist/heart/context-loss-sentinel.js +1159 -0
  130. package/dist/heart/core.js +2356 -586
  131. package/dist/heart/cross-chat-delivery.js +9 -22
  132. package/dist/heart/daemon/agent-config-check.js +474 -0
  133. package/dist/heart/daemon/agent-discovery.js +283 -3
  134. package/dist/heart/daemon/agent-home.js +319 -0
  135. package/dist/heart/daemon/agent-service.js +542 -0
  136. package/dist/heart/daemon/agentic-repair.js +547 -0
  137. package/dist/heart/daemon/await-private-wake.js +59 -0
  138. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  139. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  140. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  141. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  142. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  143. package/dist/heart/daemon/cadence.js +180 -0
  144. package/dist/heart/daemon/cli-arg-redaction.js +26 -0
  145. package/dist/heart/daemon/cli-defaults.js +881 -0
  146. package/dist/heart/daemon/cli-desk.js +322 -0
  147. package/dist/heart/daemon/cli-exec.js +9235 -0
  148. package/dist/heart/daemon/cli-help.js +742 -0
  149. package/dist/heart/daemon/cli-parse.js +3236 -0
  150. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  151. package/dist/heart/daemon/cli-render.js +819 -0
  152. package/dist/heart/daemon/cli-types.js +8 -0
  153. package/dist/heart/daemon/connect-bay.js +323 -0
  154. package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
  155. package/dist/heart/daemon/container-healthcheck.js +112 -0
  156. package/dist/heart/daemon/container-runtime.js +97 -0
  157. package/dist/heart/daemon/container-spec-auditor-main.js +171 -0
  158. package/dist/heart/daemon/container-spec-auditor.js +235 -0
  159. package/dist/heart/daemon/daemon-bootstrap-startup.js +115 -0
  160. package/dist/heart/daemon/daemon-cli.js +29 -2360
  161. package/dist/heart/daemon/daemon-entry.js +953 -11
  162. package/dist/heart/daemon/daemon-health.js +186 -0
  163. package/dist/heart/daemon/daemon-rollup.js +57 -0
  164. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  165. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  166. package/dist/heart/daemon/daemon.js +2110 -104
  167. package/dist/heart/daemon/dns-workflow.js +394 -0
  168. package/dist/heart/daemon/doctor-types.js +8 -0
  169. package/dist/heart/daemon/doctor.js +1766 -0
  170. package/dist/heart/daemon/freshness.js +345 -0
  171. package/dist/heart/daemon/habit-private-wake.js +61 -0
  172. package/dist/heart/daemon/health-monitor.js +154 -11
  173. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  174. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  175. package/dist/heart/daemon/http-health-probe.js +80 -0
  176. package/dist/heart/daemon/human-command-screens.js +234 -0
  177. package/dist/heart/daemon/human-readiness.js +114 -0
  178. package/dist/heart/daemon/inner-status.js +78 -0
  179. package/dist/heart/daemon/interactive-repair.js +394 -0
  180. package/dist/heart/daemon/launchd.js +37 -8
  181. package/dist/heart/daemon/log-tailer.js +79 -10
  182. package/dist/heart/daemon/logs-prune.js +132 -0
  183. package/dist/heart/daemon/mcp-canary.js +524 -0
  184. package/dist/heart/daemon/message-router.js +65 -5
  185. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  186. package/dist/heart/daemon/os-cron-deps.js +135 -0
  187. package/dist/heart/daemon/os-cron.js +22 -14
  188. package/dist/heart/daemon/ouro-bot-entry.js +6 -3
  189. package/dist/heart/daemon/ouro-entry.js +9 -3
  190. package/dist/heart/daemon/plugin-cli.js +432 -0
  191. package/dist/heart/daemon/process-manager.js +760 -61
  192. package/dist/heart/daemon/provider-discovery.js +137 -0
  193. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  194. package/dist/heart/daemon/prunable-bundle.js +144 -0
  195. package/dist/heart/daemon/pulse.js +511 -0
  196. package/dist/heart/daemon/readiness-repair.js +365 -0
  197. package/dist/heart/daemon/run-hooks.js +2 -0
  198. package/dist/heart/daemon/runtime-logging.js +47 -14
  199. package/dist/heart/daemon/runtime-metadata.js +2 -30
  200. package/dist/heart/daemon/runtime-mode.js +13 -2
  201. package/dist/heart/daemon/safe-mode.js +161 -0
  202. package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2654 -0
  203. package/dist/heart/daemon/sanctuary-acceptance-harness.js +1830 -0
  204. package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
  205. package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +955 -0
  206. package/dist/heart/daemon/sanctuary-authority-codec.js +86 -0
  207. package/dist/heart/daemon/sanctuary-authority-epoch.js +281 -0
  208. package/dist/heart/daemon/sanctuary-authority-installation.js +161 -0
  209. package/dist/heart/daemon/sanctuary-authority-ledger.js +241 -0
  210. package/dist/heart/daemon/sanctuary-authority-root-lifecycle.js +1282 -0
  211. package/dist/heart/daemon/sanctuary-authority-vault-migration.js +79 -0
  212. package/dist/heart/daemon/sanctuary-bundle-migration.js +730 -0
  213. package/dist/heart/daemon/sanctuary-host-authority.js +1008 -0
  214. package/dist/heart/daemon/sanctuary-host-detached-supervisor.js +493 -0
  215. package/dist/heart/daemon/sanctuary-host-executor.js +670 -0
  216. package/dist/heart/daemon/sanctuary-host-linux-kernel.js +334 -0
  217. package/dist/heart/daemon/sanctuary-host-supervisor-entry.js +207 -0
  218. package/dist/heart/daemon/sanctuary-host-supervisor.js +95 -0
  219. package/dist/heart/daemon/sanctuary-package-management.js +103 -0
  220. package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
  221. package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
  222. package/dist/heart/daemon/sanctuary-telegram-authority-entry.js +475 -0
  223. package/dist/heart/daemon/sanctuary-telegram-authority-gateway.js +585 -0
  224. package/dist/heart/daemon/sanctuary-telegram-authority-service.js +676 -0
  225. package/dist/heart/daemon/sense-manager.js +786 -48
  226. package/dist/heart/daemon/session-id-resolver.js +131 -0
  227. package/dist/heart/daemon/skill-management-installer.js +1 -1
  228. package/dist/heart/daemon/socket-client.js +180 -12
  229. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  230. package/dist/heart/daemon/startup-tui.js +339 -0
  231. package/dist/heart/daemon/supercronic-supervisor.js +282 -0
  232. package/dist/heart/daemon/task-scheduler.js +117 -39
  233. package/dist/heart/daemon/terminal-ui.js +503 -0
  234. package/dist/heart/daemon/thoughts.js +138 -54
  235. package/dist/heart/daemon/up-progress.js +366 -0
  236. package/dist/heart/daemon/vault-items.js +56 -0
  237. package/dist/heart/delegation.js +1 -4
  238. package/dist/heart/external-events/router.js +1523 -0
  239. package/dist/heart/failure-reports.js +336 -0
  240. package/dist/heart/file-lock.js +109 -0
  241. package/dist/heart/frontend-approval-runtime.js +506 -0
  242. package/dist/heart/frontend-journal.js +215 -0
  243. package/dist/heart/frontend-session-service.js +271 -0
  244. package/dist/heart/frontend-socket-client.js +173 -0
  245. package/dist/heart/frontend-socket.js +434 -0
  246. package/dist/heart/frontend-turn-errors.js +20 -0
  247. package/dist/heart/habits/habit-cancel.js +810 -0
  248. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  249. package/dist/heart/habits/habit-migration.js +194 -0
  250. package/dist/heart/habits/habit-parser.js +278 -0
  251. package/dist/heart/habits/habit-runtime-state.js +93 -0
  252. package/dist/heart/habits/habit-scheduler.js +653 -0
  253. package/dist/heart/habits/habit-session-summary.js +318 -0
  254. package/dist/heart/habits/habit-session.js +636 -0
  255. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
  256. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  257. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  258. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  259. package/dist/heart/identity.js +239 -59
  260. package/dist/heart/kept-notes.js +289 -0
  261. package/dist/heart/kicks.js +1 -1
  262. package/dist/heart/machine-identity.js +175 -0
  263. package/dist/heart/mail-import-discovery.js +356 -0
  264. package/dist/heart/mailbox/mailbox-http-hooks.js +99 -0
  265. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  266. package/dist/heart/mailbox/mailbox-http-routes.js +406 -0
  267. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  268. package/dist/heart/mailbox/mailbox-http-transport.js +272 -0
  269. package/dist/heart/mailbox/mailbox-http.js +99 -0
  270. package/dist/heart/mailbox/mailbox-read.js +41 -0
  271. package/dist/heart/mailbox/mailbox-supervision.js +131 -0
  272. package/dist/heart/mailbox/mailbox-types.js +27 -0
  273. package/dist/heart/mailbox/mailbox-view.js +197 -0
  274. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  275. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  276. package/dist/heart/mailbox/readers/mail.js +375 -0
  277. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  278. package/dist/heart/mailbox/readers/sessions.js +231 -0
  279. package/dist/heart/mailbox/readers/shared.js +111 -0
  280. package/dist/heart/mcp/mcp-server.js +760 -0
  281. package/dist/heart/migrate-config.js +100 -0
  282. package/dist/heart/model-capabilities.js +83 -16
  283. package/dist/heart/orientation-frame.js +345 -0
  284. package/dist/heart/platform.js +81 -0
  285. package/dist/heart/primitives.js +1 -1
  286. package/dist/heart/private-runtime/decision-renderer.js +158 -0
  287. package/dist/heart/private-runtime/index.js +18 -0
  288. package/dist/heart/private-runtime/ledger.js +221 -0
  289. package/dist/heart/private-runtime/policy.js +260 -0
  290. package/dist/heart/private-runtime/types.js +2 -0
  291. package/dist/heart/progress-story.js +1 -1
  292. package/dist/heart/provider-attempt.js +137 -0
  293. package/dist/heart/provider-binding-resolver.js +273 -0
  294. package/dist/heart/provider-credentials.js +449 -0
  295. package/dist/heart/provider-failover.js +311 -0
  296. package/dist/heart/provider-models.js +96 -0
  297. package/dist/heart/provider-ping.js +265 -0
  298. package/dist/heart/provider-readiness-cache.js +119 -0
  299. package/dist/heart/provider-visibility.js +188 -0
  300. package/dist/heart/providers/anthropic-token.js +131 -0
  301. package/dist/heart/providers/anthropic.js +176 -60
  302. package/dist/heart/providers/azure.js +23 -11
  303. package/dist/heart/providers/error-classification.js +129 -0
  304. package/dist/heart/providers/github-copilot.js +38 -39
  305. package/dist/heart/providers/minimax-vlm.js +189 -0
  306. package/dist/heart/providers/minimax.js +26 -8
  307. package/dist/heart/providers/openai-codex-token.js +349 -0
  308. package/dist/heart/providers/openai-codex.js +55 -40
  309. package/dist/heart/providers/openai-compatible.js +177 -0
  310. package/dist/heart/reach-channel.js +85 -0
  311. package/dist/heart/reply-style.js +52 -0
  312. package/dist/heart/run-ledger.js +247 -0
  313. package/dist/heart/runtime-capability-check.js +170 -0
  314. package/dist/heart/runtime-credentials.js +607 -0
  315. package/dist/heart/runtime-cwd.js +87 -0
  316. package/dist/heart/sense-truth.js +24 -4
  317. package/dist/heart/session-activity.js +94 -24
  318. package/dist/heart/session-events.js +1521 -0
  319. package/dist/heart/session-playback-cli-main.js +5 -0
  320. package/dist/heart/session-playback-cli.js +36 -0
  321. package/dist/heart/session-playback.js +231 -0
  322. package/dist/heart/session-redaction-repair-cli-main.js +31 -0
  323. package/dist/heart/session-redaction-repair.js +552 -0
  324. package/dist/heart/session-stats-cli-main.js +5 -0
  325. package/dist/heart/session-stats.js +183 -0
  326. package/dist/heart/session-transcript.js +133 -0
  327. package/dist/heart/shelf-claims.js +78 -0
  328. package/dist/heart/shepherd/custody-types.js +2 -0
  329. package/dist/heart/shepherd/mandates.js +352 -0
  330. package/dist/heart/shepherd/operation-commands.js +19 -0
  331. package/dist/heart/shepherd/operations.js +135 -0
  332. package/dist/heart/shepherd/supervision.js +114 -0
  333. package/dist/heart/shepherd/types.js +2 -0
  334. package/dist/heart/shepherd-config.js +113 -0
  335. package/dist/heart/source-grounding.js +297 -0
  336. package/dist/heart/start-of-turn-packet.js +372 -0
  337. package/dist/heart/steward-policy.js +656 -0
  338. package/dist/heart/streaming.js +631 -207
  339. package/dist/heart/structured-output.js +196 -0
  340. package/dist/heart/sync-classification.js +176 -0
  341. package/dist/heart/sync-health.js +152 -0
  342. package/dist/heart/sync.js +726 -0
  343. package/dist/heart/target-resolution.js +11 -7
  344. package/dist/heart/tempo.js +93 -0
  345. package/dist/heart/temporal-view.js +41 -0
  346. package/dist/heart/timeouts.js +101 -0
  347. package/dist/heart/tool-activity-callbacks.js +59 -0
  348. package/dist/heart/tool-approval.js +382 -0
  349. package/dist/heart/tool-description.js +155 -0
  350. package/dist/heart/tool-friction.js +55 -0
  351. package/dist/heart/tool-loop.js +206 -0
  352. package/dist/heart/turn-context.js +496 -0
  353. package/dist/heart/turn-execution-lease.js +30 -0
  354. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  355. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +3 -2
  356. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  357. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  358. package/dist/heart/versioning/ouro-version-manager.js +432 -0
  359. package/dist/heart/versioning/release-sources.js +173 -0
  360. package/dist/heart/versioning/self-update-defaults.js +294 -0
  361. package/dist/heart/versioning/self-update.js +196 -0
  362. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  363. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  364. package/dist/heart/versioning/update-hooks.js +154 -0
  365. package/dist/heart/versioning/update-state.js +126 -0
  366. package/dist/heart/versioning/updater-launchd.js +150 -0
  367. package/dist/heart/versioning/version-intent.js +114 -0
  368. package/dist/heart/work-card.js +380 -0
  369. package/dist/mailbox-ui/assets/index-Dbska1tZ.js +1 -0
  370. package/dist/mailbox-ui/assets/index-DsiKaPyH.css +1 -0
  371. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  372. package/dist/mailbox-ui/index.html +16 -0
  373. package/dist/mailroom/attention.js +167 -0
  374. package/dist/mailroom/autonomy.js +209 -0
  375. package/dist/mailroom/blob-store.js +889 -0
  376. package/dist/mailroom/body-cache.js +61 -0
  377. package/dist/mailroom/cache-sync-cli.js +58 -0
  378. package/dist/mailroom/core.js +803 -0
  379. package/dist/mailroom/entry.js +160 -0
  380. package/dist/mailroom/file-store.js +568 -0
  381. package/dist/mailroom/hosted-cache-sync.js +384 -0
  382. package/dist/mailroom/mbox-import.js +393 -0
  383. package/dist/mailroom/migration.js +164 -0
  384. package/dist/mailroom/outbound.js +380 -0
  385. package/dist/mailroom/policy.js +263 -0
  386. package/dist/mailroom/reader.js +292 -0
  387. package/dist/mailroom/search-cache.js +513 -0
  388. package/dist/mailroom/search-relevance.js +319 -0
  389. package/dist/mailroom/smtp-ingress.js +176 -0
  390. package/dist/mailroom/source-state.js +176 -0
  391. package/dist/mailroom/thread.js +109 -0
  392. package/dist/mailroom/travel-extract.js +89 -0
  393. package/dist/mind/bundle-manifest.js +24 -2
  394. package/dist/mind/context.js +328 -139
  395. package/dist/mind/desk-section.js +362 -0
  396. package/dist/mind/diary-integrity.js +60 -0
  397. package/dist/mind/{memory.js → diary.js} +68 -77
  398. package/dist/mind/embedding-provider.js +60 -0
  399. package/dist/mind/file-state.js +179 -0
  400. package/dist/mind/friend-link-codes.js +209 -0
  401. package/dist/mind/friend-merge.js +330 -0
  402. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  403. package/dist/mind/obligation-steering.js +199 -3
  404. package/dist/mind/outbound-record.js +165 -0
  405. package/dist/mind/pending.js +36 -10
  406. package/dist/mind/prompt-budget.js +479 -0
  407. package/dist/mind/prompt-refresh.js +3 -2
  408. package/dist/mind/prompt.js +1085 -198
  409. package/dist/mind/provenance-trust.js +26 -0
  410. package/dist/mind/record-paths.js +312 -0
  411. package/dist/mind/scrutiny.js +173 -0
  412. package/dist/mind/session-transaction.js +622 -0
  413. package/dist/nerves/cli-logging.js +7 -1
  414. package/dist/nerves/coverage/audit-rules.js +15 -6
  415. package/dist/nerves/coverage/audit.js +28 -2
  416. package/dist/nerves/coverage/cli.js +1 -1
  417. package/dist/nerves/coverage/contract.js +5 -5
  418. package/dist/nerves/coverage/file-completeness.js +143 -5
  419. package/dist/nerves/coverage/run-artifacts.js +55 -35
  420. package/dist/nerves/coverage/source-scanner.js +4 -4
  421. package/dist/nerves/event-buffer.js +111 -0
  422. package/dist/nerves/index.js +293 -9
  423. package/dist/nerves/observation.js +20 -0
  424. package/dist/nerves/redact.js +79 -0
  425. package/dist/nerves/review/cli-main.js +5 -0
  426. package/dist/nerves/review/cli.js +156 -0
  427. package/dist/nerves/review/core.js +159 -0
  428. package/dist/nerves/runtime.js +17 -1
  429. package/dist/repertoire/ado-client.js +15 -56
  430. package/dist/repertoire/ado-semantic.js +16 -10
  431. package/dist/repertoire/api-client.js +97 -0
  432. package/dist/repertoire/bitwarden-store.js +1201 -0
  433. package/dist/repertoire/bundle-templates.js +71 -0
  434. package/dist/repertoire/bw-installer.js +231 -0
  435. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  436. package/dist/repertoire/coding/context-pack.js +331 -0
  437. package/dist/repertoire/coding/feedback.js +174 -32
  438. package/dist/repertoire/coding/index.js +15 -3
  439. package/dist/repertoire/coding/manager.js +159 -10
  440. package/dist/repertoire/coding/spawner.js +40 -11
  441. package/dist/repertoire/coding/tools.js +182 -18
  442. package/dist/repertoire/coding/workbench-client.js +272 -0
  443. package/dist/repertoire/coding/workbench-manager.js +346 -0
  444. package/dist/repertoire/commerce-errors.js +109 -0
  445. package/dist/repertoire/commerce-self-test.js +156 -0
  446. package/dist/repertoire/credential-access.js +183 -0
  447. package/dist/repertoire/desk/classifier.js +362 -0
  448. package/dist/repertoire/duffel-client.js +185 -0
  449. package/dist/repertoire/github-client.js +14 -55
  450. package/dist/repertoire/graph-client.js +11 -52
  451. package/dist/repertoire/guardrails.js +971 -20
  452. package/dist/repertoire/house-sweep.js +469 -0
  453. package/dist/repertoire/mcp-client.js +58 -5
  454. package/dist/repertoire/mcp-manager.js +427 -139
  455. package/dist/repertoire/mcp-tools.js +132 -0
  456. package/dist/repertoire/mcp-write-guard.js +46 -0
  457. package/dist/repertoire/plugin-mcp.js +175 -0
  458. package/dist/repertoire/plugins.js +253 -0
  459. package/dist/repertoire/relationship-authorization.js +322 -0
  460. package/dist/repertoire/sanctuary-container-policy.js +46 -0
  461. package/dist/repertoire/shell-sessions.js +134 -0
  462. package/dist/repertoire/skills.js +48 -4
  463. package/dist/repertoire/stripe-client.js +131 -0
  464. package/dist/repertoire/tool-arguments.js +182 -0
  465. package/dist/repertoire/tool-results.js +29 -0
  466. package/dist/repertoire/tools-a2a.js +699 -0
  467. package/dist/repertoire/tools-attachments.js +322 -0
  468. package/dist/repertoire/tools-awaiting.js +872 -0
  469. package/dist/repertoire/tools-base.js +83 -1168
  470. package/dist/repertoire/tools-bluebubbles.js +2 -0
  471. package/dist/repertoire/tools-bridge.js +144 -0
  472. package/dist/repertoire/tools-bundle.js +995 -0
  473. package/dist/repertoire/tools-commerce.js +253 -0
  474. package/dist/repertoire/tools-config.js +186 -0
  475. package/dist/repertoire/tools-continuity.js +582 -0
  476. package/dist/repertoire/tools-credential.js +383 -0
  477. package/dist/repertoire/tools-escalation.js +84 -0
  478. package/dist/repertoire/tools-evolution.js +527 -0
  479. package/dist/repertoire/tools-files.js +344 -0
  480. package/dist/repertoire/tools-flight.js +290 -0
  481. package/dist/repertoire/tools-flow.js +119 -0
  482. package/dist/repertoire/tools-friend-link.js +57 -0
  483. package/dist/repertoire/tools-github.js +3 -8
  484. package/dist/repertoire/tools-habits.js +103 -0
  485. package/dist/repertoire/tools-house-care.js +174 -0
  486. package/dist/repertoire/tools-mail.js +1828 -0
  487. package/dist/repertoire/tools-notes.js +501 -0
  488. package/dist/repertoire/tools-obligations.js +182 -0
  489. package/dist/repertoire/tools-orientation.js +31 -0
  490. package/dist/repertoire/tools-record.js +482 -0
  491. package/dist/repertoire/tools-rsvp.js +139 -0
  492. package/dist/repertoire/tools-runtime.js +238 -0
  493. package/dist/repertoire/tools-sanctuary-host.js +202 -0
  494. package/dist/repertoire/tools-session.js +1141 -0
  495. package/dist/repertoire/tools-shell.js +154 -0
  496. package/dist/repertoire/tools-shepherd-guidance.js +171 -0
  497. package/dist/repertoire/tools-shepherd.js +323 -0
  498. package/dist/repertoire/tools-steward-policy.js +147 -0
  499. package/dist/repertoire/tools-stripe.js +224 -0
  500. package/dist/repertoire/tools-surface.js +369 -0
  501. package/dist/repertoire/tools-teams.js +50 -39
  502. package/dist/repertoire/tools-telegram-contacts.js +37 -0
  503. package/dist/repertoire/tools-travel.js +125 -0
  504. package/dist/repertoire/tools-trip.js +982 -0
  505. package/dist/repertoire/tools-unraid.js +556 -0
  506. package/dist/repertoire/tools-user-profile.js +146 -0
  507. package/dist/repertoire/tools-vault.js +40 -0
  508. package/dist/repertoire/tools-voice-local.js +198 -0
  509. package/dist/repertoire/tools-voice.js +145 -0
  510. package/dist/repertoire/tools.js +518 -156
  511. package/dist/repertoire/travel-api-client.js +360 -0
  512. package/dist/repertoire/unraid-client.js +155 -0
  513. package/dist/repertoire/unraid-restart.js +339 -0
  514. package/dist/repertoire/user-profile.js +131 -0
  515. package/dist/repertoire/vault-setup.js +246 -0
  516. package/dist/repertoire/vault-unlock.js +686 -0
  517. package/dist/rsvp/aisleplanner-client.js +354 -0
  518. package/dist/rsvp/cli.js +936 -0
  519. package/dist/rsvp/config.js +327 -0
  520. package/dist/rsvp/cutover.js +433 -0
  521. package/dist/rsvp/diagnostics.js +232 -0
  522. package/dist/rsvp/diff-renderer.js +176 -0
  523. package/dist/rsvp/habit-policy.js +110 -0
  524. package/dist/rsvp/habit-stage.js +123 -0
  525. package/dist/rsvp/incident-bundle.js +97 -0
  526. package/dist/rsvp/migration.js +204 -0
  527. package/dist/rsvp/native-habit-runner.js +630 -0
  528. package/dist/rsvp/outbound-state.js +628 -0
  529. package/dist/rsvp/query.js +118 -0
  530. package/dist/rsvp/replay.js +233 -0
  531. package/dist/rsvp/snapshot.js +232 -0
  532. package/dist/rsvp/spend-ledger.js +175 -0
  533. package/dist/scripts/claude-code-hook.js +41 -0
  534. package/dist/scripts/claude-code-stop-hook.js +47 -0
  535. package/dist/senses/a2a-entry.js +132 -0
  536. package/dist/senses/acp-server.js +386 -0
  537. package/dist/senses/attention-queue.js +186 -0
  538. package/dist/senses/await-turn-message.js +65 -0
  539. package/dist/senses/bluebubbles/active-turns.js +216 -0
  540. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  541. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  542. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +385 -43
  543. package/dist/senses/bluebubbles/context-packet.js +207 -0
  544. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  545. package/dist/senses/bluebubbles/entry.js +90 -0
  546. package/dist/senses/bluebubbles/host-account-verifier.js +88 -0
  547. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
  548. package/dist/senses/bluebubbles/index.js +3940 -0
  549. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  550. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  551. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
  552. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
  553. package/dist/senses/bluebubbles/outbound-state.js +308 -0
  554. package/dist/senses/bluebubbles/processed-log.js +133 -0
  555. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  556. package/dist/senses/bluebubbles/replay.js +284 -0
  557. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  558. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  559. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  560. package/dist/senses/bluebubbles/webhook-registration.js +257 -0
  561. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  562. package/dist/senses/cli/bracketed-paste.js +82 -0
  563. package/dist/senses/cli/image-paste.js +287 -0
  564. package/dist/senses/cli/image-ref-navigation.js +75 -0
  565. package/dist/senses/cli/ink-app.js +156 -0
  566. package/dist/senses/cli/inline-diff.js +64 -0
  567. package/dist/senses/cli/input-keys.js +174 -0
  568. package/dist/senses/cli/kill-ring.js +86 -0
  569. package/dist/senses/cli/message-list.js +51 -0
  570. package/dist/senses/cli/ouro-tui.js +607 -0
  571. package/dist/senses/cli/spinner-imperative.js +135 -0
  572. package/dist/senses/cli/spinner.js +101 -0
  573. package/dist/senses/cli/status-line.js +60 -0
  574. package/dist/senses/cli/streaming-markdown.js +526 -0
  575. package/dist/senses/cli/tool-display.js +85 -0
  576. package/dist/senses/cli/tool-render.js +85 -0
  577. package/dist/senses/cli/tui-store.js +241 -0
  578. package/dist/senses/cli/virtual-list.js +35 -0
  579. package/dist/senses/cli-entry.js +60 -8
  580. package/dist/senses/cli.js +570 -309
  581. package/dist/senses/commands.js +66 -3
  582. package/dist/senses/context-packet-ledger.js +371 -0
  583. package/dist/senses/context-packets.js +154 -0
  584. package/dist/senses/habit-lifecycle-guard.js +24 -0
  585. package/dist/senses/habit-turn-message.js +160 -0
  586. package/dist/senses/ingress-evidence.js +2 -0
  587. package/dist/senses/mail-entry.js +66 -0
  588. package/dist/senses/mail.js +524 -0
  589. package/dist/senses/pipeline.js +1158 -204
  590. package/dist/senses/private-runtime-worker.js +805 -0
  591. package/dist/senses/private-runtime.js +1627 -0
  592. package/dist/senses/proactive-content-guard.js +51 -0
  593. package/dist/senses/root-host-approval-port.js +345 -0
  594. package/dist/senses/root-host-approval-runtime.js +393 -0
  595. package/dist/senses/sanctuary-authority-resident.js +102 -0
  596. package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
  597. package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
  598. package/dist/senses/sanctuary-grounding.js +118 -0
  599. package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
  600. package/dist/senses/sanctuary-health-acceptance-probe.js +774 -0
  601. package/dist/senses/sanctuary-health-runner.js +104 -0
  602. package/dist/senses/sanctuary-health.js +422 -0
  603. package/dist/senses/sanctuary-install-state-contract.js +169 -0
  604. package/dist/senses/sanctuary-interactive-control.js +410 -0
  605. package/dist/senses/sanctuary-media-catalog-contract.js +268 -0
  606. package/dist/senses/sanctuary-media-optimization.js +514 -0
  607. package/dist/senses/sanctuary-runtime.js +369 -0
  608. package/dist/senses/sanctuary-sab.js +85 -0
  609. package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
  610. package/dist/senses/shared-turn.js +804 -0
  611. package/dist/senses/shepherd/agent-presentation.js +88 -0
  612. package/dist/senses/shepherd/attention-page.js +166 -0
  613. package/dist/senses/shepherd/attention-sidebar.js +76 -0
  614. package/dist/senses/shepherd/attention.js +295 -0
  615. package/dist/senses/shepherd/checkin-config.js +76 -0
  616. package/dist/senses/shepherd/checkin-store.js +386 -0
  617. package/dist/senses/shepherd/client.js +196 -0
  618. package/dist/senses/shepherd/cmux.js +483 -0
  619. package/dist/senses/shepherd/composer.js +336 -0
  620. package/dist/senses/shepherd/feedback-reply.js +108 -0
  621. package/dist/senses/shepherd/feedback-source.js +20 -0
  622. package/dist/senses/shepherd/feedback-store.js +331 -0
  623. package/dist/senses/shepherd/feedback-submit.js +182 -0
  624. package/dist/senses/shepherd/feedback-worker.js +208 -0
  625. package/dist/senses/shepherd/guidance.js +273 -0
  626. package/dist/senses/shepherd/herdr.js +427 -0
  627. package/dist/senses/shepherd/host.js +14 -0
  628. package/dist/senses/shepherd/human-decision-guard.js +29 -0
  629. package/dist/senses/shepherd/judge-evaluation-command.js +183 -0
  630. package/dist/senses/shepherd/judge-evaluation-entry.js +13 -0
  631. package/dist/senses/shepherd/judge-evaluation.js +155 -0
  632. package/dist/senses/shepherd/judge.js +202 -0
  633. package/dist/senses/shepherd/notice-outbox.js +262 -0
  634. package/dist/senses/shepherd/observation-publisher.js +320 -0
  635. package/dist/senses/shepherd/operations-defaults.js +86 -0
  636. package/dist/senses/shepherd/operations.js +159 -0
  637. package/dist/senses/shepherd/owner-notice.js +465 -0
  638. package/dist/senses/shepherd/prompt-state.js +60 -0
  639. package/dist/senses/shepherd/recovery.js +543 -0
  640. package/dist/senses/shepherd/redact.js +66 -0
  641. package/dist/senses/shepherd/returns.js +79 -0
  642. package/dist/senses/shepherd/sense.js +821 -0
  643. package/dist/senses/shepherd/shepherd-judge-corpus-v1.json +170 -0
  644. package/dist/senses/shepherd/surface.js +123 -0
  645. package/dist/senses/shepherd/target-binding.js +13 -0
  646. package/dist/senses/shepherd/terminal-process.js +147 -0
  647. package/dist/senses/shepherd-entry.js +98 -0
  648. package/dist/senses/surface-tool.js +109 -0
  649. package/dist/senses/teams-entry.js +68 -8
  650. package/dist/senses/teams-image.js +119 -0
  651. package/dist/senses/teams.js +949 -337
  652. package/dist/senses/telegram-admission.js +718 -0
  653. package/dist/senses/telegram-approval-runtime.js +793 -0
  654. package/dist/senses/telegram-attachments.js +186 -0
  655. package/dist/senses/telegram-audit-ledger.js +220 -0
  656. package/dist/senses/telegram-authority-transport.js +231 -0
  657. package/dist/senses/telegram-client.js +1749 -0
  658. package/dist/senses/telegram-effect-adapter.js +904 -0
  659. package/dist/senses/telegram-entry.js +83 -0
  660. package/dist/senses/telegram-handoff.js +80 -0
  661. package/dist/senses/telegram.js +2435 -0
  662. package/dist/senses/trust-gate.js +104 -9
  663. package/dist/senses/voice/audio-playback.js +237 -0
  664. package/dist/senses/voice/audio-routing.js +119 -0
  665. package/dist/senses/voice/call-auth.js +250 -0
  666. package/dist/senses/voice/elevenlabs.js +202 -0
  667. package/dist/senses/voice/floor-control.js +431 -0
  668. package/dist/senses/voice/floor-controller.js +115 -0
  669. package/dist/senses/voice/golden-path.js +116 -0
  670. package/dist/senses/voice/index.js +29 -0
  671. package/dist/senses/voice/local-audio-control.js +344 -0
  672. package/dist/senses/voice/local-audio-devices.js +516 -0
  673. package/dist/senses/voice/local-audio-disclosure.js +174 -0
  674. package/dist/senses/voice/local-audio-identity.js +103 -0
  675. package/dist/senses/voice/local-audio-join.js +325 -0
  676. package/dist/senses/voice/local-audio-mute.js +199 -0
  677. package/dist/senses/voice/local-audio-notify.js +124 -0
  678. package/dist/senses/voice/local-audio-prompts.js +116 -0
  679. package/dist/senses/voice/local-audio-transport.js +427 -0
  680. package/dist/senses/voice/local-audio.js +281 -0
  681. package/dist/senses/voice/local-media-stream.js +145 -0
  682. package/dist/senses/voice/meeting.js +113 -0
  683. package/dist/senses/voice/outbound.js +190 -0
  684. package/dist/senses/voice/phone.js +33 -0
  685. package/dist/senses/voice/playback.js +139 -0
  686. package/dist/senses/voice/process-guards.js +51 -0
  687. package/dist/senses/voice/realtime-eval.js +496 -0
  688. package/dist/senses/voice/realtime-tool-schema.js +195 -0
  689. package/dist/senses/voice/realtime-trace.js +531 -0
  690. package/dist/senses/voice/transcript.js +70 -0
  691. package/dist/senses/voice/turn.js +191 -0
  692. package/dist/senses/voice/twilio-phone-runtime.js +836 -0
  693. package/dist/senses/voice/twilio-phone.js +5454 -0
  694. package/dist/senses/voice/types.js +2 -0
  695. package/dist/senses/voice/whisper.js +161 -0
  696. package/dist/senses/voice-entry.js +83 -0
  697. package/dist/senses/voice-realtime-eval-command.js +99 -0
  698. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  699. package/dist/senses/voice-twilio-entry.js +87 -0
  700. package/dist/trips/core.js +138 -0
  701. package/dist/trips/store.js +265 -0
  702. package/dist/util/frontmatter.js +69 -0
  703. package/npm-shrinkwrap.json +8165 -0
  704. package/package.json +75 -13
  705. package/skills/agent-commerce.md +113 -0
  706. package/skills/browser-navigation.md +117 -0
  707. package/skills/commerce-setup-guide.md +116 -0
  708. package/skills/commerce-setup.md +84 -0
  709. package/skills/configure-dev-tools.md +99 -0
  710. package/skills/travel-planning.md +138 -0
  711. package/dist/heart/daemon/auth-flow.js +0 -430
  712. package/dist/heart/daemon/ouro-path-installer.js +0 -260
  713. package/dist/heart/daemon/ouro-version-manager.js +0 -171
  714. package/dist/heart/daemon/update-hooks.js +0 -138
  715. package/dist/heart/obligations.js +0 -191
  716. package/dist/heart/safe-workspace.js +0 -362
  717. package/dist/heart/session-recall.js +0 -116
  718. package/dist/mind/friends/channel.js +0 -84
  719. package/dist/mind/friends/group-context.js +0 -144
  720. package/dist/mind/friends/resolver.js +0 -84
  721. package/dist/mind/friends/store-file.js +0 -190
  722. package/dist/mind/friends/store.js +0 -4
  723. package/dist/mind/friends/tokens.js +0 -26
  724. package/dist/mind/friends/trust-explanation.js +0 -74
  725. package/dist/mind/friends/types.js +0 -29
  726. package/dist/repertoire/tasks/board.js +0 -134
  727. package/dist/repertoire/tasks/index.js +0 -224
  728. package/dist/repertoire/tasks/lifecycle.js +0 -80
  729. package/dist/repertoire/tasks/middleware.js +0 -65
  730. package/dist/repertoire/tasks/parser.js +0 -173
  731. package/dist/repertoire/tasks/scanner.js +0 -132
  732. package/dist/repertoire/tasks/transitions.js +0 -144
  733. package/dist/senses/bluebubbles-entry.js +0 -13
  734. package/dist/senses/bluebubbles.js +0 -1181
  735. package/dist/senses/debug-activity.js +0 -154
  736. package/dist/senses/inner-dialog-worker.js +0 -90
  737. package/dist/senses/inner-dialog.js +0 -525
  738. package/subagents/README.md +0 -7
  739. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  740. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  741. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  742. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  743. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  744. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  745. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  746. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  747. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  748. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  749. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  750. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  751. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  752. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  753. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  754. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  755. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,465 @@
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.NOTICE_RETRY_MS = exports.NOTICE_LIST_MAX = exports.NOTICE_COALESCE_MS = void 0;
37
+ exports.noticeWanted = noticeWanted;
38
+ exports.plain = plain;
39
+ exports.noticeLine = noticeLine;
40
+ exports.noticeMessage = noticeMessage;
41
+ exports.readEnabledReachChannels = readEnabledReachChannels;
42
+ exports.resolveNoticeTargets = resolveNoticeTargets;
43
+ exports.noticeDeliveryId = noticeDeliveryId;
44
+ exports.chooseTeamsBot = chooseTeamsBot;
45
+ exports.createNoticeSender = createNoticeSender;
46
+ exports.createOwnerNotifier = createOwnerNotifier;
47
+ const node_crypto_1 = require("node:crypto");
48
+ const path = __importStar(require("node:path"));
49
+ const friends_1 = require("@ouro.bot/friends");
50
+ const await_alert_1 = require("../../heart/awaiting/await-alert");
51
+ const config_1 = require("../../heart/config");
52
+ const identity_1 = require("../../heart/identity");
53
+ const reach_channel_1 = require("../../heart/reach-channel");
54
+ const runtime_1 = require("../../nerves/runtime");
55
+ const notice_outbox_1 = require("./notice-outbox");
56
+ /**
57
+ * The owner notice: after a judged return, the agent's owner hears what happened in one short plain message on their
58
+ * own channel. It is deterministic, written here and sent with no model turn, so the owner hears about every return the
59
+ * policy covers whether or not the Ouro agent decides it matters. Returns that arrive close together share one message.
60
+ */
61
+ exports.NOTICE_COALESCE_MS = 5_000;
62
+ /** Distinct sessions named in a digest; the remaining sessions are counted. */
63
+ exports.NOTICE_LIST_MAX = 6;
64
+ exports.NOTICE_RETRY_MS = 30_000;
65
+ const NAME_MAX = 60;
66
+ const REASON_MAX = 300;
67
+ const REPLY_MAX = 240;
68
+ const BLOCK_DESCRIPTION = {
69
+ reply_invalid: "the suggested reply was invalid",
70
+ menu_disallowed: "scheduled continuation cannot approve a menu",
71
+ host_unverified: "the host could not verify safe input state",
72
+ guidance: "operator guidance blocked input",
73
+ loop_guard: "the reply limit was reached",
74
+ focus: "the human owns the focused session",
75
+ state_changed: "the target state changed",
76
+ custody: "input delivery was already claimed or needs reconciliation",
77
+ stopped: "Shepherd stopped",
78
+ };
79
+ /** Kinds a "needs-me" owner still hears about. */
80
+ const NEEDS_ME = new Set(["gate", "done", "loop_guard"]);
81
+ function noticeWanted(policy, record) {
82
+ if (policy === "off")
83
+ return false;
84
+ return policy === "every" || NEEDS_ME.has(record.kind);
85
+ }
86
+ /**
87
+ * Untrusted terminal text as one bounded plain line: no control or invisible characters, and nothing Teams could read as
88
+ * markup, a mention or code (`< > [ ] * ~ # | \ @` and backticks). Double quotes become single, so a quoted reply stays one quote.
89
+ */
90
+ function plain(value, max) {
91
+ const flat = value
92
+ .replace(/[\p{Cc}\p{Cf}\p{Zl}\p{Zp}]+/gu, " ")
93
+ .replace(/[<>[\]*~#|\\@`]+/g, " ")
94
+ .replace(/"/g, "'")
95
+ .replace(/\s+/g, " ")
96
+ .trim();
97
+ return flat.length <= max ? flat : `${flat.slice(0, max - 1).trimEnd()}…`;
98
+ }
99
+ function who(record, location) {
100
+ const session = typeof location === "object" ? location : undefined;
101
+ const agentName = record.agent ?? session?.agent;
102
+ const cwd = record.cwd ?? session?.cwd;
103
+ const agent = agentName ? plain(agentName, NAME_MAX) : "";
104
+ const folder = cwd ? plain(path.basename(cwd), NAME_MAX) : "";
105
+ const ref = typeof location === "string" ? location : session?.ref;
106
+ const handle = plain(ref ?? record.session.slice(0, 8), NAME_MAX);
107
+ const labels = [record.workspaceTitle ?? session?.workspaceTitle, record.title ?? session?.title].filter((label) => !!label).map((label) => plain(label, NAME_MAX));
108
+ const where = labels.length ? `${labels.join(" / ")}; ${handle}` : handle;
109
+ return `${agent || "A coding agent"}${folder ? ` in ${folder}` : ""}${where ? ` (${where})` : ""}`;
110
+ }
111
+ /** One return as one sentence pair: who returned, what Shepherd did, and why. */
112
+ function noticeLine(record, location) {
113
+ const subject = who(record, location);
114
+ const why = `Why: ${plain(record.reason, REASON_MAX) || "no reason given"}`;
115
+ switch (record.kind) {
116
+ case "premature":
117
+ if (record.action === "respond" && record.reply) {
118
+ const sent = record.reply.startsWith("key:") ? `pressed ${plain(record.reply.slice(4), 10)}` : `sent it back: "${plain(record.reply, REPLY_MAX)}"`;
119
+ return `${subject} stopped early, so I ${sent}. ${why}`;
120
+ }
121
+ if (record.actionBlockReason)
122
+ return `${subject} stopped early; no input sent because ${BLOCK_DESCRIPTION[record.actionBlockReason]}. ${why}`;
123
+ return `${subject} stopped early, but I did not answer it, so it is waiting for you. ${why}`;
124
+ case "gate":
125
+ return `${subject} needs you. ${why}`;
126
+ case "done":
127
+ return `${subject} says it is done. ${why}`;
128
+ case "waiting":
129
+ return `${subject} is waiting on an outside dependency; the work is not yet delivered. ${why}`;
130
+ case "loop_guard":
131
+ return `${subject}: I stopped answering it after too many replies, so it is waiting for you. ${why}`;
132
+ case "working":
133
+ return `${subject} is still working in the background and has news. ${why}`;
134
+ case "unclear":
135
+ return `Shepherd could not determine the current state of ${subject}. ${why}`;
136
+ default:
137
+ return `Shepherd could not complete its observation of ${subject}; the agent's state was not determined. ${why}`;
138
+ }
139
+ }
140
+ /** A bounded display of latest observations; all input records retain delivery custody. */
141
+ function noticeMessage(records, refs = new Map(), context = {}) {
142
+ const latest = new Map();
143
+ for (const record of records) {
144
+ const key = JSON.stringify([record.host, record.session]);
145
+ const previous = latest.get(key);
146
+ const at = Date.parse(record.at);
147
+ const previousAt = previous ? Date.parse(previous.at) : NaN;
148
+ if (!previous || (Number.isFinite(at) && (!Number.isFinite(previousAt) || at > previousAt))
149
+ || ((!Number.isFinite(at) && !Number.isFinite(previousAt) || at === previousAt) && record.transition > previous.transition))
150
+ latest.set(key, record);
151
+ }
152
+ const sessions = [...latest].sort(([a], [b]) => a < b ? -1 : 1).map(([, record]) => record);
153
+ const lines = sessions.slice(0, exports.NOTICE_LIST_MAX).map(record => {
154
+ const line = noticeLine(record, refs.get(record.session));
155
+ if (!context.recovered)
156
+ return line;
157
+ const at = Date.parse(record.at);
158
+ return `${line} (${Number.isFinite(at) ? `observed at ${new Date(at).toISOString()}` : "observation time unknown"})`;
159
+ });
160
+ const more = sessions.length - lines.length;
161
+ const body = sessions.length === 1 ? lines[0]
162
+ : [`Updates from ${sessions.length} coding sessions:`, ...lines.map(line => `- ${line}`), ...(more > 0 ? [`- and ${more} more.`] : [])].join("\n");
163
+ return context.recovered ? `Includes recovered historical observations, not live status:\n${body}` : body;
164
+ }
165
+ /**
166
+ * The channels this agent can reach people on from this machine: its enabled Teams sense, and its enabled BlueBubbles
167
+ * sense when this machine has a BlueBubbles connection (credentials live per machine, so another machine may own it).
168
+ */
169
+ function readEnabledReachChannels(agent, agentRoot, blueBubblesConfig = config_1.getBlueBubblesConfig) {
170
+ const enabled = new Set();
171
+ try {
172
+ const senses = (0, identity_1.loadAgentConfig)({ agentName: agent, agentRoot }).senses;
173
+ if (senses?.bluebubbles?.enabled) {
174
+ try {
175
+ blueBubblesConfig();
176
+ enabled.add("bluebubbles");
177
+ }
178
+ catch (error) {
179
+ (0, runtime_1.emitNervesEvent)({ level: "warn", component: "senses", event: "senses.shepherd_notice_bluebubbles_not_attached", message: "BlueBubbles is enabled but not connected on this machine, so owner notices use another channel", meta: { agent, error: error.message } });
180
+ }
181
+ }
182
+ if (senses?.teams?.enabled)
183
+ enabled.add("teams");
184
+ }
185
+ catch (error) {
186
+ (0, runtime_1.emitNervesEvent)({ level: "warn", component: "senses", event: "senses.shepherd_notice_channels_unreadable", message: "could not read which channels are enabled, so no owner notice channel is reachable", meta: { agent, error: error.message } });
187
+ }
188
+ return enabled;
189
+ }
190
+ /** Every channel id a friend record holds, in the same `channel:handle` form `resolveReachTarget` returns. */
191
+ function personIdentities(friend) {
192
+ const identities = new Set();
193
+ // Only called for a reachable friend, whose externalIds is therefore a list.
194
+ for (const entry of friend.externalIds) {
195
+ // A `group:` id names a group chat the friend is in, which other people share; it never identifies the person.
196
+ if (typeof entry?.externalId !== "string" || entry.externalId.trim() === "" || entry.externalId.startsWith("group:"))
197
+ continue;
198
+ if (entry.provider === "imessage-handle")
199
+ identities.add(`bluebubbles:${entry.externalId.toLowerCase()}`);
200
+ if (entry.provider === "aad")
201
+ identities.add(`teams:${entry.externalId.toLowerCase()}`);
202
+ }
203
+ return identities;
204
+ }
205
+ /**
206
+ * Who hears the notice, and where: the family friend who is this machine's own user (`local` id), else every family
207
+ * friend, on the channel `resolveReachTarget` chooses for them, once per
208
+ * person on that channel even when several friend records share one id. With no 1:1 session yet, the send opens one:
209
+ * BlueBubbles by the friend's handle, Teams by a new 1:1 conversation.
210
+ */
211
+ async function resolveNoticeTargets(agentRoot, store = new friends_1.FileFriendStore(path.join(agentRoot, "friends")), enabledChannels = new Set(), username = (0, friends_1.machineOwnerUsername)()) {
212
+ const seen = new Set();
213
+ const targets = [];
214
+ const family = (await store.listAll()).filter(friend => friend.trustLevel === "family");
215
+ // The notice is the owner's: when family friends are linked to this machine's own user, only they hear it, never
216
+ // their relatives, even when none of them is reachable yet.
217
+ const owners = family.filter(friend => (Array.isArray(friend.externalIds) ? friend.externalIds : [])
218
+ .some(entry => typeof entry?.provider === "string" && typeof entry.externalId === "string" && (0, friends_1.isLocalMachineOwnerIdentity)(entry.provider, entry.externalId, username)));
219
+ for (const friend of owners.length > 0 ? owners : family) {
220
+ const reach = (0, reach_channel_1.resolveReachTarget)({
221
+ friend, enabledChannels, sessionsDir: path.join(agentRoot, "state", "sessions"), friendsDir: path.join(agentRoot, "friends"),
222
+ agentName: path.basename(agentRoot, ".ouro"),
223
+ });
224
+ if ("unreachable" in reach)
225
+ continue;
226
+ // One notice per person: a friend whose iMessage handle or Teams id another target already has is that person.
227
+ const identities = personIdentities(friend);
228
+ identities.add(`${reach.channel}:${reach.handle}`);
229
+ if ([...identities].some(identity => seen.has(identity)))
230
+ continue;
231
+ for (const identity of identities)
232
+ seen.add(identity);
233
+ const alertKey = (0, await_alert_1.resolveAlertKey)(agentRoot, friend.id, reach.channel);
234
+ // A BlueBubbles fallback key must be a DM: a group key would be refused, and "shepherd" sends to the handle.
235
+ const fallback = reach.channel === "bluebubbles" ? (alertKey?.includes(";-;") ? alertKey : null) : alertKey;
236
+ targets.push({ friendId: friend.id, name: friend.name, channel: reach.channel, key: reach.key ?? fallback ?? "shepherd", ...(reach.tenantId ? { tenantId: reach.tenantId } : {}) });
237
+ }
238
+ if (owners.length > 0 && targets.length === 0) {
239
+ (0, runtime_1.emitNervesEvent)({ level: "warn", component: "senses", event: "senses.shepherd_notice_owner_unreachable", message: "this machine's owner has no reachable channel, so the Shepherd owner notice waits; link their iMessage handle or Teams id", meta: { owners: owners.length } });
240
+ }
241
+ (0, runtime_1.emitNervesEvent)({ component: "senses", event: "senses.shepherd_notice_targets", message: "resolved Shepherd owner notice targets", meta: { count: targets.length } });
242
+ return targets;
243
+ }
244
+ /** One id per batch and person, so a retried batch is saved into the conversation once. */
245
+ function noticeDeliveryId(friendId, noticeIds) {
246
+ return `shepherd:${(0, node_crypto_1.createHash)("sha256").update(`${friendId}\0${[...noticeIds].sort().join(",")}`).digest("hex")}`;
247
+ }
248
+ /** The bot whose tenant is the friend's: the secondary bot when it serves that tenant, else the primary. */
249
+ function chooseTeamsBot(tenantId, primary, secondary) {
250
+ if (tenantId && secondary.clientId && secondary.tenantId === tenantId)
251
+ return secondary;
252
+ return primary.clientId ? primary : null;
253
+ }
254
+ /* v8 ignore start -- the live Teams SDK client; its token and REST calls need a real bot registration @preserve */
255
+ async function liveBotApi(config) {
256
+ const { App } = await Promise.resolve().then(() => __importStar(require("@microsoft/teams.apps")));
257
+ const app = new App({
258
+ clientId: config.clientId,
259
+ ...(config.clientSecret ? { clientSecret: config.clientSecret } : {}),
260
+ tenantId: config.tenantId,
261
+ ...(config.managedIdentityClientId ? { managedIdentityClientId: config.managedIdentityClientId } : {}),
262
+ });
263
+ return { id: app.id, conversations: app.api.conversations };
264
+ }
265
+ /* v8 ignore stop */
266
+ /**
267
+ * Sends on the target's channel through that sense's own proactive path, which applies its trust check, internal-content
268
+ * guard and 1:1 rule, and saves the notice into the friend's conversation.
269
+ *
270
+ * - Teams: `sendProactiveTeamsMessageToSession` with a bot client of this process's own, built from the agent's Teams
271
+ * credentials. Nothing listens on a port: the client only acquires a bot token and calls the Bot Framework.
272
+ * - BlueBubbles: `sendProactiveBlueBubblesMessageToSession` over the BlueBubbles REST API, which checks the server's
273
+ * account before sending. When the client cannot be set up (no credentials, say), the notice stays pending.
274
+ */
275
+ function createNoticeSender(agentRoot, deps = {}) {
276
+ const bots = new Map();
277
+ return async (target, text, noticeIds) => {
278
+ const deliveryId = noticeDeliveryId(target.friendId, noticeIds);
279
+ if (target.channel === "bluebubbles") {
280
+ let client;
281
+ let send;
282
+ try {
283
+ /* v8 ignore next 2 -- tests inject the client and sender; the live ones need BlueBubbles credentials @preserve */
284
+ client = deps.createBlueBubblesClient ? deps.createBlueBubblesClient() : (await Promise.resolve().then(() => __importStar(require("../bluebubbles/client")))).createBlueBubblesClient();
285
+ send = deps.sendBlueBubbles ?? (await Promise.resolve().then(() => __importStar(require("../bluebubbles")))).sendProactiveBlueBubblesMessageToSession;
286
+ }
287
+ catch (error) {
288
+ (0, runtime_1.emitNervesEvent)({ level: "warn", component: "senses", event: "senses.shepherd_notice_bluebubbles_unavailable", message: "BlueBubbles could not be set up for the Shepherd owner notice; it stays waiting", meta: { friendId: target.friendId, error: error.message } });
289
+ return { delivered: false, reason: "bluebubbles_unavailable" };
290
+ }
291
+ const store = new friends_1.FileFriendStore(path.join(agentRoot, "friends"));
292
+ return send({ friendId: target.friendId, sessionKey: target.key, text, intent: "generic_outreach", deliveryId, origin: "shepherd" }, { createClient: () => client, createFriendStore: () => store });
293
+ }
294
+ const config = chooseTeamsBot(target.tenantId, (deps.primary ?? config_1.getTeamsConfig)(), (deps.secondary ?? config_1.getTeamsSecondaryConfig)());
295
+ if (!config)
296
+ return { delivered: false, reason: "no_teams_bot" };
297
+ let bot = bots.get(config.clientId);
298
+ if (!bot) {
299
+ /* v8 ignore next -- tests inject the bot client; the live Bot Framework client is built only in the running sense @preserve */
300
+ bot = (deps.botApi ?? liveBotApi)(config);
301
+ bots.set(config.clientId, bot);
302
+ // A client that could not be built is built again for the next notice.
303
+ bot.catch(() => bots.delete(config.clientId));
304
+ }
305
+ const { sendProactiveTeamsMessageToSession } = await Promise.resolve().then(() => __importStar(require("../teams")));
306
+ return sendProactiveTeamsMessageToSession({ friendId: target.friendId, sessionKey: target.key, text, textFormat: "plain", intent: "generic_outreach", captureReceipt: true, deliveryId, origin: "shepherd" }, { botApi: await bot, store: new friends_1.FileFriendStore(path.join(agentRoot, "friends")) });
307
+ };
308
+ }
309
+ /** Collects durable notice intents; acceptance is distinct from transport delivery. */
310
+ function createOwnerNotifier(options) {
311
+ const { agent, policy } = options;
312
+ const enabledChannels = options.enabledChannels ?? (() => readEnabledReachChannels(agent, options.agentRoot));
313
+ const resolveTargets = options.resolveTargets ?? (() => resolveNoticeTargets(options.agentRoot, undefined, enabledChannels()));
314
+ const send = options.send ?? createNoticeSender(options.agentRoot);
315
+ const retryWrites = new Map();
316
+ const recoveredNoticeIds = new Set();
317
+ const writes = new Set();
318
+ let cancel = null;
319
+ let stopped = false;
320
+ let flushing = null;
321
+ let drainRequested = false;
322
+ function schedule(ms) {
323
+ if (!stopped && policy !== "off")
324
+ cancel ??= options.schedule(() => {
325
+ cancel?.();
326
+ cancel = null;
327
+ if (flushing)
328
+ drainRequested = true;
329
+ else
330
+ void flush();
331
+ }, ms);
332
+ }
333
+ function persistIntent(record) {
334
+ const key = `${record.host}:${record.session}:${record.transition}:${record.at}`;
335
+ retryWrites.set(key, record);
336
+ const write = (0, notice_outbox_1.enqueueNotice)(options.agentRoot, record).then(id => {
337
+ retryWrites.delete(key);
338
+ return id;
339
+ }).catch(error => {
340
+ (0, runtime_1.emitNervesEvent)({ level: "error", component: "senses", event: "senses.shepherd_notice_error", message: "could not persist a Shepherd owner notice intent; it remains waiting", meta: { agent, error: error.message } });
341
+ schedule(exports.NOTICE_RETRY_MS);
342
+ throw error;
343
+ });
344
+ writes.add(write);
345
+ // Observe cleanup immediately, while the producer still receives the rejecting promise.
346
+ void write.then(() => { writes.delete(write); }, () => { writes.delete(write); });
347
+ return write;
348
+ }
349
+ async function runFlush() {
350
+ cancel?.();
351
+ cancel = null;
352
+ if (stopped || policy === "off")
353
+ return;
354
+ try {
355
+ await Promise.allSettled([...writes]);
356
+ const retried = await Promise.allSettled([...retryWrites.values()].map(persistIntent));
357
+ if (retried.some(result => result.status === "rejected"))
358
+ schedule(exports.NOTICE_RETRY_MS);
359
+ const entries = (0, notice_outbox_1.readNoticeOutbox)(options.agentRoot).filter(entry => noticeWanted(policy, entry.record) && (Object.keys(entry.deliveries).length === 0 || Object.values(entry.deliveries).some(value => value.state !== "sent")));
360
+ if (entries.length === 0)
361
+ return;
362
+ const refs = new Map();
363
+ try {
364
+ for (const session of await options.listSessions())
365
+ refs.set(session.id, session);
366
+ }
367
+ catch {
368
+ // Without the host's handles, each notice names a short session id instead.
369
+ }
370
+ const targets = await resolveTargets();
371
+ if (stopped)
372
+ return;
373
+ if (targets.length === 0) {
374
+ (0, runtime_1.emitNervesEvent)({ level: "warn", component: "senses", event: "senses.shepherd_notice_no_target", message: "no family friend is reachable on any enabled channel, so the Shepherd owner notice was not sent", meta: { agent, returns: entries.length } });
375
+ schedule(exports.NOTICE_RETRY_MS);
376
+ return;
377
+ }
378
+ await (0, notice_outbox_1.declareNoticeTargets)(options.agentRoot, entries.map(entry => entry.id), targets.map(target => target.friendId), new Date().toISOString());
379
+ const reachable = new Set(targets.map(target => target.friendId));
380
+ let retry = entries.some(entry => Object.entries(entry.deliveries).some(([friendId, delivery]) => delivery.state === "pending" && !reachable.has(friendId)));
381
+ for (const target of targets) {
382
+ if (stopped)
383
+ break;
384
+ const pending = entries.filter(entry => (0, notice_outbox_1.noticeDeliveryState)(entry, target.friendId) === "pending");
385
+ if (pending.length > 0) {
386
+ // Only the worker that atomically claims a pending entry may initiate transport.
387
+ const batch = await (0, notice_outbox_1.claimPendingNotices)(options.agentRoot, pending.map(entry => entry.id), target.friendId, new Date().toISOString());
388
+ if (batch.length === 0)
389
+ continue;
390
+ const ids = batch.map(entry => entry.id);
391
+ if (stopped) {
392
+ await (0, notice_outbox_1.recordNoticeDelivery)(options.agentRoot, ids, target.friendId, { state: "pending", at: new Date().toISOString(), reason: "stopped before transport" });
393
+ break;
394
+ }
395
+ try {
396
+ const result = await send(target, noticeMessage(batch.map(entry => entry.record), refs, { recovered: ids.some(id => recoveredNoticeIds.has(id)) }), ids);
397
+ const state = result.delivered ? "sent"
398
+ : result.delivery ? result.delivery.state === "not_sent" ? "pending" : "unknown"
399
+ : result.reason && result.reason !== "send_error" ? "pending" : "unknown";
400
+ await (0, notice_outbox_1.recordNoticeDelivery)(options.agentRoot, ids, target.friendId, {
401
+ state, at: new Date().toISOString(), ...(result.reason ? { reason: result.reason } : {}),
402
+ ...(result.delivery?.messageId ? { messageId: result.delivery.messageId } : {}),
403
+ });
404
+ retry ||= state === "pending";
405
+ (0, runtime_1.emitNervesEvent)({
406
+ level: result.delivered ? "info" : "warn", component: "senses",
407
+ event: result.delivered ? "senses.shepherd_notice_sent" : "senses.shepherd_notice_not_sent",
408
+ message: result.delivered ? "sent the Shepherd owner notice" : "the Shepherd owner notice was not delivered",
409
+ meta: { agent, friendId: target.friendId, returns: batch.length, ...(result.delivered ? {} : { reason: result.reason ?? "unknown" }) },
410
+ });
411
+ }
412
+ catch (error) {
413
+ (0, runtime_1.emitNervesEvent)({ level: "error", component: "senses", event: "senses.shepherd_notice_error", message: "sending the Shepherd owner notice failed; its outcome remains unknown", meta: { agent, friendId: target.friendId, error: error.message } });
414
+ }
415
+ }
416
+ }
417
+ if (retry)
418
+ schedule(exports.NOTICE_RETRY_MS);
419
+ }
420
+ catch (error) {
421
+ (0, runtime_1.emitNervesEvent)({ level: "error", component: "senses", event: "senses.shepherd_notice_error", message: "preparing the Shepherd owner notice failed", meta: { agent, error: error.message } });
422
+ schedule(exports.NOTICE_RETRY_MS);
423
+ }
424
+ }
425
+ function flush() {
426
+ if (flushing)
427
+ return flushing;
428
+ flushing = runFlush().finally(() => {
429
+ flushing = null;
430
+ if (drainRequested) {
431
+ drainRequested = false;
432
+ schedule(exports.NOTICE_COALESCE_MS);
433
+ }
434
+ });
435
+ return flushing;
436
+ }
437
+ try {
438
+ const existing = (0, notice_outbox_1.readNoticeOutbox)(options.agentRoot);
439
+ for (const entry of existing)
440
+ recoveredNoticeIds.add(entry.id);
441
+ if (existing.some(entry => Object.keys(entry.deliveries).length === 0 || Object.values(entry.deliveries).some(value => value.state === "pending")))
442
+ schedule(exports.NOTICE_RETRY_MS);
443
+ }
444
+ catch (error) {
445
+ (0, runtime_1.emitNervesEvent)({ level: "error", component: "senses", event: "senses.shepherd_notice_error", message: "could not read waiting Shepherd owner notices", meta: { agent, error: error.message } });
446
+ schedule(exports.NOTICE_RETRY_MS);
447
+ }
448
+ return {
449
+ notify(record) {
450
+ if (stopped)
451
+ return Promise.resolve({ state: "suppressed", reason: "stopped" });
452
+ if (!noticeWanted(policy, record))
453
+ return Promise.resolve({ state: "suppressed", reason: "policy" });
454
+ const write = persistIntent(record);
455
+ schedule(exports.NOTICE_COALESCE_MS);
456
+ return write.then(noticeId => ({ state: "queued", noticeId }));
457
+ },
458
+ flush,
459
+ stop() {
460
+ stopped = true;
461
+ cancel?.();
462
+ cancel = null;
463
+ },
464
+ };
465
+ }
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.inspectCodingPrompt = inspectCodingPrompt;
4
+ const node_util_1 = require("node:util");
5
+ const runtime_1 = require("../../nerves/runtime");
6
+ /** Rendered-shape allowlist, not a shell/prompt heuristic. Unknown variants never authorize input. */
7
+ function inspectCodingPrompt(agent, screen) {
8
+ (0, runtime_1.emitNervesEvent)({ component: "senses", event: "senses.shepherd_prompt_inspected", message: "classified a coding composer" });
9
+ const unknown = { activity: "unknown", composer: "unknown" };
10
+ const lines = (0, node_util_1.stripVTControlCharacters)(screen).split("\n").map(line => line.trimEnd());
11
+ const name = agent.toLowerCase();
12
+ if (!["copilot", "claude", "claude code", "codex"].includes(name))
13
+ return unknown;
14
+ if (/press enter to confirm|esc to cancel|allow this|approve this|❯\s*\d|›\s*\d[.)]/i.test(lines.join("\n")))
15
+ return unknown;
16
+ let input;
17
+ let footer;
18
+ if (name === "copilot") {
19
+ const top = lines.findLastIndex(line => /^\s*[╭╻]▄{8,}$/.test(line));
20
+ const bottom = lines.findIndex((line, i) => i > top && /^\s*╹▀{8,}$/.test(line));
21
+ if (top < 0 || bottom <= top + 1)
22
+ return unknown;
23
+ if (lines[top].length !== lines[bottom].length)
24
+ return unknown;
25
+ const body = lines.slice(top + 1, bottom);
26
+ if (!body.every(line => /^\s*┃/.test(line)))
27
+ return unknown;
28
+ input = body.map(line => line.replace(/^\s*┃ ?/, ""));
29
+ footer = lines.slice(bottom + 1).join("\n");
30
+ if (!/(?:Interactive|Autopilot).*\/\s*commands|esc interrupt/i.test(footer))
31
+ return unknown;
32
+ }
33
+ else if (name === "claude" || name === "claude code") {
34
+ const top = lines.findLastIndex(line => /^\s*╭─{8,}╮$/.test(line));
35
+ const bottom = lines.findIndex((line, i) => i > top && /^\s*╰─{8,}╯$/.test(line));
36
+ if (top < 0 || bottom <= top + 1)
37
+ return unknown;
38
+ if (lines[top].length !== lines[bottom].length)
39
+ return unknown;
40
+ const body = lines.slice(top + 1, bottom);
41
+ if (!/^\s*│ >/.test(body[0]) || !body.every(line => /^\s*│.*│$/.test(line)))
42
+ return unknown;
43
+ input = body.map((line, i) => line.replace(/^\s*│ ?/, "").replace(/│$/, "").replace(i === 0 ? /^> ?/ : /^/, ""));
44
+ footer = lines.slice(bottom + 1).join("\n");
45
+ if (!/bypass permissions on|shift\+tab to cycle|esc to interrupt/i.test(footer))
46
+ return unknown;
47
+ }
48
+ else {
49
+ const prompt = lines.findLastIndex(line => /^›(?: |$)/.test(line));
50
+ const foot = lines.findIndex((line, i) => i > prompt && /\? for shortcuts/.test(line));
51
+ if (prompt < 0 || foot < 0 || lines.slice(foot + 1).some(line => line.trim()))
52
+ return unknown;
53
+ input = [lines[prompt].slice(1), ...lines.slice(prompt + 1, foot)];
54
+ footer = lines[foot];
55
+ }
56
+ if (input.some(line => /\[.*\]|enter a prompt|ask anything|type a message|implement \{/i.test(line)))
57
+ return unknown;
58
+ const working = /esc(?: to)? interrupt|\b[1-9]\d* (?:running|background (?:tasks?|agents?|terminals?))\b|background terminal running/i.test(footer);
59
+ return { activity: working ? "working" : "idle", composer: input.some(line => line.trim().length > 0) ? "draft" : "empty" };
60
+ }