@ouro.bot/cli 0.1.0-alpha.99 → 0.1.0-alpha.991

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 (777) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +171 -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 +6257 -16
  16. package/deploy/unraid/Dockerfile +71 -0
  17. package/deploy/unraid/INSTALL.md +64 -0
  18. package/deploy/unraid/README.txt +3032 -0
  19. package/deploy/unraid/audit-container-spec.sh +4 -0
  20. package/deploy/unraid/container-runtime.json +1 -0
  21. package/deploy/unraid/credit-gateway.md +95 -0
  22. package/deploy/unraid/docker-man-template-transaction.mjs +727 -0
  23. package/deploy/unraid/docker-man-template-xml.cjs +105 -0
  24. package/deploy/unraid/github_known_hosts +3 -0
  25. package/deploy/unraid/install.sh +274 -0
  26. package/deploy/unraid/migrate-sanctuary-bundle.mjs +63 -0
  27. package/deploy/unraid/ouro-events/bootstrap-spool.sh +92 -0
  28. package/deploy/unraid/ouro-events/emit-event.mjs +310 -0
  29. package/deploy/unraid/ouro-events/emit-usenet-event.sh +54 -0
  30. package/deploy/unraid/ouro-events/install-usenet-guard.sh +435 -0
  31. package/deploy/unraid/ouro-events/usenet-health.sh +176 -0
  32. package/deploy/unraid/ouro-sync-ssh +98 -0
  33. package/deploy/unraid/ouro-sync.sudoers +3 -0
  34. package/deploy/unraid/sanctuary-acceptance-adapter.sh +43 -0
  35. package/deploy/unraid/sanctuary-acceptance-contract.json +198 -0
  36. package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
  37. package/deploy/unraid/sanctuary-authority-installation.json +36 -0
  38. package/deploy/unraid/sanctuary-authority-service.sh +30 -0
  39. package/deploy/unraid/sanctuary-butler-upgrade.mjs +1523 -0
  40. package/deploy/unraid/sanctuary-deployment-target.mjs +710 -0
  41. package/deploy/unraid/sanctuary-replay-gate.mjs +2467 -0
  42. package/deploy/unraid/sanctuary-safe-rename.py +24 -0
  43. package/deploy/unraid/sanctuary-sync-cutover.sh +1039 -0
  44. package/deploy/unraid/sanctuary-unit16-host-broker.mjs +2088 -0
  45. package/deploy/unraid/sanctuary-unit16-run.sh +570 -0
  46. package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
  47. package/deploy/unraid/sanctuary.ouro/agent.json +67 -0
  48. package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
  49. package/deploy/unraid/sanctuary.ouro/awaiting/house-care-sweep.md +17 -0
  50. package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
  51. package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
  52. package/deploy/unraid/sanctuary.ouro/mcp/media-mcp.mjs +2255 -0
  53. package/deploy/unraid/sanctuary.ouro/product/PRODUCT.md +13 -0
  54. package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
  55. package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
  56. package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +7 -0
  57. package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +7 -0
  58. package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +15 -0
  59. package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +3 -0
  60. package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
  61. package/deploy/unraid/sanctuary.ouro/tool-profiles.json +234 -0
  62. package/deploy/unraid/sanctuary.xml +30 -0
  63. package/dist/a2a/card.js +57 -0
  64. package/dist/a2a/client.js +290 -0
  65. package/dist/a2a/config.js +50 -0
  66. package/dist/a2a/delegated-command-grants.js +93 -0
  67. package/dist/a2a/delegated-command.js +197 -0
  68. package/dist/a2a/delegation-stores.js +56 -0
  69. package/dist/a2a/did-resolution.js +205 -0
  70. package/dist/a2a/escalation-grants.js +84 -0
  71. package/dist/a2a/escalation-wiring.js +60 -0
  72. package/dist/a2a/identity.js +258 -0
  73. package/dist/a2a/inbound-share.js +131 -0
  74. package/dist/a2a/mission-result-wire.js +265 -0
  75. package/dist/a2a/onboarding.js +133 -0
  76. package/dist/a2a/operator-trust.js +399 -0
  77. package/dist/a2a/outbox-client.js +59 -0
  78. package/dist/a2a/outbox-store.js +188 -0
  79. package/dist/a2a/outbox-wire.js +106 -0
  80. package/dist/a2a/pin-store.js +167 -0
  81. package/dist/a2a/refusals.js +53 -0
  82. package/dist/a2a/relay-client.js +106 -0
  83. package/dist/a2a/relay-config-vault.js +64 -0
  84. package/dist/a2a/relay-contacts.js +120 -0
  85. package/dist/a2a/relay-inbox.js +360 -0
  86. package/dist/a2a/relay-retirements.js +89 -0
  87. package/dist/a2a/replay-grant-holders.js +33 -0
  88. package/dist/a2a/replay-harness.js +188 -0
  89. package/dist/a2a/resolution-proof.js +53 -0
  90. package/dist/a2a/sealed-chat.js +114 -0
  91. package/dist/a2a/seen-ledger.js +214 -0
  92. package/dist/a2a/server.js +808 -0
  93. package/dist/a2a/task-store.js +69 -0
  94. package/dist/a2a/transport.js +100 -0
  95. package/dist/a2a/trust-commands.js +203 -0
  96. package/dist/a2a/trusted-files.js +185 -0
  97. package/dist/a2a/types.js +3 -0
  98. package/dist/arc/attention-types.js +8 -0
  99. package/dist/arc/cares.js +360 -0
  100. package/dist/arc/episodes.js +118 -0
  101. package/dist/arc/evolution.js +490 -0
  102. package/dist/arc/flight-recorder.js +1034 -0
  103. package/dist/arc/intentions.js +134 -0
  104. package/dist/arc/json-store.js +117 -0
  105. package/dist/arc/obligations.js +386 -0
  106. package/dist/arc/packets.js +336 -0
  107. package/dist/arc/presence.js +185 -0
  108. package/dist/arc/task-lifecycle.js +57 -0
  109. package/dist/commerce/store.js +755 -0
  110. package/dist/commerce/types.js +3 -0
  111. package/dist/gateway/keys.js +117 -0
  112. package/dist/gateway/server.js +429 -0
  113. package/dist/heart/active-work.js +798 -40
  114. package/dist/heart/agent-entry.js +252 -3
  115. package/dist/heart/approval-files.js +113 -0
  116. package/dist/heart/approval-store.js +960 -0
  117. package/dist/heart/attachments/image-normalize.js +201 -0
  118. package/dist/heart/attachments/materialize.js +97 -0
  119. package/dist/heart/attachments/originals.js +88 -0
  120. package/dist/heart/attachments/render.js +29 -0
  121. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  122. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  123. package/dist/heart/attachments/sources/index.js +18 -0
  124. package/dist/heart/attachments/sources/telegram.js +71 -0
  125. package/dist/heart/attachments/store.js +132 -0
  126. package/dist/heart/attachments/types.js +93 -0
  127. package/dist/heart/auth/auth-flow.js +511 -0
  128. package/dist/heart/autonomy-budget.js +478 -0
  129. package/dist/heart/awaiting/a2a-await-delivery.js +109 -0
  130. package/dist/heart/awaiting/await-alert.js +152 -0
  131. package/dist/heart/awaiting/await-expiry.js +143 -0
  132. package/dist/heart/awaiting/await-loader.js +91 -0
  133. package/dist/heart/awaiting/await-parser.js +152 -0
  134. package/dist/heart/awaiting/await-runtime-state.js +130 -0
  135. package/dist/heart/awaiting/await-scheduler.js +391 -0
  136. package/dist/heart/background-operations.js +281 -0
  137. package/dist/heart/bluebubbles-host-account.js +78 -0
  138. package/dist/heart/bridges/manager.js +137 -17
  139. package/dist/heart/bridges/store.js +14 -2
  140. package/dist/heart/bundle-state.js +168 -0
  141. package/dist/heart/commitments.js +44 -18
  142. package/dist/heart/config-registry.js +331 -0
  143. package/dist/heart/config.js +179 -131
  144. package/dist/heart/context-loss-gauntlet.js +387 -0
  145. package/dist/heart/context-loss-sentinel.js +1204 -0
  146. package/dist/heart/core.js +2378 -586
  147. package/dist/heart/cross-chat-delivery.js +9 -22
  148. package/dist/heart/daemon/agent-config-check.js +474 -0
  149. package/dist/heart/daemon/agent-discovery.js +287 -3
  150. package/dist/heart/daemon/agent-home.js +355 -0
  151. package/dist/heart/daemon/agent-service.js +542 -0
  152. package/dist/heart/daemon/agentic-repair.js +547 -0
  153. package/dist/heart/daemon/await-private-wake.js +59 -0
  154. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  155. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  156. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  157. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  158. package/dist/heart/daemon/boot-sync-probe.js +223 -0
  159. package/dist/heart/daemon/cadence.js +180 -0
  160. package/dist/heart/daemon/cli-arg-redaction.js +26 -0
  161. package/dist/heart/daemon/cli-defaults.js +881 -0
  162. package/dist/heart/daemon/cli-desk.js +331 -0
  163. package/dist/heart/daemon/cli-exec.js +9339 -0
  164. package/dist/heart/daemon/cli-help.js +766 -0
  165. package/dist/heart/daemon/cli-parse.js +3343 -0
  166. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  167. package/dist/heart/daemon/cli-render.js +819 -0
  168. package/dist/heart/daemon/cli-types.js +8 -0
  169. package/dist/heart/daemon/connect-bay.js +323 -0
  170. package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
  171. package/dist/heart/daemon/container-healthcheck.js +112 -0
  172. package/dist/heart/daemon/container-runtime.js +97 -0
  173. package/dist/heart/daemon/container-spec-auditor-main.js +187 -0
  174. package/dist/heart/daemon/container-spec-auditor.js +257 -0
  175. package/dist/heart/daemon/daemon-bootstrap-startup.js +115 -0
  176. package/dist/heart/daemon/daemon-cli.js +29 -2373
  177. package/dist/heart/daemon/daemon-entry.js +975 -11
  178. package/dist/heart/daemon/daemon-health.js +186 -0
  179. package/dist/heart/daemon/daemon-rollup.js +57 -0
  180. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  181. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  182. package/dist/heart/daemon/daemon.js +2110 -104
  183. package/dist/heart/daemon/desk-admin.js +420 -0
  184. package/dist/heart/daemon/dns-workflow.js +394 -0
  185. package/dist/heart/daemon/doctor-types.js +8 -0
  186. package/dist/heart/daemon/doctor.js +1766 -0
  187. package/dist/heart/daemon/freshness.js +345 -0
  188. package/dist/heart/daemon/habit-private-wake.js +61 -0
  189. package/dist/heart/daemon/health-monitor.js +154 -11
  190. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  191. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  192. package/dist/heart/daemon/http-health-probe.js +80 -0
  193. package/dist/heart/daemon/human-command-screens.js +234 -0
  194. package/dist/heart/daemon/human-readiness.js +114 -0
  195. package/dist/heart/daemon/inner-status.js +78 -0
  196. package/dist/heart/daemon/interactive-repair.js +394 -0
  197. package/dist/heart/daemon/launchd.js +37 -8
  198. package/dist/heart/daemon/log-tailer.js +79 -10
  199. package/dist/heart/daemon/logs-prune.js +132 -0
  200. package/dist/heart/daemon/mcp-canary.js +524 -0
  201. package/dist/heart/daemon/message-router.js +65 -5
  202. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  203. package/dist/heart/daemon/os-cron-deps.js +135 -0
  204. package/dist/heart/daemon/os-cron.js +22 -14
  205. package/dist/heart/daemon/ouro-bot-entry.js +6 -3
  206. package/dist/heart/daemon/ouro-entry.js +9 -3
  207. package/dist/heart/daemon/plugin-cli.js +432 -0
  208. package/dist/heart/daemon/process-manager.js +760 -61
  209. package/dist/heart/daemon/provider-discovery.js +137 -0
  210. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  211. package/dist/heart/daemon/prunable-bundle.js +144 -0
  212. package/dist/heart/daemon/pulse.js +511 -0
  213. package/dist/heart/daemon/readiness-repair.js +365 -0
  214. package/dist/heart/daemon/run-hooks.js +2 -0
  215. package/dist/heart/daemon/runtime-logging.js +47 -14
  216. package/dist/heart/daemon/runtime-metadata.js +2 -30
  217. package/dist/heart/daemon/runtime-mode.js +13 -2
  218. package/dist/heart/daemon/safe-mode.js +161 -0
  219. package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2662 -0
  220. package/dist/heart/daemon/sanctuary-acceptance-harness.js +1832 -0
  221. package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
  222. package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +956 -0
  223. package/dist/heart/daemon/sanctuary-authority-codec.js +86 -0
  224. package/dist/heart/daemon/sanctuary-authority-epoch.js +291 -0
  225. package/dist/heart/daemon/sanctuary-authority-installation.js +161 -0
  226. package/dist/heart/daemon/sanctuary-authority-ledger.js +241 -0
  227. package/dist/heart/daemon/sanctuary-authority-root-lifecycle.js +1332 -0
  228. package/dist/heart/daemon/sanctuary-authority-vault-migration.js +79 -0
  229. package/dist/heart/daemon/sanctuary-bundle-migration.js +974 -0
  230. package/dist/heart/daemon/sanctuary-host-authority.js +1008 -0
  231. package/dist/heart/daemon/sanctuary-host-detached-supervisor.js +493 -0
  232. package/dist/heart/daemon/sanctuary-host-executor.js +670 -0
  233. package/dist/heart/daemon/sanctuary-host-linux-kernel.js +334 -0
  234. package/dist/heart/daemon/sanctuary-host-supervisor-entry.js +207 -0
  235. package/dist/heart/daemon/sanctuary-host-supervisor.js +95 -0
  236. package/dist/heart/daemon/sanctuary-package-management.js +113 -0
  237. package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
  238. package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
  239. package/dist/heart/daemon/sanctuary-telegram-authority-entry.js +475 -0
  240. package/dist/heart/daemon/sanctuary-telegram-authority-gateway.js +585 -0
  241. package/dist/heart/daemon/sanctuary-telegram-authority-service.js +676 -0
  242. package/dist/heart/daemon/sense-manager.js +786 -48
  243. package/dist/heart/daemon/session-id-resolver.js +131 -0
  244. package/dist/heart/daemon/skill-management-installer.js +1 -1
  245. package/dist/heart/daemon/socket-client.js +180 -12
  246. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  247. package/dist/heart/daemon/startup-tui.js +339 -0
  248. package/dist/heart/daemon/supercronic-supervisor.js +282 -0
  249. package/dist/heart/daemon/task-scheduler.js +117 -39
  250. package/dist/heart/daemon/terminal-ui.js +503 -0
  251. package/dist/heart/daemon/thoughts.js +138 -54
  252. package/dist/heart/daemon/up-progress.js +366 -0
  253. package/dist/heart/daemon/vault-items.js +56 -0
  254. package/dist/heart/delegation.js +1 -4
  255. package/dist/heart/external-events/router.js +1531 -0
  256. package/dist/heart/failure-reports.js +336 -0
  257. package/dist/heart/file-lock.js +109 -0
  258. package/dist/heart/frontend-approval-runtime.js +506 -0
  259. package/dist/heart/frontend-journal.js +215 -0
  260. package/dist/heart/frontend-session-service.js +271 -0
  261. package/dist/heart/frontend-socket-client.js +173 -0
  262. package/dist/heart/frontend-socket.js +434 -0
  263. package/dist/heart/frontend-turn-errors.js +20 -0
  264. package/dist/heart/habits/habit-cancel.js +810 -0
  265. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  266. package/dist/heart/habits/habit-migration.js +194 -0
  267. package/dist/heart/habits/habit-parser.js +278 -0
  268. package/dist/heart/habits/habit-runtime-state.js +93 -0
  269. package/dist/heart/habits/habit-scheduler.js +653 -0
  270. package/dist/heart/habits/habit-session-summary.js +318 -0
  271. package/dist/heart/habits/habit-session.js +636 -0
  272. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
  273. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  274. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  275. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  276. package/dist/heart/identity.js +239 -59
  277. package/dist/heart/kept-notes.js +289 -0
  278. package/dist/heart/kicks.js +1 -1
  279. package/dist/heart/machine-identity.js +175 -0
  280. package/dist/heart/mail-import-discovery.js +356 -0
  281. package/dist/heart/mailbox/mailbox-http-hooks.js +99 -0
  282. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  283. package/dist/heart/mailbox/mailbox-http-routes.js +406 -0
  284. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  285. package/dist/heart/mailbox/mailbox-http-transport.js +272 -0
  286. package/dist/heart/mailbox/mailbox-http.js +99 -0
  287. package/dist/heart/mailbox/mailbox-read.js +41 -0
  288. package/dist/heart/mailbox/mailbox-supervision.js +131 -0
  289. package/dist/heart/mailbox/mailbox-types.js +27 -0
  290. package/dist/heart/mailbox/mailbox-view.js +197 -0
  291. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  292. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  293. package/dist/heart/mailbox/readers/mail.js +375 -0
  294. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  295. package/dist/heart/mailbox/readers/sessions.js +231 -0
  296. package/dist/heart/mailbox/readers/shared.js +111 -0
  297. package/dist/heart/mcp/mcp-server.js +760 -0
  298. package/dist/heart/migrate-config.js +100 -0
  299. package/dist/heart/model-capabilities.js +83 -16
  300. package/dist/heart/orientation-frame.js +376 -0
  301. package/dist/heart/platform.js +81 -0
  302. package/dist/heart/primitives.js +1 -1
  303. package/dist/heart/private-runtime/decision-renderer.js +158 -0
  304. package/dist/heart/private-runtime/index.js +18 -0
  305. package/dist/heart/private-runtime/ledger.js +221 -0
  306. package/dist/heart/private-runtime/policy.js +260 -0
  307. package/dist/heart/private-runtime/types.js +2 -0
  308. package/dist/heart/progress-story.js +1 -1
  309. package/dist/heart/provider-attempt.js +137 -0
  310. package/dist/heart/provider-binding-resolver.js +273 -0
  311. package/dist/heart/provider-credentials.js +449 -0
  312. package/dist/heart/provider-failover.js +311 -0
  313. package/dist/heart/provider-models.js +96 -0
  314. package/dist/heart/provider-ping.js +266 -0
  315. package/dist/heart/provider-readiness-cache.js +119 -0
  316. package/dist/heart/provider-visibility.js +188 -0
  317. package/dist/heart/providers/anthropic-token.js +131 -0
  318. package/dist/heart/providers/anthropic.js +248 -67
  319. package/dist/heart/providers/azure.js +23 -11
  320. package/dist/heart/providers/error-classification.js +129 -0
  321. package/dist/heart/providers/github-copilot.js +38 -39
  322. package/dist/heart/providers/minimax-vlm.js +189 -0
  323. package/dist/heart/providers/minimax.js +26 -8
  324. package/dist/heart/providers/openai-codex-token.js +349 -0
  325. package/dist/heart/providers/openai-codex.js +55 -40
  326. package/dist/heart/providers/openai-compatible.js +177 -0
  327. package/dist/heart/reach-channel.js +85 -0
  328. package/dist/heart/reply-style.js +52 -0
  329. package/dist/heart/run-ledger.js +247 -0
  330. package/dist/heart/runtime-capability-check.js +170 -0
  331. package/dist/heart/runtime-credentials.js +608 -0
  332. package/dist/heart/runtime-cwd.js +87 -0
  333. package/dist/heart/sense-truth.js +24 -4
  334. package/dist/heart/session-activity.js +94 -24
  335. package/dist/heart/session-events.js +1521 -0
  336. package/dist/heart/session-playback-cli-main.js +5 -0
  337. package/dist/heart/session-playback-cli.js +36 -0
  338. package/dist/heart/session-playback.js +231 -0
  339. package/dist/heart/session-redaction-repair-cli-main.js +31 -0
  340. package/dist/heart/session-redaction-repair.js +552 -0
  341. package/dist/heart/session-stats-cli-main.js +5 -0
  342. package/dist/heart/session-stats.js +183 -0
  343. package/dist/heart/session-transcript.js +133 -0
  344. package/dist/heart/shelf-claims.js +78 -0
  345. package/dist/heart/shepherd/custody-types.js +2 -0
  346. package/dist/heart/shepherd/mandates.js +352 -0
  347. package/dist/heart/shepherd/operation-commands.js +19 -0
  348. package/dist/heart/shepherd/operations.js +135 -0
  349. package/dist/heart/shepherd/supervision.js +114 -0
  350. package/dist/heart/shepherd/types.js +2 -0
  351. package/dist/heart/shepherd-config.js +123 -0
  352. package/dist/heart/source-grounding.js +313 -0
  353. package/dist/heart/start-of-turn-packet.js +372 -0
  354. package/dist/heart/steward-policy.js +656 -0
  355. package/dist/heart/streaming.js +631 -207
  356. package/dist/heart/structured-output.js +196 -0
  357. package/dist/heart/sync-classification.js +176 -0
  358. package/dist/heart/sync-health.js +152 -0
  359. package/dist/heart/sync-lock.js +431 -0
  360. package/dist/heart/sync.js +1579 -0
  361. package/dist/heart/target-resolution.js +11 -7
  362. package/dist/heart/tempo.js +93 -0
  363. package/dist/heart/temporal-view.js +41 -0
  364. package/dist/heart/timeouts.js +101 -0
  365. package/dist/heart/tool-activity-callbacks.js +59 -0
  366. package/dist/heart/tool-approval.js +382 -0
  367. package/dist/heart/tool-description.js +155 -0
  368. package/dist/heart/tool-friction.js +55 -0
  369. package/dist/heart/tool-loop.js +206 -0
  370. package/dist/heart/tool-output-budget.js +41 -0
  371. package/dist/heart/turn-context.js +496 -0
  372. package/dist/heart/turn-execution-lease.js +30 -0
  373. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  374. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +3 -2
  375. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  376. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  377. package/dist/heart/versioning/ouro-version-manager.js +432 -0
  378. package/dist/heart/versioning/release-sources.js +173 -0
  379. package/dist/heart/versioning/self-update-defaults.js +294 -0
  380. package/dist/heart/versioning/self-update.js +196 -0
  381. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  382. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  383. package/dist/heart/versioning/update-hooks.js +154 -0
  384. package/dist/heart/versioning/update-state.js +126 -0
  385. package/dist/heart/versioning/updater-launchd.js +150 -0
  386. package/dist/heart/versioning/version-intent.js +114 -0
  387. package/dist/heart/work-card.js +380 -0
  388. package/dist/mailbox-ui/assets/index-Dbska1tZ.js +1 -0
  389. package/dist/mailbox-ui/assets/index-DsiKaPyH.css +1 -0
  390. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  391. package/dist/mailbox-ui/index.html +16 -0
  392. package/dist/mailroom/attention.js +167 -0
  393. package/dist/mailroom/autonomy.js +209 -0
  394. package/dist/mailroom/blob-store.js +889 -0
  395. package/dist/mailroom/body-cache.js +61 -0
  396. package/dist/mailroom/cache-sync-cli.js +58 -0
  397. package/dist/mailroom/core.js +803 -0
  398. package/dist/mailroom/entry.js +160 -0
  399. package/dist/mailroom/file-store.js +568 -0
  400. package/dist/mailroom/hosted-cache-sync.js +384 -0
  401. package/dist/mailroom/mbox-import.js +393 -0
  402. package/dist/mailroom/migration.js +164 -0
  403. package/dist/mailroom/outbound.js +380 -0
  404. package/dist/mailroom/policy.js +263 -0
  405. package/dist/mailroom/reader.js +292 -0
  406. package/dist/mailroom/search-cache.js +513 -0
  407. package/dist/mailroom/search-relevance.js +319 -0
  408. package/dist/mailroom/smtp-ingress.js +176 -0
  409. package/dist/mailroom/source-state.js +176 -0
  410. package/dist/mailroom/thread.js +109 -0
  411. package/dist/mailroom/travel-extract.js +89 -0
  412. package/dist/mind/bundle-manifest.js +25 -2
  413. package/dist/mind/context.js +328 -139
  414. package/dist/mind/desk-section.js +362 -0
  415. package/dist/mind/diary-integrity.js +60 -0
  416. package/dist/mind/{memory.js → diary.js} +68 -77
  417. package/dist/mind/embedding-provider.js +60 -0
  418. package/dist/mind/file-state.js +179 -0
  419. package/dist/mind/friend-link-codes.js +209 -0
  420. package/dist/mind/friend-merge.js +336 -0
  421. package/dist/mind/house-names.js +43 -0
  422. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  423. package/dist/mind/obligation-steering.js +199 -3
  424. package/dist/mind/outbound-record.js +168 -0
  425. package/dist/mind/pending.js +36 -10
  426. package/dist/mind/prompt-budget.js +479 -0
  427. package/dist/mind/prompt-refresh.js +3 -2
  428. package/dist/mind/prompt.js +1222 -203
  429. package/dist/mind/provenance-trust.js +26 -0
  430. package/dist/mind/record-paths.js +312 -0
  431. package/dist/mind/scrutiny.js +173 -0
  432. package/dist/mind/session-transaction.js +622 -0
  433. package/dist/nerves/cli-logging.js +7 -1
  434. package/dist/nerves/coverage/audit-rules.js +15 -6
  435. package/dist/nerves/coverage/audit.js +28 -2
  436. package/dist/nerves/coverage/cli.js +1 -1
  437. package/dist/nerves/coverage/contract.js +5 -5
  438. package/dist/nerves/coverage/file-completeness.js +143 -5
  439. package/dist/nerves/coverage/run-artifacts.js +55 -35
  440. package/dist/nerves/coverage/source-scanner.js +4 -4
  441. package/dist/nerves/event-buffer.js +111 -0
  442. package/dist/nerves/index.js +293 -9
  443. package/dist/nerves/observation.js +20 -0
  444. package/dist/nerves/redact.js +79 -0
  445. package/dist/nerves/review/cli-main.js +5 -0
  446. package/dist/nerves/review/cli.js +156 -0
  447. package/dist/nerves/review/core.js +159 -0
  448. package/dist/nerves/runtime.js +17 -1
  449. package/dist/repertoire/ado-client.js +15 -56
  450. package/dist/repertoire/ado-semantic.js +16 -10
  451. package/dist/repertoire/api-client.js +97 -0
  452. package/dist/repertoire/bitwarden-store.js +1199 -0
  453. package/dist/repertoire/bundle-templates.js +71 -0
  454. package/dist/repertoire/bw-installer.js +231 -0
  455. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  456. package/dist/repertoire/coding/context-pack.js +331 -0
  457. package/dist/repertoire/coding/feedback.js +146 -34
  458. package/dist/repertoire/coding/index.js +15 -3
  459. package/dist/repertoire/coding/manager.js +159 -10
  460. package/dist/repertoire/coding/spawner.js +40 -11
  461. package/dist/repertoire/coding/tools.js +182 -18
  462. package/dist/repertoire/coding/workbench-client.js +272 -0
  463. package/dist/repertoire/coding/workbench-manager.js +346 -0
  464. package/dist/repertoire/commerce-errors.js +109 -0
  465. package/dist/repertoire/commerce-self-test.js +156 -0
  466. package/dist/repertoire/credential-access.js +183 -0
  467. package/dist/repertoire/desk/classifier.js +362 -0
  468. package/dist/repertoire/duffel-client.js +185 -0
  469. package/dist/repertoire/github-client.js +14 -55
  470. package/dist/repertoire/graph-client.js +11 -52
  471. package/dist/repertoire/guardrails.js +1480 -22
  472. package/dist/repertoire/house-sweep.js +471 -0
  473. package/dist/repertoire/mcp-client.js +58 -5
  474. package/dist/repertoire/mcp-manager.js +427 -139
  475. package/dist/repertoire/mcp-tools.js +132 -0
  476. package/dist/repertoire/mcp-write-guard.js +46 -0
  477. package/dist/repertoire/plugin-mcp.js +175 -0
  478. package/dist/repertoire/plugins.js +253 -0
  479. package/dist/repertoire/relationship-authorization.js +322 -0
  480. package/dist/repertoire/sanctuary-container-policy.js +50 -0
  481. package/dist/repertoire/shell-sessions.js +134 -0
  482. package/dist/repertoire/skills.js +48 -4
  483. package/dist/repertoire/stripe-client.js +131 -0
  484. package/dist/repertoire/tool-arguments.js +182 -0
  485. package/dist/repertoire/tool-results.js +29 -0
  486. package/dist/repertoire/tools-a2a.js +742 -0
  487. package/dist/repertoire/tools-attachments.js +322 -0
  488. package/dist/repertoire/tools-awaiting.js +897 -0
  489. package/dist/repertoire/tools-base.js +83 -1168
  490. package/dist/repertoire/tools-bluebubbles.js +2 -0
  491. package/dist/repertoire/tools-bridge.js +144 -0
  492. package/dist/repertoire/tools-bundle.js +917 -0
  493. package/dist/repertoire/tools-commerce.js +253 -0
  494. package/dist/repertoire/tools-config.js +186 -0
  495. package/dist/repertoire/tools-continuity.js +588 -0
  496. package/dist/repertoire/tools-credential.js +383 -0
  497. package/dist/repertoire/tools-escalation.js +84 -0
  498. package/dist/repertoire/tools-evolution.js +527 -0
  499. package/dist/repertoire/tools-files.js +362 -0
  500. package/dist/repertoire/tools-flight.js +290 -0
  501. package/dist/repertoire/tools-flow.js +119 -0
  502. package/dist/repertoire/tools-friend-link.js +57 -0
  503. package/dist/repertoire/tools-github.js +3 -8
  504. package/dist/repertoire/tools-habits.js +103 -0
  505. package/dist/repertoire/tools-house-care.js +174 -0
  506. package/dist/repertoire/tools-mail.js +1828 -0
  507. package/dist/repertoire/tools-notes.js +501 -0
  508. package/dist/repertoire/tools-obligations.js +182 -0
  509. package/dist/repertoire/tools-orientation.js +31 -0
  510. package/dist/repertoire/tools-record.js +482 -0
  511. package/dist/repertoire/tools-rsvp.js +139 -0
  512. package/dist/repertoire/tools-runtime.js +238 -0
  513. package/dist/repertoire/tools-sanctuary-host.js +202 -0
  514. package/dist/repertoire/tools-session.js +1141 -0
  515. package/dist/repertoire/tools-shell.js +154 -0
  516. package/dist/repertoire/tools-shepherd-guidance.js +171 -0
  517. package/dist/repertoire/tools-shepherd.js +325 -0
  518. package/dist/repertoire/tools-steward-policy.js +147 -0
  519. package/dist/repertoire/tools-stripe.js +224 -0
  520. package/dist/repertoire/tools-surface.js +369 -0
  521. package/dist/repertoire/tools-teams.js +50 -39
  522. package/dist/repertoire/tools-telegram-contacts.js +37 -0
  523. package/dist/repertoire/tools-travel.js +125 -0
  524. package/dist/repertoire/tools-trip.js +982 -0
  525. package/dist/repertoire/tools-unraid.js +556 -0
  526. package/dist/repertoire/tools-user-profile.js +146 -0
  527. package/dist/repertoire/tools-vault.js +40 -0
  528. package/dist/repertoire/tools-voice-local.js +198 -0
  529. package/dist/repertoire/tools-voice.js +145 -0
  530. package/dist/repertoire/tools.js +523 -156
  531. package/dist/repertoire/travel-api-client.js +360 -0
  532. package/dist/repertoire/unraid-client.js +155 -0
  533. package/dist/repertoire/unraid-restart.js +339 -0
  534. package/dist/repertoire/user-profile.js +131 -0
  535. package/dist/repertoire/vault-setup.js +246 -0
  536. package/dist/repertoire/vault-unlock.js +686 -0
  537. package/dist/rsvp/aisleplanner-client.js +354 -0
  538. package/dist/rsvp/cli.js +936 -0
  539. package/dist/rsvp/config.js +327 -0
  540. package/dist/rsvp/cutover.js +453 -0
  541. package/dist/rsvp/diagnostics.js +232 -0
  542. package/dist/rsvp/diff-renderer.js +176 -0
  543. package/dist/rsvp/habit-policy.js +110 -0
  544. package/dist/rsvp/habit-stage.js +123 -0
  545. package/dist/rsvp/incident-bundle.js +97 -0
  546. package/dist/rsvp/migration.js +204 -0
  547. package/dist/rsvp/native-habit-runner.js +630 -0
  548. package/dist/rsvp/outbound-state.js +628 -0
  549. package/dist/rsvp/query.js +118 -0
  550. package/dist/rsvp/replay.js +233 -0
  551. package/dist/rsvp/snapshot.js +232 -0
  552. package/dist/rsvp/spend-ledger.js +175 -0
  553. package/dist/scripts/claude-code-hook.js +41 -0
  554. package/dist/scripts/claude-code-stop-hook.js +47 -0
  555. package/dist/senses/a2a-entry.js +140 -0
  556. package/dist/senses/acp-server.js +386 -0
  557. package/dist/senses/attention-queue.js +186 -0
  558. package/dist/senses/await-turn-message.js +65 -0
  559. package/dist/senses/bluebubbles/active-turns.js +216 -0
  560. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  561. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  562. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +393 -43
  563. package/dist/senses/bluebubbles/context-packet.js +207 -0
  564. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  565. package/dist/senses/bluebubbles/entry.js +90 -0
  566. package/dist/senses/bluebubbles/host-account-verifier.js +88 -0
  567. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
  568. package/dist/senses/bluebubbles/index.js +4054 -0
  569. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  570. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  571. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
  572. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
  573. package/dist/senses/bluebubbles/outbound-state.js +335 -0
  574. package/dist/senses/bluebubbles/processed-log.js +133 -0
  575. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  576. package/dist/senses/bluebubbles/replay.js +284 -0
  577. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  578. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  579. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  580. package/dist/senses/bluebubbles/webhook-registration.js +257 -0
  581. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  582. package/dist/senses/cli/bracketed-paste.js +82 -0
  583. package/dist/senses/cli/image-paste.js +287 -0
  584. package/dist/senses/cli/image-ref-navigation.js +75 -0
  585. package/dist/senses/cli/ink-app.js +156 -0
  586. package/dist/senses/cli/inline-diff.js +64 -0
  587. package/dist/senses/cli/input-keys.js +174 -0
  588. package/dist/senses/cli/kill-ring.js +86 -0
  589. package/dist/senses/cli/message-list.js +51 -0
  590. package/dist/senses/cli/ouro-tui.js +607 -0
  591. package/dist/senses/cli/spinner-imperative.js +135 -0
  592. package/dist/senses/cli/spinner.js +101 -0
  593. package/dist/senses/cli/status-line.js +60 -0
  594. package/dist/senses/cli/streaming-markdown.js +526 -0
  595. package/dist/senses/cli/tool-display.js +85 -0
  596. package/dist/senses/cli/tool-render.js +85 -0
  597. package/dist/senses/cli/tui-store.js +241 -0
  598. package/dist/senses/cli/virtual-list.js +35 -0
  599. package/dist/senses/cli-entry.js +60 -8
  600. package/dist/senses/cli.js +570 -309
  601. package/dist/senses/commands.js +66 -3
  602. package/dist/senses/context-packet-ledger.js +371 -0
  603. package/dist/senses/context-packets.js +154 -0
  604. package/dist/senses/habit-lifecycle-guard.js +24 -0
  605. package/dist/senses/habit-turn-message.js +160 -0
  606. package/dist/senses/ingress-evidence.js +2 -0
  607. package/dist/senses/mail-entry.js +66 -0
  608. package/dist/senses/mail.js +524 -0
  609. package/dist/senses/pipeline.js +1192 -204
  610. package/dist/senses/private-runtime-worker.js +857 -0
  611. package/dist/senses/private-runtime.js +1622 -0
  612. package/dist/senses/proactive-content-guard.js +51 -0
  613. package/dist/senses/root-host-approval-port.js +345 -0
  614. package/dist/senses/root-host-approval-runtime.js +393 -0
  615. package/dist/senses/sanctuary-authority-resident.js +102 -0
  616. package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
  617. package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
  618. package/dist/senses/sanctuary-grounding.js +118 -0
  619. package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
  620. package/dist/senses/sanctuary-health-acceptance-probe.js +786 -0
  621. package/dist/senses/sanctuary-health-runner.js +106 -0
  622. package/dist/senses/sanctuary-health.js +442 -0
  623. package/dist/senses/sanctuary-house.js +97 -0
  624. package/dist/senses/sanctuary-install-state-contract.js +169 -0
  625. package/dist/senses/sanctuary-interactive-control.js +410 -0
  626. package/dist/senses/sanctuary-media-catalog-contract.js +268 -0
  627. package/dist/senses/sanctuary-media-optimization.js +517 -0
  628. package/dist/senses/sanctuary-runtime.js +390 -0
  629. package/dist/senses/sanctuary-sab.js +85 -0
  630. package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
  631. package/dist/senses/shared-turn.js +832 -0
  632. package/dist/senses/shepherd/agent-presentation.js +88 -0
  633. package/dist/senses/shepherd/attention-page.js +166 -0
  634. package/dist/senses/shepherd/attention-sidebar.js +76 -0
  635. package/dist/senses/shepherd/attention.js +295 -0
  636. package/dist/senses/shepherd/checkin-config.js +76 -0
  637. package/dist/senses/shepherd/checkin-store.js +386 -0
  638. package/dist/senses/shepherd/client.js +196 -0
  639. package/dist/senses/shepherd/cmux.js +483 -0
  640. package/dist/senses/shepherd/composer.js +336 -0
  641. package/dist/senses/shepherd/copilot-app.js +648 -0
  642. package/dist/senses/shepherd/feedback-reply.js +108 -0
  643. package/dist/senses/shepherd/feedback-source.js +20 -0
  644. package/dist/senses/shepherd/feedback-store.js +331 -0
  645. package/dist/senses/shepherd/feedback-submit.js +182 -0
  646. package/dist/senses/shepherd/feedback-worker.js +208 -0
  647. package/dist/senses/shepherd/guidance.js +273 -0
  648. package/dist/senses/shepherd/herdr.js +427 -0
  649. package/dist/senses/shepherd/host.js +17 -0
  650. package/dist/senses/shepherd/human-decision-guard.js +29 -0
  651. package/dist/senses/shepherd/judge-evaluation-command.js +183 -0
  652. package/dist/senses/shepherd/judge-evaluation-entry.js +13 -0
  653. package/dist/senses/shepherd/judge-evaluation.js +155 -0
  654. package/dist/senses/shepherd/judge.js +210 -0
  655. package/dist/senses/shepherd/notice-outbox.js +262 -0
  656. package/dist/senses/shepherd/observation-publisher.js +320 -0
  657. package/dist/senses/shepherd/operations-defaults.js +86 -0
  658. package/dist/senses/shepherd/operations.js +159 -0
  659. package/dist/senses/shepherd/owner-notice.js +489 -0
  660. package/dist/senses/shepherd/prompt-state.js +60 -0
  661. package/dist/senses/shepherd/recovery.js +543 -0
  662. package/dist/senses/shepherd/redact.js +66 -0
  663. package/dist/senses/shepherd/returns.js +79 -0
  664. package/dist/senses/shepherd/sense.js +849 -0
  665. package/dist/senses/shepherd/shepherd-judge-corpus-v1.json +170 -0
  666. package/dist/senses/shepherd/surface.js +123 -0
  667. package/dist/senses/shepherd/target-binding.js +13 -0
  668. package/dist/senses/shepherd/terminal-process.js +147 -0
  669. package/dist/senses/shepherd-entry.js +98 -0
  670. package/dist/senses/surface-tool.js +109 -0
  671. package/dist/senses/teams-entry.js +68 -8
  672. package/dist/senses/teams-image.js +119 -0
  673. package/dist/senses/teams.js +998 -337
  674. package/dist/senses/telegram-admission.js +718 -0
  675. package/dist/senses/telegram-approval-runtime.js +793 -0
  676. package/dist/senses/telegram-attachments.js +186 -0
  677. package/dist/senses/telegram-audit-ledger.js +220 -0
  678. package/dist/senses/telegram-authority-transport.js +231 -0
  679. package/dist/senses/telegram-client.js +1755 -0
  680. package/dist/senses/telegram-effect-adapter.js +904 -0
  681. package/dist/senses/telegram-entry.js +83 -0
  682. package/dist/senses/telegram-handoff.js +154 -0
  683. package/dist/senses/telegram.js +2474 -0
  684. package/dist/senses/trust-gate.js +104 -9
  685. package/dist/senses/voice/audio-playback.js +237 -0
  686. package/dist/senses/voice/audio-routing.js +119 -0
  687. package/dist/senses/voice/call-auth.js +250 -0
  688. package/dist/senses/voice/elevenlabs.js +202 -0
  689. package/dist/senses/voice/floor-control.js +431 -0
  690. package/dist/senses/voice/floor-controller.js +115 -0
  691. package/dist/senses/voice/golden-path.js +116 -0
  692. package/dist/senses/voice/index.js +29 -0
  693. package/dist/senses/voice/local-audio-control.js +344 -0
  694. package/dist/senses/voice/local-audio-devices.js +516 -0
  695. package/dist/senses/voice/local-audio-disclosure.js +174 -0
  696. package/dist/senses/voice/local-audio-identity.js +103 -0
  697. package/dist/senses/voice/local-audio-join.js +325 -0
  698. package/dist/senses/voice/local-audio-mute.js +199 -0
  699. package/dist/senses/voice/local-audio-notify.js +124 -0
  700. package/dist/senses/voice/local-audio-prompts.js +116 -0
  701. package/dist/senses/voice/local-audio-transport.js +427 -0
  702. package/dist/senses/voice/local-audio.js +281 -0
  703. package/dist/senses/voice/local-media-stream.js +145 -0
  704. package/dist/senses/voice/meeting.js +113 -0
  705. package/dist/senses/voice/outbound.js +190 -0
  706. package/dist/senses/voice/phone.js +33 -0
  707. package/dist/senses/voice/playback.js +139 -0
  708. package/dist/senses/voice/process-guards.js +51 -0
  709. package/dist/senses/voice/realtime-eval.js +496 -0
  710. package/dist/senses/voice/realtime-tool-schema.js +195 -0
  711. package/dist/senses/voice/realtime-trace.js +531 -0
  712. package/dist/senses/voice/transcript.js +70 -0
  713. package/dist/senses/voice/turn.js +191 -0
  714. package/dist/senses/voice/twilio-phone-runtime.js +836 -0
  715. package/dist/senses/voice/twilio-phone.js +5454 -0
  716. package/dist/senses/voice/types.js +2 -0
  717. package/dist/senses/voice/whisper.js +161 -0
  718. package/dist/senses/voice-entry.js +83 -0
  719. package/dist/senses/voice-realtime-eval-command.js +99 -0
  720. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  721. package/dist/senses/voice-twilio-entry.js +87 -0
  722. package/dist/trips/core.js +138 -0
  723. package/dist/trips/store.js +265 -0
  724. package/dist/util/frontmatter.js +69 -0
  725. package/npm-shrinkwrap.json +8342 -0
  726. package/package.json +76 -13
  727. package/skills/agent-commerce.md +113 -0
  728. package/skills/browser-navigation.md +117 -0
  729. package/skills/commerce-setup-guide.md +116 -0
  730. package/skills/commerce-setup.md +84 -0
  731. package/skills/configure-dev-tools.md +99 -0
  732. package/skills/travel-planning.md +138 -0
  733. package/dist/heart/daemon/auth-flow.js +0 -430
  734. package/dist/heart/daemon/ouro-path-installer.js +0 -260
  735. package/dist/heart/daemon/ouro-version-manager.js +0 -171
  736. package/dist/heart/daemon/update-hooks.js +0 -138
  737. package/dist/heart/obligations.js +0 -191
  738. package/dist/heart/safe-workspace.js +0 -381
  739. package/dist/heart/session-recall.js +0 -116
  740. package/dist/mind/friends/channel.js +0 -84
  741. package/dist/mind/friends/group-context.js +0 -144
  742. package/dist/mind/friends/resolver.js +0 -84
  743. package/dist/mind/friends/store-file.js +0 -190
  744. package/dist/mind/friends/store.js +0 -4
  745. package/dist/mind/friends/tokens.js +0 -26
  746. package/dist/mind/friends/trust-explanation.js +0 -74
  747. package/dist/mind/friends/types.js +0 -29
  748. package/dist/repertoire/tasks/board.js +0 -134
  749. package/dist/repertoire/tasks/index.js +0 -224
  750. package/dist/repertoire/tasks/lifecycle.js +0 -80
  751. package/dist/repertoire/tasks/middleware.js +0 -65
  752. package/dist/repertoire/tasks/parser.js +0 -173
  753. package/dist/repertoire/tasks/scanner.js +0 -132
  754. package/dist/repertoire/tasks/transitions.js +0 -144
  755. package/dist/senses/bluebubbles-entry.js +0 -13
  756. package/dist/senses/bluebubbles.js +0 -1181
  757. package/dist/senses/debug-activity.js +0 -154
  758. package/dist/senses/inner-dialog-worker.js +0 -90
  759. package/dist/senses/inner-dialog.js +0 -525
  760. package/subagents/README.md +0 -7
  761. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  762. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  763. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  764. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  765. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  766. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  767. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  768. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  769. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  770. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  771. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  772. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  773. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  774. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  775. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  776. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  777. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -33,12 +33,137 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.isLibraryKind = isLibraryKind;
37
+ exports.parseAgentHome = parseAgentHome;
38
+ exports.normalizeMachineName = normalizeMachineName;
39
+ exports.agentHomeLabel = agentHomeLabel;
40
+ exports.readAgentHomeElsewhere = readAgentHomeElsewhere;
41
+ exports.listAllBundleAgents = listAllBundleAgents;
36
42
  exports.listEnabledBundleAgents = listEnabledBundleAgents;
43
+ exports.listHomeBundleAgents = listHomeBundleAgents;
44
+ exports.readPrivateRuntimeConfig = readPrivateRuntimeConfig;
45
+ exports.listBundleSyncRows = listBundleSyncRows;
37
46
  const fs = __importStar(require("fs"));
38
47
  const path = __importStar(require("path"));
48
+ const child_process_1 = require("child_process");
39
49
  const identity_1 = require("../identity");
50
+ const machine_identity_1 = require("../machine-identity");
40
51
  const runtime_1 = require("../../nerves/runtime");
41
- function listEnabledBundleAgents(options = {}) {
52
+ const sync_health_1 = require("../sync-health");
53
+ /**
54
+ * True when the value is the string `"library"`. Library bundles are
55
+ * content-only resources — never run as agents, never appear in sync surfaces.
56
+ */
57
+ function isLibraryKind(kind) {
58
+ return kind === "library";
59
+ }
60
+ function isRecord(value) {
61
+ return !!value && typeof value === "object" && !Array.isArray(value);
62
+ }
63
+ function hasConfiguredVault(parsed) {
64
+ const vault = parsed.vault;
65
+ if (!isRecord(vault))
66
+ return false;
67
+ return typeof vault.email === "string" && vault.email.trim().length > 0
68
+ && typeof vault.serverUrl === "string" && vault.serverUrl.trim().length > 0;
69
+ }
70
+ function hasEnabledSync(parsed) {
71
+ const sync = parsed.sync;
72
+ return isRecord(sync) && sync.enabled === true;
73
+ }
74
+ function hasEnabledExternalSense(parsed) {
75
+ const senses = parsed.senses;
76
+ if (!isRecord(senses))
77
+ return false;
78
+ for (const [name, value] of Object.entries(senses)) {
79
+ if (name === "cli")
80
+ continue;
81
+ if (isRecord(value) && value.enabled === true)
82
+ return true;
83
+ }
84
+ return false;
85
+ }
86
+ function isManageableAgentConfig(parsed) {
87
+ return hasConfiguredVault(parsed)
88
+ || hasEnabledSync(parsed)
89
+ || hasEnabledExternalSense(parsed);
90
+ }
91
+ function nonEmptyString(value) {
92
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
93
+ }
94
+ /** Parse the `home` block of agent.json; null when absent or unusable. */
95
+ function parseAgentHome(value) {
96
+ if (!isRecord(value))
97
+ return null;
98
+ const machineId = nonEmptyString(value.machineId);
99
+ if (!machineId)
100
+ return null;
101
+ const home = {
102
+ machineId,
103
+ machineName: nonEmptyString(value.machineName) ?? machineId,
104
+ since: nonEmptyString(value.since) ?? "",
105
+ };
106
+ const previous = isRecord(value.previous) ? parseAgentHome(value.previous) : null;
107
+ if (previous)
108
+ home.previous = { machineId: previous.machineId, machineName: previous.machineName };
109
+ return home;
110
+ }
111
+ /** Hostnames compare without case or a trailing `.local`. */
112
+ function normalizeMachineName(name) {
113
+ return name.trim().replace(/\.local$/i, "").toLowerCase();
114
+ }
115
+ /**
116
+ * How a home is shown: its name plus a short id, so two Macs that are both
117
+ * called "Mac" stay distinguishable.
118
+ */
119
+ function agentHomeLabel(home) {
120
+ if (home.machineName === home.machineId)
121
+ return home.machineId;
122
+ return `${home.machineName} (${home.machineId.replace(/^machine_/, "").slice(0, 8)})`;
123
+ }
124
+ /**
125
+ * The home this bundle names when it is another machine, else null. Used by
126
+ * the turn pipeline to decline turns for an agent that has moved away.
127
+ */
128
+ function readAgentHomeElsewhere(agentRoot, machineId = (0, machine_identity_1.readMachineIdentity)()?.machineId ?? null) {
129
+ if (machineId === null)
130
+ return null;
131
+ let home;
132
+ try {
133
+ home = parseAgentHome(JSON.parse(fs.readFileSync(path.join(agentRoot, "agent.json"), "utf-8")).home);
134
+ }
135
+ catch {
136
+ return null;
137
+ }
138
+ return home && home.machineId !== machineId ? home : null;
139
+ }
140
+ function stripDiscoveryMetadata(row) {
141
+ const publicRow = { name: row.name, enabled: row.enabled };
142
+ if (row.kind !== undefined)
143
+ publicRow.kind = row.kind;
144
+ if (row.managementBlockedReason !== undefined) {
145
+ publicRow.managementBlockedReason = row.managementBlockedReason;
146
+ }
147
+ if (row.homeState !== undefined)
148
+ publicRow.homeState = row.homeState;
149
+ if (row.home)
150
+ publicRow.homeMachine = agentHomeLabel(row.home);
151
+ if (row.homeNameMatchesThisMachine)
152
+ publicRow.homeNameMatchesThisMachine = true;
153
+ return publicRow;
154
+ }
155
+ /**
156
+ * Walk the bundles root and return one row per `<name>.ouro` directory whose
157
+ * `agent.json` is readable and parseable. Includes both enabled and disabled
158
+ * agents AND library-kind bundles — callers that need only real agents should
159
+ * use `listEnabledBundleAgents` (which filters both `enabled` and `kind`).
160
+ *
161
+ * Bundles whose `agent.json` is missing, malformed, or unreadable are skipped
162
+ * silently (they aren't real agents from the harness's perspective).
163
+ *
164
+ * Sorted alphabetically by name for stable display.
165
+ */
166
+ function discoverBundleAgents(options = {}) {
42
167
  const bundlesRoot = options.bundlesRoot ?? (0, identity_1.getAgentBundlesRoot)();
43
168
  const readdirSync = options.readdirSync ?? fs.readdirSync;
44
169
  const readFileSync = options.readFileSync ?? fs.readFileSync;
@@ -63,19 +188,178 @@ function listEnabledBundleAgents(options = {}) {
63
188
  const agentName = entry.name.slice(0, -5);
64
189
  const configPath = path.join(bundlesRoot, entry.name, "agent.json");
65
190
  let enabled = true;
191
+ let kind;
192
+ let manageable = false;
193
+ let home = null;
66
194
  try {
67
195
  const raw = readFileSync(configPath, "utf-8");
68
196
  const parsed = JSON.parse(raw);
197
+ if (!isRecord(parsed))
198
+ continue;
69
199
  if (typeof parsed.enabled === "boolean") {
70
200
  enabled = parsed.enabled;
71
201
  }
202
+ if (typeof parsed.kind === "string") {
203
+ kind = parsed.kind;
204
+ }
205
+ manageable = isManageableAgentConfig(parsed);
206
+ home = parseAgentHome(parsed.home);
72
207
  }
73
208
  catch {
74
209
  continue;
75
210
  }
211
+ const row = { name: agentName, enabled, manageable, home };
212
+ if (kind !== undefined)
213
+ row.kind = kind;
214
+ if (enabled && !isLibraryKind(kind) && !manageable) {
215
+ row.managementBlockedReason = "inactive scaffold: no vault locator, sync, or enabled external sense";
216
+ }
217
+ discovered.push(row);
218
+ }
219
+ if (discovered.length === 0)
220
+ return discovered;
221
+ const identity = options.machineId === undefined ? (0, machine_identity_1.readMachineIdentity)() : null;
222
+ const machineId = options.machineId === undefined ? identity?.machineId ?? null : options.machineId;
223
+ const thisMachineNames = new Set((options.hostnameAliases ?? identity?.hostnameAliases ?? []).map(normalizeMachineName));
224
+ const holdsAHome = machineId !== null && discovered.some((row) => row.home?.machineId === machineId);
225
+ for (const row of discovered) {
226
+ if (!row.enabled || isLibraryKind(row.kind) || !row.manageable)
227
+ continue;
228
+ if (row.home) {
229
+ row.homeState = row.home.machineId === machineId ? "here" : "elsewhere";
230
+ if (row.homeState === "elsewhere" && thisMachineNames.has(normalizeMachineName(row.home.machineName))) {
231
+ row.homeNameMatchesThisMachine = true;
232
+ }
233
+ }
234
+ else {
235
+ row.homeState = holdsAHome ? "unclaimed" : "fallback";
236
+ }
237
+ }
238
+ return discovered.sort((left, right) => left.name.localeCompare(right.name));
239
+ }
240
+ function listAllBundleAgents(options = {}) {
241
+ return discoverBundleAgents(options).map(stripDiscoveryMetadata);
242
+ }
243
+ /**
244
+ * Real agents only — excludes both disabled bundles and library-kind bundles.
245
+ * Library bundles (SerpentGuide, RepairGuide, …) are content-only and must
246
+ * never appear in spawn lists, status rollups, or sync rows.
247
+ */
248
+ function listEnabledBundleAgents(options = {}) {
249
+ return discoverBundleAgents(options)
250
+ .filter((row) => row.enabled && !isLibraryKind(row.kind) && row.manageable)
251
+ .map((row) => row.name);
252
+ }
253
+ /**
254
+ * The agents this machine's daemon runs: enabled, manageable agents homed here,
255
+ * plus unclaimed agents while this machine holds no home (`fallback`).
256
+ */
257
+ function listHomeBundleAgents(options = {}) {
258
+ return discoverBundleAgents(options)
259
+ .filter((row) => row.enabled && !isLibraryKind(row.kind) && row.manageable)
260
+ .filter((row) => row.homeState === "here" || row.homeState === "fallback")
261
+ .map((row) => row.name);
262
+ }
263
+ function readPrivateRuntimeConfig(agent, options = {}) {
264
+ const bundlesRoot = options.bundlesRoot ?? (0, identity_1.getAgentBundlesRoot)();
265
+ const readFileSync = options.readFileSync ?? fs.readFileSync;
266
+ const configPath = path.join(bundlesRoot, `${agent}.ouro`, "agent.json");
267
+ try {
268
+ const raw = readFileSync(configPath, "utf-8");
269
+ const parsed = JSON.parse(raw);
270
+ const privateRuntime = parsed.privateRuntime;
271
+ if (privateRuntime && typeof privateRuntime === "object" && !Array.isArray(privateRuntime)) {
272
+ return {
273
+ autoStart: privateRuntime.autoStart === true,
274
+ source: "privateRuntime",
275
+ };
276
+ }
277
+ return { autoStart: false, source: "default" };
278
+ }
279
+ catch (error) {
280
+ const message = error instanceof Error ? error.message : String(error);
281
+ (0, runtime_1.emitNervesEvent)({
282
+ level: "warn",
283
+ component: "daemon",
284
+ event: "daemon.private_runtime_policy_read_failed",
285
+ message: "failed to read private-runtime auto-start policy; refusing autonomous private-runtime start",
286
+ meta: {
287
+ agent,
288
+ configPath,
289
+ error: message,
290
+ },
291
+ });
292
+ return { autoStart: false, source: "unreadable", error: message };
293
+ }
294
+ }
295
+ /**
296
+ * Read the per-agent sync block from each enabled bundle's agent.json.
297
+ * Used by the daemon (and stopped-state status renderer) to build per-agent
298
+ * sync rows without depending on argv-derived global identity. Bundles that
299
+ * cannot be read are skipped silently.
300
+ *
301
+ * For rows with sync enabled, also checks whether the bundle is a git repo
302
+ * (via .git directory presence) and resolves the remote URL via
303
+ * `git remote get-url <remote>`. On any error the URL is left undefined and
304
+ * the status renderer falls back to "local only" or "not a git repo".
305
+ */
306
+ function listBundleSyncRows(options = {}) {
307
+ const bundlesRoot = options.bundlesRoot ?? (0, identity_1.getAgentBundlesRoot)();
308
+ const readFileSync = options.readFileSync ?? fs.readFileSync;
309
+ const execFileSync = options.execFileSync ?? child_process_1.execFileSync;
310
+ const existsSync = options.existsSync ?? fs.existsSync;
311
+ const agents = listEnabledBundleAgents(options);
312
+ const rows = [];
313
+ for (const agent of agents) {
314
+ const bundleRoot = path.join(bundlesRoot, `${agent}.ouro`);
315
+ const configPath = path.join(bundleRoot, "agent.json");
316
+ let enabled = false;
317
+ let remote = "origin";
318
+ let branch = "main";
319
+ try {
320
+ const raw = readFileSync(configPath, "utf-8");
321
+ const parsed = JSON.parse(raw);
322
+ if (parsed.sync && typeof parsed.sync === "object") {
323
+ if (typeof parsed.sync.enabled === "boolean")
324
+ enabled = parsed.sync.enabled;
325
+ if (typeof parsed.sync.remote === "string" && parsed.sync.remote.length > 0) {
326
+ remote = parsed.sync.remote;
327
+ }
328
+ if (typeof parsed.sync.branch === "string" && parsed.sync.branch.length > 0) {
329
+ branch = parsed.sync.branch;
330
+ }
331
+ }
332
+ }
333
+ catch {
334
+ // Best-effort: bundle without readable config still gets a row with defaults
335
+ }
336
+ const row = { agent, enabled, remote, branch };
76
337
  if (enabled) {
77
- discovered.push(agentName);
338
+ // Only meaningful when sync is enabled — we don't care about disabled bundles'
339
+ // git state. Check .git presence before attempting any git invocation.
340
+ const gitInitialized = existsSync(path.join(bundleRoot, ".git"));
341
+ row.gitInitialized = gitInitialized;
342
+ if (gitInitialized) {
343
+ try {
344
+ const out = execFileSync("git", ["remote", "get-url", remote], {
345
+ cwd: bundleRoot,
346
+ stdio: "pipe",
347
+ timeout: 5000,
348
+ }).toString().trim();
349
+ if (out.length > 0)
350
+ row.remoteUrl = out;
351
+ }
352
+ catch {
353
+ // No remote configured or git missing — leave remoteUrl undefined.
354
+ }
355
+ const health = (0, sync_health_1.readBundleSyncHealth)(bundleRoot, { readFileSync });
356
+ if (health.failure)
357
+ row.failure = health.failure;
358
+ if (health.skippedFiles.length > 0)
359
+ row.skippedFiles = health.skippedFiles;
360
+ }
78
361
  }
362
+ rows.push(row);
79
363
  }
80
- return discovered.sort((left, right) => left.localeCompare(right));
364
+ return rows;
81
365
  }
@@ -0,0 +1,355 @@
1
+ "use strict";
2
+ /**
3
+ * Home-machine leases: each agent runs on exactly one machine.
4
+ *
5
+ * The lease lives in the bundle's synced agent.json as `home`, naming the
6
+ * machine (by its stable `~/.ouro-cli/machine.json` id) that runs the agent.
7
+ * Agent discovery reads it (see `AgentHomeState` in agent-discovery.ts); this
8
+ * module writes it (`ouro move <agent> here`) and checks a running daemon
9
+ * against it.
10
+ *
11
+ * A move is a compare-and-swap on the bundle's remote. It runs under the
12
+ * bundle sync lock, honours a sync pause, and names `<remote>` and
13
+ * `sync.branch` explicitly (never `@{u}`). It starts only from a bundle that
14
+ * is exactly at `<remote>/<branch>` (nothing unpushed, agent.json clean),
15
+ * commits only agent.json and pushes `HEAD:<branch>`. A fast-forward push
16
+ * succeeds only if nobody pushed in between. When the push is refused, the
17
+ * move is undone; if the remote's lease changed meanwhile, another machine won
18
+ * and the move stops, otherwise it is retried once on the new remote state.
19
+ */
20
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ var desc = Object.getOwnPropertyDescriptor(m, k);
23
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
24
+ desc = { enumerable: true, get: function() { return m[k]; } };
25
+ }
26
+ Object.defineProperty(o, k2, desc);
27
+ }) : (function(o, m, k, k2) {
28
+ if (k2 === undefined) k2 = k;
29
+ o[k2] = m[k];
30
+ }));
31
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
32
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
33
+ }) : function(o, v) {
34
+ o["default"] = v;
35
+ });
36
+ var __importStar = (this && this.__importStar) || (function () {
37
+ var ownKeys = function(o) {
38
+ ownKeys = Object.getOwnPropertyNames || function (o) {
39
+ var ar = [];
40
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
41
+ return ar;
42
+ };
43
+ return ownKeys(o);
44
+ };
45
+ return function (mod) {
46
+ if (mod && mod.__esModule) return mod;
47
+ var result = {};
48
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
49
+ __setModuleDefault(result, mod);
50
+ return result;
51
+ };
52
+ })();
53
+ Object.defineProperty(exports, "__esModule", { value: true });
54
+ exports.machineDisplayName = machineDisplayName;
55
+ exports.moveAgentHomeHere = moveAgentHomeHere;
56
+ exports.readUpstreamAgentHome = readUpstreamAgentHome;
57
+ exports.checkAgentHomes = checkAgentHomes;
58
+ const fs = __importStar(require("fs"));
59
+ const path = __importStar(require("path"));
60
+ const child_process_1 = require("child_process");
61
+ const runtime_1 = require("../../nerves/runtime");
62
+ const sync_1 = require("../sync");
63
+ const agent_discovery_1 = require("./agent-discovery");
64
+ const SYNC_NETWORK = {
65
+ fetch: (agentRoot, config) => (0, sync_1.fetchRemote)(agentRoot, config),
66
+ push: (agentRoot, config) => (0, sync_1.pushHeadToBranch)(agentRoot, config),
67
+ };
68
+ const MOVE_ATTEMPTS = 2;
69
+ const MOVE_LOCK_WAIT_MS = 10_000;
70
+ function readSyncSettings(parsed) {
71
+ const sync = parsed.sync;
72
+ return {
73
+ enabled: sync?.enabled === true,
74
+ remote: typeof sync?.remote === "string" && sync.remote.trim() ? sync.remote : "origin",
75
+ branch: typeof sync?.branch === "string" && sync.branch.trim() ? sync.branch : "main",
76
+ };
77
+ }
78
+ function errorText(error) {
79
+ return error instanceof Error ? error.message : String(error);
80
+ }
81
+ function sameHome(left, right) {
82
+ return (left?.machineId ?? null) === (right?.machineId ?? null);
83
+ }
84
+ /** A readable machine name for a lease: the hostname without `.local`, or the id. */
85
+ function machineDisplayName(hostname, machineId) {
86
+ return hostname.trim().replace(/\.local$/, "") || machineId;
87
+ }
88
+ /** The last push failure the bundle sync recorded, if any. */
89
+ function recordedPushError(agentRoot) {
90
+ try {
91
+ const record = JSON.parse(fs.readFileSync(path.join(agentRoot, "state", "pending-sync.json"), "utf-8"));
92
+ return typeof record.error === "string" && record.error.trim() ? record.error.trim() : null;
93
+ }
94
+ catch {
95
+ return null;
96
+ }
97
+ }
98
+ /** Record this machine as the agent's home in its synced agent.json. */
99
+ async function moveAgentHomeHere(options) {
100
+ const { agent, machineId, machineName } = options;
101
+ const agentRoot = path.join(options.bundlesRoot, `${agent}.ouro`);
102
+ const configPath = path.join(agentRoot, "agent.json");
103
+ const git = options.execFileSync ?? child_process_1.execFileSync;
104
+ const network = options.network ?? SYNC_NETWORK;
105
+ const now = options.now ?? (() => new Date());
106
+ const run = (args) => git("git", args, { cwd: agentRoot, stdio: "pipe", timeout: 30_000 }).toString().trim();
107
+ (0, runtime_1.emitNervesEvent)({
108
+ component: "daemon",
109
+ event: "daemon.agent_home_move_start",
110
+ message: "moving agent home to this machine",
111
+ meta: { agent, machineId },
112
+ });
113
+ const finish = (result) => {
114
+ (0, runtime_1.emitNervesEvent)({
115
+ level: result.ok ? "info" : "warn",
116
+ component: "daemon",
117
+ event: result.ok ? "daemon.agent_home_move_end" : "daemon.agent_home_move_error",
118
+ message: result.message,
119
+ meta: { agent, machineId, changed: result.changed },
120
+ });
121
+ return result;
122
+ };
123
+ const refuse = (message) => finish({ ok: false, changed: false, message });
124
+ const readConfig = () => {
125
+ const text = fs.readFileSync(configPath, "utf-8");
126
+ return { text, parsed: JSON.parse(text) };
127
+ };
128
+ const writeHome = (parsed, current) => {
129
+ const home = { machineId, machineName, since: now().toISOString() };
130
+ if (current)
131
+ home.previous = { machineId: current.machineId, machineName: current.machineName };
132
+ fs.writeFileSync(configPath, `${JSON.stringify({ ...parsed, home }, null, 2)}\n`, "utf-8");
133
+ };
134
+ const movedMessage = (current) => `${agent} now lives on ${(0, agent_discovery_1.agentHomeLabel)({ machineId, machineName })}${current ? ` (moved from ${(0, agent_discovery_1.agentHomeLabel)(current)})` : ""}`;
135
+ let config;
136
+ try {
137
+ config = readConfig();
138
+ }
139
+ catch (error) {
140
+ return refuse(`cannot read ${configPath}: ${errorText(error)}`);
141
+ }
142
+ const sync = readSyncSettings(config.parsed);
143
+ const hasGit = fs.existsSync(path.join(agentRoot, ".git"));
144
+ if (!sync.enabled || !hasGit) {
145
+ const current = (0, agent_discovery_1.parseAgentHome)(config.parsed.home);
146
+ if (current?.machineId === machineId) {
147
+ return finish({ ok: true, changed: false, message: `${agent} already lives on this machine (${(0, agent_discovery_1.agentHomeLabel)(current)})` });
148
+ }
149
+ writeHome(config.parsed, current);
150
+ const why = sync.enabled ? "the bundle is not a git repo" : "bundle sync is off";
151
+ return finish({ ok: true, changed: true, message: `${movedMessage(current)}; ${why}, so only this machine sees the change` });
152
+ }
153
+ const pausedRefusal = (until) => refuse(`${agent}'s bundle sync is paused until ${until}, so nothing changed; run \`ouro move ${agent} here\` again after that`);
154
+ const pausedUntil = (0, sync_1.syncPausedUntil)(agentRoot);
155
+ if (pausedUntil !== null)
156
+ return pausedRefusal(pausedUntil);
157
+ const lock = await (0, sync_1.holdSyncLock)(agentRoot, options.lockWaitMs ?? MOVE_LOCK_WAIT_MS);
158
+ if ("busy" in lock) {
159
+ return refuse(`another bundle sync holds ${agent}'s lock${lock.holderPid === null ? "" : ` (pid ${lock.holderPid})`}, so nothing changed; try again in a moment`);
160
+ }
161
+ try {
162
+ // A pause can begin while this move waited for the lock (the replay gate
163
+ // pauses, then takes the lock), so look again now that the lock is ours.
164
+ const pausedNow = (0, sync_1.syncPausedUntil)(agentRoot);
165
+ if (pausedNow !== null)
166
+ return pausedRefusal(pausedNow);
167
+ if (run(["status", "--porcelain", "--", "agent.json"]).length > 0) {
168
+ return refuse(`${agent}'s agent.json has uncommitted changes, so nothing changed; commit or discard them first (git -C ${agentRoot} diff agent.json)`);
169
+ }
170
+ const hasRemote = run(["remote"]).split("\n").includes(sync.remote);
171
+ const tracking = (0, sync_1.syncTrackingRef)(sync);
172
+ let seen = null;
173
+ let lastPushError = "";
174
+ for (let attempt = 1; attempt <= MOVE_ATTEMPTS; attempt++) {
175
+ if (hasRemote) {
176
+ const fetched = await network.fetch(agentRoot, sync);
177
+ if (!fetched.ok) {
178
+ return refuse(`could not reach ${agent}'s bundle remote, so nothing changed: ${fetched.error}`);
179
+ }
180
+ try {
181
+ run(["rev-parse", "--verify", "-q", tracking]);
182
+ }
183
+ catch {
184
+ return refuse(`${agent}'s bundle remote has no ${sync.branch} branch to publish the move to, so nothing changed`);
185
+ }
186
+ const unpushed = Number(run(["rev-list", "--count", `${tracking}..HEAD`]));
187
+ if (unpushed > 0) {
188
+ const recorded = recordedPushError(agentRoot);
189
+ const why = recorded ? `the last bundle push failed with: ${recorded}` : `run \`ouro sync --agent ${agent}\` to see why they did not publish`;
190
+ return refuse(`${agent}'s bundle has ${unpushed} unpushed commit${unpushed === 1 ? "" : "s"}, so nothing changed; fix bundle sync first, because a move must not publish them as a side effect (${why})`);
191
+ }
192
+ try {
193
+ run(["merge", "--ff-only", "-q", tracking]);
194
+ }
195
+ catch (error) {
196
+ return refuse(`could not bring ${agent}'s bundle up to date with its remote, so nothing changed: ${errorText(error)}`);
197
+ }
198
+ config = readConfig();
199
+ }
200
+ const current = (0, agent_discovery_1.parseAgentHome)(config.parsed.home);
201
+ if (attempt === 1) {
202
+ seen = current;
203
+ }
204
+ else if (!sameHome(current, seen)) {
205
+ const winner = current ? (0, agent_discovery_1.agentHomeLabel)(current) : "no machine";
206
+ return refuse(`another machine changed ${agent}'s home while this move was being published (it now names ${winner}), so this move was undone; run \`ouro move ${agent} here\` again to take it over`);
207
+ }
208
+ if (current?.machineId === machineId) {
209
+ return finish({ ok: true, changed: false, message: `${agent} already lives on this machine (${(0, agent_discovery_1.agentHomeLabel)(current)})` });
210
+ }
211
+ writeHome(config.parsed, current);
212
+ try {
213
+ run(["-c", `user.name=${agent}`, "-c", `user.email=${agent}@ouro.local`, "commit", "-q", "-m", `home: ${agent} moves to ${machineName}`, "--", "agent.json"]);
214
+ }
215
+ catch (error) {
216
+ fs.writeFileSync(configPath, config.text, "utf-8");
217
+ return refuse(`could not commit the move, so nothing changed: ${errorText(error)}`);
218
+ }
219
+ if (!hasRemote) {
220
+ return finish({ ok: true, changed: true, message: `${movedMessage(current)}; the bundle has no remote, so only this machine sees the change` });
221
+ }
222
+ const pushed = await network.push(agentRoot, sync);
223
+ if (pushed.ok)
224
+ return finish({ ok: true, changed: true, message: movedMessage(current) });
225
+ lastPushError = pushed.error ?? "push failed";
226
+ // Undo exactly our own commit; the working tree goes back to the
227
+ // pre-move agent.json. If even that fails, say what to run by hand.
228
+ try {
229
+ run(["reset", "-q", "--soft", "HEAD~1"]);
230
+ run(["reset", "-q", "HEAD", "--", "agent.json"]);
231
+ fs.writeFileSync(configPath, config.text, "utf-8");
232
+ }
233
+ catch (error) {
234
+ return refuse(`the move could not be pushed (${lastPushError}) and its local commit could not be undone (${errorText(error)}); run \`git -C ${agentRoot} reset --soft HEAD~1\` and restore agent.json`);
235
+ }
236
+ }
237
+ return refuse(`could not push the move, so nothing changed: ${lastPushError}`);
238
+ }
239
+ catch (error) {
240
+ return refuse(`could not move ${agent}, so nothing changed: ${errorText(error)}`);
241
+ }
242
+ finally {
243
+ lock.release();
244
+ }
245
+ }
246
+ function execGit(cwd, args) {
247
+ return new Promise((resolve, reject) => {
248
+ (0, child_process_1.execFile)("git", args, { cwd, timeout: 20_000 }, (error, stdout) => {
249
+ if (error)
250
+ reject(error);
251
+ else
252
+ resolve(String(stdout));
253
+ });
254
+ });
255
+ }
256
+ /**
257
+ * Fetch `<remote>/<sync.branch>` (without touching the working tree) and read
258
+ * the lease in the remote's agent.json, so a machine notices a move away from
259
+ * it even while the agent is idle and never pulls. Fetch only, under the sync
260
+ * lock without waiting: a busy lock or a sync pause skips this check (unknown).
261
+ * It never commits or pushes.
262
+ */
263
+ async function readUpstreamAgentHome(agentRoot, git = execGit) {
264
+ try {
265
+ const sync = readSyncSettings(JSON.parse(fs.readFileSync(path.join(agentRoot, "agent.json"), "utf-8")));
266
+ if (!sync.enabled || !fs.existsSync(path.join(agentRoot, ".git")))
267
+ return undefined;
268
+ if ((0, sync_1.syncPausedUntil)(agentRoot) !== null)
269
+ return undefined;
270
+ const lock = await (0, sync_1.holdSyncLock)(agentRoot, 0);
271
+ if ("busy" in lock)
272
+ return undefined;
273
+ try {
274
+ const fetched = await (0, sync_1.fetchRemote)(agentRoot, sync);
275
+ if (!fetched.ok)
276
+ return undefined;
277
+ const upstream = JSON.parse(await git(agentRoot, ["show", `${(0, sync_1.syncTrackingRef)(sync)}:agent.json`]));
278
+ return (0, agent_discovery_1.parseAgentHome)(upstream.home);
279
+ }
280
+ finally {
281
+ lock.release();
282
+ }
283
+ }
284
+ catch {
285
+ return undefined;
286
+ }
287
+ }
288
+ /**
289
+ * Compare the agents a running daemon manages with their leases, both on disk
290
+ * and upstream. Running an agent homed elsewhere is a lease conflict: it is
291
+ * reported as critical and listed in `displaced` so the daemon stops it.
292
+ */
293
+ async function checkAgentHomes(options) {
294
+ const rows = (0, agent_discovery_1.listAllBundleAgents)({
295
+ bundlesRoot: options.bundlesRoot,
296
+ machineId: options.machineId,
297
+ hostnameAliases: options.hostnameAliases ?? [],
298
+ });
299
+ const managed = new Set(options.managedAgents);
300
+ const readUpstreamHome = options.readUpstreamHome ?? readUpstreamAgentHome;
301
+ const conflicts = [];
302
+ const runningUnclaimed = [];
303
+ for (const row of rows) {
304
+ if (!managed.has(row.name))
305
+ continue;
306
+ if (row.homeState === "elsewhere") {
307
+ conflicts.push({ name: row.name, where: `homed on ${row.homeMachine}` });
308
+ continue;
309
+ }
310
+ if (row.homeState === "unclaimed") {
311
+ conflicts.push({ name: row.name, where: "not homed here, and this machine runs only its own agents" });
312
+ continue;
313
+ }
314
+ if (row.homeState === "fallback")
315
+ runningUnclaimed.push(row.name);
316
+ }
317
+ for (const name of options.managedAgents) {
318
+ if (conflicts.some((conflict) => conflict.name === name))
319
+ continue;
320
+ const row = rows.find((candidate) => candidate.name === name);
321
+ if (!row || (row.homeState !== "here" && row.homeState !== "fallback"))
322
+ continue;
323
+ const upstream = await readUpstreamHome(path.join(options.bundlesRoot, `${name}.ouro`));
324
+ if (upstream && upstream.machineId !== options.machineId) {
325
+ conflicts.push({ name, where: `moved to ${(0, agent_discovery_1.agentHomeLabel)(upstream)} upstream` });
326
+ }
327
+ }
328
+ const waiting = rows.filter((row) => !managed.has(row.name) && row.homeState === "here" && !row.managementBlockedReason);
329
+ const lookalikes = rows.filter((row) => row.homeNameMatchesThisMachine && row.homeState === "elsewhere");
330
+ const parts = [];
331
+ if (conflicts.length > 0) {
332
+ parts.push(`lease conflict: stopped ${conflicts.map((conflict) => `${conflict.name} (${conflict.where})`).join(", ")} on this machine`);
333
+ (0, runtime_1.emitNervesEvent)({
334
+ level: "error",
335
+ component: "daemon",
336
+ event: "daemon.agent_home_conflict",
337
+ message: "daemon was running an agent homed on another machine; stopping it here",
338
+ meta: { agents: conflicts.map((conflict) => conflict.name), reasons: conflicts.map((conflict) => conflict.where) },
339
+ });
340
+ }
341
+ if (waiting.length > 0) {
342
+ parts.push(`homed here but not running: ${waiting.map((row) => row.name).join(", ")}; run \`ouro up\` to start`);
343
+ }
344
+ if (runningUnclaimed.length > 0) {
345
+ parts.push(`running without a home, so another machine may run ${runningUnclaimed.length === 1 ? "it" : "them"} too: ${runningUnclaimed.join(", ")}; claim with \`ouro move <agent> here\``);
346
+ }
347
+ for (const row of lookalikes) {
348
+ parts.push(`${row.name} is homed on ${row.homeMachine}, which has this machine's name but a different id; if this machine's identity was replaced, run \`ouro move ${row.name} here\``);
349
+ }
350
+ const displaced = conflicts.map((conflict) => conflict.name);
351
+ if (parts.length === 0) {
352
+ return { health: { name: "agent-home", status: "ok", message: "every running agent is homed here" }, displaced };
353
+ }
354
+ return { health: { name: "agent-home", status: conflicts.length > 0 ? "critical" : "warn", message: parts.join("; ") }, displaced };
355
+ }