@ouro.bot/cli 0.1.0-alpha.98 → 0.1.0-alpha.981

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 (763) 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 +6195 -16
  16. package/deploy/unraid/Dockerfile +58 -0
  17. package/deploy/unraid/INSTALL.md +64 -0
  18. package/deploy/unraid/README.txt +2997 -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/install.sh +274 -0
  25. package/deploy/unraid/migrate-sanctuary-bundle.mjs +63 -0
  26. package/deploy/unraid/ouro-events/bootstrap-spool.sh +92 -0
  27. package/deploy/unraid/ouro-events/emit-event.mjs +310 -0
  28. package/deploy/unraid/ouro-events/emit-usenet-event.sh +54 -0
  29. package/deploy/unraid/ouro-events/install-usenet-guard.sh +435 -0
  30. package/deploy/unraid/ouro-events/usenet-health.sh +176 -0
  31. package/deploy/unraid/sanctuary-acceptance-adapter.sh +43 -0
  32. package/deploy/unraid/sanctuary-acceptance-contract.json +198 -0
  33. package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
  34. package/deploy/unraid/sanctuary-authority-installation.json +36 -0
  35. package/deploy/unraid/sanctuary-authority-service.sh +30 -0
  36. package/deploy/unraid/sanctuary-butler-upgrade.mjs +1377 -0
  37. package/deploy/unraid/sanctuary-deployment-target.mjs +710 -0
  38. package/deploy/unraid/sanctuary-replay-gate.mjs +1776 -0
  39. package/deploy/unraid/sanctuary-safe-rename.py +24 -0
  40. package/deploy/unraid/sanctuary-unit16-host-broker.mjs +2088 -0
  41. package/deploy/unraid/sanctuary-unit16-run.sh +570 -0
  42. package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
  43. package/deploy/unraid/sanctuary.ouro/agent.json +66 -0
  44. package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
  45. package/deploy/unraid/sanctuary.ouro/awaiting/house-care-sweep.md +17 -0
  46. package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
  47. package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
  48. package/deploy/unraid/sanctuary.ouro/mcp/media-mcp.mjs +2255 -0
  49. package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
  50. package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
  51. package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +7 -0
  52. package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +33 -0
  53. package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +27 -0
  54. package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +21 -0
  55. package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
  56. package/deploy/unraid/sanctuary.ouro/tool-profiles.json +232 -0
  57. package/deploy/unraid/sanctuary.xml +29 -0
  58. package/dist/a2a/card.js +57 -0
  59. package/dist/a2a/client.js +250 -0
  60. package/dist/a2a/config.js +50 -0
  61. package/dist/a2a/delegated-command-grants.js +93 -0
  62. package/dist/a2a/delegated-command.js +197 -0
  63. package/dist/a2a/delegation-stores.js +56 -0
  64. package/dist/a2a/did-resolution.js +93 -0
  65. package/dist/a2a/escalation-grants.js +84 -0
  66. package/dist/a2a/escalation-wiring.js +60 -0
  67. package/dist/a2a/identity.js +258 -0
  68. package/dist/a2a/inbound-share.js +110 -0
  69. package/dist/a2a/mission-result-wire.js +196 -0
  70. package/dist/a2a/onboarding.js +133 -0
  71. package/dist/a2a/operator-trust.js +399 -0
  72. package/dist/a2a/outbox-client.js +57 -0
  73. package/dist/a2a/outbox-store.js +188 -0
  74. package/dist/a2a/outbox-wire.js +95 -0
  75. package/dist/a2a/pin-store.js +132 -0
  76. package/dist/a2a/replay-grant-holders.js +33 -0
  77. package/dist/a2a/replay-harness.js +188 -0
  78. package/dist/a2a/resolution-proof.js +53 -0
  79. package/dist/a2a/sealed-chat.js +113 -0
  80. package/dist/a2a/seen-ledger.js +120 -0
  81. package/dist/a2a/server.js +771 -0
  82. package/dist/a2a/task-store.js +69 -0
  83. package/dist/a2a/transport.js +45 -0
  84. package/dist/a2a/trust-commands.js +203 -0
  85. package/dist/a2a/trusted-files.js +185 -0
  86. package/dist/a2a/types.js +3 -0
  87. package/dist/arc/attention-types.js +8 -0
  88. package/dist/arc/cares.js +360 -0
  89. package/dist/arc/episodes.js +118 -0
  90. package/dist/arc/evolution.js +490 -0
  91. package/dist/arc/flight-recorder.js +1034 -0
  92. package/dist/arc/intentions.js +134 -0
  93. package/dist/arc/json-store.js +117 -0
  94. package/dist/arc/obligations.js +386 -0
  95. package/dist/arc/packets.js +336 -0
  96. package/dist/arc/presence.js +185 -0
  97. package/dist/arc/task-lifecycle.js +57 -0
  98. package/dist/commerce/store.js +755 -0
  99. package/dist/commerce/types.js +3 -0
  100. package/dist/gateway/keys.js +117 -0
  101. package/dist/gateway/server.js +429 -0
  102. package/dist/heart/active-work.js +798 -40
  103. package/dist/heart/agent-entry.js +252 -3
  104. package/dist/heart/approval-files.js +113 -0
  105. package/dist/heart/approval-store.js +960 -0
  106. package/dist/heart/attachments/image-normalize.js +201 -0
  107. package/dist/heart/attachments/materialize.js +97 -0
  108. package/dist/heart/attachments/originals.js +88 -0
  109. package/dist/heart/attachments/render.js +29 -0
  110. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  111. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  112. package/dist/heart/attachments/sources/index.js +18 -0
  113. package/dist/heart/attachments/sources/telegram.js +71 -0
  114. package/dist/heart/attachments/store.js +132 -0
  115. package/dist/heart/attachments/types.js +93 -0
  116. package/dist/heart/auth/auth-flow.js +511 -0
  117. package/dist/heart/autonomy-budget.js +478 -0
  118. package/dist/heart/awaiting/a2a-await-delivery.js +109 -0
  119. package/dist/heart/awaiting/await-alert.js +152 -0
  120. package/dist/heart/awaiting/await-expiry.js +143 -0
  121. package/dist/heart/awaiting/await-loader.js +91 -0
  122. package/dist/heart/awaiting/await-parser.js +152 -0
  123. package/dist/heart/awaiting/await-runtime-state.js +130 -0
  124. package/dist/heart/awaiting/await-scheduler.js +391 -0
  125. package/dist/heart/background-operations.js +281 -0
  126. package/dist/heart/bluebubbles-host-account.js +78 -0
  127. package/dist/heart/bridges/manager.js +137 -17
  128. package/dist/heart/bridges/store.js +14 -2
  129. package/dist/heart/bundle-state.js +168 -0
  130. package/dist/heart/commitments.js +44 -18
  131. package/dist/heart/config-registry.js +331 -0
  132. package/dist/heart/config.js +178 -131
  133. package/dist/heart/context-loss-gauntlet.js +387 -0
  134. package/dist/heart/context-loss-sentinel.js +1204 -0
  135. package/dist/heart/core.js +2377 -586
  136. package/dist/heart/cross-chat-delivery.js +9 -22
  137. package/dist/heart/daemon/agent-config-check.js +474 -0
  138. package/dist/heart/daemon/agent-discovery.js +283 -3
  139. package/dist/heart/daemon/agent-home.js +319 -0
  140. package/dist/heart/daemon/agent-service.js +542 -0
  141. package/dist/heart/daemon/agentic-repair.js +547 -0
  142. package/dist/heart/daemon/await-private-wake.js +59 -0
  143. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  144. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  145. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  146. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  147. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  148. package/dist/heart/daemon/cadence.js +180 -0
  149. package/dist/heart/daemon/cli-arg-redaction.js +26 -0
  150. package/dist/heart/daemon/cli-defaults.js +881 -0
  151. package/dist/heart/daemon/cli-desk.js +331 -0
  152. package/dist/heart/daemon/cli-exec.js +9272 -0
  153. package/dist/heart/daemon/cli-help.js +754 -0
  154. package/dist/heart/daemon/cli-parse.js +3329 -0
  155. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  156. package/dist/heart/daemon/cli-render.js +819 -0
  157. package/dist/heart/daemon/cli-types.js +8 -0
  158. package/dist/heart/daemon/connect-bay.js +323 -0
  159. package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
  160. package/dist/heart/daemon/container-healthcheck.js +112 -0
  161. package/dist/heart/daemon/container-runtime.js +97 -0
  162. package/dist/heart/daemon/container-spec-auditor-main.js +171 -0
  163. package/dist/heart/daemon/container-spec-auditor.js +241 -0
  164. package/dist/heart/daemon/daemon-bootstrap-startup.js +115 -0
  165. package/dist/heart/daemon/daemon-cli.js +29 -2373
  166. package/dist/heart/daemon/daemon-entry.js +953 -11
  167. package/dist/heart/daemon/daemon-health.js +186 -0
  168. package/dist/heart/daemon/daemon-rollup.js +57 -0
  169. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  170. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  171. package/dist/heart/daemon/daemon.js +2110 -104
  172. package/dist/heart/daemon/desk-admin.js +420 -0
  173. package/dist/heart/daemon/dns-workflow.js +394 -0
  174. package/dist/heart/daemon/doctor-types.js +8 -0
  175. package/dist/heart/daemon/doctor.js +1766 -0
  176. package/dist/heart/daemon/freshness.js +345 -0
  177. package/dist/heart/daemon/habit-private-wake.js +61 -0
  178. package/dist/heart/daemon/health-monitor.js +154 -11
  179. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  180. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  181. package/dist/heart/daemon/http-health-probe.js +80 -0
  182. package/dist/heart/daemon/human-command-screens.js +234 -0
  183. package/dist/heart/daemon/human-readiness.js +114 -0
  184. package/dist/heart/daemon/inner-status.js +78 -0
  185. package/dist/heart/daemon/interactive-repair.js +394 -0
  186. package/dist/heart/daemon/launchd.js +37 -8
  187. package/dist/heart/daemon/log-tailer.js +79 -10
  188. package/dist/heart/daemon/logs-prune.js +132 -0
  189. package/dist/heart/daemon/mcp-canary.js +524 -0
  190. package/dist/heart/daemon/message-router.js +65 -5
  191. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  192. package/dist/heart/daemon/os-cron-deps.js +135 -0
  193. package/dist/heart/daemon/os-cron.js +22 -14
  194. package/dist/heart/daemon/ouro-bot-entry.js +6 -3
  195. package/dist/heart/daemon/ouro-entry.js +9 -3
  196. package/dist/heart/daemon/plugin-cli.js +432 -0
  197. package/dist/heart/daemon/process-manager.js +760 -61
  198. package/dist/heart/daemon/provider-discovery.js +137 -0
  199. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  200. package/dist/heart/daemon/prunable-bundle.js +144 -0
  201. package/dist/heart/daemon/pulse.js +511 -0
  202. package/dist/heart/daemon/readiness-repair.js +365 -0
  203. package/dist/heart/daemon/run-hooks.js +2 -0
  204. package/dist/heart/daemon/runtime-logging.js +47 -14
  205. package/dist/heart/daemon/runtime-metadata.js +2 -30
  206. package/dist/heart/daemon/runtime-mode.js +13 -2
  207. package/dist/heart/daemon/safe-mode.js +161 -0
  208. package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2662 -0
  209. package/dist/heart/daemon/sanctuary-acceptance-harness.js +1832 -0
  210. package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
  211. package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +956 -0
  212. package/dist/heart/daemon/sanctuary-authority-codec.js +86 -0
  213. package/dist/heart/daemon/sanctuary-authority-epoch.js +291 -0
  214. package/dist/heart/daemon/sanctuary-authority-installation.js +161 -0
  215. package/dist/heart/daemon/sanctuary-authority-ledger.js +241 -0
  216. package/dist/heart/daemon/sanctuary-authority-root-lifecycle.js +1326 -0
  217. package/dist/heart/daemon/sanctuary-authority-vault-migration.js +79 -0
  218. package/dist/heart/daemon/sanctuary-bundle-migration.js +851 -0
  219. package/dist/heart/daemon/sanctuary-host-authority.js +1008 -0
  220. package/dist/heart/daemon/sanctuary-host-detached-supervisor.js +493 -0
  221. package/dist/heart/daemon/sanctuary-host-executor.js +670 -0
  222. package/dist/heart/daemon/sanctuary-host-linux-kernel.js +334 -0
  223. package/dist/heart/daemon/sanctuary-host-supervisor-entry.js +207 -0
  224. package/dist/heart/daemon/sanctuary-host-supervisor.js +95 -0
  225. package/dist/heart/daemon/sanctuary-package-management.js +103 -0
  226. package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
  227. package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
  228. package/dist/heart/daemon/sanctuary-telegram-authority-entry.js +475 -0
  229. package/dist/heart/daemon/sanctuary-telegram-authority-gateway.js +585 -0
  230. package/dist/heart/daemon/sanctuary-telegram-authority-service.js +676 -0
  231. package/dist/heart/daemon/sense-manager.js +786 -48
  232. package/dist/heart/daemon/session-id-resolver.js +131 -0
  233. package/dist/heart/daemon/skill-management-installer.js +1 -1
  234. package/dist/heart/daemon/socket-client.js +180 -12
  235. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  236. package/dist/heart/daemon/startup-tui.js +339 -0
  237. package/dist/heart/daemon/supercronic-supervisor.js +282 -0
  238. package/dist/heart/daemon/task-scheduler.js +117 -39
  239. package/dist/heart/daemon/terminal-ui.js +503 -0
  240. package/dist/heart/daemon/thoughts.js +138 -54
  241. package/dist/heart/daemon/up-progress.js +366 -0
  242. package/dist/heart/daemon/vault-items.js +56 -0
  243. package/dist/heart/delegation.js +1 -4
  244. package/dist/heart/external-events/router.js +1531 -0
  245. package/dist/heart/failure-reports.js +336 -0
  246. package/dist/heart/file-lock.js +109 -0
  247. package/dist/heart/frontend-approval-runtime.js +506 -0
  248. package/dist/heart/frontend-journal.js +215 -0
  249. package/dist/heart/frontend-session-service.js +271 -0
  250. package/dist/heart/frontend-socket-client.js +173 -0
  251. package/dist/heart/frontend-socket.js +434 -0
  252. package/dist/heart/frontend-turn-errors.js +20 -0
  253. package/dist/heart/habits/habit-cancel.js +810 -0
  254. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  255. package/dist/heart/habits/habit-migration.js +194 -0
  256. package/dist/heart/habits/habit-parser.js +278 -0
  257. package/dist/heart/habits/habit-runtime-state.js +93 -0
  258. package/dist/heart/habits/habit-scheduler.js +653 -0
  259. package/dist/heart/habits/habit-session-summary.js +318 -0
  260. package/dist/heart/habits/habit-session.js +636 -0
  261. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
  262. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  263. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  264. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  265. package/dist/heart/identity.js +239 -59
  266. package/dist/heart/kept-notes.js +289 -0
  267. package/dist/heart/kicks.js +1 -1
  268. package/dist/heart/machine-identity.js +175 -0
  269. package/dist/heart/mail-import-discovery.js +356 -0
  270. package/dist/heart/mailbox/mailbox-http-hooks.js +99 -0
  271. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  272. package/dist/heart/mailbox/mailbox-http-routes.js +406 -0
  273. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  274. package/dist/heart/mailbox/mailbox-http-transport.js +272 -0
  275. package/dist/heart/mailbox/mailbox-http.js +99 -0
  276. package/dist/heart/mailbox/mailbox-read.js +41 -0
  277. package/dist/heart/mailbox/mailbox-supervision.js +131 -0
  278. package/dist/heart/mailbox/mailbox-types.js +27 -0
  279. package/dist/heart/mailbox/mailbox-view.js +197 -0
  280. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  281. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  282. package/dist/heart/mailbox/readers/mail.js +375 -0
  283. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  284. package/dist/heart/mailbox/readers/sessions.js +231 -0
  285. package/dist/heart/mailbox/readers/shared.js +111 -0
  286. package/dist/heart/mcp/mcp-server.js +760 -0
  287. package/dist/heart/migrate-config.js +100 -0
  288. package/dist/heart/model-capabilities.js +83 -16
  289. package/dist/heart/orientation-frame.js +376 -0
  290. package/dist/heart/platform.js +81 -0
  291. package/dist/heart/primitives.js +1 -1
  292. package/dist/heart/private-runtime/decision-renderer.js +158 -0
  293. package/dist/heart/private-runtime/index.js +18 -0
  294. package/dist/heart/private-runtime/ledger.js +221 -0
  295. package/dist/heart/private-runtime/policy.js +260 -0
  296. package/dist/heart/private-runtime/types.js +2 -0
  297. package/dist/heart/progress-story.js +1 -1
  298. package/dist/heart/provider-attempt.js +137 -0
  299. package/dist/heart/provider-binding-resolver.js +273 -0
  300. package/dist/heart/provider-credentials.js +449 -0
  301. package/dist/heart/provider-failover.js +311 -0
  302. package/dist/heart/provider-models.js +96 -0
  303. package/dist/heart/provider-ping.js +266 -0
  304. package/dist/heart/provider-readiness-cache.js +119 -0
  305. package/dist/heart/provider-visibility.js +188 -0
  306. package/dist/heart/providers/anthropic-token.js +131 -0
  307. package/dist/heart/providers/anthropic.js +248 -67
  308. package/dist/heart/providers/azure.js +23 -11
  309. package/dist/heart/providers/error-classification.js +129 -0
  310. package/dist/heart/providers/github-copilot.js +38 -39
  311. package/dist/heart/providers/minimax-vlm.js +189 -0
  312. package/dist/heart/providers/minimax.js +26 -8
  313. package/dist/heart/providers/openai-codex-token.js +349 -0
  314. package/dist/heart/providers/openai-codex.js +55 -40
  315. package/dist/heart/providers/openai-compatible.js +177 -0
  316. package/dist/heart/reach-channel.js +85 -0
  317. package/dist/heart/reply-style.js +52 -0
  318. package/dist/heart/run-ledger.js +247 -0
  319. package/dist/heart/runtime-capability-check.js +170 -0
  320. package/dist/heart/runtime-credentials.js +608 -0
  321. package/dist/heart/runtime-cwd.js +87 -0
  322. package/dist/heart/sense-truth.js +24 -4
  323. package/dist/heart/session-activity.js +94 -24
  324. package/dist/heart/session-events.js +1521 -0
  325. package/dist/heart/session-playback-cli-main.js +5 -0
  326. package/dist/heart/session-playback-cli.js +36 -0
  327. package/dist/heart/session-playback.js +231 -0
  328. package/dist/heart/session-redaction-repair-cli-main.js +31 -0
  329. package/dist/heart/session-redaction-repair.js +552 -0
  330. package/dist/heart/session-stats-cli-main.js +5 -0
  331. package/dist/heart/session-stats.js +183 -0
  332. package/dist/heart/session-transcript.js +133 -0
  333. package/dist/heart/shelf-claims.js +78 -0
  334. package/dist/heart/shepherd/custody-types.js +2 -0
  335. package/dist/heart/shepherd/mandates.js +352 -0
  336. package/dist/heart/shepherd/operation-commands.js +19 -0
  337. package/dist/heart/shepherd/operations.js +135 -0
  338. package/dist/heart/shepherd/supervision.js +114 -0
  339. package/dist/heart/shepherd/types.js +2 -0
  340. package/dist/heart/shepherd-config.js +123 -0
  341. package/dist/heart/source-grounding.js +313 -0
  342. package/dist/heart/start-of-turn-packet.js +372 -0
  343. package/dist/heart/steward-policy.js +656 -0
  344. package/dist/heart/streaming.js +631 -207
  345. package/dist/heart/structured-output.js +196 -0
  346. package/dist/heart/sync-classification.js +176 -0
  347. package/dist/heart/sync-health.js +152 -0
  348. package/dist/heart/sync.js +726 -0
  349. package/dist/heart/target-resolution.js +11 -7
  350. package/dist/heart/tempo.js +93 -0
  351. package/dist/heart/temporal-view.js +41 -0
  352. package/dist/heart/timeouts.js +101 -0
  353. package/dist/heart/tool-activity-callbacks.js +59 -0
  354. package/dist/heart/tool-approval.js +382 -0
  355. package/dist/heart/tool-description.js +155 -0
  356. package/dist/heart/tool-friction.js +55 -0
  357. package/dist/heart/tool-loop.js +206 -0
  358. package/dist/heart/turn-context.js +496 -0
  359. package/dist/heart/turn-execution-lease.js +30 -0
  360. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  361. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +3 -2
  362. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  363. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  364. package/dist/heart/versioning/ouro-version-manager.js +432 -0
  365. package/dist/heart/versioning/release-sources.js +173 -0
  366. package/dist/heart/versioning/self-update-defaults.js +294 -0
  367. package/dist/heart/versioning/self-update.js +196 -0
  368. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  369. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  370. package/dist/heart/versioning/update-hooks.js +154 -0
  371. package/dist/heart/versioning/update-state.js +126 -0
  372. package/dist/heart/versioning/updater-launchd.js +150 -0
  373. package/dist/heart/versioning/version-intent.js +114 -0
  374. package/dist/heart/work-card.js +380 -0
  375. package/dist/mailbox-ui/assets/index-Dbska1tZ.js +1 -0
  376. package/dist/mailbox-ui/assets/index-DsiKaPyH.css +1 -0
  377. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  378. package/dist/mailbox-ui/index.html +16 -0
  379. package/dist/mailroom/attention.js +167 -0
  380. package/dist/mailroom/autonomy.js +209 -0
  381. package/dist/mailroom/blob-store.js +889 -0
  382. package/dist/mailroom/body-cache.js +61 -0
  383. package/dist/mailroom/cache-sync-cli.js +58 -0
  384. package/dist/mailroom/core.js +803 -0
  385. package/dist/mailroom/entry.js +160 -0
  386. package/dist/mailroom/file-store.js +568 -0
  387. package/dist/mailroom/hosted-cache-sync.js +384 -0
  388. package/dist/mailroom/mbox-import.js +393 -0
  389. package/dist/mailroom/migration.js +164 -0
  390. package/dist/mailroom/outbound.js +380 -0
  391. package/dist/mailroom/policy.js +263 -0
  392. package/dist/mailroom/reader.js +292 -0
  393. package/dist/mailroom/search-cache.js +513 -0
  394. package/dist/mailroom/search-relevance.js +319 -0
  395. package/dist/mailroom/smtp-ingress.js +176 -0
  396. package/dist/mailroom/source-state.js +176 -0
  397. package/dist/mailroom/thread.js +109 -0
  398. package/dist/mailroom/travel-extract.js +89 -0
  399. package/dist/mind/bundle-manifest.js +24 -2
  400. package/dist/mind/context.js +328 -139
  401. package/dist/mind/desk-section.js +362 -0
  402. package/dist/mind/diary-integrity.js +60 -0
  403. package/dist/mind/{memory.js → diary.js} +68 -77
  404. package/dist/mind/embedding-provider.js +60 -0
  405. package/dist/mind/file-state.js +179 -0
  406. package/dist/mind/friend-link-codes.js +209 -0
  407. package/dist/mind/friend-merge.js +336 -0
  408. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  409. package/dist/mind/obligation-steering.js +199 -3
  410. package/dist/mind/outbound-record.js +168 -0
  411. package/dist/mind/pending.js +36 -10
  412. package/dist/mind/prompt-budget.js +479 -0
  413. package/dist/mind/prompt-refresh.js +3 -2
  414. package/dist/mind/prompt.js +1166 -203
  415. package/dist/mind/provenance-trust.js +26 -0
  416. package/dist/mind/record-paths.js +312 -0
  417. package/dist/mind/scrutiny.js +173 -0
  418. package/dist/mind/session-transaction.js +622 -0
  419. package/dist/nerves/cli-logging.js +7 -1
  420. package/dist/nerves/coverage/audit-rules.js +15 -6
  421. package/dist/nerves/coverage/audit.js +28 -2
  422. package/dist/nerves/coverage/cli.js +1 -1
  423. package/dist/nerves/coverage/contract.js +5 -5
  424. package/dist/nerves/coverage/file-completeness.js +143 -5
  425. package/dist/nerves/coverage/run-artifacts.js +55 -35
  426. package/dist/nerves/coverage/source-scanner.js +4 -4
  427. package/dist/nerves/event-buffer.js +111 -0
  428. package/dist/nerves/index.js +293 -9
  429. package/dist/nerves/observation.js +20 -0
  430. package/dist/nerves/redact.js +79 -0
  431. package/dist/nerves/review/cli-main.js +5 -0
  432. package/dist/nerves/review/cli.js +156 -0
  433. package/dist/nerves/review/core.js +159 -0
  434. package/dist/nerves/runtime.js +17 -1
  435. package/dist/repertoire/ado-client.js +15 -56
  436. package/dist/repertoire/ado-semantic.js +16 -10
  437. package/dist/repertoire/api-client.js +97 -0
  438. package/dist/repertoire/bitwarden-store.js +1199 -0
  439. package/dist/repertoire/bundle-templates.js +71 -0
  440. package/dist/repertoire/bw-installer.js +231 -0
  441. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  442. package/dist/repertoire/coding/context-pack.js +331 -0
  443. package/dist/repertoire/coding/feedback.js +146 -34
  444. package/dist/repertoire/coding/index.js +15 -3
  445. package/dist/repertoire/coding/manager.js +159 -10
  446. package/dist/repertoire/coding/spawner.js +40 -11
  447. package/dist/repertoire/coding/tools.js +182 -18
  448. package/dist/repertoire/coding/workbench-client.js +272 -0
  449. package/dist/repertoire/coding/workbench-manager.js +346 -0
  450. package/dist/repertoire/commerce-errors.js +109 -0
  451. package/dist/repertoire/commerce-self-test.js +156 -0
  452. package/dist/repertoire/credential-access.js +183 -0
  453. package/dist/repertoire/desk/classifier.js +362 -0
  454. package/dist/repertoire/duffel-client.js +185 -0
  455. package/dist/repertoire/github-client.js +14 -55
  456. package/dist/repertoire/graph-client.js +11 -52
  457. package/dist/repertoire/guardrails.js +971 -20
  458. package/dist/repertoire/house-sweep.js +471 -0
  459. package/dist/repertoire/mcp-client.js +58 -5
  460. package/dist/repertoire/mcp-manager.js +427 -139
  461. package/dist/repertoire/mcp-tools.js +132 -0
  462. package/dist/repertoire/mcp-write-guard.js +46 -0
  463. package/dist/repertoire/plugin-mcp.js +175 -0
  464. package/dist/repertoire/plugins.js +253 -0
  465. package/dist/repertoire/relationship-authorization.js +322 -0
  466. package/dist/repertoire/sanctuary-container-policy.js +50 -0
  467. package/dist/repertoire/shell-sessions.js +134 -0
  468. package/dist/repertoire/skills.js +48 -4
  469. package/dist/repertoire/stripe-client.js +131 -0
  470. package/dist/repertoire/tool-arguments.js +182 -0
  471. package/dist/repertoire/tool-results.js +29 -0
  472. package/dist/repertoire/tools-a2a.js +699 -0
  473. package/dist/repertoire/tools-attachments.js +322 -0
  474. package/dist/repertoire/tools-awaiting.js +897 -0
  475. package/dist/repertoire/tools-base.js +83 -1168
  476. package/dist/repertoire/tools-bluebubbles.js +2 -0
  477. package/dist/repertoire/tools-bridge.js +144 -0
  478. package/dist/repertoire/tools-bundle.js +995 -0
  479. package/dist/repertoire/tools-commerce.js +253 -0
  480. package/dist/repertoire/tools-config.js +186 -0
  481. package/dist/repertoire/tools-continuity.js +588 -0
  482. package/dist/repertoire/tools-credential.js +383 -0
  483. package/dist/repertoire/tools-escalation.js +84 -0
  484. package/dist/repertoire/tools-evolution.js +527 -0
  485. package/dist/repertoire/tools-files.js +344 -0
  486. package/dist/repertoire/tools-flight.js +290 -0
  487. package/dist/repertoire/tools-flow.js +119 -0
  488. package/dist/repertoire/tools-friend-link.js +57 -0
  489. package/dist/repertoire/tools-github.js +3 -8
  490. package/dist/repertoire/tools-habits.js +103 -0
  491. package/dist/repertoire/tools-house-care.js +174 -0
  492. package/dist/repertoire/tools-mail.js +1828 -0
  493. package/dist/repertoire/tools-notes.js +501 -0
  494. package/dist/repertoire/tools-obligations.js +182 -0
  495. package/dist/repertoire/tools-orientation.js +31 -0
  496. package/dist/repertoire/tools-record.js +482 -0
  497. package/dist/repertoire/tools-rsvp.js +139 -0
  498. package/dist/repertoire/tools-runtime.js +238 -0
  499. package/dist/repertoire/tools-sanctuary-host.js +202 -0
  500. package/dist/repertoire/tools-session.js +1141 -0
  501. package/dist/repertoire/tools-shell.js +154 -0
  502. package/dist/repertoire/tools-shepherd-guidance.js +171 -0
  503. package/dist/repertoire/tools-shepherd.js +325 -0
  504. package/dist/repertoire/tools-steward-policy.js +147 -0
  505. package/dist/repertoire/tools-stripe.js +224 -0
  506. package/dist/repertoire/tools-surface.js +369 -0
  507. package/dist/repertoire/tools-teams.js +50 -39
  508. package/dist/repertoire/tools-telegram-contacts.js +37 -0
  509. package/dist/repertoire/tools-travel.js +125 -0
  510. package/dist/repertoire/tools-trip.js +982 -0
  511. package/dist/repertoire/tools-unraid.js +556 -0
  512. package/dist/repertoire/tools-user-profile.js +146 -0
  513. package/dist/repertoire/tools-vault.js +40 -0
  514. package/dist/repertoire/tools-voice-local.js +198 -0
  515. package/dist/repertoire/tools-voice.js +145 -0
  516. package/dist/repertoire/tools.js +518 -156
  517. package/dist/repertoire/travel-api-client.js +360 -0
  518. package/dist/repertoire/unraid-client.js +155 -0
  519. package/dist/repertoire/unraid-restart.js +339 -0
  520. package/dist/repertoire/user-profile.js +131 -0
  521. package/dist/repertoire/vault-setup.js +246 -0
  522. package/dist/repertoire/vault-unlock.js +686 -0
  523. package/dist/rsvp/aisleplanner-client.js +354 -0
  524. package/dist/rsvp/cli.js +936 -0
  525. package/dist/rsvp/config.js +327 -0
  526. package/dist/rsvp/cutover.js +453 -0
  527. package/dist/rsvp/diagnostics.js +232 -0
  528. package/dist/rsvp/diff-renderer.js +176 -0
  529. package/dist/rsvp/habit-policy.js +110 -0
  530. package/dist/rsvp/habit-stage.js +123 -0
  531. package/dist/rsvp/incident-bundle.js +97 -0
  532. package/dist/rsvp/migration.js +204 -0
  533. package/dist/rsvp/native-habit-runner.js +630 -0
  534. package/dist/rsvp/outbound-state.js +628 -0
  535. package/dist/rsvp/query.js +118 -0
  536. package/dist/rsvp/replay.js +233 -0
  537. package/dist/rsvp/snapshot.js +232 -0
  538. package/dist/rsvp/spend-ledger.js +175 -0
  539. package/dist/scripts/claude-code-hook.js +41 -0
  540. package/dist/scripts/claude-code-stop-hook.js +47 -0
  541. package/dist/senses/a2a-entry.js +132 -0
  542. package/dist/senses/acp-server.js +386 -0
  543. package/dist/senses/attention-queue.js +186 -0
  544. package/dist/senses/await-turn-message.js +65 -0
  545. package/dist/senses/bluebubbles/active-turns.js +216 -0
  546. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  547. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  548. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +393 -43
  549. package/dist/senses/bluebubbles/context-packet.js +207 -0
  550. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  551. package/dist/senses/bluebubbles/entry.js +90 -0
  552. package/dist/senses/bluebubbles/host-account-verifier.js +88 -0
  553. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
  554. package/dist/senses/bluebubbles/index.js +4054 -0
  555. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  556. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  557. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
  558. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
  559. package/dist/senses/bluebubbles/outbound-state.js +335 -0
  560. package/dist/senses/bluebubbles/processed-log.js +133 -0
  561. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  562. package/dist/senses/bluebubbles/replay.js +284 -0
  563. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  564. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  565. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  566. package/dist/senses/bluebubbles/webhook-registration.js +257 -0
  567. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  568. package/dist/senses/cli/bracketed-paste.js +82 -0
  569. package/dist/senses/cli/image-paste.js +287 -0
  570. package/dist/senses/cli/image-ref-navigation.js +75 -0
  571. package/dist/senses/cli/ink-app.js +156 -0
  572. package/dist/senses/cli/inline-diff.js +64 -0
  573. package/dist/senses/cli/input-keys.js +174 -0
  574. package/dist/senses/cli/kill-ring.js +86 -0
  575. package/dist/senses/cli/message-list.js +51 -0
  576. package/dist/senses/cli/ouro-tui.js +607 -0
  577. package/dist/senses/cli/spinner-imperative.js +135 -0
  578. package/dist/senses/cli/spinner.js +101 -0
  579. package/dist/senses/cli/status-line.js +60 -0
  580. package/dist/senses/cli/streaming-markdown.js +526 -0
  581. package/dist/senses/cli/tool-display.js +85 -0
  582. package/dist/senses/cli/tool-render.js +85 -0
  583. package/dist/senses/cli/tui-store.js +241 -0
  584. package/dist/senses/cli/virtual-list.js +35 -0
  585. package/dist/senses/cli-entry.js +60 -8
  586. package/dist/senses/cli.js +570 -309
  587. package/dist/senses/commands.js +66 -3
  588. package/dist/senses/context-packet-ledger.js +371 -0
  589. package/dist/senses/context-packets.js +154 -0
  590. package/dist/senses/habit-lifecycle-guard.js +24 -0
  591. package/dist/senses/habit-turn-message.js +160 -0
  592. package/dist/senses/ingress-evidence.js +2 -0
  593. package/dist/senses/mail-entry.js +66 -0
  594. package/dist/senses/mail.js +524 -0
  595. package/dist/senses/pipeline.js +1158 -204
  596. package/dist/senses/private-runtime-worker.js +857 -0
  597. package/dist/senses/private-runtime.js +1627 -0
  598. package/dist/senses/proactive-content-guard.js +51 -0
  599. package/dist/senses/root-host-approval-port.js +345 -0
  600. package/dist/senses/root-host-approval-runtime.js +393 -0
  601. package/dist/senses/sanctuary-authority-resident.js +102 -0
  602. package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
  603. package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
  604. package/dist/senses/sanctuary-grounding.js +118 -0
  605. package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
  606. package/dist/senses/sanctuary-health-acceptance-probe.js +786 -0
  607. package/dist/senses/sanctuary-health-runner.js +106 -0
  608. package/dist/senses/sanctuary-health.js +442 -0
  609. package/dist/senses/sanctuary-house.js +97 -0
  610. package/dist/senses/sanctuary-install-state-contract.js +169 -0
  611. package/dist/senses/sanctuary-interactive-control.js +410 -0
  612. package/dist/senses/sanctuary-media-catalog-contract.js +268 -0
  613. package/dist/senses/sanctuary-media-optimization.js +517 -0
  614. package/dist/senses/sanctuary-runtime.js +390 -0
  615. package/dist/senses/sanctuary-sab.js +85 -0
  616. package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
  617. package/dist/senses/shared-turn.js +832 -0
  618. package/dist/senses/shepherd/agent-presentation.js +88 -0
  619. package/dist/senses/shepherd/attention-page.js +166 -0
  620. package/dist/senses/shepherd/attention-sidebar.js +76 -0
  621. package/dist/senses/shepherd/attention.js +295 -0
  622. package/dist/senses/shepherd/checkin-config.js +76 -0
  623. package/dist/senses/shepherd/checkin-store.js +386 -0
  624. package/dist/senses/shepherd/client.js +196 -0
  625. package/dist/senses/shepherd/cmux.js +483 -0
  626. package/dist/senses/shepherd/composer.js +336 -0
  627. package/dist/senses/shepherd/copilot-app.js +648 -0
  628. package/dist/senses/shepherd/feedback-reply.js +108 -0
  629. package/dist/senses/shepherd/feedback-source.js +20 -0
  630. package/dist/senses/shepherd/feedback-store.js +331 -0
  631. package/dist/senses/shepherd/feedback-submit.js +182 -0
  632. package/dist/senses/shepherd/feedback-worker.js +208 -0
  633. package/dist/senses/shepherd/guidance.js +273 -0
  634. package/dist/senses/shepherd/herdr.js +427 -0
  635. package/dist/senses/shepherd/host.js +17 -0
  636. package/dist/senses/shepherd/human-decision-guard.js +29 -0
  637. package/dist/senses/shepherd/judge-evaluation-command.js +183 -0
  638. package/dist/senses/shepherd/judge-evaluation-entry.js +13 -0
  639. package/dist/senses/shepherd/judge-evaluation.js +155 -0
  640. package/dist/senses/shepherd/judge.js +210 -0
  641. package/dist/senses/shepherd/notice-outbox.js +262 -0
  642. package/dist/senses/shepherd/observation-publisher.js +320 -0
  643. package/dist/senses/shepherd/operations-defaults.js +86 -0
  644. package/dist/senses/shepherd/operations.js +159 -0
  645. package/dist/senses/shepherd/owner-notice.js +489 -0
  646. package/dist/senses/shepherd/prompt-state.js +60 -0
  647. package/dist/senses/shepherd/recovery.js +543 -0
  648. package/dist/senses/shepherd/redact.js +66 -0
  649. package/dist/senses/shepherd/returns.js +79 -0
  650. package/dist/senses/shepherd/sense.js +849 -0
  651. package/dist/senses/shepherd/shepherd-judge-corpus-v1.json +170 -0
  652. package/dist/senses/shepherd/surface.js +123 -0
  653. package/dist/senses/shepherd/target-binding.js +13 -0
  654. package/dist/senses/shepherd/terminal-process.js +147 -0
  655. package/dist/senses/shepherd-entry.js +98 -0
  656. package/dist/senses/surface-tool.js +109 -0
  657. package/dist/senses/teams-entry.js +68 -8
  658. package/dist/senses/teams-image.js +119 -0
  659. package/dist/senses/teams.js +998 -337
  660. package/dist/senses/telegram-admission.js +718 -0
  661. package/dist/senses/telegram-approval-runtime.js +793 -0
  662. package/dist/senses/telegram-attachments.js +186 -0
  663. package/dist/senses/telegram-audit-ledger.js +220 -0
  664. package/dist/senses/telegram-authority-transport.js +231 -0
  665. package/dist/senses/telegram-client.js +1755 -0
  666. package/dist/senses/telegram-effect-adapter.js +904 -0
  667. package/dist/senses/telegram-entry.js +83 -0
  668. package/dist/senses/telegram-handoff.js +154 -0
  669. package/dist/senses/telegram.js +2474 -0
  670. package/dist/senses/trust-gate.js +104 -9
  671. package/dist/senses/voice/audio-playback.js +237 -0
  672. package/dist/senses/voice/audio-routing.js +119 -0
  673. package/dist/senses/voice/call-auth.js +250 -0
  674. package/dist/senses/voice/elevenlabs.js +202 -0
  675. package/dist/senses/voice/floor-control.js +431 -0
  676. package/dist/senses/voice/floor-controller.js +115 -0
  677. package/dist/senses/voice/golden-path.js +116 -0
  678. package/dist/senses/voice/index.js +29 -0
  679. package/dist/senses/voice/local-audio-control.js +344 -0
  680. package/dist/senses/voice/local-audio-devices.js +516 -0
  681. package/dist/senses/voice/local-audio-disclosure.js +174 -0
  682. package/dist/senses/voice/local-audio-identity.js +103 -0
  683. package/dist/senses/voice/local-audio-join.js +325 -0
  684. package/dist/senses/voice/local-audio-mute.js +199 -0
  685. package/dist/senses/voice/local-audio-notify.js +124 -0
  686. package/dist/senses/voice/local-audio-prompts.js +116 -0
  687. package/dist/senses/voice/local-audio-transport.js +427 -0
  688. package/dist/senses/voice/local-audio.js +281 -0
  689. package/dist/senses/voice/local-media-stream.js +145 -0
  690. package/dist/senses/voice/meeting.js +113 -0
  691. package/dist/senses/voice/outbound.js +190 -0
  692. package/dist/senses/voice/phone.js +33 -0
  693. package/dist/senses/voice/playback.js +139 -0
  694. package/dist/senses/voice/process-guards.js +51 -0
  695. package/dist/senses/voice/realtime-eval.js +496 -0
  696. package/dist/senses/voice/realtime-tool-schema.js +195 -0
  697. package/dist/senses/voice/realtime-trace.js +531 -0
  698. package/dist/senses/voice/transcript.js +70 -0
  699. package/dist/senses/voice/turn.js +191 -0
  700. package/dist/senses/voice/twilio-phone-runtime.js +836 -0
  701. package/dist/senses/voice/twilio-phone.js +5454 -0
  702. package/dist/senses/voice/types.js +2 -0
  703. package/dist/senses/voice/whisper.js +161 -0
  704. package/dist/senses/voice-entry.js +83 -0
  705. package/dist/senses/voice-realtime-eval-command.js +99 -0
  706. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  707. package/dist/senses/voice-twilio-entry.js +87 -0
  708. package/dist/trips/core.js +138 -0
  709. package/dist/trips/store.js +265 -0
  710. package/dist/util/frontmatter.js +69 -0
  711. package/npm-shrinkwrap.json +8342 -0
  712. package/package.json +76 -13
  713. package/skills/agent-commerce.md +113 -0
  714. package/skills/browser-navigation.md +117 -0
  715. package/skills/commerce-setup-guide.md +116 -0
  716. package/skills/commerce-setup.md +84 -0
  717. package/skills/configure-dev-tools.md +99 -0
  718. package/skills/travel-planning.md +138 -0
  719. package/dist/heart/daemon/auth-flow.js +0 -430
  720. package/dist/heart/daemon/ouro-path-installer.js +0 -260
  721. package/dist/heart/daemon/ouro-version-manager.js +0 -171
  722. package/dist/heart/daemon/update-hooks.js +0 -138
  723. package/dist/heart/obligations.js +0 -191
  724. package/dist/heart/safe-workspace.js +0 -381
  725. package/dist/heart/session-recall.js +0 -116
  726. package/dist/mind/friends/channel.js +0 -84
  727. package/dist/mind/friends/group-context.js +0 -144
  728. package/dist/mind/friends/resolver.js +0 -84
  729. package/dist/mind/friends/store-file.js +0 -190
  730. package/dist/mind/friends/store.js +0 -4
  731. package/dist/mind/friends/tokens.js +0 -26
  732. package/dist/mind/friends/trust-explanation.js +0 -74
  733. package/dist/mind/friends/types.js +0 -29
  734. package/dist/repertoire/tasks/board.js +0 -134
  735. package/dist/repertoire/tasks/index.js +0 -224
  736. package/dist/repertoire/tasks/lifecycle.js +0 -80
  737. package/dist/repertoire/tasks/middleware.js +0 -65
  738. package/dist/repertoire/tasks/parser.js +0 -173
  739. package/dist/repertoire/tasks/scanner.js +0 -132
  740. package/dist/repertoire/tasks/transitions.js +0 -144
  741. package/dist/senses/bluebubbles-entry.js +0 -13
  742. package/dist/senses/bluebubbles.js +0 -1181
  743. package/dist/senses/debug-activity.js +0 -154
  744. package/dist/senses/inner-dialog-worker.js +0 -90
  745. package/dist/senses/inner-dialog.js +0 -525
  746. package/subagents/README.md +0 -7
  747. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  748. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  749. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  750. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  751. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  752. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  753. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  754. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  755. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  756. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  757. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  758. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  759. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  760. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  761. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  762. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  763. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,420 @@
