@ouro.bot/cli 0.1.0-alpha.45 → 0.1.0-alpha.451

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 (348) hide show
  1. package/README.md +127 -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 +2861 -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 +832 -0
  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/bridges/manager.js +358 -0
  29. package/dist/heart/bridges/state-machine.js +135 -0
  30. package/dist/heart/bridges/store.js +123 -0
  31. package/dist/heart/bundle-state.js +168 -0
  32. package/dist/heart/commitments.js +111 -0
  33. package/dist/heart/config-registry.js +304 -0
  34. package/dist/heart/config.js +110 -128
  35. package/dist/heart/core.js +745 -227
  36. package/dist/heart/cross-chat-delivery.js +131 -0
  37. package/dist/heart/daemon/agent-config-check.js +490 -0
  38. package/dist/heart/daemon/agent-discovery.js +79 -3
  39. package/dist/heart/daemon/agent-service.js +360 -0
  40. package/dist/heart/daemon/agentic-repair.js +216 -0
  41. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  42. package/dist/heart/daemon/cadence.js +70 -0
  43. package/dist/heart/daemon/cli-defaults.js +631 -0
  44. package/dist/heart/daemon/cli-exec.js +6026 -0
  45. package/dist/heart/daemon/cli-help.js +445 -0
  46. package/dist/heart/daemon/cli-parse.js +1197 -0
  47. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  48. package/dist/heart/daemon/cli-render.js +561 -0
  49. package/dist/heart/daemon/cli-types.js +8 -0
  50. package/dist/heart/daemon/connect-bay.js +323 -0
  51. package/dist/heart/daemon/daemon-cli.js +29 -1617
  52. package/dist/heart/daemon/daemon-entry.js +356 -3
  53. package/dist/heart/daemon/daemon-health.js +141 -0
  54. package/dist/heart/daemon/daemon-runtime-sync.js +190 -12
  55. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  56. package/dist/heart/daemon/daemon.js +684 -58
  57. package/dist/heart/daemon/doctor-types.js +8 -0
  58. package/dist/heart/daemon/doctor.js +427 -0
  59. package/dist/heart/daemon/health-monitor.js +79 -1
  60. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  61. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  62. package/dist/heart/daemon/http-health-probe.js +80 -0
  63. package/dist/heart/daemon/human-command-screens.js +234 -0
  64. package/dist/heart/daemon/human-readiness.js +114 -0
  65. package/dist/heart/daemon/inner-status.js +89 -0
  66. package/dist/heart/daemon/interactive-repair.js +394 -0
  67. package/dist/heart/daemon/launchd.js +25 -5
  68. package/dist/heart/daemon/log-tailer.js +82 -12
  69. package/dist/heart/daemon/logs-prune.js +105 -0
  70. package/dist/heart/daemon/message-router.js +2 -2
  71. package/dist/heart/daemon/os-cron-deps.js +134 -0
  72. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  73. package/dist/heart/daemon/ouro-entry.js +3 -1
  74. package/dist/heart/daemon/process-manager.js +214 -0
  75. package/dist/heart/daemon/provider-discovery.js +137 -0
  76. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  77. package/dist/heart/daemon/pulse.js +475 -0
  78. package/dist/heart/daemon/readiness-repair.js +365 -0
  79. package/dist/heart/daemon/run-hooks.js +2 -0
  80. package/dist/heart/daemon/runtime-logging.js +67 -16
  81. package/dist/heart/daemon/runtime-metadata.js +73 -0
  82. package/dist/heart/daemon/runtime-mode.js +67 -0
  83. package/dist/heart/daemon/safe-mode.js +161 -0
  84. package/dist/heart/daemon/sense-manager.js +152 -36
  85. package/dist/heart/daemon/session-id-resolver.js +131 -0
  86. package/dist/heart/daemon/skill-management-installer.js +94 -0
  87. package/dist/heart/daemon/socket-client.js +307 -0
  88. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  89. package/dist/heart/daemon/startup-tui.js +264 -0
  90. package/dist/heart/daemon/task-scheduler.js +3 -25
  91. package/dist/heart/daemon/terminal-ui.js +499 -0
  92. package/dist/heart/daemon/thoughts.js +510 -0
  93. package/dist/heart/daemon/up-progress.js +366 -0
  94. package/dist/heart/delegation.js +62 -0
  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 +201 -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/mcp/mcp-server.js +653 -0
  108. package/dist/heart/migrate-config.js +100 -0
  109. package/dist/heart/model-capabilities.js +59 -0
  110. package/dist/heart/outlook/outlook-http-hooks.js +66 -0
  111. package/dist/heart/outlook/outlook-http-response.js +7 -0
  112. package/dist/heart/outlook/outlook-http-routes.js +244 -0
  113. package/dist/heart/outlook/outlook-http-static.js +99 -0
  114. package/dist/heart/outlook/outlook-http-transport.js +116 -0
  115. package/dist/heart/outlook/outlook-http.js +99 -0
  116. package/dist/heart/outlook/outlook-read.js +31 -0
  117. package/dist/heart/outlook/outlook-types.js +27 -0
  118. package/dist/heart/outlook/outlook-view.js +195 -0
  119. package/dist/heart/outlook/readers/agent-machine.js +359 -0
  120. package/dist/heart/outlook/readers/continuity-readers.js +332 -0
  121. package/dist/heart/outlook/readers/mail.js +203 -0
  122. package/dist/heart/outlook/readers/runtime-readers.js +644 -0
  123. package/dist/heart/outlook/readers/sessions.js +232 -0
  124. package/dist/heart/outlook/readers/shared.js +111 -0
  125. package/dist/heart/platform.js +81 -0
  126. package/dist/heart/progress-story.js +42 -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 +266 -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 +193 -55
  137. package/dist/heart/providers/azure.js +103 -12
  138. package/dist/heart/providers/error-classification.js +63 -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 +29 -7
  142. package/dist/heart/providers/openai-codex.js +62 -38
  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 +190 -0
  147. package/dist/heart/session-events.js +855 -0
  148. package/dist/heart/session-transcript.js +167 -0
  149. package/dist/heart/start-of-turn-packet.js +345 -0
  150. package/dist/heart/streaming.js +36 -27
  151. package/dist/heart/sync.js +332 -0
  152. package/dist/heart/target-resolution.js +127 -0
  153. package/dist/heart/tempo.js +93 -0
  154. package/dist/heart/temporal-view.js +41 -0
  155. package/dist/heart/tool-activity-callbacks.js +36 -0
  156. package/dist/heart/tool-description.js +135 -0
  157. package/dist/heart/tool-friction.js +55 -0
  158. package/dist/heart/tool-loop.js +200 -0
  159. package/dist/heart/turn-context.js +361 -0
  160. package/dist/heart/turn-coordinator.js +28 -0
  161. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +1 -1
  162. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  163. package/dist/heart/versioning/ouro-path-installer.js +425 -0
  164. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  165. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  166. package/dist/heart/{daemon → versioning}/update-checker.js +5 -1
  167. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  168. package/dist/mailroom/blob-store.js +154 -0
  169. package/dist/mailroom/core.js +387 -0
  170. package/dist/mailroom/entry.js +160 -0
  171. package/dist/mailroom/file-store.js +230 -0
  172. package/dist/mailroom/mbox-import.js +105 -0
  173. package/dist/mailroom/reader.js +150 -0
  174. package/dist/mailroom/smtp-ingress.js +176 -0
  175. package/dist/mind/bundle-manifest.js +7 -1
  176. package/dist/mind/context.js +132 -93
  177. package/dist/mind/diary-integrity.js +60 -0
  178. package/dist/mind/{memory.js → diary.js} +74 -93
  179. package/dist/mind/embedding-provider.js +60 -0
  180. package/dist/mind/file-state.js +179 -0
  181. package/dist/mind/friends/channel.js +30 -0
  182. package/dist/mind/friends/group-context.js +144 -0
  183. package/dist/mind/friends/resolver.js +38 -1
  184. package/dist/mind/friends/store-file.js +39 -3
  185. package/dist/mind/friends/trust-explanation.js +74 -0
  186. package/dist/mind/friends/types.js +2 -2
  187. package/dist/mind/journal-index.js +161 -0
  188. package/dist/mind/note-search.js +268 -0
  189. package/dist/mind/obligation-steering.js +221 -0
  190. package/dist/mind/pending.js +66 -7
  191. package/dist/mind/prompt-refresh.js +3 -2
  192. package/dist/mind/prompt.js +963 -169
  193. package/dist/mind/provenance-trust.js +26 -0
  194. package/dist/mind/scrutiny.js +173 -0
  195. package/dist/nerves/cli-logging.js +7 -1
  196. package/dist/nerves/coverage/audit-rules.js +15 -6
  197. package/dist/nerves/coverage/audit.js +28 -2
  198. package/dist/nerves/coverage/cli.js +1 -1
  199. package/dist/nerves/coverage/contract.js +5 -5
  200. package/dist/nerves/coverage/file-completeness.js +83 -5
  201. package/dist/nerves/coverage/run-artifacts.js +1 -1
  202. package/dist/nerves/event-buffer.js +111 -0
  203. package/dist/nerves/index.js +224 -4
  204. package/dist/nerves/observation.js +20 -0
  205. package/dist/nerves/redact.js +79 -0
  206. package/dist/nerves/runtime.js +5 -1
  207. package/dist/outlook-ui/assets/index-BXw3xmUo.js +61 -0
  208. package/dist/outlook-ui/assets/index-D4Wg-o8Z.css +1 -0
  209. package/dist/outlook-ui/index.html +15 -0
  210. package/dist/repertoire/ado-client.js +15 -56
  211. package/dist/repertoire/ado-semantic.js +11 -10
  212. package/dist/repertoire/api-client.js +97 -0
  213. package/dist/repertoire/bitwarden-store.js +774 -0
  214. package/dist/repertoire/bundle-templates.js +72 -0
  215. package/dist/repertoire/bw-installer.js +180 -0
  216. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  217. package/dist/repertoire/coding/context-pack.js +330 -0
  218. package/dist/repertoire/coding/feedback.js +197 -30
  219. package/dist/repertoire/coding/manager.js +158 -9
  220. package/dist/repertoire/coding/spawner.js +55 -9
  221. package/dist/repertoire/coding/tools.js +170 -7
  222. package/dist/repertoire/commerce-errors.js +109 -0
  223. package/dist/repertoire/commerce-self-test.js +156 -0
  224. package/dist/repertoire/credential-access.js +111 -0
  225. package/dist/repertoire/duffel-client.js +185 -0
  226. package/dist/repertoire/github-client.js +14 -55
  227. package/dist/repertoire/graph-client.js +11 -52
  228. package/dist/repertoire/guardrails.js +371 -0
  229. package/dist/repertoire/mcp-client.js +255 -0
  230. package/dist/repertoire/mcp-manager.js +305 -0
  231. package/dist/repertoire/mcp-tools.js +63 -0
  232. package/dist/repertoire/shell-sessions.js +133 -0
  233. package/dist/repertoire/skills.js +15 -24
  234. package/dist/repertoire/stripe-client.js +131 -0
  235. package/dist/repertoire/tasks/board.js +43 -5
  236. package/dist/repertoire/tasks/fix.js +182 -0
  237. package/dist/repertoire/tasks/index.js +37 -4
  238. package/dist/repertoire/tasks/lifecycle.js +2 -2
  239. package/dist/repertoire/tasks/parser.js +3 -2
  240. package/dist/repertoire/tasks/scanner.js +194 -37
  241. package/dist/repertoire/tasks/transitions.js +16 -78
  242. package/dist/repertoire/tool-results.js +29 -0
  243. package/dist/repertoire/tools-attachments.js +317 -0
  244. package/dist/repertoire/tools-base.js +42 -690
  245. package/dist/repertoire/tools-bluebubbles.js +1 -0
  246. package/dist/repertoire/tools-bridge.js +141 -0
  247. package/dist/repertoire/tools-bundle.js +984 -0
  248. package/dist/repertoire/tools-config.js +185 -0
  249. package/dist/repertoire/tools-continuity.js +248 -0
  250. package/dist/repertoire/tools-credential.js +361 -0
  251. package/dist/repertoire/tools-files.js +342 -0
  252. package/dist/repertoire/tools-flight.js +224 -0
  253. package/dist/repertoire/tools-flow.js +105 -0
  254. package/dist/repertoire/tools-github.js +1 -7
  255. package/dist/repertoire/tools-mail.js +209 -0
  256. package/dist/repertoire/tools-notes.js +376 -0
  257. package/dist/repertoire/tools-session.js +739 -0
  258. package/dist/repertoire/tools-shell.js +120 -0
  259. package/dist/repertoire/tools-stripe.js +180 -0
  260. package/dist/repertoire/tools-surface.js +243 -0
  261. package/dist/repertoire/tools-teams.js +9 -39
  262. package/dist/repertoire/tools-travel.js +125 -0
  263. package/dist/repertoire/tools-user-profile.js +144 -0
  264. package/dist/repertoire/tools-vault.js +40 -0
  265. package/dist/repertoire/tools.js +144 -113
  266. package/dist/repertoire/travel-api-client.js +360 -0
  267. package/dist/repertoire/user-profile.js +131 -0
  268. package/dist/repertoire/vault-setup.js +246 -0
  269. package/dist/repertoire/vault-unlock.js +561 -0
  270. package/dist/scripts/claude-code-hook.js +41 -0
  271. package/dist/scripts/claude-code-stop-hook.js +47 -0
  272. package/dist/senses/attention-queue.js +116 -0
  273. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  274. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  275. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  276. package/dist/senses/bluebubbles/entry.js +73 -0
  277. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +7 -3
  278. package/dist/senses/bluebubbles/index.js +1620 -0
  279. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  280. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  281. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  282. package/dist/senses/bluebubbles/replay.js +129 -0
  283. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +2 -2
  284. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  285. package/dist/senses/cli/bracketed-paste.js +82 -0
  286. package/dist/senses/cli/image-paste.js +287 -0
  287. package/dist/senses/cli/image-ref-navigation.js +75 -0
  288. package/dist/senses/cli/ink-app.js +156 -0
  289. package/dist/senses/cli/inline-diff.js +64 -0
  290. package/dist/senses/cli/input-keys.js +174 -0
  291. package/dist/senses/cli/kill-ring.js +86 -0
  292. package/dist/senses/cli/message-list.js +51 -0
  293. package/dist/senses/cli/ouro-tui.js +605 -0
  294. package/dist/senses/cli/spinner-imperative.js +135 -0
  295. package/dist/senses/cli/spinner.js +101 -0
  296. package/dist/senses/cli/status-line.js +60 -0
  297. package/dist/senses/cli/streaming-markdown.js +526 -0
  298. package/dist/senses/cli/tool-display.js +83 -0
  299. package/dist/senses/cli/tool-render.js +85 -0
  300. package/dist/senses/cli/tui-store.js +240 -0
  301. package/dist/senses/cli/virtual-list.js +35 -0
  302. package/dist/senses/cli-entry.js +60 -8
  303. package/dist/senses/cli-layout.js +187 -0
  304. package/dist/senses/cli.js +516 -211
  305. package/dist/senses/commands.js +66 -3
  306. package/dist/senses/habit-turn-message.js +108 -0
  307. package/dist/senses/inner-dialog-worker.js +102 -19
  308. package/dist/senses/inner-dialog.js +597 -95
  309. package/dist/senses/pipeline.js +533 -72
  310. package/dist/senses/proactive-content-guard.js +51 -0
  311. package/dist/senses/shared-turn.js +205 -0
  312. package/dist/senses/surface-tool.js +68 -0
  313. package/dist/senses/teams-entry.js +60 -8
  314. package/dist/senses/teams.js +413 -163
  315. package/dist/senses/trust-gate.js +5 -5
  316. package/package.json +37 -7
  317. package/skills/agent-commerce.md +106 -0
  318. package/skills/browser-navigation.md +117 -0
  319. package/skills/commerce-setup-guide.md +116 -0
  320. package/skills/commerce-setup.md +84 -0
  321. package/skills/configure-dev-tools.md +101 -0
  322. package/skills/travel-planning.md +138 -0
  323. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  324. package/dist/heart/daemon/subagent-installer.js +0 -166
  325. package/dist/mind/associative-recall.js +0 -209
  326. package/dist/senses/bluebubbles-entry.js +0 -13
  327. package/dist/senses/bluebubbles.js +0 -1028
  328. package/dist/senses/debug-activity.js +0 -127
  329. package/subagents/README.md +0 -86
  330. package/subagents/work-doer.md +0 -237
  331. package/subagents/work-merger.md +0 -618
  332. package/subagents/work-planner.md +0 -390
  333. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  334. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  335. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  336. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  337. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  338. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  339. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  340. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  341. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  342. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  343. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  344. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  345. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  346. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  347. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  348. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.stringifyBlueBubblesHealthError = stringifyBlueBubblesHealthError;
