@elizaos/plugin-personal-assistant 2.0.3-beta.5 → 2.0.3-beta.7
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/dist/actions/app-block.d.ts +15 -0
- package/dist/actions/app-block.d.ts.map +1 -0
- package/dist/actions/app-block.js +349 -0
- package/dist/actions/app-block.js.map +1 -0
- package/dist/actions/autofill.d.ts +20 -0
- package/dist/actions/autofill.d.ts.map +1 -0
- package/dist/actions/autofill.js +370 -0
- package/dist/actions/autofill.js.map +1 -0
- package/dist/actions/block.d.ts +30 -0
- package/dist/actions/block.d.ts.map +1 -0
- package/dist/actions/block.js +326 -0
- package/dist/actions/block.js.map +1 -0
- package/dist/actions/book-travel.d.ts +10 -0
- package/dist/actions/book-travel.d.ts.map +1 -0
- package/dist/actions/book-travel.js +467 -0
- package/dist/actions/book-travel.js.map +1 -0
- package/dist/actions/brief.d.ts +60 -0
- package/dist/actions/brief.d.ts.map +1 -0
- package/dist/actions/brief.js +485 -0
- package/dist/actions/brief.js.map +1 -0
- package/dist/actions/calendar.d.ts +22 -0
- package/dist/actions/calendar.d.ts.map +1 -0
- package/dist/actions/calendar.js +832 -0
- package/dist/actions/calendar.js.map +1 -0
- package/dist/actions/conflict-detect.d.ts +67 -0
- package/dist/actions/conflict-detect.d.ts.map +1 -0
- package/dist/actions/conflict-detect.js +310 -0
- package/dist/actions/conflict-detect.js.map +1 -0
- package/dist/actions/connector.d.ts +5 -0
- package/dist/actions/connector.d.ts.map +1 -0
- package/dist/actions/connector.js +1354 -0
- package/dist/actions/connector.js.map +1 -0
- package/dist/actions/credentials.d.ts +14 -0
- package/dist/actions/credentials.d.ts.map +1 -0
- package/dist/actions/credentials.js +191 -0
- package/dist/actions/credentials.js.map +1 -0
- package/dist/actions/document.d.ts +36 -0
- package/dist/actions/document.d.ts.map +1 -0
- package/dist/actions/document.js +613 -0
- package/dist/actions/document.js.map +1 -0
- package/dist/actions/entity.d.ts +20 -0
- package/dist/actions/entity.d.ts.map +1 -0
- package/dist/actions/entity.js +785 -0
- package/dist/actions/entity.js.map +1 -0
- package/dist/actions/health.d.ts +4 -0
- package/dist/actions/health.d.ts.map +1 -0
- package/dist/actions/health.js +37 -0
- package/dist/actions/health.js.map +1 -0
- package/dist/actions/inbox.d.ts +12 -0
- package/dist/actions/inbox.d.ts.map +1 -0
- package/dist/actions/inbox.js +13 -0
- package/dist/actions/inbox.js.map +1 -0
- package/dist/actions/lib/calendly-handler.d.ts +3 -0
- package/dist/actions/lib/calendly-handler.d.ts.map +1 -0
- package/dist/actions/lib/calendly-handler.js +506 -0
- package/dist/actions/lib/calendly-handler.js.map +1 -0
- package/dist/actions/lib/extract-goal-plan.d.ts +69 -0
- package/dist/actions/lib/extract-goal-plan.d.ts.map +1 -0
- package/dist/actions/lib/extract-goal-plan.js +488 -0
- package/dist/actions/lib/extract-goal-plan.js.map +1 -0
- package/dist/actions/lib/extract-life-operation.d.ts +18 -0
- package/dist/actions/lib/extract-life-operation.d.ts.map +1 -0
- package/dist/actions/lib/extract-life-operation.js +318 -0
- package/dist/actions/lib/extract-life-operation.js.map +1 -0
- package/dist/actions/lib/extract-task-plan.d.ts +78 -0
- package/dist/actions/lib/extract-task-plan.d.ts.map +1 -0
- package/dist/actions/lib/extract-task-plan.js +355 -0
- package/dist/actions/lib/extract-task-plan.js.map +1 -0
- package/dist/actions/lib/extract-update-fields.d.ts +27 -0
- package/dist/actions/lib/extract-update-fields.d.ts.map +1 -0
- package/dist/actions/lib/extract-update-fields.js +172 -0
- package/dist/actions/lib/extract-update-fields.js.map +1 -0
- package/dist/actions/lib/lifeops-deferred-draft.d.ts +68 -0
- package/dist/actions/lib/lifeops-deferred-draft.d.ts.map +1 -0
- package/dist/actions/lib/lifeops-deferred-draft.js +315 -0
- package/dist/actions/lib/lifeops-deferred-draft.js.map +1 -0
- package/dist/actions/lib/messaging-helpers.d.ts +20 -0
- package/dist/actions/lib/messaging-helpers.d.ts.map +1 -0
- package/dist/actions/lib/messaging-helpers.js +103 -0
- package/dist/actions/lib/messaging-helpers.js.map +1 -0
- package/dist/actions/lib/owner-policy-writes.d.ts +49 -0
- package/dist/actions/lib/owner-policy-writes.d.ts.map +1 -0
- package/dist/actions/lib/owner-policy-writes.js +157 -0
- package/dist/actions/lib/owner-policy-writes.js.map +1 -0
- package/dist/actions/lib/prompt-format.d.ts +3 -0
- package/dist/actions/lib/prompt-format.d.ts.map +1 -0
- package/dist/actions/lib/prompt-format.js +42 -0
- package/dist/actions/lib/prompt-format.js.map +1 -0
- package/dist/actions/lib/scheduling-handler.d.ts +93 -0
- package/dist/actions/lib/scheduling-handler.d.ts.map +1 -0
- package/dist/actions/lib/scheduling-handler.js +868 -0
- package/dist/actions/lib/scheduling-handler.js.map +1 -0
- package/dist/actions/life.d.ts +13 -0
- package/dist/actions/life.d.ts.map +1 -0
- package/dist/actions/life.js +2524 -0
- package/dist/actions/life.js.map +1 -0
- package/dist/actions/money.d.ts +24 -0
- package/dist/actions/money.d.ts.map +1 -0
- package/dist/actions/money.js +41 -0
- package/dist/actions/money.js.map +1 -0
- package/dist/actions/owner-surfaces.d.ts +11 -0
- package/dist/actions/owner-surfaces.d.ts.map +1 -0
- package/dist/actions/owner-surfaces.js +493 -0
- package/dist/actions/owner-surfaces.js.map +1 -0
- package/dist/actions/password-manager.d.ts +10 -0
- package/dist/actions/password-manager.d.ts.map +1 -0
- package/dist/actions/password-manager.js +195 -0
- package/dist/actions/password-manager.js.map +1 -0
- package/dist/actions/payments.d.ts +10 -0
- package/dist/actions/payments.d.ts.map +1 -0
- package/dist/actions/payments.js +5 -0
- package/dist/actions/payments.js.map +1 -0
- package/dist/actions/prioritize.d.ts +49 -0
- package/dist/actions/prioritize.d.ts.map +1 -0
- package/dist/actions/prioritize.js +313 -0
- package/dist/actions/prioritize.js.map +1 -0
- package/dist/actions/remote-desktop.d.ts +13 -0
- package/dist/actions/remote-desktop.d.ts.map +1 -0
- package/dist/actions/remote-desktop.js +11 -0
- package/dist/actions/remote-desktop.js.map +1 -0
- package/dist/actions/resolve-request.d.ts +12 -0
- package/dist/actions/resolve-request.d.ts.map +1 -0
- package/dist/actions/resolve-request.js +427 -0
- package/dist/actions/resolve-request.js.map +1 -0
- package/dist/actions/schedule.d.ts +10 -0
- package/dist/actions/schedule.d.ts.map +1 -0
- package/dist/actions/schedule.js +113 -0
- package/dist/actions/schedule.js.map +1 -0
- package/dist/actions/scheduled-task.d.ts +32 -0
- package/dist/actions/scheduled-task.d.ts.map +1 -0
- package/dist/actions/scheduled-task.js +661 -0
- package/dist/actions/scheduled-task.js.map +1 -0
- package/dist/actions/screen-time.d.ts +4 -0
- package/dist/actions/screen-time.d.ts.map +1 -0
- package/dist/actions/screen-time.js +47 -0
- package/dist/actions/screen-time.js.map +1 -0
- package/dist/actions/subscriptions.d.ts +8 -0
- package/dist/actions/subscriptions.d.ts.map +1 -0
- package/dist/actions/subscriptions.js +327 -0
- package/dist/actions/subscriptions.js.map +1 -0
- package/dist/actions/voice-call.d.ts +16 -0
- package/dist/actions/voice-call.d.ts.map +1 -0
- package/dist/actions/voice-call.js +756 -0
- package/dist/actions/voice-call.js.map +1 -0
- package/dist/actions/website-block.d.ts +15 -0
- package/dist/actions/website-block.d.ts.map +1 -0
- package/dist/actions/website-block.js +719 -0
- package/dist/actions/website-block.js.map +1 -0
- package/dist/actions/work-thread.d.ts +5 -0
- package/dist/actions/work-thread.d.ts.map +1 -0
- package/dist/actions/work-thread.js +556 -0
- package/dist/actions/work-thread.js.map +1 -0
- package/dist/activity-profile/activity-tracker-repo.d.ts +28 -0
- package/dist/activity-profile/activity-tracker-repo.d.ts.map +1 -0
- package/dist/activity-profile/activity-tracker-repo.js +61 -0
- package/dist/activity-profile/activity-tracker-repo.js.map +1 -0
- package/dist/activity-profile/activity-tracker-reporting.d.ts +52 -0
- package/dist/activity-profile/activity-tracker-reporting.d.ts.map +1 -0
- package/dist/activity-profile/activity-tracker-reporting.js +119 -0
- package/dist/activity-profile/activity-tracker-reporting.js.map +1 -0
- package/dist/activity-profile/activity-tracker-service.d.ts +36 -0
- package/dist/activity-profile/activity-tracker-service.d.ts.map +1 -0
- package/dist/activity-profile/activity-tracker-service.js +187 -0
- package/dist/activity-profile/activity-tracker-service.js.map +1 -0
- package/dist/activity-profile/analyzer.d.ts +23 -0
- package/dist/activity-profile/analyzer.d.ts.map +1 -0
- package/dist/activity-profile/analyzer.js +485 -0
- package/dist/activity-profile/analyzer.js.map +1 -0
- package/dist/activity-profile/presence-signal-bridge-service.d.ts +14 -0
- package/dist/activity-profile/presence-signal-bridge-service.d.ts.map +1 -0
- package/dist/activity-profile/presence-signal-bridge-service.js +159 -0
- package/dist/activity-profile/presence-signal-bridge-service.js.map +1 -0
- package/dist/activity-profile/proactive-inbox-digest.d.ts +3 -0
- package/dist/activity-profile/proactive-inbox-digest.d.ts.map +1 -0
- package/dist/activity-profile/proactive-inbox-digest.js +21 -0
- package/dist/activity-profile/proactive-inbox-digest.js.map +1 -0
- package/dist/activity-profile/proactive-planner.d.ts +150 -0
- package/dist/activity-profile/proactive-planner.d.ts.map +1 -0
- package/dist/activity-profile/proactive-planner.js +529 -0
- package/dist/activity-profile/proactive-planner.js.map +1 -0
- package/dist/activity-profile/proactive-worker.d.ts +33 -0
- package/dist/activity-profile/proactive-worker.d.ts.map +1 -0
- package/dist/activity-profile/proactive-worker.js +779 -0
- package/dist/activity-profile/proactive-worker.js.map +1 -0
- package/dist/activity-profile/profile-metadata.d.ts +10 -0
- package/dist/activity-profile/profile-metadata.d.ts.map +1 -0
- package/dist/activity-profile/profile-metadata.js +16 -0
- package/dist/activity-profile/profile-metadata.js.map +1 -0
- package/dist/activity-profile/redactor.d.ts +15 -0
- package/dist/activity-profile/redactor.d.ts.map +1 -0
- package/dist/activity-profile/redactor.js +22 -0
- package/dist/activity-profile/redactor.js.map +1 -0
- package/dist/activity-profile/service.d.ts +11 -0
- package/dist/activity-profile/service.d.ts.map +1 -0
- package/dist/activity-profile/service.js +272 -0
- package/dist/activity-profile/service.js.map +1 -0
- package/dist/activity-profile/types.d.ts +97 -0
- package/dist/activity-profile/types.d.ts.map +1 -0
- package/dist/activity-profile/types.js +36 -0
- package/dist/activity-profile/types.js.map +1 -0
- package/dist/agent-lifeops.d.ts +2 -0
- package/dist/agent-lifeops.d.ts.map +1 -0
- package/dist/agent-lifeops.js +2 -0
- package/dist/agent-lifeops.js.map +1 -0
- package/dist/api/client-lifeops.d.ts +319 -0
- package/dist/api/client-lifeops.d.ts.map +1 -0
- package/dist/api/client-lifeops.js +794 -0
- package/dist/api/client-lifeops.js.map +1 -0
- package/dist/automation-node-contributor.d.ts +2 -0
- package/dist/automation-node-contributor.d.ts.map +1 -0
- package/dist/automation-node-contributor.js +184 -0
- package/dist/automation-node-contributor.js.map +1 -0
- package/dist/client.d.ts +16 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +18 -0
- package/dist/client.js.map +1 -0
- package/dist/components/AppBlockerSettingsCard.d.ts +3 -0
- package/dist/components/AppBlockerSettingsCard.d.ts.map +1 -0
- package/dist/components/AppBlockerSettingsCard.js +538 -0
- package/dist/components/AppBlockerSettingsCard.js.map +1 -0
- package/dist/components/WebsiteBlockerSettingsCard.d.ts +3 -0
- package/dist/components/WebsiteBlockerSettingsCard.d.ts.map +1 -0
- package/dist/components/WebsiteBlockerSettingsCard.js +148 -0
- package/dist/components/WebsiteBlockerSettingsCard.js.map +1 -0
- package/dist/contracts/index.d.ts +2 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +2 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/contracts/lifeops.d.ts +2 -0
- package/dist/contracts/lifeops.d.ts.map +1 -0
- package/dist/contracts/lifeops.js +2 -0
- package/dist/contracts/lifeops.js.map +1 -0
- package/dist/default-packs/autofill-whitelist-pack.d.ts +17 -0
- package/dist/default-packs/autofill-whitelist-pack.d.ts.map +1 -0
- package/dist/default-packs/autofill-whitelist-pack.js +56 -0
- package/dist/default-packs/autofill-whitelist-pack.js.map +1 -0
- package/dist/default-packs/consolidation-policies.d.ts +14 -0
- package/dist/default-packs/consolidation-policies.d.ts.map +1 -0
- package/dist/default-packs/consolidation-policies.js +17 -0
- package/dist/default-packs/consolidation-policies.js.map +1 -0
- package/dist/default-packs/contract-types.d.ts +200 -0
- package/dist/default-packs/contract-types.d.ts.map +1 -0
- package/dist/default-packs/contract-types.js +1 -0
- package/dist/default-packs/contract-types.js.map +1 -0
- package/dist/default-packs/daily-rhythm.d.ts +28 -0
- package/dist/default-packs/daily-rhythm.d.ts.map +1 -0
- package/dist/default-packs/daily-rhythm.js +136 -0
- package/dist/default-packs/daily-rhythm.js.map +1 -0
- package/dist/default-packs/escalation-ladders.d.ts +18 -0
- package/dist/default-packs/escalation-ladders.d.ts.map +1 -0
- package/dist/default-packs/escalation-ladders.js +17 -0
- package/dist/default-packs/escalation-ladders.js.map +1 -0
- package/dist/default-packs/executive-assistant.d.ts +50 -0
- package/dist/default-packs/executive-assistant.d.ts.map +1 -0
- package/dist/default-packs/executive-assistant.js +745 -0
- package/dist/default-packs/executive-assistant.js.map +1 -0
- package/dist/default-packs/followup-starter.d.ts +49 -0
- package/dist/default-packs/followup-starter.d.ts.map +1 -0
- package/dist/default-packs/followup-starter.js +104 -0
- package/dist/default-packs/followup-starter.js.map +1 -0
- package/dist/default-packs/habit-starters.d.ts +37 -0
- package/dist/default-packs/habit-starters.d.ts.map +1 -0
- package/dist/default-packs/habit-starters.js +255 -0
- package/dist/default-packs/habit-starters.js.map +1 -0
- package/dist/default-packs/inbox-triage-starter.d.ts +23 -0
- package/dist/default-packs/inbox-triage-starter.d.ts.map +1 -0
- package/dist/default-packs/inbox-triage-starter.js +61 -0
- package/dist/default-packs/inbox-triage-starter.js.map +1 -0
- package/dist/default-packs/index.d.ts +54 -0
- package/dist/default-packs/index.d.ts.map +1 -0
- package/dist/default-packs/index.js +150 -0
- package/dist/default-packs/index.js.map +1 -0
- package/dist/default-packs/lint.d.ts +62 -0
- package/dist/default-packs/lint.d.ts.map +1 -0
- package/dist/default-packs/lint.js +161 -0
- package/dist/default-packs/lint.js.map +1 -0
- package/dist/default-packs/morning-brief.d.ts +44 -0
- package/dist/default-packs/morning-brief.d.ts.map +1 -0
- package/dist/default-packs/morning-brief.js +69 -0
- package/dist/default-packs/morning-brief.js.map +1 -0
- package/dist/default-packs/quiet-user-watcher.d.ts +49 -0
- package/dist/default-packs/quiet-user-watcher.d.ts.map +1 -0
- package/dist/default-packs/quiet-user-watcher.js +92 -0
- package/dist/default-packs/quiet-user-watcher.js.map +1 -0
- package/dist/default-packs/registry-types.d.ts +51 -0
- package/dist/default-packs/registry-types.d.ts.map +1 -0
- package/dist/default-packs/registry-types.js +1 -0
- package/dist/default-packs/registry-types.js.map +1 -0
- package/dist/default-packs/task-definitions.d.ts +88 -0
- package/dist/default-packs/task-definitions.d.ts.map +1 -0
- package/dist/default-packs/task-definitions.js +87 -0
- package/dist/default-packs/task-definitions.js.map +1 -0
- package/dist/events/index.d.ts +34 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +30 -0
- package/dist/events/index.js.map +1 -0
- package/dist/followup/actions/listOverdueFollowups.d.ts +3 -0
- package/dist/followup/actions/listOverdueFollowups.d.ts.map +1 -0
- package/dist/followup/actions/listOverdueFollowups.js +90 -0
- package/dist/followup/actions/listOverdueFollowups.js.map +1 -0
- package/dist/followup/actions/markFollowupDone.d.ts +3 -0
- package/dist/followup/actions/markFollowupDone.d.ts.map +1 -0
- package/dist/followup/actions/markFollowupDone.js +171 -0
- package/dist/followup/actions/markFollowupDone.js.map +1 -0
- package/dist/followup/actions/setFollowupThreshold.d.ts +3 -0
- package/dist/followup/actions/setFollowupThreshold.d.ts.map +1 -0
- package/dist/followup/actions/setFollowupThreshold.js +171 -0
- package/dist/followup/actions/setFollowupThreshold.js.map +1 -0
- package/dist/followup/followup-tracker.d.ts +83 -0
- package/dist/followup/followup-tracker.d.ts.map +1 -0
- package/dist/followup/followup-tracker.js +311 -0
- package/dist/followup/followup-tracker.js.map +1 -0
- package/dist/followup/index.d.ts +5 -0
- package/dist/followup/index.d.ts.map +1 -0
- package/dist/followup/index.js +39 -0
- package/dist/followup/index.js.map +1 -0
- package/dist/hooks/connector-error.d.ts +2 -0
- package/dist/hooks/connector-error.d.ts.map +1 -0
- package/dist/hooks/connector-error.js +13 -0
- package/dist/hooks/connector-error.js.map +1 -0
- package/dist/hooks/useDiscordConnector.d.ts +11 -0
- package/dist/hooks/useDiscordConnector.d.ts.map +1 -0
- package/dist/hooks/useDiscordConnector.js +95 -0
- package/dist/hooks/useDiscordConnector.js.map +1 -0
- package/dist/hooks/useGoogleLifeOpsConnector.d.ts +23 -0
- package/dist/hooks/useGoogleLifeOpsConnector.d.ts.map +1 -0
- package/dist/hooks/useGoogleLifeOpsConnector.js +630 -0
- package/dist/hooks/useGoogleLifeOpsConnector.js.map +1 -0
- package/dist/hooks/useIMessageConnector.d.ts +10 -0
- package/dist/hooks/useIMessageConnector.d.ts.map +1 -0
- package/dist/hooks/useIMessageConnector.js +57 -0
- package/dist/hooks/useIMessageConnector.js.map +1 -0
- package/dist/hooks/useInbox.d.ts +36 -0
- package/dist/hooks/useInbox.d.ts.map +1 -0
- package/dist/hooks/useInbox.js +96 -0
- package/dist/hooks/useInbox.js.map +1 -0
- package/dist/hooks/useLifeOpsActivitySignals.d.ts +2 -0
- package/dist/hooks/useLifeOpsActivitySignals.d.ts.map +1 -0
- package/dist/hooks/useLifeOpsActivitySignals.js +358 -0
- package/dist/hooks/useLifeOpsActivitySignals.js.map +1 -0
- package/dist/hooks/useLifeOpsAppState.d.ts +9 -0
- package/dist/hooks/useLifeOpsAppState.d.ts.map +1 -0
- package/dist/hooks/useLifeOpsAppState.js +79 -0
- package/dist/hooks/useLifeOpsAppState.js.map +1 -0
- package/dist/hooks/useLifeOpsCapabilitiesStatus.d.ts +8 -0
- package/dist/hooks/useLifeOpsCapabilitiesStatus.d.ts.map +1 -0
- package/dist/hooks/useLifeOpsCapabilitiesStatus.js +60 -0
- package/dist/hooks/useLifeOpsCapabilitiesStatus.js.map +1 -0
- package/dist/hooks/useLifeOpsXConnector.d.ts +11 -0
- package/dist/hooks/useLifeOpsXConnector.d.ts.map +1 -0
- package/dist/hooks/useLifeOpsXConnector.js +92 -0
- package/dist/hooks/useLifeOpsXConnector.js.map +1 -0
- package/dist/hooks/useSignalConnector.d.ts +14 -0
- package/dist/hooks/useSignalConnector.d.ts.map +1 -0
- package/dist/hooks/useSignalConnector.js +89 -0
- package/dist/hooks/useSignalConnector.js.map +1 -0
- package/dist/hooks/useTelegramConnector.d.ts +14 -0
- package/dist/hooks/useTelegramConnector.d.ts.map +1 -0
- package/dist/hooks/useTelegramConnector.js +97 -0
- package/dist/hooks/useTelegramConnector.js.map +1 -0
- package/dist/hooks/useWhatsAppConnector.d.ts +8 -0
- package/dist/hooks/useWhatsAppConnector.d.ts.map +1 -0
- package/dist/hooks/useWhatsAppConnector.js +62 -0
- package/dist/hooks/useWhatsAppConnector.js.map +1 -0
- package/dist/inbox/message-fetcher.d.ts +11 -0
- package/dist/inbox/message-fetcher.d.ts.map +1 -0
- package/dist/inbox/message-fetcher.js +13 -0
- package/dist/inbox/message-fetcher.js.map +1 -0
- package/dist/inbox/repository.d.ts +11 -0
- package/dist/inbox/repository.d.ts.map +1 -0
- package/dist/inbox/repository.js +5 -0
- package/dist/inbox/repository.js.map +1 -0
- package/dist/inbox/types.d.ts +10 -0
- package/dist/inbox/types.d.ts.map +1 -0
- package/dist/inbox/types.js +2 -0
- package/dist/inbox/types.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +188 -0
- package/dist/index.js.map +1 -0
- package/dist/lifeops/access.d.ts +29 -0
- package/dist/lifeops/access.d.ts.map +1 -0
- package/dist/lifeops/access.js +56 -0
- package/dist/lifeops/access.js.map +1 -0
- package/dist/lifeops/app-state.d.ts +22 -0
- package/dist/lifeops/app-state.d.ts.map +1 -0
- package/dist/lifeops/app-state.js +67 -0
- package/dist/lifeops/app-state.js.map +1 -0
- package/dist/lifeops/apple-reminders.d.ts +67 -0
- package/dist/lifeops/apple-reminders.d.ts.map +1 -0
- package/dist/lifeops/apple-reminders.js +396 -0
- package/dist/lifeops/apple-reminders.js.map +1 -0
- package/dist/lifeops/approval-queue.d.ts +38 -0
- package/dist/lifeops/approval-queue.d.ts.map +1 -0
- package/dist/lifeops/approval-queue.js +575 -0
- package/dist/lifeops/approval-queue.js.map +1 -0
- package/dist/lifeops/approval-queue.types.d.ts +172 -0
- package/dist/lifeops/approval-queue.types.d.ts.map +1 -0
- package/dist/lifeops/approval-queue.types.js +27 -0
- package/dist/lifeops/approval-queue.types.js.map +1 -0
- package/dist/lifeops/autofill-whitelist.d.ts +20 -0
- package/dist/lifeops/autofill-whitelist.d.ts.map +1 -0
- package/dist/lifeops/autofill-whitelist.js +59 -0
- package/dist/lifeops/autofill-whitelist.js.map +1 -0
- package/dist/lifeops/background-planner-dispatch.d.ts +60 -0
- package/dist/lifeops/background-planner-dispatch.d.ts.map +1 -0
- package/dist/lifeops/background-planner-dispatch.js +113 -0
- package/dist/lifeops/background-planner-dispatch.js.map +1 -0
- package/dist/lifeops/background-planner.d.ts +140 -0
- package/dist/lifeops/background-planner.d.ts.map +1 -0
- package/dist/lifeops/background-planner.js +359 -0
- package/dist/lifeops/background-planner.js.map +1 -0
- package/dist/lifeops/bill-extraction.d.ts +46 -0
- package/dist/lifeops/bill-extraction.d.ts.map +1 -0
- package/dist/lifeops/bill-extraction.js +325 -0
- package/dist/lifeops/bill-extraction.js.map +1 -0
- package/dist/lifeops/browser-constants.d.ts +4 -0
- package/dist/lifeops/browser-constants.d.ts.map +1 -0
- package/dist/lifeops/browser-constants.js +27 -0
- package/dist/lifeops/browser-constants.js.map +1 -0
- package/dist/lifeops/browser-extension-store.d.ts +61 -0
- package/dist/lifeops/browser-extension-store.d.ts.map +1 -0
- package/dist/lifeops/browser-extension-store.js +176 -0
- package/dist/lifeops/browser-extension-store.js.map +1 -0
- package/dist/lifeops/browser-session-lifecycle.d.ts +57 -0
- package/dist/lifeops/browser-session-lifecycle.d.ts.map +1 -0
- package/dist/lifeops/browser-session-lifecycle.js +308 -0
- package/dist/lifeops/browser-session-lifecycle.js.map +1 -0
- package/dist/lifeops/bulk-review.d.ts +333 -0
- package/dist/lifeops/bulk-review.d.ts.map +1 -0
- package/dist/lifeops/bulk-review.js +1120 -0
- package/dist/lifeops/bulk-review.js.map +1 -0
- package/dist/lifeops/calendar-gate.d.ts +20 -0
- package/dist/lifeops/calendar-gate.d.ts.map +1 -0
- package/dist/lifeops/calendar-gate.js +30 -0
- package/dist/lifeops/calendar-gate.js.map +1 -0
- package/dist/lifeops/channels/contract.d.ts +47 -0
- package/dist/lifeops/channels/contract.d.ts.map +1 -0
- package/dist/lifeops/channels/contract.js +1 -0
- package/dist/lifeops/channels/contract.js.map +1 -0
- package/dist/lifeops/channels/default-pack.d.ts +26 -0
- package/dist/lifeops/channels/default-pack.d.ts.map +1 -0
- package/dist/lifeops/channels/default-pack.js +243 -0
- package/dist/lifeops/channels/default-pack.js.map +1 -0
- package/dist/lifeops/channels/index.d.ts +5 -0
- package/dist/lifeops/channels/index.d.ts.map +1 -0
- package/dist/lifeops/channels/index.js +23 -0
- package/dist/lifeops/channels/index.js.map +1 -0
- package/dist/lifeops/channels/priority-posture.d.ts +36 -0
- package/dist/lifeops/channels/priority-posture.d.ts.map +1 -0
- package/dist/lifeops/channels/priority-posture.js +27 -0
- package/dist/lifeops/channels/priority-posture.js.map +1 -0
- package/dist/lifeops/channels/registry.d.ts +7 -0
- package/dist/lifeops/channels/registry.d.ts.map +1 -0
- package/dist/lifeops/channels/registry.js +49 -0
- package/dist/lifeops/channels/registry.js.map +1 -0
- package/dist/lifeops/checkin/checkin-service.d.ts +66 -0
- package/dist/lifeops/checkin/checkin-service.d.ts.map +1 -0
- package/dist/lifeops/checkin/checkin-service.js +1084 -0
- package/dist/lifeops/checkin/checkin-service.js.map +1 -0
- package/dist/lifeops/checkin/schedule-resolver.d.ts +17 -0
- package/dist/lifeops/checkin/schedule-resolver.d.ts.map +1 -0
- package/dist/lifeops/checkin/schedule-resolver.js +26 -0
- package/dist/lifeops/checkin/schedule-resolver.js.map +1 -0
- package/dist/lifeops/checkin/types.d.ts +106 -0
- package/dist/lifeops/checkin/types.d.ts.map +1 -0
- package/dist/lifeops/checkin/types.js +1 -0
- package/dist/lifeops/checkin/types.js.map +1 -0
- package/dist/lifeops/connectors/_helpers.d.ts +51 -0
- package/dist/lifeops/connectors/_helpers.d.ts.map +1 -0
- package/dist/lifeops/connectors/_helpers.js +104 -0
- package/dist/lifeops/connectors/_helpers.js.map +1 -0
- package/dist/lifeops/connectors/calendly.d.ts +11 -0
- package/dist/lifeops/connectors/calendly.d.ts.map +1 -0
- package/dist/lifeops/connectors/calendly.js +61 -0
- package/dist/lifeops/connectors/calendly.js.map +1 -0
- package/dist/lifeops/connectors/contract.d.ts +88 -0
- package/dist/lifeops/connectors/contract.d.ts.map +1 -0
- package/dist/lifeops/connectors/contract.js +1 -0
- package/dist/lifeops/connectors/contract.js.map +1 -0
- package/dist/lifeops/connectors/default-pack.d.ts +35 -0
- package/dist/lifeops/connectors/default-pack.d.ts.map +1 -0
- package/dist/lifeops/connectors/default-pack.js +37 -0
- package/dist/lifeops/connectors/default-pack.js.map +1 -0
- package/dist/lifeops/connectors/discord.d.ts +8 -0
- package/dist/lifeops/connectors/discord.d.ts.map +1 -0
- package/dist/lifeops/connectors/discord.js +53 -0
- package/dist/lifeops/connectors/discord.js.map +1 -0
- package/dist/lifeops/connectors/dispatch-policy.d.ts +75 -0
- package/dist/lifeops/connectors/dispatch-policy.d.ts.map +1 -0
- package/dist/lifeops/connectors/dispatch-policy.js +35 -0
- package/dist/lifeops/connectors/dispatch-policy.js.map +1 -0
- package/dist/lifeops/connectors/duffel.d.ts +11 -0
- package/dist/lifeops/connectors/duffel.d.ts.map +1 -0
- package/dist/lifeops/connectors/duffel.js +74 -0
- package/dist/lifeops/connectors/duffel.js.map +1 -0
- package/dist/lifeops/connectors/google.d.ts +27 -0
- package/dist/lifeops/connectors/google.d.ts.map +1 -0
- package/dist/lifeops/connectors/google.js +80 -0
- package/dist/lifeops/connectors/google.js.map +1 -0
- package/dist/lifeops/connectors/imessage.d.ts +11 -0
- package/dist/lifeops/connectors/imessage.d.ts.map +1 -0
- package/dist/lifeops/connectors/imessage.js +55 -0
- package/dist/lifeops/connectors/imessage.js.map +1 -0
- package/dist/lifeops/connectors/index.d.ts +5 -0
- package/dist/lifeops/connectors/index.d.ts.map +1 -0
- package/dist/lifeops/connectors/index.js +23 -0
- package/dist/lifeops/connectors/index.js.map +1 -0
- package/dist/lifeops/connectors/mockoon-redirect.d.ts +54 -0
- package/dist/lifeops/connectors/mockoon-redirect.d.ts.map +1 -0
- package/dist/lifeops/connectors/mockoon-redirect.js +71 -0
- package/dist/lifeops/connectors/mockoon-redirect.js.map +1 -0
- package/dist/lifeops/connectors/registry.d.ts +7 -0
- package/dist/lifeops/connectors/registry.d.ts.map +1 -0
- package/dist/lifeops/connectors/registry.js +55 -0
- package/dist/lifeops/connectors/registry.js.map +1 -0
- package/dist/lifeops/connectors/signal.d.ts +8 -0
- package/dist/lifeops/connectors/signal.d.ts.map +1 -0
- package/dist/lifeops/connectors/signal.js +60 -0
- package/dist/lifeops/connectors/signal.js.map +1 -0
- package/dist/lifeops/connectors/telegram.d.ts +12 -0
- package/dist/lifeops/connectors/telegram.d.ts.map +1 -0
- package/dist/lifeops/connectors/telegram.js +65 -0
- package/dist/lifeops/connectors/telegram.js.map +1 -0
- package/dist/lifeops/connectors/twilio.d.ts +15 -0
- package/dist/lifeops/connectors/twilio.d.ts.map +1 -0
- package/dist/lifeops/connectors/twilio.js +126 -0
- package/dist/lifeops/connectors/twilio.js.map +1 -0
- package/dist/lifeops/connectors/whatsapp.d.ts +10 -0
- package/dist/lifeops/connectors/whatsapp.d.ts.map +1 -0
- package/dist/lifeops/connectors/whatsapp.js +56 -0
- package/dist/lifeops/connectors/whatsapp.js.map +1 -0
- package/dist/lifeops/connectors/x.d.ts +8 -0
- package/dist/lifeops/connectors/x.d.ts.map +1 -0
- package/dist/lifeops/connectors/x.js +62 -0
- package/dist/lifeops/connectors/x.js.map +1 -0
- package/dist/lifeops/contact-route-policy.d.ts +27 -0
- package/dist/lifeops/contact-route-policy.d.ts.map +1 -0
- package/dist/lifeops/contact-route-policy.js +153 -0
- package/dist/lifeops/contact-route-policy.js.map +1 -0
- package/dist/lifeops/continuity-probe.d.ts +49 -0
- package/dist/lifeops/continuity-probe.d.ts.map +1 -0
- package/dist/lifeops/continuity-probe.js +161 -0
- package/dist/lifeops/continuity-probe.js.map +1 -0
- package/dist/lifeops/cross-channel-search.d.ts +108 -0
- package/dist/lifeops/cross-channel-search.d.ts.map +1 -0
- package/dist/lifeops/cross-channel-search.js +888 -0
- package/dist/lifeops/cross-channel-search.js.map +1 -0
- package/dist/lifeops/defaults.d.ts +30 -0
- package/dist/lifeops/defaults.d.ts.map +1 -0
- package/dist/lifeops/defaults.js +206 -0
- package/dist/lifeops/defaults.js.map +1 -0
- package/dist/lifeops/device-bus-service.d.ts +16 -0
- package/dist/lifeops/device-bus-service.d.ts.map +1 -0
- package/dist/lifeops/device-bus-service.js +20 -0
- package/dist/lifeops/device-bus-service.js.map +1 -0
- package/dist/lifeops/device-identity.d.ts +31 -0
- package/dist/lifeops/device-identity.d.ts.map +1 -0
- package/dist/lifeops/device-identity.js +94 -0
- package/dist/lifeops/device-identity.js.map +1 -0
- package/dist/lifeops/document-review.d.ts +264 -0
- package/dist/lifeops/document-review.d.ts.map +1 -0
- package/dist/lifeops/document-review.js +925 -0
- package/dist/lifeops/document-review.js.map +1 -0
- package/dist/lifeops/email-classifier.d.ts +9 -0
- package/dist/lifeops/email-classifier.d.ts.map +1 -0
- package/dist/lifeops/email-classifier.js +15 -0
- package/dist/lifeops/email-classifier.js.map +1 -0
- package/dist/lifeops/email-curation.d.ts +13 -0
- package/dist/lifeops/email-curation.d.ts.map +1 -0
- package/dist/lifeops/email-curation.js +2 -0
- package/dist/lifeops/email-curation.js.map +1 -0
- package/dist/lifeops/email-unsubscribe-types.d.ts +7 -0
- package/dist/lifeops/email-unsubscribe-types.d.ts.map +1 -0
- package/dist/lifeops/email-unsubscribe-types.js +1 -0
- package/dist/lifeops/email-unsubscribe-types.js.map +1 -0
- package/dist/lifeops/enforcement-windows.d.ts +34 -0
- package/dist/lifeops/enforcement-windows.d.ts.map +1 -0
- package/dist/lifeops/enforcement-windows.js +80 -0
- package/dist/lifeops/enforcement-windows.js.map +1 -0
- package/dist/lifeops/engine.d.ts +8 -0
- package/dist/lifeops/engine.d.ts.map +1 -0
- package/dist/lifeops/engine.js +540 -0
- package/dist/lifeops/engine.js.map +1 -0
- package/dist/lifeops/entities/index.d.ts +4 -0
- package/dist/lifeops/entities/index.d.ts.map +1 -0
- package/dist/lifeops/entities/index.js +29 -0
- package/dist/lifeops/entities/index.js.map +1 -0
- package/dist/lifeops/entities/merge.d.ts +9 -0
- package/dist/lifeops/entities/merge.d.ts.map +1 -0
- package/dist/lifeops/entities/merge.js +17 -0
- package/dist/lifeops/entities/merge.js.map +1 -0
- package/dist/lifeops/entities/store.d.ts +13 -0
- package/dist/lifeops/entities/store.d.ts.map +1 -0
- package/dist/lifeops/entities/store.js +7 -0
- package/dist/lifeops/entities/store.js.map +1 -0
- package/dist/lifeops/entities/types.d.ts +9 -0
- package/dist/lifeops/entities/types.d.ts.map +1 -0
- package/dist/lifeops/entities/types.js +13 -0
- package/dist/lifeops/entities/types.js.map +1 -0
- package/dist/lifeops/entities/voice-attribution.d.ts +70 -0
- package/dist/lifeops/entities/voice-attribution.d.ts.map +1 -0
- package/dist/lifeops/entities/voice-attribution.js +121 -0
- package/dist/lifeops/entities/voice-attribution.js.map +1 -0
- package/dist/lifeops/entities/voice-observer-bridge.d.ts +32 -0
- package/dist/lifeops/entities/voice-observer-bridge.d.ts.map +1 -0
- package/dist/lifeops/entities/voice-observer-bridge.js +68 -0
- package/dist/lifeops/entities/voice-observer-bridge.js.map +1 -0
- package/dist/lifeops/entities/voice-observer.d.ts +72 -0
- package/dist/lifeops/entities/voice-observer.d.ts.map +1 -0
- package/dist/lifeops/entities/voice-observer.js +97 -0
- package/dist/lifeops/entities/voice-observer.js.map +1 -0
- package/dist/lifeops/escalation-ladders.d.ts +28 -0
- package/dist/lifeops/escalation-ladders.d.ts.map +1 -0
- package/dist/lifeops/escalation-ladders.js +17 -0
- package/dist/lifeops/escalation-ladders.js.map +1 -0
- package/dist/lifeops/fda-probe.d.ts +23 -0
- package/dist/lifeops/fda-probe.d.ts.map +1 -0
- package/dist/lifeops/fda-probe.js +59 -0
- package/dist/lifeops/fda-probe.js.map +1 -0
- package/dist/lifeops/feature-flags.d.ts +24 -0
- package/dist/lifeops/feature-flags.d.ts.map +1 -0
- package/dist/lifeops/feature-flags.js +261 -0
- package/dist/lifeops/feature-flags.js.map +1 -0
- package/dist/lifeops/feature-flags.types.d.ts +156 -0
- package/dist/lifeops/feature-flags.types.d.ts.map +1 -0
- package/dist/lifeops/feature-flags.types.js +129 -0
- package/dist/lifeops/feature-flags.types.js.map +1 -0
- package/dist/lifeops/first-run/defaults.d.ts +57 -0
- package/dist/lifeops/first-run/defaults.d.ts.map +1 -0
- package/dist/lifeops/first-run/defaults.js +159 -0
- package/dist/lifeops/first-run/defaults.js.map +1 -0
- package/dist/lifeops/first-run/questions.d.ts +74 -0
- package/dist/lifeops/first-run/questions.d.ts.map +1 -0
- package/dist/lifeops/first-run/questions.js +184 -0
- package/dist/lifeops/first-run/questions.js.map +1 -0
- package/dist/lifeops/first-run/replay.d.ts +41 -0
- package/dist/lifeops/first-run/replay.d.ts.map +1 -0
- package/dist/lifeops/first-run/replay.js +34 -0
- package/dist/lifeops/first-run/replay.js.map +1 -0
- package/dist/lifeops/first-run/service.d.ts +147 -0
- package/dist/lifeops/first-run/service.d.ts.map +1 -0
- package/dist/lifeops/first-run/service.js +455 -0
- package/dist/lifeops/first-run/service.js.map +1 -0
- package/dist/lifeops/first-run/state.d.ts +36 -0
- package/dist/lifeops/first-run/state.d.ts.map +1 -0
- package/dist/lifeops/first-run/state.js +128 -0
- package/dist/lifeops/first-run/state.js.map +1 -0
- package/dist/lifeops/global-pause/store.d.ts +22 -0
- package/dist/lifeops/global-pause/store.d.ts.map +1 -0
- package/dist/lifeops/global-pause/store.js +18 -0
- package/dist/lifeops/global-pause/store.js.map +1 -0
- package/dist/lifeops/goal-grounding.d.ts +9 -0
- package/dist/lifeops/goal-grounding.d.ts.map +1 -0
- package/dist/lifeops/goal-grounding.js +19 -0
- package/dist/lifeops/goal-grounding.js.map +1 -0
- package/dist/lifeops/goal-semantic-evaluator.d.ts +8 -0
- package/dist/lifeops/goal-semantic-evaluator.d.ts.map +1 -0
- package/dist/lifeops/goal-semantic-evaluator.js +7 -0
- package/dist/lifeops/goal-semantic-evaluator.js.map +1 -0
- package/dist/lifeops/google/format-helpers.d.ts +63 -0
- package/dist/lifeops/google/format-helpers.d.ts.map +1 -0
- package/dist/lifeops/google/format-helpers.js +597 -0
- package/dist/lifeops/google/format-helpers.js.map +1 -0
- package/dist/lifeops/google-plugin-delegates.d.ts +59 -0
- package/dist/lifeops/google-plugin-delegates.d.ts.map +1 -0
- package/dist/lifeops/google-plugin-delegates.js +408 -0
- package/dist/lifeops/google-plugin-delegates.js.map +1 -0
- package/dist/lifeops/google-scopes.d.ts +15 -0
- package/dist/lifeops/google-scopes.d.ts.map +1 -0
- package/dist/lifeops/google-scopes.js +118 -0
- package/dist/lifeops/google-scopes.js.map +1 -0
- package/dist/lifeops/handoff/store.d.ts +23 -0
- package/dist/lifeops/handoff/store.d.ts.map +1 -0
- package/dist/lifeops/handoff/store.js +20 -0
- package/dist/lifeops/handoff/store.js.map +1 -0
- package/dist/lifeops/i18n/localized-examples-provider.d.ts +16 -0
- package/dist/lifeops/i18n/localized-examples-provider.d.ts.map +1 -0
- package/dist/lifeops/i18n/localized-examples-provider.js +33 -0
- package/dist/lifeops/i18n/localized-examples-provider.js.map +1 -0
- package/dist/lifeops/i18n/localized-examples-resolver.d.ts +32 -0
- package/dist/lifeops/i18n/localized-examples-resolver.d.ts.map +1 -0
- package/dist/lifeops/i18n/localized-examples-resolver.js +28 -0
- package/dist/lifeops/i18n/localized-examples-resolver.js.map +1 -0
- package/dist/lifeops/i18n/prompt-registry.d.ts +64 -0
- package/dist/lifeops/i18n/prompt-registry.d.ts.map +1 -0
- package/dist/lifeops/i18n/prompt-registry.js +283 -0
- package/dist/lifeops/i18n/prompt-registry.js.map +1 -0
- package/dist/lifeops/imessage-outbound-probe.d.ts +7 -0
- package/dist/lifeops/imessage-outbound-probe.d.ts.map +1 -0
- package/dist/lifeops/imessage-outbound-probe.js +81 -0
- package/dist/lifeops/imessage-outbound-probe.js.map +1 -0
- package/dist/lifeops/index.d.ts +24 -0
- package/dist/lifeops/index.d.ts.map +1 -0
- package/dist/lifeops/index.js +24 -0
- package/dist/lifeops/index.js.map +1 -0
- package/dist/lifeops/intent-sync.d.ts +64 -0
- package/dist/lifeops/intent-sync.d.ts.map +1 -0
- package/dist/lifeops/intent-sync.js +321 -0
- package/dist/lifeops/intent-sync.js.map +1 -0
- package/dist/lifeops/messaging/index.d.ts +2 -0
- package/dist/lifeops/messaging/index.d.ts.map +1 -0
- package/dist/lifeops/messaging/index.js +5 -0
- package/dist/lifeops/messaging/index.js.map +1 -0
- package/dist/lifeops/messaging/owner-send-policy.d.ts +3 -0
- package/dist/lifeops/messaging/owner-send-policy.d.ts.map +1 -0
- package/dist/lifeops/messaging/owner-send-policy.js +83 -0
- package/dist/lifeops/messaging/owner-send-policy.js.map +1 -0
- package/dist/lifeops/notifications-push.d.ts +37 -0
- package/dist/lifeops/notifications-push.d.ts.map +1 -0
- package/dist/lifeops/notifications-push.js +95 -0
- package/dist/lifeops/notifications-push.js.map +1 -0
- package/dist/lifeops/optimized-prompt-instructions.d.ts +5 -0
- package/dist/lifeops/optimized-prompt-instructions.d.ts.map +1 -0
- package/dist/lifeops/optimized-prompt-instructions.js +48 -0
- package/dist/lifeops/optimized-prompt-instructions.js.map +1 -0
- package/dist/lifeops/owner/fact-store.d.ts +143 -0
- package/dist/lifeops/owner/fact-store.d.ts.map +1 -0
- package/dist/lifeops/owner/fact-store.js +446 -0
- package/dist/lifeops/owner/fact-store.js.map +1 -0
- package/dist/lifeops/owner/profile-extraction-evaluator.d.ts +3 -0
- package/dist/lifeops/owner/profile-extraction-evaluator.d.ts.map +1 -0
- package/dist/lifeops/owner/profile-extraction-evaluator.js +241 -0
- package/dist/lifeops/owner/profile-extraction-evaluator.js.map +1 -0
- package/dist/lifeops/owner-profile.d.ts +61 -0
- package/dist/lifeops/owner-profile.d.ts.map +1 -0
- package/dist/lifeops/owner-profile.js +407 -0
- package/dist/lifeops/owner-profile.js.map +1 -0
- package/dist/lifeops/pending-prompts/store.d.ts +23 -0
- package/dist/lifeops/pending-prompts/store.d.ts.map +1 -0
- package/dist/lifeops/pending-prompts/store.js +16 -0
- package/dist/lifeops/pending-prompts/store.js.map +1 -0
- package/dist/lifeops/policy-memory.d.ts +190 -0
- package/dist/lifeops/policy-memory.d.ts.map +1 -0
- package/dist/lifeops/policy-memory.js +1026 -0
- package/dist/lifeops/policy-memory.js.map +1 -0
- package/dist/lifeops/priority-scoring.d.ts +51 -0
- package/dist/lifeops/priority-scoring.d.ts.map +1 -0
- package/dist/lifeops/priority-scoring.js +305 -0
- package/dist/lifeops/priority-scoring.js.map +1 -0
- package/dist/lifeops/privacy-egress.d.ts +92 -0
- package/dist/lifeops/privacy-egress.d.ts.map +1 -0
- package/dist/lifeops/privacy-egress.js +230 -0
- package/dist/lifeops/privacy-egress.js.map +1 -0
- package/dist/lifeops/privacy.d.ts +49 -0
- package/dist/lifeops/privacy.d.ts.map +1 -0
- package/dist/lifeops/privacy.js +66 -0
- package/dist/lifeops/privacy.js.map +1 -0
- package/dist/lifeops/redact-sensitive-data.d.ts +32 -0
- package/dist/lifeops/redact-sensitive-data.d.ts.map +1 -0
- package/dist/lifeops/redact-sensitive-data.js +98 -0
- package/dist/lifeops/redact-sensitive-data.js.map +1 -0
- package/dist/lifeops/registries/app-blocker-contribution.d.ts +13 -0
- package/dist/lifeops/registries/app-blocker-contribution.d.ts.map +1 -0
- package/dist/lifeops/registries/app-blocker-contribution.js +73 -0
- package/dist/lifeops/registries/app-blocker-contribution.js.map +1 -0
- package/dist/lifeops/registries/blocker-registry.d.ts +76 -0
- package/dist/lifeops/registries/blocker-registry.d.ts.map +1 -0
- package/dist/lifeops/registries/blocker-registry.js +40 -0
- package/dist/lifeops/registries/blocker-registry.js.map +1 -0
- package/dist/lifeops/registries/event-kind-registry.d.ts +57 -0
- package/dist/lifeops/registries/event-kind-registry.d.ts.map +1 -0
- package/dist/lifeops/registries/event-kind-registry.js +82 -0
- package/dist/lifeops/registries/event-kind-registry.js.map +1 -0
- package/dist/lifeops/registries/family-registry.d.ts +72 -0
- package/dist/lifeops/registries/family-registry.d.ts.map +1 -0
- package/dist/lifeops/registries/family-registry.js +98 -0
- package/dist/lifeops/registries/family-registry.js.map +1 -0
- package/dist/lifeops/registries/feature-flag-default-pack.d.ts +32 -0
- package/dist/lifeops/registries/feature-flag-default-pack.d.ts.map +1 -0
- package/dist/lifeops/registries/feature-flag-default-pack.js +36 -0
- package/dist/lifeops/registries/feature-flag-default-pack.js.map +1 -0
- package/dist/lifeops/registries/feature-flag-registry.d.ts +76 -0
- package/dist/lifeops/registries/feature-flag-registry.d.ts.map +1 -0
- package/dist/lifeops/registries/feature-flag-registry.js +68 -0
- package/dist/lifeops/registries/feature-flag-registry.js.map +1 -0
- package/dist/lifeops/registries/index.d.ts +24 -0
- package/dist/lifeops/registries/index.d.ts.map +1 -0
- package/dist/lifeops/registries/index.js +115 -0
- package/dist/lifeops/registries/index.js.map +1 -0
- package/dist/lifeops/registries/website-blocker-contribution.d.ts +21 -0
- package/dist/lifeops/registries/website-blocker-contribution.d.ts.map +1 -0
- package/dist/lifeops/registries/website-blocker-contribution.js +76 -0
- package/dist/lifeops/registries/website-blocker-contribution.js.map +1 -0
- package/dist/lifeops/registries/workflow-step-default-pack.d.ts +30 -0
- package/dist/lifeops/registries/workflow-step-default-pack.d.ts.map +1 -0
- package/dist/lifeops/registries/workflow-step-default-pack.js +315 -0
- package/dist/lifeops/registries/workflow-step-default-pack.js.map +1 -0
- package/dist/lifeops/registries/workflow-step-registry.d.ts +101 -0
- package/dist/lifeops/registries/workflow-step-registry.d.ts.map +1 -0
- package/dist/lifeops/registries/workflow-step-registry.js +56 -0
- package/dist/lifeops/registries/workflow-step-registry.js.map +1 -0
- package/dist/lifeops/relationships/extraction.d.ts +77 -0
- package/dist/lifeops/relationships/extraction.d.ts.map +1 -0
- package/dist/lifeops/relationships/extraction.js +146 -0
- package/dist/lifeops/relationships/extraction.js.map +1 -0
- package/dist/lifeops/relationships/index.d.ts +4 -0
- package/dist/lifeops/relationships/index.d.ts.map +1 -0
- package/dist/lifeops/relationships/index.js +19 -0
- package/dist/lifeops/relationships/index.js.map +1 -0
- package/dist/lifeops/relationships/mapping.d.ts +34 -0
- package/dist/lifeops/relationships/mapping.d.ts.map +1 -0
- package/dist/lifeops/relationships/mapping.js +87 -0
- package/dist/lifeops/relationships/mapping.js.map +1 -0
- package/dist/lifeops/relationships/store.d.ts +12 -0
- package/dist/lifeops/relationships/store.d.ts.map +1 -0
- package/dist/lifeops/relationships/store.js +5 -0
- package/dist/lifeops/relationships/store.js.map +1 -0
- package/dist/lifeops/relationships/types.d.ts +9 -0
- package/dist/lifeops/relationships/types.d.ts.map +1 -0
- package/dist/lifeops/relationships/types.js +11 -0
- package/dist/lifeops/relationships/types.js.map +1 -0
- package/dist/lifeops/relative-schedule-resolver.d.ts +13 -0
- package/dist/lifeops/relative-schedule-resolver.d.ts.map +1 -0
- package/dist/lifeops/relative-schedule-resolver.js +107 -0
- package/dist/lifeops/relative-schedule-resolver.js.map +1 -0
- package/dist/lifeops/relative-time.d.ts +15 -0
- package/dist/lifeops/relative-time.d.ts.map +1 -0
- package/dist/lifeops/relative-time.js +191 -0
- package/dist/lifeops/relative-time.js.map +1 -0
- package/dist/lifeops/repository.d.ts +638 -0
- package/dist/lifeops/repository.d.ts.map +1 -0
- package/dist/lifeops/repository.js +6289 -0
- package/dist/lifeops/repository.js.map +1 -0
- package/dist/lifeops/runtime-cache.d.ts +4 -0
- package/dist/lifeops/runtime-cache.d.ts.map +1 -0
- package/dist/lifeops/runtime-cache.js +7 -0
- package/dist/lifeops/runtime-cache.js.map +1 -0
- package/dist/lifeops/runtime-service-delegates.d.ts +236 -0
- package/dist/lifeops/runtime-service-delegates.d.ts.map +1 -0
- package/dist/lifeops/runtime-service-delegates.js +839 -0
- package/dist/lifeops/runtime-service-delegates.js.map +1 -0
- package/dist/lifeops/runtime.d.ts +13 -0
- package/dist/lifeops/runtime.d.ts.map +1 -0
- package/dist/lifeops/runtime.js +104 -0
- package/dist/lifeops/runtime.js.map +1 -0
- package/dist/lifeops/schedule-insight.d.ts +133 -0
- package/dist/lifeops/schedule-insight.d.ts.map +1 -0
- package/dist/lifeops/schedule-insight.js +726 -0
- package/dist/lifeops/schedule-insight.js.map +1 -0
- package/dist/lifeops/schedule-state.d.ts +39 -0
- package/dist/lifeops/schedule-state.d.ts.map +1 -0
- package/dist/lifeops/schedule-state.js +671 -0
- package/dist/lifeops/schedule-state.js.map +1 -0
- package/dist/lifeops/schedule-sync-config.d.ts +3 -0
- package/dist/lifeops/schedule-sync-config.d.ts.map +1 -0
- package/dist/lifeops/schedule-sync-config.js +23 -0
- package/dist/lifeops/schedule-sync-config.js.map +1 -0
- package/dist/lifeops/schedule-sync-contracts.d.ts +2 -0
- package/dist/lifeops/schedule-sync-contracts.d.ts.map +1 -0
- package/dist/lifeops/schedule-sync-contracts.js +2 -0
- package/dist/lifeops/schedule-sync-contracts.js.map +1 -0
- package/dist/lifeops/scheduled-task/index.d.ts +13 -0
- package/dist/lifeops/scheduled-task/index.d.ts.map +1 -0
- package/dist/lifeops/scheduled-task/index.js +14 -0
- package/dist/lifeops/scheduled-task/index.js.map +1 -0
- package/dist/lifeops/scheduled-task/runtime-wiring.d.ts +33 -0
- package/dist/lifeops/scheduled-task/runtime-wiring.d.ts.map +1 -0
- package/dist/lifeops/scheduled-task/runtime-wiring.js +334 -0
- package/dist/lifeops/scheduled-task/runtime-wiring.js.map +1 -0
- package/dist/lifeops/scheduled-task/scheduler.d.ts +28 -0
- package/dist/lifeops/scheduled-task/scheduler.d.ts.map +1 -0
- package/dist/lifeops/scheduled-task/scheduler.js +202 -0
- package/dist/lifeops/scheduled-task/scheduler.js.map +1 -0
- package/dist/lifeops/scheduled-task/service.d.ts +61 -0
- package/dist/lifeops/scheduled-task/service.d.ts.map +1 -0
- package/dist/lifeops/scheduled-task/service.js +64 -0
- package/dist/lifeops/scheduled-task/service.js.map +1 -0
- package/dist/lifeops/scheduler-task.d.ts +19 -0
- package/dist/lifeops/scheduler-task.d.ts.map +1 -0
- package/dist/lifeops/scheduler-task.js +201 -0
- package/dist/lifeops/scheduler-task.js.map +1 -0
- package/dist/lifeops/schema.d.ts +28068 -0
- package/dist/lifeops/schema.d.ts.map +1 -0
- package/dist/lifeops/schema.js +1689 -0
- package/dist/lifeops/schema.js.map +1 -0
- package/dist/lifeops/screen-context.d.ts +66 -0
- package/dist/lifeops/screen-context.d.ts.map +1 -0
- package/dist/lifeops/screen-context.js +347 -0
- package/dist/lifeops/screen-context.js.map +1 -0
- package/dist/lifeops/seed-routine-migration/migrator.d.ts +113 -0
- package/dist/lifeops/seed-routine-migration/migrator.d.ts.map +1 -0
- package/dist/lifeops/seed-routine-migration/migrator.js +142 -0
- package/dist/lifeops/seed-routine-migration/migrator.js.map +1 -0
- package/dist/lifeops/seed-routines.d.ts +24 -0
- package/dist/lifeops/seed-routines.d.ts.map +1 -0
- package/dist/lifeops/seed-routines.js +140 -0
- package/dist/lifeops/seed-routines.js.map +1 -0
- package/dist/lifeops/send-policy/contract.d.ts +81 -0
- package/dist/lifeops/send-policy/contract.d.ts.map +1 -0
- package/dist/lifeops/send-policy/contract.js +1 -0
- package/dist/lifeops/send-policy/contract.js.map +1 -0
- package/dist/lifeops/send-policy/index.d.ts +3 -0
- package/dist/lifeops/send-policy/index.d.ts.map +1 -0
- package/dist/lifeops/send-policy/index.js +13 -0
- package/dist/lifeops/send-policy/index.js.map +1 -0
- package/dist/lifeops/send-policy/registry.d.ts +7 -0
- package/dist/lifeops/send-policy/registry.d.ts.map +1 -0
- package/dist/lifeops/send-policy/registry.js +62 -0
- package/dist/lifeops/send-policy/registry.js.map +1 -0
- package/dist/lifeops/sensitive-request-delivery.d.ts +46 -0
- package/dist/lifeops/sensitive-request-delivery.d.ts.map +1 -0
- package/dist/lifeops/sensitive-request-delivery.js +103 -0
- package/dist/lifeops/sensitive-request-delivery.js.map +1 -0
- package/dist/lifeops/service-constants.d.ts +10 -0
- package/dist/lifeops/service-constants.d.ts.map +1 -0
- package/dist/lifeops/service-constants.js +129 -0
- package/dist/lifeops/service-constants.js.map +1 -0
- package/dist/lifeops/service-helpers-browser.d.ts +41 -0
- package/dist/lifeops/service-helpers-browser.d.ts.map +1 -0
- package/dist/lifeops/service-helpers-browser.js +290 -0
- package/dist/lifeops/service-helpers-browser.js.map +1 -0
- package/dist/lifeops/service-helpers-misc.d.ts +68 -0
- package/dist/lifeops/service-helpers-misc.d.ts.map +1 -0
- package/dist/lifeops/service-helpers-misc.js +531 -0
- package/dist/lifeops/service-helpers-misc.js.map +1 -0
- package/dist/lifeops/service-helpers-occurrence.d.ts +23 -0
- package/dist/lifeops/service-helpers-occurrence.d.ts.map +1 -0
- package/dist/lifeops/service-helpers-occurrence.js +257 -0
- package/dist/lifeops/service-helpers-occurrence.js.map +1 -0
- package/dist/lifeops/service-helpers-reminder.d.ts +260 -0
- package/dist/lifeops/service-helpers-reminder.d.ts.map +1 -0
- package/dist/lifeops/service-helpers-reminder.js +1186 -0
- package/dist/lifeops/service-helpers-reminder.js.map +1 -0
- package/dist/lifeops/service-mixin-browser.d.ts +31 -0
- package/dist/lifeops/service-mixin-browser.d.ts.map +1 -0
- package/dist/lifeops/service-mixin-browser.js +975 -0
- package/dist/lifeops/service-mixin-browser.js.map +1 -0
- package/dist/lifeops/service-mixin-calendar.d.ts +53 -0
- package/dist/lifeops/service-mixin-calendar.d.ts.map +1 -0
- package/dist/lifeops/service-mixin-calendar.js +68 -0
- package/dist/lifeops/service-mixin-calendar.js.map +1 -0
- package/dist/lifeops/service-mixin-core.d.ts +51 -0
- package/dist/lifeops/service-mixin-core.d.ts.map +1 -0
- package/dist/lifeops/service-mixin-core.js +500 -0
- package/dist/lifeops/service-mixin-core.js.map +1 -0
- package/dist/lifeops/service-mixin-definitions.d.ts +14 -0
- package/dist/lifeops/service-mixin-definitions.d.ts.map +1 -0
- package/dist/lifeops/service-mixin-definitions.js +470 -0
- package/dist/lifeops/service-mixin-definitions.js.map +1 -0
- package/dist/lifeops/service-mixin-discord.d.ts +49 -0
- package/dist/lifeops/service-mixin-discord.d.ts.map +1 -0
- package/dist/lifeops/service-mixin-discord.js +1253 -0
- package/dist/lifeops/service-mixin-discord.js.map +1 -0
- package/dist/lifeops/service-mixin-drive.d.ts +96 -0
- package/dist/lifeops/service-mixin-drive.d.ts.map +1 -0
- package/dist/lifeops/service-mixin-drive.js +213 -0
- package/dist/lifeops/service-mixin-drive.js.map +1 -0
- package/dist/lifeops/service-mixin-email-unsubscribe.d.ts +23 -0
- package/dist/lifeops/service-mixin-email-unsubscribe.d.ts.map +1 -0
- package/dist/lifeops/service-mixin-email-unsubscribe.js +27 -0
- package/dist/lifeops/service-mixin-email-unsubscribe.js.map +1 -0
- package/dist/lifeops/service-mixin-gmail.d.ts +43 -0
- package/dist/lifeops/service-mixin-gmail.d.ts.map +1 -0
- package/dist/lifeops/service-mixin-gmail.js +727 -0
- package/dist/lifeops/service-mixin-gmail.js.map +1 -0
- package/dist/lifeops/service-mixin-goals.d.ts +22 -0
- package/dist/lifeops/service-mixin-goals.d.ts.map +1 -0
- package/dist/lifeops/service-mixin-goals.js +884 -0
- package/dist/lifeops/service-mixin-goals.js.map +1 -0
- package/dist/lifeops/service-mixin-google.d.ts +13 -0
- package/dist/lifeops/service-mixin-google.d.ts.map +1 -0
- package/dist/lifeops/service-mixin-google.js +398 -0
- package/dist/lifeops/service-mixin-google.js.map +1 -0
- package/dist/lifeops/service-mixin-health.d.ts +27 -0
- package/dist/lifeops/service-mixin-health.d.ts.map +1 -0
- package/dist/lifeops/service-mixin-health.js +670 -0
- package/dist/lifeops/service-mixin-health.js.map +1 -0
- package/dist/lifeops/service-mixin-imessage.d.ts +106 -0
- package/dist/lifeops/service-mixin-imessage.d.ts.map +1 -0
- package/dist/lifeops/service-mixin-imessage.js +303 -0
- package/dist/lifeops/service-mixin-imessage.js.map +1 -0
- package/dist/lifeops/service-mixin-inbox.d.ts +55 -0
- package/dist/lifeops/service-mixin-inbox.d.ts.map +1 -0
- package/dist/lifeops/service-mixin-inbox.js +597 -0
- package/dist/lifeops/service-mixin-inbox.js.map +1 -0
- package/dist/lifeops/service-mixin-relationships.d.ts +65 -0
- package/dist/lifeops/service-mixin-relationships.d.ts.map +1 -0
- package/dist/lifeops/service-mixin-relationships.js +150 -0
- package/dist/lifeops/service-mixin-relationships.js.map +1 -0
- package/dist/lifeops/service-mixin-reminders.d.ts +62 -0
- package/dist/lifeops/service-mixin-reminders.d.ts.map +1 -0
- package/dist/lifeops/service-mixin-reminders.js +4003 -0
- package/dist/lifeops/service-mixin-reminders.js.map +1 -0
- package/dist/lifeops/service-mixin-scheduling.d.ts +53 -0
- package/dist/lifeops/service-mixin-scheduling.d.ts.map +1 -0
- package/dist/lifeops/service-mixin-scheduling.js +405 -0
- package/dist/lifeops/service-mixin-scheduling.js.map +1 -0
- package/dist/lifeops/service-mixin-screentime.d.ts +71 -0
- package/dist/lifeops/service-mixin-screentime.d.ts.map +1 -0
- package/dist/lifeops/service-mixin-screentime.js +530 -0
- package/dist/lifeops/service-mixin-screentime.js.map +1 -0
- package/dist/lifeops/service-mixin-signal.d.ts +74 -0
- package/dist/lifeops/service-mixin-signal.d.ts.map +1 -0
- package/dist/lifeops/service-mixin-signal.js +214 -0
- package/dist/lifeops/service-mixin-signal.js.map +1 -0
- package/dist/lifeops/service-mixin-sleep.d.ts +68 -0
- package/dist/lifeops/service-mixin-sleep.d.ts.map +1 -0
- package/dist/lifeops/service-mixin-sleep.js +43 -0
- package/dist/lifeops/service-mixin-sleep.js.map +1 -0
- package/dist/lifeops/service-mixin-status.d.ts +31 -0
- package/dist/lifeops/service-mixin-status.d.ts.map +1 -0
- package/dist/lifeops/service-mixin-status.js +373 -0
- package/dist/lifeops/service-mixin-status.js.map +1 -0
- package/dist/lifeops/service-mixin-subscriptions.d.ts +101 -0
- package/dist/lifeops/service-mixin-subscriptions.d.ts.map +1 -0
- package/dist/lifeops/service-mixin-subscriptions.js +50 -0
- package/dist/lifeops/service-mixin-subscriptions.js.map +1 -0
- package/dist/lifeops/service-mixin-telegram.d.ts +104 -0
- package/dist/lifeops/service-mixin-telegram.d.ts.map +1 -0
- package/dist/lifeops/service-mixin-telegram.js +280 -0
- package/dist/lifeops/service-mixin-telegram.js.map +1 -0
- package/dist/lifeops/service-mixin-travel.d.ts +66 -0
- package/dist/lifeops/service-mixin-travel.d.ts.map +1 -0
- package/dist/lifeops/service-mixin-travel.js +275 -0
- package/dist/lifeops/service-mixin-travel.js.map +1 -0
- package/dist/lifeops/service-mixin-whatsapp.d.ts +96 -0
- package/dist/lifeops/service-mixin-whatsapp.d.ts.map +1 -0
- package/dist/lifeops/service-mixin-whatsapp.js +186 -0
- package/dist/lifeops/service-mixin-whatsapp.js.map +1 -0
- package/dist/lifeops/service-mixin-workflows.d.ts +15 -0
- package/dist/lifeops/service-mixin-workflows.d.ts.map +1 -0
- package/dist/lifeops/service-mixin-workflows.js +710 -0
- package/dist/lifeops/service-mixin-workflows.js.map +1 -0
- package/dist/lifeops/service-mixin-x-read.d.ts +31 -0
- package/dist/lifeops/service-mixin-x-read.d.ts.map +1 -0
- package/dist/lifeops/service-mixin-x-read.js +267 -0
- package/dist/lifeops/service-mixin-x-read.js.map +1 -0
- package/dist/lifeops/service-mixin-x.d.ts +66 -0
- package/dist/lifeops/service-mixin-x.d.ts.map +1 -0
- package/dist/lifeops/service-mixin-x.js +501 -0
- package/dist/lifeops/service-mixin-x.js.map +1 -0
- package/dist/lifeops/service-normalize-connector.d.ts +19 -0
- package/dist/lifeops/service-normalize-connector.d.ts.map +1 -0
- package/dist/lifeops/service-normalize-connector.js +816 -0
- package/dist/lifeops/service-normalize-connector.js.map +1 -0
- package/dist/lifeops/service-normalize-gmail.d.ts +11 -0
- package/dist/lifeops/service-normalize-gmail.d.ts.map +1 -0
- package/dist/lifeops/service-normalize-gmail.js +85 -0
- package/dist/lifeops/service-normalize-gmail.js.map +1 -0
- package/dist/lifeops/service-normalize-task.d.ts +9 -0
- package/dist/lifeops/service-normalize-task.d.ts.map +1 -0
- package/dist/lifeops/service-normalize-task.js +567 -0
- package/dist/lifeops/service-normalize-task.js.map +1 -0
- package/dist/lifeops/service-normalize.d.ts +9 -0
- package/dist/lifeops/service-normalize.d.ts.map +1 -0
- package/dist/lifeops/service-normalize.js +53 -0
- package/dist/lifeops/service-normalize.js.map +1 -0
- package/dist/lifeops/service-types.d.ts +75 -0
- package/dist/lifeops/service-types.d.ts.map +1 -0
- package/dist/lifeops/service-types.js +5 -0
- package/dist/lifeops/service-types.js.map +1 -0
- package/dist/lifeops/service.d.ts +482 -0
- package/dist/lifeops/service.d.ts.map +1 -0
- package/dist/lifeops/service.js +62 -0
- package/dist/lifeops/service.js.map +1 -0
- package/dist/lifeops/signal-runtime-config.d.ts +13 -0
- package/dist/lifeops/signal-runtime-config.d.ts.map +1 -0
- package/dist/lifeops/signal-runtime-config.js +44 -0
- package/dist/lifeops/signal-runtime-config.js.map +1 -0
- package/dist/lifeops/signals/bus.d.ts +78 -0
- package/dist/lifeops/signals/bus.d.ts.map +1 -0
- package/dist/lifeops/signals/bus.js +117 -0
- package/dist/lifeops/signals/bus.js.map +1 -0
- package/dist/lifeops/sql.d.ts +65 -0
- package/dist/lifeops/sql.d.ts.map +1 -0
- package/dist/lifeops/sql.js +182 -0
- package/dist/lifeops/sql.js.map +1 -0
- package/dist/lifeops/stretch-decider.d.ts +73 -0
- package/dist/lifeops/stretch-decider.d.ts.map +1 -0
- package/dist/lifeops/stretch-decider.js +49 -0
- package/dist/lifeops/stretch-decider.js.map +1 -0
- package/dist/lifeops/telemetry-mapping.d.ts +14 -0
- package/dist/lifeops/telemetry-mapping.d.ts.map +1 -0
- package/dist/lifeops/telemetry-mapping.js +115 -0
- package/dist/lifeops/telemetry-mapping.js.map +1 -0
- package/dist/lifeops/telemetry-retention.d.ts +21 -0
- package/dist/lifeops/telemetry-retention.d.ts.map +1 -0
- package/dist/lifeops/telemetry-retention.js +13 -0
- package/dist/lifeops/telemetry-retention.js.map +1 -0
- package/dist/lifeops/time/timezone.d.ts +4 -0
- package/dist/lifeops/time/timezone.d.ts.map +1 -0
- package/dist/lifeops/time/timezone.js +154 -0
- package/dist/lifeops/time/timezone.js.map +1 -0
- package/dist/lifeops/time-util.d.ts +10 -0
- package/dist/lifeops/time-util.d.ts.map +1 -0
- package/dist/lifeops/time-util.js +14 -0
- package/dist/lifeops/time-util.js.map +1 -0
- package/dist/lifeops/time.d.ts +17 -0
- package/dist/lifeops/time.d.ts.map +1 -0
- package/dist/lifeops/time.js +152 -0
- package/dist/lifeops/time.js.map +1 -0
- package/dist/lifeops/travel-booking.types.d.ts +46 -0
- package/dist/lifeops/travel-booking.types.d.ts.map +1 -0
- package/dist/lifeops/travel-booking.types.js +1 -0
- package/dist/lifeops/travel-booking.types.js.map +1 -0
- package/dist/lifeops/triggers/schedule-once.d.ts +19 -0
- package/dist/lifeops/triggers/schedule-once.d.ts.map +1 -0
- package/dist/lifeops/triggers/schedule-once.js +99 -0
- package/dist/lifeops/triggers/schedule-once.js.map +1 -0
- package/dist/lifeops/validate/coding-task-request.d.ts +18 -0
- package/dist/lifeops/validate/coding-task-request.d.ts.map +1 -0
- package/dist/lifeops/validate/coding-task-request.js +16 -0
- package/dist/lifeops/validate/coding-task-request.js.map +1 -0
- package/dist/lifeops/voice/grounded-reply.d.ts +41 -0
- package/dist/lifeops/voice/grounded-reply.d.ts.map +1 -0
- package/dist/lifeops/voice/grounded-reply.js +24 -0
- package/dist/lifeops/voice/grounded-reply.js.map +1 -0
- package/dist/lifeops/voice-affect.d.ts +79 -0
- package/dist/lifeops/voice-affect.d.ts.map +1 -0
- package/dist/lifeops/voice-affect.js +253 -0
- package/dist/lifeops/voice-affect.js.map +1 -0
- package/dist/lifeops/wave1-types.d.ts +125 -0
- package/dist/lifeops/wave1-types.d.ts.map +1 -0
- package/dist/lifeops/wave1-types.js +1 -0
- package/dist/lifeops/wave1-types.js.map +1 -0
- package/dist/lifeops/work-threads/field-evaluator-thread-ops.d.ts +33 -0
- package/dist/lifeops/work-threads/field-evaluator-thread-ops.d.ts.map +1 -0
- package/dist/lifeops/work-threads/field-evaluator-thread-ops.js +226 -0
- package/dist/lifeops/work-threads/field-evaluator-thread-ops.js.map +1 -0
- package/dist/lifeops/work-threads/index.d.ts +3 -0
- package/dist/lifeops/work-threads/index.d.ts.map +1 -0
- package/dist/lifeops/work-threads/index.js +7 -0
- package/dist/lifeops/work-threads/index.js.map +1 -0
- package/dist/lifeops/work-threads/store.d.ts +91 -0
- package/dist/lifeops/work-threads/store.d.ts.map +1 -0
- package/dist/lifeops/work-threads/store.js +245 -0
- package/dist/lifeops/work-threads/store.js.map +1 -0
- package/dist/lifeops/work-threads/types.d.ts +58 -0
- package/dist/lifeops/work-threads/types.d.ts.map +1 -0
- package/dist/lifeops/work-threads/types.js +1 -0
- package/dist/lifeops/work-threads/types.js.map +1 -0
- package/dist/platform/host.d.ts +16 -0
- package/dist/platform/host.d.ts.map +1 -0
- package/dist/platform/host.js +22 -0
- package/dist/platform/host.js.map +1 -0
- package/dist/platform/index.d.ts +3 -0
- package/dist/platform/index.d.ts.map +1 -0
- package/dist/platform/index.js +3 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/platform/lifeops-github.d.ts +15 -0
- package/dist/platform/lifeops-github.d.ts.map +1 -0
- package/dist/platform/lifeops-github.js +146 -0
- package/dist/platform/lifeops-github.js.map +1 -0
- package/dist/plugin.d.ts +106 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +989 -0
- package/dist/plugin.js.map +1 -0
- package/dist/provider.d.ts +4 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +108 -0
- package/dist/provider.js.map +1 -0
- package/dist/providers/activity-profile.d.ts +3 -0
- package/dist/providers/activity-profile.d.ts.map +1 -0
- package/dist/providers/activity-profile.js +140 -0
- package/dist/providers/activity-profile.js.map +1 -0
- package/dist/providers/cross-channel-context.d.ts +29 -0
- package/dist/providers/cross-channel-context.d.ts.map +1 -0
- package/dist/providers/cross-channel-context.js +206 -0
- package/dist/providers/cross-channel-context.js.map +1 -0
- package/dist/providers/first-run.d.ts +22 -0
- package/dist/providers/first-run.d.ts.map +1 -0
- package/dist/providers/first-run.js +93 -0
- package/dist/providers/first-run.js.map +1 -0
- package/dist/providers/health.d.ts +2 -0
- package/dist/providers/health.d.ts.map +1 -0
- package/dist/providers/health.js +14 -0
- package/dist/providers/health.js.map +1 -0
- package/dist/providers/inbox-triage.d.ts +3 -0
- package/dist/providers/inbox-triage.d.ts.map +1 -0
- package/dist/providers/inbox-triage.js +134 -0
- package/dist/providers/inbox-triage.js.map +1 -0
- package/dist/providers/lifeops.d.ts +3 -0
- package/dist/providers/lifeops.d.ts.map +1 -0
- package/dist/providers/lifeops.js +548 -0
- package/dist/providers/lifeops.js.map +1 -0
- package/dist/providers/pending-prompts.d.ts +38 -0
- package/dist/providers/pending-prompts.d.ts.map +1 -0
- package/dist/providers/pending-prompts.js +81 -0
- package/dist/providers/pending-prompts.js.map +1 -0
- package/dist/providers/recent-task-states.d.ts +52 -0
- package/dist/providers/recent-task-states.d.ts.map +1 -0
- package/dist/providers/recent-task-states.js +166 -0
- package/dist/providers/recent-task-states.js.map +1 -0
- package/dist/providers/room-policy.d.ts +16 -0
- package/dist/providers/room-policy.d.ts.map +1 -0
- package/dist/providers/room-policy.js +71 -0
- package/dist/providers/room-policy.js.map +1 -0
- package/dist/providers/work-threads.d.ts +3 -0
- package/dist/providers/work-threads.d.ts.map +1 -0
- package/dist/providers/work-threads.js +97 -0
- package/dist/providers/work-threads.js.map +1 -0
- package/dist/public.d.ts +3 -0
- package/dist/public.d.ts.map +1 -0
- package/dist/public.js +17 -0
- package/dist/public.js.map +1 -0
- package/dist/routes/cloud-features-routes.d.ts +9 -0
- package/dist/routes/cloud-features-routes.d.ts.map +1 -0
- package/dist/routes/cloud-features-routes.js +164 -0
- package/dist/routes/cloud-features-routes.js.map +1 -0
- package/dist/routes/entities.d.ts +14 -0
- package/dist/routes/entities.d.ts.map +1 -0
- package/dist/routes/entities.js +203 -0
- package/dist/routes/entities.js.map +1 -0
- package/dist/routes/lifeops-routes.d.ts +20 -0
- package/dist/routes/lifeops-routes.d.ts.map +1 -0
- package/dist/routes/lifeops-routes.js +2337 -0
- package/dist/routes/lifeops-routes.js.map +1 -0
- package/dist/routes/plugin.d.ts +9 -0
- package/dist/routes/plugin.d.ts.map +1 -0
- package/dist/routes/plugin.js +568 -0
- package/dist/routes/plugin.js.map +1 -0
- package/dist/routes/relationships.d.ts +13 -0
- package/dist/routes/relationships.d.ts.map +1 -0
- package/dist/routes/relationships.js +195 -0
- package/dist/routes/relationships.js.map +1 -0
- package/dist/routes/scheduled-tasks.d.ts +102 -0
- package/dist/routes/scheduled-tasks.d.ts.map +1 -0
- package/dist/routes/scheduled-tasks.js +322 -0
- package/dist/routes/scheduled-tasks.js.map +1 -0
- package/dist/routes/sleep-routes.d.ts +3 -0
- package/dist/routes/sleep-routes.d.ts.map +1 -0
- package/dist/routes/sleep-routes.js +33 -0
- package/dist/routes/sleep-routes.js.map +1 -0
- package/dist/routes/travel-provider-relay-routes.d.ts +2 -0
- package/dist/routes/travel-provider-relay-routes.d.ts.map +1 -0
- package/dist/routes/travel-provider-relay-routes.js +7 -0
- package/dist/routes/travel-provider-relay-routes.js.map +1 -0
- package/dist/routes/website-blocker-routes.d.ts +6 -0
- package/dist/routes/website-blocker-routes.d.ts.map +1 -0
- package/dist/routes/website-blocker-routes.js +218 -0
- package/dist/routes/website-blocker-routes.js.map +1 -0
- package/dist/security/action-confirmation.d.ts +12 -0
- package/dist/security/action-confirmation.d.ts.map +1 -0
- package/dist/security/action-confirmation.js +36 -0
- package/dist/security/action-confirmation.js.map +1 -0
- package/dist/service.d.ts +34 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +111 -0
- package/dist/service.js.map +1 -0
- package/dist/travel-time/calendar-create.d.ts +17 -0
- package/dist/travel-time/calendar-create.d.ts.map +1 -0
- package/dist/travel-time/calendar-create.js +28 -0
- package/dist/travel-time/calendar-create.js.map +1 -0
- package/dist/travel-time/service.d.ts +114 -0
- package/dist/travel-time/service.d.ts.map +1 -0
- package/dist/travel-time/service.js +209 -0
- package/dist/travel-time/service.js.map +1 -0
- package/dist/types/app-blocker-settings-card.d.ts +2 -0
- package/dist/types/app-blocker-settings-card.d.ts.map +1 -0
- package/dist/types/app-blocker-settings-card.js +1 -0
- package/dist/types/app-blocker-settings-card.js.map +1 -0
- package/dist/types/briefing.d.ts +59 -0
- package/dist/types/briefing.d.ts.map +1 -0
- package/dist/types/briefing.js +1 -0
- package/dist/types/briefing.js.map +1 -0
- package/dist/types/document-request.d.ts +41 -0
- package/dist/types/document-request.d.ts.map +1 -0
- package/dist/types/document-request.js +1 -0
- package/dist/types/document-request.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/website-blocker-settings-card.d.ts +2 -0
- package/dist/types/website-blocker-settings-card.d.ts.map +1 -0
- package/dist/types/website-blocker-settings-card.js +1 -0
- package/dist/types/website-blocker-settings-card.js.map +1 -0
- package/dist/ui.d.ts +13 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +25 -0
- package/dist/ui.js.map +1 -0
- package/dist/utils/format-duration.d.ts +2 -0
- package/dist/utils/format-duration.d.ts.map +1 -0
- package/dist/utils/format-duration.js +13 -0
- package/dist/utils/format-duration.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/lifeops-url.d.ts +3 -0
- package/dist/utils/lifeops-url.d.ts.map +1 -0
- package/dist/utils/lifeops-url.js +28 -0
- package/dist/utils/lifeops-url.js.map +1 -0
- package/dist/website-blocker/chat-integration/block-activator.d.ts +32 -0
- package/dist/website-blocker/chat-integration/block-activator.d.ts.map +1 -0
- package/dist/website-blocker/chat-integration/block-activator.js +30 -0
- package/dist/website-blocker/chat-integration/block-activator.js.map +1 -0
- package/dist/website-blocker/chat-integration/block-rule-reconciler.d.ts +7 -0
- package/dist/website-blocker/chat-integration/block-rule-reconciler.d.ts.map +1 -0
- package/dist/website-blocker/chat-integration/block-rule-reconciler.js +115 -0
- package/dist/website-blocker/chat-integration/block-rule-reconciler.js.map +1 -0
- package/dist/website-blocker/chat-integration/block-rule-schema.d.ts +39 -0
- package/dist/website-blocker/chat-integration/block-rule-schema.d.ts.map +1 -0
- package/dist/website-blocker/chat-integration/block-rule-schema.js +133 -0
- package/dist/website-blocker/chat-integration/block-rule-schema.js.map +1 -0
- package/dist/website-blocker/chat-integration/block-rule-service.d.ts +21 -0
- package/dist/website-blocker/chat-integration/block-rule-service.d.ts.map +1 -0
- package/dist/website-blocker/chat-integration/block-rule-service.js +230 -0
- package/dist/website-blocker/chat-integration/block-rule-service.js.map +1 -0
- package/dist/website-blocker/chat-integration/harsh-mode-check.d.ts +13 -0
- package/dist/website-blocker/chat-integration/harsh-mode-check.d.ts.map +1 -0
- package/dist/website-blocker/chat-integration/harsh-mode-check.js +22 -0
- package/dist/website-blocker/chat-integration/harsh-mode-check.js.map +1 -0
- package/dist/website-blocker/chat-integration/index.d.ts +5 -0
- package/dist/website-blocker/chat-integration/index.d.ts.map +1 -0
- package/dist/website-blocker/chat-integration/index.js +26 -0
- package/dist/website-blocker/chat-integration/index.js.map +1 -0
- package/dist/website-blocker/proactive-block-bridge.d.ts +75 -0
- package/dist/website-blocker/proactive-block-bridge.d.ts.map +1 -0
- package/dist/website-blocker/proactive-block-bridge.js +154 -0
- package/dist/website-blocker/proactive-block-bridge.js.map +1 -0
- package/dist/website-blocker/public.d.ts +12 -0
- package/dist/website-blocker/public.d.ts.map +1 -0
- package/dist/website-blocker/public.js +51 -0
- package/dist/website-blocker/public.js.map +1 -0
- package/package.json +28 -28
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lifeops/service-mixin-reminders.ts"],"sourcesContent":["import crypto from \"node:crypto\";\nimport {\n loadOwnerContactRoutingHints,\n loadOwnerContactsConfig,\n type OwnerContactRoutingHint,\n registerEscalationChannel,\n resolveOwnerContactWithFallback,\n} from \"@elizaos/agent\";\nimport {\n type IAgentRuntime,\n ModelType,\n parseJsonModelRecord,\n resolveOptimizedPromptForRuntime,\n runWithTrajectoryContext,\n ServiceType,\n} from \"@elizaos/core\";\nimport {\n getSelfControlStatus,\n startSelfControlBlock,\n stopSelfControlBlock,\n} from \"@elizaos/plugin-blocker/services/website-blocker/engine\";\nimport type {\n SyncLifeOpsScheduleObservationInput,\n SyncLifeOpsScheduleObservationsRequest,\n SyncLifeOpsScheduleObservationsResponse,\n} from \"@elizaos/plugin-elizacloud/cloud/lifeops-schedule-sync-contracts\";\nimport {\n buildSleepRecapFromSchedule,\n deriveSleepWakeEvents,\n type LifeOpsDerivedEvent,\n normalizeHealthSignal,\n shouldRunMorningCheckinFromSleepCycle,\n shouldRunNightCheckinFromSleepCycle,\n} from \"@elizaos/plugin-health\";\nimport {\n readTwilioCredentialsFromEnv,\n sendTwilioSms,\n sendTwilioVoiceCall,\n} from \"@elizaos/plugin-phone/twilio\";\nimport type { LifeOpsScheduleMealLabel } from \"@elizaos/shared\";\nimport { readProfileFromMetadata } from \"../activity-profile/profile-metadata.js\";\nimport type { ActivityProfile } from \"../activity-profile/types.js\";\nimport type {\n AcknowledgeLifeOpsReminderRequest,\n CaptureLifeOpsActivitySignalRequest,\n CaptureLifeOpsManualOverrideRequest,\n CaptureLifeOpsPhoneConsentRequest,\n LifeOpsActivitySignal,\n LifeOpsCalendarEvent,\n LifeOpsChannelPolicy,\n LifeOpsCircadianState,\n LifeOpsManualOverrideResult,\n LifeOpsOccurrence,\n LifeOpsOccurrenceView,\n LifeOpsOwnership,\n LifeOpsReminderAttempt,\n LifeOpsReminderAttemptOutcome,\n LifeOpsReminderChannel,\n LifeOpsReminderInspection,\n LifeOpsReminderIntensity,\n LifeOpsReminderPlan,\n LifeOpsReminderPreference,\n LifeOpsReminderProcessingResult,\n LifeOpsReminderStep,\n LifeOpsReminderUrgency,\n LifeOpsSubjectType,\n LifeOpsTaskDefinition,\n LifeOpsWorkflowDefinition,\n LifeOpsWorkflowRun,\n SetLifeOpsReminderPreferenceRequest,\n SnoozeLifeOpsOccurrenceRequest,\n UpsertLifeOpsChannelPolicyRequest,\n} from \"../contracts/index.js\";\nimport {\n LIFEOPS_CHANNEL_TYPES,\n LIFEOPS_CIRCADIAN_STATES,\n LIFEOPS_MANUAL_OVERRIDE_KINDS,\n LIFEOPS_UNCLEAR_REASONS,\n} from \"../contracts/index.js\";\nimport {\n buildNativeAppleReminderMetadata,\n createNativeAppleReminderLikeItem,\n deleteNativeAppleReminderLikeItem,\n readNativeAppleReminderMetadata,\n updateNativeAppleReminderLikeItem,\n} from \"./apple-reminders.js\";\nimport {\n CheckinService,\n type CheckinSourceService,\n} from \"./checkin/checkin-service.js\";\nimport { resolveCheckinSchedule } from \"./checkin/schedule-resolver.js\";\nimport {\n type ContactRoutePurpose,\n resolveContactRouteCandidates,\n} from \"./contact-route-policy.js\";\nimport {\n computeAdaptiveWindowPolicy,\n resolveDefaultTimeZone,\n windowPolicyMatchesDefaults,\n} from \"./defaults.js\";\nimport { materializeDefinitionOccurrences } from \"./engine.js\";\nimport { REMINDER_DISPATCH_INSTRUCTIONS } from \"./optimized-prompt-instructions.js\";\nimport { refreshLifeOpsRelativeTime } from \"./relative-time.js\";\nimport {\n createLifeOpsActivitySignal,\n createLifeOpsChannelPolicy,\n createLifeOpsReminderAttempt,\n createLifeOpsReminderPlan,\n createLifeOpsWebsiteAccessGrant,\n type LifeOpsScheduleMergedStateRecord,\n type LifeOpsScheduleObservationRecord,\n} from \"./repository.js\";\nimport { refreshLifeOpsScheduleInsight } from \"./schedule-insight.js\";\nimport {\n deriveLocalScheduleObservations,\n isFreshCloudMergedState,\n mergeScheduleObservations,\n preferEffectiveMergedState,\n recordsFromSyncRequest,\n resolveScheduleDeviceIdentity,\n SCHEDULE_CLOUD_SYNC_TTL_MS,\n SCHEDULE_OBSERVATION_LOOKBACK_MS,\n} from \"./schedule-state.js\";\nimport { processDueScheduledTasks } from \"./scheduled-task/scheduler.js\";\nimport {\n DEFAULT_REMINDER_INTENSITY,\n DEFAULT_REMINDER_PROCESS_LIMIT,\n DEFAULT_WORKFLOW_PROCESS_LIMIT,\n GLOBAL_REMINDER_PREFERENCE_CHANNEL_REF,\n OVERVIEW_HORIZON_MINUTES,\n PROACTIVE_TASK_QUERY_TAGS,\n REMINDER_ESCALATION_ACTIVITY_ACTIVE_METADATA_KEY,\n REMINDER_ESCALATION_ACTIVITY_PLATFORM_METADATA_KEY,\n REMINDER_ESCALATION_CHANNELS_METADATA_KEY,\n REMINDER_ESCALATION_INDEX_METADATA_KEY,\n REMINDER_ESCALATION_LAST_ATTEMPT_AT_METADATA_KEY,\n REMINDER_ESCALATION_LAST_CHANNEL_METADATA_KEY,\n REMINDER_ESCALATION_LAST_OUTCOME_METADATA_KEY,\n REMINDER_ESCALATION_REASON_METADATA_KEY,\n REMINDER_ESCALATION_RESOLUTION_METADATA_KEY,\n REMINDER_ESCALATION_RESOLUTION_NOTE_METADATA_KEY,\n REMINDER_ESCALATION_RESOLVED_AT_METADATA_KEY,\n REMINDER_ESCALATION_STARTED_AT_METADATA_KEY,\n REMINDER_INTENSITY_METADATA_KEY,\n REMINDER_INTENSITY_NOTE_METADATA_KEY,\n REMINDER_INTENSITY_UPDATED_AT_METADATA_KEY,\n REMINDER_LIFECYCLE_METADATA_KEY,\n REMINDER_PREFERENCE_SCOPE_METADATA_KEY,\n REMINDER_REVIEW_AFTER_MINUTES_METADATA_KEY,\n REMINDER_REVIEW_AT_METADATA_KEY,\n REMINDER_REVIEW_CLASSIFIER_SOURCE_METADATA_KEY,\n REMINDER_REVIEW_DECISION_METADATA_KEY,\n REMINDER_REVIEW_ESCALATED_AT_METADATA_KEY,\n REMINDER_REVIEW_ESCALATED_ATTEMPT_ID_METADATA_KEY,\n REMINDER_REVIEW_ESCALATED_CHANNEL_METADATA_KEY,\n REMINDER_REVIEW_REASON_METADATA_KEY,\n REMINDER_REVIEW_RESPONDED_AT_METADATA_KEY,\n REMINDER_REVIEW_RESPONSE_TEXT_METADATA_KEY,\n REMINDER_REVIEW_SEMANTIC_REASON_METADATA_KEY,\n REMINDER_REVIEW_STATUS_METADATA_KEY,\n} from \"./service-constants.js\";\nimport {\n buildActiveReminders,\n isReminderChannelAllowedForUrgency,\n isWithinQuietHours as isWithinQuietHoursPolicy,\n} from \"./service-helpers-misc.js\";\nimport { computeDefinitionPerformance } from \"./service-helpers-occurrence.js\";\nimport {\n applyReminderIntensityToPlan,\n buildReminderEnforcementState,\n buildReminderResponseClaim,\n classifyReminderOwnerResponse,\n decideReminderReviewTransition,\n isReminderChannel,\n isReminderReviewClosed,\n normalizeActivitySignalSource as normalizeReminderActivitySignalSource,\n normalizeActivitySignalState as normalizeReminderActivitySignalState,\n normalizeReminderIntensityInput,\n normalizeOptionalIdleState as normalizeReminderOptionalIdleState,\n parseReminderOwnerResponseSemanticClassification,\n type ReminderReviewResponseEvidence,\n type ReminderRouteCandidate,\n readReminderAttemptLifecycle,\n readReminderEscalationProfile,\n readReminderPreferenceSettingFromMetadata,\n readReminderReviewAt,\n resolveReminderDeliveryUrgency,\n resolveReminderEscalationDelayMinutes,\n resolveReminderEscalationProfileDecision,\n resolveReminderReviewDelayMinutes,\n shouldDeferReminderUntilComputerActive,\n shouldDeliverReminderForIntensity,\n shouldEscalateImmediately,\n withReminderPreferenceMetadata,\n} from \"./service-helpers-reminder.js\";\nimport type {\n Constructor,\n LifeOpsServiceBase,\n MixinClass,\n} from \"./service-mixin-core.js\";\nimport {\n fail,\n lifeOpsErrorMessage,\n normalizeEnumValue,\n normalizeOptionalString,\n requireNonEmptyString,\n} from \"./service-normalize.js\";\nimport type { ReminderActivityProfileSnapshot } from \"./service-types.js\";\nimport {\n DEFAULT_TELEMETRY_RETENTION_DAYS,\n runTelemetryRetention,\n} from \"./telemetry-retention.js\";\nimport { addMinutes, getZonedDateParts } from \"./time.js\";\n\nexport { REMINDER_DISPATCH_INSTRUCTIONS } from \"./optimized-prompt-instructions.js\";\n\nconst LIFEOPS_SCHEDULE_DEVICE_KINDS = [\n \"iphone\",\n \"ipad\",\n \"mac\",\n \"watch\",\n \"cloud\",\n \"unknown\",\n] as const;\n\nconst DEFAULT_SCHEDULED_TASK_PROCESS_LIMIT = 25;\n\ntype AdaptiveWindowProfile = Pick<\n ActivityProfile,\n | \"typicalWakeHour\"\n | \"typicalFirstActiveHour\"\n | \"typicalLastActiveHour\"\n | \"typicalSleepHour\"\n>;\n\nfunction normalizeHour(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n\nfunction hourFromIso(\n value: string | null | undefined,\n timezone: string,\n): number | null {\n if (!value) {\n return null;\n }\n const date = new Date(value);\n if (!Number.isFinite(date.getTime())) {\n return null;\n }\n const parts = getZonedDateParts(date, timezone);\n return parts.hour + parts.minute / 60;\n}\n\nfunction buildAdaptiveWindowProfile(args: {\n profile: ActivityProfile | null;\n schedule: LifeOpsScheduleMergedStateRecord | null;\n timeZone: string;\n}): AdaptiveWindowProfile | null {\n const baseline = args.schedule?.baseline ?? null;\n const scheduleWakeHour =\n normalizeHour(baseline?.medianWakeLocalHour) ??\n hourFromIso(\n args.schedule?.wakeAt ?? args.schedule?.firstActiveAt,\n args.timeZone,\n );\n const scheduleFirstActiveHour =\n hourFromIso(args.schedule?.firstActiveAt, args.timeZone) ??\n scheduleWakeHour;\n const scheduleLastActiveHour = hourFromIso(\n args.schedule?.lastActiveAt,\n args.timeZone,\n );\n const scheduleSleepHour = normalizeHour(baseline?.medianBedtimeLocalHour);\n\n const adaptiveProfile: AdaptiveWindowProfile = {\n typicalWakeHour: scheduleWakeHour ?? args.profile?.typicalWakeHour ?? null,\n typicalFirstActiveHour:\n scheduleFirstActiveHour ?? args.profile?.typicalFirstActiveHour ?? null,\n typicalLastActiveHour:\n scheduleLastActiveHour ?? args.profile?.typicalLastActiveHour ?? null,\n typicalSleepHour:\n scheduleSleepHour ?? args.profile?.typicalSleepHour ?? null,\n };\n\n return Object.values(adaptiveProfile).some((value) => value !== null)\n ? adaptiveProfile\n : null;\n}\n\n// ---------------------------------------------------------------------------\n// Local types\n// ---------------------------------------------------------------------------\n\ntype RuntimeMessageTarget = Parameters<IAgentRuntime[\"sendMessageToTarget\"]>[0];\ntype ReminderAttemptLifecycle = \"plan\" | \"escalation\";\n\ntype RuntimeOwnerContactResolution = {\n sourceOfTruth: \"config\" | \"relationships\" | \"config+relationships\";\n preferredCommunicationChannel: string | null;\n platformIdentities: Array<{\n platform: string;\n handle: string;\n status?: string;\n }>;\n lastResponseAt: string | null;\n lastResponseChannel: string | null;\n};\n\ntype LifeOpsDefinitionRecord = {\n definition: LifeOpsTaskDefinition;\n reminderPlan: LifeOpsReminderPlan | null;\n performance: ReturnType<typeof computeDefinitionPerformance>;\n};\n\ntype LifeOpsGoalRecord = {\n goal: Awaited<\n ReturnType<import(\"./repository.js\").LifeOpsRepository[\"getGoal\"]>\n >;\n links: Awaited<\n ReturnType<\n import(\"./repository.js\").LifeOpsRepository[\"listGoalLinksForGoal\"]\n >\n >;\n};\n\ntype ScheduledWorkflowRunner = {\n runDueWorkflows(args: {\n now: string;\n limit: number;\n }): Promise<LifeOpsWorkflowRun[]>;\n runDueEventWorkflows(args: {\n now: string;\n limit: number;\n lifeOpsEvents?: LifeOpsDerivedEvent[];\n }): Promise<LifeOpsWorkflowRun[]>;\n};\n\nexport interface LifeOpsReminderService {\n getReminderPreference(\n definitionId?: string | null,\n ): Promise<LifeOpsReminderPreference>;\n setReminderPreference(\n request: SetLifeOpsReminderPreferenceRequest,\n ): Promise<LifeOpsReminderPreference>;\n captureActivitySignal(\n request: CaptureLifeOpsActivitySignalRequest,\n ): Promise<LifeOpsActivitySignal>;\n captureManualOverride(\n request: CaptureLifeOpsManualOverrideRequest,\n ): Promise<LifeOpsManualOverrideResult>;\n listActivitySignals(args?: {\n sinceAt?: string | null;\n limit?: number | null;\n states?: LifeOpsActivitySignal[\"state\"][] | null;\n }): Promise<LifeOpsActivitySignal[]>;\n upsertChannelPolicy(\n request: UpsertLifeOpsChannelPolicyRequest,\n ): Promise<LifeOpsChannelPolicy>;\n capturePhoneConsent(request: CaptureLifeOpsPhoneConsentRequest): Promise<{\n phoneNumber: string;\n policies: LifeOpsChannelPolicy[];\n }>;\n processReminders(request?: {\n now?: string;\n limit?: number;\n }): Promise<LifeOpsReminderProcessingResult>;\n processScheduledWork(request?: {\n now?: string;\n reminderLimit?: number;\n workflowLimit?: number;\n scheduledTaskLimit?: number;\n }): Promise<{\n now: string;\n reminderAttempts: LifeOpsReminderAttempt[];\n workflowRuns: LifeOpsWorkflowRun[];\n scheduledTaskFires: Array<Record<string, unknown>>;\n scheduledTaskCompletionTimeouts: Array<Record<string, unknown>>;\n }>;\n relockWebsiteAccessGroup(groupKey: string, now?: Date): Promise<{ ok: true }>;\n resolveWebsiteAccessCallback(\n callbackKey: string,\n now?: Date,\n ): Promise<{ ok: true }>;\n inspectReminder(\n ownerType: \"occurrence\" | \"calendar_event\",\n ownerId: string,\n ): Promise<LifeOpsReminderInspection>;\n acknowledgeReminder(\n request: AcknowledgeLifeOpsReminderRequest,\n ): Promise<{ ok: true }>;\n ingestScheduleObservations(\n request: SyncLifeOpsScheduleObservationsRequest,\n ): Promise<SyncLifeOpsScheduleObservationsResponse>;\n}\n\n// ---------------------------------------------------------------------------\n// Local helpers (copied from service.ts)\n// ---------------------------------------------------------------------------\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction mergeMetadata(\n current: Record<string, unknown>,\n updates?: Record<string, unknown>,\n): Record<string, unknown> {\n const cloned =\n updates && typeof updates === \"object\" && !Array.isArray(updates)\n ? { ...updates }\n : {};\n return { ...current, ...cloned };\n}\n\nfunction requireRecord(value: unknown, field: string): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n fail(400, `${field} must be an object`);\n }\n return { ...value } as Record<string, unknown>;\n}\n\nfunction normalizeOptionalBoolean(\n value: unknown,\n field: string,\n): boolean | null {\n if (value === undefined || value === null) return null;\n if (typeof value === \"boolean\") return value;\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n fail(400, `${field} must be a boolean`);\n}\n\nfunction normalizeIsoString(value: unknown, field: string): string {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n fail(400, `${field} must be an ISO 8601 string`);\n }\n const ms = Date.parse(value);\n if (!Number.isFinite(ms)) {\n fail(400, `${field} must be a valid ISO 8601 string`);\n }\n return value;\n}\n\nfunction normalizeOptionalIsoString(\n value: unknown,\n field: string,\n): string | null {\n if (value === undefined || value === null) return null;\n return normalizeIsoString(value, field);\n}\n\nfunction normalizePositiveInteger(value: unknown, field: string): number {\n const num = typeof value === \"string\" ? Number(value) : value;\n if (typeof num !== \"number\" || !Number.isInteger(num) || num < 1) {\n fail(400, `${field} must be a positive integer`);\n }\n return num;\n}\n\nfunction normalizeOptionalNonNegativeInteger(\n value: unknown,\n field: string,\n): number | null {\n if (value === undefined || value === null) return null;\n const num = typeof value === \"string\" ? Number(value) : value;\n if (typeof num !== \"number\" || !Number.isInteger(num) || num < 0) {\n fail(400, `${field} must be a non-negative integer`);\n }\n return num;\n}\n\nfunction normalizeOptionalRecord(\n value: unknown,\n field: string,\n): Record<string, unknown> | undefined {\n if (value === undefined) return undefined;\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n fail(400, `${field} must be an object`);\n }\n return { ...value } as Record<string, unknown>;\n}\n\nconst LIFEOPS_PRIVACY_CLASSES = [\"public\", \"private\", \"shared\"] as const;\n\nfunction normalizePhoneNumber(value: unknown, field: string): string {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n fail(400, `${field} must be a non-empty phone number string`);\n }\n const cleaned = value.replace(/[\\s\\-().]/g, \"\");\n if (!/^\\+?\\d{7,15}$/.test(cleaned)) {\n fail(400, `${field} is not a valid phone number`);\n }\n return cleaned.startsWith(\"+\") ? cleaned : `+${cleaned}`;\n}\n\nfunction normalizePrivacyClass(\n value: unknown,\n field?: string,\n fallback?: LifeOpsChannelPolicy[\"privacyClass\"],\n): LifeOpsChannelPolicy[\"privacyClass\"] {\n if (value === undefined || value === null) {\n return fallback ?? \"private\";\n }\n if (typeof value !== \"string\" || value.trim().length === 0) {\n if (fallback) return fallback;\n fail(400, `${field ?? \"privacyClass\"} must be a string`);\n }\n return normalizeEnumValue(\n value.trim(),\n field ?? \"privacyClass\",\n LIFEOPS_PRIVACY_CLASSES,\n );\n}\n\nconst LIFEOPS_OWNER_CONTACTS_LOAD_CONTEXT = {\n boundary: \"lifeops.owner_contacts\",\n operation: \"load_owner_contacts\",\n message:\n \"[lifeops] Failed to load owner contacts; using empty owner contacts config.\",\n} as const;\n\nconst LIFEOPS_SCHEDULE_MEAL_LABELS = [\"breakfast\", \"lunch\", \"dinner\"] as const;\n\nfunction normalizeOptionalScheduleMealLabel(\n value: unknown,\n field: string,\n): LifeOpsScheduleMealLabel | null {\n if (value === undefined || value === null) {\n return null;\n }\n return normalizeEnumValue(value, field, LIFEOPS_SCHEDULE_MEAL_LABELS);\n}\n\nfunction normalizeOptionalScheduleObservationSnapshot(\n value: unknown,\n field: string,\n): SyncLifeOpsScheduleObservationInput[\"snapshot\"] | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (value === null) {\n return null;\n }\n return requireRecord(value, field);\n}\n\n/** Delay between the first and second reminder-delivery attempt when the\n * runtime returns a transient send failure. Keeps the dispatcher from\n * hammering a flaky connector while still retrying within the same turn. */\nconst REMINDER_DELIVERY_RETRY_DELAY_MS = 2_000;\n\nfunction isDeliveredReminderOutcome(\n outcome: LifeOpsReminderAttemptOutcome,\n): boolean {\n return (\n outcome === \"delivered\" ||\n outcome === \"delivered_read\" ||\n outcome === \"delivered_unread\"\n );\n}\n\nfunction buildReminderSnoozeClarificationBody(title: string): string {\n return `I can snooze \"${title}\", but I need a clear time first. Reply with something like \"30 minutes\", \"1 hour\", \"tonight\", or \"tomorrow morning\".`;\n}\n\nfunction readReminderAttemptAnchorMs(attempt: LifeOpsReminderAttempt): number {\n const attempted = attempt.attemptedAt ? Date.parse(attempt.attemptedAt) : NaN;\n if (Number.isFinite(attempted)) {\n return attempted;\n }\n const scheduled = Date.parse(attempt.scheduledFor);\n return Number.isFinite(scheduled) ? scheduled : Number.NEGATIVE_INFINITY;\n}\n\nfunction readLatestPendingReminderReviewAttempt(\n attempts: LifeOpsReminderAttempt[],\n): LifeOpsReminderAttempt | null {\n return (\n attempts\n .filter(\n (attempt) =>\n isDeliveredReminderOutcome(attempt.outcome) &&\n readReminderReviewAt(attempt) !== null &&\n !isReminderReviewClosed(attempt),\n )\n .sort(\n (left, right) =>\n readReminderAttemptAnchorMs(left) -\n readReminderAttemptAnchorMs(right),\n )\n .at(-1) ?? null\n );\n}\n\nfunction buildReminderBody(args: {\n title: string;\n scheduledFor: string;\n dueAt: string | null;\n channel: LifeOpsReminderStep[\"channel\"];\n lifecycle: ReminderAttemptLifecycle;\n nearbyReminderTitles?: string[];\n}): string {\n const parts: string[] = [];\n if (args.lifecycle === \"escalation\") {\n parts.push(`Follow-up reminder: ${args.title}`);\n } else {\n parts.push(`Reminder: ${args.title}`);\n }\n if (args.dueAt) {\n parts.push(`Due: ${new Date(args.dueAt).toLocaleString()}`);\n }\n return parts.join(\"\\n\");\n}\n\n// Stretch cadence + walk-out / weekend / late-evening rules live as\n// registered gate-registry entries composed on the stretch starter task in\n// `default-packs/habit-starters.ts` (`weekend_skip`, `late_evening_skip`,\n// `stretch.walk_out_reset`). The `ScheduledTask` runner consults the gate\n// registry directly.\n\nfunction buildReminderVoiceContext(runtime: IAgentRuntime): string {\n if (!runtime.character) return \"\";\n const parts: string[] = [];\n if (runtime.character.name) {\n parts.push(`Name: ${runtime.character.name}`);\n }\n const bio: unknown = runtime.character.bio;\n if (typeof bio === \"string\" && bio.trim().length > 0) {\n parts.push(`Bio: ${bio.trim()}`);\n } else if (Array.isArray(bio)) {\n const bioText = bio\n .filter((line): line is string => typeof line === \"string\")\n .map((line) => line.trim())\n .filter(Boolean)\n .join(\" \");\n if (bioText.length > 0) {\n parts.push(`Bio: ${bioText}`);\n }\n }\n return parts.join(\"\\n\");\n}\n\nfunction formatReminderConversationLine(args: {\n agentId: string;\n agentName: string;\n ownerEntityId: string;\n memory: {\n entityId?: string;\n content?: { text?: string };\n createdAt?: number;\n };\n}): string | null {\n const text = args.memory.content?.text;\n if (!text || typeof text !== \"string\") return null;\n const isAgent = args.memory.entityId === args.agentId;\n const prefix = isAgent ? args.agentName : \"User\";\n return `${prefix}: ${text}`;\n}\n\nfunction readMemoryCreatedAtMs(memory: { createdAt?: unknown }): number | null {\n if (\n typeof memory.createdAt === \"number\" &&\n Number.isFinite(memory.createdAt)\n ) {\n return memory.createdAt;\n }\n if (typeof memory.createdAt === \"string\") {\n const parsed = Date.parse(memory.createdAt);\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n}\n\nfunction normalizeGeneratedReminderBody(value: string): string | null {\n const cleaned = value.replace(/^[\"'`]+|[\"'`]+$/g, \"\").trim();\n return cleaned.length > 0 ? cleaned : null;\n}\n\nfunction normalizeGeneratedWorkflowBody(value: string): string | null {\n const cleaned = value.replace(/^[\"'`]+|[\"'`]+$/g, \"\").trim();\n return cleaned.length > 0 ? cleaned : null;\n}\n\nfunction formatReminderPromptValue(value: unknown): string {\n if (value === null || value === undefined) {\n return \"null\";\n }\n const text =\n value instanceof Date ? value.toISOString() : String(value).trim();\n const normalized = text.replace(/\\s+/g, \" \").trim();\n return normalized.length > 0 ? normalized : \"null\";\n}\n\nfunction normalizeModelNullString(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const trimmed = value.trim();\n if (\n trimmed.length === 0 ||\n trimmed.toLowerCase() === \"null\" ||\n trimmed.toLowerCase() === \"none\"\n ) {\n return null;\n }\n return trimmed;\n}\n\nfunction normalizeModelNumber(value: unknown): number | null {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n if (typeof value !== \"string\") {\n return null;\n }\n const normalized = normalizeModelNullString(value);\n if (normalized === null) {\n return null;\n }\n const parsed = Number(normalized);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction parseStructuredObjectFromModelText(\n value: string,\n): Record<string, unknown> | null {\n const parsedJson = parseJsonModelRecord<Record<string, unknown>>(value);\n if (isRecord(parsedJson)) {\n return parsedJson;\n }\n return null;\n}\n\nfunction normalizeSemanticClassifierModelRecord(\n record: Record<string, unknown>,\n): Record<string, unknown> {\n const normalized: Record<string, unknown> = { ...record };\n const confidence = normalizeModelNumber(normalized.confidence);\n if (confidence !== null) {\n normalized.confidence = confidence;\n }\n\n const existingSnoozeRequest = normalized.snoozeRequest;\n if (isRecord(existingSnoozeRequest)) {\n const snoozeRequest = { ...existingSnoozeRequest };\n const minutes = normalizeModelNumber(snoozeRequest.minutes);\n if (minutes !== null) {\n snoozeRequest.minutes = minutes;\n }\n const preset = normalizeModelNullString(snoozeRequest.preset);\n if (preset !== null) {\n snoozeRequest.preset = preset;\n }\n normalized.snoozeRequest = snoozeRequest;\n return normalized;\n }\n\n const snoozeMinutes = normalizeModelNumber(normalized.snoozeMinutes);\n if (snoozeMinutes !== null) {\n normalized.snoozeRequest = { minutes: snoozeMinutes };\n return normalized;\n }\n\n const snoozePreset = normalizeModelNullString(normalized.snoozePreset);\n normalized.snoozeRequest =\n snoozePreset !== null ? { preset: snoozePreset } : null;\n return normalized;\n}\n\nfunction serializeContactRouteCandidates(\n candidates: readonly ReminderRouteCandidate[],\n): Array<{\n channel: LifeOpsReminderChannel;\n score: number;\n evidence: string[];\n vetoReasons: string[];\n interruptionBudget: string;\n}> {\n return candidates.map((candidate) => ({\n channel: candidate.channel,\n score: candidate.score,\n evidence: candidate.evidence,\n vetoReasons: candidate.vetoReasons,\n interruptionBudget: candidate.interruptionBudget,\n }));\n}\n\nfunction formatNearbyReminderTitlesForPrompt(titles: string[]): string {\n if (titles.length === 0) {\n return \"None.\";\n }\n return titles.map((title) => `- ${title}`).join(\"\\n\");\n}\n\nexport function buildReminderDispatchPrompt(args: {\n runtime: IAgentRuntime;\n title: string;\n reminderAt: string;\n channel: LifeOpsReminderStep[\"channel\"];\n lifecycle: ReminderAttemptLifecycle;\n urgency: LifeOpsReminderUrgency;\n recentConversation: readonly string[];\n nearbyReminderTitles?: string[];\n}): string {\n const instructions = resolveOptimizedPromptForRuntime(\n args.runtime,\n \"reminder_dispatch\",\n REMINDER_DISPATCH_INSTRUCTIONS,\n );\n return [\n instructions,\n \"\",\n \"Character voice:\",\n buildReminderVoiceContext(args.runtime) || \"No extra character context.\",\n \"\",\n \"Current reminder:\",\n `- title: ${args.title}`,\n `- due: ${new Date(args.reminderAt).toLocaleString()}`,\n `- channel: ${args.channel}`,\n `- urgency: ${args.urgency}`,\n `- lifecycle: ${args.lifecycle}`,\n \"\",\n \"Recent conversation:\",\n args.recentConversation.length > 0\n ? args.recentConversation.join(\"\\n\")\n : \"No recent conversation available.\",\n \"\",\n \"Other reminders around this time:\",\n formatNearbyReminderTitlesForPrompt(args.nearbyReminderTitles ?? []),\n \"\",\n \"Reminder text:\",\n ].join(\"\\n\");\n}\n\nfunction normalizeScreenContextFocus(\n value: unknown,\n): ReminderActivityProfileSnapshot[\"screenContextFocus\"] {\n switch (value) {\n case \"work\":\n case \"leisure\":\n case \"transition\":\n case \"idle\":\n case \"unknown\":\n return value;\n default:\n return null;\n }\n}\n\nfunction collectNearbyReminderTitles(args: {\n currentOwnerId: string;\n currentAnchorAt: string | null;\n occurrences: LifeOpsOccurrenceView[];\n events: Array<{ id: string; title: string; startAt: string }>;\n limit: number;\n}): string[] {\n if (!args.currentAnchorAt) return [];\n const anchorMs = Date.parse(args.currentAnchorAt);\n if (!Number.isFinite(anchorMs)) return [];\n const windowMs = 2 * 60 * 60 * 1000; // 2 hours\n const titles: string[] = [];\n for (const occ of args.occurrences) {\n if (occ.id === args.currentOwnerId) continue;\n const occMs = occ.dueAt ? Date.parse(occ.dueAt) : null;\n if (occMs !== null && Math.abs(occMs - anchorMs) <= windowMs) {\n titles.push(occ.title);\n }\n if (titles.length >= args.limit) return titles;\n }\n for (const event of args.events) {\n if (event.id === args.currentOwnerId) continue;\n const eventMs = Date.parse(event.startAt);\n if (Math.abs(eventMs - anchorMs) <= windowMs) {\n titles.push(event.title);\n }\n if (titles.length >= args.limit) return titles;\n }\n return titles;\n}\n\nfunction buildActiveCalendarEventReminders(\n events: Array<{\n id: string;\n title: string;\n startAt: string;\n metadata: Record<string, unknown>;\n }>,\n plansByEventId: Map<string, LifeOpsReminderPlan>,\n _ownerEntityId: string,\n now: Date,\n): Array<{\n ownerType: \"calendar_event\";\n ownerId: string;\n eventId: string;\n subjectType: LifeOpsSubjectType;\n title: string;\n dueAt: string;\n channel: LifeOpsReminderStep[\"channel\"];\n stepIndex: number;\n scheduledFor: string;\n}> {\n const rows: Array<{\n ownerType: \"calendar_event\";\n ownerId: string;\n eventId: string;\n subjectType: LifeOpsSubjectType;\n title: string;\n dueAt: string;\n channel: LifeOpsReminderStep[\"channel\"];\n stepIndex: number;\n scheduledFor: string;\n }> = [];\n for (const event of events) {\n const plan = plansByEventId.get(event.id);\n if (!plan) continue;\n const eventStartAt = new Date(event.startAt);\n for (const [stepIndex, step] of plan.steps.entries()) {\n const scheduledFor = addMinutes(\n eventStartAt,\n -step.offsetMinutes,\n ).toISOString();\n if (Date.parse(scheduledFor) > now.getTime()) continue;\n rows.push({\n ownerType: \"calendar_event\",\n ownerId: event.id,\n eventId: event.id,\n subjectType: \"owner\",\n title: event.title,\n dueAt: event.startAt,\n channel: step.channel,\n stepIndex,\n scheduledFor,\n });\n }\n }\n return rows;\n}\n\nfunction normalizeActivitySignalSource(\n value: unknown,\n field: string,\n): LifeOpsActivitySignal[\"source\"] {\n return normalizeReminderActivitySignalSource(value, field);\n}\n\nfunction normalizeActivitySignalState(\n value: unknown,\n field: string,\n): LifeOpsActivitySignal[\"state\"] {\n return normalizeReminderActivitySignalState(value, field);\n}\n\nfunction normalizeOptionalIdleState(\n value: unknown,\n field: string,\n): LifeOpsActivitySignal[\"idleState\"] {\n return normalizeReminderOptionalIdleState(value, field);\n}\n\nfunction normalizeWebsiteListForComparison(websites: string[]): string[] {\n return [\n ...new Set(websites.map((w) => w.toLowerCase().trim()).filter(Boolean)),\n ].sort();\n}\n\nfunction haveSameWebsiteSet(\n left: readonly string[],\n right: readonly string[],\n): boolean {\n const leftSet = normalizeWebsiteListForComparison([...left]);\n const rightSet = normalizeWebsiteListForComparison([...right]);\n if (leftSet.length !== rightSet.length) return false;\n return leftSet.every((v, i) => v === rightSet[i]);\n}\n\nfunction isWebsiteAccessGrantActive(\n grant: { revokedAt: string | null; expiresAt: string | null },\n now: Date,\n): boolean {\n if (grant.revokedAt) return false;\n if (grant.expiresAt) {\n return Date.parse(grant.expiresAt) > now.getTime();\n }\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// Reminders mixin\n// ---------------------------------------------------------------------------\n\n/** @internal */\nexport function withReminders<TBase extends Constructor<LifeOpsServiceBase>>(\n Base: TBase,\n): MixinClass<TBase, LifeOpsReminderService> {\n return class LifeOpsRemindersServiceMixin\n extends Base\n implements LifeOpsReminderService, CheckinSourceService\n {\n declare getInbox?: CheckinSourceService[\"getInbox\"];\n declare getGmailTriage?: CheckinSourceService[\"getGmailTriage\"];\n declare getCalendarFeed?: CheckinSourceService[\"getCalendarFeed\"];\n declare syncXDms?: CheckinSourceService[\"syncXDms\"];\n declare getXDms?: CheckinSourceService[\"getXDms\"];\n declare syncXFeed?: CheckinSourceService[\"syncXFeed\"];\n declare getXFeedItems?: CheckinSourceService[\"getXFeedItems\"];\n declare runDueWorkflows: ScheduledWorkflowRunner[\"runDueWorkflows\"];\n declare runDueEventWorkflows: ScheduledWorkflowRunner[\"runDueEventWorkflows\"];\n declare snoozeOccurrence: (\n occurrenceId: string,\n request: SnoozeLifeOpsOccurrenceRequest,\n now?: Date,\n ) => Promise<LifeOpsOccurrenceView>;\n\n /**\n * UTC date key of the last successful telemetry rollup+retention run.\n * Gates the daily maintenance call inside the scheduler tick so it only\n * fires once per day per runtime process.\n */\n private telemetryRollupLastRunDate: string | null = null;\n\n protected emitInAppReminderNudge(args: {\n text: string;\n ownerType: \"occurrence\" | \"calendar_event\";\n ownerId: string;\n subjectType: LifeOpsSubjectType;\n scheduledFor: string;\n dueAt: string | null;\n }): void {\n this.emitAssistantEvent(args.text, \"reminder\", {\n ownerType: args.ownerType,\n ownerId: args.ownerId,\n subjectType: args.subjectType,\n scheduledFor: args.scheduledFor,\n dueAt: args.dueAt,\n });\n // Also push onto the unified notification rail so the reminder lands in\n // the notification center and reaches desktop/mobile (focus-gated) — not\n // just the in-app assistant stream. groupKey collapses repeat nudges for\n // the same occurrence.\n const notifier = this.runtime.getService(ServiceType.NOTIFICATION) as {\n notify?: (input: Record<string, unknown>) => Promise<unknown>;\n } | null;\n void notifier?.notify?.({\n title: \"Reminder\",\n body: args.text,\n category: \"reminder\",\n priority: \"normal\",\n source: \"lifeops\",\n deepLink: \"/chat\",\n groupKey: `reminder:${args.ownerType}:${args.ownerId}`,\n data: {\n ownerType: args.ownerType,\n ownerId: args.ownerId,\n subjectType: args.subjectType,\n scheduledFor: args.scheduledFor,\n dueAt: args.dueAt,\n },\n });\n }\n\n public async readRecentReminderConversation(args: {\n subjectType: LifeOpsSubjectType;\n limit?: number;\n }): Promise<string[]> {\n if (\n args.subjectType !== \"owner\" ||\n typeof this.runtime.getRoomsForParticipants !== \"function\" ||\n typeof this.runtime.getMemoriesByRoomIds !== \"function\"\n ) {\n return [];\n }\n\n const ownerEntityId =\n (await this.ownerRoutingEntityId()) ?? this.ownerEntityId();\n const agentId = this.agentId();\n try {\n const roomIds = await this.runtime.getRoomsForParticipants([\n ownerEntityId,\n agentId,\n ]);\n if (!Array.isArray(roomIds) || roomIds.length === 0) {\n return [];\n }\n const memories = await this.runtime.getMemoriesByRoomIds({\n tableName: \"messages\",\n roomIds,\n limit: Math.max(6, (args.limit ?? 6) * 2),\n });\n if (!Array.isArray(memories) || memories.length === 0) {\n return [];\n }\n const agentName =\n typeof this.runtime.character.name === \"string\" &&\n this.runtime.character.name.trim().length > 0\n ? this.runtime.character.name.trim()\n : \"Assistant\";\n return memories\n .slice()\n .sort(\n (left, right) =>\n Number(left.createdAt ?? 0) - Number(right.createdAt ?? 0),\n )\n .map((memory) =>\n formatReminderConversationLine({\n agentId,\n agentName,\n ownerEntityId,\n memory,\n }),\n )\n .filter((line): line is string => typeof line === \"string\")\n .slice(-(args.limit ?? 6));\n } catch {\n return [];\n }\n }\n\n public async classifyReminderOwnerResponseSemantically(input: {\n text: string;\n context?: {\n title?: string | null;\n attemptedAt?: string | null;\n respondedAt?: string | number | Date | null;\n channel?: LifeOpsReminderChannel | null;\n allowStandaloneResolution?: boolean;\n };\n }) {\n if (typeof this.runtime.useModel !== \"function\") {\n return null;\n }\n const context = input.context ?? {};\n const prompt = [\n \"Classify whether the owner reply resolves one specific reminder.\",\n \"Return JSON only as a single object. Do not include prose, markdown, code fences, or hidden reasoning.\",\n \"\",\n \"Allowed decisions:\",\n \"- explicit_resolution: the reply clearly completes, acknowledges, skips, or snoozes this reminder\",\n \"- needs_clarification: the owner intends to act but the snooze/meaning is underspecified\",\n \"- unrelated: the reply is about something else\",\n \"- abstain: ambiguous, context-heavy, or not confidently bound to this reminder\",\n \"\",\n \"Use abstain when the reply is ambiguous, context-heavy, or you cannot confidently bind it to the reminder.\",\n \"Only resolve standalone replies like done/yes/later when the context says standalone resolution is allowed.\",\n \"For snoozed, set snoozeMinutes to a positive integer or snoozePreset to 15m, 30m, 1h, tonight, or tomorrow_morning; otherwise ask for clarification.\",\n \"\",\n \"Return exactly these JSON fields:\",\n \"decision: explicit_resolution | needs_clarification | unrelated | abstain\",\n \"resolution: completed | acknowledged | skipped | snoozed | null\",\n \"snoozeMinutes: positive integer minutes or null\",\n \"snoozePreset: 15m | 30m | 1h | tonight | tomorrow_morning | null\",\n \"confidence: number from 0.0 to 1.0\",\n \"reason: short_reason\",\n \"\",\n \"Reminder context:\",\n `title: ${formatReminderPromptValue(context.title ?? null)}`,\n `attemptedAt: ${formatReminderPromptValue(context.attemptedAt ?? null)}`,\n `respondedAt: ${formatReminderPromptValue(\n context.respondedAt instanceof Date\n ? context.respondedAt.toISOString()\n : (context.respondedAt ?? null),\n )}`,\n `channel: ${formatReminderPromptValue(context.channel ?? null)}`,\n `allowStandaloneResolution: ${formatReminderPromptValue(\n context.allowStandaloneResolution ?? null,\n )}`,\n \"\",\n \"Owner reply:\",\n `text: ${formatReminderPromptValue(input.text)}`,\n ].join(\"\\n\");\n try {\n const response = await runWithTrajectoryContext(\n { purpose: \"lifeops-reminders-classify-reply\" },\n () =>\n this.runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n }),\n );\n if (typeof response !== \"string\") {\n return null;\n }\n const parsed = parseStructuredObjectFromModelText(response);\n return parseReminderOwnerResponseSemanticClassification(\n parsed ? normalizeSemanticClassifierModelRecord(parsed) : null,\n );\n } catch {\n return null;\n }\n }\n\n public async reviewOwnerResponseAfterReminderAttempt(args: {\n subjectType: LifeOpsSubjectType;\n attempt: LifeOpsReminderAttempt;\n competingAttempts?: LifeOpsReminderAttempt[];\n now: Date;\n }): Promise<ReminderReviewResponseEvidence> {\n const noResponse = {\n decision: \"no_response\",\n resolution: null,\n snoozeRequest: null,\n respondedAt: null,\n responseText: null,\n confidence: 0,\n reason: \"no_owner_response\",\n classifierSource: \"none\",\n semanticReason: null,\n } satisfies ReminderReviewResponseEvidence;\n if (\n args.subjectType !== \"owner\" ||\n typeof this.runtime.getRoomsForParticipants !== \"function\" ||\n typeof this.runtime.getMemoriesByRoomIds !== \"function\"\n ) {\n return noResponse;\n }\n const attemptedAt = args.attempt.attemptedAt ?? args.attempt.scheduledFor;\n const attemptedMs = attemptedAt ? Date.parse(attemptedAt) : Number.NaN;\n if (!Number.isFinite(attemptedMs)) {\n return noResponse;\n }\n\n const ownerEntityId =\n (await this.ownerRoutingEntityId()) ?? this.ownerEntityId();\n const agentId = this.agentId();\n try {\n const roomIds = await this.runtime.getRoomsForParticipants([\n ownerEntityId,\n agentId,\n ]);\n if (!Array.isArray(roomIds) || roomIds.length === 0) {\n return noResponse;\n }\n const memories = await this.runtime.getMemoriesByRoomIds({\n tableName: \"messages\",\n roomIds,\n limit: 50,\n });\n if (!Array.isArray(memories) || memories.length === 0) {\n return noResponse;\n }\n const nowMs = args.now.getTime();\n const ownerResponses = memories\n .filter((memory) => memory.entityId === ownerEntityId)\n .map((memory) => {\n const createdAt = readMemoryCreatedAtMs(memory);\n const text =\n typeof memory.content.text === \"string\"\n ? memory.content.text.trim()\n : \"\";\n const roomId =\n typeof memory.roomId === \"string\" ? memory.roomId : null;\n return { createdAt, roomId, text };\n })\n .filter(\n (response): response is typeof response & { createdAt: number } =>\n response.createdAt !== null &&\n response.createdAt > attemptedMs &&\n response.createdAt <= nowMs &&\n response.text.length > 0,\n )\n .sort((left, right) => left.createdAt - right.createdAt);\n if (ownerResponses.length === 0) {\n return noResponse;\n }\n const title =\n typeof args.attempt.deliveryMetadata.title === \"string\"\n ? args.attempt.deliveryMetadata.title\n : null;\n const competingAttempts =\n args.competingAttempts && args.competingAttempts.length > 0\n ? args.competingAttempts\n : [args.attempt];\n let latestUnrelated: ReminderReviewResponseEvidence | null = null;\n for (const response of ownerResponses) {\n const responseClaim = buildReminderResponseClaim({\n attempt: args.attempt,\n competingAttempts,\n response: {\n text: response.text,\n createdAt: response.createdAt,\n roomId: response.roomId,\n },\n roomIds,\n });\n const classification = await classifyReminderOwnerResponse({\n text: response.text,\n context: {\n title,\n attemptedAt,\n respondedAt: response.createdAt,\n channel: args.attempt.channel,\n allowStandaloneResolution:\n responseClaim.allowStandaloneResolution,\n },\n semanticClassifier: (input) =>\n this.classifyReminderOwnerResponseSemantically(input),\n });\n if (classification.decision === \"explicit_resolution\") {\n return {\n decision: \"explicit_resolution\",\n resolution: classification.resolution,\n snoozeRequest: classification.snoozeRequest,\n respondedAt: new Date(response.createdAt).toISOString(),\n responseText: response.text,\n confidence: classification.confidence,\n reason: classification.reason,\n classifierSource: classification.classifierSource,\n semanticReason: classification.semanticReason ?? null,\n };\n }\n if (classification.decision === \"needs_clarification\") {\n return {\n decision: \"needs_clarification\",\n resolution: null,\n snoozeRequest: null,\n respondedAt: new Date(response.createdAt).toISOString(),\n responseText: response.text,\n confidence: classification.confidence,\n reason: classification.reason,\n classifierSource: classification.classifierSource,\n semanticReason: classification.semanticReason ?? null,\n };\n }\n latestUnrelated = {\n decision: \"unrelated\",\n resolution: null,\n snoozeRequest: null,\n respondedAt: new Date(response.createdAt).toISOString(),\n responseText: response.text,\n confidence: classification.confidence,\n reason: classification.reason,\n classifierSource: classification.classifierSource,\n semanticReason: classification.semanticReason ?? null,\n };\n }\n return (\n latestUnrelated ?? {\n decision: \"unrelated\",\n resolution: null,\n snoozeRequest: null,\n respondedAt: null,\n responseText: null,\n confidence: 0.4,\n reason: \"owner_responded_without_explicit_reminder_resolution\",\n classifierSource: \"none\",\n semanticReason: null,\n }\n );\n } catch {\n return noResponse;\n }\n }\n\n public async renderReminderBody(args: {\n title: string;\n scheduledFor: string;\n dueAt: string | null;\n channel: LifeOpsReminderStep[\"channel\"];\n lifecycle: ReminderAttemptLifecycle;\n urgency: LifeOpsReminderUrgency;\n subjectType: LifeOpsSubjectType;\n nearbyReminderTitles?: string[];\n }): Promise<string> {\n const fallback = buildReminderBody({\n title: args.title,\n scheduledFor: args.scheduledFor,\n dueAt: args.dueAt,\n channel: args.channel,\n lifecycle: args.lifecycle,\n nearbyReminderTitles: args.nearbyReminderTitles,\n });\n if (typeof this.runtime.useModel !== \"function\") {\n return fallback;\n }\n\n const recentConversation = await this.readRecentReminderConversation({\n subjectType: args.subjectType,\n limit: 6,\n });\n const reminderAt = args.dueAt ?? args.scheduledFor;\n const prompt = buildReminderDispatchPrompt({\n runtime: this.runtime,\n title: args.title,\n reminderAt,\n channel: args.channel,\n lifecycle: args.lifecycle,\n urgency: args.urgency,\n recentConversation,\n nearbyReminderTitles: args.nearbyReminderTitles,\n });\n\n try {\n const response = await runWithTrajectoryContext(\n { purpose: \"reminder_dispatch\" },\n () =>\n this.runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n }),\n );\n const text =\n typeof response === \"string\"\n ? normalizeGeneratedReminderBody(response)\n : null;\n return text ?? fallback;\n } catch {\n return fallback;\n }\n }\n\n public async renderWorkflowRunBody(args: {\n workflow: Pick<LifeOpsWorkflowDefinition, \"title\" | \"subjectType\">;\n run: Pick<LifeOpsWorkflowRun, \"status\">;\n }): Promise<string> {\n const fallback =\n args.run.status === \"success\"\n ? `${args.workflow.title} just ran successfully.`\n : `${args.workflow.title} ran but hit a problem.`;\n if (\n args.workflow.subjectType !== \"owner\" ||\n typeof this.runtime.useModel !== \"function\"\n ) {\n return fallback;\n }\n\n const recentConversation = await this.readRecentReminderConversation({\n subjectType: \"owner\",\n limit: 6,\n });\n const prompt = [\n `Write a short assistant update about the workflow \"${args.workflow.title}\".`,\n \"This is a user-facing status nudge, not a system log.\",\n \"\",\n \"Character voice:\",\n buildReminderVoiceContext(this.runtime) ||\n \"No extra character context.\",\n \"\",\n \"Workflow run:\",\n `- title: ${args.workflow.title}`,\n `- status: ${args.run.status}`,\n \"\",\n \"Recent conversation:\",\n recentConversation.length > 0\n ? recentConversation.join(\"\\n\")\n : \"No recent conversation available.\",\n \"\",\n \"Rules:\",\n \"- Return only the message text.\",\n \"- Sound natural and in character.\",\n \"- Do not start with 'Workflow' or 'Scheduled workflow'.\",\n \"- Keep it concise: one short sentence, or two at most.\",\n \"- For failures, sound calm and direct rather than robotic.\",\n \"- No markdown, bullets, quotes, labels, or emoji.\",\n \"\",\n \"Message text:\",\n ].join(\"\\n\");\n\n try {\n const response = await runWithTrajectoryContext(\n { purpose: \"lifeops-reminders-workflow-body\" },\n () =>\n this.runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n }),\n );\n const text =\n typeof response === \"string\"\n ? normalizeGeneratedWorkflowBody(response)\n : null;\n return text ?? fallback;\n } catch {\n return fallback;\n }\n }\n\n public async emitWorkflowRunNudge(\n workflow: LifeOpsWorkflowDefinition,\n run: LifeOpsWorkflowRun,\n ): Promise<void> {\n if (workflow.subjectType !== \"owner\") {\n return;\n }\n const message = await this.renderWorkflowRunBody({\n workflow,\n run,\n });\n const routeMetadata = await this.buildOwnerContactRouteEventMetadata({\n purpose: \"workflow\",\n urgency: run.status === \"success\" ? \"medium\" : \"high\",\n now: new Date(),\n });\n this.emitAssistantEvent(message, \"workflow\", {\n workflowId: workflow.id,\n workflowTitle: workflow.title,\n workflowRunId: run.id,\n status: run.status,\n subjectType: workflow.subjectType,\n ...routeMetadata,\n });\n }\n\n public withNativeAppleReminderId(\n definition: LifeOpsTaskDefinition,\n reminderId: string | null,\n ): LifeOpsTaskDefinition {\n const nativeMetadata = readNativeAppleReminderMetadata(\n definition.metadata,\n );\n if (!nativeMetadata) {\n return definition;\n }\n return {\n ...definition,\n metadata: mergeMetadata(\n definition.metadata,\n buildNativeAppleReminderMetadata({\n kind: nativeMetadata.kind,\n source: nativeMetadata.source,\n reminderId,\n }),\n ),\n updatedAt: new Date().toISOString(),\n };\n }\n\n public async syncNativeAppleReminderForDefinition(args: {\n definition: LifeOpsTaskDefinition | null;\n previousDefinition?: LifeOpsTaskDefinition | null;\n }): Promise<LifeOpsTaskDefinition | null> {\n const previousMetadata = args.previousDefinition\n ? readNativeAppleReminderMetadata(args.previousDefinition.metadata)\n : null;\n const nextMetadata = args.definition\n ? readNativeAppleReminderMetadata(args.definition.metadata)\n : null;\n const previousReminderId = previousMetadata?.reminderId ?? null;\n if (\n args.definition === null ||\n nextMetadata === null ||\n args.definition.subjectType !== \"owner\" ||\n args.definition.domain !== \"user_lifeops\" ||\n args.definition.cadence.kind !== \"once\"\n ) {\n if (previousReminderId) {\n const deleteResult = await deleteNativeAppleReminderLikeItem(\n previousReminderId,\n { runtime: this.runtime },\n );\n if (deleteResult.ok === false) {\n this.logLifeOpsWarn(\n \"native_apple_reminder_sync\",\n \"[lifeops] Failed to delete a native Apple reminder.\",\n {\n definitionId: args.previousDefinition?.id ?? null,\n reminderId: previousReminderId,\n reason: deleteResult.reason,\n detail:\n deleteResult.reason === \"permission\"\n ? `permission ${deleteResult.permission} (canRequest=${deleteResult.canRequest})`\n : deleteResult.reason === \"native_error\"\n ? deleteResult.message\n : `not_supported on ${deleteResult.platform}`,\n },\n );\n }\n }\n if (args.definition && nextMetadata?.reminderId) {\n return this.withNativeAppleReminderId(args.definition, null);\n }\n return args.definition;\n }\n\n const definition = args.definition;\n const nativeMetadata = nextMetadata;\n const cadence =\n definition.cadence.kind === \"once\" ? definition.cadence : null;\n if (!cadence) {\n return definition;\n }\n const reminderId = nativeMetadata.reminderId ?? previousReminderId;\n if (reminderId) {\n const updateResult = await updateNativeAppleReminderLikeItem({\n reminderId,\n kind: nativeMetadata.kind,\n title: definition.title,\n dueAt: cadence.dueAt,\n notes: definition.description,\n originalIntent: definition.originalIntent,\n runtime: this.runtime,\n });\n if (updateResult.ok === true) {\n return this.withNativeAppleReminderId(\n definition,\n updateResult.data.reminderId ?? reminderId,\n );\n }\n this.logLifeOpsWarn(\n \"native_apple_reminder_sync\",\n \"[lifeops] Failed to update a native Apple reminder.\",\n {\n definitionId: definition.id,\n kind: nativeMetadata.kind,\n reminderId,\n reason: updateResult.reason,\n detail:\n updateResult.reason === \"permission\"\n ? `permission ${updateResult.permission} (canRequest=${updateResult.canRequest})`\n : updateResult.reason === \"native_error\"\n ? updateResult.message\n : `not_supported on ${updateResult.platform}`,\n },\n );\n return this.withNativeAppleReminderId(definition, reminderId);\n }\n\n const createResult = await createNativeAppleReminderLikeItem({\n kind: nativeMetadata.kind,\n title: definition.title,\n dueAt: cadence.dueAt,\n notes: definition.description,\n originalIntent: definition.originalIntent,\n runtime: this.runtime,\n });\n if (createResult.ok === false) {\n this.logLifeOpsWarn(\n \"native_apple_reminder_sync\",\n \"[lifeops] Failed to sync a native Apple reminder.\",\n {\n definitionId: definition.id,\n kind: nativeMetadata.kind,\n reason: createResult.reason,\n detail:\n createResult.reason === \"permission\"\n ? `permission ${createResult.permission} (canRequest=${createResult.canRequest})`\n : createResult.reason === \"native_error\"\n ? createResult.message\n : `not_supported on ${createResult.platform}`,\n },\n );\n return definition;\n }\n return this.withNativeAppleReminderId(\n definition,\n createResult.data.reminderId ?? null,\n );\n }\n\n public async getDefinitionRecord(\n definitionId: string,\n now = new Date(),\n ): Promise<LifeOpsDefinitionRecord> {\n const definition = await this.repository.getDefinition(\n this.agentId(),\n definitionId,\n );\n if (!definition) {\n fail(404, \"life-ops definition not found\");\n }\n const reminderPlan = definition.reminderPlanId\n ? await this.repository.getReminderPlan(\n this.agentId(),\n definition.reminderPlanId,\n )\n : null;\n const occurrences = await this.repository.listOccurrencesForDefinition(\n this.agentId(),\n definition.id,\n );\n return {\n definition,\n reminderPlan,\n performance: computeDefinitionPerformance(definition, occurrences, now),\n };\n }\n\n public async getGoalRecord(goalId: string): Promise<LifeOpsGoalRecord> {\n const goal = await this.repository.getGoal(this.agentId(), goalId);\n if (!goal) {\n fail(404, \"life-ops goal not found\");\n }\n const links = await this.repository.listGoalLinksForGoal(\n this.agentId(),\n goalId,\n );\n return { goal, links };\n }\n\n public async ensureGoalExists(\n goalId: string | null,\n ownership?: Pick<\n LifeOpsOwnership,\n \"domain\" | \"subjectType\" | \"subjectId\"\n >,\n ): Promise<string | null> {\n if (!goalId) return null;\n const goal = await this.repository.getGoal(this.agentId(), goalId);\n if (!goal) {\n fail(404, `goal ${goalId} does not exist`);\n }\n if (\n ownership &&\n (goal.domain !== ownership.domain ||\n goal.subjectType !== ownership.subjectType ||\n goal.subjectId !== ownership.subjectId)\n ) {\n fail(\n 400,\n \"goalId must reference a goal in the same owner or agent scope\",\n );\n }\n return goal.id;\n }\n\n public async syncGoalLink(\n definition: LifeOpsTaskDefinition,\n ): Promise<void> {\n await this.repository.deleteGoalLinksForLinked(\n definition.agentId,\n \"definition\",\n definition.id,\n );\n if (!definition.goalId) return;\n await this.repository.upsertGoalLink({\n id: crypto.randomUUID(),\n agentId: definition.agentId,\n goalId: definition.goalId,\n linkedType: \"definition\",\n linkedId: definition.id,\n createdAt: new Date().toISOString(),\n });\n }\n\n public async syncReminderPlan(\n definition: LifeOpsTaskDefinition,\n draft:\n | {\n steps: LifeOpsReminderStep[];\n mutePolicy: Record<string, unknown>;\n quietHours: Record<string, unknown>;\n }\n | null\n | undefined,\n ): Promise<LifeOpsReminderPlan | null> {\n if (draft === undefined) {\n return definition.reminderPlanId\n ? await this.repository.getReminderPlan(\n definition.agentId,\n definition.reminderPlanId,\n )\n : null;\n }\n if (draft === null) {\n if (definition.reminderPlanId) {\n await this.repository.deleteReminderPlan(\n definition.agentId,\n definition.reminderPlanId,\n );\n }\n definition.reminderPlanId = null;\n return null;\n }\n const existingPlan = definition.reminderPlanId\n ? await this.repository.getReminderPlan(\n definition.agentId,\n definition.reminderPlanId,\n )\n : null;\n if (existingPlan) {\n const nextPlan: LifeOpsReminderPlan = {\n ...existingPlan,\n steps: draft.steps,\n mutePolicy: draft.mutePolicy,\n quietHours: draft.quietHours,\n updatedAt: new Date().toISOString(),\n };\n await this.repository.updateReminderPlan(nextPlan);\n definition.reminderPlanId = nextPlan.id;\n return nextPlan;\n }\n const createdPlan = createLifeOpsReminderPlan({\n agentId: definition.agentId,\n ownerType: \"definition\",\n ownerId: definition.id,\n steps: draft.steps,\n mutePolicy: draft.mutePolicy,\n quietHours: draft.quietHours,\n });\n await this.repository.createReminderPlan(createdPlan);\n definition.reminderPlanId = createdPlan.id;\n return createdPlan;\n }\n\n /** @internal — public to satisfy TS4094 on exported anonymous mixin class */\n serializeScheduleObservationForSync(\n observation: LifeOpsScheduleObservationRecord,\n ): SyncLifeOpsScheduleObservationInput {\n const metadata = isRecord(observation.metadata)\n ? observation.metadata\n : null;\n const rawSnapshot = metadata?.snapshot;\n const snapshot = isRecord(rawSnapshot) ? { ...rawSnapshot } : undefined;\n const extraMetadata =\n metadata && typeof metadata === \"object\"\n ? Object.fromEntries(\n Object.entries(metadata).filter(\n ([key]) => key !== \"snapshot\" && key !== \"source\",\n ),\n )\n : {};\n return {\n circadianState: observation.circadianState,\n stateConfidence: observation.stateConfidence,\n uncertaintyReason: observation.uncertaintyReason,\n windowStartAt: observation.windowStartAt,\n windowEndAt: observation.windowEndAt,\n mealLabel: observation.mealLabel,\n snapshot,\n metadata:\n Object.keys(extraMetadata).length > 0 ? extraMetadata : undefined,\n };\n }\n\n public async refreshLocalMergedScheduleState(args?: {\n timezone?: string | null;\n now?: Date;\n }): Promise<LifeOpsScheduleMergedStateRecord | null> {\n const timezone =\n normalizeOptionalString(args?.timezone) ?? resolveDefaultTimeZone();\n const now = args?.now ?? new Date();\n const insight = await refreshLifeOpsScheduleInsight({\n runtime: this.runtime,\n repository: this.repository,\n agentId: this.agentId(),\n timezone,\n now,\n });\n const deviceIdentity = resolveScheduleDeviceIdentity();\n const observations = deriveLocalScheduleObservations({\n agentId: this.agentId(),\n deviceId: deviceIdentity.deviceId,\n deviceKind: deviceIdentity.deviceKind,\n timezone,\n observedAt: now.toISOString(),\n insight,\n });\n for (const observation of observations) {\n await this.repository.upsertScheduleObservation(observation);\n }\n const sinceAt = new Date(\n now.getTime() - SCHEDULE_OBSERVATION_LOOKBACK_MS,\n ).toISOString();\n const recentObservations = await this.repository.listScheduleObservations(\n this.agentId(),\n sinceAt,\n {\n origin: \"local_inference\",\n deviceId: deviceIdentity.deviceId,\n },\n );\n const merged = mergeScheduleObservations({\n agentId: this.agentId(),\n scope: \"local\",\n timezone,\n now,\n observations: recentObservations,\n });\n if (!merged) {\n const cached = await this.repository.getScheduleMergedState(\n this.agentId(),\n \"local\",\n timezone,\n );\n return cached ? refreshLifeOpsRelativeTime(cached, now) : null;\n }\n // Propagate scorer firings from the local insight so the inspection UI\n // (and the circadian-state evidenceRefs audit column) can see exactly\n // which rules fired this tick. Merged states aggregated from cloud\n // peers don't have firings — only the local refresh path does.\n merged.circadianRuleFirings = insight.circadianRuleFirings;\n await this.repository.upsertScheduleMergedState(merged);\n const stored =\n (await this.repository.getScheduleMergedState(\n this.agentId(),\n \"local\",\n timezone,\n )) ?? merged;\n return refreshLifeOpsRelativeTime(stored, now);\n }\n\n public async ingestScheduleObservations(\n request: SyncLifeOpsScheduleObservationsRequest,\n ): Promise<SyncLifeOpsScheduleObservationsResponse> {\n const deviceId = requireNonEmptyString(request.deviceId, \"deviceId\");\n const deviceKind = normalizeEnumValue(\n request.deviceKind,\n \"deviceKind\",\n LIFEOPS_SCHEDULE_DEVICE_KINDS,\n );\n const timezone = requireNonEmptyString(request.timezone, \"timezone\");\n const observedAt =\n normalizeOptionalIsoString(request.observedAt, \"observedAt\") ??\n new Date().toISOString();\n if (\n !Array.isArray(request.observations) ||\n request.observations.length === 0\n ) {\n fail(400, \"observations must be a non-empty array\");\n }\n const observations = request.observations.map((input, index) => {\n const record = requireRecord(input, `observations[${index}]`);\n const stateConfidence =\n typeof record.stateConfidence === \"string\"\n ? Number(record.stateConfidence)\n : record.stateConfidence;\n if (\n typeof stateConfidence !== \"number\" ||\n !Number.isFinite(stateConfidence)\n ) {\n fail(400, `observations[${index}].stateConfidence must be a number`);\n }\n return {\n circadianState: normalizeEnumValue(\n record.circadianState,\n `observations[${index}].circadianState`,\n LIFEOPS_CIRCADIAN_STATES,\n ),\n stateConfidence,\n uncertaintyReason:\n record.uncertaintyReason === undefined ||\n record.uncertaintyReason === null\n ? null\n : normalizeEnumValue(\n record.uncertaintyReason,\n `observations[${index}].uncertaintyReason`,\n LIFEOPS_UNCLEAR_REASONS,\n ),\n windowStartAt: normalizeIsoString(\n record.windowStartAt,\n `observations[${index}].windowStartAt`,\n ),\n windowEndAt: normalizeOptionalIsoString(\n record.windowEndAt,\n `observations[${index}].windowEndAt`,\n ),\n mealLabel: normalizeOptionalScheduleMealLabel(\n record.mealLabel,\n `observations[${index}].mealLabel`,\n ),\n snapshot: normalizeOptionalScheduleObservationSnapshot(\n record.snapshot,\n `observations[${index}].snapshot`,\n ),\n metadata:\n record.metadata === undefined\n ? undefined\n : normalizeOptionalRecord(\n record.metadata,\n `observations[${index}].metadata`,\n ),\n } satisfies SyncLifeOpsScheduleObservationInput;\n });\n const normalizedRequest = {\n deviceId,\n deviceKind,\n timezone,\n observedAt,\n observations,\n } satisfies SyncLifeOpsScheduleObservationsRequest;\n const records = recordsFromSyncRequest({\n agentId: this.agentId(),\n origin: \"device_sync\",\n request: normalizedRequest,\n });\n for (const record of records) {\n await this.repository.upsertScheduleObservation(record);\n }\n const now = new Date(observedAt);\n const recentObservations = await this.repository.listScheduleObservations(\n this.agentId(),\n new Date(\n now.getTime() - SCHEDULE_OBSERVATION_LOOKBACK_MS,\n ).toISOString(),\n );\n const merged = mergeScheduleObservations({\n agentId: this.agentId(),\n scope: \"cloud\",\n timezone,\n now,\n observations: recentObservations,\n });\n if (!merged) {\n fail(409, \"unable to merge schedule observations\");\n }\n await this.repository.upsertScheduleMergedState(merged);\n return {\n acceptedCount: records.length,\n mergedState: merged,\n };\n }\n\n public async fetchCloudMergedScheduleState(args?: {\n timezone?: string | null;\n }): Promise<LifeOpsScheduleMergedStateRecord | null> {\n const timezone =\n normalizeOptionalString(args?.timezone) ?? resolveDefaultTimeZone();\n const now = new Date();\n const cached = await this.repository.getScheduleMergedState(\n this.agentId(),\n \"cloud\",\n timezone,\n );\n if (!this.scheduleSyncClient.configured) {\n return cached ? refreshLifeOpsRelativeTime(cached, now) : null;\n }\n try {\n const response = await this.scheduleSyncClient.getMergedState(\n timezone,\n \"cloud\",\n );\n if (!response.mergedState) {\n return cached ? refreshLifeOpsRelativeTime(cached, now) : null;\n }\n await this.repository.upsertScheduleMergedState(response.mergedState);\n const stored =\n (await this.repository.getScheduleMergedState(\n this.agentId(),\n \"cloud\",\n timezone,\n )) ?? response.mergedState;\n return refreshLifeOpsRelativeTime(stored, now);\n } catch (error) {\n this.logLifeOpsWarn(\n \"schedule_fetch_cloud_state\",\n \"[lifeops] Failed to fetch merged cloud schedule state; using cached state.\",\n { error: lifeOpsErrorMessage(error) },\n );\n return cached ? refreshLifeOpsRelativeTime(cached, now) : null;\n }\n }\n\n public async readEffectiveScheduleState(args?: {\n timezone?: string | null;\n now?: Date;\n }): Promise<LifeOpsScheduleMergedStateRecord | null> {\n const timezone =\n normalizeOptionalString(args?.timezone) ?? resolveDefaultTimeZone();\n const now = args?.now ?? new Date();\n const local = await this.repository.getScheduleMergedState(\n this.agentId(),\n \"local\",\n timezone,\n );\n const cloud = await this.repository.getScheduleMergedState(\n this.agentId(),\n \"cloud\",\n timezone,\n );\n const preferred = preferEffectiveMergedState({\n now,\n local,\n cloud,\n });\n return preferred ? refreshLifeOpsRelativeTime(preferred, now) : null;\n }\n\n public async refreshEffectiveScheduleState(args?: {\n timezone?: string | null;\n now?: Date;\n }): Promise<LifeOpsScheduleMergedStateRecord | null> {\n const timezone =\n normalizeOptionalString(args?.timezone) ?? resolveDefaultTimeZone();\n const now = args?.now ?? new Date();\n const local = await this.refreshLocalMergedScheduleState({\n timezone,\n now,\n });\n let cloud = await this.repository.getScheduleMergedState(\n this.agentId(),\n \"cloud\",\n timezone,\n );\n if (!this.scheduleSyncClient.configured) {\n const preferred = preferEffectiveMergedState({ now, local, cloud });\n return preferred ? refreshLifeOpsRelativeTime(preferred, now) : null;\n }\n if (!isFreshCloudMergedState(cloud, now)) {\n const deviceIdentity = resolveScheduleDeviceIdentity();\n const localObservations =\n await this.repository.listScheduleObservations(\n this.agentId(),\n new Date(\n now.getTime() - SCHEDULE_OBSERVATION_LOOKBACK_MS,\n ).toISOString(),\n {\n origin: \"local_inference\",\n deviceId: deviceIdentity.deviceId,\n },\n );\n try {\n if (localObservations.length > 0) {\n const response = await this.scheduleSyncClient.syncObservations({\n deviceId: deviceIdentity.deviceId,\n deviceKind: deviceIdentity.deviceKind,\n timezone,\n observedAt: now.toISOString(),\n observations: localObservations.map((observation) =>\n this.serializeScheduleObservationForSync(observation),\n ),\n });\n await this.repository.upsertScheduleMergedState(\n response.mergedState,\n );\n cloud =\n (await this.repository.getScheduleMergedState(\n this.agentId(),\n \"cloud\",\n timezone,\n )) ?? response.mergedState;\n } else {\n cloud = await this.fetchCloudMergedScheduleState({ timezone });\n }\n } catch (error) {\n this.logLifeOpsWarn(\n \"schedule_sync\",\n \"[lifeops] Failed to sync coarse schedule observations; using local state.\",\n { error: lifeOpsErrorMessage(error) },\n );\n if (\n !cloud ||\n now.getTime() - Date.parse(cloud.updatedAt) >\n SCHEDULE_CLOUD_SYNC_TTL_MS\n ) {\n cloud = await this.fetchCloudMergedScheduleState({ timezone });\n }\n }\n }\n const preferred = preferEffectiveMergedState({ now, local, cloud });\n return preferred ? refreshLifeOpsRelativeTime(preferred, now) : null;\n }\n\n public async getScheduleMergedState(args?: {\n timezone?: string | null;\n scope?: \"local\" | \"cloud\" | \"effective\";\n refresh?: boolean;\n now?: Date;\n }): Promise<LifeOpsScheduleMergedStateRecord | null> {\n const timezone =\n normalizeOptionalString(args?.timezone) ?? resolveDefaultTimeZone();\n const scope = args?.scope ?? \"effective\";\n if (scope === \"effective\") {\n return args?.refresh\n ? await this.refreshEffectiveScheduleState({\n timezone,\n now: args?.now,\n })\n : await this.readEffectiveScheduleState({\n timezone,\n now: args?.now,\n });\n }\n if (scope === \"local\" && args?.refresh) {\n return await this.refreshLocalMergedScheduleState({\n timezone,\n now: args?.now,\n });\n }\n const state = await this.repository.getScheduleMergedState(\n this.agentId(),\n scope,\n timezone,\n );\n return state\n ? refreshLifeOpsRelativeTime(state, args?.now ?? new Date())\n : null;\n }\n\n /** Max age for the cached adaptive window policy (30 minutes). */\n public static readonly ADAPTIVE_POLICY_TTL_MS = 30 * 60 * 1000;\n\n /**\n * Read the activity profile from the proactive task metadata and return\n * an adaptive window policy. Result is cached for up to 30 minutes.\n */\n public async resolveAdaptiveWindowPolicy(\n timezone: string,\n now: Date,\n ): Promise<ReturnType<typeof computeAdaptiveWindowPolicy> | null> {\n const cached = this.adaptiveWindowPolicyCache;\n if (\n cached &&\n now.getTime() - cached.computedAt <\n LifeOpsRemindersServiceMixin.ADAPTIVE_POLICY_TTL_MS\n ) {\n return cached.policy;\n }\n try {\n const tasks = await this.runtime.getTasks({\n agentIds: [this.runtime.agentId],\n tags: [...PROACTIVE_TASK_QUERY_TAGS],\n });\n const proactiveTask = tasks.find((task) => {\n const metadata = isRecord(task.metadata) ? task.metadata : null;\n return (\n task.name === \"PROACTIVE_AGENT\" &&\n isRecord(metadata?.proactiveAgent) &&\n (metadata.proactiveAgent as Record<string, unknown>).kind ===\n \"runtime_runner\"\n );\n });\n const profile = proactiveTask\n ? readProfileFromMetadata(\n isRecord(proactiveTask.metadata)\n ? (proactiveTask.metadata as Record<string, unknown>)\n : null,\n )\n : null;\n const schedule = await this.refreshEffectiveScheduleState({\n timezone,\n now,\n });\n const adaptiveProfile = buildAdaptiveWindowProfile({\n profile,\n schedule,\n timeZone: timezone,\n });\n if (!adaptiveProfile) {\n this.adaptiveWindowPolicyCache = null;\n return null;\n }\n const policy = computeAdaptiveWindowPolicy(adaptiveProfile, timezone);\n this.adaptiveWindowPolicyCache = { policy, computedAt: now.getTime() };\n return policy;\n } catch (error) {\n this.logLifeOpsWarn(\n \"adaptive_window_policy\",\n \"[lifeops] Failed to resolve adaptive window policy; using defaults.\",\n { error: lifeOpsErrorMessage(error) },\n );\n this.adaptiveWindowPolicyCache = null;\n return null;\n }\n }\n\n public async refreshDefinitionOccurrences(\n definition: LifeOpsTaskDefinition,\n now = new Date(),\n ): Promise<LifeOpsOccurrence[]> {\n const existingOccurrences =\n await this.repository.listOccurrencesForDefinition(\n definition.agentId,\n definition.id,\n );\n\n // If the definition still uses the default time windows, adapt them\n // to the user's actual rhythm when an activity profile is available.\n let effectiveDefinition = definition;\n if (windowPolicyMatchesDefaults(definition.windowPolicy)) {\n const adaptivePolicy = await this.resolveAdaptiveWindowPolicy(\n definition.timezone,\n now,\n );\n if (adaptivePolicy) {\n effectiveDefinition = { ...definition, windowPolicy: adaptivePolicy };\n }\n }\n\n const materialized = materializeDefinitionOccurrences(\n effectiveDefinition,\n existingOccurrences,\n { now },\n );\n for (const occurrence of materialized) {\n await this.repository.upsertOccurrence(occurrence);\n }\n await this.repository.pruneNonTerminalOccurrences(\n definition.agentId,\n definition.id,\n materialized.map((occurrence) => occurrence.occurrenceKey),\n );\n return materialized;\n }\n\n public async getFreshOccurrence(\n occurrenceId: string,\n now = new Date(),\n ): Promise<{\n definition: LifeOpsTaskDefinition;\n occurrence: LifeOpsOccurrence;\n }> {\n const occurrence = await this.repository.getOccurrence(\n this.agentId(),\n occurrenceId,\n );\n if (!occurrence) {\n fail(404, \"life-ops occurrence not found\");\n }\n const definition = await this.repository.getDefinition(\n this.agentId(),\n occurrence.definitionId,\n );\n if (!definition) {\n fail(404, \"life-ops definition not found for occurrence\");\n }\n if (definition.status === \"active\") {\n await this.refreshDefinitionOccurrences(definition, now);\n }\n const freshOccurrence = await this.repository.getOccurrence(\n this.agentId(),\n occurrenceId,\n );\n if (!freshOccurrence) {\n fail(404, \"life-ops occurrence not found after refresh\");\n }\n return {\n definition,\n occurrence: freshOccurrence,\n };\n }\n\n public async resolvePrimaryChannelPolicy(\n channelType: LifeOpsChannelPolicy[\"channelType\"],\n ): Promise<LifeOpsChannelPolicy | null> {\n const policies = (\n await this.repository.listChannelPolicies(this.agentId())\n ).filter((policy) => policy.channelType === channelType);\n return (\n policies.find((policy) => policy.metadata.isPrimary === true) ??\n policies[0] ??\n null\n );\n }\n\n public async resolveRuntimeReminderTarget(\n channel: Exclude<\n LifeOpsReminderStep[\"channel\"],\n \"in_app\" | \"sms\" | \"voice\"\n >,\n policy: LifeOpsChannelPolicy | null,\n ownerContacts = loadOwnerContactsConfig(\n LIFEOPS_OWNER_CONTACTS_LOAD_CONTEXT,\n ),\n ownerContactHints?: Record<string, OwnerContactRoutingHint>,\n ): Promise<{\n source: string;\n connectorRef: string;\n target: RuntimeMessageTarget;\n resolution: RuntimeOwnerContactResolution;\n } | null> {\n const metadata = policy ? policy.metadata : null;\n const configuredSource =\n (metadata && normalizeOptionalString(metadata.source)) ??\n (metadata && normalizeOptionalString(metadata.platform)) ??\n channel;\n const hints =\n ownerContactHints ??\n (await loadOwnerContactRoutingHints(this.runtime, ownerContacts));\n const ownerEntityId = await this.ownerRoutingEntityId();\n const hint =\n hints[configuredSource] ??\n hints[channel] ??\n ({\n source: configuredSource,\n entityId: null,\n channelId: null,\n roomId: null,\n preferredCommunicationChannel: null,\n platformIdentities: [],\n lastResponseAt: null,\n lastResponseChannel: null,\n resolvedFrom: \"config\",\n } satisfies OwnerContactRoutingHint);\n const contactResolution =\n resolveOwnerContactWithFallback({\n ownerContacts,\n source: hint.source,\n ownerEntityId,\n }) ??\n resolveOwnerContactWithFallback({\n ownerContacts,\n source: channel,\n ownerEntityId,\n });\n const contact =\n contactResolution?.contact ??\n ownerContacts[hint.source] ??\n ownerContacts[channel];\n const entityId =\n (metadata && normalizeOptionalString(metadata.entityId)) ??\n normalizeOptionalString(hint.entityId) ??\n normalizeOptionalString(contact?.entityId) ??\n null;\n const channelId =\n (metadata && normalizeOptionalString(metadata.channelId)) ??\n normalizeOptionalString(hint.channelId) ??\n normalizeOptionalString(contact?.channelId) ??\n null;\n const roomId =\n (metadata && normalizeOptionalString(metadata.roomId)) ??\n normalizeOptionalString(hint.roomId) ??\n normalizeOptionalString(contact?.roomId) ??\n null;\n if (!entityId && !channelId && !roomId) {\n return null;\n }\n const targetRef =\n channelId ?? roomId ?? entityId ?? policy?.channelRef ?? null;\n return {\n source: contactResolution?.source ?? hint.source,\n connectorRef: `runtime:${contactResolution?.source ?? hint.source}:${targetRef}`,\n target: {\n source: contactResolution?.source ?? hint.source,\n entityId: entityId as RuntimeMessageTarget[\"entityId\"],\n channelId,\n roomId: roomId as RuntimeMessageTarget[\"roomId\"],\n } as RuntimeMessageTarget,\n resolution: {\n sourceOfTruth: hint.resolvedFrom,\n preferredCommunicationChannel: hint.preferredCommunicationChannel,\n platformIdentities: hint.platformIdentities,\n lastResponseAt: hint.lastResponseAt,\n lastResponseChannel: hint.lastResponseChannel,\n },\n };\n }\n\n public async readLifeOpsAttentionContext(args?: {\n timezone?: string | null;\n now?: Date;\n }): Promise<ReminderActivityProfileSnapshot | null> {\n try {\n const now = args?.now ?? new Date();\n const schedule = await this.refreshEffectiveScheduleState({\n timezone:\n normalizeOptionalString(args?.timezone) ?? resolveDefaultTimeZone(),\n now,\n });\n const tasks = await this.runtime.getTasks({\n agentIds: [this.runtime.agentId],\n tags: [...PROACTIVE_TASK_QUERY_TAGS],\n });\n const proactiveTask = tasks.find((task) => {\n const metadata = isRecord(task.metadata) ? task.metadata : null;\n return (\n task.name === \"PROACTIVE_AGENT\" &&\n isRecord(metadata?.proactiveAgent) &&\n metadata.proactiveAgent.kind === \"runtime_runner\"\n );\n });\n const profile =\n proactiveTask && isRecord(proactiveTask.metadata)\n ? proactiveTask.metadata.activityProfile\n : null;\n if (!isRecord(profile) && !schedule) {\n return null;\n }\n const profileLastSeenAt =\n isRecord(profile) && typeof profile.lastSeenAt === \"number\"\n ? profile.lastSeenAt\n : null;\n const scheduleLastSeenAt = schedule?.lastActiveAt\n ? Date.parse(schedule.lastActiveAt)\n : null;\n const lastSeenAt = profileLastSeenAt ?? scheduleLastSeenAt;\n return {\n source:\n isRecord(profile) && schedule\n ? \"mixed\"\n : isRecord(profile)\n ? \"proactive_activity_profile\"\n : schedule\n ? \"schedule_state\"\n : \"unknown\",\n capturedAt: now.toISOString(),\n sourceFreshnessMs:\n lastSeenAt !== null\n ? Math.max(0, now.getTime() - lastSeenAt)\n : null,\n sourceConfidence: schedule?.stateConfidence ?? null,\n privacyMode: \"unknown\",\n socialContext: \"unknown\",\n locationSafety: \"unknown\",\n primaryPlatform: isRecord(profile)\n ? (normalizeOptionalString(profile.primaryPlatform) ?? null)\n : null,\n secondaryPlatform: isRecord(profile)\n ? (normalizeOptionalString(profile.secondaryPlatform) ?? null)\n : null,\n lastSeenPlatform: isRecord(profile)\n ? (normalizeOptionalString(profile.lastSeenPlatform) ?? null)\n : null,\n isCurrentlyActive:\n isRecord(profile) && profile.isCurrentlyActive === true,\n lastSeenAt,\n circadianState: schedule?.circadianState ?? \"unclear\",\n stateConfidence: schedule?.stateConfidence ?? 0,\n lastSleepEndedAt: schedule?.lastSleepEndedAt ?? null,\n nextMealLabel: schedule?.nextMealLabel ?? null,\n nextMealWindowStartAt: schedule?.nextMealWindowStartAt ?? null,\n nextMealWindowEndAt: schedule?.nextMealWindowEndAt ?? null,\n calendarBusy: isRecord(profile) && profile.calendarBusy === true,\n dndActive: isRecord(profile) && profile.dndActive === true,\n hasCalendarData:\n isRecord(profile) && typeof profile.hasCalendarData === \"boolean\"\n ? profile.hasCalendarData\n : false,\n avgWeekdayMeetings:\n isRecord(profile) && typeof profile.avgWeekdayMeetings === \"number\"\n ? profile.avgWeekdayMeetings\n : null,\n hasOpenActivityCycle:\n isRecord(profile) && profile.hasOpenActivityCycle === true,\n currentActivityCycleStartedAt:\n isRecord(profile) &&\n typeof profile.currentActivityCycleStartedAt === \"number\"\n ? profile.currentActivityCycleStartedAt\n : null,\n screenContextFocus: isRecord(profile)\n ? normalizeScreenContextFocus(profile.screenContextFocus)\n : null,\n screenContextBusy:\n isRecord(profile) && profile.screenContextBusy === true,\n screenContextAvailable:\n isRecord(profile) && profile.screenContextAvailable === true,\n screenContextStale:\n isRecord(profile) && profile.screenContextStale === true,\n screenContextConfidence:\n isRecord(profile) &&\n typeof profile.screenContextConfidence === \"number\"\n ? profile.screenContextConfidence\n : null,\n };\n } catch (error) {\n this.logLifeOpsWarn(\n \"reminder_activity_profile\",\n \"[lifeops] Failed to read proactive activity profile; using connector order for owner contact routing.\",\n {\n error: lifeOpsErrorMessage(error),\n },\n );\n return null;\n }\n }\n\n public async readReminderActivityProfileSnapshot(args?: {\n timezone?: string | null;\n now?: Date;\n }): Promise<ReminderActivityProfileSnapshot | null> {\n return this.readLifeOpsAttentionContext(args);\n }\n\n /**\n * Scan recent \"delivered\" attempts and upgrade to \"delivered_read\" when the\n * owner was seen active after the reminder was sent. This gives escalation\n * better signal about whether the owner is reachable.\n */\n public async scanReadReceipts(\n attempts: LifeOpsReminderAttempt[],\n activityProfile: ReminderActivityProfileSnapshot | null,\n now: Date,\n ): Promise<void> {\n if (!activityProfile?.lastSeenAt) {\n return;\n }\n const RECEIPT_SCAN_WINDOW_MS = 4 * 60 * 60 * 1000; // 4 hours\n const cutoff = now.getTime() - RECEIPT_SCAN_WINDOW_MS;\n const candidates = attempts.filter((attempt) => {\n if (attempt.outcome !== \"delivered\") {\n return false;\n }\n const attemptedMs = attempt.attemptedAt\n ? Date.parse(attempt.attemptedAt)\n : 0;\n return attemptedMs > cutoff;\n });\n\n for (const attempt of candidates) {\n const attemptedMs = attempt.attemptedAt\n ? Date.parse(attempt.attemptedAt)\n : 0;\n if (activityProfile.lastSeenAt > attemptedMs) {\n try {\n await this.repository.updateReminderAttemptOutcome(\n attempt.id,\n \"delivered_read\",\n { readDetectedAt: now.toISOString() },\n );\n attempt.outcome = \"delivered_read\";\n } catch (error) {\n this.logLifeOpsWarn(\n \"read_receipt_scan\",\n `[lifeops] Failed to update read receipt for attempt ${attempt.id}`,\n { error: lifeOpsErrorMessage(error) },\n );\n }\n }\n }\n }\n\n public buildReminderPlanSchedule(args: {\n ownerType: \"occurrence\" | \"calendar_event\";\n ownerId: string;\n occurrenceId: string | null;\n title: string;\n plan: LifeOpsReminderPlan;\n occurrence?: Pick<\n LifeOpsOccurrenceView,\n \"relevanceStartAt\" | \"snoozedUntil\"\n > | null;\n eventStartAt?: string | null;\n }): Array<{\n ownerType: \"occurrence\" | \"calendar_event\";\n ownerId: string;\n occurrenceId: string | null;\n title: string;\n channel: LifeOpsReminderStep[\"channel\"];\n stepIndex: number;\n scheduledFor: string;\n }> {\n const rows: Array<{\n ownerType: \"occurrence\" | \"calendar_event\";\n ownerId: string;\n occurrenceId: string | null;\n title: string;\n channel: LifeOpsReminderStep[\"channel\"];\n stepIndex: number;\n scheduledFor: string;\n }> = [];\n if (args.ownerType === \"occurrence\") {\n const anchorIso =\n args.occurrence?.snoozedUntil ?? args.occurrence?.relevanceStartAt;\n if (!anchorIso) {\n return rows;\n }\n const anchorDate = new Date(anchorIso);\n for (const [stepIndex, step] of args.plan.steps.entries()) {\n rows.push({\n ownerType: args.ownerType,\n ownerId: args.ownerId,\n occurrenceId: args.occurrenceId,\n title: args.title,\n channel: step.channel,\n stepIndex,\n scheduledFor: addMinutes(\n anchorDate,\n step.offsetMinutes,\n ).toISOString(),\n });\n }\n return rows;\n }\n if (!args.eventStartAt) {\n return rows;\n }\n const eventStartAt = new Date(args.eventStartAt);\n for (const [stepIndex, step] of args.plan.steps.entries()) {\n rows.push({\n ownerType: args.ownerType,\n ownerId: args.ownerId,\n occurrenceId: args.occurrenceId,\n title: args.title,\n channel: step.channel,\n stepIndex,\n scheduledFor: addMinutes(\n eventStartAt,\n -step.offsetMinutes,\n ).toISOString(),\n });\n }\n return rows;\n }\n\n public async resolveOwnerContactRouteCandidates(args: {\n purpose?: ContactRoutePurpose;\n activityProfile: ReminderActivityProfileSnapshot | null;\n policies: LifeOpsChannelPolicy[];\n urgency: LifeOpsReminderUrgency;\n attempts?: LifeOpsReminderAttempt[];\n now?: Date;\n }) {\n const ownerContacts = loadOwnerContactsConfig(\n LIFEOPS_OWNER_CONTACTS_LOAD_CONTEXT,\n );\n const ownerContactHints = await loadOwnerContactRoutingHints(\n this.runtime,\n ownerContacts,\n );\n return resolveContactRouteCandidates({\n purpose: args.purpose,\n activityProfile: args.activityProfile,\n ownerContactHints,\n ownerContactSources: Object.keys(ownerContacts),\n policies: args.policies,\n urgency: args.urgency,\n attempts: args.attempts,\n now: args.now,\n callbacks: {\n runtimeTargetSendAvailable:\n typeof this.runtime.sendMessageToTarget === \"function\",\n resolvePrimaryChannelPolicy: (channel) =>\n this.resolvePrimaryChannelPolicy(channel),\n hasRuntimeTarget: async (channel, policy) => {\n if (\n channel === \"in_app\" ||\n channel === \"sms\" ||\n channel === \"voice\"\n ) {\n return false;\n }\n return (\n (await this.resolveRuntimeReminderTarget(\n channel,\n policy,\n ownerContacts,\n ownerContactHints,\n )) !== null\n );\n },\n },\n });\n }\n\n public async resolveReminderEscalationRouteCandidates(args: {\n activityProfile: ReminderActivityProfileSnapshot | null;\n policies: LifeOpsChannelPolicy[];\n urgency: LifeOpsReminderUrgency;\n attempts?: LifeOpsReminderAttempt[];\n now?: Date;\n }) {\n return this.resolveOwnerContactRouteCandidates({\n ...args,\n purpose: \"reminder_escalation\",\n });\n }\n\n public async buildOwnerContactRouteEventMetadata(args: {\n purpose: ContactRoutePurpose;\n urgency: LifeOpsReminderUrgency;\n now: Date;\n }): Promise<Record<string, unknown>> {\n try {\n const [activityProfile, policies] = await Promise.all([\n this.readReminderActivityProfileSnapshot({ now: args.now }),\n this.repository.listChannelPolicies(this.agentId()),\n ]);\n const candidates = await this.resolveOwnerContactRouteCandidates({\n purpose: args.purpose,\n activityProfile,\n policies,\n urgency: args.urgency,\n attempts: [],\n now: args.now,\n });\n return {\n contactRoutePurpose: args.purpose,\n contactRouteCandidates: serializeContactRouteCandidates(candidates),\n };\n } catch (error) {\n this.logLifeOpsWarn(\n \"owner_contact_route_metadata\",\n \"[lifeops] Failed to resolve owner contact route metadata.\",\n {\n purpose: args.purpose,\n error: lifeOpsErrorMessage(error),\n },\n );\n return {\n contactRoutePurpose: args.purpose,\n contactRouteCandidates: [],\n contactRouteError: lifeOpsErrorMessage(error),\n };\n }\n }\n\n public async resolveReminderEscalationChannels(args: {\n activityProfile: ReminderActivityProfileSnapshot | null;\n policies: LifeOpsChannelPolicy[];\n urgency: LifeOpsReminderUrgency;\n attempts?: LifeOpsReminderAttempt[];\n now?: Date;\n }): Promise<LifeOpsReminderChannel[]> {\n const candidates =\n await this.resolveReminderEscalationRouteCandidates(args);\n return candidates\n .filter((candidate) => candidate.vetoReasons.length === 0)\n .map((candidate) => candidate.channel);\n }\n\n public async markReminderEscalationStarted(args: {\n ownerType: \"occurrence\" | \"calendar_event\";\n ownerId: string;\n attemptedAt: string;\n channel: LifeOpsReminderChannel;\n outcome: LifeOpsReminderAttemptOutcome;\n }): Promise<void> {\n if (args.ownerType === \"occurrence\") {\n const occurrence = await this.repository.getOccurrence(\n this.agentId(),\n args.ownerId,\n );\n if (!occurrence) {\n return;\n }\n const channels = Array.isArray(\n occurrence.metadata[REMINDER_ESCALATION_CHANNELS_METADATA_KEY],\n )\n ? (\n occurrence.metadata[\n REMINDER_ESCALATION_CHANNELS_METADATA_KEY\n ] as unknown[]\n ).filter(isReminderChannel)\n : [];\n const nextChannels = [...new Set([...channels, args.channel])];\n await this.repository.updateOccurrence({\n ...occurrence,\n metadata: {\n ...occurrence.metadata,\n [REMINDER_ESCALATION_STARTED_AT_METADATA_KEY]:\n typeof occurrence.metadata[\n REMINDER_ESCALATION_STARTED_AT_METADATA_KEY\n ] === \"string\"\n ? occurrence.metadata[\n REMINDER_ESCALATION_STARTED_AT_METADATA_KEY\n ]\n : args.attemptedAt,\n [REMINDER_ESCALATION_LAST_ATTEMPT_AT_METADATA_KEY]:\n args.attemptedAt,\n [REMINDER_ESCALATION_LAST_CHANNEL_METADATA_KEY]: args.channel,\n [REMINDER_ESCALATION_LAST_OUTCOME_METADATA_KEY]: args.outcome,\n [REMINDER_ESCALATION_CHANNELS_METADATA_KEY]: nextChannels,\n },\n updatedAt: new Date().toISOString(),\n });\n return;\n }\n const event = (\n await this.repository.listCalendarEvents(this.agentId(), \"google\")\n ).find((candidate) => candidate.id === args.ownerId);\n if (!event) {\n return;\n }\n const channels = Array.isArray(\n event.metadata[REMINDER_ESCALATION_CHANNELS_METADATA_KEY],\n )\n ? (\n event.metadata[\n REMINDER_ESCALATION_CHANNELS_METADATA_KEY\n ] as unknown[]\n ).filter(isReminderChannel)\n : [];\n const nextChannels = [...new Set([...channels, args.channel])];\n await this.repository.upsertCalendarEvent({\n ...event,\n metadata: {\n ...event.metadata,\n [REMINDER_ESCALATION_STARTED_AT_METADATA_KEY]:\n typeof event.metadata[\n REMINDER_ESCALATION_STARTED_AT_METADATA_KEY\n ] === \"string\"\n ? event.metadata[REMINDER_ESCALATION_STARTED_AT_METADATA_KEY]\n : args.attemptedAt,\n [REMINDER_ESCALATION_LAST_ATTEMPT_AT_METADATA_KEY]: args.attemptedAt,\n [REMINDER_ESCALATION_LAST_CHANNEL_METADATA_KEY]: args.channel,\n [REMINDER_ESCALATION_LAST_OUTCOME_METADATA_KEY]: args.outcome,\n [REMINDER_ESCALATION_CHANNELS_METADATA_KEY]: nextChannels,\n },\n updatedAt: new Date().toISOString(),\n });\n }\n\n public async resolveReminderEscalation(args: {\n ownerType: \"occurrence\" | \"calendar_event\";\n ownerId: string;\n resolvedAt: string;\n resolution: \"acknowledged\" | \"completed\" | \"skipped\" | \"snoozed\";\n note?: string | null;\n }): Promise<void> {\n const attempts = await this.repository.listReminderAttempts(\n this.agentId(),\n {\n ownerType: args.ownerType,\n ownerId: args.ownerId,\n },\n );\n const escalationAttempts = attempts.filter(\n (attempt) => readReminderAttemptLifecycle(attempt) === \"escalation\",\n );\n const latestEscalation = escalationAttempts.at(-1) ?? null;\n if (!latestEscalation) {\n return;\n }\n const latestEscalationAt = Date.parse(\n latestEscalation.attemptedAt ?? latestEscalation.scheduledFor,\n );\n if (args.ownerType === \"occurrence\") {\n const occurrence = await this.repository.getOccurrence(\n this.agentId(),\n args.ownerId,\n );\n if (!occurrence) {\n return;\n }\n const resolvedAtValue =\n typeof occurrence.metadata[\n REMINDER_ESCALATION_RESOLVED_AT_METADATA_KEY\n ] === \"string\"\n ? occurrence.metadata[REMINDER_ESCALATION_RESOLVED_AT_METADATA_KEY]\n : null;\n if (\n resolvedAtValue &&\n Date.parse(resolvedAtValue) >= latestEscalationAt\n ) {\n return;\n }\n await this.repository.updateOccurrence({\n ...occurrence,\n metadata: {\n ...occurrence.metadata,\n [REMINDER_ESCALATION_RESOLVED_AT_METADATA_KEY]: args.resolvedAt,\n [REMINDER_ESCALATION_RESOLUTION_METADATA_KEY]: args.resolution,\n [REMINDER_ESCALATION_RESOLUTION_NOTE_METADATA_KEY]:\n args.note ?? null,\n },\n updatedAt: new Date().toISOString(),\n });\n } else {\n const event = (\n await this.repository.listCalendarEvents(this.agentId(), \"google\")\n ).find((candidate) => candidate.id === args.ownerId);\n if (!event) {\n return;\n }\n const resolvedAtValue =\n typeof event.metadata[\n REMINDER_ESCALATION_RESOLVED_AT_METADATA_KEY\n ] === \"string\"\n ? event.metadata[REMINDER_ESCALATION_RESOLVED_AT_METADATA_KEY]\n : null;\n if (\n resolvedAtValue &&\n Date.parse(resolvedAtValue) >= latestEscalationAt\n ) {\n return;\n }\n await this.repository.upsertCalendarEvent({\n ...event,\n metadata: {\n ...event.metadata,\n [REMINDER_ESCALATION_RESOLVED_AT_METADATA_KEY]: args.resolvedAt,\n [REMINDER_ESCALATION_RESOLUTION_METADATA_KEY]: args.resolution,\n [REMINDER_ESCALATION_RESOLUTION_NOTE_METADATA_KEY]:\n args.note ?? null,\n },\n updatedAt: new Date().toISOString(),\n });\n }\n await this.recordReminderAudit(\n \"reminder_escalation_resolved\",\n args.ownerType,\n args.ownerId,\n \"reminder escalation resolved\",\n {\n resolution: args.resolution,\n note: args.note ?? null,\n },\n {\n resolvedAt: args.resolvedAt,\n lastEscalationChannel: latestEscalation.channel,\n lastEscalationOutcome: latestEscalation.outcome,\n },\n );\n }\n\n public async resolveReminderReviewFromOwnerResponse(args: {\n ownerType: \"occurrence\" | \"calendar_event\";\n ownerId: string;\n attempt: LifeOpsReminderAttempt;\n reviewedAt: string;\n resolution: \"acknowledged\" | \"completed\" | \"skipped\" | \"snoozed\";\n responseText: string | null;\n respondedAt: string | null;\n snoozeRequest: SnoozeLifeOpsOccurrenceRequest | null;\n confidence: number;\n reason: string;\n classifierSource?: string | null;\n semanticReason?: string | null;\n }): Promise<void> {\n if (args.resolution === \"snoozed\") {\n if (args.ownerType !== \"occurrence\" || !args.snoozeRequest) {\n await this.markReminderReviewObservedResponse({\n attempt: args.attempt,\n decision: \"needs_clarification\",\n respondedAt: args.respondedAt,\n responseText: args.responseText,\n reason: \"snooze_resolution_missing_reschedulable_occurrence\",\n classifierSource: args.classifierSource,\n semanticReason: args.semanticReason,\n });\n return;\n }\n }\n const reviewMetadata = {\n [REMINDER_REVIEW_STATUS_METADATA_KEY]: \"resolved\",\n [REMINDER_REVIEW_DECISION_METADATA_KEY]: args.resolution,\n [REMINDER_REVIEW_RESPONDED_AT_METADATA_KEY]: args.respondedAt,\n [REMINDER_REVIEW_RESPONSE_TEXT_METADATA_KEY]: args.responseText,\n reviewConfidence: args.confidence,\n reviewReason: args.reason,\n [REMINDER_REVIEW_CLASSIFIER_SOURCE_METADATA_KEY]:\n args.classifierSource ?? null,\n [REMINDER_REVIEW_SEMANTIC_REASON_METADATA_KEY]:\n args.semanticReason ?? null,\n };\n const acknowledgementNote = args.responseText\n ? `Owner replied: ${args.responseText}`\n : args.reason;\n if (args.resolution === \"snoozed\") {\n if (!args.snoozeRequest) {\n // Unreachable: the resolution-validation block above early-returns\n // when a snoozed resolution lacks a snoozeRequest. Re-assert so the\n // type system narrows it to non-null for snoozeOccurrence.\n throw new Error(\n \"snoozeRequest is required to snooze a reminder occurrence\",\n );\n }\n await this.snoozeOccurrence(\n args.ownerId,\n args.snoozeRequest,\n new Date(args.respondedAt ?? args.reviewedAt),\n );\n await this.repository.updateReminderAttemptOutcome(\n args.attempt.id,\n args.attempt.outcome,\n reviewMetadata,\n );\n Object.assign(args.attempt.deliveryMetadata, reviewMetadata);\n args.attempt.reviewStatus = \"resolved\";\n return;\n }\n await this.repository.updateReminderAttemptOutcome(\n args.attempt.id,\n args.attempt.outcome,\n reviewMetadata,\n );\n Object.assign(args.attempt.deliveryMetadata, reviewMetadata);\n args.attempt.reviewStatus = \"resolved\";\n if (args.ownerType === \"occurrence\") {\n const occurrence = await this.repository.getOccurrence(\n this.agentId(),\n args.ownerId,\n );\n if (occurrence) {\n await this.repository.updateOccurrence({\n ...occurrence,\n metadata: {\n ...occurrence.metadata,\n reminderAcknowledgedAt: args.respondedAt ?? args.reviewedAt,\n reminderAcknowledgedNote: acknowledgementNote,\n reminderAcknowledgedResolution: args.resolution,\n },\n updatedAt: new Date().toISOString(),\n });\n }\n } else {\n const event = (\n await this.repository.listCalendarEvents(this.agentId(), \"google\")\n ).find((candidate) => candidate.id === args.ownerId);\n if (event) {\n await this.repository.upsertCalendarEvent({\n ...event,\n metadata: {\n ...event.metadata,\n reminderAcknowledgedAt: args.respondedAt ?? args.reviewedAt,\n reminderAcknowledgedNote: acknowledgementNote,\n reminderAcknowledgedResolution: args.resolution,\n },\n updatedAt: new Date().toISOString(),\n });\n }\n }\n await this.resolveReminderEscalation({\n ownerType: args.ownerType,\n ownerId: args.ownerId,\n resolvedAt: args.respondedAt ?? args.reviewedAt,\n resolution: args.resolution,\n note: acknowledgementNote,\n });\n }\n\n public async markReminderReviewResolvedFromState(args: {\n ownerType: \"occurrence\" | \"calendar_event\";\n ownerId: string;\n attempt: LifeOpsReminderAttempt;\n resolvedAt: string;\n resolution: \"acknowledged\" | \"completed\" | \"skipped\" | \"snoozed\";\n reason: string;\n }): Promise<void> {\n const reviewMetadata = {\n [REMINDER_REVIEW_STATUS_METADATA_KEY]: \"resolved\",\n [REMINDER_REVIEW_DECISION_METADATA_KEY]: args.resolution,\n reviewReason: args.reason,\n };\n await this.repository.updateReminderAttemptOutcome(\n args.attempt.id,\n args.attempt.outcome,\n reviewMetadata,\n );\n Object.assign(args.attempt.deliveryMetadata, reviewMetadata);\n args.attempt.reviewStatus = \"resolved\";\n await this.resolveReminderEscalation({\n ownerType: args.ownerType,\n ownerId: args.ownerId,\n resolvedAt: args.resolvedAt,\n resolution: args.resolution,\n note: args.reason,\n });\n }\n\n public async markReminderReviewEscalated(args: {\n attempt: LifeOpsReminderAttempt;\n escalatedAttempt: LifeOpsReminderAttempt;\n escalatedAt: string;\n }): Promise<void> {\n const reviewMetadata = {\n [REMINDER_REVIEW_STATUS_METADATA_KEY]: \"escalated\",\n [REMINDER_REVIEW_DECISION_METADATA_KEY]: \"escalate\",\n [REMINDER_REVIEW_ESCALATED_AT_METADATA_KEY]: args.escalatedAt,\n [REMINDER_REVIEW_ESCALATED_ATTEMPT_ID_METADATA_KEY]:\n args.escalatedAttempt.id,\n [REMINDER_REVIEW_ESCALATED_CHANNEL_METADATA_KEY]:\n args.escalatedAttempt.channel,\n };\n await this.repository.updateReminderAttemptOutcome(\n args.attempt.id,\n args.attempt.outcome,\n reviewMetadata,\n );\n Object.assign(args.attempt.deliveryMetadata, reviewMetadata);\n args.attempt.reviewStatus = \"escalated\";\n }\n\n public async markReminderReviewClarificationRequested(args: {\n attempt: LifeOpsReminderAttempt;\n clarificationAttempt: LifeOpsReminderAttempt;\n requestedAt: string;\n }): Promise<void> {\n const reviewMetadata = {\n [REMINDER_REVIEW_STATUS_METADATA_KEY]: \"clarification_requested\",\n [REMINDER_REVIEW_DECISION_METADATA_KEY]: \"clarify\",\n [REMINDER_REVIEW_ESCALATED_AT_METADATA_KEY]: args.requestedAt,\n [REMINDER_REVIEW_ESCALATED_ATTEMPT_ID_METADATA_KEY]:\n args.clarificationAttempt.id,\n [REMINDER_REVIEW_ESCALATED_CHANNEL_METADATA_KEY]:\n args.clarificationAttempt.channel,\n };\n await this.repository.updateReminderAttemptOutcome(\n args.attempt.id,\n args.attempt.outcome,\n reviewMetadata,\n );\n Object.assign(args.attempt.deliveryMetadata, reviewMetadata);\n args.attempt.reviewStatus = \"clarification_requested\";\n }\n\n public async markReminderReviewObservedResponse(args: {\n attempt: LifeOpsReminderAttempt;\n decision: \"unrelated\" | \"needs_clarification\" | \"no_response\";\n respondedAt: string | null;\n responseText: string | null;\n reason: string;\n classifierSource?: string | null;\n semanticReason?: string | null;\n }): Promise<void> {\n const reviewMetadata = {\n [REMINDER_REVIEW_STATUS_METADATA_KEY]: args.decision,\n [REMINDER_REVIEW_DECISION_METADATA_KEY]: args.decision,\n [REMINDER_REVIEW_RESPONDED_AT_METADATA_KEY]: args.respondedAt,\n [REMINDER_REVIEW_RESPONSE_TEXT_METADATA_KEY]: args.responseText,\n reviewReason: args.reason,\n [REMINDER_REVIEW_CLASSIFIER_SOURCE_METADATA_KEY]:\n args.classifierSource ?? null,\n [REMINDER_REVIEW_SEMANTIC_REASON_METADATA_KEY]:\n args.semanticReason ?? null,\n };\n await this.repository.updateReminderAttemptOutcome(\n args.attempt.id,\n args.attempt.outcome,\n reviewMetadata,\n );\n Object.assign(args.attempt.deliveryMetadata, reviewMetadata);\n args.attempt.reviewStatus = args.decision;\n }\n\n public async processDueReminderReviewJobs(args: {\n now: Date;\n limit: number;\n attempts: LifeOpsReminderAttempt[];\n policies: LifeOpsChannelPolicy[];\n activityProfile: ReminderActivityProfileSnapshot | null;\n timezone: string;\n defaultIntensity: LifeOpsReminderIntensity;\n }): Promise<LifeOpsReminderAttempt[]> {\n if (args.limit <= 0) {\n return [];\n }\n const nowIso = args.now.toISOString();\n const dueReviewAttempts =\n typeof this.repository.claimDueReminderReviewAttempts === \"function\"\n ? await this.repository.claimDueReminderReviewAttempts(\n this.agentId(),\n nowIso,\n args.limit,\n crypto.randomUUID(),\n )\n : await this.repository.listDueReminderReviewAttempts(\n this.agentId(),\n nowIso,\n args.limit,\n );\n if (dueReviewAttempts.length === 0) {\n return [];\n }\n const allAttempts = [...args.attempts];\n const attemptsById = new Map(\n allAttempts.map((attempt) => [attempt.id, attempt]),\n );\n for (const attempt of dueReviewAttempts) {\n if (!attemptsById.has(attempt.id)) {\n allAttempts.push(attempt);\n attemptsById.set(attempt.id, attempt);\n }\n }\n\n const dispatchedAttempts: LifeOpsReminderAttempt[] = [];\n let calendarEvents: LifeOpsCalendarEvent[] | null = null;\n for (const dueReviewAttempt of dueReviewAttempts) {\n const reviewAttempt =\n attemptsById.get(dueReviewAttempt.id) ?? dueReviewAttempt;\n if (dispatchedAttempts.length >= args.limit) {\n break;\n }\n if (isReminderReviewClosed(reviewAttempt)) {\n continue;\n }\n const plan = await this.repository.getReminderPlan(\n this.agentId(),\n reviewAttempt.planId,\n );\n if (!plan) {\n continue;\n }\n\n if (reviewAttempt.ownerType === \"occurrence\") {\n const occurrence = await this.repository.getOccurrenceView(\n this.agentId(),\n reviewAttempt.ownerId,\n );\n if (!occurrence) {\n continue;\n }\n const stateResolution =\n occurrence.state === \"completed\"\n ? \"completed\"\n : occurrence.state === \"skipped\"\n ? \"skipped\"\n : occurrence.state === \"snoozed\"\n ? \"snoozed\"\n : occurrence.metadata.reminderAcknowledgedAt\n ? \"acknowledged\"\n : null;\n if (stateResolution) {\n await this.markReminderReviewResolvedFromState({\n ownerType: \"occurrence\",\n ownerId: occurrence.id,\n attempt: reviewAttempt,\n resolvedAt: nowIso,\n resolution: stateResolution,\n reason: `occurrence_state_${occurrence.state}`,\n });\n continue;\n }\n const definition = await this.repository.getDefinition(\n this.agentId(),\n occurrence.definitionId,\n );\n const preference = definition\n ? await this.getReminderPreference(definition.id)\n : null;\n const attempt = await this.dispatchDueReminderEscalation({\n plan,\n ownerType: \"occurrence\",\n ownerId: occurrence.id,\n occurrenceId: occurrence.id,\n subjectType: occurrence.subjectType,\n title: occurrence.title,\n dueAt: occurrence.dueAt,\n urgency: resolveReminderDeliveryUrgency({\n metadata: occurrence.metadata,\n priority: occurrence.priority,\n }),\n intensity: preference?.effective.intensity ?? args.defaultIntensity,\n quietHours: plan.quietHours,\n attemptedAt: nowIso,\n now: args.now,\n attempts: allAttempts,\n policies: args.policies,\n activityProfile: args.activityProfile,\n occurrence,\n acknowledged: false,\n nearbyReminderTitles: [],\n timezone: args.timezone,\n definition,\n reviewAttempt,\n });\n if (attempt) {\n dispatchedAttempts.push(attempt);\n allAttempts.push(attempt);\n attemptsById.set(attempt.id, attempt);\n }\n continue;\n }\n\n if (reviewAttempt.ownerType === \"calendar_event\") {\n calendarEvents ??= await this.repository.listCalendarEvents(\n this.agentId(),\n \"google\",\n );\n const event =\n calendarEvents.find(\n (candidate) => candidate.id === reviewAttempt.ownerId,\n ) ?? null;\n if (!event) {\n continue;\n }\n if (event.metadata.reminderAcknowledgedAt) {\n await this.markReminderReviewResolvedFromState({\n ownerType: \"calendar_event\",\n ownerId: event.id,\n attempt: reviewAttempt,\n resolvedAt: nowIso,\n resolution: \"acknowledged\",\n reason: \"calendar_event_already_acknowledged\",\n });\n continue;\n }\n const attempt = await this.dispatchDueReminderEscalation({\n plan,\n ownerType: \"calendar_event\",\n ownerId: event.id,\n occurrenceId: null,\n subjectType: \"owner\",\n title: event.title,\n dueAt: event.startAt,\n urgency: resolveReminderDeliveryUrgency({\n metadata: event.metadata,\n fallback: \"medium\",\n }),\n intensity: args.defaultIntensity,\n quietHours: plan.quietHours,\n attemptedAt: nowIso,\n now: args.now,\n attempts: allAttempts,\n policies: args.policies,\n activityProfile: args.activityProfile,\n eventStartAt: event.startAt,\n acknowledged: false,\n nearbyReminderTitles: [],\n timezone: args.timezone,\n definition: null,\n reviewAttempt,\n });\n if (attempt) {\n dispatchedAttempts.push(attempt);\n allAttempts.push(attempt);\n attemptsById.set(attempt.id, attempt);\n }\n }\n }\n return dispatchedAttempts;\n }\n\n public async dispatchDueReminderEscalation(args: {\n plan: LifeOpsReminderPlan;\n ownerType: \"occurrence\" | \"calendar_event\";\n ownerId: string;\n occurrenceId: string | null;\n subjectType: LifeOpsSubjectType;\n title: string;\n dueAt: string | null;\n urgency: LifeOpsReminderUrgency;\n intensity: LifeOpsReminderIntensity;\n quietHours: LifeOpsReminderPlan[\"quietHours\"];\n attemptedAt: string;\n now: Date;\n attempts: LifeOpsReminderAttempt[];\n policies: LifeOpsChannelPolicy[];\n activityProfile: ReminderActivityProfileSnapshot | null;\n occurrence?: Pick<\n LifeOpsOccurrenceView,\n \"relevanceStartAt\" | \"snoozedUntil\" | \"metadata\" | \"state\"\n > | null;\n eventStartAt?: string | null;\n acknowledged: boolean;\n nearbyReminderTitles?: string[];\n timezone: string;\n definition: Pick<LifeOpsTaskDefinition, \"kind\" | \"metadata\"> | null;\n reviewAttempt?: LifeOpsReminderAttempt | null;\n }): Promise<LifeOpsReminderAttempt | null> {\n if (!shouldDeliverReminderForIntensity(args.intensity, args.urgency)) {\n return null;\n }\n if (args.acknowledged || args.urgency === \"low\") {\n return null;\n }\n const ownerAttempts = args.attempts.filter(\n (attempt) =>\n attempt.ownerType === args.ownerType &&\n attempt.ownerId === args.ownerId,\n );\n if (ownerAttempts.length === 0) {\n return null;\n }\n const escalationAttempts = ownerAttempts.filter(\n (attempt) => readReminderAttemptLifecycle(attempt) === \"escalation\",\n );\n const schedule = this.buildReminderPlanSchedule({\n ownerType: args.ownerType,\n ownerId: args.ownerId,\n occurrenceId: args.occurrenceId,\n title: args.title,\n plan: args.plan,\n occurrence: args.occurrence ?? null,\n eventStartAt: args.eventStartAt ?? null,\n });\n if (schedule.length === 0) {\n return null;\n }\n const lastNormalAttempt = ownerAttempts\n .filter((attempt) => readReminderAttemptLifecycle(attempt) === \"plan\")\n .at(-1);\n if (!lastNormalAttempt) {\n return null;\n }\n const lastScheduledPlanEntry = schedule[schedule.length - 1];\n const lastScheduledPlanTime = Date.parse(\n lastScheduledPlanEntry.scheduledFor,\n );\n const nowMs = args.now.getTime();\n const planExhausted = nowMs >= lastScheduledPlanTime;\n const reviewAttempt =\n args.reviewAttempt ??\n readLatestPendingReminderReviewAttempt(ownerAttempts);\n const reviewAt = reviewAttempt\n ? readReminderReviewAt(reviewAttempt)\n : null;\n const reviewDue = reviewAt !== null && Date.parse(reviewAt) <= nowMs;\n if (\n !reviewDue &&\n !planExhausted &&\n !shouldEscalateImmediately(lastNormalAttempt.outcome)\n ) {\n return null;\n }\n const lastScheduledPlanAttempt = ownerAttempts.find(\n (attempt) =>\n readReminderAttemptLifecycle(attempt) === \"plan\" &&\n attempt.stepIndex === lastScheduledPlanEntry.stepIndex &&\n attempt.scheduledFor === lastScheduledPlanEntry.scheduledFor,\n );\n const gatingPlanAttempt = planExhausted\n ? lastScheduledPlanAttempt\n : lastNormalAttempt;\n if (!reviewDue && !gatingPlanAttempt && escalationAttempts.length === 0) {\n return null;\n }\n\n const previousAttempt =\n (reviewDue ? reviewAttempt : null) ??\n escalationAttempts.at(-1) ??\n gatingPlanAttempt ??\n lastNormalAttempt;\n if (!previousAttempt) {\n return null;\n }\n const escalationProfile = readReminderEscalationProfile(args.definition);\n const enforcementState = buildReminderEnforcementState(\n args.now,\n args.timezone,\n args.definition,\n { voice: readTwilioCredentialsFromEnv() !== null },\n );\n let forceChannel = resolveReminderEscalationProfileDecision({\n normalDelayMinutes: null,\n state: enforcementState,\n urgency: args.urgency,\n profile: escalationProfile,\n }).forceChannel;\n let scheduledFor = reviewDue ? reviewAt : null;\n if (!scheduledFor) {\n const baseDelayMinutes = resolveReminderEscalationDelayMinutes(\n args.urgency,\n previousAttempt.outcome,\n escalationAttempts.length > 0,\n );\n if (baseDelayMinutes === null) {\n return null;\n }\n const enforcement = resolveReminderEscalationProfileDecision({\n normalDelayMinutes: baseDelayMinutes,\n state: enforcementState,\n urgency: args.urgency,\n profile: escalationProfile,\n });\n forceChannel = forceChannel ?? enforcement.forceChannel;\n scheduledFor = addMinutes(\n new Date(previousAttempt.attemptedAt ?? previousAttempt.scheduledFor),\n enforcement.delayMinutes ?? baseDelayMinutes,\n ).toISOString();\n }\n if (Date.parse(scheduledFor) > nowMs) {\n return null;\n }\n if (isDeliveredReminderOutcome(previousAttempt.outcome)) {\n const responseReview =\n await this.reviewOwnerResponseAfterReminderAttempt({\n subjectType: args.subjectType,\n attempt: previousAttempt,\n competingAttempts: ownerAttempts,\n now: args.now,\n });\n const reviewTransition = decideReminderReviewTransition({\n reviewDue,\n ownerType: args.ownerType,\n responseReview,\n });\n if (reviewTransition.kind === \"resolve\") {\n await this.resolveReminderReviewFromOwnerResponse({\n ownerType: args.ownerType,\n ownerId: args.ownerId,\n attempt: previousAttempt,\n reviewedAt: args.attemptedAt,\n resolution: reviewTransition.resolution,\n responseText: reviewTransition.responseText,\n respondedAt: reviewTransition.respondedAt,\n snoozeRequest: reviewTransition.snoozeRequest,\n confidence: reviewTransition.confidence,\n reason: reviewTransition.reason,\n classifierSource: reviewTransition.classifierSource,\n semanticReason: reviewTransition.semanticReason,\n });\n return null;\n }\n if (reviewTransition.kind === \"clarify\") {\n await this.markReminderReviewObservedResponse({\n attempt: previousAttempt,\n decision: reviewTransition.observation.decision,\n respondedAt: reviewTransition.observation.respondedAt,\n responseText: reviewTransition.observation.responseText,\n reason: reviewTransition.observation.reason,\n classifierSource: reviewTransition.observation.classifierSource,\n semanticReason: reviewTransition.observation.semanticReason,\n });\n const clarificationAttempt = await this.dispatchReminderAttempt({\n plan: args.plan,\n ownerType: args.ownerType,\n ownerId: args.ownerId,\n occurrenceId: args.occurrenceId,\n subjectType: args.subjectType,\n title: args.title,\n channel: previousAttempt.channel,\n stepIndex: args.plan.steps.length + escalationAttempts.length,\n scheduledFor,\n dueAt: args.dueAt,\n urgency: args.urgency,\n quietHours: args.quietHours,\n acknowledged: false,\n attemptedAt: args.attemptedAt,\n lifecycle: \"escalation\",\n escalationIndex: escalationAttempts.length,\n escalationReason: \"snooze_needs_clarification\",\n activityProfile: args.activityProfile,\n nearbyReminderTitles: args.nearbyReminderTitles,\n timezone: args.timezone,\n definition: args.definition,\n bodyOverride: buildReminderSnoozeClarificationBody(args.title),\n });\n if (isDeliveredReminderOutcome(clarificationAttempt.outcome)) {\n await this.markReminderReviewClarificationRequested({\n attempt: previousAttempt,\n clarificationAttempt,\n requestedAt: args.attemptedAt,\n });\n }\n return clarificationAttempt;\n }\n if (\n reviewTransition.kind === \"escalate\" &&\n reviewTransition.observation\n ) {\n await this.markReminderReviewObservedResponse({\n attempt: previousAttempt,\n decision: reviewTransition.observation.decision,\n respondedAt: reviewTransition.observation.respondedAt,\n responseText: reviewTransition.observation.responseText,\n reason: reviewTransition.observation.reason,\n classifierSource: reviewTransition.observation.classifierSource,\n semanticReason: reviewTransition.observation.semanticReason,\n });\n }\n }\n\n if (\n shouldDeferReminderUntilComputerActive({\n channel: \"in_app\",\n definition: args.definition,\n activityProfile: args.activityProfile,\n urgency: args.urgency,\n })\n ) {\n return null;\n }\n\n const candidateChannels = await this.resolveReminderEscalationChannels({\n activityProfile: args.activityProfile,\n policies: args.policies,\n urgency: args.urgency,\n attempts: ownerAttempts,\n now: args.now,\n });\n const attemptedChannels = new Set(\n ownerAttempts.map((attempt) => attempt.channel),\n );\n const lastEscalationAttempt = escalationAttempts.at(-1) ?? null;\n let nextChannel =\n candidateChannels.find((channel) => !attemptedChannels.has(channel)) ??\n null;\n if (\n !nextChannel &&\n lastEscalationAttempt &&\n isDeliveredReminderOutcome(lastEscalationAttempt.outcome) &&\n candidateChannels.includes(lastEscalationAttempt.channel)\n ) {\n nextChannel = lastEscalationAttempt.channel;\n }\n if (\n !nextChannel &&\n isDeliveredReminderOutcome(previousAttempt.outcome) &&\n candidateChannels.includes(previousAttempt.channel)\n ) {\n nextChannel = previousAttempt.channel;\n }\n if (\n forceChannel &&\n nextChannel !== forceChannel &&\n candidateChannels.includes(forceChannel)\n ) {\n nextChannel = forceChannel;\n }\n if (!nextChannel) {\n return null;\n }\n\n const attempt = await this.dispatchReminderAttempt({\n plan: args.plan,\n ownerType: args.ownerType,\n ownerId: args.ownerId,\n occurrenceId: args.occurrenceId,\n subjectType: args.subjectType,\n title: args.title,\n channel: nextChannel,\n stepIndex: args.plan.steps.length + escalationAttempts.length,\n scheduledFor,\n dueAt: args.dueAt,\n urgency: args.urgency,\n quietHours: args.quietHours,\n acknowledged: false,\n attemptedAt: args.attemptedAt,\n lifecycle: \"escalation\",\n escalationIndex: escalationAttempts.length,\n escalationReason: reviewDue\n ? \"review_due_without_acknowledgement\"\n : escalationAttempts.length > 0\n ? \"previous_escalation_unacknowledged\"\n : \"plan_exhausted_without_acknowledgement\",\n activityProfile: args.activityProfile,\n nearbyReminderTitles: args.nearbyReminderTitles,\n timezone: args.timezone,\n definition: args.definition,\n });\n\n if (\n readReminderReviewAt(previousAttempt) !== null &&\n !isReminderReviewClosed(previousAttempt)\n ) {\n if (isDeliveredReminderOutcome(attempt.outcome)) {\n await this.markReminderReviewEscalated({\n attempt: previousAttempt,\n escalatedAttempt: attempt,\n escalatedAt: args.attemptedAt,\n });\n } else {\n await this.markReminderReviewObservedResponse({\n attempt: previousAttempt,\n decision: \"no_response\",\n respondedAt: null,\n responseText: null,\n reason: `review_escalation_attempt_${attempt.outcome}`,\n });\n }\n }\n await this.markReminderEscalationStarted({\n ownerType: args.ownerType,\n ownerId: args.ownerId,\n attemptedAt: args.attemptedAt,\n channel: nextChannel,\n outcome: attempt.outcome,\n });\n if (escalationAttempts.length === 0) {\n await this.recordReminderAudit(\n \"reminder_escalation_started\",\n args.ownerType,\n args.ownerId,\n \"reminder escalation started\",\n {\n channel: nextChannel,\n scheduledFor,\n },\n {\n urgency: args.urgency,\n activityPlatform: args.activityProfile?.lastSeenPlatform ?? null,\n activityActive: args.activityProfile?.isCurrentlyActive ?? false,\n outcome: attempt.outcome,\n },\n );\n }\n return attempt;\n }\n\n public async awardWebsiteAccessGrant(\n definition: LifeOpsTaskDefinition,\n occurrenceId: string,\n now = new Date(),\n ): Promise<void> {\n const policy = definition.websiteAccess;\n if (!policy) {\n return;\n }\n const unlockedAt = now.toISOString();\n await this.repository.revokeWebsiteAccessGrants(definition.agentId, {\n groupKey: policy.groupKey,\n revokedAt: unlockedAt,\n });\n const expiresAt =\n policy.unlockMode === \"fixed_duration\" &&\n typeof policy.unlockDurationMinutes === \"number\"\n ? addMinutes(now, policy.unlockDurationMinutes).toISOString()\n : null;\n const grant = createLifeOpsWebsiteAccessGrant({\n agentId: definition.agentId,\n groupKey: policy.groupKey,\n definitionId: definition.id,\n occurrenceId,\n websites: [...policy.websites],\n unlockMode: policy.unlockMode,\n unlockDurationMinutes:\n policy.unlockMode === \"fixed_duration\"\n ? (policy.unlockDurationMinutes ?? null)\n : null,\n callbackKey: policy.callbackKey ?? null,\n unlockedAt,\n expiresAt,\n revokedAt: null,\n metadata: {\n definitionTitle: definition.title,\n reason: policy.reason,\n },\n });\n await this.repository.upsertWebsiteAccessGrant(grant);\n }\n\n public async syncWebsiteAccessState(now = new Date()): Promise<void> {\n const definitions = (\n await this.repository.listDefinitions(this.agentId())\n ).filter(\n (definition) =>\n definition.status === \"active\" && definition.websiteAccess,\n );\n const groups = new Map<string, Set<string>>();\n for (const definition of definitions) {\n const policy = definition.websiteAccess;\n if (!policy) {\n continue;\n }\n const websites = groups.get(policy.groupKey) ?? new Set<string>();\n for (const website of policy.websites) {\n websites.add(website.toLowerCase());\n }\n groups.set(policy.groupKey, websites);\n }\n const activeGrants = (\n await this.repository.listWebsiteAccessGrants(this.agentId())\n ).filter((grant) => isWebsiteAccessGrantActive(grant, now));\n const unlockedGroups = new Set(\n activeGrants.map((grant) => grant.groupKey),\n );\n const blockedGroups = [...groups.keys()].filter(\n (groupKey) => !unlockedGroups.has(groupKey),\n );\n const blockedWebsites = normalizeWebsiteListForComparison(\n blockedGroups.flatMap((groupKey) => [...(groups.get(groupKey) ?? [])]),\n );\n\n let status: Awaited<ReturnType<typeof getSelfControlStatus>>;\n try {\n status = await getSelfControlStatus();\n } catch (error) {\n this.logLifeOpsError(\"website_access_status\", error, {\n blockedGroups,\n });\n return;\n }\n\n const activeLifeOpsBlock =\n status.active && status.managedBy === \"lifeops\";\n if (status.active && !activeLifeOpsBlock) {\n if (blockedWebsites.length > 0) {\n this.logLifeOpsWarn(\n \"website_access_sync\",\n \"[lifeops] Website blocker is already active outside LifeOps; skipping blocker sync.\",\n {\n managedBy: status.managedBy,\n currentWebsites: status.websites,\n blockedWebsites,\n },\n );\n }\n return;\n }\n\n if (blockedWebsites.length === 0) {\n if (!activeLifeOpsBlock) {\n return;\n }\n const stopResult = await stopSelfControlBlock();\n if (stopResult.success === false) {\n this.logLifeOpsWarn(\n \"website_access_sync\",\n \"[lifeops] Failed to clear the LifeOps-managed website blocker state.\",\n {\n error: stopResult.error,\n },\n );\n }\n return;\n }\n\n if (\n activeLifeOpsBlock &&\n haveSameWebsiteSet(status.websites, blockedWebsites)\n ) {\n return;\n }\n\n if (activeLifeOpsBlock) {\n const stopResult = await stopSelfControlBlock();\n if (stopResult.success === false) {\n this.logLifeOpsWarn(\n \"website_access_sync\",\n \"[lifeops] Failed to update the existing LifeOps website block.\",\n {\n error: stopResult.error,\n blockedWebsites,\n },\n );\n return;\n }\n }\n\n const startResult = await startSelfControlBlock({\n websites: blockedWebsites,\n durationMinutes: null,\n metadata: {\n managedBy: \"lifeops\",\n blockedGroups,\n reason: \"lifeops_earned_access\",\n },\n });\n if (startResult.success === false) {\n this.logLifeOpsWarn(\n \"website_access_sync\",\n \"[lifeops] Failed to apply the LifeOps website block.\",\n {\n error: startResult.error,\n blockedWebsites,\n blockedGroups,\n },\n );\n }\n }\n\n public async dispatchReminderAttempt(args: {\n plan: LifeOpsReminderPlan;\n ownerType: \"occurrence\" | \"calendar_event\";\n ownerId: string;\n occurrenceId: string | null;\n subjectType: LifeOpsSubjectType;\n title: string;\n channel: LifeOpsReminderStep[\"channel\"];\n stepIndex: number;\n scheduledFor: string;\n dueAt: string | null;\n urgency: LifeOpsReminderUrgency;\n quietHours: LifeOpsReminderPlan[\"quietHours\"];\n acknowledged: boolean;\n attemptedAt: string;\n lifecycle?: ReminderAttemptLifecycle;\n escalationIndex?: number;\n escalationReason?: string;\n activityProfile?: ReminderActivityProfileSnapshot | null;\n nearbyReminderTitles?: string[];\n timezone: string;\n definition: Pick<LifeOpsTaskDefinition, \"kind\" | \"metadata\"> | null;\n bodyOverride?: string;\n }): Promise<LifeOpsReminderAttempt> {\n const attemptedAt = args.attemptedAt;\n const attemptedAtDate = new Date(attemptedAt);\n const lifecycle = args.lifecycle ?? \"plan\";\n const reminderBody =\n args.bodyOverride ??\n (await this.renderReminderBody({\n title: args.title,\n scheduledFor: args.scheduledFor,\n dueAt: args.dueAt,\n channel: args.channel,\n lifecycle,\n urgency: args.urgency,\n subjectType: args.subjectType,\n nearbyReminderTitles: args.nearbyReminderTitles,\n }));\n let outcome: LifeOpsReminderAttemptOutcome = \"delivered\";\n let connectorRef: string | null = null;\n const deliveryMetadata: Record<string, unknown> = {\n title: args.title,\n urgency: args.urgency,\n [REMINDER_LIFECYCLE_METADATA_KEY]: lifecycle,\n };\n if (lifecycle === \"escalation\") {\n deliveryMetadata[REMINDER_ESCALATION_INDEX_METADATA_KEY] =\n args.escalationIndex ?? 0;\n deliveryMetadata[REMINDER_ESCALATION_REASON_METADATA_KEY] =\n args.escalationReason ?? \"escalation\";\n deliveryMetadata[REMINDER_ESCALATION_ACTIVITY_PLATFORM_METADATA_KEY] =\n args.activityProfile?.lastSeenPlatform ??\n args.activityProfile?.primaryPlatform ??\n null;\n deliveryMetadata[REMINDER_ESCALATION_ACTIVITY_ACTIVE_METADATA_KEY] =\n args.activityProfile?.isCurrentlyActive ?? false;\n }\n\n await this.recordReminderAudit(\n \"reminder_due\",\n args.ownerType,\n args.ownerId,\n \"reminder step became due\",\n {\n planId: args.plan.id,\n channel: args.channel,\n stepIndex: args.stepIndex,\n scheduledFor: args.scheduledFor,\n },\n {\n ownerId: args.ownerId,\n },\n );\n\n if (args.acknowledged) {\n outcome = \"blocked_acknowledged\";\n deliveryMetadata.reason = \"owner_acknowledged\";\n } else if (\n !isReminderChannelAllowedForUrgency(args.channel, args.urgency)\n ) {\n outcome = \"blocked_urgency\";\n deliveryMetadata.reason = \"urgency_gate\";\n } else if (\n args.activityProfile?.circadianState === \"sleeping\" ||\n args.activityProfile?.circadianState === \"napping\"\n ) {\n outcome = \"blocked_quiet_hours\";\n deliveryMetadata.reason = \"probable_sleep\";\n deliveryMetadata.stateConfidence = args.activityProfile.stateConfidence;\n deliveryMetadata.circadianState = args.activityProfile.circadianState;\n } else if (\n args.channel !== \"in_app\" &&\n isWithinQuietHoursPolicy({\n now: attemptedAtDate,\n quietHours: args.quietHours,\n channel: args.channel,\n })\n ) {\n outcome = \"blocked_quiet_hours\";\n deliveryMetadata.reason = \"quiet_hours\";\n } else if (args.channel === \"in_app\") {\n connectorRef = \"system:in_app\";\n deliveryMetadata.message = reminderBody;\n } else {\n const policy = await this.resolvePrimaryChannelPolicy(args.channel);\n const runtimeTarget =\n args.channel === \"sms\" || args.channel === \"voice\"\n ? null\n : await this.resolveRuntimeReminderTarget(args.channel, policy);\n const requiresEscalationPermission = args.stepIndex > 0;\n if (policy && !policy.allowReminders) {\n outcome = \"blocked_policy\";\n deliveryMetadata.reason = \"channel_policy\";\n } else if (\n (lifecycle === \"escalation\" || requiresEscalationPermission) &&\n policy &&\n !policy.allowEscalation\n ) {\n outcome = \"blocked_policy\";\n deliveryMetadata.reason = \"channel_escalation_policy\";\n } else if (\n (args.channel === \"sms\" || args.channel === \"voice\") &&\n !policy\n ) {\n outcome = \"blocked_policy\";\n deliveryMetadata.reason = \"channel_policy\";\n } else if (args.channel === \"sms\" || args.channel === \"voice\") {\n const credentials = readTwilioCredentialsFromEnv();\n const twilioPolicy = policy;\n if (!credentials) {\n outcome = \"blocked_connector\";\n deliveryMetadata.reason = \"twilio_missing\";\n } else if (!twilioPolicy) {\n outcome = \"blocked_policy\";\n deliveryMetadata.reason = \"channel_policy\";\n } else if (\n (lifecycle === \"escalation\" || requiresEscalationPermission) &&\n !twilioPolicy.allowEscalation\n ) {\n outcome = \"blocked_policy\";\n deliveryMetadata.reason = \"channel_escalation_policy\";\n } else {\n connectorRef = `twilio:${twilioPolicy.channelRef}`;\n if (args.channel === \"sms\") {\n const result = await sendTwilioSms({\n credentials,\n to: twilioPolicy.channelRef,\n body: reminderBody,\n });\n if (!result.ok) {\n outcome = \"blocked_connector\";\n deliveryMetadata.error = result.error ?? \"sms delivery failed\";\n deliveryMetadata.status = result.status;\n } else {\n deliveryMetadata.sid = result.sid ?? null;\n deliveryMetadata.status = result.status;\n }\n } else {\n const result = await sendTwilioVoiceCall({\n credentials,\n to: twilioPolicy.channelRef,\n message: reminderBody,\n });\n if (!result.ok) {\n outcome = \"blocked_connector\";\n deliveryMetadata.error =\n result.error ?? \"voice delivery failed\";\n deliveryMetadata.status = result.status;\n } else {\n deliveryMetadata.sid = result.sid ?? null;\n deliveryMetadata.status = result.status;\n }\n }\n }\n } else if (runtimeTarget) {\n connectorRef = runtimeTarget.connectorRef;\n deliveryMetadata.routeSource = runtimeTarget.source;\n deliveryMetadata.routeResolution = runtimeTarget.resolution;\n deliveryMetadata.routeEndpoint =\n runtimeTarget.target.channelId ??\n runtimeTarget.target.roomId ??\n runtimeTarget.target.entityId ??\n null;\n deliveryMetadata.deliveryRoomId = runtimeTarget.target.roomId ?? null;\n deliveryMetadata.deliveryChannelId =\n runtimeTarget.target.channelId ?? null;\n deliveryMetadata.deliveryEntityId =\n runtimeTarget.target.entityId ?? null;\n const sendPayload = {\n text: reminderBody,\n source: runtimeTarget.source,\n metadata: {\n channelType: args.channel,\n lifeopsReminder: true,\n ownerType: args.ownerType,\n ownerId: args.ownerId,\n urgency: args.urgency,\n scheduledFor: args.scheduledFor,\n routeSource: runtimeTarget.source,\n routeEndpoint:\n runtimeTarget.target.channelId ??\n runtimeTarget.target.roomId ??\n runtimeTarget.target.entityId ??\n null,\n routeResolution: runtimeTarget.resolution,\n },\n };\n try {\n await this.runtime.sendMessageToTarget(\n runtimeTarget.target,\n sendPayload,\n );\n } catch (firstError) {\n this.logLifeOpsWarn(\n \"reminder_dispatch\",\n `[lifeops] Reminder delivery failed for ${args.channel}, retrying in 2s`,\n { error: lifeOpsErrorMessage(firstError) },\n );\n await new Promise((r) =>\n setTimeout(r, REMINDER_DELIVERY_RETRY_DELAY_MS),\n );\n try {\n await this.runtime.sendMessageToTarget(\n runtimeTarget.target,\n sendPayload,\n );\n } catch (retryError) {\n outcome = \"blocked_connector\";\n deliveryMetadata.error = lifeOpsErrorMessage(retryError);\n deliveryMetadata.reason = \"runtime_send_failed\";\n }\n }\n } else {\n outcome = \"blocked_connector\";\n deliveryMetadata.reason = policy\n ? \"target_missing\"\n : \"unconfigured_channel\";\n }\n }\n\n if (\n outcome === \"delivered\" &&\n (args.urgency === \"high\" || args.urgency === \"critical\")\n ) {\n const reviewDelayMinutes = resolveReminderReviewDelayMinutes(\n args.urgency,\n lifecycle,\n );\n if (reviewDelayMinutes !== null) {\n deliveryMetadata[REMINDER_REVIEW_AFTER_MINUTES_METADATA_KEY] =\n reviewDelayMinutes;\n deliveryMetadata[REMINDER_REVIEW_AT_METADATA_KEY] = addMinutes(\n attemptedAtDate,\n reviewDelayMinutes,\n ).toISOString();\n deliveryMetadata[REMINDER_REVIEW_REASON_METADATA_KEY] =\n lifecycle === \"escalation\"\n ? \"escalation_unacknowledged_review\"\n : \"delivery_acknowledgement_review\";\n }\n }\n\n const attempt = createLifeOpsReminderAttempt({\n agentId: this.agentId(),\n planId: args.plan.id,\n ownerType: args.ownerType,\n ownerId: args.ownerId,\n occurrenceId: args.occurrenceId,\n channel: args.channel,\n stepIndex: args.stepIndex,\n scheduledFor: args.scheduledFor,\n attemptedAt,\n outcome,\n connectorRef,\n deliveryMetadata,\n });\n await this.repository.createReminderAttempt(attempt);\n await this.recordReminderAudit(\n outcome === \"delivered\" ? \"reminder_delivered\" : \"reminder_blocked\",\n args.ownerType,\n args.ownerId,\n outcome === \"delivered\" ? \"reminder delivered\" : \"reminder blocked\",\n {\n planId: args.plan.id,\n channel: args.channel,\n stepIndex: args.stepIndex,\n scheduledFor: args.scheduledFor,\n },\n {\n connectorRef,\n outcome,\n ...deliveryMetadata,\n },\n );\n if (outcome === \"blocked_connector\") {\n this.logLifeOpsWarn(\n \"reminder_dispatch\",\n `[lifeops] Reminder delivery failed for ${args.channel}`,\n {\n ownerType: args.ownerType,\n ownerId: args.ownerId,\n occurrenceId: args.occurrenceId,\n channel: args.channel,\n connectorRef,\n scheduledFor: args.scheduledFor,\n stepIndex: args.stepIndex,\n reason:\n typeof deliveryMetadata.reason === \"string\"\n ? deliveryMetadata.reason\n : null,\n status:\n typeof deliveryMetadata.status === \"number\"\n ? deliveryMetadata.status\n : null,\n error:\n typeof deliveryMetadata.error === \"string\"\n ? deliveryMetadata.error\n : null,\n },\n );\n }\n if (outcome === \"delivered\" && args.channel === \"in_app\") {\n this.emitInAppReminderNudge({\n text: reminderBody,\n ownerType: args.ownerType,\n ownerId: args.ownerId,\n subjectType: args.subjectType,\n scheduledFor: args.scheduledFor,\n dueAt: args.dueAt,\n });\n }\n return attempt;\n }\n\n public resolveGlobalReminderPreferencePolicy(\n policies: LifeOpsChannelPolicy[],\n ): LifeOpsChannelPolicy | null {\n const candidates = policies.filter(\n (policy) =>\n policy.channelType === \"in_app\" &&\n (policy.channelRef === GLOBAL_REMINDER_PREFERENCE_CHANNEL_REF ||\n policy.metadata[REMINDER_PREFERENCE_SCOPE_METADATA_KEY] ===\n \"global\"),\n );\n return (\n candidates.find((policy) => policy.metadata.isPrimary === true) ??\n candidates[0] ??\n null\n );\n }\n\n public buildReminderPreferenceResponse(\n definition: LifeOpsTaskDefinition | null,\n policies: LifeOpsChannelPolicy[],\n ): LifeOpsReminderPreference {\n const globalPolicy = this.resolveGlobalReminderPreferencePolicy(policies);\n const globalSetting = readReminderPreferenceSettingFromMetadata(\n globalPolicy?.metadata,\n \"global_policy\",\n ) ?? {\n intensity: DEFAULT_REMINDER_INTENSITY,\n source: \"default\",\n updatedAt: null,\n note: null,\n };\n const definitionSetting = definition\n ? readReminderPreferenceSettingFromMetadata(\n definition.metadata,\n \"definition_metadata\",\n )\n : null;\n return {\n definitionId: definition?.id ?? null,\n definitionTitle: definition?.title ?? null,\n global: globalSetting,\n definition: definitionSetting,\n effective: definitionSetting ?? globalSetting,\n };\n }\n\n public resolveEffectiveReminderPlan(\n plan: LifeOpsReminderPlan | null,\n preference: LifeOpsReminderPreference,\n ): LifeOpsReminderPlan | null {\n if (!plan) {\n return null;\n }\n return applyReminderIntensityToPlan(plan, preference.effective.intensity);\n }\n\n async getReminderPreference(\n definitionId?: string | null,\n ): Promise<LifeOpsReminderPreference> {\n const definition = definitionId\n ? await this.repository.getDefinition(\n this.agentId(),\n requireNonEmptyString(definitionId, \"definitionId\"),\n )\n : null;\n if (definitionId && !definition) {\n fail(404, \"life-ops definition not found\");\n }\n const policies = await this.repository.listChannelPolicies(\n this.agentId(),\n );\n return this.buildReminderPreferenceResponse(definition, policies);\n }\n\n async setReminderPreference(\n request: SetLifeOpsReminderPreferenceRequest,\n ): Promise<LifeOpsReminderPreference> {\n const intensity = normalizeReminderIntensityInput(\n request.intensity,\n \"intensity\",\n );\n const note = normalizeOptionalString(request.note) ?? null;\n const updatedAt = new Date().toISOString();\n const definitionId =\n normalizeOptionalString(request.definitionId) ?? null;\n if (definitionId) {\n const definition = await this.repository.getDefinition(\n this.agentId(),\n definitionId,\n );\n if (!definition) {\n fail(404, \"life-ops definition not found\");\n }\n const nextDefinition: LifeOpsTaskDefinition = {\n ...definition,\n metadata: withReminderPreferenceMetadata(\n definition.metadata,\n intensity,\n updatedAt,\n note,\n \"definition\",\n ),\n updatedAt,\n };\n await this.repository.updateDefinition(nextDefinition);\n await this.recordAudit(\n \"definition_updated\",\n \"definition\",\n definition.id,\n \"reminder preference updated\",\n {\n request,\n },\n {\n reminderIntensity: intensity,\n note,\n },\n );\n const policies = await this.repository.listChannelPolicies(\n this.agentId(),\n );\n return this.buildReminderPreferenceResponse(nextDefinition, policies);\n }\n\n await this.upsertChannelPolicy({\n channelType: \"in_app\",\n channelRef: GLOBAL_REMINDER_PREFERENCE_CHANNEL_REF,\n privacyClass: \"private\",\n allowReminders: true,\n allowEscalation: false,\n allowPosts: false,\n requireConfirmationForActions: false,\n metadata: {\n isPrimary: true,\n [REMINDER_PREFERENCE_SCOPE_METADATA_KEY]: \"global\",\n [REMINDER_INTENSITY_METADATA_KEY]: intensity,\n [REMINDER_INTENSITY_UPDATED_AT_METADATA_KEY]: updatedAt,\n [REMINDER_INTENSITY_NOTE_METADATA_KEY]: note,\n },\n });\n return this.getReminderPreference();\n }\n\n async captureActivitySignal(\n request: CaptureLifeOpsActivitySignalRequest,\n ): Promise<LifeOpsActivitySignal> {\n const health = normalizeHealthSignal(request.health, \"health\");\n const signal = createLifeOpsActivitySignal({\n agentId: this.agentId(),\n source: normalizeActivitySignalSource(request.source, \"source\"),\n platform: normalizeOptionalString(request.platform) ?? \"client_chat\",\n state: normalizeActivitySignalState(request.state, \"state\"),\n observedAt:\n normalizeOptionalIsoString(request.observedAt, \"observedAt\") ??\n new Date().toISOString(),\n idleState: normalizeOptionalIdleState(request.idleState, \"idleState\"),\n idleTimeSeconds: normalizeOptionalNonNegativeInteger(\n request.idleTimeSeconds,\n \"idleTimeSeconds\",\n ),\n onBattery:\n normalizeOptionalBoolean(request.onBattery, \"onBattery\") ?? null,\n health,\n metadata:\n request.metadata !== undefined\n ? requireRecord(request.metadata, \"metadata\")\n : {},\n });\n await this.repository.createActivitySignal(signal);\n return signal;\n }\n\n async captureManualOverride(\n request: CaptureLifeOpsManualOverrideRequest,\n ): Promise<LifeOpsManualOverrideResult> {\n const kind = normalizeEnumValue(\n request.kind,\n \"kind\",\n LIFEOPS_MANUAL_OVERRIDE_KINDS,\n );\n const occurredAt =\n normalizeOptionalIsoString(request.occurredAt, \"occurredAt\") ??\n new Date().toISOString();\n const note = normalizeOptionalString(request.note);\n if (note !== undefined && note.length > 500) {\n fail(400, \"note must be <= 500 characters\");\n }\n const desiredState: LifeOpsCircadianState =\n kind === \"going_to_bed\" ? \"sleeping\" : \"awake\";\n const priorState = await this.repository.readCircadianState(\n this.agentId(),\n );\n const signal = createLifeOpsActivitySignal({\n agentId: this.agentId(),\n source: \"app_lifecycle\",\n platform: \"manual_override\",\n state: kind === \"going_to_bed\" ? \"sleeping\" : \"active\",\n observedAt: occurredAt,\n idleState: kind === \"going_to_bed\" ? \"idle\" : \"active\",\n idleTimeSeconds: 0,\n onBattery: null,\n health: null,\n metadata: {\n userAttested: true,\n manualOverrideKind: kind,\n ...(note ? { note } : {}),\n },\n });\n await this.repository.createActivitySignal(signal);\n\n // Audit every user-attested override. The id is deterministic so\n // re-submits of the same (kind, occurredAt) by the client don't\n // double-count. Using `createAuditEventIfNew` so a retry is a no-op.\n await this.repository.createAuditEventIfNew({\n id: `lifeops.manual_override:${this.agentId()}:${occurredAt}:${kind}`,\n agentId: this.agentId(),\n eventType: \"manual_override_accepted\",\n ownerType: \"circadian_state\",\n ownerId: `lifeops-manual-override:${this.agentId()}`,\n reason: `user_attested_${kind}`,\n inputs: {\n kind,\n occurredAt,\n note: note ?? null,\n priorCircadianState: priorState?.circadianState ?? null,\n },\n decision: {\n desiredCircadianState: desiredState,\n bypassedStabilityWindow: true,\n },\n actor: \"user\",\n createdAt: new Date().toISOString(),\n });\n\n const refreshed = await this.refreshEffectiveScheduleState({\n now: new Date(occurredAt),\n });\n return {\n accepted: true,\n kind,\n occurredAt,\n circadianState: refreshed?.circadianState ?? desiredState,\n stateConfidence: refreshed?.stateConfidence ?? 0.99,\n };\n }\n\n async listActivitySignals(\n args: {\n sinceAt?: string | null;\n limit?: number | null;\n states?: LifeOpsActivitySignal[\"state\"][] | null;\n } = {},\n ): Promise<LifeOpsActivitySignal[]> {\n return this.repository.listActivitySignals(this.agentId(), args);\n }\n\n async upsertChannelPolicy(\n request: UpsertLifeOpsChannelPolicyRequest,\n ): Promise<LifeOpsChannelPolicy> {\n const channelType = normalizeEnumValue(\n request.channelType,\n \"channelType\",\n LIFEOPS_CHANNEL_TYPES,\n );\n const channelRef =\n channelType === \"sms\" || channelType === \"voice\"\n ? normalizePhoneNumber(request.channelRef, \"channelRef\")\n : requireNonEmptyString(request.channelRef, \"channelRef\");\n const existing = await this.repository.getChannelPolicy(\n this.agentId(),\n channelType,\n channelRef,\n );\n const policy = existing\n ? {\n ...existing,\n privacyClass: normalizePrivacyClass(\n request.privacyClass,\n \"privacyClass\",\n existing.privacyClass,\n ),\n allowReminders:\n normalizeOptionalBoolean(\n request.allowReminders,\n \"allowReminders\",\n ) ?? existing.allowReminders,\n allowEscalation:\n normalizeOptionalBoolean(\n request.allowEscalation,\n \"allowEscalation\",\n ) ?? existing.allowEscalation,\n allowPosts:\n normalizeOptionalBoolean(request.allowPosts, \"allowPosts\") ??\n existing.allowPosts,\n requireConfirmationForActions:\n normalizeOptionalBoolean(\n request.requireConfirmationForActions,\n \"requireConfirmationForActions\",\n ) ?? existing.requireConfirmationForActions,\n metadata:\n request.metadata !== undefined\n ? {\n ...existing.metadata,\n ...requireRecord(request.metadata, \"metadata\"),\n }\n : existing.metadata,\n updatedAt: new Date().toISOString(),\n }\n : createLifeOpsChannelPolicy({\n agentId: this.agentId(),\n channelType,\n channelRef,\n privacyClass: normalizePrivacyClass(request.privacyClass),\n allowReminders:\n normalizeOptionalBoolean(\n request.allowReminders,\n \"allowReminders\",\n ) ?? true,\n allowEscalation:\n normalizeOptionalBoolean(\n request.allowEscalation,\n \"allowEscalation\",\n ) ?? false,\n allowPosts:\n normalizeOptionalBoolean(request.allowPosts, \"allowPosts\") ??\n false,\n requireConfirmationForActions:\n normalizeOptionalBoolean(\n request.requireConfirmationForActions,\n \"requireConfirmationForActions\",\n ) ?? true,\n metadata:\n normalizeOptionalRecord(request.metadata, \"metadata\") ?? {},\n });\n await this.repository.upsertChannelPolicy(policy);\n await this.recordChannelPolicyAudit(\n policy.id,\n \"channel policy updated\",\n { request },\n {\n channelType: policy.channelType,\n channelRef: policy.channelRef,\n },\n );\n return policy;\n }\n\n async capturePhoneConsent(\n request: CaptureLifeOpsPhoneConsentRequest,\n ): Promise<{ phoneNumber: string; policies: LifeOpsChannelPolicy[] }> {\n if (\n normalizeOptionalBoolean(request.consentGiven, \"consentGiven\") !== true\n ) {\n fail(\n 400,\n \"Explicit consent is required before capturing a phone number.\",\n );\n }\n const phoneNumber = normalizePhoneNumber(\n request.phoneNumber,\n \"phoneNumber\",\n );\n const privacyClass = normalizePrivacyClass(request.privacyClass);\n const baseMetadata = {\n ...normalizeOptionalRecord(request.metadata, \"metadata\"),\n phoneNumber,\n consentCapturedAt: new Date().toISOString(),\n consentGiven: true,\n isPrimary: true,\n };\n const smsPolicy = await this.upsertChannelPolicy({\n channelType: \"sms\",\n channelRef: phoneNumber,\n privacyClass,\n allowReminders:\n normalizeOptionalBoolean(request.allowSms, \"allowSms\") ?? false,\n allowEscalation:\n normalizeOptionalBoolean(request.allowSms, \"allowSms\") ?? false,\n allowPosts: false,\n requireConfirmationForActions: true,\n metadata: {\n ...baseMetadata,\n consentKind: \"phone\",\n smsAllowed:\n normalizeOptionalBoolean(request.allowSms, \"allowSms\") ?? false,\n voiceAllowed:\n normalizeOptionalBoolean(request.allowVoice, \"allowVoice\") ?? false,\n },\n });\n const voicePolicy = await this.upsertChannelPolicy({\n channelType: \"voice\",\n channelRef: phoneNumber,\n privacyClass,\n allowReminders:\n normalizeOptionalBoolean(request.allowVoice, \"allowVoice\") ?? false,\n allowEscalation:\n normalizeOptionalBoolean(request.allowVoice, \"allowVoice\") ?? false,\n allowPosts: false,\n requireConfirmationForActions: true,\n metadata: {\n ...baseMetadata,\n consentKind: \"phone\",\n smsAllowed:\n normalizeOptionalBoolean(request.allowSms, \"allowSms\") ?? false,\n voiceAllowed:\n normalizeOptionalBoolean(request.allowVoice, \"allowVoice\") ?? false,\n },\n });\n\n // Register SMS/voice in the escalation channel list when the user\n // consents so the escalation service can reach them without manual\n // setup.\n const allowSms =\n normalizeOptionalBoolean(request.allowSms, \"allowSms\") ?? false;\n const allowVoice =\n normalizeOptionalBoolean(request.allowVoice, \"allowVoice\") ?? false;\n if (allowSms) {\n registerEscalationChannel(\"sms\");\n }\n if (allowVoice) {\n registerEscalationChannel(\"voice\");\n }\n\n return {\n phoneNumber,\n policies: [smsPolicy, voicePolicy],\n };\n }\n\n async processDueReminderDeliveries(args: {\n now: Date;\n limit: number;\n ownerTimezone: string;\n policies: LifeOpsChannelPolicy[];\n globalReminderPreference: LifeOpsReminderPreference;\n existingAttempts: LifeOpsReminderAttempt[];\n activityProfile: ReminderActivityProfileSnapshot | null;\n }): Promise<LifeOpsReminderAttempt[]> {\n const {\n now,\n limit,\n ownerTimezone,\n policies,\n globalReminderPreference,\n existingAttempts,\n activityProfile,\n } = args;\n const dueAttempts: LifeOpsReminderAttempt[] = [];\n if (limit <= 0) {\n return dueAttempts;\n }\n\n const definitions = await this.repository.listActiveDefinitions(\n this.agentId(),\n );\n for (const definition of definitions) {\n await this.refreshDefinitionOccurrences(definition, now);\n }\n const definitionsById = new Map(\n definitions.map((definition) => [definition.id, definition]),\n );\n\n const horizon = addMinutes(now, OVERVIEW_HORIZON_MINUTES).toISOString();\n const occurrenceViews =\n await this.repository.listOccurrenceViewsForOverview(\n this.agentId(),\n horizon,\n );\n const occurrencePlans = await this.repository.listReminderPlansForOwners(\n this.agentId(),\n \"definition\",\n occurrenceViews.map((occurrence) => occurrence.definitionId),\n );\n const definitionPreferencesById = new Map<\n string,\n LifeOpsReminderPreference\n >();\n const plansByDefinitionId = new Map<string, LifeOpsReminderPlan>();\n for (const plan of occurrencePlans) {\n const definition = definitionsById.get(plan.ownerId) ?? null;\n const preference = this.buildReminderPreferenceResponse(\n definition,\n policies,\n );\n definitionPreferencesById.set(plan.ownerId, preference);\n const effectivePlan = this.resolveEffectiveReminderPlan(\n plan,\n preference,\n );\n if (effectivePlan) {\n plansByDefinitionId.set(plan.ownerId, effectivePlan);\n }\n }\n\n const eventWindowEnd = addMinutes(\n now,\n OVERVIEW_HORIZON_MINUTES,\n ).toISOString();\n const calendarEvents = await this.repository.listCalendarEvents(\n this.agentId(),\n \"google\",\n now.toISOString(),\n eventWindowEnd,\n );\n const eventPlans = await this.repository.listReminderPlansForOwners(\n this.agentId(),\n \"calendar_event\",\n calendarEvents.map((event) => event.id),\n );\n const occurrenceUrgencies = new Map<string, LifeOpsReminderUrgency>();\n for (const occurrence of occurrenceViews) {\n occurrenceUrgencies.set(\n occurrence.id,\n resolveReminderDeliveryUrgency({\n metadata: occurrence.metadata,\n priority: occurrence.priority,\n }),\n );\n }\n const plansByEventId = new Map<string, LifeOpsReminderPlan>();\n for (const plan of eventPlans) {\n const effectivePlan = this.resolveEffectiveReminderPlan(\n plan,\n globalReminderPreference,\n );\n if (effectivePlan) {\n plansByEventId.set(plan.ownerId, effectivePlan);\n }\n }\n const eventUrgencies = new Map<string, LifeOpsReminderUrgency>();\n for (const event of calendarEvents) {\n eventUrgencies.set(\n event.id,\n resolveReminderDeliveryUrgency({\n metadata: event.metadata,\n fallback: \"medium\",\n }),\n );\n }\n\n const attemptKey = (\n planId: string,\n stepIndex: number,\n scheduledFor: string,\n ) => `${planId}:${stepIndex}:${scheduledFor}`;\n const deliveredAttempts = new Set(\n existingAttempts\n .filter((attempt) => isDeliveredReminderOutcome(attempt.outcome))\n .map((attempt) =>\n attemptKey(attempt.planId, attempt.stepIndex, attempt.scheduledFor),\n ),\n );\n const blockedAckAttempts = new Set(\n existingAttempts\n .filter((attempt) => attempt.outcome === \"blocked_acknowledged\")\n .map((attempt) =>\n attemptKey(attempt.planId, attempt.stepIndex, attempt.scheduledFor),\n ),\n );\n\n for (const reminder of buildActiveReminders(\n occurrenceViews,\n plansByDefinitionId,\n now,\n )) {\n if (dueAttempts.length >= limit) break;\n const plan = reminder.definitionId\n ? plansByDefinitionId.get(reminder.definitionId)\n : null;\n if (!plan) continue;\n const occurrence = occurrenceViews.find(\n (candidate) => candidate.id === reminder.ownerId,\n );\n if (!occurrence) continue;\n const preference =\n definitionPreferencesById.get(reminder.definitionId ?? \"\") ??\n globalReminderPreference;\n const urgency = occurrenceUrgencies.get(reminder.ownerId) ?? \"medium\";\n const definition = definitionsById.get(occurrence.definitionId) ?? null;\n if (\n !shouldDeliverReminderForIntensity(\n preference.effective.intensity,\n urgency,\n )\n ) {\n continue;\n }\n const key = attemptKey(\n plan.id,\n reminder.stepIndex,\n reminder.scheduledFor,\n );\n const acknowledged = Boolean(\n occurrence.metadata.reminderAcknowledgedAt ||\n occurrence.state === \"completed\",\n );\n if (\n deliveredAttempts.has(key) ||\n (acknowledged && blockedAckAttempts.has(key))\n ) {\n continue;\n }\n if (\n shouldDeferReminderUntilComputerActive({\n channel: reminder.channel,\n definition,\n activityProfile,\n urgency,\n })\n ) {\n continue;\n }\n const attempt = await this.dispatchReminderAttempt({\n plan,\n ownerType: \"occurrence\",\n ownerId: reminder.ownerId,\n occurrenceId: reminder.occurrenceId,\n subjectType: occurrence.subjectType,\n title: reminder.title,\n channel: reminder.channel,\n stepIndex: reminder.stepIndex,\n scheduledFor: reminder.scheduledFor,\n dueAt: occurrence.dueAt,\n urgency,\n quietHours: plan.quietHours,\n acknowledged,\n attemptedAt: now.toISOString(),\n activityProfile,\n nearbyReminderTitles: collectNearbyReminderTitles({\n currentOwnerId: reminder.ownerId,\n currentAnchorAt: occurrence.dueAt,\n occurrences: occurrenceViews,\n events: calendarEvents,\n limit: 3,\n }),\n timezone: ownerTimezone,\n definition,\n });\n dueAttempts.push(attempt);\n if (isDeliveredReminderOutcome(attempt.outcome)) {\n deliveredAttempts.add(key);\n }\n }\n\n for (const reminder of buildActiveCalendarEventReminders(\n calendarEvents,\n plansByEventId,\n this.ownerEntityId(),\n now,\n )) {\n if (dueAttempts.length >= limit) break;\n const plan = reminder.eventId\n ? plansByEventId.get(reminder.eventId)\n : null;\n if (!plan) continue;\n const event = calendarEvents.find(\n (candidate) => candidate.id === reminder.ownerId,\n );\n if (!event) continue;\n if (\n !shouldDeliverReminderForIntensity(\n globalReminderPreference.effective.intensity,\n eventUrgencies.get(reminder.ownerId) ?? \"medium\",\n )\n ) {\n continue;\n }\n const key = attemptKey(\n plan.id,\n reminder.stepIndex,\n reminder.scheduledFor,\n );\n const acknowledged = Boolean(event.metadata.reminderAcknowledgedAt);\n if (\n deliveredAttempts.has(key) ||\n (acknowledged && blockedAckAttempts.has(key))\n ) {\n continue;\n }\n const attempt = await this.dispatchReminderAttempt({\n plan,\n ownerType: \"calendar_event\",\n ownerId: reminder.ownerId,\n occurrenceId: null,\n subjectType: reminder.subjectType,\n title: reminder.title,\n channel: reminder.channel,\n stepIndex: reminder.stepIndex,\n scheduledFor: reminder.scheduledFor,\n dueAt: reminder.dueAt,\n urgency: resolveReminderDeliveryUrgency({\n metadata: event.metadata,\n fallback: \"medium\",\n }),\n quietHours: plan.quietHours,\n acknowledged,\n attemptedAt: now.toISOString(),\n activityProfile,\n nearbyReminderTitles: collectNearbyReminderTitles({\n currentOwnerId: reminder.ownerId,\n currentAnchorAt: reminder.dueAt,\n occurrences: occurrenceViews,\n events: calendarEvents,\n limit: 3,\n }),\n timezone: ownerTimezone,\n definition: null,\n });\n dueAttempts.push(attempt);\n if (isDeliveredReminderOutcome(attempt.outcome)) {\n deliveredAttempts.add(key);\n }\n }\n\n const reminderAttemptsForEscalation = [\n ...existingAttempts,\n ...dueAttempts,\n ];\n await this.scanReadReceipts(\n reminderAttemptsForEscalation,\n activityProfile,\n now,\n );\n\n for (const occurrence of occurrenceViews) {\n if (dueAttempts.length >= limit) break;\n const plan = plansByDefinitionId.get(occurrence.definitionId) ?? null;\n if (!plan) continue;\n const acknowledged = Boolean(\n occurrence.metadata.reminderAcknowledgedAt ||\n occurrence.state === \"completed\",\n );\n const attempt = await this.dispatchDueReminderEscalation({\n plan,\n ownerType: \"occurrence\",\n ownerId: occurrence.id,\n occurrenceId: occurrence.id,\n subjectType: occurrence.subjectType,\n title: occurrence.title,\n dueAt: occurrence.dueAt,\n urgency: resolveReminderDeliveryUrgency({\n metadata: occurrence.metadata,\n priority: occurrence.priority,\n }),\n intensity:\n definitionPreferencesById.get(occurrence.definitionId)?.effective\n ?.intensity ?? globalReminderPreference.effective.intensity,\n quietHours: plan.quietHours,\n attemptedAt: now.toISOString(),\n now,\n attempts: reminderAttemptsForEscalation,\n policies,\n activityProfile,\n occurrence,\n acknowledged,\n nearbyReminderTitles: collectNearbyReminderTitles({\n currentOwnerId: occurrence.id,\n currentAnchorAt: occurrence.dueAt,\n occurrences: occurrenceViews,\n events: calendarEvents,\n limit: 3,\n }),\n timezone: ownerTimezone,\n definition: definitionsById.get(occurrence.definitionId) ?? null,\n });\n if (!attempt) continue;\n dueAttempts.push(attempt);\n reminderAttemptsForEscalation.push(attempt);\n }\n\n for (const event of calendarEvents) {\n if (dueAttempts.length >= limit) break;\n const plan = plansByEventId.get(event.id) ?? null;\n if (!plan) continue;\n const attempt = await this.dispatchDueReminderEscalation({\n plan,\n ownerType: \"calendar_event\",\n ownerId: event.id,\n occurrenceId: null,\n subjectType: \"owner\",\n title: event.title,\n dueAt: event.startAt,\n urgency: resolveReminderDeliveryUrgency({\n metadata: event.metadata,\n fallback: \"medium\",\n }),\n intensity: globalReminderPreference.effective.intensity,\n quietHours: plan.quietHours,\n attemptedAt: now.toISOString(),\n now,\n attempts: reminderAttemptsForEscalation,\n policies,\n activityProfile,\n eventStartAt: event.startAt,\n acknowledged: Boolean(event.metadata.reminderAcknowledgedAt),\n nearbyReminderTitles: collectNearbyReminderTitles({\n currentOwnerId: event.id,\n currentAnchorAt: event.startAt,\n occurrences: occurrenceViews,\n events: calendarEvents,\n limit: 3,\n }),\n timezone: ownerTimezone,\n definition: null,\n });\n if (!attempt) continue;\n dueAttempts.push(attempt);\n reminderAttemptsForEscalation.push(attempt);\n }\n\n return dueAttempts;\n }\n\n async processReminders(\n request: { now?: string; limit?: number } = {},\n ): Promise<LifeOpsReminderProcessingResult> {\n return this.withReminderProcessingLock(async () => {\n const now =\n request.now === undefined\n ? new Date()\n : new Date(normalizeIsoString(request.now, \"now\"));\n const limit =\n request.limit === undefined\n ? DEFAULT_REMINDER_PROCESS_LIMIT\n : normalizePositiveInteger(request.limit, \"limit\");\n const ownerTimezone = resolveDefaultTimeZone();\n\n const policies = await this.repository.listChannelPolicies(\n this.agentId(),\n );\n const globalReminderPreference = this.buildReminderPreferenceResponse(\n null,\n policies,\n );\n const existingAttempts = await this.repository.listReminderAttempts(\n this.agentId(),\n );\n const activityProfile = await this.readReminderActivityProfileSnapshot({\n now,\n timezone: ownerTimezone,\n });\n\n const dueAttempts: LifeOpsReminderAttempt[] = [];\n dueAttempts.push(\n ...(await this.processDueReminderReviewJobs({\n now,\n limit,\n attempts: existingAttempts,\n policies,\n activityProfile,\n timezone: ownerTimezone,\n defaultIntensity: globalReminderPreference.effective.intensity,\n })),\n );\n if (dueAttempts.length >= limit) {\n return {\n now: now.toISOString(),\n attempts: dueAttempts,\n };\n }\n\n dueAttempts.push(\n ...(await this.processDueReminderDeliveries({\n now,\n limit: limit - dueAttempts.length,\n ownerTimezone,\n policies,\n globalReminderPreference,\n existingAttempts: [...existingAttempts, ...dueAttempts],\n activityProfile,\n })),\n );\n\n return {\n now: now.toISOString(),\n attempts: dueAttempts,\n };\n });\n }\n\n async processScheduledWork(\n request: {\n now?: string;\n reminderLimit?: number;\n workflowLimit?: number;\n scheduledTaskLimit?: number;\n } = {},\n ): Promise<{\n now: string;\n reminderAttempts: LifeOpsReminderAttempt[];\n workflowRuns: LifeOpsWorkflowRun[];\n scheduledTaskFires: Array<Record<string, unknown>>;\n scheduledTaskCompletionTimeouts: Array<Record<string, unknown>>;\n }> {\n const now =\n request.now === undefined\n ? new Date()\n : new Date(normalizeIsoString(request.now, \"now\"));\n const reminderLimit =\n request.reminderLimit === undefined\n ? DEFAULT_REMINDER_PROCESS_LIMIT\n : normalizePositiveInteger(request.reminderLimit, \"reminderLimit\");\n const workflowLimit =\n request.workflowLimit === undefined\n ? DEFAULT_WORKFLOW_PROCESS_LIMIT\n : normalizePositiveInteger(request.workflowLimit, \"workflowLimit\");\n const scheduledTaskLimit =\n request.scheduledTaskLimit === undefined\n ? DEFAULT_SCHEDULED_TASK_PROCESS_LIMIT\n : normalizePositiveInteger(\n request.scheduledTaskLimit,\n \"scheduledTaskLimit\",\n );\n await this.syncWebsiteAccessState(now);\n const previousSchedule = await this.readEffectiveScheduleState({ now });\n const currentSchedule = await this.refreshEffectiveScheduleState({ now });\n if (currentSchedule !== null) {\n // Persist the canonical circadian state row. Boot rehydration reads\n // this on the next runtime start; downstream consumers can subscribe\n // to transitions via life_audit_events owner_type=circadian_state.\n const priorState = await this.repository.readCircadianState(\n this.agentId(),\n );\n const stateChanged =\n priorState === null ||\n priorState.circadianState !== currentSchedule.circadianState;\n await this.repository.upsertCircadianState({\n agentId: this.agentId(),\n circadianState: currentSchedule.circadianState,\n stateConfidence: currentSchedule.stateConfidence,\n uncertaintyReason: currentSchedule.uncertaintyReason,\n enteredAt: stateChanged ? now.toISOString() : priorState.enteredAt,\n sinceSleepDetectedAt:\n currentSchedule.circadianState === \"sleeping\" ||\n currentSchedule.circadianState === \"napping\"\n ? (currentSchedule.currentSleepStartedAt ??\n priorState?.sinceSleepDetectedAt ??\n null)\n : null,\n sinceWakeObservedAt:\n currentSchedule.circadianState === \"waking\" ||\n currentSchedule.circadianState === \"awake\"\n ? (currentSchedule.wakeAt ??\n priorState?.sinceWakeObservedAt ??\n null)\n : null,\n sinceWakeConfirmedAt:\n currentSchedule.circadianState === \"awake\"\n ? (currentSchedule.wakeAt ??\n priorState?.sinceWakeConfirmedAt ??\n null)\n : (priorState?.sinceWakeConfirmedAt ?? null),\n evidenceRefs: currentSchedule.circadianRuleFirings.map(\n (firing) => firing.name,\n ),\n createdAt: priorState?.createdAt ?? now.toISOString(),\n updatedAt: now.toISOString(),\n });\n }\n const derivedEvents =\n currentSchedule === null\n ? []\n : deriveSleepWakeEvents({\n previous: previousSchedule,\n current: currentSchedule,\n now,\n });\n // Persist each derived circadian event via createAuditEventIfNew so a\n // runtime restart that re-runs deriveSleepWakeEvents on the same state\n // pair does not duplicate the emit (audit id is deterministic:\n // `${eventKind}:${agentId}:${occurredAt}`). Only events that were\n // newly inserted get dispatched to runtime.emitEvent.\n const lifeOpsEvents: typeof derivedEvents = [];\n for (const event of derivedEvents) {\n const inserted = await this.repository.createAuditEventIfNew({\n id: event.id,\n agentId: this.agentId(),\n eventType: \"circadian_event_emitted\",\n ownerType: \"circadian_state\",\n ownerId:\n currentSchedule?.id ??\n `lifeops-schedule-merged:${this.agentId()}:local:${currentSchedule?.timezone ?? \"UTC\"}`,\n reason: event.kind,\n inputs: {\n previousStateId: event.payload.previousStateId,\n currentStateId: event.payload.currentStateId,\n },\n decision: {\n kind: event.kind,\n occurredAt: event.occurredAt,\n confidence: event.confidence,\n circadianState: event.payload.circadianState,\n uncertaintyReason: event.payload.uncertaintyReason,\n },\n actor: \"agent\",\n createdAt: now.toISOString(),\n });\n if (inserted) {\n lifeOpsEvents.push(event);\n const eventPayload = {\n runtime: this.runtime,\n occurredAt: event.occurredAt,\n confidence: event.confidence,\n payload: event.payload,\n };\n await this.runtime.emitEvent(event.kind, eventPayload);\n }\n }\n const reminderResult = await this.processReminders({\n now: now.toISOString(),\n limit: reminderLimit,\n });\n const workflowRunner = this as ScheduledWorkflowRunner;\n const workflowRuns = await workflowRunner.runDueWorkflows({\n now: now.toISOString(),\n limit: workflowLimit,\n });\n const eventWorkflowRuns = await workflowRunner.runDueEventWorkflows({\n now: now.toISOString(),\n limit: workflowLimit,\n lifeOpsEvents,\n });\n const scheduledTaskResult = await processDueScheduledTasks({\n runtime: this.runtime,\n agentId: this.agentId(),\n now,\n limit: scheduledTaskLimit,\n });\n await this.processSleepCycleCheckins({\n now,\n currentSchedule,\n });\n await this.runTelemetryMaintenanceIfDue(now);\n return {\n now: now.toISOString(),\n reminderAttempts: reminderResult.attempts,\n workflowRuns: [...workflowRuns, ...eventWorkflowRuns],\n scheduledTaskFires: scheduledTaskResult.fires.map((fire) => ({\n ...fire,\n })),\n scheduledTaskCompletionTimeouts:\n scheduledTaskResult.completionTimeouts.map((timeout) => ({\n ...timeout,\n })),\n };\n }\n\n private async processSleepCycleCheckins(args: {\n now: Date;\n currentSchedule: LifeOpsScheduleMergedStateRecord | null;\n }): Promise<void> {\n const currentSchedule = args.currentSchedule;\n if (!currentSchedule) {\n return;\n }\n const service = new CheckinService(this.runtime, {\n sources: this,\n });\n const timezone = currentSchedule.timezone || resolveDefaultTimeZone();\n // Surface sleep-baseline + regularity into the night summary prompt.\n // Built once per scheduler tick from the same merged schedule record\n // the dispatcher just consumed for trigger decisions. Morning runs\n // ignore this field; the assignment below is night-only by design.\n const sleepRecap = buildSleepRecapFromSchedule(currentSchedule);\n const dispatch = async (kind: \"morning\" | \"night\"): Promise<void> => {\n const alreadySent = await service.hasCheckinForLocalDay({\n kind,\n now: args.now,\n timezone,\n });\n if (alreadySent) {\n return;\n }\n const report =\n kind === \"morning\"\n ? await service.runMorningCheckin({ now: args.now, timezone })\n : await service.runNightCheckin({\n now: args.now,\n timezone,\n sleepRecap,\n });\n const routeMetadata = await this.buildOwnerContactRouteEventMetadata({\n purpose: \"checkin\",\n urgency: report.escalationLevel >= 2 ? \"high\" : \"medium\",\n now: args.now,\n });\n this.emitAssistantEvent(report.summaryText, \"lifeops-checkin\", {\n checkinKind: kind,\n reportId: report.reportId,\n deliveryBasis: \"sleep_cycle\",\n circadianState: currentSchedule.circadianState,\n wakeAt: currentSchedule.wakeAt,\n bedtimeTargetAt: currentSchedule.relativeTime.bedtimeTargetAt,\n minutesUntilBedtimeTarget:\n currentSchedule.relativeTime.minutesUntilBedtimeTarget,\n ...routeMetadata,\n });\n };\n\n if (\n shouldRunMorningCheckinFromSleepCycle({\n state: currentSchedule,\n now: args.now,\n })\n ) {\n await dispatch(\"morning\");\n }\n // For irregular-schedule owners, the relative-time resolver leaves\n // `bedtimeTargetAt` null because no projection is trustworthy. Read the\n // owner's configured `nightCheckinTime` (HH:MM local) and pass it as a\n // fallback bedtime so the night summary still fires inside the lead\n // window. Defaults to 23:00 local when the field is unset.\n const profileSchedule = await resolveCheckinSchedule(this.runtime);\n if (\n shouldRunNightCheckinFromSleepCycle({\n state: currentSchedule,\n now: args.now,\n nightFallbackBedtimeLocal: profileSchedule.nightCheckinTime,\n })\n ) {\n await dispatch(\"night\");\n }\n }\n\n /**\n * Daily telemetry maintenance: rolls up yesterday's raw events into\n * `life_telemetry_rollup_daily`, then prunes raw rows past the retention\n * window. Gated to one run per UTC day per process via\n * `telemetryRollupLastRunDate` so a 60-second scheduler tick doesn't thrash.\n */\n private async runTelemetryMaintenanceIfDue(now: Date): Promise<void> {\n const dateKey = now.toISOString().slice(0, 10);\n if (this.telemetryRollupLastRunDate === dateKey) {\n return;\n }\n try {\n const yesterday = new Date(now.getTime() - 24 * 60 * 60 * 1_000);\n await this.repository.upsertTelemetryDailyRollup({\n agentId: this.agentId(),\n sinceIso: `${yesterday.toISOString().slice(0, 10)}T00:00:00.000Z`,\n untilIso: `${dateKey}T00:00:00.000Z`,\n });\n await runTelemetryRetention({\n repository: this.repository,\n agentId: this.agentId(),\n retentionDays: DEFAULT_TELEMETRY_RETENTION_DAYS,\n });\n this.telemetryRollupLastRunDate = dateKey;\n } catch (error) {\n // Maintenance failure should not break the scheduler tick; surface\n // a warning and retry next tick (the gate isn't updated on failure).\n this.logLifeOpsWarn(\n \"telemetry_maintenance\",\n error instanceof Error ? error.message : String(error),\n );\n }\n }\n\n async relockWebsiteAccessGroup(\n groupKey: string,\n now = new Date(),\n ): Promise<{ ok: true }> {\n await this.repository.revokeWebsiteAccessGrants(this.agentId(), {\n groupKey: requireNonEmptyString(groupKey, \"groupKey\"),\n revokedAt: now.toISOString(),\n });\n await this.syncWebsiteAccessState(now);\n return { ok: true };\n }\n\n async resolveWebsiteAccessCallback(\n callbackKey: string,\n now = new Date(),\n ): Promise<{ ok: true }> {\n await this.repository.revokeWebsiteAccessGrants(this.agentId(), {\n callbackKey: requireNonEmptyString(callbackKey, \"callbackKey\"),\n revokedAt: now.toISOString(),\n });\n await this.syncWebsiteAccessState(now);\n return { ok: true };\n }\n\n async inspectReminder(\n ownerType: \"occurrence\" | \"calendar_event\",\n ownerId: string,\n ): Promise<LifeOpsReminderInspection> {\n let plan: LifeOpsReminderPlan | null = null;\n if (ownerType === \"occurrence\") {\n const occurrence = await this.repository.getOccurrence(\n this.agentId(),\n ownerId,\n );\n if (!occurrence) {\n fail(404, \"life-ops occurrence not found\");\n }\n const definition = await this.repository.getDefinition(\n this.agentId(),\n occurrence.definitionId,\n );\n if (definition?.reminderPlanId) {\n plan = await this.repository.getReminderPlan(\n this.agentId(),\n definition.reminderPlanId,\n );\n }\n } else {\n const plans = await this.repository.listReminderPlansForOwners(\n this.agentId(),\n \"calendar_event\",\n [ownerId],\n );\n plan = plans[0] ?? null;\n }\n return {\n ownerType,\n ownerId,\n reminderPlan: plan,\n attempts: await this.repository.listReminderAttempts(this.agentId(), {\n ownerType,\n ownerId,\n }),\n audits: await this.repository.listAuditEvents(\n this.agentId(),\n ownerType,\n ownerId,\n ),\n };\n }\n\n async acknowledgeReminder(\n request: AcknowledgeLifeOpsReminderRequest,\n ): Promise<{ ok: true }> {\n const ownerType = normalizeEnumValue(request.ownerType, \"ownerType\", [\n \"occurrence\",\n \"calendar_event\",\n ] as const);\n const ownerId = requireNonEmptyString(request.ownerId, \"ownerId\");\n const acknowledgedAt =\n request.acknowledgedAt === undefined\n ? new Date().toISOString()\n : normalizeIsoString(request.acknowledgedAt, \"acknowledgedAt\");\n const note = normalizeOptionalString(request.note) ?? null;\n if (ownerType === \"occurrence\") {\n const occurrence = await this.repository.getOccurrence(\n this.agentId(),\n ownerId,\n );\n if (!occurrence) {\n fail(404, \"life-ops occurrence not found\");\n }\n await this.repository.updateOccurrence({\n ...occurrence,\n metadata: {\n ...occurrence.metadata,\n reminderAcknowledgedAt: acknowledgedAt,\n reminderAcknowledgedNote: note,\n },\n updatedAt: new Date().toISOString(),\n });\n } else {\n const event = (\n await this.repository.listCalendarEvents(this.agentId(), \"google\")\n ).find((candidate) => candidate.id === ownerId);\n if (!event) {\n fail(404, \"life-ops calendar event not found\");\n }\n await this.repository.upsertCalendarEvent({\n ...event,\n metadata: {\n ...event.metadata,\n reminderAcknowledgedAt: acknowledgedAt,\n reminderAcknowledgedNote: note,\n },\n updatedAt: new Date().toISOString(),\n });\n }\n await this.resolveReminderEscalation({\n ownerType,\n ownerId,\n resolvedAt: acknowledgedAt,\n resolution: \"acknowledged\",\n note,\n });\n return { ok: true };\n }\n } as unknown as MixinClass<TBase, LifeOpsReminderService>;\n}\n"],"mappings":"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","names":["REMINDER_DISPATCH_INSTRUCTIONS","preferred","channels","nextChannels","attempt"]}
|