1
+ "use strict";
2
+ /**
3
+ * Hosted Desk admin commands: `ouro desk invite`, `ouro desk access` and
4
+ * `ouro desk delete-account`.
5
+ *
6
+ * Each command signs the person in to Ouro identity (Entra External ID) with
7
+ * an authorization-code + PKCE flow on a loopback redirect (RFC 8252), then
8
+ * calls the gateway's admin route with the access token. The gateway, not this
9
+ * CLI, enforces the `ouro.admin` app role.
10
+ *
11
+ * The gateway publishes what the sign-in needs at `ADMIN_CONFIG_PATH`:
12
+ * `{ tenantId, subdomain, clientId, scope }`. The CLI reads the tenant's
13
+ * discovery document from `<subdomain>.ciamlogin.com` and requires the issuer
14
+ * `https://<tenantId>.ciamlogin.com/<tenantId>/v2.0`, the same check the
15
+ * gateway makes. The default gateway must name Ouro's production tenant. Any
16
+ * other gateway receives an admin token, so it needs `--trust-gateway`.
17
+ *
18
+ * Nothing is cached: the token lives only for the one command, and it is never
19
+ * printed or logged. An invite link is a single-use bearer credential, so
20
+ * `--out` writes it to a new 0600 file instead of the screen.
21
+ */
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.SIGN_IN_TIMEOUT_MS = exports.ADMIN_CONFIG_PATH = exports.PRODUCTION_TENANT_ID = exports.DEFAULT_DESK_GATEWAY = void 0;
24
+ exports.shown = shown;
25
+ exports.parseDeskAdminCommand = parseDeskAdminCommand;
26
+ exports.gatewayOrigin = gatewayOrigin;
27
+ exports.signInForDeskAdmin = signInForDeskAdmin;
28
+ exports.executeDeskAdminCommand = executeDeskAdminCommand;
29
+ const node_child_process_1 = require("node:child_process");
30
+ const node_crypto_1 = require("node:crypto");
31
+ const node_fs_1 = require("node:fs");
32
+ const node_http_1 = require("node:http");
33
+ const runtime_1 = require("../../nerves/runtime");
34
+ exports.DEFAULT_DESK_GATEWAY = "https://desk.ouro.bot";
35
+ /** Ouro's production External ID tenant (`ourobot`), which the default gateway must name. */
36
+ exports.PRODUCTION_TENANT_ID = "de8841c3-7799-4523-bbad-44f8a2426eaa";
37
+ exports.ADMIN_CONFIG_PATH = "/.well-known/ouro-desk-admin";
38
+ exports.SIGN_IN_TIMEOUT_MS = 5 * 60_000;
39
+ const REQUEST_TIMEOUT_MS = 15_000;
40
+ const ACCOUNT_ID = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;
41
+ const GUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
42
+ const SUBDOMAIN = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/i;
43
+ /** Server-supplied text made safe to print: no control characters, bounded length. */
44
+ function shown(value, max = 200) {
45
+ // eslint-disable-next-line no-control-regex
46
+ return String(value).replace(/[\u0000-\u001f\u007f-\u009f]/g, "").slice(0, max);
47
+ }
48
+ // ── Parsing ──
49
+ const GATEWAY_FLAGS = "[--gateway <url> --trust-gateway]";
50
+ const USAGE = {
51
+ invite: `Usage: ouro desk invite --name <name> | --account <id> [--out <file>] ${GATEWAY_FLAGS}`,
52
+ access: `Usage: ouro desk access <account> on|off ${GATEWAY_FLAGS}`,
53
+ "delete-account": `Usage: ouro desk delete-account <account> --yes ${GATEWAY_FLAGS}`,
54
+ };
55
+ function splitFlags(args, valued, boolean, usage) {
56
+ const positional = [];
57
+ const flags = {};
58
+ for (let i = 0; i < args.length; i++) {
59
+ const arg = args[i];
60
+ if (!arg.startsWith("--")) {
61
+ positional.push(arg);
62
+ continue;
63
+ }
64
+ if (boolean.includes(arg)) {
65
+ flags[arg] = true;
66
+ continue;
67
+ }
68
+ const value = args[i + 1];
69
+ if (!valued.includes(arg) || value === undefined || value.startsWith("--"))
70
+ throw new Error(usage);
71
+ flags[arg] = value;
72
+ i++;
73
+ }
74
+ return { positional, flags };
75
+ }
76
+ function accountIdOf(value) {
77
+ if (!ACCOUNT_ID.test(value))
78
+ throw new Error(`'${shown(value, 80)}' is not an account id: use the id Hosted Desk gave the account`);
79
+ return value;
80
+ }
81
+ function gatewayOf(flags) {
82
+ return {
83
+ ...(typeof flags["--gateway"] === "string" ? { gateway: flags["--gateway"] } : {}),
84
+ ...(flags["--trust-gateway"] === true ? { trustGateway: true } : {}),
85
+ };
86
+ }
87
+ function parseDeskAdminCommand(verb, args) {
88
+ const usage = USAGE[verb];
89
+ if (verb === "invite") {
90
+ const { positional, flags } = splitFlags(args, ["--name", "--account", "--out", "--gateway"], ["--trust-gateway"], usage);
91
+ const displayName = typeof flags["--name"] === "string" ? flags["--name"].trim() : "";
92
+ const account = typeof flags["--account"] === "string" ? flags["--account"] : undefined;
93
+ // --name invites a new person; --account re-invites an account whose invite went unused.
94
+ if (positional.length > 0 || (!displayName) === (account === undefined))
95
+ throw new Error(usage);
96
+ return {
97
+ kind: "desk.admin",
98
+ action: "invite",
99
+ ...(account === undefined ? { displayName } : { accountId: accountIdOf(account) }),
100
+ ...gatewayOf(flags),
101
+ ...(typeof flags["--out"] === "string" ? { out: flags["--out"] } : {}),
102
+ };
103
+ }
104
+ if (verb === "access") {
105
+ const { positional, flags } = splitFlags(args, ["--gateway"], ["--trust-gateway"], usage);
106
+ const [id, state] = positional;
107
+ if (positional.length !== 2 || (state !== "on" && state !== "off"))
108
+ throw new Error(usage);
109
+ return { kind: "desk.admin", action: "access", accountId: accountIdOf(id), on: state === "on", ...gatewayOf(flags) };
110
+ }
111
+ const { positional, flags } = splitFlags(args, ["--gateway"], ["--yes", "--trust-gateway"], usage);
112
+ if (positional.length !== 1)
113
+ throw new Error(usage);
114
+ const accountId = accountIdOf(positional[0]);
115
+ if (flags["--yes"] !== true) {
116
+ throw new Error(`Deleting account ${accountId} removes its Hosted Desk account and sign-ins and cannot be undone; pass --yes to confirm.\n${usage}`);
117
+ }
118
+ return { kind: "desk.admin", action: "delete-account", accountId, ...gatewayOf(flags) };
119
+ }
120
+ // ── Gateway ──
121
+ /** The gateway's origin, or null when the value is not a bare https origin. */
122
+ function gatewayOrigin(value) {
123
+ let url;
124
+ try {
125
+ url = new URL(value);
126
+ }
127
+ catch {
128
+ return null;
129
+ }
130
+ if (/[?#]/.test(value) || url.protocol !== "https:" || url.username || url.password || url.search || url.hash || (url.pathname !== "/" && url.pathname !== ""))
131
+ return null;
132
+ return url.origin;
133
+ }
134
+ async function getJson(fetchImpl, url) {
135
+ const response = await fetchImpl(url, { headers: { accept: "application/json" }, signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS) });
136
+ if (!response.ok)
137
+ throw new Error(`${url} answered ${response.status}`);
138
+ return response.json();
139
+ }
140
+ function isHttps(value) {
141
+ return typeof value === "string" && URL.canParse(value) && new URL(value).protocol === "https:";
142
+ }
143
+ function nonEmpty(value) {
144
+ return typeof value === "string" && value.trim() !== "";
145
+ }
146
+ const CALLBACK_PAGE = (heading, detail) => `<!doctype html><meta charset="utf-8"><title>Ouro sign-in</title><body style="font-family:system-ui;margin:3rem"><h1>${heading}</h1><p>${detail}</p></body>`;
147
+ /**
148
+ * Waits for the browser's redirect. Only a request carrying this sign-in's
149
+ * state settles it, so a stray request to the loopback port can't end it.
150
+ */
151
+ function listenForCallback(state, timeoutMs) {
152
+ return new Promise((resolveListening, rejectListening) => {
153
+ const { promise: result, resolve: settle, reject: fail } = Promise.withResolvers();
154
+ // Handled by the caller's await; this keeps an early timeout from becoming an unhandled rejection.
155
+ result.catch(() => { });
156
+ const server = (0, node_http_1.createServer)((request, response) => {
157
+ const url = new URL(request.url, "http://127.0.0.1");
158
+ if (url.pathname !== "/callback") {
159
+ response.writeHead(404).end();
160
+ return;
161
+ }
162
+ if (url.searchParams.get("state") !== state) {
163
+ response.writeHead(400, { "content-type": "text/html; charset=utf-8" }).end(CALLBACK_PAGE("Not this sign-in", "This link does not belong to the sign-in the terminal is waiting for."));
164
+ return;
165
+ }
166
+ const code = url.searchParams.get("code");
167
+ const error = url.searchParams.get("error");
168
+ const callback = { ...(code ? { code } : {}), ...(error ? { error } : {}) };
169
+ const page = code && !error
170
+ ? CALLBACK_PAGE("Signed in to Ouro", "You can close this tab and go back to the terminal.")
171
+ : CALLBACK_PAGE("Sign-in did not finish", "Go back to the terminal to see why.");
172
+ response.writeHead(200, { "content-type": "text/html; charset=utf-8", "cache-control": "no-store" }).end(page);
173
+ settle(callback);
174
+ });
175
+ const timer = setTimeout(() => fail(new Error(`Ouro sign-in timed out after ${Math.round(timeoutMs / 1000)} seconds`)), timeoutMs);
176
+ const close = () => {
177
+ clearTimeout(timer);
178
+ // Idle only: the browser's own request may still be receiving its page.
179
+ server.close();
180
+ server.closeIdleConnections();
181
+ };
182
+ server.once("error", rejectListening);
183
+ server.listen(0, "127.0.0.1", () => {
184
+ const { port } = server.address();
185
+ resolveListening({ redirectUri: `http://127.0.0.1:${port}/callback`, result, close });
186
+ });
187
+ });
188
+ }
189
+ /** Signs in to Ouro identity for the gateway's admin scope and returns the access token. */
190
+ async function signInForDeskAdmin(input) {
191
+ const configUrl = `${input.gateway}${exports.ADMIN_CONFIG_PATH}`;
192
+ const config = (await getJson(input.fetchImpl, configUrl));
193
+ if (!config
194
+ || typeof config.tenantId !== "string" || !GUID.test(config.tenantId)
195
+ || typeof config.subdomain !== "string" || !SUBDOMAIN.test(config.subdomain)
196
+ || !nonEmpty(config.clientId) || !nonEmpty(config.scope)) {
197
+ throw new Error(`${configUrl} is not a valid admin sign-in configuration`);
198
+ }
199
+ // Entra's discovery names the tenant in lowercase.
200
+ const tenantId = config.tenantId.toLowerCase();
201
+ if (input.expectedTenantId && tenantId !== input.expectedTenantId.toLowerCase()) {
202
+ throw new Error(`${input.gateway} names Ouro identity tenant ${tenantId}, not Ouro's production tenant ${input.expectedTenantId}`);
203
+ }
204
+ const issuer = `https://${tenantId}.ciamlogin.com/${tenantId}/v2.0`;
205
+ const discovery = (await getJson(input.fetchImpl, `https://${config.subdomain}.ciamlogin.com/${tenantId}/v2.0/.well-known/openid-configuration`));
206
+ if (discovery?.issuer !== issuer) {
207
+ throw new Error(`Ouro identity's discovery document names issuer ${shown(discovery?.issuer)}, but Hosted Desk expects ${issuer}`);
208
+ }
209
+ if (!isHttps(discovery.authorization_endpoint) || !isHttps(discovery.token_endpoint)) {
210
+ throw new Error("Ouro identity's discovery document has no https authorization and token endpoints");
211
+ }
212
+ const verifier = (0, node_crypto_1.randomBytes)(32).toString("base64url");
213
+ const state = (0, node_crypto_1.randomBytes)(16).toString("base64url");
214
+ const listener = await listenForCallback(state, input.timeoutMs ?? exports.SIGN_IN_TIMEOUT_MS);
215
+ try {
216
+ const authorize = new URL(discovery.authorization_endpoint);
217
+ authorize.search = new URLSearchParams({
218
+ client_id: config.clientId,
219
+ response_type: "code",
220
+ redirect_uri: listener.redirectUri,
221
+ scope: config.scope,
222
+ state,
223
+ code_challenge: (0, node_crypto_1.createHash)("sha256").update(verifier).digest("base64url"),
224
+ code_challenge_method: "S256",
225
+ prompt: "select_account",
226
+ }).toString();
227
+ input.writeStdout(`Sign in to Ouro in your browser to manage ${new URL(input.gateway).host}. If it does not open, visit:\n${authorize.toString()}`);
228
+ // Not awaited: some openers stay in the foreground until the browser exits.
229
+ void Promise.resolve().then(() => input.openUrl(authorize.toString())).catch(() => { });
230
+ const callback = await listener.result;
231
+ if (callback.error)
232
+ throw new Error(`Ouro sign-in was cancelled: ${shown(callback.error, 80)}`);
233
+ if (!callback.code)
234
+ throw new Error("Ouro sign-in returned no code");
235
+ const response = await input.fetchImpl(discovery.token_endpoint, {
236
+ method: "POST",
237
+ headers: { "content-type": "application/x-www-form-urlencoded", accept: "application/json" },
238
+ body: new URLSearchParams({
239
+ grant_type: "authorization_code",
240
+ client_id: config.clientId,
241
+ code: callback.code,
242
+ redirect_uri: listener.redirectUri,
243
+ code_verifier: verifier,
244
+ }).toString(),
245
+ signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
246
+ });
247
+ const grant = (await response.json().catch(() => null));
248
+ if (!response.ok)
249
+ throw new Error(`Ouro sign-in could not finish: ${nonEmpty(grant?.error) ? shown(grant.error, 80) : `token endpoint answered ${response.status}`}`);
250
+ if (!nonEmpty(grant?.access_token))
251
+ throw new Error("Ouro sign-in could not finish: no access token");
252
+ return grant.access_token;
253
+ }
254
+ finally {
255
+ listener.close();
256
+ }
257
+ }
258
+ /* v8 ignore start -- production default: launches the platform's browser opener @preserve */
259
+ function openInBrowser(url) {
260
+ const [command, args] = process.platform === "darwin"
261
+ ? ["open", [url]]
262
+ : process.platform === "win32"
263
+ ? ["rundll32", ["url.dll,FileProtocolHandler", url]]
264
+ : ["xdg-open", [url]];
265
+ // Detached and unreferenced: an opener that stays in the foreground must not keep the CLI from exiting.
266
+ return new Promise((resolve, reject) => {
267
+ const child = (0, node_child_process_1.spawn)(command, args, { detached: true, stdio: "ignore" });
268
+ child.once("spawn", () => { child.unref(); resolve(); });
269
+ child.once("error", reject);
270
+ });
271
+ }
272
+ /* v8 ignore stop */
273
+ // ── Executing ──
274
+ function requestFor(command) {
275
+ if (command.action === "invite") {
276
+ return { method: "POST", path: "/admin/invites", body: command.accountId ? { accountId: command.accountId } : { displayName: command.displayName } };
277
+ }
278
+ const account = `/admin/accounts/${encodeURIComponent(command.accountId)}`;
279
+ if (command.action === "access")
280
+ return { method: "POST", path: `${account}/access`, body: { on: command.on } };
281
+ return { method: "DELETE", path: account };
282
+ }
283
+ async function refusal(response) {
284
+ if (response.status === 401)
285
+ return "Hosted Desk did not accept the Ouro sign-in (401). Sign in again; if it keeps failing, the gateway's admin sign-in settings are wrong.";
286
+ if (response.status === 403)
287
+ return "Hosted Desk refused the request (403): the signed-in Ouro account needs the ouro.admin role.";
288
+ const body = (await response.json().catch(() => null));
289
+ const reason = nonEmpty(body?.message) ? body.message : nonEmpty(body?.error) ? body.error : null;
290
+ return reason ? `Hosted Desk refused the request (${response.status}): ${shown(reason)}` : `Hosted Desk refused the request (${response.status}).`;
291
+ }
292
+ async function executeDeskAdminCommand(command, deps, signIn = signInForDeskAdmin) {
293
+ const requested = command.gateway ?? exports.DEFAULT_DESK_GATEWAY;
294
+ const gateway = gatewayOrigin(requested);
295
+ (0, runtime_1.emitNervesEvent)({
296
+ component: "daemon",
297
+ event: "daemon.desk_admin_start",
298
+ message: `ouro desk ${command.action}`,
299
+ meta: { action: command.action, gateway: gateway ?? "invalid" },
300
+ });
301
+ const fail = (message, status) => {
302
+ (0, runtime_1.emitNervesEvent)({
303
+ level: "error",
304
+ component: "daemon",
305
+ event: "daemon.desk_admin_error",
306
+ message: `ouro desk ${command.action} failed`,
307
+ meta: { action: command.action, gateway: gateway ?? "invalid", ...(status === undefined ? {} : { status }) },
308
+ });
309
+ deps.setExitCode?.(1);
310
+ deps.writeStdout(message);
311
+ return message;
312
+ };
313
+ const done = (message, status) => {
314
+ (0, runtime_1.emitNervesEvent)({
315
+ component: "daemon",
316
+ event: "daemon.desk_admin_end",
317
+ message: `ouro desk ${command.action} succeeded`,
318
+ meta: { action: command.action, gateway, status },
319
+ });
320
+ deps.writeStdout(message);
321
+ return message;
322
+ };
323
+ if (!gateway)
324
+ return fail(`The Hosted Desk gateway must be a bare https origin such as ${exports.DEFAULT_DESK_GATEWAY}, not ${shown(requested, 120)}`);
325
+ const isDefault = gateway === exports.DEFAULT_DESK_GATEWAY;
326
+ if (!isDefault && command.trustGateway !== true) {
327
+ return fail(`${gateway} is not ${exports.DEFAULT_DESK_GATEWAY}. Signing in sends it an Ouro admin token, so pass --trust-gateway only for a Hosted Desk we run, such as staging.`);
328
+ }
329
+ // Claim the --out file before minting the invite, so a bad path costs no live link.
330
+ const outPath = command.action === "invite" ? command.out : undefined;
331
+ if (outPath) {
332
+ try {
333
+ (0, node_fs_1.closeSync)((0, node_fs_1.openSync)(outPath, "wx", 0o600));
334
+ }
335
+ catch (error) {
336
+ const code = error.code;
337
+ return fail(code === "EEXIST" ? `${outPath} already exists; choose a new file for the invite link` : `Could not create ${outPath}: ${error.message}`);
338
+ }
339
+ }
340
+ const releaseOut = () => {
341
+ if (outPath)
342
+ (0, node_fs_1.unlinkSync)(outPath);
343
+ };
344
+ /* v8 ignore next -- production default: tests always inject fetchImpl @preserve */
345
+ const fetchImpl = deps.fetchImpl ?? fetch;
346
+ let token;
347
+ try {
348
+ token = await signIn({
349
+ gateway,
350
+ fetchImpl,
351
+ /* v8 ignore next -- production default: tests inject openUrl or a sign-in @preserve */
352
+ openUrl: deps.openUrl ?? openInBrowser,
353
+ writeStdout: deps.writeStdout,
354
+ ...(isDefault ? { expectedTenantId: exports.PRODUCTION_TENANT_ID } : {}),
355
+ });
356
+ }
357
+ catch (error) {
358
+ releaseOut();
359
+ return fail(error.message);
360
+ }
361
+ const request = requestFor(command);
362
+ let response;
363
+ try {
364
+ response = await fetchImpl(`${gateway}${request.path}`, {
365
+ method: request.method,
366
+ headers: {
367
+ authorization: `Bearer ${token}`,
368
+ accept: "application/json",
369
+ ...(request.body === undefined ? {} : { "content-type": "application/json" }),
370
+ },
371
+ ...(request.body === undefined ? {} : { body: JSON.stringify(request.body) }),
372
+ signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
373
+ });
374
+ }
375
+ catch (error) {
376
+ releaseOut();
377
+ return fail(`Could not reach Hosted Desk at ${gateway}: ${error.message}`);
378
+ }
379
+ if (!response.ok) {
380
+ releaseOut();
381
+ return fail(await refusal(response), response.status);
382
+ }
383
+ const result = (await response.json().catch(() => null));
384
+ if (command.action === "access") {
385
+ if (typeof result?.deskAccess !== "boolean")
386
+ return fail("Hosted Desk sent an unexpected access response", response.status);
387
+ return done(`Desk access for ${command.accountId} is now ${result.deskAccess ? "on" : "off"}.`, response.status);
388
+ }
389
+ if (command.action === "delete-account") {
390
+ if (result?.deleted !== true)
391
+ return fail("Hosted Desk sent an unexpected delete response", response.status);
392
+ const leftover = result.deskRemoved === false ? " Its desk could not be removed from the gateway; the gateway logged why." : "";
393
+ return done(`Deleted account ${command.accountId}.${leftover}`, response.status);
394
+ }
395
+ if (!isHttps(result?.inviteUrl) || !nonEmpty(result?.expiresAt)
396
+ || typeof result?.accountId !== "string" || !ACCOUNT_ID.test(result.accountId)
397
+ || (command.accountId !== undefined && result.accountId !== command.accountId)) {
398
+ releaseOut();
399
+ return fail("Hosted Desk sent an unexpected invite response", response.status);
400
+ }
401
+ const link = new URL(result.inviteUrl).href;
402
+ const who = command.displayName ? `${command.displayName} (account ${result.accountId})` : `account ${result.accountId}`;
403
+ const lead = `Invite for ${who}, single use, expires ${shown(result.expiresAt, 40)}.`;
404
+ if (!outPath)
405
+ return done(`${lead}\n${link}`, response.status);
406
+ try {
407
+ const fd = (0, node_fs_1.openSync)(outPath, node_fs_1.constants.O_WRONLY | node_fs_1.constants.O_TRUNC | node_fs_1.constants.O_NOFOLLOW);
408
+ try {
409
+ (0, node_fs_1.writeSync)(fd, `${link}\n`);
410
+ }
411
+ finally {
412
+ (0, node_fs_1.closeSync)(fd);
413
+ }
414
+ }
415
+ catch (error) {
416
+ releaseOut();
417
+ return fail(`The invite for account ${result.accountId} was issued, but ${outPath} could not be written (${error.message}). Issue a new link with: ouro desk invite --account ${result.accountId}`);
418
+ }
419
+ return done(`${lead} The link is in ${outPath} (mode 0600).`, response.status);
420
+ }