@ouro.bot/cli 0.1.0-alpha.51 → 0.1.0-alpha.511

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 (372) hide show
  1. package/README.md +133 -19
  2. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +3 -2
  3. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  4. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  5. package/changelog.json +3253 -0
  6. package/dist/arc/attention-types.js +8 -0
  7. package/dist/arc/cares.js +140 -0
  8. package/dist/arc/episodes.js +117 -0
  9. package/dist/arc/intentions.js +133 -0
  10. package/dist/arc/json-store.js +117 -0
  11. package/dist/arc/obligations.js +237 -0
  12. package/dist/arc/packets.js +193 -0
  13. package/dist/arc/presence.js +185 -0
  14. package/dist/arc/task-lifecycle.js +65 -0
  15. package/dist/heart/active-work.js +867 -35
  16. package/dist/heart/agent-entry.js +58 -3
  17. package/dist/heart/attachments/image-normalize.js +194 -0
  18. package/dist/heart/attachments/materialize.js +97 -0
  19. package/dist/heart/attachments/originals.js +88 -0
  20. package/dist/heart/attachments/render.js +29 -0
  21. package/dist/heart/attachments/sources/adapter.js +2 -0
  22. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  23. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  24. package/dist/heart/attachments/sources/index.js +16 -0
  25. package/dist/heart/attachments/store.js +103 -0
  26. package/dist/heart/attachments/types.js +93 -0
  27. package/dist/heart/auth/auth-flow.js +426 -0
  28. package/dist/heart/background-operations.js +281 -0
  29. package/dist/heart/bundle-state.js +168 -0
  30. package/dist/heart/commitments.js +111 -0
  31. package/dist/heart/config-registry.js +304 -0
  32. package/dist/heart/config.js +119 -129
  33. package/dist/heart/core.js +878 -244
  34. package/dist/heart/cross-chat-delivery.js +131 -0
  35. package/dist/heart/daemon/agent-config-check.js +490 -0
  36. package/dist/heart/daemon/agent-discovery.js +79 -3
  37. package/dist/heart/daemon/agent-service.js +360 -0
  38. package/dist/heart/daemon/agentic-repair.js +216 -0
  39. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  40. package/dist/heart/daemon/cadence.js +70 -0
  41. package/dist/heart/daemon/cli-defaults.js +640 -0
  42. package/dist/heart/daemon/cli-exec.js +7241 -0
  43. package/dist/heart/daemon/cli-help.js +493 -0
  44. package/dist/heart/daemon/cli-parse.js +1536 -0
  45. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  46. package/dist/heart/daemon/cli-render.js +561 -0
  47. package/dist/heart/daemon/cli-types.js +8 -0
  48. package/dist/heart/daemon/connect-bay.js +323 -0
  49. package/dist/heart/daemon/daemon-cli.js +29 -1631
  50. package/dist/heart/daemon/daemon-entry.js +345 -3
  51. package/dist/heart/daemon/daemon-health.js +141 -0
  52. package/dist/heart/daemon/daemon-runtime-sync.js +190 -12
  53. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  54. package/dist/heart/daemon/daemon.js +677 -58
  55. package/dist/heart/daemon/dns-workflow.js +394 -0
  56. package/dist/heart/daemon/doctor-types.js +8 -0
  57. package/dist/heart/daemon/doctor.js +750 -0
  58. package/dist/heart/daemon/health-monitor.js +92 -1
  59. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  60. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  61. package/dist/heart/daemon/http-health-probe.js +80 -0
  62. package/dist/heart/daemon/human-command-screens.js +234 -0
  63. package/dist/heart/daemon/human-readiness.js +114 -0
  64. package/dist/heart/daemon/inner-status.js +89 -0
  65. package/dist/heart/daemon/interactive-repair.js +394 -0
  66. package/dist/heart/daemon/launchd.js +25 -5
  67. package/dist/heart/daemon/log-tailer.js +82 -12
  68. package/dist/heart/daemon/logs-prune.js +110 -0
  69. package/dist/heart/daemon/message-router.js +2 -2
  70. package/dist/heart/daemon/os-cron-deps.js +134 -0
  71. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  72. package/dist/heart/daemon/ouro-entry.js +3 -1
  73. package/dist/heart/daemon/process-manager.js +214 -0
  74. package/dist/heart/daemon/provider-discovery.js +137 -0
  75. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  76. package/dist/heart/daemon/pulse.js +475 -0
  77. package/dist/heart/daemon/readiness-repair.js +365 -0
  78. package/dist/heart/daemon/run-hooks.js +2 -0
  79. package/dist/heart/daemon/runtime-logging.js +67 -16
  80. package/dist/heart/daemon/runtime-metadata.js +73 -0
  81. package/dist/heart/daemon/runtime-mode.js +67 -0
  82. package/dist/heart/daemon/safe-mode.js +161 -0
  83. package/dist/heart/daemon/sense-manager.js +178 -37
  84. package/dist/heart/daemon/session-id-resolver.js +131 -0
  85. package/dist/heart/daemon/skill-management-installer.js +94 -0
  86. package/dist/heart/daemon/socket-client.js +109 -4
  87. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  88. package/dist/heart/daemon/startup-tui.js +264 -0
  89. package/dist/heart/daemon/task-scheduler.js +3 -25
  90. package/dist/heart/daemon/terminal-ui.js +499 -0
  91. package/dist/heart/daemon/thoughts.js +162 -17
  92. package/dist/heart/daemon/up-progress.js +366 -0
  93. package/dist/heart/daemon/vault-items.js +56 -0
  94. package/dist/heart/delegation.js +1 -1
  95. package/dist/heart/habits/habit-migration.js +189 -0
  96. package/dist/heart/habits/habit-parser.js +140 -0
  97. package/dist/heart/habits/habit-runtime-state.js +100 -0
  98. package/dist/heart/habits/habit-scheduler.js +372 -0
  99. package/dist/heart/{daemon → hatch}/hatch-flow.js +52 -117
  100. package/dist/heart/{daemon → hatch}/hatch-specialist.js +3 -3
  101. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  102. package/dist/heart/{daemon → hatch}/specialist-tools.js +35 -12
  103. package/dist/heart/identity.js +205 -66
  104. package/dist/heart/kept-notes.js +357 -0
  105. package/dist/heart/kicks.js +1 -1
  106. package/dist/heart/machine-identity.js +161 -0
  107. package/dist/heart/mail-import-discovery.js +353 -0
  108. package/dist/heart/mcp/mcp-server.js +653 -0
  109. package/dist/heart/migrate-config.js +100 -0
  110. package/dist/heart/model-capabilities.js +19 -0
  111. package/dist/heart/outlook/outlook-http-hooks.js +66 -0
  112. package/dist/heart/outlook/outlook-http-response.js +7 -0
  113. package/dist/heart/outlook/outlook-http-routes.js +244 -0
  114. package/dist/heart/outlook/outlook-http-static.js +103 -0
  115. package/dist/heart/outlook/outlook-http-transport.js +116 -0
  116. package/dist/heart/outlook/outlook-http.js +99 -0
  117. package/dist/heart/outlook/outlook-read.js +31 -0
  118. package/dist/heart/outlook/outlook-types.js +27 -0
  119. package/dist/heart/outlook/outlook-view.js +195 -0
  120. package/dist/heart/outlook/readers/agent-machine.js +382 -0
  121. package/dist/heart/outlook/readers/continuity-readers.js +336 -0
  122. package/dist/heart/outlook/readers/mail.js +362 -0
  123. package/dist/heart/outlook/readers/runtime-readers.js +644 -0
  124. package/dist/heart/outlook/readers/sessions.js +232 -0
  125. package/dist/heart/outlook/readers/shared.js +111 -0
  126. package/dist/heart/platform.js +81 -0
  127. package/dist/heart/provider-attempt.js +134 -0
  128. package/dist/heart/provider-binding-resolver.js +255 -0
  129. package/dist/heart/provider-credentials.js +424 -0
  130. package/dist/heart/provider-failover.js +301 -0
  131. package/dist/heart/provider-models.js +81 -0
  132. package/dist/heart/provider-ping.js +262 -0
  133. package/dist/heart/provider-state.js +216 -0
  134. package/dist/heart/provider-visibility.js +188 -0
  135. package/dist/heart/providers/anthropic-token.js +131 -0
  136. package/dist/heart/providers/anthropic.js +139 -52
  137. package/dist/heart/providers/azure.js +97 -13
  138. package/dist/heart/providers/error-classification.js +127 -0
  139. package/dist/heart/providers/github-copilot.js +145 -0
  140. package/dist/heart/providers/minimax-vlm.js +189 -0
  141. package/dist/heart/providers/minimax.js +26 -8
  142. package/dist/heart/providers/openai-codex.js +55 -40
  143. package/dist/heart/runtime-capability-check.js +170 -0
  144. package/dist/heart/runtime-credentials.js +260 -0
  145. package/dist/heart/sense-truth.js +11 -4
  146. package/dist/heart/session-activity.js +43 -22
  147. package/dist/heart/session-events.js +1150 -0
  148. package/dist/heart/session-playback-cli-main.js +5 -0
  149. package/dist/heart/session-playback-cli.js +36 -0
  150. package/dist/heart/session-playback.js +231 -0
  151. package/dist/heart/session-stats-cli-main.js +5 -0
  152. package/dist/heart/session-stats.js +182 -0
  153. package/dist/heart/session-transcript.js +167 -0
  154. package/dist/heart/start-of-turn-packet.js +345 -0
  155. package/dist/heart/streaming.js +44 -27
  156. package/dist/heart/sync.js +332 -0
  157. package/dist/heart/target-resolution.js +127 -0
  158. package/dist/heart/tempo.js +93 -0
  159. package/dist/heart/temporal-view.js +41 -0
  160. package/dist/heart/tool-activity-callbacks.js +36 -0
  161. package/dist/heart/tool-description.js +135 -0
  162. package/dist/heart/tool-friction.js +55 -0
  163. package/dist/heart/tool-loop.js +200 -0
  164. package/dist/heart/turn-context.js +372 -0
  165. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +1 -1
  166. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  167. package/dist/heart/versioning/ouro-path-installer.js +425 -0
  168. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  169. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  170. package/dist/heart/{daemon → versioning}/update-checker.js +5 -1
  171. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  172. package/dist/mailroom/attention.js +167 -0
  173. package/dist/mailroom/autonomy.js +209 -0
  174. package/dist/mailroom/blob-store.js +606 -0
  175. package/dist/mailroom/body-cache.js +61 -0
  176. package/dist/mailroom/core.js +672 -0
  177. package/dist/mailroom/entry.js +160 -0
  178. package/dist/mailroom/file-store.js +426 -0
  179. package/dist/mailroom/mbox-import.js +382 -0
  180. package/dist/mailroom/outbound.js +380 -0
  181. package/dist/mailroom/policy.js +263 -0
  182. package/dist/mailroom/reader.js +219 -0
  183. package/dist/mailroom/search-cache.js +182 -0
  184. package/dist/mailroom/search-relevance.js +319 -0
  185. package/dist/mailroom/smtp-ingress.js +176 -0
  186. package/dist/mailroom/source-state.js +176 -0
  187. package/dist/mailroom/thread.js +109 -0
  188. package/dist/mailroom/travel-extract.js +89 -0
  189. package/dist/mind/bundle-manifest.js +7 -1
  190. package/dist/mind/context.js +165 -101
  191. package/dist/mind/diary-integrity.js +60 -0
  192. package/dist/mind/{memory.js → diary.js} +74 -93
  193. package/dist/mind/embedding-provider.js +60 -0
  194. package/dist/mind/file-state.js +179 -0
  195. package/dist/mind/friends/channel.js +30 -0
  196. package/dist/mind/friends/group-context.js +144 -0
  197. package/dist/mind/friends/resolver.js +54 -2
  198. package/dist/mind/friends/store-file.js +39 -3
  199. package/dist/mind/friends/trust-explanation.js +74 -0
  200. package/dist/mind/friends/types.js +2 -2
  201. package/dist/mind/journal-index.js +161 -0
  202. package/dist/mind/note-search.js +268 -0
  203. package/dist/mind/obligation-steering.js +221 -0
  204. package/dist/mind/pending.js +4 -0
  205. package/dist/mind/prompt-refresh.js +3 -2
  206. package/dist/mind/prompt.js +940 -111
  207. package/dist/mind/provenance-trust.js +26 -0
  208. package/dist/mind/scrutiny.js +173 -0
  209. package/dist/nerves/cli-logging.js +7 -1
  210. package/dist/nerves/coverage/audit-rules.js +15 -6
  211. package/dist/nerves/coverage/audit.js +28 -2
  212. package/dist/nerves/coverage/cli.js +1 -1
  213. package/dist/nerves/coverage/contract.js +5 -5
  214. package/dist/nerves/coverage/file-completeness.js +114 -5
  215. package/dist/nerves/coverage/run-artifacts.js +1 -1
  216. package/dist/nerves/event-buffer.js +111 -0
  217. package/dist/nerves/index.js +224 -4
  218. package/dist/nerves/observation.js +20 -0
  219. package/dist/nerves/redact.js +79 -0
  220. package/dist/nerves/review/cli-main.js +5 -0
  221. package/dist/nerves/review/cli.js +156 -0
  222. package/dist/nerves/review/core.js +152 -0
  223. package/dist/nerves/runtime.js +5 -1
  224. package/dist/outlook-ui/assets/index-BPr5vNuM.css +1 -0
  225. package/dist/outlook-ui/assets/index-Cm51CY9W.js +61 -0
  226. package/dist/outlook-ui/index.html +15 -0
  227. package/dist/repertoire/ado-client.js +15 -56
  228. package/dist/repertoire/ado-semantic.js +11 -10
  229. package/dist/repertoire/api-client.js +97 -0
  230. package/dist/repertoire/bitwarden-store.js +774 -0
  231. package/dist/repertoire/bundle-templates.js +72 -0
  232. package/dist/repertoire/bw-installer.js +180 -0
  233. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  234. package/dist/repertoire/coding/context-pack.js +330 -0
  235. package/dist/repertoire/coding/feedback.js +197 -30
  236. package/dist/repertoire/coding/manager.js +158 -9
  237. package/dist/repertoire/coding/spawner.js +55 -9
  238. package/dist/repertoire/coding/tools.js +170 -7
  239. package/dist/repertoire/commerce-errors.js +109 -0
  240. package/dist/repertoire/commerce-self-test.js +156 -0
  241. package/dist/repertoire/credential-access.js +111 -0
  242. package/dist/repertoire/duffel-client.js +185 -0
  243. package/dist/repertoire/github-client.js +14 -55
  244. package/dist/repertoire/graph-client.js +11 -52
  245. package/dist/repertoire/guardrails.js +396 -0
  246. package/dist/repertoire/mcp-client.js +255 -0
  247. package/dist/repertoire/mcp-manager.js +305 -0
  248. package/dist/repertoire/mcp-tools.js +63 -0
  249. package/dist/repertoire/shell-sessions.js +133 -0
  250. package/dist/repertoire/skills.js +15 -24
  251. package/dist/repertoire/stripe-client.js +131 -0
  252. package/dist/repertoire/tasks/board.js +31 -5
  253. package/dist/repertoire/tasks/fix.js +182 -0
  254. package/dist/repertoire/tasks/index.js +16 -4
  255. package/dist/repertoire/tasks/lifecycle.js +2 -2
  256. package/dist/repertoire/tasks/parser.js +3 -2
  257. package/dist/repertoire/tasks/scanner.js +194 -37
  258. package/dist/repertoire/tasks/transitions.js +16 -78
  259. package/dist/repertoire/tool-results.js +29 -0
  260. package/dist/repertoire/tools-attachments.js +317 -0
  261. package/dist/repertoire/tools-base.js +46 -955
  262. package/dist/repertoire/tools-bluebubbles.js +1 -0
  263. package/dist/repertoire/tools-bridge.js +141 -0
  264. package/dist/repertoire/tools-bundle.js +984 -0
  265. package/dist/repertoire/tools-config.js +185 -0
  266. package/dist/repertoire/tools-continuity.js +248 -0
  267. package/dist/repertoire/tools-credential.js +381 -0
  268. package/dist/repertoire/tools-files.js +342 -0
  269. package/dist/repertoire/tools-flight.js +224 -0
  270. package/dist/repertoire/tools-flow.js +105 -0
  271. package/dist/repertoire/tools-github.js +1 -7
  272. package/dist/repertoire/tools-mail.js +1477 -0
  273. package/dist/repertoire/tools-notes.js +376 -0
  274. package/dist/repertoire/tools-session.js +749 -0
  275. package/dist/repertoire/tools-shell.js +120 -0
  276. package/dist/repertoire/tools-stripe.js +180 -0
  277. package/dist/repertoire/tools-surface.js +243 -0
  278. package/dist/repertoire/tools-teams.js +9 -39
  279. package/dist/repertoire/tools-travel.js +125 -0
  280. package/dist/repertoire/tools-trip.js +422 -0
  281. package/dist/repertoire/tools-user-profile.js +144 -0
  282. package/dist/repertoire/tools-vault.js +40 -0
  283. package/dist/repertoire/tools.js +107 -100
  284. package/dist/repertoire/travel-api-client.js +360 -0
  285. package/dist/repertoire/user-profile.js +131 -0
  286. package/dist/repertoire/vault-setup.js +246 -0
  287. package/dist/repertoire/vault-unlock.js +561 -0
  288. package/dist/scripts/claude-code-hook.js +41 -0
  289. package/dist/scripts/claude-code-stop-hook.js +47 -0
  290. package/dist/senses/attention-queue.js +116 -0
  291. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  292. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  293. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  294. package/dist/senses/bluebubbles/entry.js +73 -0
  295. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  296. package/dist/senses/bluebubbles/index.js +1881 -0
  297. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  298. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  299. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  300. package/dist/senses/bluebubbles/processed-log.js +111 -0
  301. package/dist/senses/bluebubbles/replay.js +129 -0
  302. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +2 -2
  303. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  304. package/dist/senses/cli/bracketed-paste.js +82 -0
  305. package/dist/senses/cli/image-paste.js +287 -0
  306. package/dist/senses/cli/image-ref-navigation.js +75 -0
  307. package/dist/senses/cli/ink-app.js +156 -0
  308. package/dist/senses/cli/inline-diff.js +64 -0
  309. package/dist/senses/cli/input-keys.js +174 -0
  310. package/dist/senses/cli/kill-ring.js +86 -0
  311. package/dist/senses/cli/message-list.js +51 -0
  312. package/dist/senses/cli/ouro-tui.js +605 -0
  313. package/dist/senses/cli/spinner-imperative.js +135 -0
  314. package/dist/senses/cli/spinner.js +101 -0
  315. package/dist/senses/cli/status-line.js +60 -0
  316. package/dist/senses/cli/streaming-markdown.js +526 -0
  317. package/dist/senses/cli/tool-display.js +83 -0
  318. package/dist/senses/cli/tool-render.js +85 -0
  319. package/dist/senses/cli/tui-store.js +240 -0
  320. package/dist/senses/cli/virtual-list.js +35 -0
  321. package/dist/senses/cli-entry.js +60 -8
  322. package/dist/senses/cli-layout.js +187 -0
  323. package/dist/senses/cli.js +511 -209
  324. package/dist/senses/commands.js +66 -3
  325. package/dist/senses/habit-turn-message.js +108 -0
  326. package/dist/senses/inner-dialog-worker.js +175 -21
  327. package/dist/senses/inner-dialog.js +330 -27
  328. package/dist/senses/mail-entry.js +66 -0
  329. package/dist/senses/mail.js +379 -0
  330. package/dist/senses/pipeline.js +573 -164
  331. package/dist/senses/proactive-content-guard.js +51 -0
  332. package/dist/senses/shared-turn.js +248 -0
  333. package/dist/senses/surface-tool.js +68 -0
  334. package/dist/senses/teams-entry.js +60 -8
  335. package/dist/senses/teams.js +405 -170
  336. package/dist/senses/trust-gate.js +100 -5
  337. package/dist/trips/core.js +138 -0
  338. package/dist/trips/store.js +146 -0
  339. package/package.json +37 -7
  340. package/skills/agent-commerce.md +106 -0
  341. package/skills/browser-navigation.md +117 -0
  342. package/skills/commerce-setup-guide.md +116 -0
  343. package/skills/commerce-setup.md +84 -0
  344. package/skills/configure-dev-tools.md +101 -0
  345. package/skills/travel-planning.md +138 -0
  346. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  347. package/dist/heart/daemon/subagent-installer.js +0 -166
  348. package/dist/heart/session-recall.js +0 -116
  349. package/dist/mind/associative-recall.js +0 -209
  350. package/dist/senses/bluebubbles-entry.js +0 -13
  351. package/dist/senses/bluebubbles.js +0 -1142
  352. package/dist/senses/debug-activity.js +0 -148
  353. package/subagents/README.md +0 -86
  354. package/subagents/work-doer.md +0 -237
  355. package/subagents/work-merger.md +0 -618
  356. package/subagents/work-planner.md +0 -390
  357. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  358. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  359. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  360. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  361. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  362. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  363. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  364. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  365. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  366. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  367. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  368. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  369. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  370. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  371. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  372. /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 });