@murphai/murph 1.2.0 → 1.2.4

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 (1903) hide show
  1. package/CHANGELOG.md +1303 -0
  2. package/config.schema.json +412 -50
  3. package/dist/cli-entry.d.ts.map +1 -1
  4. package/dist/cli-entry.js +13 -20
  5. package/dist/cli-entry.js.map +1 -1
  6. package/dist/commands/audit-command-helpers.js.map +1 -1
  7. package/dist/commands/audit.js +2 -2
  8. package/dist/commands/automation.d.ts +118 -7
  9. package/dist/commands/automation.d.ts.map +1 -1
  10. package/dist/commands/automation.js +140 -54
  11. package/dist/commands/automation.js.map +1 -1
  12. package/dist/commands/batch.d.ts.map +1 -1
  13. package/dist/commands/batch.js +12 -4
  14. package/dist/commands/batch.js.map +1 -1
  15. package/dist/commands/capture.d.ts +9 -9
  16. package/dist/commands/capture.d.ts.map +1 -1
  17. package/dist/commands/clinical-imports.d.ts +101 -101
  18. package/dist/commands/command-factory-primitives.d.ts +3 -3
  19. package/dist/commands/command-factory-primitives.d.ts.map +1 -1
  20. package/dist/commands/command-factory-primitives.js +1 -1
  21. package/dist/commands/commons.d.ts +9 -9
  22. package/dist/commands/document.d.ts.map +1 -1
  23. package/dist/commands/document.js +3 -0
  24. package/dist/commands/document.js.map +1 -1
  25. package/dist/commands/encounter.d.ts +42 -42
  26. package/dist/commands/encounter.d.ts.map +1 -1
  27. package/dist/commands/event.js +1 -1
  28. package/dist/commands/exercise.js.map +1 -1
  29. package/dist/commands/experiment.d.ts.map +1 -1
  30. package/dist/commands/experiment.js +1 -0
  31. package/dist/commands/experiment.js.map +1 -1
  32. package/dist/commands/export-intake-read-helpers.d.ts +4 -4
  33. package/dist/commands/export-intake-read-helpers.d.ts.map +1 -1
  34. package/dist/commands/export-intake-read-helpers.js +1 -1
  35. package/dist/commands/export-intake-read-helpers.js.map +1 -1
  36. package/dist/commands/export.js +1 -1
  37. package/dist/commands/food.d.ts +4 -4
  38. package/dist/commands/food.js +1 -1
  39. package/dist/commands/group.d.ts +81 -0
  40. package/dist/commands/group.d.ts.map +1 -0
  41. package/dist/commands/group.js +242 -0
  42. package/dist/commands/group.js.map +1 -0
  43. package/dist/commands/habitat.d.ts +3 -0
  44. package/dist/commands/habitat.d.ts.map +1 -0
  45. package/dist/commands/habitat.js +282 -0
  46. package/dist/commands/habitat.js.map +1 -0
  47. package/dist/commands/health-allergy-save.d.ts.map +1 -1
  48. package/dist/commands/health-allergy-save.js +1 -1
  49. package/dist/commands/health-allergy-save.js.map +1 -1
  50. package/dist/commands/health-condition-save.d.ts.map +1 -1
  51. package/dist/commands/health-condition-save.js +1 -1
  52. package/dist/commands/health-condition-save.js.map +1 -1
  53. package/dist/commands/health-goal-save.d.ts.map +1 -1
  54. package/dist/commands/health-goal-save.js +1 -1
  55. package/dist/commands/health-goal-save.js.map +1 -1
  56. package/dist/commands/intake.js +1 -1
  57. package/dist/commands/intervention.d.ts.map +1 -1
  58. package/dist/commands/intervention.js +10 -0
  59. package/dist/commands/intervention.js.map +1 -1
  60. package/dist/commands/knowledge.js +2 -2
  61. package/dist/commands/measurement.d.ts +7 -7
  62. package/dist/commands/measurement.d.ts.map +1 -1
  63. package/dist/commands/medication.d.ts +3 -3
  64. package/dist/commands/memory.d.ts.map +1 -1
  65. package/dist/commands/memory.js +26 -2
  66. package/dist/commands/memory.js.map +1 -1
  67. package/dist/commands/model.js.map +1 -1
  68. package/dist/commands/murph-age.d.ts +499 -498
  69. package/dist/commands/murph-age.d.ts.map +1 -1
  70. package/dist/commands/murph-age.js +3 -2
  71. package/dist/commands/murph-age.js.map +1 -1
  72. package/dist/commands/payload-schema-command.d.ts +1 -1
  73. package/dist/commands/protocol.js +2 -2
  74. package/dist/commands/provider.js +1 -1
  75. package/dist/commands/recipe.js +1 -1
  76. package/dist/commands/record-mutation-command-helpers.d.ts +3 -3
  77. package/dist/commands/record-mutation-command-helpers.d.ts.map +1 -1
  78. package/dist/commands/research.js.map +1 -1
  79. package/dist/commands/sample-batch-command-helpers.js.map +1 -1
  80. package/dist/commands/sample-import-command-helpers.d.ts.map +1 -1
  81. package/dist/commands/sample-query-command-helpers.d.ts +1 -1
  82. package/dist/commands/sample-query-command-helpers.d.ts.map +1 -1
  83. package/dist/commands/sample-query-command-helpers.js.map +1 -1
  84. package/dist/commands/samples.js +2 -2
  85. package/dist/commands/scheduled-log.d.ts +127 -275
  86. package/dist/commands/scheduled-log.d.ts.map +1 -1
  87. package/dist/commands/scheduled-log.js +28 -3
  88. package/dist/commands/scheduled-log.js.map +1 -1
  89. package/dist/commands/search.js +1 -1
  90. package/dist/commands/supplement.js +1 -1
  91. package/dist/commands/vault.d.ts +2 -1
  92. package/dist/commands/vault.d.ts.map +1 -1
  93. package/dist/commands/vault.js +111 -1
  94. package/dist/commands/vault.js.map +1 -1
  95. package/dist/commands/wearables.d.ts +695 -667
  96. package/dist/commands/wearables.d.ts.map +1 -1
  97. package/dist/commands/wearables.js +10 -3
  98. package/dist/commands/wearables.js.map +1 -1
  99. package/dist/commands/workout.d.ts.map +1 -1
  100. package/dist/commands/workout.js +9 -2
  101. package/dist/commands/workout.js.map +1 -1
  102. package/dist/device-services.d.ts.map +1 -1
  103. package/dist/device-services.js +33 -8
  104. package/dist/device-services.js.map +1 -1
  105. package/dist/food-labels.d.ts +39 -39
  106. package/dist/food-labels.js.map +1 -1
  107. package/dist/foreground-terminal-logging.js.map +1 -1
  108. package/dist/hosted-data-api-labels.d.ts +117 -117
  109. package/dist/hosted-data-api-labels.js.map +1 -1
  110. package/dist/incur.generated.d.ts +93 -0
  111. package/dist/incur.generated.d.ts.map +1 -1
  112. package/dist/index.d.ts.map +1 -1
  113. package/dist/mapbox-route-contracts.d.ts +13 -13
  114. package/dist/mapbox-route-contracts.d.ts.map +1 -1
  115. package/dist/mapbox-route.js.map +1 -1
  116. package/dist/research-scout-client.js.map +1 -1
  117. package/dist/supplement-labels.d.ts +39 -39
  118. package/dist/supplement-labels.js.map +1 -1
  119. package/dist/vault-cli-command-manifest.d.ts +1451 -1478
  120. package/dist/vault-cli-command-manifest.d.ts.map +1 -1
  121. package/dist/vault-cli-command-manifest.js +80 -2
  122. package/dist/vault-cli-command-manifest.js.map +1 -1
  123. package/dist/vault-cli-command-routing.d.ts.map +1 -1
  124. package/dist/vault-cli-command-routing.js +79 -2
  125. package/dist/vault-cli-command-routing.js.map +1 -1
  126. package/dist/vault-cli-package.d.ts +1 -1
  127. package/dist/vault-cli-package.d.ts.map +1 -1
  128. package/dist/vault-cli-package.js.map +1 -1
  129. package/dist/vault-cli-routing.d.ts +4 -1
  130. package/dist/vault-cli-routing.d.ts.map +1 -1
  131. package/dist/vault-cli-routing.js +45 -5
  132. package/dist/vault-cli-routing.js.map +1 -1
  133. package/dist/vault-cli-shell.d.ts +3 -1
  134. package/dist/vault-cli-shell.d.ts.map +1 -1
  135. package/dist/vault-cli-shell.js +4 -1
  136. package/dist/vault-cli-shell.js.map +1 -1
  137. package/dist/vault-cli-skill-hash.generated.d.ts +2 -0
  138. package/dist/vault-cli-skill-hash.generated.d.ts.map +1 -0
  139. package/dist/vault-cli-skill-hash.generated.js +3 -0
  140. package/dist/vault-cli-skill-hash.generated.js.map +1 -0
  141. package/dist/vault-cli-vault-context.js.map +1 -1
  142. package/dist/vault-cli.js.map +1 -1
  143. package/node_modules/@murphai/assistant-cli/dist/assistant/automation/run-loop.d.ts +1 -1
  144. package/node_modules/@murphai/assistant-cli/dist/assistant/doctor-security.js.map +1 -1
  145. package/node_modules/@murphai/assistant-cli/dist/assistant/doctor.js.map +1 -1
  146. package/node_modules/@murphai/assistant-cli/dist/assistant/service.d.ts +24 -22
  147. package/node_modules/@murphai/assistant-cli/dist/assistant/service.d.ts.map +1 -1
  148. package/node_modules/@murphai/assistant-cli/dist/assistant/stop.d.ts +1 -1
  149. package/node_modules/@murphai/assistant-cli/dist/assistant/store.d.ts +3 -1
  150. package/node_modules/@murphai/assistant-cli/dist/assistant/store.d.ts.map +1 -1
  151. package/node_modules/@murphai/assistant-cli/dist/assistant/store.js +5 -2
  152. package/node_modules/@murphai/assistant-cli/dist/assistant/store.js.map +1 -1
  153. package/node_modules/@murphai/assistant-cli/dist/assistant/ui/ink-composer-panel.d.ts +4 -4
  154. package/node_modules/@murphai/assistant-cli/dist/assistant/ui/ink-composer-panel.d.ts.map +1 -1
  155. package/node_modules/@murphai/assistant-cli/dist/assistant/ui/ink-layout.d.ts +9 -9
  156. package/node_modules/@murphai/assistant-cli/dist/assistant/ui/ink-layout.d.ts.map +1 -1
  157. package/node_modules/@murphai/assistant-cli/dist/assistant/ui/ink-message-text.d.ts +4 -4
  158. package/node_modules/@murphai/assistant-cli/dist/assistant/ui/ink-message-text.d.ts.map +1 -1
  159. package/node_modules/@murphai/assistant-cli/dist/assistant/ui/ink-message-text.js.map +1 -1
  160. package/node_modules/@murphai/assistant-cli/dist/assistant/ui/ink-transcript.d.ts +4 -4
  161. package/node_modules/@murphai/assistant-cli/dist/assistant/ui/ink-transcript.d.ts.map +1 -1
  162. package/node_modules/@murphai/assistant-cli/dist/assistant/ui/ink.js.map +1 -1
  163. package/node_modules/@murphai/assistant-cli/dist/assistant/ui/theme.js.map +1 -1
  164. package/node_modules/@murphai/assistant-cli/dist/assistant/ui/view-model.d.ts +1 -1
  165. package/node_modules/@murphai/assistant-cli/dist/assistant/ui/view-model.d.ts.map +1 -1
  166. package/node_modules/@murphai/assistant-cli/dist/assistant-daemon-client.d.ts.map +1 -1
  167. package/node_modules/@murphai/assistant-cli/dist/assistant-daemon-client.js +2 -2
  168. package/node_modules/@murphai/assistant-cli/dist/assistant-daemon-client.js.map +1 -1
  169. package/node_modules/@murphai/assistant-cli/dist/commands/assistant.d.ts.map +1 -1
  170. package/node_modules/@murphai/assistant-cli/dist/commands/assistant.js +52 -7
  171. package/node_modules/@murphai/assistant-cli/dist/commands/assistant.js.map +1 -1
  172. package/node_modules/@murphai/assistant-cli/dist/run-terminal-logging.js.map +1 -1
  173. package/node_modules/@murphai/assistant-engine/README.md +55 -7
  174. package/node_modules/@murphai/assistant-engine/dist/assistant/active-experiment-context.d.ts.map +1 -1
  175. package/node_modules/@murphai/assistant-engine/dist/assistant/active-experiment-context.js +36 -24
  176. package/node_modules/@murphai/assistant-engine/dist/assistant/active-experiment-context.js.map +1 -1
  177. package/node_modules/@murphai/assistant-engine/dist/assistant/active-turn-input-controller.d.ts +10 -0
  178. package/node_modules/@murphai/assistant-engine/dist/assistant/active-turn-input-controller.d.ts.map +1 -1
  179. package/node_modules/@murphai/assistant-engine/dist/assistant/active-turn-input-controller.js +89 -7
  180. package/node_modules/@murphai/assistant-engine/dist/assistant/active-turn-input-controller.js.map +1 -1
  181. package/node_modules/@murphai/assistant-engine/dist/assistant/active-turn-input-journal.d.ts +36 -36
  182. package/node_modules/@murphai/assistant-engine/dist/assistant/active-turn-input-journal.d.ts.map +1 -1
  183. package/node_modules/@murphai/assistant-engine/dist/assistant/ask-continuation.d.ts +32 -0
  184. package/node_modules/@murphai/assistant-engine/dist/assistant/ask-continuation.d.ts.map +1 -0
  185. package/node_modules/@murphai/assistant-engine/dist/assistant/ask-continuation.js +347 -0
  186. package/node_modules/@murphai/assistant-engine/dist/assistant/ask-continuation.js.map +1 -0
  187. package/node_modules/@murphai/assistant-engine/dist/assistant/attachment-artifact-paths.d.ts +2 -2
  188. package/node_modules/@murphai/assistant-engine/dist/assistant/attachment-artifact-paths.d.ts.map +1 -1
  189. package/node_modules/@murphai/assistant-engine/dist/assistant/attachment-evidence-model.d.ts +5 -0
  190. package/node_modules/@murphai/assistant-engine/dist/assistant/attachment-evidence-model.d.ts.map +1 -1
  191. package/node_modules/@murphai/assistant-engine/dist/assistant/attachment-evidence-model.js +163 -42
  192. package/node_modules/@murphai/assistant-engine/dist/assistant/attachment-evidence-model.js.map +1 -1
  193. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/evidence.d.ts +3 -3
  194. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/evidence.d.ts.map +1 -1
  195. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/evidence.js +8 -7
  196. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/evidence.js.map +1 -1
  197. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/grouping.d.ts +2 -1
  198. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/grouping.d.ts.map +1 -1
  199. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/grouping.js +11 -0
  200. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/grouping.js.map +1 -1
  201. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/input-summary.d.ts +1 -0
  202. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/input-summary.d.ts.map +1 -1
  203. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/input-summary.js +2 -0
  204. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/input-summary.js.map +1 -1
  205. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/operation-scope.d.ts +11 -0
  206. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/operation-scope.d.ts.map +1 -0
  207. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/operation-scope.js +2 -0
  208. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/operation-scope.js.map +1 -0
  209. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/prompt-builder.d.ts +18 -0
  210. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/prompt-builder.d.ts.map +1 -1
  211. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/prompt-builder.js +66 -16
  212. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/prompt-builder.js.map +1 -1
  213. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/reply.d.ts +26 -8
  214. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/reply.d.ts.map +1 -1
  215. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/reply.js +644 -158
  216. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/reply.js.map +1 -1
  217. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/run-loop.d.ts +15 -1
  218. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/run-loop.d.ts.map +1 -1
  219. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/run-loop.js +90 -29
  220. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/run-loop.js.map +1 -1
  221. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/scanner.d.ts +6 -1
  222. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/scanner.d.ts.map +1 -1
  223. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/scanner.js +18 -6
  224. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/scanner.js.map +1 -1
  225. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/shared.d.ts +9 -1
  226. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/shared.d.ts.map +1 -1
  227. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/shared.js.map +1 -1
  228. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/target-override.d.ts +5 -0
  229. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/target-override.d.ts.map +1 -0
  230. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/target-override.js +30 -0
  231. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/target-override.js.map +1 -0
  232. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/turn-envelope.d.ts +4 -1
  233. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/turn-envelope.d.ts.map +1 -1
  234. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/turn-envelope.js +4 -0
  235. package/node_modules/@murphai/assistant-engine/dist/assistant/automation/turn-envelope.js.map +1 -1
  236. package/node_modules/@murphai/assistant-engine/dist/assistant/automation.d.ts +5 -3
  237. package/node_modules/@murphai/assistant-engine/dist/assistant/automation.d.ts.map +1 -1
  238. package/node_modules/@murphai/assistant-engine/dist/assistant/automation.js +3 -2
  239. package/node_modules/@murphai/assistant-engine/dist/assistant/automation.js.map +1 -1
  240. package/node_modules/@murphai/assistant-engine/dist/assistant/bindings.d.ts +2 -0
  241. package/node_modules/@murphai/assistant-engine/dist/assistant/bindings.d.ts.map +1 -1
  242. package/node_modules/@murphai/assistant-engine/dist/assistant/bindings.js +22 -1
  243. package/node_modules/@murphai/assistant-engine/dist/assistant/bindings.js.map +1 -1
  244. package/node_modules/@murphai/assistant-engine/dist/assistant/channel-adapters.d.ts +2 -2
  245. package/node_modules/@murphai/assistant-engine/dist/assistant/channel-adapters.d.ts.map +1 -1
  246. package/node_modules/@murphai/assistant-engine/dist/assistant/channel-adapters.js +1 -1
  247. package/node_modules/@murphai/assistant-engine/dist/assistant/channel-adapters.js.map +1 -1
  248. package/node_modules/@murphai/assistant-engine/dist/assistant/channel-typing.d.ts +4 -2
  249. package/node_modules/@murphai/assistant-engine/dist/assistant/channel-typing.d.ts.map +1 -1
  250. package/node_modules/@murphai/assistant-engine/dist/assistant/channel-typing.js +51 -18
  251. package/node_modules/@murphai/assistant-engine/dist/assistant/channel-typing.js.map +1 -1
  252. package/node_modules/@murphai/assistant-engine/dist/assistant/channels/descriptors.d.ts.map +1 -1
  253. package/node_modules/@murphai/assistant-engine/dist/assistant/channels/descriptors.js +87 -49
  254. package/node_modules/@murphai/assistant-engine/dist/assistant/channels/descriptors.js.map +1 -1
  255. package/node_modules/@murphai/assistant-engine/dist/assistant/channels/helpers.d.ts.map +1 -1
  256. package/node_modules/@murphai/assistant-engine/dist/assistant/channels/helpers.js +5 -0
  257. package/node_modules/@murphai/assistant-engine/dist/assistant/channels/helpers.js.map +1 -1
  258. package/node_modules/@murphai/assistant-engine/dist/assistant/channels/runtime.d.ts +2 -10
  259. package/node_modules/@murphai/assistant-engine/dist/assistant/channels/runtime.d.ts.map +1 -1
  260. package/node_modules/@murphai/assistant-engine/dist/assistant/channels/runtime.js +80 -61
  261. package/node_modules/@murphai/assistant-engine/dist/assistant/channels/runtime.js.map +1 -1
  262. package/node_modules/@murphai/assistant-engine/dist/assistant/channels/types.d.ts +31 -20
  263. package/node_modules/@murphai/assistant-engine/dist/assistant/channels/types.d.ts.map +1 -1
  264. package/node_modules/@murphai/assistant-engine/dist/assistant/channels/types.js.map +1 -1
  265. package/node_modules/@murphai/assistant-engine/dist/assistant/cli-surface-bootstrap.d.ts +5 -24
  266. package/node_modules/@murphai/assistant-engine/dist/assistant/cli-surface-bootstrap.d.ts.map +1 -1
  267. package/node_modules/@murphai/assistant-engine/dist/assistant/cli-surface-bootstrap.js +95 -228
  268. package/node_modules/@murphai/assistant-engine/dist/assistant/cli-surface-bootstrap.js.map +1 -1
  269. package/node_modules/@murphai/assistant-engine/dist/assistant/cli-surface-contract.generated.json +4 -0
  270. package/node_modules/@murphai/assistant-engine/dist/assistant/cli-surface-manifest.js.map +1 -1
  271. package/node_modules/@murphai/assistant-engine/dist/assistant/codex-contract-fingerprint.js.map +1 -1
  272. package/node_modules/@murphai/assistant-engine/dist/assistant/codex-resume-binding.d.ts +4 -0
  273. package/node_modules/@murphai/assistant-engine/dist/assistant/codex-resume-binding.d.ts.map +1 -1
  274. package/node_modules/@murphai/assistant-engine/dist/assistant/codex-resume-binding.js +24 -5
  275. package/node_modules/@murphai/assistant-engine/dist/assistant/codex-resume-binding.js.map +1 -1
  276. package/node_modules/@murphai/assistant-engine/dist/assistant/codex-thread-route.d.ts +2 -0
  277. package/node_modules/@murphai/assistant-engine/dist/assistant/codex-thread-route.d.ts.map +1 -1
  278. package/node_modules/@murphai/assistant-engine/dist/assistant/codex-thread-route.js +26 -0
  279. package/node_modules/@murphai/assistant-engine/dist/assistant/codex-thread-route.js.map +1 -1
  280. package/node_modules/@murphai/assistant-engine/dist/assistant/codex-turn/attempt-observability.d.ts +0 -29
  281. package/node_modules/@murphai/assistant-engine/dist/assistant/codex-turn/attempt-observability.d.ts.map +1 -1
  282. package/node_modules/@murphai/assistant-engine/dist/assistant/codex-turn/attempt-observability.js +50 -129
  283. package/node_modules/@murphai/assistant-engine/dist/assistant/codex-turn/attempt-observability.js.map +1 -1
  284. package/node_modules/@murphai/assistant-engine/dist/assistant/codex-turn/planning.d.ts +22 -19
  285. package/node_modules/@murphai/assistant-engine/dist/assistant/codex-turn/planning.d.ts.map +1 -1
  286. package/node_modules/@murphai/assistant-engine/dist/assistant/codex-turn/planning.js +186 -109
  287. package/node_modules/@murphai/assistant-engine/dist/assistant/codex-turn/planning.js.map +1 -1
  288. package/node_modules/@murphai/assistant-engine/dist/assistant/codex-turn-runner.d.ts +9 -8
  289. package/node_modules/@murphai/assistant-engine/dist/assistant/codex-turn-runner.d.ts.map +1 -1
  290. package/node_modules/@murphai/assistant-engine/dist/assistant/codex-turn-runner.js +42 -73
  291. package/node_modules/@murphai/assistant-engine/dist/assistant/codex-turn-runner.js.map +1 -1
  292. package/node_modules/@murphai/assistant-engine/dist/assistant/context-snapshot.d.ts +3 -2
  293. package/node_modules/@murphai/assistant-engine/dist/assistant/context-snapshot.d.ts.map +1 -1
  294. package/node_modules/@murphai/assistant-engine/dist/assistant/context-snapshot.js +83 -91
  295. package/node_modules/@murphai/assistant-engine/dist/assistant/context-snapshot.js.map +1 -1
  296. package/node_modules/@murphai/assistant-engine/dist/assistant/conversation-policy.d.ts +4 -2
  297. package/node_modules/@murphai/assistant-engine/dist/assistant/conversation-policy.d.ts.map +1 -1
  298. package/node_modules/@murphai/assistant-engine/dist/assistant/conversation-policy.js +48 -11
  299. package/node_modules/@murphai/assistant-engine/dist/assistant/conversation-policy.js.map +1 -1
  300. package/node_modules/@murphai/assistant-engine/dist/assistant/conversation-ref.d.ts +1 -1
  301. package/node_modules/@murphai/assistant-engine/dist/assistant/conversation-ref.d.ts.map +1 -1
  302. package/node_modules/@murphai/assistant-engine/dist/assistant/cron/canonical-jobs.d.ts +3 -1
  303. package/node_modules/@murphai/assistant-engine/dist/assistant/cron/canonical-jobs.d.ts.map +1 -1
  304. package/node_modules/@murphai/assistant-engine/dist/assistant/cron/canonical-jobs.js +33 -2
  305. package/node_modules/@murphai/assistant-engine/dist/assistant/cron/canonical-jobs.js.map +1 -1
  306. package/node_modules/@murphai/assistant-engine/dist/assistant/cron/delivery-reconciliation.d.ts.map +1 -1
  307. package/node_modules/@murphai/assistant-engine/dist/assistant/cron/delivery-reconciliation.js +38 -31
  308. package/node_modules/@murphai/assistant-engine/dist/assistant/cron/delivery-reconciliation.js.map +1 -1
  309. package/node_modules/@murphai/assistant-engine/dist/assistant/cron/execution.d.ts +47 -6
  310. package/node_modules/@murphai/assistant-engine/dist/assistant/cron/execution.d.ts.map +1 -1
  311. package/node_modules/@murphai/assistant-engine/dist/assistant/cron/execution.js +881 -117
  312. package/node_modules/@murphai/assistant-engine/dist/assistant/cron/execution.js.map +1 -1
  313. package/node_modules/@murphai/assistant-engine/dist/assistant/cron/schedule.d.ts.map +1 -1
  314. package/node_modules/@murphai/assistant-engine/dist/assistant/cron/schedule.js +84 -19
  315. package/node_modules/@murphai/assistant-engine/dist/assistant/cron/schedule.js.map +1 -1
  316. package/node_modules/@murphai/assistant-engine/dist/assistant/cron/scheduled-log.d.ts +1 -0
  317. package/node_modules/@murphai/assistant-engine/dist/assistant/cron/scheduled-log.d.ts.map +1 -1
  318. package/node_modules/@murphai/assistant-engine/dist/assistant/cron/scheduled-log.js +1 -0
  319. package/node_modules/@murphai/assistant-engine/dist/assistant/cron/scheduled-log.js.map +1 -1
  320. package/node_modules/@murphai/assistant-engine/dist/assistant/cron/store.d.ts +4 -1
  321. package/node_modules/@murphai/assistant-engine/dist/assistant/cron/store.d.ts.map +1 -1
  322. package/node_modules/@murphai/assistant-engine/dist/assistant/cron/store.js +3 -0
  323. package/node_modules/@murphai/assistant-engine/dist/assistant/cron/store.js.map +1 -1
  324. package/node_modules/@murphai/assistant-engine/dist/assistant/cron/targets.d.ts +7 -1
  325. package/node_modules/@murphai/assistant-engine/dist/assistant/cron/targets.d.ts.map +1 -1
  326. package/node_modules/@murphai/assistant-engine/dist/assistant/cron/targets.js +27 -2
  327. package/node_modules/@murphai/assistant-engine/dist/assistant/cron/targets.js.map +1 -1
  328. package/node_modules/@murphai/assistant-engine/dist/assistant/cron.d.ts +9 -2
  329. package/node_modules/@murphai/assistant-engine/dist/assistant/cron.d.ts.map +1 -1
  330. package/node_modules/@murphai/assistant-engine/dist/assistant/cron.js +134 -65
  331. package/node_modules/@murphai/assistant-engine/dist/assistant/cron.js.map +1 -1
  332. package/node_modules/@murphai/assistant-engine/dist/assistant/delivery-service.d.ts +5 -0
  333. package/node_modules/@murphai/assistant-engine/dist/assistant/delivery-service.d.ts.map +1 -1
  334. package/node_modules/@murphai/assistant-engine/dist/assistant/delivery-service.js +131 -22
  335. package/node_modules/@murphai/assistant-engine/dist/assistant/delivery-service.js.map +1 -1
  336. package/node_modules/@murphai/assistant-engine/dist/assistant/device-activity-automations.d.ts.map +1 -1
  337. package/node_modules/@murphai/assistant-engine/dist/assistant/device-activity-automations.js +58 -90
  338. package/node_modules/@murphai/assistant-engine/dist/assistant/device-activity-automations.js.map +1 -1
  339. package/node_modules/@murphai/assistant-engine/dist/assistant/device-activity-cron-tags.d.ts +4 -0
  340. package/node_modules/@murphai/assistant-engine/dist/assistant/device-activity-cron-tags.d.ts.map +1 -1
  341. package/node_modules/@murphai/assistant-engine/dist/assistant/device-activity-cron-tags.js +9 -3
  342. package/node_modules/@murphai/assistant-engine/dist/assistant/device-activity-cron-tags.js.map +1 -1
  343. package/node_modules/@murphai/assistant-engine/dist/assistant/diagnostics.d.ts.map +1 -1
  344. package/node_modules/@murphai/assistant-engine/dist/assistant/diagnostics.js +6 -0
  345. package/node_modules/@murphai/assistant-engine/dist/assistant/diagnostics.js.map +1 -1
  346. package/node_modules/@murphai/assistant-engine/dist/assistant/execution-context.d.ts +43 -3
  347. package/node_modules/@murphai/assistant-engine/dist/assistant/execution-context.d.ts.map +1 -1
  348. package/node_modules/@murphai/assistant-engine/dist/assistant/execution-context.js +79 -0
  349. package/node_modules/@murphai/assistant-engine/dist/assistant/execution-context.js.map +1 -1
  350. package/node_modules/@murphai/assistant-engine/dist/assistant/experiment-support-automations.d.ts +5 -3
  351. package/node_modules/@murphai/assistant-engine/dist/assistant/experiment-support-automations.d.ts.map +1 -1
  352. package/node_modules/@murphai/assistant-engine/dist/assistant/experiment-support-automations.js +73 -6
  353. package/node_modules/@murphai/assistant-engine/dist/assistant/experiment-support-automations.js.map +1 -1
  354. package/node_modules/@murphai/assistant-engine/dist/assistant/fault-injection.js.map +1 -1
  355. package/node_modules/@murphai/assistant-engine/dist/assistant/first-contact-welcome.d.ts +1 -1
  356. package/node_modules/@murphai/assistant-engine/dist/assistant/first-contact-welcome.d.ts.map +1 -1
  357. package/node_modules/@murphai/assistant-engine/dist/assistant/generate-cli-surface-contract.js +1 -2
  358. package/node_modules/@murphai/assistant-engine/dist/assistant/generate-cli-surface-contract.js.map +1 -1
  359. package/node_modules/@murphai/assistant-engine/dist/assistant/hosted-context-diagnostics.d.ts +1 -1
  360. package/node_modules/@murphai/assistant-engine/dist/assistant/hosted-context-diagnostics.d.ts.map +1 -1
  361. package/node_modules/@murphai/assistant-engine/dist/assistant/hosted-context-diagnostics.js +0 -27
  362. package/node_modules/@murphai/assistant-engine/dist/assistant/hosted-context-diagnostics.js.map +1 -1
  363. package/node_modules/@murphai/assistant-engine/dist/assistant/hosted-mailbox-input-items.d.ts +22 -2
  364. package/node_modules/@murphai/assistant-engine/dist/assistant/hosted-mailbox-input-items.d.ts.map +1 -1
  365. package/node_modules/@murphai/assistant-engine/dist/assistant/hosted-mailbox-input-items.js +78 -4
  366. package/node_modules/@murphai/assistant-engine/dist/assistant/hosted-mailbox-input-items.js.map +1 -1
  367. package/node_modules/@murphai/assistant-engine/dist/assistant/hosted-tool-context.d.ts +46 -3
  368. package/node_modules/@murphai/assistant-engine/dist/assistant/hosted-tool-context.d.ts.map +1 -1
  369. package/node_modules/@murphai/assistant-engine/dist/assistant/hosted-tool-context.js +47 -5
  370. package/node_modules/@murphai/assistant-engine/dist/assistant/hosted-tool-context.js.map +1 -1
  371. package/node_modules/@murphai/assistant-engine/dist/assistant/hosted-turn-timing.d.ts +1 -0
  372. package/node_modules/@murphai/assistant-engine/dist/assistant/hosted-turn-timing.d.ts.map +1 -1
  373. package/node_modules/@murphai/assistant-engine/dist/assistant/hosted-turn-timing.js +1 -0
  374. package/node_modules/@murphai/assistant-engine/dist/assistant/hosted-turn-timing.js.map +1 -1
  375. package/node_modules/@murphai/assistant-engine/dist/assistant/inbox-attachment-evidence.js +23 -12
  376. package/node_modules/@murphai/assistant-engine/dist/assistant/inbox-attachment-evidence.js.map +1 -1
  377. package/node_modules/@murphai/assistant-engine/dist/assistant/input-source.d.ts +8 -0
  378. package/node_modules/@murphai/assistant-engine/dist/assistant/input-source.d.ts.map +1 -1
  379. package/node_modules/@murphai/assistant-engine/dist/assistant/input-source.js +37 -6
  380. package/node_modules/@murphai/assistant-engine/dist/assistant/input-source.js.map +1 -1
  381. package/node_modules/@murphai/assistant-engine/dist/assistant/input-store.d.ts +109 -44
  382. package/node_modules/@murphai/assistant-engine/dist/assistant/input-store.d.ts.map +1 -1
  383. package/node_modules/@murphai/assistant-engine/dist/assistant/input-store.js +46 -10
  384. package/node_modules/@murphai/assistant-engine/dist/assistant/input-store.js.map +1 -1
  385. package/node_modules/@murphai/assistant-engine/dist/assistant/local-service.d.ts.map +1 -1
  386. package/node_modules/@murphai/assistant-engine/dist/assistant/local-service.js +335 -120
  387. package/node_modules/@murphai/assistant-engine/dist/assistant/local-service.js.map +1 -1
  388. package/node_modules/@murphai/assistant-engine/dist/assistant/maintenance-evidence.d.ts +7 -0
  389. package/node_modules/@murphai/assistant-engine/dist/assistant/maintenance-evidence.d.ts.map +1 -0
  390. package/node_modules/@murphai/assistant-engine/dist/assistant/maintenance-evidence.js +101 -0
  391. package/node_modules/@murphai/assistant-engine/dist/assistant/maintenance-evidence.js.map +1 -0
  392. package/node_modules/@murphai/assistant-engine/dist/assistant/managed-automations.d.ts +69 -1
  393. package/node_modules/@murphai/assistant-engine/dist/assistant/managed-automations.d.ts.map +1 -1
  394. package/node_modules/@murphai/assistant-engine/dist/assistant/managed-automations.js +234 -49
  395. package/node_modules/@murphai/assistant-engine/dist/assistant/managed-automations.js.map +1 -1
  396. package/node_modules/@murphai/assistant-engine/dist/assistant/model-behavior.d.ts +1 -1
  397. package/node_modules/@murphai/assistant-engine/dist/assistant/model-behavior.d.ts.map +1 -1
  398. package/node_modules/@murphai/assistant-engine/dist/assistant/model-behavior.js +3 -4
  399. package/node_modules/@murphai/assistant-engine/dist/assistant/model-behavior.js.map +1 -1
  400. package/node_modules/@murphai/assistant-engine/dist/assistant/newsletter-outbox.d.ts +12 -0
  401. package/node_modules/@murphai/assistant-engine/dist/assistant/newsletter-outbox.d.ts.map +1 -0
  402. package/node_modules/@murphai/assistant-engine/dist/assistant/newsletter-outbox.js +294 -0
  403. package/node_modules/@murphai/assistant-engine/dist/assistant/newsletter-outbox.js.map +1 -0
  404. package/node_modules/@murphai/assistant-engine/dist/assistant/notification-turn.d.ts +20 -1
  405. package/node_modules/@murphai/assistant-engine/dist/assistant/notification-turn.d.ts.map +1 -1
  406. package/node_modules/@murphai/assistant-engine/dist/assistant/notification-turn.js +556 -113
  407. package/node_modules/@murphai/assistant-engine/dist/assistant/notification-turn.js.map +1 -1
  408. package/node_modules/@murphai/assistant-engine/dist/assistant/onboarding-followup-automation.d.ts.map +1 -1
  409. package/node_modules/@murphai/assistant-engine/dist/assistant/onboarding-followup-automation.js +11 -9
  410. package/node_modules/@murphai/assistant-engine/dist/assistant/onboarding-followup-automation.js.map +1 -1
  411. package/node_modules/@murphai/assistant-engine/dist/assistant/onboarding-state.d.ts.map +1 -1
  412. package/node_modules/@murphai/assistant-engine/dist/assistant/operator-authority.d.ts +1 -1
  413. package/node_modules/@murphai/assistant-engine/dist/assistant/operator-authority.d.ts.map +1 -1
  414. package/node_modules/@murphai/assistant-engine/dist/assistant/outbox/dispatch-state.d.ts +3 -0
  415. package/node_modules/@murphai/assistant-engine/dist/assistant/outbox/dispatch-state.d.ts.map +1 -1
  416. package/node_modules/@murphai/assistant-engine/dist/assistant/outbox/dispatch-state.js +132 -21
  417. package/node_modules/@murphai/assistant-engine/dist/assistant/outbox/dispatch-state.js.map +1 -1
  418. package/node_modules/@murphai/assistant-engine/dist/assistant/outbox/ordering.d.ts +7 -0
  419. package/node_modules/@murphai/assistant-engine/dist/assistant/outbox/ordering.d.ts.map +1 -0
  420. package/node_modules/@murphai/assistant-engine/dist/assistant/outbox/ordering.js +140 -0
  421. package/node_modules/@murphai/assistant-engine/dist/assistant/outbox/ordering.js.map +1 -0
  422. package/node_modules/@murphai/assistant-engine/dist/assistant/outbox/retry-policy.d.ts +3 -0
  423. package/node_modules/@murphai/assistant-engine/dist/assistant/outbox/retry-policy.d.ts.map +1 -1
  424. package/node_modules/@murphai/assistant-engine/dist/assistant/outbox/retry-policy.js +79 -1
  425. package/node_modules/@murphai/assistant-engine/dist/assistant/outbox/retry-policy.js.map +1 -1
  426. package/node_modules/@murphai/assistant-engine/dist/assistant/outbox/store.d.ts.map +1 -1
  427. package/node_modules/@murphai/assistant-engine/dist/assistant/outbox/store.js +28 -2
  428. package/node_modules/@murphai/assistant-engine/dist/assistant/outbox/store.js.map +1 -1
  429. package/node_modules/@murphai/assistant-engine/dist/assistant/outbox.d.ts +20 -0
  430. package/node_modules/@murphai/assistant-engine/dist/assistant/outbox.d.ts.map +1 -1
  431. package/node_modules/@murphai/assistant-engine/dist/assistant/outbox.js +154 -19
  432. package/node_modules/@murphai/assistant-engine/dist/assistant/outbox.js.map +1 -1
  433. package/node_modules/@murphai/assistant-engine/dist/assistant/progress-constants.d.ts +7 -2
  434. package/node_modules/@murphai/assistant-engine/dist/assistant/progress-constants.d.ts.map +1 -1
  435. package/node_modules/@murphai/assistant-engine/dist/assistant/progress-constants.js +16 -2
  436. package/node_modules/@murphai/assistant-engine/dist/assistant/progress-constants.js.map +1 -1
  437. package/node_modules/@murphai/assistant-engine/dist/assistant/provider-progress.d.ts +1 -1
  438. package/node_modules/@murphai/assistant-engine/dist/assistant/provider-progress.d.ts.map +1 -1
  439. package/node_modules/@murphai/assistant-engine/dist/assistant/providers/codex-cli.d.ts.map +1 -1
  440. package/node_modules/@murphai/assistant-engine/dist/assistant/providers/codex-cli.js +55 -173
  441. package/node_modules/@murphai/assistant-engine/dist/assistant/providers/codex-cli.js.map +1 -1
  442. package/node_modules/@murphai/assistant-engine/dist/assistant/providers/helpers.d.ts.map +1 -1
  443. package/node_modules/@murphai/assistant-engine/dist/assistant/providers/helpers.js +5 -3
  444. package/node_modules/@murphai/assistant-engine/dist/assistant/providers/helpers.js.map +1 -1
  445. package/node_modules/@murphai/assistant-engine/dist/assistant/providers/types.d.ts +24 -25
  446. package/node_modules/@murphai/assistant-engine/dist/assistant/providers/types.d.ts.map +1 -1
  447. package/node_modules/@murphai/assistant-engine/dist/assistant/providers/types.js.map +1 -1
  448. package/node_modules/@murphai/assistant-engine/dist/assistant/receipts.d.ts +1 -0
  449. package/node_modules/@murphai/assistant-engine/dist/assistant/receipts.d.ts.map +1 -1
  450. package/node_modules/@murphai/assistant-engine/dist/assistant/reply-bubbles.d.ts +6 -0
  451. package/node_modules/@murphai/assistant-engine/dist/assistant/reply-bubbles.d.ts.map +1 -0
  452. package/node_modules/@murphai/assistant-engine/dist/assistant/reply-bubbles.js +47 -0
  453. package/node_modules/@murphai/assistant-engine/dist/assistant/reply-bubbles.js.map +1 -0
  454. package/node_modules/@murphai/assistant-engine/dist/assistant/reply-delivery-context.d.ts +1 -1
  455. package/node_modules/@murphai/assistant-engine/dist/assistant/reply-delivery-context.d.ts.map +1 -1
  456. package/node_modules/@murphai/assistant-engine/dist/assistant/reply-delivery-context.js +8 -0
  457. package/node_modules/@murphai/assistant-engine/dist/assistant/reply-delivery-context.js.map +1 -1
  458. package/node_modules/@murphai/assistant-engine/dist/assistant/runtime-budget-policy.d.ts.map +1 -1
  459. package/node_modules/@murphai/assistant-engine/dist/assistant/runtime-budgets.d.ts +2 -0
  460. package/node_modules/@murphai/assistant-engine/dist/assistant/runtime-budgets.d.ts.map +1 -1
  461. package/node_modules/@murphai/assistant-engine/dist/assistant/runtime-budgets.js +92 -40
  462. package/node_modules/@murphai/assistant-engine/dist/assistant/runtime-budgets.js.map +1 -1
  463. package/node_modules/@murphai/assistant-engine/dist/assistant/runtime-residue.d.ts +3 -0
  464. package/node_modules/@murphai/assistant-engine/dist/assistant/runtime-residue.d.ts.map +1 -1
  465. package/node_modules/@murphai/assistant-engine/dist/assistant/runtime-residue.js +107 -37
  466. package/node_modules/@murphai/assistant-engine/dist/assistant/runtime-residue.js.map +1 -1
  467. package/node_modules/@murphai/assistant-engine/dist/assistant/runtime-write-lock.d.ts +1 -1
  468. package/node_modules/@murphai/assistant-engine/dist/assistant/runtime-write-lock.d.ts.map +1 -1
  469. package/node_modules/@murphai/assistant-engine/dist/assistant/runtime-write-lock.js +2 -2
  470. package/node_modules/@murphai/assistant-engine/dist/assistant/runtime-write-lock.js.map +1 -1
  471. package/node_modules/@murphai/assistant-engine/dist/assistant/service-contracts.d.ts +15 -3
  472. package/node_modules/@murphai/assistant-engine/dist/assistant/service-contracts.d.ts.map +1 -1
  473. package/node_modules/@murphai/assistant-engine/dist/assistant/service-turn-routes.d.ts.map +1 -1
  474. package/node_modules/@murphai/assistant-engine/dist/assistant/service-turn-routes.js +11 -2
  475. package/node_modules/@murphai/assistant-engine/dist/assistant/service-turn-routes.js.map +1 -1
  476. package/node_modules/@murphai/assistant-engine/dist/assistant/service-usage.d.ts +2 -0
  477. package/node_modules/@murphai/assistant-engine/dist/assistant/service-usage.d.ts.map +1 -1
  478. package/node_modules/@murphai/assistant-engine/dist/assistant/service-usage.js +9 -1
  479. package/node_modules/@murphai/assistant-engine/dist/assistant/service-usage.js.map +1 -1
  480. package/node_modules/@murphai/assistant-engine/dist/assistant/service.d.ts +29 -24
  481. package/node_modules/@murphai/assistant-engine/dist/assistant/service.d.ts.map +1 -1
  482. package/node_modules/@murphai/assistant-engine/dist/assistant/service.js +5 -0
  483. package/node_modules/@murphai/assistant-engine/dist/assistant/service.js.map +1 -1
  484. package/node_modules/@murphai/assistant-engine/dist/assistant/session-resolution.d.ts +1 -1
  485. package/node_modules/@murphai/assistant-engine/dist/assistant/session-resolution.d.ts.map +1 -1
  486. package/node_modules/@murphai/assistant-engine/dist/assistant/session-resolution.js +81 -13
  487. package/node_modules/@murphai/assistant-engine/dist/assistant/session-resolution.js.map +1 -1
  488. package/node_modules/@murphai/assistant-engine/dist/assistant/state-write-lock.d.ts +1 -1
  489. package/node_modules/@murphai/assistant-engine/dist/assistant/state-write-lock.d.ts.map +1 -1
  490. package/node_modules/@murphai/assistant-engine/dist/assistant/state-write-lock.js +35 -5
  491. package/node_modules/@murphai/assistant-engine/dist/assistant/state-write-lock.js.map +1 -1
  492. package/node_modules/@murphai/assistant-engine/dist/assistant/status.d.ts.map +1 -1
  493. package/node_modules/@murphai/assistant-engine/dist/assistant/status.js +36 -4
  494. package/node_modules/@murphai/assistant-engine/dist/assistant/status.js.map +1 -1
  495. package/node_modules/@murphai/assistant-engine/dist/assistant/store/paths.d.ts +1 -0
  496. package/node_modules/@murphai/assistant-engine/dist/assistant/store/paths.d.ts.map +1 -1
  497. package/node_modules/@murphai/assistant-engine/dist/assistant/store/paths.js +23 -1
  498. package/node_modules/@murphai/assistant-engine/dist/assistant/store/paths.js.map +1 -1
  499. package/node_modules/@murphai/assistant-engine/dist/assistant/store/persistence.d.ts +6 -3
  500. package/node_modules/@murphai/assistant-engine/dist/assistant/store/persistence.d.ts.map +1 -1
  501. package/node_modules/@murphai/assistant-engine/dist/assistant/store/persistence.js +137 -16
  502. package/node_modules/@murphai/assistant-engine/dist/assistant/store/persistence.js.map +1 -1
  503. package/node_modules/@murphai/assistant-engine/dist/assistant/store/types.d.ts +1 -0
  504. package/node_modules/@murphai/assistant-engine/dist/assistant/store/types.d.ts.map +1 -1
  505. package/node_modules/@murphai/assistant-engine/dist/assistant/store.d.ts +6 -1
  506. package/node_modules/@murphai/assistant-engine/dist/assistant/store.d.ts.map +1 -1
  507. package/node_modules/@murphai/assistant-engine/dist/assistant/store.js +94 -22
  508. package/node_modules/@murphai/assistant-engine/dist/assistant/store.js.map +1 -1
  509. package/node_modules/@murphai/assistant-engine/dist/assistant/system-prompt.d.ts +16 -6
  510. package/node_modules/@murphai/assistant-engine/dist/assistant/system-prompt.d.ts.map +1 -1
  511. package/node_modules/@murphai/assistant-engine/dist/assistant/system-prompt.js +546 -230
  512. package/node_modules/@murphai/assistant-engine/dist/assistant/system-prompt.js.map +1 -1
  513. package/node_modules/@murphai/assistant-engine/dist/assistant/transcript-audit.js.map +1 -1
  514. package/node_modules/@murphai/assistant-engine/dist/assistant/turn-finalizer.d.ts +16 -0
  515. package/node_modules/@murphai/assistant-engine/dist/assistant/turn-finalizer.d.ts.map +1 -1
  516. package/node_modules/@murphai/assistant-engine/dist/assistant/turn-finalizer.js +58 -10
  517. package/node_modules/@murphai/assistant-engine/dist/assistant/turn-finalizer.js.map +1 -1
  518. package/node_modules/@murphai/assistant-engine/dist/assistant/turn-input.d.ts +2 -0
  519. package/node_modules/@murphai/assistant-engine/dist/assistant/turn-input.d.ts.map +1 -1
  520. package/node_modules/@murphai/assistant-engine/dist/assistant/turn-input.js.map +1 -1
  521. package/node_modules/@murphai/assistant-engine/dist/assistant/turn-plan.d.ts.map +1 -1
  522. package/node_modules/@murphai/assistant-engine/dist/assistant/turn-plan.js +1 -0
  523. package/node_modules/@murphai/assistant-engine/dist/assistant/turn-plan.js.map +1 -1
  524. package/node_modules/@murphai/assistant-engine/dist/assistant/turn-progress.d.ts +3 -6
  525. package/node_modules/@murphai/assistant-engine/dist/assistant/turn-progress.d.ts.map +1 -1
  526. package/node_modules/@murphai/assistant-engine/dist/assistant/turn-progress.js +29 -22
  527. package/node_modules/@murphai/assistant-engine/dist/assistant/turn-progress.js.map +1 -1
  528. package/node_modules/@murphai/assistant-engine/dist/assistant/turns.d.ts +7 -1
  529. package/node_modules/@murphai/assistant-engine/dist/assistant/turns.d.ts.map +1 -1
  530. package/node_modules/@murphai/assistant-engine/dist/assistant/turns.js +33 -5
  531. package/node_modules/@murphai/assistant-engine/dist/assistant/turns.js.map +1 -1
  532. package/node_modules/@murphai/assistant-engine/dist/assistant/usage-attribution.d.ts +1 -1
  533. package/node_modules/@murphai/assistant-engine/dist/assistant/usage-attribution.d.ts.map +1 -1
  534. package/node_modules/@murphai/assistant-engine/dist/assistant/usage-attribution.js.map +1 -1
  535. package/node_modules/@murphai/assistant-engine/dist/assistant/vault-file-send.d.ts +12 -1
  536. package/node_modules/@murphai/assistant-engine/dist/assistant/vault-file-send.d.ts.map +1 -1
  537. package/node_modules/@murphai/assistant-engine/dist/assistant/vault-file-send.js +53 -1
  538. package/node_modules/@murphai/assistant-engine/dist/assistant/vault-file-send.js.map +1 -1
  539. package/node_modules/@murphai/assistant-engine/dist/assistant-ask.d.ts +70 -0
  540. package/node_modules/@murphai/assistant-engine/dist/assistant-ask.d.ts.map +1 -0
  541. package/node_modules/@murphai/assistant-engine/dist/assistant-ask.js +218 -0
  542. package/node_modules/@murphai/assistant-engine/dist/assistant-ask.js.map +1 -0
  543. package/node_modules/@murphai/assistant-engine/dist/assistant-channel-adapters.d.ts +2 -2
  544. package/node_modules/@murphai/assistant-engine/dist/assistant-channel-adapters.d.ts.map +1 -1
  545. package/node_modules/@murphai/assistant-engine/dist/assistant-channel-adapters.js +1 -1
  546. package/node_modules/@murphai/assistant-engine/dist/assistant-channel-adapters.js.map +1 -1
  547. package/node_modules/@murphai/assistant-engine/dist/assistant-channel-runtime.d.ts +1 -1
  548. package/node_modules/@murphai/assistant-engine/dist/assistant-channel-runtime.d.ts.map +1 -1
  549. package/node_modules/@murphai/assistant-engine/dist/assistant-channel-runtime.js +1 -1
  550. package/node_modules/@murphai/assistant-engine/dist/assistant-channel-runtime.js.map +1 -1
  551. package/node_modules/@murphai/assistant-engine/dist/assistant-cli-access.d.ts.map +1 -1
  552. package/node_modules/@murphai/assistant-engine/dist/assistant-cli-access.js +4 -1
  553. package/node_modules/@murphai/assistant-engine/dist/assistant-cli-access.js.map +1 -1
  554. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/app-server-requests.d.ts.map +1 -1
  555. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/app-server-requests.js +25 -1
  556. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/app-server-requests.js.map +1 -1
  557. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/app-server-rpc.d.ts +5 -0
  558. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/app-server-rpc.d.ts.map +1 -1
  559. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/app-server-rpc.js +12 -5
  560. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/app-server-rpc.js.map +1 -1
  561. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/assistant-style.d.ts +82 -0
  562. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/assistant-style.d.ts.map +1 -0
  563. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/assistant-style.js +190 -0
  564. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/assistant-style.js.map +1 -0
  565. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/connected-apps.d.ts +18 -18
  566. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/connected-apps.d.ts.map +1 -1
  567. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/connected-apps.js +2 -2
  568. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/connected-apps.js.map +1 -1
  569. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/generate-song.d.ts +8 -8
  570. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/generate-song.d.ts.map +1 -1
  571. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/generate-song.js +1 -1
  572. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/generate-song.js.map +1 -1
  573. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/generate-voice-memo.d.ts +10 -10
  574. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/generate-voice-memo.d.ts.map +1 -1
  575. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/phone-calls.d.ts +4 -3
  576. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/phone-calls.d.ts.map +1 -1
  577. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/phone-calls.js +17 -8
  578. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/phone-calls.js.map +1 -1
  579. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools.d.ts +1273 -268
  580. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools.d.ts.map +1 -1
  581. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools.js +1724 -34
  582. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools.js.map +1 -1
  583. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/failures.d.ts +1 -1
  584. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/failures.d.ts.map +1 -1
  585. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/failures.js +4 -13
  586. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/failures.js.map +1 -1
  587. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/generate-image-tool.d.ts +3 -3
  588. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/generate-image-tool.d.ts.map +1 -1
  589. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/generate-image-tool.js +352 -74
  590. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/generate-image-tool.js.map +1 -1
  591. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/generate-voice-memo-tool.d.ts +1 -0
  592. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/generate-voice-memo-tool.d.ts.map +1 -1
  593. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/generate-voice-memo-tool.js +6 -12
  594. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/generate-voice-memo-tool.js.map +1 -1
  595. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/image-reference-resolver.d.ts +2 -3
  596. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/image-reference-resolver.d.ts.map +1 -1
  597. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/image-reference-resolver.js +89 -39
  598. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/image-reference-resolver.js.map +1 -1
  599. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/openai-image-generation.d.ts +1 -1
  600. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/openai-image-generation.js +4 -4
  601. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/openai-image-generation.js.map +1 -1
  602. package/node_modules/@murphai/assistant-engine/dist/assistant-codex-events.d.ts +2 -2
  603. package/node_modules/@murphai/assistant-engine/dist/assistant-codex-events.d.ts.map +1 -1
  604. package/node_modules/@murphai/assistant-engine/dist/assistant-codex-events.js +1 -6
  605. package/node_modules/@murphai/assistant-engine/dist/assistant-codex-events.js.map +1 -1
  606. package/node_modules/@murphai/assistant-engine/dist/assistant-codex.d.ts +23 -15
  607. package/node_modules/@murphai/assistant-engine/dist/assistant-codex.d.ts.map +1 -1
  608. package/node_modules/@murphai/assistant-engine/dist/assistant-codex.js +868 -533
  609. package/node_modules/@murphai/assistant-engine/dist/assistant-codex.js.map +1 -1
  610. package/node_modules/@murphai/assistant-engine/dist/assistant-service.d.ts +1 -1
  611. package/node_modules/@murphai/assistant-engine/dist/assistant-service.d.ts.map +1 -1
  612. package/node_modules/@murphai/assistant-engine/dist/assistant-service.js +1 -1
  613. package/node_modules/@murphai/assistant-engine/dist/assistant-service.js.map +1 -1
  614. package/node_modules/@murphai/assistant-engine/dist/assistant-skill-assets.d.ts +140 -48
  615. package/node_modules/@murphai/assistant-engine/dist/assistant-skill-assets.d.ts.map +1 -1
  616. package/node_modules/@murphai/assistant-engine/dist/assistant-skill-assets.js +118 -3
  617. package/node_modules/@murphai/assistant-engine/dist/assistant-skill-assets.js.map +1 -1
  618. package/node_modules/@murphai/assistant-engine/dist/assistant-skill-env.d.ts +2 -2
  619. package/node_modules/@murphai/assistant-engine/dist/attachment-prompt-contracts.d.ts +17 -17
  620. package/node_modules/@murphai/assistant-engine/dist/attachment-prompt-contracts.d.ts.map +1 -1
  621. package/node_modules/@murphai/assistant-engine/dist/codex-lifecycle.d.ts +3 -1
  622. package/node_modules/@murphai/assistant-engine/dist/codex-lifecycle.d.ts.map +1 -1
  623. package/node_modules/@murphai/assistant-engine/dist/codex-lifecycle.js +7 -1
  624. package/node_modules/@murphai/assistant-engine/dist/codex-lifecycle.js.map +1 -1
  625. package/node_modules/@murphai/assistant-engine/dist/inbox-routing-vision.d.ts +2 -2
  626. package/node_modules/@murphai/assistant-engine/dist/inbox-routing-vision.d.ts.map +1 -1
  627. package/node_modules/@murphai/assistant-engine/dist/index.d.ts +2 -0
  628. package/node_modules/@murphai/assistant-engine/dist/index.d.ts.map +1 -1
  629. package/node_modules/@murphai/assistant-engine/dist/index.js +1 -0
  630. package/node_modules/@murphai/assistant-engine/dist/index.js.map +1 -1
  631. package/node_modules/@murphai/assistant-engine/dist/knowledge/service.js.map +1 -1
  632. package/node_modules/@murphai/assistant-engine/dist/outbound-channel.d.ts +3 -2
  633. package/node_modules/@murphai/assistant-engine/dist/outbound-channel.d.ts.map +1 -1
  634. package/node_modules/@murphai/assistant-engine/dist/outbound-channel.js +4 -2
  635. package/node_modules/@murphai/assistant-engine/dist/outbound-channel.js.map +1 -1
  636. package/node_modules/@murphai/assistant-engine/package.json +4 -0
  637. package/node_modules/@murphai/assistant-engine/skills/aerobic-fitness/SKILL.md +56 -0
  638. package/node_modules/@murphai/assistant-engine/skills/appointment-scheduling/SKILL.md +249 -0
  639. package/node_modules/@murphai/assistant-engine/skills/behavior-followthrough/SKILL.md +18 -9
  640. package/node_modules/@murphai/assistant-engine/skills/body-composition/SKILL.md +56 -0
  641. package/node_modules/@murphai/assistant-engine/skills/cardiometabolic-health/SKILL.md +56 -0
  642. package/node_modules/@murphai/assistant-engine/skills/circadian-rhythm/SKILL.md +57 -0
  643. package/node_modules/@murphai/assistant-engine/skills/cognitive-focus/SKILL.md +55 -0
  644. package/node_modules/@murphai/assistant-engine/skills/computer-use/SKILL.md +163 -121
  645. package/node_modules/@murphai/assistant-engine/skills/computer-use/references/health-browser-playbook.md +16 -9
  646. package/node_modules/@murphai/assistant-engine/skills/cycle-hormonal-health/SKILL.md +55 -0
  647. package/node_modules/@murphai/assistant-engine/skills/daily-activity/SKILL.md +55 -0
  648. package/node_modules/@murphai/assistant-engine/skills/energy-fatigue/SKILL.md +57 -0
  649. package/node_modules/@murphai/assistant-engine/skills/experiment-onboarding/SKILL.md +24 -10
  650. package/node_modules/@murphai/assistant-engine/skills/food-journal/SKILL.md +26 -0
  651. package/node_modules/@murphai/assistant-engine/skills/general-eye-health/SKILL.md +77 -0
  652. package/node_modules/@murphai/assistant-engine/skills/general-eye-health/references/evidence-register.md +34 -0
  653. package/node_modules/@murphai/assistant-engine/skills/general-eye-health/references/triage-and-contact-lenses.md +103 -0
  654. package/node_modules/@murphai/assistant-engine/skills/group-challenge/SKILL.md +346 -0
  655. package/node_modules/@murphai/assistant-engine/skills/group-chat/SKILL.md +296 -0
  656. package/node_modules/@murphai/assistant-engine/skills/group-newsletter/SKILL.md +210 -0
  657. package/node_modules/@murphai/assistant-engine/skills/groupchat-comedy/SKILL.md +182 -0
  658. package/node_modules/@murphai/assistant-engine/skills/gut-digestion/SKILL.md +57 -0
  659. package/node_modules/@murphai/assistant-engine/skills/hrv-resting-heart-rate/SKILL.md +55 -0
  660. package/node_modules/@murphai/assistant-engine/skills/micronutrients-supplements/SKILL.md +80 -0
  661. package/node_modules/@murphai/assistant-engine/skills/mobility-posture/SKILL.md +56 -0
  662. package/node_modules/@murphai/assistant-engine/skills/murph-onboarding/SKILL.md +358 -124
  663. package/node_modules/@murphai/assistant-engine/skills/music-generation/SKILL.md +162 -0
  664. package/node_modules/@murphai/assistant-engine/skills/nutrition-strategy/SKILL.md +73 -109
  665. package/node_modules/@murphai/assistant-engine/skills/physical-therapy/SKILL.md +3 -1
  666. package/node_modules/@murphai/assistant-engine/skills/recovery-modalities/SKILL.md +57 -0
  667. package/node_modules/@murphai/assistant-engine/skills/red-light-therapy/SKILL.md +145 -0
  668. package/node_modules/@murphai/assistant-engine/skills/red-light-therapy/device-seeds.json +259 -0
  669. package/node_modules/@murphai/assistant-engine/skills/shared/exercise-catalog-runtime.md +29 -0
  670. package/node_modules/@murphai/assistant-engine/skills/shared/murph-character-sheet-v1.png +0 -0
  671. package/node_modules/@murphai/assistant-engine/skills/sleep-improvement/SKILL.md +60 -0
  672. package/node_modules/@murphai/assistant-engine/skills/sleep-recovery-readiness/SKILL.md +68 -178
  673. package/node_modules/@murphai/assistant-engine/skills/strength-training/SKILL.md +1 -1
  674. package/node_modules/@murphai/assistant-engine/skills/substance-load/SKILL.md +56 -0
  675. package/node_modules/@murphai/assistantd/dist/client.js.map +1 -1
  676. package/node_modules/@murphai/assistantd/dist/config.js.map +1 -1
  677. package/node_modules/@murphai/assistantd/dist/http-protocol.d.ts.map +1 -1
  678. package/node_modules/@murphai/assistantd/dist/http-protocol.js.map +1 -1
  679. package/node_modules/@murphai/clinical-records/README.md +82 -0
  680. package/node_modules/@murphai/clinical-records/dist/index.d.ts +1865 -0
  681. package/node_modules/@murphai/clinical-records/dist/index.d.ts.map +1 -0
  682. package/node_modules/@murphai/clinical-records/dist/index.js +488 -0
  683. package/node_modules/@murphai/clinical-records/dist/index.js.map +1 -0
  684. package/node_modules/@murphai/clinical-records/package.json +27 -0
  685. package/node_modules/@murphai/core/dist/atomic-write.d.ts +4 -0
  686. package/node_modules/@murphai/core/dist/atomic-write.d.ts.map +1 -1
  687. package/node_modules/@murphai/core/dist/atomic-write.js +26 -0
  688. package/node_modules/@murphai/core/dist/atomic-write.js.map +1 -1
  689. package/node_modules/@murphai/core/dist/automation.d.ts +8 -2
  690. package/node_modules/@murphai/core/dist/automation.d.ts.map +1 -1
  691. package/node_modules/@murphai/core/dist/automation.js +66 -2
  692. package/node_modules/@murphai/core/dist/automation.js.map +1 -1
  693. package/node_modules/@murphai/core/dist/bank/goals.js.map +1 -1
  694. package/node_modules/@murphai/core/dist/bank/habitat.d.ts +36 -0
  695. package/node_modules/@murphai/core/dist/bank/habitat.d.ts.map +1 -0
  696. package/node_modules/@murphai/core/dist/bank/habitat.js +179 -0
  697. package/node_modules/@murphai/core/dist/bank/habitat.js.map +1 -0
  698. package/node_modules/@murphai/core/dist/bank/regimens.js.map +1 -1
  699. package/node_modules/@murphai/core/dist/constants.d.ts +4 -0
  700. package/node_modules/@murphai/core/dist/constants.d.ts.map +1 -1
  701. package/node_modules/@murphai/core/dist/domains/events/attachment-backed.d.ts +41 -1
  702. package/node_modules/@murphai/core/dist/domains/events/attachment-backed.d.ts.map +1 -1
  703. package/node_modules/@murphai/core/dist/domains/events/attachment-backed.js +311 -5
  704. package/node_modules/@murphai/core/dist/domains/events/attachment-backed.js.map +1 -1
  705. package/node_modules/@murphai/core/dist/domains/events/capture-lookup.d.ts +6 -0
  706. package/node_modules/@murphai/core/dist/domains/events/capture-lookup.d.ts.map +1 -0
  707. package/node_modules/@murphai/core/dist/domains/events/capture-lookup.js +7 -0
  708. package/node_modules/@murphai/core/dist/domains/events/capture-lookup.js.map +1 -0
  709. package/node_modules/@murphai/core/dist/domains/events/ledger.d.ts.map +1 -1
  710. package/node_modules/@murphai/core/dist/domains/events/ledger.js +4 -0
  711. package/node_modules/@murphai/core/dist/domains/events/ledger.js.map +1 -1
  712. package/node_modules/@murphai/core/dist/domains/events.d.ts +2 -2
  713. package/node_modules/@murphai/core/dist/domains/events.d.ts.map +1 -1
  714. package/node_modules/@murphai/core/dist/domains/events.js +1 -1
  715. package/node_modules/@murphai/core/dist/domains/events.js.map +1 -1
  716. package/node_modules/@murphai/core/dist/domains/experiments.d.ts.map +1 -1
  717. package/node_modules/@murphai/core/dist/domains/experiments.js +9 -3
  718. package/node_modules/@murphai/core/dist/domains/experiments.js.map +1 -1
  719. package/node_modules/@murphai/core/dist/domains/shared.js.map +1 -1
  720. package/node_modules/@murphai/core/dist/errors.d.ts.map +1 -1
  721. package/node_modules/@murphai/core/dist/errors.js.map +1 -1
  722. package/node_modules/@murphai/core/dist/event-attachments.d.ts +2 -1
  723. package/node_modules/@murphai/core/dist/event-attachments.d.ts.map +1 -1
  724. package/node_modules/@murphai/core/dist/event-attachments.js +1 -0
  725. package/node_modules/@murphai/core/dist/event-attachments.js.map +1 -1
  726. package/node_modules/@murphai/core/dist/experiment-media-repair.d.ts +33 -0
  727. package/node_modules/@murphai/core/dist/experiment-media-repair.d.ts.map +1 -0
  728. package/node_modules/@murphai/core/dist/experiment-media-repair.js +685 -0
  729. package/node_modules/@murphai/core/dist/experiment-media-repair.js.map +1 -0
  730. package/node_modules/@murphai/core/dist/experiment-storage.d.ts +12 -0
  731. package/node_modules/@murphai/core/dist/experiment-storage.d.ts.map +1 -0
  732. package/node_modules/@murphai/core/dist/experiment-storage.js +70 -0
  733. package/node_modules/@murphai/core/dist/experiment-storage.js.map +1 -0
  734. package/node_modules/@murphai/core/dist/frontmatter.js.map +1 -1
  735. package/node_modules/@murphai/core/dist/fs.d.ts +1 -0
  736. package/node_modules/@murphai/core/dist/fs.d.ts.map +1 -1
  737. package/node_modules/@murphai/core/dist/fs.js +3 -0
  738. package/node_modules/@murphai/core/dist/fs.js.map +1 -1
  739. package/node_modules/@murphai/core/dist/history/api.d.ts +11 -0
  740. package/node_modules/@murphai/core/dist/history/api.d.ts.map +1 -1
  741. package/node_modules/@murphai/core/dist/history/api.js +60 -3
  742. package/node_modules/@murphai/core/dist/history/api.js.map +1 -1
  743. package/node_modules/@murphai/core/dist/history/types.d.ts.map +1 -1
  744. package/node_modules/@murphai/core/dist/ids.js.map +1 -1
  745. package/node_modules/@murphai/core/dist/index.d.ts +12 -6
  746. package/node_modules/@murphai/core/dist/index.d.ts.map +1 -1
  747. package/node_modules/@murphai/core/dist/index.js +6 -4
  748. package/node_modules/@murphai/core/dist/index.js.map +1 -1
  749. package/node_modules/@murphai/core/dist/integration-ingest-migration.d.ts.map +1 -1
  750. package/node_modules/@murphai/core/dist/integration-ingest-migration.js +1 -1
  751. package/node_modules/@murphai/core/dist/integration-ingest-migration.js.map +1 -1
  752. package/node_modules/@murphai/core/dist/integration-ingests.d.ts +73 -2
  753. package/node_modules/@murphai/core/dist/integration-ingests.d.ts.map +1 -1
  754. package/node_modules/@murphai/core/dist/integration-ingests.js +1196 -77
  755. package/node_modules/@murphai/core/dist/integration-ingests.js.map +1 -1
  756. package/node_modules/@murphai/core/dist/jsonl.d.ts +10 -0
  757. package/node_modules/@murphai/core/dist/jsonl.d.ts.map +1 -1
  758. package/node_modules/@murphai/core/dist/jsonl.js +63 -12
  759. package/node_modules/@murphai/core/dist/jsonl.js.map +1 -1
  760. package/node_modules/@murphai/core/dist/markdown-documents.js.map +1 -1
  761. package/node_modules/@murphai/core/dist/memory.d.ts +7 -2
  762. package/node_modules/@murphai/core/dist/memory.d.ts.map +1 -1
  763. package/node_modules/@murphai/core/dist/memory.js +36 -1
  764. package/node_modules/@murphai/core/dist/memory.js.map +1 -1
  765. package/node_modules/@murphai/core/dist/mutations.d.ts +33 -5
  766. package/node_modules/@murphai/core/dist/mutations.d.ts.map +1 -1
  767. package/node_modules/@murphai/core/dist/mutations.js +1684 -205
  768. package/node_modules/@murphai/core/dist/mutations.js.map +1 -1
  769. package/node_modules/@murphai/core/dist/operations/canonical-resource-lock.js.map +1 -1
  770. package/node_modules/@murphai/core/dist/operations/canonical-write-lock.js.map +1 -1
  771. package/node_modules/@murphai/core/dist/operations/index.d.ts +1 -1
  772. package/node_modules/@murphai/core/dist/operations/index.d.ts.map +1 -1
  773. package/node_modules/@murphai/core/dist/operations/index.js +1 -1
  774. package/node_modules/@murphai/core/dist/operations/index.js.map +1 -1
  775. package/node_modules/@murphai/core/dist/operations/write-batch.d.ts +34 -1
  776. package/node_modules/@murphai/core/dist/operations/write-batch.d.ts.map +1 -1
  777. package/node_modules/@murphai/core/dist/operations/write-batch.js +684 -39
  778. package/node_modules/@murphai/core/dist/operations/write-batch.js.map +1 -1
  779. package/node_modules/@murphai/core/dist/path-safety.js.map +1 -1
  780. package/node_modules/@murphai/core/dist/preferences.d.ts +21 -2
  781. package/node_modules/@murphai/core/dist/preferences.d.ts.map +1 -1
  782. package/node_modules/@murphai/core/dist/preferences.js +249 -12
  783. package/node_modules/@murphai/core/dist/preferences.js.map +1 -1
  784. package/node_modules/@murphai/core/dist/public-mutations.d.ts +13 -2
  785. package/node_modules/@murphai/core/dist/public-mutations.d.ts.map +1 -1
  786. package/node_modules/@murphai/core/dist/public-mutations.js +20 -3
  787. package/node_modules/@murphai/core/dist/public-mutations.js.map +1 -1
  788. package/node_modules/@murphai/core/dist/raw-artifact-integrity.js.map +1 -1
  789. package/node_modules/@murphai/core/dist/registry/api.d.ts.map +1 -1
  790. package/node_modules/@murphai/core/dist/scheduled-logs.d.ts +1 -0
  791. package/node_modules/@murphai/core/dist/scheduled-logs.d.ts.map +1 -1
  792. package/node_modules/@murphai/core/dist/scheduled-logs.js +1 -0
  793. package/node_modules/@murphai/core/dist/scheduled-logs.js.map +1 -1
  794. package/node_modules/@murphai/core/dist/vault.d.ts.map +1 -1
  795. package/node_modules/@murphai/core/dist/vault.js +174 -11
  796. package/node_modules/@murphai/core/dist/vault.js.map +1 -1
  797. package/node_modules/@murphai/core/dist/wearable-receipts.js.map +1 -1
  798. package/node_modules/@murphai/core/dist/wearable-storage-migration.js.map +1 -1
  799. package/node_modules/@murphai/core/dist/write-policy.d.ts +3 -0
  800. package/node_modules/@murphai/core/dist/write-policy.d.ts.map +1 -1
  801. package/node_modules/@murphai/core/dist/write-policy.js +54 -3
  802. package/node_modules/@murphai/core/dist/write-policy.js.map +1 -1
  803. package/node_modules/@murphai/device-syncd/README.md +45 -5
  804. package/node_modules/@murphai/device-syncd/dist/callback-redirect.d.ts +7 -0
  805. package/node_modules/@murphai/device-syncd/dist/callback-redirect.d.ts.map +1 -1
  806. package/node_modules/@murphai/device-syncd/dist/callback-redirect.js +9 -0
  807. package/node_modules/@murphai/device-syncd/dist/callback-redirect.js.map +1 -1
  808. package/node_modules/@murphai/device-syncd/dist/client.js.map +1 -1
  809. package/node_modules/@murphai/device-syncd/dist/companion-health-metadata-parser.d.ts +30 -0
  810. package/node_modules/@murphai/device-syncd/dist/companion-health-metadata-parser.d.ts.map +1 -0
  811. package/node_modules/@murphai/device-syncd/dist/companion-health-metadata-parser.js +130 -0
  812. package/node_modules/@murphai/device-syncd/dist/companion-health-metadata-parser.js.map +1 -0
  813. package/node_modules/@murphai/device-syncd/dist/companion-health-metadata.d.ts +18 -0
  814. package/node_modules/@murphai/device-syncd/dist/companion-health-metadata.d.ts.map +1 -0
  815. package/node_modules/@murphai/device-syncd/dist/companion-health-metadata.js +18 -0
  816. package/node_modules/@murphai/device-syncd/dist/companion-health-metadata.js.map +1 -0
  817. package/node_modules/@murphai/device-syncd/dist/config/connect-routes.d.ts +4 -1
  818. package/node_modules/@murphai/device-syncd/dist/config/connect-routes.d.ts.map +1 -1
  819. package/node_modules/@murphai/device-syncd/dist/config/connect-routes.js +39 -4
  820. package/node_modules/@murphai/device-syncd/dist/config/connect-routes.js.map +1 -1
  821. package/node_modules/@murphai/device-syncd/dist/config/env-keys.d.ts.map +1 -1
  822. package/node_modules/@murphai/device-syncd/dist/config/junction-client-config.d.ts +9 -0
  823. package/node_modules/@murphai/device-syncd/dist/config/junction-client-config.d.ts.map +1 -0
  824. package/node_modules/@murphai/device-syncd/dist/config/junction-client-config.js +56 -0
  825. package/node_modules/@murphai/device-syncd/dist/config/junction-client-config.js.map +1 -0
  826. package/node_modules/@murphai/device-syncd/dist/config/junction-config.d.ts +3 -0
  827. package/node_modules/@murphai/device-syncd/dist/config/junction-config.d.ts.map +1 -0
  828. package/node_modules/@murphai/device-syncd/dist/config/junction-config.js +46 -0
  829. package/node_modules/@murphai/device-syncd/dist/config/junction-config.js.map +1 -0
  830. package/node_modules/@murphai/device-syncd/dist/config/junction-connect-sources.d.ts.map +1 -0
  831. package/node_modules/@murphai/device-syncd/dist/{providers → config}/junction-connect-sources.js +1 -1
  832. package/node_modules/@murphai/device-syncd/dist/config/junction-connect-sources.js.map +1 -0
  833. package/node_modules/@murphai/device-syncd/dist/config/provider-configs.d.ts +3 -5
  834. package/node_modules/@murphai/device-syncd/dist/config/provider-configs.d.ts.map +1 -1
  835. package/node_modules/@murphai/device-syncd/dist/config/provider-configs.js +69 -14
  836. package/node_modules/@murphai/device-syncd/dist/config/provider-configs.js.map +1 -1
  837. package/node_modules/@murphai/device-syncd/dist/config/provider-env.d.ts +2 -3
  838. package/node_modules/@murphai/device-syncd/dist/config/provider-env.d.ts.map +1 -1
  839. package/node_modules/@murphai/device-syncd/dist/config/provider-env.js +0 -3
  840. package/node_modules/@murphai/device-syncd/dist/config/provider-env.js.map +1 -1
  841. package/node_modules/@murphai/device-syncd/dist/config/provider-factory.d.ts.map +1 -1
  842. package/node_modules/@murphai/device-syncd/dist/config/provider-factory.js +9 -5
  843. package/node_modules/@murphai/device-syncd/dist/config/provider-factory.js.map +1 -1
  844. package/node_modules/@murphai/device-syncd/dist/config/provider-manifests.d.ts +26 -16
  845. package/node_modules/@murphai/device-syncd/dist/config/provider-manifests.d.ts.map +1 -1
  846. package/node_modules/@murphai/device-syncd/dist/config/provider-manifests.js +236 -339
  847. package/node_modules/@murphai/device-syncd/dist/config/provider-manifests.js.map +1 -1
  848. package/node_modules/@murphai/device-syncd/dist/config/provider-types.d.ts +62 -5
  849. package/node_modules/@murphai/device-syncd/dist/config/provider-types.d.ts.map +1 -1
  850. package/node_modules/@murphai/device-syncd/dist/config/runtime-config.d.ts.map +1 -1
  851. package/node_modules/@murphai/device-syncd/dist/config/runtime-config.js +7 -361
  852. package/node_modules/@murphai/device-syncd/dist/config/runtime-config.js.map +1 -1
  853. package/node_modules/@murphai/device-syncd/dist/config/serializable-provider-configs.d.ts +17 -1
  854. package/node_modules/@murphai/device-syncd/dist/config/serializable-provider-configs.d.ts.map +1 -1
  855. package/node_modules/@murphai/device-syncd/dist/config/serializable-provider-configs.js +104 -11
  856. package/node_modules/@murphai/device-syncd/dist/config/serializable-provider-configs.js.map +1 -1
  857. package/node_modules/@murphai/device-syncd/dist/config.d.ts +5 -3
  858. package/node_modules/@murphai/device-syncd/dist/config.d.ts.map +1 -1
  859. package/node_modules/@murphai/device-syncd/dist/config.js +4 -2
  860. package/node_modules/@murphai/device-syncd/dist/config.js.map +1 -1
  861. package/node_modules/@murphai/device-syncd/dist/configured-provider-descriptors.d.ts +6 -0
  862. package/node_modules/@murphai/device-syncd/dist/configured-provider-descriptors.d.ts.map +1 -0
  863. package/node_modules/@murphai/device-syncd/dist/configured-provider-descriptors.js +7 -0
  864. package/node_modules/@murphai/device-syncd/dist/configured-provider-descriptors.js.map +1 -0
  865. package/node_modules/@murphai/device-syncd/dist/configured-provider-runtime-descriptors.d.ts +3 -0
  866. package/node_modules/@murphai/device-syncd/dist/configured-provider-runtime-descriptors.d.ts.map +1 -0
  867. package/node_modules/@murphai/device-syncd/dist/configured-provider-runtime-descriptors.js +2 -0
  868. package/node_modules/@murphai/device-syncd/dist/configured-provider-runtime-descriptors.js.map +1 -0
  869. package/node_modules/@murphai/device-syncd/dist/connect-config.d.ts +2 -2
  870. package/node_modules/@murphai/device-syncd/dist/connect-config.d.ts.map +1 -1
  871. package/node_modules/@murphai/device-syncd/dist/connect-config.js +4 -11
  872. package/node_modules/@murphai/device-syncd/dist/connect-config.js.map +1 -1
  873. package/node_modules/@murphai/device-syncd/dist/errors.d.ts +8 -0
  874. package/node_modules/@murphai/device-syncd/dist/errors.d.ts.map +1 -1
  875. package/node_modules/@murphai/device-syncd/dist/errors.js +26 -0
  876. package/node_modules/@murphai/device-syncd/dist/errors.js.map +1 -1
  877. package/node_modules/@murphai/device-syncd/dist/hosted-hints.js +1 -1
  878. package/node_modules/@murphai/device-syncd/dist/hosted-hints.js.map +1 -1
  879. package/node_modules/@murphai/device-syncd/dist/hosted-runtime.d.ts +24 -0
  880. package/node_modules/@murphai/device-syncd/dist/hosted-runtime.d.ts.map +1 -1
  881. package/node_modules/@murphai/device-syncd/dist/hosted-runtime.js +187 -28
  882. package/node_modules/@murphai/device-syncd/dist/hosted-runtime.js.map +1 -1
  883. package/node_modules/@murphai/device-syncd/dist/http.d.ts +2 -9
  884. package/node_modules/@murphai/device-syncd/dist/http.d.ts.map +1 -1
  885. package/node_modules/@murphai/device-syncd/dist/http.js +26 -29
  886. package/node_modules/@murphai/device-syncd/dist/http.js.map +1 -1
  887. package/node_modules/@murphai/device-syncd/dist/index.d.ts +7 -7
  888. package/node_modules/@murphai/device-syncd/dist/index.d.ts.map +1 -1
  889. package/node_modules/@murphai/device-syncd/dist/index.js +1 -1
  890. package/node_modules/@murphai/device-syncd/dist/index.js.map +1 -1
  891. package/node_modules/@murphai/device-syncd/dist/junction-historical-backfill-progress.d.ts +60 -0
  892. package/node_modules/@murphai/device-syncd/dist/junction-historical-backfill-progress.d.ts.map +1 -0
  893. package/node_modules/@murphai/device-syncd/dist/junction-historical-backfill-progress.js +382 -0
  894. package/node_modules/@murphai/device-syncd/dist/junction-historical-backfill-progress.js.map +1 -0
  895. package/node_modules/@murphai/device-syncd/dist/junction-resources.d.ts +17 -0
  896. package/node_modules/@murphai/device-syncd/dist/junction-resources.d.ts.map +1 -0
  897. package/node_modules/@murphai/device-syncd/dist/junction-resources.js +28 -0
  898. package/node_modules/@murphai/device-syncd/dist/junction-resources.js.map +1 -0
  899. package/node_modules/@murphai/device-syncd/dist/metadata.d.ts +1 -0
  900. package/node_modules/@murphai/device-syncd/dist/metadata.d.ts.map +1 -1
  901. package/node_modules/@murphai/device-syncd/dist/metadata.js +1 -1
  902. package/node_modules/@murphai/device-syncd/dist/metadata.js.map +1 -1
  903. package/node_modules/@murphai/device-syncd/dist/provider-configs.d.ts +3 -0
  904. package/node_modules/@murphai/device-syncd/dist/provider-configs.d.ts.map +1 -0
  905. package/node_modules/@murphai/device-syncd/dist/provider-configs.js +2 -0
  906. package/node_modules/@murphai/device-syncd/dist/provider-configs.js.map +1 -0
  907. package/node_modules/@murphai/device-syncd/dist/provider-credential-policy.d.ts +6 -0
  908. package/node_modules/@murphai/device-syncd/dist/provider-credential-policy.d.ts.map +1 -0
  909. package/node_modules/@murphai/device-syncd/dist/provider-credential-policy.js +22 -0
  910. package/node_modules/@murphai/device-syncd/dist/provider-credential-policy.js.map +1 -0
  911. package/node_modules/@murphai/device-syncd/dist/provider-job-definitions.d.ts +7 -0
  912. package/node_modules/@murphai/device-syncd/dist/provider-job-definitions.d.ts.map +1 -0
  913. package/node_modules/@murphai/device-syncd/dist/provider-job-definitions.js +116 -0
  914. package/node_modules/@murphai/device-syncd/dist/provider-job-definitions.js.map +1 -0
  915. package/node_modules/@murphai/device-syncd/dist/provider-label.d.ts.map +1 -1
  916. package/node_modules/@murphai/device-syncd/dist/provider-label.js +5 -5
  917. package/node_modules/@murphai/device-syncd/dist/provider-label.js.map +1 -1
  918. package/node_modules/@murphai/device-syncd/dist/providers/junction-client.d.ts +22 -5
  919. package/node_modules/@murphai/device-syncd/dist/providers/junction-client.d.ts.map +1 -1
  920. package/node_modules/@murphai/device-syncd/dist/providers/junction-client.js +93 -58
  921. package/node_modules/@murphai/device-syncd/dist/providers/junction-client.js.map +1 -1
  922. package/node_modules/@murphai/device-syncd/dist/providers/junction-config.d.ts +3 -0
  923. package/node_modules/@murphai/device-syncd/dist/providers/junction-config.d.ts.map +1 -0
  924. package/node_modules/@murphai/device-syncd/dist/providers/junction-config.js +2 -0
  925. package/node_modules/@murphai/device-syncd/dist/providers/junction-config.js.map +1 -0
  926. package/node_modules/@murphai/device-syncd/dist/providers/junction.d.ts +5 -28
  927. package/node_modules/@murphai/device-syncd/dist/providers/junction.d.ts.map +1 -1
  928. package/node_modules/@murphai/device-syncd/dist/providers/junction.js +927 -719
  929. package/node_modules/@murphai/device-syncd/dist/providers/junction.js.map +1 -1
  930. package/node_modules/@murphai/device-syncd/dist/providers/oura-webhooks.js.map +1 -1
  931. package/node_modules/@murphai/device-syncd/dist/providers/oura.d.ts +2 -14
  932. package/node_modules/@murphai/device-syncd/dist/providers/oura.d.ts.map +1 -1
  933. package/node_modules/@murphai/device-syncd/dist/providers/oura.js +3 -26
  934. package/node_modules/@murphai/device-syncd/dist/providers/oura.js.map +1 -1
  935. package/node_modules/@murphai/device-syncd/dist/providers/provider-diagnostics.d.ts.map +1 -1
  936. package/node_modules/@murphai/device-syncd/dist/providers/provider-diagnostics.js +34 -30
  937. package/node_modules/@murphai/device-syncd/dist/providers/provider-diagnostics.js.map +1 -1
  938. package/node_modules/@murphai/device-syncd/dist/providers/shared-oauth.js.map +1 -1
  939. package/node_modules/@murphai/device-syncd/dist/providers/strava-webhooks.js.map +1 -1
  940. package/node_modules/@murphai/device-syncd/dist/providers/strava.d.ts +2 -15
  941. package/node_modules/@murphai/device-syncd/dist/providers/strava.d.ts.map +1 -1
  942. package/node_modules/@murphai/device-syncd/dist/providers/strava.js +8 -43
  943. package/node_modules/@murphai/device-syncd/dist/providers/strava.js.map +1 -1
  944. package/node_modules/@murphai/device-syncd/dist/providers/whoop.d.ts +2 -12
  945. package/node_modules/@murphai/device-syncd/dist/providers/whoop.d.ts.map +1 -1
  946. package/node_modules/@murphai/device-syncd/dist/providers/whoop.js +3 -22
  947. package/node_modules/@murphai/device-syncd/dist/providers/whoop.js.map +1 -1
  948. package/node_modules/@murphai/device-syncd/dist/public-account.d.ts +25 -0
  949. package/node_modules/@murphai/device-syncd/dist/public-account.d.ts.map +1 -1
  950. package/node_modules/@murphai/device-syncd/dist/public-account.js +32 -0
  951. package/node_modules/@murphai/device-syncd/dist/public-account.js.map +1 -1
  952. package/node_modules/@murphai/device-syncd/dist/public-ingress.d.ts +9 -4
  953. package/node_modules/@murphai/device-syncd/dist/public-ingress.d.ts.map +1 -1
  954. package/node_modules/@murphai/device-syncd/dist/public-ingress.js +125 -40
  955. package/node_modules/@murphai/device-syncd/dist/public-ingress.js.map +1 -1
  956. package/node_modules/@murphai/device-syncd/dist/public-provider-descriptor-shared.d.ts +3 -0
  957. package/node_modules/@murphai/device-syncd/dist/public-provider-descriptor-shared.d.ts.map +1 -0
  958. package/node_modules/@murphai/device-syncd/dist/public-provider-descriptor-shared.js +4 -0
  959. package/node_modules/@murphai/device-syncd/dist/public-provider-descriptor-shared.js.map +1 -0
  960. package/node_modules/@murphai/device-syncd/dist/public-provider-descriptors.d.ts +10 -0
  961. package/node_modules/@murphai/device-syncd/dist/public-provider-descriptors.d.ts.map +1 -0
  962. package/node_modules/@murphai/device-syncd/dist/public-provider-descriptors.js +41 -0
  963. package/node_modules/@murphai/device-syncd/dist/public-provider-descriptors.js.map +1 -0
  964. package/node_modules/@murphai/device-syncd/dist/registry.js.map +1 -1
  965. package/node_modules/@murphai/device-syncd/dist/service.d.ts +1 -1
  966. package/node_modules/@murphai/device-syncd/dist/service.d.ts.map +1 -1
  967. package/node_modules/@murphai/device-syncd/dist/service.js +219 -61
  968. package/node_modules/@murphai/device-syncd/dist/service.js.map +1 -1
  969. package/node_modules/@murphai/device-syncd/dist/shared.js.map +1 -1
  970. package/node_modules/@murphai/device-syncd/dist/store/accounts.d.ts +6 -0
  971. package/node_modules/@murphai/device-syncd/dist/store/accounts.d.ts.map +1 -1
  972. package/node_modules/@murphai/device-syncd/dist/store/accounts.js +129 -40
  973. package/node_modules/@murphai/device-syncd/dist/store/accounts.js.map +1 -1
  974. package/node_modules/@murphai/device-syncd/dist/store/hosted-account-hydration.d.ts +2 -0
  975. package/node_modules/@murphai/device-syncd/dist/store/hosted-account-hydration.d.ts.map +1 -1
  976. package/node_modules/@murphai/device-syncd/dist/store/hosted-account-hydration.js +80 -6
  977. package/node_modules/@murphai/device-syncd/dist/store/hosted-account-hydration.js.map +1 -1
  978. package/node_modules/@murphai/device-syncd/dist/store/jobs.d.ts +15 -0
  979. package/node_modules/@murphai/device-syncd/dist/store/jobs.d.ts.map +1 -1
  980. package/node_modules/@murphai/device-syncd/dist/store/jobs.js +119 -39
  981. package/node_modules/@murphai/device-syncd/dist/store/jobs.js.map +1 -1
  982. package/node_modules/@murphai/device-syncd/dist/store/oauth-states.d.ts.map +1 -1
  983. package/node_modules/@murphai/device-syncd/dist/store/oauth-states.js +14 -8
  984. package/node_modules/@murphai/device-syncd/dist/store/oauth-states.js.map +1 -1
  985. package/node_modules/@murphai/device-syncd/dist/store/schema.d.ts +1 -1
  986. package/node_modules/@murphai/device-syncd/dist/store/schema.d.ts.map +1 -1
  987. package/node_modules/@murphai/device-syncd/dist/store/schema.js +22 -4
  988. package/node_modules/@murphai/device-syncd/dist/store/schema.js.map +1 -1
  989. package/node_modules/@murphai/device-syncd/dist/store/sync-state.d.ts +9 -1
  990. package/node_modules/@murphai/device-syncd/dist/store/sync-state.d.ts.map +1 -1
  991. package/node_modules/@murphai/device-syncd/dist/store/sync-state.js +57 -52
  992. package/node_modules/@murphai/device-syncd/dist/store/sync-state.js.map +1 -1
  993. package/node_modules/@murphai/device-syncd/dist/store.d.ts +46 -2
  994. package/node_modules/@murphai/device-syncd/dist/store.d.ts.map +1 -1
  995. package/node_modules/@murphai/device-syncd/dist/store.js +103 -6
  996. package/node_modules/@murphai/device-syncd/dist/store.js.map +1 -1
  997. package/node_modules/@murphai/device-syncd/dist/types.d.ts +24 -1
  998. package/node_modules/@murphai/device-syncd/dist/types.d.ts.map +1 -1
  999. package/node_modules/@murphai/device-syncd/dist/types.js.map +1 -1
  1000. package/node_modules/@murphai/device-syncd/package.json +28 -0
  1001. package/node_modules/@murphai/exercise-library/content/seed/at-home-exercise-strength-addon-250.csv +251 -251
  1002. package/node_modules/@murphai/exercise-library/content/seed/at-home-exercise-stretch-addon-500.csv +359 -359
  1003. package/node_modules/@murphai/exercise-library/content/seed/at-home-exercise-stretch.csv +154 -154
  1004. package/node_modules/@murphai/exercise-library/dist/build.js.map +1 -1
  1005. package/node_modules/@murphai/exercise-library/dist/runtime.js.map +1 -1
  1006. package/node_modules/@murphai/exercise-library/dist/schema.d.ts.map +1 -1
  1007. package/node_modules/@murphai/exercise-library/generated/catalog.hash +1 -1
  1008. package/node_modules/@murphai/exercise-library/generated/exercise-details.json +12082 -764
  1009. package/node_modules/@murphai/exercise-library/generated/exercise-facets.json +1 -1
  1010. package/node_modules/@murphai/exercise-library/generated/exercise-index.json +1 -1
  1011. package/node_modules/@murphai/health-commons/content/sources/photobiomodulation-intake/pmid-11776448.md +60 -0
  1012. package/node_modules/@murphai/health-commons/content/sources/photobiomodulation-intake/pmid-18306161.md +60 -0
  1013. package/node_modules/@murphai/health-commons/content/sources/photobiomodulation-intake/pmid-19817517.md +60 -0
  1014. package/node_modules/@murphai/health-commons/content/sources/photobiomodulation-intake/pmid-19913903.md +60 -0
  1015. package/node_modules/@murphai/health-commons/content/sources/photobiomodulation-intake/pmid-19995444.md +62 -0
  1016. package/node_modules/@murphai/health-commons/content/sources/photobiomodulation-intake/pmid-20662037.md +60 -0
  1017. package/node_modules/@murphai/health-commons/content/sources/photobiomodulation-intake/pmid-24568233.md +62 -0
  1018. package/node_modules/@murphai/health-commons/content/sources/photobiomodulation-intake/pmid-26914684.md +60 -0
  1019. package/node_modules/@murphai/health-commons/content/sources/photobiomodulation-intake/pmid-27141153.md +62 -0
  1020. package/node_modules/@murphai/health-commons/content/sources/photobiomodulation-intake/pmid-28186867.md +62 -0
  1021. package/node_modules/@murphai/health-commons/content/sources/photobiomodulation-intake/pmid-36495670.md +62 -0
  1022. package/node_modules/@murphai/health-commons/content/sources/photobiomodulation-intake/pmid-37760145.md +62 -0
  1023. package/node_modules/@murphai/health-commons/dist/build.js.map +1 -1
  1024. package/node_modules/@murphai/health-commons/dist/catalog.d.ts +4 -4
  1025. package/node_modules/@murphai/health-commons/dist/hash-artifact.js.map +1 -1
  1026. package/node_modules/@murphai/health-commons/dist/runtime.d.ts +3 -7
  1027. package/node_modules/@murphai/health-commons/dist/runtime.d.ts.map +1 -1
  1028. package/node_modules/@murphai/health-commons/dist/runtime.js +59 -47
  1029. package/node_modules/@murphai/health-commons/dist/runtime.js.map +1 -1
  1030. package/node_modules/@murphai/health-commons/dist/sync-cloudflare-r2.js.map +1 -1
  1031. package/node_modules/@murphai/health-commons/generated/catalog.hash +1 -1
  1032. package/node_modules/@murphai/health-commons/generated/protocol-family-graph.json +1 -1
  1033. package/node_modules/@murphai/health-commons/generated/protocol-index.json +1 -1
  1034. package/node_modules/@murphai/health-commons/generated/protocol-run-specs.json +1 -1
  1035. package/node_modules/@murphai/health-commons/generated/source-artifact-index.json +1 -1
  1036. package/node_modules/@murphai/health-commons/generated/source-identities.ndjson +54 -0
  1037. package/node_modules/@murphai/health-commons/generated/source-index.json +727 -1
  1038. package/node_modules/@murphai/health-commons/generated/web/browse/biomarkers.json +1 -1
  1039. package/node_modules/@murphai/health-commons/generated/web/browse/experiments.json +1 -1
  1040. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/added-sugar-intake.json +1 -1
  1041. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/adherence.json +1 -1
  1042. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/adverse-symptoms.json +1 -1
  1043. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/alanine-aminotransferase.json +1 -1
  1044. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/alcohol-craving.json +1 -1
  1045. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/alcohol-free-days.json +1 -1
  1046. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/alcohol-intake.json +1 -1
  1047. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/alcohol-withdrawal-symptoms.json +1 -1
  1048. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/ankle-knee-to-wall-distance.json +1 -1
  1049. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/apolipoprotein-b.json +1 -1
  1050. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/aspartate-aminotransferase.json +1 -1
  1051. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/bilirubin.json +1 -1
  1052. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/blood-glucose.json +1 -1
  1053. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/blood-ketones-beta-hydroxybutyrate.json +1 -1
  1054. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/blood-oxygen-spo2.json +1 -1
  1055. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/blood-pressure.json +1 -1
  1056. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/blood-urea-nitrogen.json +1 -1
  1057. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/body-fat-percent.json +1 -1
  1058. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/body-weight.json +1 -1
  1059. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/chosen-primary-outcome-score.json +1 -1
  1060. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/continuous-glucose.json +1 -1
  1061. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/creatine-kinase.json +1 -1
  1062. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/daily-energy-intake-kcal.json +1 -1
  1063. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/daily-protein-g-per-kg.json +1 -1
  1064. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/daily-protein-grams.json +1 -1
  1065. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/daily-step-count.json +1 -1
  1066. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/daytime-sleepiness.json +1 -1
  1067. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/deep-sleep-minutes.json +1 -1
  1068. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/dietary-fiber-g-day.json +1 -1
  1069. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/digestive-comfort.json +1 -1
  1070. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/egfr.json +1 -1
  1071. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/estimated-gfr.json +1 -1
  1072. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/estimated-vo2max.json +1 -1
  1073. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/fasting-triglycerides.json +1 -1
  1074. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/gi-symptom-score.json +1 -1
  1075. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/gi-tolerance.json +1 -1
  1076. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/hbot-session-tolerability.json +1 -1
  1077. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/hdl-c.json +1 -1
  1078. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/hrv-rmssd.json +1 -1
  1079. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/lateral-knee-pain.json +1 -1
  1080. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/ldl-c.json +1 -1
  1081. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/ldl-cholesterol.json +1 -1
  1082. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/lean-body-mass.json +1 -1
  1083. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/lean-mass.json +1 -1
  1084. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/leg-heaviness-score.json +1 -1
  1085. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/liver-enzyme-panel.json +1 -1
  1086. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/macular-health-safety.json +1 -1
  1087. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/moderate-to-vigorous-activity-minutes.json +1 -1
  1088. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/mood-affect.json +1 -1
  1089. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/morning-blood-pressure.json +1 -1
  1090. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/muscle-soreness-score.json +1 -1
  1091. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/musculoskeletal-pain.json +1 -1
  1092. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/non-hdl-c.json +1 -1
  1093. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/non-hdl-cholesterol.json +1 -1
  1094. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/omega-3-index.json +1 -1
  1095. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/perceived-recovery-score.json +1 -1
  1096. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/perceived-recovery.json +1 -1
  1097. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/perceived-stiffness.json +1 -1
  1098. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/perceived-stress.json +1 -1
  1099. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/periocular-wrinkle-score.json +1 -1
  1100. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/postprandial-glucose-excursion.json +1 -1
  1101. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/pre-sleep-arousal.json +1 -1
  1102. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/rem-sleep-minutes.json +1 -1
  1103. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/resting-heart-rate.json +1 -1
  1104. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/running-tolerance.json +1 -1
  1105. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/saturated-fat-g-day.json +1 -1
  1106. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/sedentary-time.json +1 -1
  1107. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/self-reported-mood.json +1 -1
  1108. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/serum-25-hydroxyvitamin-d.json +1 -1
  1109. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/serum-creatinine.json +1 -1
  1110. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/serum-uric-acid.json +1 -1
  1111. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/shoulder-reach-distance.json +1 -1
  1112. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/sit-and-reach-distance.json +1 -1
  1113. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/skin-texture-roughness-score.json +1 -1
  1114. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/skin-tolerability-symptoms.json +1 -1
  1115. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/sleep-efficiency.json +1 -1
  1116. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/sleep-onset-latency.json +1 -1
  1117. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/sleep-quality.json +1 -1
  1118. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/standardized-skin-photo-score.json +1 -1
  1119. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/step-floor-days.json +1 -1
  1120. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/stretching-adherence-sessions.json +1 -1
  1121. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/stretching-session-burden.json +1 -1
  1122. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/stretching-symptoms.json +1 -1
  1123. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/subjective-eye-strain.json +1 -1
  1124. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/subjective-satiety.json +1 -1
  1125. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/supplement-adherence.json +1 -1
  1126. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/task-performance.json +1 -1
  1127. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/toe-touch-distance.json +1 -1
  1128. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/total-cholesterol.json +1 -1
  1129. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/total-sleep-time.json +1 -1
  1130. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/training-performance.json +1 -1
  1131. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/training-volume.json +1 -1
  1132. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/triglycerides.json +1 -1
  1133. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/urine-albumin-creatinine-ratio.json +1 -1
  1134. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/visual-fatigue.json +1 -1
  1135. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/visual-performance.json +1 -1
  1136. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/waist-circumference.json +1 -1
  1137. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/wake-time-variability.json +1 -1
  1138. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/walking-bout-minutes.json +1 -1
  1139. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/walking-cadence.json +1 -1
  1140. package/node_modules/@murphai/health-commons/generated/web/bundles/biomarker/walking-safety-events.json +1 -1
  1141. package/node_modules/@murphai/health-commons/generated/web/bundles/measurement_method/clinic-imaging-upgrade.json +1 -1
  1142. package/node_modules/@murphai/health-commons/generated/web/bundles/measurement_method/home-standardized-photo-roi-analysis.json +1 -1
  1143. package/node_modules/@murphai/health-commons/generated/web/bundles/measurement_method/standardized-photo-score-workflow.json +1 -1
  1144. package/node_modules/@murphai/health-commons/generated/web/bundles/protocol_variant/at-home-static-stretching-for-flexibility.json +1 -1
  1145. package/node_modules/@murphai/health-commons/generated/web/bundles/protocol_variant/bryan-johnson-blueprint.json +1 -1
  1146. package/node_modules/@murphai/health-commons/generated/web/bundles/protocol_variant/caffeine-curfew-dose-reset.json +1 -1
  1147. package/node_modules/@murphai/health-commons/generated/web/bundles/protocol_variant/cold-plunge.json +1 -1
  1148. package/node_modules/@murphai/health-commons/generated/web/bundles/protocol_variant/consistent-wake-time.json +1 -1
  1149. package/node_modules/@murphai/health-commons/generated/web/bundles/protocol_variant/creatine-monohydrate.json +1 -1
  1150. package/node_modules/@murphai/health-commons/generated/web/bundles/protocol_variant/daily-step-floor.json +1 -1
  1151. package/node_modules/@murphai/health-commons/generated/web/bundles/protocol_variant/daily-vitamin-d3-supplementation.json +1 -1
  1152. package/node_modules/@murphai/health-commons/generated/web/bundles/protocol_variant/digital-sunset.json +1 -1
  1153. package/node_modules/@murphai/health-commons/generated/web/bundles/protocol_variant/finnish-sauna.json +1 -1
  1154. package/node_modules/@murphai/health-commons/generated/web/bundles/protocol_variant/hydrolyzed-collagen-peptides.json +1 -1
  1155. package/node_modules/@murphai/health-commons/generated/web/bundles/protocol_variant/hyperbaric-oxygen-therapy.json +1 -1
  1156. package/node_modules/@murphai/health-commons/generated/web/bundles/protocol_variant/it-band-syndrome-rehab-and-return-to-run.json +1 -1
  1157. package/node_modules/@murphai/health-commons/generated/web/bundles/protocol_variant/morning-outdoor-light-exposure.json +1 -1
  1158. package/node_modules/@murphai/health-commons/generated/web/bundles/protocol_variant/no-added-sugar-diet.json +1 -1
  1159. package/node_modules/@murphai/health-commons/generated/web/bundles/protocol_variant/norwegian-4x4.json +1 -1
  1160. package/node_modules/@murphai/health-commons/generated/web/bundles/protocol_variant/oral-epa-dha-supplementation.json +1 -1
  1161. package/node_modules/@murphai/health-commons/generated/web/bundles/protocol_variant/pneumatic-compression-pants.json +1 -1
  1162. package/node_modules/@murphai/health-commons/generated/web/bundles/protocol_variant/pre-sleep-resonance-breathing-and-meditation.json +1 -1
  1163. package/node_modules/@murphai/health-commons/generated/web/bundles/protocol_variant/pre-sleep-silent-meditation.json +1 -1
  1164. package/node_modules/@murphai/health-commons/generated/web/bundles/protocol_variant/prolonged-fasting-24-72-hours.json +1 -1
  1165. package/node_modules/@murphai/health-commons/generated/web/bundles/protocol_variant/protein-floor-high-protein-intake.json +1 -1
  1166. package/node_modules/@murphai/health-commons/generated/web/bundles/protocol_variant/psyllium-husk-for-cholesterol.json +1 -1
  1167. package/node_modules/@murphai/health-commons/generated/web/bundles/protocol_variant/red-light-glasses-before-bed.json +1 -1
  1168. package/node_modules/@murphai/health-commons/generated/web/bundles/protocol_variant/red-near-infrared-skin-texture-photoaging.json +1 -1
  1169. package/node_modules/@murphai/health-commons/generated/web/bundles/protocol_variant/red-yeast-rice-for-cholesterol.json +1 -1
  1170. package/node_modules/@murphai/health-commons/generated/web/bundles/protocol_variant/short-term-alcohol-abstinence.json +1 -1
  1171. package/node_modules/@murphai/health-commons/generated/web/bundles/protocol_variant/social-media-fast.json +1 -1
  1172. package/node_modules/@murphai/health-commons/generated/web/bundles/protocol_variant/tabata-20-10-interval-training.json +1 -1
  1173. package/node_modules/@murphai/health-commons/generated/web/bundles/protocol_variant/time-restricted-eating-18-6.json +1 -1
  1174. package/node_modules/@murphai/health-commons/generated/web/bundles/protocol_variant/walking-after-every-meal.json +1 -1
  1175. package/node_modules/@murphai/health-commons/generated/web/bundles/protocol_variant/whole-body-red-and-near-infrared-light-exposure.json +1 -1
  1176. package/node_modules/@murphai/health-commons/generated/web/bundles/protocol_variant/zone-2-aerobic-base-block.json +1 -1
  1177. package/node_modules/@murphai/health-commons/generated/web/pages/biomarkers/blood-oxygen-spo2/overview.json +1 -1
  1178. package/node_modules/@murphai/health-commons/generated/web/pages/biomarkers/blood-oxygen-spo2/research.json +1 -1
  1179. package/node_modules/@murphai/health-commons/generated/web/pages/biomarkers/deep-sleep-minutes/overview.json +1 -1
  1180. package/node_modules/@murphai/health-commons/generated/web/pages/biomarkers/deep-sleep-minutes/research.json +1 -1
  1181. package/node_modules/@murphai/health-commons/generated/web/pages/biomarkers/estimated-vo2max/overview.json +1 -1
  1182. package/node_modules/@murphai/health-commons/generated/web/pages/biomarkers/estimated-vo2max/research.json +1 -1
  1183. package/node_modules/@murphai/health-commons/generated/web/pages/biomarkers/hrv-rmssd/overview.json +1 -1
  1184. package/node_modules/@murphai/health-commons/generated/web/pages/biomarkers/hrv-rmssd/research.json +1 -1
  1185. package/node_modules/@murphai/health-commons/generated/web/pages/biomarkers/rem-sleep-minutes/overview.json +1 -1
  1186. package/node_modules/@murphai/health-commons/generated/web/pages/biomarkers/rem-sleep-minutes/research.json +1 -1
  1187. package/node_modules/@murphai/health-commons/generated/web/pages/biomarkers/resting-heart-rate/overview.json +1 -1
  1188. package/node_modules/@murphai/health-commons/generated/web/pages/biomarkers/resting-heart-rate/research.json +1 -1
  1189. package/node_modules/@murphai/health-commons/generated/web/routes/index.json +1 -1
  1190. package/node_modules/@murphai/health-commons/generated/web/shell/biomarkers/blood-oxygen-spo2.json +1 -1
  1191. package/node_modules/@murphai/health-commons/generated/web/shell/biomarkers/deep-sleep-minutes.json +1 -1
  1192. package/node_modules/@murphai/health-commons/generated/web/shell/biomarkers/estimated-vo2max.json +1 -1
  1193. package/node_modules/@murphai/health-commons/generated/web/shell/biomarkers/hrv-rmssd.json +1 -1
  1194. package/node_modules/@murphai/health-commons/generated/web/shell/biomarkers/rem-sleep-minutes.json +1 -1
  1195. package/node_modules/@murphai/health-commons/generated/web/shell/biomarkers/resting-heart-rate.json +1 -1
  1196. package/node_modules/@murphai/health-commons/generated/web/shell/experiments/at-home-static-stretching-for-flexibility.json +1 -1
  1197. package/node_modules/@murphai/health-commons/generated/web/shell/experiments/bryan-johnson-blueprint.json +1 -1
  1198. package/node_modules/@murphai/health-commons/generated/web/shell/experiments/caffeine-curfew-dose-reset.json +1 -1
  1199. package/node_modules/@murphai/health-commons/generated/web/shell/experiments/cold-plunge.json +1 -1
  1200. package/node_modules/@murphai/health-commons/generated/web/shell/experiments/consistent-wake-time.json +1 -1
  1201. package/node_modules/@murphai/health-commons/generated/web/shell/experiments/daily-step-floor.json +1 -1
  1202. package/node_modules/@murphai/health-commons/generated/web/shell/experiments/digital-sunset.json +1 -1
  1203. package/node_modules/@murphai/health-commons/generated/web/shell/experiments/finnish-sauna.json +1 -1
  1204. package/node_modules/@murphai/health-commons/generated/web/shell/experiments/hyperbaric-oxygen-therapy.json +1 -1
  1205. package/node_modules/@murphai/health-commons/generated/web/shell/experiments/morning-outdoor-light-exposure.json +1 -1
  1206. package/node_modules/@murphai/health-commons/generated/web/shell/experiments/no-added-sugar-diet.json +1 -1
  1207. package/node_modules/@murphai/health-commons/generated/web/shell/experiments/norwegian-4x4.json +1 -1
  1208. package/node_modules/@murphai/health-commons/generated/web/shell/experiments/pneumatic-compression-pants.json +1 -1
  1209. package/node_modules/@murphai/health-commons/generated/web/shell/experiments/pre-sleep-resonance-breathing-and-meditation.json +1 -1
  1210. package/node_modules/@murphai/health-commons/generated/web/shell/experiments/pre-sleep-silent-meditation.json +1 -1
  1211. package/node_modules/@murphai/health-commons/generated/web/shell/experiments/prolonged-fasting-24-72-hours.json +1 -1
  1212. package/node_modules/@murphai/health-commons/generated/web/shell/experiments/protein-floor-high-protein-intake.json +1 -1
  1213. package/node_modules/@murphai/health-commons/generated/web/shell/experiments/red-light-glasses-before-bed.json +1 -1
  1214. package/node_modules/@murphai/health-commons/generated/web/shell/experiments/red-near-infrared-skin-texture-photoaging.json +1 -1
  1215. package/node_modules/@murphai/health-commons/generated/web/shell/experiments/short-term-alcohol-abstinence.json +1 -1
  1216. package/node_modules/@murphai/health-commons/generated/web/shell/experiments/tabata-20-10-interval-training.json +1 -1
  1217. package/node_modules/@murphai/health-commons/generated/web/shell/experiments/time-restricted-eating-18-6.json +1 -1
  1218. package/node_modules/@murphai/health-commons/generated/web/shell/experiments/walking-after-every-meal.json +1 -1
  1219. package/node_modules/@murphai/health-commons/generated/web/shell/experiments/whole-body-red-and-near-infrared-light-exposure.json +1 -1
  1220. package/node_modules/@murphai/health-commons/generated/web/shell/experiments/zone-2-aerobic-base-block.json +1 -1
  1221. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/at-home-static-stretching-for-flexibility/protocol.json +1 -1
  1222. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/at-home-static-stretching-for-flexibility/research.json +1 -1
  1223. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/at-home-static-stretching-for-flexibility/results-public.json +2 -2
  1224. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/bryan-johnson-blueprint/protocol.json +1 -1
  1225. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/bryan-johnson-blueprint/research.json +1 -1
  1226. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/bryan-johnson-blueprint/results-public.json +2 -2
  1227. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/caffeine-curfew-dose-reset/protocol.json +1 -1
  1228. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/caffeine-curfew-dose-reset/research.json +1 -1
  1229. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/caffeine-curfew-dose-reset/results-public.json +2 -2
  1230. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/cold-plunge/protocol.json +1 -1
  1231. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/cold-plunge/research.json +1 -1
  1232. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/cold-plunge/results-public.json +2 -2
  1233. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/consistent-wake-time/protocol.json +1 -1
  1234. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/consistent-wake-time/research.json +1 -1
  1235. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/consistent-wake-time/results-public.json +2 -2
  1236. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/daily-step-floor/protocol.json +1 -1
  1237. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/daily-step-floor/research.json +1 -1
  1238. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/daily-step-floor/results-public.json +2 -2
  1239. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/digital-sunset/protocol.json +1 -1
  1240. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/digital-sunset/research.json +1 -1
  1241. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/digital-sunset/results-public.json +2 -2
  1242. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/finnish-sauna/protocol.json +1 -1
  1243. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/finnish-sauna/research.json +1 -1
  1244. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/finnish-sauna/results-public.json +2 -2
  1245. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/hyperbaric-oxygen-therapy/protocol.json +1 -1
  1246. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/hyperbaric-oxygen-therapy/research.json +1 -1
  1247. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/hyperbaric-oxygen-therapy/results-public.json +2 -2
  1248. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/morning-outdoor-light-exposure/protocol.json +1 -1
  1249. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/morning-outdoor-light-exposure/research.json +1 -1
  1250. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/morning-outdoor-light-exposure/results-public.json +2 -2
  1251. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/no-added-sugar-diet/protocol.json +1 -1
  1252. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/no-added-sugar-diet/research.json +1 -1
  1253. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/no-added-sugar-diet/results-public.json +2 -2
  1254. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/norwegian-4x4/protocol.json +1 -1
  1255. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/norwegian-4x4/research.json +1 -1
  1256. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/norwegian-4x4/results-public.json +2 -2
  1257. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/pneumatic-compression-pants/protocol.json +1 -1
  1258. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/pneumatic-compression-pants/research.json +1 -1
  1259. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/pneumatic-compression-pants/results-public.json +2 -2
  1260. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/pre-sleep-resonance-breathing-and-meditation/protocol.json +1 -1
  1261. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/pre-sleep-resonance-breathing-and-meditation/research.json +1 -1
  1262. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/pre-sleep-resonance-breathing-and-meditation/results-public.json +2 -2
  1263. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/pre-sleep-silent-meditation/protocol.json +1 -1
  1264. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/pre-sleep-silent-meditation/research.json +1 -1
  1265. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/pre-sleep-silent-meditation/results-public.json +2 -2
  1266. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/prolonged-fasting-24-72-hours/protocol.json +1 -1
  1267. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/prolonged-fasting-24-72-hours/research.json +1 -1
  1268. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/prolonged-fasting-24-72-hours/results-public.json +2 -2
  1269. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/protein-floor-high-protein-intake/protocol.json +1 -1
  1270. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/protein-floor-high-protein-intake/research.json +1 -1
  1271. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/protein-floor-high-protein-intake/results-public.json +2 -2
  1272. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/red-light-glasses-before-bed/protocol.json +1 -1
  1273. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/red-light-glasses-before-bed/research.json +1 -1
  1274. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/red-light-glasses-before-bed/results-public.json +2 -2
  1275. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/red-near-infrared-skin-texture-photoaging/protocol.json +1 -1
  1276. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/red-near-infrared-skin-texture-photoaging/research.json +1 -1
  1277. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/red-near-infrared-skin-texture-photoaging/results-public.json +2 -2
  1278. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/short-term-alcohol-abstinence/protocol.json +1 -1
  1279. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/short-term-alcohol-abstinence/research.json +1 -1
  1280. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/short-term-alcohol-abstinence/results-public.json +2 -2
  1281. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/tabata-20-10-interval-training/protocol.json +1 -1
  1282. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/tabata-20-10-interval-training/research.json +1 -1
  1283. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/tabata-20-10-interval-training/results-public.json +2 -2
  1284. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/time-restricted-eating-18-6/protocol.json +1 -1
  1285. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/time-restricted-eating-18-6/research.json +1 -1
  1286. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/time-restricted-eating-18-6/results-public.json +2 -2
  1287. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/walking-after-every-meal/protocol.json +1 -1
  1288. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/walking-after-every-meal/research.json +1 -1
  1289. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/walking-after-every-meal/results-public.json +2 -2
  1290. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/whole-body-red-and-near-infrared-light-exposure/protocol.json +1 -1
  1291. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/whole-body-red-and-near-infrared-light-exposure/research.json +1 -1
  1292. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/whole-body-red-and-near-infrared-light-exposure/results-public.json +2 -2
  1293. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/zone-2-aerobic-base-block/protocol.json +1 -1
  1294. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/zone-2-aerobic-base-block/research.json +1 -1
  1295. package/node_modules/@murphai/health-commons/generated/web/tabs/experiments/zone-2-aerobic-base-block/results-public.json +2 -2
  1296. package/node_modules/@murphai/health-metrics/README.md +4 -0
  1297. package/node_modules/@murphai/health-metrics/dist/catalog.js.map +1 -1
  1298. package/node_modules/@murphai/health-metrics/dist/definitions/activity.d.ts +15 -1
  1299. package/node_modules/@murphai/health-metrics/dist/definitions/activity.d.ts.map +1 -1
  1300. package/node_modules/@murphai/health-metrics/dist/definitions/activity.js +99 -0
  1301. package/node_modules/@murphai/health-metrics/dist/definitions/activity.js.map +1 -1
  1302. package/node_modules/@murphai/health-metrics/dist/definitions/labs.d.ts +1 -1
  1303. package/node_modules/@murphai/health-metrics/dist/definitions/recovery.d.ts +1 -1
  1304. package/node_modules/@murphai/health-metrics/dist/definitions/recovery.d.ts.map +1 -1
  1305. package/node_modules/@murphai/health-metrics/dist/definitions/recovery.js +12 -0
  1306. package/node_modules/@murphai/health-metrics/dist/definitions/recovery.js.map +1 -1
  1307. package/node_modules/@murphai/health-metrics/dist/definitions/sleep.d.ts +1 -1
  1308. package/node_modules/@murphai/health-metrics/dist/format.js.map +1 -1
  1309. package/node_modules/@murphai/health-metrics/dist/goals.js.map +1 -1
  1310. package/node_modules/@murphai/health-metrics/dist/index.d.ts +0 -2
  1311. package/node_modules/@murphai/health-metrics/dist/index.d.ts.map +1 -1
  1312. package/node_modules/@murphai/health-metrics/dist/index.js +0 -2
  1313. package/node_modules/@murphai/health-metrics/dist/index.js.map +1 -1
  1314. package/node_modules/@murphai/health-metrics/dist/murph-age-source-routes.d.ts.map +1 -1
  1315. package/node_modules/@murphai/health-metrics/dist/murph-age-source-routes.js.map +1 -1
  1316. package/node_modules/@murphai/health-metrics/dist/murph-age.d.ts.map +1 -1
  1317. package/node_modules/@murphai/health-metrics/dist/murph-age.js.map +1 -1
  1318. package/node_modules/@murphai/health-metrics/dist/normalize.js.map +1 -1
  1319. package/node_modules/@murphai/health-metrics/dist/selectors.js.map +1 -1
  1320. package/node_modules/@murphai/health-metrics/dist/wearable-metric-catalog.d.ts.map +1 -1
  1321. package/node_modules/@murphai/health-metrics/dist/wearable-metric-catalog.js.map +1 -1
  1322. package/node_modules/@murphai/health-metrics/dist/wearable-provider-catalog.d.ts.map +1 -1
  1323. package/node_modules/@murphai/health-metrics/dist/wearable-provider-catalog.js.map +1 -1
  1324. package/node_modules/@murphai/health-metrics/package.json +10 -0
  1325. package/node_modules/@murphai/importers/README.md +13 -0
  1326. package/node_modules/@murphai/importers/dist/assessment/import-assessment-response.js.map +1 -1
  1327. package/node_modules/@murphai/importers/dist/clinical-records/index.d.ts +19 -0
  1328. package/node_modules/@murphai/importers/dist/clinical-records/index.d.ts.map +1 -0
  1329. package/node_modules/@murphai/importers/dist/clinical-records/index.js +1523 -0
  1330. package/node_modules/@murphai/importers/dist/clinical-records/index.js.map +1 -0
  1331. package/node_modules/@murphai/importers/dist/core-port.d.ts +1 -0
  1332. package/node_modules/@murphai/importers/dist/core-port.d.ts.map +1 -1
  1333. package/node_modules/@murphai/importers/dist/core-port.js.map +1 -1
  1334. package/node_modules/@murphai/importers/dist/create-importers.d.ts.map +1 -1
  1335. package/node_modules/@murphai/importers/dist/create-importers.js.map +1 -1
  1336. package/node_modules/@murphai/importers/dist/csv-sample-import-planner.js.map +1 -1
  1337. package/node_modules/@murphai/importers/dist/csv-sample-importer.js.map +1 -1
  1338. package/node_modules/@murphai/importers/dist/device-providers/import-device-provider-snapshot.js.map +1 -1
  1339. package/node_modules/@murphai/importers/dist/device-providers/index.d.ts +1 -1
  1340. package/node_modules/@murphai/importers/dist/device-providers/index.d.ts.map +1 -1
  1341. package/node_modules/@murphai/importers/dist/device-providers/index.js +1 -1
  1342. package/node_modules/@murphai/importers/dist/device-providers/index.js.map +1 -1
  1343. package/node_modules/@murphai/importers/dist/device-providers/junction-origin.js.map +1 -1
  1344. package/node_modules/@murphai/importers/dist/device-providers/junction-resources.d.ts +3 -2
  1345. package/node_modules/@murphai/importers/dist/device-providers/junction-resources.d.ts.map +1 -1
  1346. package/node_modules/@murphai/importers/dist/device-providers/junction-resources.js +12 -20
  1347. package/node_modules/@murphai/importers/dist/device-providers/junction-resources.js.map +1 -1
  1348. package/node_modules/@murphai/importers/dist/device-providers/junction.d.ts +18 -0
  1349. package/node_modules/@murphai/importers/dist/device-providers/junction.d.ts.map +1 -1
  1350. package/node_modules/@murphai/importers/dist/device-providers/junction.js +1026 -123
  1351. package/node_modules/@murphai/importers/dist/device-providers/junction.js.map +1 -1
  1352. package/node_modules/@murphai/importers/dist/device-providers/provider-descriptors.d.ts +132 -132
  1353. package/node_modules/@murphai/importers/dist/device-providers/provider-descriptors.d.ts.map +1 -1
  1354. package/node_modules/@murphai/importers/dist/device-providers/provider-descriptors.js.map +1 -1
  1355. package/node_modules/@murphai/importers/dist/device-providers/registry.js.map +1 -1
  1356. package/node_modules/@murphai/importers/dist/device-providers/whoop.js.map +1 -1
  1357. package/node_modules/@murphai/importers/dist/document-importer.js.map +1 -1
  1358. package/node_modules/@murphai/importers/dist/meal-importer.js.map +1 -1
  1359. package/node_modules/@murphai/importers/dist/preset-registry.js.map +1 -1
  1360. package/node_modules/@murphai/importers/package.json +5 -0
  1361. package/node_modules/@murphai/inbox-services/dist/inbox-app/bootstrap-doctor.js.map +1 -1
  1362. package/node_modules/@murphai/inbox-services/dist/inbox-app/environment.js.map +1 -1
  1363. package/node_modules/@murphai/inbox-services/dist/inbox-app/reads.js +1 -1
  1364. package/node_modules/@murphai/inbox-services/dist/inbox-app/reads.js.map +1 -1
  1365. package/node_modules/@murphai/inbox-services/dist/inbox-app/service.d.ts.map +1 -1
  1366. package/node_modules/@murphai/inbox-services/dist/inbox-app/service.js +2 -0
  1367. package/node_modules/@murphai/inbox-services/dist/inbox-app/service.js.map +1 -1
  1368. package/node_modules/@murphai/inbox-services/dist/inbox-app/storage-repair.d.ts +3 -0
  1369. package/node_modules/@murphai/inbox-services/dist/inbox-app/storage-repair.d.ts.map +1 -0
  1370. package/node_modules/@murphai/inbox-services/dist/inbox-app/storage-repair.js +37 -0
  1371. package/node_modules/@murphai/inbox-services/dist/inbox-app/storage-repair.js.map +1 -0
  1372. package/node_modules/@murphai/inbox-services/dist/inbox-app/types.d.ts +22 -2
  1373. package/node_modules/@murphai/inbox-services/dist/inbox-app/types.d.ts.map +1 -1
  1374. package/node_modules/@murphai/inbox-services/dist/inbox-services/connectors.js.map +1 -1
  1375. package/node_modules/@murphai/inbox-services/dist/inbox-services/daemon.js.map +1 -1
  1376. package/node_modules/@murphai/inbox-services/dist/inbox-services/parser.d.ts +1 -1
  1377. package/node_modules/@murphai/inbox-services/dist/inbox-services/parser.js +2 -2
  1378. package/node_modules/@murphai/inbox-services/dist/inbox-services/parser.js.map +1 -1
  1379. package/node_modules/@murphai/inbox-services/dist/inbox-services/promotions.d.ts +2 -2
  1380. package/node_modules/@murphai/inbox-services/dist/inbox-services/promotions.d.ts.map +1 -1
  1381. package/node_modules/@murphai/inbox-services/dist/inbox-services/promotions.js.map +1 -1
  1382. package/node_modules/@murphai/inbox-services/dist/inbox-services/query.d.ts +27 -27
  1383. package/node_modules/@murphai/inbox-services/dist/inbox-services/query.d.ts.map +1 -1
  1384. package/node_modules/@murphai/inbox-services/dist/inbox-services/query.js +2 -2
  1385. package/node_modules/@murphai/inbox-services/dist/inbox-services/query.js.map +1 -1
  1386. package/node_modules/@murphai/inbox-services/dist/inbox-services/state.js.map +1 -1
  1387. package/node_modules/@murphai/inboxd/README.md +3 -2
  1388. package/node_modules/@murphai/inboxd/dist/checkpoint.d.ts +2 -0
  1389. package/node_modules/@murphai/inboxd/dist/checkpoint.d.ts.map +1 -0
  1390. package/node_modules/@murphai/inboxd/dist/checkpoint.js +2 -0
  1391. package/node_modules/@murphai/inboxd/dist/checkpoint.js.map +1 -0
  1392. package/node_modules/@murphai/inboxd/dist/connectors/email/directness.d.ts +11 -0
  1393. package/node_modules/@murphai/inboxd/dist/connectors/email/directness.d.ts.map +1 -0
  1394. package/node_modules/@murphai/inboxd/dist/connectors/email/directness.js +67 -0
  1395. package/node_modules/@murphai/inboxd/dist/connectors/email/directness.js.map +1 -0
  1396. package/node_modules/@murphai/inboxd/dist/connectors/email/normalize-parsed.d.ts +3 -1
  1397. package/node_modules/@murphai/inboxd/dist/connectors/email/normalize-parsed.d.ts.map +1 -1
  1398. package/node_modules/@murphai/inboxd/dist/connectors/email/normalize-parsed.js +18 -9
  1399. package/node_modules/@murphai/inboxd/dist/connectors/email/normalize-parsed.js.map +1 -1
  1400. package/node_modules/@murphai/inboxd/dist/connectors/email/normalize.d.ts +1 -10
  1401. package/node_modules/@murphai/inboxd/dist/connectors/email/normalize.d.ts.map +1 -1
  1402. package/node_modules/@murphai/inboxd/dist/connectors/email/normalize.js +2 -65
  1403. package/node_modules/@murphai/inboxd/dist/connectors/email/normalize.js.map +1 -1
  1404. package/node_modules/@murphai/inboxd/dist/connectors/hosted-conversation.d.ts +0 -15
  1405. package/node_modules/@murphai/inboxd/dist/connectors/hosted-conversation.d.ts.map +1 -1
  1406. package/node_modules/@murphai/inboxd/dist/connectors/hosted-conversation.js +0 -33
  1407. package/node_modules/@murphai/inboxd/dist/connectors/hosted-conversation.js.map +1 -1
  1408. package/node_modules/@murphai/inboxd/dist/connectors/telegram/connector.d.ts.map +1 -1
  1409. package/node_modules/@murphai/inboxd/dist/contracts/capture.d.ts +1 -2
  1410. package/node_modules/@murphai/inboxd/dist/contracts/capture.d.ts.map +1 -1
  1411. package/node_modules/@murphai/inboxd/dist/contracts/search.d.ts +2 -2
  1412. package/node_modules/@murphai/inboxd/dist/contracts/search.d.ts.map +1 -1
  1413. package/node_modules/@murphai/inboxd/dist/index.d.ts +1 -0
  1414. package/node_modules/@murphai/inboxd/dist/index.d.ts.map +1 -1
  1415. package/node_modules/@murphai/inboxd/dist/index.js +1 -0
  1416. package/node_modules/@murphai/inboxd/dist/index.js.map +1 -1
  1417. package/node_modules/@murphai/inboxd/dist/indexing/envelope-migration.d.ts +21 -0
  1418. package/node_modules/@murphai/inboxd/dist/indexing/envelope-migration.d.ts.map +1 -0
  1419. package/node_modules/@murphai/inboxd/dist/indexing/envelope-migration.js +259 -0
  1420. package/node_modules/@murphai/inboxd/dist/indexing/envelope-migration.js.map +1 -0
  1421. package/node_modules/@murphai/inboxd/dist/indexing/parser-derivatives.d.ts +1 -1
  1422. package/node_modules/@murphai/inboxd/dist/indexing/parser-derivatives.d.ts.map +1 -1
  1423. package/node_modules/@murphai/inboxd/dist/indexing/parser-derivatives.js +7 -4
  1424. package/node_modules/@murphai/inboxd/dist/indexing/parser-derivatives.js.map +1 -1
  1425. package/node_modules/@murphai/inboxd/dist/indexing/persist/canonical-records.d.ts +13 -1
  1426. package/node_modules/@murphai/inboxd/dist/indexing/persist/canonical-records.d.ts.map +1 -1
  1427. package/node_modules/@murphai/inboxd/dist/indexing/persist/canonical-records.js +68 -13
  1428. package/node_modules/@murphai/inboxd/dist/indexing/persist/canonical-records.js.map +1 -1
  1429. package/node_modules/@murphai/inboxd/dist/indexing/persist.d.ts +12 -6
  1430. package/node_modules/@murphai/inboxd/dist/indexing/persist.d.ts.map +1 -1
  1431. package/node_modules/@murphai/inboxd/dist/indexing/persist.js +226 -73
  1432. package/node_modules/@murphai/inboxd/dist/indexing/persist.js.map +1 -1
  1433. package/node_modules/@murphai/inboxd/dist/indexing/retention.js.map +1 -1
  1434. package/node_modules/@murphai/inboxd/dist/kernel/pipeline.js +4 -4
  1435. package/node_modules/@murphai/inboxd/dist/kernel/pipeline.js.map +1 -1
  1436. package/node_modules/@murphai/inboxd/dist/kernel/registry.js.map +1 -1
  1437. package/node_modules/@murphai/inboxd/dist/kernel/sqlite/rows.d.ts +2 -2
  1438. package/node_modules/@murphai/inboxd/dist/kernel/sqlite/rows.d.ts.map +1 -1
  1439. package/node_modules/@murphai/inboxd/dist/kernel/sqlite/rows.js +3 -3
  1440. package/node_modules/@murphai/inboxd/dist/kernel/sqlite/rows.js.map +1 -1
  1441. package/node_modules/@murphai/inboxd/dist/kernel/sqlite.d.ts.map +1 -1
  1442. package/node_modules/@murphai/inboxd/dist/kernel/sqlite.js +42 -12
  1443. package/node_modules/@murphai/inboxd/dist/kernel/sqlite.js.map +1 -1
  1444. package/node_modules/@murphai/inboxd/dist/retention.d.ts +2 -0
  1445. package/node_modules/@murphai/inboxd/dist/retention.d.ts.map +1 -0
  1446. package/node_modules/@murphai/inboxd/dist/retention.js +2 -0
  1447. package/node_modules/@murphai/inboxd/dist/retention.js.map +1 -0
  1448. package/node_modules/@murphai/inboxd/dist/runtime.d.ts +2 -1
  1449. package/node_modules/@murphai/inboxd/dist/runtime.d.ts.map +1 -1
  1450. package/node_modules/@murphai/inboxd/dist/runtime.js +1 -0
  1451. package/node_modules/@murphai/inboxd/dist/runtime.js.map +1 -1
  1452. package/node_modules/@murphai/inboxd/package.json +12 -0
  1453. package/node_modules/@murphai/messaging-ingress/README.md +1 -5
  1454. package/node_modules/@murphai/messaging-ingress/dist/internal.d.ts.map +1 -1
  1455. package/node_modules/@murphai/messaging-ingress/dist/internal.js +4 -0
  1456. package/node_modules/@murphai/messaging-ingress/dist/internal.js.map +1 -1
  1457. package/node_modules/@murphai/messaging-ingress/dist/linq-webhook.d.ts.map +1 -1
  1458. package/node_modules/@murphai/messaging-ingress/dist/linq-webhook.js.map +1 -1
  1459. package/node_modules/@murphai/messaging-ingress/package.json +0 -4
  1460. package/node_modules/@murphai/operator-config/dist/agentmail-runtime.js.map +1 -1
  1461. package/node_modules/@murphai/operator-config/dist/assistant/codex-resume-state.d.ts +2 -0
  1462. package/node_modules/@murphai/operator-config/dist/assistant/codex-resume-state.d.ts.map +1 -1
  1463. package/node_modules/@murphai/operator-config/dist/assistant/codex-resume-state.js +5 -0
  1464. package/node_modules/@murphai/operator-config/dist/assistant/codex-resume-state.js.map +1 -1
  1465. package/node_modules/@murphai/operator-config/dist/assistant/current-delivery-route.d.ts +5 -0
  1466. package/node_modules/@murphai/operator-config/dist/assistant/current-delivery-route.d.ts.map +1 -1
  1467. package/node_modules/@murphai/operator-config/dist/assistant/current-delivery-route.js +58 -0
  1468. package/node_modules/@murphai/operator-config/dist/assistant/current-delivery-route.js.map +1 -1
  1469. package/node_modules/@murphai/operator-config/dist/assistant/delivery-failure.d.ts +2 -2
  1470. package/node_modules/@murphai/operator-config/dist/assistant/delivery-failure.d.ts.map +1 -1
  1471. package/node_modules/@murphai/operator-config/dist/assistant/delivery-failure.js.map +1 -1
  1472. package/node_modules/@murphai/operator-config/dist/assistant/hosted-config.d.ts +5 -5
  1473. package/node_modules/@murphai/operator-config/dist/assistant/hosted-config.d.ts.map +1 -1
  1474. package/node_modules/@murphai/operator-config/dist/assistant/target-runtime.d.ts +32 -31
  1475. package/node_modules/@murphai/operator-config/dist/assistant/target-runtime.d.ts.map +1 -1
  1476. package/node_modules/@murphai/operator-config/dist/assistant/target-runtime.js +4 -2
  1477. package/node_modules/@murphai/operator-config/dist/assistant/target-runtime.js.map +1 -1
  1478. package/node_modules/@murphai/operator-config/dist/assistant-backend.d.ts +2 -2
  1479. package/node_modules/@murphai/operator-config/dist/assistant-cli-contracts.d.ts +488 -317
  1480. package/node_modules/@murphai/operator-config/dist/assistant-cli-contracts.d.ts.map +1 -1
  1481. package/node_modules/@murphai/operator-config/dist/assistant-cli-contracts.js +171 -22
  1482. package/node_modules/@murphai/operator-config/dist/assistant-cli-contracts.js.map +1 -1
  1483. package/node_modules/@murphai/operator-config/dist/device-cli-contracts.d.ts +32 -27
  1484. package/node_modules/@murphai/operator-config/dist/device-cli-contracts.d.ts.map +1 -1
  1485. package/node_modules/@murphai/operator-config/dist/device-cli-contracts.js +11 -1
  1486. package/node_modules/@murphai/operator-config/dist/device-cli-contracts.js.map +1 -1
  1487. package/node_modules/@murphai/operator-config/dist/device-daemon/paths.js.map +1 -1
  1488. package/node_modules/@murphai/operator-config/dist/device-daemon.js.map +1 -1
  1489. package/node_modules/@murphai/operator-config/dist/device-sync-browser-opener.js.map +1 -1
  1490. package/node_modules/@murphai/operator-config/dist/device-sync-client.d.ts +1 -1
  1491. package/node_modules/@murphai/operator-config/dist/device-sync-client.d.ts.map +1 -1
  1492. package/node_modules/@murphai/operator-config/dist/device-sync-client.js +6 -2
  1493. package/node_modules/@murphai/operator-config/dist/device-sync-client.js.map +1 -1
  1494. package/node_modules/@murphai/operator-config/dist/hosted-assistant-config-constants.d.ts +1 -1
  1495. package/node_modules/@murphai/operator-config/dist/hosted-assistant-config-constants.d.ts.map +1 -1
  1496. package/node_modules/@murphai/operator-config/dist/hosted-assistant-config.d.ts.map +1 -1
  1497. package/node_modules/@murphai/operator-config/dist/inbox-cli-contracts.d.ts +138 -93
  1498. package/node_modules/@murphai/operator-config/dist/inbox-cli-contracts.d.ts.map +1 -1
  1499. package/node_modules/@murphai/operator-config/dist/inbox-cli-contracts.js +40 -3
  1500. package/node_modules/@murphai/operator-config/dist/inbox-cli-contracts.js.map +1 -1
  1501. package/node_modules/@murphai/operator-config/dist/linq-runtime.d.ts +7 -11
  1502. package/node_modules/@murphai/operator-config/dist/linq-runtime.d.ts.map +1 -1
  1503. package/node_modules/@murphai/operator-config/dist/linq-runtime.js +25 -10
  1504. package/node_modules/@murphai/operator-config/dist/linq-runtime.js.map +1 -1
  1505. package/node_modules/@murphai/operator-config/dist/message-formatting.d.ts.map +1 -1
  1506. package/node_modules/@murphai/operator-config/dist/message-formatting.js +14 -3
  1507. package/node_modules/@murphai/operator-config/dist/message-formatting.js.map +1 -1
  1508. package/node_modules/@murphai/operator-config/dist/operator-config/self-delivery-targets.d.ts +4 -2
  1509. package/node_modules/@murphai/operator-config/dist/operator-config/self-delivery-targets.d.ts.map +1 -1
  1510. package/node_modules/@murphai/operator-config/dist/operator-config/storage.js.map +1 -1
  1511. package/node_modules/@murphai/operator-config/dist/operator-config.d.ts +7 -5
  1512. package/node_modules/@murphai/operator-config/dist/operator-config.d.ts.map +1 -1
  1513. package/node_modules/@murphai/operator-config/dist/operator-config.js.map +1 -1
  1514. package/node_modules/@murphai/operator-config/dist/setup-cli-contracts.d.ts +54 -54
  1515. package/node_modules/@murphai/operator-config/dist/setup-cli-contracts.d.ts.map +1 -1
  1516. package/node_modules/@murphai/operator-config/dist/setup-runtime-env.js.map +1 -1
  1517. package/node_modules/@murphai/operator-config/dist/telegram-runtime.d.ts.map +1 -1
  1518. package/node_modules/@murphai/operator-config/dist/telegram-runtime.js +11 -1
  1519. package/node_modules/@murphai/operator-config/dist/telegram-runtime.js.map +1 -1
  1520. package/node_modules/@murphai/operator-config/dist/vault-cli-contracts.d.ts +85 -85
  1521. package/node_modules/@murphai/operator-config/dist/vault-cli-contracts.js +1 -1
  1522. package/node_modules/@murphai/operator-config/dist/vault-cli-errors.d.ts.map +1 -1
  1523. package/node_modules/@murphai/operator-config/package.json +0 -5
  1524. package/node_modules/@murphai/parsers/README.md +4 -2
  1525. package/node_modules/@murphai/parsers/dist/adapters/ffmpeg.js.map +1 -1
  1526. package/node_modules/@murphai/parsers/dist/adapters/poppler-pdf.js.map +1 -1
  1527. package/node_modules/@murphai/parsers/dist/adapters/text-file.js.map +1 -1
  1528. package/node_modules/@murphai/parsers/dist/adapters/whisper-cpp.js.map +1 -1
  1529. package/node_modules/@murphai/parsers/dist/adapters/zxing-wasm.js.map +1 -1
  1530. package/node_modules/@murphai/parsers/dist/contracts/parser-output.d.ts +15 -0
  1531. package/node_modules/@murphai/parsers/dist/contracts/parser-output.d.ts.map +1 -0
  1532. package/node_modules/@murphai/parsers/dist/contracts/parser-output.js +368 -0
  1533. package/node_modules/@murphai/parsers/dist/contracts/parser-output.js.map +1 -0
  1534. package/node_modules/@murphai/parsers/dist/index.d.ts +5 -2
  1535. package/node_modules/@murphai/parsers/dist/index.d.ts.map +1 -1
  1536. package/node_modules/@murphai/parsers/dist/index.js +3 -1
  1537. package/node_modules/@murphai/parsers/dist/index.js.map +1 -1
  1538. package/node_modules/@murphai/parsers/dist/parser-result.d.ts +2 -0
  1539. package/node_modules/@murphai/parsers/dist/parser-result.d.ts.map +1 -0
  1540. package/node_modules/@murphai/parsers/dist/parser-result.js +2 -0
  1541. package/node_modules/@murphai/parsers/dist/parser-result.js.map +1 -0
  1542. package/node_modules/@murphai/parsers/dist/pipelines/parse-attachment.d.ts.map +1 -1
  1543. package/node_modules/@murphai/parsers/dist/pipelines/parse-attachment.js +2 -245
  1544. package/node_modules/@murphai/parsers/dist/pipelines/parse-attachment.js.map +1 -1
  1545. package/node_modules/@murphai/parsers/dist/pipelines/worker.d.ts +1 -1
  1546. package/node_modules/@murphai/parsers/dist/pipelines/worker.d.ts.map +1 -1
  1547. package/node_modules/@murphai/parsers/dist/pipelines/worker.js +12 -4
  1548. package/node_modules/@murphai/parsers/dist/pipelines/worker.js.map +1 -1
  1549. package/node_modules/@murphai/parsers/dist/publish/legacy-attempt-compactor.d.ts +18 -0
  1550. package/node_modules/@murphai/parsers/dist/publish/legacy-attempt-compactor.d.ts.map +1 -0
  1551. package/node_modules/@murphai/parsers/dist/publish/legacy-attempt-compactor.js +480 -0
  1552. package/node_modules/@murphai/parsers/dist/publish/legacy-attempt-compactor.js.map +1 -0
  1553. package/node_modules/@murphai/parsers/dist/publish/writer.d.ts +26 -8
  1554. package/node_modules/@murphai/parsers/dist/publish/writer.d.ts.map +1 -1
  1555. package/node_modules/@murphai/parsers/dist/publish/writer.js +168 -57
  1556. package/node_modules/@murphai/parsers/dist/publish/writer.js.map +1 -1
  1557. package/node_modules/@murphai/parsers/dist/registry/policy.js.map +1 -1
  1558. package/node_modules/@murphai/parsers/dist/registry/registry.js.map +1 -1
  1559. package/node_modules/@murphai/parsers/dist/shared.js.map +1 -1
  1560. package/node_modules/@murphai/parsers/dist/toolchain/discover.js.map +1 -1
  1561. package/node_modules/@murphai/parsers/package.json +4 -0
  1562. package/node_modules/@murphai/query/dist/automation.d.ts +3 -2
  1563. package/node_modules/@murphai/query/dist/automation.d.ts.map +1 -1
  1564. package/node_modules/@murphai/query/dist/automation.js +68 -5
  1565. package/node_modules/@murphai/query/dist/automation.js.map +1 -1
  1566. package/node_modules/@murphai/query/dist/biomarker-change-sentiment.d.ts +10 -0
  1567. package/node_modules/@murphai/query/dist/biomarker-change-sentiment.d.ts.map +1 -0
  1568. package/node_modules/@murphai/query/dist/biomarker-change-sentiment.js +24 -0
  1569. package/node_modules/@murphai/query/dist/biomarker-change-sentiment.js.map +1 -0
  1570. package/node_modules/@murphai/query/dist/browser-experiments.d.ts +4 -0
  1571. package/node_modules/@murphai/query/dist/browser-experiments.d.ts.map +1 -1
  1572. package/node_modules/@murphai/query/dist/browser-experiments.js +3 -0
  1573. package/node_modules/@murphai/query/dist/browser-experiments.js.map +1 -1
  1574. package/node_modules/@murphai/query/dist/browser-replica/biomarker-panel.js +3 -3
  1575. package/node_modules/@murphai/query/dist/browser-replica/biomarker-panel.js.map +1 -1
  1576. package/node_modules/@murphai/query/dist/browser-replica/build.d.ts.map +1 -1
  1577. package/node_modules/@murphai/query/dist/browser-replica/build.js +20 -0
  1578. package/node_modules/@murphai/query/dist/browser-replica/build.js.map +1 -1
  1579. package/node_modules/@murphai/query/dist/browser-replica/experiments.d.ts +8 -2
  1580. package/node_modules/@murphai/query/dist/browser-replica/experiments.d.ts.map +1 -1
  1581. package/node_modules/@murphai/query/dist/browser-replica/experiments.js +128 -26
  1582. package/node_modules/@murphai/query/dist/browser-replica/experiments.js.map +1 -1
  1583. package/node_modules/@murphai/query/dist/browser-replica/murph-age.d.ts +1 -1
  1584. package/node_modules/@murphai/query/dist/browser-replica/murph-age.d.ts.map +1 -1
  1585. package/node_modules/@murphai/query/dist/browser-replica/murph-age.js +2 -1
  1586. package/node_modules/@murphai/query/dist/browser-replica/murph-age.js.map +1 -1
  1587. package/node_modules/@murphai/query/dist/browser-replica/query.js.map +1 -1
  1588. package/node_modules/@murphai/query/dist/browser-replica/shared.d.ts +1 -1
  1589. package/node_modules/@murphai/query/dist/browser-replica/shared.d.ts.map +1 -1
  1590. package/node_modules/@murphai/query/dist/browser-replica/shared.js +1 -0
  1591. package/node_modules/@murphai/query/dist/browser-replica/shared.js.map +1 -1
  1592. package/node_modules/@murphai/query/dist/browser-replica/views.js +1 -0
  1593. package/node_modules/@murphai/query/dist/browser-replica/views.js.map +1 -1
  1594. package/node_modules/@murphai/query/dist/browser-replica.d.ts +1 -3
  1595. package/node_modules/@murphai/query/dist/browser-replica.d.ts.map +1 -1
  1596. package/node_modules/@murphai/query/dist/browser-replica.js +0 -1
  1597. package/node_modules/@murphai/query/dist/browser-replica.js.map +1 -1
  1598. package/node_modules/@murphai/query/dist/browser.d.ts +2 -2
  1599. package/node_modules/@murphai/query/dist/browser.d.ts.map +1 -1
  1600. package/node_modules/@murphai/query/dist/browser.js +1 -1
  1601. package/node_modules/@murphai/query/dist/browser.js.map +1 -1
  1602. package/node_modules/@murphai/query/dist/canonical-entities.d.ts.map +1 -1
  1603. package/node_modules/@murphai/query/dist/canonical-entities.js +1 -0
  1604. package/node_modules/@murphai/query/dist/canonical-entities.js.map +1 -1
  1605. package/node_modules/@murphai/query/dist/entity-families.d.ts +1 -1
  1606. package/node_modules/@murphai/query/dist/entity-families.d.ts.map +1 -1
  1607. package/node_modules/@murphai/query/dist/entity-families.js +1 -0
  1608. package/node_modules/@murphai/query/dist/entity-families.js.map +1 -1
  1609. package/node_modules/@murphai/query/dist/experiment-adherence.d.ts +55 -2
  1610. package/node_modules/@murphai/query/dist/experiment-adherence.d.ts.map +1 -1
  1611. package/node_modules/@murphai/query/dist/experiment-adherence.js +367 -13
  1612. package/node_modules/@murphai/query/dist/experiment-adherence.js.map +1 -1
  1613. package/node_modules/@murphai/query/dist/experiment-progress-card.d.ts +6 -1
  1614. package/node_modules/@murphai/query/dist/experiment-progress-card.d.ts.map +1 -1
  1615. package/node_modules/@murphai/query/dist/experiment-progress-card.js +48 -13
  1616. package/node_modules/@murphai/query/dist/experiment-progress-card.js.map +1 -1
  1617. package/node_modules/@murphai/query/dist/experiments.d.ts +11 -1
  1618. package/node_modules/@murphai/query/dist/experiments.d.ts.map +1 -1
  1619. package/node_modules/@murphai/query/dist/experiments.js +265 -36
  1620. package/node_modules/@murphai/query/dist/experiments.js.map +1 -1
  1621. package/node_modules/@murphai/query/dist/export-pack.js.map +1 -1
  1622. package/node_modules/@murphai/query/dist/group-weekly.d.ts +32 -0
  1623. package/node_modules/@murphai/query/dist/group-weekly.d.ts.map +1 -0
  1624. package/node_modules/@murphai/query/dist/group-weekly.js +166 -0
  1625. package/node_modules/@murphai/query/dist/group-weekly.js.map +1 -0
  1626. package/node_modules/@murphai/query/dist/health/assessments.js.map +1 -1
  1627. package/node_modules/@murphai/query/dist/health/blood-tests.js.map +1 -1
  1628. package/node_modules/@murphai/query/dist/health/canonical-collector.d.ts +1 -0
  1629. package/node_modules/@murphai/query/dist/health/canonical-collector.d.ts.map +1 -1
  1630. package/node_modules/@murphai/query/dist/health/canonical-collector.js +4 -1
  1631. package/node_modules/@murphai/query/dist/health/canonical-collector.js.map +1 -1
  1632. package/node_modules/@murphai/query/dist/health/foods.js.map +1 -1
  1633. package/node_modules/@murphai/query/dist/health/habitat.d.ts +6 -0
  1634. package/node_modules/@murphai/query/dist/health/habitat.d.ts.map +1 -0
  1635. package/node_modules/@murphai/query/dist/health/habitat.js +12 -0
  1636. package/node_modules/@murphai/query/dist/health/habitat.js.map +1 -0
  1637. package/node_modules/@murphai/query/dist/health/immunizations.js.map +1 -1
  1638. package/node_modules/@murphai/query/dist/health/index.d.ts +1 -0
  1639. package/node_modules/@murphai/query/dist/health/index.d.ts.map +1 -1
  1640. package/node_modules/@murphai/query/dist/health/index.js +1 -0
  1641. package/node_modules/@murphai/query/dist/health/index.js.map +1 -1
  1642. package/node_modules/@murphai/query/dist/health/projections.js.map +1 -1
  1643. package/node_modules/@murphai/query/dist/health/projectors/history.d.ts +1 -1
  1644. package/node_modules/@murphai/query/dist/health/providers.js.map +1 -1
  1645. package/node_modules/@murphai/query/dist/health/recipes.js.map +1 -1
  1646. package/node_modules/@murphai/query/dist/health/registries.d.ts +11 -0
  1647. package/node_modules/@murphai/query/dist/health/registries.d.ts.map +1 -1
  1648. package/node_modules/@murphai/query/dist/health/registries.js +18 -2
  1649. package/node_modules/@murphai/query/dist/health/registries.js.map +1 -1
  1650. package/node_modules/@murphai/query/dist/health/supplements.js.map +1 -1
  1651. package/node_modules/@murphai/query/dist/health/workout-formats.js.map +1 -1
  1652. package/node_modules/@murphai/query/dist/id-families.d.ts +1 -13
  1653. package/node_modules/@murphai/query/dist/id-families.d.ts.map +1 -1
  1654. package/node_modules/@murphai/query/dist/id-families.js +1 -119
  1655. package/node_modules/@murphai/query/dist/id-families.js.map +1 -1
  1656. package/node_modules/@murphai/query/dist/index.d.ts +10 -15
  1657. package/node_modules/@murphai/query/dist/index.d.ts.map +1 -1
  1658. package/node_modules/@murphai/query/dist/index.js +7 -31
  1659. package/node_modules/@murphai/query/dist/index.js.map +1 -1
  1660. package/node_modules/@murphai/query/dist/knowledge-format.js +1 -1
  1661. package/node_modules/@murphai/query/dist/knowledge-graph.js +4 -4
  1662. package/node_modules/@murphai/query/dist/knowledge-model.d.ts +1 -1
  1663. package/node_modules/@murphai/query/dist/knowledge-search.js +2 -2
  1664. package/node_modules/@murphai/query/dist/knowledge-search.js.map +1 -1
  1665. package/node_modules/@murphai/query/dist/meal-nutrition.js.map +1 -1
  1666. package/node_modules/@murphai/query/dist/memory.d.ts +3 -2
  1667. package/node_modules/@murphai/query/dist/memory.d.ts.map +1 -1
  1668. package/node_modules/@murphai/query/dist/memory.js +4 -1
  1669. package/node_modules/@murphai/query/dist/memory.js.map +1 -1
  1670. package/node_modules/@murphai/query/dist/metrics/index.js +23 -1
  1671. package/node_modules/@murphai/query/dist/metrics/index.js.map +1 -1
  1672. package/node_modules/@murphai/query/dist/metrics/projection.d.ts.map +1 -1
  1673. package/node_modules/@murphai/query/dist/metrics/projection.js +101 -7
  1674. package/node_modules/@murphai/query/dist/metrics/projection.js.map +1 -1
  1675. package/node_modules/@murphai/query/dist/murph-age.d.ts +1 -1
  1676. package/node_modules/@murphai/query/dist/murph-age.d.ts.map +1 -1
  1677. package/node_modules/@murphai/query/dist/murph-age.js +2 -1
  1678. package/node_modules/@murphai/query/dist/murph-age.js.map +1 -1
  1679. package/node_modules/@murphai/query/dist/overview-weekly-stats.js.map +1 -1
  1680. package/node_modules/@murphai/query/dist/overview.js.map +1 -1
  1681. package/node_modules/@murphai/query/dist/projection/entity-store.d.ts +2 -0
  1682. package/node_modules/@murphai/query/dist/projection/entity-store.d.ts.map +1 -1
  1683. package/node_modules/@murphai/query/dist/projection/entity-store.js +56 -0
  1684. package/node_modules/@murphai/query/dist/projection/entity-store.js.map +1 -1
  1685. package/node_modules/@murphai/query/dist/projection/rebuild.js.map +1 -1
  1686. package/node_modules/@murphai/query/dist/projection/schema.d.ts +1 -1
  1687. package/node_modules/@murphai/query/dist/projection/schema.js +2 -2
  1688. package/node_modules/@murphai/query/dist/projection/schema.js.map +1 -1
  1689. package/node_modules/@murphai/query/dist/projection/wearable-summary-compose.js +25 -2
  1690. package/node_modules/@murphai/query/dist/projection/wearable-summary-compose.js.map +1 -1
  1691. package/node_modules/@murphai/query/dist/projection/wearable-summary-projector.js +1 -0
  1692. package/node_modules/@murphai/query/dist/projection/wearable-summary-projector.js.map +1 -1
  1693. package/node_modules/@murphai/query/dist/projection/wearable-summary-store.d.ts.map +1 -1
  1694. package/node_modules/@murphai/query/dist/protocols.js.map +1 -1
  1695. package/node_modules/@murphai/query/dist/query-projection-types.d.ts +7 -0
  1696. package/node_modules/@murphai/query/dist/query-projection-types.d.ts.map +1 -1
  1697. package/node_modules/@murphai/query/dist/query-projection.d.ts +3 -2
  1698. package/node_modules/@murphai/query/dist/query-projection.d.ts.map +1 -1
  1699. package/node_modules/@murphai/query/dist/query-projection.js +5 -1
  1700. package/node_modules/@murphai/query/dist/query-projection.js.map +1 -1
  1701. package/node_modules/@murphai/query/dist/read-model.d.ts +4 -0
  1702. package/node_modules/@murphai/query/dist/read-model.d.ts.map +1 -1
  1703. package/node_modules/@murphai/query/dist/read-model.js +1 -0
  1704. package/node_modules/@murphai/query/dist/read-model.js.map +1 -1
  1705. package/node_modules/@murphai/query/dist/scheduled-logs.js.map +1 -1
  1706. package/node_modules/@murphai/query/dist/search-shared.js.map +1 -1
  1707. package/node_modules/@murphai/query/dist/search.js.map +1 -1
  1708. package/node_modules/@murphai/query/dist/summaries.js.map +1 -1
  1709. package/node_modules/@murphai/query/dist/timeline.js.map +1 -1
  1710. package/node_modules/@murphai/query/dist/vault-source.d.ts.map +1 -1
  1711. package/node_modules/@murphai/query/dist/vault-source.js +39 -3
  1712. package/node_modules/@murphai/query/dist/vault-source.js.map +1 -1
  1713. package/node_modules/@murphai/query/dist/wearables/candidates.d.ts +5 -2
  1714. package/node_modules/@murphai/query/dist/wearables/candidates.d.ts.map +1 -1
  1715. package/node_modules/@murphai/query/dist/wearables/candidates.js +305 -7
  1716. package/node_modules/@murphai/query/dist/wearables/candidates.js.map +1 -1
  1717. package/node_modules/@murphai/query/dist/wearables/dedupe.d.ts.map +1 -1
  1718. package/node_modules/@murphai/query/dist/wearables/dedupe.js +3 -1
  1719. package/node_modules/@murphai/query/dist/wearables/dedupe.js.map +1 -1
  1720. package/node_modules/@murphai/query/dist/wearables/observation.js.map +1 -1
  1721. package/node_modules/@murphai/query/dist/wearables/origin.js.map +1 -1
  1722. package/node_modules/@murphai/query/dist/wearables/provider-policy.js.map +1 -1
  1723. package/node_modules/@murphai/query/dist/wearables/public-output.d.ts.map +1 -1
  1724. package/node_modules/@murphai/query/dist/wearables/public-output.js +6 -79
  1725. package/node_modules/@murphai/query/dist/wearables/public-output.js.map +1 -1
  1726. package/node_modules/@murphai/query/dist/wearables/selection.d.ts.map +1 -1
  1727. package/node_modules/@murphai/query/dist/wearables/selection.js +5 -1
  1728. package/node_modules/@murphai/query/dist/wearables/selection.js.map +1 -1
  1729. package/node_modules/@murphai/query/dist/wearables/sleep-association.d.ts +9 -0
  1730. package/node_modules/@murphai/query/dist/wearables/sleep-association.d.ts.map +1 -0
  1731. package/node_modules/@murphai/query/dist/wearables/sleep-association.js +81 -0
  1732. package/node_modules/@murphai/query/dist/wearables/sleep-association.js.map +1 -0
  1733. package/node_modules/@murphai/query/dist/wearables/types.d.ts +29 -4
  1734. package/node_modules/@murphai/query/dist/wearables/types.d.ts.map +1 -1
  1735. package/node_modules/@murphai/query/dist/wearables/types.js.map +1 -1
  1736. package/node_modules/@murphai/query/dist/wearables.d.ts.map +1 -1
  1737. package/node_modules/@murphai/query/dist/wearables.js +50 -50
  1738. package/node_modules/@murphai/query/dist/wearables.js.map +1 -1
  1739. package/node_modules/@murphai/query/package.json +5 -0
  1740. package/node_modules/@murphai/runtime-state/README.md +1 -1
  1741. package/node_modules/@murphai/runtime-state/dist/assistant-state-fs.js.map +1 -1
  1742. package/node_modules/@murphai/runtime-state/dist/assistant-state-security.js +1 -1
  1743. package/node_modules/@murphai/runtime-state/dist/assistant-state-security.js.map +1 -1
  1744. package/node_modules/@murphai/runtime-state/dist/atomic-write.js.map +1 -1
  1745. package/node_modules/@murphai/runtime-state/dist/clinical-records-local-state-descriptors.d.ts +3 -0
  1746. package/node_modules/@murphai/runtime-state/dist/clinical-records-local-state-descriptors.d.ts.map +1 -0
  1747. package/node_modules/@murphai/runtime-state/dist/clinical-records-local-state-descriptors.js +12 -0
  1748. package/node_modules/@murphai/runtime-state/dist/clinical-records-local-state-descriptors.js.map +1 -0
  1749. package/node_modules/@murphai/runtime-state/dist/hosted-bundles.d.ts +1 -0
  1750. package/node_modules/@murphai/runtime-state/dist/hosted-bundles.d.ts.map +1 -1
  1751. package/node_modules/@murphai/runtime-state/dist/hosted-bundles.js +65 -31
  1752. package/node_modules/@murphai/runtime-state/dist/hosted-bundles.js.map +1 -1
  1753. package/node_modules/@murphai/runtime-state/dist/hosted-domain-crypto.d.ts +1 -1
  1754. package/node_modules/@murphai/runtime-state/dist/hosted-domain-crypto.d.ts.map +1 -1
  1755. package/node_modules/@murphai/runtime-state/dist/hosted-domain-crypto.js +10 -0
  1756. package/node_modules/@murphai/runtime-state/dist/hosted-domain-crypto.js.map +1 -1
  1757. package/node_modules/@murphai/runtime-state/dist/hosted-email.d.ts +11 -0
  1758. package/node_modules/@murphai/runtime-state/dist/hosted-email.d.ts.map +1 -1
  1759. package/node_modules/@murphai/runtime-state/dist/hosted-email.js +56 -3
  1760. package/node_modules/@murphai/runtime-state/dist/hosted-email.js.map +1 -1
  1761. package/node_modules/@murphai/runtime-state/dist/hosted-storage.d.ts +1 -1
  1762. package/node_modules/@murphai/runtime-state/dist/hosted-storage.d.ts.map +1 -1
  1763. package/node_modules/@murphai/runtime-state/dist/hosted-storage.js +12 -2
  1764. package/node_modules/@murphai/runtime-state/dist/hosted-storage.js.map +1 -1
  1765. package/node_modules/@murphai/runtime-state/dist/local-state-descriptor-helpers.js.map +1 -1
  1766. package/node_modules/@murphai/runtime-state/dist/local-state-descriptor-manifests.d.ts.map +1 -1
  1767. package/node_modules/@murphai/runtime-state/dist/local-state-descriptor-manifests.js +2 -0
  1768. package/node_modules/@murphai/runtime-state/dist/local-state-descriptor-manifests.js.map +1 -1
  1769. package/node_modules/@murphai/runtime-state/dist/locks.d.ts.map +1 -1
  1770. package/node_modules/@murphai/runtime-state/dist/loopback-control-plane.js.map +1 -1
  1771. package/node_modules/@murphai/runtime-state/dist/process-env.js.map +1 -1
  1772. package/node_modules/@murphai/runtime-state/dist/process-identity.js.map +1 -1
  1773. package/node_modules/@murphai/runtime-state/dist/runtime-paths.d.ts +2 -0
  1774. package/node_modules/@murphai/runtime-state/dist/runtime-paths.d.ts.map +1 -1
  1775. package/node_modules/@murphai/runtime-state/dist/runtime-paths.js +2 -0
  1776. package/node_modules/@murphai/runtime-state/dist/runtime-paths.js.map +1 -1
  1777. package/node_modules/@murphai/runtime-state/dist/shared.js.map +1 -1
  1778. package/node_modules/@murphai/runtime-state/dist/sqlite-warning-filter.js.map +1 -1
  1779. package/node_modules/@murphai/runtime-state/dist/sqlite.js.map +1 -1
  1780. package/node_modules/@murphai/runtime-state/dist/ulid.js.map +1 -1
  1781. package/node_modules/@murphai/setup-cli/dist/setup-agentmail.js.map +1 -1
  1782. package/node_modules/@murphai/setup-cli/dist/setup-assistant-account.js.map +1 -1
  1783. package/node_modules/@murphai/setup-cli/dist/setup-assistant-defaults.js.map +1 -1
  1784. package/node_modules/@murphai/setup-cli/dist/setup-assistant-wizard.js.map +1 -1
  1785. package/node_modules/@murphai/setup-cli/dist/setup-assistant.js.map +1 -1
  1786. package/node_modules/@murphai/setup-cli/dist/setup-cli.d.ts.map +1 -1
  1787. package/node_modules/@murphai/setup-cli/dist/setup-cli.js +1 -1
  1788. package/node_modules/@murphai/setup-cli/dist/setup-cli.js.map +1 -1
  1789. package/node_modules/@murphai/setup-cli/dist/setup-services/toolchain.js.map +1 -1
  1790. package/node_modules/@murphai/setup-cli/dist/setup-services.js.map +1 -1
  1791. package/node_modules/@murphai/setup-cli/dist/setup-wizard-options.js.map +1 -1
  1792. package/node_modules/@murphai/vault-usecases/README.md +11 -0
  1793. package/node_modules/@murphai/vault-usecases/dist/assistant-vault-paths.js.map +1 -1
  1794. package/node_modules/@murphai/vault-usecases/dist/clinical-records.d.ts +102 -0
  1795. package/node_modules/@murphai/vault-usecases/dist/clinical-records.d.ts.map +1 -0
  1796. package/node_modules/@murphai/vault-usecases/dist/clinical-records.js +374 -0
  1797. package/node_modules/@murphai/vault-usecases/dist/clinical-records.js.map +1 -0
  1798. package/node_modules/@murphai/vault-usecases/dist/commands/query-record-command-helpers.d.ts.map +1 -1
  1799. package/node_modules/@murphai/vault-usecases/dist/commands/query-record-command-helpers.js +13 -4
  1800. package/node_modules/@murphai/vault-usecases/dist/commands/query-record-command-helpers.js.map +1 -1
  1801. package/node_modules/@murphai/vault-usecases/dist/experiment-onboarding-options.d.ts +2 -2
  1802. package/node_modules/@murphai/vault-usecases/dist/health-cli-descriptors.d.ts +3 -3
  1803. package/node_modules/@murphai/vault-usecases/dist/health-cli-descriptors.js +1 -1
  1804. package/node_modules/@murphai/vault-usecases/dist/preferences.d.ts +34 -3
  1805. package/node_modules/@murphai/vault-usecases/dist/preferences.d.ts.map +1 -1
  1806. package/node_modules/@murphai/vault-usecases/dist/preferences.js +84 -1
  1807. package/node_modules/@murphai/vault-usecases/dist/preferences.js.map +1 -1
  1808. package/node_modules/@murphai/vault-usecases/dist/testing/junction-wearable-fixture.d.ts +16 -2
  1809. package/node_modules/@murphai/vault-usecases/dist/testing/junction-wearable-fixture.d.ts.map +1 -1
  1810. package/node_modules/@murphai/vault-usecases/dist/testing/junction-wearable-fixture.js +20 -1
  1811. package/node_modules/@murphai/vault-usecases/dist/testing/junction-wearable-fixture.js.map +1 -1
  1812. package/node_modules/@murphai/vault-usecases/dist/testing.d.ts +2 -2
  1813. package/node_modules/@murphai/vault-usecases/dist/testing.d.ts.map +1 -1
  1814. package/node_modules/@murphai/vault-usecases/dist/testing.js +1 -1
  1815. package/node_modules/@murphai/vault-usecases/dist/testing.js.map +1 -1
  1816. package/node_modules/@murphai/vault-usecases/dist/usecases/capture.d.ts +18 -18
  1817. package/node_modules/@murphai/vault-usecases/dist/usecases/capture.d.ts.map +1 -1
  1818. package/node_modules/@murphai/vault-usecases/dist/usecases/clinical-imports.d.ts +154 -154
  1819. package/node_modules/@murphai/vault-usecases/dist/usecases/clinical-imports.d.ts.map +1 -1
  1820. package/node_modules/@murphai/vault-usecases/dist/usecases/clinical-imports.js +3 -1
  1821. package/node_modules/@murphai/vault-usecases/dist/usecases/clinical-imports.js.map +1 -1
  1822. package/node_modules/@murphai/vault-usecases/dist/usecases/document-meal-read.d.ts +10 -9
  1823. package/node_modules/@murphai/vault-usecases/dist/usecases/document-meal-read.d.ts.map +1 -1
  1824. package/node_modules/@murphai/vault-usecases/dist/usecases/document-meal-read.js +2 -1
  1825. package/node_modules/@murphai/vault-usecases/dist/usecases/document-meal-read.js.map +1 -1
  1826. package/node_modules/@murphai/vault-usecases/dist/usecases/encounter.d.ts +35 -35
  1827. package/node_modules/@murphai/vault-usecases/dist/usecases/experiment-journal-vault.d.ts +38 -37
  1828. package/node_modules/@murphai/vault-usecases/dist/usecases/experiment-journal-vault.d.ts.map +1 -1
  1829. package/node_modules/@murphai/vault-usecases/dist/usecases/experiment-journal-vault.js +37 -5
  1830. package/node_modules/@murphai/vault-usecases/dist/usecases/experiment-journal-vault.js.map +1 -1
  1831. package/node_modules/@murphai/vault-usecases/dist/usecases/explicit-health-family-services.js +7 -7
  1832. package/node_modules/@murphai/vault-usecases/dist/usecases/food.d.ts +2 -2
  1833. package/node_modules/@murphai/vault-usecases/dist/usecases/food.d.ts.map +1 -1
  1834. package/node_modules/@murphai/vault-usecases/dist/usecases/integrated-services.d.ts.map +1 -1
  1835. package/node_modules/@murphai/vault-usecases/dist/usecases/integrated-services.js +57 -20
  1836. package/node_modules/@murphai/vault-usecases/dist/usecases/integrated-services.js.map +1 -1
  1837. package/node_modules/@murphai/vault-usecases/dist/usecases/intervention-experiment-link.d.ts +20 -10
  1838. package/node_modules/@murphai/vault-usecases/dist/usecases/intervention-experiment-link.d.ts.map +1 -1
  1839. package/node_modules/@murphai/vault-usecases/dist/usecases/intervention-experiment-link.js +1 -1
  1840. package/node_modules/@murphai/vault-usecases/dist/usecases/intervention-experiment-link.js.map +1 -1
  1841. package/node_modules/@murphai/vault-usecases/dist/usecases/intervention.d.ts +6 -6
  1842. package/node_modules/@murphai/vault-usecases/dist/usecases/intervention.d.ts.map +1 -1
  1843. package/node_modules/@murphai/vault-usecases/dist/usecases/measurement-read.d.ts +9 -9
  1844. package/node_modules/@murphai/vault-usecases/dist/usecases/measurement-read.d.ts.map +1 -1
  1845. package/node_modules/@murphai/vault-usecases/dist/usecases/measurement.d.ts +4 -4
  1846. package/node_modules/@murphai/vault-usecases/dist/usecases/measurement.d.ts.map +1 -1
  1847. package/node_modules/@murphai/vault-usecases/dist/usecases/provider-event.d.ts +13 -13
  1848. package/node_modules/@murphai/vault-usecases/dist/usecases/provider-event.d.ts.map +1 -1
  1849. package/node_modules/@murphai/vault-usecases/dist/usecases/recipe.d.ts +3 -3
  1850. package/node_modules/@murphai/vault-usecases/dist/usecases/runtime.d.ts.map +1 -1
  1851. package/node_modules/@murphai/vault-usecases/dist/usecases/runtime.js +1 -0
  1852. package/node_modules/@murphai/vault-usecases/dist/usecases/runtime.js.map +1 -1
  1853. package/node_modules/@murphai/vault-usecases/dist/usecases/shared.d.ts +1 -0
  1854. package/node_modules/@murphai/vault-usecases/dist/usecases/shared.d.ts.map +1 -1
  1855. package/node_modules/@murphai/vault-usecases/dist/usecases/shared.js +101 -8
  1856. package/node_modules/@murphai/vault-usecases/dist/usecases/shared.js.map +1 -1
  1857. package/node_modules/@murphai/vault-usecases/dist/usecases/types.d.ts +34 -0
  1858. package/node_modules/@murphai/vault-usecases/dist/usecases/types.d.ts.map +1 -1
  1859. package/node_modules/@murphai/vault-usecases/dist/usecases/vault-usecase-helpers.js.map +1 -1
  1860. package/node_modules/@murphai/vault-usecases/dist/usecases/workout-format.d.ts +33 -33
  1861. package/node_modules/@murphai/vault-usecases/dist/usecases/workout-format.d.ts.map +1 -1
  1862. package/node_modules/@murphai/vault-usecases/dist/usecases/workout-measurement.d.ts +4 -4
  1863. package/node_modules/@murphai/vault-usecases/dist/usecases/workout-model.js.map +1 -1
  1864. package/node_modules/@murphai/vault-usecases/dist/usecases/workout-read.d.ts +8 -8
  1865. package/node_modules/@murphai/vault-usecases/dist/usecases/workout-read.d.ts.map +1 -1
  1866. package/node_modules/@murphai/vault-usecases/dist/usecases/workout-read.js +1 -1
  1867. package/node_modules/@murphai/vault-usecases/dist/usecases/workout-read.js.map +1 -1
  1868. package/node_modules/@murphai/vault-usecases/dist/usecases/workout.d.ts +48 -48
  1869. package/node_modules/@murphai/vault-usecases/dist/usecases/workout.d.ts.map +1 -1
  1870. package/node_modules/@murphai/vault-usecases/dist/vault-services.d.ts.map +1 -1
  1871. package/node_modules/@murphai/vault-usecases/dist/vault-services.js +1 -0
  1872. package/node_modules/@murphai/vault-usecases/dist/vault-services.js.map +1 -1
  1873. package/node_modules/@murphai/vault-usecases/package.json +8 -0
  1874. package/node_modules/incur/dist/Cli.d.ts +4 -0
  1875. package/node_modules/incur/dist/Cli.js +10 -3
  1876. package/node_modules/incur/dist/SyncSkills.d.ts +2 -0
  1877. package/node_modules/incur/dist/SyncSkills.js +5 -2
  1878. package/node_modules/incur/src/Cli.ts +14 -3
  1879. package/node_modules/incur/src/SyncSkills.ts +9 -2
  1880. package/package.json +6 -4
  1881. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/turn-attachment-image-refs.d.ts +0 -15
  1882. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/turn-attachment-image-refs.d.ts.map +0 -1
  1883. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/turn-attachment-image-refs.js +0 -79
  1884. package/node_modules/@murphai/assistant-engine/dist/assistant-codex/turn-attachment-image-refs.js.map +0 -1
  1885. package/node_modules/@murphai/device-syncd/dist/providers/junction-connect-sources.d.ts.map +0 -1
  1886. package/node_modules/@murphai/device-syncd/dist/providers/junction-connect-sources.js.map +0 -1
  1887. package/node_modules/@murphai/messaging-ingress/dist/whatsapp-webhook.d.ts +0 -73
  1888. package/node_modules/@murphai/messaging-ingress/dist/whatsapp-webhook.d.ts.map +0 -1
  1889. package/node_modules/@murphai/messaging-ingress/dist/whatsapp-webhook.js +0 -212
  1890. package/node_modules/@murphai/messaging-ingress/dist/whatsapp-webhook.js.map +0 -1
  1891. package/node_modules/@murphai/operator-config/dist/runtime-errors.d.ts +0 -4
  1892. package/node_modules/@murphai/operator-config/dist/runtime-errors.d.ts.map +0 -1
  1893. package/node_modules/@murphai/operator-config/dist/runtime-errors.js +0 -19
  1894. package/node_modules/@murphai/operator-config/dist/runtime-errors.js.map +0 -1
  1895. package/node_modules/@murphai/operator-config/dist/whatsapp-runtime.d.ts +0 -34
  1896. package/node_modules/@murphai/operator-config/dist/whatsapp-runtime.d.ts.map +0 -1
  1897. package/node_modules/@murphai/operator-config/dist/whatsapp-runtime.js +0 -208
  1898. package/node_modules/@murphai/operator-config/dist/whatsapp-runtime.js.map +0 -1
  1899. package/node_modules/@murphai/vault-usecases/dist/query-id-families.d.ts +0 -4
  1900. package/node_modules/@murphai/vault-usecases/dist/query-id-families.d.ts.map +0 -1
  1901. package/node_modules/@murphai/vault-usecases/dist/query-id-families.js +0 -104
  1902. package/node_modules/@murphai/vault-usecases/dist/query-id-families.js.map +0 -1
  1903. /package/node_modules/@murphai/device-syncd/dist/{providers → config}/junction-connect-sources.d.ts +0 -0
