@ouro.bot/cli 0.1.0-alpha.88 → 0.1.0-alpha.881

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 (671) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +154 -23
  3. package/RepairGuide.ouro/agent.json +5 -0
  4. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  5. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  6. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  7. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  8. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  9. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  12. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  13. package/assets/bluebubbles-host +264 -0
  14. package/assets/sanctuary-host-launcher.sh +16 -0
  15. package/changelog.json +5607 -16
  16. package/deploy/unraid/Dockerfile +58 -0
  17. package/deploy/unraid/README.txt +2995 -0
  18. package/deploy/unraid/audit-container-spec.sh +4 -0
  19. package/deploy/unraid/container-runtime.json +1 -0
  20. package/deploy/unraid/docker-man-template-transaction.mjs +711 -0
  21. package/deploy/unraid/docker-man-template-xml.cjs +105 -0
  22. package/deploy/unraid/migrate-sanctuary-bundle.mjs +60 -0
  23. package/deploy/unraid/ouro-events/bootstrap-spool.sh +92 -0
  24. package/deploy/unraid/ouro-events/emit-event.mjs +310 -0
  25. package/deploy/unraid/ouro-events/emit-usenet-event.sh +54 -0
  26. package/deploy/unraid/ouro-events/install-usenet-guard.sh +435 -0
  27. package/deploy/unraid/ouro-events/usenet-health.sh +176 -0
  28. package/deploy/unraid/sanctuary-acceptance-adapter.sh +43 -0
  29. package/deploy/unraid/sanctuary-acceptance-contract.json +198 -0
  30. package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
  31. package/deploy/unraid/sanctuary-authority-installation.json +36 -0
  32. package/deploy/unraid/sanctuary-authority-service.sh +30 -0
  33. package/deploy/unraid/sanctuary-butler-upgrade.mjs +1197 -0
  34. package/deploy/unraid/sanctuary-deployment-target.mjs +710 -0
  35. package/deploy/unraid/sanctuary-replay-gate.mjs +1127 -0
  36. package/deploy/unraid/sanctuary-safe-rename.py +24 -0
  37. package/deploy/unraid/sanctuary-unit16-host-broker.mjs +2085 -0
  38. package/deploy/unraid/sanctuary-unit16-run.sh +560 -0
  39. package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
  40. package/deploy/unraid/sanctuary.ouro/agent.json +66 -0
  41. package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
  42. package/deploy/unraid/sanctuary.ouro/awaiting/house-care-sweep.md +17 -0
  43. package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
  44. package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
  45. package/deploy/unraid/sanctuary.ouro/mcp/media-mcp.mjs +2231 -0
  46. package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
  47. package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
  48. package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +5 -0
  49. package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +27 -0
  50. package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +27 -0
  51. package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +22 -0
  52. package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
  53. package/deploy/unraid/sanctuary.ouro/tool-profiles.json +232 -0
  54. package/deploy/unraid/sanctuary.xml +29 -0
  55. package/dist/a2a/card.js +57 -0
  56. package/dist/a2a/client.js +238 -0
  57. package/dist/a2a/config.js +50 -0
  58. package/dist/a2a/delegated-command.js +151 -0
  59. package/dist/a2a/delegation-stores.js +56 -0
  60. package/dist/a2a/did-resolution.js +93 -0
  61. package/dist/a2a/escalation-grants.js +122 -0
  62. package/dist/a2a/escalation-wiring.js +60 -0
  63. package/dist/a2a/identity.js +204 -0
  64. package/dist/a2a/inbound-share.js +110 -0
  65. package/dist/a2a/mission-result-wire.js +196 -0
  66. package/dist/a2a/onboarding.js +133 -0
  67. package/dist/a2a/outbox-client.js +57 -0
  68. package/dist/a2a/outbox-store.js +188 -0
  69. package/dist/a2a/outbox-wire.js +95 -0
  70. package/dist/a2a/pin-store.js +132 -0
  71. package/dist/a2a/replay-harness.js +175 -0
  72. package/dist/a2a/resolution-proof.js +53 -0
  73. package/dist/a2a/sealed-chat.js +113 -0
  74. package/dist/a2a/seen-ledger.js +120 -0
  75. package/dist/a2a/server.js +766 -0
  76. package/dist/a2a/task-store.js +69 -0
  77. package/dist/a2a/transport.js +45 -0
  78. package/dist/a2a/trusted-files.js +98 -0
  79. package/dist/a2a/types.js +3 -0
  80. package/dist/arc/attention-types.js +8 -0
  81. package/dist/arc/cares.js +360 -0
  82. package/dist/arc/episodes.js +118 -0
  83. package/dist/arc/evolution.js +490 -0
  84. package/dist/arc/flight-recorder.js +1034 -0
  85. package/dist/arc/intentions.js +134 -0
  86. package/dist/arc/json-store.js +117 -0
  87. package/dist/arc/obligations.js +386 -0
  88. package/dist/arc/packets.js +336 -0
  89. package/dist/arc/presence.js +185 -0
  90. package/dist/arc/task-lifecycle.js +57 -0
  91. package/dist/commerce/store.js +755 -0
  92. package/dist/commerce/types.js +3 -0
  93. package/dist/heart/active-work.js +798 -40
  94. package/dist/heart/agent-entry.js +252 -3
  95. package/dist/heart/approval-files.js +113 -0
  96. package/dist/heart/approval-store.js +960 -0
  97. package/dist/heart/attachments/image-normalize.js +194 -0
  98. package/dist/heart/attachments/materialize.js +97 -0
  99. package/dist/heart/attachments/originals.js +88 -0
  100. package/dist/heart/attachments/render.js +29 -0
  101. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  102. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  103. package/dist/heart/attachments/sources/index.js +18 -0
  104. package/dist/heart/attachments/sources/telegram.js +71 -0
  105. package/dist/heart/attachments/store.js +132 -0
  106. package/dist/heart/attachments/types.js +93 -0
  107. package/dist/heart/auth/auth-flow.js +495 -0
  108. package/dist/heart/autonomy-budget.js +478 -0
  109. package/dist/heart/awaiting/a2a-await-delivery.js +109 -0
  110. package/dist/heart/awaiting/await-alert.js +152 -0
  111. package/dist/heart/awaiting/await-expiry.js +143 -0
  112. package/dist/heart/awaiting/await-loader.js +91 -0
  113. package/dist/heart/awaiting/await-parser.js +152 -0
  114. package/dist/heart/awaiting/await-runtime-state.js +111 -0
  115. package/dist/heart/awaiting/await-scheduler.js +382 -0
  116. package/dist/heart/background-operations.js +281 -0
  117. package/dist/heart/bridges/manager.js +137 -17
  118. package/dist/heart/bridges/store.js +14 -2
  119. package/dist/heart/bundle-state.js +168 -0
  120. package/dist/heart/commitments.js +44 -18
  121. package/dist/heart/config-registry.js +331 -0
  122. package/dist/heart/config.js +174 -131
  123. package/dist/heart/context-loss-gauntlet.js +387 -0
  124. package/dist/heart/context-loss-sentinel.js +1157 -0
  125. package/dist/heart/core.js +2286 -580
  126. package/dist/heart/cross-chat-delivery.js +9 -22
  127. package/dist/heart/daemon/agent-config-check.js +451 -0
  128. package/dist/heart/daemon/agent-discovery.js +185 -3
  129. package/dist/heart/daemon/agent-service.js +542 -0
  130. package/dist/heart/daemon/agentic-repair.js +547 -0
  131. package/dist/heart/daemon/await-private-wake.js +59 -0
  132. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  133. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  134. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  135. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  136. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  137. package/dist/heart/daemon/cadence.js +180 -0
  138. package/dist/heart/daemon/cli-defaults.js +854 -0
  139. package/dist/heart/daemon/cli-desk.js +322 -0
  140. package/dist/heart/daemon/cli-exec.js +8951 -0
  141. package/dist/heart/daemon/cli-help.js +716 -0
  142. package/dist/heart/daemon/cli-parse.js +2941 -0
  143. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  144. package/dist/heart/daemon/cli-render.js +777 -0
  145. package/dist/heart/daemon/cli-types.js +8 -0
  146. package/dist/heart/daemon/connect-bay.js +323 -0
  147. package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
  148. package/dist/heart/daemon/container-healthcheck.js +112 -0
  149. package/dist/heart/daemon/container-runtime.js +97 -0
  150. package/dist/heart/daemon/container-spec-auditor-main.js +171 -0
  151. package/dist/heart/daemon/container-spec-auditor.js +232 -0
  152. package/dist/heart/daemon/daemon-bootstrap-startup.js +115 -0
  153. package/dist/heart/daemon/daemon-cli.js +29 -2349
  154. package/dist/heart/daemon/daemon-entry.js +932 -11
  155. package/dist/heart/daemon/daemon-health.js +186 -0
  156. package/dist/heart/daemon/daemon-rollup.js +57 -0
  157. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  158. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  159. package/dist/heart/daemon/daemon.js +2084 -105
  160. package/dist/heart/daemon/dns-workflow.js +394 -0
  161. package/dist/heart/daemon/doctor-types.js +8 -0
  162. package/dist/heart/daemon/doctor.js +1755 -0
  163. package/dist/heart/daemon/freshness.js +345 -0
  164. package/dist/heart/daemon/habit-private-wake.js +61 -0
  165. package/dist/heart/daemon/health-monitor.js +142 -11
  166. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  167. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  168. package/dist/heart/daemon/http-health-probe.js +80 -0
  169. package/dist/heart/daemon/human-command-screens.js +234 -0
  170. package/dist/heart/daemon/human-readiness.js +114 -0
  171. package/dist/heart/daemon/inner-status.js +78 -0
  172. package/dist/heart/daemon/interactive-repair.js +394 -0
  173. package/dist/heart/daemon/launchd.js +37 -8
  174. package/dist/heart/daemon/log-tailer.js +79 -10
  175. package/dist/heart/daemon/logs-prune.js +132 -0
  176. package/dist/heart/daemon/mcp-canary.js +524 -0
  177. package/dist/heart/daemon/message-router.js +65 -5
  178. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  179. package/dist/heart/daemon/os-cron-deps.js +135 -0
  180. package/dist/heart/daemon/os-cron.js +22 -14
  181. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  182. package/dist/heart/daemon/ouro-entry.js +3 -1
  183. package/dist/heart/daemon/plugin-cli.js +432 -0
  184. package/dist/heart/daemon/process-manager.js +733 -61
  185. package/dist/heart/daemon/provider-discovery.js +137 -0
  186. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  187. package/dist/heart/daemon/prunable-bundle.js +144 -0
  188. package/dist/heart/daemon/pulse.js +511 -0
  189. package/dist/heart/daemon/readiness-repair.js +365 -0
  190. package/dist/heart/daemon/run-hooks.js +2 -0
  191. package/dist/heart/daemon/runtime-logging.js +47 -14
  192. package/dist/heart/daemon/runtime-metadata.js +2 -30
  193. package/dist/heart/daemon/runtime-mode.js +13 -2
  194. package/dist/heart/daemon/safe-mode.js +161 -0
  195. package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2654 -0
  196. package/dist/heart/daemon/sanctuary-acceptance-harness.js +1830 -0
  197. package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
  198. package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +955 -0
  199. package/dist/heart/daemon/sanctuary-authority-codec.js +86 -0
  200. package/dist/heart/daemon/sanctuary-authority-epoch.js +281 -0
  201. package/dist/heart/daemon/sanctuary-authority-installation.js +161 -0
  202. package/dist/heart/daemon/sanctuary-authority-ledger.js +241 -0
  203. package/dist/heart/daemon/sanctuary-authority-root-lifecycle.js +1310 -0
  204. package/dist/heart/daemon/sanctuary-authority-vault-migration.js +79 -0
  205. package/dist/heart/daemon/sanctuary-bundle-migration.js +730 -0
  206. package/dist/heart/daemon/sanctuary-host-authority.js +1008 -0
  207. package/dist/heart/daemon/sanctuary-host-detached-supervisor.js +493 -0
  208. package/dist/heart/daemon/sanctuary-host-executor.js +670 -0
  209. package/dist/heart/daemon/sanctuary-host-linux-kernel.js +334 -0
  210. package/dist/heart/daemon/sanctuary-host-supervisor-entry.js +207 -0
  211. package/dist/heart/daemon/sanctuary-host-supervisor.js +95 -0
  212. package/dist/heart/daemon/sanctuary-package-management.js +103 -0
  213. package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
  214. package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
  215. package/dist/heart/daemon/sanctuary-telegram-authority-entry.js +475 -0
  216. package/dist/heart/daemon/sanctuary-telegram-authority-gateway.js +585 -0
  217. package/dist/heart/daemon/sanctuary-telegram-authority-service.js +676 -0
  218. package/dist/heart/daemon/sense-manager.js +699 -48
  219. package/dist/heart/daemon/session-id-resolver.js +131 -0
  220. package/dist/heart/daemon/skill-management-installer.js +1 -1
  221. package/dist/heart/daemon/socket-client.js +180 -12
  222. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  223. package/dist/heart/daemon/startup-tui.js +339 -0
  224. package/dist/heart/daemon/supercronic-supervisor.js +282 -0
  225. package/dist/heart/daemon/task-scheduler.js +117 -39
  226. package/dist/heart/daemon/terminal-ui.js +499 -0
  227. package/dist/heart/daemon/thoughts.js +138 -54
  228. package/dist/heart/daemon/up-progress.js +366 -0
  229. package/dist/heart/daemon/vault-items.js +56 -0
  230. package/dist/heart/delegation.js +1 -4
  231. package/dist/heart/external-events/router.js +1516 -0
  232. package/dist/heart/failure-reports.js +335 -0
  233. package/dist/heart/file-lock.js +109 -0
  234. package/dist/heart/frontend-approval-runtime.js +506 -0
  235. package/dist/heart/frontend-journal.js +215 -0
  236. package/dist/heart/frontend-session-service.js +237 -0
  237. package/dist/heart/frontend-socket-client.js +164 -0
  238. package/dist/heart/frontend-socket.js +400 -0
  239. package/dist/heart/habits/habit-cancel.js +810 -0
  240. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  241. package/dist/heart/habits/habit-migration.js +194 -0
  242. package/dist/heart/habits/habit-parser.js +278 -0
  243. package/dist/heart/habits/habit-runtime-state.js +93 -0
  244. package/dist/heart/habits/habit-scheduler.js +653 -0
  245. package/dist/heart/habits/habit-session-summary.js +318 -0
  246. package/dist/heart/habits/habit-session.js +636 -0
  247. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
  248. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  249. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  250. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  251. package/dist/heart/identity.js +196 -59
  252. package/dist/heart/kept-notes.js +289 -0
  253. package/dist/heart/kicks.js +1 -1
  254. package/dist/heart/machine-identity.js +161 -0
  255. package/dist/heart/mail-import-discovery.js +356 -0
  256. package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
  257. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  258. package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
  259. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  260. package/dist/heart/mailbox/mailbox-http-transport.js +272 -0
  261. package/dist/heart/mailbox/mailbox-http.js +99 -0
  262. package/dist/heart/mailbox/mailbox-read.js +39 -0
  263. package/dist/heart/mailbox/mailbox-types.js +27 -0
  264. package/dist/heart/mailbox/mailbox-view.js +197 -0
  265. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  266. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  267. package/dist/heart/mailbox/readers/mail.js +375 -0
  268. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  269. package/dist/heart/mailbox/readers/sessions.js +231 -0
  270. package/dist/heart/mailbox/readers/shared.js +111 -0
  271. package/dist/heart/mcp/mcp-server.js +696 -0
  272. package/dist/heart/migrate-config.js +100 -0
  273. package/dist/heart/model-capabilities.js +11 -0
  274. package/dist/heart/orientation-frame.js +345 -0
  275. package/dist/heart/platform.js +81 -0
  276. package/dist/heart/primitives.js +1 -1
  277. package/dist/heart/private-runtime/decision-renderer.js +158 -0
  278. package/dist/heart/private-runtime/index.js +18 -0
  279. package/dist/heart/private-runtime/ledger.js +221 -0
  280. package/dist/heart/private-runtime/policy.js +252 -0
  281. package/dist/heart/private-runtime/types.js +2 -0
  282. package/dist/heart/progress-story.js +1 -1
  283. package/dist/heart/provider-attempt.js +137 -0
  284. package/dist/heart/provider-binding-resolver.js +273 -0
  285. package/dist/heart/provider-credentials.js +449 -0
  286. package/dist/heart/provider-failover.js +311 -0
  287. package/dist/heart/provider-models.js +96 -0
  288. package/dist/heart/provider-ping.js +265 -0
  289. package/dist/heart/provider-readiness-cache.js +119 -0
  290. package/dist/heart/provider-visibility.js +188 -0
  291. package/dist/heart/providers/anthropic-token.js +131 -0
  292. package/dist/heart/providers/anthropic.js +173 -60
  293. package/dist/heart/providers/azure.js +23 -11
  294. package/dist/heart/providers/error-classification.js +127 -0
  295. package/dist/heart/providers/github-copilot.js +34 -38
  296. package/dist/heart/providers/minimax-vlm.js +189 -0
  297. package/dist/heart/providers/minimax.js +26 -8
  298. package/dist/heart/providers/openai-codex-token.js +349 -0
  299. package/dist/heart/providers/openai-codex.js +55 -40
  300. package/dist/heart/providers/openai-compatible.js +177 -0
  301. package/dist/heart/reply-style.js +56 -0
  302. package/dist/heart/run-ledger.js +247 -0
  303. package/dist/heart/runtime-capability-check.js +170 -0
  304. package/dist/heart/runtime-credentials.js +607 -0
  305. package/dist/heart/runtime-cwd.js +87 -0
  306. package/dist/heart/sense-truth.js +22 -4
  307. package/dist/heart/session-activity.js +92 -24
  308. package/dist/heart/session-events.js +1504 -0
  309. package/dist/heart/session-playback-cli-main.js +5 -0
  310. package/dist/heart/session-playback-cli.js +36 -0
  311. package/dist/heart/session-playback.js +231 -0
  312. package/dist/heart/session-redaction-repair-cli-main.js +31 -0
  313. package/dist/heart/session-redaction-repair.js +552 -0
  314. package/dist/heart/session-stats-cli-main.js +5 -0
  315. package/dist/heart/session-stats.js +183 -0
  316. package/dist/heart/session-transcript.js +133 -0
  317. package/dist/heart/source-grounding.js +194 -0
  318. package/dist/heart/start-of-turn-packet.js +372 -0
  319. package/dist/heart/steward-policy.js +656 -0
  320. package/dist/heart/streaming.js +604 -207
  321. package/dist/heart/structured-output.js +196 -0
  322. package/dist/heart/sync-classification.js +176 -0
  323. package/dist/heart/sync.js +505 -0
  324. package/dist/heart/target-resolution.js +11 -7
  325. package/dist/heart/tempo.js +93 -0
  326. package/dist/heart/temporal-view.js +41 -0
  327. package/dist/heart/timeouts.js +101 -0
  328. package/dist/heart/tool-activity-callbacks.js +59 -0
  329. package/dist/heart/tool-approval.js +382 -0
  330. package/dist/heart/tool-description.js +155 -0
  331. package/dist/heart/tool-friction.js +55 -0
  332. package/dist/heart/tool-loop.js +206 -0
  333. package/dist/heart/turn-context.js +487 -0
  334. package/dist/heart/turn-execution-lease.js +30 -0
  335. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  336. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  337. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  338. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  339. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  340. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  341. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  342. package/dist/heart/versioning/update-hooks.js +154 -0
  343. package/dist/heart/versioning/version-intent.js +114 -0
  344. package/dist/heart/work-card.js +380 -0
  345. package/dist/mailbox-ui/assets/index-Cyv4mw3Y.js +1 -0
  346. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  347. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  348. package/dist/mailbox-ui/index.html +16 -0
  349. package/dist/mailroom/attention.js +167 -0
  350. package/dist/mailroom/autonomy.js +209 -0
  351. package/dist/mailroom/blob-store.js +889 -0
  352. package/dist/mailroom/body-cache.js +61 -0
  353. package/dist/mailroom/cache-sync-cli.js +58 -0
  354. package/dist/mailroom/core.js +803 -0
  355. package/dist/mailroom/entry.js +160 -0
  356. package/dist/mailroom/file-store.js +568 -0
  357. package/dist/mailroom/hosted-cache-sync.js +384 -0
  358. package/dist/mailroom/mbox-import.js +393 -0
  359. package/dist/mailroom/migration.js +164 -0
  360. package/dist/mailroom/outbound.js +380 -0
  361. package/dist/mailroom/policy.js +263 -0
  362. package/dist/mailroom/reader.js +292 -0
  363. package/dist/mailroom/search-cache.js +513 -0
  364. package/dist/mailroom/search-relevance.js +319 -0
  365. package/dist/mailroom/smtp-ingress.js +176 -0
  366. package/dist/mailroom/source-state.js +176 -0
  367. package/dist/mailroom/thread.js +109 -0
  368. package/dist/mailroom/travel-extract.js +89 -0
  369. package/dist/mind/bundle-manifest.js +24 -2
  370. package/dist/mind/context.js +307 -139
  371. package/dist/mind/desk-section.js +362 -0
  372. package/dist/mind/diary-integrity.js +60 -0
  373. package/dist/mind/{memory.js → diary.js} +68 -77
  374. package/dist/mind/embedding-provider.js +60 -0
  375. package/dist/mind/file-state.js +179 -0
  376. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  377. package/dist/mind/obligation-steering.js +199 -3
  378. package/dist/mind/pending.js +36 -10
  379. package/dist/mind/prompt-budget.js +479 -0
  380. package/dist/mind/prompt-refresh.js +3 -2
  381. package/dist/mind/prompt.js +1048 -198
  382. package/dist/mind/provenance-trust.js +26 -0
  383. package/dist/mind/record-paths.js +312 -0
  384. package/dist/mind/scrutiny.js +173 -0
  385. package/dist/mind/session-transaction.js +564 -0
  386. package/dist/nerves/cli-logging.js +7 -1
  387. package/dist/nerves/coverage/audit-rules.js +15 -6
  388. package/dist/nerves/coverage/audit.js +28 -2
  389. package/dist/nerves/coverage/cli.js +1 -1
  390. package/dist/nerves/coverage/contract.js +5 -5
  391. package/dist/nerves/coverage/file-completeness.js +139 -5
  392. package/dist/nerves/coverage/run-artifacts.js +55 -35
  393. package/dist/nerves/coverage/source-scanner.js +4 -4
  394. package/dist/nerves/event-buffer.js +111 -0
  395. package/dist/nerves/index.js +293 -9
  396. package/dist/nerves/observation.js +20 -0
  397. package/dist/nerves/redact.js +79 -0
  398. package/dist/nerves/review/cli-main.js +5 -0
  399. package/dist/nerves/review/cli.js +156 -0
  400. package/dist/nerves/review/core.js +159 -0
  401. package/dist/nerves/runtime.js +17 -1
  402. package/dist/repertoire/ado-client.js +15 -56
  403. package/dist/repertoire/ado-semantic.js +16 -10
  404. package/dist/repertoire/api-client.js +97 -0
  405. package/dist/repertoire/bitwarden-store.js +1045 -0
  406. package/dist/repertoire/bundle-templates.js +71 -0
  407. package/dist/repertoire/bw-installer.js +180 -0
  408. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  409. package/dist/repertoire/coding/context-pack.js +331 -0
  410. package/dist/repertoire/coding/feedback.js +174 -32
  411. package/dist/repertoire/coding/index.js +15 -3
  412. package/dist/repertoire/coding/manager.js +159 -10
  413. package/dist/repertoire/coding/spawner.js +58 -11
  414. package/dist/repertoire/coding/tools.js +221 -15
  415. package/dist/repertoire/coding/workbench-client.js +272 -0
  416. package/dist/repertoire/coding/workbench-manager.js +346 -0
  417. package/dist/repertoire/commerce-errors.js +109 -0
  418. package/dist/repertoire/commerce-self-test.js +156 -0
  419. package/dist/repertoire/credential-access.js +178 -0
  420. package/dist/repertoire/desk/classifier.js +362 -0
  421. package/dist/repertoire/duffel-client.js +185 -0
  422. package/dist/repertoire/github-client.js +14 -55
  423. package/dist/repertoire/graph-client.js +11 -52
  424. package/dist/repertoire/guardrails.js +873 -19
  425. package/dist/repertoire/house-sweep.js +466 -0
  426. package/dist/repertoire/mcp-client.js +58 -5
  427. package/dist/repertoire/mcp-manager.js +427 -139
  428. package/dist/repertoire/mcp-tools.js +132 -0
  429. package/dist/repertoire/mcp-write-guard.js +46 -0
  430. package/dist/repertoire/plugin-mcp.js +175 -0
  431. package/dist/repertoire/plugins.js +253 -0
  432. package/dist/repertoire/relationship-authorization.js +322 -0
  433. package/dist/repertoire/shell-sessions.js +134 -0
  434. package/dist/repertoire/skills.js +48 -4
  435. package/dist/repertoire/stripe-client.js +131 -0
  436. package/dist/repertoire/tool-arguments.js +182 -0
  437. package/dist/repertoire/tool-results.js +29 -0
  438. package/dist/repertoire/tools-a2a.js +699 -0
  439. package/dist/repertoire/tools-attachments.js +322 -0
  440. package/dist/repertoire/tools-awaiting.js +870 -0
  441. package/dist/repertoire/tools-base.js +79 -1168
  442. package/dist/repertoire/tools-bluebubbles.js +2 -0
  443. package/dist/repertoire/tools-bridge.js +144 -0
  444. package/dist/repertoire/tools-bundle.js +993 -0
  445. package/dist/repertoire/tools-commerce.js +253 -0
  446. package/dist/repertoire/tools-config.js +186 -0
  447. package/dist/repertoire/tools-continuity.js +575 -0
  448. package/dist/repertoire/tools-credential.js +383 -0
  449. package/dist/repertoire/tools-escalation.js +84 -0
  450. package/dist/repertoire/tools-evolution.js +527 -0
  451. package/dist/repertoire/tools-files.js +344 -0
  452. package/dist/repertoire/tools-flight.js +290 -0
  453. package/dist/repertoire/tools-flow.js +119 -0
  454. package/dist/repertoire/tools-github.js +3 -8
  455. package/dist/repertoire/tools-habits.js +103 -0
  456. package/dist/repertoire/tools-house-care.js +138 -0
  457. package/dist/repertoire/tools-mail.js +1828 -0
  458. package/dist/repertoire/tools-notes.js +496 -0
  459. package/dist/repertoire/tools-obligations.js +182 -0
  460. package/dist/repertoire/tools-orientation.js +31 -0
  461. package/dist/repertoire/tools-record.js +482 -0
  462. package/dist/repertoire/tools-rsvp.js +139 -0
  463. package/dist/repertoire/tools-runtime.js +238 -0
  464. package/dist/repertoire/tools-sanctuary-host.js +202 -0
  465. package/dist/repertoire/tools-session.js +1133 -0
  466. package/dist/repertoire/tools-shell.js +149 -0
  467. package/dist/repertoire/tools-steward-policy.js +147 -0
  468. package/dist/repertoire/tools-stripe.js +224 -0
  469. package/dist/repertoire/tools-surface.js +369 -0
  470. package/dist/repertoire/tools-teams.js +12 -39
  471. package/dist/repertoire/tools-telegram-contacts.js +37 -0
  472. package/dist/repertoire/tools-travel.js +125 -0
  473. package/dist/repertoire/tools-trip.js +982 -0
  474. package/dist/repertoire/tools-unraid.js +556 -0
  475. package/dist/repertoire/tools-user-profile.js +146 -0
  476. package/dist/repertoire/tools-vault.js +40 -0
  477. package/dist/repertoire/tools-voice.js +145 -0
  478. package/dist/repertoire/tools.js +509 -156
  479. package/dist/repertoire/travel-api-client.js +360 -0
  480. package/dist/repertoire/unraid-client.js +155 -0
  481. package/dist/repertoire/unraid-restart.js +339 -0
  482. package/dist/repertoire/user-profile.js +131 -0
  483. package/dist/repertoire/vault-setup.js +246 -0
  484. package/dist/repertoire/vault-unlock.js +628 -0
  485. package/dist/rsvp/aisleplanner-client.js +354 -0
  486. package/dist/rsvp/cli.js +926 -0
  487. package/dist/rsvp/config.js +327 -0
  488. package/dist/rsvp/cutover.js +433 -0
  489. package/dist/rsvp/diagnostics.js +232 -0
  490. package/dist/rsvp/diff-renderer.js +176 -0
  491. package/dist/rsvp/habit-policy.js +110 -0
  492. package/dist/rsvp/habit-stage.js +123 -0
  493. package/dist/rsvp/incident-bundle.js +97 -0
  494. package/dist/rsvp/migration.js +204 -0
  495. package/dist/rsvp/native-habit-runner.js +630 -0
  496. package/dist/rsvp/outbound-state.js +628 -0
  497. package/dist/rsvp/query.js +118 -0
  498. package/dist/rsvp/replay.js +233 -0
  499. package/dist/rsvp/snapshot.js +232 -0
  500. package/dist/rsvp/spend-ledger.js +175 -0
  501. package/dist/scripts/claude-code-hook.js +41 -0
  502. package/dist/scripts/claude-code-stop-hook.js +47 -0
  503. package/dist/senses/a2a-entry.js +131 -0
  504. package/dist/senses/acp-server.js +386 -0
  505. package/dist/senses/attention-queue.js +186 -0
  506. package/dist/senses/await-turn-message.js +65 -0
  507. package/dist/senses/bluebubbles/active-turns.js +216 -0
  508. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  509. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  510. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +355 -40
  511. package/dist/senses/bluebubbles/context-packet.js +207 -0
  512. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  513. package/dist/senses/bluebubbles/entry.js +90 -0
  514. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
  515. package/dist/senses/bluebubbles/index.js +3841 -0
  516. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  517. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  518. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
  519. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
  520. package/dist/senses/bluebubbles/outbound-state.js +308 -0
  521. package/dist/senses/bluebubbles/processed-log.js +133 -0
  522. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  523. package/dist/senses/bluebubbles/replay.js +284 -0
  524. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  525. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  526. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  527. package/dist/senses/bluebubbles/webhook-registration.js +228 -0
  528. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  529. package/dist/senses/cli/bracketed-paste.js +82 -0
  530. package/dist/senses/cli/image-paste.js +287 -0
  531. package/dist/senses/cli/image-ref-navigation.js +75 -0
  532. package/dist/senses/cli/ink-app.js +156 -0
  533. package/dist/senses/cli/inline-diff.js +64 -0
  534. package/dist/senses/cli/input-keys.js +174 -0
  535. package/dist/senses/cli/kill-ring.js +86 -0
  536. package/dist/senses/cli/message-list.js +51 -0
  537. package/dist/senses/cli/ouro-tui.js +607 -0
  538. package/dist/senses/cli/spinner-imperative.js +135 -0
  539. package/dist/senses/cli/spinner.js +101 -0
  540. package/dist/senses/cli/status-line.js +60 -0
  541. package/dist/senses/cli/streaming-markdown.js +526 -0
  542. package/dist/senses/cli/tool-display.js +85 -0
  543. package/dist/senses/cli/tool-render.js +85 -0
  544. package/dist/senses/cli/tui-store.js +241 -0
  545. package/dist/senses/cli/virtual-list.js +35 -0
  546. package/dist/senses/cli-entry.js +60 -8
  547. package/dist/senses/cli.js +601 -304
  548. package/dist/senses/commands.js +66 -3
  549. package/dist/senses/context-packet-ledger.js +371 -0
  550. package/dist/senses/context-packets.js +154 -0
  551. package/dist/senses/habit-lifecycle-guard.js +24 -0
  552. package/dist/senses/habit-turn-message.js +160 -0
  553. package/dist/senses/ingress-evidence.js +2 -0
  554. package/dist/senses/mail-entry.js +66 -0
  555. package/dist/senses/mail.js +524 -0
  556. package/dist/senses/pipeline.js +1115 -204
  557. package/dist/senses/private-runtime-worker.js +859 -0
  558. package/dist/senses/private-runtime.js +1619 -0
  559. package/dist/senses/proactive-content-guard.js +51 -0
  560. package/dist/senses/root-host-approval-port.js +345 -0
  561. package/dist/senses/root-host-approval-runtime.js +393 -0
  562. package/dist/senses/sanctuary-authority-resident.js +102 -0
  563. package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
  564. package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
  565. package/dist/senses/sanctuary-grounding.js +118 -0
  566. package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
  567. package/dist/senses/sanctuary-health-acceptance-probe.js +774 -0
  568. package/dist/senses/sanctuary-health-runner.js +104 -0
  569. package/dist/senses/sanctuary-health.js +422 -0
  570. package/dist/senses/sanctuary-install-state-contract.js +169 -0
  571. package/dist/senses/sanctuary-interactive-control.js +410 -0
  572. package/dist/senses/sanctuary-media-catalog-contract.js +297 -0
  573. package/dist/senses/sanctuary-media-optimization.js +514 -0
  574. package/dist/senses/sanctuary-runtime.js +347 -0
  575. package/dist/senses/sanctuary-sab.js +85 -0
  576. package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
  577. package/dist/senses/shared-turn.js +789 -0
  578. package/dist/senses/surface-tool.js +109 -0
  579. package/dist/senses/teams-entry.js +60 -8
  580. package/dist/senses/teams.js +519 -218
  581. package/dist/senses/telegram-admission.js +718 -0
  582. package/dist/senses/telegram-approval-runtime.js +793 -0
  583. package/dist/senses/telegram-attachments.js +186 -0
  584. package/dist/senses/telegram-audit-ledger.js +220 -0
  585. package/dist/senses/telegram-authority-transport.js +231 -0
  586. package/dist/senses/telegram-client.js +1749 -0
  587. package/dist/senses/telegram-effect-adapter.js +900 -0
  588. package/dist/senses/telegram-entry.js +83 -0
  589. package/dist/senses/telegram.js +2349 -0
  590. package/dist/senses/trust-gate.js +104 -9
  591. package/dist/senses/voice/audio-playback.js +237 -0
  592. package/dist/senses/voice/audio-routing.js +119 -0
  593. package/dist/senses/voice/call-auth.js +248 -0
  594. package/dist/senses/voice/elevenlabs.js +202 -0
  595. package/dist/senses/voice/floor-control.js +431 -0
  596. package/dist/senses/voice/floor-controller.js +115 -0
  597. package/dist/senses/voice/golden-path.js +116 -0
  598. package/dist/senses/voice/index.js +29 -0
  599. package/dist/senses/voice/meeting.js +113 -0
  600. package/dist/senses/voice/outbound.js +190 -0
  601. package/dist/senses/voice/phone.js +33 -0
  602. package/dist/senses/voice/playback.js +139 -0
  603. package/dist/senses/voice/process-guards.js +51 -0
  604. package/dist/senses/voice/realtime-eval.js +496 -0
  605. package/dist/senses/voice/realtime-trace.js +531 -0
  606. package/dist/senses/voice/transcript.js +70 -0
  607. package/dist/senses/voice/turn.js +191 -0
  608. package/dist/senses/voice/twilio-phone-runtime.js +820 -0
  609. package/dist/senses/voice/twilio-phone.js +5324 -0
  610. package/dist/senses/voice/types.js +2 -0
  611. package/dist/senses/voice/whisper.js +161 -0
  612. package/dist/senses/voice-entry.js +83 -0
  613. package/dist/senses/voice-realtime-eval-command.js +99 -0
  614. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  615. package/dist/senses/voice-twilio-entry.js +87 -0
  616. package/dist/trips/core.js +138 -0
  617. package/dist/trips/store.js +265 -0
  618. package/dist/util/frontmatter.js +69 -0
  619. package/npm-shrinkwrap.json +8100 -0
  620. package/package.json +73 -13
  621. package/skills/agent-commerce.md +113 -0
  622. package/skills/browser-navigation.md +117 -0
  623. package/skills/commerce-setup-guide.md +116 -0
  624. package/skills/commerce-setup.md +84 -0
  625. package/skills/configure-dev-tools.md +99 -0
  626. package/skills/travel-planning.md +138 -0
  627. package/dist/heart/daemon/auth-flow.js +0 -430
  628. package/dist/heart/daemon/ouro-path-installer.js +0 -260
  629. package/dist/heart/daemon/ouro-version-manager.js +0 -171
  630. package/dist/heart/daemon/update-hooks.js +0 -138
  631. package/dist/heart/obligations.js +0 -191
  632. package/dist/heart/safe-workspace.js +0 -362
  633. package/dist/heart/session-recall.js +0 -116
  634. package/dist/mind/friends/channel.js +0 -84
  635. package/dist/mind/friends/group-context.js +0 -144
  636. package/dist/mind/friends/resolver.js +0 -84
  637. package/dist/mind/friends/store-file.js +0 -190
  638. package/dist/mind/friends/store.js +0 -4
  639. package/dist/mind/friends/tokens.js +0 -26
  640. package/dist/mind/friends/trust-explanation.js +0 -74
  641. package/dist/mind/friends/types.js +0 -29
  642. package/dist/repertoire/tasks/board.js +0 -134
  643. package/dist/repertoire/tasks/index.js +0 -224
  644. package/dist/repertoire/tasks/lifecycle.js +0 -80
  645. package/dist/repertoire/tasks/middleware.js +0 -65
  646. package/dist/repertoire/tasks/parser.js +0 -173
  647. package/dist/repertoire/tasks/scanner.js +0 -132
  648. package/dist/repertoire/tasks/transitions.js +0 -144
  649. package/dist/senses/bluebubbles-entry.js +0 -13
  650. package/dist/senses/bluebubbles.js +0 -1181
  651. package/dist/senses/debug-activity.js +0 -154
  652. package/dist/senses/inner-dialog-worker.js +0 -90
  653. package/dist/senses/inner-dialog.js +0 -525
  654. package/subagents/README.md +0 -7
  655. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  656. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  657. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  658. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  659. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  660. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  661. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  662. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  663. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  664. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  665. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  666. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  667. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  668. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  669. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  670. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  671. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createOpenAICompatibleProviderRuntime = createOpenAICompatibleProviderRuntime;
