@ouro.bot/cli 0.1.0-alpha.71 → 0.1.0-alpha.711

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 (505) hide show
  1. package/README.md +133 -23
  2. package/RepairGuide.ouro/agent.json +5 -0
  3. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  4. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  5. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  6. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  7. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  8. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  9. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  12. package/changelog.json +4516 -14
  13. package/dist/a2a/card.js +57 -0
  14. package/dist/a2a/client.js +180 -0
  15. package/dist/a2a/config.js +50 -0
  16. package/dist/a2a/delegation-stores.js +56 -0
  17. package/dist/a2a/did-resolution.js +93 -0
  18. package/dist/a2a/identity.js +170 -0
  19. package/dist/a2a/inbound-share.js +107 -0
  20. package/dist/a2a/mission-result-wire.js +196 -0
  21. package/dist/a2a/onboarding.js +115 -0
  22. package/dist/a2a/pin-store.js +132 -0
  23. package/dist/a2a/seen-ledger.js +120 -0
  24. package/dist/a2a/server.js +604 -0
  25. package/dist/a2a/task-store.js +69 -0
  26. package/dist/a2a/transport.js +45 -0
  27. package/dist/a2a/types.js +3 -0
  28. package/dist/arc/attention-types.js +8 -0
  29. package/dist/arc/cares.js +144 -0
  30. package/dist/arc/episodes.js +118 -0
  31. package/dist/arc/evolution.js +490 -0
  32. package/dist/arc/flight-recorder.js +928 -0
  33. package/dist/arc/intentions.js +134 -0
  34. package/dist/arc/json-store.js +117 -0
  35. package/dist/arc/obligations.js +348 -0
  36. package/dist/arc/packets.js +336 -0
  37. package/dist/arc/presence.js +185 -0
  38. package/dist/arc/task-lifecycle.js +57 -0
  39. package/dist/commerce/store.js +755 -0
  40. package/dist/commerce/types.js +3 -0
  41. package/dist/heart/active-work.js +867 -43
  42. package/dist/heart/agent-entry.js +190 -3
  43. package/dist/heart/attachments/image-normalize.js +194 -0
  44. package/dist/heart/attachments/materialize.js +97 -0
  45. package/dist/heart/attachments/originals.js +88 -0
  46. package/dist/heart/attachments/render.js +29 -0
  47. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  48. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  49. package/dist/heart/attachments/sources/index.js +16 -0
  50. package/dist/heart/attachments/store.js +103 -0
  51. package/dist/heart/attachments/types.js +93 -0
  52. package/dist/heart/auth/auth-flow.js +479 -0
  53. package/dist/heart/autonomy-budget.js +434 -0
  54. package/dist/heart/awaiting/await-alert.js +146 -0
  55. package/dist/heart/awaiting/await-expiry.js +108 -0
  56. package/dist/heart/awaiting/await-loader.js +91 -0
  57. package/dist/heart/awaiting/await-parser.js +141 -0
  58. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  59. package/dist/heart/awaiting/await-scheduler.js +378 -0
  60. package/dist/heart/background-operations.js +281 -0
  61. package/dist/heart/bridges/manager.js +137 -17
  62. package/dist/heart/bridges/store.js +14 -2
  63. package/dist/heart/bundle-state.js +168 -0
  64. package/dist/heart/commitments.js +135 -0
  65. package/dist/heart/config-registry.js +331 -0
  66. package/dist/heart/config.js +119 -127
  67. package/dist/heart/context-loss-gauntlet.js +354 -0
  68. package/dist/heart/context-loss-sentinel.js +1155 -0
  69. package/dist/heart/core.js +1306 -278
  70. package/dist/heart/cross-chat-delivery.js +8 -22
  71. package/dist/heart/daemon/agent-config-check.js +451 -0
  72. package/dist/heart/daemon/agent-discovery.js +185 -3
  73. package/dist/heart/daemon/agent-service.js +523 -0
  74. package/dist/heart/daemon/agentic-repair.js +547 -0
  75. package/dist/heart/daemon/await-private-wake.js +59 -0
  76. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  77. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  78. package/dist/heart/daemon/cadence.js +180 -0
  79. package/dist/heart/daemon/cli-defaults.js +825 -0
  80. package/dist/heart/daemon/cli-desk.js +322 -0
  81. package/dist/heart/daemon/cli-exec.js +8194 -0
  82. package/dist/heart/daemon/cli-help.js +678 -0
  83. package/dist/heart/daemon/cli-parse.js +2476 -0
  84. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  85. package/dist/heart/daemon/cli-render.js +770 -0
  86. package/dist/heart/daemon/cli-types.js +8 -0
  87. package/dist/heart/daemon/connect-bay.js +323 -0
  88. package/dist/heart/daemon/daemon-cli.js +29 -1943
  89. package/dist/heart/daemon/daemon-entry.js +842 -10
  90. package/dist/heart/daemon/daemon-health.js +176 -0
  91. package/dist/heart/daemon/daemon-rollup.js +57 -0
  92. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  93. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  94. package/dist/heart/daemon/daemon.js +1289 -84
  95. package/dist/heart/daemon/dns-workflow.js +394 -0
  96. package/dist/heart/daemon/doctor-types.js +8 -0
  97. package/dist/heart/daemon/doctor.js +1126 -0
  98. package/dist/heart/daemon/habit-private-wake.js +56 -0
  99. package/dist/heart/daemon/health-monitor.js +142 -11
  100. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  101. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  102. package/dist/heart/daemon/http-health-probe.js +80 -0
  103. package/dist/heart/daemon/human-command-screens.js +234 -0
  104. package/dist/heart/daemon/human-readiness.js +114 -0
  105. package/dist/heart/daemon/inner-status.js +78 -0
  106. package/dist/heart/daemon/interactive-repair.js +394 -0
  107. package/dist/heart/daemon/launchd.js +37 -8
  108. package/dist/heart/daemon/log-tailer.js +79 -10
  109. package/dist/heart/daemon/logs-prune.js +110 -0
  110. package/dist/heart/daemon/mcp-canary.js +297 -0
  111. package/dist/heart/daemon/message-router.js +45 -5
  112. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  113. package/dist/heart/daemon/os-cron-deps.js +135 -0
  114. package/dist/heart/daemon/os-cron.js +22 -14
  115. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  116. package/dist/heart/daemon/ouro-entry.js +3 -1
  117. package/dist/heart/daemon/plugin-cli.js +432 -0
  118. package/dist/heart/daemon/process-manager.js +519 -40
  119. package/dist/heart/daemon/provider-discovery.js +137 -0
  120. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  121. package/dist/heart/daemon/pulse.js +511 -0
  122. package/dist/heart/daemon/readiness-repair.js +365 -0
  123. package/dist/heart/daemon/run-hooks.js +2 -0
  124. package/dist/heart/daemon/runtime-logging.js +41 -14
  125. package/dist/heart/daemon/runtime-metadata.js +2 -30
  126. package/dist/heart/daemon/safe-mode.js +161 -0
  127. package/dist/heart/daemon/sense-manager.js +670 -48
  128. package/dist/heart/daemon/session-id-resolver.js +131 -0
  129. package/dist/heart/daemon/skill-management-installer.js +1 -1
  130. package/dist/heart/daemon/socket-client.js +171 -12
  131. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  132. package/dist/heart/daemon/startup-tui.js +338 -0
  133. package/dist/heart/daemon/task-scheduler.js +117 -39
  134. package/dist/heart/daemon/terminal-ui.js +499 -0
  135. package/dist/heart/daemon/thoughts.js +255 -43
  136. package/dist/heart/daemon/up-progress.js +366 -0
  137. package/dist/heart/daemon/vault-items.js +56 -0
  138. package/dist/heart/delegation.js +1 -4
  139. package/dist/heart/external-events/router.js +121 -0
  140. package/dist/heart/habits/habit-migration.js +189 -0
  141. package/dist/heart/habits/habit-parser.js +214 -0
  142. package/dist/heart/habits/habit-runtime-state.js +114 -0
  143. package/dist/heart/habits/habit-scheduler.js +431 -0
  144. package/dist/heart/habits/habit-session-summary.js +318 -0
  145. package/dist/heart/habits/habit-session.js +617 -0
  146. package/dist/heart/{daemon → hatch}/hatch-flow.js +51 -60
  147. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  148. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  149. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  150. package/dist/heart/identity.js +174 -59
  151. package/dist/heart/kept-notes.js +289 -0
  152. package/dist/heart/kicks.js +1 -1
  153. package/dist/heart/machine-identity.js +161 -0
  154. package/dist/heart/mail-import-discovery.js +353 -0
  155. package/dist/heart/mailbox/mailbox-http-hooks.js +96 -0
  156. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  157. package/dist/heart/mailbox/mailbox-http-routes.js +375 -0
  158. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  159. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  160. package/dist/heart/mailbox/mailbox-http.js +99 -0
  161. package/dist/heart/mailbox/mailbox-read.js +37 -0
  162. package/dist/heart/mailbox/mailbox-types.js +27 -0
  163. package/dist/heart/mailbox/mailbox-view.js +197 -0
  164. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  165. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  166. package/dist/heart/mailbox/readers/mail.js +375 -0
  167. package/dist/heart/mailbox/readers/runtime-readers.js +815 -0
  168. package/dist/heart/mailbox/readers/sessions.js +232 -0
  169. package/dist/heart/mailbox/readers/shared.js +111 -0
  170. package/dist/heart/mcp/mcp-server.js +696 -0
  171. package/dist/heart/migrate-config.js +100 -0
  172. package/dist/heart/model-capabilities.js +11 -0
  173. package/dist/heart/orientation-frame.js +217 -0
  174. package/dist/heart/platform.js +81 -0
  175. package/dist/heart/primitives.js +1 -1
  176. package/dist/heart/private-runtime/decision-renderer.js +156 -0
  177. package/dist/heart/private-runtime/index.js +18 -0
  178. package/dist/heart/private-runtime/ledger.js +218 -0
  179. package/dist/heart/private-runtime/policy.js +214 -0
  180. package/dist/heart/private-runtime/types.js +2 -0
  181. package/dist/heart/progress-story.js +1 -1
  182. package/dist/heart/provider-attempt.js +134 -0
  183. package/dist/heart/provider-binding-resolver.js +273 -0
  184. package/dist/heart/provider-credentials.js +441 -0
  185. package/dist/heart/provider-failover.js +311 -0
  186. package/dist/heart/provider-models.js +81 -0
  187. package/dist/heart/provider-ping.js +262 -0
  188. package/dist/heart/provider-readiness-cache.js +119 -0
  189. package/dist/heart/provider-visibility.js +188 -0
  190. package/dist/heart/providers/anthropic-token.js +131 -0
  191. package/dist/heart/providers/anthropic.js +139 -52
  192. package/dist/heart/providers/azure.js +23 -11
  193. package/dist/heart/providers/error-classification.js +127 -0
  194. package/dist/heart/providers/github-copilot.js +34 -38
  195. package/dist/heart/providers/minimax-vlm.js +189 -0
  196. package/dist/heart/providers/minimax.js +26 -8
  197. package/dist/heart/providers/openai-codex-token.js +349 -0
  198. package/dist/heart/providers/openai-codex.js +55 -40
  199. package/dist/heart/run-ledger.js +247 -0
  200. package/dist/heart/runtime-capability-check.js +170 -0
  201. package/dist/heart/runtime-credentials.js +398 -0
  202. package/dist/heart/runtime-cwd.js +87 -0
  203. package/dist/heart/sense-truth.js +20 -4
  204. package/dist/heart/session-activity.js +90 -24
  205. package/dist/heart/session-events.js +1133 -0
  206. package/dist/heart/session-playback-cli-main.js +5 -0
  207. package/dist/heart/session-playback-cli.js +36 -0
  208. package/dist/heart/session-playback.js +231 -0
  209. package/dist/heart/session-stats-cli-main.js +5 -0
  210. package/dist/heart/session-stats.js +182 -0
  211. package/dist/heart/session-transcript.js +133 -0
  212. package/dist/heart/start-of-turn-packet.js +365 -0
  213. package/dist/heart/streaming.js +44 -27
  214. package/dist/heart/structured-output.js +196 -0
  215. package/dist/heart/sync-classification.js +176 -0
  216. package/dist/heart/sync.js +449 -0
  217. package/dist/heart/target-resolution.js +11 -7
  218. package/dist/heart/tempo.js +93 -0
  219. package/dist/heart/temporal-view.js +41 -0
  220. package/dist/heart/timeouts.js +101 -0
  221. package/dist/heart/tool-activity-callbacks.js +59 -0
  222. package/dist/heart/tool-description.js +155 -0
  223. package/dist/heart/tool-friction.js +55 -0
  224. package/dist/heart/tool-loop.js +200 -0
  225. package/dist/heart/turn-context.js +472 -0
  226. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  227. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  228. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  229. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  230. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  231. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  232. package/dist/heart/versioning/update-hooks.js +154 -0
  233. package/dist/heart/work-card.js +380 -0
  234. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  235. package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
  236. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  237. package/dist/mailbox-ui/index.html +16 -0
  238. package/dist/mailroom/attention.js +167 -0
  239. package/dist/mailroom/autonomy.js +209 -0
  240. package/dist/mailroom/blob-store.js +715 -0
  241. package/dist/mailroom/body-cache.js +61 -0
  242. package/dist/mailroom/core.js +788 -0
  243. package/dist/mailroom/entry.js +160 -0
  244. package/dist/mailroom/file-store.js +568 -0
  245. package/dist/mailroom/mbox-import.js +393 -0
  246. package/dist/mailroom/migration.js +164 -0
  247. package/dist/mailroom/outbound.js +380 -0
  248. package/dist/mailroom/policy.js +263 -0
  249. package/dist/mailroom/reader.js +233 -0
  250. package/dist/mailroom/search-cache.js +334 -0
  251. package/dist/mailroom/search-relevance.js +319 -0
  252. package/dist/mailroom/smtp-ingress.js +176 -0
  253. package/dist/mailroom/source-state.js +176 -0
  254. package/dist/mailroom/thread.js +109 -0
  255. package/dist/mailroom/travel-extract.js +89 -0
  256. package/dist/mind/bundle-manifest.js +24 -2
  257. package/dist/mind/context.js +250 -101
  258. package/dist/mind/desk-section.js +362 -0
  259. package/dist/mind/diary-integrity.js +60 -0
  260. package/dist/mind/{memory.js → diary.js} +68 -77
  261. package/dist/mind/embedding-provider.js +60 -0
  262. package/dist/mind/file-state.js +179 -0
  263. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  264. package/dist/mind/obligation-steering.js +221 -0
  265. package/dist/mind/pending.js +13 -8
  266. package/dist/mind/prompt-budget.js +380 -0
  267. package/dist/mind/prompt-refresh.js +3 -2
  268. package/dist/mind/prompt.js +1028 -169
  269. package/dist/mind/provenance-trust.js +26 -0
  270. package/dist/mind/record-paths.js +312 -0
  271. package/dist/mind/scrutiny.js +173 -0
  272. package/dist/nerves/cli-logging.js +7 -1
  273. package/dist/nerves/coverage/audit-rules.js +15 -6
  274. package/dist/nerves/coverage/audit.js +28 -2
  275. package/dist/nerves/coverage/cli.js +1 -1
  276. package/dist/nerves/coverage/contract.js +5 -5
  277. package/dist/nerves/coverage/file-completeness.js +139 -5
  278. package/dist/nerves/event-buffer.js +111 -0
  279. package/dist/nerves/index.js +234 -4
  280. package/dist/nerves/observation.js +20 -0
  281. package/dist/nerves/redact.js +79 -0
  282. package/dist/nerves/review/cli-main.js +5 -0
  283. package/dist/nerves/review/cli.js +156 -0
  284. package/dist/nerves/review/core.js +152 -0
  285. package/dist/nerves/runtime.js +5 -1
  286. package/dist/repertoire/ado-client.js +15 -56
  287. package/dist/repertoire/ado-semantic.js +16 -10
  288. package/dist/repertoire/api-client.js +97 -0
  289. package/dist/repertoire/bitwarden-store.js +1045 -0
  290. package/dist/repertoire/bundle-templates.js +71 -0
  291. package/dist/repertoire/bw-installer.js +180 -0
  292. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  293. package/dist/repertoire/coding/context-pack.js +331 -0
  294. package/dist/repertoire/coding/feedback.js +218 -30
  295. package/dist/repertoire/coding/index.js +15 -3
  296. package/dist/repertoire/coding/manager.js +166 -10
  297. package/dist/repertoire/coding/spawner.js +58 -11
  298. package/dist/repertoire/coding/tools.js +242 -14
  299. package/dist/repertoire/coding/workbench-client.js +272 -0
  300. package/dist/repertoire/coding/workbench-manager.js +346 -0
  301. package/dist/repertoire/commerce-errors.js +109 -0
  302. package/dist/repertoire/commerce-self-test.js +156 -0
  303. package/dist/repertoire/credential-access.js +178 -0
  304. package/dist/repertoire/desk/classifier.js +362 -0
  305. package/dist/repertoire/duffel-client.js +185 -0
  306. package/dist/repertoire/github-client.js +14 -55
  307. package/dist/repertoire/graph-client.js +11 -52
  308. package/dist/repertoire/guardrails.js +156 -27
  309. package/dist/repertoire/mcp-client.js +44 -3
  310. package/dist/repertoire/mcp-manager.js +259 -20
  311. package/dist/repertoire/mcp-tools.js +83 -0
  312. package/dist/repertoire/plugin-mcp.js +175 -0
  313. package/dist/repertoire/plugins.js +253 -0
  314. package/dist/repertoire/shell-sessions.js +133 -0
  315. package/dist/repertoire/skills.js +48 -4
  316. package/dist/repertoire/stripe-client.js +131 -0
  317. package/dist/repertoire/tool-results.js +29 -0
  318. package/dist/repertoire/tools-a2a.js +699 -0
  319. package/dist/repertoire/tools-attachments.js +317 -0
  320. package/dist/repertoire/tools-awaiting.js +372 -0
  321. package/dist/repertoire/tools-base.js +65 -1095
  322. package/dist/repertoire/tools-bluebubbles.js +2 -0
  323. package/dist/repertoire/tools-bridge.js +144 -0
  324. package/dist/repertoire/tools-bundle.js +993 -0
  325. package/dist/repertoire/tools-commerce.js +253 -0
  326. package/dist/repertoire/tools-config.js +186 -0
  327. package/dist/repertoire/tools-continuity.js +252 -0
  328. package/dist/repertoire/tools-credential.js +383 -0
  329. package/dist/repertoire/tools-evolution.js +527 -0
  330. package/dist/repertoire/tools-files.js +344 -0
  331. package/dist/repertoire/tools-flight.js +290 -0
  332. package/dist/repertoire/tools-flow.js +119 -0
  333. package/dist/repertoire/tools-github.js +3 -8
  334. package/dist/repertoire/tools-mail.js +1975 -0
  335. package/dist/repertoire/tools-notes.js +459 -0
  336. package/dist/repertoire/tools-obligations.js +182 -0
  337. package/dist/repertoire/tools-orientation.js +31 -0
  338. package/dist/repertoire/tools-record.js +482 -0
  339. package/dist/repertoire/tools-rsvp.js +139 -0
  340. package/dist/repertoire/tools-runtime.js +150 -0
  341. package/dist/repertoire/tools-session.js +881 -0
  342. package/dist/repertoire/tools-shell.js +120 -0
  343. package/dist/repertoire/tools-stripe.js +224 -0
  344. package/dist/repertoire/tools-surface.js +355 -0
  345. package/dist/repertoire/tools-teams.js +12 -39
  346. package/dist/repertoire/tools-travel.js +125 -0
  347. package/dist/repertoire/tools-trip.js +982 -0
  348. package/dist/repertoire/tools-user-profile.js +146 -0
  349. package/dist/repertoire/tools-vault.js +40 -0
  350. package/dist/repertoire/tools-voice.js +145 -0
  351. package/dist/repertoire/tools.js +250 -80
  352. package/dist/repertoire/travel-api-client.js +360 -0
  353. package/dist/repertoire/user-profile.js +131 -0
  354. package/dist/repertoire/vault-setup.js +246 -0
  355. package/dist/repertoire/vault-unlock.js +594 -0
  356. package/dist/rsvp/aisleplanner-client.js +354 -0
  357. package/dist/rsvp/cli.js +758 -0
  358. package/dist/rsvp/config.js +327 -0
  359. package/dist/rsvp/cutover.js +433 -0
  360. package/dist/rsvp/diagnostics.js +222 -0
  361. package/dist/rsvp/diff-renderer.js +161 -0
  362. package/dist/rsvp/habit-policy.js +85 -0
  363. package/dist/rsvp/habit-stage.js +98 -0
  364. package/dist/rsvp/incident-bundle.js +97 -0
  365. package/dist/rsvp/migration.js +204 -0
  366. package/dist/rsvp/native-habit-runner.js +321 -0
  367. package/dist/rsvp/outbound-state.js +268 -0
  368. package/dist/rsvp/query.js +118 -0
  369. package/dist/rsvp/replay.js +233 -0
  370. package/dist/rsvp/snapshot.js +232 -0
  371. package/dist/rsvp/spend-ledger.js +175 -0
  372. package/dist/scripts/claude-code-hook.js +41 -0
  373. package/dist/scripts/claude-code-stop-hook.js +47 -0
  374. package/dist/senses/a2a-entry.js +115 -0
  375. package/dist/senses/attention-queue.js +186 -0
  376. package/dist/senses/await-turn-message.js +58 -0
  377. package/dist/senses/bluebubbles/active-turns.js +216 -0
  378. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  379. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  380. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +226 -19
  381. package/dist/senses/bluebubbles/context-packet.js +101 -0
  382. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  383. package/dist/senses/bluebubbles/entry.js +77 -0
  384. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  385. package/dist/senses/bluebubbles/index.js +2881 -0
  386. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  387. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  388. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  389. package/dist/senses/bluebubbles/outbound-state.js +304 -0
  390. package/dist/senses/bluebubbles/processed-log.js +133 -0
  391. package/dist/senses/bluebubbles/replay.js +284 -0
  392. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  393. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  394. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  395. package/dist/senses/cli/bracketed-paste.js +82 -0
  396. package/dist/senses/cli/image-paste.js +287 -0
  397. package/dist/senses/cli/image-ref-navigation.js +75 -0
  398. package/dist/senses/cli/ink-app.js +156 -0
  399. package/dist/senses/cli/inline-diff.js +64 -0
  400. package/dist/senses/cli/input-keys.js +174 -0
  401. package/dist/senses/cli/kill-ring.js +86 -0
  402. package/dist/senses/cli/message-list.js +51 -0
  403. package/dist/senses/cli/ouro-tui.js +607 -0
  404. package/dist/senses/cli/spinner-imperative.js +135 -0
  405. package/dist/senses/cli/spinner.js +101 -0
  406. package/dist/senses/cli/status-line.js +60 -0
  407. package/dist/senses/cli/streaming-markdown.js +526 -0
  408. package/dist/senses/cli/tool-display.js +85 -0
  409. package/dist/senses/cli/tool-render.js +85 -0
  410. package/dist/senses/cli/tui-store.js +240 -0
  411. package/dist/senses/cli/virtual-list.js +35 -0
  412. package/dist/senses/cli-entry.js +60 -8
  413. package/dist/senses/cli-layout.js +100 -0
  414. package/dist/senses/cli.js +521 -214
  415. package/dist/senses/commands.js +66 -3
  416. package/dist/senses/context-packet-ledger.js +245 -0
  417. package/dist/senses/context-packets.js +154 -0
  418. package/dist/senses/habit-turn-message.js +160 -0
  419. package/dist/senses/mail-entry.js +66 -0
  420. package/dist/senses/mail.js +395 -0
  421. package/dist/senses/pipeline.js +952 -178
  422. package/dist/senses/private-runtime-worker.js +739 -0
  423. package/dist/senses/private-runtime.js +1157 -0
  424. package/dist/senses/proactive-content-guard.js +51 -0
  425. package/dist/senses/shared-turn.js +416 -0
  426. package/dist/senses/surface-tool.js +109 -0
  427. package/dist/senses/teams-entry.js +60 -8
  428. package/dist/senses/teams.js +397 -112
  429. package/dist/senses/trust-gate.js +104 -9
  430. package/dist/senses/voice/audio-playback.js +237 -0
  431. package/dist/senses/voice/audio-routing.js +119 -0
  432. package/dist/senses/voice/elevenlabs.js +202 -0
  433. package/dist/senses/voice/floor-control.js +431 -0
  434. package/dist/senses/voice/floor-controller.js +115 -0
  435. package/dist/senses/voice/golden-path.js +116 -0
  436. package/dist/senses/voice/index.js +29 -0
  437. package/dist/senses/voice/meeting.js +113 -0
  438. package/dist/senses/voice/outbound.js +190 -0
  439. package/dist/senses/voice/phone.js +33 -0
  440. package/dist/senses/voice/playback.js +139 -0
  441. package/dist/senses/voice/realtime-eval.js +496 -0
  442. package/dist/senses/voice/realtime-trace.js +531 -0
  443. package/dist/senses/voice/transcript.js +70 -0
  444. package/dist/senses/voice/turn.js +191 -0
  445. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  446. package/dist/senses/voice/twilio-phone.js +5081 -0
  447. package/dist/senses/voice/types.js +2 -0
  448. package/dist/senses/voice/whisper.js +161 -0
  449. package/dist/senses/voice-entry.js +81 -0
  450. package/dist/senses/voice-realtime-eval-command.js +99 -0
  451. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  452. package/dist/senses/voice-twilio-entry.js +87 -0
  453. package/dist/trips/core.js +138 -0
  454. package/dist/trips/store.js +265 -0
  455. package/dist/util/frontmatter.js +69 -0
  456. package/package.json +57 -12
  457. package/skills/agent-commerce.md +113 -0
  458. package/skills/browser-navigation.md +117 -0
  459. package/skills/commerce-setup-guide.md +116 -0
  460. package/skills/commerce-setup.md +84 -0
  461. package/skills/configure-dev-tools.md +99 -0
  462. package/skills/travel-planning.md +138 -0
  463. package/dist/heart/daemon/auth-flow.js +0 -409
  464. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  465. package/dist/heart/daemon/update-hooks.js +0 -138
  466. package/dist/heart/safe-workspace.js +0 -228
  467. package/dist/heart/session-recall.js +0 -116
  468. package/dist/mind/friends/channel.js +0 -84
  469. package/dist/mind/friends/group-context.js +0 -144
  470. package/dist/mind/friends/resolver.js +0 -84
  471. package/dist/mind/friends/store-file.js +0 -190
  472. package/dist/mind/friends/store.js +0 -4
  473. package/dist/mind/friends/tokens.js +0 -26
  474. package/dist/mind/friends/trust-explanation.js +0 -74
  475. package/dist/mind/friends/types.js +0 -29
  476. package/dist/repertoire/tasks/board.js +0 -134
  477. package/dist/repertoire/tasks/index.js +0 -224
  478. package/dist/repertoire/tasks/lifecycle.js +0 -80
  479. package/dist/repertoire/tasks/middleware.js +0 -65
  480. package/dist/repertoire/tasks/parser.js +0 -173
  481. package/dist/repertoire/tasks/scanner.js +0 -132
  482. package/dist/repertoire/tasks/transitions.js +0 -144
  483. package/dist/senses/bluebubbles-entry.js +0 -13
  484. package/dist/senses/bluebubbles.js +0 -1180
  485. package/dist/senses/debug-activity.js +0 -148
  486. package/dist/senses/inner-dialog-worker.js +0 -90
  487. package/dist/senses/inner-dialog.js +0 -480
  488. package/subagents/README.md +0 -7
  489. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  490. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  491. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  492. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  493. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  494. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  495. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  496. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  497. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  498. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  499. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  500. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  501. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  502. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  503. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  504. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  505. /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,197 @@
