@ouro.bot/cli 0.1.0-alpha.93 → 0.1.0-alpha.930

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 (734) 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 +5890 -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 +1254 -0
  34. package/deploy/unraid/sanctuary-deployment-target.mjs +710 -0
  35. package/deploy/unraid/sanctuary-replay-gate.mjs +1564 -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 +382 -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 +451 -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 +876 -0
  146. package/dist/heart/daemon/cli-desk.js +322 -0
  147. package/dist/heart/daemon/cli-exec.js +9226 -0
  148. package/dist/heart/daemon/cli-help.js +742 -0
  149. package/dist/heart/daemon/cli-parse.js +3235 -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 -2350
  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 +2087 -105
  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 +5 -2
  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 +1267 -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 +733 -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 +1516 -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 +232 -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 +98 -0
  265. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  266. package/dist/heart/mailbox/mailbox-http-routes.js +398 -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 +39 -0
  271. package/dist/heart/mailbox/mailbox-types.js +27 -0
  272. package/dist/heart/mailbox/mailbox-view.js +197 -0
  273. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  274. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  275. package/dist/heart/mailbox/readers/mail.js +375 -0
  276. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  277. package/dist/heart/mailbox/readers/sessions.js +231 -0
  278. package/dist/heart/mailbox/readers/shared.js +111 -0
  279. package/dist/heart/mcp/mcp-server.js +760 -0
  280. package/dist/heart/migrate-config.js +100 -0
  281. package/dist/heart/model-capabilities.js +83 -16
  282. package/dist/heart/orientation-frame.js +345 -0
  283. package/dist/heart/platform.js +81 -0
  284. package/dist/heart/primitives.js +1 -1
  285. package/dist/heart/private-runtime/decision-renderer.js +158 -0
  286. package/dist/heart/private-runtime/index.js +18 -0
  287. package/dist/heart/private-runtime/ledger.js +221 -0
  288. package/dist/heart/private-runtime/policy.js +260 -0
  289. package/dist/heart/private-runtime/types.js +2 -0
  290. package/dist/heart/progress-story.js +1 -1
  291. package/dist/heart/provider-attempt.js +137 -0
  292. package/dist/heart/provider-binding-resolver.js +273 -0
  293. package/dist/heart/provider-credentials.js +449 -0
  294. package/dist/heart/provider-failover.js +311 -0
  295. package/dist/heart/provider-models.js +96 -0
  296. package/dist/heart/provider-ping.js +265 -0
  297. package/dist/heart/provider-readiness-cache.js +119 -0
  298. package/dist/heart/provider-visibility.js +188 -0
  299. package/dist/heart/providers/anthropic-token.js +131 -0
  300. package/dist/heart/providers/anthropic.js +173 -60
  301. package/dist/heart/providers/azure.js +23 -11
  302. package/dist/heart/providers/error-classification.js +127 -0
  303. package/dist/heart/providers/github-copilot.js +38 -39
  304. package/dist/heart/providers/minimax-vlm.js +189 -0
  305. package/dist/heart/providers/minimax.js +26 -8
  306. package/dist/heart/providers/openai-codex-token.js +349 -0
  307. package/dist/heart/providers/openai-codex.js +55 -40
  308. package/dist/heart/providers/openai-compatible.js +177 -0
  309. package/dist/heart/reply-style.js +52 -0
  310. package/dist/heart/run-ledger.js +247 -0
  311. package/dist/heart/runtime-capability-check.js +170 -0
  312. package/dist/heart/runtime-credentials.js +607 -0
  313. package/dist/heart/runtime-cwd.js +87 -0
  314. package/dist/heart/sense-truth.js +24 -4
  315. package/dist/heart/session-activity.js +92 -24
  316. package/dist/heart/session-events.js +1504 -0
  317. package/dist/heart/session-playback-cli-main.js +5 -0
  318. package/dist/heart/session-playback-cli.js +36 -0
  319. package/dist/heart/session-playback.js +231 -0
  320. package/dist/heart/session-redaction-repair-cli-main.js +31 -0
  321. package/dist/heart/session-redaction-repair.js +552 -0
  322. package/dist/heart/session-stats-cli-main.js +5 -0
  323. package/dist/heart/session-stats.js +183 -0
  324. package/dist/heart/session-transcript.js +133 -0
  325. package/dist/heart/shelf-claims.js +78 -0
  326. package/dist/heart/shepherd-config.js +113 -0
  327. package/dist/heart/source-grounding.js +297 -0
  328. package/dist/heart/start-of-turn-packet.js +372 -0
  329. package/dist/heart/steward-policy.js +656 -0
  330. package/dist/heart/streaming.js +609 -207
  331. package/dist/heart/structured-output.js +196 -0
  332. package/dist/heart/sync-classification.js +176 -0
  333. package/dist/heart/sync-health.js +152 -0
  334. package/dist/heart/sync.js +726 -0
  335. package/dist/heart/target-resolution.js +11 -7
  336. package/dist/heart/tempo.js +93 -0
  337. package/dist/heart/temporal-view.js +41 -0
  338. package/dist/heart/timeouts.js +101 -0
  339. package/dist/heart/tool-activity-callbacks.js +59 -0
  340. package/dist/heart/tool-approval.js +382 -0
  341. package/dist/heart/tool-description.js +155 -0
  342. package/dist/heart/tool-friction.js +55 -0
  343. package/dist/heart/tool-loop.js +206 -0
  344. package/dist/heart/turn-context.js +496 -0
  345. package/dist/heart/turn-execution-lease.js +30 -0
  346. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  347. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +3 -2
  348. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  349. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  350. package/dist/heart/versioning/ouro-version-manager.js +432 -0
  351. package/dist/heart/versioning/release-sources.js +173 -0
  352. package/dist/heart/versioning/self-update-defaults.js +294 -0
  353. package/dist/heart/versioning/self-update.js +196 -0
  354. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  355. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  356. package/dist/heart/versioning/update-hooks.js +154 -0
  357. package/dist/heart/versioning/update-state.js +126 -0
  358. package/dist/heart/versioning/updater-launchd.js +150 -0
  359. package/dist/heart/versioning/version-intent.js +114 -0
  360. package/dist/heart/work-card.js +380 -0
  361. package/dist/mailbox-ui/assets/index-Cyv4mw3Y.js +1 -0
  362. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  363. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  364. package/dist/mailbox-ui/index.html +16 -0
  365. package/dist/mailroom/attention.js +167 -0
  366. package/dist/mailroom/autonomy.js +209 -0
  367. package/dist/mailroom/blob-store.js +889 -0
  368. package/dist/mailroom/body-cache.js +61 -0
  369. package/dist/mailroom/cache-sync-cli.js +58 -0
  370. package/dist/mailroom/core.js +803 -0
  371. package/dist/mailroom/entry.js +160 -0
  372. package/dist/mailroom/file-store.js +568 -0
  373. package/dist/mailroom/hosted-cache-sync.js +384 -0
  374. package/dist/mailroom/mbox-import.js +393 -0
  375. package/dist/mailroom/migration.js +164 -0
  376. package/dist/mailroom/outbound.js +380 -0
  377. package/dist/mailroom/policy.js +263 -0
  378. package/dist/mailroom/reader.js +292 -0
  379. package/dist/mailroom/search-cache.js +513 -0
  380. package/dist/mailroom/search-relevance.js +319 -0
  381. package/dist/mailroom/smtp-ingress.js +176 -0
  382. package/dist/mailroom/source-state.js +176 -0
  383. package/dist/mailroom/thread.js +109 -0
  384. package/dist/mailroom/travel-extract.js +89 -0
  385. package/dist/mind/bundle-manifest.js +24 -2
  386. package/dist/mind/context.js +307 -139
  387. package/dist/mind/desk-section.js +362 -0
  388. package/dist/mind/diary-integrity.js +60 -0
  389. package/dist/mind/{memory.js → diary.js} +68 -77
  390. package/dist/mind/embedding-provider.js +60 -0
  391. package/dist/mind/file-state.js +179 -0
  392. package/dist/mind/friend-link-codes.js +209 -0
  393. package/dist/mind/friend-merge.js +330 -0
  394. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  395. package/dist/mind/obligation-steering.js +199 -3
  396. package/dist/mind/pending.js +36 -10
  397. package/dist/mind/prompt-budget.js +479 -0
  398. package/dist/mind/prompt-refresh.js +3 -2
  399. package/dist/mind/prompt.js +1085 -198
  400. package/dist/mind/provenance-trust.js +26 -0
  401. package/dist/mind/record-paths.js +312 -0
  402. package/dist/mind/scrutiny.js +173 -0
  403. package/dist/mind/session-transaction.js +564 -0
  404. package/dist/nerves/cli-logging.js +7 -1
  405. package/dist/nerves/coverage/audit-rules.js +15 -6
  406. package/dist/nerves/coverage/audit.js +28 -2
  407. package/dist/nerves/coverage/cli.js +1 -1
  408. package/dist/nerves/coverage/contract.js +5 -5
  409. package/dist/nerves/coverage/file-completeness.js +139 -5
  410. package/dist/nerves/coverage/run-artifacts.js +55 -35
  411. package/dist/nerves/coverage/source-scanner.js +4 -4
  412. package/dist/nerves/event-buffer.js +111 -0
  413. package/dist/nerves/index.js +293 -9
  414. package/dist/nerves/observation.js +20 -0
  415. package/dist/nerves/redact.js +79 -0
  416. package/dist/nerves/review/cli-main.js +5 -0
  417. package/dist/nerves/review/cli.js +156 -0
  418. package/dist/nerves/review/core.js +159 -0
  419. package/dist/nerves/runtime.js +17 -1
  420. package/dist/repertoire/ado-client.js +15 -56
  421. package/dist/repertoire/ado-semantic.js +16 -10
  422. package/dist/repertoire/api-client.js +97 -0
  423. package/dist/repertoire/bitwarden-store.js +1201 -0
  424. package/dist/repertoire/bundle-templates.js +71 -0
  425. package/dist/repertoire/bw-installer.js +231 -0
  426. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  427. package/dist/repertoire/coding/context-pack.js +331 -0
  428. package/dist/repertoire/coding/feedback.js +174 -32
  429. package/dist/repertoire/coding/index.js +15 -3
  430. package/dist/repertoire/coding/manager.js +159 -10
  431. package/dist/repertoire/coding/spawner.js +40 -11
  432. package/dist/repertoire/coding/tools.js +182 -18
  433. package/dist/repertoire/coding/workbench-client.js +272 -0
  434. package/dist/repertoire/coding/workbench-manager.js +346 -0
  435. package/dist/repertoire/commerce-errors.js +109 -0
  436. package/dist/repertoire/commerce-self-test.js +156 -0
  437. package/dist/repertoire/credential-access.js +183 -0
  438. package/dist/repertoire/desk/classifier.js +362 -0
  439. package/dist/repertoire/duffel-client.js +185 -0
  440. package/dist/repertoire/github-client.js +14 -55
  441. package/dist/repertoire/graph-client.js +11 -52
  442. package/dist/repertoire/guardrails.js +971 -20
  443. package/dist/repertoire/house-sweep.js +469 -0
  444. package/dist/repertoire/mcp-client.js +58 -5
  445. package/dist/repertoire/mcp-manager.js +427 -139
  446. package/dist/repertoire/mcp-tools.js +132 -0
  447. package/dist/repertoire/mcp-write-guard.js +46 -0
  448. package/dist/repertoire/plugin-mcp.js +175 -0
  449. package/dist/repertoire/plugins.js +253 -0
  450. package/dist/repertoire/relationship-authorization.js +322 -0
  451. package/dist/repertoire/sanctuary-container-policy.js +46 -0
  452. package/dist/repertoire/shell-sessions.js +134 -0
  453. package/dist/repertoire/skills.js +48 -4
  454. package/dist/repertoire/stripe-client.js +131 -0
  455. package/dist/repertoire/tool-arguments.js +182 -0
  456. package/dist/repertoire/tool-results.js +29 -0
  457. package/dist/repertoire/tools-a2a.js +699 -0
  458. package/dist/repertoire/tools-attachments.js +322 -0
  459. package/dist/repertoire/tools-awaiting.js +872 -0
  460. package/dist/repertoire/tools-base.js +83 -1168
  461. package/dist/repertoire/tools-bluebubbles.js +2 -0
  462. package/dist/repertoire/tools-bridge.js +144 -0
  463. package/dist/repertoire/tools-bundle.js +995 -0
  464. package/dist/repertoire/tools-commerce.js +253 -0
  465. package/dist/repertoire/tools-config.js +186 -0
  466. package/dist/repertoire/tools-continuity.js +575 -0
  467. package/dist/repertoire/tools-credential.js +383 -0
  468. package/dist/repertoire/tools-escalation.js +84 -0
  469. package/dist/repertoire/tools-evolution.js +527 -0
  470. package/dist/repertoire/tools-files.js +344 -0
  471. package/dist/repertoire/tools-flight.js +290 -0
  472. package/dist/repertoire/tools-flow.js +119 -0
  473. package/dist/repertoire/tools-friend-link.js +57 -0
  474. package/dist/repertoire/tools-github.js +3 -8
  475. package/dist/repertoire/tools-habits.js +103 -0
  476. package/dist/repertoire/tools-house-care.js +174 -0
  477. package/dist/repertoire/tools-mail.js +1828 -0
  478. package/dist/repertoire/tools-notes.js +496 -0
  479. package/dist/repertoire/tools-obligations.js +182 -0
  480. package/dist/repertoire/tools-orientation.js +31 -0
  481. package/dist/repertoire/tools-record.js +482 -0
  482. package/dist/repertoire/tools-rsvp.js +139 -0
  483. package/dist/repertoire/tools-runtime.js +238 -0
  484. package/dist/repertoire/tools-sanctuary-host.js +202 -0
  485. package/dist/repertoire/tools-session.js +1133 -0
  486. package/dist/repertoire/tools-shell.js +149 -0
  487. package/dist/repertoire/tools-shepherd-guidance.js +171 -0
  488. package/dist/repertoire/tools-shepherd.js +296 -0
  489. package/dist/repertoire/tools-steward-policy.js +147 -0
  490. package/dist/repertoire/tools-stripe.js +224 -0
  491. package/dist/repertoire/tools-surface.js +369 -0
  492. package/dist/repertoire/tools-teams.js +50 -39
  493. package/dist/repertoire/tools-telegram-contacts.js +37 -0
  494. package/dist/repertoire/tools-travel.js +125 -0
  495. package/dist/repertoire/tools-trip.js +982 -0
  496. package/dist/repertoire/tools-unraid.js +556 -0
  497. package/dist/repertoire/tools-user-profile.js +146 -0
  498. package/dist/repertoire/tools-vault.js +40 -0
  499. package/dist/repertoire/tools-voice-local.js +198 -0
  500. package/dist/repertoire/tools-voice.js +145 -0
  501. package/dist/repertoire/tools.js +518 -156
  502. package/dist/repertoire/travel-api-client.js +360 -0
  503. package/dist/repertoire/unraid-client.js +155 -0
  504. package/dist/repertoire/unraid-restart.js +339 -0
  505. package/dist/repertoire/user-profile.js +131 -0
  506. package/dist/repertoire/vault-setup.js +246 -0
  507. package/dist/repertoire/vault-unlock.js +686 -0
  508. package/dist/rsvp/aisleplanner-client.js +354 -0
  509. package/dist/rsvp/cli.js +936 -0
  510. package/dist/rsvp/config.js +327 -0
  511. package/dist/rsvp/cutover.js +433 -0
  512. package/dist/rsvp/diagnostics.js +232 -0
  513. package/dist/rsvp/diff-renderer.js +176 -0
  514. package/dist/rsvp/habit-policy.js +110 -0
  515. package/dist/rsvp/habit-stage.js +123 -0
  516. package/dist/rsvp/incident-bundle.js +97 -0
  517. package/dist/rsvp/migration.js +204 -0
  518. package/dist/rsvp/native-habit-runner.js +630 -0
  519. package/dist/rsvp/outbound-state.js +628 -0
  520. package/dist/rsvp/query.js +118 -0
  521. package/dist/rsvp/replay.js +233 -0
  522. package/dist/rsvp/snapshot.js +232 -0
  523. package/dist/rsvp/spend-ledger.js +175 -0
  524. package/dist/scripts/claude-code-hook.js +41 -0
  525. package/dist/scripts/claude-code-stop-hook.js +47 -0
  526. package/dist/senses/a2a-entry.js +132 -0
  527. package/dist/senses/acp-server.js +386 -0
  528. package/dist/senses/attention-queue.js +186 -0
  529. package/dist/senses/await-turn-message.js +65 -0
  530. package/dist/senses/bluebubbles/active-turns.js +216 -0
  531. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  532. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  533. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +379 -41
  534. package/dist/senses/bluebubbles/context-packet.js +207 -0
  535. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  536. package/dist/senses/bluebubbles/entry.js +90 -0
  537. package/dist/senses/bluebubbles/host-account-verifier.js +88 -0
  538. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
  539. package/dist/senses/bluebubbles/index.js +3878 -0
  540. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  541. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  542. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
  543. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
  544. package/dist/senses/bluebubbles/outbound-state.js +308 -0
  545. package/dist/senses/bluebubbles/processed-log.js +133 -0
  546. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  547. package/dist/senses/bluebubbles/replay.js +284 -0
  548. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  549. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  550. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  551. package/dist/senses/bluebubbles/webhook-registration.js +257 -0
  552. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  553. package/dist/senses/cli/bracketed-paste.js +82 -0
  554. package/dist/senses/cli/image-paste.js +287 -0
  555. package/dist/senses/cli/image-ref-navigation.js +75 -0
  556. package/dist/senses/cli/ink-app.js +156 -0
  557. package/dist/senses/cli/inline-diff.js +64 -0
  558. package/dist/senses/cli/input-keys.js +174 -0
  559. package/dist/senses/cli/kill-ring.js +86 -0
  560. package/dist/senses/cli/message-list.js +51 -0
  561. package/dist/senses/cli/ouro-tui.js +607 -0
  562. package/dist/senses/cli/spinner-imperative.js +135 -0
  563. package/dist/senses/cli/spinner.js +101 -0
  564. package/dist/senses/cli/status-line.js +60 -0
  565. package/dist/senses/cli/streaming-markdown.js +526 -0
  566. package/dist/senses/cli/tool-display.js +85 -0
  567. package/dist/senses/cli/tool-render.js +85 -0
  568. package/dist/senses/cli/tui-store.js +241 -0
  569. package/dist/senses/cli/virtual-list.js +35 -0
  570. package/dist/senses/cli-entry.js +60 -8
  571. package/dist/senses/cli.js +601 -304
  572. package/dist/senses/commands.js +66 -3
  573. package/dist/senses/context-packet-ledger.js +371 -0
  574. package/dist/senses/context-packets.js +154 -0
  575. package/dist/senses/habit-lifecycle-guard.js +24 -0
  576. package/dist/senses/habit-turn-message.js +160 -0
  577. package/dist/senses/ingress-evidence.js +2 -0
  578. package/dist/senses/mail-entry.js +66 -0
  579. package/dist/senses/mail.js +524 -0
  580. package/dist/senses/pipeline.js +1158 -204
  581. package/dist/senses/private-runtime-worker.js +859 -0
  582. package/dist/senses/private-runtime.js +1627 -0
  583. package/dist/senses/proactive-content-guard.js +51 -0
  584. package/dist/senses/root-host-approval-port.js +345 -0
  585. package/dist/senses/root-host-approval-runtime.js +393 -0
  586. package/dist/senses/sanctuary-authority-resident.js +102 -0
  587. package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
  588. package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
  589. package/dist/senses/sanctuary-grounding.js +118 -0
  590. package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
  591. package/dist/senses/sanctuary-health-acceptance-probe.js +774 -0
  592. package/dist/senses/sanctuary-health-runner.js +104 -0
  593. package/dist/senses/sanctuary-health.js +422 -0
  594. package/dist/senses/sanctuary-install-state-contract.js +169 -0
  595. package/dist/senses/sanctuary-interactive-control.js +410 -0
  596. package/dist/senses/sanctuary-media-catalog-contract.js +259 -0
  597. package/dist/senses/sanctuary-media-optimization.js +514 -0
  598. package/dist/senses/sanctuary-runtime.js +369 -0
  599. package/dist/senses/sanctuary-sab.js +85 -0
  600. package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
  601. package/dist/senses/shared-turn.js +804 -0
  602. package/dist/senses/shepherd/agent-presentation.js +88 -0
  603. package/dist/senses/shepherd/attention-page.js +166 -0
  604. package/dist/senses/shepherd/attention-sidebar.js +76 -0
  605. package/dist/senses/shepherd/attention.js +295 -0
  606. package/dist/senses/shepherd/client.js +196 -0
  607. package/dist/senses/shepherd/cmux.js +354 -0
  608. package/dist/senses/shepherd/composer.js +336 -0
  609. package/dist/senses/shepherd/feedback-reply.js +108 -0
  610. package/dist/senses/shepherd/feedback-source.js +20 -0
  611. package/dist/senses/shepherd/feedback-store.js +331 -0
  612. package/dist/senses/shepherd/feedback-submit.js +182 -0
  613. package/dist/senses/shepherd/feedback-worker.js +207 -0
  614. package/dist/senses/shepherd/guidance.js +270 -0
  615. package/dist/senses/shepherd/herdr.js +315 -0
  616. package/dist/senses/shepherd/host.js +14 -0
  617. package/dist/senses/shepherd/judge.js +150 -0
  618. package/dist/senses/shepherd/notice-outbox.js +262 -0
  619. package/dist/senses/shepherd/owner-notice.js +325 -0
  620. package/dist/senses/shepherd/redact.js +66 -0
  621. package/dist/senses/shepherd/returns.js +79 -0
  622. package/dist/senses/shepherd/sense.js +451 -0
  623. package/dist/senses/shepherd/surface.js +123 -0
  624. package/dist/senses/shepherd/target-binding.js +13 -0
  625. package/dist/senses/shepherd/terminal-process.js +120 -0
  626. package/dist/senses/shepherd-entry.js +98 -0
  627. package/dist/senses/surface-tool.js +109 -0
  628. package/dist/senses/teams-entry.js +68 -8
  629. package/dist/senses/teams-image.js +119 -0
  630. package/dist/senses/teams.js +760 -308
  631. package/dist/senses/telegram-admission.js +718 -0
  632. package/dist/senses/telegram-approval-runtime.js +793 -0
  633. package/dist/senses/telegram-attachments.js +186 -0
  634. package/dist/senses/telegram-audit-ledger.js +220 -0
  635. package/dist/senses/telegram-authority-transport.js +231 -0
  636. package/dist/senses/telegram-client.js +1749 -0
  637. package/dist/senses/telegram-effect-adapter.js +900 -0
  638. package/dist/senses/telegram-entry.js +83 -0
  639. package/dist/senses/telegram-handoff.js +80 -0
  640. package/dist/senses/telegram.js +2405 -0
  641. package/dist/senses/trust-gate.js +104 -9
  642. package/dist/senses/voice/audio-playback.js +237 -0
  643. package/dist/senses/voice/audio-routing.js +119 -0
  644. package/dist/senses/voice/call-auth.js +250 -0
  645. package/dist/senses/voice/elevenlabs.js +202 -0
  646. package/dist/senses/voice/floor-control.js +431 -0
  647. package/dist/senses/voice/floor-controller.js +115 -0
  648. package/dist/senses/voice/golden-path.js +116 -0
  649. package/dist/senses/voice/index.js +29 -0
  650. package/dist/senses/voice/local-audio-control.js +344 -0
  651. package/dist/senses/voice/local-audio-devices.js +516 -0
  652. package/dist/senses/voice/local-audio-disclosure.js +174 -0
  653. package/dist/senses/voice/local-audio-identity.js +103 -0
  654. package/dist/senses/voice/local-audio-join.js +325 -0
  655. package/dist/senses/voice/local-audio-mute.js +199 -0
  656. package/dist/senses/voice/local-audio-notify.js +121 -0
  657. package/dist/senses/voice/local-audio-prompts.js +116 -0
  658. package/dist/senses/voice/local-audio-transport.js +427 -0
  659. package/dist/senses/voice/local-audio.js +281 -0
  660. package/dist/senses/voice/local-media-stream.js +145 -0
  661. package/dist/senses/voice/meeting.js +113 -0
  662. package/dist/senses/voice/outbound.js +190 -0
  663. package/dist/senses/voice/phone.js +33 -0
  664. package/dist/senses/voice/playback.js +139 -0
  665. package/dist/senses/voice/process-guards.js +51 -0
  666. package/dist/senses/voice/realtime-eval.js +496 -0
  667. package/dist/senses/voice/realtime-tool-schema.js +195 -0
  668. package/dist/senses/voice/realtime-trace.js +531 -0
  669. package/dist/senses/voice/transcript.js +70 -0
  670. package/dist/senses/voice/turn.js +191 -0
  671. package/dist/senses/voice/twilio-phone-runtime.js +836 -0
  672. package/dist/senses/voice/twilio-phone.js +5454 -0
  673. package/dist/senses/voice/types.js +2 -0
  674. package/dist/senses/voice/whisper.js +161 -0
  675. package/dist/senses/voice-entry.js +83 -0
  676. package/dist/senses/voice-realtime-eval-command.js +99 -0
  677. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  678. package/dist/senses/voice-twilio-entry.js +87 -0
  679. package/dist/trips/core.js +138 -0
  680. package/dist/trips/store.js +265 -0
  681. package/dist/util/frontmatter.js +69 -0
  682. package/npm-shrinkwrap.json +8100 -0
  683. package/package.json +74 -13
  684. package/skills/agent-commerce.md +113 -0
  685. package/skills/browser-navigation.md +117 -0
  686. package/skills/commerce-setup-guide.md +116 -0
  687. package/skills/commerce-setup.md +84 -0
  688. package/skills/configure-dev-tools.md +99 -0
  689. package/skills/travel-planning.md +138 -0
  690. package/dist/heart/daemon/auth-flow.js +0 -430
  691. package/dist/heart/daemon/ouro-path-installer.js +0 -260
  692. package/dist/heart/daemon/ouro-version-manager.js +0 -171
  693. package/dist/heart/daemon/update-hooks.js +0 -138
  694. package/dist/heart/obligations.js +0 -191
  695. package/dist/heart/safe-workspace.js +0 -362
  696. package/dist/heart/session-recall.js +0 -116
  697. package/dist/mind/friends/channel.js +0 -84
  698. package/dist/mind/friends/group-context.js +0 -144
  699. package/dist/mind/friends/resolver.js +0 -84
  700. package/dist/mind/friends/store-file.js +0 -190
  701. package/dist/mind/friends/store.js +0 -4
  702. package/dist/mind/friends/tokens.js +0 -26
  703. package/dist/mind/friends/trust-explanation.js +0 -74
  704. package/dist/mind/friends/types.js +0 -29
  705. package/dist/repertoire/tasks/board.js +0 -134
  706. package/dist/repertoire/tasks/index.js +0 -224
  707. package/dist/repertoire/tasks/lifecycle.js +0 -80
  708. package/dist/repertoire/tasks/middleware.js +0 -65
  709. package/dist/repertoire/tasks/parser.js +0 -173
  710. package/dist/repertoire/tasks/scanner.js +0 -132
  711. package/dist/repertoire/tasks/transitions.js +0 -144
  712. package/dist/senses/bluebubbles-entry.js +0 -13
  713. package/dist/senses/bluebubbles.js +0 -1181
  714. package/dist/senses/debug-activity.js +0 -154
  715. package/dist/senses/inner-dialog-worker.js +0 -90
  716. package/dist/senses/inner-dialog.js +0 -525
  717. package/subagents/README.md +0 -7
  718. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  719. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  720. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  721. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  722. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  723. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  724. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  725. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  726. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  727. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  728. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  729. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  730. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  731. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  732. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  733. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  734. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,262 @@
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.noticeRecordId = noticeRecordId;
37
+ exports.readNoticeOutbox = readNoticeOutbox;
38
+ exports.enqueueNotice = enqueueNotice;
39
+ exports.noticeDeliveryState = noticeDeliveryState;
40
+ exports.knownNotice = knownNotice;
41
+ exports.declareNoticeTargets = declareNoticeTargets;
42
+ exports.claimPendingNotices = claimPendingNotices;
43
+ exports.recordNoticeDelivery = recordNoticeDelivery;
44
+ const node_crypto_1 = require("node:crypto");
45
+ const fs = __importStar(require("node:fs"));
46
+ const path = __importStar(require("node:path"));
47
+ const node_util_1 = require("node:util");
48
+ const file_lock_1 = require("../../heart/file-lock");
49
+ const runtime_1 = require("../../nerves/runtime");
50
+ const redact_1 = require("./redact");
51
+ const returns_1 = require("./returns");
52
+ const MAX_BYTES = 2 * 1024 * 1024;
53
+ const RECENT_SENT = 256;
54
+ const STATES = new Set(["pending", "sent", "unknown"]);
55
+ const KINDS = new Set(["premature", "gate", "done", "working", "waiting", "unclear", "error", "loop_guard"]);
56
+ const fileFor = (root) => path.join((0, returns_1.shepherdStateDir)(root), "notice-outbox.json");
57
+ const object = (value) => !!value && typeof value === "object" && !Array.isArray(value);
58
+ const nullableString = (value) => value === null || typeof value === "string";
59
+ function isReturn(value) {
60
+ return object(value)
61
+ && ["at", "host", "session", "transition", "kind", "action", "reason"].every(key => typeof value[key] === "string")
62
+ && KINDS.has(String(value.kind)) && ["respond", "let_through"].includes(String(value.action))
63
+ && ["agent", "cwd", "task", "reply"].every(key => nullableString(value[key]))
64
+ && ["latencyMs", "inputTokens"].every(key => value[key] === null || typeof value[key] === "number")
65
+ && (value.title === undefined || typeof value.title === "string")
66
+ && (value.workspaceTitle === undefined || nullableString(value.workspaceTitle));
67
+ }
68
+ function isDelivery(value) {
69
+ return object(value) && typeof value.state === "string" && STATES.has(value.state)
70
+ && typeof value.at === "string" && Number.isSafeInteger(value.attempts) && Number(value.attempts) >= 0
71
+ && (value.reason === undefined || typeof value.reason === "string")
72
+ && (value.messageId === undefined || typeof value.messageId === "string");
73
+ }
74
+ function noticeRecordId(record) {
75
+ return (0, node_crypto_1.createHash)("sha256").update(JSON.stringify([record.host, record.session, record.transition, record.at])).digest("hex");
76
+ }
77
+ function readNoticeOutbox(root) {
78
+ let raw;
79
+ try {
80
+ raw = fs.readFileSync(fileFor(root), "utf8");
81
+ }
82
+ catch (error) {
83
+ if (error.code === "ENOENT")
84
+ return [];
85
+ throw error;
86
+ }
87
+ if (Buffer.byteLength(raw) > MAX_BYTES)
88
+ throw new Error("Shepherd notice outbox exceeds its 2 MiB limit");
89
+ let value;
90
+ try {
91
+ value = JSON.parse(raw);
92
+ }
93
+ catch {
94
+ throw new Error("Shepherd notice outbox is malformed JSON");
95
+ }
96
+ if (!object(value) || value.schemaVersion !== 1 || !Array.isArray(value.entries))
97
+ throw new Error("invalid Shepherd notice outbox schema");
98
+ const entries = [];
99
+ const seen = new Set();
100
+ for (const entry of value.entries) {
101
+ if (!object(entry) || typeof entry.id !== "string" || !isReturn(entry.record)
102
+ || !object(entry.deliveries) || !Object.values(entry.deliveries).every(isDelivery)
103
+ || entry.id !== noticeRecordId(entry.record) || seen.has(entry.id))
104
+ throw new Error("invalid Shepherd notice outbox entry");
105
+ seen.add(entry.id);
106
+ entries.push({ id: entry.id, record: entry.record, deliveries: entry.deliveries });
107
+ }
108
+ return entries;
109
+ }
110
+ function atomicWrite(file, value) {
111
+ fs.mkdirSync(path.dirname(file), { recursive: true, mode: 0o700 });
112
+ const encoded = JSON.stringify(value);
113
+ if (Buffer.byteLength(encoded) > MAX_BYTES)
114
+ throw new Error("Shepherd notice outbox exceeds its 2 MiB limit");
115
+ const temp = `${file}.${(0, node_crypto_1.randomUUID)()}.tmp`;
116
+ const fd = fs.openSync(temp, "wx", 0o600);
117
+ try {
118
+ fs.writeFileSync(fd, encoded);
119
+ fs.fsyncSync(fd);
120
+ }
121
+ finally {
122
+ fs.closeSync(fd);
123
+ }
124
+ fs.renameSync(temp, file);
125
+ }
126
+ function persist(root, entries) {
127
+ const sent = entries.filter(entry => Object.keys(entry.deliveries).length > 0 && Object.values(entry.deliveries).every(value => value.state === "sent"));
128
+ const older = sent.slice(0, Math.max(0, sent.length - RECENT_SENT));
129
+ const ids = new Set(older.map(entry => entry.id));
130
+ // Archive acceptances before removing their payloads from the active snapshot.
131
+ for (const entry of older)
132
+ atomicWrite(path.join((0, returns_1.shepherdStateDir)(root), "notice-receipts", `${entry.id}.json`), entry);
133
+ atomicWrite(fileFor(root), { schemaVersion: 1, entries: entries.filter(entry => !ids.has(entry.id)) });
134
+ }
135
+ function archived(root, id) {
136
+ const file = path.join((0, returns_1.shepherdStateDir)(root), "notice-receipts", `${id}.json`);
137
+ let raw;
138
+ try {
139
+ raw = fs.readFileSync(file, "utf8");
140
+ }
141
+ catch (error) {
142
+ if (error.code === "ENOENT")
143
+ return undefined;
144
+ throw error;
145
+ }
146
+ const value = JSON.parse(raw);
147
+ if (!object(value) || value.id !== id || !isReturn(value.record) || !object(value.deliveries)
148
+ || !Object.values(value.deliveries).every(isDelivery))
149
+ throw new Error("invalid archived Shepherd notice receipt");
150
+ return { id, record: value.record, deliveries: value.deliveries };
151
+ }
152
+ function mutate(root, change) {
153
+ const dir = (0, returns_1.shepherdStateDir)(root);
154
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
155
+ return (0, file_lock_1.withFileLock)(dir, "notice-outbox", () => {
156
+ const entries = readNoticeOutbox(root);
157
+ const result = change(entries);
158
+ persist(root, entries);
159
+ return result;
160
+ }, { waitMs: 1000 });
161
+ }
162
+ function enqueueNotice(root, record) {
163
+ if (!isReturn(record))
164
+ return Promise.reject(new Error("invalid Shepherd return for a notice"));
165
+ const redacted = {
166
+ ...record,
167
+ reason: (0, redact_1.redactSecrets)(record.reason),
168
+ reply: record.reply === null ? null : (0, redact_1.redactSecrets)(record.reply),
169
+ ...(record.title !== undefined ? { title: (0, redact_1.redactSecrets)(record.title) } : {}),
170
+ ...(record.workspaceTitle !== undefined && record.workspaceTitle !== null ? { workspaceTitle: (0, redact_1.redactSecrets)(record.workspaceTitle) } : {}),
171
+ };
172
+ const normalized = JSON.parse(JSON.stringify(redacted));
173
+ if (!isReturn(normalized))
174
+ return Promise.reject(new Error("invalid normalized Shepherd return for a notice"));
175
+ const safe = normalized;
176
+ const id = noticeRecordId(safe);
177
+ return mutate(root, entries => {
178
+ const existing = entries.find(entry => entry.id === id) ?? archived(root, id);
179
+ if (existing && !(0, node_util_1.isDeepStrictEqual)(existing.record, safe))
180
+ throw new Error("the same return has a different notice body");
181
+ if (!existing)
182
+ entries.push({ id, record: safe, deliveries: {} });
183
+ return id;
184
+ }).then(value => {
185
+ (0, runtime_1.emitNervesEvent)({ component: "senses", event: "senses.shepherd_notice_queued", message: "persisted a Shepherd owner notice intent", meta: { id } });
186
+ return value;
187
+ });
188
+ }
189
+ function noticeDeliveryState(entry, friendId) {
190
+ return Object.hasOwn(entry.deliveries, friendId) ? entry.deliveries[friendId].state : "pending";
191
+ }
192
+ function knownNotice(root, id, entries) {
193
+ if (!/^[a-f0-9]{64}$/.test(id))
194
+ throw new Error(`unknown notice: ${id}`);
195
+ return entries.find(value => value.id === id) ?? archived(root, id);
196
+ }
197
+ function validTarget(friendId) {
198
+ return !!friendId && !["__proto__", "constructor", "prototype"].includes(friendId);
199
+ }
200
+ function selectedEntries(root, entries, ids) {
201
+ return ids.map(id => {
202
+ const entry = knownNotice(root, id, entries);
203
+ if (!entry)
204
+ throw new Error(`unknown notice: ${id}`);
205
+ return entry;
206
+ });
207
+ }
208
+ function declareNoticeTargets(root, ids, friendIds, at) {
209
+ if (!friendIds.every(validTarget))
210
+ return Promise.reject(new Error("invalid notice target"));
211
+ return mutate(root, entries => {
212
+ for (const entry of selectedEntries(root, entries, ids)) {
213
+ if (!entries.includes(entry) && friendIds.some(friendId => !Object.hasOwn(entry.deliveries, friendId)))
214
+ throw new Error("notice is already settled; it cannot acquire new recipients");
215
+ for (const friendId of friendIds) {
216
+ if (!Object.hasOwn(entry.deliveries, friendId))
217
+ entry.deliveries[friendId] = { state: "pending", at, attempts: 0 };
218
+ }
219
+ }
220
+ });
221
+ }
222
+ /** Claim under the same cross-process lock as receipts, before any transport side effect. */
223
+ function claimPendingNotices(root, ids, friendId, at) {
224
+ if (!validTarget(friendId))
225
+ return Promise.reject(new Error("invalid notice target"));
226
+ return mutate(root, entries => {
227
+ const claimed = selectedEntries(root, entries, ids).filter(entry => noticeDeliveryState(entry, friendId) === "pending");
228
+ for (const entry of claimed) {
229
+ if (!entries.includes(entry))
230
+ throw new Error("notice is already settled; it cannot acquire new recipients");
231
+ entry.deliveries[friendId] = {
232
+ state: "unknown", at, reason: "awaiting transport acceptance", attempts: (entry.deliveries[friendId]?.attempts ?? 0) + 1,
233
+ };
234
+ }
235
+ return claimed;
236
+ });
237
+ }
238
+ function recordNoticeDelivery(root, ids, friendId, receipt) {
239
+ if (!validTarget(friendId))
240
+ return Promise.reject(new Error("invalid notice target"));
241
+ return mutate(root, entries => {
242
+ let updated = 0;
243
+ for (const entry of selectedEntries(root, entries, ids)) {
244
+ if (!entries.includes(entry) && !Object.hasOwn(entry.deliveries, friendId))
245
+ throw new Error("notice is already settled; it cannot acquire new recipients");
246
+ const previous = Object.hasOwn(entry.deliveries, friendId) ? entry.deliveries[friendId] : undefined;
247
+ // A late failure cannot erase an acceptance another worker already recorded.
248
+ if (previous?.state === "sent")
249
+ continue;
250
+ entry.deliveries[friendId] = {
251
+ ...receipt,
252
+ ...(receipt.reason ? { reason: (0, redact_1.redactSecrets)(receipt.reason) } : {}),
253
+ attempts: previous?.state === "unknown" ? previous.attempts : (previous?.attempts ?? 0) + 1,
254
+ };
255
+ updated += 1;
256
+ }
257
+ return updated;
258
+ }).then(updated => {
259
+ if (updated > 0)
260
+ (0, runtime_1.emitNervesEvent)({ component: "senses", event: "senses.shepherd_notice_receipt", message: "persisted a Shepherd owner notice delivery outcome", meta: { friendId, state: receipt.state, notices: updated } });
261
+ });
262
+ }
@@ -0,0 +1,325 @@
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.resolveNoticeTargets = resolveNoticeTargets;
42
+ exports.chooseTeamsBot = chooseTeamsBot;
43
+ exports.createTeamsNoticeSender = createTeamsNoticeSender;
44
+ exports.createOwnerNotifier = createOwnerNotifier;
45
+ const path = __importStar(require("node:path"));
46
+ const friends_1 = require("@ouro.bot/friends");
47
+ const await_alert_1 = require("../../heart/awaiting/await-alert");
48
+ const config_1 = require("../../heart/config");
49
+ const runtime_1 = require("../../nerves/runtime");
50
+ const returns_1 = require("./returns");
51
+ const notice_outbox_1 = require("./notice-outbox");
52
+ /**
53
+ * The owner notice: after a judged return, the agent's owner hears what happened in one short plain message on their
54
+ * own channel. It is deterministic, written here and sent with no model turn, so the owner hears about every return the
55
+ * policy covers whether or not the Ouro agent decides it matters. Returns that arrive close together share one message.
56
+ */
57
+ exports.NOTICE_COALESCE_MS = 5_000;
58
+ /** Returns named one by one in a coalesced message; the rest are counted. */
59
+ exports.NOTICE_LIST_MAX = 6;
60
+ exports.NOTICE_RETRY_MS = 30_000;
61
+ const NAME_MAX = 60;
62
+ const REASON_MAX = 300;
63
+ const REPLY_MAX = 240;
64
+ /** Kinds a "needs-me" owner still hears about. */
65
+ const NEEDS_ME = new Set(["gate", "done", "loop_guard"]);
66
+ function noticeWanted(policy, record) {
67
+ if (policy === "off")
68
+ return false;
69
+ return policy === "every" || NEEDS_ME.has(record.kind);
70
+ }
71
+ /**
72
+ * Untrusted terminal text as one bounded plain line: no control or invisible characters, and nothing Teams could read as
73
+ * markup, a mention or code (`< > [ ] * ~ # | \ @` and backticks). Double quotes become single, so a quoted reply stays one quote.
74
+ */
75
+ function plain(value, max) {
76
+ const flat = value
77
+ .replace(/[\p{Cc}\p{Cf}\p{Zl}\p{Zp}]+/gu, " ")
78
+ .replace(/[<>[\]*~#|\\@`]+/g, " ")
79
+ .replace(/"/g, "'")
80
+ .replace(/\s+/g, " ")
81
+ .trim();
82
+ return flat.length <= max ? flat : `${flat.slice(0, max - 1).trimEnd()}…`;
83
+ }
84
+ function who(record, location) {
85
+ const session = typeof location === "object" ? location : undefined;
86
+ const agentName = record.agent ?? session?.agent;
87
+ const cwd = record.cwd ?? session?.cwd;
88
+ const agent = agentName ? plain(agentName, NAME_MAX) : "";
89
+ const folder = cwd ? plain(path.basename(cwd), NAME_MAX) : "";
90
+ const ref = typeof location === "string" ? location : session?.ref;
91
+ const handle = plain(ref ?? record.session.slice(0, 8), NAME_MAX);
92
+ const labels = [record.workspaceTitle ?? session?.workspaceTitle, record.title ?? session?.title].filter((label) => !!label).map((label) => plain(label, NAME_MAX));
93
+ const where = labels.length ? `${labels.join(" / ")}; ${handle}` : handle;
94
+ return `${agent || "A coding agent"}${folder ? ` in ${folder}` : ""}${where ? ` (${where})` : ""}`;
95
+ }
96
+ /** One return as one sentence pair: who returned, what Shepherd did, and why. */
97
+ function noticeLine(record, location) {
98
+ const subject = who(record, location);
99
+ const why = `Why: ${plain(record.reason, REASON_MAX) || "no reason given"}`;
100
+ switch (record.kind) {
101
+ case "premature":
102
+ if (record.action === "respond" && record.reply) {
103
+ const sent = record.reply.startsWith("key:") ? `pressed ${plain(record.reply.slice(4), 10)}` : `sent it back: "${plain(record.reply, REPLY_MAX)}"`;
104
+ return `${subject} stopped early, so I ${sent}. ${why}`;
105
+ }
106
+ return `${subject} stopped early, but I did not answer it, so it is waiting for you. ${why}`;
107
+ case "gate":
108
+ return `${subject} needs you. ${why}`;
109
+ case "done":
110
+ return `${subject} says it is done. ${why}`;
111
+ case "waiting":
112
+ return `${subject} is waiting on an outside dependency; the work is not yet delivered. ${why}`;
113
+ case "loop_guard":
114
+ return `${subject}: I stopped answering it after too many replies, so it is waiting for you. ${why}`;
115
+ case "working":
116
+ return `${subject} is still working in the background and has news. ${why}`;
117
+ case "unclear":
118
+ return `${subject} stopped and I could not tell what it needs, so I left it. ${why}`;
119
+ default:
120
+ return `${subject} stopped but I could not judge it, so I left it. ${why}`;
121
+ }
122
+ }
123
+ /** One message for a burst: a single return is its line; several are a short list, the extra ones counted. */
124
+ function noticeMessage(records, refs = new Map()) {
125
+ const lines = records.slice(0, exports.NOTICE_LIST_MAX).map((record) => noticeLine(record, refs.get(record.session)));
126
+ if (records.length === 1)
127
+ return lines[0];
128
+ const more = records.length - lines.length;
129
+ return [`${records.length} coding agents stopped:`, ...lines.map((line) => `- ${line}`), ...(more > 0 ? [`- and ${more} more.`] : [])].join("\n");
130
+ }
131
+ function teamsAadId(friend) {
132
+ const ext = friend.externalIds.find((entry) => entry.provider === "aad" && !entry.externalId.startsWith("group:"));
133
+ return ext ? { id: ext.externalId.toLowerCase(), tenantId: ext.tenantId } : null;
134
+ }
135
+ /**
136
+ * Who hears the notice: every family friend reachable on Teams (a Teams user id the bot can open a chat with), once per
137
+ * Teams user even when several friend records share one. Teams is the only proactive channel wired today.
138
+ */
139
+ async function resolveNoticeTargets(agentRoot, store = new friends_1.FileFriendStore(path.join(agentRoot, "friends"))) {
140
+ const seen = new Set();
141
+ const targets = [];
142
+ for (const friend of await store.listAll()) {
143
+ if (friend.trustLevel !== "family")
144
+ continue;
145
+ const aad = teamsAadId(friend);
146
+ if (!aad || seen.has(aad.id))
147
+ continue;
148
+ seen.add(aad.id);
149
+ targets.push({ friendId: friend.id, name: friend.name, key: (0, await_alert_1.resolveAlertKey)(agentRoot, friend.id, "teams") ?? "shepherd", ...(aad.tenantId ? { tenantId: aad.tenantId } : {}) });
150
+ }
151
+ (0, runtime_1.emitNervesEvent)({ component: "senses", event: "senses.shepherd_notice_targets", message: "resolved Shepherd owner notice targets", meta: { count: targets.length } });
152
+ return targets;
153
+ }
154
+ /** The bot whose tenant is the friend's: the secondary bot when it serves that tenant, else the primary. */
155
+ function chooseTeamsBot(tenantId, primary, secondary) {
156
+ if (tenantId && secondary.clientId && secondary.tenantId === tenantId)
157
+ return secondary;
158
+ return primary.clientId ? primary : null;
159
+ }
160
+ /* v8 ignore start -- the live Teams SDK client; its token and REST calls need a real bot registration @preserve */
161
+ async function liveBotApi(config) {
162
+ const { App } = await Promise.resolve().then(() => __importStar(require("@microsoft/teams.apps")));
163
+ const app = new App({
164
+ clientId: config.clientId,
165
+ ...(config.clientSecret ? { clientSecret: config.clientSecret } : {}),
166
+ tenantId: config.tenantId,
167
+ ...(config.managedIdentityClientId ? { managedIdentityClientId: config.managedIdentityClientId } : {}),
168
+ });
169
+ return { id: app.id, conversations: app.api.conversations };
170
+ }
171
+ /* v8 ignore stop */
172
+ /**
173
+ * Sends through the Teams sense's own proactive path (`sendProactiveTeamsMessageToSession`: trust check, internal-content
174
+ * guard, 1:1 chat with the friend's Teams id) with a bot client of this process's own, built from the agent's Teams
175
+ * credentials. Nothing listens on a port: the client only acquires a bot token and calls the Bot Framework.
176
+ */
177
+ function createTeamsNoticeSender(agentRoot, deps = {}) {
178
+ const bots = new Map();
179
+ return async (target, text) => {
180
+ const config = chooseTeamsBot(target.tenantId, (deps.primary ?? config_1.getTeamsConfig)(), (deps.secondary ?? config_1.getTeamsSecondaryConfig)());
181
+ if (!config)
182
+ return { delivered: false, reason: "no_teams_bot" };
183
+ let bot = bots.get(config.clientId);
184
+ if (!bot) {
185
+ /* v8 ignore next -- tests inject the bot client; the live Bot Framework client is built only in the running sense @preserve */
186
+ bot = (deps.botApi ?? liveBotApi)(config);
187
+ bots.set(config.clientId, bot);
188
+ // A client that could not be built is built again for the next notice.
189
+ bot.catch(() => bots.delete(config.clientId));
190
+ }
191
+ const { sendProactiveTeamsMessageToSession } = await Promise.resolve().then(() => __importStar(require("../teams")));
192
+ return sendProactiveTeamsMessageToSession({ friendId: target.friendId, sessionKey: target.key, text, textFormat: "plain", intent: "generic_outreach", captureReceipt: true }, { botApi: await bot, store: new friends_1.FileFriendStore(path.join(agentRoot, "friends")) });
193
+ };
194
+ }
195
+ /** Collects notices for NOTICE_COALESCE_MS after the first, then sends them as one message. It never throws. */
196
+ function createOwnerNotifier(options) {
197
+ const { agent, policy } = options;
198
+ const resolveTargets = options.resolveTargets ?? (() => resolveNoticeTargets(options.agentRoot));
199
+ const send = options.send ?? createTeamsNoticeSender(options.agentRoot);
200
+ const retryWrites = new Map();
201
+ const writes = new Set();
202
+ let cancel = null;
203
+ let stopped = false;
204
+ let flushing = null;
205
+ function schedule(ms) {
206
+ if (!stopped && policy !== "off")
207
+ cancel ??= options.schedule(() => { void flush(); }, ms);
208
+ }
209
+ function persistIntent(record) {
210
+ const key = `${record.host}:${record.session}:${record.transition}:${record.at}`;
211
+ retryWrites.set(key, record);
212
+ const write = (0, notice_outbox_1.enqueueNotice)(options.agentRoot, record).then(() => {
213
+ retryWrites.delete(key);
214
+ }).catch(error => {
215
+ (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 } });
216
+ schedule(exports.NOTICE_RETRY_MS);
217
+ }).finally(() => { writes.delete(write); });
218
+ writes.add(write);
219
+ return write;
220
+ }
221
+ async function runFlush() {
222
+ cancel?.();
223
+ cancel = null;
224
+ if (stopped || policy === "off")
225
+ return;
226
+ await Promise.all([...writes]);
227
+ for (const record of [...retryWrites.values()])
228
+ await persistIntent(record);
229
+ try {
230
+ 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")));
231
+ if (entries.length === 0)
232
+ return;
233
+ const refs = new Map();
234
+ try {
235
+ for (const session of await options.listSessions())
236
+ refs.set(session.id, session);
237
+ }
238
+ catch {
239
+ // Without the host's handles, each notice names a short session id instead.
240
+ }
241
+ const targets = await resolveTargets();
242
+ if (targets.length === 0) {
243
+ (0, runtime_1.emitNervesEvent)({ level: "warn", component: "senses", event: "senses.shepherd_notice_no_target", message: "no family friend is reachable on Teams, so the Shepherd owner notice was not sent", meta: { agent, returns: entries.length } });
244
+ schedule(exports.NOTICE_RETRY_MS);
245
+ return;
246
+ }
247
+ await (0, notice_outbox_1.declareNoticeTargets)(options.agentRoot, entries.map(entry => entry.id), targets.map(target => target.friendId), new Date().toISOString());
248
+ const reachable = new Set(targets.map(target => target.friendId));
249
+ let retry = entries.some(entry => Object.entries(entry.deliveries).some(([friendId, delivery]) => delivery.state === "pending" && !reachable.has(friendId)));
250
+ for (const target of targets) {
251
+ const pending = entries.filter(entry => (0, notice_outbox_1.noticeDeliveryState)(entry, target.friendId) === "pending");
252
+ for (let start = 0; start < pending.length && !stopped; start += exports.NOTICE_LIST_MAX) {
253
+ // Only the worker that atomically claims a pending entry may initiate transport.
254
+ const batch = await (0, notice_outbox_1.claimPendingNotices)(options.agentRoot, pending.slice(start, start + exports.NOTICE_LIST_MAX).map(entry => entry.id), target.friendId, new Date().toISOString());
255
+ if (batch.length === 0)
256
+ continue;
257
+ const ids = batch.map(entry => entry.id);
258
+ try {
259
+ const result = await send(target, noticeMessage(batch.map(entry => entry.record), refs));
260
+ const state = result.delivered ? "sent"
261
+ : result.delivery ? result.delivery.state === "not_sent" ? "pending" : "unknown"
262
+ : result.reason && result.reason !== "send_error" ? "pending" : "unknown";
263
+ await (0, notice_outbox_1.recordNoticeDelivery)(options.agentRoot, ids, target.friendId, {
264
+ state, at: new Date().toISOString(), ...(result.reason ? { reason: result.reason } : {}),
265
+ ...(result.delivery?.messageId ? { messageId: result.delivery.messageId } : {}),
266
+ });
267
+ retry ||= state === "pending";
268
+ (0, runtime_1.emitNervesEvent)({
269
+ level: result.delivered ? "info" : "warn", component: "senses",
270
+ event: result.delivered ? "senses.shepherd_notice_sent" : "senses.shepherd_notice_not_sent",
271
+ message: result.delivered ? "sent the Shepherd owner notice" : "the Shepherd owner notice was not delivered",
272
+ meta: { agent, friendId: target.friendId, returns: batch.length, ...(result.delivered ? {} : { reason: result.reason ?? "unknown" }) },
273
+ });
274
+ }
275
+ catch (error) {
276
+ (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 } });
277
+ }
278
+ }
279
+ }
280
+ if (retry)
281
+ schedule(exports.NOTICE_RETRY_MS);
282
+ }
283
+ catch (error) {
284
+ (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 } });
285
+ schedule(exports.NOTICE_RETRY_MS);
286
+ }
287
+ }
288
+ function flush() {
289
+ if (flushing)
290
+ return flushing;
291
+ flushing = runFlush().finally(() => { flushing = null; });
292
+ return flushing;
293
+ }
294
+ try {
295
+ const existing = (0, notice_outbox_1.readNoticeOutbox)(options.agentRoot);
296
+ let recovered = false;
297
+ for (const record of (0, returns_1.readReturns)(options.agentRoot)) {
298
+ if (record.noticeEligible === true && noticeWanted(policy, record) && !(0, notice_outbox_1.knownNotice)(options.agentRoot, (0, notice_outbox_1.noticeRecordId)(record), existing)) {
299
+ void persistIntent(record);
300
+ recovered = true;
301
+ }
302
+ }
303
+ if (recovered || existing.some(entry => Object.keys(entry.deliveries).length === 0 || Object.values(entry.deliveries).some(value => value.state === "pending")))
304
+ schedule(exports.NOTICE_RETRY_MS);
305
+ }
306
+ catch (error) {
307
+ (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 } });
308
+ schedule(exports.NOTICE_RETRY_MS);
309
+ }
310
+ return {
311
+ notify(record) {
312
+ if (stopped || !noticeWanted(policy, record))
313
+ return Promise.resolve();
314
+ const write = persistIntent(record);
315
+ schedule(exports.NOTICE_COALESCE_MS);
316
+ return write;
317
+ },
318
+ flush,
319
+ stop() {
320
+ stopped = true;
321
+ cancel?.();
322
+ cancel = null;
323
+ },
324
+ };
325
+ }
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FINGERPRINT_READ_LINES = exports.FINGERPRINT_LINES = void 0;
4
+ exports.redactSecrets = redactSecrets;
5
+ exports.screenTail = screenTail;
6
+ exports.withoutNumbers = withoutNumbers;
7
+ exports.screenFingerprint = screenFingerprint;
8
+ const node_crypto_1 = require("node:crypto");
9
+ const runtime_1 = require("../../nerves/runtime");
10
+ /**
11
+ * Terminal screens and agents' last messages can show credentials. Everything Shepherd hands to a
12
+ * model or a tool result (screen text, last messages) goes through this first. It is a best-effort net for
13
+ * secret-shaped strings, not a guarantee, so callers also keep their output bounded.
14
+ */
15
+ const REDACTED = "[redacted]";
16
+ const WHOLE_MATCH = [
17
+ /-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g,
18
+ /\bsk-[A-Za-z0-9_-]{16,}/g,
19
+ /\bgh[pousr]_[A-Za-z0-9]{20,}/g,
20
+ /\bgithub_pat_[A-Za-z0-9_]{20,}/g,
21
+ /\bAKIA[0-9A-Z]{16}\b/g,
22
+ /\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}/g,
23
+ /\bv1\.[A-Za-z0-9_-]{40,}\.[A-Za-z0-9_-]{40,}/g,
24
+ /\bxox[abprs]-[A-Za-z0-9-]{10,}/g,
25
+ ];
26
+ /** Keep the label (group 1), redact the value. */
27
+ const LABELLED_VALUE = [
28
+ /(\b(?:Bearer|Basic)\s+)[A-Za-z0-9._~+/=-]{6,}/gi,
29
+ /(\b(?:password|passwd|pwd|secret|token|api[_-]?key|access[_-]?key|client[_-]?secret)\s*[=:]\s*)(?:"[^"]*"|'[^']*'|[^\s'"&]+)/gi,
30
+ /([?&](?:token|key|api_key|access_token|sig|signature)=)[^&\s]+/gi,
31
+ ];
32
+ function redactSecrets(text) {
33
+ let result = text;
34
+ for (const pattern of WHOLE_MATCH)
35
+ result = result.replace(pattern, REDACTED);
36
+ for (const pattern of LABELLED_VALUE)
37
+ result = result.replace(pattern, `$1${REDACTED}`);
38
+ if (result !== text) {
39
+ (0, runtime_1.emitNervesEvent)({ component: "senses", event: "senses.shepherd_redacted", message: "redacted secret-shaped text from cmux output", meta: { removedChars: text.length - result.length } });
40
+ }
41
+ return result;
42
+ }
43
+ /** The last `lines` lines of a screen, without its trailing blank space. */
44
+ function screenTail(text, lines) {
45
+ return text.replace(/\s+$/, "").split("\n").slice(-lines).join("\n");
46
+ }
47
+ /**
48
+ * A screen with its numbers taken out: a timer or token counter at a waiting prompt is not the
49
+ * screen moving on. A timer can tick, grow a unit (`59s` to `1m 0s`), and come and go between
50
+ * redraws, shifting the padding beside it, so runs of numbers with time units vanish along with
51
+ * the space around them, and runs of spaces and line-end padding do not count.
52
+ */
53
+ function withoutNumbers(screen) {
54
+ return screen.replace(/[ \t]*(\d+[hms]?[ \t]*)+/g, " ").replace(/[ \t]+/g, " ").replace(/ $/gm, "");
55
+ }
56
+ /** Lines a screen fingerprint covers, and the fewest lines a read must take to compute one. */
57
+ exports.FINGERPRINT_LINES = 20;
58
+ exports.FINGERPRINT_READ_LINES = 40;
59
+ /**
60
+ * A short fingerprint of what a terminal shows now: its last lines, redacted, with numbers blanked so a ticking timer does
61
+ * not count as a change. `shepherd_read` hands it out and `shepherd_send` compares it, so a key is pressed only on the
62
+ * screen someone actually saw.
63
+ */
64
+ function screenFingerprint(text) {
65
+ return (0, node_crypto_1.createHash)("sha256").update(withoutNumbers(screenTail(redactSecrets(text), exports.FINGERPRINT_LINES))).digest("hex").slice(0, 16);
66
+ }