@@ -1,16 +1,24 @@
1
1
  import { createHmac, createHash, timingSafeEqual } from "node:crypto";
2
2
  import { HistoricalPullCompleted as JunctionHistoricalPullCompletedSchema } from "@junction-api/sdk/serialization";
3
+ import { COMPANION_HRV_RMSSD_RESOURCE, parseCompanionHrvRmssdAdmissionId, parseSerializedCompanionHrvRmssdObservation, serializeCompanionHrvRmssdObservation, } from "@murphai/contracts";
4
+ import { canNormalizeJunctionSleepCycleRecordToCompactStages, classifyJunctionSummaryNormalizationEvidence, } from "@murphai/importers";
3
5
  import { resolveJunctionOrigin } from "@murphai/importers/device-providers/junction-origin";
4
- import { JUNCTION_ALLOWED_SUMMARY_RESOURCES, JUNCTION_ALLOWED_TIMESERIES_RESOURCES, JUNCTION_DEFAULT_SUMMARY_RESOURCES, JUNCTION_DEFAULT_TIMESERIES_RESOURCES, JUNCTION_KNOWN_TIMESERIES_RESOURCES, JUNCTION_SLEEP_END_TIMESTAMP_PATHS, JUNCTION_SLEEP_STAGE_ARRAY_PATHS, JUNCTION_SLEEP_STAGE_COUNT_PATHS, JUNCTION_SLEEP_STAGE_DURATION_PATHS, JUNCTION_SLEEP_STAGE_VALUE_PATHS, JUNCTION_SLEEP_START_TIMESTAMP_PATHS, JUNCTION_SLEEP_SUMMARY_NUMBER_PATHS, isJunctionRawDirectIdentityContainerKey, isJunctionRawDirectIdentityKey, normalizeJunctionSleepStageValue, normalizeJunctionResourceName, } from "@murphai/importers/device-providers/junction-resources";
6
+ import { JUNCTION_ALLOWED_SUMMARY_RESOURCES, JUNCTION_ALLOWED_TIMESERIES_RESOURCES, JUNCTION_DEFAULT_SUMMARY_RESOURCES, JUNCTION_DEFAULT_TIMESERIES_RESOURCES, JUNCTION_KNOWN_TIMESERIES_RESOURCES, isJunctionRawDirectIdentityContainerKey, isJunctionRawDirectIdentityKey, normalizeJunctionResourceName, } from "@murphai/importers/device-providers/junction-resources";
5
7
  import { JUNCTION_DEVICE_PROVIDER_DESCRIPTOR } from "@murphai/importers/device-providers/provider-descriptors";
