@ouro.bot/cli 0.1.0-alpha.90 → 0.1.0-alpha.901

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 (702) 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 +5717 -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 +1614 -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 +27 -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/bridges/manager.js +137 -17
  122. package/dist/heart/bridges/store.js +14 -2
  123. package/dist/heart/bundle-state.js +168 -0
  124. package/dist/heart/commitments.js +44 -18
  125. package/dist/heart/config-registry.js +331 -0
  126. package/dist/heart/config.js +174 -131
  127. package/dist/heart/context-loss-gauntlet.js +387 -0
  128. package/dist/heart/context-loss-sentinel.js +1159 -0
  129. package/dist/heart/core.js +2319 -579
  130. package/dist/heart/cross-chat-delivery.js +9 -22
  131. package/dist/heart/daemon/agent-config-check.js +451 -0
  132. package/dist/heart/daemon/agent-discovery.js +283 -3
  133. package/dist/heart/daemon/agent-home.js +319 -0
  134. package/dist/heart/daemon/agent-service.js +542 -0
  135. package/dist/heart/daemon/agentic-repair.js +547 -0
  136. package/dist/heart/daemon/await-private-wake.js +59 -0
  137. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  138. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  139. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  140. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  141. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  142. package/dist/heart/daemon/cadence.js +180 -0
  143. package/dist/heart/daemon/cli-defaults.js +859 -0
  144. package/dist/heart/daemon/cli-desk.js +322 -0
  145. package/dist/heart/daemon/cli-exec.js +9003 -0
  146. package/dist/heart/daemon/cli-help.js +729 -0
  147. package/dist/heart/daemon/cli-parse.js +3140 -0
  148. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  149. package/dist/heart/daemon/cli-render.js +819 -0
  150. package/dist/heart/daemon/cli-types.js +8 -0
  151. package/dist/heart/daemon/connect-bay.js +323 -0
  152. package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
  153. package/dist/heart/daemon/container-healthcheck.js +112 -0
  154. package/dist/heart/daemon/container-runtime.js +97 -0
  155. package/dist/heart/daemon/container-spec-auditor-main.js +171 -0
  156. package/dist/heart/daemon/container-spec-auditor.js +235 -0
  157. package/dist/heart/daemon/daemon-bootstrap-startup.js +115 -0
  158. package/dist/heart/daemon/daemon-cli.js +29 -2349
  159. package/dist/heart/daemon/daemon-entry.js +953 -11
  160. package/dist/heart/daemon/daemon-health.js +186 -0
  161. package/dist/heart/daemon/daemon-rollup.js +57 -0
  162. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  163. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  164. package/dist/heart/daemon/daemon.js +2084 -105
  165. package/dist/heart/daemon/dns-workflow.js +394 -0
  166. package/dist/heart/daemon/doctor-types.js +8 -0
  167. package/dist/heart/daemon/doctor.js +1755 -0
  168. package/dist/heart/daemon/freshness.js +345 -0
  169. package/dist/heart/daemon/habit-private-wake.js +61 -0
  170. package/dist/heart/daemon/health-monitor.js +154 -11
  171. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  172. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  173. package/dist/heart/daemon/http-health-probe.js +80 -0
  174. package/dist/heart/daemon/human-command-screens.js +234 -0
  175. package/dist/heart/daemon/human-readiness.js +114 -0
  176. package/dist/heart/daemon/inner-status.js +78 -0
  177. package/dist/heart/daemon/interactive-repair.js +394 -0
  178. package/dist/heart/daemon/launchd.js +37 -8
  179. package/dist/heart/daemon/log-tailer.js +79 -10
  180. package/dist/heart/daemon/logs-prune.js +132 -0
  181. package/dist/heart/daemon/mcp-canary.js +524 -0
  182. package/dist/heart/daemon/message-router.js +65 -5
  183. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  184. package/dist/heart/daemon/os-cron-deps.js +135 -0
  185. package/dist/heart/daemon/os-cron.js +22 -14
  186. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  187. package/dist/heart/daemon/ouro-entry.js +3 -1
  188. package/dist/heart/daemon/plugin-cli.js +432 -0
  189. package/dist/heart/daemon/process-manager.js +760 -61
  190. package/dist/heart/daemon/provider-discovery.js +137 -0
  191. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  192. package/dist/heart/daemon/prunable-bundle.js +144 -0
  193. package/dist/heart/daemon/pulse.js +511 -0
  194. package/dist/heart/daemon/readiness-repair.js +365 -0
  195. package/dist/heart/daemon/run-hooks.js +2 -0
  196. package/dist/heart/daemon/runtime-logging.js +47 -14
  197. package/dist/heart/daemon/runtime-metadata.js +2 -30
  198. package/dist/heart/daemon/runtime-mode.js +13 -2
  199. package/dist/heart/daemon/safe-mode.js +161 -0
  200. package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2654 -0
  201. package/dist/heart/daemon/sanctuary-acceptance-harness.js +1830 -0
  202. package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
  203. package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +955 -0
  204. package/dist/heart/daemon/sanctuary-authority-codec.js +86 -0
  205. package/dist/heart/daemon/sanctuary-authority-epoch.js +281 -0
  206. package/dist/heart/daemon/sanctuary-authority-installation.js +161 -0
  207. package/dist/heart/daemon/sanctuary-authority-ledger.js +241 -0
  208. package/dist/heart/daemon/sanctuary-authority-root-lifecycle.js +1267 -0
  209. package/dist/heart/daemon/sanctuary-authority-vault-migration.js +79 -0
  210. package/dist/heart/daemon/sanctuary-bundle-migration.js +730 -0
  211. package/dist/heart/daemon/sanctuary-host-authority.js +1008 -0
  212. package/dist/heart/daemon/sanctuary-host-detached-supervisor.js +493 -0
  213. package/dist/heart/daemon/sanctuary-host-executor.js +670 -0
  214. package/dist/heart/daemon/sanctuary-host-linux-kernel.js +334 -0
  215. package/dist/heart/daemon/sanctuary-host-supervisor-entry.js +207 -0
  216. package/dist/heart/daemon/sanctuary-host-supervisor.js +95 -0
  217. package/dist/heart/daemon/sanctuary-package-management.js +103 -0
  218. package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
  219. package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
  220. package/dist/heart/daemon/sanctuary-telegram-authority-entry.js +475 -0
  221. package/dist/heart/daemon/sanctuary-telegram-authority-gateway.js +585 -0
  222. package/dist/heart/daemon/sanctuary-telegram-authority-service.js +676 -0
  223. package/dist/heart/daemon/sense-manager.js +716 -48
  224. package/dist/heart/daemon/session-id-resolver.js +131 -0
  225. package/dist/heart/daemon/skill-management-installer.js +1 -1
  226. package/dist/heart/daemon/socket-client.js +180 -12
  227. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  228. package/dist/heart/daemon/startup-tui.js +339 -0
  229. package/dist/heart/daemon/supercronic-supervisor.js +282 -0
  230. package/dist/heart/daemon/task-scheduler.js +117 -39
  231. package/dist/heart/daemon/terminal-ui.js +499 -0
  232. package/dist/heart/daemon/thoughts.js +138 -54
  233. package/dist/heart/daemon/up-progress.js +366 -0
  234. package/dist/heart/daemon/vault-items.js +56 -0
  235. package/dist/heart/delegation.js +1 -4
  236. package/dist/heart/external-events/router.js +1516 -0
  237. package/dist/heart/failure-reports.js +335 -0
  238. package/dist/heart/file-lock.js +109 -0
  239. package/dist/heart/frontend-approval-runtime.js +506 -0
  240. package/dist/heart/frontend-journal.js +215 -0
  241. package/dist/heart/frontend-session-service.js +237 -0
  242. package/dist/heart/frontend-socket-client.js +164 -0
  243. package/dist/heart/frontend-socket.js +400 -0
  244. package/dist/heart/habits/habit-cancel.js +810 -0
  245. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  246. package/dist/heart/habits/habit-migration.js +194 -0
  247. package/dist/heart/habits/habit-parser.js +278 -0
  248. package/dist/heart/habits/habit-runtime-state.js +93 -0
  249. package/dist/heart/habits/habit-scheduler.js +653 -0
  250. package/dist/heart/habits/habit-session-summary.js +318 -0
  251. package/dist/heart/habits/habit-session.js +636 -0
  252. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
  253. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  254. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  255. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  256. package/dist/heart/identity.js +199 -59
  257. package/dist/heart/kept-notes.js +289 -0
  258. package/dist/heart/kicks.js +1 -1
  259. package/dist/heart/machine-identity.js +175 -0
  260. package/dist/heart/mail-import-discovery.js +356 -0
  261. package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
  262. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  263. package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
  264. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  265. package/dist/heart/mailbox/mailbox-http-transport.js +272 -0
  266. package/dist/heart/mailbox/mailbox-http.js +99 -0
  267. package/dist/heart/mailbox/mailbox-read.js +39 -0
  268. package/dist/heart/mailbox/mailbox-types.js +27 -0
  269. package/dist/heart/mailbox/mailbox-view.js +197 -0
  270. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  271. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  272. package/dist/heart/mailbox/readers/mail.js +375 -0
  273. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  274. package/dist/heart/mailbox/readers/sessions.js +231 -0
  275. package/dist/heart/mailbox/readers/shared.js +111 -0
  276. package/dist/heart/mcp/mcp-server.js +696 -0
  277. package/dist/heart/migrate-config.js +100 -0
  278. package/dist/heart/model-capabilities.js +11 -0
  279. package/dist/heart/orientation-frame.js +345 -0
  280. package/dist/heart/platform.js +81 -0
  281. package/dist/heart/primitives.js +1 -1
  282. package/dist/heart/private-runtime/decision-renderer.js +158 -0
  283. package/dist/heart/private-runtime/index.js +18 -0
  284. package/dist/heart/private-runtime/ledger.js +221 -0
  285. package/dist/heart/private-runtime/policy.js +260 -0
  286. package/dist/heart/private-runtime/types.js +2 -0
  287. package/dist/heart/progress-story.js +1 -1
  288. package/dist/heart/provider-attempt.js +137 -0
  289. package/dist/heart/provider-binding-resolver.js +273 -0
  290. package/dist/heart/provider-credentials.js +449 -0
  291. package/dist/heart/provider-failover.js +311 -0
  292. package/dist/heart/provider-models.js +96 -0
  293. package/dist/heart/provider-ping.js +265 -0
  294. package/dist/heart/provider-readiness-cache.js +119 -0
  295. package/dist/heart/provider-visibility.js +188 -0
  296. package/dist/heart/providers/anthropic-token.js +131 -0
  297. package/dist/heart/providers/anthropic.js +173 -60
  298. package/dist/heart/providers/azure.js +23 -11
  299. package/dist/heart/providers/error-classification.js +127 -0
  300. package/dist/heart/providers/github-copilot.js +34 -38
  301. package/dist/heart/providers/minimax-vlm.js +189 -0
  302. package/dist/heart/providers/minimax.js +26 -8
  303. package/dist/heart/providers/openai-codex-token.js +349 -0
  304. package/dist/heart/providers/openai-codex.js +55 -40
  305. package/dist/heart/providers/openai-compatible.js +177 -0
  306. package/dist/heart/reply-style.js +56 -0
  307. package/dist/heart/run-ledger.js +247 -0
  308. package/dist/heart/runtime-capability-check.js +170 -0
  309. package/dist/heart/runtime-credentials.js +607 -0
  310. package/dist/heart/runtime-cwd.js +87 -0
  311. package/dist/heart/sense-truth.js +24 -4
  312. package/dist/heart/session-activity.js +92 -24
  313. package/dist/heart/session-events.js +1504 -0
  314. package/dist/heart/session-playback-cli-main.js +5 -0
  315. package/dist/heart/session-playback-cli.js +36 -0
  316. package/dist/heart/session-playback.js +231 -0
  317. package/dist/heart/session-redaction-repair-cli-main.js +31 -0
  318. package/dist/heart/session-redaction-repair.js +552 -0
  319. package/dist/heart/session-stats-cli-main.js +5 -0
  320. package/dist/heart/session-stats.js +183 -0
  321. package/dist/heart/session-transcript.js +133 -0
  322. package/dist/heart/shepherd-config.js +113 -0
  323. package/dist/heart/source-grounding.js +283 -0
  324. package/dist/heart/start-of-turn-packet.js +372 -0
  325. package/dist/heart/steward-policy.js +656 -0
  326. package/dist/heart/streaming.js +604 -207
  327. package/dist/heart/structured-output.js +196 -0
  328. package/dist/heart/sync-classification.js +176 -0
  329. package/dist/heart/sync-health.js +152 -0
  330. package/dist/heart/sync.js +726 -0
  331. package/dist/heart/target-resolution.js +11 -7
  332. package/dist/heart/tempo.js +93 -0
  333. package/dist/heart/temporal-view.js +41 -0
  334. package/dist/heart/timeouts.js +101 -0
  335. package/dist/heart/tool-activity-callbacks.js +59 -0
  336. package/dist/heart/tool-approval.js +382 -0
  337. package/dist/heart/tool-description.js +155 -0
  338. package/dist/heart/tool-friction.js +55 -0
  339. package/dist/heart/tool-loop.js +206 -0
  340. package/dist/heart/turn-context.js +494 -0
  341. package/dist/heart/turn-execution-lease.js +30 -0
  342. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  343. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  344. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  345. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  346. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  347. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  348. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  349. package/dist/heart/versioning/update-hooks.js +154 -0
  350. package/dist/heart/versioning/version-intent.js +114 -0
  351. package/dist/heart/work-card.js +380 -0
  352. package/dist/mailbox-ui/assets/index-Cyv4mw3Y.js +1 -0
  353. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  354. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  355. package/dist/mailbox-ui/index.html +16 -0
  356. package/dist/mailroom/attention.js +167 -0
  357. package/dist/mailroom/autonomy.js +209 -0
  358. package/dist/mailroom/blob-store.js +889 -0
  359. package/dist/mailroom/body-cache.js +61 -0
  360. package/dist/mailroom/cache-sync-cli.js +58 -0
  361. package/dist/mailroom/core.js +803 -0
  362. package/dist/mailroom/entry.js +160 -0
  363. package/dist/mailroom/file-store.js +568 -0
  364. package/dist/mailroom/hosted-cache-sync.js +384 -0
  365. package/dist/mailroom/mbox-import.js +393 -0
  366. package/dist/mailroom/migration.js +164 -0
  367. package/dist/mailroom/outbound.js +380 -0
  368. package/dist/mailroom/policy.js +263 -0
  369. package/dist/mailroom/reader.js +292 -0
  370. package/dist/mailroom/search-cache.js +513 -0
  371. package/dist/mailroom/search-relevance.js +319 -0
  372. package/dist/mailroom/smtp-ingress.js +176 -0
  373. package/dist/mailroom/source-state.js +176 -0
  374. package/dist/mailroom/thread.js +109 -0
  375. package/dist/mailroom/travel-extract.js +89 -0
  376. package/dist/mind/bundle-manifest.js +24 -2
  377. package/dist/mind/context.js +307 -139
  378. package/dist/mind/desk-section.js +362 -0
  379. package/dist/mind/diary-integrity.js +60 -0
  380. package/dist/mind/{memory.js → diary.js} +68 -77
  381. package/dist/mind/embedding-provider.js +60 -0
  382. package/dist/mind/file-state.js +179 -0
  383. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  384. package/dist/mind/obligation-steering.js +199 -3
  385. package/dist/mind/pending.js +36 -10
  386. package/dist/mind/prompt-budget.js +479 -0
  387. package/dist/mind/prompt-refresh.js +3 -2
  388. package/dist/mind/prompt.js +1085 -198
  389. package/dist/mind/provenance-trust.js +26 -0
  390. package/dist/mind/record-paths.js +312 -0
  391. package/dist/mind/scrutiny.js +173 -0
  392. package/dist/mind/session-transaction.js +564 -0
  393. package/dist/nerves/cli-logging.js +7 -1
  394. package/dist/nerves/coverage/audit-rules.js +15 -6
  395. package/dist/nerves/coverage/audit.js +28 -2
  396. package/dist/nerves/coverage/cli.js +1 -1
  397. package/dist/nerves/coverage/contract.js +5 -5
  398. package/dist/nerves/coverage/file-completeness.js +139 -5
  399. package/dist/nerves/coverage/run-artifacts.js +55 -35
  400. package/dist/nerves/coverage/source-scanner.js +4 -4
  401. package/dist/nerves/event-buffer.js +111 -0
  402. package/dist/nerves/index.js +293 -9
  403. package/dist/nerves/observation.js +20 -0
  404. package/dist/nerves/redact.js +79 -0
  405. package/dist/nerves/review/cli-main.js +5 -0
  406. package/dist/nerves/review/cli.js +156 -0
  407. package/dist/nerves/review/core.js +159 -0
  408. package/dist/nerves/runtime.js +17 -1
  409. package/dist/repertoire/ado-client.js +15 -56
  410. package/dist/repertoire/ado-semantic.js +16 -10
  411. package/dist/repertoire/api-client.js +97 -0
  412. package/dist/repertoire/bitwarden-store.js +1191 -0
  413. package/dist/repertoire/bundle-templates.js +71 -0
  414. package/dist/repertoire/bw-installer.js +180 -0
  415. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  416. package/dist/repertoire/coding/context-pack.js +331 -0
  417. package/dist/repertoire/coding/feedback.js +174 -32
  418. package/dist/repertoire/coding/index.js +15 -3
  419. package/dist/repertoire/coding/manager.js +159 -10
  420. package/dist/repertoire/coding/spawner.js +40 -11
  421. package/dist/repertoire/coding/tools.js +182 -18
  422. package/dist/repertoire/coding/workbench-client.js +272 -0
  423. package/dist/repertoire/coding/workbench-manager.js +346 -0
  424. package/dist/repertoire/commerce-errors.js +109 -0
  425. package/dist/repertoire/commerce-self-test.js +156 -0
  426. package/dist/repertoire/credential-access.js +182 -0
  427. package/dist/repertoire/desk/classifier.js +362 -0
  428. package/dist/repertoire/duffel-client.js +185 -0
  429. package/dist/repertoire/github-client.js +14 -55
  430. package/dist/repertoire/graph-client.js +11 -52
  431. package/dist/repertoire/guardrails.js +961 -19
  432. package/dist/repertoire/house-sweep.js +469 -0
  433. package/dist/repertoire/mcp-client.js +58 -5
  434. package/dist/repertoire/mcp-manager.js +427 -139
  435. package/dist/repertoire/mcp-tools.js +132 -0
  436. package/dist/repertoire/mcp-write-guard.js +46 -0
  437. package/dist/repertoire/plugin-mcp.js +175 -0
  438. package/dist/repertoire/plugins.js +253 -0
  439. package/dist/repertoire/relationship-authorization.js +322 -0
  440. package/dist/repertoire/sanctuary-container-policy.js +46 -0
  441. package/dist/repertoire/shell-sessions.js +134 -0
  442. package/dist/repertoire/skills.js +48 -4
  443. package/dist/repertoire/stripe-client.js +131 -0
  444. package/dist/repertoire/tool-arguments.js +182 -0
  445. package/dist/repertoire/tool-results.js +29 -0
  446. package/dist/repertoire/tools-a2a.js +699 -0
  447. package/dist/repertoire/tools-attachments.js +322 -0
  448. package/dist/repertoire/tools-awaiting.js +870 -0
  449. package/dist/repertoire/tools-base.js +81 -1168
  450. package/dist/repertoire/tools-bluebubbles.js +2 -0
  451. package/dist/repertoire/tools-bridge.js +144 -0
  452. package/dist/repertoire/tools-bundle.js +995 -0
  453. package/dist/repertoire/tools-commerce.js +253 -0
  454. package/dist/repertoire/tools-config.js +186 -0
  455. package/dist/repertoire/tools-continuity.js +575 -0
  456. package/dist/repertoire/tools-credential.js +383 -0
  457. package/dist/repertoire/tools-escalation.js +84 -0
  458. package/dist/repertoire/tools-evolution.js +527 -0
  459. package/dist/repertoire/tools-files.js +344 -0
  460. package/dist/repertoire/tools-flight.js +290 -0
  461. package/dist/repertoire/tools-flow.js +119 -0
  462. package/dist/repertoire/tools-github.js +3 -8
  463. package/dist/repertoire/tools-habits.js +103 -0
  464. package/dist/repertoire/tools-house-care.js +174 -0
  465. package/dist/repertoire/tools-mail.js +1828 -0
  466. package/dist/repertoire/tools-notes.js +496 -0
  467. package/dist/repertoire/tools-obligations.js +182 -0
  468. package/dist/repertoire/tools-orientation.js +31 -0
  469. package/dist/repertoire/tools-record.js +482 -0
  470. package/dist/repertoire/tools-rsvp.js +139 -0
  471. package/dist/repertoire/tools-runtime.js +238 -0
  472. package/dist/repertoire/tools-sanctuary-host.js +202 -0
  473. package/dist/repertoire/tools-session.js +1133 -0
  474. package/dist/repertoire/tools-shell.js +149 -0
  475. package/dist/repertoire/tools-shepherd.js +180 -0
  476. package/dist/repertoire/tools-steward-policy.js +147 -0
  477. package/dist/repertoire/tools-stripe.js +224 -0
  478. package/dist/repertoire/tools-surface.js +369 -0
  479. package/dist/repertoire/tools-teams.js +12 -39
  480. package/dist/repertoire/tools-telegram-contacts.js +37 -0
  481. package/dist/repertoire/tools-travel.js +125 -0
  482. package/dist/repertoire/tools-trip.js +982 -0
  483. package/dist/repertoire/tools-unraid.js +556 -0
  484. package/dist/repertoire/tools-user-profile.js +146 -0
  485. package/dist/repertoire/tools-vault.js +40 -0
  486. package/dist/repertoire/tools-voice-local.js +198 -0
  487. package/dist/repertoire/tools-voice.js +145 -0
  488. package/dist/repertoire/tools.js +514 -156
  489. package/dist/repertoire/travel-api-client.js +360 -0
  490. package/dist/repertoire/unraid-client.js +155 -0
  491. package/dist/repertoire/unraid-restart.js +339 -0
  492. package/dist/repertoire/user-profile.js +131 -0
  493. package/dist/repertoire/vault-setup.js +246 -0
  494. package/dist/repertoire/vault-unlock.js +686 -0
  495. package/dist/rsvp/aisleplanner-client.js +354 -0
  496. package/dist/rsvp/cli.js +926 -0
  497. package/dist/rsvp/config.js +327 -0
  498. package/dist/rsvp/cutover.js +433 -0
  499. package/dist/rsvp/diagnostics.js +232 -0
  500. package/dist/rsvp/diff-renderer.js +176 -0
  501. package/dist/rsvp/habit-policy.js +110 -0
  502. package/dist/rsvp/habit-stage.js +123 -0
  503. package/dist/rsvp/incident-bundle.js +97 -0
  504. package/dist/rsvp/migration.js +204 -0
  505. package/dist/rsvp/native-habit-runner.js +630 -0
  506. package/dist/rsvp/outbound-state.js +628 -0
  507. package/dist/rsvp/query.js +118 -0
  508. package/dist/rsvp/replay.js +233 -0
  509. package/dist/rsvp/snapshot.js +232 -0
  510. package/dist/rsvp/spend-ledger.js +175 -0
  511. package/dist/scripts/claude-code-hook.js +41 -0
  512. package/dist/scripts/claude-code-stop-hook.js +47 -0
  513. package/dist/senses/a2a-entry.js +132 -0
  514. package/dist/senses/acp-server.js +386 -0
  515. package/dist/senses/attention-queue.js +186 -0
  516. package/dist/senses/await-turn-message.js +65 -0
  517. package/dist/senses/bluebubbles/active-turns.js +216 -0
  518. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  519. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  520. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +355 -40
  521. package/dist/senses/bluebubbles/context-packet.js +207 -0
  522. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  523. package/dist/senses/bluebubbles/entry.js +90 -0
  524. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
  525. package/dist/senses/bluebubbles/index.js +3841 -0
  526. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  527. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  528. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
  529. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
  530. package/dist/senses/bluebubbles/outbound-state.js +308 -0
  531. package/dist/senses/bluebubbles/processed-log.js +133 -0
  532. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  533. package/dist/senses/bluebubbles/replay.js +284 -0
  534. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  535. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  536. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  537. package/dist/senses/bluebubbles/webhook-registration.js +228 -0
  538. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  539. package/dist/senses/cli/bracketed-paste.js +82 -0
  540. package/dist/senses/cli/image-paste.js +287 -0
  541. package/dist/senses/cli/image-ref-navigation.js +75 -0
  542. package/dist/senses/cli/ink-app.js +156 -0
  543. package/dist/senses/cli/inline-diff.js +64 -0
  544. package/dist/senses/cli/input-keys.js +174 -0
  545. package/dist/senses/cli/kill-ring.js +86 -0
  546. package/dist/senses/cli/message-list.js +51 -0
  547. package/dist/senses/cli/ouro-tui.js +607 -0
  548. package/dist/senses/cli/spinner-imperative.js +135 -0
  549. package/dist/senses/cli/spinner.js +101 -0
  550. package/dist/senses/cli/status-line.js +60 -0
  551. package/dist/senses/cli/streaming-markdown.js +526 -0
  552. package/dist/senses/cli/tool-display.js +85 -0
  553. package/dist/senses/cli/tool-render.js +85 -0
  554. package/dist/senses/cli/tui-store.js +241 -0
  555. package/dist/senses/cli/virtual-list.js +35 -0
  556. package/dist/senses/cli-entry.js +60 -8
  557. package/dist/senses/cli.js +601 -304
  558. package/dist/senses/commands.js +66 -3
  559. package/dist/senses/context-packet-ledger.js +371 -0
  560. package/dist/senses/context-packets.js +154 -0
  561. package/dist/senses/habit-lifecycle-guard.js +24 -0
  562. package/dist/senses/habit-turn-message.js +160 -0
  563. package/dist/senses/ingress-evidence.js +2 -0
  564. package/dist/senses/mail-entry.js +66 -0
  565. package/dist/senses/mail.js +524 -0
  566. package/dist/senses/pipeline.js +1136 -204
  567. package/dist/senses/private-runtime-worker.js +859 -0
  568. package/dist/senses/private-runtime.js +1627 -0
  569. package/dist/senses/proactive-content-guard.js +51 -0
  570. package/dist/senses/root-host-approval-port.js +345 -0
  571. package/dist/senses/root-host-approval-runtime.js +393 -0
  572. package/dist/senses/sanctuary-authority-resident.js +102 -0
  573. package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
  574. package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
  575. package/dist/senses/sanctuary-grounding.js +118 -0
  576. package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
  577. package/dist/senses/sanctuary-health-acceptance-probe.js +774 -0
  578. package/dist/senses/sanctuary-health-runner.js +104 -0
  579. package/dist/senses/sanctuary-health.js +422 -0
  580. package/dist/senses/sanctuary-install-state-contract.js +169 -0
  581. package/dist/senses/sanctuary-interactive-control.js +410 -0
  582. package/dist/senses/sanctuary-media-catalog-contract.js +297 -0
  583. package/dist/senses/sanctuary-media-optimization.js +514 -0
  584. package/dist/senses/sanctuary-runtime.js +369 -0
  585. package/dist/senses/sanctuary-sab.js +85 -0
  586. package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
  587. package/dist/senses/shared-turn.js +793 -0
  588. package/dist/senses/shepherd/client.js +196 -0
  589. package/dist/senses/shepherd/cmux.js +332 -0
  590. package/dist/senses/shepherd/herdr.js +311 -0
  591. package/dist/senses/shepherd/host.js +14 -0
  592. package/dist/senses/shepherd/judge.js +98 -0
  593. package/dist/senses/shepherd/redact.js +37 -0
  594. package/dist/senses/shepherd/returns.js +79 -0
  595. package/dist/senses/shepherd/sense.js +288 -0
  596. package/dist/senses/shepherd-entry.js +78 -0
  597. package/dist/senses/surface-tool.js +109 -0
  598. package/dist/senses/teams-entry.js +60 -8
  599. package/dist/senses/teams.js +519 -218
  600. package/dist/senses/telegram-admission.js +718 -0
  601. package/dist/senses/telegram-approval-runtime.js +793 -0
  602. package/dist/senses/telegram-attachments.js +186 -0
  603. package/dist/senses/telegram-audit-ledger.js +220 -0
  604. package/dist/senses/telegram-authority-transport.js +231 -0
  605. package/dist/senses/telegram-client.js +1749 -0
  606. package/dist/senses/telegram-effect-adapter.js +900 -0
  607. package/dist/senses/telegram-entry.js +83 -0
  608. package/dist/senses/telegram.js +2351 -0
  609. package/dist/senses/trust-gate.js +104 -9
  610. package/dist/senses/voice/audio-playback.js +237 -0
  611. package/dist/senses/voice/audio-routing.js +119 -0
  612. package/dist/senses/voice/call-auth.js +250 -0
  613. package/dist/senses/voice/elevenlabs.js +202 -0
  614. package/dist/senses/voice/floor-control.js +431 -0
  615. package/dist/senses/voice/floor-controller.js +115 -0
  616. package/dist/senses/voice/golden-path.js +116 -0
  617. package/dist/senses/voice/index.js +29 -0
  618. package/dist/senses/voice/local-audio-control.js +344 -0
  619. package/dist/senses/voice/local-audio-devices.js +516 -0
  620. package/dist/senses/voice/local-audio-disclosure.js +174 -0
  621. package/dist/senses/voice/local-audio-identity.js +103 -0
  622. package/dist/senses/voice/local-audio-join.js +325 -0
  623. package/dist/senses/voice/local-audio-mute.js +199 -0
  624. package/dist/senses/voice/local-audio-notify.js +121 -0
  625. package/dist/senses/voice/local-audio-prompts.js +116 -0
  626. package/dist/senses/voice/local-audio-transport.js +427 -0
  627. package/dist/senses/voice/local-audio.js +281 -0
  628. package/dist/senses/voice/local-media-stream.js +145 -0
  629. package/dist/senses/voice/meeting.js +113 -0
  630. package/dist/senses/voice/outbound.js +190 -0
  631. package/dist/senses/voice/phone.js +33 -0
  632. package/dist/senses/voice/playback.js +139 -0
  633. package/dist/senses/voice/process-guards.js +51 -0
  634. package/dist/senses/voice/realtime-eval.js +496 -0
  635. package/dist/senses/voice/realtime-tool-schema.js +195 -0
  636. package/dist/senses/voice/realtime-trace.js +531 -0
  637. package/dist/senses/voice/transcript.js +70 -0
  638. package/dist/senses/voice/turn.js +191 -0
  639. package/dist/senses/voice/twilio-phone-runtime.js +836 -0
  640. package/dist/senses/voice/twilio-phone.js +5454 -0
  641. package/dist/senses/voice/types.js +2 -0
  642. package/dist/senses/voice/whisper.js +161 -0
  643. package/dist/senses/voice-entry.js +83 -0
  644. package/dist/senses/voice-realtime-eval-command.js +99 -0
  645. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  646. package/dist/senses/voice-twilio-entry.js +87 -0
  647. package/dist/trips/core.js +138 -0
  648. package/dist/trips/store.js +265 -0
  649. package/dist/util/frontmatter.js +69 -0
  650. package/npm-shrinkwrap.json +8100 -0
  651. package/package.json +73 -13
  652. package/skills/agent-commerce.md +113 -0
  653. package/skills/browser-navigation.md +117 -0
  654. package/skills/commerce-setup-guide.md +116 -0
  655. package/skills/commerce-setup.md +84 -0
  656. package/skills/configure-dev-tools.md +99 -0
  657. package/skills/travel-planning.md +138 -0
  658. package/dist/heart/daemon/auth-flow.js +0 -430
  659. package/dist/heart/daemon/ouro-path-installer.js +0 -260
  660. package/dist/heart/daemon/ouro-version-manager.js +0 -171
  661. package/dist/heart/daemon/update-hooks.js +0 -138
  662. package/dist/heart/obligations.js +0 -191
  663. package/dist/heart/safe-workspace.js +0 -362
  664. package/dist/heart/session-recall.js +0 -116
  665. package/dist/mind/friends/channel.js +0 -84
  666. package/dist/mind/friends/group-context.js +0 -144
  667. package/dist/mind/friends/resolver.js +0 -84
  668. package/dist/mind/friends/store-file.js +0 -190
  669. package/dist/mind/friends/store.js +0 -4
  670. package/dist/mind/friends/tokens.js +0 -26
  671. package/dist/mind/friends/trust-explanation.js +0 -74
  672. package/dist/mind/friends/types.js +0 -29
  673. package/dist/repertoire/tasks/board.js +0 -134
  674. package/dist/repertoire/tasks/index.js +0 -224
  675. package/dist/repertoire/tasks/lifecycle.js +0 -80
  676. package/dist/repertoire/tasks/middleware.js +0 -65
  677. package/dist/repertoire/tasks/parser.js +0 -173
  678. package/dist/repertoire/tasks/scanner.js +0 -132
  679. package/dist/repertoire/tasks/transitions.js +0 -144
  680. package/dist/senses/bluebubbles-entry.js +0 -13
  681. package/dist/senses/bluebubbles.js +0 -1181
  682. package/dist/senses/debug-activity.js +0 -154
  683. package/dist/senses/inner-dialog-worker.js +0 -90
  684. package/dist/senses/inner-dialog.js +0 -525
  685. package/subagents/README.md +0 -7
  686. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  687. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  688. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  689. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  690. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  691. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  692. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  693. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  694. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  695. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  696. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  697. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  698. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  699. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  700. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  701. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  702. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.shellToolDefinitions = void 0;
