@ouro.bot/cli 0.1.0-alpha.92 → 0.1.0-alpha.920

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 (716) 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 +5819 -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 +194 -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 +495 -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 +2364 -578
  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 +9199 -0
  148. package/dist/heart/daemon/cli-help.js +735 -0
  149. package/dist/heart/daemon/cli-parse.js +3211 -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 +2084 -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 +237 -0
  244. package/dist/heart/frontend-socket-client.js +164 -0
  245. package/dist/heart/frontend-socket.js +400 -0
  246. package/dist/heart/habits/habit-cancel.js +810 -0
  247. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  248. package/dist/heart/habits/habit-migration.js +194 -0
  249. package/dist/heart/habits/habit-parser.js +278 -0
  250. package/dist/heart/habits/habit-runtime-state.js +93 -0
  251. package/dist/heart/habits/habit-scheduler.js +653 -0
  252. package/dist/heart/habits/habit-session-summary.js +318 -0
  253. package/dist/heart/habits/habit-session.js +636 -0
  254. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
  255. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  256. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  257. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  258. package/dist/heart/identity.js +230 -59
  259. package/dist/heart/kept-notes.js +289 -0
  260. package/dist/heart/kicks.js +1 -1
  261. package/dist/heart/machine-identity.js +175 -0
  262. package/dist/heart/mail-import-discovery.js +356 -0
  263. package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
  264. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  265. package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
  266. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  267. package/dist/heart/mailbox/mailbox-http-transport.js +272 -0
  268. package/dist/heart/mailbox/mailbox-http.js +99 -0
  269. package/dist/heart/mailbox/mailbox-read.js +39 -0
  270. package/dist/heart/mailbox/mailbox-types.js +27 -0
  271. package/dist/heart/mailbox/mailbox-view.js +197 -0
  272. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  273. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  274. package/dist/heart/mailbox/readers/mail.js +375 -0
  275. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  276. package/dist/heart/mailbox/readers/sessions.js +231 -0
  277. package/dist/heart/mailbox/readers/shared.js +111 -0
  278. package/dist/heart/mcp/mcp-server.js +696 -0
  279. package/dist/heart/migrate-config.js +100 -0
  280. package/dist/heart/model-capabilities.js +83 -16
  281. package/dist/heart/orientation-frame.js +345 -0
  282. package/dist/heart/platform.js +81 -0
  283. package/dist/heart/primitives.js +1 -1
  284. package/dist/heart/private-runtime/decision-renderer.js +158 -0
  285. package/dist/heart/private-runtime/index.js +18 -0
  286. package/dist/heart/private-runtime/ledger.js +221 -0
  287. package/dist/heart/private-runtime/policy.js +260 -0
  288. package/dist/heart/private-runtime/types.js +2 -0
  289. package/dist/heart/progress-story.js +1 -1
  290. package/dist/heart/provider-attempt.js +137 -0
  291. package/dist/heart/provider-binding-resolver.js +273 -0
  292. package/dist/heart/provider-credentials.js +449 -0
  293. package/dist/heart/provider-failover.js +311 -0
  294. package/dist/heart/provider-models.js +96 -0
  295. package/dist/heart/provider-ping.js +265 -0
  296. package/dist/heart/provider-readiness-cache.js +119 -0
  297. package/dist/heart/provider-visibility.js +188 -0
  298. package/dist/heart/providers/anthropic-token.js +131 -0
  299. package/dist/heart/providers/anthropic.js +173 -60
  300. package/dist/heart/providers/azure.js +23 -11
  301. package/dist/heart/providers/error-classification.js +127 -0
  302. package/dist/heart/providers/github-copilot.js +38 -39
  303. package/dist/heart/providers/minimax-vlm.js +189 -0
  304. package/dist/heart/providers/minimax.js +26 -8
  305. package/dist/heart/providers/openai-codex-token.js +349 -0
  306. package/dist/heart/providers/openai-codex.js +55 -40
  307. package/dist/heart/providers/openai-compatible.js +177 -0
  308. package/dist/heart/reply-style.js +52 -0
  309. package/dist/heart/run-ledger.js +247 -0
  310. package/dist/heart/runtime-capability-check.js +170 -0
  311. package/dist/heart/runtime-credentials.js +607 -0
  312. package/dist/heart/runtime-cwd.js +87 -0
  313. package/dist/heart/sense-truth.js +24 -4
  314. package/dist/heart/session-activity.js +92 -24
  315. package/dist/heart/session-events.js +1504 -0
  316. package/dist/heart/session-playback-cli-main.js +5 -0
  317. package/dist/heart/session-playback-cli.js +36 -0
  318. package/dist/heart/session-playback.js +231 -0
  319. package/dist/heart/session-redaction-repair-cli-main.js +31 -0
  320. package/dist/heart/session-redaction-repair.js +552 -0
  321. package/dist/heart/session-stats-cli-main.js +5 -0
  322. package/dist/heart/session-stats.js +183 -0
  323. package/dist/heart/session-transcript.js +133 -0
  324. package/dist/heart/shelf-claims.js +78 -0
  325. package/dist/heart/shepherd-config.js +113 -0
  326. package/dist/heart/source-grounding.js +297 -0
  327. package/dist/heart/start-of-turn-packet.js +372 -0
  328. package/dist/heart/steward-policy.js +656 -0
  329. package/dist/heart/streaming.js +609 -207
  330. package/dist/heart/structured-output.js +196 -0
  331. package/dist/heart/sync-classification.js +176 -0
  332. package/dist/heart/sync-health.js +152 -0
  333. package/dist/heart/sync.js +726 -0
  334. package/dist/heart/target-resolution.js +11 -7
  335. package/dist/heart/tempo.js +93 -0
  336. package/dist/heart/temporal-view.js +41 -0
  337. package/dist/heart/timeouts.js +101 -0
  338. package/dist/heart/tool-activity-callbacks.js +59 -0
  339. package/dist/heart/tool-approval.js +382 -0
  340. package/dist/heart/tool-description.js +155 -0
  341. package/dist/heart/tool-friction.js +55 -0
  342. package/dist/heart/tool-loop.js +206 -0
  343. package/dist/heart/turn-context.js +496 -0
  344. package/dist/heart/turn-execution-lease.js +30 -0
  345. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  346. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +3 -2
  347. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  348. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  349. package/dist/heart/versioning/ouro-version-manager.js +432 -0
  350. package/dist/heart/versioning/release-sources.js +173 -0
  351. package/dist/heart/versioning/self-update-defaults.js +294 -0
  352. package/dist/heart/versioning/self-update.js +196 -0
  353. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  354. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  355. package/dist/heart/versioning/update-hooks.js +154 -0
  356. package/dist/heart/versioning/update-state.js +126 -0
  357. package/dist/heart/versioning/updater-launchd.js +150 -0
  358. package/dist/heart/versioning/version-intent.js +114 -0
  359. package/dist/heart/work-card.js +380 -0
  360. package/dist/mailbox-ui/assets/index-Cyv4mw3Y.js +1 -0
  361. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  362. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  363. package/dist/mailbox-ui/index.html +16 -0
  364. package/dist/mailroom/attention.js +167 -0
  365. package/dist/mailroom/autonomy.js +209 -0
  366. package/dist/mailroom/blob-store.js +889 -0
  367. package/dist/mailroom/body-cache.js +61 -0
  368. package/dist/mailroom/cache-sync-cli.js +58 -0
  369. package/dist/mailroom/core.js +803 -0
  370. package/dist/mailroom/entry.js +160 -0
  371. package/dist/mailroom/file-store.js +568 -0
  372. package/dist/mailroom/hosted-cache-sync.js +384 -0
  373. package/dist/mailroom/mbox-import.js +393 -0
  374. package/dist/mailroom/migration.js +164 -0
  375. package/dist/mailroom/outbound.js +380 -0
  376. package/dist/mailroom/policy.js +263 -0
  377. package/dist/mailroom/reader.js +292 -0
  378. package/dist/mailroom/search-cache.js +513 -0
  379. package/dist/mailroom/search-relevance.js +319 -0
  380. package/dist/mailroom/smtp-ingress.js +176 -0
  381. package/dist/mailroom/source-state.js +176 -0
  382. package/dist/mailroom/thread.js +109 -0
  383. package/dist/mailroom/travel-extract.js +89 -0
  384. package/dist/mind/bundle-manifest.js +24 -2
  385. package/dist/mind/context.js +307 -139
  386. package/dist/mind/desk-section.js +362 -0
  387. package/dist/mind/diary-integrity.js +60 -0
  388. package/dist/mind/{memory.js → diary.js} +68 -77
  389. package/dist/mind/embedding-provider.js +60 -0
  390. package/dist/mind/file-state.js +179 -0
  391. package/dist/mind/friend-link-codes.js +209 -0
  392. package/dist/mind/friend-merge.js +330 -0
  393. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  394. package/dist/mind/obligation-steering.js +199 -3
  395. package/dist/mind/pending.js +36 -10
  396. package/dist/mind/prompt-budget.js +479 -0
  397. package/dist/mind/prompt-refresh.js +3 -2
  398. package/dist/mind/prompt.js +1085 -198
  399. package/dist/mind/provenance-trust.js +26 -0
  400. package/dist/mind/record-paths.js +312 -0
  401. package/dist/mind/scrutiny.js +173 -0
  402. package/dist/mind/session-transaction.js +564 -0
  403. package/dist/nerves/cli-logging.js +7 -1
  404. package/dist/nerves/coverage/audit-rules.js +15 -6
  405. package/dist/nerves/coverage/audit.js +28 -2
  406. package/dist/nerves/coverage/cli.js +1 -1
  407. package/dist/nerves/coverage/contract.js +5 -5
  408. package/dist/nerves/coverage/file-completeness.js +139 -5
  409. package/dist/nerves/coverage/run-artifacts.js +55 -35
  410. package/dist/nerves/coverage/source-scanner.js +4 -4
  411. package/dist/nerves/event-buffer.js +111 -0
  412. package/dist/nerves/index.js +293 -9
  413. package/dist/nerves/observation.js +20 -0
  414. package/dist/nerves/redact.js +79 -0
  415. package/dist/nerves/review/cli-main.js +5 -0
  416. package/dist/nerves/review/cli.js +156 -0
  417. package/dist/nerves/review/core.js +159 -0
  418. package/dist/nerves/runtime.js +17 -1
  419. package/dist/repertoire/ado-client.js +15 -56
  420. package/dist/repertoire/ado-semantic.js +16 -10
  421. package/dist/repertoire/api-client.js +97 -0
  422. package/dist/repertoire/bitwarden-store.js +1201 -0
  423. package/dist/repertoire/bundle-templates.js +71 -0
  424. package/dist/repertoire/bw-installer.js +231 -0
  425. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  426. package/dist/repertoire/coding/context-pack.js +331 -0
  427. package/dist/repertoire/coding/feedback.js +174 -32
  428. package/dist/repertoire/coding/index.js +15 -3
  429. package/dist/repertoire/coding/manager.js +159 -10
  430. package/dist/repertoire/coding/spawner.js +40 -11
  431. package/dist/repertoire/coding/tools.js +182 -18
  432. package/dist/repertoire/coding/workbench-client.js +272 -0
  433. package/dist/repertoire/coding/workbench-manager.js +346 -0
  434. package/dist/repertoire/commerce-errors.js +109 -0
  435. package/dist/repertoire/commerce-self-test.js +156 -0
  436. package/dist/repertoire/credential-access.js +183 -0
  437. package/dist/repertoire/desk/classifier.js +362 -0
  438. package/dist/repertoire/duffel-client.js +185 -0
  439. package/dist/repertoire/github-client.js +14 -55
  440. package/dist/repertoire/graph-client.js +11 -52
  441. package/dist/repertoire/guardrails.js +968 -20
  442. package/dist/repertoire/house-sweep.js +469 -0
  443. package/dist/repertoire/mcp-client.js +58 -5
  444. package/dist/repertoire/mcp-manager.js +427 -139
  445. package/dist/repertoire/mcp-tools.js +132 -0
  446. package/dist/repertoire/mcp-write-guard.js +46 -0
  447. package/dist/repertoire/plugin-mcp.js +175 -0
  448. package/dist/repertoire/plugins.js +253 -0
  449. package/dist/repertoire/relationship-authorization.js +322 -0
  450. package/dist/repertoire/sanctuary-container-policy.js +46 -0
  451. package/dist/repertoire/shell-sessions.js +134 -0
  452. package/dist/repertoire/skills.js +48 -4
  453. package/dist/repertoire/stripe-client.js +131 -0
  454. package/dist/repertoire/tool-arguments.js +182 -0
  455. package/dist/repertoire/tool-results.js +29 -0
  456. package/dist/repertoire/tools-a2a.js +699 -0
  457. package/dist/repertoire/tools-attachments.js +322 -0
  458. package/dist/repertoire/tools-awaiting.js +872 -0
  459. package/dist/repertoire/tools-base.js +83 -1168
  460. package/dist/repertoire/tools-bluebubbles.js +2 -0
  461. package/dist/repertoire/tools-bridge.js +144 -0
  462. package/dist/repertoire/tools-bundle.js +995 -0
  463. package/dist/repertoire/tools-commerce.js +253 -0
  464. package/dist/repertoire/tools-config.js +186 -0
  465. package/dist/repertoire/tools-continuity.js +575 -0
  466. package/dist/repertoire/tools-credential.js +383 -0
  467. package/dist/repertoire/tools-escalation.js +84 -0
  468. package/dist/repertoire/tools-evolution.js +527 -0
  469. package/dist/repertoire/tools-files.js +344 -0
  470. package/dist/repertoire/tools-flight.js +290 -0
  471. package/dist/repertoire/tools-flow.js +119 -0
  472. package/dist/repertoire/tools-friend-link.js +57 -0
  473. package/dist/repertoire/tools-github.js +3 -8
  474. package/dist/repertoire/tools-habits.js +103 -0
  475. package/dist/repertoire/tools-house-care.js +174 -0
  476. package/dist/repertoire/tools-mail.js +1828 -0
  477. package/dist/repertoire/tools-notes.js +496 -0
  478. package/dist/repertoire/tools-obligations.js +182 -0
  479. package/dist/repertoire/tools-orientation.js +31 -0
  480. package/dist/repertoire/tools-record.js +482 -0
  481. package/dist/repertoire/tools-rsvp.js +139 -0
  482. package/dist/repertoire/tools-runtime.js +238 -0
  483. package/dist/repertoire/tools-sanctuary-host.js +202 -0
  484. package/dist/repertoire/tools-session.js +1133 -0
  485. package/dist/repertoire/tools-shell.js +149 -0
  486. package/dist/repertoire/tools-shepherd.js +262 -0
  487. package/dist/repertoire/tools-steward-policy.js +147 -0
  488. package/dist/repertoire/tools-stripe.js +224 -0
  489. package/dist/repertoire/tools-surface.js +369 -0
  490. package/dist/repertoire/tools-teams.js +12 -39
  491. package/dist/repertoire/tools-telegram-contacts.js +37 -0
  492. package/dist/repertoire/tools-travel.js +125 -0
  493. package/dist/repertoire/tools-trip.js +982 -0
  494. package/dist/repertoire/tools-unraid.js +556 -0
  495. package/dist/repertoire/tools-user-profile.js +146 -0
  496. package/dist/repertoire/tools-vault.js +40 -0
  497. package/dist/repertoire/tools-voice-local.js +198 -0
  498. package/dist/repertoire/tools-voice.js +145 -0
  499. package/dist/repertoire/tools.js +514 -156
  500. package/dist/repertoire/travel-api-client.js +360 -0
  501. package/dist/repertoire/unraid-client.js +155 -0
  502. package/dist/repertoire/unraid-restart.js +339 -0
  503. package/dist/repertoire/user-profile.js +131 -0
  504. package/dist/repertoire/vault-setup.js +246 -0
  505. package/dist/repertoire/vault-unlock.js +686 -0
  506. package/dist/rsvp/aisleplanner-client.js +354 -0
  507. package/dist/rsvp/cli.js +936 -0
  508. package/dist/rsvp/config.js +327 -0
  509. package/dist/rsvp/cutover.js +433 -0
  510. package/dist/rsvp/diagnostics.js +232 -0
  511. package/dist/rsvp/diff-renderer.js +176 -0
  512. package/dist/rsvp/habit-policy.js +110 -0
  513. package/dist/rsvp/habit-stage.js +123 -0
  514. package/dist/rsvp/incident-bundle.js +97 -0
  515. package/dist/rsvp/migration.js +204 -0
  516. package/dist/rsvp/native-habit-runner.js +630 -0
  517. package/dist/rsvp/outbound-state.js +628 -0
  518. package/dist/rsvp/query.js +118 -0
  519. package/dist/rsvp/replay.js +233 -0
  520. package/dist/rsvp/snapshot.js +232 -0
  521. package/dist/rsvp/spend-ledger.js +175 -0
  522. package/dist/scripts/claude-code-hook.js +41 -0
  523. package/dist/scripts/claude-code-stop-hook.js +47 -0
  524. package/dist/senses/a2a-entry.js +132 -0
  525. package/dist/senses/acp-server.js +386 -0
  526. package/dist/senses/attention-queue.js +186 -0
  527. package/dist/senses/await-turn-message.js +65 -0
  528. package/dist/senses/bluebubbles/active-turns.js +216 -0
  529. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  530. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  531. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +379 -41
  532. package/dist/senses/bluebubbles/context-packet.js +207 -0
  533. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  534. package/dist/senses/bluebubbles/entry.js +90 -0
  535. package/dist/senses/bluebubbles/host-account-verifier.js +88 -0
  536. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
  537. package/dist/senses/bluebubbles/index.js +3878 -0
  538. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  539. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  540. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
  541. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
  542. package/dist/senses/bluebubbles/outbound-state.js +308 -0
  543. package/dist/senses/bluebubbles/processed-log.js +133 -0
  544. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  545. package/dist/senses/bluebubbles/replay.js +284 -0
  546. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  547. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  548. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  549. package/dist/senses/bluebubbles/webhook-registration.js +257 -0
  550. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  551. package/dist/senses/cli/bracketed-paste.js +82 -0
  552. package/dist/senses/cli/image-paste.js +287 -0
  553. package/dist/senses/cli/image-ref-navigation.js +75 -0
  554. package/dist/senses/cli/ink-app.js +156 -0
  555. package/dist/senses/cli/inline-diff.js +64 -0
  556. package/dist/senses/cli/input-keys.js +174 -0
  557. package/dist/senses/cli/kill-ring.js +86 -0
  558. package/dist/senses/cli/message-list.js +51 -0
  559. package/dist/senses/cli/ouro-tui.js +607 -0
  560. package/dist/senses/cli/spinner-imperative.js +135 -0
  561. package/dist/senses/cli/spinner.js +101 -0
  562. package/dist/senses/cli/status-line.js +60 -0
  563. package/dist/senses/cli/streaming-markdown.js +526 -0
  564. package/dist/senses/cli/tool-display.js +85 -0
  565. package/dist/senses/cli/tool-render.js +85 -0
  566. package/dist/senses/cli/tui-store.js +241 -0
  567. package/dist/senses/cli/virtual-list.js +35 -0
  568. package/dist/senses/cli-entry.js +60 -8
  569. package/dist/senses/cli.js +601 -304
  570. package/dist/senses/commands.js +66 -3
  571. package/dist/senses/context-packet-ledger.js +371 -0
  572. package/dist/senses/context-packets.js +154 -0
  573. package/dist/senses/habit-lifecycle-guard.js +24 -0
  574. package/dist/senses/habit-turn-message.js +160 -0
  575. package/dist/senses/ingress-evidence.js +2 -0
  576. package/dist/senses/mail-entry.js +66 -0
  577. package/dist/senses/mail.js +524 -0
  578. package/dist/senses/pipeline.js +1158 -204
  579. package/dist/senses/private-runtime-worker.js +859 -0
  580. package/dist/senses/private-runtime.js +1627 -0
  581. package/dist/senses/proactive-content-guard.js +51 -0
  582. package/dist/senses/root-host-approval-port.js +345 -0
  583. package/dist/senses/root-host-approval-runtime.js +393 -0
  584. package/dist/senses/sanctuary-authority-resident.js +102 -0
  585. package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
  586. package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
  587. package/dist/senses/sanctuary-grounding.js +118 -0
  588. package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
  589. package/dist/senses/sanctuary-health-acceptance-probe.js +774 -0
  590. package/dist/senses/sanctuary-health-runner.js +104 -0
  591. package/dist/senses/sanctuary-health.js +422 -0
  592. package/dist/senses/sanctuary-install-state-contract.js +169 -0
  593. package/dist/senses/sanctuary-interactive-control.js +410 -0
  594. package/dist/senses/sanctuary-media-catalog-contract.js +259 -0
  595. package/dist/senses/sanctuary-media-optimization.js +514 -0
  596. package/dist/senses/sanctuary-runtime.js +369 -0
  597. package/dist/senses/sanctuary-sab.js +85 -0
  598. package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
  599. package/dist/senses/shared-turn.js +793 -0
  600. package/dist/senses/shepherd/client.js +196 -0
  601. package/dist/senses/shepherd/cmux.js +344 -0
  602. package/dist/senses/shepherd/herdr.js +315 -0
  603. package/dist/senses/shepherd/host.js +14 -0
  604. package/dist/senses/shepherd/judge.js +137 -0
  605. package/dist/senses/shepherd/owner-notice.js +245 -0
  606. package/dist/senses/shepherd/redact.js +66 -0
  607. package/dist/senses/shepherd/returns.js +79 -0
  608. package/dist/senses/shepherd/sense.js +309 -0
  609. package/dist/senses/shepherd-entry.js +78 -0
  610. package/dist/senses/surface-tool.js +109 -0
  611. package/dist/senses/teams-entry.js +68 -8
  612. package/dist/senses/teams.js +598 -233
  613. package/dist/senses/telegram-admission.js +718 -0
  614. package/dist/senses/telegram-approval-runtime.js +793 -0
  615. package/dist/senses/telegram-attachments.js +186 -0
  616. package/dist/senses/telegram-audit-ledger.js +220 -0
  617. package/dist/senses/telegram-authority-transport.js +231 -0
  618. package/dist/senses/telegram-client.js +1749 -0
  619. package/dist/senses/telegram-effect-adapter.js +900 -0
  620. package/dist/senses/telegram-entry.js +83 -0
  621. package/dist/senses/telegram-handoff.js +80 -0
  622. package/dist/senses/telegram.js +2405 -0
  623. package/dist/senses/trust-gate.js +104 -9
  624. package/dist/senses/voice/audio-playback.js +237 -0
  625. package/dist/senses/voice/audio-routing.js +119 -0
  626. package/dist/senses/voice/call-auth.js +250 -0
  627. package/dist/senses/voice/elevenlabs.js +202 -0
  628. package/dist/senses/voice/floor-control.js +431 -0
  629. package/dist/senses/voice/floor-controller.js +115 -0
  630. package/dist/senses/voice/golden-path.js +116 -0
  631. package/dist/senses/voice/index.js +29 -0
  632. package/dist/senses/voice/local-audio-control.js +344 -0
  633. package/dist/senses/voice/local-audio-devices.js +516 -0
  634. package/dist/senses/voice/local-audio-disclosure.js +174 -0
  635. package/dist/senses/voice/local-audio-identity.js +103 -0
  636. package/dist/senses/voice/local-audio-join.js +325 -0
  637. package/dist/senses/voice/local-audio-mute.js +199 -0
  638. package/dist/senses/voice/local-audio-notify.js +121 -0
  639. package/dist/senses/voice/local-audio-prompts.js +116 -0
  640. package/dist/senses/voice/local-audio-transport.js +427 -0
  641. package/dist/senses/voice/local-audio.js +281 -0
  642. package/dist/senses/voice/local-media-stream.js +145 -0
  643. package/dist/senses/voice/meeting.js +113 -0
  644. package/dist/senses/voice/outbound.js +190 -0
  645. package/dist/senses/voice/phone.js +33 -0
  646. package/dist/senses/voice/playback.js +139 -0
  647. package/dist/senses/voice/process-guards.js +51 -0
  648. package/dist/senses/voice/realtime-eval.js +496 -0
  649. package/dist/senses/voice/realtime-tool-schema.js +195 -0
  650. package/dist/senses/voice/realtime-trace.js +531 -0
  651. package/dist/senses/voice/transcript.js +70 -0
  652. package/dist/senses/voice/turn.js +191 -0
  653. package/dist/senses/voice/twilio-phone-runtime.js +836 -0
  654. package/dist/senses/voice/twilio-phone.js +5454 -0
  655. package/dist/senses/voice/types.js +2 -0
  656. package/dist/senses/voice/whisper.js +161 -0
  657. package/dist/senses/voice-entry.js +83 -0
  658. package/dist/senses/voice-realtime-eval-command.js +99 -0
  659. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  660. package/dist/senses/voice-twilio-entry.js +87 -0
  661. package/dist/trips/core.js +138 -0
  662. package/dist/trips/store.js +265 -0
  663. package/dist/util/frontmatter.js +69 -0
  664. package/npm-shrinkwrap.json +8100 -0
  665. package/package.json +74 -13
  666. package/skills/agent-commerce.md +113 -0
  667. package/skills/browser-navigation.md +117 -0
  668. package/skills/commerce-setup-guide.md +116 -0
  669. package/skills/commerce-setup.md +84 -0
  670. package/skills/configure-dev-tools.md +99 -0
  671. package/skills/travel-planning.md +138 -0
  672. package/dist/heart/daemon/auth-flow.js +0 -430
  673. package/dist/heart/daemon/ouro-path-installer.js +0 -260
  674. package/dist/heart/daemon/ouro-version-manager.js +0 -171
  675. package/dist/heart/daemon/update-hooks.js +0 -138
  676. package/dist/heart/obligations.js +0 -191
  677. package/dist/heart/safe-workspace.js +0 -362
  678. package/dist/heart/session-recall.js +0 -116
  679. package/dist/mind/friends/channel.js +0 -84
  680. package/dist/mind/friends/group-context.js +0 -144
  681. package/dist/mind/friends/resolver.js +0 -84
  682. package/dist/mind/friends/store-file.js +0 -190
  683. package/dist/mind/friends/store.js +0 -4
  684. package/dist/mind/friends/tokens.js +0 -26
  685. package/dist/mind/friends/trust-explanation.js +0 -74
  686. package/dist/mind/friends/types.js +0 -29
  687. package/dist/repertoire/tasks/board.js +0 -134
  688. package/dist/repertoire/tasks/index.js +0 -224
  689. package/dist/repertoire/tasks/lifecycle.js +0 -80
  690. package/dist/repertoire/tasks/middleware.js +0 -65
  691. package/dist/repertoire/tasks/parser.js +0 -173
  692. package/dist/repertoire/tasks/scanner.js +0 -132
  693. package/dist/repertoire/tasks/transitions.js +0 -144
  694. package/dist/senses/bluebubbles-entry.js +0 -13
  695. package/dist/senses/bluebubbles.js +0 -1181
  696. package/dist/senses/debug-activity.js +0 -154
  697. package/dist/senses/inner-dialog-worker.js +0 -90
  698. package/dist/senses/inner-dialog.js +0 -525
  699. package/subagents/README.md +0 -7
  700. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  701. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  702. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  703. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  704. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  705. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  706. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  707. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  708. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  709. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  710. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  711. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  712. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  713. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  714. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  715. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  716. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.restTool = exports.speakTool = exports.settleTool = exports.observeTool = exports.ponderTool = void 0;