4
+ const bundle_manifest_1 = require("../../mind/bundle-manifest");
5
+ const runtime_1 = require("../../nerves/runtime");
6
+ const error_classification_1 = require("./error-classification");
7
+ const CANONICAL_BASE_URLS = {
8
+ "openai-compatible": "https://api.z.ai/api/paas/v4/",
9
+ "openai-compatible-gemini": "https://generativelanguage.googleapis.com/v1beta/openai/",
10
+ };
11
+ function canonicalBaseUrl(provider, value) {
12
+ let parsed;
13
+ try {
14
+ parsed = new URL(value);
15
+ }
16
+ catch {
17
+ throw new Error(`${provider} requires its canonical base URL`);
18
+ }
19
+ const normalized = parsed.toString().replace(/\/+$/u, "/");
20
+ const normalizedInput = value.replace(/\/+$/u, "/");
21
+ if (normalizedInput !== CANONICAL_BASE_URLS[provider] || normalized !== CANONICAL_BASE_URLS[provider]) {
22
+ throw new Error(`${provider} requires its canonical base URL ${CANONICAL_BASE_URLS[provider]}`);
23
+ }
24
+ return normalized;
25
+ }
26
+ function safeError(error, apiKey) {
27
+ const redact = (value) => value.split(apiKey).join("[redacted]");
28
+ const message = redact(error instanceof Error ? error.message : String(error));
29
+ const safe = new Error(message);
30
+ if (error instanceof Error) {
31
+ const source = error;
32
+ if (typeof source.status === "number" && Number.isFinite(source.status))
33
+ safe.status = source.status;
34
+ if (typeof source.code === "string")
35
+ safe.code = redact(source.code);
36
+ }
37
+ return safe;
38
+ }
39
+ function requiredString(value, label) {
40
+ if (typeof value !== "string" || value.trim().length === 0)
41
+ throw new Error(`OpenAI-compatible response ${label} is missing`);
42
+ return value;
43
+ }
44
+ function parseUsage(value) {
45
+ if (!value || typeof value !== "object" || Array.isArray(value))
46
+ return undefined;
47
+ const usage = value;
48
+ const input = usage.prompt_tokens;
49
+ const output = usage.completion_tokens;
50
+ const total = usage.total_tokens;
51
+ if (![input, output, total].every((entry) => Number.isSafeInteger(entry) && entry >= 0))
52
+ return undefined;
53
+ const details = usage.completion_tokens_details;
54
+ const reasoning = details && typeof details === "object" && !Array.isArray(details)
55
+ && Number.isSafeInteger(details.reasoning_tokens)
56
+ ? Number(details.reasoning_tokens)
57
+ : 0;
58
+ return { input_tokens: Number(input), output_tokens: Number(output), reasoning_tokens: reasoning, total_tokens: Number(total) };
59
+ }
60
+ function parseCompletion(value, callbacks) {
61
+ if (!value || typeof value !== "object" || Array.isArray(value))
62
+ throw new Error("OpenAI-compatible response envelope is invalid");
63
+ const choices = value.choices;
64
+ if (!Array.isArray(choices) || choices.length !== 1 || !choices[0] || typeof choices[0] !== "object") {
65
+ throw new Error("OpenAI-compatible response must contain exactly one choice");
66
+ }
67
+ const choice = choices[0];
68
+ const message = choice.message;
69
+ if (!message || typeof message !== "object" || Array.isArray(message))
70
+ throw new Error("OpenAI-compatible choice message is invalid");
71
+ const record = message;
72
+ if (Object.prototype.hasOwnProperty.call(record, "function_call")) {
73
+ throw new Error("OpenAI-compatible legacy function_call is unsupported");
74
+ }
75
+ const rawCalls = record.tool_calls;
76
+ const calls = rawCalls === undefined || rawCalls === null ? [] : rawCalls;
77
+ if (!Array.isArray(calls))
78
+ throw new Error("OpenAI-compatible tool_calls must be an array");
79
+ const toolCalls = calls.map((call) => {
80
+ if (!call || typeof call !== "object" || Array.isArray(call))
81
+ throw new Error("OpenAI-compatible tool call is invalid");
82
+ const callRecord = call;
83
+ const fn = callRecord.function;
84
+ if (callRecord.type !== "function" || !fn || typeof fn !== "object" || Array.isArray(fn)) {
85
+ throw new Error("OpenAI-compatible tool call must be a function");
86
+ }
87
+ return {
88
+ id: requiredString(callRecord.id, "tool call id"),
89
+ name: requiredString(fn.name, "tool name"),
90
+ arguments: requiredString(fn.arguments, "tool arguments"),
91
+ };
92
+ });
93
+ const content = typeof record.content === "string" ? record.content : "";
94
+ if (choice.finish_reason === "stop") {
95
+ if (toolCalls.length !== 0 || content.trim().length === 0)
96
+ throw new Error("OpenAI-compatible stop response shape is invalid");
97
+ }
98
+ else if (choice.finish_reason === "tool_calls") {
99
+ if (toolCalls.length < 1 || toolCalls.length > 8 || content.trim().length !== 0) {
100
+ throw new Error("OpenAI-compatible tool_calls response shape is invalid");
101
+ }
102
+ }
103
+ else {
104
+ throw new Error("OpenAI-compatible finish_reason is unsupported");
105
+ }
106
+ callbacks.onModelStreamStart();
107
+ if (content)
108
+ callbacks.onTextChunk(content);
109
+ return {
110
+ content,
111
+ toolCalls,
112
+ outputItems: [],
113
+ usage: parseUsage(value.usage),
114
+ };
115
+ }
116
+ function createOpenAICompatibleProviderRuntime(provider, model, config, deps = {}) {
117
+ const apiKey = config.apiKey?.trim();
118
+ if (!apiKey)
119
+ throw new Error(`provider '${provider}' is selected but apiKey is missing in the agent vault`);
120
+ const baseUrl = canonicalBaseUrl(provider, config.baseUrl);
121
+ const fetchImpl = deps.fetch ?? fetch;
122
+ const packageVersion = deps.packageVersion ?? (0, bundle_manifest_1.getPackageVersion)();
123
+ (0, runtime_1.emitNervesEvent)({
124
+ component: "engine",
125
+ event: "engine.provider_init",
126
+ message: "OpenAI-compatible provider init",
127
+ meta: { provider },
128
+ });
129
+ const request = async (messages, tools, signal, toolChoiceRequired = false) => {
130
+ const body = { model, messages, tools, stream: false };
131
+ if (provider === "openai-compatible")
132
+ body.temperature = 0;
133
+ if (toolChoiceRequired)
134
+ body.tool_choice = "required";
135
+ try {
136
+ const response = await fetchImpl(new URL("chat/completions", baseUrl), {
137
+ method: "POST",
138
+ headers: {
139
+ Authorization: `Bearer ${apiKey}`,
140
+ "Content-Type": "application/json",
141
+ ...(provider === "openai-compatible-gemini"
142
+ ? { "x-goog-api-client": `ouroboros-harness-oai/${packageVersion}` }
143
+ : {}),
144
+ },
145
+ body: JSON.stringify(body),
146
+ signal,
147
+ });
148
+ if (!response.ok)
149
+ throw Object.assign(new Error(`provider request failed with HTTP ${response.status}`), { status: response.status });
150
+ return await response.json();
151
+ }
152
+ catch (error) {
153
+ throw safeError(error, apiKey);
154
+ }
155
+ };
156
+ return {
157
+ id: provider,
158
+ model,
159
+ client: { baseUrl },
160
+ capabilities: new Set(),
161
+ resetTurnState() { },
162
+ appendToolOutput() { },
163
+ async streamTurn(turnRequest) {
164
+ return parseCompletion(await request(turnRequest.messages, turnRequest.activeTools, turnRequest.signal, turnRequest.toolChoiceRequired), turnRequest.callbacks);
165
+ },
166
+ async ping(signal) {
167
+ const callbacks = {
168
+ onModelStreamStart() { },
169
+ onTextChunk() { },
170
+ };
171
+ parseCompletion(await request([{ role: "user", content: "ping" }], [], signal), callbacks);
172
+ },
173
+ classifyError(error) {
174
+ return (0, error_classification_1.classifyHttpError)(error);
175
+ },
176
+ };
177
+ }
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BRIEF_MAX_CHARS = void 0;
4
+ exports.briefStyleRequested = briefStyleRequested;
5
+ exports.briefStyleViolation = briefStyleViolation;
6
+ exports.savedCommunicationPreference = savedCommunicationPreference;
7
+ /**
8
+ * An owner-stated brevity preference, enforced where the answer is delivered rather than left to prose.
9
+ *
10
+ * "Be brief, no sections" is a request about how every later reply should look. A model that agrees in one turn and
11
+ * writes five bold-labelled paragraphs in the next has not kept it, so the runtime reads the request from what the
12
+ * person said (or a saved communication preference) and holds the answer to it at settle.
13
+ */
14
+ const runtime_1 = require("../nerves/runtime");
15
+ exports.BRIEF_MAX_CHARS = 600;
16
+ const ASK_BRIEF = /\b(?:be|keep(?:\s+(?:it|things|replies|answers|your\s+(?:replies|answers|messages)))?|stay)\s+(?:more\s+)?(?:brief|briefer|concise|terse|short|shorter|tight|compact)\b|\bbrevity\b|\bno\s+sections\b|\bshort\s+(?:answers|replies|messages)\b/i;
17
+ const ASK_LONGER = /\b(?:be\s+(?:more\s+)?(?:detailed|thorough|verbose|longer)|(?:more|full)\s+detail|elaborate|longer\s+(?:answers|replies)|you\s+can\s+be\s+longer|in\s+depth)\b/i;
18
+ const NEGATED_BRIEF = /\b(?:don['’]?t|do\s+not|stop\s+being|no\s+more|not\s+so|less|never)\s+(?:be\s+|being\s+|so\s+|that\s+)*(?:brief|concise|terse|short|brevity|tight)\b/i;
19
+ /** A reply that asks for a confirmation or a choice the person must make: the question is the point, so brevity does not apply. */
20
+ const REQUIRED_QUESTION = /\b(?:confirm|are\s+you\s+sure|did\s+you\s+mean|which\s+(?:one|of|do\s+you|did\s+you)|do\s+you\s+want\s+me\s+to\s+(?:apply|delete|remove|change|proceed|overwrite)|should\s+i\s+(?:apply|proceed|go\s+ahead|delete|remove|change|overwrite)|before\s+i\s+(?:apply|delete|remove|change|proceed))\b/i;
21
+ /** True when the latest word from the person (oldest to newest) asks for brevity; a saved preference counts as the oldest word. */
22
+ function briefStyleRequested(userTexts, savedPreference) {
23
+ let brief = false;
24
+ for (const text of [...(savedPreference ? [savedPreference] : []), ...userTexts]) {
25
+ if (NEGATED_BRIEF.test(text) || ASK_LONGER.test(text))
26
+ brief = false;
27
+ else if (ASK_BRIEF.test(text))
28
+ brief = true;
29
+ }
30
+ return brief;
31
+ }
32
+ const HEADER = /^#{1,6}\s/m;
33
+ const BOLD_LABEL = /(?:^|\n)\s*(?:[-*•]\s+)?\*\*[^*\n]{1,60}\*\*[ \t]*(?::|—|-|\n|$)|\*\*[^*\n]{1,60}:\*\*/;
34
+ const SENTENCE_END = /[.!?]+(?:\s+|$)/;
35
+ /** What is wrong with an answer that should be brief, or null when it is fine. */
36
+ function briefStyleViolation(answer, intent) {
37
+ // A blocked reply must say what is blocking, and a reply that asks for a confirmation or a choice must ask it.
38
+ if (intent === "blocked" || REQUIRED_QUESTION.test(answer))
39
+ return null;
40
+ const problems = [];
41
+ if (HEADER.test(answer) || BOLD_LABEL.test(answer))
42
+ problems.push("no markdown headers or bold section labels, just plain sentences");
43
+ if (answer.length > exports.BRIEF_MAX_CHARS)
44
+ problems.push(`about ${exports.BRIEF_MAX_CHARS} characters at most (this one is ${answer.length})`);
45
+ const sentences = answer.split(SENTENCE_END).filter((part) => part.trim());
46
+ if (sentences.length > 1 && answer.trimEnd().endsWith("?"))
47
+ problems.push("no closing question tacked onto an answer; answer and stop");
48
+ if (problems.length > 0)
49
+ (0, runtime_1.emitNervesEvent)({ level: "warn", component: "engine", event: "engine.brief_style_violation", message: "a reply broke the person's brevity request", meta: { problems: problems.length, length: answer.length } });
50
+ return problems.length === 0 ? null : `the person asked you to be brief. rewrite the reply: ${problems.join("; ")}. say the answer once, in your own voice, keep every warning, uncertainty and required confirmation, cut everything else, and settle again.`;
51
+ }
52
+ /** The person's saved communication preference, from their relationship policy or their older tool preferences. */
53
+ function savedCommunicationPreference(friend) {
54
+ const value = friend?.relationshipPolicy?.preferences.communication?.value ?? friend?.toolPreferences?.communication;
55
+ return value === undefined ? undefined : String(value);
56
+ }
@@ -0,0 +1,247 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.runLedgerHash = runLedgerHash;
37
+ exports.usageMetadataFromUsageData = usageMetadataFromUsageData;
38
+ exports.deriveRunLedgerIds = deriveRunLedgerIds;
39
+ exports.createRunLedgerRecord = createRunLedgerRecord;
40
+ exports.runLedgerPath = runLedgerPath;
41
+ exports.appendRunLedgerRecord = appendRunLedgerRecord;
42
+ exports.appendRunLedgerRecordNonFatal = appendRunLedgerRecordNonFatal;
43
+ exports.readRunLedger = readRunLedger;
44
+ const node_crypto_1 = require("node:crypto");
45
+ const fs = __importStar(require("node:fs"));
46
+ const path = __importStar(require("node:path"));
47
+ const runtime_1 = require("../nerves/runtime");
48
+ function sha256Hex(input) {
49
+ return (0, node_crypto_1.createHash)("sha256").update(input).digest("hex");
50
+ }
51
+ function canonicalJson(value) {
52
+ if (Array.isArray(value)) {
53
+ return `[${value.map((entry) => canonicalJson(entry)).join(",")}]`;
54
+ }
55
+ if (value && typeof value === "object") {
56
+ const record = value;
57
+ return `{${Object.keys(record).sort().map((key) => `${JSON.stringify(key)}:${canonicalJson(record[key])}`).join(",")}}`;
58
+ }
59
+ return JSON.stringify(value);
60
+ }
61
+ function hashValue(value) {
62
+ return sha256Hex(canonicalJson(value));
63
+ }
64
+ function runLedgerHash(value) {
65
+ return `sha256:${hashValue(value)}`;
66
+ }
67
+ function stableUnique(values) {
68
+ return [...new Set((values ?? []).filter((value) => typeof value === "string" && value.trim().length > 0))];
69
+ }
70
+ function numberOrZero(value) {
71
+ return typeof value === "number" && Number.isFinite(value) ? value : 0;
72
+ }
73
+ function usageMetadataFromUsageData(usage, source) {
74
+ return {
75
+ source,
76
+ inputTokens: numberOrZero(usage?.input_tokens),
77
+ outputTokens: numberOrZero(usage?.output_tokens),
78
+ reasoningTokens: numberOrZero(usage?.reasoning_tokens),
79
+ totalTokens: numberOrZero(usage?.total_tokens),
80
+ };
81
+ }
82
+ function deriveRunLedgerIds(input) {
83
+ const targetHash = runLedgerHash(input.target);
84
+ const idempotencyKey = `idem_${hashValue({
85
+ agent: input.agent,
86
+ triggerType: input.triggerType,
87
+ sourceKind: input.sourceKind,
88
+ senseOrHabit: input.senseOrHabit,
89
+ scope: input.idempotencyScope ?? input.target,
90
+ }).slice(0, 32)}`;
91
+ const runId = `run_${hashValue({
92
+ agent: input.agent,
93
+ triggerType: input.triggerType,
94
+ sourceKind: input.sourceKind,
95
+ senseOrHabit: input.senseOrHabit,
96
+ targetHash,
97
+ idempotencyKey,
98
+ parentRunId: input.parentRunId ?? null,
99
+ }).slice(0, 24)}`;
100
+ return {
101
+ runId,
102
+ rootRunId: input.rootRunId ?? input.parentRunId ?? runId,
103
+ ...(input.parentRunId ? { parentRunId: input.parentRunId } : {}),
104
+ idempotencyKey,
105
+ targetHash,
106
+ };
107
+ }
108
+ function createRunLedgerRecord(input) {
109
+ const ids = deriveRunLedgerIds(input);
110
+ return {
111
+ schemaVersion: 1,
112
+ recordedAt: new Date().toISOString(),
113
+ ...ids,
114
+ agent: input.agent,
115
+ triggerType: input.triggerType,
116
+ sourceKind: input.sourceKind,
117
+ senseOrHabit: input.senseOrHabit,
118
+ lifecycle: input.lifecycle,
119
+ startedAt: input.startedAt,
120
+ ...(input.endedAt ? { endedAt: input.endedAt } : {}),
121
+ ...(input.usage ? { usage: input.usage } : {}),
122
+ ...(input.provider ? { provider: input.provider } : {}),
123
+ ...(input.model ? { model: input.model } : {}),
124
+ ...(input.sessionRef ? { sessionRef: input.sessionRef } : {}),
125
+ contextPacketIds: stableUnique(input.contextPacketIds),
126
+ contentStored: false,
127
+ ...(input.errorName ? { errorName: input.errorName } : {}),
128
+ ...(input.errorCode ? { errorCode: input.errorCode } : {}),
129
+ };
130
+ }
131
+ function runLedgerPath(agentRoot) {
132
+ return path.join(agentRoot, "state", "run-ledger", "runs.jsonl");
133
+ }
134
+ function appendRunLedgerRecord(agentRoot, record) {
135
+ const filePath = runLedgerPath(agentRoot);
136
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
137
+ fs.appendFileSync(filePath, `${JSON.stringify(record)}\n`, "utf-8");
138
+ (0, runtime_1.emitNervesEvent)({
139
+ component: "heart",
140
+ event: "heart.run_ledger_recorded",
141
+ message: "recorded causal run ledger row",
142
+ meta: {
143
+ agent: record.agent,
144
+ runId: record.runId,
145
+ triggerType: record.triggerType,
146
+ sourceKind: record.sourceKind,
147
+ lifecycle: record.lifecycle,
148
+ senseOrHabit: record.senseOrHabit,
149
+ },
150
+ });
151
+ }
152
+ function appendRunLedgerRecordNonFatal(agentRoot, record) {
153
+ try {
154
+ appendRunLedgerRecord(agentRoot, record);
155
+ return true;
156
+ }
157
+ catch (error) {
158
+ (0, runtime_1.emitNervesEvent)({
159
+ level: "error",
160
+ component: "heart",
161
+ event: "heart.run_ledger_record_error",
162
+ message: "failed to record causal run ledger row",
163
+ meta: {
164
+ agent: record.agent,
165
+ runId: record.runId,
166
+ lifecycle: record.lifecycle,
167
+ error: String(error),
168
+ },
169
+ });
170
+ return false;
171
+ }
172
+ }
173
+ function isStringArray(value) {
174
+ return Array.isArray(value) && value.every((entry) => typeof entry === "string");
175
+ }
176
+ function isUsageMetadata(value) {
177
+ const usage = value;
178
+ return !!usage
179
+ && (usage.source === "provider" || usage.source === "none" || usage.source === "reported-unavailable")
180
+ && typeof usage.inputTokens === "number"
181
+ && typeof usage.outputTokens === "number"
182
+ && typeof usage.reasoningTokens === "number"
183
+ && typeof usage.totalTokens === "number";
184
+ }
185
+ function isSessionRef(value) {
186
+ const ref = value;
187
+ return !!ref
188
+ && typeof ref.channel === "string"
189
+ && typeof ref.keyHash === "string";
190
+ }
191
+ function isRunLedgerRecord(value) {
192
+ const record = value;
193
+ return !!record
194
+ && record.schemaVersion === 1
195
+ && typeof record.recordedAt === "string"
196
+ && typeof record.runId === "string"
197
+ && typeof record.rootRunId === "string"
198
+ && (record.parentRunId === undefined || typeof record.parentRunId === "string")
199
+ && typeof record.idempotencyKey === "string"
200
+ && typeof record.agent === "string"
201
+ && (record.triggerType === "inbound" || record.triggerType === "habit" || record.triggerType === "reload" || record.triggerType === "recovery" || record.triggerType === "manual")
202
+ && (record.sourceKind === "sense" || record.sourceKind === "private-runtime" || record.sourceKind === "daemon" || record.sourceKind === "cli")
203
+ && typeof record.senseOrHabit === "string"
204
+ && typeof record.targetHash === "string"
205
+ && (record.lifecycle === "started" || record.lifecycle === "completed" || record.lifecycle === "skipped" || record.lifecycle === "blocked" || record.lifecycle === "error")
206
+ && typeof record.startedAt === "string"
207
+ && (record.endedAt === undefined || typeof record.endedAt === "string")
208
+ && (record.usage === undefined || isUsageMetadata(record.usage))
209
+ && (record.provider === undefined || typeof record.provider === "string")
210
+ && (record.model === undefined || typeof record.model === "string")
211
+ && (record.sessionRef === undefined || isSessionRef(record.sessionRef))
212
+ && isStringArray(record.contextPacketIds)
213
+ && record.contentStored === false
214
+ && (record.errorName === undefined || typeof record.errorName === "string")
215
+ && (record.errorCode === undefined || typeof record.errorCode === "string");
216
+ }
217
+ function emitMalformedRunLedgerRow(lineNumber, reason) {
218
+ (0, runtime_1.emitNervesEvent)({
219
+ level: "warn",
220
+ component: "heart",
221
+ event: "heart.run_ledger_malformed",
222
+ message: "skipped malformed causal run ledger row",
223
+ meta: { lineNumber, reason },
224
+ });
225
+ }
226
+ function readRunLedger(agentRoot) {
227
+ const filePath = runLedgerPath(agentRoot);
228
+ if (!fs.existsSync(filePath))
229
+ return [];
230
+ const rows = [];
231
+ const lines = fs.readFileSync(filePath, "utf-8").split("\n").filter((line) => line.trim().length > 0);
232
+ lines.forEach((line, index) => {
233
+ try {
234
+ const parsed = JSON.parse(line);
235
+ if (isRunLedgerRecord(parsed)) {
236
+ rows.push(parsed);
237
+ }
238
+ else {
239
+ emitMalformedRunLedgerRow(index + 1, "invalid shape");
240
+ }
241
+ }
242
+ catch (error) {
243
+ emitMalformedRunLedgerRow(index + 1, String(error));
244
+ }
245
+ });
246
+ return rows;
247
+ }
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.verifyPerplexityCapability = verifyPerplexityCapability;
4
+ exports.verifyEmbeddingsCapability = verifyEmbeddingsCapability;
5
+ const runtime_1 = require("../nerves/runtime");
6
+ function sanitizeCapabilityError(message) {
7
+ const statusMatch = message.match(/^(\d{3})\s/);
8
+ if (!statusMatch)
9
+ return message;
10
+ const status = statusMatch[1];
11
+ const body = message.slice(status.length).trim();
12
+ if (body.startsWith("<") || body.includes("<!DOCTYPE") || body.includes("<html")) {
13
+ return `HTTP ${status}`;
14
+ }
15
+ if (body.startsWith("{")) {
16
+ try {
17
+ const json = JSON.parse(body);
18
+ const inner = json?.error?.message;
19
+ if (typeof inner === "string" && inner && inner !== "Error") {
20
+ return `${status} ${inner}`;
21
+ }
22
+ }
23
+ catch {
24
+ // Keep the HTTP status fallback below.
25
+ }
26
+ return `HTTP ${status}`;
27
+ }
28
+ return message;
29
+ }
30
+ async function readHttpFailureSummary(response) {
31
+ let detail = `${response.status} ${response.statusText}`.trim();
32
+ try {
33
+ const json = await response.json();
34
+ if (typeof json.error === "string" && json.error.trim()) {
35
+ detail = `${response.status} ${json.error}`;
36
+ }
37
+ else if (typeof json.error === "object" && json.error !== null) {
38
+ const errObj = json.error;
39
+ if (typeof errObj.message === "string" && errObj.message.trim()) {
40
+ detail = `${response.status} ${errObj.message}`;
41
+ }
42
+ }
43
+ else if (typeof json.message === "string" && json.message.trim()) {
44
+ detail = `${response.status} ${json.message}`;
45
+ }
46
+ }
47
+ catch {
48
+ // Keep the HTTP status summary if the body is not JSON.
49
+ }
50
+ return sanitizeCapabilityError(detail);
51
+ }
52
+ function reportRuntimeCapabilityCheckStart(capability, url) {
53
+ (0, runtime_1.emitNervesEvent)({
54
+ component: "daemon",
55
+ event: "daemon.runtime_capability_check_start",
56
+ message: "starting runtime capability check",
57
+ meta: { capability, url },
58
+ });
59
+ }
60
+ function reportRuntimeCapabilityCheckEnd(capability, url) {
61
+ (0, runtime_1.emitNervesEvent)({
62
+ component: "daemon",
63
+ event: "daemon.runtime_capability_check_end",
64
+ message: "runtime capability check passed",
65
+ meta: { capability, url },
66
+ });
67
+ }
68
+ function reportRuntimeCapabilityCheckError(capability, url, summary) {
69
+ (0, runtime_1.emitNervesEvent)({
70
+ level: "warn",
71
+ component: "daemon",
72
+ event: "daemon.runtime_capability_check_error",
73
+ message: "runtime capability check failed",
74
+ meta: { capability, url, summary },
75
+ });
76
+ }
77
+ async function verifyPerplexityCapability(apiKey, fetchImpl = fetch) {
78
+ const url = "https://api.perplexity.ai/search";
79
+ reportRuntimeCapabilityCheckStart("perplexity-search", url);
80
+ try {
81
+ const response = await fetchImpl(url, {
82
+ method: "POST",
83
+ headers: {
84
+ Authorization: `Bearer ${apiKey}`,
85
+ "Content-Type": "application/json",
86
+ },
87
+ body: JSON.stringify({
88
+ query: "ping",
89
+ max_results: 1,
90
+ }),
91
+ });
92
+ if (!response.ok) {
93
+ const summary = await readHttpFailureSummary(response);
94
+ reportRuntimeCapabilityCheckError("perplexity-search", url, summary);
95
+ return {
96
+ ok: false,
97
+ summary,
98
+ };
99
+ }
100
+ const payload = await response.json();
101
+ if (!Array.isArray(payload.results) || payload.results.length === 0) {
102
+ const summary = "Perplexity returned no search results";
103
+ reportRuntimeCapabilityCheckError("perplexity-search", url, summary);
104
+ return {
105
+ ok: false,
106
+ summary,
107
+ };
108
+ }
109
+ reportRuntimeCapabilityCheckEnd("perplexity-search", url);
110
+ return {
111
+ ok: true,
112
+ summary: "live check passed",
113
+ };
114
+ }
115
+ catch (error) {
116
+ const summary = sanitizeCapabilityError(error instanceof Error ? error.message : String(error));
117
+ reportRuntimeCapabilityCheckError("perplexity-search", url, summary);
118
+ return {
119
+ ok: false,
120
+ summary,
121
+ };
122
+ }
123
+ }
124
+ async function verifyEmbeddingsCapability(apiKey, fetchImpl = fetch) {
125
+ const url = "https://api.openai.com/v1/embeddings";
126
+ reportRuntimeCapabilityCheckStart("memory-embeddings", url);
127
+ try {
128
+ const response = await fetchImpl(url, {
129
+ method: "POST",
130
+ headers: {
131
+ Authorization: `Bearer ${apiKey}`,
132
+ "Content-Type": "application/json",
133
+ },
134
+ body: JSON.stringify({
135
+ model: "text-embedding-3-small",
136
+ input: ["ping"],
137
+ }),
138
+ });
139
+ if (!response.ok) {
140
+ const summary = await readHttpFailureSummary(response);
141
+ reportRuntimeCapabilityCheckError("memory-embeddings", url, summary);
142
+ return {
143
+ ok: false,
144
+ summary,
145
+ };
146
+ }
147
+ const payload = await response.json();
148
+ if (!Array.isArray(payload.data) || payload.data.length !== 1 || !Array.isArray(payload.data[0]?.embedding) || payload.data[0].embedding.length === 0) {
149
+ const summary = "embeddings response missing expected vectors";
150
+ reportRuntimeCapabilityCheckError("memory-embeddings", url, summary);
151
+ return {
152
+ ok: false,
153
+ summary,
154
+ };
155
+ }
156
+ reportRuntimeCapabilityCheckEnd("memory-embeddings", url);
157
+ return {
158
+ ok: true,
159
+ summary: "live check passed",
160
+ };
161
+ }
162
+ catch (error) {
163
+ const summary = sanitizeCapabilityError(error instanceof Error ? error.message : String(error));
164
+ reportRuntimeCapabilityCheckError("memory-embeddings", url, summary);
165
+ return {
166
+ ok: false,
167
+ summary,
168
+ };
169
+ }
170
+ }