@ouro.bot/cli 0.1.0-alpha.55 → 0.1.0-alpha.550

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 (386) hide show
  1. package/README.md +133 -19
  2. package/RepairGuide.ouro/agent.json +5 -0
  3. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  4. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  5. package/RepairGuide.ouro/skills/diagnose-bootstrap-drift.md +54 -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/changelog.json +3555 -0
  14. package/dist/arc/attention-types.js +8 -0
  15. package/dist/arc/cares.js +140 -0
  16. package/dist/arc/episodes.js +117 -0
  17. package/dist/arc/intentions.js +133 -0
  18. package/dist/arc/json-store.js +117 -0
  19. package/dist/arc/obligations.js +237 -0
  20. package/dist/arc/packets.js +193 -0
  21. package/dist/arc/presence.js +185 -0
  22. package/dist/arc/task-lifecycle.js +65 -0
  23. package/dist/heart/active-work.js +837 -26
  24. package/dist/heart/agent-entry.js +58 -3
  25. package/dist/heart/attachments/image-normalize.js +194 -0
  26. package/dist/heart/attachments/materialize.js +97 -0
  27. package/dist/heart/attachments/originals.js +88 -0
  28. package/dist/heart/attachments/render.js +29 -0
  29. package/dist/heart/attachments/sources/adapter.js +2 -0
  30. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  31. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  32. package/dist/heart/attachments/sources/index.js +16 -0
  33. package/dist/heart/attachments/store.js +103 -0
  34. package/dist/heart/attachments/types.js +93 -0
  35. package/dist/heart/auth/auth-flow.js +479 -0
  36. package/dist/heart/background-operations.js +281 -0
  37. package/dist/heart/bundle-state.js +168 -0
  38. package/dist/heart/commitments.js +111 -0
  39. package/dist/heart/config-registry.js +304 -0
  40. package/dist/heart/config.js +114 -118
  41. package/dist/heart/core.js +925 -246
  42. package/dist/heart/cross-chat-delivery.js +3 -18
  43. package/dist/heart/daemon/agent-config-check.js +512 -0
  44. package/dist/heart/daemon/agent-discovery.js +102 -3
  45. package/dist/heart/daemon/agent-service.js +522 -0
  46. package/dist/heart/daemon/agentic-repair.js +554 -0
  47. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  48. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  49. package/dist/heart/daemon/cadence.js +70 -0
  50. package/dist/heart/daemon/cli-defaults.js +665 -0
  51. package/dist/heart/daemon/cli-exec.js +7565 -0
  52. package/dist/heart/daemon/cli-help.js +498 -0
  53. package/dist/heart/daemon/cli-parse.js +1590 -0
  54. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  55. package/dist/heart/daemon/cli-render.js +775 -0
  56. package/dist/heart/daemon/cli-types.js +8 -0
  57. package/dist/heart/daemon/connect-bay.js +323 -0
  58. package/dist/heart/daemon/daemon-cli.js +29 -1672
  59. package/dist/heart/daemon/daemon-entry.js +417 -2
  60. package/dist/heart/daemon/daemon-health.js +183 -0
  61. package/dist/heart/daemon/daemon-rollup.js +58 -0
  62. package/dist/heart/daemon/daemon-runtime-sync.js +87 -13
  63. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  64. package/dist/heart/daemon/daemon.js +758 -71
  65. package/dist/heart/daemon/dns-workflow.js +394 -0
  66. package/dist/heart/daemon/doctor-types.js +8 -0
  67. package/dist/heart/daemon/doctor.js +844 -0
  68. package/dist/heart/daemon/drift-detection.js +146 -0
  69. package/dist/heart/daemon/health-monitor.js +122 -1
  70. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  71. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  72. package/dist/heart/daemon/http-health-probe.js +80 -0
  73. package/dist/heart/daemon/human-command-screens.js +234 -0
  74. package/dist/heart/daemon/human-readiness.js +114 -0
  75. package/dist/heart/daemon/inner-status.js +102 -0
  76. package/dist/heart/daemon/interactive-repair.js +394 -0
  77. package/dist/heart/daemon/launchd.js +37 -8
  78. package/dist/heart/daemon/log-tailer.js +82 -12
  79. package/dist/heart/daemon/logs-prune.js +110 -0
  80. package/dist/heart/daemon/mcp-canary.js +297 -0
  81. package/dist/heart/daemon/message-router.js +2 -2
  82. package/dist/heart/daemon/os-cron-deps.js +135 -0
  83. package/dist/heart/daemon/os-cron.js +14 -12
  84. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  85. package/dist/heart/daemon/ouro-entry.js +3 -1
  86. package/dist/heart/daemon/process-manager.js +375 -33
  87. package/dist/heart/daemon/provider-discovery.js +137 -0
  88. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  89. package/dist/heart/daemon/pulse.js +475 -0
  90. package/dist/heart/daemon/readiness-repair.js +365 -0
  91. package/dist/heart/daemon/run-hooks.js +2 -0
  92. package/dist/heart/daemon/runtime-logging.js +67 -16
  93. package/dist/heart/daemon/runtime-metadata.js +3 -31
  94. package/dist/heart/daemon/safe-mode.js +161 -0
  95. package/dist/heart/daemon/sense-manager.js +353 -38
  96. package/dist/heart/daemon/session-id-resolver.js +131 -0
  97. package/dist/heart/daemon/skill-management-installer.js +94 -0
  98. package/dist/heart/daemon/socket-client.js +158 -11
  99. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  100. package/dist/heart/daemon/startup-tui.js +330 -0
  101. package/dist/heart/daemon/task-scheduler.js +3 -25
  102. package/dist/heart/daemon/terminal-ui.js +499 -0
  103. package/dist/heart/daemon/thoughts.js +162 -17
  104. package/dist/heart/daemon/up-progress.js +366 -0
  105. package/dist/heart/daemon/vault-items.js +56 -0
  106. package/dist/heart/delegation.js +1 -1
  107. package/dist/heart/habits/habit-migration.js +189 -0
  108. package/dist/heart/habits/habit-parser.js +140 -0
  109. package/dist/heart/habits/habit-runtime-state.js +100 -0
  110. package/dist/heart/habits/habit-scheduler.js +372 -0
  111. package/dist/heart/{daemon → hatch}/hatch-flow.js +52 -117
  112. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  113. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  114. package/dist/heart/{daemon → hatch}/specialist-tools.js +35 -12
  115. package/dist/heart/identity.js +200 -51
  116. package/dist/heart/kept-notes.js +357 -0
  117. package/dist/heart/kicks.js +1 -1
  118. package/dist/heart/machine-identity.js +161 -0
  119. package/dist/heart/mail-import-discovery.js +353 -0
  120. package/dist/heart/mailbox/mailbox-http-hooks.js +66 -0
  121. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  122. package/dist/heart/mailbox/mailbox-http-routes.js +246 -0
  123. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  124. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  125. package/dist/heart/mailbox/mailbox-http.js +99 -0
  126. package/dist/heart/mailbox/mailbox-read.js +31 -0
  127. package/dist/heart/mailbox/mailbox-types.js +27 -0
  128. package/dist/heart/mailbox/mailbox-view.js +195 -0
  129. package/dist/heart/mailbox/readers/agent-machine.js +382 -0
  130. package/dist/heart/mailbox/readers/continuity-readers.js +338 -0
  131. package/dist/heart/mailbox/readers/mail.js +362 -0
  132. package/dist/heart/mailbox/readers/runtime-readers.js +651 -0
  133. package/dist/heart/mailbox/readers/sessions.js +232 -0
  134. package/dist/heart/mailbox/readers/shared.js +111 -0
  135. package/dist/heart/mcp/mcp-server.js +683 -0
  136. package/dist/heart/migrate-config.js +100 -0
  137. package/dist/heart/model-capabilities.js +19 -0
  138. package/dist/heart/platform.js +81 -0
  139. package/dist/heart/provider-attempt.js +134 -0
  140. package/dist/heart/provider-binding-resolver.js +255 -0
  141. package/dist/heart/provider-credentials.js +425 -0
  142. package/dist/heart/provider-failover.js +301 -0
  143. package/dist/heart/provider-models.js +81 -0
  144. package/dist/heart/provider-ping.js +262 -0
  145. package/dist/heart/provider-state.js +216 -0
  146. package/dist/heart/provider-visibility.js +188 -0
  147. package/dist/heart/providers/anthropic-token.js +131 -0
  148. package/dist/heart/providers/anthropic.js +139 -52
  149. package/dist/heart/providers/azure.js +97 -13
  150. package/dist/heart/providers/error-classification.js +127 -0
  151. package/dist/heart/providers/github-copilot.js +145 -0
  152. package/dist/heart/providers/minimax-vlm.js +189 -0
  153. package/dist/heart/providers/minimax.js +26 -8
  154. package/dist/heart/providers/openai-codex.js +55 -40
  155. package/dist/heart/runtime-capability-check.js +170 -0
  156. package/dist/heart/runtime-credentials.js +367 -0
  157. package/dist/heart/runtime-cwd.js +87 -0
  158. package/dist/heart/sense-truth.js +11 -4
  159. package/dist/heart/session-activity.js +43 -22
  160. package/dist/heart/session-events.js +1149 -0
  161. package/dist/heart/session-playback-cli-main.js +5 -0
  162. package/dist/heart/session-playback-cli.js +36 -0
  163. package/dist/heart/session-playback.js +231 -0
  164. package/dist/heart/session-stats-cli-main.js +5 -0
  165. package/dist/heart/session-stats.js +182 -0
  166. package/dist/heart/session-transcript.js +243 -0
  167. package/dist/heart/start-of-turn-packet.js +345 -0
  168. package/dist/heart/streaming.js +44 -27
  169. package/dist/heart/sync-classification.js +176 -0
  170. package/dist/heart/sync.js +449 -0
  171. package/dist/heart/target-resolution.js +9 -5
  172. package/dist/heart/tempo.js +93 -0
  173. package/dist/heart/temporal-view.js +41 -0
  174. package/dist/heart/timeouts.js +101 -0
  175. package/dist/heart/tool-activity-callbacks.js +59 -0
  176. package/dist/heart/tool-description.js +139 -0
  177. package/dist/heart/tool-friction.js +55 -0
  178. package/dist/heart/tool-loop.js +200 -0
  179. package/dist/heart/turn-context.js +381 -0
  180. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  181. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  182. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  183. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  184. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  185. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  186. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  187. package/dist/mailbox-ui/assets/index-BPr5vNuM.css +1 -0
  188. package/dist/mailbox-ui/assets/index-Cm51CY9W.js +61 -0
  189. package/dist/mailbox-ui/index.html +15 -0
  190. package/dist/mailroom/attention.js +167 -0
  191. package/dist/mailroom/autonomy.js +209 -0
  192. package/dist/mailroom/blob-store.js +674 -0
  193. package/dist/mailroom/body-cache.js +61 -0
  194. package/dist/mailroom/core.js +720 -0
  195. package/dist/mailroom/entry.js +160 -0
  196. package/dist/mailroom/file-store.js +430 -0
  197. package/dist/mailroom/mbox-import.js +383 -0
  198. package/dist/mailroom/outbound.js +380 -0
  199. package/dist/mailroom/policy.js +263 -0
  200. package/dist/mailroom/reader.js +233 -0
  201. package/dist/mailroom/search-cache.js +256 -0
  202. package/dist/mailroom/search-relevance.js +319 -0
  203. package/dist/mailroom/smtp-ingress.js +176 -0
  204. package/dist/mailroom/source-state.js +176 -0
  205. package/dist/mailroom/thread.js +109 -0
  206. package/dist/mailroom/travel-extract.js +89 -0
  207. package/dist/mind/bundle-manifest.js +7 -1
  208. package/dist/mind/context.js +165 -101
  209. package/dist/mind/diary-integrity.js +60 -0
  210. package/dist/mind/{memory.js → diary.js} +62 -75
  211. package/dist/mind/embedding-provider.js +60 -0
  212. package/dist/mind/file-state.js +179 -0
  213. package/dist/mind/friends/channel.js +30 -0
  214. package/dist/mind/friends/resolver.js +54 -2
  215. package/dist/mind/friends/store-file.js +39 -3
  216. package/dist/mind/friends/types.js +2 -2
  217. package/dist/mind/journal-index.js +161 -0
  218. package/dist/mind/note-search.js +268 -0
  219. package/dist/mind/obligation-steering.js +221 -0
  220. package/dist/mind/pending.js +4 -0
  221. package/dist/mind/prompt-refresh.js +3 -2
  222. package/dist/mind/prompt.js +995 -123
  223. package/dist/mind/provenance-trust.js +26 -0
  224. package/dist/mind/scrutiny.js +173 -0
  225. package/dist/nerves/cli-logging.js +7 -1
  226. package/dist/nerves/coverage/audit-rules.js +15 -6
  227. package/dist/nerves/coverage/audit.js +28 -2
  228. package/dist/nerves/coverage/cli.js +1 -1
  229. package/dist/nerves/coverage/contract.js +5 -5
  230. package/dist/nerves/coverage/file-completeness.js +139 -5
  231. package/dist/nerves/coverage/run-artifacts.js +1 -1
  232. package/dist/nerves/event-buffer.js +111 -0
  233. package/dist/nerves/index.js +224 -4
  234. package/dist/nerves/observation.js +20 -0
  235. package/dist/nerves/redact.js +79 -0
  236. package/dist/nerves/review/cli-main.js +5 -0
  237. package/dist/nerves/review/cli.js +156 -0
  238. package/dist/nerves/review/core.js +152 -0
  239. package/dist/nerves/runtime.js +5 -1
  240. package/dist/repertoire/ado-client.js +15 -56
  241. package/dist/repertoire/ado-semantic.js +11 -10
  242. package/dist/repertoire/api-client.js +97 -0
  243. package/dist/repertoire/bitwarden-store.js +816 -0
  244. package/dist/repertoire/bundle-templates.js +72 -0
  245. package/dist/repertoire/bw-installer.js +180 -0
  246. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  247. package/dist/repertoire/coding/context-pack.js +330 -0
  248. package/dist/repertoire/coding/feedback.js +197 -30
  249. package/dist/repertoire/coding/manager.js +158 -9
  250. package/dist/repertoire/coding/spawner.js +55 -9
  251. package/dist/repertoire/coding/tools.js +170 -7
  252. package/dist/repertoire/commerce-errors.js +109 -0
  253. package/dist/repertoire/commerce-self-test.js +156 -0
  254. package/dist/repertoire/credential-access.js +111 -0
  255. package/dist/repertoire/duffel-client.js +185 -0
  256. package/dist/repertoire/github-client.js +14 -55
  257. package/dist/repertoire/graph-client.js +11 -52
  258. package/dist/repertoire/guardrails.js +396 -0
  259. package/dist/repertoire/mcp-client.js +295 -0
  260. package/dist/repertoire/mcp-manager.js +362 -0
  261. package/dist/repertoire/mcp-tools.js +63 -0
  262. package/dist/repertoire/shell-sessions.js +133 -0
  263. package/dist/repertoire/skills.js +15 -24
  264. package/dist/repertoire/stripe-client.js +131 -0
  265. package/dist/repertoire/tasks/board.js +31 -5
  266. package/dist/repertoire/tasks/fix.js +182 -0
  267. package/dist/repertoire/tasks/index.js +16 -4
  268. package/dist/repertoire/tasks/lifecycle.js +2 -2
  269. package/dist/repertoire/tasks/parser.js +3 -2
  270. package/dist/repertoire/tasks/scanner.js +194 -37
  271. package/dist/repertoire/tasks/transitions.js +16 -78
  272. package/dist/repertoire/tool-results.js +29 -0
  273. package/dist/repertoire/tools-attachments.js +317 -0
  274. package/dist/repertoire/tools-base.js +47 -1075
  275. package/dist/repertoire/tools-bluebubbles.js +1 -0
  276. package/dist/repertoire/tools-bridge.js +142 -0
  277. package/dist/repertoire/tools-bundle.js +984 -0
  278. package/dist/repertoire/tools-config.js +185 -0
  279. package/dist/repertoire/tools-continuity.js +248 -0
  280. package/dist/repertoire/tools-credential.js +381 -0
  281. package/dist/repertoire/tools-files.js +342 -0
  282. package/dist/repertoire/tools-flight.js +224 -0
  283. package/dist/repertoire/tools-flow.js +119 -0
  284. package/dist/repertoire/tools-github.js +1 -7
  285. package/dist/repertoire/tools-mail.js +1857 -0
  286. package/dist/repertoire/tools-notes.js +421 -0
  287. package/dist/repertoire/tools-session.js +750 -0
  288. package/dist/repertoire/tools-shell.js +120 -0
  289. package/dist/repertoire/tools-stripe.js +180 -0
  290. package/dist/repertoire/tools-surface.js +243 -0
  291. package/dist/repertoire/tools-teams.js +9 -39
  292. package/dist/repertoire/tools-travel.js +125 -0
  293. package/dist/repertoire/tools-trip.js +604 -0
  294. package/dist/repertoire/tools-user-profile.js +144 -0
  295. package/dist/repertoire/tools-vault.js +40 -0
  296. package/dist/repertoire/tools.js +108 -100
  297. package/dist/repertoire/travel-api-client.js +360 -0
  298. package/dist/repertoire/user-profile.js +131 -0
  299. package/dist/repertoire/vault-setup.js +246 -0
  300. package/dist/repertoire/vault-unlock.js +561 -0
  301. package/dist/scripts/claude-code-hook.js +41 -0
  302. package/dist/scripts/claude-code-stop-hook.js +47 -0
  303. package/dist/senses/attention-queue.js +116 -0
  304. package/dist/senses/bluebubbles/active-turns.js +216 -0
  305. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  306. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  307. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  308. package/dist/senses/bluebubbles/entry.js +77 -0
  309. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  310. package/dist/senses/bluebubbles/index.js +2305 -0
  311. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  312. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  313. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  314. package/dist/senses/bluebubbles/processed-log.js +133 -0
  315. package/dist/senses/bluebubbles/replay.js +137 -0
  316. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  317. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  318. package/dist/senses/cli/bracketed-paste.js +82 -0
  319. package/dist/senses/cli/image-paste.js +287 -0
  320. package/dist/senses/cli/image-ref-navigation.js +75 -0
  321. package/dist/senses/cli/ink-app.js +156 -0
  322. package/dist/senses/cli/inline-diff.js +64 -0
  323. package/dist/senses/cli/input-keys.js +174 -0
  324. package/dist/senses/cli/kill-ring.js +86 -0
  325. package/dist/senses/cli/message-list.js +51 -0
  326. package/dist/senses/cli/ouro-tui.js +607 -0
  327. package/dist/senses/cli/spinner-imperative.js +135 -0
  328. package/dist/senses/cli/spinner.js +101 -0
  329. package/dist/senses/cli/status-line.js +60 -0
  330. package/dist/senses/cli/streaming-markdown.js +526 -0
  331. package/dist/senses/cli/tool-display.js +85 -0
  332. package/dist/senses/cli/tool-render.js +85 -0
  333. package/dist/senses/cli/tui-store.js +240 -0
  334. package/dist/senses/cli/virtual-list.js +35 -0
  335. package/dist/senses/cli-entry.js +60 -8
  336. package/dist/senses/cli-layout.js +187 -0
  337. package/dist/senses/cli.js +520 -209
  338. package/dist/senses/commands.js +66 -3
  339. package/dist/senses/habit-turn-message.js +108 -0
  340. package/dist/senses/inner-dialog-worker.js +175 -21
  341. package/dist/senses/inner-dialog.js +330 -27
  342. package/dist/senses/mail-entry.js +66 -0
  343. package/dist/senses/mail.js +379 -0
  344. package/dist/senses/pipeline.js +569 -182
  345. package/dist/senses/proactive-content-guard.js +51 -0
  346. package/dist/senses/shared-turn.js +248 -0
  347. package/dist/senses/surface-tool.js +68 -0
  348. package/dist/senses/teams-entry.js +60 -8
  349. package/dist/senses/teams.js +387 -98
  350. package/dist/senses/trust-gate.js +100 -5
  351. package/dist/trips/core.js +138 -0
  352. package/dist/trips/store.js +146 -0
  353. package/package.json +38 -7
  354. package/skills/agent-commerce.md +106 -0
  355. package/skills/browser-navigation.md +117 -0
  356. package/skills/commerce-setup-guide.md +116 -0
  357. package/skills/commerce-setup.md +84 -0
  358. package/skills/configure-dev-tools.md +101 -0
  359. package/skills/travel-planning.md +138 -0
  360. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  361. package/dist/heart/daemon/subagent-installer.js +0 -166
  362. package/dist/heart/session-recall.js +0 -116
  363. package/dist/mind/associative-recall.js +0 -209
  364. package/dist/senses/bluebubbles-entry.js +0 -13
  365. package/dist/senses/bluebubbles.js +0 -1177
  366. package/dist/senses/debug-activity.js +0 -148
  367. package/subagents/README.md +0 -86
  368. package/subagents/work-doer.md +0 -237
  369. package/subagents/work-merger.md +0 -618
  370. package/subagents/work-planner.md +0 -390
  371. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  372. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  373. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  374. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  375. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  376. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  377. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  378. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  379. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  380. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  381. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  382. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  383. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  384. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  385. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  386. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,394 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadDnsWorkflowBinding = loadDnsWorkflowBinding;
