@murphai/murph 1.3.1 → 1.3.2
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.
- package/CHANGELOG.md +808 -0
- package/config.schema.json +91 -40
- package/dist/bin.js +6 -4
- package/dist/bin.js.map +1 -1
- package/dist/cli-entry.d.ts +8 -1
- package/dist/cli-entry.d.ts.map +1 -1
- package/dist/cli-entry.js +79 -3
- package/dist/cli-entry.js.map +1 -1
- package/dist/commands/audit-command-helpers.d.ts.map +1 -1
- package/dist/commands/audit-command-helpers.js +7 -5
- package/dist/commands/audit-command-helpers.js.map +1 -1
- package/dist/commands/batch.d.ts +5 -5
- package/dist/commands/batch.d.ts.map +1 -1
- package/dist/commands/batch.js +2 -21
- package/dist/commands/batch.js.map +1 -1
- package/dist/commands/commons.d.ts.map +1 -1
- package/dist/commands/commons.js +2 -4
- package/dist/commands/commons.js.map +1 -1
- package/dist/commands/exercise.d.ts.map +1 -1
- package/dist/commands/exercise.js +16 -3
- package/dist/commands/exercise.js.map +1 -1
- package/dist/commands/experiment-progress-card-image.d.ts.map +1 -1
- package/dist/commands/experiment-progress-card-image.js +63 -12
- package/dist/commands/experiment-progress-card-image.js.map +1 -1
- package/dist/commands/experiment.d.ts.map +1 -1
- package/dist/commands/experiment.js +45 -5
- package/dist/commands/experiment.js.map +1 -1
- package/dist/commands/export-intake-read-helpers.d.ts.map +1 -1
- package/dist/commands/export-intake-read-helpers.js +2 -3
- package/dist/commands/export-intake-read-helpers.js.map +1 -1
- package/dist/commands/food.d.ts.map +1 -1
- package/dist/commands/food.js +1 -7
- package/dist/commands/food.js.map +1 -1
- package/dist/commands/habitat.d.ts.map +1 -1
- package/dist/commands/habitat.js +120 -9
- package/dist/commands/habitat.js.map +1 -1
- package/dist/commands/health-blood-test-save.d.ts.map +1 -1
- package/dist/commands/health-blood-test-save.js +42 -8
- package/dist/commands/health-blood-test-save.js.map +1 -1
- package/dist/commands/meal.d.ts.map +1 -1
- package/dist/commands/meal.js +4 -1
- package/dist/commands/meal.js.map +1 -1
- package/dist/commands/measurement.d.ts.map +1 -1
- package/dist/commands/measurement.js +3 -0
- package/dist/commands/measurement.js.map +1 -1
- package/dist/commands/murph-age.d.ts +9 -1
- package/dist/commands/murph-age.d.ts.map +1 -1
- package/dist/commands/murph-age.js +132 -7
- package/dist/commands/murph-age.js.map +1 -1
- package/dist/commands/public-validation-issue.d.ts +7 -0
- package/dist/commands/public-validation-issue.d.ts.map +1 -0
- package/dist/commands/public-validation-issue.js +7 -0
- package/dist/commands/public-validation-issue.js.map +1 -0
- package/dist/commands/scheduled-log.d.ts +12 -0
- package/dist/commands/scheduled-log.d.ts.map +1 -1
- package/dist/commands/scheduled-log.js +456 -106
- package/dist/commands/scheduled-log.js.map +1 -1
- package/dist/commands/wearables.d.ts +286 -0
- package/dist/commands/wearables.d.ts.map +1 -1
- package/dist/commands/wearables.js +33 -1
- package/dist/commands/wearables.js.map +1 -1
- package/dist/commands/workout-live.d.ts.map +1 -1
- package/dist/commands/workout-live.js +123 -42
- package/dist/commands/workout-live.js.map +1 -1
- package/dist/commands/workout-typed-options.d.ts +38 -0
- package/dist/commands/workout-typed-options.d.ts.map +1 -0
- package/dist/commands/workout-typed-options.js +90 -0
- package/dist/commands/workout-typed-options.js.map +1 -0
- package/dist/commands/workout.d.ts.map +1 -1
- package/dist/commands/workout.js +80 -73
- package/dist/commands/workout.js.map +1 -1
- package/dist/hosted-data-api-labels.d.ts.map +1 -1
- package/dist/hosted-data-api-labels.js +161 -30
- package/dist/hosted-data-api-labels.js.map +1 -1
- package/dist/incur-error-bridge.d.ts.map +1 -1
- package/dist/incur-error-bridge.js +7 -15
- package/dist/incur-error-bridge.js.map +1 -1
- package/dist/incur.generated.d.ts +22 -13
- package/dist/incur.generated.d.ts.map +1 -1
- package/dist/mapbox-address.d.ts.map +1 -1
- package/dist/mapbox-address.js +3 -4
- package/dist/mapbox-address.js.map +1 -1
- package/dist/mapbox-route-client.d.ts +2 -2
- package/dist/mapbox-route-client.d.ts.map +1 -1
- package/dist/mapbox-route-client.js +49 -12
- package/dist/mapbox-route-client.js.map +1 -1
- package/dist/mapbox-route-directions.d.ts.map +1 -1
- package/dist/mapbox-route-directions.js +0 -1
- package/dist/mapbox-route-directions.js.map +1 -1
- package/dist/mapbox-route-elevation.js +0 -1
- package/dist/mapbox-route-elevation.js.map +1 -1
- package/dist/mapbox-route-points.js +0 -2
- package/dist/mapbox-route-points.js.map +1 -1
- package/dist/mapbox-route.d.ts.map +1 -1
- package/dist/mapbox-route.js +1 -1
- package/dist/mapbox-route.js.map +1 -1
- package/dist/vault-cli-command-manifest.d.ts +304 -6
- package/dist/vault-cli-command-manifest.d.ts.map +1 -1
- package/dist/vault-cli-skill-hash.generated.d.ts +1 -1
- package/dist/vault-cli-skill-hash.generated.js +1 -1
- package/node_modules/@murphai/assistant-cli/dist/assistant/ui/ink.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-cli/dist/assistant/ui/ink.js +6 -2
- package/node_modules/@murphai/assistant-cli/dist/assistant/ui/ink.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/README.md +4 -3
- package/node_modules/@murphai/assistant-engine/dist/assistant/active-turn-input-controller.d.ts +15 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/active-turn-input-controller.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/active-turn-input-controller.js +121 -24
- package/node_modules/@murphai/assistant-engine/dist/assistant/active-turn-input-controller.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/active-turn-input-journal.js +2 -2
- package/node_modules/@murphai/assistant-engine/dist/assistant/active-turn-input-journal.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/ask-continuation.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/ask-continuation.js +1 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant/ask-continuation.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/automation/reply.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/automation/reply.js +55 -7
- package/node_modules/@murphai/assistant-engine/dist/assistant/automation/reply.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/automation/run-loop.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/automation/run-loop.js +9 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/automation/run-loop.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/automation/shared.d.ts +1 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant/automation/shared.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/automation/shared.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/cli-surface-contract.generated.json +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/codex-base-instructions.d.ts +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/codex-base-instructions.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/codex-base-instructions.js +7 -7
- package/node_modules/@murphai/assistant-engine/dist/assistant/codex-base-instructions.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/codex-turn/planning.d.ts +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/codex-turn/planning.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/codex-turn/planning.js +123 -22
- package/node_modules/@murphai/assistant-engine/dist/assistant/codex-turn/planning.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/codex-turn-runner.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/codex-turn-runner.js +48 -19
- package/node_modules/@murphai/assistant-engine/dist/assistant/codex-turn-runner.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/context-snapshot.js +3 -7
- package/node_modules/@murphai/assistant-engine/dist/assistant/context-snapshot.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/cron/execution.d.ts +5 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant/cron/execution.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/cron/execution.js +24 -10
- package/node_modules/@murphai/assistant-engine/dist/assistant/cron/execution.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/cron/schedule.d.ts +2 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant/cron/schedule.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/cron/schedule.js +12 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant/cron/schedule.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/delivery-service.d.ts +5 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant/delivery-service.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/delivery-service.js +9 -10
- package/node_modules/@murphai/assistant-engine/dist/assistant/delivery-service.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/execution-context.d.ts +41 -9
- package/node_modules/@murphai/assistant-engine/dist/assistant/execution-context.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/execution-context.js +9 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant/execution-context.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/experiment-support-automations.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/experiment-support-automations.js +2 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant/experiment-support-automations.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/hosted-tool-context.d.ts +3 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant/hosted-tool-context.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/hosted-tool-context.js +8 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant/hosted-tool-context.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/issue-reporting.d.ts +3 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant/issue-reporting.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/issue-reporting.js +26 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/issue-reporting.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/local-service.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/local-service.js +687 -370
- package/node_modules/@murphai/assistant-engine/dist/assistant/local-service.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/managed-automations.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/managed-automations.js +54 -18
- package/node_modules/@murphai/assistant-engine/dist/assistant/managed-automations.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/model-behavior.d.ts +2 -3
- package/node_modules/@murphai/assistant-engine/dist/assistant/model-behavior.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/model-behavior.js +10 -9
- package/node_modules/@murphai/assistant-engine/dist/assistant/model-behavior.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/notification-turn.d.ts +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/notification-turn.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/notification-turn.js +146 -18
- package/node_modules/@murphai/assistant-engine/dist/assistant/notification-turn.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/onboarding-followup-seed.d.ts +25 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant/onboarding-followup-seed.d.ts.map +1 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant/onboarding-followup-seed.js +72 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant/onboarding-followup-seed.js.map +1 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant/onboarding-state.d.ts +4 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant/onboarding-state.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/onboarding-state.js +14 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant/onboarding-state.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/outbox/store.d.ts +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/outbox/store.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/outbox/store.js +8 -5
- package/node_modules/@murphai/assistant-engine/dist/assistant/outbox/store.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/outbox.d.ts +4 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant/outbox.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/outbox.js +8 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant/outbox.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/private-completion-continuity.js +1 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant/private-completion-continuity.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/providers/codex-cli.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/providers/codex-cli.js +25 -2
- package/node_modules/@murphai/assistant-engine/dist/assistant/providers/codex-cli.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/providers/helpers.d.ts +11 -3
- package/node_modules/@murphai/assistant-engine/dist/assistant/providers/helpers.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/providers/helpers.js +67 -176
- package/node_modules/@murphai/assistant-engine/dist/assistant/providers/helpers.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/providers/types.d.ts +17 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant/providers/types.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/providers/types.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/reply-delivery-context.d.ts +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/reply-delivery-context.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/reply-delivery-context.js +10 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant/reply-delivery-context.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/runtime-residue.d.ts +19 -4
- package/node_modules/@murphai/assistant-engine/dist/assistant/runtime-residue.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/runtime-residue.js +76 -40
- package/node_modules/@murphai/assistant-engine/dist/assistant/runtime-residue.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/service-contracts.d.ts +3 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/service-contracts.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/service-usage.d.ts +4 -2
- package/node_modules/@murphai/assistant-engine/dist/assistant/service-usage.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/service-usage.js +8 -7
- package/node_modules/@murphai/assistant-engine/dist/assistant/service-usage.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/shared.d.ts +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/shared.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/shared.js +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/shared.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/store/types.d.ts +1 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant/store/types.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/store.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/store.js +6 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant/store.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/system-prompt.d.ts +3 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant/system-prompt.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/system-prompt.js +57 -29
- package/node_modules/@murphai/assistant-engine/dist/assistant/system-prompt.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/tool-validation-digest.d.ts +1 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant/tool-validation-digest.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/tool-validation-digest.js +17 -3
- package/node_modules/@murphai/assistant-engine/dist/assistant/tool-validation-digest.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/tool-validation-feedback.d.ts +4 -7
- package/node_modules/@murphai/assistant-engine/dist/assistant/tool-validation-feedback.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/tool-validation-feedback.js +21 -6
- package/node_modules/@murphai/assistant-engine/dist/assistant/tool-validation-feedback.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/turn-finalizer.d.ts +1 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant/turn-finalizer.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/turn-finalizer.js +6 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant/turn-finalizer.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/turn-input.d.ts +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/turn-input.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/usage-attribution.d.ts +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/usage-attribution.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant/usage-attribution.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-ask.js +8 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant-ask.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-cli-access.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-cli-access.js +1 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant-cli-access.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/analyze-video-tool.d.ts +49 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/analyze-video-tool.d.ts.map +1 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/analyze-video-tool.js +387 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/analyze-video-tool.js.map +1 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/app-server-protocol.d.ts +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/app-server-protocol.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/app-server-protocol.js +12 -13
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/app-server-protocol.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/app-server-requests.d.ts +1 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/app-server-requests.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/app-server-requests.js +16 -5
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/app-server-requests.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/app-server-rpc.d.ts +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/app-server-rpc.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/app-server-rpc.js +2 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/app-server-rpc.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/command-family.d.ts +4 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/command-family.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/command-family.js +26 -13
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/command-family.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tool-catalog.d.ts +1024 -1091
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tool-catalog.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tool-catalog.js +354 -330
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tool-catalog.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/analyze-video.d.ts +50 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/analyze-video.d.ts.map +1 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/analyze-video.js +79 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/analyze-video.js.map +1 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/automation-model-input-schema.d.ts +4 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/automation-model-input-schema.d.ts.map +1 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/automation-model-input-schema.js +153 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/automation-model-input-schema.js.map +1 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/automation.d.ts +4 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/automation.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/automation.js +29 -35
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/automation.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/device.d.ts +4 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/device.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/device.js +43 -9
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/device.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/dynamic-tool-wrapper.d.ts +6 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/dynamic-tool-wrapper.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/dynamic-tool-wrapper.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/member-memory.d.ts +60 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/member-memory.d.ts.map +1 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/member-memory.js +91 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/member-memory.js.map +1 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/physical-notes.d.ts +41 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/physical-notes.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/physical-notes.js +85 -9
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools/physical-notes.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools.d.ts +25 -2
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools.js +280 -89
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/dynamic-tools.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/failures.js +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/response-card-validation-feedback.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/response-card-validation-feedback.js +1 -3
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/response-card-validation-feedback.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/workout-delivery-context.d.ts +19 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/workout-delivery-context.d.ts.map +1 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/workout-delivery-context.js +203 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex/workout-delivery-context.js.map +1 -0
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex.d.ts +9 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex.js +220 -130
- package/node_modules/@murphai/assistant-engine/dist/assistant-codex.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-runtime-residue.d.ts +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-runtime-residue.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-runtime-residue.js +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-runtime-residue.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-skill-assets.d.ts +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-skill-assets.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-skill-assets.js +1 -1
- package/node_modules/@murphai/assistant-engine/dist/assistant-skill-assets.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/index.d.ts +2 -1
- package/node_modules/@murphai/assistant-engine/dist/index.d.ts.map +1 -1
- package/node_modules/@murphai/assistant-engine/dist/index.js +1 -0
- package/node_modules/@murphai/assistant-engine/dist/index.js.map +1 -1
- package/node_modules/@murphai/assistant-engine/skills/automatic-meal-capture/SKILL.md +111 -68
- package/node_modules/@murphai/assistant-engine/skills/behavior-followthrough/SKILL.md +0 -2
- package/node_modules/@murphai/assistant-engine/skills/daily-activity/SKILL.md +11 -4
- package/node_modules/@murphai/assistant-engine/skills/food-journal/SKILL.md +83 -22
- package/node_modules/@murphai/assistant-engine/skills/hosted-low-usage/SKILL.md +3 -3
- package/node_modules/@murphai/assistant-engine/skills/murph-family/SKILL.md +1 -1
- package/node_modules/@murphai/assistant-engine/skills/nutrition-strategy/SKILL.md +17 -11
- package/node_modules/@murphai/assistant-engine/skills/nutrition-strategy/references/daily-nutrition-card-goals.md +62 -34
- package/node_modules/@murphai/assistant-engine/skills/physical-notes/SKILL.md +47 -0
- package/node_modules/@murphai/assistant-engine/skills/shared/exercise-catalog-runtime.md +6 -0
- package/node_modules/@murphai/assistant-engine/skills/signup-link/SKILL.md +1 -1
- package/node_modules/@murphai/assistant-engine/skills/strength-training/SKILL.md +12 -5
- package/node_modules/@murphai/assistant-engine/skills/tracked-table/SKILL.md +156 -66
- package/node_modules/@murphai/core/dist/automation.d.ts.map +1 -1
- package/node_modules/@murphai/core/dist/automation.js +17 -9
- package/node_modules/@murphai/core/dist/automation.js.map +1 -1
- package/node_modules/@murphai/core/dist/bank/habitat.d.ts +2 -0
- package/node_modules/@murphai/core/dist/bank/habitat.d.ts.map +1 -1
- package/node_modules/@murphai/core/dist/bank/habitat.js +27 -0
- package/node_modules/@murphai/core/dist/bank/habitat.js.map +1 -1
- package/node_modules/@murphai/core/dist/bank/regimens.js +1 -1
- package/node_modules/@murphai/core/dist/bank/regimens.js.map +1 -1
- package/node_modules/@murphai/core/dist/domains/events/ledger.d.ts +21 -0
- package/node_modules/@murphai/core/dist/domains/events/ledger.d.ts.map +1 -1
- package/node_modules/@murphai/core/dist/domains/events/ledger.js +102 -8
- package/node_modules/@murphai/core/dist/domains/events/ledger.js.map +1 -1
- package/node_modules/@murphai/core/dist/domains/events.d.ts +2 -2
- package/node_modules/@murphai/core/dist/domains/events.d.ts.map +1 -1
- package/node_modules/@murphai/core/dist/domains/events.js +1 -1
- package/node_modules/@murphai/core/dist/domains/events.js.map +1 -1
- package/node_modules/@murphai/core/dist/history/api.d.ts.map +1 -1
- package/node_modules/@murphai/core/dist/history/api.js +18 -3
- package/node_modules/@murphai/core/dist/history/api.js.map +1 -1
- package/node_modules/@murphai/core/dist/index.d.ts +4 -2
- package/node_modules/@murphai/core/dist/index.d.ts.map +1 -1
- package/node_modules/@murphai/core/dist/index.js +3 -1
- package/node_modules/@murphai/core/dist/index.js.map +1 -1
- package/node_modules/@murphai/core/dist/mutations.d.ts +25 -2
- package/node_modules/@murphai/core/dist/mutations.d.ts.map +1 -1
- package/node_modules/@murphai/core/dist/mutations.js +1588 -78
- package/node_modules/@murphai/core/dist/mutations.js.map +1 -1
- package/node_modules/@murphai/core/dist/operations/index.d.ts +1 -1
- package/node_modules/@murphai/core/dist/operations/index.d.ts.map +1 -1
- package/node_modules/@murphai/core/dist/operations/index.js +1 -1
- package/node_modules/@murphai/core/dist/operations/index.js.map +1 -1
- package/node_modules/@murphai/core/dist/operations/write-batch.d.ts +2 -0
- package/node_modules/@murphai/core/dist/operations/write-batch.d.ts.map +1 -1
- package/node_modules/@murphai/core/dist/operations/write-batch.js +7 -0
- package/node_modules/@murphai/core/dist/operations/write-batch.js.map +1 -1
- package/node_modules/@murphai/core/dist/protocols.d.ts.map +1 -1
- package/node_modules/@murphai/core/dist/protocols.js +52 -9
- package/node_modules/@murphai/core/dist/protocols.js.map +1 -1
- package/node_modules/@murphai/core/dist/public-mutations.d.ts +1 -1
- package/node_modules/@murphai/core/dist/public-mutations.d.ts.map +1 -1
- package/node_modules/@murphai/core/dist/public-mutations.js +2 -2
- package/node_modules/@murphai/core/dist/public-mutations.js.map +1 -1
- package/node_modules/@murphai/core/dist/scheduled-logs.d.ts +3 -0
- package/node_modules/@murphai/core/dist/scheduled-logs.d.ts.map +1 -1
- package/node_modules/@murphai/core/dist/scheduled-logs.js +65 -29
- package/node_modules/@murphai/core/dist/scheduled-logs.js.map +1 -1
- package/node_modules/@murphai/device-syncd/README.md +140 -46
- package/node_modules/@murphai/device-syncd/dist/client.d.ts +14 -0
- package/node_modules/@murphai/device-syncd/dist/client.d.ts.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/client.js.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/config/connect-routes.d.ts +4 -1
- package/node_modules/@murphai/device-syncd/dist/config/connect-routes.d.ts.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/config/connect-routes.js +24 -2
- package/node_modules/@murphai/device-syncd/dist/config/connect-routes.js.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/config/junction-connect-sources.js +2 -2
- package/node_modules/@murphai/device-syncd/dist/config/junction-connect-sources.js.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/config/provider-manifests.d.ts +53 -0
- package/node_modules/@murphai/device-syncd/dist/config/provider-manifests.d.ts.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/config/provider-manifests.js +13 -0
- package/node_modules/@murphai/device-syncd/dist/config/provider-manifests.js.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/connect-config.d.ts +1 -1
- package/node_modules/@murphai/device-syncd/dist/connect-config.d.ts.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/connect-config.js +1 -1
- package/node_modules/@murphai/device-syncd/dist/connect-config.js.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/fitbit-migration.d.ts +57 -0
- package/node_modules/@murphai/device-syncd/dist/fitbit-migration.d.ts.map +1 -0
- package/node_modules/@murphai/device-syncd/dist/fitbit-migration.js +166 -0
- package/node_modules/@murphai/device-syncd/dist/fitbit-migration.js.map +1 -0
- package/node_modules/@murphai/device-syncd/dist/hosted-runtime.d.ts +43 -0
- package/node_modules/@murphai/device-syncd/dist/hosted-runtime.d.ts.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/hosted-runtime.js +129 -5
- package/node_modules/@murphai/device-syncd/dist/hosted-runtime.js.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/junction-historical-backfill-progress.d.ts +3 -0
- package/node_modules/@murphai/device-syncd/dist/junction-historical-backfill-progress.d.ts.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/junction-historical-backfill-progress.js +36 -16
- package/node_modules/@murphai/device-syncd/dist/junction-historical-backfill-progress.js.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/junction-inline-authority.d.ts +17 -2
- package/node_modules/@murphai/device-syncd/dist/junction-inline-authority.d.ts.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/junction-inline-authority.js +99 -40
- package/node_modules/@murphai/device-syncd/dist/junction-inline-authority.js.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/junction-source-reconnect.d.ts +17 -0
- package/node_modules/@murphai/device-syncd/dist/junction-source-reconnect.d.ts.map +1 -0
- package/node_modules/@murphai/device-syncd/dist/junction-source-reconnect.js +45 -0
- package/node_modules/@murphai/device-syncd/dist/junction-source-reconnect.js.map +1 -0
- package/node_modules/@murphai/device-syncd/dist/junction-timeseries-progress.d.ts +8 -1
- package/node_modules/@murphai/device-syncd/dist/junction-timeseries-progress.d.ts.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/junction-timeseries-progress.js +12 -1
- package/node_modules/@murphai/device-syncd/dist/junction-timeseries-progress.js.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/providers/junction-client.d.ts +7 -0
- package/node_modules/@murphai/device-syncd/dist/providers/junction-client.d.ts.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/providers/junction-client.js +285 -46
- package/node_modules/@murphai/device-syncd/dist/providers/junction-client.js.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/providers/junction.d.ts +9 -0
- package/node_modules/@murphai/device-syncd/dist/providers/junction.d.ts.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/providers/junction.js +2045 -367
- package/node_modules/@murphai/device-syncd/dist/providers/junction.js.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/public-account.d.ts +2 -0
- package/node_modules/@murphai/device-syncd/dist/public-account.d.ts.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/public-account.js +96 -0
- package/node_modules/@murphai/device-syncd/dist/public-account.js.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/public-ingress.d.ts.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/public-ingress.js +6 -4
- package/node_modules/@murphai/device-syncd/dist/public-ingress.js.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/service.d.ts +6 -2
- package/node_modules/@murphai/device-syncd/dist/service.d.ts.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/service.js +385 -44
- package/node_modules/@murphai/device-syncd/dist/service.js.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/source-staleness.d.ts +15 -0
- package/node_modules/@murphai/device-syncd/dist/source-staleness.d.ts.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/source-staleness.js +25 -1
- package/node_modules/@murphai/device-syncd/dist/source-staleness.js.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/store/jobs.d.ts +10 -1
- package/node_modules/@murphai/device-syncd/dist/store/jobs.d.ts.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/store/jobs.js +95 -1
- package/node_modules/@murphai/device-syncd/dist/store/jobs.js.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/store/schema.d.ts +1 -1
- package/node_modules/@murphai/device-syncd/dist/store/schema.d.ts.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/store/schema.js +25 -3
- package/node_modules/@murphai/device-syncd/dist/store/schema.js.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/store/sources.d.ts +24 -2
- package/node_modules/@murphai/device-syncd/dist/store/sources.d.ts.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/store/sources.js +223 -14
- package/node_modules/@murphai/device-syncd/dist/store/sources.js.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/store.d.ts +13 -3
- package/node_modules/@murphai/device-syncd/dist/store.d.ts.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/store.js +104 -22
- package/node_modules/@murphai/device-syncd/dist/store.js.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/types.d.ts +96 -9
- package/node_modules/@murphai/device-syncd/dist/types.d.ts.map +1 -1
- package/node_modules/@murphai/device-syncd/dist/types.js +4 -0
- package/node_modules/@murphai/device-syncd/dist/types.js.map +1 -1
- package/node_modules/@murphai/device-syncd/package.json +8 -0
- package/node_modules/@murphai/health-metrics/dist/definitions/activity.d.ts.map +1 -1
- package/node_modules/@murphai/health-metrics/dist/definitions/activity.js +66 -0
- package/node_modules/@murphai/health-metrics/dist/definitions/activity.js.map +1 -1
- package/node_modules/@murphai/health-metrics/dist/definitions/body.js +2 -2
- package/node_modules/@murphai/health-metrics/dist/definitions/body.js.map +1 -1
- package/node_modules/@murphai/health-metrics/dist/normalize.d.ts.map +1 -1
- package/node_modules/@murphai/health-metrics/dist/normalize.js +3 -0
- package/node_modules/@murphai/health-metrics/dist/normalize.js.map +1 -1
- package/node_modules/@murphai/health-metrics/dist/wearable-metric-catalog.d.ts +3 -1
- package/node_modules/@murphai/health-metrics/dist/wearable-metric-catalog.d.ts.map +1 -1
- package/node_modules/@murphai/health-metrics/dist/wearable-metric-catalog.js +5 -1
- package/node_modules/@murphai/health-metrics/dist/wearable-metric-catalog.js.map +1 -1
- package/node_modules/@murphai/health-metrics/dist/wearable-provider-catalog.d.ts +79 -0
- package/node_modules/@murphai/health-metrics/dist/wearable-provider-catalog.d.ts.map +1 -1
- package/node_modules/@murphai/health-metrics/dist/wearable-provider-catalog.js +19 -0
- package/node_modules/@murphai/health-metrics/dist/wearable-provider-catalog.js.map +1 -1
- package/node_modules/@murphai/importers/dist/core-port.d.ts +15 -1
- package/node_modules/@murphai/importers/dist/core-port.d.ts.map +1 -1
- package/node_modules/@murphai/importers/dist/core-port.js.map +1 -1
- package/node_modules/@murphai/importers/dist/create-importers.d.ts +9 -1
- package/node_modules/@murphai/importers/dist/create-importers.d.ts.map +1 -1
- package/node_modules/@murphai/importers/dist/create-importers.js +12 -2
- package/node_modules/@murphai/importers/dist/create-importers.js.map +1 -1
- package/node_modules/@murphai/importers/dist/device-providers/import-device-provider-snapshot.d.ts +17 -3
- package/node_modules/@murphai/importers/dist/device-providers/import-device-provider-snapshot.d.ts.map +1 -1
- package/node_modules/@murphai/importers/dist/device-providers/import-device-provider-snapshot.js +102 -8
- package/node_modules/@murphai/importers/dist/device-providers/import-device-provider-snapshot.js.map +1 -1
- package/node_modules/@murphai/importers/dist/device-providers/index.d.ts +5 -4
- package/node_modules/@murphai/importers/dist/device-providers/index.d.ts.map +1 -1
- package/node_modules/@murphai/importers/dist/device-providers/index.js +4 -3
- package/node_modules/@murphai/importers/dist/device-providers/index.js.map +1 -1
- package/node_modules/@murphai/importers/dist/device-providers/junction-bounded-features.d.ts +11 -1
- package/node_modules/@murphai/importers/dist/device-providers/junction-bounded-features.d.ts.map +1 -1
- package/node_modules/@murphai/importers/dist/device-providers/junction-bounded-features.js +420 -27
- package/node_modules/@murphai/importers/dist/device-providers/junction-bounded-features.js.map +1 -1
- package/node_modules/@murphai/importers/dist/device-providers/junction-origin.d.ts +1 -0
- package/node_modules/@murphai/importers/dist/device-providers/junction-origin.d.ts.map +1 -1
- package/node_modules/@murphai/importers/dist/device-providers/junction-origin.js +7 -2
- package/node_modules/@murphai/importers/dist/device-providers/junction-origin.js.map +1 -1
- package/node_modules/@murphai/importers/dist/device-providers/junction-resources.d.ts +4 -1
- package/node_modules/@murphai/importers/dist/device-providers/junction-resources.d.ts.map +1 -1
- package/node_modules/@murphai/importers/dist/device-providers/junction-resources.js +42 -1
- package/node_modules/@murphai/importers/dist/device-providers/junction-resources.js.map +1 -1
- package/node_modules/@murphai/importers/dist/device-providers/junction-timeseries-features.d.ts +79 -0
- package/node_modules/@murphai/importers/dist/device-providers/junction-timeseries-features.d.ts.map +1 -0
- package/node_modules/@murphai/importers/dist/device-providers/junction-timeseries-features.js +356 -0
- package/node_modules/@murphai/importers/dist/device-providers/junction-timeseries-features.js.map +1 -0
- package/node_modules/@murphai/importers/dist/device-providers/junction.d.ts +76 -3
- package/node_modules/@murphai/importers/dist/device-providers/junction.d.ts.map +1 -1
- package/node_modules/@murphai/importers/dist/device-providers/junction.js +1676 -347
- package/node_modules/@murphai/importers/dist/device-providers/junction.js.map +1 -1
- package/node_modules/@murphai/importers/dist/device-providers/shared-normalization.d.ts.map +1 -1
- package/node_modules/@murphai/importers/dist/device-providers/shared-normalization.js +1 -0
- package/node_modules/@murphai/importers/dist/device-providers/shared-normalization.js.map +1 -1
- package/node_modules/@murphai/importers/dist/device-providers/types.d.ts +9 -1
- package/node_modules/@murphai/importers/dist/device-providers/types.d.ts.map +1 -1
- package/node_modules/@murphai/importers/dist/index.d.ts +2 -2
- package/node_modules/@murphai/importers/dist/index.d.ts.map +1 -1
- package/node_modules/@murphai/importers/dist/index.js +1 -1
- package/node_modules/@murphai/importers/dist/index.js.map +1 -1
- package/node_modules/@murphai/inboxd/README.md +1 -1
- package/node_modules/@murphai/inboxd/dist/indexing/retention.d.ts +6 -0
- package/node_modules/@murphai/inboxd/dist/indexing/retention.d.ts.map +1 -1
- package/node_modules/@murphai/inboxd/dist/indexing/retention.js +64 -18
- package/node_modules/@murphai/inboxd/dist/indexing/retention.js.map +1 -1
- package/node_modules/@murphai/inboxd/dist/retention.d.ts +1 -1
- package/node_modules/@murphai/inboxd/dist/retention.d.ts.map +1 -1
- package/node_modules/@murphai/inboxd/dist/retention.js +1 -1
- package/node_modules/@murphai/inboxd/dist/retention.js.map +1 -1
- package/node_modules/@murphai/operator-config/dist/assistant-cli-contracts.d.ts +1 -0
- package/node_modules/@murphai/operator-config/dist/assistant-cli-contracts.d.ts.map +1 -1
- package/node_modules/@murphai/operator-config/dist/assistant-cli-contracts.js +5 -0
- package/node_modules/@murphai/operator-config/dist/assistant-cli-contracts.js.map +1 -1
- package/node_modules/@murphai/operator-config/dist/assistant-response-cards.d.ts +175 -152
- package/node_modules/@murphai/operator-config/dist/assistant-response-cards.d.ts.map +1 -1
- package/node_modules/@murphai/operator-config/dist/assistant-response-cards.js +62 -41
- package/node_modules/@murphai/operator-config/dist/assistant-response-cards.js.map +1 -1
- package/node_modules/@murphai/operator-config/dist/device-sync-client.d.ts.map +1 -1
- package/node_modules/@murphai/operator-config/dist/device-sync-client.js +1 -5
- package/node_modules/@murphai/operator-config/dist/device-sync-client.js.map +1 -1
- package/node_modules/@murphai/operator-config/dist/vault-cli-contracts.d.ts +66 -0
- package/node_modules/@murphai/operator-config/dist/vault-cli-contracts.d.ts.map +1 -1
- package/node_modules/@murphai/operator-config/dist/vault-cli-contracts.js +58 -0
- package/node_modules/@murphai/operator-config/dist/vault-cli-contracts.js.map +1 -1
- package/node_modules/@murphai/operator-config/dist/vault-cli-error-projection.d.ts +24 -0
- package/node_modules/@murphai/operator-config/dist/vault-cli-error-projection.d.ts.map +1 -0
- package/node_modules/@murphai/operator-config/dist/vault-cli-error-projection.js +219 -0
- package/node_modules/@murphai/operator-config/dist/vault-cli-error-projection.js.map +1 -0
- package/node_modules/@murphai/operator-config/dist/vault-cli-errors.d.ts.map +1 -1
- package/node_modules/@murphai/operator-config/dist/vault-cli-errors.js.map +1 -1
- package/node_modules/@murphai/operator-config/dist/workout-action-binding.d.ts +9 -0
- package/node_modules/@murphai/operator-config/dist/workout-action-binding.d.ts.map +1 -1
- package/node_modules/@murphai/operator-config/dist/workout-action-binding.js +48 -5
- package/node_modules/@murphai/operator-config/dist/workout-action-binding.js.map +1 -1
- package/node_modules/@murphai/operator-config/package.json +5 -0
- package/node_modules/@murphai/query/README.md +20 -5
- package/node_modules/@murphai/query/dist/browser-replica/build.d.ts +1 -1
- package/node_modules/@murphai/query/dist/browser-replica/build.d.ts.map +1 -1
- package/node_modules/@murphai/query/dist/browser-replica/build.js +25 -16
- package/node_modules/@murphai/query/dist/browser-replica/build.js.map +1 -1
- package/node_modules/@murphai/query/dist/browser-replica/json.d.ts +6 -0
- package/node_modules/@murphai/query/dist/browser-replica/json.d.ts.map +1 -0
- package/node_modules/@murphai/query/dist/browser-replica/json.js +103 -0
- package/node_modules/@murphai/query/dist/browser-replica/json.js.map +1 -0
- package/node_modules/@murphai/query/dist/browser-replica/shared.d.ts +1 -0
- package/node_modules/@murphai/query/dist/browser-replica/shared.d.ts.map +1 -1
- package/node_modules/@murphai/query/dist/browser-replica/source.d.ts +13 -0
- package/node_modules/@murphai/query/dist/browser-replica/source.d.ts.map +1 -0
- package/node_modules/@murphai/query/dist/browser-replica/source.js +45 -0
- package/node_modules/@murphai/query/dist/browser-replica/source.js.map +1 -0
- package/node_modules/@murphai/query/dist/browser-replica-server.d.ts +2 -0
- package/node_modules/@murphai/query/dist/browser-replica-server.d.ts.map +1 -1
- package/node_modules/@murphai/query/dist/browser-replica-server.js +2 -0
- package/node_modules/@murphai/query/dist/browser-replica-server.js.map +1 -1
- package/node_modules/@murphai/query/dist/health/blood-tests.d.ts.map +1 -1
- package/node_modules/@murphai/query/dist/health/blood-tests.js +3 -2
- package/node_modules/@murphai/query/dist/health/blood-tests.js.map +1 -1
- package/node_modules/@murphai/query/dist/health/canonical-collector.d.ts +11 -1
- package/node_modules/@murphai/query/dist/health/canonical-collector.d.ts.map +1 -1
- package/node_modules/@murphai/query/dist/health/canonical-collector.js +39 -16
- package/node_modules/@murphai/query/dist/health/canonical-collector.js.map +1 -1
- package/node_modules/@murphai/query/dist/health/entity-slices.d.ts +9 -3
- package/node_modules/@murphai/query/dist/health/entity-slices.d.ts.map +1 -1
- package/node_modules/@murphai/query/dist/health/entity-slices.js +6 -6
- package/node_modules/@murphai/query/dist/health/entity-slices.js.map +1 -1
- package/node_modules/@murphai/query/dist/health/immunizations.d.ts.map +1 -1
- package/node_modules/@murphai/query/dist/health/immunizations.js +14 -11
- package/node_modules/@murphai/query/dist/health/immunizations.js.map +1 -1
- package/node_modules/@murphai/query/dist/health/loaders.d.ts +21 -7
- package/node_modules/@murphai/query/dist/health/loaders.d.ts.map +1 -1
- package/node_modules/@murphai/query/dist/health/loaders.js +53 -15
- package/node_modules/@murphai/query/dist/health/loaders.js.map +1 -1
- package/node_modules/@murphai/query/dist/health/registries.d.ts +1 -0
- package/node_modules/@murphai/query/dist/health/registries.d.ts.map +1 -1
- package/node_modules/@murphai/query/dist/health/registries.js.map +1 -1
- package/node_modules/@murphai/query/dist/index.d.ts +4 -3
- package/node_modules/@murphai/query/dist/index.d.ts.map +1 -1
- package/node_modules/@murphai/query/dist/index.js +4 -3
- package/node_modules/@murphai/query/dist/index.js.map +1 -1
- package/node_modules/@murphai/query/dist/meal-nutrition.d.ts +1 -1
- package/node_modules/@murphai/query/dist/meal-nutrition.d.ts.map +1 -1
- package/node_modules/@murphai/query/dist/meal-nutrition.js +10 -3
- package/node_modules/@murphai/query/dist/meal-nutrition.js.map +1 -1
- package/node_modules/@murphai/query/dist/metrics/projection.d.ts.map +1 -1
- package/node_modules/@murphai/query/dist/metrics/projection.js +19 -6
- package/node_modules/@murphai/query/dist/metrics/projection.js.map +1 -1
- package/node_modules/@murphai/query/dist/murph-age.d.ts +5 -1
- package/node_modules/@murphai/query/dist/murph-age.d.ts.map +1 -1
- package/node_modules/@murphai/query/dist/murph-age.js +22 -8
- package/node_modules/@murphai/query/dist/murph-age.js.map +1 -1
- package/node_modules/@murphai/query/dist/projection/entity-store.js +4 -4
- package/node_modules/@murphai/query/dist/projection/entity-store.js.map +1 -1
- package/node_modules/@murphai/query/dist/projection/schema.d.ts +1 -1
- package/node_modules/@murphai/query/dist/projection/schema.d.ts.map +1 -1
- package/node_modules/@murphai/query/dist/projection/schema.js +3 -1
- package/node_modules/@murphai/query/dist/projection/schema.js.map +1 -1
- package/node_modules/@murphai/query/dist/projection/wearable-summary-compose.js +4 -0
- package/node_modules/@murphai/query/dist/projection/wearable-summary-compose.js.map +1 -1
- package/node_modules/@murphai/query/dist/projection/wearable-summary-projector.js +4 -0
- package/node_modules/@murphai/query/dist/projection/wearable-summary-projector.js.map +1 -1
- package/node_modules/@murphai/query/dist/query-visibility.d.ts +5 -0
- package/node_modules/@murphai/query/dist/query-visibility.d.ts.map +1 -1
- package/node_modules/@murphai/query/dist/query-visibility.js +11 -5
- package/node_modules/@murphai/query/dist/query-visibility.js.map +1 -1
- package/node_modules/@murphai/query/dist/read-model.d.ts +8 -0
- package/node_modules/@murphai/query/dist/read-model.d.ts.map +1 -1
- package/node_modules/@murphai/query/dist/read-model.js +11 -1
- package/node_modules/@murphai/query/dist/read-model.js.map +1 -1
- package/node_modules/@murphai/query/dist/scheduled-logs.d.ts.map +1 -1
- package/node_modules/@murphai/query/dist/scheduled-logs.js +55 -79
- package/node_modules/@murphai/query/dist/scheduled-logs.js.map +1 -1
- package/node_modules/@murphai/query/dist/vault-source.d.ts +22 -4
- package/node_modules/@murphai/query/dist/vault-source.d.ts.map +1 -1
- package/node_modules/@murphai/query/dist/vault-source.js +188 -59
- package/node_modules/@murphai/query/dist/vault-source.js.map +1 -1
- package/node_modules/@murphai/query/dist/wearables/candidates.d.ts.map +1 -1
- package/node_modules/@murphai/query/dist/wearables/candidates.js +26 -15
- package/node_modules/@murphai/query/dist/wearables/candidates.js.map +1 -1
- package/node_modules/@murphai/query/dist/wearables/public-output.d.ts.map +1 -1
- package/node_modules/@murphai/query/dist/wearables/public-output.js +6 -0
- package/node_modules/@murphai/query/dist/wearables/public-output.js.map +1 -1
- package/node_modules/@murphai/query/dist/wearables/source-health.d.ts.map +1 -1
- package/node_modules/@murphai/query/dist/wearables/source-health.js +4 -0
- package/node_modules/@murphai/query/dist/wearables/source-health.js.map +1 -1
- package/node_modules/@murphai/query/dist/wearables/types.d.ts +41 -4
- package/node_modules/@murphai/query/dist/wearables/types.d.ts.map +1 -1
- package/node_modules/@murphai/query/dist/wearables/types.js +2 -0
- package/node_modules/@murphai/query/dist/wearables/types.js.map +1 -1
- package/node_modules/@murphai/query/dist/wearables/workout-features.d.ts +5 -0
- package/node_modules/@murphai/query/dist/wearables/workout-features.d.ts.map +1 -0
- package/node_modules/@murphai/query/dist/wearables/workout-features.js +179 -0
- package/node_modules/@murphai/query/dist/wearables/workout-features.js.map +1 -0
- package/node_modules/@murphai/query/dist/wearables.d.ts.map +1 -1
- package/node_modules/@murphai/query/dist/wearables.js +23 -6
- package/node_modules/@murphai/query/dist/wearables.js.map +1 -1
- package/node_modules/@murphai/query/package.json +5 -0
- package/node_modules/@murphai/runtime-state/README.md +1 -1
- package/node_modules/@murphai/runtime-state/dist/assistant-runtime-issues.d.ts +4 -0
- package/node_modules/@murphai/runtime-state/dist/assistant-runtime-issues.d.ts.map +1 -1
- package/node_modules/@murphai/runtime-state/dist/assistant-runtime-issues.js +16 -3
- package/node_modules/@murphai/runtime-state/dist/assistant-runtime-issues.js.map +1 -1
- package/node_modules/@murphai/runtime-state/dist/hosted-bundles.d.ts +1 -0
- package/node_modules/@murphai/runtime-state/dist/hosted-bundles.d.ts.map +1 -1
- package/node_modules/@murphai/runtime-state/dist/hosted-bundles.js +31 -0
- package/node_modules/@murphai/runtime-state/dist/hosted-bundles.js.map +1 -1
- package/node_modules/@murphai/runtime-state/dist/hosted-email.d.ts +5 -0
- package/node_modules/@murphai/runtime-state/dist/hosted-email.d.ts.map +1 -1
- package/node_modules/@murphai/runtime-state/dist/hosted-email.js +10 -0
- package/node_modules/@murphai/runtime-state/dist/hosted-email.js.map +1 -1
- package/node_modules/@murphai/setup-cli/dist/incur-error-bridge.d.ts.map +1 -1
- package/node_modules/@murphai/setup-cli/dist/incur-error-bridge.js +6 -15
- package/node_modules/@murphai/setup-cli/dist/incur-error-bridge.js.map +1 -1
- package/node_modules/@murphai/vault-usecases/README.md +9 -0
- package/node_modules/@murphai/vault-usecases/dist/commands/query-record-command-helpers.d.ts +6 -0
- package/node_modules/@murphai/vault-usecases/dist/commands/query-record-command-helpers.d.ts.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/commands/query-record-command-helpers.js +49 -1
- package/node_modules/@murphai/vault-usecases/dist/commands/query-record-command-helpers.js.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/capture.d.ts.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/capture.js +22 -12
- package/node_modules/@murphai/vault-usecases/dist/usecases/capture.js.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/clinical-imports.d.ts.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/clinical-imports.js +1 -3
- package/node_modules/@murphai/vault-usecases/dist/usecases/clinical-imports.js.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/document-meal-read.d.ts.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/document-meal-read.js +24 -18
- package/node_modules/@murphai/vault-usecases/dist/usecases/document-meal-read.js.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/encounter.d.ts.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/encounter.js +1 -3
- package/node_modules/@murphai/vault-usecases/dist/usecases/encounter.js.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/event-record-mutations.d.ts +8 -0
- package/node_modules/@murphai/vault-usecases/dist/usecases/event-record-mutations.d.ts.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/event-record-mutations.js +56 -5
- package/node_modules/@murphai/vault-usecases/dist/usecases/event-record-mutations.js.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/exact-event-record.d.ts +20 -0
- package/node_modules/@murphai/vault-usecases/dist/usecases/exact-event-record.d.ts.map +1 -0
- package/node_modules/@murphai/vault-usecases/dist/usecases/exact-event-record.js +72 -0
- package/node_modules/@murphai/vault-usecases/dist/usecases/exact-event-record.js.map +1 -0
- package/node_modules/@murphai/vault-usecases/dist/usecases/experiment-journal-vault.d.ts +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/experiment-journal-vault.d.ts.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/experiment-journal-vault.js +42 -9
- package/node_modules/@murphai/vault-usecases/dist/usecases/experiment-journal-vault.js.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/explicit-health-family-services.d.ts.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/explicit-health-family-services.js +158 -24
- package/node_modules/@murphai/vault-usecases/dist/usecases/explicit-health-family-services.js.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/food.d.ts.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/food.js +98 -5
- package/node_modules/@murphai/vault-usecases/dist/usecases/food.js.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/integrated-services.d.ts.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/integrated-services.js +20 -4
- package/node_modules/@murphai/vault-usecases/dist/usecases/integrated-services.js.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/intervention-experiment-link.d.ts.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/intervention-experiment-link.js +49 -24
- package/node_modules/@murphai/vault-usecases/dist/usecases/intervention-experiment-link.js.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/measurement-read.d.ts.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/measurement-read.js +13 -11
- package/node_modules/@murphai/vault-usecases/dist/usecases/measurement-read.js.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/provider-event.d.ts.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/provider-event.js +18 -11
- package/node_modules/@murphai/vault-usecases/dist/usecases/provider-event.js.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/recipe.d.ts.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/recipe.js +43 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/recipe.js.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/shared.d.ts.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/shared.js +1 -3
- package/node_modules/@murphai/vault-usecases/dist/usecases/shared.js.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/vault-usecase-helpers.d.ts +2 -0
- package/node_modules/@murphai/vault-usecases/dist/usecases/vault-usecase-helpers.d.ts.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/vault-usecase-helpers.js +24 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/vault-usecase-helpers.js.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/workout-format.d.ts +2 -0
- package/node_modules/@murphai/vault-usecases/dist/usecases/workout-format.d.ts.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/workout-live-model.d.ts +36 -4
- package/node_modules/@murphai/vault-usecases/dist/usecases/workout-live-model.d.ts.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/workout-live-model.js +48 -12
- package/node_modules/@murphai/vault-usecases/dist/usecases/workout-live-model.js.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/workout-live-state.d.ts +14 -14
- package/node_modules/@murphai/vault-usecases/dist/usecases/workout-live-state.d.ts.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/workout-live-state.js +84 -82
- package/node_modules/@murphai/vault-usecases/dist/usecases/workout-live-state.js.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/workout-live.d.ts +16 -4
- package/node_modules/@murphai/vault-usecases/dist/usecases/workout-live.d.ts.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/workout-live.js +316 -79
- package/node_modules/@murphai/vault-usecases/dist/usecases/workout-live.js.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/workout-read.d.ts.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/workout-read.js +19 -17
- package/node_modules/@murphai/vault-usecases/dist/usecases/workout-read.js.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/workout.d.ts +20 -7
- package/node_modules/@murphai/vault-usecases/dist/usecases/workout.d.ts.map +1 -1
- package/node_modules/@murphai/vault-usecases/dist/usecases/workout.js +56 -31
- package/node_modules/@murphai/vault-usecases/dist/usecases/workout.js.map +1 -1
- package/node_modules/incur/dist/Cli.js +7 -32
- package/node_modules/incur/dist/Errors.d.ts +17 -0
- package/node_modules/incur/dist/Errors.js +23 -0
- package/node_modules/incur/dist/internal/command.d.ts +2 -0
- package/node_modules/incur/dist/internal/command.js +2 -6
- package/node_modules/incur/src/Cli.ts +11 -32
- package/node_modules/incur/src/Errors.ts +36 -0
- package/node_modules/incur/src/internal/command.ts +4 -6
- package/package.json +4 -4
- package/node_modules/@murphai/assistant-engine/skills/nutrition-strategy/references/daily-nutrition-card-safety.md +0 -211
|
@@ -4,10 +4,11 @@ import { resolveJunctionOrigin } from "./junction-origin.js";
|
|
|
4
4
|
import { stableStringify } from "./raw-ingest-receipt.js";
|
|
5
5
|
import { asPlainObject, finiteNumber, stringId } from "./shared-normalization.js";
|
|
6
6
|
export const JUNCTION_ECG_VOLTAGE_FEATURE_SCHEMA = "junction.ecg_voltage_feature.v1";
|
|
7
|
-
export const JUNCTION_WORKOUT_STREAM_FEATURE_SCHEMA = "junction.workout_stream_feature.
|
|
7
|
+
export const JUNCTION_WORKOUT_STREAM_FEATURE_SCHEMA = "junction.workout_stream_feature.v2";
|
|
8
8
|
const ECG_IDS = ["junctionGroupId", "recordingId", "recording_id"];
|
|
9
9
|
const WORKOUT_IDS = ["workoutId", "workout_id", "id"];
|
|
10
10
|
const MAX_FEATURE_BYTES = 16_384;
|
|
11
|
+
const MAX_WORKOUT_SPLITS = 64;
|
|
11
12
|
const ECG_FIELDS = new Set([
|
|
12
13
|
"schema", "id", "recordingId", "sessionStart", "sessionEnd",
|
|
13
14
|
"durationSeconds", "voltageSampleCount", "voltageUnit", "voltageMin", "voltageMax",
|
|
@@ -17,8 +18,24 @@ const ECG_FIELDS = new Set([
|
|
|
17
18
|
const WORKOUT_FIELDS = new Set([
|
|
18
19
|
"schema", "id", "workoutId", "sport", "startAt", "endAt",
|
|
19
20
|
"durationSeconds", "distanceMeters", "averageHeartRate", "maxHeartRate",
|
|
20
|
-
"
|
|
21
|
+
"firstHalfAverageHeartRate", "secondHalfAverageHeartRate",
|
|
22
|
+
"averageCadence", "maxCadence", "cadenceUnit", "averagePower", "maxPower",
|
|
23
|
+
"averageSpeed", "maxSpeed", "sampleCount", "splits", "version",
|
|
24
|
+
"workoutDayKey",
|
|
25
|
+
"sourceProviderSlug", "sourceType", "sourceInstanceId",
|
|
21
26
|
]);
|
|
27
|
+
const WORKOUT_SPLIT_FIELDS = new Set([
|
|
28
|
+
"index", "distanceMeters", "durationSeconds", "endedAt",
|
|
29
|
+
"averageHeartRate", "averageCadence", "cadenceUnit", "averagePower",
|
|
30
|
+
]);
|
|
31
|
+
export class JunctionWorkoutStreamTimestampCardinalityError extends TypeError {
|
|
32
|
+
diagnostic;
|
|
33
|
+
constructor(diagnostic) {
|
|
34
|
+
super(`Junction workout stream must contain 1-${diagnostic.maxTimestampCount} timestamps.`);
|
|
35
|
+
this.name = "JunctionWorkoutStreamTimestampCardinalityError";
|
|
36
|
+
this.diagnostic = Object.freeze({ ...diagnostic });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
22
39
|
export function reduceJunctionElectrocardiogramVoltageRecords(records, limits) {
|
|
23
40
|
positiveInteger(limits.maxRecordings, "ECG recording limit");
|
|
24
41
|
positiveInteger(limits.maxSamples, "ECG sample limit");
|
|
@@ -75,35 +92,50 @@ export function reduceJunctionWorkoutStreamPayload(input) {
|
|
|
75
92
|
const summary = record(input.summary, "workout summary");
|
|
76
93
|
const stream = record(input.stream, "workout stream");
|
|
77
94
|
const times = array(stream.time, "workout time");
|
|
78
|
-
if (times.length === 0
|
|
79
|
-
|
|
95
|
+
if (times.length === 0) {
|
|
96
|
+
throw new JunctionWorkoutStreamTimestampCardinalityError({
|
|
97
|
+
kind: "empty",
|
|
98
|
+
maxTimestampCount: input.maxSamples,
|
|
99
|
+
timestampCount: 0,
|
|
100
|
+
});
|
|
80
101
|
}
|
|
81
|
-
|
|
102
|
+
if (times.length > input.maxSamples) {
|
|
103
|
+
throw new JunctionWorkoutStreamTimestampCardinalityError({
|
|
104
|
+
kind: "over_limit",
|
|
105
|
+
maxTimestampCount: input.maxSamples,
|
|
106
|
+
timestampCount: times.length,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
const heartRateSeries = parallelArray(stream.heartrate ?? stream.heart_rate, times.length, "heartrate");
|
|
82
110
|
const distanceSeries = parallelArray(stream.distance, times.length, "distance");
|
|
83
|
-
|
|
111
|
+
const cadenceSeries = parallelArray(stream.cadence, times.length, "cadence");
|
|
112
|
+
const powerSeries = parallelArray(stream.power, times.length, "power");
|
|
113
|
+
const speedSeries = parallelArray(stream.velocity_smooth, times.length, "velocity_smooth");
|
|
114
|
+
if (heartRateSeries.cardinalityMismatch
|
|
115
|
+
|| distanceSeries.cardinalityMismatch
|
|
116
|
+
|| cadenceSeries.cardinalityMismatch
|
|
117
|
+
|| powerSeries.cardinalityMismatch
|
|
118
|
+
|| speedSeries.cardinalityMismatch) {
|
|
84
119
|
return undefined;
|
|
85
120
|
}
|
|
86
121
|
const heartRates = heartRateSeries.values;
|
|
87
122
|
const distances = distanceSeries.values;
|
|
88
|
-
|
|
123
|
+
const cadence = cadenceSeries.values;
|
|
124
|
+
const power = powerSeries.values;
|
|
125
|
+
const speeds = speedSeries.values;
|
|
126
|
+
const sport = firstString(summary, ["sport.slug", "sportSlug", "sport_slug", "sport.name", "sport"]);
|
|
127
|
+
const cadenceUnit = resolveWorkoutCadenceUnit(sport);
|
|
128
|
+
if (!heartRates && !distances && !(cadence && cadenceUnit) && !power && !speeds) {
|
|
89
129
|
invalid("workout stream had no supported metrics");
|
|
90
|
-
|
|
130
|
+
}
|
|
131
|
+
const points = [];
|
|
91
132
|
let lastMs = Number.NEGATIVE_INFINITY;
|
|
92
|
-
let
|
|
93
|
-
let average = 0;
|
|
94
|
-
let heartRateCount = 0;
|
|
133
|
+
let lastDistance = Number.NEGATIVE_INFINITY;
|
|
95
134
|
let distanceMeters;
|
|
96
135
|
for (let index = 0; index < times.length; index += 1) {
|
|
97
136
|
const at = timestampMs(times[index]);
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
const heartRate = optionalNumber(heartRates?.[index], "heart rate");
|
|
101
|
-
if (heartRate !== undefined) {
|
|
102
|
-
if (heartRate < 20 || heartRate > 300)
|
|
103
|
-
invalid("heart rate was invalid");
|
|
104
|
-
heartRateCount += 1;
|
|
105
|
-
maximum = Math.max(maximum, heartRate);
|
|
106
|
-
average += (heartRate - average) / heartRateCount;
|
|
137
|
+
if (at < lastMs) {
|
|
138
|
+
invalid("workout timestamps were not monotonic");
|
|
107
139
|
}
|
|
108
140
|
const distance = optionalNumber(distances?.[index], "distance");
|
|
109
141
|
if (distance !== undefined) {
|
|
@@ -111,31 +143,68 @@ export function reduceJunctionWorkoutStreamPayload(input) {
|
|
|
111
143
|
invalid("workout distance was negative");
|
|
112
144
|
distanceMeters = Math.max(distanceMeters ?? 0, distance);
|
|
113
145
|
}
|
|
146
|
+
const pointDistance = distance !== undefined && distance >= lastDistance
|
|
147
|
+
? distance
|
|
148
|
+
: undefined;
|
|
149
|
+
if (pointDistance !== undefined) {
|
|
150
|
+
lastDistance = pointDistance;
|
|
151
|
+
}
|
|
152
|
+
points.push(stripUndefined({
|
|
153
|
+
distanceMeters: pointDistance,
|
|
154
|
+
index,
|
|
155
|
+
timeMs: at,
|
|
156
|
+
}));
|
|
157
|
+
lastMs = at;
|
|
158
|
+
}
|
|
159
|
+
const firstMs = points[0]?.timeMs;
|
|
160
|
+
const finalMs = points.at(-1)?.timeMs;
|
|
161
|
+
if (firstMs === undefined || finalMs === undefined) {
|
|
162
|
+
invalid("workout stream was empty");
|
|
114
163
|
}
|
|
164
|
+
const heartRateStats = workoutSeriesStats(heartRates, points, "heart rate", 20, 300, true);
|
|
115
165
|
const workoutId = consistentId(summary, WORKOUT_IDS, "workout summary");
|
|
116
166
|
const origin = resolveJunctionOrigin(summary);
|
|
117
167
|
if (!workoutId || !origin.sourceProviderSlug) {
|
|
118
168
|
invalid("workout summary lacked identity");
|
|
119
169
|
}
|
|
170
|
+
const cadenceStats = cadenceUnit
|
|
171
|
+
? workoutSeriesStats(cadence, points, "cadence", 0, 400)
|
|
172
|
+
: undefined;
|
|
173
|
+
const powerStats = workoutSeriesStats(power, points, "power", 0, 5_000);
|
|
174
|
+
const speedStats = workoutSeriesStats(speeds, points, "speed", 0, 150);
|
|
175
|
+
const startAtRaw = firstString(summary, ["time_start", "timeStart", "startAt", "start_at", "start"]);
|
|
120
176
|
const startAt = firstTimestamp(summary, ["time_start", "timeStart", "startAt", "start_at", "start"])
|
|
121
177
|
?? new Date(firstMs).toISOString();
|
|
122
178
|
const endAt = firstTimestamp(summary, ["time_end", "timeEnd", "endAt", "end_at", "end"])
|
|
123
|
-
?? new Date(
|
|
179
|
+
?? new Date(finalMs).toISOString();
|
|
124
180
|
const durationSeconds = (Date.parse(endAt) - Date.parse(startAt)) / 1_000;
|
|
125
181
|
if (durationSeconds < 0)
|
|
126
182
|
invalid("workout duration was invalid");
|
|
183
|
+
const splits = buildWorkoutSplits(stream, points, sport);
|
|
127
184
|
const feature = stripUndefined({
|
|
128
185
|
schema: JUNCTION_WORKOUT_STREAM_FEATURE_SCHEMA,
|
|
129
186
|
id: workoutId,
|
|
130
187
|
workoutId,
|
|
131
|
-
sport
|
|
188
|
+
sport,
|
|
132
189
|
startAt,
|
|
133
190
|
endAt,
|
|
134
191
|
durationSeconds: round(durationSeconds),
|
|
135
192
|
distanceMeters: distanceMeters === undefined ? undefined : round(distanceMeters),
|
|
136
|
-
averageHeartRate:
|
|
137
|
-
maxHeartRate:
|
|
193
|
+
averageHeartRate: heartRateStats?.average,
|
|
194
|
+
maxHeartRate: heartRateStats?.maximum,
|
|
195
|
+
firstHalfAverageHeartRate: heartRateStats?.firstHalfAverage,
|
|
196
|
+
secondHalfAverageHeartRate: heartRateStats?.secondHalfAverage,
|
|
197
|
+
averageCadence: cadenceStats?.average,
|
|
198
|
+
maxCadence: cadenceStats?.maximum,
|
|
199
|
+
cadenceUnit: cadenceStats ? cadenceUnit : undefined,
|
|
200
|
+
averagePower: powerStats?.average,
|
|
201
|
+
maxPower: powerStats?.maximum,
|
|
202
|
+
averageSpeed: speedStats?.average,
|
|
203
|
+
maxSpeed: speedStats?.maximum,
|
|
138
204
|
sampleCount: times.length,
|
|
205
|
+
splits,
|
|
206
|
+
version: firstTimestamp(summary, ["updated_at", "updatedAt"]) ?? endAt,
|
|
207
|
+
workoutDayKey: resolveWorkoutDayKey(summary, startAtRaw, startAt),
|
|
139
208
|
sourceProviderSlug: origin.sourceProviderSlug,
|
|
140
209
|
sourceType: origin.sourceType,
|
|
141
210
|
sourceInstanceId: origin.sourceInstanceId ?? undefined,
|
|
@@ -143,6 +212,256 @@ export function reduceJunctionWorkoutStreamPayload(input) {
|
|
|
143
212
|
assertFeature("workout_stream", feature);
|
|
144
213
|
return feature;
|
|
145
214
|
}
|
|
215
|
+
function workoutSeriesStats(values, points, label, minimum, maximum, includeHalves = false) {
|
|
216
|
+
if (!values || points.length === 0) {
|
|
217
|
+
return undefined;
|
|
218
|
+
}
|
|
219
|
+
const midpoint = (points[0]?.timeMs ?? 0)
|
|
220
|
+
+ ((points.at(-1)?.timeMs ?? 0) - (points[0]?.timeMs ?? 0)) / 2;
|
|
221
|
+
let average = 0;
|
|
222
|
+
let count = 0;
|
|
223
|
+
let highest = Number.NEGATIVE_INFINITY;
|
|
224
|
+
let firstHalfAverage = 0;
|
|
225
|
+
let firstHalfCount = 0;
|
|
226
|
+
let secondHalfAverage = 0;
|
|
227
|
+
let secondHalfCount = 0;
|
|
228
|
+
for (const point of points) {
|
|
229
|
+
const value = optionalNumber(values[point.index], label);
|
|
230
|
+
if (value === undefined) {
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
if (value < minimum || value > maximum) {
|
|
234
|
+
invalid(`${label} was invalid`);
|
|
235
|
+
}
|
|
236
|
+
count += 1;
|
|
237
|
+
average += (value - average) / count;
|
|
238
|
+
highest = Math.max(highest, value);
|
|
239
|
+
if (includeHalves && point.timeMs < midpoint) {
|
|
240
|
+
firstHalfCount += 1;
|
|
241
|
+
firstHalfAverage += (value - firstHalfAverage) / firstHalfCount;
|
|
242
|
+
}
|
|
243
|
+
else if (includeHalves) {
|
|
244
|
+
secondHalfCount += 1;
|
|
245
|
+
secondHalfAverage += (value - secondHalfAverage) / secondHalfCount;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return count === 0
|
|
249
|
+
? undefined
|
|
250
|
+
: stripUndefined({
|
|
251
|
+
average: round(average),
|
|
252
|
+
firstHalfAverage: firstHalfCount > 0 ? round(firstHalfAverage) : undefined,
|
|
253
|
+
maximum: round(highest),
|
|
254
|
+
secondHalfAverage: secondHalfCount > 0 ? round(secondHalfAverage) : undefined,
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
function buildWorkoutSplits(stream, points, sport) {
|
|
258
|
+
const distancePoints = points.filter((point) => point.distanceMeters !== undefined);
|
|
259
|
+
const firstPoint = distancePoints[0];
|
|
260
|
+
const lastPoint = distancePoints.at(-1);
|
|
261
|
+
if (!firstPoint || !lastPoint || distancePoints.length < 2) {
|
|
262
|
+
return [];
|
|
263
|
+
}
|
|
264
|
+
const splitDistanceMeters = sport?.toLowerCase().includes("swim") ? 100 : 1_000;
|
|
265
|
+
const firstBoundaryIndex = Math.ceil(firstPoint.distanceMeters / splitDistanceMeters);
|
|
266
|
+
const firstSplitIndex = firstBoundaryIndex + 1;
|
|
267
|
+
const lastSplitIndex = Math.floor(lastPoint.distanceMeters / splitDistanceMeters);
|
|
268
|
+
if (firstSplitIndex > lastSplitIndex) {
|
|
269
|
+
return [];
|
|
270
|
+
}
|
|
271
|
+
const firstBoundary = findWorkoutSplitBoundary(distancePoints, firstBoundaryIndex * splitDistanceMeters, 1);
|
|
272
|
+
if (!firstBoundary) {
|
|
273
|
+
return [];
|
|
274
|
+
}
|
|
275
|
+
const heartRates = parallelArray(stream.heartrate ?? stream.heart_rate, points.length, "heartrate").values;
|
|
276
|
+
const cadence = parallelArray(stream.cadence, points.length, "cadence").values;
|
|
277
|
+
const power = parallelArray(stream.power, points.length, "power").values;
|
|
278
|
+
const cadenceUnit = resolveWorkoutCadenceUnit(sport);
|
|
279
|
+
const splits = [];
|
|
280
|
+
let previousBoundaryTimeMs = firstBoundary.timeMs;
|
|
281
|
+
let searchIndex = firstBoundary.searchIndex;
|
|
282
|
+
for (let splitIndex = firstSplitIndex; splitIndex <= lastSplitIndex && splits.length < MAX_WORKOUT_SPLITS; splitIndex += 1) {
|
|
283
|
+
const boundary = findWorkoutSplitBoundary(distancePoints, splitIndex * splitDistanceMeters, searchIndex);
|
|
284
|
+
if (!boundary) {
|
|
285
|
+
break;
|
|
286
|
+
}
|
|
287
|
+
const durationSeconds = (boundary.timeMs - previousBoundaryTimeMs) / 1_000;
|
|
288
|
+
if (durationSeconds > 0) {
|
|
289
|
+
const averageCadence = cadenceUnit
|
|
290
|
+
? workoutSeriesWindowAverage(cadence, points, previousBoundaryTimeMs, boundary.timeMs, splits.length === 0, "cadence", 0, 400)
|
|
291
|
+
: undefined;
|
|
292
|
+
splits.push(stripUndefined({
|
|
293
|
+
index: splitIndex,
|
|
294
|
+
distanceMeters: splitDistanceMeters,
|
|
295
|
+
durationSeconds: round(durationSeconds),
|
|
296
|
+
endedAt: new Date(boundary.timeMs).toISOString(),
|
|
297
|
+
averageHeartRate: workoutSeriesWindowAverage(heartRates, points, previousBoundaryTimeMs, boundary.timeMs, splits.length === 0, "heart rate", 20, 300),
|
|
298
|
+
averageCadence,
|
|
299
|
+
cadenceUnit: averageCadence === undefined ? undefined : cadenceUnit,
|
|
300
|
+
averagePower: workoutSeriesWindowAverage(power, points, previousBoundaryTimeMs, boundary.timeMs, splits.length === 0, "power", 0, 5_000),
|
|
301
|
+
}));
|
|
302
|
+
}
|
|
303
|
+
previousBoundaryTimeMs = boundary.timeMs;
|
|
304
|
+
searchIndex = boundary.searchIndex;
|
|
305
|
+
}
|
|
306
|
+
return splits;
|
|
307
|
+
}
|
|
308
|
+
function workoutSeriesWindowAverage(values, points, startTimeMs, endTimeMs, includeStart, label, minimum, maximum) {
|
|
309
|
+
if (!values) {
|
|
310
|
+
return undefined;
|
|
311
|
+
}
|
|
312
|
+
let average = 0;
|
|
313
|
+
let count = 0;
|
|
314
|
+
for (const point of points) {
|
|
315
|
+
if ((includeStart ? point.timeMs < startTimeMs : point.timeMs <= startTimeMs)
|
|
316
|
+
|| point.timeMs > endTimeMs) {
|
|
317
|
+
continue;
|
|
318
|
+
}
|
|
319
|
+
const value = optionalNumber(values[point.index], label);
|
|
320
|
+
if (value === undefined) {
|
|
321
|
+
continue;
|
|
322
|
+
}
|
|
323
|
+
if (value < minimum || value > maximum) {
|
|
324
|
+
invalid(`${label} was invalid`);
|
|
325
|
+
}
|
|
326
|
+
count += 1;
|
|
327
|
+
average += (value - average) / count;
|
|
328
|
+
}
|
|
329
|
+
return count > 0 ? round(average) : undefined;
|
|
330
|
+
}
|
|
331
|
+
function findWorkoutSplitBoundary(points, targetDistance, initialSearchIndex) {
|
|
332
|
+
let searchIndex = Math.max(1, initialSearchIndex);
|
|
333
|
+
while (searchIndex < points.length
|
|
334
|
+
&& (points[searchIndex]?.distanceMeters ?? Number.NEGATIVE_INFINITY) < targetDistance) {
|
|
335
|
+
searchIndex += 1;
|
|
336
|
+
}
|
|
337
|
+
const upper = points[searchIndex];
|
|
338
|
+
const lower = points[Math.max(0, searchIndex - 1)];
|
|
339
|
+
if (!lower
|
|
340
|
+
|| !upper
|
|
341
|
+
|| upper.distanceMeters < targetDistance
|
|
342
|
+
|| lower.distanceMeters > targetDistance) {
|
|
343
|
+
return undefined;
|
|
344
|
+
}
|
|
345
|
+
if (lower.distanceMeters === targetDistance) {
|
|
346
|
+
return { searchIndex, timeMs: lower.timeMs };
|
|
347
|
+
}
|
|
348
|
+
const distanceSpan = upper.distanceMeters - lower.distanceMeters;
|
|
349
|
+
const timeMs = distanceSpan <= 0
|
|
350
|
+
? upper.timeMs
|
|
351
|
+
: lower.timeMs + (upper.timeMs - lower.timeMs)
|
|
352
|
+
* Math.max(0, Math.min(1, (targetDistance - lower.distanceMeters) / distanceSpan));
|
|
353
|
+
return { searchIndex, timeMs };
|
|
354
|
+
}
|
|
355
|
+
function resolveWorkoutCadenceUnit(sport) {
|
|
356
|
+
const normalized = sport?.trim().toLowerCase().replace(/[^a-z0-9]+/gu, "-");
|
|
357
|
+
if (!normalized) {
|
|
358
|
+
return undefined;
|
|
359
|
+
}
|
|
360
|
+
if (/(?:^|-)(?:hike|hiking|run|running|walk|walking)(?:-|$)/u.test(normalized)) {
|
|
361
|
+
return "steps-per-minute";
|
|
362
|
+
}
|
|
363
|
+
return /(?:^|-)(?:bike|biking|cycle|cycling|ride|riding|spin|spinning)(?:-|$)/u
|
|
364
|
+
.test(normalized)
|
|
365
|
+
? "rpm"
|
|
366
|
+
: undefined;
|
|
367
|
+
}
|
|
368
|
+
const WORKOUT_LOCAL_DATE_PATHS = [
|
|
369
|
+
"calendarDate",
|
|
370
|
+
"calendar_date",
|
|
371
|
+
"localDate",
|
|
372
|
+
"local_date",
|
|
373
|
+
];
|
|
374
|
+
const WORKOUT_OFFSET_MINUTE_PATHS = [
|
|
375
|
+
"timeZoneOffsetMinutes",
|
|
376
|
+
"time_zone_offset_minutes",
|
|
377
|
+
"timezoneOffsetMinutes",
|
|
378
|
+
"timezone_offset_minutes",
|
|
379
|
+
"utcOffsetMinutes",
|
|
380
|
+
"utc_offset_minutes",
|
|
381
|
+
];
|
|
382
|
+
const WORKOUT_OFFSET_SECOND_PATHS = [
|
|
383
|
+
"timezone_offset",
|
|
384
|
+
"timezoneOffset",
|
|
385
|
+
"timeZoneOffset",
|
|
386
|
+
"time_zone_offset",
|
|
387
|
+
"timezoneOffsetSeconds",
|
|
388
|
+
"timezone_offset_seconds",
|
|
389
|
+
"timeZoneOffsetSeconds",
|
|
390
|
+
"time_zone_offset_seconds",
|
|
391
|
+
"utcOffsetSeconds",
|
|
392
|
+
"utc_offset_seconds",
|
|
393
|
+
];
|
|
394
|
+
function resolveWorkoutDayKey(summary, startAtRaw, startAt) {
|
|
395
|
+
for (const path of WORKOUT_LOCAL_DATE_PATHS) {
|
|
396
|
+
const dayKey = strictDayKey(firstString(summary, [path]));
|
|
397
|
+
if (dayKey) {
|
|
398
|
+
return dayKey;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
if (!startAtRaw) {
|
|
402
|
+
return undefined;
|
|
403
|
+
}
|
|
404
|
+
const explicitSemantics = firstString(summary, [
|
|
405
|
+
"timestampSemantics",
|
|
406
|
+
"timestamp_semantics",
|
|
407
|
+
]);
|
|
408
|
+
const semantics = explicitSemantics === "utc"
|
|
409
|
+
|| explicitSemantics === "offset"
|
|
410
|
+
|| explicitSemantics === "floating"
|
|
411
|
+
|| explicitSemantics === "unknown"
|
|
412
|
+
? explicitSemantics
|
|
413
|
+
: /z$/iu.test(startAtRaw)
|
|
414
|
+
? "utc"
|
|
415
|
+
: /[+-]\d{2}:?\d{2}$/u.test(startAtRaw)
|
|
416
|
+
? "offset"
|
|
417
|
+
: /^\d{4}-\d{2}-\d{2}(?:$|[ t]\d{2}:\d{2})/iu.test(startAtRaw)
|
|
418
|
+
? "floating"
|
|
419
|
+
: "unknown";
|
|
420
|
+
if (semantics === "offset" || semantics === "floating") {
|
|
421
|
+
return strictDayKey(startAtRaw);
|
|
422
|
+
}
|
|
423
|
+
const offsetSeconds = firstWorkoutOffset(summary, WORKOUT_OFFSET_MINUTE_PATHS, 60)
|
|
424
|
+
?? firstWorkoutOffset(summary, WORKOUT_OFFSET_SECOND_PATHS, 1);
|
|
425
|
+
if (offsetSeconds === undefined || Math.abs(offsetSeconds) > 24 * 60 * 60) {
|
|
426
|
+
return undefined;
|
|
427
|
+
}
|
|
428
|
+
const startMs = Date.parse(startAt);
|
|
429
|
+
return Number.isFinite(startMs)
|
|
430
|
+
? new Date(startMs + offsetSeconds * 1_000).toISOString().slice(0, 10)
|
|
431
|
+
: undefined;
|
|
432
|
+
}
|
|
433
|
+
function firstWorkoutOffset(summary, paths, numericMultiplier) {
|
|
434
|
+
for (const path of paths) {
|
|
435
|
+
const value = readPath(summary, path);
|
|
436
|
+
const numeric = finiteNumber(value);
|
|
437
|
+
if (numeric !== undefined) {
|
|
438
|
+
return numeric * numericMultiplier;
|
|
439
|
+
}
|
|
440
|
+
if (typeof value !== "string") {
|
|
441
|
+
continue;
|
|
442
|
+
}
|
|
443
|
+
const match = /^([+-])(\d{2}):?(\d{2})$/u.exec(value.trim());
|
|
444
|
+
if (!match) {
|
|
445
|
+
continue;
|
|
446
|
+
}
|
|
447
|
+
const hours = Number(match[2]);
|
|
448
|
+
const minutes = Number(match[3]);
|
|
449
|
+
if (hours <= 24 && minutes <= 59) {
|
|
450
|
+
return (match[1] === "-" ? -1 : 1) * (hours * 60 + minutes) * 60;
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
return undefined;
|
|
454
|
+
}
|
|
455
|
+
function strictDayKey(value) {
|
|
456
|
+
const dayKey = /^\d{4}-\d{2}-\d{2}/u.exec(value ?? "")?.[0];
|
|
457
|
+
if (!dayKey) {
|
|
458
|
+
return undefined;
|
|
459
|
+
}
|
|
460
|
+
const parsed = new Date(`${dayKey}T00:00:00.000Z`);
|
|
461
|
+
return Number.isFinite(parsed.getTime()) && parsed.toISOString().startsWith(dayKey)
|
|
462
|
+
? dayKey
|
|
463
|
+
: undefined;
|
|
464
|
+
}
|
|
146
465
|
export function resolveJunctionBoundedFeatureRecords(resource, records) {
|
|
147
466
|
const selected = new Map();
|
|
148
467
|
const policy = resolveJunctionTimeseriesResourcePolicy(resource);
|
|
@@ -262,19 +581,34 @@ function assertFeature(resource, feature) {
|
|
|
262
581
|
const count = finiteNumber(feature[ecg ? "voltageSampleCount" : "sampleCount"]);
|
|
263
582
|
const numericFields = ecg
|
|
264
583
|
? ["durationSeconds", "voltageMin", "voltageMax", "voltageMean", "voltageRms", "leadCount"]
|
|
265
|
-
: [
|
|
584
|
+
: [
|
|
585
|
+
"durationSeconds", "distanceMeters", "averageHeartRate", "maxHeartRate",
|
|
586
|
+
"firstHalfAverageHeartRate", "secondHalfAverageHeartRate",
|
|
587
|
+
"averageCadence", "maxCadence", "averagePower", "maxPower",
|
|
588
|
+
"averageSpeed", "maxSpeed",
|
|
589
|
+
];
|
|
266
590
|
const invalidNumber = numericFields.some((key) => {
|
|
267
591
|
const value = feature[key];
|
|
268
592
|
return (ecg || key === "durationSeconds" || value !== undefined)
|
|
269
593
|
&& finiteNumber(value) === undefined;
|
|
270
594
|
});
|
|
271
|
-
const
|
|
595
|
+
const boundedShape = Object.entries(feature).every(([key, value]) => key === "splits"
|
|
596
|
+
? !ecg && Array.isArray(value)
|
|
597
|
+
: typeof value === "string" || typeof value === "number");
|
|
272
598
|
const policy = resolveJunctionTimeseriesResourcePolicy(resource);
|
|
273
599
|
const countLimit = ecg ? policy?.maxSamplesPerWindow : policy?.maxSamplesPerRecord;
|
|
274
600
|
const duration = finiteNumber(feature.durationSeconds);
|
|
275
601
|
const distance = finiteNumber(feature.distanceMeters);
|
|
276
602
|
const averageHeartRate = finiteNumber(feature.averageHeartRate);
|
|
277
603
|
const maxHeartRate = finiteNumber(feature.maxHeartRate);
|
|
604
|
+
const firstHalfAverageHeartRate = finiteNumber(feature.firstHalfAverageHeartRate);
|
|
605
|
+
const secondHalfAverageHeartRate = finiteNumber(feature.secondHalfAverageHeartRate);
|
|
606
|
+
const averageCadence = finiteNumber(feature.averageCadence);
|
|
607
|
+
const maxCadence = finiteNumber(feature.maxCadence);
|
|
608
|
+
const averagePower = finiteNumber(feature.averagePower);
|
|
609
|
+
const maxPower = finiteNumber(feature.maxPower);
|
|
610
|
+
const averageSpeed = finiteNumber(feature.averageSpeed);
|
|
611
|
+
const maxSpeed = finiteNumber(feature.maxSpeed);
|
|
278
612
|
const voltageMin = finiteNumber(feature.voltageMin);
|
|
279
613
|
const voltageMax = finiteNumber(feature.voltageMax);
|
|
280
614
|
const voltageMean = finiteNumber(feature.voltageMean);
|
|
@@ -282,7 +616,7 @@ function assertFeature(resource, feature) {
|
|
|
282
616
|
const leadCount = finiteNumber(feature.leadCount);
|
|
283
617
|
if (feature.schema !== schema
|
|
284
618
|
|| Object.keys(feature).some((key) => !fields.has(key))
|
|
285
|
-
|| !
|
|
619
|
+
|| !boundedShape
|
|
286
620
|
|| Buffer.byteLength(JSON.stringify(feature), "utf8") > MAX_FEATURE_BYTES
|
|
287
621
|
|| !resolveJunctionOrigin(feature).sourceProviderSlug
|
|
288
622
|
|| !start
|
|
@@ -300,6 +634,19 @@ function assertFeature(resource, feature) {
|
|
|
300
634
|
|| (!ecg && averageHeartRate !== undefined && (averageHeartRate < 20 || averageHeartRate > 300))
|
|
301
635
|
|| (!ecg && maxHeartRate !== undefined && (maxHeartRate < 20 || maxHeartRate > 300))
|
|
302
636
|
|| (!ecg && averageHeartRate !== undefined && maxHeartRate !== undefined && averageHeartRate > maxHeartRate)
|
|
637
|
+
|| (!ecg && firstHalfAverageHeartRate !== undefined && (firstHalfAverageHeartRate < 20 || firstHalfAverageHeartRate > 300))
|
|
638
|
+
|| (!ecg && secondHalfAverageHeartRate !== undefined && (secondHalfAverageHeartRate < 20 || secondHalfAverageHeartRate > 300))
|
|
639
|
+
|| (!ecg && averageCadence !== undefined && (averageCadence < 0 || averageCadence > 400))
|
|
640
|
+
|| (!ecg && maxCadence !== undefined && (maxCadence < 0 || maxCadence > 400))
|
|
641
|
+
|| (!ecg && averageCadence !== undefined && maxCadence !== undefined && averageCadence > maxCadence)
|
|
642
|
+
|| (!ecg && averagePower !== undefined && (averagePower < 0 || averagePower > 5_000))
|
|
643
|
+
|| (!ecg && maxPower !== undefined && (maxPower < 0 || maxPower > 5_000))
|
|
644
|
+
|| (!ecg && averagePower !== undefined && maxPower !== undefined && averagePower > maxPower)
|
|
645
|
+
|| (!ecg && averageSpeed !== undefined && (averageSpeed < 0 || averageSpeed > 150))
|
|
646
|
+
|| (!ecg && maxSpeed !== undefined && (maxSpeed < 0 || maxSpeed > 150))
|
|
647
|
+
|| (!ecg && averageSpeed !== undefined && maxSpeed !== undefined && averageSpeed > maxSpeed)
|
|
648
|
+
|| (!ecg && feature.workoutDayKey !== undefined && strictDayKey(firstString(feature, ["workoutDayKey"])) !== feature.workoutDayKey)
|
|
649
|
+
|| (!ecg && !firstTimestamp(feature, ["version"]))
|
|
303
650
|
|| (ecg && (voltageMin === undefined || voltageMax === undefined || voltageMean === undefined || voltageRms === undefined))
|
|
304
651
|
|| (ecg && voltageMin !== undefined && voltageMax !== undefined && voltageMin > voltageMax)
|
|
305
652
|
|| (ecg && voltageMean !== undefined && voltageMin !== undefined && voltageMean < voltageMin)
|
|
@@ -308,8 +655,54 @@ function assertFeature(resource, feature) {
|
|
|
308
655
|
|| (ecg && (leadCount === undefined || !Number.isSafeInteger(leadCount) || leadCount < 1))
|
|
309
656
|
|| (ecg && !firstString(feature, ["voltageUnit"])))
|
|
310
657
|
invalid(`${resource} feature was invalid`);
|
|
658
|
+
if (!ecg) {
|
|
659
|
+
assertWorkoutSplits(feature.splits);
|
|
660
|
+
}
|
|
311
661
|
consistentId(feature, ecg ? ECG_IDS : WORKOUT_IDS, "feature");
|
|
312
662
|
}
|
|
663
|
+
function assertWorkoutSplits(value) {
|
|
664
|
+
if (!Array.isArray(value) || value.length > MAX_WORKOUT_SPLITS) {
|
|
665
|
+
invalid("workout feature splits were invalid");
|
|
666
|
+
}
|
|
667
|
+
let previousIndex = 0;
|
|
668
|
+
let previousEndedAt = Number.NEGATIVE_INFINITY;
|
|
669
|
+
for (const [offset, rawSplit] of value.entries()) {
|
|
670
|
+
const split = record(rawSplit, `workout split ${offset + 1}`);
|
|
671
|
+
const index = finiteNumber(split.index);
|
|
672
|
+
const distance = finiteNumber(split.distanceMeters);
|
|
673
|
+
const duration = finiteNumber(split.durationSeconds);
|
|
674
|
+
const endedAt = firstTimestamp(split, ["endedAt"]);
|
|
675
|
+
const averageSplitHeartRate = finiteNumber(split.averageHeartRate);
|
|
676
|
+
const averageSplitCadence = finiteNumber(split.averageCadence);
|
|
677
|
+
const averageSplitPower = finiteNumber(split.averagePower);
|
|
678
|
+
const cadenceUnit = firstString(split, ["cadenceUnit"]);
|
|
679
|
+
if (Object.keys(split).some((key) => !WORKOUT_SPLIT_FIELDS.has(key))
|
|
680
|
+
|| Object.values(split).some((entry) => typeof entry !== "string" && typeof entry !== "number")
|
|
681
|
+
|| index === undefined
|
|
682
|
+
|| !Number.isSafeInteger(index)
|
|
683
|
+
|| index <= previousIndex
|
|
684
|
+
|| distance === undefined
|
|
685
|
+
|| distance <= 0
|
|
686
|
+
|| duration === undefined
|
|
687
|
+
|| duration <= 0
|
|
688
|
+
|| !endedAt
|
|
689
|
+
|| Date.parse(endedAt) <= previousEndedAt
|
|
690
|
+
|| (averageSplitHeartRate !== undefined
|
|
691
|
+
&& (averageSplitHeartRate < 20 || averageSplitHeartRate > 300))
|
|
692
|
+
|| (averageSplitCadence !== undefined
|
|
693
|
+
&& (averageSplitCadence < 0 || averageSplitCadence > 400))
|
|
694
|
+
|| (averageSplitPower !== undefined
|
|
695
|
+
&& (averageSplitPower < 0 || averageSplitPower > 5_000))
|
|
696
|
+
|| ((averageSplitCadence === undefined) !== (cadenceUnit === undefined))
|
|
697
|
+
|| (cadenceUnit !== undefined
|
|
698
|
+
&& cadenceUnit !== "rpm"
|
|
699
|
+
&& cadenceUnit !== "steps-per-minute")) {
|
|
700
|
+
invalid(`workout split ${offset + 1} was invalid`);
|
|
701
|
+
}
|
|
702
|
+
previousIndex = index;
|
|
703
|
+
previousEndedAt = Date.parse(endedAt);
|
|
704
|
+
}
|
|
705
|
+
}
|
|
313
706
|
function compareSamples(left, right) {
|
|
314
707
|
return left.timestampMs - right.timestampMs || left.lead.localeCompare(right.lead);
|
|
315
708
|
}
|