@ouro.bot/cli 0.1.0-alpha.94 → 0.1.0-alpha.940

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 (752) 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 +5966 -16
  16. package/deploy/unraid/Dockerfile +58 -0
  17. package/deploy/unraid/README.txt +2997 -0
  18. package/deploy/unraid/audit-container-spec.sh +4 -0
  19. package/deploy/unraid/container-runtime.json +1 -0
  20. package/deploy/unraid/docker-man-template-transaction.mjs +711 -0
  21. package/deploy/unraid/docker-man-template-xml.cjs +105 -0
  22. package/deploy/unraid/migrate-sanctuary-bundle.mjs +60 -0
  23. package/deploy/unraid/ouro-events/bootstrap-spool.sh +92 -0
  24. package/deploy/unraid/ouro-events/emit-event.mjs +310 -0
  25. package/deploy/unraid/ouro-events/emit-usenet-event.sh +54 -0
  26. package/deploy/unraid/ouro-events/install-usenet-guard.sh +435 -0
  27. package/deploy/unraid/ouro-events/usenet-health.sh +176 -0
  28. package/deploy/unraid/sanctuary-acceptance-adapter.sh +43 -0
  29. package/deploy/unraid/sanctuary-acceptance-contract.json +198 -0
  30. package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
  31. package/deploy/unraid/sanctuary-authority-installation.json +36 -0
  32. package/deploy/unraid/sanctuary-authority-service.sh +30 -0
  33. package/deploy/unraid/sanctuary-butler-upgrade.mjs +1254 -0
  34. package/deploy/unraid/sanctuary-deployment-target.mjs +710 -0
  35. package/deploy/unraid/sanctuary-replay-gate.mjs +1564 -0
  36. package/deploy/unraid/sanctuary-safe-rename.py +24 -0
  37. package/deploy/unraid/sanctuary-unit16-host-broker.mjs +2086 -0
  38. package/deploy/unraid/sanctuary-unit16-run.sh +560 -0
  39. package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
  40. package/deploy/unraid/sanctuary.ouro/agent.json +66 -0
  41. package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
  42. package/deploy/unraid/sanctuary.ouro/awaiting/house-care-sweep.md +17 -0
  43. package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
  44. package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
  45. package/deploy/unraid/sanctuary.ouro/mcp/media-mcp.mjs +2231 -0
  46. package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
  47. package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
  48. package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +5 -0
  49. package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +33 -0
  50. package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +27 -0
  51. package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +22 -0
  52. package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
  53. package/deploy/unraid/sanctuary.ouro/tool-profiles.json +232 -0
  54. package/deploy/unraid/sanctuary.xml +30 -0
  55. package/dist/a2a/card.js +57 -0
  56. package/dist/a2a/client.js +250 -0
  57. package/dist/a2a/config.js +50 -0
  58. package/dist/a2a/delegated-command-grants.js +93 -0
  59. package/dist/a2a/delegated-command.js +197 -0
  60. package/dist/a2a/delegation-stores.js +56 -0
  61. package/dist/a2a/did-resolution.js +93 -0
  62. package/dist/a2a/escalation-grants.js +84 -0
  63. package/dist/a2a/escalation-wiring.js +60 -0
  64. package/dist/a2a/identity.js +258 -0
  65. package/dist/a2a/inbound-share.js +110 -0
  66. package/dist/a2a/mission-result-wire.js +196 -0
  67. package/dist/a2a/onboarding.js +133 -0
  68. package/dist/a2a/operator-trust.js +382 -0
  69. package/dist/a2a/outbox-client.js +57 -0
  70. package/dist/a2a/outbox-store.js +188 -0
  71. package/dist/a2a/outbox-wire.js +95 -0
  72. package/dist/a2a/pin-store.js +132 -0
  73. package/dist/a2a/replay-grant-holders.js +33 -0
  74. package/dist/a2a/replay-harness.js +188 -0
  75. package/dist/a2a/resolution-proof.js +53 -0
  76. package/dist/a2a/sealed-chat.js +113 -0
  77. package/dist/a2a/seen-ledger.js +120 -0
  78. package/dist/a2a/server.js +771 -0
  79. package/dist/a2a/task-store.js +69 -0
  80. package/dist/a2a/transport.js +45 -0
  81. package/dist/a2a/trust-commands.js +203 -0
  82. package/dist/a2a/trusted-files.js +185 -0
  83. package/dist/a2a/types.js +3 -0
  84. package/dist/arc/attention-types.js +8 -0
  85. package/dist/arc/cares.js +360 -0
  86. package/dist/arc/episodes.js +118 -0
  87. package/dist/arc/evolution.js +490 -0
  88. package/dist/arc/flight-recorder.js +1034 -0
  89. package/dist/arc/intentions.js +134 -0
  90. package/dist/arc/json-store.js +117 -0
  91. package/dist/arc/obligations.js +386 -0
  92. package/dist/arc/packets.js +336 -0
  93. package/dist/arc/presence.js +185 -0
  94. package/dist/arc/task-lifecycle.js +57 -0
  95. package/dist/commerce/store.js +755 -0
  96. package/dist/commerce/types.js +3 -0
  97. package/dist/heart/active-work.js +798 -40
  98. package/dist/heart/agent-entry.js +252 -3
  99. package/dist/heart/approval-files.js +113 -0
  100. package/dist/heart/approval-store.js +960 -0
  101. package/dist/heart/attachments/image-normalize.js +201 -0
  102. package/dist/heart/attachments/materialize.js +97 -0
  103. package/dist/heart/attachments/originals.js +88 -0
  104. package/dist/heart/attachments/render.js +29 -0
  105. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  106. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  107. package/dist/heart/attachments/sources/index.js +18 -0
  108. package/dist/heart/attachments/sources/telegram.js +71 -0
  109. package/dist/heart/attachments/store.js +132 -0
  110. package/dist/heart/attachments/types.js +93 -0
  111. package/dist/heart/auth/auth-flow.js +497 -0
  112. package/dist/heart/autonomy-budget.js +478 -0
  113. package/dist/heart/awaiting/a2a-await-delivery.js +109 -0
  114. package/dist/heart/awaiting/await-alert.js +152 -0
  115. package/dist/heart/awaiting/await-expiry.js +143 -0
  116. package/dist/heart/awaiting/await-loader.js +91 -0
  117. package/dist/heart/awaiting/await-parser.js +152 -0
  118. package/dist/heart/awaiting/await-runtime-state.js +111 -0
  119. package/dist/heart/awaiting/await-scheduler.js +391 -0
  120. package/dist/heart/background-operations.js +281 -0
  121. package/dist/heart/bluebubbles-host-account.js +78 -0
  122. package/dist/heart/bridges/manager.js +137 -17
  123. package/dist/heart/bridges/store.js +14 -2
  124. package/dist/heart/bundle-state.js +168 -0
  125. package/dist/heart/commitments.js +44 -18
  126. package/dist/heart/config-registry.js +331 -0
  127. package/dist/heart/config.js +174 -131
  128. package/dist/heart/context-loss-gauntlet.js +387 -0
  129. package/dist/heart/context-loss-sentinel.js +1159 -0
  130. package/dist/heart/core.js +2356 -586
  131. package/dist/heart/cross-chat-delivery.js +9 -22
  132. package/dist/heart/daemon/agent-config-check.js +474 -0
  133. package/dist/heart/daemon/agent-discovery.js +283 -3
  134. package/dist/heart/daemon/agent-home.js +319 -0
  135. package/dist/heart/daemon/agent-service.js +542 -0
  136. package/dist/heart/daemon/agentic-repair.js +547 -0
  137. package/dist/heart/daemon/await-private-wake.js +59 -0
  138. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  139. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  140. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  141. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  142. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  143. package/dist/heart/daemon/cadence.js +180 -0
  144. package/dist/heart/daemon/cli-arg-redaction.js +26 -0
  145. package/dist/heart/daemon/cli-defaults.js +881 -0
  146. package/dist/heart/daemon/cli-desk.js +322 -0
  147. package/dist/heart/daemon/cli-exec.js +9235 -0
  148. package/dist/heart/daemon/cli-help.js +742 -0
  149. package/dist/heart/daemon/cli-parse.js +3236 -0
  150. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  151. package/dist/heart/daemon/cli-render.js +819 -0
  152. package/dist/heart/daemon/cli-types.js +8 -0
  153. package/dist/heart/daemon/connect-bay.js +323 -0
  154. package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
  155. package/dist/heart/daemon/container-healthcheck.js +112 -0
  156. package/dist/heart/daemon/container-runtime.js +97 -0
  157. package/dist/heart/daemon/container-spec-auditor-main.js +171 -0
  158. package/dist/heart/daemon/container-spec-auditor.js +235 -0
  159. package/dist/heart/daemon/daemon-bootstrap-startup.js +115 -0
  160. package/dist/heart/daemon/daemon-cli.js +29 -2360
  161. package/dist/heart/daemon/daemon-entry.js +953 -11
  162. package/dist/heart/daemon/daemon-health.js +186 -0
  163. package/dist/heart/daemon/daemon-rollup.js +57 -0
  164. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  165. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  166. package/dist/heart/daemon/daemon.js +2101 -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 +9 -3
  190. package/dist/heart/daemon/plugin-cli.js +432 -0
  191. package/dist/heart/daemon/process-manager.js +760 -61
  192. package/dist/heart/daemon/provider-discovery.js +137 -0
  193. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  194. package/dist/heart/daemon/prunable-bundle.js +144 -0
  195. package/dist/heart/daemon/pulse.js +511 -0
  196. package/dist/heart/daemon/readiness-repair.js +365 -0
  197. package/dist/heart/daemon/run-hooks.js +2 -0
  198. package/dist/heart/daemon/runtime-logging.js +47 -14
  199. package/dist/heart/daemon/runtime-metadata.js +2 -30
  200. package/dist/heart/daemon/runtime-mode.js +13 -2
  201. package/dist/heart/daemon/safe-mode.js +161 -0
  202. package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2654 -0
  203. package/dist/heart/daemon/sanctuary-acceptance-harness.js +1830 -0
  204. package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
  205. package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +955 -0
  206. package/dist/heart/daemon/sanctuary-authority-codec.js +86 -0
  207. package/dist/heart/daemon/sanctuary-authority-epoch.js +281 -0
  208. package/dist/heart/daemon/sanctuary-authority-installation.js +161 -0
  209. package/dist/heart/daemon/sanctuary-authority-ledger.js +241 -0
  210. package/dist/heart/daemon/sanctuary-authority-root-lifecycle.js +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 +786 -48
  226. package/dist/heart/daemon/session-id-resolver.js +131 -0
  227. package/dist/heart/daemon/skill-management-installer.js +1 -1
  228. package/dist/heart/daemon/socket-client.js +180 -12
  229. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  230. package/dist/heart/daemon/startup-tui.js +339 -0
  231. package/dist/heart/daemon/supercronic-supervisor.js +282 -0
  232. package/dist/heart/daemon/task-scheduler.js +117 -39
  233. package/dist/heart/daemon/terminal-ui.js +503 -0
  234. package/dist/heart/daemon/thoughts.js +138 -54
  235. package/dist/heart/daemon/up-progress.js +366 -0
  236. package/dist/heart/daemon/vault-items.js +56 -0
  237. package/dist/heart/delegation.js +1 -4
  238. package/dist/heart/external-events/router.js +1516 -0
  239. package/dist/heart/failure-reports.js +336 -0
  240. package/dist/heart/file-lock.js +109 -0
  241. package/dist/heart/frontend-approval-runtime.js +506 -0
  242. package/dist/heart/frontend-journal.js +215 -0
  243. package/dist/heart/frontend-session-service.js +271 -0
  244. package/dist/heart/frontend-socket-client.js +173 -0
  245. package/dist/heart/frontend-socket.js +434 -0
  246. package/dist/heart/frontend-turn-errors.js +20 -0
  247. package/dist/heart/habits/habit-cancel.js +810 -0
  248. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  249. package/dist/heart/habits/habit-migration.js +194 -0
  250. package/dist/heart/habits/habit-parser.js +278 -0
  251. package/dist/heart/habits/habit-runtime-state.js +93 -0
  252. package/dist/heart/habits/habit-scheduler.js +653 -0
  253. package/dist/heart/habits/habit-session-summary.js +318 -0
  254. package/dist/heart/habits/habit-session.js +636 -0
  255. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
  256. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  257. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  258. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  259. package/dist/heart/identity.js +239 -59
  260. package/dist/heart/kept-notes.js +289 -0
  261. package/dist/heart/kicks.js +1 -1
  262. package/dist/heart/machine-identity.js +175 -0
  263. package/dist/heart/mail-import-discovery.js +356 -0
  264. package/dist/heart/mailbox/mailbox-http-hooks.js +99 -0
  265. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  266. package/dist/heart/mailbox/mailbox-http-routes.js +406 -0
  267. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  268. package/dist/heart/mailbox/mailbox-http-transport.js +272 -0
  269. package/dist/heart/mailbox/mailbox-http.js +99 -0
  270. package/dist/heart/mailbox/mailbox-read.js +41 -0
  271. package/dist/heart/mailbox/mailbox-supervision.js +131 -0
  272. package/dist/heart/mailbox/mailbox-types.js +27 -0
  273. package/dist/heart/mailbox/mailbox-view.js +197 -0
  274. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  275. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  276. package/dist/heart/mailbox/readers/mail.js +375 -0
  277. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  278. package/dist/heart/mailbox/readers/sessions.js +231 -0
  279. package/dist/heart/mailbox/readers/shared.js +111 -0
  280. package/dist/heart/mcp/mcp-server.js +760 -0
  281. package/dist/heart/migrate-config.js +100 -0
  282. package/dist/heart/model-capabilities.js +83 -16
  283. package/dist/heart/orientation-frame.js +345 -0
  284. package/dist/heart/platform.js +81 -0
  285. package/dist/heart/primitives.js +1 -1
  286. package/dist/heart/private-runtime/decision-renderer.js +158 -0
  287. package/dist/heart/private-runtime/index.js +18 -0
  288. package/dist/heart/private-runtime/ledger.js +221 -0
  289. package/dist/heart/private-runtime/policy.js +260 -0
  290. package/dist/heart/private-runtime/types.js +2 -0
  291. package/dist/heart/progress-story.js +1 -1
  292. package/dist/heart/provider-attempt.js +137 -0
  293. package/dist/heart/provider-binding-resolver.js +273 -0
  294. package/dist/heart/provider-credentials.js +449 -0
  295. package/dist/heart/provider-failover.js +311 -0
  296. package/dist/heart/provider-models.js +96 -0
  297. package/dist/heart/provider-ping.js +265 -0
  298. package/dist/heart/provider-readiness-cache.js +119 -0
  299. package/dist/heart/provider-visibility.js +188 -0
  300. package/dist/heart/providers/anthropic-token.js +131 -0
  301. package/dist/heart/providers/anthropic.js +173 -60
  302. package/dist/heart/providers/azure.js +23 -11
  303. package/dist/heart/providers/error-classification.js +129 -0
  304. package/dist/heart/providers/github-copilot.js +38 -39
  305. package/dist/heart/providers/minimax-vlm.js +189 -0
  306. package/dist/heart/providers/minimax.js +26 -8
  307. package/dist/heart/providers/openai-codex-token.js +349 -0
  308. package/dist/heart/providers/openai-codex.js +55 -40
  309. package/dist/heart/providers/openai-compatible.js +177 -0
  310. package/dist/heart/reply-style.js +52 -0
  311. package/dist/heart/run-ledger.js +247 -0
  312. package/dist/heart/runtime-capability-check.js +170 -0
  313. package/dist/heart/runtime-credentials.js +607 -0
  314. package/dist/heart/runtime-cwd.js +87 -0
  315. package/dist/heart/sense-truth.js +24 -4
  316. package/dist/heart/session-activity.js +92 -24
  317. package/dist/heart/session-events.js +1504 -0
  318. package/dist/heart/session-playback-cli-main.js +5 -0
  319. package/dist/heart/session-playback-cli.js +36 -0
  320. package/dist/heart/session-playback.js +231 -0
  321. package/dist/heart/session-redaction-repair-cli-main.js +31 -0
  322. package/dist/heart/session-redaction-repair.js +552 -0
  323. package/dist/heart/session-stats-cli-main.js +5 -0
  324. package/dist/heart/session-stats.js +183 -0
  325. package/dist/heart/session-transcript.js +133 -0
  326. package/dist/heart/shelf-claims.js +78 -0
  327. package/dist/heart/shepherd/custody-types.js +2 -0
  328. package/dist/heart/shepherd/mandates.js +352 -0
  329. package/dist/heart/shepherd/operation-commands.js +19 -0
  330. package/dist/heart/shepherd/operations.js +135 -0
  331. package/dist/heart/shepherd/supervision.js +114 -0
  332. package/dist/heart/shepherd/types.js +2 -0
  333. package/dist/heart/shepherd-config.js +113 -0
  334. package/dist/heart/source-grounding.js +297 -0
  335. package/dist/heart/start-of-turn-packet.js +372 -0
  336. package/dist/heart/steward-policy.js +656 -0
  337. package/dist/heart/streaming.js +631 -207
  338. package/dist/heart/structured-output.js +196 -0
  339. package/dist/heart/sync-classification.js +176 -0
  340. package/dist/heart/sync-health.js +152 -0
  341. package/dist/heart/sync.js +726 -0
  342. package/dist/heart/target-resolution.js +11 -7
  343. package/dist/heart/tempo.js +93 -0
  344. package/dist/heart/temporal-view.js +41 -0
  345. package/dist/heart/timeouts.js +101 -0
  346. package/dist/heart/tool-activity-callbacks.js +59 -0
  347. package/dist/heart/tool-approval.js +382 -0
  348. package/dist/heart/tool-description.js +155 -0
  349. package/dist/heart/tool-friction.js +55 -0
  350. package/dist/heart/tool-loop.js +206 -0
  351. package/dist/heart/turn-context.js +496 -0
  352. package/dist/heart/turn-execution-lease.js +30 -0
  353. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  354. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +3 -2
  355. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  356. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  357. package/dist/heart/versioning/ouro-version-manager.js +432 -0
  358. package/dist/heart/versioning/release-sources.js +173 -0
  359. package/dist/heart/versioning/self-update-defaults.js +294 -0
  360. package/dist/heart/versioning/self-update.js +196 -0
  361. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  362. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  363. package/dist/heart/versioning/update-hooks.js +154 -0
  364. package/dist/heart/versioning/update-state.js +126 -0
  365. package/dist/heart/versioning/updater-launchd.js +150 -0
  366. package/dist/heart/versioning/version-intent.js +114 -0
  367. package/dist/heart/work-card.js +380 -0
  368. package/dist/mailbox-ui/assets/index-Dbska1tZ.js +1 -0
  369. package/dist/mailbox-ui/assets/index-DsiKaPyH.css +1 -0
  370. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  371. package/dist/mailbox-ui/index.html +16 -0
  372. package/dist/mailroom/attention.js +167 -0
  373. package/dist/mailroom/autonomy.js +209 -0
  374. package/dist/mailroom/blob-store.js +889 -0
  375. package/dist/mailroom/body-cache.js +61 -0
  376. package/dist/mailroom/cache-sync-cli.js +58 -0
  377. package/dist/mailroom/core.js +803 -0
  378. package/dist/mailroom/entry.js +160 -0
  379. package/dist/mailroom/file-store.js +568 -0
  380. package/dist/mailroom/hosted-cache-sync.js +384 -0
  381. package/dist/mailroom/mbox-import.js +393 -0
  382. package/dist/mailroom/migration.js +164 -0
  383. package/dist/mailroom/outbound.js +380 -0
  384. package/dist/mailroom/policy.js +263 -0
  385. package/dist/mailroom/reader.js +292 -0
  386. package/dist/mailroom/search-cache.js +513 -0
  387. package/dist/mailroom/search-relevance.js +319 -0
  388. package/dist/mailroom/smtp-ingress.js +176 -0
  389. package/dist/mailroom/source-state.js +176 -0
  390. package/dist/mailroom/thread.js +109 -0
  391. package/dist/mailroom/travel-extract.js +89 -0
  392. package/dist/mind/bundle-manifest.js +24 -2
  393. package/dist/mind/context.js +307 -139
  394. package/dist/mind/desk-section.js +362 -0
  395. package/dist/mind/diary-integrity.js +60 -0
  396. package/dist/mind/{memory.js → diary.js} +68 -77
  397. package/dist/mind/embedding-provider.js +60 -0
  398. package/dist/mind/file-state.js +179 -0
  399. package/dist/mind/friend-link-codes.js +209 -0
  400. package/dist/mind/friend-merge.js +330 -0
  401. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  402. package/dist/mind/obligation-steering.js +199 -3
  403. package/dist/mind/pending.js +36 -10
  404. package/dist/mind/prompt-budget.js +479 -0
  405. package/dist/mind/prompt-refresh.js +3 -2
  406. package/dist/mind/prompt.js +1085 -198
  407. package/dist/mind/provenance-trust.js +26 -0
  408. package/dist/mind/record-paths.js +312 -0
  409. package/dist/mind/scrutiny.js +173 -0
  410. package/dist/mind/session-transaction.js +622 -0
  411. package/dist/nerves/cli-logging.js +7 -1
  412. package/dist/nerves/coverage/audit-rules.js +15 -6
  413. package/dist/nerves/coverage/audit.js +28 -2
  414. package/dist/nerves/coverage/cli.js +1 -1
  415. package/dist/nerves/coverage/contract.js +5 -5
  416. package/dist/nerves/coverage/file-completeness.js +143 -5
  417. package/dist/nerves/coverage/run-artifacts.js +55 -35
  418. package/dist/nerves/coverage/source-scanner.js +4 -4
  419. package/dist/nerves/event-buffer.js +111 -0
  420. package/dist/nerves/index.js +293 -9
  421. package/dist/nerves/observation.js +20 -0
  422. package/dist/nerves/redact.js +79 -0
  423. package/dist/nerves/review/cli-main.js +5 -0
  424. package/dist/nerves/review/cli.js +156 -0
  425. package/dist/nerves/review/core.js +159 -0
  426. package/dist/nerves/runtime.js +17 -1
  427. package/dist/repertoire/ado-client.js +15 -56
  428. package/dist/repertoire/ado-semantic.js +16 -10
  429. package/dist/repertoire/api-client.js +97 -0
  430. package/dist/repertoire/bitwarden-store.js +1201 -0
  431. package/dist/repertoire/bundle-templates.js +71 -0
  432. package/dist/repertoire/bw-installer.js +231 -0
  433. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  434. package/dist/repertoire/coding/context-pack.js +331 -0
  435. package/dist/repertoire/coding/feedback.js +174 -32
  436. package/dist/repertoire/coding/index.js +15 -3
  437. package/dist/repertoire/coding/manager.js +159 -10
  438. package/dist/repertoire/coding/spawner.js +40 -11
  439. package/dist/repertoire/coding/tools.js +182 -18
  440. package/dist/repertoire/coding/workbench-client.js +272 -0
  441. package/dist/repertoire/coding/workbench-manager.js +346 -0
  442. package/dist/repertoire/commerce-errors.js +109 -0
  443. package/dist/repertoire/commerce-self-test.js +156 -0
  444. package/dist/repertoire/credential-access.js +183 -0
  445. package/dist/repertoire/desk/classifier.js +362 -0
  446. package/dist/repertoire/duffel-client.js +185 -0
  447. package/dist/repertoire/github-client.js +14 -55
  448. package/dist/repertoire/graph-client.js +11 -52
  449. package/dist/repertoire/guardrails.js +971 -20
  450. package/dist/repertoire/house-sweep.js +469 -0
  451. package/dist/repertoire/mcp-client.js +58 -5
  452. package/dist/repertoire/mcp-manager.js +427 -139
  453. package/dist/repertoire/mcp-tools.js +132 -0
  454. package/dist/repertoire/mcp-write-guard.js +46 -0
  455. package/dist/repertoire/plugin-mcp.js +175 -0
  456. package/dist/repertoire/plugins.js +253 -0
  457. package/dist/repertoire/relationship-authorization.js +322 -0
  458. package/dist/repertoire/sanctuary-container-policy.js +46 -0
  459. package/dist/repertoire/shell-sessions.js +134 -0
  460. package/dist/repertoire/skills.js +48 -4
  461. package/dist/repertoire/stripe-client.js +131 -0
  462. package/dist/repertoire/tool-arguments.js +182 -0
  463. package/dist/repertoire/tool-results.js +29 -0
  464. package/dist/repertoire/tools-a2a.js +699 -0
  465. package/dist/repertoire/tools-attachments.js +322 -0
  466. package/dist/repertoire/tools-awaiting.js +872 -0
  467. package/dist/repertoire/tools-base.js +83 -1168
  468. package/dist/repertoire/tools-bluebubbles.js +2 -0
  469. package/dist/repertoire/tools-bridge.js +144 -0
  470. package/dist/repertoire/tools-bundle.js +995 -0
  471. package/dist/repertoire/tools-commerce.js +253 -0
  472. package/dist/repertoire/tools-config.js +186 -0
  473. package/dist/repertoire/tools-continuity.js +575 -0
  474. package/dist/repertoire/tools-credential.js +383 -0
  475. package/dist/repertoire/tools-escalation.js +84 -0
  476. package/dist/repertoire/tools-evolution.js +527 -0
  477. package/dist/repertoire/tools-files.js +344 -0
  478. package/dist/repertoire/tools-flight.js +290 -0
  479. package/dist/repertoire/tools-flow.js +119 -0
  480. package/dist/repertoire/tools-friend-link.js +57 -0
  481. package/dist/repertoire/tools-github.js +3 -8
  482. package/dist/repertoire/tools-habits.js +103 -0
  483. package/dist/repertoire/tools-house-care.js +174 -0
  484. package/dist/repertoire/tools-mail.js +1828 -0
  485. package/dist/repertoire/tools-notes.js +496 -0
  486. package/dist/repertoire/tools-obligations.js +182 -0
  487. package/dist/repertoire/tools-orientation.js +31 -0
  488. package/dist/repertoire/tools-record.js +482 -0
  489. package/dist/repertoire/tools-rsvp.js +139 -0
  490. package/dist/repertoire/tools-runtime.js +238 -0
  491. package/dist/repertoire/tools-sanctuary-host.js +202 -0
  492. package/dist/repertoire/tools-session.js +1133 -0
  493. package/dist/repertoire/tools-shell.js +154 -0
  494. package/dist/repertoire/tools-shepherd-guidance.js +171 -0
  495. package/dist/repertoire/tools-shepherd.js +296 -0
  496. package/dist/repertoire/tools-steward-policy.js +147 -0
  497. package/dist/repertoire/tools-stripe.js +224 -0
  498. package/dist/repertoire/tools-surface.js +369 -0
  499. package/dist/repertoire/tools-teams.js +50 -39
  500. package/dist/repertoire/tools-telegram-contacts.js +37 -0
  501. package/dist/repertoire/tools-travel.js +125 -0
  502. package/dist/repertoire/tools-trip.js +982 -0
  503. package/dist/repertoire/tools-unraid.js +556 -0
  504. package/dist/repertoire/tools-user-profile.js +146 -0
  505. package/dist/repertoire/tools-vault.js +40 -0
  506. package/dist/repertoire/tools-voice-local.js +198 -0
  507. package/dist/repertoire/tools-voice.js +145 -0
  508. package/dist/repertoire/tools.js +518 -156
  509. package/dist/repertoire/travel-api-client.js +360 -0
  510. package/dist/repertoire/unraid-client.js +155 -0
  511. package/dist/repertoire/unraid-restart.js +339 -0
  512. package/dist/repertoire/user-profile.js +131 -0
  513. package/dist/repertoire/vault-setup.js +246 -0
  514. package/dist/repertoire/vault-unlock.js +686 -0
  515. package/dist/rsvp/aisleplanner-client.js +354 -0
  516. package/dist/rsvp/cli.js +936 -0
  517. package/dist/rsvp/config.js +327 -0
  518. package/dist/rsvp/cutover.js +433 -0
  519. package/dist/rsvp/diagnostics.js +232 -0
  520. package/dist/rsvp/diff-renderer.js +176 -0
  521. package/dist/rsvp/habit-policy.js +110 -0
  522. package/dist/rsvp/habit-stage.js +123 -0
  523. package/dist/rsvp/incident-bundle.js +97 -0
  524. package/dist/rsvp/migration.js +204 -0
  525. package/dist/rsvp/native-habit-runner.js +630 -0
  526. package/dist/rsvp/outbound-state.js +628 -0
  527. package/dist/rsvp/query.js +118 -0
  528. package/dist/rsvp/replay.js +233 -0
  529. package/dist/rsvp/snapshot.js +232 -0
  530. package/dist/rsvp/spend-ledger.js +175 -0
  531. package/dist/scripts/claude-code-hook.js +41 -0
  532. package/dist/scripts/claude-code-stop-hook.js +47 -0
  533. package/dist/senses/a2a-entry.js +132 -0
  534. package/dist/senses/acp-server.js +386 -0
  535. package/dist/senses/attention-queue.js +186 -0
  536. package/dist/senses/await-turn-message.js +65 -0
  537. package/dist/senses/bluebubbles/active-turns.js +216 -0
  538. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  539. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  540. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +379 -41
  541. package/dist/senses/bluebubbles/context-packet.js +207 -0
  542. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  543. package/dist/senses/bluebubbles/entry.js +90 -0
  544. package/dist/senses/bluebubbles/host-account-verifier.js +88 -0
  545. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
  546. package/dist/senses/bluebubbles/index.js +3878 -0
  547. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  548. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  549. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
  550. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
  551. package/dist/senses/bluebubbles/outbound-state.js +308 -0
  552. package/dist/senses/bluebubbles/processed-log.js +133 -0
  553. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  554. package/dist/senses/bluebubbles/replay.js +284 -0
  555. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  556. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  557. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  558. package/dist/senses/bluebubbles/webhook-registration.js +257 -0
  559. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  560. package/dist/senses/cli/bracketed-paste.js +82 -0
  561. package/dist/senses/cli/image-paste.js +287 -0
  562. package/dist/senses/cli/image-ref-navigation.js +75 -0
  563. package/dist/senses/cli/ink-app.js +156 -0
  564. package/dist/senses/cli/inline-diff.js +64 -0
  565. package/dist/senses/cli/input-keys.js +174 -0
  566. package/dist/senses/cli/kill-ring.js +86 -0
  567. package/dist/senses/cli/message-list.js +51 -0
  568. package/dist/senses/cli/ouro-tui.js +607 -0
  569. package/dist/senses/cli/spinner-imperative.js +135 -0
  570. package/dist/senses/cli/spinner.js +101 -0
  571. package/dist/senses/cli/status-line.js +60 -0
  572. package/dist/senses/cli/streaming-markdown.js +526 -0
  573. package/dist/senses/cli/tool-display.js +85 -0
  574. package/dist/senses/cli/tool-render.js +85 -0
  575. package/dist/senses/cli/tui-store.js +241 -0
  576. package/dist/senses/cli/virtual-list.js +35 -0
  577. package/dist/senses/cli-entry.js +60 -8
  578. package/dist/senses/cli.js +601 -304
  579. package/dist/senses/commands.js +66 -3
  580. package/dist/senses/context-packet-ledger.js +371 -0
  581. package/dist/senses/context-packets.js +154 -0
  582. package/dist/senses/habit-lifecycle-guard.js +24 -0
  583. package/dist/senses/habit-turn-message.js +160 -0
  584. package/dist/senses/ingress-evidence.js +2 -0
  585. package/dist/senses/mail-entry.js +66 -0
  586. package/dist/senses/mail.js +524 -0
  587. package/dist/senses/pipeline.js +1158 -204
  588. package/dist/senses/private-runtime-worker.js +859 -0
  589. package/dist/senses/private-runtime.js +1627 -0
  590. package/dist/senses/proactive-content-guard.js +51 -0
  591. package/dist/senses/root-host-approval-port.js +345 -0
  592. package/dist/senses/root-host-approval-runtime.js +393 -0
  593. package/dist/senses/sanctuary-authority-resident.js +102 -0
  594. package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
  595. package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
  596. package/dist/senses/sanctuary-grounding.js +118 -0
  597. package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
  598. package/dist/senses/sanctuary-health-acceptance-probe.js +774 -0
  599. package/dist/senses/sanctuary-health-runner.js +104 -0
  600. package/dist/senses/sanctuary-health.js +422 -0
  601. package/dist/senses/sanctuary-install-state-contract.js +169 -0
  602. package/dist/senses/sanctuary-interactive-control.js +410 -0
  603. package/dist/senses/sanctuary-media-catalog-contract.js +259 -0
  604. package/dist/senses/sanctuary-media-optimization.js +514 -0
  605. package/dist/senses/sanctuary-runtime.js +369 -0
  606. package/dist/senses/sanctuary-sab.js +85 -0
  607. package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
  608. package/dist/senses/shared-turn.js +804 -0
  609. package/dist/senses/shepherd/agent-presentation.js +88 -0
  610. package/dist/senses/shepherd/attention-page.js +166 -0
  611. package/dist/senses/shepherd/attention-sidebar.js +76 -0
  612. package/dist/senses/shepherd/attention.js +295 -0
  613. package/dist/senses/shepherd/checkin-config.js +76 -0
  614. package/dist/senses/shepherd/checkin-store.js +386 -0
  615. package/dist/senses/shepherd/client.js +196 -0
  616. package/dist/senses/shepherd/cmux.js +483 -0
  617. package/dist/senses/shepherd/composer.js +336 -0
  618. package/dist/senses/shepherd/feedback-reply.js +108 -0
  619. package/dist/senses/shepherd/feedback-source.js +20 -0
  620. package/dist/senses/shepherd/feedback-store.js +331 -0
  621. package/dist/senses/shepherd/feedback-submit.js +182 -0
  622. package/dist/senses/shepherd/feedback-worker.js +207 -0
  623. package/dist/senses/shepherd/guidance.js +273 -0
  624. package/dist/senses/shepherd/herdr.js +427 -0
  625. package/dist/senses/shepherd/host.js +14 -0
  626. package/dist/senses/shepherd/judge-evaluation-command.js +183 -0
  627. package/dist/senses/shepherd/judge-evaluation-entry.js +13 -0
  628. package/dist/senses/shepherd/judge-evaluation.js +155 -0
  629. package/dist/senses/shepherd/judge.js +202 -0
  630. package/dist/senses/shepherd/notice-outbox.js +262 -0
  631. package/dist/senses/shepherd/observation-publisher.js +320 -0
  632. package/dist/senses/shepherd/operations-defaults.js +86 -0
  633. package/dist/senses/shepherd/operations.js +159 -0
  634. package/dist/senses/shepherd/owner-notice.js +379 -0
  635. package/dist/senses/shepherd/prompt-state.js +60 -0
  636. package/dist/senses/shepherd/recovery.js +543 -0
  637. package/dist/senses/shepherd/redact.js +66 -0
  638. package/dist/senses/shepherd/returns.js +79 -0
  639. package/dist/senses/shepherd/sense.js +814 -0
  640. package/dist/senses/shepherd/shepherd-judge-corpus-v1.json +167 -0
  641. package/dist/senses/shepherd/surface.js +123 -0
  642. package/dist/senses/shepherd/target-binding.js +13 -0
  643. package/dist/senses/shepherd/terminal-process.js +147 -0
  644. package/dist/senses/shepherd-entry.js +98 -0
  645. package/dist/senses/surface-tool.js +109 -0
  646. package/dist/senses/teams-entry.js +68 -8
  647. package/dist/senses/teams-image.js +119 -0
  648. package/dist/senses/teams.js +932 -337
  649. package/dist/senses/telegram-admission.js +718 -0
  650. package/dist/senses/telegram-approval-runtime.js +793 -0
  651. package/dist/senses/telegram-attachments.js +186 -0
  652. package/dist/senses/telegram-audit-ledger.js +220 -0
  653. package/dist/senses/telegram-authority-transport.js +231 -0
  654. package/dist/senses/telegram-client.js +1749 -0
  655. package/dist/senses/telegram-effect-adapter.js +900 -0
  656. package/dist/senses/telegram-entry.js +83 -0
  657. package/dist/senses/telegram-handoff.js +80 -0
  658. package/dist/senses/telegram.js +2405 -0
  659. package/dist/senses/trust-gate.js +104 -9
  660. package/dist/senses/voice/audio-playback.js +237 -0
  661. package/dist/senses/voice/audio-routing.js +119 -0
  662. package/dist/senses/voice/call-auth.js +250 -0
  663. package/dist/senses/voice/elevenlabs.js +202 -0
  664. package/dist/senses/voice/floor-control.js +431 -0
  665. package/dist/senses/voice/floor-controller.js +115 -0
  666. package/dist/senses/voice/golden-path.js +116 -0
  667. package/dist/senses/voice/index.js +29 -0
  668. package/dist/senses/voice/local-audio-control.js +344 -0
  669. package/dist/senses/voice/local-audio-devices.js +516 -0
  670. package/dist/senses/voice/local-audio-disclosure.js +174 -0
  671. package/dist/senses/voice/local-audio-identity.js +103 -0
  672. package/dist/senses/voice/local-audio-join.js +325 -0
  673. package/dist/senses/voice/local-audio-mute.js +199 -0
  674. package/dist/senses/voice/local-audio-notify.js +121 -0
  675. package/dist/senses/voice/local-audio-prompts.js +116 -0
  676. package/dist/senses/voice/local-audio-transport.js +427 -0
  677. package/dist/senses/voice/local-audio.js +281 -0
  678. package/dist/senses/voice/local-media-stream.js +145 -0
  679. package/dist/senses/voice/meeting.js +113 -0
  680. package/dist/senses/voice/outbound.js +190 -0
  681. package/dist/senses/voice/phone.js +33 -0
  682. package/dist/senses/voice/playback.js +139 -0
  683. package/dist/senses/voice/process-guards.js +51 -0
  684. package/dist/senses/voice/realtime-eval.js +496 -0
  685. package/dist/senses/voice/realtime-tool-schema.js +195 -0
  686. package/dist/senses/voice/realtime-trace.js +531 -0
  687. package/dist/senses/voice/transcript.js +70 -0
  688. package/dist/senses/voice/turn.js +191 -0
  689. package/dist/senses/voice/twilio-phone-runtime.js +836 -0
  690. package/dist/senses/voice/twilio-phone.js +5454 -0
  691. package/dist/senses/voice/types.js +2 -0
  692. package/dist/senses/voice/whisper.js +161 -0
  693. package/dist/senses/voice-entry.js +83 -0
  694. package/dist/senses/voice-realtime-eval-command.js +99 -0
  695. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  696. package/dist/senses/voice-twilio-entry.js +87 -0
  697. package/dist/trips/core.js +138 -0
  698. package/dist/trips/store.js +265 -0
  699. package/dist/util/frontmatter.js +69 -0
  700. package/npm-shrinkwrap.json +8034 -0
  701. package/package.json +75 -13
  702. package/skills/agent-commerce.md +113 -0
  703. package/skills/browser-navigation.md +117 -0
  704. package/skills/commerce-setup-guide.md +116 -0
  705. package/skills/commerce-setup.md +84 -0
  706. package/skills/configure-dev-tools.md +99 -0
  707. package/skills/travel-planning.md +138 -0
  708. package/dist/heart/daemon/auth-flow.js +0 -430
  709. package/dist/heart/daemon/ouro-path-installer.js +0 -260
  710. package/dist/heart/daemon/ouro-version-manager.js +0 -171
  711. package/dist/heart/daemon/update-hooks.js +0 -138
  712. package/dist/heart/obligations.js +0 -191
  713. package/dist/heart/safe-workspace.js +0 -362
  714. package/dist/heart/session-recall.js +0 -116
  715. package/dist/mind/friends/channel.js +0 -84
  716. package/dist/mind/friends/group-context.js +0 -144
  717. package/dist/mind/friends/resolver.js +0 -84
  718. package/dist/mind/friends/store-file.js +0 -190
  719. package/dist/mind/friends/store.js +0 -4
  720. package/dist/mind/friends/tokens.js +0 -26
  721. package/dist/mind/friends/trust-explanation.js +0 -74
  722. package/dist/mind/friends/types.js +0 -29
  723. package/dist/repertoire/tasks/board.js +0 -134
  724. package/dist/repertoire/tasks/index.js +0 -224
  725. package/dist/repertoire/tasks/lifecycle.js +0 -80
  726. package/dist/repertoire/tasks/middleware.js +0 -65
  727. package/dist/repertoire/tasks/parser.js +0 -173
  728. package/dist/repertoire/tasks/scanner.js +0 -132
  729. package/dist/repertoire/tasks/transitions.js +0 -144
  730. package/dist/senses/bluebubbles-entry.js +0 -13
  731. package/dist/senses/bluebubbles.js +0 -1181
  732. package/dist/senses/debug-activity.js +0 -154
  733. package/dist/senses/inner-dialog-worker.js +0 -90
  734. package/dist/senses/inner-dialog.js +0 -525
  735. package/subagents/README.md +0 -7
  736. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  737. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  738. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  739. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  740. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  741. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  742. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  743. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  744. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  745. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  746. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  747. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  748. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  749. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  750. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  751. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  752. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,154 @@
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: async (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 = await new Promise((resolve, reject) => {
88
+ const child = (0, child_process_1.exec)(a.command, { encoding: "utf-8", timeout }, (error, stdout, stderr) => {
89
+ if (error)
90
+ reject(Object.assign(error, { stdout, stderr }));
91
+ else
92
+ resolve(stdout);
93
+ });
94
+ child.stdin?.end();
95
+ });
96
+ if (destructivePatterns.length > 0) {
97
+ return `${output}\n\n--- destructive pattern detected: ${destructivePatterns.join(", ")} ---`;
98
+ }
99
+ return output;
100
+ },
101
+ summaryKeys: ["command"],
102
+ },
103
+ {
104
+ tool: {
105
+ type: "function",
106
+ function: {
107
+ name: "shell_status",
108
+ 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.",
109
+ parameters: {
110
+ type: "object",
111
+ properties: {
112
+ id: { type: "string", description: "Background shell process ID" },
113
+ },
114
+ },
115
+ },
116
+ },
117
+ handler: (a, ctx) => {
118
+ if (!a.id) {
119
+ return JSON.stringify((0, shell_sessions_1.listShellSessions)(shellOwner(ctx)));
120
+ }
121
+ const session = (0, shell_sessions_1.getShellSession)(a.id, shellOwner(ctx));
122
+ if (!session)
123
+ return `process not found: ${a.id}`;
124
+ return JSON.stringify(session);
125
+ },
126
+ summaryKeys: ["id"],
127
+ },
128
+ {
129
+ tool: {
130
+ type: "function",
131
+ function: {
132
+ name: "shell_tail",
133
+ 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.",
134
+ parameters: {
135
+ type: "object",
136
+ properties: {
137
+ id: { type: "string", description: "Background shell process ID" },
138
+ },
139
+ required: ["id"],
140
+ },
141
+ },
142
+ },
143
+ handler: (a, ctx) => {
144
+ /* v8 ignore next -- schema requires id, defensive guard @preserve */
145
+ if (!a.id)
146
+ return "id is required";
147
+ const output = (0, shell_sessions_1.tailShellSession)(a.id, shellOwner(ctx));
148
+ if (output === undefined)
149
+ return `process not found: ${a.id}`;
150
+ return output || "(no output yet)";
151
+ },
152
+ summaryKeys: ["id"],
153
+ },
154
+ ];
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.shepherdGuidanceToolDefinitions = void 0;
4
+ const runtime_credentials_1 = require("../heart/runtime-credentials");
5
+ const node_crypto_1 = require("node:crypto");
6
+ const shepherd_config_1 = require("../heart/shepherd-config");
7
+ const host_1 = require("../senses/shepherd/host");
8
+ const guidance_1 = require("../senses/shepherd/guidance");
9
+ const redact_1 = require("../senses/shepherd/redact");
10
+ const returns_1 = require("../senses/shepherd/returns");
11
+ const notice_outbox_1 = require("../senses/shepherd/notice-outbox");
12
+ const target_binding_1 = require("../senses/shepherd/target-binding");
13
+ const tools_base_1 = require("./tools-base");
14
+ const runtime_1 = require("../nerves/runtime");
15
+ const text = (value) => typeof value === "string" ? value.trim() : "";
16
+ const json = (value) => JSON.stringify(value, (_key, item) => typeof item === "string" ? (0, redact_1.redactSecrets)(item) : item);
17
+ const stringProperty = (description) => ({ type: "string", description });
18
+ const targetProperties = {
19
+ host: stringProperty("Host name from history, when known. Never invent a host."),
20
+ session: stringProperty("Stable session ID from history, or a live session ID/ref from shepherd_overview."),
21
+ };
22
+ const requestProperty = { request_id: stringProperty("Unique request ID for this human instruction. Reuse it only to retry the identical request.") };
23
+ function fingerprint(name, args) {
24
+ const body = JSON.stringify({ name, args }, (_key, value) => value !== null && typeof value === "object" && !Array.isArray(value)
25
+ ? Object.fromEntries(Object.entries(value).sort(([a], [b]) => a.localeCompare(b))) : value);
26
+ return (0, node_crypto_1.createHash)("sha256").update(body).digest("hex");
27
+ }
28
+ /**
29
+ * Resolve history without a terminal connection, including vanished sessions. Only a session with no history needs
30
+ * the existing machine connection primitives. Resolving it never reads a screen, signals, presses a key or sends.
31
+ */
32
+ async function targetFor(ctx, args) {
33
+ const session = text(args.session) || ctx.currentShepherdSurface?.id || "";
34
+ const hostName = text(args.host) || ctx.currentShepherdSurface?.host || "";
35
+ if (session)
36
+ (0, target_binding_1.assertBoundShepherdTarget)(ctx.currentShepherdSurface, session, hostName || undefined);
37
+ const records = (0, returns_1.readReturns)(ctx.agentRoot);
38
+ const returnId = text(args.return_id);
39
+ if (returnId) {
40
+ const record = records.find(r => (0, guidance_1.shepherdReturnId)(r) === returnId);
41
+ if (!record)
42
+ throw new Error("Shepherd return ID not found");
43
+ (0, target_binding_1.assertBoundShepherdTarget)(ctx.currentShepherdSurface, record.session, record.host);
44
+ if ((text(args.host) && text(args.host) !== record.host) || (text(args.session) && text(args.session) !== record.session))
45
+ throw new Error("target does not match the recorded return");
46
+ return { target: { host: record.host, session: record.session, cwd: record.cwd, task: record.task }, live: [] };
47
+ }
48
+ if (!session)
49
+ throw new Error("name a session from Shepherd history or overview");
50
+ const matching = records.filter(r => r.session === session && (!hostName || r.host === hostName));
51
+ if (new Set(matching.map(r => r.host)).size > 1)
52
+ throw new Error("session is ambiguous across hosts; name its host");
53
+ const record = matching.at(-1);
54
+ if (record) {
55
+ (0, target_binding_1.assertBoundShepherdTarget)(ctx.currentShepherdSurface, record.session, record.host);
56
+ return { target: { host: record.host, session, cwd: record.cwd, task: record.task }, live: [] };
57
+ }
58
+ const machine = (0, runtime_credentials_1.readMachineRuntimeCredentialConfig)(ctx.agentName);
59
+ const resolved = (0, shepherd_config_1.resolveShepherdConnection)(ctx.agentName, machine.ok ? machine.config : {});
60
+ if (!resolved.ok)
61
+ throw new Error(resolved.error);
62
+ const host = (0, host_1.createShepherdHost)(resolved.connection, { agentName: ctx.agentName });
63
+ const sessions = await host.list();
64
+ const live = sessions.map(s => ({ host: host.name, session: s.id, cwd: s.cwd ?? null, task: null }));
65
+ const found = sessions.find(s => s.id === session || s.ref === session);
66
+ if (!found || (hostName && hostName !== host.name))
67
+ throw new Error("unknown session on the configured Shepherd host");
68
+ (0, target_binding_1.assertBoundShepherdTarget)(ctx.currentShepherdSurface, found.id, host.name);
69
+ return { target: live.find(t => t.session === found.id), live };
70
+ }
71
+ function definition(name, description, properties, required, run, mutates = false) {
72
+ return {
73
+ tool: { type: "function", function: { name, description, parameters: { type: "object", properties, required, additionalProperties: false } } },
74
+ handler: async (args, ctx) => {
75
+ // Same real-family gate as shepherd_send, including rejection of the private runtime's family self.
76
+ const friend = ctx?.context?.friend;
77
+ if (!friend || friend.trustLevel !== "family" || !friend.id || friend.id === tools_base_1.SELF_FRIEND_ID)
78
+ return json({ error: "Shepherd private guidance is only for a real family member in this conversation" });
79
+ if (!ctx?.agentRoot || !ctx.agentName)
80
+ return json({ error: "Shepherd guidance needs an agent runtime" });
81
+ try {
82
+ const boundDefault = name === "shepherd_correct" && !text(args.session) && !text(args.return_id) && ctx.currentShepherdSurface;
83
+ const request = { actorId: friend.id, requestId: text(args.request_id), requestFingerprint: fingerprint(name, boundDefault ? { ...args, session: boundDefault.id, host: boundDefault.host } : args) };
84
+ if (mutates) {
85
+ const prior = (0, guidance_1.readGuidance)(ctx.agentRoot).requests.find(r => r.actorId === request.actorId && r.requestId === request.requestId);
86
+ if (prior) {
87
+ if (prior.requestFingerprint !== request.requestFingerprint)
88
+ throw new Error("request ID was already used with a different body");
89
+ return json(prior.receipt);
90
+ }
91
+ }
92
+ const result = await run(args, ctx, request);
93
+ (0, runtime_1.emitNervesEvent)({ component: "repertoire", event: "repertoire.shepherd_guidance_tool", message: "executed a private Shepherd guidance tool", meta: { tool: name, mutates } });
94
+ return json(result);
95
+ }
96
+ catch (error) {
97
+ const message = (0, redact_1.redactSecrets)(error instanceof Error ? error.message : String(error));
98
+ (0, runtime_1.emitNervesEvent)({ level: "warn", component: "repertoire", event: "repertoire.shepherd_guidance_tool_error", message: "private Shepherd guidance tool failed", meta: { tool: name, error: "private_guidance_operation_failed" } });
99
+ return json({ error: message });
100
+ }
101
+ },
102
+ summaryKeys: [],
103
+ riskProfile: mutates ? { mutates: "durable_state_write", risk: "high", reason: "changes private operator preferences or the automatic-reply pause" } : { mutates: "none", risk: "low" },
104
+ };
105
+ }
106
+ exports.shepherdGuidanceToolDefinitions = [
107
+ definition("shepherd_history", "Read private Shepherd return history with stable return IDs, actual judgment/reply/outcome and your own ownerNotice receipts when tracked. Historical, not current status; a vanished terminal remains readable. The session filter is a stable ID, not a short ref. Use to understand 'that was wrong because...' before correcting it, or to check whether a notice was sent. Use displayId as the human-facing return label; never invent a shortened ID suffix. Mutations require the exact full id, not displayId. ownerNotice.state sent means transport acceptance, not proof the human read it; pending awaits a safe retry; unknown may already have arrived and must not be blindly replayed. messageId is the activity ID returned by transport. ownerNotice null means no receipt recorded for this recipient, not proof of non-delivery. ownerNoticeError explicitly identifies unavailable receipt evidence. Never types into a terminal.", targetProperties, [], async (args, ctx, request) => {
108
+ const session = text(args.session) || ctx.currentShepherdSurface?.id;
109
+ const host = text(args.host) || ctx.currentShepherdSurface?.host;
110
+ if (session)
111
+ (0, target_binding_1.assertBoundShepherdTarget)(ctx.currentShepherdSurface, session, host);
112
+ const returns = (0, returns_1.readReturns)(ctx.agentRoot)
113
+ .filter(r => (!session || r.session === session) && (!host || r.host === host))
114
+ .map(record => {
115
+ const id = (0, guidance_1.shepherdReturnId)(record);
116
+ return { ...record, id, displayId: id.slice("return:".length, "return:".length + 8) };
117
+ });
118
+ try {
119
+ const notices = (0, notice_outbox_1.readNoticeOutbox)(ctx.agentRoot);
120
+ for (const record of returns) {
121
+ const notice = (0, notice_outbox_1.knownNotice)(ctx.agentRoot, (0, notice_outbox_1.noticeRecordId)(record), notices);
122
+ if (notice)
123
+ record.ownerNotice = Object.hasOwn(notice.deliveries, request.actorId) ? notice.deliveries[request.actorId] : null;
124
+ }
125
+ return { returns };
126
+ }
127
+ catch (error) {
128
+ const message = (0, redact_1.redactSecrets)(error instanceof Error ? error.message : String(error));
129
+ (0, runtime_1.emitNervesEvent)({ level: "warn", component: "repertoire", event: "repertoire.shepherd_notice_history_error", message: "owner notice receipt evidence is unavailable; return history remains readable", meta: { error: "notice_receipts_unavailable" } });
130
+ return { returns, ownerNoticeError: message };
131
+ }
132
+ }),
133
+ definition("shepherd_correct", "Record the human's post-action correction ('that was wrong because…') or prospective instruction. Optionally learn a principle for 'in future…'. A return_id must name a real history entry; omit it for a prospective instruction, never fabricate one. Session scope is the default; project is the exact recorded folder and optional task; global only when the human deliberately generalizes. Feedback <=2000 characters; principle <=1000; at most 20 active rules. This is not an approval gate and never sends anything. For requested immediate steering use existing shepherd_send.", {
134
+ ...targetProperties, ...requestProperty,
135
+ return_id: stringProperty("Real stable return ID from shepherd_history, if correcting an actual judgment."),
136
+ feedback: stringProperty("The human's explanation or prospective instruction, at most 2000 characters."),
137
+ principle: stringProperty("Optional scoped future preference, at most 1000 characters."),
138
+ scope: { type: "string", enum: ["session", "project", "global"], description: "Default session. Choose global only when the human expressed generalization." },
139
+ }, ["request_id", "feedback"], async (args, ctx, request) => {
140
+ const { target, live } = await targetFor(ctx, args);
141
+ return (0, guidance_1.recordShepherdCorrection)(ctx.agentRoot, {
142
+ ...request, target, feedback: typeof args.feedback === "string" ? args.feedback : "",
143
+ ...(args.return_id !== undefined ? { returnId: text(args.return_id) } : {}),
144
+ ...(args.principle !== undefined ? { principle: typeof args.principle === "string" ? args.principle : "" } : {}),
145
+ ...(args.scope !== undefined ? { scope: args.scope } : {}),
146
+ }, live);
147
+ }, true),
148
+ definition("shepherd_guidance", "Inspect what Shepherd learned ('what did you learn?'). With a session, returns revision, pause and applicable active principles with IDs, scopes and operator provenance. Omit session to inspect all active principles and pauses, including their exact targets. No send.", targetProperties, [], async (args, ctx) => {
149
+ if (args.session === undefined && !ctx.currentShepherdSurface) {
150
+ const state = (0, guidance_1.readGuidance)(ctx.agentRoot);
151
+ return { revision: state.revision, principles: state.principles.filter(p => p.active), pauses: state.pauses.filter(p => p.paused) };
152
+ }
153
+ const { target } = await targetFor(ctx, args);
154
+ return (0, guidance_1.applicableGuidance)((0, guidance_1.readGuidance)(ctx.agentRoot), target);
155
+ }),
156
+ definition("shepherd_update_principle", "Change a learned preference ('change that') by its principle ID. Keeps its existing scope, never silently generalizes it. No send.", {
157
+ ...requestProperty, principle_id: stringProperty("Active principle ID from shepherd_guidance."), text: stringProperty("Replacement preference, nonempty and at most 1000 characters."),
158
+ }, ["request_id", "principle_id", "text"], async (args, ctx, request) => (0, guidance_1.updateShepherdPrinciple)(ctx.agentRoot, {
159
+ ...request, principleId: text(args.principle_id), text: typeof args.text === "string" ? args.text : "",
160
+ }), true),
161
+ definition("shepherd_forget_principle", "Forget a learned preference ('forget that') by its ID. Removes only that preference from future judgments but retains the private operator trail. Built-in judgment policy, including legitimate outside dependency waits, and all existing guards remain unchanged: forgetting does not make dependency waits premature or delivered done. No send.", {
162
+ ...requestProperty, principle_id: stringProperty("Active principle ID from shepherd_guidance."),
163
+ }, ["request_id", "principle_id"], async (args, ctx, request) => (0, guidance_1.forgetShepherdPrinciple)(ctx.agentRoot, {
164
+ ...request, principleId: text(args.principle_id),
165
+ }), true),
166
+ ...["pause", "resume"].map(action => definition(`shepherd_${action}`, action === "pause" ? "Leave this one alone: pause automatic Shepherd replies for this session only, durably. Independent judgment/owner notices remain. Never interrupts or types into the terminal."
167
+ : "Resume automatic Shepherd replies for this paused session. All focus, screen, syntax and loop guards still apply; resume is not an immediate send.", { ...targetProperties, ...requestProperty }, ["session", "request_id"], async (args, ctx, request) => {
168
+ const { target, live } = await targetFor(ctx, args);
169
+ return (0, guidance_1.setShepherdSessionPause)(ctx.agentRoot, { ...request, target, paused: action === "pause" }, live);
170
+ }, true)),
171
+ ];
@@ -0,0 +1,296 @@
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.shepherdSendToolDefinition = exports.shepherdSignalToolDefinition = exports.shepherdReadToolDefinition = exports.shepherdOverviewToolDefinition = exports.SEND_KEYS = exports.SEND_TEXT_MAX_CHARS = 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
+ const tools_base_1 = require("./tools-base");
47
+ const tools_shepherd_guidance_1 = require("./tools-shepherd-guidance");
48
+ const guidance_1 = require("../senses/shepherd/guidance");
49
+ const target_binding_1 = require("../senses/shepherd/target-binding");
50
+ const agent_presentation_1 = require("../senses/shepherd/agent-presentation");
51
+ /**
52
+ * Shepherd's tools: every coding-agent session on this machine's terminal host with a current screen
53
+ * and what Shepherd last decided about it (`shepherd_overview`), a deeper read (`shepherd_read`), a status
54
+ * line or notification for the human (`shepherd_signal`), and a line or key typed for the human
55
+ * who asked for it (`shepherd_send`).
56
+ */
57
+ const STATUS_MAX_CHARS = 120;
58
+ const READ_MAX_CHARS = 16_000;
59
+ const OVERVIEW_READ_LINES = 80;
60
+ const OVERVIEW_SCREEN_MAX_CHARS = 4_000;
61
+ const OVERVIEW_TOTAL_SCREEN_MAX_CHARS = 64_000;
62
+ exports.SEND_TEXT_MAX_CHARS = 2_000;
63
+ exports.SEND_KEYS = ["enter", "escape", "up", "down", "tab", "ctrl-c", "1", "2", "3", "4", "5", "6", "7", "8", "9", "y", "n"];
64
+ /** Keys that can approve or choose something on a prompt: pressed only on the screen the caller last read. */
65
+ const CHOOSING_KEYS = new Set(["enter", "tab", "1", "2", "3", "4", "5", "6", "7", "8", "9", "y", "n"]);
66
+ function text(value) {
67
+ return typeof value === "string" ? value : "";
68
+ }
69
+ function shepherdToolsEnabled(agentRoot) {
70
+ if (!agentRoot)
71
+ return false;
72
+ try {
73
+ const config = JSON.parse(fs.readFileSync(path.join(agentRoot, "agent.json"), "utf-8"));
74
+ return config.senses?.shepherd?.enabled === true;
75
+ }
76
+ catch {
77
+ return false;
78
+ }
79
+ }
80
+ function hostFor(agentName) {
81
+ const machine = (0, runtime_credentials_1.readMachineRuntimeCredentialConfig)(agentName);
82
+ const resolved = (0, shepherd_config_1.resolveShepherdConnection)(agentName, machine.ok ? machine.config : {});
83
+ return resolved.ok ? (0, host_1.createShepherdHost)(resolved.connection, { agentName }) : resolved.error;
84
+ }
85
+ async function withHost(tool, ctx, run) {
86
+ if (!ctx?.agentName || !ctx.agentRoot)
87
+ return JSON.stringify({ error: "the Shepherd tools need an agent runtime" });
88
+ const host = hostFor(ctx.agentName);
89
+ if (typeof host === "string")
90
+ return JSON.stringify({ error: host });
91
+ try {
92
+ if (ctx.currentShepherdSurface) {
93
+ const bound = ctx.currentShepherdSurface;
94
+ (0, target_binding_1.assertBoundShepherdTarget)(bound, bound.id, host.name);
95
+ if (!(await host.list()).some(session => session.id === bound.id))
96
+ throw new Error(`bound terminal ${bound.id} is gone; nothing was read or sent`);
97
+ }
98
+ const result = await run(host);
99
+ (0, runtime_1.emitNervesEvent)({ component: "repertoire", event: "repertoire.shepherd_tool", message: "ran a Shepherd tool", meta: { tool } });
100
+ return JSON.stringify(result);
101
+ }
102
+ catch (error) {
103
+ (0, runtime_1.emitNervesEvent)({ level: "warn", component: "repertoire", event: "repertoire.shepherd_tool_error", message: "Shepherd tool call failed", meta: { tool, error: error.message } });
104
+ return JSON.stringify({ error: error.message });
105
+ }
106
+ }
107
+ async function currentScreen(host, session, maxChars) {
108
+ try {
109
+ const raw = await host.read(session, OVERVIEW_READ_LINES);
110
+ // Frame glyphs and padded empty rows otherwise crowd actual work out of a multi-terminal snapshot.
111
+ const content = (0, redact_1.redactSecrets)(raw).split("\n")
112
+ .map(line => line.replace(/[\u2500-\u259f]/g, "").trimEnd())
113
+ .filter(line => line.trim().length > 0).join("\n");
114
+ return { at: new Date().toISOString(), text: content.slice(Math.max(0, content.length - maxChars)), truncated: content.length > maxChars };
115
+ }
116
+ catch (error) {
117
+ const message = (0, redact_1.redactSecrets)(error instanceof Error ? error.message : String(error));
118
+ (0, runtime_1.emitNervesEvent)({ level: "warn", component: "repertoire", event: "repertoire.shepherd_overview_read_error", message: "could not read one terminal in the live Shepherd overview", meta: { session, error: message } });
119
+ return { at: new Date().toISOString(), error: message };
120
+ }
121
+ }
122
+ exports.shepherdOverviewToolDefinition = {
123
+ tool: {
124
+ type: "function",
125
+ function: {
126
+ name: "shepherd_overview",
127
+ description: "A live, read-only snapshot of every terminal on this machine's host (cmux): agent, folder, workspace and tab, plus a freshly read, redacted, bounded currentScreen with its observation time. Use currentScreen to answer what agents are doing now in one reply; lastReturn is historical and must not be presented as current status. Include every listed terminal exactly once with its complete ref (surface:12), including plain shells and supervisor composers; never omit a row or abbreviate subsequent refs to bare numbers. terminalCount is authoritative; derive disjoint category counts from those same rows. Classify activity as working, needs human, waiting on outside dependency, idle/local work finished, shell, or unknown. An idle prompt does not establish delivered work: do not use a generic Done bucket for locally finished work that still needs review, approval, merge, publication, deployment or verification. State those remaining steps inline. An agent explicitly reporting an outside reviewer wait belongs under waiting even when its prompt is idle; that is neither premature completion nor a request for routine continuation. A currentScreen.error explicitly identifies a terminal that could not be read; explain it inline with the other sessions, not by asking for another turn. For deeper details use shepherd_read. Historical lastReturn includes the prior judgment time, kind, action and reason.",
128
+ parameters: { type: "object", properties: {}, additionalProperties: false },
129
+ },
130
+ },
131
+ handler: (_args, ctx) => withHost("shepherd_overview", ctx, async (host) => {
132
+ const last = new Map();
133
+ for (const record of (0, returns_1.readReturns)(ctx.agentRoot))
134
+ last.set(record.session, record);
135
+ const sessions = await host.list();
136
+ const screenLimit = Math.min(OVERVIEW_SCREEN_MAX_CHARS, Math.floor(OVERVIEW_TOTAL_SCREEN_MAX_CHARS / Math.max(1, sessions.length)));
137
+ return {
138
+ host: host.name,
139
+ terminalCount: sessions.length,
140
+ sessions: await Promise.all(sessions.map(async (session) => {
141
+ const record = last.get(session.id);
142
+ return { ...session, currentScreen: await currentScreen(host, session.id, screenLimit), ...(record ? { lastReturn: { id: (0, guidance_1.shepherdReturnId)(record), at: record.at, kind: record.kind, action: record.action, reason: record.reason, reply: record.reply, task: record.task } } : {}) };
143
+ })),
144
+ };
145
+ }),
146
+ summaryKeys: [],
147
+ riskProfile: { mutates: "none", risk: "low" },
148
+ };
149
+ function boundedLines(value) {
150
+ const parsed = typeof value === "number" ? value : Number.parseInt(text(value), 10);
151
+ return Number.isFinite(parsed) ? Math.min(400, Math.max(1, Math.trunc(parsed))) : 60;
152
+ }
153
+ exports.shepherdReadToolDefinition = {
154
+ tool: {
155
+ type: "function",
156
+ function: {
157
+ name: "shepherd_read",
158
+ 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. It also returns screen, a fingerprint of what the terminal shows now, for shepherd_send.",
159
+ parameters: {
160
+ type: "object",
161
+ properties: {
162
+ session: { type: "string", description: "Session id or ref (surface:12) from shepherd_overview." },
163
+ lines: { type: "number", description: "How many lines, 1-400. Default 60." },
164
+ },
165
+ required: ["session"],
166
+ additionalProperties: false,
167
+ },
168
+ },
169
+ },
170
+ handler: (args, ctx) => {
171
+ const session = text(args.session).trim();
172
+ if (!session)
173
+ return Promise.resolve(JSON.stringify({ error: "name a session id or ref from shepherd_overview" }));
174
+ return withHost("shepherd_read", ctx, async (host) => {
175
+ (0, target_binding_1.assertBoundShepherdTarget)(ctx?.currentShepherdSurface, session, host.name);
176
+ const lines = boundedLines(args.lines);
177
+ // A fingerprint needs enough lines to match the one shepherd_send takes, whatever the caller asked to see.
178
+ const raw = await host.read(session, Math.max(lines, redact_1.FINGERPRINT_READ_LINES));
179
+ const screen = (0, redact_1.redactSecrets)(raw).replace(/\n$/, "").split("\n").slice(-lines).join("\n");
180
+ return { session, text: screen.slice(-READ_MAX_CHARS), truncated: screen.length > READ_MAX_CHARS, screen: (0, redact_1.screenFingerprint)(raw) };
181
+ });
182
+ },
183
+ summaryKeys: ["session"],
184
+ riskProfile: { mutates: "none", risk: "low" },
185
+ };
186
+ exports.shepherdSignalToolDefinition = {
187
+ tool: {
188
+ type: "function",
189
+ function: {
190
+ name: "shepherd_signal",
191
+ 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.`,
192
+ parameters: {
193
+ type: "object",
194
+ properties: {
195
+ session: { type: "string", description: "Session id or ref from shepherd_overview." },
196
+ status: { type: "string", description: "One line for the status, or an empty string to clear it." },
197
+ notify_title: { type: "string", description: "Desktop notification title." },
198
+ notify_body: { type: "string", description: "Desktop notification body." },
199
+ },
200
+ required: ["session", "status"],
201
+ additionalProperties: false,
202
+ },
203
+ },
204
+ },
205
+ handler: (args, ctx) => {
206
+ const session = text(args.session).trim();
207
+ const status = text(args.status).trim();
208
+ const title = text(args.notify_title).trim();
209
+ if (!session)
210
+ return Promise.resolve(JSON.stringify({ error: "name a session id or ref from shepherd_overview" }));
211
+ if (status.length > STATUS_MAX_CHARS || /[\r\n]/.test(status))
212
+ return Promise.resolve(JSON.stringify({ error: `status must be one line of at most ${STATUS_MAX_CHARS} characters` }));
213
+ return withHost("shepherd_signal", ctx, async (host) => {
214
+ (0, target_binding_1.assertBoundShepherdTarget)(ctx?.currentShepherdSurface, session, host.name);
215
+ await host.signal(session, status || null, title ? { title, body: text(args.notify_body) } : undefined);
216
+ return { session, status: status ? "set" : "cleared", notified: !!title };
217
+ });
218
+ },
219
+ summaryKeys: ["session", "status"],
220
+ riskProfile: { mutates: "external_side_effect", risk: "high", reason: "changes what the terminal host shows the human (a status line or a desktop notification)" },
221
+ };
222
+ function refused(reason, meta) {
223
+ (0, runtime_1.emitNervesEvent)({ level: "warn", component: "repertoire", event: "repertoire.shepherd_send_refused", message: "refused to type into a terminal", meta: { ...meta, reason } });
224
+ return { error: reason };
225
+ }
226
+ exports.shepherdSendToolDefinition = {
227
+ tool: {
228
+ type: "function",
229
+ function: {
230
+ name: "shepherd_send",
231
+ description: `Type into one coding agent's terminal on this machine for the human you are talking with, because they asked you to. Use it only to deliver that human's own instruction or keypress ("tell it to run the tests", "approve that", "stop it"): never on your own initiative, and never for anyone else. Give exactly one of text or key. text is one line (at most ${exports.SEND_TEXT_MAX_CHARS} characters, no control characters), typed as "[<your configured name> for <their name>] <text>" and submitted with Enter. key is pressed alone: one of ${exports.SEND_KEYS.join(", ")} (a menu or permission prompt, escape to interrupt, ctrl-c to cancel). enter, tab, a digit, y and n can approve or choose on a prompt, so they need screen from a shepherd_read made just before, and nothing is sent if the terminal changed since; tell the human what a prompt asks before approving it unless they have seen it. Pass screen with text too when the text answers what is on screen. To interrupt and then instruct, send escape, read again, then send the text. It also types into the terminal the human has focused on this machine.`,
232
+ parameters: {
233
+ type: "object",
234
+ properties: {
235
+ session: { type: "string", description: "Session id or ref (surface:12) from shepherd_overview." },
236
+ text: { type: "string", description: "The human's instruction, one line. Sent with [<your configured name> for <their name>] and Enter." },
237
+ key: { type: "string", enum: [...exports.SEND_KEYS], description: "One key to press instead of text." },
238
+ screen: { type: "string", description: "The screen fingerprint from the shepherd_read just before. Required for enter, tab, a digit, y and n." },
239
+ },
240
+ required: ["session"],
241
+ additionalProperties: false,
242
+ },
243
+ },
244
+ },
245
+ handler: (args, ctx) => {
246
+ const session = text(args.session).trim();
247
+ const line = text(args.text).trim();
248
+ const key = text(args.key).trim().toLowerCase();
249
+ const seen = text(args.screen).trim();
250
+ const friend = ctx?.context?.friend;
251
+ const meta = { session, chars: line.length, key: key || null, friendId: friend?.id ?? null };
252
+ const refuse = (reason) => Promise.resolve(JSON.stringify(refused(reason, meta)));
253
+ // The private runtime talks to itself as a family "friend"; only a real family member's request may type.
254
+ if (!friend || friend.trustLevel !== "family" || friend.id === tools_base_1.SELF_FRIEND_ID)
255
+ return refuse("shepherd_send types only for a family member who asked for it in this conversation");
256
+ if (!session)
257
+ return refuse("name a session id or ref from shepherd_overview");
258
+ if (!line === !key)
259
+ return refuse("give exactly one of text or key");
260
+ if (key && !exports.SEND_KEYS.includes(key))
261
+ return refuse(`key must be one of ${exports.SEND_KEYS.join(", ")}`);
262
+ if (line.length > exports.SEND_TEXT_MAX_CHARS)
263
+ return refuse(`text must be at most ${exports.SEND_TEXT_MAX_CHARS} characters`);
264
+ if (/[\p{Cc}\u2028\u2029]/u.test(line))
265
+ return refuse("text must be one line with no control characters; press enter, escape or ctrl-c with key");
266
+ if (CHOOSING_KEYS.has(key) && !seen)
267
+ return refuse(`${key} can approve or choose on a prompt, so pass screen from a shepherd_read made just before`);
268
+ return withHost("shepherd_send", ctx, async (host) => {
269
+ (0, target_binding_1.assertBoundShepherdTarget)(ctx?.currentShepherdSurface, session, host.name);
270
+ const target = (await host.list()).find((entry) => entry.id === session || entry.ref === session);
271
+ if (!target)
272
+ return refused(`session ${session} is gone; check shepherd_overview`, meta);
273
+ // Read again right before typing, as Shepherd does before its own answers: a gone or changed screen gets nothing.
274
+ const now = (0, redact_1.screenFingerprint)(await host.read(target.id, redact_1.FINGERPRINT_READ_LINES));
275
+ if (seen && seen !== now)
276
+ return refused("the terminal changed since it was read, so nothing was sent; read it again", meta);
277
+ const typed = key ? null : `[${(0, agent_presentation_1.readAgentPresentation)(ctx.agentName, ctx.agentRoot).name} for ${friend.name}] ${line}`;
278
+ if (key)
279
+ await host.key(target.id, key);
280
+ else
281
+ await host.prompt(target.id, typed);
282
+ (0, runtime_1.emitNervesEvent)({
283
+ component: "repertoire",
284
+ event: "repertoire.shepherd_send",
285
+ message: "typed into a terminal for a family member",
286
+ meta: { ...meta, session: target.id, ref: target.ref, agent: target.agent, focused: target.focused, screenChecked: !!seen },
287
+ });
288
+ // The status line shows the human at the machine who typed; it is best effort, the send already happened.
289
+ await host.signal(target.id, `sent for ${friend.name}`.slice(0, STATUS_MAX_CHARS)).catch(() => undefined);
290
+ return { session: target.ref, sent: key ? { key } : { text: typed }, focused: target.focused };
291
+ });
292
+ },
293
+ summaryKeys: ["session", "key"],
294
+ riskProfile: { mutates: "external_side_effect", risk: "high", reason: "types into a coding agent's terminal for the human, which can answer or approve its prompts" },
295
+ };
296
+ exports.shepherdToolDefinitions = [exports.shepherdOverviewToolDefinition, exports.shepherdReadToolDefinition, exports.shepherdSignalToolDefinition, exports.shepherdSendToolDefinition, ...tools_shepherd_guidance_1.shepherdGuidanceToolDefinitions];