4
+ exports.resolveDnsWorkflowSecrets = resolveDnsWorkflowSecrets;
5
+ exports.createPorkbunDnsDriver = createPorkbunDnsDriver;
6
+ exports.planDnsWorkflow = planDnsWorkflow;
7
+ exports.planDnsRollback = planDnsRollback;
8
+ exports.applyDnsWorkflowPlan = applyDnsWorkflowPlan;
9
+ exports.redactDnsWorkflowArtifact = redactDnsWorkflowArtifact;
10
+ const runtime_1 = require("../../nerves/runtime");
11
+ function isRecordType(value) {
12
+ return value === "A" || value === "AAAA" || value === "CNAME" || value === "MX" || value === "TXT";
13
+ }
14
+ function requireString(value, label) {
15
+ if (typeof value !== "string" || value.trim() === "")
16
+ throw new Error(`${label} is required`);
17
+ return value.trim();
18
+ }
19
+ function requireRecordType(value, label) {
20
+ if (!isRecordType(value))
21
+ throw new Error(`${label} must be A, AAAA, CNAME, MX, or TXT`);
22
+ return value;
23
+ }
24
+ function parseCertificateSource(value) {
25
+ if (value === undefined || value === "porkbun-ssl")
26
+ return "porkbun-ssl";
27
+ if (value === "acme-dns-01")
28
+ return "acme-dns-01";
29
+ throw new Error("certificate.source must be porkbun-ssl or acme-dns-01");
30
+ }
31
+ function recordKey(record) {
32
+ return `${record.type}:${record.name}`;
33
+ }
34
+ function parseRecord(input, label) {
35
+ const value = input;
36
+ const record = {
37
+ ...(typeof value.id === "string" ? { id: value.id } : {}),
38
+ type: requireRecordType(value.type, `${label}.type`),
39
+ name: requireString(value.name, `${label}.name`),
40
+ content: requireString(value.content, `${label}.content`),
41
+ ...(typeof value.ttl === "number" ? { ttl: value.ttl } : {}),
42
+ ...(typeof value.priority === "number" ? { priority: value.priority } : {}),
43
+ };
44
+ return record;
45
+ }
46
+ function parseResourceRecord(input, label) {
47
+ const value = input;
48
+ return {
49
+ type: requireRecordType(value.type, `${label}.type`),
50
+ name: requireString(value.name, `${label}.name`),
51
+ };
52
+ }
53
+ function assertNoCredentialOntology(input) {
54
+ if ("credentialItemNoteQuery" in input || "noteQuery" in input || "notes" in input) {
55
+ throw new Error("notes are not machine contracts");
56
+ }
57
+ if ("authority" in input || "kind" in input) {
58
+ throw new Error("workflow binding must not give a vault item assumed use");
59
+ }
60
+ }
61
+ function loadDnsWorkflowBinding(input) {
62
+ if (!input || typeof input !== "object")
63
+ throw new Error("DNS workflow binding must be an object");
64
+ const value = input;
65
+ assertNoCredentialOntology(value);
66
+ if (value.workflow !== "dns")
67
+ throw new Error("DNS workflow binding must set workflow to dns");
68
+ if (value.driver !== "porkbun")
69
+ throw new Error("DNS workflow binding driver must be porkbun");
70
+ const resources = value.resources;
71
+ const desired = value.desired;
72
+ if (!Array.isArray(resources?.records) || resources.records.length === 0) {
73
+ throw new Error("DNS workflow binding requires a resource allowlist");
74
+ }
75
+ if (!Array.isArray(desired?.records))
76
+ throw new Error("DNS workflow binding requires desired records");
77
+ const certificate = value.certificate;
78
+ return {
79
+ workflow: "dns",
80
+ domain: requireString(value.domain, "domain"),
81
+ driver: "porkbun",
82
+ credentialItem: requireString(value.credentialItem, "credentialItem"),
83
+ resources: {
84
+ records: resources.records.map((record, index) => parseResourceRecord(record, `resources.records[${index}]`)),
85
+ },
86
+ desired: {
87
+ records: desired.records.map((record, index) => parseRecord(record, `desired.records[${index}]`)),
88
+ },
89
+ ...(certificate ? {
90
+ certificate: {
91
+ host: requireString(certificate.host, "certificate.host"),
92
+ source: parseCertificateSource(certificate.source),
93
+ storeItem: requireString(certificate.storeItem, "certificate.storeItem"),
94
+ ...(certificate.acmeChallengeRecord
95
+ ? {
96
+ acmeChallengeRecord: parseResourceRecord(certificate.acmeChallengeRecord, "certificate.acmeChallengeRecord"),
97
+ }
98
+ : {}),
99
+ },
100
+ } : {}),
101
+ };
102
+ }
103
+ async function resolveDnsWorkflowSecrets(binding, reader) {
104
+ return {
105
+ apiKey: await reader.readSecretField(binding.credentialItem, "apiKey"),
106
+ secretApiKey: await reader.readSecretField(binding.credentialItem, "secretApiKey"),
107
+ };
108
+ }
109
+ async function readPorkbunJson(response) {
110
+ const payload = await response.json();
111
+ if (!response.ok || payload.status === "ERROR") {
112
+ throw new Error(payload.message ?? `Porkbun request failed with status ${response.status}`);
113
+ }
114
+ return payload;
115
+ }
116
+ function porkbunHeaders(secrets) {
117
+ return {
118
+ "X-API-Key": secrets.apiKey,
119
+ "X-Secret-API-Key": secrets.secretApiKey,
120
+ };
121
+ }
122
+ function porkbunRecordBody(record) {
123
+ return {
124
+ type: record.type,
125
+ name: record.name === "@" ? "" : record.name,
126
+ content: record.content,
127
+ ttl: record.ttl ?? 600,
128
+ prio: record.priority ?? 0,
129
+ };
130
+ }
131
+ function normalizePorkbunRecordName(domain, name) {
132
+ const suffix = `.${domain}`;
133
+ if (name === domain)
134
+ return "@";
135
+ if (name.endsWith(suffix))
136
+ return name.slice(0, -suffix.length);
137
+ return name;
138
+ }
139
+ function normalizePorkbunNumber(value) {
140
+ const parsed = value === null || value === undefined || value === "" ? Number.NaN : Number(value);
141
+ return Number.isFinite(parsed) ? parsed : undefined;
142
+ }
143
+ function normalizePorkbunRecord(domain, input) {
144
+ const value = input;
145
+ const ttl = normalizePorkbunNumber(value.ttl);
146
+ const priority = normalizePorkbunNumber(value.priority ?? value.prio);
147
+ return {
148
+ ...(typeof value.id === "string" ? { id: value.id } : {}),
149
+ type: requireString(value.type, "provider record type"),
150
+ name: normalizePorkbunRecordName(domain, requireString(value.name, "provider record name")),
151
+ content: requireString(value.content, "provider record content"),
152
+ ...(ttl === undefined ? {} : { ttl }),
153
+ ...(priority === undefined ? {} : { priority }),
154
+ };
155
+ }
156
+ async function emitPorkbunRequest(input) {
157
+ (0, runtime_1.emitNervesEvent)({
158
+ event: "daemon.dns_provider_request_start",
159
+ component: "daemon",
160
+ message: `DNS provider ${input.method} ${input.path} started`,
161
+ meta: {
162
+ driver: "porkbun",
163
+ method: input.method,
164
+ path: input.path,
165
+ },
166
+ });
167
+ try {
168
+ const result = await input.execute();
169
+ (0, runtime_1.emitNervesEvent)({
170
+ event: "daemon.dns_provider_request_end",
171
+ component: "daemon",
172
+ message: `DNS provider ${input.method} ${input.path} completed`,
173
+ meta: {
174
+ driver: "porkbun",
175
+ method: input.method,
176
+ path: input.path,
177
+ },
178
+ });
179
+ return result;
180
+ }
181
+ catch (error) {
182
+ (0, runtime_1.emitNervesEvent)({
183
+ level: "error",
184
+ event: "daemon.dns_provider_request_error",
185
+ component: "daemon",
186
+ message: `DNS provider ${input.method} ${input.path} failed`,
187
+ meta: {
188
+ driver: "porkbun",
189
+ method: input.method,
190
+ path: input.path,
191
+ error: String(error),
192
+ },
193
+ });
194
+ throw error;
195
+ }
196
+ }
197
+ function createPorkbunDnsDriver(options) {
198
+ const baseUrl = (options.baseUrl ?? "https://api.porkbun.com/api/json/v3").replace(/\/+$/, "");
199
+ const readOnly = async (path, secrets) => {
200
+ return emitPorkbunRequest({
201
+ method: "GET",
202
+ path,
203
+ execute: async () => readPorkbunJson(await options.fetchImpl(`${baseUrl}${path}`, {
204
+ method: "GET",
205
+ headers: porkbunHeaders(secrets),
206
+ })),
207
+ });
208
+ };
209
+ const mutate = async (path, secrets, body = {}) => {
210
+ return emitPorkbunRequest({
211
+ method: "POST",
212
+ path,
213
+ execute: async () => readPorkbunJson(await options.fetchImpl(`${baseUrl}${path}`, {
214
+ method: "POST",
215
+ headers: {
216
+ ...porkbunHeaders(secrets),
217
+ "Content-Type": "application/json",
218
+ },
219
+ body: JSON.stringify(body),
220
+ })),
221
+ });
222
+ };
223
+ return {
224
+ async ping(secrets) {
225
+ const payload = await readOnly("/ping", secrets);
226
+ return { credentialsValid: payload.credentialsValid === true };
227
+ },
228
+ async retrieveRecords({ domain, secrets }) {
229
+ const payload = await readOnly(`/dns/retrieve/${encodeURIComponent(domain)}`, secrets);
230
+ return (payload.records ?? []).map((record) => normalizePorkbunRecord(domain, record));
231
+ },
232
+ async retrieveCertificate({ domain, secrets }) {
233
+ const payload = await readOnly(`/ssl/retrieve/${encodeURIComponent(domain)}`, secrets);
234
+ return {
235
+ certificatechain: requireString(payload.certificatechain, "certificatechain"),
236
+ publickey: requireString(payload.publickey, "publickey"),
237
+ privatekey: requireString(payload.privatekey, "privatekey"),
238
+ };
239
+ },
240
+ async createRecord({ domain, secrets, record }) {
241
+ const payload = await mutate(`/dns/create/${encodeURIComponent(domain)}`, secrets, porkbunRecordBody(record));
242
+ return typeof payload.id === "string" ? { id: payload.id } : {};
243
+ },
244
+ async editRecord({ domain, secrets, id, record }) {
245
+ await mutate(`/dns/edit/${encodeURIComponent(domain)}/${encodeURIComponent(id)}`, secrets, porkbunRecordBody(record));
246
+ },
247
+ async deleteRecord({ domain, secrets, id }) {
248
+ await mutate(`/dns/delete/${encodeURIComponent(domain)}/${encodeURIComponent(id)}`, secrets);
249
+ },
250
+ };
251
+ }
252
+ function assertDesiredRecordsAllowed(binding) {
253
+ const allowed = new Set(binding.resources.records.map(recordKey));
254
+ for (const desired of binding.desired.records) {
255
+ if (!allowed.has(recordKey(desired)))
256
+ throw new Error("desired DNS record is outside DNS workflow allowlist");
257
+ }
258
+ }
259
+ function recordsEqual(left, right) {
260
+ const priorityEqual = left.type === "MX"
261
+ ? (left.priority ?? 0) === (right.priority ?? 0)
262
+ : true;
263
+ return left.type === right.type &&
264
+ left.name === right.name &&
265
+ left.content === right.content &&
266
+ left.ttl === right.ttl &&
267
+ priorityEqual;
268
+ }
269
+ function recordIdentityKey(record) {
270
+ const priority = record.type === "MX" ? String(record.priority ?? 0) : "";
271
+ return `${recordKey(record)}:${record.content}:${priority}`;
272
+ }
273
+ function sameRecordIdentity(left, right) {
274
+ return recordIdentityKey(left) === recordIdentityKey(right);
275
+ }
276
+ function recordsWithKey(records, key) {
277
+ return records.filter((record) => recordKey(record) === key);
278
+ }
279
+ function findCurrentRecordForDesired(input) {
280
+ const key = recordKey(input.desired);
281
+ const currentSameKey = recordsWithKey(input.currentRecords, key);
282
+ const exact = currentSameKey.find((record) => sameRecordIdentity(record, input.desired));
283
+ if (exact)
284
+ return exact;
285
+ const desiredSameKey = recordsWithKey(input.desiredRecords, key);
286
+ if (currentSameKey.length === 1 && desiredSameKey.length === 1)
287
+ return currentSameKey[0];
288
+ return undefined;
289
+ }
290
+ function planDnsWorkflow(input) {
291
+ assertDesiredRecordsAllowed(input.binding);
292
+ const allowedKeys = new Set(input.binding.resources.records.map(recordKey));
293
+ const changes = [];
294
+ const matchedCurrentRecords = new Set();
295
+ for (const desired of input.binding.desired.records) {
296
+ const current = findCurrentRecordForDesired({
297
+ desired,
298
+ desiredRecords: input.binding.desired.records,
299
+ currentRecords: input.currentRecords,
300
+ });
301
+ if (!current) {
302
+ changes.push({ action: "create", record: desired, reason: "desired record is missing" });
303
+ }
304
+ else if (!recordsEqual(current, desired)) {
305
+ matchedCurrentRecords.add(current);
306
+ changes.push({ action: "update", record: desired, currentRecord: current, reason: "desired record differs from current provider record" });
307
+ }
308
+ else {
309
+ matchedCurrentRecords.add(current);
310
+ }
311
+ }
312
+ if (input.deleteExtraAllowedRecords) {
313
+ for (const current of input.currentRecords) {
314
+ if (allowedKeys.has(recordKey(current)) && !matchedCurrentRecords.has(current)) {
315
+ changes.push({ action: "delete", record: current, currentRecord: current, reason: "allowlisted record is absent from rollback backup" });
316
+ }
317
+ }
318
+ }
319
+ const preservedRecords = input.currentRecords.filter((record) => !matchedCurrentRecords.has(record));
320
+ return {
321
+ backup: { domain: input.binding.domain, records: input.currentRecords },
322
+ changes,
323
+ preservedRecords,
324
+ certificateActions: input.binding.certificate
325
+ ? [{
326
+ action: "retrieve-and-store",
327
+ host: input.binding.certificate.host,
328
+ secretItem: input.binding.certificate.storeItem,
329
+ }]
330
+ : [],
331
+ };
332
+ }
333
+ function planDnsRollback(input) {
334
+ const allowedKeys = new Set(input.binding.resources.records.map(recordKey));
335
+ const rollbackBinding = {
336
+ ...input.binding,
337
+ desired: {
338
+ records: input.backupRecords.filter((record) => allowedKeys.has(recordKey(record))),
339
+ },
340
+ };
341
+ return planDnsWorkflow({
342
+ binding: rollbackBinding,
343
+ currentRecords: input.currentRecords,
344
+ deleteExtraAllowedRecords: true,
345
+ });
346
+ }
347
+ async function applyDnsWorkflowPlan(input) {
348
+ const applied = [];
349
+ for (const change of input.plan.changes) {
350
+ if (change.action === "create") {
351
+ const result = await input.driver.createRecord({ domain: input.domain, secrets: input.secrets, record: change.record });
352
+ applied.push({ action: "create", record: change.record, ...(result.id ? { id: result.id } : {}) });
353
+ continue;
354
+ }
355
+ const id = change.currentRecord?.id ?? change.record.id;
356
+ if (!id)
357
+ throw new Error(`cannot ${change.action} ${change.record.type} ${change.record.name} without provider record id`);
358
+ if (change.action === "update") {
359
+ await input.driver.editRecord({ domain: input.domain, secrets: input.secrets, id, record: change.record });
360
+ applied.push({ action: "update", record: change.record, id });
361
+ continue;
362
+ }
363
+ await input.driver.deleteRecord({ domain: input.domain, secrets: input.secrets, id });
364
+ applied.push({ action: "delete", record: change.record, id });
365
+ }
366
+ return applied;
367
+ }
368
+ function redactedValueForKey(key, value) {
369
+ const normalized = key.toLowerCase();
370
+ if (normalized === "apikey" || normalized === "secretapikey" || normalized === "x-api-key" || normalized === "x-secret-api-key") {
371
+ return "[redacted]";
372
+ }
373
+ if (normalized === "privatekey" || normalized === "privatekeypem" || normalized === "privatekeypath") {
374
+ return "[redacted]";
375
+ }
376
+ if (typeof value === "string" && value.includes("BEGIN PRIVATE KEY")) {
377
+ return "[redacted]";
378
+ }
379
+ return undefined;
380
+ }
381
+ function redactDnsWorkflowArtifact(input) {
382
+ if (Array.isArray(input))
383
+ return input.map((item) => redactDnsWorkflowArtifact(item));
384
+ if (input && typeof input === "object") {
385
+ const output = {};
386
+ for (const [key, value] of Object.entries(input)) {
387
+ output[key] = redactedValueForKey(key, value) ?? redactDnsWorkflowArtifact(value);
388
+ }
389
+ return output;
390
+ }
391
+ if (typeof input === "string" && input.includes("BEGIN PRIVATE KEY"))
392
+ return "[redacted]";
393
+ return input;
394
+ }
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ /**
3
+ * Type definitions for the `ouro doctor` system health check.
4
+ *
5
+ * Describes the structure of health check results: individual checks,
6
+ * grouped categories, and the aggregated result.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });