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

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