4
+ exports.redactBlueBubblesHealthDetailForNerves = redactBlueBubblesHealthDetailForNerves;
5
+ exports.formatBlueBubblesHealthcheckFailure = formatBlueBubblesHealthcheckFailure;
6
+ exports.probeBlueBubblesHealth = probeBlueBubblesHealth;
7
+ const runtime_1 = require("../../nerves/runtime");
8
+ const error_classification_1 = require("../providers/error-classification");
9
+ function buildBlueBubblesApiUrl(baseUrl, endpoint, password) {
10
+ const root = baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
11
+ const url = new URL(endpoint.replace(/^\//, ""), root);
12
+ url.searchParams.set("password", password);
13
+ return url.toString();
14
+ }
15
+ function stringifyBlueBubblesHealthError(error) {
16
+ if (error instanceof Error) {
17
+ const message = error.message.trim();
18
+ if (message)
19
+ return message;
20
+ return error.name || "unknown";
21
+ }
22
+ const value = String(error).trim();
23
+ return value || "unknown";
24
+ }
25
+ function redactBlueBubblesHealthDetailForNerves(detail) {
26
+ return detail
27
+ .replace(/\bbluebubbles\.password\b/gi, "bluebubbles credential")
28
+ .replace(/\bpassword\b/gi, "credential");
29
+ }
30
+ function blueBubblesHealthStatus(error) {
31
+ return error instanceof Error && typeof error.status === "number"
32
+ ? error.status
33
+ : null;
34
+ }
35
+ function blueBubblesHealthClassification(error) {
36
+ return error instanceof Error ? (0, error_classification_1.classifyHttpError)(error) : "unknown";
37
+ }
38
+ function formatBlueBubblesHealthcheckFailure(serverUrlInput, error) {
39
+ const serverUrl = serverUrlInput.trim() || "configured BlueBubbles server";
40
+ const rawReason = stringifyBlueBubblesHealthError(error);
41
+ const status = blueBubblesHealthStatus(error);
42
+ if (!(error instanceof Error)) {
43
+ return `BlueBubbles health check failed at ${serverUrl}. Check \`bluebubbles.serverUrl\`, confirm the BlueBubbles app/API is running, and inspect daemon logs. Raw error: ${rawReason}`;
44
+ }
45
+ switch (blueBubblesHealthClassification(error)) {
46
+ case "network-error":
47
+ return `Cannot reach BlueBubbles at ${serverUrl}. Check \`bluebubbles.serverUrl\`, confirm the BlueBubbles app/API is running, and verify this machine can reach it. Raw error: ${rawReason}`;
48
+ case "auth-failure":
49
+ return `BlueBubbles auth failed at ${serverUrl} (HTTP ${status}). Check this machine's BlueBubbles attachment with \`ouro connect bluebubbles --agent <agent>\` and confirm the server accepts the password. Raw error: ${rawReason}`;
50
+ case "server-error":
51
+ return `BlueBubbles upstream returned HTTP ${status} at ${serverUrl}. Check the BlueBubbles app/server logs and confirm the upstream API is healthy. Raw error: ${rawReason}`;
52
+ default:
53
+ return `BlueBubbles health check failed at ${serverUrl}${status === null ? "" : ` (HTTP ${status})`}. Check \`bluebubbles.serverUrl\`, the BlueBubbles server configuration, and daemon logs. Raw error: ${rawReason}`;
54
+ }
55
+ }
56
+ async function probeBlueBubblesHealth(input) {
57
+ try {
58
+ const url = buildBlueBubblesApiUrl(input.serverUrl, "/api/v1/message/count", input.password);
59
+ const response = await input.fetchImpl(url, {
60
+ method: "GET",
61
+ signal: AbortSignal.timeout(input.requestTimeoutMs),
62
+ });
63
+ if (!response.ok) {
64
+ const errorText = await response.text().catch(() => "");
65
+ const error = new Error(errorText || "unknown");
66
+ error.status = response.status;
67
+ throw error;
68
+ }
69
+ (0, runtime_1.emitNervesEvent)({
70
+ component: "daemon",
71
+ event: "daemon.bluebubbles_health_probe_checked",
72
+ message: "checked bluebubbles upstream health",
73
+ meta: {
74
+ serverUrl: input.serverUrl,
75
+ ok: true,
76
+ status: response.status,
77
+ },
78
+ });
79
+ return {
80
+ ok: true,
81
+ detail: "upstream reachable",
82
+ reason: null,
83
+ status: response.status,
84
+ classification: null,
85
+ };
86
+ }
87
+ catch (error) {
88
+ const detail = formatBlueBubblesHealthcheckFailure(input.serverUrl, error);
89
+ const reason = stringifyBlueBubblesHealthError(error);
90
+ const status = blueBubblesHealthStatus(error);
91
+ const classification = blueBubblesHealthClassification(error);
92
+ (0, runtime_1.emitNervesEvent)({
93
+ level: "warn",
94
+ component: "daemon",
95
+ event: "daemon.bluebubbles_health_probe_checked",
96
+ message: "checked bluebubbles upstream health",
97
+ meta: {
98
+ serverUrl: input.serverUrl,
99
+ ok: false,
100
+ status,
101
+ reason,
102
+ classification,
103
+ detail: redactBlueBubblesHealthDetailForNerves(detail),
104
+ },
105
+ });
106
+ return {
107
+ ok: false,
108
+ detail,
109
+ reason,
110
+ status,
111
+ classification,
112
+ };
113
+ }
114
+ }
115
+ /* v8 ignore start -- module load observability event */
116
+ (0, runtime_1.emitNervesEvent)({
117
+ component: "daemon",
118
+ event: "daemon.bluebubbles_health_diagnostics_loaded",
119
+ message: "bluebubbles health diagnostics loaded",
120
+ meta: {},
121
+ });
122
+ /* v8 ignore stop */
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_CADENCE_MS = void 0;
4
+ exports.parseCadenceToCron = parseCadenceToCron;
5
+ exports.parseCadenceToMs = parseCadenceToMs;
6
+ const runtime_1 = require("../../nerves/runtime");
7
+ exports.DEFAULT_CADENCE_MS = 30 * 60 * 1000; // 30 minutes
8
+ /**
9
+ * Parse a cadence shorthand (e.g. "30m", "2h", "1d") into a cron string.
10
+ * Also accepts raw cron strings (5 space-separated fields) and passes them through.
11
+ * Returns null for invalid input.
12
+ */
13
+ function parseCadenceToCron(raw) {
14
+ if (typeof raw !== "string")
15
+ return null;
16
+ const value = raw.trim();
17
+ if (!value)
18
+ return null;
19
+ // Cron format (minute hour day month weekday)
20
+ if (/^\S+\s+\S+\s+\S+\s+\S+\s+\S+$/.test(value)) {
21
+ return value;
22
+ }
23
+ const cadenceMatch = /^(\d+)(m|h|d)$/.exec(value);
24
+ if (!cadenceMatch)
25
+ return null;
26
+ const interval = Number.parseInt(cadenceMatch[1], 10);
27
+ if (!Number.isFinite(interval) || interval <= 0)
28
+ return null;
29
+ (0, runtime_1.emitNervesEvent)({
30
+ event: "daemon.cadence_parsed",
31
+ component: "daemon",
32
+ message: "parsed cadence shorthand to cron",
33
+ meta: { raw: value, interval, unit: cadenceMatch[2] },
34
+ });
35
+ const unit = cadenceMatch[2];
36
+ if (unit === "m")
37
+ return `*/${interval} * * * *`;
38
+ if (unit === "h")
39
+ return `0 */${interval} * * *`;
40
+ return `0 0 */${interval} * *`;
41
+ }
42
+ /**
43
+ * Parse a cadence shorthand (e.g. "30m", "2h", "1d") into milliseconds.
44
+ * Returns null for invalid input.
45
+ */
46
+ function parseCadenceToMs(raw) {
47
+ if (typeof raw !== "string")
48
+ return null;
49
+ const value = raw.trim();
50
+ if (!value)
51
+ return null;
52
+ const match = /^(\d+)(m|h|d)$/.exec(value);
53
+ if (!match)
54
+ return null;
55
+ const interval = Number.parseInt(match[1], 10);
56
+ if (!Number.isFinite(interval) || interval <= 0)
57
+ return null;
58
+ (0, runtime_1.emitNervesEvent)({
59
+ event: "daemon.cadence_parsed_ms",
60
+ component: "daemon",
61
+ message: "parsed cadence shorthand to milliseconds",
62
+ meta: { raw: value, interval, unit: match[2] },
63
+ });
64
+ const unit = match[2];
65
+ if (unit === "m")
66
+ return interval * 60 * 1000;
67
+ if (unit === "h")
68
+ return interval * 60 * 60 * 1000;
69
+ return interval * 24 * 60 * 60 * 1000;
70
+ }