6
8
  import { deviceSyncError, isDeviceSyncError } from "../errors.js";
7
- import { sanitizeHostedRuntimeDiagnosticText } from "../hosted-runtime.js";
9
+ import { isHostedRuntimeIdShapedDiagnosticToken, sanitizeHostedRuntimeDiagnosticText, } from "../hosted-runtime.js";
10
+ import { addJunctionHistoricalBackfillEvidence, canCurrentRuntimeMutateJunctionHistoricalBackfillProgress, encodeJunctionHistoricalBackfillStatus, hasJunctionHistoricalBackfillEvidence, JUNCTION_HISTORICAL_BACKFILL_COVERAGE_VERSION, JUNCTION_HISTORICAL_BACKFILL_METADATA_KEYS, readJunctionHistoricalBackfillEvidence, readJunctionHistoricalBackfillStatus, } from "../junction-historical-backfill-progress.js";
11
+ import { DEVICE_SYNC_METADATA_MAX_STRING_LENGTH } from "../metadata.js";
12
+ import { DEVICE_SYNC_HISTORICAL_DATA_RECONNECT_REQUIRED_ERROR_CODE, isJunctionHistoricalResetProviderSlug, requiresHistoricalResetDeviceSyncSource, } from "../public-account.js";
13
+ import { assertValidJunctionClientUserIdSecret, normalizeJunctionDeviceSyncRuntimeConfig, } from "../configured-provider-runtime-descriptors.js";
8
14
  import { addMilliseconds, normalizeString, sha256Text, subtractDays, } from "../shared.js";
15
+ import { JUNCTION_COMPANION_HRV_OBSERVATION_INVALID_CODE, JUNCTION_COMPANION_HEALTH_METADATA_EVENT_TYPE, JUNCTION_COMPANION_HEALTH_METADATA_MAX_BATCH_BYTES, JUNCTION_COMPANION_HEALTH_METADATA_RESOURCE, JUNCTION_COMPANION_HEALTH_METADATA_SOURCE_PROVIDER, JUNCTION_COMPANION_HEALTH_METADATA_SOURCE_TYPE, JunctionCompanionHealthMetadataParseError, parseJunctionCompanionHealthMetadataBatch, } from "../junction-resources.js";
9
16
  import { JunctionClient, } from "./junction-client.js";
10
- import { buildJunctionProviderSourceInstanceKey, JUNCTION_DEFAULT_PROVIDER_FILTER, normalizeJunctionProviderFilter, } from "./junction-connect-sources.js";
17
+ import { resolveJunctionDeviceConnectRouteByProviderSlug } from "../config/connect-routes.js";
18
+ import { buildJunctionProviderSourceInstanceKey, JUNCTION_DEFAULT_PROVIDER_FILTER, normalizeJunctionProviderFilter, } from "../config/junction-connect-sources.js";
11
19
  import { classifyDeviceSyncWebhookAcceptanceMode } from "../types.js";
12
20
  export { JUNCTION_DEVICE_PROVIDER_DESCRIPTOR };
13
- export { JUNCTION_CONNECT_SOURCE_TARGETS, JUNCTION_DEFAULT_PROVIDER_FILTER, JUNCTION_LINK_PROVIDER_SLUGS, normalizeJunctionProviderFilter, resolveJunctionConnectSourceLabel, resolveJunctionConnectTargetForSourceId, } from "./junction-connect-sources.js";
21
+ export { JUNCTION_CONNECT_SOURCE_TARGETS, JUNCTION_DEFAULT_PROVIDER_FILTER, JUNCTION_LINK_PROVIDER_SLUGS, normalizeJunctionProviderFilter, resolveJunctionConnectSourceLabel, resolveJunctionConnectTargetForSourceId, } from "../config/junction-connect-sources.js";
14
22
  export const JUNCTION_PROVIDER_CONFIG_KEY = "junction";
15
23
  export { JUNCTION_DEFAULT_SUMMARY_RESOURCES, JUNCTION_DEFAULT_TIMESERIES_RESOURCES, };
16
24
  const JUNCTION_WEBHOOK_ROOT_FIELDS = Object.freeze({
@@ -36,235 +44,22 @@ const JUNCTION_HISTORICAL_BACKFILL_COMPLETION_SUMMARY_RESOURCES = Object.freeze(
36
44
  "electrocardiogram",
37
45
  ]);
38
46
  const JUNCTION_HISTORICAL_BACKFILL_COMPLETION_SUMMARY_RESOURCE_SET = new Set(JUNCTION_HISTORICAL_BACKFILL_COMPLETION_SUMMARY_RESOURCES);
39
- const JUNCTION_HISTORICAL_SUMMARY_METRIC_PATHS = Object.freeze({
40
- activity: [
41
- "steps",
42
- "step_count",
43
- "daily_steps",
44
- "activeCalories",
45
- "active_calories",
46
- "calories",
47
- "totalCalories",
48
- "total_calories",
49
- "distanceKm",
50
- "distance_km",
51
- "floors",
52
- "floorsClimbed",
53
- "floors_climbed",
54
- "floorsAscended",
55
- "floors_ascended",
56
- "activityScore",
57
- "activity_score",
58
- "score",
59
- ],
60
- body: [
61
- "weightKg",
62
- "weight_kg",
63
- "weight",
64
- "bmi",
65
- "body_mass_index",
66
- "bodyFatPercentage",
67
- "body_fat_percentage",
68
- "body_fat_percent",
69
- "leanBodyMassKg",
70
- "lean_body_mass_kg",
71
- "leanBodyMassKilogram",
72
- "lean_body_mass_kilogram",
73
- "leanMassKg",
74
- "lean_mass_kg",
75
- "waistCircumference",
76
- "waist_circumference",
77
- "waistCircumferenceCentimeter",
78
- "waist_circumference_centimeter",
79
- "waistCircumferenceCm",
80
- "waist_circumference_cm",
81
- ],
82
- sleep: JUNCTION_SLEEP_SUMMARY_NUMBER_PATHS,
83
- sleep_cycle: [],
84
- workouts: [
85
- "calories",
86
- "totalCalories",
87
- "total_calories",
88
- "averageHeartRate",
89
- "average_heart_rate",
90
- "average_hr",
91
- "avg_hr",
92
- "maxHeartRate",
93
- "max_heart_rate",
94
- "max_hr",
95
- ],
96
- meal: [],
97
- menstrual_cycle: [],
98
- electrocardiogram: [],
99
- });
100
- const JUNCTION_RAW_ONLY_COMPLETION_PATHS = Object.freeze({
101
- meal: {
102
- strings: [
103
- "timestamp",
104
- "recordedAt",
105
- "recorded_at",
106
- "loggedAt",
107
- "logged_at",
108
- "date",
109
- "day",
110
- "calendarDate",
111
- "calendar_date",
112
- "name",
113
- "mealName",
114
- "meal_name",
115
- "mealType",
116
- "meal_type",
117
- "description",
118
- "notes",
119
- ],
120
- numbers: [
121
- "calories",
122
- "caloriesKcal",
123
- "calories_kcal",
124
- "energyKcal",
125
- "energy_kcal",
126
- "kcal",
127
- "protein",
128
- "proteinGrams",
129
- "protein_grams",
130
- "protein_g",
131
- "carbs",
132
- "carbohydrates",
133
- "carbohydrateGrams",
134
- "carbohydrate_grams",
135
- "carbohydrate_g",
136
- "fat",
137
- "fatGrams",
138
- "fat_grams",
139
- "fat_g",
140
- "fiber",
141
- "fibre",
142
- "water",
143
- "macros.water",
144
- "macros.fibre",
145
- "macros.fiber",
146
- "energy.value",
147
- ],
148
- arrays: [
149
- "foods",
150
- "foodItems",
151
- "food_items",
152
- "items",
153
- "ingredients",
154
- "nutrients",
155
- ],
156
- },
157
- menstrual_cycle: {
158
- strings: [
159
- "timestamp",
160
- "recordedAt",
161
- "recorded_at",
162
- "createdAt",
163
- "created_at",
164
- "date",
165
- "day",
166
- "cycleStart",
167
- "cycle_start",
168
- "cycleEnd",
169
- "cycle_end",
170
- "periodStart",
171
- "period_start",
172
- "periodEnd",
173
- "period_end",
174
- "flow",
175
- "menstrualFlow",
176
- "menstrual_flow",
177
- "cyclePhase",
178
- "cycle_phase",
179
- "menstrualPhase",
180
- "menstrual_phase",
181
- ],
182
- numbers: [
183
- "cycleDay",
184
- "cycle_day",
185
- "menstrualCycleDay",
186
- "menstrual_cycle_day",
187
- "cycleLengthDays",
188
- "cycle_length_days",
189
- "periodLengthDays",
190
- "period_length_days",
191
- ],
192
- arrays: [
193
- "menstrualFlow",
194
- "menstrual_flow",
195
- "symptoms",
196
- "sexualActivity",
197
- "sexual_activity",
198
- // Facet arrays the importer normalizes; a window containing only
199
- // these must not be classified as an empty backfill.
200
- "ovulationTest",
201
- "ovulation_test",
202
- "homePregnancyTest",
203
- "home_pregnancy_test",
204
- "detectedDeviations",
205
- "detected_deviations",
206
- "basalBodyTemperature",
207
- "basal_body_temperature",
208
- ],
209
- },
210
- electrocardiogram: {
211
- strings: [
212
- "sessionStart",
213
- "session_start",
214
- "classification",
215
- "inconclusiveCause",
216
- "inconclusive_cause",
217
- ],
218
- numbers: [
219
- "heartRateMean",
220
- "heart_rate_mean",
221
- "voltageSampleCount",
222
- "voltage_sample_count",
223
- ],
224
- arrays: [],
225
- },
226
- });
47
+ // Resource availability describes permission/capability, not whether the
48
+ // member should have a row. Limit connect-window obligations to high-signal
49
+ // daily families; sparse sessions such as workouts and body measurements still
50
+ // count as useful data, but their absence is not evidence of a failed export.
51
+ const JUNCTION_HISTORICAL_BACKFILL_REQUIRED_SUMMARY_RESOURCES = Object.freeze([
52
+ "activity",
53
+ "sleep",
54
+ "sleep_cycle",
55
+ ]);
56
+ const JUNCTION_HISTORICAL_BACKFILL_REQUIRED_SUMMARY_RESOURCE_SET = new Set(JUNCTION_HISTORICAL_BACKFILL_REQUIRED_SUMMARY_RESOURCES);
227
57
  const JUNCTION_WEBHOOK_NESTED_RECORD_KEYS = Object.freeze([
228
58
  "data",
229
59
  "results",
230
60
  "items",
231
61
  "records",
232
62
  ]);
233
- const JUNCTION_WORKOUT_START_TIMESTAMP_PATHS = Object.freeze([
234
- "startAt",
235
- "start_at",
236
- "start",
237
- "timeStart",
238
- "time_start",
239
- ]);
240
- const JUNCTION_WORKOUT_END_TIMESTAMP_PATHS = Object.freeze([
241
- "endAt",
242
- "end_at",
243
- "end",
244
- "timeEnd",
245
- "time_end",
246
- ]);
247
- const JUNCTION_WORKOUT_DURATION_MINUTE_PATHS = Object.freeze([
248
- "durationMinutes",
249
- "duration_minutes",
250
- "movingTimeMinutes",
251
- "moving_time_minutes",
252
- ]);
253
- const JUNCTION_WORKOUT_DURATION_SECOND_PATHS = Object.freeze([
254
- "durationSeconds",
255
- "duration_seconds",
256
- "movingTime",
257
- "moving_time",
258
- "duration",
259
- ]);
260
- const JUNCTION_WORKOUT_DURATION_MILLISECOND_PATHS = Object.freeze([
261
- "durationMillis",
262
- "duration_millis",
263
- ]);
264
- const JUNCTION_FLOATING_TIMESTAMP_SOURCE_PROVIDER_SLUGS = new Set([
265
- "abbott_libreview",
266
- "freestyle_libre",
267
- ]);
268
63
  const JUNCTION_TIMESERIES_RESOURCE_NAMES = new Set([
269
64
  ...JUNCTION_KNOWN_TIMESERIES_RESOURCES,
270
65
  ]);
@@ -290,22 +85,13 @@ const EMPTY_HISTORICAL_BACKFILL_RETRY_DELAYS_MS = Object.freeze([
290
85
  6 * 60 * 60_000,
291
86
  24 * 60 * 60_000,
292
87
  ]);
293
- const JUNCTION_HISTORICAL_BACKFILL_METADATA_KEYS = Object.freeze({
294
- status: "junctionHistoricalBackfillStatus",
295
- emptyAttempts: "junctionHistoricalBackfillEmptyAttempts",
296
- lastEmptyAt: "junctionHistoricalBackfillLastEmptyAt",
297
- windowStart: "junctionHistoricalBackfillWindowStart",
298
- windowEnd: "junctionHistoricalBackfillWindowEnd",
299
- });
88
+ const JUNCTION_SCHEDULED_RECONCILE_PRIORITY = 40;
89
+ const JUNCTION_HISTORICAL_BACKFILL_PRIORITY = 30;
90
+ const JUNCTION_HISTORICAL_BACKFILL_RETRY_PRIORITY = 50;
300
91
  export function createJunctionDeviceSyncProvider(config) {
301
- assertValidJunctionClientUserIdSecret(config.clientUserIdSecret);
92
+ const runtimeConfig = normalizeJunctionDeviceSyncRuntimeConfig(config);
302
93
  const client = new JunctionClient(toClientConfig(config));
303
- const summaryResources = normalizeRequiredResourceList(config.summaryResources, JUNCTION_DEFAULT_SUMMARY_RESOURCES, JUNCTION_ALLOWED_SUMMARY_RESOURCES, "summary");
304
- const timeseriesResources = normalizeOptionalResourceList(config.timeseriesResources, JUNCTION_DEFAULT_TIMESERIES_RESOURCES, JUNCTION_ALLOWED_TIMESERIES_RESOURCES, JUNCTION_KNOWN_TIMESERIES_RESOURCES, "timeseries");
305
- const providerFilter = normalizeJunctionProviderFilter(config.providerFilter);
306
- if (providerFilter.length === 0) {
307
- throw new TypeError("Junction provider filter must include at least one hosted Link provider.");
308
- }
94
+ const { providerFilter, summaryResources, timeseriesResources } = runtimeConfig;
309
95
  const summaryBackfillDays = config.summaryBackfillDays ?? DEFAULT_SUMMARY_BACKFILL_DAYS;
310
96
  const timeseriesBackfillDays = config.timeseriesBackfillDays ?? DEFAULT_TIMESERIES_BACKFILL_DAYS;
311
97
  const reconcileDays = config.reconcileDays ?? DEFAULT_RECONCILE_DAYS;
@@ -442,7 +228,7 @@ export function createJunctionDeviceSyncProvider(config) {
442
228
  const providers = await client.listUserProviders(userId);
443
229
  const providerSlugs = [
444
230
  ...new Set(providers
445
- .filter((provider) => mapJunctionSourceStatus(provider.status) === "connected")
231
+ .filter((provider) => mapJunctionSourceStatus(provider.status) !== "disconnected")
446
232
  .map((provider) => normalizeProviderSlug(provider.origin.sourceProviderSlug)
447
233
  ?? normalizeProviderSlug(provider.slug))
448
234
  .filter((providerSlug) => providerSlug !== null)),
@@ -462,7 +248,7 @@ export function createJunctionDeviceSyncProvider(config) {
462
248
  if (failedProviderSlugs.length > 0) {
463
249
  throw deviceSyncError({
464
250
  code: "JUNCTION_PROVIDER_DEREGISTER_FAILED",
465
- message: "Junction provider deregistration failed for one or more connected sources.",
251
+ message: "Junction provider deregistration failed for one or more sources.",
466
252
  retryable: true,
467
253
  httpStatus: 503,
468
254
  details: {
@@ -471,25 +257,119 @@ export function createJunctionDeviceSyncProvider(config) {
471
257
  });
472
258
  }
473
259
  }
474
- function createScheduledJobs(_account, now) {
260
+ function createScheduledJobs(account, now) {
261
+ const scheduledHistoricalBackfillJobs = buildScheduledHistoricalBackfillJobs(account, now);
262
+ const nextReconcileAt = resolveJunctionNextReconcileAt(account, now, addMilliseconds(now, reconcileIntervalMs));
475
263
  return {
476
264
  jobs: [
477
265
  buildWindowJob({
478
266
  kind: "reconcile",
479
267
  now,
480
268
  windowStart: subtractDays(now, reconcileDays),
481
- priority: 40,
269
+ priority: JUNCTION_SCHEDULED_RECONCILE_PRIORITY,
482
270
  }),
271
+ ...scheduledHistoricalBackfillJobs,
483
272
  ],
484
- nextReconcileAt: addMilliseconds(now, reconcileIntervalMs),
273
+ nextReconcileAt,
485
274
  };
486
275
  }
276
+ // Connect-time retry state is owned by metadata. The scheduler materializes
277
+ // one due backfill job from that state instead of storing a second retry
278
+ // identity in the job queue.
279
+ function buildScheduledHistoricalBackfillJobs(account, now) {
280
+ const metadata = account.metadata;
281
+ if (!canCurrentRuntimeMutateJunctionHistoricalBackfillProgress(metadata)) {
282
+ return [];
283
+ }
284
+ const statusState = readHistoricalBackfillStatus(metadata);
285
+ const status = statusState?.status ?? null;
286
+ const connectWindow = buildConnectHistoricalBackfillWindow(account, summaryBackfillDays);
287
+ const metadataWindowStart = normalizeString(metadata[JUNCTION_HISTORICAL_BACKFILL_METADATA_KEYS.windowStart]);
288
+ const metadataWindowEnd = normalizeString(metadata[JUNCTION_HISTORICAL_BACKFILL_METADATA_KEYS.windowEnd]);
289
+ const metadataMatchesConnectWindow = metadataWindowStart === connectWindow.windowStart
290
+ && metadataWindowEnd === connectWindow.windowEnd;
291
+ const coverageVersion = statusState?.coverageVersion ?? 0;
292
+ const hasCurrentCoverageSemantics = coverageVersion >= JUNCTION_HISTORICAL_BACKFILL_COVERAGE_VERSION;
293
+ if (hasCurrentCoverageSemantics
294
+ && (status === "complete" || status === "exhausted")
295
+ && metadataMatchesConnectWindow) {
296
+ return [];
297
+ }
298
+ if (hasCurrentCoverageSemantics && status === "retrying" && metadataMatchesConnectWindow) {
299
+ const retryAt = readPendingConnectHistoricalBackfillRetryAt(account);
300
+ const retryAtMs = retryAt ? Date.parse(retryAt) : NaN;
301
+ if (retryAt && Number.isFinite(retryAtMs) && Date.parse(now) < retryAtMs) {
302
+ return [];
303
+ }
304
+ return [buildExactWindowJob({
305
+ kind: "backfill",
306
+ windowStart: connectWindow.windowStart,
307
+ windowEnd: connectWindow.windowEnd,
308
+ availableAt: now,
309
+ priority: JUNCTION_HISTORICAL_BACKFILL_RETRY_PRIORITY,
310
+ })];
311
+ }
312
+ // No recorded outcome: the connect-time historical backfill never ran to
313
+ // completion (or predates this bookkeeping). Re-derive its exact window
314
+ // from the connection's connect time and run it until a terminal status
315
+ // lands; imports are idempotent so a redundant pass is safe.
316
+ return [buildExactWindowJob({
317
+ kind: "backfill",
318
+ windowStart: connectWindow.windowStart,
319
+ windowEnd: connectWindow.windowEnd,
320
+ availableAt: now,
321
+ priority: JUNCTION_HISTORICAL_BACKFILL_PRIORITY,
322
+ })];
323
+ }
324
+ function isConnectHistoricalBackfillWindow(account, window) {
325
+ const connectHistoricalWindow = buildConnectHistoricalBackfillWindow(account, summaryBackfillDays);
326
+ return (window.windowStart === connectHistoricalWindow.windowStart
327
+ && window.windowEnd === connectHistoricalWindow.windowEnd);
328
+ }
329
+ function readPendingConnectHistoricalBackfillRetryAt(account) {
330
+ const connectWindow = buildConnectHistoricalBackfillWindow(account, summaryBackfillDays);
331
+ return readPendingHistoricalBackfillRetryAt(account.metadata, connectWindow.windowStart, connectWindow.windowEnd);
332
+ }
333
+ function resolveJunctionNextReconcileAt(account, now, fallbackNextReconcileAt) {
334
+ const retryAt = readPendingConnectHistoricalBackfillRetryAt(account);
335
+ if (!retryAt) {
336
+ return fallbackNextReconcileAt;
337
+ }
338
+ const retryAtMs = Date.parse(retryAt);
339
+ if (!Number.isFinite(retryAtMs) || Date.parse(now) >= retryAtMs) {
340
+ return fallbackNextReconcileAt;
341
+ }
342
+ const fallbackMs = Date.parse(fallbackNextReconcileAt);
343
+ return Number.isFinite(fallbackMs) && fallbackMs <= retryAtMs
344
+ ? fallbackNextReconcileAt
345
+ : retryAt;
346
+ }
347
+ async function loadJunctionHistoricalPullSnapshot(context) {
348
+ try {
349
+ return await client.introspectHistoricalPull({
350
+ signal: context.signal ?? null,
351
+ userId: context.account.externalAccountId,
352
+ userLimit: 1,
353
+ });
354
+ }
355
+ catch (error) {
356
+ if (context.signal?.aborted) {
357
+ throw error;
358
+ }
359
+ context.logger.warn?.("Junction historical-pull introspection was unavailable; using canonical import evidence.", {
360
+ provider: "junction",
361
+ errorCode: isDeviceSyncError(error) ? error.code : "JUNCTION_HISTORICAL_PULL_INTROSPECTION_FAILED",
362
+ });
363
+ return null;
364
+ }
365
+ }
487
366
  async function executeJob(context, job) {
488
367
  const skippedOptionalResources = [];
489
368
  if (job.kind === "resource") {
490
369
  return executeResourceJob(context, job, skippedOptionalResources);
491
370
  }
492
371
  const window = resolveJobWindow(job, context.now, job.kind === "backfill" ? summaryBackfillDays : reconcileDays);
372
+ const isConnectHistoricalBackfill = isConnectHistoricalBackfillWindow(context.account, window);
493
373
  const sourceProviders = await client.listUserProviders(context.account.externalAccountId, {
494
374
  signal: context.signal ?? null,
495
375
  });
@@ -509,11 +389,26 @@ export function createJunctionDeviceSyncProvider(config) {
509
389
  if (profileSummaryResult.records.length > 0) {
510
390
  summaries[JUNCTION_PROFILE_SUMMARY_RESOURCE] = profileSummaryResult.records;
511
391
  }
512
- const historicalSummaryHasRecords = hasJunctionHistoricalBackfillSummaryRecords(summaries, sourceProviders);
392
+ const importConnections = sanitizeJunctionImportConnections(sourceProviders);
393
+ const importSummaries = sanitizeJunctionImportSnapshots(summaries, sourceProviders);
394
+ const summaryNormalizationEvidence = classifyJunctionSummaryNormalizationEvidence({
395
+ connections: importConnections,
396
+ importedAt: summaryWindow.windowEnd,
397
+ summaries: importSummaries,
398
+ windowEnd: summaryWindow.windowEnd,
399
+ windowStart: summaryWindow.windowStart,
400
+ });
401
+ const historicalSummaryHasRecords = hasJunctionHistoricalBackfillSummaryRecords(summaryNormalizationEvidence);
513
402
  const summaryHasFetchedRecords = hasJunctionSnapshotRecords(summaries);
514
- const timeseriesWindowStart = job.kind === "backfill"
403
+ const baseTimeseriesWindowStart = job.kind === "backfill"
515
404
  ? maxIsoTimestamp(window.windowStart, subtractDays(window.windowEnd, timeseriesBackfillDays))
516
405
  : window.windowStart;
406
+ const timeseriesCursor = job.kind === "backfill"
407
+ ? readBackfillTimeseriesCursor(job, window)
408
+ : null;
409
+ const timeseriesWindowStart = timeseriesCursor
410
+ ? maxIsoTimestamp(baseTimeseriesWindowStart, timeseriesCursor)
411
+ : baseTimeseriesWindowStart;
517
412
  if (job.kind !== "backfill" || summaryHasFetchedRecords) {
518
413
  await context.importSnapshot({
519
414
  provider: "junction",
@@ -522,11 +417,19 @@ export function createJunctionDeviceSyncProvider(config) {
522
417
  importedAt: summaryWindow.windowEnd,
523
418
  windowStart: summaryWindow.windowStart,
524
419
  windowEnd: summaryWindow.windowEnd,
525
- connections: sanitizeJunctionImportConnections(sourceProviders),
526
- summaries: sanitizeJunctionImportSnapshots(summaries, sourceProviders),
420
+ connections: importConnections,
421
+ summaries: importSummaries,
527
422
  timeseries: {},
528
423
  });
529
424
  }
425
+ // Current records are durable before the optional historical-status probe.
426
+ // An unavailable introspection endpoint must not hold fresh ingestion hostage.
427
+ const historicalPullSnapshot = isConnectHistoricalBackfill && !context.shouldYield?.()
428
+ ? await loadJunctionHistoricalPullSnapshot(context)
429
+ : null;
430
+ const historicalSummaryCoverage = evaluateJunctionHistoricalBackfillCoverage(summaryNormalizationEvidence, sourceProviders, summaryResources, providerFilter, historicalPullSnapshot, isConnectHistoricalBackfill
431
+ ? readJunctionHistoricalBackfillEvidence(context.account.metadata[JUNCTION_HISTORICAL_BACKFILL_METADATA_KEYS.evidence])
432
+ : null, window);
530
433
  if (job.kind === "backfill"
531
434
  || shouldImportClosedTimeseriesForReconcile(context.account.lastSyncCompletedAt, window.windowEnd)) {
532
435
  const timeseriesImport = await importTimeseriesDailySnapshots(context, sourceProviders, timeseriesWindowStart, window.windowEnd, skippedOptionalResources);
@@ -535,24 +438,108 @@ export function createJunctionDeviceSyncProvider(config) {
535
438
  context,
536
439
  job,
537
440
  windowEnd: window.windowEnd,
538
- windowStart: timeseriesImport.yieldedAt,
441
+ windowStart: job.kind === "backfill" ? window.windowStart : timeseriesImport.yieldedAt,
442
+ timeseriesCursor: job.kind === "backfill" ? timeseriesImport.yieldedAt : null,
539
443
  }), profileMetadataPatch), skippedOptionalResources);
540
444
  }
541
445
  }
542
446
  const backfillFollowUp = job.kind === "backfill"
543
- ? buildHistoricalBackfillFollowUp({
544
- hasRecords: historicalSummaryHasRecords,
545
- metadata: context.account.metadata,
546
- now: context.now,
547
- windowStart: window.windowStart,
548
- windowEnd: window.windowEnd,
549
- })
447
+ ? isConnectHistoricalBackfill
448
+ ? buildHistoricalBackfillFollowUp({
449
+ coverageComplete: historicalSummaryCoverage.complete,
450
+ terminalFailure: historicalSummaryCoverage.pendingProviderSlugs.length > 0
451
+ && historicalSummaryCoverage.pendingProviderSlugs.every((providerSlug) => historicalSummaryCoverage.reconnectProviderSlugs.includes(providerSlug)),
452
+ metadata: context.account.metadata,
453
+ now: context.now,
454
+ windowStart: window.windowStart,
455
+ windowEnd: window.windowEnd,
456
+ })
457
+ : buildNonConnectHistoricalBackfillFollowUp({
458
+ hasRecords: historicalSummaryHasRecords,
459
+ job,
460
+ now: context.now,
461
+ windowStart: window.windowStart,
462
+ windowEnd: window.windowEnd,
463
+ })
550
464
  : {};
465
+ const historicalStatusAfterJob = readJunctionHistoricalBackfillStatus(backfillFollowUp.metadataPatch?.[JUNCTION_HISTORICAL_BACKFILL_METADATA_KEYS.status]) ?? readHistoricalBackfillStatus(context.account.metadata);
466
+ const historicalStatusBeforeJob = readHistoricalBackfillStatus(context.account.metadata);
467
+ const saturatedRetryObserved = backfillFollowUp.metadataPatch !== undefined
468
+ && historicalStatusBeforeJob?.coverageVersion
469
+ === JUNCTION_HISTORICAL_BACKFILL_COVERAGE_VERSION
470
+ && historicalStatusBeforeJob.status === "retrying"
471
+ && readHistoricalBackfillEmptyAttempts(context.account.metadata, window.windowStart, window.windowEnd) >= EMPTY_HISTORICAL_BACKFILL_RETRY_DELAYS_MS.length;
472
+ if (isConnectHistoricalBackfill
473
+ && (!historicalStatusBeforeJob
474
+ || historicalStatusBeforeJob.coverageVersion
475
+ <= JUNCTION_HISTORICAL_BACKFILL_COVERAGE_VERSION)
476
+ && (historicalStatusAfterJob?.status === "exhausted"
477
+ || saturatedRetryObserved
478
+ || (historicalSummaryCoverage.complete
479
+ && historicalStatusBeforeJob?.status === "exhausted"))) {
480
+ const pendingProviderSlugs = new Set(historicalSummaryCoverage.pendingProviderSlugs);
481
+ const hasCoveredProvider = sourceProviders.some((provider) => {
482
+ const providerSlug = resolveJunctionHistoricalCoverageProviderSlug(provider.origin.sourceProviderSlug ?? provider.slug, providerFilter);
483
+ return providerSlug !== null
484
+ && mapJunctionSourceStatus(provider.status) !== "disconnected"
485
+ && !pendingProviderSlugs.has(providerSlug);
486
+ });
487
+ if (historicalSummaryCoverage.complete || hasCoveredProvider) {
488
+ await projectJunctionSources(context, sourceProviders, {
489
+ preserveHistoricalReconnectProviderSlugs: historicalSummaryCoverage.pendingProviderSlugs,
490
+ });
491
+ }
492
+ if (!historicalSummaryCoverage.complete) {
493
+ await markJunctionHistoricalReconnectRequired(context, historicalSummaryCoverage.reconnectProviderSlugs);
494
+ }
495
+ }
496
+ const nextReconcileAt = backfillFollowUp.nextReconcileAt ?? resolveJunctionNextReconcileAt(context.account, context.now, addMilliseconds(context.now, reconcileIntervalMs));
551
497
  return withJunctionSkippedResourceMetadata(context, withJunctionMetadataPatch({
552
498
  ...backfillFollowUp,
553
- nextReconcileAt: addMilliseconds(context.now, reconcileIntervalMs),
499
+ nextReconcileAt,
554
500
  }, profileMetadataPatch), skippedOptionalResources);
555
501
  }
502
+ async function markJunctionHistoricalReconnectRequired(context, pendingProviderSlugs) {
503
+ if (!context.upsertConnectionSource) {
504
+ return;
505
+ }
506
+ const existingSources = context.listConnectionSources
507
+ ? await context.listConnectionSources()
508
+ : [];
509
+ const existingByInstanceKey = new Map(existingSources.map((source) => [source.sourceInstanceKey, source]));
510
+ const recoveryProviderSlugs = new Set(pendingProviderSlugs
511
+ .map(normalizeProviderSlug)
512
+ .filter((providerSlug) => providerSlug !== null));
513
+ for (const providerSlug of recoveryProviderSlugs) {
514
+ if (!isJunctionHistoricalResetProviderSlug(providerSlug)) {
515
+ continue;
516
+ }
517
+ const projectedSourceInstanceKey = buildJunctionProviderSourceInstanceKey({
518
+ connectionId: context.account.id,
519
+ sourceProviderSlug: providerSlug,
520
+ });
521
+ if (!projectedSourceInstanceKey) {
522
+ continue;
523
+ }
524
+ const existing = existingByInstanceKey.get(projectedSourceInstanceKey) ?? existingSources.find((source) => normalizeProviderSlug(source.sourceProviderSlug) === providerSlug);
525
+ if (existing?.status === "error"
526
+ && existing.lastErrorCode === DEVICE_SYNC_HISTORICAL_DATA_RECONNECT_REQUIRED_ERROR_CODE) {
527
+ continue;
528
+ }
529
+ await context.upsertConnectionSource({
530
+ sourceInstanceKey: existing?.sourceInstanceKey ?? projectedSourceInstanceKey,
531
+ sourceProviderSlug: providerSlug,
532
+ displayName: existing?.displayName ?? null,
533
+ status: "error",
534
+ ...(existing
535
+ ? { resourceAvailabilitySummary: existing.resourceAvailabilitySummary }
536
+ : {}),
537
+ lastErrorCode: DEVICE_SYNC_HISTORICAL_DATA_RECONNECT_REQUIRED_ERROR_CODE,
538
+ lastErrorMessage: "Historical data remained incomplete after bounded observation. A member-confirmed connection reset is required to restart its history export.",
539
+ lastSeenAt: context.now,
540
+ });
541
+ }
542
+ }
556
543
  function readJunctionDirectResourceJobInput(job, window) {
557
544
  if (job.kind !== "resource") {
558
545
  return null;
@@ -584,6 +571,10 @@ export function createJunctionDeviceSyncProvider(config) {
584
571
  if (!sourceProviderSlug) {
585
572
  return null;
586
573
  }
574
+ if (resource === "sleep_cycle"
575
+ && !canNormalizeJunctionSleepCycleRecordToCompactStages(record, sourceProviderSlug)) {
576
+ return null;
577
+ }
587
578
  return {
588
579
  record,
589
580
  resource,
@@ -593,6 +584,10 @@ export function createJunctionDeviceSyncProvider(config) {
593
584
  windowStart: window.windowStart,
594
585
  };
595
586
  }
587
+ function shouldLoadJunctionDirectResourceSourceProviders(input) {
588
+ return (input.resource === "sleep_cycle" || input.resource === "sleep") &&
589
+ hasJunctionSourceReferenceIdentity(input.record);
590
+ }
596
591
  async function diagnoseBackfill(context) {
597
592
  const window = resolveDiagnosticBackfillWindow(context, summaryBackfillDays);
598
593
  const timeseriesProbeDays = normalizeDiagnosticTimeseriesProbeDays(context.timeseriesProbeDays);
@@ -634,6 +629,15 @@ export function createJunctionDeviceSyncProvider(config) {
634
629
  });
635
630
  }
636
631
  }
632
+ const summaryNormalizationEvidence = providerSnapshot.ok
633
+ ? classifyJunctionSummaryNormalizationEvidence({
634
+ connections: sanitizeJunctionImportConnections(sourceProviders),
635
+ importedAt: window.windowEnd,
636
+ summaries: sanitizeJunctionImportSnapshots(summaries, sourceProviders),
637
+ windowEnd: window.windowEnd,
638
+ windowStart: window.windowStart,
639
+ })
640
+ : [];
637
641
  return {
638
642
  generatedAt: context.now,
639
643
  provider: "junction",
@@ -646,9 +650,7 @@ export function createJunctionDeviceSyncProvider(config) {
646
650
  window,
647
651
  sourceProviders: describeJunctionDiagnosticSourceProviders(providerSnapshot),
648
652
  summary: {
649
- hasUsefulHistoricalRecords: providerSnapshot.ok
650
- ? hasJunctionHistoricalBackfillSummaryRecords(summaries, sourceProviders)
651
- : false,
653
+ hasUsefulHistoricalRecords: hasJunctionHistoricalBackfillSummaryRecords(summaryNormalizationEvidence),
652
654
  resources: summaryDiagnostics,
653
655
  },
654
656
  timeseriesProbe: {
@@ -688,17 +690,17 @@ export function createJunctionDeviceSyncProvider(config) {
688
690
  }
689
691
  if (endpoint === "introspect_resources" || endpoint === "historical_pull") {
690
692
  const sourceProviderSlug = normalizeProviderSlug(context.sourceProviderSlug);
691
- const payloadResult = await runJunctionDiagnosticPayloadCall(() => endpoint === "introspect_resources"
692
- ? client.introspectResources({
693
+ const response = endpoint === "introspect_resources"
694
+ ? describeJunctionIntrospectionResources(await runJunctionDiagnosticPayloadCall(() => client.introspectResources({
693
695
  sourceProviderSlug,
694
696
  userId: context.account.externalAccountId,
695
697
  userLimit: 1,
696
- })
697
- : client.introspectHistoricalPull({
698
+ })), sourceProviderSlug)
699
+ : describeJunctionIntrospectionHistoricalPull(await runJunctionDiagnosticPayloadCall(() => client.introspectHistoricalPull({
698
700
  sourceProviderSlug,
699
701
  userId: context.account.externalAccountId,
700
702
  userLimit: 1,
701
- }));
703
+ })), sourceProviderSlug);
702
704
  return {
703
705
  generatedAt: context.now,
704
706
  provider: "junction",
@@ -715,9 +717,7 @@ export function createJunctionDeviceSyncProvider(config) {
715
717
  }),
716
718
  sourceFiltered: Boolean(sourceProviderSlug),
717
719
  },
718
- response: endpoint === "introspect_resources"
719
- ? describeJunctionIntrospectionResources(payloadResult, sourceProviderSlug)
720
- : describeJunctionIntrospectionHistoricalPull(payloadResult, sourceProviderSlug),
720
+ response,
721
721
  },
722
722
  };
723
723
  }
@@ -821,18 +821,63 @@ export function createJunctionDeviceSyncProvider(config) {
821
821
  };
822
822
  }
823
823
  async function executeResourceJob(context, job, skippedOptionalResources) {
824
+ if (normalizeString(job.payload.resource) === COMPANION_HRV_RMSSD_RESOURCE) {
825
+ let observation;
826
+ let admissionId;
827
+ try {
828
+ observation = parseSerializedCompanionHrvRmssdObservation(job.payload.companionObservationJson);
829
+ admissionId = parseCompanionHrvRmssdAdmissionId(job.payload.companionAdmissionId);
830
+ const expectedAdmissionId = createHash("sha256")
831
+ .update(serializeCompanionHrvRmssdObservation(observation))
832
+ .digest("hex");
833
+ if (admissionId !== expectedAdmissionId) {
834
+ throw new TypeError("Companion HRV admission identity did not match its observation.");
835
+ }
836
+ }
837
+ catch {
838
+ throw deviceSyncError({
839
+ code: JUNCTION_COMPANION_HRV_OBSERVATION_INVALID_CODE,
840
+ message: "Companion HRV observation payload was invalid.",
841
+ retryable: false,
842
+ });
843
+ }
844
+ await context.importSnapshot({
845
+ provider: "junction",
846
+ accountId: buildJunctionImportAccountId(context.account.externalAccountId),
847
+ connectionId: context.account.id,
848
+ importedAt: context.now,
849
+ companionHrvRmssd: [{ admissionId, observation }],
850
+ });
851
+ return {};
852
+ }
824
853
  const window = resolveJobWindow(job, context.now, reconcileDays);
854
+ if (normalizeString(job.payload.resource) === JUNCTION_COMPANION_HEALTH_METADATA_RESOURCE) {
855
+ const records = parseJunctionCompanionHealthMetadataJob(job);
856
+ await importJunctionCompanionHealthMetadataSnapshot(context, records);
857
+ return {
858
+ nextReconcileAt: clampWebhookJobNextReconcileAt(context),
859
+ };
860
+ }
825
861
  const resource = normalizeJunctionResourceName(job.payload.resource);
826
862
  const resourceCategory = normalizeString(job.payload.resourceCategory);
827
863
  const sourceProviderSlug = normalizeProviderSlug(job.payload.sourceProviderSlug);
864
+ let listedSourceProviders = null;
828
865
  let projectedSourceProviders = null;
829
- const loadAndProjectSourceProviders = async () => {
830
- if (projectedSourceProviders) {
831
- return projectedSourceProviders;
866
+ const loadSourceProviders = async () => {
867
+ if (listedSourceProviders) {
868
+ return listedSourceProviders;
832
869
  }
833
870
  const sourceProviders = await client.listUserProviders(context.account.externalAccountId, {
834
871
  signal: context.signal ?? null,
835
872
  });
873
+ listedSourceProviders = sourceProviders;
874
+ return sourceProviders;
875
+ };
876
+ const loadAndProjectSourceProviders = async () => {
877
+ if (projectedSourceProviders) {
878
+ return projectedSourceProviders;
879
+ }
880
+ const sourceProviders = await loadSourceProviders();
836
881
  await projectJunctionSources(context, sourceProviders);
837
882
  projectedSourceProviders = sourceProviders;
838
883
  return sourceProviders;
@@ -891,10 +936,13 @@ export function createJunctionDeviceSyncProvider(config) {
891
936
  }
892
937
  const directInput = readJunctionDirectResourceJobInput(job, window);
893
938
  if (directInput) {
894
- await importJunctionDirectResourceSnapshot(context, [], directInput.windowStart, directInput.windowEnd, directInput.resource, [directInput.record]);
895
- return {
896
- nextReconcileAt: clampWebhookJobNextReconcileAt(context),
897
- };
939
+ const sourceProviders = shouldLoadJunctionDirectResourceSourceProviders(directInput)
940
+ ? await loadSourceProviders()
941
+ : [];
942
+ const connectHistoricalWindow = buildConnectHistoricalBackfillWindow(context.account, summaryBackfillDays);
943
+ const importResult = await importJunctionDirectResourceSnapshot(context, sourceProviders, directInput.windowStart, directInput.windowEnd, directInput.resource, [directInput.record], connectHistoricalWindow);
944
+ const directHistoricalWindow = readJunctionDirectHistoricalEvidenceWindow(directInput, connectHistoricalWindow, importResult.normalizationEvidence, providerFilter);
945
+ return withJunctionHistoricalCoverageVerification(context, job, directHistoricalWindow, withJunctionDirectHistoricalBackfillEvidence(context, job, directInput, directHistoricalWindow, importResult, { nextReconcileAt: clampWebhookJobNextReconcileAt(context) }));
898
946
  }
899
947
  if (inferredCategory === "timeseries") {
900
948
  const sourceProviders = await loadAndProjectSourceProviders();
@@ -907,9 +955,9 @@ export function createJunctionDeviceSyncProvider(config) {
907
955
  windowStart: timeseriesImport.yieldedAt,
908
956
  }), skippedOptionalResources);
909
957
  }
910
- return withJunctionSkippedResourceMetadata(context, {
958
+ return withJunctionHistoricalCoverageVerification(context, job, window, withJunctionSkippedResourceMetadata(context, {
911
959
  nextReconcileAt: clampWebhookJobNextReconcileAt(context),
912
- }, skippedOptionalResources);
960
+ }, skippedOptionalResources));
913
961
  }
914
962
  const dateQueryFormat = isFullUtcDayWindow(window) ? "date" : "datetime";
915
963
  summaries[effectiveResource] = await fetchOptionalJunctionResourceRecords(context, "summary", effectiveResource, skippedOptionalResources, () => client.listSummary({
@@ -934,9 +982,9 @@ export function createJunctionDeviceSyncProvider(config) {
934
982
  summaries: sanitizeJunctionImportSnapshots(summaries, sourceProviders),
935
983
  timeseries: {},
936
984
  });
937
- return withJunctionSkippedResourceMetadata(context, {
985
+ return withJunctionHistoricalCoverageVerification(context, job, window, withJunctionSkippedResourceMetadata(context, {
938
986
  nextReconcileAt: clampWebhookJobNextReconcileAt(context),
939
- }, skippedOptionalResources);
987
+ }, skippedOptionalResources));
940
988
  }
941
989
  function isConfiguredJunctionResource(category, resource) {
942
990
  return category === "timeseries"
@@ -976,6 +1024,75 @@ export function createJunctionDeviceSyncProvider(config) {
976
1024
  ? scheduledAt
977
1025
  : latestAt;
978
1026
  }
1027
+ function withJunctionHistoricalCoverageVerification(context, job, resourceWindow, result) {
1028
+ const historicalState = readHistoricalBackfillStatus(context.account.metadata);
1029
+ const eventType = normalizeString(job.payload.eventType);
1030
+ if (!historicalState
1031
+ || !resourceWindow
1032
+ || historicalState.coverageVersion > JUNCTION_HISTORICAL_BACKFILL_COVERAGE_VERSION
1033
+ || historicalState.status !== "exhausted"
1034
+ || !eventType
1035
+ || !isJunctionDataEvent(eventType)) {
1036
+ return result;
1037
+ }
1038
+ const connectWindow = buildConnectHistoricalBackfillWindow(context.account, summaryBackfillDays);
1039
+ if (Date.parse(resourceWindow.windowStart) >= Date.parse(connectWindow.windowEnd)
1040
+ || Date.parse(resourceWindow.windowEnd) <= Date.parse(connectWindow.windowStart)) {
1041
+ return result;
1042
+ }
1043
+ return {
1044
+ ...result,
1045
+ scheduledJobs: [
1046
+ ...(result.scheduledJobs ?? []),
1047
+ buildExactWindowJob({
1048
+ availableAt: context.now,
1049
+ kind: "backfill",
1050
+ priority: JUNCTION_HISTORICAL_BACKFILL_RETRY_PRIORITY,
1051
+ windowEnd: connectWindow.windowEnd,
1052
+ windowStart: connectWindow.windowStart,
1053
+ }),
1054
+ ],
1055
+ };
1056
+ }
1057
+ function withJunctionDirectHistoricalBackfillEvidence(context, job, directInput, directHistoricalWindow, importResult, result) {
1058
+ const eventType = normalizeString(job.payload.eventType);
1059
+ const providerSlug = resolveJunctionHistoricalCoverageProviderSlug(directInput.sourceProviderSlug, providerFilter);
1060
+ const acceptedCanonicalDelivery = importResult.durableDeliveryAccepted
1061
+ && providerSlug !== null
1062
+ && importResult.normalizationEvidence.some((entry) => entry.resource === directInput.resource
1063
+ && canonicalizeJunctionHistoricalProviderSlug(entry.sourceProviderSlug) === providerSlug);
1064
+ if (!canCurrentRuntimeMutateJunctionHistoricalBackfillProgress(context.account.metadata)
1065
+ || !directHistoricalWindow
1066
+ || !acceptedCanonicalDelivery
1067
+ || !eventType
1068
+ || !isJunctionDataEvent(eventType)
1069
+ || !providerSlug
1070
+ || !isJunctionHistoricalBackfillRequiredSummaryResource(directInput.resource)) {
1071
+ return result;
1072
+ }
1073
+ const connectWindow = buildConnectHistoricalBackfillWindow(context.account, summaryBackfillDays);
1074
+ const evidence = addJunctionHistoricalBackfillEvidence({
1075
+ existingValue: context.account.metadata[JUNCTION_HISTORICAL_BACKFILL_METADATA_KEYS.evidence],
1076
+ providerSlug,
1077
+ resource: directInput.resource,
1078
+ windowEnd: connectWindow.windowEnd,
1079
+ windowStart: connectWindow.windowStart,
1080
+ });
1081
+ if (!evidence) {
1082
+ context.logger.warn?.("Junction historical push evidence exceeded bounded metadata limits.", {
1083
+ provider: "junction",
1084
+ resource: directInput.resource,
1085
+ });
1086
+ return result;
1087
+ }
1088
+ return {
1089
+ ...result,
1090
+ metadataPatch: {
1091
+ ...(result.metadataPatch ?? {}),
1092
+ [JUNCTION_HISTORICAL_BACKFILL_METADATA_KEYS.evidence]: evidence,
1093
+ },
1094
+ };
1095
+ }
979
1096
  async function verifyAndParseWebhook(context) {
980
1097
  const webhookSecret = normalizeString(config.webhookSecret);
981
1098
  if (!webhookSecret) {
@@ -1088,22 +1205,18 @@ export function createJunctionDeviceSyncProvider(config) {
1088
1205
  records.push(...filterJunctionTimeseriesRecordsToWindow(chunkRecords, chunkWindowStart, chunkWindowEnd));
1089
1206
  }
1090
1207
  catch (error) {
1091
- const failure = classifyOptionalJunctionResourceFailure(error, "timeseries", resource);
1208
+ const failure = classifyOptionalJunctionResourceFailure(error, "timeseries", resource, context.account.externalAccountId);
1092
1209
  if (!failure) {
1093
1210
  throw error;
1094
1211
  }
1095
- if (failure.disposition === "ambiguous") {
1096
- throw buildAmbiguousOptionalJunctionResourceError(error, "timeseries", resource, failure.responseStatus, context.now);
1097
- }
1098
1212
  if (!optionalFailureLogged) {
1099
1213
  logSkippedOptionalJunctionResource(context, "timeseries", resource, failure);
1100
1214
  optionalFailureLogged = true;
1101
1215
  }
1102
1216
  skippedOptionalResources.push({
1103
- reason: failure.reason,
1217
+ ...failure,
1104
1218
  resource,
1105
1219
  resourceCategory: "timeseries",
1106
- responseStatus: failure.responseStatus,
1107
1220
  });
1108
1221
  break;
1109
1222
  }
@@ -1180,18 +1293,56 @@ export function createJunctionDeviceSyncProvider(config) {
1180
1293
  yieldedAt: null,
1181
1294
  };
1182
1295
  }
1183
- async function importJunctionDirectResourceSnapshot(context, sourceProviders, windowStart, windowEnd, resource, records) {
1184
- const redactedRecords = records.map((record) => readPlainObject(sanitizeJunctionImportSnapshotValue(record, new Map(), { blockedStringValues: [context.account.externalAccountId] })) ?? record);
1185
- const snapshots = { [resource]: redactedRecords };
1186
- await context.importSnapshot({
1296
+ async function importJunctionDirectResourceSnapshot(context, sourceProviders, windowStart, windowEnd, resource, records, historicalEvidenceWindow) {
1297
+ const snapshots = { [resource]: [...records] };
1298
+ const connections = sanitizeJunctionImportConnections(sourceProviders);
1299
+ const summaries = sanitizeJunctionImportSnapshots(snapshots, sourceProviders, {
1300
+ blockedStringValues: [context.account.externalAccountId],
1301
+ });
1302
+ const normalizationEvidence = classifyJunctionSummaryNormalizationEvidence({
1303
+ connections,
1304
+ importedAt: context.now,
1305
+ summaries,
1306
+ windowEnd,
1307
+ windowStart,
1308
+ }, historicalEvidenceWindow);
1309
+ const receipt = await context.importSnapshot({
1187
1310
  provider: "junction",
1188
1311
  accountId: buildJunctionImportAccountId(context.account.externalAccountId),
1189
1312
  connectionId: context.account.id,
1190
1313
  importedAt: context.now,
1191
1314
  windowStart,
1192
1315
  windowEnd,
1193
- connections: sanitizeJunctionImportConnections(sourceProviders),
1194
- summaries: sanitizeJunctionImportSnapshots(snapshots, sourceProviders),
1316
+ connections,
1317
+ summaries,
1318
+ timeseries: {},
1319
+ });
1320
+ return {
1321
+ durableDeliveryAccepted: readProviderSnapshotDurableDeliveryAccepted(receipt),
1322
+ normalizationEvidence,
1323
+ };
1324
+ }
1325
+ async function importJunctionCompanionHealthMetadataSnapshot(context, records) {
1326
+ const summaries = {};
1327
+ const sleep = records
1328
+ .filter((record) => record.kind === "recovery_score")
1329
+ .map(buildJunctionCompanionRecoverySummary);
1330
+ const activity = records
1331
+ .filter((record) => record.kind === "workout_strain")
1332
+ .map(buildJunctionCompanionWorkoutStrainSummary);
1333
+ if (sleep.length > 0) {
1334
+ summaries.sleep = sleep;
1335
+ }
1336
+ if (activity.length > 0) {
1337
+ summaries.activity = activity;
1338
+ }
1339
+ await context.importSnapshot({
1340
+ provider: "junction",
1341
+ accountId: buildJunctionImportAccountId(context.account.externalAccountId),
1342
+ windowStart: records.reduce((earliest, record) => minIsoTimestamp(earliest, record.startAt), records[0].startAt),
1343
+ windowEnd: records.reduce((latest, record) => maxIsoTimestamp(latest, record.endAt), records[0].endAt),
1344
+ connections: [],
1345
+ summaries: sanitizeJunctionImportSnapshots(summaries, []),
1195
1346
  timeseries: {},
1196
1347
  });
1197
1348
  }
@@ -1200,19 +1351,15 @@ export function createJunctionDeviceSyncProvider(config) {
1200
1351
  return await load();
1201
1352
  }
1202
1353
  catch (error) {
1203
- const failure = classifyOptionalJunctionResourceFailure(error, resourceCategory, resource);
1354
+ const failure = classifyOptionalJunctionResourceFailure(error, resourceCategory, resource, context.account.externalAccountId);
1204
1355
  if (!failure) {
1205
1356
  throw error;
1206
1357
  }
1207
- if (failure.disposition === "ambiguous") {
1208
- throw buildAmbiguousOptionalJunctionResourceError(error, resourceCategory, resource, failure.responseStatus, context.now);
1209
- }
1210
1358
  logSkippedOptionalJunctionResource(context, resourceCategory, resource, failure);
1211
1359
  skippedOptionalResources.push({
1212
- reason: failure.reason,
1360
+ ...failure,
1213
1361
  resource,
1214
1362
  resourceCategory,
1215
- responseStatus: failure.responseStatus,
1216
1363
  });
1217
1364
  return [];
1218
1365
  }
@@ -1225,6 +1372,7 @@ export function createJunctionDeviceSyncProvider(config) {
1225
1372
  resource,
1226
1373
  resourceCategory,
1227
1374
  responseStatus: failure.responseStatus,
1375
+ ...(failure.responseDetail ? { responseDetail: failure.responseDetail } : {}),
1228
1376
  });
1229
1377
  }
1230
1378
  function buildYieldedJunctionJobResult(input) {
@@ -1240,7 +1388,28 @@ export function createJunctionDeviceSyncProvider(config) {
1240
1388
  if (Date.parse(input.windowStart) >= Date.parse(input.windowEnd)) {
1241
1389
  return null;
1242
1390
  }
1243
- if (input.job.kind === "backfill" || input.job.kind === "reconcile") {
1391
+ if (input.job.kind === "backfill") {
1392
+ const cursor = toIsoTimestampIfValid(input.timeseriesCursor);
1393
+ if (!cursor || !isTimestampInHalfOpenWindow(cursor, input)) {
1394
+ return null;
1395
+ }
1396
+ const emptyBackfillAttempts = readHistoricalBackfillJobEmptyAttempts(input.job);
1397
+ const followUp = buildExactWindowJob({
1398
+ kind: "backfill",
1399
+ priority: input.job.priority,
1400
+ windowEnd: input.windowEnd,
1401
+ windowStart: input.windowStart,
1402
+ });
1403
+ return {
1404
+ ...followUp,
1405
+ payload: {
1406
+ ...followUp.payload,
1407
+ ...(emptyBackfillAttempts > 0 ? { emptyBackfillAttempts } : {}),
1408
+ timeseriesCursor: cursor,
1409
+ },
1410
+ };
1411
+ }
1412
+ if (input.job.kind === "reconcile") {
1244
1413
  return buildExactWindowJob({
1245
1414
  kind: input.job.kind,
1246
1415
  priority: input.job.priority,
@@ -1364,6 +1533,7 @@ function buildJunctionSkippedResourceMetadataPatch(context, skippedOptionalResou
1364
1533
  last.responseStatus,
1365
1534
  last.reason,
1366
1535
  ].join("."),
1536
+ junctionSkippedResourceLastDetail: last.responseDetail ?? null,
1367
1537
  };
1368
1538
  }
1369
1539
  function readJunctionMetadataCount(value) {
@@ -1376,7 +1546,7 @@ function hasCheckedJunctionProfileSummary(metadata) {
1376
1546
  const checkedAt = normalizeString(metadata[JUNCTION_PROFILE_SUMMARY_CHECKED_AT_METADATA_KEY]);
1377
1547
  return checkedAt !== undefined && Number.isFinite(Date.parse(checkedAt));
1378
1548
  }
1379
- function classifyOptionalJunctionResourceFailure(error, resourceCategory, resource) {
1549
+ function classifyOptionalJunctionResourceFailure(error, resourceCategory, resource, accountExternalId) {
1380
1550
  if (!isDeviceSyncError(error) || error.code !== "JUNCTION_API_REQUEST_FAILED") {
1381
1551
  return null;
1382
1552
  }
@@ -1392,7 +1562,6 @@ function classifyOptionalJunctionResourceFailure(error, resourceCategory, resour
1392
1562
  });
1393
1563
  if (reason) {
1394
1564
  return {
1395
- disposition: "skip",
1396
1565
  reason,
1397
1566
  responseStatus: status,
1398
1567
  };
@@ -1402,118 +1571,45 @@ function classifyOptionalJunctionResourceFailure(error, resourceCategory, resour
1402
1571
  && status === 404
1403
1572
  && isJunctionProfileSummaryNotFoundResponse({ responseErrorCode, responseErrorDescription })) {
1404
1573
  return {
1405
- disposition: "skip",
1406
1574
  reason: "not_found",
1407
1575
  responseStatus: status,
1408
1576
  };
1409
1577
  }
1578
+ // Unrecognized 404/422 bodies skip only this optional resource. Keep the
1579
+ // provider's own explanation (redacted) so operators can see why it failed
1580
+ // without one broken optional endpoint aborting the whole sync job.
1581
+ const responseDetail = buildJunctionOptionalResourceResponseDetail({
1582
+ accountExternalId,
1583
+ responseErrorCode,
1584
+ responseErrorDescription,
1585
+ });
1410
1586
  return {
1411
- disposition: "ambiguous",
1587
+ reason: "ambiguous",
1412
1588
  responseStatus: status,
1589
+ ...(responseDetail ? { responseDetail } : {}),
1413
1590
  };
1414
1591
  }
1415
- function buildAmbiguousOptionalJunctionResourceError(error, resourceCategory, resource, responseStatus, now) {
1416
- const safeApiDetails = copySafeJunctionApiErrorDetails(error);
1417
- const safeResource = readJunctionDiagnosticToken(resource) ?? "unknown";
1418
- const responseErrorCode = readJunctionDiagnosticToken(safeApiDetails.responseErrorCode);
1419
- const responseShapeKind = readJunctionDiagnosticToken(safeApiDetails.responseShapeKind);
1420
- return deviceSyncError({
1421
- code: "JUNCTION_OPTIONAL_RESOURCE_RESPONSE_AMBIGUOUS",
1422
- message: `Junction ${resourceCategory} resource ${resource} returned an ambiguous ${responseStatus} response.`,
1423
- retryable: true,
1424
- httpStatus: 502,
1425
- details: {
1426
- ...safeApiDetails,
1427
- failureMetadataPatch: buildJunctionOptionalResourceFailureMetadataPatch({
1428
- at: now,
1429
- resource: safeResource,
1430
- resourceCategory,
1431
- responseErrorCode,
1432
- responseShapeKind,
1433
- responseStatus,
1434
- }),
1435
- providerOptionalResourceCategory: resourceCategory,
1436
- providerOptionalResourceFailureDisposition: "ambiguous",
1437
- providerOptionalResourceName: safeResource,
1438
- providerOptionalResourceStatus: responseStatus,
1439
- },
1440
- cause: error,
1441
- });
1442
- }
1443
- const JUNCTION_SAFE_API_DETAIL_TOKEN_KEYS = [
1444
- "requestAuthKind",
1445
- "requestAuthPlacement",
1446
- "requestBodyFieldNames",
1447
- "requestBodyKind",
1448
- "requestContentType",
1449
- "requestEndpointKind",
1450
- "requestMethod",
1451
- "requestQueryParameterNames",
1452
- "responseErrorCode",
1453
- "responseShapeKind",
1454
- ];
1455
- const JUNCTION_SAFE_API_DETAIL_TEXT_KEYS = [
1456
- "httpStatusText",
1457
- "responseErrorDescription",
1458
- ];
1459
- const JUNCTION_SAFE_API_DETAIL_NUMBER_KEYS = [
1460
- "requestBodyFieldCount",
1461
- "requestQueryParameterCount",
1462
- "status",
1463
- ];
1464
- const JUNCTION_SAFE_API_DETAIL_BOOLEAN_KEYS = [
1465
- "requestCredentialPresent",
1466
- "responseErrorDescriptionFieldPresent",
1467
- "responseErrorFieldPresent",
1468
- ];
1469
- function copySafeJunctionApiErrorDetails(error) {
1470
- if (!isDeviceSyncError(error) || !error.details) {
1471
- return {};
1472
- }
1473
- const details = {};
1474
- for (const key of JUNCTION_SAFE_API_DETAIL_TOKEN_KEYS) {
1475
- const value = readJunctionDiagnosticToken(error.details[key]);
1476
- if (value !== null) {
1477
- details[key] = value;
1478
- }
1479
- }
1480
- for (const key of JUNCTION_SAFE_API_DETAIL_TEXT_KEYS) {
1481
- const value = readJunctionDiagnosticText(error.details[key]);
1482
- if (value !== null) {
1483
- details[key] = value;
1484
- }
1485
- }
1486
- for (const key of JUNCTION_SAFE_API_DETAIL_NUMBER_KEYS) {
1487
- const value = readJunctionDiagnosticNumber(error.details[key]);
1488
- if (value !== null) {
1489
- details[key] = value;
1490
- }
1491
- }
1492
- for (const key of JUNCTION_SAFE_API_DETAIL_BOOLEAN_KEYS) {
1493
- if (typeof error.details[key] === "boolean") {
1494
- details[key] = error.details[key];
1495
- }
1496
- }
1497
- return details;
1498
- }
1499
- function buildJunctionOptionalResourceFailureMetadataPatch(input) {
1500
- const metadataPatch = {
1501
- junctionResourceDiagnostic: [
1502
- input.resourceCategory,
1503
- input.resource,
1504
- input.responseStatus,
1505
- "ambiguous",
1506
- ].join("."),
1507
- junctionResourceDiagnosticAt: input.at,
1508
- junctionResourceDiagnosticHttpStatus: input.responseStatus,
1509
- };
1510
- if (input.responseErrorCode) {
1511
- metadataPatch.junctionResourceDiagnosticCode = input.responseErrorCode;
1512
- }
1513
- if (input.responseShapeKind) {
1514
- metadataPatch.junctionResourceDiagnosticShape = input.responseShapeKind;
1515
- }
1516
- return metadataPatch;
1592
+ function buildJunctionOptionalResourceResponseDetail(input) {
1593
+ // The generic redactor does not know the current Junction user id; strip it
1594
+ // explicitly before the shared sanitizer so provider prose that embeds the
1595
+ // account id can never reach logs or connection metadata. Case-insensitive
1596
+ // because the provider-diagnostics parser lowercases error codes.
1597
+ const accountIdPattern = input.accountExternalId
1598
+ ? new RegExp(input.accountExternalId.replace(/[.*+?^${}()|[\]\\]/gu, "\\$&"), "giu")
1599
+ : null;
1600
+ const redactAccountId = (value) => value === null || accountIdPattern === null
1601
+ ? value
1602
+ : value.replace(accountIdPattern, "<redacted-account>");
1603
+ const code = readJunctionDiagnosticToken(redactAccountId(input.responseErrorCode));
1604
+ const description = readJunctionDiagnosticText(redactAccountId(input.responseErrorDescription));
1605
+ // Clamp to the stored-metadata string cap so the persisted
1606
+ // junctionSkippedResourceLastDetail is truncated instead of silently dropped.
1607
+ const detail = [code, description]
1608
+ .filter(Boolean)
1609
+ .join(": ")
1610
+ .slice(0, DEVICE_SYNC_METADATA_MAX_STRING_LENGTH)
1611
+ .trimEnd();
1612
+ return detail || null;
1517
1613
  }
1518
1614
  function classifyClearOptionalJunctionResourceFailureReason(input) {
1519
1615
  const rawDescription = input.responseErrorDescription?.trim() ?? "";
@@ -1603,10 +1699,9 @@ function readJunctionDiagnosticToken(value) {
1603
1699
  return null;
1604
1700
  }
1605
1701
  const token = value.trim();
1606
- return /^[A-Za-z0-9_.:-]{1,128}$/u.test(token) ? token : null;
1607
- }
1608
- function readJunctionDiagnosticNumber(value) {
1609
- return typeof value === "number" && Number.isFinite(value) ? value : null;
1702
+ return /^[A-Za-z0-9_.:-]{1,128}$/u.test(token) && !isHostedRuntimeIdShapedDiagnosticToken(token)
1703
+ ? token
1704
+ : null;
1610
1705
  }
1611
1706
  async function runJunctionDiagnosticCall(load) {
1612
1707
  try {
@@ -1997,40 +2092,27 @@ function describeJunctionIntrospectionHistoricalPull(result, requestedSourceProv
1997
2092
  if (!result.ok) {
1998
2093
  return describeJunctionDiagnosticPayloadFailure(result, "JUNCTION_INTROSPECT_HISTORICAL_PULL_FAILED");
1999
2094
  }
2000
- const sourceProviders = extractJunctionIntrospectionSourceProviders(result.payload, requestedSourceProviderSlug);
2095
+ const sourceProviders = (result.payload?.sources ?? []).filter((source) => !requestedSourceProviderSlug
2096
+ || normalizeProviderSlug(source.sourceProviderSlug) === requestedSourceProviderSlug);
2001
2097
  const sourceKeyMap = buildJunctionDiagnosticSourceKeyMap(sourceProviders);
2002
2098
  const pulled = [];
2003
2099
  const notPulled = [];
2004
2100
  for (const sourceProvider of sourceProviders) {
2005
- const notPulledResources = Array.isArray(sourceProvider.details.not_pulled)
2006
- ? sourceProvider.details.not_pulled
2007
- .map(normalizeProviderSlug)
2008
- .filter((entry) => Boolean(entry))
2009
- : [];
2010
- for (const resource of notPulledResources) {
2101
+ for (const resource of sourceProvider.notPulledResources) {
2011
2102
  notPulled.push({
2012
2103
  resource,
2013
2104
  sourceKey: readJunctionDiagnosticSourceKey(sourceKeyMap, sourceProvider.sourceProviderSlug),
2014
2105
  });
2015
2106
  }
2016
- const pulledByResource = readPlainObject(sourceProvider.details.pulled);
2017
- if (!pulledByResource) {
2018
- continue;
2019
- }
2020
- for (const [resource, rawDetails] of Object.entries(pulledByResource)) {
2021
- const details = readPlainObject(rawDetails) ?? {};
2022
- const timeline = readPlainObject(details.timeline);
2107
+ for (const historicalResource of sourceProvider.pulledResources) {
2023
2108
  pulled.push({
2024
- resource,
2109
+ resource: historicalResource.resource,
2025
2110
  sourceKey: readJunctionDiagnosticSourceKey(sourceKeyMap, sourceProvider.sourceProviderSlug),
2026
- status: normalizeString(details.status) ?? null,
2027
- daysWithData: readSafeInteger(details.days_with_data ?? details.daysWithData),
2028
- rangeStart: normalizeString(details.range_start ?? details.rangeStart) ?? null,
2029
- rangeEnd: normalizeString(details.range_end ?? details.rangeEnd) ?? null,
2030
- scheduledAt: normalizeString(timeline?.scheduled_at ?? timeline?.scheduledAt) ?? null,
2031
- startedAt: normalizeString(timeline?.started_at ?? timeline?.startedAt) ?? null,
2032
- endedAt: normalizeString(timeline?.ended_at ?? timeline?.endedAt) ?? null,
2033
- hasErrorDetails: Boolean(normalizeString(details.error_details ?? details.errorDetails)),
2111
+ status: historicalResource.status,
2112
+ daysWithData: historicalResource.daysWithData,
2113
+ rangeStart: historicalResource.rangeStart,
2114
+ rangeEnd: historicalResource.rangeEnd,
2115
+ hasErrorDetails: historicalResource.errorDetails !== null,
2034
2116
  });
2035
2117
  }
2036
2118
  }
@@ -2039,6 +2121,7 @@ function describeJunctionIntrospectionHistoricalPull(result, requestedSourceProv
2039
2121
  return {
2040
2122
  ok: true,
2041
2123
  responseStatus: result.responseStatus ?? 200,
2124
+ matchedUser: result.payload?.matchedUser ?? false,
2042
2125
  sourceProviderCount: sourceProviders.length,
2043
2126
  pulledCount: pulled.length,
2044
2127
  notPulledCount: notPulled.length,
@@ -2282,7 +2365,7 @@ function listJunctionDiagnosticAvailableResourcesForSlug(providers, slug) {
2282
2365
  continue;
2283
2366
  }
2284
2367
  for (const [key, value] of Object.entries(provider.resourceAvailability)) {
2285
- if (normalizeProviderSlug(key) && value !== false && value !== null && value !== undefined) {
2368
+ if (normalizeProviderSlug(key) && isJunctionResourceAdvertisedAvailable(value)) {
2286
2369
  resourceNames.add(key);
2287
2370
  }
2288
2371
  }
@@ -2292,8 +2375,10 @@ function listJunctionDiagnosticAvailableResourcesForSlug(providers, slug) {
2292
2375
  .slice(0, JUNCTION_DIAGNOSTIC_RESOURCE_NAME_LIMIT);
2293
2376
  }
2294
2377
  function readJunctionHistoricalBackfillMetadata(metadata) {
2378
+ const statusState = readHistoricalBackfillStatus(metadata);
2295
2379
  return {
2296
- status: normalizeString(metadata[JUNCTION_HISTORICAL_BACKFILL_METADATA_KEYS.status]) ?? null,
2380
+ coverageVersion: statusState?.coverageVersion ?? 0,
2381
+ status: statusState?.status ?? null,
2297
2382
  emptyAttempts: typeof metadata[JUNCTION_HISTORICAL_BACKFILL_METADATA_KEYS.emptyAttempts] === "number"
2298
2383
  ? metadata[JUNCTION_HISTORICAL_BACKFILL_METADATA_KEYS.emptyAttempts]
2299
2384
  : null,
@@ -2383,32 +2468,6 @@ function toClientConfig(config) {
2383
2468
  fetchImpl: config.fetchImpl,
2384
2469
  };
2385
2470
  }
2386
- function normalizeRequiredResourceList(value, defaults, allowedResources, label) {
2387
- const normalized = (value && value.length > 0 ? value : defaults)
2388
- .map(normalizeJunctionResourceName)
2389
- .filter((entry) => entry !== null);
2390
- const allowedResourceSet = new Set(allowedResources);
2391
- const unsupportedResources = normalized.filter((entry) => !allowedResourceSet.has(entry));
2392
- if (unsupportedResources.length > 0) {
2393
- throw new TypeError(`Junction ${label} resources include unsupported resource(s): ${[...new Set(unsupportedResources)].join(", ")}.`);
2394
- }
2395
- if (normalized.length === 0) {
2396
- throw new TypeError(`Junction ${label} resources must include at least one supported resource.`);
2397
- }
2398
- return [...new Set(normalized)];
2399
- }
2400
- function normalizeOptionalResourceList(value, defaults, allowedResources, knownResources, label) {
2401
- const normalized = (value === undefined ? defaults : value)
2402
- .map(normalizeJunctionResourceName)
2403
- .filter((entry) => entry !== null);
2404
- const allowedResourceSet = new Set(allowedResources);
2405
- const knownResourceSet = new Set([...allowedResources, ...knownResources]);
2406
- const unsupportedResources = normalized.filter((entry) => !knownResourceSet.has(entry));
2407
- if (unsupportedResources.length > 0) {
2408
- throw new TypeError(`Junction ${label} resources include unsupported resource(s): ${[...new Set(unsupportedResources)].join(", ")}.`);
2409
- }
2410
- return [...new Set(normalized.filter((entry) => allowedResourceSet.has(entry)))];
2411
- }
2412
2471
  function normalizeProviderSlug(value) {
2413
2472
  const normalized = normalizeString(value)?.toLowerCase().replace(/[^a-z0-9_]+/gu, "_").replace(/^_+|_+$/gu, "");
2414
2473
  return normalized || null;
@@ -2422,11 +2481,11 @@ function sanitizeJunctionImportConnections(providers) {
2422
2481
  sourceInstanceId: provider.origin.sourceInstanceId,
2423
2482
  }));
2424
2483
  }
2425
- function sanitizeJunctionImportSnapshots(snapshots, providers) {
2484
+ function sanitizeJunctionImportSnapshots(snapshots, providers, options = {}) {
2426
2485
  const sourceReferences = buildJunctionSourceReferenceMap(providers);
2427
2486
  return Object.fromEntries(Object.entries(snapshots).map(([resource, records]) => [
2428
2487
  resource,
2429
- records.map((record) => sanitizeJunctionImportSnapshotValue(record, sourceReferences)),
2488
+ records.map((record) => sanitizeJunctionImportSnapshotValue(record, sourceReferences, options)),
2430
2489
  ]));
2431
2490
  }
2432
2491
  function buildJunctionSourceReferenceMap(providers) {
@@ -2463,11 +2522,17 @@ function sanitizeJunctionImportSnapshotValue(value, sourceReferences, options =
2463
2522
  const fallback = readJunctionSourceReference(record, sourceReferences);
2464
2523
  const origin = resolveJunctionOrigin(record, fallback);
2465
2524
  const sanitized = stripJunctionRawSourceIdentityFields(record, sourceReferences, options);
2525
+ const fallbackSourceInstanceId = normalizeString(fallback.sourceInstanceId);
2526
+ const unresolvedPreservedSourceReference = options.preserveSourceReferenceKeys === true &&
2527
+ !fallbackSourceInstanceId &&
2528
+ hasJunctionSourceReferenceIdentity(record);
2529
+ const sourceInstanceId = fallbackSourceInstanceId ??
2530
+ (unresolvedPreservedSourceReference ? undefined : origin.sourceInstanceId);
2466
2531
  return stripUndefined({
2467
2532
  ...sanitized,
2468
2533
  sourceProviderSlug: normalizeProviderSlug(origin.sourceProviderSlug) ?? sanitized.sourceProviderSlug,
2469
2534
  sourceType: origin.sourceType ?? sanitized.sourceType,
2470
- sourceInstanceId: origin.sourceInstanceId ?? sanitized.sourceInstanceId,
2535
+ sourceInstanceId: sourceInstanceId ?? sanitized.sourceInstanceId,
2471
2536
  });
2472
2537
  }
2473
2538
  function readJunctionSourceReference(record, sourceReferences) {
@@ -2491,7 +2556,8 @@ function readJunctionSourceReference(record, sourceReferences) {
2491
2556
  function stripJunctionRawSourceIdentityFields(record, sourceReferences, options) {
2492
2557
  const sanitized = {};
2493
2558
  for (const [key, value] of Object.entries(record)) {
2494
- if (isBlockedJunctionImportSourceIdentityKey(key)
2559
+ if ((isBlockedJunctionImportSourceIdentityKey(key)
2560
+ && !(options.preserveSourceReferenceKeys && isJunctionSourceReferenceIdentityKey(key)))
2495
2561
  || isBlockedJunctionImportSourceIdentityContainerKey(key)) {
2496
2562
  continue;
2497
2563
  }
@@ -2533,6 +2599,24 @@ function isBlockedJunctionImportSourceIdentityKey(key) {
2533
2599
  || normalized.includes("devicename")
2534
2600
  || normalized.includes("appname");
2535
2601
  }
2602
+ function isJunctionSourceReferenceIdentityKey(key) {
2603
+ const normalized = normalizeJunctionImportSourceIdentityKey(key);
2604
+ return normalized === "connectionid"
2605
+ || normalized === "providerconnectionid"
2606
+ || normalized === "sourceid";
2607
+ }
2608
+ function hasJunctionSourceReferenceIdentity(value, seen = new Set()) {
2609
+ if (Array.isArray(value)) {
2610
+ return value.some((entry) => hasJunctionSourceReferenceIdentity(entry, seen));
2611
+ }
2612
+ const record = readPlainObject(value);
2613
+ if (!record || seen.has(record)) {
2614
+ return false;
2615
+ }
2616
+ seen.add(record);
2617
+ return Object.entries(record).some(([key, nested]) => (isJunctionSourceReferenceIdentityKey(key) && normalizeString(nested) !== undefined) ||
2618
+ hasJunctionSourceReferenceIdentity(nested, seen));
2619
+ }
2536
2620
  function isBlockedJunctionImportSourceIdentityContainerKey(key) {
2537
2621
  const normalized = normalizeJunctionImportSourceIdentityKey(key);
2538
2622
  return isJunctionRawDirectIdentityContainerKey(key)
@@ -2724,6 +2808,22 @@ function resolveJobWindow(job, now, fallbackDays) {
2724
2808
  windowEnd,
2725
2809
  };
2726
2810
  }
2811
+ function readBackfillTimeseriesCursor(job, ownerWindow) {
2812
+ const cursor = toIsoTimestampIfValid(job.payload.timeseriesCursor);
2813
+ return cursor && isTimestampInHalfOpenWindow(cursor, ownerWindow)
2814
+ ? cursor
2815
+ : null;
2816
+ }
2817
+ function isTimestampInHalfOpenWindow(timestamp, window) {
2818
+ const timestampMs = Date.parse(timestamp);
2819
+ const windowStartMs = Date.parse(window.windowStart);
2820
+ const windowEndMs = Date.parse(window.windowEnd);
2821
+ return Number.isFinite(timestampMs)
2822
+ && Number.isFinite(windowStartMs)
2823
+ && Number.isFinite(windowEndMs)
2824
+ && timestampMs >= windowStartMs
2825
+ && timestampMs < windowEndMs;
2826
+ }
2727
2827
  function resolveCurrentSummaryWindow(now, fallbackDays) {
2728
2828
  const windowEnd = new Date(now).toISOString();
2729
2829
  return {
@@ -2810,239 +2910,172 @@ function floorUtcDayTimestamp(timestamp) {
2810
2910
  function hasJunctionSnapshotRecords(snapshot) {
2811
2911
  return Object.values(snapshot).some((records) => records.length > 0);
2812
2912
  }
2813
- function hasJunctionHistoricalBackfillSummaryRecords(snapshot, sourceProviders) {
2814
- const sourceReferences = buildJunctionSourceReferenceMap(sourceProviders);
2815
- return Object.entries(snapshot).some(([resource, records]) => isJunctionHistoricalBackfillCompletionSummaryResource(resource)
2816
- && records.some((record) => expandJunctionHistoricalBackfillSummaryRecord(record).some(({ entry, originFallback }) => hasUsefulJunctionHistoricalBackfillSummaryRecord(resource, entry, resolveJunctionSummarySourceProviderSlug(entry, originFallback, sourceReferences)))));
2817
- }
2818
- function isJunctionHistoricalBackfillCompletionSummaryResource(resource) {
2819
- return JUNCTION_HISTORICAL_BACKFILL_COMPLETION_SUMMARY_RESOURCE_SET.has(resource);
2820
- }
2821
- function hasUsefulJunctionHistoricalBackfillSummaryRecord(resource, entry, sourceProviderSlug, options = {}) {
2822
- if (!sourceProviderSlug) {
2823
- return false;
2824
- }
2825
- if (resource !== "sleep_cycle"
2826
- && !isJunctionSourceSpecificFloatingTimestampProvider(sourceProviderSlug)
2827
- && hasFiniteNumberFromJunctionRecordPaths(entry, JUNCTION_HISTORICAL_SUMMARY_METRIC_PATHS[resource])) {
2828
- return true;
2829
- }
2830
- if (resource === "sleep") {
2831
- return hasPositiveJunctionTimestampRange(entry, JUNCTION_SLEEP_START_TIMESTAMP_PATHS, JUNCTION_SLEEP_END_TIMESTAMP_PATHS, sourceProviderSlug);
2832
- }
2833
- if (resource === "sleep_cycle") {
2834
- return ((options.acceptSleepCycleStageCount ?? true)
2835
- && hasPositiveFiniteNumberFromJunctionRecordPaths(entry, JUNCTION_SLEEP_STAGE_COUNT_PATHS))
2836
- || hasUsefulJunctionSleepCycleStageRecord(entry, sourceProviderSlug);
2837
- }
2838
- if (resource === "workouts") {
2839
- return hasUsefulJunctionWorkoutSessionRecord(entry, sourceProviderSlug);
2840
- }
2841
- if (resource === "meal" || resource === "menstrual_cycle" || resource === "electrocardiogram") {
2842
- return hasUsefulJunctionRawOnlyHistoricalBackfillSummaryRecord(resource, entry);
2843
- }
2844
- return false;
2845
- }
2846
- function hasUsefulJunctionRawOnlyHistoricalBackfillSummaryRecord(resource, entry) {
2847
- // Mirrors the importer invariant: predicted cycles are forecasts, not
2848
- // facts — they emit no normalized events, so forecast-only windows must
2849
- // not complete the historical backfill.
2850
- if (resource === "menstrual_cycle"
2851
- && (entry.isPredicted === true || entry.is_predicted === true)) {
2852
- return false;
2853
- }
2854
- const paths = JUNCTION_RAW_ONLY_COMPLETION_PATHS[resource];
2855
- return hasStringFromJunctionRecordPaths(entry, paths.strings)
2856
- || hasFiniteNumberFromJunctionRecordPaths(entry, paths.numbers)
2857
- || hasNonEmptyJunctionRecordArrayFromPaths(entry, paths.arrays);
2858
- }
2859
- function hasUsefulJunctionSleepCycleStageRecord(entry, sourceProviderSlug) {
2860
- return collectJunctionSleepCycleStageRecords(entry).some((stage) => hasUsefulJunctionSleepCycleStageInterval(stage, sourceProviderSlug));
2861
- }
2862
- function hasJunctionSleepStageValue(entry) {
2863
- return JUNCTION_SLEEP_STAGE_VALUE_PATHS.some((path) => normalizeJunctionSleepStageValue(readJunctionRecordPath(entry, path)) !== null);
2864
- }
2865
- function collectJunctionSleepCycleStageRecords(value) {
2866
- if (Array.isArray(value)) {
2867
- return value.flatMap((entry) => collectJunctionSleepCycleStageRecords(entry));
2868
- }
2869
- const entry = readPlainObject(value);
2870
- if (!entry) {
2871
- return [];
2872
- }
2873
- if (hasJunctionSleepStageValue(entry)) {
2874
- return [entry];
2875
- }
2876
- return JUNCTION_SLEEP_STAGE_ARRAY_PATHS.flatMap((path) => {
2877
- const nested = readJunctionRecordPath(entry, path);
2878
- return nested === value ? [] : collectJunctionSleepCycleStageRecords(nested);
2879
- });
2880
- }
2881
- function hasUsefulJunctionSleepCycleStageInterval(entry, sourceProviderSlug) {
2882
- return hasPositiveFiniteNumberFromJunctionRecordPaths(entry, JUNCTION_SLEEP_STAGE_DURATION_PATHS)
2883
- || hasPositiveJunctionTimestampRange(entry, JUNCTION_SLEEP_START_TIMESTAMP_PATHS, JUNCTION_SLEEP_END_TIMESTAMP_PATHS, sourceProviderSlug);
2884
- }
2885
- function expandJunctionHistoricalBackfillSummaryRecord(value) {
2886
- const record = readPlainObject(value);
2887
- if (!record) {
2888
- return [];
2889
- }
2890
- const nestedEntries = readNestedJunctionHistoricalBackfillSummaryEntries(record);
2891
- if (!nestedEntries) {
2892
- return [{ entry: record }];
2913
+ function hasJunctionHistoricalBackfillSummaryRecords(evidence) {
2914
+ return evidence.some(({ resource }) => isJunctionHistoricalBackfillCompletionSummaryResource(resource));
2915
+ }
2916
+ function evaluateJunctionHistoricalBackfillCoverage(summaryEvidence, sourceProviders, configuredSummaryResources, providerFilter, historicalPullSnapshot, historicalPushEvidence, window) {
2917
+ const configuredResources = new Set(configuredSummaryResources.filter((resource) => JUNCTION_HISTORICAL_BACKFILL_REQUIRED_SUMMARY_RESOURCE_SET.has(resource)));
2918
+ const advertisedResourcesByProvider = new Map();
2919
+ const connectedProviderSlugs = new Set();
2920
+ const pendingProviderSlugs = new Set();
2921
+ const reconnectProviderSlugs = new Set();
2922
+ const providerStatusBySlug = new Map();
2923
+ for (const provider of sourceProviders) {
2924
+ const providerSlug = resolveJunctionHistoricalCoverageProviderSlug(provider.origin.sourceProviderSlug ?? provider.slug, providerFilter);
2925
+ if (!providerSlug) {
2926
+ continue;
2927
+ }
2928
+ const status = mapJunctionSourceStatus(provider.status);
2929
+ const existingStatus = providerStatusBySlug.get(providerSlug);
2930
+ providerStatusBySlug.set(providerSlug, existingStatus ? mergeJunctionSourceStatus(existingStatus, status) : status);
2931
+ for (const [rawResource, availability] of Object.entries(provider.resourceAvailability)) {
2932
+ const resource = normalizeJunctionResourceName(rawResource);
2933
+ if (!resource
2934
+ || !configuredResources.has(resource)
2935
+ || !isJunctionResourceAdvertisedAvailable(availability)) {
2936
+ continue;
2937
+ }
2938
+ const advertisedResources = advertisedResourcesByProvider.get(providerSlug) ?? new Set();
2939
+ advertisedResources.add(resource);
2940
+ advertisedResourcesByProvider.set(providerSlug, advertisedResources);
2941
+ }
2893
2942
  }
2894
- return nestedEntries.map((entry) => ({
2895
- entry,
2896
- originFallback: record,
2897
- }));
2898
- }
2899
- function readNestedJunctionHistoricalBackfillSummaryEntries(record) {
2900
- for (const key of ["data", "results", "items", "records"]) {
2901
- const directEntry = readPlainObject(record[key]);
2902
- const entries = directEntry
2903
- ? [directEntry]
2904
- : readJunctionRecordArray(record[key]).flatMap((entry) => {
2905
- const normalized = readPlainObject(entry);
2906
- return normalized ? [normalized] : [];
2907
- });
2908
- if (entries.length > 0) {
2909
- return entries;
2943
+ const historicalSourcesByProvider = new Map(historicalPullSnapshot?.matchedUser
2944
+ ? historicalPullSnapshot.sources.flatMap((source) => {
2945
+ const providerSlug = resolveJunctionHistoricalCoverageProviderSlug(source.sourceProviderSlug, providerFilter);
2946
+ return providerSlug ? [[providerSlug, source]] : [];
2947
+ })
2948
+ : []);
2949
+ for (const [providerSlug, status] of providerStatusBySlug.entries()) {
2950
+ if (status === "disconnected") {
2951
+ continue;
2952
+ }
2953
+ const historicalSource = historicalSourcesByProvider.get(providerSlug);
2954
+ const notPulledResources = new Set(historicalSource?.notPulledResources.flatMap((value) => {
2955
+ const resource = normalizeJunctionResourceName(value);
2956
+ return resource ? [resource] : [];
2957
+ }) ?? []);
2958
+ const historicalResources = new Map(historicalSource?.pulledResources.flatMap((entry) => {
2959
+ const resource = normalizeJunctionResourceName(entry.resource);
2960
+ return resource && configuredResources.has(resource)
2961
+ ? [[resource, entry]]
2962
+ : [];
2963
+ }) ?? []);
2964
+ const requiredResources = new Set([
2965
+ ...(advertisedResourcesByProvider.get(providerSlug) ?? []),
2966
+ ...historicalResources.keys(),
2967
+ ].filter((resource) => !notPulledResources.has(resource) || historicalResources.has(resource)));
2968
+ if (status === "connected") {
2969
+ connectedProviderSlugs.add(providerSlug);
2970
+ }
2971
+ if (requiredResources.size === 0) {
2972
+ continue;
2973
+ }
2974
+ if (status !== "connected") {
2975
+ pendingProviderSlugs.add(providerSlug);
2976
+ continue;
2977
+ }
2978
+ let hasPendingResource = false;
2979
+ let everyPendingResourceFailed = true;
2980
+ for (const resource of requiredResources) {
2981
+ if (!isJunctionHistoricalBackfillRequiredSummaryResource(resource)) {
2982
+ continue;
2983
+ }
2984
+ const historicalResource = historicalResources.get(resource);
2985
+ if (historicalSource) {
2986
+ if (historicalResource?.status === "success") {
2987
+ continue;
2988
+ }
2989
+ hasPendingResource = true;
2990
+ if (historicalResource?.status !== "failure") {
2991
+ everyPendingResourceFailed = false;
2992
+ }
2993
+ continue;
2994
+ }
2995
+ const coveredBySummary = summaryEvidence.some((entry) => entry.resource === resource
2996
+ && canonicalizeJunctionHistoricalProviderSlug(entry.sourceProviderSlug) === providerSlug);
2997
+ const coveredByPush = hasJunctionHistoricalBackfillEvidence(historicalPushEvidence, providerSlug, resource, window.windowStart, window.windowEnd);
2998
+ if (!coveredBySummary && !coveredByPush) {
2999
+ hasPendingResource = true;
3000
+ everyPendingResourceFailed = false;
3001
+ }
3002
+ }
3003
+ if (hasPendingResource) {
3004
+ pendingProviderSlugs.add(providerSlug);
3005
+ if (everyPendingResourceFailed
3006
+ && isJunctionHistoricalResetProviderSlug(providerSlug)) {
3007
+ reconnectProviderSlugs.add(providerSlug);
3008
+ }
2910
3009
  }
2911
3010
  }
2912
- return null;
2913
- }
2914
- function resolveJunctionSummarySourceProviderSlug(entry, originFallback, sourceReferences) {
2915
- const resolvedOrigin = resolveJunctionOrigin(entry, buildJunctionSummarySourceFallback(entry, originFallback, sourceReferences));
2916
- return resolvedOrigin.sourceProviderSlug ?? null;
2917
- }
2918
- function buildJunctionSummarySourceFallback(entry, originFallback, sourceReferences) {
2919
- const entryReference = readJunctionSourceReference(entry, sourceReferences);
2920
- const fallbackReference = originFallback
2921
- ? readJunctionSourceReference(originFallback, sourceReferences)
2922
- : {};
3011
+ const sortedPendingProviderSlugs = [...pendingProviderSlugs]
3012
+ .sort((left, right) => left.localeCompare(right));
2923
3013
  return {
2924
- ...(originFallback ?? {}),
2925
- ...fallbackReference,
2926
- ...entryReference,
3014
+ complete: connectedProviderSlugs.size > 0 && sortedPendingProviderSlugs.length === 0,
3015
+ pendingProviderSlugs: sortedPendingProviderSlugs,
3016
+ reconnectProviderSlugs: [...reconnectProviderSlugs]
3017
+ .sort((left, right) => left.localeCompare(right)),
2927
3018
  };
2928
3019
  }
2929
- function hasUsefulJunctionWorkoutSessionRecord(entry, sourceProviderSlug) {
2930
- const hasDuration = hasPositiveFiniteNumberFromJunctionRecordPaths(entry, JUNCTION_WORKOUT_DURATION_MINUTE_PATHS)
2931
- || hasPositiveFiniteNumberFromJunctionRecordPaths(entry, JUNCTION_WORKOUT_DURATION_SECOND_PATHS)
2932
- || hasPositiveFiniteNumberFromJunctionRecordPaths(entry, JUNCTION_WORKOUT_DURATION_MILLISECOND_PATHS)
2933
- || hasPositiveJunctionTimestampRange(entry, JUNCTION_WORKOUT_START_TIMESTAMP_PATHS, JUNCTION_WORKOUT_END_TIMESTAMP_PATHS, sourceProviderSlug);
2934
- if (!hasDuration) {
2935
- return false;
3020
+ function canonicalizeJunctionHistoricalProviderSlug(value) {
3021
+ const providerSlug = normalizeProviderSlug(value);
3022
+ if (!providerSlug) {
3023
+ return null;
2936
3024
  }
2937
- const startAt = firstJunctionTimestampMillisFromPaths(entry, JUNCTION_WORKOUT_START_TIMESTAMP_PATHS, sourceProviderSlug);
2938
- const endAt = firstJunctionTimestampMillisFromPaths(entry, JUNCTION_WORKOUT_END_TIMESTAMP_PATHS, sourceProviderSlug);
2939
- return startAt !== null || (endAt === null && !isJunctionSourceSpecificFloatingTimestampProvider(sourceProviderSlug));
3025
+ return resolveJunctionDeviceConnectRouteByProviderSlug(providerSlug)?.route.sourceProviderSlug
3026
+ ?? null;
2940
3027
  }
2941
- function hasFiniteNumberFromJunctionRecordPaths(entry, paths) {
2942
- return paths.some((path) => finiteJunctionNumber(readJunctionRecordPath(entry, path)) !== undefined);
2943
- }
2944
- function hasStringFromJunctionRecordPaths(entry, paths) {
2945
- return paths.some((path) => normalizeString(readJunctionRecordPath(entry, path)) !== undefined);
2946
- }
2947
- function hasPositiveFiniteNumberFromJunctionRecordPaths(entry, paths) {
2948
- return paths.some((path) => {
2949
- const numeric = finiteJunctionNumber(readJunctionRecordPath(entry, path));
2950
- return numeric !== undefined && numeric > 0;
2951
- });
2952
- }
2953
- function hasNonEmptyJunctionRecordArrayFromPaths(entry, paths) {
2954
- return paths.some((path) => readJunctionRecordArray(readJunctionRecordPath(entry, path)).some(isUsefulJunctionRawOnlyArrayEntry));
2955
- }
2956
- function isUsefulJunctionRawOnlyArrayEntry(value) {
2957
- if (value === undefined || value === null) {
2958
- return false;
3028
+ function resolveJunctionHistoricalCoverageProviderSlug(value, providerFilter) {
3029
+ const providerSlug = canonicalizeJunctionHistoricalProviderSlug(value);
3030
+ if (!providerSlug) {
3031
+ return null;
2959
3032
  }
2960
- if (typeof value === "string") {
2961
- return normalizeString(value) !== undefined;
3033
+ const route = resolveJunctionDeviceConnectRouteByProviderSlug(providerSlug)?.route;
3034
+ if (!route) {
3035
+ return null;
2962
3036
  }
2963
- if (typeof value === "number") {
2964
- return Number.isFinite(value);
3037
+ return route.kind === "junction_sdk" || providerFilter.includes(providerSlug)
3038
+ ? providerSlug
3039
+ : null;
3040
+ }
3041
+ function isJunctionHistoricalBackfillRequiredSummaryResource(resource) {
3042
+ return JUNCTION_HISTORICAL_BACKFILL_REQUIRED_SUMMARY_RESOURCE_SET.has(resource);
3043
+ }
3044
+ function readJunctionDirectHistoricalEvidenceWindow(input, connectWindow, evidence, providerFilter) {
3045
+ const providerSlug = resolveJunctionHistoricalCoverageProviderSlug(input.sourceProviderSlug, providerFilter);
3046
+ if (!providerSlug
3047
+ || !isJunctionHistoricalBackfillRequiredSummaryResource(input.resource)
3048
+ || !evidence.some((entry) => entry.resource === input.resource
3049
+ && canonicalizeJunctionHistoricalProviderSlug(entry.sourceProviderSlug) === providerSlug)) {
3050
+ return null;
2965
3051
  }
2966
- if (typeof value === "boolean") {
3052
+ return connectWindow;
3053
+ }
3054
+ function isJunctionResourceAdvertisedAvailable(value) {
3055
+ if (value === true) {
2967
3056
  return true;
2968
3057
  }
2969
- if (Array.isArray(value)) {
2970
- return value.some(isUsefulJunctionRawOnlyArrayEntry);
3058
+ if (typeof value === "string") {
3059
+ return value.trim().toLowerCase() === "available";
2971
3060
  }
2972
3061
  const record = readPlainObject(value);
2973
3062
  if (!record) {
2974
3063
  return false;
2975
3064
  }
2976
- return Object.entries(record).some(([key, nested]) => !isBlockedJunctionImportSourceIdentityKey(key)
2977
- && !isBlockedJunctionImportSourceIdentityContainerKey(key)
2978
- && isUsefulJunctionRawOnlyArrayEntry(nested));
2979
- }
2980
- function hasPositiveJunctionTimestampRange(entry, startPaths, endPaths, sourceProviderSlug) {
2981
- const startAt = firstJunctionTimestampMillisFromPaths(entry, startPaths, sourceProviderSlug);
2982
- const endAt = firstJunctionTimestampMillisFromPaths(entry, endPaths, sourceProviderSlug);
2983
- return startAt !== null && endAt !== null && endAt > startAt;
3065
+ return record.available === true
3066
+ || normalizeString(record.status)?.toLowerCase() === "available";
2984
3067
  }
2985
- function firstJunctionTimestampMillisFromPaths(entry, paths, sourceProviderSlug) {
2986
- for (const path of paths) {
2987
- const timestamp = junctionTimestampMillis(readJunctionRecordPath(entry, path), sourceProviderSlug);
2988
- if (timestamp !== null) {
2989
- return timestamp;
2990
- }
2991
- }
2992
- return null;
2993
- }
2994
- function readJunctionRecordPath(entry, path) {
2995
- return path.split(".").reduce((current, key) => {
2996
- const record = readPlainObject(current);
2997
- return record ? record[key] : undefined;
2998
- }, entry);
3068
+ function isJunctionHistoricalBackfillCompletionSummaryResource(resource) {
3069
+ return JUNCTION_HISTORICAL_BACKFILL_COMPLETION_SUMMARY_RESOURCE_SET.has(resource);
2999
3070
  }
3000
3071
  function readJunctionRecordArray(value) {
3001
3072
  return Array.isArray(value) ? value : [];
3002
3073
  }
3003
- function finiteJunctionNumber(value) {
3004
- if (typeof value === "number" && Number.isFinite(value)) {
3005
- return value;
3006
- }
3007
- if (typeof value === "string" && value.trim()) {
3008
- const numeric = Number(value);
3009
- return Number.isFinite(numeric) ? numeric : undefined;
3010
- }
3011
- return undefined;
3012
- }
3013
- function junctionTimestampMillis(value, sourceProviderSlug) {
3014
- if (value instanceof Date && Number.isFinite(value.getTime())) {
3015
- return value.getTime();
3016
- }
3017
- if (typeof value === "number" && Number.isFinite(value)) {
3018
- return value;
3019
- }
3020
- if (typeof value !== "string" || !value.trim()) {
3021
- return null;
3022
- }
3023
- const trimmed = value.trim();
3024
- if (isRejectedJunctionSafeTimestampString(trimmed, sourceProviderSlug)) {
3025
- return null;
3026
- }
3027
- const parsed = Date.parse(trimmed);
3028
- return Number.isFinite(parsed) ? parsed : null;
3029
- }
3030
- function isRejectedJunctionSafeTimestampString(value, sourceProviderSlug) {
3031
- if (isJunctionSourceSpecificFloatingTimestampProvider(sourceProviderSlug)) {
3032
- return true;
3033
- }
3034
- return /^\d{4}-\d{2}-\d{2}(?:$|[ t]\d{2}:\d{2})/iu.test(value)
3035
- && !/z$/iu.test(value)
3036
- && !/[+-]\d{2}:?\d{2}$/u.test(value);
3037
- }
3038
- function isJunctionSourceSpecificFloatingTimestampProvider(sourceProviderSlug) {
3039
- const normalizedSourceProviderSlug = normalizeProviderSlug(sourceProviderSlug);
3040
- return normalizedSourceProviderSlug
3041
- ? JUNCTION_FLOATING_TIMESTAMP_SOURCE_PROVIDER_SLUGS.has(normalizedSourceProviderSlug)
3042
- : false;
3043
- }
3044
3074
  function buildHistoricalBackfillFollowUp(input) {
3045
- if (input.hasRecords) {
3075
+ if (!canCurrentRuntimeMutateJunctionHistoricalBackfillProgress(input.metadata)) {
3076
+ return {};
3077
+ }
3078
+ if (input.coverageComplete) {
3046
3079
  return {
3047
3080
  metadataPatch: buildHistoricalBackfillMetadataPatch({
3048
3081
  status: "complete",
@@ -3057,8 +3090,18 @@ function buildHistoricalBackfillFollowUp(input) {
3057
3090
  || hasHistoricalBackfillWindowStatus(input.metadata, "exhausted", input.windowStart, input.windowEnd)) {
3058
3091
  return {};
3059
3092
  }
3060
- const emptyAttempts = readHistoricalBackfillEmptyAttempts(input.metadata, input.windowStart, input.windowEnd) + 1;
3061
- const retryDelayMs = EMPTY_HISTORICAL_BACKFILL_RETRY_DELAYS_MS[emptyAttempts - 1] ?? null;
3093
+ const pendingRetryAt = readPendingHistoricalBackfillRetryAt(input.metadata, input.windowStart, input.windowEnd);
3094
+ const pendingRetryAtMs = pendingRetryAt ? Date.parse(pendingRetryAt) : NaN;
3095
+ if (pendingRetryAt && Number.isFinite(pendingRetryAtMs) && Date.parse(input.now) < pendingRetryAtMs) {
3096
+ return { nextReconcileAt: pendingRetryAt };
3097
+ }
3098
+ const previousEmptyAttempts = readHistoricalBackfillEmptyAttempts(input.metadata, input.windowStart, input.windowEnd);
3099
+ let emptyAttempts = previousEmptyAttempts + 1;
3100
+ let retryDelayMs = EMPTY_HISTORICAL_BACKFILL_RETRY_DELAYS_MS[emptyAttempts - 1] ?? null;
3101
+ if (retryDelayMs === null && !input.terminalFailure) {
3102
+ emptyAttempts = EMPTY_HISTORICAL_BACKFILL_RETRY_DELAYS_MS.length;
3103
+ retryDelayMs = EMPTY_HISTORICAL_BACKFILL_RETRY_DELAYS_MS[emptyAttempts - 1] ?? null;
3104
+ }
3062
3105
  const status = retryDelayMs === null ? "exhausted" : "retrying";
3063
3106
  const metadataPatch = buildHistoricalBackfillMetadataPatch({
3064
3107
  status,
@@ -3070,23 +3113,66 @@ function buildHistoricalBackfillFollowUp(input) {
3070
3113
  if (retryDelayMs === null) {
3071
3114
  return { metadataPatch };
3072
3115
  }
3116
+ const retryAt = addMilliseconds(input.now, retryDelayMs);
3117
+ return {
3118
+ metadataPatch,
3119
+ nextReconcileAt: retryAt,
3120
+ };
3121
+ }
3122
+ function readPendingHistoricalBackfillRetryAt(metadata, windowStart, windowEnd) {
3123
+ if (readHistoricalBackfillCoverageVersion(metadata)
3124
+ !== JUNCTION_HISTORICAL_BACKFILL_COVERAGE_VERSION) {
3125
+ return null;
3126
+ }
3127
+ const status = readHistoricalBackfillStatus(metadata)?.status ?? null;
3128
+ if (status !== "retrying") {
3129
+ return null;
3130
+ }
3131
+ const metadataWindowStart = normalizeString(metadata[JUNCTION_HISTORICAL_BACKFILL_METADATA_KEYS.windowStart]);
3132
+ const metadataWindowEnd = normalizeString(metadata[JUNCTION_HISTORICAL_BACKFILL_METADATA_KEYS.windowEnd]);
3133
+ if (metadataWindowStart !== windowStart || metadataWindowEnd !== windowEnd) {
3134
+ return null;
3135
+ }
3136
+ const emptyAttempts = Math.max(1, readHistoricalBackfillEmptyAttempts(metadata, windowStart, windowEnd));
3137
+ const retryDelayMs = EMPTY_HISTORICAL_BACKFILL_RETRY_DELAYS_MS[emptyAttempts - 1] ?? null;
3138
+ const lastEmptyAt = normalizeString(metadata[JUNCTION_HISTORICAL_BACKFILL_METADATA_KEYS.lastEmptyAt]);
3139
+ if (retryDelayMs === null || !lastEmptyAt || !Number.isFinite(Date.parse(lastEmptyAt))) {
3140
+ return null;
3141
+ }
3142
+ return addMilliseconds(lastEmptyAt, retryDelayMs);
3143
+ }
3144
+ function buildNonConnectHistoricalBackfillFollowUp(input) {
3145
+ if (input.hasRecords) {
3146
+ return {};
3147
+ }
3148
+ const emptyAttempts = readHistoricalBackfillJobEmptyAttempts(input.job) + 1;
3149
+ const retryDelayMs = EMPTY_HISTORICAL_BACKFILL_RETRY_DELAYS_MS[emptyAttempts - 1] ?? null;
3150
+ if (retryDelayMs === null) {
3151
+ return {};
3152
+ }
3153
+ const retryAt = addMilliseconds(input.now, retryDelayMs);
3073
3154
  const retryJob = buildExactWindowJob({
3074
3155
  kind: "backfill",
3156
+ priority: Math.max(input.job.priority, JUNCTION_HISTORICAL_BACKFILL_RETRY_PRIORITY),
3075
3157
  windowStart: input.windowStart,
3076
3158
  windowEnd: input.windowEnd,
3077
- priority: 30,
3078
3159
  });
3079
3160
  return {
3080
- metadataPatch,
3081
- scheduledJobs: [{
3161
+ scheduledJobs: [
3162
+ {
3082
3163
  ...retryJob,
3083
- availableAt: addMilliseconds(input.now, retryDelayMs),
3084
- }],
3164
+ availableAt: retryAt,
3165
+ payload: {
3166
+ ...(retryJob.payload ?? {}),
3167
+ emptyBackfillAttempts: emptyAttempts,
3168
+ },
3169
+ },
3170
+ ],
3085
3171
  };
3086
3172
  }
3087
3173
  function buildHistoricalBackfillMetadataPatch(input) {
3088
3174
  return {
3089
- [JUNCTION_HISTORICAL_BACKFILL_METADATA_KEYS.status]: input.status,
3175
+ [JUNCTION_HISTORICAL_BACKFILL_METADATA_KEYS.status]: encodeJunctionHistoricalBackfillStatus(input.status),
3090
3176
  [JUNCTION_HISTORICAL_BACKFILL_METADATA_KEYS.emptyAttempts]: input.emptyAttempts,
3091
3177
  [JUNCTION_HISTORICAL_BACKFILL_METADATA_KEYS.lastEmptyAt]: input.lastEmptyAt,
3092
3178
  [JUNCTION_HISTORICAL_BACKFILL_METADATA_KEYS.windowStart]: input.windowStart,
@@ -3094,12 +3180,16 @@ function buildHistoricalBackfillMetadataPatch(input) {
3094
3180
  };
3095
3181
  }
3096
3182
  function hasHistoricalBackfillWindowStatus(metadata, status, windowStart, windowEnd) {
3097
- return normalizeString(metadata[JUNCTION_HISTORICAL_BACKFILL_METADATA_KEYS.status]) === status
3183
+ return readHistoricalBackfillCoverageVersion(metadata)
3184
+ === JUNCTION_HISTORICAL_BACKFILL_COVERAGE_VERSION
3185
+ && readHistoricalBackfillStatus(metadata)?.status === status
3098
3186
  && normalizeString(metadata[JUNCTION_HISTORICAL_BACKFILL_METADATA_KEYS.windowStart]) === windowStart
3099
3187
  && normalizeString(metadata[JUNCTION_HISTORICAL_BACKFILL_METADATA_KEYS.windowEnd]) === windowEnd;
3100
3188
  }
3101
3189
  function readHistoricalBackfillEmptyAttempts(metadata, windowStart, windowEnd) {
3102
- if (normalizeString(metadata[JUNCTION_HISTORICAL_BACKFILL_METADATA_KEYS.windowStart]) !== windowStart
3190
+ if (readHistoricalBackfillCoverageVersion(metadata)
3191
+ !== JUNCTION_HISTORICAL_BACKFILL_COVERAGE_VERSION
3192
+ || normalizeString(metadata[JUNCTION_HISTORICAL_BACKFILL_METADATA_KEYS.windowStart]) !== windowStart
3103
3193
  || normalizeString(metadata[JUNCTION_HISTORICAL_BACKFILL_METADATA_KEYS.windowEnd]) !== windowEnd) {
3104
3194
  return 0;
3105
3195
  }
@@ -3108,6 +3198,22 @@ function readHistoricalBackfillEmptyAttempts(metadata, windowStart, windowEnd) {
3108
3198
  ? rawAttempts
3109
3199
  : 0;
3110
3200
  }
3201
+ function readHistoricalBackfillStatus(metadata) {
3202
+ return readJunctionHistoricalBackfillStatus(metadata[JUNCTION_HISTORICAL_BACKFILL_METADATA_KEYS.status]);
3203
+ }
3204
+ function readHistoricalBackfillCoverageVersion(metadata) {
3205
+ return readHistoricalBackfillStatus(metadata)?.coverageVersion ?? 0;
3206
+ }
3207
+ function readHistoricalBackfillJobEmptyAttempts(job) {
3208
+ const rawAttempts = job.payload.emptyBackfillAttempts;
3209
+ return typeof rawAttempts === "number" && Number.isInteger(rawAttempts) && rawAttempts > 0 ? rawAttempts : 0;
3210
+ }
3211
+ function buildConnectHistoricalBackfillWindow(account, summaryBackfillDays) {
3212
+ return {
3213
+ windowStart: floorUtcDayTimestamp(subtractDays(account.connectedAt, summaryBackfillDays)),
3214
+ windowEnd: floorUtcDayTimestamp(account.connectedAt),
3215
+ };
3216
+ }
3111
3217
  function buildWindowJob(input) {
3112
3218
  const windowEnd = floorUtcDayTimestamp(input.now);
3113
3219
  const windowStart = floorUtcDayTimestamp(input.windowStart);
@@ -3115,6 +3221,7 @@ function buildWindowJob(input) {
3115
3221
  kind: input.kind,
3116
3222
  windowStart,
3117
3223
  windowEnd,
3224
+ availableAt: input.now,
3118
3225
  priority: input.priority,
3119
3226
  });
3120
3227
  }
@@ -3124,8 +3231,10 @@ function buildExactWindowJob(input) {
3124
3231
  payload: {
3125
3232
  windowStart: input.windowStart,
3126
3233
  windowEnd: input.windowEnd,
3234
+ ...(input.payload ?? {}),
3127
3235
  },
3128
3236
  priority: input.priority,
3237
+ ...(input.availableAt ? { availableAt: input.availableAt } : {}),
3129
3238
  dedupeKey: sha256Text(JSON.stringify(["junction", input.kind, input.windowStart, input.windowEnd])),
3130
3239
  };
3131
3240
  }
@@ -3133,20 +3242,12 @@ function buildJunctionWebhookJobs(input) {
3133
3242
  if (isJunctionProviderConnectionEvent(input.eventType)) {
3134
3243
  const backfillWindowStart = subtractDays(input.window.windowEnd, input.summaryBackfillDays);
3135
3244
  return [
3136
- {
3245
+ buildExactWindowJob({
3137
3246
  kind: "backfill",
3138
- payload: {
3139
- windowStart: backfillWindowStart,
3140
- windowEnd: input.window.windowEnd,
3141
- },
3247
+ windowStart: backfillWindowStart,
3248
+ windowEnd: input.window.windowEnd,
3142
3249
  priority: 35,
3143
- dedupeKey: sha256Text(JSON.stringify([
3144
- "junction-webhook",
3145
- "connection-backfill",
3146
- backfillWindowStart,
3147
- input.window.windowEnd,
3148
- ])),
3149
- },
3250
+ }),
3150
3251
  {
3151
3252
  kind: "reconcile",
3152
3253
  payload: {
@@ -3302,7 +3403,10 @@ function buildJunctionWebhookDataJobJsons(input) {
3302
3403
  && isJunctionHistoricalPullCompletedWebhookData(input.data, input.externalAccountId)) {
3303
3404
  return [];
3304
3405
  }
3305
- const sanitized = sanitizeJunctionImportSnapshotValue(input.data, new Map(), { blockedStringValues: [input.externalAccountId] });
3406
+ const sanitized = sanitizeJunctionImportSnapshotValue(input.data, new Map(), {
3407
+ blockedStringValues: [input.externalAccountId],
3408
+ preserveSourceReferenceKeys: true,
3409
+ });
3306
3410
  const record = readPlainObject(sanitized);
3307
3411
  if (!record) {
3308
3412
  return [];
@@ -3328,6 +3432,92 @@ function parseJunctionWebhookDataJobRecord(value) {
3328
3432
  return null;
3329
3433
  }
3330
3434
  }
3435
+ const JUNCTION_COMPANION_HEALTH_METADATA_TIMESTAMP_PATTERN = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?(?:Z|[+-]\d{2}:\d{2})$/u;
3436
+ function parseJunctionCompanionHealthMetadataJob(job) {
3437
+ if (job.payload.resource !== JUNCTION_COMPANION_HEALTH_METADATA_RESOURCE) {
3438
+ throw invalidJunctionCompanionHealthMetadataJob("resource is invalid");
3439
+ }
3440
+ if (job.payload.eventType !== JUNCTION_COMPANION_HEALTH_METADATA_EVENT_TYPE) {
3441
+ throw invalidJunctionCompanionHealthMetadataJob("eventType is invalid");
3442
+ }
3443
+ if (job.payload.resourceCategory !== "summary") {
3444
+ throw invalidJunctionCompanionHealthMetadataJob("resourceCategory is invalid");
3445
+ }
3446
+ if (job.payload.sourceProviderSlug !== JUNCTION_COMPANION_HEALTH_METADATA_SOURCE_PROVIDER) {
3447
+ throw invalidJunctionCompanionHealthMetadataJob("sourceProviderSlug is invalid");
3448
+ }
3449
+ const receivedAt = toJunctionCompanionHealthMetadataIsoTimestamp(job.payload.occurredAt);
3450
+ if (!receivedAt) {
3451
+ throw invalidJunctionCompanionHealthMetadataJob("occurredAt is invalid");
3452
+ }
3453
+ const receivedAtMs = Date.parse(receivedAt);
3454
+ const json = typeof job.payload.webhookDataJson === "string"
3455
+ ? job.payload.webhookDataJson
3456
+ : null;
3457
+ if (!json || Buffer.byteLength(json, "utf8") > JUNCTION_COMPANION_HEALTH_METADATA_MAX_BATCH_BYTES) {
3458
+ throw invalidJunctionCompanionHealthMetadataJob("batch JSON is missing or too large");
3459
+ }
3460
+ let parsed;
3461
+ try {
3462
+ parsed = JSON.parse(json);
3463
+ }
3464
+ catch {
3465
+ throw invalidJunctionCompanionHealthMetadataJob("batch JSON is invalid");
3466
+ }
3467
+ try {
3468
+ return parseJunctionCompanionHealthMetadataBatch(parsed, receivedAtMs).records;
3469
+ }
3470
+ catch (error) {
3471
+ if (error instanceof JunctionCompanionHealthMetadataParseError) {
3472
+ throw invalidJunctionCompanionHealthMetadataJob(error.message);
3473
+ }
3474
+ throw error;
3475
+ }
3476
+ }
3477
+ function invalidJunctionCompanionHealthMetadataJob(reason) {
3478
+ return deviceSyncError({
3479
+ code: "DEVICE_SYNC_JOB_PAYLOAD_INVALID",
3480
+ message: `Junction companion health metadata ${reason}.`,
3481
+ retryable: false,
3482
+ });
3483
+ }
3484
+ function buildJunctionCompanionRecoverySummary(record) {
3485
+ return stripUndefined({
3486
+ id: record.recordId,
3487
+ date: record.endAt,
3488
+ companionStartAt: record.startAt,
3489
+ companionEndAt: record.endAt,
3490
+ companionSyncVersion: record.syncVersion,
3491
+ recovery_readiness_score: record.value,
3492
+ source: {
3493
+ provider: JUNCTION_COMPANION_HEALTH_METADATA_SOURCE_PROVIDER,
3494
+ type: JUNCTION_COMPANION_HEALTH_METADATA_SOURCE_TYPE,
3495
+ },
3496
+ });
3497
+ }
3498
+ function buildJunctionCompanionWorkoutStrainSummary(record) {
3499
+ return stripUndefined({
3500
+ id: record.recordId,
3501
+ date: record.endAt,
3502
+ companionStartAt: record.startAt,
3503
+ companionEndAt: record.endAt,
3504
+ companionSyncVersion: record.syncVersion,
3505
+ workout_strain: record.value,
3506
+ source: {
3507
+ provider: JUNCTION_COMPANION_HEALTH_METADATA_SOURCE_PROVIDER,
3508
+ type: JUNCTION_COMPANION_HEALTH_METADATA_SOURCE_TYPE,
3509
+ },
3510
+ });
3511
+ }
3512
+ function toJunctionCompanionHealthMetadataIsoTimestamp(value) {
3513
+ if (typeof value !== "string"
3514
+ || value.length > 64
3515
+ || !JUNCTION_COMPANION_HEALTH_METADATA_TIMESTAMP_PATTERN.test(value)) {
3516
+ return null;
3517
+ }
3518
+ const parsed = Date.parse(value);
3519
+ return Number.isFinite(parsed) ? new Date(parsed).toISOString() : null;
3520
+ }
3331
3521
  function resolveJunctionWebhookDataRecordSourceProviderSlug(record) {
3332
3522
  const slugs = new Set();
3333
3523
  const addSlug = (value) => {
@@ -3428,15 +3618,7 @@ function inferJunctionWebhookResource(eventType, data) {
3428
3618
  category: inferJunctionResourceCategory(explicitCategory, resource),
3429
3619
  };
3430
3620
  }
3431
- export { normalizeJunctionResourceName } from "@murphai/importers/device-providers/junction-resources";
3432
- /**
3433
- * Resolves the normalized Junction resource name carried by a webhook event
3434
- * type such as `daily.data.sleep.created`. Lifecycle events (for example
3435
- * `provider.connection.created`) carry no data resource and resolve to null.
3436
- */
3437
- export function readJunctionWebhookResourceName(eventType) {
3438
- return normalizeJunctionResourceName(readJunctionWebhookResourceFromEventType(eventType));
3439
- }
3621
+ export { normalizeJunctionResourceName, readJunctionWebhookResourceName } from "../junction-resources.js";
3440
3622
  function readJunctionWebhookResourceFromEventType(eventType) {
3441
3623
  const parts = eventType.split(".").map((part) => part.trim()).filter(Boolean);
3442
3624
  const dataIndex = parts.indexOf("data");
@@ -3874,26 +4056,56 @@ function describeJunctionWebhookIdentityCandidateDiagnostics(candidates, selecti
3874
4056
  }
3875
4057
  return diagnosticCandidates;
3876
4058
  }
3877
- async function projectJunctionSources(context, providers) {
4059
+ async function projectJunctionSources(context, providers, options = {}) {
3878
4060
  if (!context.upsertConnectionSource) {
3879
4061
  context.logger.warn?.("Junction source projection skipped because the job context does not expose source storage.", {
3880
4062
  provider: "junction",
3881
4063
  });
3882
4064
  return;
3883
4065
  }
4066
+ const historicalState = readHistoricalBackfillStatus(context.account.metadata);
4067
+ const preserveOpaqueHistoricalReconnect = !canCurrentRuntimeMutateJunctionHistoricalBackfillProgress(context.account.metadata);
4068
+ const preserveHistoricalReconnect = options.preserveHistoricalReconnect ?? (options.preserveHistoricalReconnectProviderSlugs !== undefined
4069
+ || preserveOpaqueHistoricalReconnect
4070
+ || (historicalState !== null
4071
+ && historicalState.coverageVersion >= JUNCTION_HISTORICAL_BACKFILL_COVERAGE_VERSION
4072
+ && historicalState.status !== "complete"));
4073
+ const preserveHistoricalReconnectProviderSlugs = options.preserveHistoricalReconnectProviderSlugs === undefined
4074
+ ? null
4075
+ : new Set(options.preserveHistoricalReconnectProviderSlugs);
4076
+ const existingSources = context.listConnectionSources
4077
+ ? await context.listConnectionSources()
4078
+ : [];
4079
+ const existingByInstanceKey = new Map(existingSources.map((source) => [source.sourceInstanceKey, source]));
3884
4080
  for (const source of projectJunctionSourcesByProviderSlug(context.account.id, providers)) {
4081
+ const existing = existingByInstanceKey.get(source.sourceInstanceKey) ?? existingSources.find((candidate) => normalizeProviderSlug(candidate.sourceProviderSlug) === source.sourceProviderSlug);
4082
+ const keepHistoricalReconnect = preserveHistoricalReconnect
4083
+ && (preserveHistoricalReconnectProviderSlugs === null
4084
+ || preserveHistoricalReconnectProviderSlugs.has(source.sourceProviderSlug))
4085
+ && source.status !== "disconnected"
4086
+ && existing !== undefined
4087
+ && (preserveOpaqueHistoricalReconnect
4088
+ ? existing.status === "error"
4089
+ && existing.lastErrorCode === DEVICE_SYNC_HISTORICAL_DATA_RECONNECT_REQUIRED_ERROR_CODE
4090
+ : requiresHistoricalResetDeviceSyncSource(existing));
4091
+ const historicalReconnectError = keepHistoricalReconnect ? existing : null;
3885
4092
  await context.upsertConnectionSource({
3886
- sourceInstanceKey: source.sourceInstanceKey,
4093
+ sourceInstanceKey: existing?.sourceInstanceKey ?? source.sourceInstanceKey,
3887
4094
  sourceProviderSlug: source.sourceProviderSlug,
3888
- displayName: null,
3889
- status: source.status,
4095
+ displayName: existing?.displayName ?? null,
4096
+ status: keepHistoricalReconnect ? "error" : source.status,
3890
4097
  resourceAvailabilitySummary: source.resourceAvailabilitySummary,
3891
4098
  // Only assert error fields when this projection saw an errored entry;
3892
4099
  // omitting the keys lets the store preserve existing detail while the
3893
4100
  // status stays "error" and auto-clear it once the status recovers.
3894
- ...(source.lastErrorCode !== null || source.lastErrorMessage !== null
3895
- ? { lastErrorCode: source.lastErrorCode, lastErrorMessage: source.lastErrorMessage }
3896
- : {}),
4101
+ ...(historicalReconnectError
4102
+ ? {
4103
+ lastErrorCode: historicalReconnectError.lastErrorCode,
4104
+ lastErrorMessage: historicalReconnectError.lastErrorMessage,
4105
+ }
4106
+ : source.lastErrorCode !== null || source.lastErrorMessage !== null
4107
+ ? { lastErrorCode: source.lastErrorCode, lastErrorMessage: source.lastErrorMessage }
4108
+ : {}),
3897
4109
  lastSeenAt: context.now,
3898
4110
  });
3899
4111
  }
@@ -4099,12 +4311,8 @@ function readPlainObject(value) {
4099
4311
  ? value
4100
4312
  : null;
4101
4313
  }
4102
- function assertValidJunctionClientUserIdSecret(secret) {
4103
- const normalizedSecret = normalizeString(secret);
4104
- if (!normalizedSecret || normalizedSecret.length < 16) {
4105
- throw new TypeError("JUNCTION_CLIENT_USER_ID_SECRET must be at least 16 characters.");
4106
- }
4107
- return normalizedSecret;
4314
+ function readProviderSnapshotDurableDeliveryAccepted(value) {
4315
+ return readPlainObject(value)?.durableDeliveryAccepted === true;
4108
4316
  }
4109
4317
  function base32UrlEncode(input) {
4110
4318
  const alphabet = "abcdefghijklmnopqrstuvwxyz234567";