4
+ const child_process_1 = require("child_process");
5
+ const shell_sessions_1 = require("./shell-sessions");
6
+ const identity_1 = require("../heart/identity");
7
+ const runtime_1 = require("../nerves/runtime");
8
+ const tool_arguments_1 = require("./tool-arguments");
9
+ function shellOwner(ctx) {
10
+ (0, tool_arguments_1.assertRelationshipToolOwner)(ctx);
11
+ const agentName = ctx?.agentName ?? (0, identity_1.getAgentName)();
12
+ return { agentName, agentRoot: ctx?.agentRoot ?? (0, identity_1.getAgentRoot)(agentName) };
13
+ }
14
+ exports.shellToolDefinitions = [
15
+ {
16
+ tool: {
17
+ type: "function",
18
+ function: {
19
+ name: "shell",
20
+ description: "Run a shell command and return stdout/stderr. Each call starts in the runtime's working directory; cd does not persist between calls. Use dedicated tools instead of shell when available: read_file instead of cat, edit_file instead of sed, glob instead of find, grep instead of grep/rg. Reserve shell for operations that genuinely need the shell: installing packages, running builds/tests, git operations, process management. Be careful with destructive commands -- consider reversibility before running. If a command fails, read the error output before retrying with a different approach.",
21
+ parameters: {
22
+ type: "object",
23
+ properties: {
24
+ command: { type: "string" },
25
+ timeout_ms: {
26
+ type: "number",
27
+ description: "Timeout in milliseconds. Default: 30000. Max: 600000.",
28
+ },
29
+ background: {
30
+ type: "boolean",
31
+ description: "Run in background and return immediately with a process ID. Records belong to the initiating agent and live only in process memory. Use separately authorized shell_status/shell_tail calls to monitor. Revocation does not kill a started process; runtime restart loses its record.",
32
+ },
33
+ },
34
+ required: ["command"],
35
+ additionalProperties: false,
36
+ },
37
+ },
38
+ },
39
+ approvalPolicy: (args) => {
40
+ const command = typeof args.command === "string" ? args.command.trim().split(/\s+/) : [];
41
+ if (command[0] === "docker" && command[1] === "restart" && command.length > 2) {
42
+ return {
43
+ kind: "required",
44
+ policyId: "shell.docker-lifecycle.v1",
45
+ actionClass: "service-control",
46
+ requiresSoleCall: true,
47
+ };
48
+ }
49
+ return { kind: "not_required" };
50
+ },
51
+ handler: (a, ctx) => {
52
+ (0, tool_arguments_1.assertRelationshipToolOwner)(ctx);
53
+ // Destructive pattern detection (friction, not a block)
54
+ const destructivePatterns = (0, shell_sessions_1.detectDestructivePatterns)(a.command);
55
+ if (destructivePatterns.length > 0) {
56
+ (0, runtime_1.emitNervesEvent)({
57
+ level: "warn",
58
+ event: "tool.shell.destructive_detected",
59
+ component: "tools",
60
+ message: `destructive pattern detected: ${destructivePatterns.join(", ")}`,
61
+ meta: { command: a.command, patterns: destructivePatterns },
62
+ });
63
+ }
64
+ // Background mode: spawn and return immediately
65
+ if (a.background === true) {
66
+ const session = (0, shell_sessions_1.spawnBackgroundShell)(a.command, shellOwner(ctx));
67
+ return JSON.stringify({ id: session.id, command: session.command, status: session.status });
68
+ }
69
+ const MAX_TIMEOUT = 600000;
70
+ const requestedTimeout = Number(a.timeout_ms) || 0;
71
+ let configDefault = 30000;
72
+ const owner = ctx?.agentName !== undefined || ctx?.agentRoot !== undefined ? shellOwner(ctx) : undefined;
73
+ try {
74
+ configDefault = (0, identity_1.loadAgentConfig)(owner).shell?.defaultTimeout ?? 30000;
75
+ }
76
+ catch (error) {
77
+ if (owner)
78
+ throw error;
79
+ (0, runtime_1.emitNervesEvent)({
80
+ level: "warn", component: "tools", event: "tool.shell_config_unavailable",
81
+ message: "legacy shell caller has no configuration; using the default timeout",
82
+ meta: { fallbackTimeout: configDefault },
83
+ });
84
+ }
85
+ const baseTimeout = requestedTimeout > 0 ? requestedTimeout : configDefault;
86
+ const timeout = Math.min(baseTimeout, MAX_TIMEOUT);
87
+ const output = (0, child_process_1.execSync)(a.command, {
88
+ encoding: "utf-8",
89
+ timeout,
90
+ });
91
+ if (destructivePatterns.length > 0) {
92
+ return `${output}\n\n--- destructive pattern detected: ${destructivePatterns.join(", ")} ---`;
93
+ }
94
+ return output;
95
+ },
96
+ summaryKeys: ["command"],
97
+ },
98
+ {
99
+ tool: {
100
+ type: "function",
101
+ function: {
102
+ name: "shell_status",
103
+ description: "Check separately authorized status of background shell processes owned by this agent. Omit id to list this agent's records. Records live only in process memory; runtime restart loses observability, and revoked access does not kill a started process.",
104
+ parameters: {
105
+ type: "object",
106
+ properties: {
107
+ id: { type: "string", description: "Background shell process ID" },
108
+ },
109
+ },
110
+ },
111
+ },
112
+ handler: (a, ctx) => {
113
+ if (!a.id) {
114
+ return JSON.stringify((0, shell_sessions_1.listShellSessions)(shellOwner(ctx)));
115
+ }
116
+ const session = (0, shell_sessions_1.getShellSession)(a.id, shellOwner(ctx));
117
+ if (!session)
118
+ return `process not found: ${a.id}`;
119
+ return JSON.stringify(session);
120
+ },
121
+ summaryKeys: ["id"],
122
+ },
123
+ {
124
+ tool: {
125
+ type: "function",
126
+ function: {
127
+ name: "shell_tail",
128
+ description: "Show recent output from a background shell process owned by this agent. Access is reauthorized on each call. Revocation does not kill a started process, and runtime restart loses the in-memory record.",
129
+ parameters: {
130
+ type: "object",
131
+ properties: {
132
+ id: { type: "string", description: "Background shell process ID" },
133
+ },
134
+ required: ["id"],
135
+ },
136
+ },
137
+ },
138
+ handler: (a, ctx) => {
139
+ /* v8 ignore next -- schema requires id, defensive guard @preserve */
140
+ if (!a.id)
141
+ return "id is required";
142
+ const output = (0, shell_sessions_1.tailShellSession)(a.id, shellOwner(ctx));
143
+ if (output === undefined)
144
+ return `process not found: ${a.id}`;
145
+ return output || "(no output yet)";
146
+ },
147
+ summaryKeys: ["id"],
148
+ },
149
+ ];
@@ -0,0 +1,180 @@
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.shepherdToolDefinitions = exports.shepherdSignalToolDefinition = exports.shepherdReadToolDefinition = exports.shepherdOverviewToolDefinition = void 0;
37
+ exports.shepherdToolsEnabled = shepherdToolsEnabled;
38
+ const fs = __importStar(require("node:fs"));
39
+ const path = __importStar(require("node:path"));
40
+ const runtime_credentials_1 = require("../heart/runtime-credentials");
41
+ const shepherd_config_1 = require("../heart/shepherd-config");
42
+ const runtime_1 = require("../nerves/runtime");
43
+ const host_1 = require("../senses/shepherd/host");
44
+ const redact_1 = require("../senses/shepherd/redact");
45
+ const returns_1 = require("../senses/shepherd/returns");
46
+ /**
47
+ * Shepherd's tools: every coding-agent session on this machine's terminal host with what Shepherd
48
+ * last decided about it (`shepherd_overview`), what a session shows (`shepherd_read`), and a status
49
+ * line or notification for the human (`shepherd_signal`).
50
+ */
51
+ const STATUS_MAX_CHARS = 120;
52
+ const READ_MAX_CHARS = 16_000;
53
+ function text(value) {
54
+ return typeof value === "string" ? value : "";
55
+ }
56
+ function shepherdToolsEnabled(agentRoot) {
57
+ if (!agentRoot)
58
+ return false;
59
+ try {
60
+ const config = JSON.parse(fs.readFileSync(path.join(agentRoot, "agent.json"), "utf-8"));
61
+ return config.senses?.shepherd?.enabled === true;
62
+ }
63
+ catch {
64
+ return false;
65
+ }
66
+ }
67
+ function hostFor(agentName) {
68
+ const machine = (0, runtime_credentials_1.readMachineRuntimeCredentialConfig)(agentName);
69
+ const resolved = (0, shepherd_config_1.resolveShepherdConnection)(agentName, machine.ok ? machine.config : {});
70
+ return resolved.ok ? (0, host_1.createShepherdHost)(resolved.connection, { agentName }) : resolved.error;
71
+ }
72
+ async function withHost(tool, ctx, run) {
73
+ if (!ctx?.agentName || !ctx.agentRoot)
74
+ return JSON.stringify({ error: "the Shepherd tools need an agent runtime" });
75
+ const host = hostFor(ctx.agentName);
76
+ if (typeof host === "string")
77
+ return JSON.stringify({ error: host });
78
+ try {
79
+ const result = await run(host);
80
+ (0, runtime_1.emitNervesEvent)({ component: "repertoire", event: "repertoire.shepherd_tool", message: "ran a Shepherd tool", meta: { tool } });
81
+ return JSON.stringify(result);
82
+ }
83
+ catch (error) {
84
+ (0, runtime_1.emitNervesEvent)({ level: "warn", component: "repertoire", event: "repertoire.shepherd_tool_error", message: "Shepherd tool call failed", meta: { tool, error: error.message } });
85
+ return JSON.stringify({ error: error.message });
86
+ }
87
+ }
88
+ exports.shepherdOverviewToolDefinition = {
89
+ tool: {
90
+ type: "function",
91
+ function: {
92
+ name: "shepherd_overview",
93
+ description: "Every terminal session on this machine's terminal host (cmux), with the coding agent there when known, and the last time Shepherd judged a return of control in it: when, what kind (premature, gate, done, unclear, loop_guard, error), whether it answered, and why. Read-only.",
94
+ parameters: { type: "object", properties: {}, additionalProperties: false },
95
+ },
96
+ },
97
+ handler: (_args, ctx) => withHost("shepherd_overview", ctx, async (host) => {
98
+ const last = new Map();
99
+ for (const record of (0, returns_1.readReturns)(ctx.agentRoot))
100
+ last.set(record.session, record);
101
+ return {
102
+ host: host.name,
103
+ sessions: (await host.list()).map((session) => {
104
+ const record = last.get(session.id);
105
+ return { ...session, ...(record ? { lastReturn: { at: record.at, kind: record.kind, action: record.action, reason: record.reason, reply: record.reply, task: record.task } } : {}) };
106
+ }),
107
+ };
108
+ }),
109
+ summaryKeys: [],
110
+ riskProfile: { mutates: "none", risk: "low" },
111
+ };
112
+ function boundedLines(value) {
113
+ const parsed = typeof value === "number" ? value : Number.parseInt(text(value), 10);
114
+ return Number.isFinite(parsed) ? Math.min(400, Math.max(1, Math.trunc(parsed))) : 60;
115
+ }
116
+ exports.shepherdReadToolDefinition = {
117
+ tool: {
118
+ type: "function",
119
+ function: {
120
+ name: "shepherd_read",
121
+ description: "Read the text of one terminal session (what a coding agent shows now and what it did recently). Secret-shaped strings are redacted and the text is bounded. Read-only. Take the session id or ref from shepherd_overview.",
122
+ parameters: {
123
+ type: "object",
124
+ properties: {
125
+ session: { type: "string", description: "Session id or ref (surface:12) from shepherd_overview." },
126
+ lines: { type: "number", description: "How many lines, 1-400. Default 60." },
127
+ },
128
+ required: ["session"],
129
+ additionalProperties: false,
130
+ },
131
+ },
132
+ },
133
+ handler: (args, ctx) => {
134
+ const session = text(args.session).trim();
135
+ if (!session)
136
+ return Promise.resolve(JSON.stringify({ error: "name a session id or ref from shepherd_overview" }));
137
+ return withHost("shepherd_read", ctx, async (host) => {
138
+ const screen = (0, redact_1.redactSecrets)(await host.read(session, boundedLines(args.lines)));
139
+ return { session, text: screen.slice(-READ_MAX_CHARS), truncated: screen.length > READ_MAX_CHARS };
140
+ });
141
+ },
142
+ summaryKeys: ["session"],
143
+ riskProfile: { mutates: "none", risk: "low" },
144
+ };
145
+ exports.shepherdSignalToolDefinition = {
146
+ tool: {
147
+ type: "function",
148
+ function: {
149
+ name: "shepherd_signal",
150
+ description: `Tell the human something through the terminal host. status sets Shepherd's one-line status on that session's workspace (at most ${STATUS_MAX_CHARS} characters; an empty string clears it). notify_title with notify_body also posts a desktop notification there. It never types into a terminal.`,
151
+ parameters: {
152
+ type: "object",
153
+ properties: {
154
+ session: { type: "string", description: "Session id or ref from shepherd_overview." },
155
+ status: { type: "string", description: "One line for the status, or an empty string to clear it." },
156
+ notify_title: { type: "string", description: "Desktop notification title." },
157
+ notify_body: { type: "string", description: "Desktop notification body." },
158
+ },
159
+ required: ["session", "status"],
160
+ additionalProperties: false,
161
+ },
162
+ },
163
+ },
164
+ handler: (args, ctx) => {
165
+ const session = text(args.session).trim();
166
+ const status = text(args.status).trim();
167
+ const title = text(args.notify_title).trim();
168
+ if (!session)
169
+ return Promise.resolve(JSON.stringify({ error: "name a session id or ref from shepherd_overview" }));
170
+ if (status.length > STATUS_MAX_CHARS || /[\r\n]/.test(status))
171
+ return Promise.resolve(JSON.stringify({ error: `status must be one line of at most ${STATUS_MAX_CHARS} characters` }));
172
+ return withHost("shepherd_signal", ctx, async (host) => {
173
+ await host.signal(session, status || null, title ? { title, body: text(args.notify_body) } : undefined);
174
+ return { session, status: status ? "set" : "cleared", notified: !!title };
175
+ });
176
+ },
177
+ summaryKeys: ["session", "status"],
178
+ riskProfile: { mutates: "external_side_effect", risk: "high", reason: "changes what the terminal host shows the human (a status line or a desktop notification)" },
179
+ };
180
+ exports.shepherdToolDefinitions = [exports.shepherdOverviewToolDefinition, exports.shepherdReadToolDefinition, exports.shepherdSignalToolDefinition];
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.stewardPolicyToolDefinition = void 0;
4
+ const steward_policy_1 = require("../heart/steward-policy");
5
+ const runtime_1 = require("../nerves/runtime");
6
+ function arrayArgument(raw, label) {
7
+ if (!raw)
8
+ throw new Error(`${label} is required`);
9
+ const value = JSON.parse(raw);
10
+ if (!Array.isArray(value) || value.some((entry) => typeof entry !== "string"))
11
+ throw new Error(`${label} must be a JSON string array`);
12
+ return value;
13
+ }
14
+ exports.stewardPolicyToolDefinition = {
15
+ tool: {
16
+ type: "function",
17
+ function: {
18
+ name: "steward_policy_manage",
19
+ description: "Read or update the household steward's typed desired-state and routine-action policy. Updates require the current authenticated owner Telegram request and fresh authorization. Replay identities can never update it. correct_provenance (key, source, correction) is only for fixing a wrong attribution on an existing desired state: it replaces the recorded source and records the correction note, never changes the value, and leaves an audit row; do not use it to change a value. expectedVersion is optional; omit it to apply against the current policy version, or supply a version from read for explicit stale-write detection.",
20
+ parameters: {
21
+ type: "object",
22
+ properties: {
23
+ action: { type: "string", enum: ["read", "set_desired_state", "grant_routine_action", "correct_provenance"] },
24
+ expectedVersion: { type: "integer", minimum: 0, description: "Optional version returned by read. When omitted, the runtime uses the current policy version." },
25
+ key: { type: "string" },
26
+ value: { type: "string" },
27
+ provenance: { type: "string", enum: ["stated", "observed", "default", "installed_explicit_policy"] },
28
+ source: { type: "string", description: "Who or what stated this. For correct_provenance, the corrected attribution that replaces the recorded source." },
29
+ correction: { type: "string", description: "correct_provenance only: required note naming what is being corrected and why." },
30
+ routineAction: { type: "string" },
31
+ targetsJson: { type: "string", description: "JSON array of exact target names" },
32
+ maxCount: { type: "integer", minimum: 1 },
33
+ windowMs: { type: "integer", minimum: 1 },
34
+ verificationRequired: { type: "boolean" },
35
+ exclusionsJson: { type: "string", description: "JSON array of exact excluded target names" },
36
+ expiresAt: { type: "string" },
37
+ },
38
+ required: ["action"],
39
+ additionalProperties: false,
40
+ },
41
+ },
42
+ },
43
+ handler: (args, ctx) => {
44
+ if (!ctx?.agentRoot)
45
+ throw new Error("steward policy runtime is unavailable");
46
+ if (!ctx.relationshipAuthorization)
47
+ throw new Error("steward policy access requires authenticated relationship authority");
48
+ if (args.action === "read") {
49
+ (0, runtime_1.emitNervesEvent)({ component: "repertoire", event: "repertoire.steward_policy_tool_call", message: "read steward policy", meta: { action: "read" } });
50
+ return JSON.stringify((0, steward_policy_1.readStewardPolicy)(ctx.agentRoot));
51
+ }
52
+ const relationship = ctx.relationshipAuthorization;
53
+ const actor = relationship.actor;
54
+ if (!actor)
55
+ throw new Error("steward policy mutation requires authenticated relationship authority");
56
+ const { friendId, trustLevel, sessionEventId } = actor;
57
+ const { profileId, requestId } = relationship;
58
+ (0, steward_policy_1.assertNotReplayIdentity)(ctx.agentRoot, [friendId, ctx.delegatedCommand?.delegateFriendId]);
59
+ const sessionKey = ctx.currentSession?.key;
60
+ const delegated = ctx.delegatedCommand;
61
+ // Two ways to hold owner authority: the owner's own Telegram turn, or a delegated
62
+ // command the A2A server admitted (grant checked, owner already notified).
63
+ const sessionMatches = () => delegated
64
+ ? ctx.currentSession?.channel === "a2a" && ctx.delegatedCommand === delegated
65
+ && friendId === delegated.principalFriendId && requestId === delegated.commandId
66
+ && sessionEventId === `a2a-delegated:${delegated.commandId}`
67
+ : ctx.currentSession?.friendId === friendId && ctx.currentSession.channel === "telegram";
68
+ if (trustLevel !== "family" || profileId !== "sanctuary-owner" || typeof requestId !== "string" || !requestId.trim()
69
+ || typeof sessionKey !== "string" || !sessionKey.trim() || !sessionEventId.trim()
70
+ || !sessionMatches() || ctx.currentExternalEvent) {
71
+ throw new Error(delegated
72
+ ? "steward policy mutation requires a current admitted delegated owner command"
73
+ : "steward policy mutation requires a current authenticated owner Telegram request and session");
74
+ }
75
+ const sourceFor = (raw) => delegated
76
+ ? `${delegated.principalName} via ${delegated.delegateName} (delegated)${raw?.trim() ? `: ${raw.trim()}` : ""}`
77
+ : raw ?? "";
78
+ const expectedVersion = args.expectedVersion === undefined ? undefined : Number(args.expectedVersion);
79
+ if (expectedVersion !== undefined && (!Number.isSafeInteger(expectedVersion) || expectedVersion < 0))
80
+ throw new Error("expectedVersion must be a nonnegative integer");
81
+ let mutation;
82
+ if (args.action === "set_desired_state") {
83
+ if (args.provenance !== "stated" && args.provenance !== "observed" && args.provenance !== "default")
84
+ throw new Error("desired state provenance is invalid");
85
+ mutation = { kind: "set_desired_state", key: args.key ?? "", value: args.value ?? "", provenance: args.provenance, source: sourceFor(args.source), ...(args.expiresAt ? { expiresAt: args.expiresAt } : {}) };
86
+ }
87
+ else if (args.action === "correct_provenance") {
88
+ mutation = { kind: "correct_provenance", key: args.key ?? "", source: sourceFor(args.source), correction: args.correction ?? "" };
89
+ }
90
+ else if (args.action === "grant_routine_action") {
91
+ if (args.provenance !== "stated" && args.provenance !== "installed_explicit_policy")
92
+ throw new Error("routine action provenance is invalid");
93
+ const targets = arrayArgument(args.targetsJson, "targetsJson");
94
+ const exclusions = arrayArgument(args.exclusionsJson, "exclusionsJson");
95
+ const verificationRequired = args.verificationRequired;
96
+ if (verificationRequired !== true)
97
+ throw new Error("verificationRequired must be true");
98
+ mutation = {
99
+ kind: "grant_routine_action",
100
+ key: args.key ?? "",
101
+ action: args.routineAction ?? "",
102
+ targets,
103
+ maxCount: Number(args.maxCount),
104
+ windowMs: Number(args.windowMs),
105
+ verificationRequired,
106
+ exclusions,
107
+ provenance: args.provenance,
108
+ ...(args.expiresAt ? { expiresAt: args.expiresAt } : {}),
109
+ };
110
+ }
111
+ else
112
+ throw new Error("steward policy action is invalid");
113
+ const agentRoot = ctx.agentRoot;
114
+ return Promise.resolve(relationship.authorizeTool("steward_policy_manage", args)).then((authorization) => {
115
+ if (!authorization.allowed)
116
+ throw new Error(`steward policy authorization denied: ${authorization.reason}`);
117
+ if (typeof authorization.profileVersion !== "number" || !Number.isSafeInteger(authorization.profileVersion) || authorization.profileVersion < 1 || !authorization.receiptId.trim()) {
118
+ throw new Error("steward policy owner authorization is not versioned");
119
+ }
120
+ if (ctx.relationshipAuthorization !== relationship || relationship.profileId !== profileId || relationship.requestId !== requestId
121
+ || relationship.actor?.friendId !== friendId || relationship.actor.trustLevel !== trustLevel || relationship.actor.sessionEventId !== sessionEventId
122
+ || ctx.currentSession?.key !== sessionKey || !sessionMatches() || ctx.currentExternalEvent) {
123
+ throw new Error("steward policy owner authorization or session changed before mutation");
124
+ }
125
+ const versionBefore = (0, steward_policy_1.readStewardPolicy)(agentRoot).version;
126
+ const result = (0, steward_policy_1.updateStewardPolicy)(agentRoot, {
127
+ expectedVersion: expectedVersion ?? (0, steward_policy_1.readStewardPolicy)(agentRoot).version,
128
+ actor: {
129
+ friendId, trustLevel, sessionEventId,
130
+ authorization: { profileId, requestId, sessionKey, receiptId: authorization.receiptId, profileVersion: authorization.profileVersion },
131
+ ...(delegated ? { delegatedVia: { delegateFriendId: delegated.delegateFriendId, delegateDid: delegated.delegateDid, noticeId: delegated.noticeId } } : {}),
132
+ },
133
+ mutation,
134
+ });
135
+ (0, runtime_1.emitNervesEvent)({ component: "repertoire", event: "repertoire.steward_policy_tool_call", message: "updated steward policy", meta: { action: args.action } });
136
+ if (mutation.kind === "set_desired_state" && result.version === versionBefore) {
137
+ // A same-value restatement writes nothing; the entry is necessarily present.
138
+ const existing = result.desiredStates[mutation.key];
139
+ return JSON.stringify({ ...result, unchanged: true, note: `already recorded as ${existing.value} (source: ${existing.source})` });
140
+ }
141
+ return JSON.stringify(result);
142
+ });
143
+ },
144
+ riskProfile: (args) => args.action === "read"
145
+ ? { mutates: "none", risk: "low" }
146
+ : { mutates: "durable_state_write", risk: "high", reason: "updates typed household steward policy under current authenticated owner authority" },
147
+ };