4
+ exports.ponderTool = {
5
+ type: "function",
6
+ function: {
7
+ name: "ponder",
8
+ description: "create or revise a typed ponder packet so i don't lose the plot while i keep working. use this for harness friction, research, or reflection that should survive the current turn. if the user asked me to think privately and return later from an outward session, preserve literal return tokens and constraints in payload_json fields or success_criteria; the runtime records the latest user request as sourceRequest. then do not settle with the final private answer in the same outward turn; only acknowledge that the private pass is queued. in private runtime, ponder only preserves state; it does not create a new self-return obligation, so surface any existing held item instead of pondering a replacement. ponder does not end the turn by itself and may be followed by more tools before i settle or rest. Don't ponder trivial questions.",
9
+ parameters: {
10
+ type: "object",
11
+ properties: {
12
+ action: {
13
+ type: "string",
14
+ enum: ["create", "revise"],
15
+ description: "create a new packet or revise an existing drafting packet.",
16
+ },
17
+ kind: {
18
+ type: "string",
19
+ enum: ["harness_friction", "research", "reflection"],
20
+ description: "the packet kind. determines the SOP the private-runtime turn should follow.",
21
+ },
22
+ packet_id: {
23
+ type: "string",
24
+ description: "required for action=revise. the packet to revise in place.",
25
+ },
26
+ follows_packet_id: {
27
+ type: "string",
28
+ description: "optional follow-up linkage when a new packet grows out of an earlier one.",
29
+ },
30
+ objective: {
31
+ type: "string",
32
+ description: "the durable objective for this packet.",
33
+ },
34
+ summary: {
35
+ type: "string",
36
+ description: "brief factual summary of the work object or friction being preserved.",
37
+ },
38
+ success_criteria: {
39
+ type: "string",
40
+ description: "newline-delimited success criteria bullets.",
41
+ },
42
+ payload_json: {
43
+ type: "string",
44
+ description: "JSON object string with packet-specific structured details. include exact markers, return wording fragments, or constraints the private-runtime pass must preserve; sourceRequest is owned by the runtime from the latest user request. use {} only when there are no such details.",
45
+ },
46
+ thought: {
47
+ type: "string",
48
+ description: "deprecated compatibility field. legacy thought text is normalized into a reflection packet.",
49
+ },
50
+ say: {
51
+ type: "string",
52
+ description: "deprecated compatibility field. retained for migration only; it no longer controls deferral or silence.",
53
+ },
54
+ },
55
+ },
56
+ },
57
+ };
58
+ exports.observeTool = {
59
+ type: "function",
60
+ function: {
61
+ name: "observe",
62
+ description: "absorb what happened without responding — the moment doesn't call for words. must be the only tool call in the turn.",
63
+ parameters: {
64
+ type: "object",
65
+ properties: {
66
+ reason: { type: "string", description: "brief reason for staying silent (for logging)" },
67
+ },
68
+ },
69
+ },
70
+ };
71
+ exports.settleTool = {
72
+ type: "function",
73
+ function: {
74
+ name: "settle",
75
+ description: "deliver your response and end your turn — this hands control back to the user. only settle when your work is complete, you're genuinely blocked, the user asked a direct question that needs an answer now, or a required confirmation/stop/pause boundary is reached. process feedback during active work is loop input, not a settle reason. do not settle with status updates mid-task. if you're settling with 'I'll look into that,' you probably should be using a tool instead.",
76
+ parameters: {
77
+ type: "object",
78
+ properties: {
79
+ answer: { type: "string" },
80
+ intent: { type: "string", enum: ["complete", "blocked", "direct_reply"] },
81
+ },
82
+ required: ["answer"],
83
+ },
84
+ },
85
+ };
86
+ exports.speakTool = {
87
+ type: "function",
88
+ function: {
89
+ name: "speak",
90
+ description: "i speak to send words to my friend mid-turn without ending it. for progress, acknowledgment, or phase-boundary updates during heavy work. after speaking, continue with tools unless the next step needs a reply. i settle when my work is done or i need a reply.",
91
+ parameters: {
92
+ type: "object",
93
+ properties: {
94
+ message: { type: "string", description: "the words i'm sending to my friend right now" },
95
+ },
96
+ required: ["message"],
97
+ },
98
+ },
99
+ };
100
+ exports.restTool = {
101
+ type: "function",
102
+ function: {
103
+ name: "rest",
104
+ description: "end a private-runtime turn when private work is complete. rest remains the explicit terminal move for the private-runtime turn and must be the only tool call in the turn. on idle heartbeat turns, use status=HEARTBEAT_OK.",
105
+ parameters: {
106
+ type: "object",
107
+ properties: {
108
+ status: {
109
+ type: "string",
110
+ description: "optional rest status. use HEARTBEAT_OK when the heartbeat fires and there is nothing to do.",
111
+ },
112
+ note: {
113
+ type: "string",
114
+ description: "optional brief note about why i'm resting.",
115
+ },
116
+ },
117
+ },
118
+ },
119
+ };
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.friendLinkToolDefinition = void 0;
4
+ const identity_1 = require("../heart/identity");
5
+ const friend_link_codes_1 = require("../mind/friend-link-codes");
6
+ const runtime_1 = require("../nerves/runtime");
7
+ const LINKABLE_CHANNELS = ["teams", "bluebubbles", "telegram", "mail", "voice", "mcp", "cli"];
8
+ exports.friendLinkToolDefinition = {
9
+ tool: {
10
+ type: "function",
11
+ function: {
12
+ name: "friend_link_code",
13
+ description: "Issue a one-time code that links another account of the person you are talking to (for example their Teams account) to them. " +
14
+ "Give them the code; when they send exactly that code to you from the other account in a 1:1 chat, that account is treated as them. " +
15
+ "Only for family, only for themselves, and never in a group chat. The code expires in 10 minutes and works once.",
16
+ parameters: {
17
+ type: "object",
18
+ properties: {
19
+ channel: {
20
+ type: "string",
21
+ enum: [...LINKABLE_CHANNELS],
22
+ description: "The channel the other account will message from. Omit to accept any channel.",
23
+ },
24
+ },
25
+ },
26
+ },
27
+ },
28
+ handler: async (args, ctx) => {
29
+ (0, runtime_1.emitNervesEvent)({
30
+ component: "repertoire",
31
+ event: "repertoire.tool_friend_link_code",
32
+ message: "friend_link_code invoked",
33
+ meta: { channel: args.channel ?? "any" },
34
+ });
35
+ const context = ctx?.context;
36
+ if (!context?.friend)
37
+ return "no friend context: I can only issue a link code to the person I'm talking to.";
38
+ const friend = context.friend;
39
+ if (friend.trustLevel !== "family")
40
+ return "link codes are only for family.";
41
+ if (context.isGroupChat)
42
+ return "link codes can't be issued in a group chat. Ask me in a 1:1 chat.";
43
+ const channel = args.channel;
44
+ if (channel && !LINKABLE_CHANNELS.includes(channel))
45
+ return `unknown channel '${channel}'. Use one of: ${LINKABLE_CHANNELS.join(", ")}.`;
46
+ const issued = (0, friend_link_codes_1.issueLinkCode)({
47
+ agentRoot: ctx?.agentRoot ?? (0, identity_1.getAgentRoot)(),
48
+ friend,
49
+ ...(channel ? { channel: channel } : {}),
50
+ issuedBy: `tool:${context.channel.channel}`,
51
+ });
52
+ const where = issued.channel ? `from their ${issued.channel} account` : "from the account they want to link";
53
+ return `link code for ${friend.name}: ${issued.code}\nTell them to send exactly this code to me ${where}, in a 1:1 chat, before ${issued.expiresAt}. It works once.`;
54
+ },
55
+ summaryKeys: ["channel"],
56
+ riskProfile: { mutates: "durable_state_write", risk: "high", reason: "issues a code that links a new account to a family friend" },
57
+ };
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.githubToolDefinitions = void 0;
4
- exports.summarizeGithubArgs = summarizeGithubArgs;
5
4
  const github_client_1 = require("./github-client");