1
+ "use strict";
2
+ /**
3
+ * Boot sync probe — Layer 2 orchestrator for `ouro up`.
4
+ *
5
+ * For each sync-enabled bundle, runs `preTurnPullAsync` wrapped in
6
+ * `runWithTimeouts`, classifies failures via `classifySyncFailure`, and
7
+ * returns aggregated findings. Findings surface in the boot stdout
8
+ * summary written by `cli-exec.ts` after the probe phase.
9
+ *
10
+ * Layer 2 is intentionally a **boot-time preflight surface only** — it
11
+ * does NOT feed into the running daemon's rollup state. `computeDaemonRollup`
12
+ * is unaware of these findings; nothing is persisted to daemon health for
13
+ * the running daemon to consume. Layer 3 RepairGuide is the planned consumer
14
+ * (it reads the in-memory `BootSyncProbeFinding[]` at boot time and
15
+ * dispatches the right diagnostic skill).
16
+ *
17
+ * The probe NEVER:
18
+ * - Writes to `state/` (verified by Unit 7's grep gate).
19
+ * - Throws — every failure becomes a finding.
20
+ * - Hangs — `AbortSignal` from `runWithTimeouts` cuts hung remotes
21
+ * within `hardMs`.
22
+ *
23
+ * Advisory vs blocking classifications (consumed by layer 3, not by the
24
+ * layer 1 rollup — see comment above):
25
+ *
26
+ * | classification | advisory? | rationale |
27
+ * | ---------------------- | --------- | ------------------------------------------- |
28
+ * | auth-failed | no | agent can't sync; needs human intervention |
29
+ * | not-found-404 | no | remote is gone; needs human intervention |
30
+ * | network-down | no | agent can't reach the remote at all |
31
+ * | timeout-hard | no | abort cut the op; remote is hung |
32
+ * | dirty-working-tree | yes | local edits prevent merge; agent still runs |
33
+ * | non-fast-forward | yes | local commits ahead; agent still runs |
34
+ * | merge-conflict | yes | rebase failed; needs cleanup |
35
+ * | timeout-soft | yes | warning surfaced, op completed |
36
+ * | unknown | yes | unrecognised; surface for diagnosis |
37
+ *
38
+ * `advisory: true` is a hint for layer 3 ("warn-and-continue, agent likely
39
+ * still works") vs `advisory: false` ("blocking, agent can't sync until
40
+ * fixed"). Layer 3 will route the right diagnostic skill on this signal.
41
+ */
42
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
43
+ if (k2 === undefined) k2 = k;
44
+ var desc = Object.getOwnPropertyDescriptor(m, k);
45
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
46
+ desc = { enumerable: true, get: function() { return m[k]; } };
47
+ }
48
+ Object.defineProperty(o, k2, desc);
49
+ }) : (function(o, m, k, k2) {
50
+ if (k2 === undefined) k2 = k;
51
+ o[k2] = m[k];
52
+ }));
53
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
54
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
55
+ }) : function(o, v) {
56
+ o["default"] = v;
57
+ });
58
+ var __importStar = (this && this.__importStar) || (function () {
59
+ var ownKeys = function(o) {
60
+ ownKeys = Object.getOwnPropertyNames || function (o) {
61
+ var ar = [];
62
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
63
+ return ar;
64
+ };
65
+ return ownKeys(o);
66
+ };
67
+ return function (mod) {
68
+ if (mod && mod.__esModule) return mod;
69
+ var result = {};
70
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
71
+ __setModuleDefault(result, mod);
72
+ return result;
73
+ };
74
+ })();
75
+ Object.defineProperty(exports, "__esModule", { value: true });
76
+ exports.runBootSyncProbe = runBootSyncProbe;
77
+ const path = __importStar(require("path"));
78
+ const sync_1 = require("../sync");
79
+ const sync_classification_1 = require("../sync-classification");
80
+ const timeouts_1 = require("../timeouts");
81
+ const runtime_1 = require("../../nerves/runtime");
82
+ /** Default soft / hard timeout windows for the boot git op. Matches Layer 2 O1 lock. */
83
+ const DEFAULT_SOFT_MS = 8000;
84
+ const DEFAULT_HARD_MS = 15000;
85
+ const BLOCKING_CLASSIFICATIONS = new Set([
86
+ "auth-failed",
87
+ "not-found-404",
88
+ "network-down",
89
+ "timeout-hard",
90
+ ]);
91
+ function isAdvisory(classification) {
92
+ return !BLOCKING_CLASSIFICATIONS.has(classification);
93
+ }
94
+ /**
95
+ * Probe sync state for every enabled, git-initialised bundle. Returns
96
+ * findings for every non-clean result. Probes run sequentially (not in
97
+ * parallel) so the boot path's progress reporter has a stable per-agent
98
+ * narrative; the per-probe hard cap means worst-case total wait is
99
+ * `bundles.length * hardMs`, which is acceptable for typical 1-3 agent
100
+ * deployments.
101
+ */
102
+ async function runBootSyncProbe(bundles, options) {
103
+ const startedAt = Date.now();
104
+ const softMs = options.softMs ?? DEFAULT_SOFT_MS;
105
+ const hardMs = options.hardMs ?? DEFAULT_HARD_MS;
106
+ (0, runtime_1.emitNervesEvent)({
107
+ component: "daemon",
108
+ event: "daemon.boot_sync_probe_start",
109
+ message: "boot sync probe starting",
110
+ meta: { bundleCount: bundles.length, softMs, hardMs },
111
+ });
112
+ const findings = [];
113
+ for (const bundle of bundles) {
114
+ if (!bundle.enabled)
115
+ continue;
116
+ const agentRoot = path.join(options.bundlesRoot, `${bundle.agent}.ouro`);
117
+ // gitInitialized=false: bundle is enabled for sync but never had `git init`.
118
+ // Surface as advisory finding without invoking git.
119
+ if (bundle.gitInitialized === false) {
120
+ findings.push({
121
+ agent: bundle.agent,
122
+ classification: "unknown",
123
+ error: `bundle is not a git repo; run \`git init\` inside ${agentRoot} to enable sync (or disable sync in agent.json)`,
124
+ conflictFiles: [],
125
+ warnings: [],
126
+ advisory: true,
127
+ });
128
+ continue;
129
+ }
130
+ const syncConfig = { enabled: bundle.enabled, remote: bundle.remote };
131
+ const outcome = await (0, timeouts_1.runWithTimeouts)((signal) => (0, sync_1.preTurnPullAsync)(agentRoot, syncConfig, { signal }), { softMs, hardMs, label: `boot-sync-probe ${bundle.agent}`, envKey: "GIT" });
132
+ // Hard timeout — the probe was aborted. Synthesise a finding from the
133
+ // outcome's classification (the underlying `preTurnPullAsync` may also
134
+ // have rejected with an AbortError, but the wrapper already swallowed
135
+ // it).
136
+ if (outcome.classification === "timeout-hard") {
137
+ findings.push({
138
+ agent: bundle.agent,
139
+ classification: "timeout-hard",
140
+ error: `boot sync probe for ${bundle.agent} aborted after ${hardMs}ms hard timeout`,
141
+ conflictFiles: [],
142
+ warnings: outcome.warnings,
143
+ advisory: isAdvisory("timeout-hard"),
144
+ });
145
+ continue;
146
+ }
147
+ const result = outcome.result;
148
+ /* v8 ignore start -- defensive: exclusive state from runWithTimeouts contract — either result or classification, never both undefined @preserve */
149
+ if (!result) {
150
+ findings.push({
151
+ agent: bundle.agent,
152
+ classification: "unknown",
153
+ error: "boot sync probe returned without result or classification",
154
+ conflictFiles: [],
155
+ warnings: outcome.warnings,
156
+ advisory: true,
157
+ });
158
+ continue;
159
+ }
160
+ /* v8 ignore stop */
161
+ if (!result.ok) {
162
+ const classification = (0, sync_classification_1.classifySyncFailure)(new Error(result.error ?? "unknown sync error"), { agentRoot });
163
+ findings.push({
164
+ agent: bundle.agent,
165
+ classification: classification.classification,
166
+ error: classification.error,
167
+ conflictFiles: classification.conflictFiles,
168
+ warnings: outcome.warnings,
169
+ advisory: isAdvisory(classification.classification),
170
+ });
171
+ continue;
172
+ }
173
+ // Probe succeeded. If the soft warning fired, surface it as an advisory
174
+ // finding so the operator sees the slow-pull warning even on success.
175
+ if (outcome.warnings.length > 0) {
176
+ findings.push({
177
+ agent: bundle.agent,
178
+ classification: "timeout-soft",
179
+ error: outcome.warnings.join("; "),
180
+ conflictFiles: [],
181
+ warnings: outcome.warnings,
182
+ advisory: true,
183
+ });
184
+ }
185
+ }
186
+ // Stable order — sort by agent name so renderers and tests see the same
187
+ // sequence.
188
+ findings.sort((a, b) => a.agent.localeCompare(b.agent));
189
+ const durationMs = Date.now() - startedAt;
190
+ (0, runtime_1.emitNervesEvent)({
191
+ component: "daemon",
192
+ event: "daemon.boot_sync_probe_end",
193
+ message: "boot sync probe complete",
194
+ meta: { findingCount: findings.length, durationMs },
195
+ });
196
+ return { findings, durationMs };
197
+ }
@@ -0,0 +1,180 @@
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
+ exports.nextCadenceRunAt = nextCadenceRunAt;
7
+ exports.cadenceFallbackDelayMs = cadenceFallbackDelayMs;
8
+ exports.evaluateCadenceDue = evaluateCadenceDue;
9
+ const runtime_1 = require("../../nerves/runtime");
10
+ exports.DEFAULT_CADENCE_MS = 30 * 60 * 1000; // 30 minutes
11
+ function parseFixedDailyCron(raw) {
12
+ if (typeof raw !== "string")
13
+ return null;
14
+ const parts = raw.trim().split(/\s+/);
15
+ if (parts.length !== 5)
16
+ return null;
17
+ const minuteRaw = parts[0];
18
+ const hourRaw = parts[1];
19
+ const day = parts[2];
20
+ const month = parts[3];
21
+ const weekday = parts[4];
22
+ if (day !== "*" || month !== "*" || weekday !== "*")
23
+ return null;
24
+ if (!/^\d+$/.test(minuteRaw) || !/^\d+$/.test(hourRaw))
25
+ return null;
26
+ const minute = Number.parseInt(minuteRaw, 10);
27
+ const hour = Number.parseInt(hourRaw, 10);
28
+ if (minute < 0 || minute > 59 || hour < 0 || hour > 23)
29
+ return null;
30
+ return { minute, hour };
31
+ }
32
+ function coerceTimeMs(value) {
33
+ const time = value instanceof Date ? value.getTime() : typeof value === "number" ? value : Date.parse(value);
34
+ return Number.isFinite(time) ? time : null;
35
+ }
36
+ function localOccurrenceForDay(referenceMs, fixed) {
37
+ const occurrence = new Date(referenceMs);
38
+ occurrence.setHours(fixed.hour, fixed.minute, 0, 0);
39
+ return occurrence;
40
+ }
41
+ function previousFixedDailyOccurrence(fixed, nowMs) {
42
+ const occurrence = localOccurrenceForDay(nowMs, fixed);
43
+ if (occurrence.getTime() > nowMs) {
44
+ occurrence.setDate(occurrence.getDate() - 1);
45
+ }
46
+ return occurrence;
47
+ }
48
+ function nextFixedDailyOccurrence(fixed, fromMs) {
49
+ const occurrence = localOccurrenceForDay(fromMs, fixed);
50
+ if (occurrence.getTime() <= fromMs) {
51
+ occurrence.setDate(occurrence.getDate() + 1);
52
+ }
53
+ return occurrence;
54
+ }
55
+ /**
56
+ * Parse a cadence shorthand (e.g. "30m", "2h", "1d") into a cron string.
57
+ * Also accepts raw cron strings (5 space-separated fields) and passes them through.
58
+ * Returns null for invalid input.
59
+ */
60
+ function parseCadenceToCron(raw) {
61
+ if (typeof raw !== "string")
62
+ return null;
63
+ const value = raw.trim();
64
+ if (!value)
65
+ return null;
66
+ // Cron format (minute hour day month weekday)
67
+ if (/^\S+\s+\S+\s+\S+\s+\S+\s+\S+$/.test(value)) {
68
+ return value;
69
+ }
70
+ const cadenceMatch = /^(\d+)(m|h|d)$/.exec(value);
71
+ if (!cadenceMatch)
72
+ return null;
73
+ const interval = Number.parseInt(cadenceMatch[1], 10);
74
+ if (!Number.isFinite(interval) || interval <= 0)
75
+ return null;
76
+ (0, runtime_1.emitNervesEvent)({
77
+ event: "daemon.cadence_parsed",
78
+ component: "daemon",
79
+ message: "parsed cadence shorthand to cron",
80
+ meta: { raw: value, interval, unit: cadenceMatch[2] },
81
+ });
82
+ const unit = cadenceMatch[2];
83
+ if (unit === "m")
84
+ return `*/${interval} * * * *`;
85
+ if (unit === "h")
86
+ return `0 */${interval} * * *`;
87
+ return `0 0 */${interval} * *`;
88
+ }
89
+ /**
90
+ * Parse a cadence shorthand (e.g. "30m", "2h", "1d") into milliseconds.
91
+ * Returns null for invalid input.
92
+ */
93
+ function parseCadenceToMs(raw) {
94
+ if (typeof raw !== "string")
95
+ return null;
96
+ const value = raw.trim();
97
+ if (!value)
98
+ return null;
99
+ const match = /^(\d+)(m|h|d)$/.exec(value);
100
+ if (!match)
101
+ return null;
102
+ const interval = Number.parseInt(match[1], 10);
103
+ if (!Number.isFinite(interval) || interval <= 0)
104
+ return null;
105
+ (0, runtime_1.emitNervesEvent)({
106
+ event: "daemon.cadence_parsed_ms",
107
+ component: "daemon",
108
+ message: "parsed cadence shorthand to milliseconds",
109
+ meta: { raw: value, interval, unit: match[2] },
110
+ });
111
+ const unit = match[2];
112
+ if (unit === "m")
113
+ return interval * 60 * 1000;
114
+ if (unit === "h")
115
+ return interval * 60 * 60 * 1000;
116
+ return interval * 24 * 60 * 60 * 1000;
117
+ }
118
+ function nextCadenceRunAt(raw, from) {
119
+ const fromMs = coerceTimeMs(from);
120
+ if (fromMs === null)
121
+ return null;
122
+ const intervalMs = parseCadenceToMs(raw);
123
+ if (intervalMs !== null) {
124
+ return new Date(fromMs + intervalMs).toISOString();
125
+ }
126
+ const fixed = parseFixedDailyCron(raw);
127
+ if (!fixed)
128
+ return null;
129
+ const next = nextFixedDailyOccurrence(fixed, fromMs);
130
+ (0, runtime_1.emitNervesEvent)({
131
+ event: "daemon.fixed_cadence_next_run_computed",
132
+ component: "daemon",
133
+ message: "computed fixed daily cadence next run",
134
+ meta: { raw, nextRunAt: next.toISOString() },
135
+ });
136
+ return next.toISOString();
137
+ }
138
+ function cadenceFallbackDelayMs(raw, nowMs) {
139
+ const intervalMs = parseCadenceToMs(raw);
140
+ if (intervalMs !== null)
141
+ return intervalMs;
142
+ const nextRunAt = nextCadenceRunAt(raw, nowMs);
143
+ if (!nextRunAt)
144
+ return null;
145
+ const delay = Date.parse(nextRunAt) - nowMs;
146
+ return delay;
147
+ }
148
+ function evaluateCadenceDue(raw, lastRun, nowMs) {
149
+ const intervalMs = parseCadenceToMs(raw);
150
+ if (intervalMs !== null) {
151
+ if (lastRun === null) {
152
+ return { due: true, elapsedMs: Infinity, occurrenceId: `overdue:first-run:${String(raw).trim()}` };
153
+ }
154
+ const lastRunMs = Date.parse(lastRun);
155
+ if (!Number.isFinite(lastRunMs))
156
+ return { due: false, elapsedMs: 0, occurrenceId: null };
157
+ const elapsedMs = nowMs - lastRunMs;
158
+ return {
159
+ due: elapsedMs >= intervalMs,
160
+ elapsedMs,
161
+ occurrenceId: elapsedMs >= intervalMs ? `overdue:last-run:${lastRun}:cadence:${String(raw).trim()}` : null,
162
+ };
163
+ }
164
+ const fixed = parseFixedDailyCron(raw);
165
+ if (!fixed)
166
+ return null;
167
+ const occurrence = previousFixedDailyOccurrence(fixed, nowMs);
168
+ const elapsedMs = lastRun === null ? Infinity : nowMs - occurrence.getTime();
169
+ const todayOccurrence = localOccurrenceForDay(nowMs, fixed);
170
+ const hasReachedTodayOccurrence = todayOccurrence.getTime() <= nowMs;
171
+ const lastRunMs = lastRun === null ? null : Date.parse(lastRun);
172
+ const due = lastRunMs === null
173
+ ? hasReachedTodayOccurrence
174
+ : Number.isFinite(lastRunMs) && lastRunMs < occurrence.getTime();
175
+ return {
176
+ due,
177
+ elapsedMs,
178
+ occurrenceId: due ? `fixed-daily:${occurrence.toISOString()}:cadence:${String(raw).trim()}` : null,
179
+ };
180
+ }