6
5
  const runtime_1 = require("../nerves/runtime");
7
6
  exports.githubToolDefinitions = [
@@ -32,7 +31,7 @@ exports.githubToolDefinitions = [
32
31
  if (!ctx?.githubToken) {
33
32
  return "AUTH_REQUIRED:github -- I need access to GitHub. Please sign in when prompted.";
34
33
  }
35
- const owner = "ouroborosbot";
34
+ const owner = "ourostack";
36
35
  const repo = "ouroboros";
37
36
  const payload = { title: args.title };
38
37
  if (args.body)
@@ -43,11 +42,7 @@ exports.githubToolDefinitions = [
43
42
  return (0, github_client_1.githubRequest)(ctx.githubToken, "POST", `/repos/${owner}/${repo}/issues`, JSON.stringify(payload));
44
43
  },
45
44
  integration: "github",
46
- confirmationRequired: true,
45
+ summaryKeys: ["title"],
46
+ riskProfile: { mutates: "external_side_effect", risk: "high", reason: "files a GitHub issue" },
47
47
  },
48
48
  ];
49
- function summarizeGithubArgs(name, args) {
50
- if (name === "file_ouroboros_bug")
51
- return args.title || "";
52
- return undefined;
53
- }
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.habitToolDefinitions = void 0;
4
+ const friends_1 = require("@ouro.bot/friends");
5
+ const runtime_1 = require("../nerves/runtime");
6
+ const habit_cancel_1 = require("../heart/habits/habit-cancel");
7
+ const semantic_receipts_1 = require("../senses/bluebubbles/semantic-receipts");
8
+ const CAPTURE_LOCATOR_PATTERN = /^capture:([a-f0-9]{64})$/;
9
+ const ACTOR_AUTHORITY_ERROR = "habit_cancel requires trusted current-ingress actor authority";
10
+ async function requireTrustedCurrentIngressActor(agentRoot, captureKeyHash, context) {
11
+ const capture = (0, semantic_receipts_1.readBlueBubblesSemanticCaptureAtRoot)(agentRoot, captureKeyHash);
12
+ const actor = capture?.event.actor;
13
+ if (!actor || !context?.friendStore)
14
+ throw new Error(ACTOR_AUTHORITY_ERROR);
15
+ try {
16
+ const friend = await context.friendStore.findByExternalId(actor.provider, actor.externalId);
17
+ if (!friends_1.TRUSTED_LEVELS.has(friend?.trustLevel ?? "stranger")) {
18
+ throw new Error(ACTOR_AUTHORITY_ERROR);
19
+ }
20
+ }
21
+ catch {
22
+ throw new Error(ACTOR_AUTHORITY_ERROR);
23
+ }
24
+ }
25
+ exports.habitToolDefinitions = [
26
+ {
27
+ tool: {
28
+ type: "function",
29
+ function: {
30
+ name: "habit_cancel",
31
+ description: "Cancel a named habit from the immutable evidence capture that triggered the current turn.",
32
+ parameters: {
33
+ type: "object",
34
+ properties: {
35
+ habit: {
36
+ type: "string",
37
+ description: "Exact habit identifier to cancel.",
38
+ },
39
+ evidence: {
40
+ type: "string",
41
+ description: "Current ingress evidence locator in capture:<sha256> form.",
42
+ },
43
+ },
44
+ required: ["habit", "evidence"],
45
+ additionalProperties: false,
46
+ },
47
+ },
48
+ },
49
+ riskProfile: {
50
+ mutates: "durable_state_write",
51
+ risk: "high",
52
+ reason: "Permanently transitions a durable habit definition to cancelled.",
53
+ },
54
+ terminalProjection: {
55
+ mode: "verbatim",
56
+ requiresSoleCall: true,
57
+ clearBufferedText: true,
58
+ },
59
+ summaryKeys: ["habit", "evidence"],
60
+ handler: async (args, context) => {
61
+ (0, runtime_1.emitNervesEvent)({
62
+ component: "tools",
63
+ event: "tools.habit_cancel_invoked",
64
+ message: "habit cancellation tool invoked",
65
+ meta: { habit: typeof args.habit === "string" ? args.habit : null },
66
+ });
67
+ const keys = Object.keys(args);
68
+ const unexpected = keys.find((key) => key !== "habit" && key !== "evidence");
69
+ if (unexpected)
70
+ throw new Error(`unexpected habit_cancel argument: ${unexpected}`);
71
+ if (keys.length !== 2 || typeof args.habit !== "string" || args.habit.trim().length === 0) {
72
+ throw new Error("habit_cancel requires exactly habit and evidence");
73
+ }
74
+ const match = CAPTURE_LOCATOR_PATTERN.exec(args.evidence);
75
+ if (!match)
76
+ throw new Error("habit_cancel evidence must use capture:<sha256>");
77
+ const currentIngressEvidence = context?.currentIngressEvidence;
78
+ if (!currentIngressEvidence
79
+ || Object.keys(currentIngressEvidence).length !== 3
80
+ || Object.keys(currentIngressEvidence).some((key) => (key !== "schemaVersion" && key !== "provider" && key !== "captureKeyHash"))
81
+ || currentIngressEvidence.schemaVersion !== 1
82
+ || currentIngressEvidence.provider !== "bluebubbles"
83
+ || !/^[a-f0-9]{64}$/.test(currentIngressEvidence.captureKeyHash))
84
+ throw new Error("habit_cancel requires authoritative current ingress evidence");
85
+ if (currentIngressEvidence.captureKeyHash !== match[1]) {
86
+ throw new Error("habit_cancel evidence mismatch with current ingress evidence");
87
+ }
88
+ if (!context?.agentRoot)
89
+ throw new Error("habit_cancel requires an agent root");
90
+ await requireTrustedCurrentIngressActor(context.agentRoot, currentIngressEvidence.captureKeyHash, context);
91
+ const receipt = await (0, habit_cancel_1.cancelHabit)({
92
+ agentRoot: context.agentRoot,
93
+ habitId: args.habit,
94
+ evidenceLocator: args.evidence,
95
+ authority: {
96
+ kind: "current_ingress",
97
+ currentIngressEvidence,
98
+ },
99
+ });
100
+ return receipt.acknowledgement;
101
+ },
102
+ },
103
+ ];
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.houseCareToolDefinitions = exports.houseDigestToolDefinition = exports.houseSweepToolDefinition = exports.DIGEST_MAX_LINES = exports.LEAD_IN_MAX_CHARS = void 0;
4
+ exports.setHouseCareToolDeps = setHouseCareToolDeps;
5
+ exports.digestLines = digestLines;
6
+ const node_crypto_1 = require("node:crypto");
7
+ const replay_harness_1 = require("../a2a/replay-harness");
8
+ const a2a_await_delivery_1 = require("../heart/awaiting/a2a-await-delivery");
9
+ const runtime_1 = require("../nerves/runtime");
10
+ const house_sweep_1 = require("./house-sweep");
11
+ const tools_base_1 = require("./tools-base");
12
+ /**
13
+ * The Butler's two house-care tools. `house_sweep` is one read-only call that gathers everything the daily sweep
14
+ * covers. `house_digest_send` is the only way the sweep reaches the owner: it refuses an empty digest, sends one short
15
+ * owner notice through the existing owner-notice path (the replay sink when a replay window is open for the asker),
16
+ * and only then records the findings as told, so the same finding is not repeated unless it changed.
17
+ */
18
+ exports.LEAD_IN_MAX_CHARS = 140;
19
+ const DAY_MS = 86_400_000;
20
+ const HOUSE_CARE_AWAIT = "house-care-sweep";
21
+ const PEER_NAME_MAX = 40;
22
+ /** Addresses a lead-in must not carry: a bare domain (word.tld), an @mention, mailto:, or any bidi, zero-width or invisible character. */
23
+ const LEAD_IN_FORBIDDEN = /\b[a-z0-9-]+\.[a-z]{2,}\b|@\w|mailto:|[\u200b-\u200f\u202a-\u202e\u2060-\u206f\ufeff]/iu;
24
+ let injected = {};
25
+ function setHouseCareToolDeps(deps) { injected = deps; }
26
+ /** The friend whose request this turn serves; absent on the Butler's own scheduled turns. */
27
+ function askerFriendId(ctx) {
28
+ return ctx?.context?.friend?.id ?? ctx?.relationshipAuthorization?.actor?.friendId;
29
+ }
30
+ /** The package-managed daily await's own tick: not a peer's or friend's request, and not the owner asking. */
31
+ function isManagedSweepTick(ctx) {
32
+ return ctx?.autonomousTurnKind === "await" && ctx.autonomousAwaitName === HOUSE_CARE_AWAIT;
33
+ }
34
+ /** The replay gate is running: the managed tick must stay out of its way (it shares the await runner and the owner-notice path). */
35
+ function sweepYieldsToReplay(ctx, now) {
36
+ return isManagedSweepTick(ctx) && Boolean(ctx?.agentRoot) && (0, replay_harness_1.isAnyReplayWindowOpen)(ctx.agentRoot, now);
37
+ }
38
+ const REPLAY_YIELD = JSON.stringify({ skipped: true, reason: "a replay-gate window is open, so the daily house-care sweep does nothing now. Finish with resolve_await verdict 'no' and the word quiet; do not send anything to the owner." });
39
+ /** Digest lines: identical summaries collapse into one line with a count, at most DIGEST_MAX_LINES lines, then one pointer to the rest. `shownSummaries` are the summaries whose lines are in the digest. */
40
+ exports.DIGEST_MAX_LINES = 8;
41
+ function digestLines(summaries) {
42
+ const counts = new Map();
43
+ for (const summary of summaries)
44
+ counts.set(summary, (counts.get(summary) ?? 0) + 1);
45
+ const groups = [...counts].slice(0, exports.DIGEST_MAX_LINES);
46
+ const lines = groups.map(([summary, count]) => `- ${summary}${count > 1 ? ` (x${count})` : ""}`);
47
+ const hidden = summaries.length - groups.reduce((sum, [, count]) => sum + count, 0);
48
+ if (hidden > 0)
49
+ lines.push(`and ${hidden} more (ask me for the full list)`);
50
+ return { lines, shownSummaries: new Set(groups.map(([summary]) => summary)) };
51
+ }
52
+ function replayAsker(ctx) {
53
+ const friendId = askerFriendId(ctx);
54
+ return Boolean(friendId && ctx?.agentRoot && (0, replay_harness_1.isReplayIdentity)(ctx.agentRoot, friendId));
55
+ }
56
+ exports.houseSweepToolDefinition = {
57
+ tool: {
58
+ type: "function",
59
+ function: {
60
+ name: "house_sweep",
61
+ description: "The daily house-care sweep in one read-only call. It checks stalled or failed downloads, monitored-but-missing episodes and movies, and failed imports in Sonarr and Radarr; disk, array capacity and parity; container state against the steward policy; and delegation, escalation and standing-permission grants that expire or no longer work. It returns a compact report: the queue state, the findings (each says whether a tool may fix it and which), the ids that are new since the owner was last told (fresh), and whether a digest is due. It changes nothing in the house. Run it when the owner asks about the house or for a sweep, and on the daily house-care await.",
62
+ parameters: { type: "object", properties: {}, additionalProperties: false },
63
+ },
64
+ },
65
+ handler: async (_args, ctx) => {
66
+ if (!ctx?.agentRoot)
67
+ return JSON.stringify({ error: "house sweep runtime is unavailable" });
68
+ if (sweepYieldsToReplay(ctx, (injected.now ?? Date.now)()))
69
+ return REPLAY_YIELD;
70
+ const report = await (0, house_sweep_1.runHouseSweep)({ agentRoot: ctx.agentRoot, sanctuary: ctx.sanctuary, replay: replayAsker(ctx), now: injected.now, ...injected.sweepDeps });
71
+ return JSON.stringify(report);
72
+ },
73
+ summaryKeys: [],
74
+ riskProfile: { mutates: "none", risk: "low" },
75
+ };
76
+ exports.houseDigestToolDefinition = {
77
+ tool: {
78
+ type: "function",
79
+ function: {
80
+ name: "house_digest_send",
81
+ description: "Send the owner ONE short house-care digest, only when the latest house_sweep left findings that need their choice. Give finding_ids from that sweep (never a finding the owner was already told about unchanged). The digest body is always the findings' own summaries; you cannot change them. lead_in is an optional single line of at most 140 characters placed above them. It is refused when no valid finding id is given, when a finding was already told unchanged within 7 days, and when a digest already went out today. Delivery goes through the owner-notice path; for a replay request it goes to the replay sink, never to the owner.",
82
+ parameters: {
83
+ type: "object",
84
+ properties: {
85
+ finding_ids: { type: "array", items: { type: "string" }, description: "Ids from the latest house_sweep." },
86
+ lead_in: { type: "string", description: `Optional one-line lead-in, at most ${exports.LEAD_IN_MAX_CHARS} characters.` },
87
+ },
88
+ required: ["finding_ids"],
89
+ additionalProperties: false,
90
+ },
91
+ },
92
+ },
93
+ handler: async (args, ctx) => {
94
+ const agentRoot = ctx?.agentRoot;
95
+ if (!agentRoot)
96
+ return JSON.stringify({ error: "house sweep runtime is unavailable" });
97
+ const rawIds = args.finding_ids;
98
+ const ids = Array.isArray(rawIds) ? [...new Set(rawIds.filter((id) => typeof id === "string" && id.length > 0))] : [];
99
+ if (ids.length === 0)
100
+ return JSON.stringify({ sent: false, error: "no digest: name at least one finding id from the latest house_sweep. When nothing needs the owner, say nothing." });
101
+ const replay = replayAsker(ctx);
102
+ const scope = replay ? "replay" : "live";
103
+ // The digest comes only from the sweep THIS process ran. Files under state/house-sweep/ are writable by the resident's uid: untrusted bookkeeping, never a source of owner-facing text.
104
+ const last = (0, house_sweep_1.recallSweep)(agentRoot, scope);
105
+ if (!last)
106
+ return JSON.stringify({ sent: false, error: "no sweep has run in this session: run house_sweep first and use its finding ids." });
107
+ const known = new Map(last.map((finding) => [finding.id, finding]));
108
+ const unknown = ids.filter((id) => !known.has(id));
109
+ if (unknown.length > 0)
110
+ return JSON.stringify({ sent: false, error: `unknown finding ids: ${unknown.join(", ")}. Run house_sweep first and use its ids.` });
111
+ const chosen = ids.map((id) => known.get(id));
112
+ const rawLead = args.lead_in;
113
+ const leadIn = typeof rawLead === "string" ? rawLead.trim() : "";
114
+ if (leadIn.length > exports.LEAD_IN_MAX_CHARS || (0, house_sweep_1.safe)(leadIn) !== leadIn || LEAD_IN_FORBIDDEN.test(leadIn))
115
+ return JSON.stringify({ sent: false, error: `lead_in must be one plain line of at most ${exports.LEAD_IN_MAX_CHARS} characters, with no links, addresses, mentions or hidden characters` });
116
+ const now = (injected.now ?? Date.now)();
117
+ if (sweepYieldsToReplay(ctx, now))
118
+ return REPLAY_YIELD;
119
+ const digest = (0, node_crypto_1.createHash)("sha256").update(chosen.map((finding) => finding.fingerprint).sort().join(",")).digest("hex").slice(0, 12);
120
+ const friendId = askerFriendId(ctx);
121
+ const agentName = ctx.agentName ?? "sanctuary";
122
+ // A peer's digest says whose it is; the body is only ever the stored finding summaries.
123
+ const peer = ctx.relationshipAuthorization?.profileId === "sanctuary-agent-peer" ? `From ${(0, house_sweep_1.clip)((0, house_sweep_1.safe)(ctx.context?.friend?.name ?? friendId ?? "a peer"), PEER_NAME_MAX) || "a peer"}:\n` : "";
124
+ const clipped = chosen.map((finding) => (0, house_sweep_1.clip)((0, house_sweep_1.safe)(finding.summary), 220));
125
+ const rendered = digestLines(clipped);
126
+ // Only the findings whose lines are in the digest count as told; the ones behind "and N more" stay fresh for the next digest.
127
+ const shown = chosen.filter((_, i) => rendered.shownSummaries.has(clipped[i]));
128
+ const body = `${peer}${leadIn ? `${leadIn}\n` : ""}${rendered.lines.join("\n")}`;
129
+ if (replay) {
130
+ // A replay identity's digest never reaches the owner: it goes to the sink while the window is open, and is refused when it is not.
131
+ if (!friendId || !(0, replay_harness_1.isReplayWindowOpen)(agentRoot, friendId, now))
132
+ return JSON.stringify({ sent: false, error: "this is a replay request and no replay window is open for it, so nothing was sent to the owner" });
133
+ (0, replay_harness_1.appendReplayNotice)(agentRoot, { noticeId: `house-sweep:replay:${now}:${digest}`, text: body, friendId }, now);
134
+ (0, runtime_1.emitNervesEvent)({ component: "repertoire", event: "repertoire.house_digest_sent", message: "house digest written to the replay sink", meta: { findings: ids.length, destination: "replay-sink" } });
135
+ return JSON.stringify({ sent: true, destination: "replay sink", findings: ids.length });
136
+ }
137
+ // Enforced here, not only in the sweep: the ledger is reloaded at send time.
138
+ const ledger = (0, house_sweep_1.readLedger)(agentRoot);
139
+ const priorStamp = (0, house_sweep_1.readLastDigestAt)(agentRoot);
140
+ const stamp = new Date(now).toISOString();
141
+ const told = chosen.filter((finding) => {
142
+ const entry = ledger[finding.id];
143
+ return entry !== undefined && entry.fingerprint === finding.fingerprint && now - Date.parse(entry.reportedAt) < house_sweep_1.REMIND_DAYS * DAY_MS;
144
+ });
145
+ if (told.length > 0)
146
+ return JSON.stringify({ sent: false, error: `the owner was already told about ${told.map((finding) => finding.id).join(", ")} unchanged in the last ${house_sweep_1.REMIND_DAYS} days; leave ${told.length === 1 ? "it" : "them"} out` });
147
+ // Only the daily house-care await's own tick is "scheduled" and takes the one-per-day slot; on-demand digests are limited by the per-finding dedupe above.
148
+ // The package-managed await may run under the owner's own relationship authorization (the live runtime binds it that way), which does not downgrade it;
149
+ // The system await has no relationship coordinates, so the pipeline binds the self friend: no authorization with no friend or the self friend is the managed tick itself.
150
+ // Any other relationship (a peer, a friend) or a real friend with no authorization behind the tick downgrades.
151
+ const ownerBound = ctx.relationshipAuthorization?.profileId === "sanctuary-owner";
152
+ const kind = isManagedSweepTick(ctx) && (ownerBound || (!ctx.relationshipAuthorization && (!friendId || friendId === tools_base_1.SELF_FRIEND_ID))) ? "scheduled" : "ondemand";
153
+ if (kind === "scheduled" && (0, house_sweep_1.sameUtcDay)(priorStamp, stamp))
154
+ return JSON.stringify({ sent: false, error: "the daily house digest already went out today; at most one scheduled digest is sent per day" });
155
+ const day = stamp.slice(0, 10);
156
+ // Reserve before sending so a crash or a concurrent turn cannot send twice; a failed send rolls the reservation back.
157
+ const reserved = { ...ledger };
158
+ for (const finding of shown)
159
+ reserved[finding.id] = { fingerprint: finding.fingerprint, reportedAt: stamp };
160
+ (0, house_sweep_1.writeLedger)(agentRoot, reserved, kind === "scheduled" ? stamp : priorStamp);
161
+ try {
162
+ await (injected.notifyOwner ? injected.notifyOwner(agentName) : (0, a2a_await_delivery_1.defaultNotifyOwner)(agentName))({ noticeId: `house-sweep:${kind}:${day}:${digest}`, text: body });
163
+ }
164
+ catch (error) {
165
+ (0, house_sweep_1.writeLedger)(agentRoot, ledger, priorStamp);
166
+ return JSON.stringify({ sent: false, error: `the owner notice could not be sent: ${error instanceof Error ? error.message : String(error)}. Nothing was recorded as told, so the next sweep will try again.` });
167
+ }
168
+ (0, runtime_1.emitNervesEvent)({ component: "repertoire", event: "repertoire.house_digest_sent", message: "house digest sent to the owner", meta: { findings: ids.length, destination: "owner", kind } });
169
+ return JSON.stringify({ sent: true, destination: "owner", findings: ids.length });
170
+ },
171
+ summaryKeys: ["finding_ids"],
172
+ riskProfile: { mutates: "external_side_effect", risk: "high", reason: "sends the owner a Telegram notice" },
173
+ };
174
+ exports.houseCareToolDefinitions = [exports.houseSweepToolDefinition, exports.houseDigestToolDefinition];