@elizaos/plugin-personal-assistant 2.0.3-beta.6 → 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/repository.ts"],"sourcesContent":["import crypto from \"node:crypto\";\nimport {\n type EntityStore,\n knowledgeGraphSchema,\n type RelationshipStore,\n resolveKnowledgeGraphService,\n} from \"@elizaos/agent\";\nimport type { IAgentRuntime } from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport type {\n BrowserBridgeCompanionStatus,\n BrowserBridgePageContext,\n BrowserBridgePermissionState,\n BrowserBridgeSettings,\n BrowserBridgeTabSummary,\n} from \"@elizaos/plugin-browser\";\n// Pull runtime values from the carved plugins' server-safe DB subpaths rather\n// than their package barrels: the barrels re-export React views (→ @elizaos/ui),\n// which a DB repository must never drag into server or unit-test graphs.\nimport { browserBridgeSchema } from \"@elizaos/plugin-browser/schema\";\nimport type {\n LifeOpsScheduleMergedState,\n LifeOpsScheduleObservation,\n} from \"@elizaos/plugin-elizacloud/cloud/lifeops-schedule-sync-contracts\";\nimport { FinancesRepository } from \"@elizaos/plugin-finances/db/finances-repository\";\nimport type {\n LifeOpsPaymentSource,\n LifeOpsPaymentTransaction,\n} from \"@elizaos/plugin-finances/payment-types\";\nimport type {\n LifeOpsSubscriptionAudit,\n LifeOpsSubscriptionCancellation,\n LifeOpsSubscriptionCandidate,\n} from \"@elizaos/plugin-finances/subscriptions-types\";\nimport { inboxDbSchema } from \"@elizaos/plugin-inbox/db/schema\";\nimport type {\n LifeOpsXDm,\n LifeOpsXFeedItem,\n LifeOpsXFeedType,\n LifeOpsXSyncState,\n} from \"@elizaos/shared\";\nimport {\n LIFEOPS_INBOX_CHANNELS,\n type LifeOpsActivitySignal,\n type LifeOpsAuditEvent,\n type LifeOpsAwakeProbability,\n type LifeOpsAwakeProbabilityContributor,\n type LifeOpsBrowserSession,\n type LifeOpsCalendarEvent,\n type LifeOpsChannelPolicy,\n type LifeOpsCircadianRuleFiring,\n type LifeOpsCircadianState,\n type LifeOpsConnectorGrant,\n type LifeOpsConnectorSide,\n type LifeOpsGmailMessageSummary,\n type LifeOpsGmailSpamReviewItem,\n type LifeOpsGmailSpamReviewStatus,\n type LifeOpsGoalDefinition,\n type LifeOpsGoalLink,\n type LifeOpsHealthMetricSample,\n type LifeOpsHealthSignal,\n type LifeOpsHealthSleepEpisode,\n type LifeOpsHealthSleepStageSample,\n type LifeOpsHealthSyncState,\n type LifeOpsHealthWorkout,\n type LifeOpsInboxChannel,\n type LifeOpsInboxMessage,\n type LifeOpsNegotiationState,\n type LifeOpsOccurrence,\n type LifeOpsOccurrenceView,\n type LifeOpsPersonalBaseline,\n type LifeOpsProposalProposer,\n type LifeOpsProposalStatus,\n type LifeOpsRelationshipInteraction,\n type LifeOpsReminderAttempt,\n type LifeOpsReminderPlan,\n type LifeOpsScheduleInsight,\n type LifeOpsScheduleMealInsight,\n type LifeOpsScheduleRegularity,\n type LifeOpsSchedulingNegotiation,\n type LifeOpsSchedulingProposal,\n type LifeOpsScreenTimeDaily,\n type LifeOpsScreenTimeSession,\n type LifeOpsSleepCycleEvidence,\n type LifeOpsTaskDefinition,\n type LifeOpsTelemetryEvent,\n type LifeOpsTelemetryFamily,\n type LifeOpsTelemetryPayload,\n type LifeOpsUnclearReason,\n type LifeOpsWorkflowDefinition,\n type LifeOpsWorkflowRun,\n} from \"../contracts/index.js\";\nimport {\n createConnectorAccountPrivacyPolicy,\n deriveConnectorAccountId,\n deriveConnectorAccountIdFromGrant,\n grantScopedConnectorAccountId,\n type LifeOpsConnectorAccountPrivacyPolicy,\n normalizeLifeOpsAccountPrivacyScope,\n normalizeLifeOpsEgressDataClasses,\n} from \"./privacy-egress.js\";\nimport { refreshLifeOpsRelativeTime } from \"./relative-time.js\";\nimport { lifeOpsSchema } from \"./schema.js\";\nimport {\n DEFAULT_WORKFLOW_PERMISSION_POLICY,\n REMINDER_REVIEW_AT_METADATA_KEY,\n REMINDER_REVIEW_STATUS_METADATA_KEY,\n} from \"./service-constants.js\";\nimport {\n executeRawSql,\n executeRawSqlTx,\n OptimisticLockError,\n parseJsonArray,\n parseJsonRecord,\n parseJsonValue,\n sqlBoolean,\n sqlInteger,\n sqlJson,\n sqlNumber,\n sqlQuote,\n sqlText,\n type TransactionalDb,\n toBoolean,\n toNumber,\n toText,\n} from \"./sql.js\";\nimport { buildTelemetryEventFromSignal } from \"./telemetry-mapping.js\";\n\ntype BrowserCompanionCredential = {\n companion: BrowserBridgeCompanionStatus;\n pairingTokenHash: string | null;\n pendingPairingTokens: BrowserCompanionPendingPairingToken[];\n pendingPairingTokenHashes: string[];\n};\n\ntype BrowserCompanionPendingPairingToken = {\n hash: string;\n expiresAt: string | null;\n};\n\nfunction normalizeConnectorIdentityEmail(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const normalized = value.trim().toLowerCase();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction deriveConnectorIdentityEmail(\n identity: Record<string, unknown>,\n): string | null {\n return (\n normalizeConnectorIdentityEmail(identity.email) ??\n normalizeConnectorIdentityEmail(identity.emailAddress) ??\n normalizeConnectorIdentityEmail(identity.primaryEmail)\n );\n}\n\nfunction requireScopedGmailGrantId(grantId: string | null | undefined): string {\n if (typeof grantId !== \"string\" || grantId.trim().length === 0) {\n throw new Error(\"Gmail message persistence requires grantId.\");\n }\n return grantId.trim();\n}\n\nexport interface LifeOpsWebsiteAccessGrant {\n id: string;\n agentId: string;\n groupKey: string;\n definitionId: string;\n occurrenceId: string | null;\n websites: string[];\n unlockMode: \"fixed_duration\" | \"until_manual_lock\" | \"until_callback\";\n unlockDurationMinutes: number | null;\n callbackKey: string | null;\n unlockedAt: string;\n expiresAt: string | null;\n revokedAt: string | null;\n metadata: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface LifeOpsScheduleInsightRecord extends LifeOpsScheduleInsight {\n id: string;\n agentId: string;\n metadata: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface LifeOpsScheduleObservationRecord\n extends LifeOpsScheduleObservation {}\n\nexport interface LifeOpsScheduleMergedStateRecord\n extends LifeOpsScheduleMergedState {}\n\nexport {\n createLifeOpsHealthMetricSample,\n createLifeOpsHealthSleepEpisode,\n createLifeOpsHealthSyncState,\n createLifeOpsHealthWorkout,\n} from \"@elizaos/plugin-health/health-bridge/health-records\";\n// Sleep- and health-record types + factories owned by `@elizaos/plugin-health`,\n// re-exported here so existing app-lifeops importers keep resolving via the\n// repository module. Sourced from the leaf modules (not the package barrel)\n// because Vite's dep-optimizer scans even these type-only barrel specifiers and\n// chokes on the dist-less @elizaos/plugin-health entry in the keyless lane.\nexport type {\n LifeOpsPersistedSleepEpisodeSource,\n LifeOpsSleepEpisodeRecord,\n} from \"@elizaos/plugin-health/sleep/sleep-episode-types\";\nexport { createLifeOpsSleepEpisode } from \"@elizaos/plugin-health/sleep/sleep-episode-types\";\n\nimport type { LifeOpsSleepEpisodeRecord } from \"@elizaos/plugin-health/sleep/sleep-episode-types\";\n\nexport interface LifeOpsCachedInboxMessage extends LifeOpsInboxMessage {\n cachedAt: string;\n updatedAt: string;\n priorityFlags: string[];\n}\n\ntype LifeOpsInboxCacheWriteMessage = LifeOpsInboxMessage & {\n priorityFlags?: readonly string[];\n};\n\n// Finance tables were carved out of plugin-personal-assistant into\n// @elizaos/plugin-finances and now live under the `app_finances` PostgreSQL\n// schema. The raw SQL against those tables moved with them into\n// `FinancesRepository`; the finance methods below delegate to a shared\n// FinancesRepository instance so the subscriptions mixin keeps reaching them\n// through `this.repository`.\n\nconst LIFEOPS_INBOX_CHANNEL_SET = new Set<LifeOpsInboxChannel>(\n LIFEOPS_INBOX_CHANNELS,\n);\n\nconst LIFEOPS_INBOX_CHAT_TYPES = new Set<\n NonNullable<LifeOpsInboxMessage[\"chatType\"]>\n>([\"dm\", \"group\", \"channel\"]);\n\nconst LIFEOPS_INBOX_PRIORITY_CATEGORIES = new Set<\n NonNullable<LifeOpsInboxMessage[\"priorityCategory\"]>\n>([\"important\", \"planning\", \"casual\"]);\n\nfunction isoNow(): string {\n return new Date().toISOString();\n}\n\nfunction parseOwnershipFields(row: Record<string, unknown>) {\n const subjectType =\n toText(row.subject_type, \"owner\") === \"agent\" ? \"agent\" : \"owner\";\n return {\n domain:\n toText(\n row.domain,\n subjectType === \"agent\" ? \"agent_ops\" : \"user_lifeops\",\n ) === \"agent_ops\"\n ? \"agent_ops\"\n : \"user_lifeops\",\n subjectType,\n subjectId: toText(row.subject_id, toText(row.agent_id)),\n visibilityScope:\n subjectType === \"owner\"\n ? \"owner_only\"\n : toText(row.visibility_scope, \"agent_and_admin\") === \"owner_only\"\n ? \"owner_only\"\n : toText(row.visibility_scope, \"agent_and_admin\") ===\n \"agent_and_admin\"\n ? \"agent_and_admin\"\n : \"owner_agent_admin\",\n contextPolicy:\n toText(\n row.context_policy,\n subjectType === \"agent\" ? \"never\" : \"explicit_only\",\n ) === \"never\"\n ? \"never\"\n : toText(\n row.context_policy,\n subjectType === \"agent\" ? \"never\" : \"explicit_only\",\n ) === \"sidebar_only\"\n ? \"sidebar_only\"\n : toText(\n row.context_policy,\n subjectType === \"agent\" ? \"never\" : \"explicit_only\",\n ) === \"allowed_in_private_chat\"\n ? \"allowed_in_private_chat\"\n : \"explicit_only\",\n } as const;\n}\n\nfunction parseTaskDefinition(\n row: Record<string, unknown>,\n): LifeOpsTaskDefinition {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n ...parseOwnershipFields(row),\n kind: toText(row.kind) as LifeOpsTaskDefinition[\"kind\"],\n title: toText(row.title),\n description: toText(row.description),\n originalIntent: toText(row.original_intent),\n timezone: toText(row.timezone),\n status: toText(row.status) as LifeOpsTaskDefinition[\"status\"],\n priority: toNumber(row.priority, 3),\n cadence: parseJsonValue<LifeOpsTaskDefinition[\"cadence\"]>(\n row.cadence_json,\n { kind: \"once\", dueAt: \"\" },\n ),\n windowPolicy: parseJsonValue<LifeOpsTaskDefinition[\"windowPolicy\"]>(\n row.window_policy_json,\n { timezone: \"UTC\", windows: [] },\n ),\n progressionRule: parseJsonValue<LifeOpsTaskDefinition[\"progressionRule\"]>(\n row.progression_rule_json,\n { kind: \"none\" },\n ),\n websiteAccess: row.website_access_json\n ? parseJsonValue<LifeOpsTaskDefinition[\"websiteAccess\"]>(\n row.website_access_json,\n null,\n )\n : null,\n reminderPlanId: row.reminder_plan_id ? toText(row.reminder_plan_id) : null,\n goalId: row.goal_id ? toText(row.goal_id) : null,\n source: toText(row.source),\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n };\n}\n\nfunction parseOccurrence(row: Record<string, unknown>): LifeOpsOccurrence {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n ...parseOwnershipFields(row),\n definitionId: toText(row.definition_id),\n occurrenceKey: toText(row.occurrence_key),\n scheduledAt: row.scheduled_at ? toText(row.scheduled_at) : null,\n dueAt: row.due_at ? toText(row.due_at) : null,\n relevanceStartAt: toText(row.relevance_start_at),\n relevanceEndAt: toText(row.relevance_end_at),\n windowName: row.window_name ? toText(row.window_name) : null,\n state: toText(row.state) as LifeOpsOccurrence[\"state\"],\n snoozedUntil: row.snoozed_until ? toText(row.snoozed_until) : null,\n completionPayload: row.completion_payload_json\n ? parseJsonRecord(row.completion_payload_json)\n : null,\n derivedTarget: row.derived_target_json\n ? parseJsonRecord(row.derived_target_json)\n : null,\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n };\n}\n\nfunction parseOccurrenceView(\n row: Record<string, unknown>,\n): LifeOpsOccurrenceView {\n return {\n ...parseOccurrence(row),\n definitionKind: toText(\n row.definition_kind,\n ) as LifeOpsOccurrenceView[\"definitionKind\"],\n definitionStatus: toText(\n row.definition_status,\n ) as LifeOpsOccurrenceView[\"definitionStatus\"],\n cadence: parseJsonRecord(\n row.definition_cadence_json,\n ) as LifeOpsOccurrenceView[\"cadence\"],\n title: toText(row.definition_title),\n description: toText(row.definition_description),\n priority: toNumber(row.definition_priority, 3),\n timezone: toText(row.definition_timezone),\n source: toText(row.definition_source, \"manual\"),\n goalId: row.definition_goal_id ? toText(row.definition_goal_id) : null,\n };\n}\n\nfunction parseGoal(row: Record<string, unknown>): LifeOpsGoalDefinition {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n ...parseOwnershipFields(row),\n title: toText(row.title),\n description: toText(row.description),\n cadence: row.cadence_json ? parseJsonRecord(row.cadence_json) : null,\n supportStrategy: parseJsonRecord(row.support_strategy_json),\n successCriteria: parseJsonRecord(row.success_criteria_json),\n status: toText(row.status) as LifeOpsGoalDefinition[\"status\"],\n reviewState: toText(\n row.review_state,\n ) as LifeOpsGoalDefinition[\"reviewState\"],\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n };\n}\n\nfunction parseGoalLink(row: Record<string, unknown>): LifeOpsGoalLink {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n goalId: toText(row.goal_id),\n linkedType: toText(row.linked_type) as LifeOpsGoalLink[\"linkedType\"],\n linkedId: toText(row.linked_id),\n createdAt: toText(row.created_at),\n };\n}\n\nfunction parseReminderPlan(row: Record<string, unknown>): LifeOpsReminderPlan {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n ownerType: toText(row.owner_type) as LifeOpsReminderPlan[\"ownerType\"],\n ownerId: toText(row.owner_id),\n steps: parseJsonArray(row.steps_json),\n mutePolicy: parseJsonRecord(row.mute_policy_json),\n quietHours: parseJsonRecord(row.quiet_hours_json),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n };\n}\n\nfunction parseChannelPolicy(\n row: Record<string, unknown>,\n): LifeOpsChannelPolicy {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n channelType: toText(\n row.channel_type,\n ) as LifeOpsChannelPolicy[\"channelType\"],\n channelRef: toText(row.channel_ref),\n privacyClass: toText(\n row.privacy_class,\n ) as LifeOpsChannelPolicy[\"privacyClass\"],\n allowReminders: toBoolean(row.allow_reminders),\n allowEscalation: toBoolean(row.allow_escalation),\n allowPosts: toBoolean(row.allow_posts),\n requireConfirmationForActions: toBoolean(\n row.require_confirmation_for_actions,\n ),\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n };\n}\n\nfunction parseWebsiteAccessGrant(\n row: Record<string, unknown>,\n): LifeOpsWebsiteAccessGrant {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n groupKey: toText(row.group_key),\n definitionId: toText(row.definition_id),\n occurrenceId: row.occurrence_id ? toText(row.occurrence_id) : null,\n websites: parseJsonArray(row.websites_json),\n unlockMode: toText(\n row.unlock_mode,\n ) as LifeOpsWebsiteAccessGrant[\"unlockMode\"],\n unlockDurationMinutes: row.unlock_duration_minutes\n ? toNumber(row.unlock_duration_minutes, 0)\n : null,\n callbackKey: row.callback_key ? toText(row.callback_key) : null,\n unlockedAt: toText(row.unlocked_at),\n expiresAt: row.expires_at ? toText(row.expires_at) : null,\n revokedAt: row.revoked_at ? toText(row.revoked_at) : null,\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n };\n}\n\nfunction parseConnectorGrant(\n row: Record<string, unknown>,\n): LifeOpsConnectorGrant {\n const identity = parseJsonRecord(row.identity_json);\n const grant: LifeOpsConnectorGrant = {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n provider: toText(row.provider) as LifeOpsConnectorGrant[\"provider\"],\n connectorAccountId: row.connector_account_id\n ? toText(row.connector_account_id)\n : null,\n side: toText(row.side, \"owner\") as LifeOpsConnectorGrant[\"side\"],\n identity,\n identityEmail: row.identity_email ? toText(row.identity_email) : null,\n grantedScopes: parseJsonArray(row.granted_scopes_json),\n capabilities: parseJsonArray(row.capabilities_json),\n tokenRef: row.token_ref ? toText(row.token_ref) : null,\n mode: toText(row.mode) as LifeOpsConnectorGrant[\"mode\"],\n executionTarget: toText(\n row.execution_target ?? \"local\",\n ) as LifeOpsConnectorGrant[\"executionTarget\"],\n sourceOfTruth: toText(\n row.source_of_truth ?? \"local_storage\",\n ) as LifeOpsConnectorGrant[\"sourceOfTruth\"],\n preferredByAgent: toBoolean(row.preferred_by_agent ?? false),\n cloudConnectionId: row.cloud_connection_id\n ? toText(row.cloud_connection_id)\n : null,\n metadata: parseJsonRecord(row.metadata_json),\n lastRefreshAt: row.last_refresh_at ? toText(row.last_refresh_at) : null,\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n };\n return {\n ...grant,\n connectorAccountId:\n grant.connectorAccountId ?? deriveConnectorAccountIdFromGrant(grant),\n };\n}\n\nfunction parseConnectorAccountPrivacyPolicy(\n row: Record<string, unknown>,\n): LifeOpsConnectorAccountPrivacyPolicy {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n provider: toText(row.provider),\n connectorAccountId: toText(row.connector_account_id),\n visibilityScope: normalizeLifeOpsAccountPrivacyScope(row.visibility_scope),\n allowedDataClasses: normalizeLifeOpsEgressDataClasses(\n parseJsonArray(row.allowed_data_classes_json),\n ),\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n };\n}\n\nfunction parseAuditEvent(row: Record<string, unknown>): LifeOpsAuditEvent {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n eventType: toText(row.event_type) as LifeOpsAuditEvent[\"eventType\"],\n ownerType: toText(row.owner_type) as LifeOpsAuditEvent[\"ownerType\"],\n ownerId: toText(row.owner_id),\n reason: toText(row.reason),\n inputs: parseJsonRecord(row.inputs_json),\n decision: parseJsonRecord(row.decision_json),\n actor: toText(row.actor) as LifeOpsAuditEvent[\"actor\"],\n createdAt: toText(row.created_at),\n };\n}\n\nfunction parseOptionalFiniteNumber(value: unknown): number | null {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === \"string\" && value.trim().length > 0) {\n const parsed = Number(value);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n return null;\n}\n\nfunction parseHealthSignal(value: unknown): LifeOpsHealthSignal | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return null;\n }\n const record = value as Record<string, unknown>;\n const sleepRecord =\n record.sleep &&\n typeof record.sleep === \"object\" &&\n !Array.isArray(record.sleep)\n ? (record.sleep as Record<string, unknown>)\n : null;\n const biometricsRecord =\n record.biometrics &&\n typeof record.biometrics === \"object\" &&\n !Array.isArray(record.biometrics)\n ? (record.biometrics as Record<string, unknown>)\n : null;\n const permissionsRecord =\n record.permissions &&\n typeof record.permissions === \"object\" &&\n !Array.isArray(record.permissions)\n ? (record.permissions as Record<string, unknown>)\n : null;\n\n const source = toText(record.source, \"healthkit\");\n const normalizedSource: LifeOpsHealthSignal[\"source\"] =\n source === \"health_connect\" ||\n source === \"strava\" ||\n source === \"fitbit\" ||\n source === \"withings\" ||\n source === \"oura\"\n ? source\n : \"healthkit\";\n\n return {\n source: normalizedSource,\n permissions: {\n sleep: toBoolean(permissionsRecord?.sleep ?? false),\n biometrics: toBoolean(permissionsRecord?.biometrics ?? false),\n },\n sleep: {\n available: toBoolean(sleepRecord?.available ?? false),\n isSleeping: toBoolean(sleepRecord?.isSleeping ?? false),\n asleepAt: sleepRecord?.asleepAt ? toText(sleepRecord.asleepAt) : null,\n awakeAt: sleepRecord?.awakeAt ? toText(sleepRecord.awakeAt) : null,\n durationMinutes: parseOptionalFiniteNumber(sleepRecord?.durationMinutes),\n stage: sleepRecord?.stage ? toText(sleepRecord.stage) : null,\n },\n biometrics: {\n sampleAt: biometricsRecord?.sampleAt\n ? toText(biometricsRecord.sampleAt)\n : null,\n heartRateBpm: parseOptionalFiniteNumber(biometricsRecord?.heartRateBpm),\n restingHeartRateBpm: parseOptionalFiniteNumber(\n biometricsRecord?.restingHeartRateBpm,\n ),\n heartRateVariabilityMs: parseOptionalFiniteNumber(\n biometricsRecord?.heartRateVariabilityMs,\n ),\n respiratoryRate: parseOptionalFiniteNumber(\n biometricsRecord?.respiratoryRate,\n ),\n bloodOxygenPercent: parseOptionalFiniteNumber(\n biometricsRecord?.bloodOxygenPercent,\n ),\n },\n warnings: Array.isArray(record.warnings)\n ? record.warnings\n .map((warning) => toText(warning))\n .filter((warning) => warning.length > 0)\n : [],\n };\n}\n\nfunction parseActivitySignal(\n row: Record<string, unknown>,\n): LifeOpsActivitySignal {\n const metadata = parseJsonRecord(row.metadata_json);\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n source: toText(row.source) as LifeOpsActivitySignal[\"source\"],\n platform: toText(row.platform),\n state: toText(row.state) as LifeOpsActivitySignal[\"state\"],\n observedAt: toText(row.observed_at),\n idleState: row.idle_state\n ? (toText(row.idle_state) as LifeOpsActivitySignal[\"idleState\"])\n : null,\n idleTimeSeconds:\n row.idle_time_seconds === null || row.idle_time_seconds === undefined\n ? null\n : toNumber(row.idle_time_seconds, 0),\n onBattery:\n row.on_battery === null || row.on_battery === undefined\n ? null\n : toBoolean(row.on_battery),\n health: parseHealthSignal(metadata.health),\n metadata,\n createdAt: toText(row.created_at),\n };\n}\n\nfunction parseHealthMetricSample(\n row: Record<string, unknown>,\n): LifeOpsHealthMetricSample {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n provider: toText(row.provider) as LifeOpsHealthMetricSample[\"provider\"],\n grantId: toText(row.grant_id),\n metric: toText(row.metric) as LifeOpsHealthMetricSample[\"metric\"],\n value: toNumber(row.value, 0),\n unit: toText(row.unit),\n startAt: toText(row.start_at),\n endAt: toText(row.end_at),\n localDate: toText(row.local_date),\n sourceExternalId: toText(row.source_external_id),\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n };\n}\n\nfunction parseHealthWorkout(\n row: Record<string, unknown>,\n): LifeOpsHealthWorkout {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n provider: toText(row.provider) as LifeOpsHealthWorkout[\"provider\"],\n grantId: toText(row.grant_id),\n sourceExternalId: toText(row.source_external_id),\n workoutType: toText(row.workout_type),\n title: toText(row.title),\n startAt: toText(row.start_at),\n endAt: row.end_at ? toText(row.end_at) : null,\n durationSeconds: toNumber(row.duration_seconds, 0),\n distanceMeters:\n row.distance_meters === null || row.distance_meters === undefined\n ? null\n : toNumber(row.distance_meters, 0),\n calories:\n row.calories === null || row.calories === undefined\n ? null\n : toNumber(row.calories, 0),\n averageHeartRate:\n row.average_heart_rate === null || row.average_heart_rate === undefined\n ? null\n : toNumber(row.average_heart_rate, 0),\n maxHeartRate:\n row.max_heart_rate === null || row.max_heart_rate === undefined\n ? null\n : toNumber(row.max_heart_rate, 0),\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n };\n}\n\nfunction parseHealthSyncState(\n row: Record<string, unknown>,\n): LifeOpsHealthSyncState {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n provider: toText(row.provider) as LifeOpsHealthSyncState[\"provider\"],\n grantId: toText(row.grant_id),\n cursor: row.cursor ? toText(row.cursor) : null,\n lastSyncedAt: row.last_synced_at ? toText(row.last_synced_at) : null,\n lastSyncStartedAt: row.last_sync_started_at\n ? toText(row.last_sync_started_at)\n : null,\n lastSyncError: row.last_sync_error ? toText(row.last_sync_error) : null,\n metadata: parseJsonRecord(row.metadata_json),\n updatedAt: toText(row.updated_at),\n };\n}\n\nfunction parseHealthSleepStageSamples(\n value: unknown,\n): LifeOpsHealthSleepStageSample[] {\n return parseJsonArray(value).filter(\n (candidate): candidate is LifeOpsHealthSleepStageSample => {\n if (!candidate || typeof candidate !== \"object\") {\n return false;\n }\n const record = candidate as Record<string, unknown>;\n return (\n typeof record.stage === \"string\" &&\n typeof record.startAt === \"string\" &&\n typeof record.endAt === \"string\" &&\n (record.confidence === null || typeof record.confidence === \"number\") &&\n (record.providerCode === null ||\n typeof record.providerCode === \"string\")\n );\n },\n );\n}\n\nfunction parseHealthSleepEpisode(\n row: Record<string, unknown>,\n): LifeOpsHealthSleepEpisode {\n const nullableNumber = (value: unknown): number | null =>\n value === null || value === undefined ? null : toNumber(value, 0);\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n provider: toText(row.provider) as LifeOpsHealthSleepEpisode[\"provider\"],\n grantId: toText(row.grant_id),\n sourceExternalId: toText(row.source_external_id),\n localDate: toText(row.local_date),\n timezone: row.timezone ? toText(row.timezone) : null,\n startAt: toText(row.start_at),\n endAt: toText(row.end_at),\n isMainSleep: toBoolean(row.is_main_sleep, false),\n sleepType: row.sleep_type ? toText(row.sleep_type) : null,\n durationSeconds: toNumber(row.duration_seconds, 0),\n timeInBedSeconds: nullableNumber(row.time_in_bed_seconds),\n efficiency: nullableNumber(row.efficiency),\n latencySeconds: nullableNumber(row.latency_seconds),\n awakeSeconds: nullableNumber(row.awake_seconds),\n lightSleepSeconds: nullableNumber(row.light_sleep_seconds),\n deepSleepSeconds: nullableNumber(row.deep_sleep_seconds),\n remSleepSeconds: nullableNumber(row.rem_sleep_seconds),\n sleepScore: nullableNumber(row.sleep_score),\n readinessScore: nullableNumber(row.readiness_score),\n averageHeartRate: nullableNumber(row.average_heart_rate),\n lowestHeartRate: nullableNumber(row.lowest_heart_rate),\n averageHrvMs: nullableNumber(row.average_hrv_ms),\n respiratoryRate: nullableNumber(row.respiratory_rate),\n bloodOxygenPercent: nullableNumber(row.blood_oxygen_percent),\n stageSamples: parseHealthSleepStageSamples(row.stage_samples_json),\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n };\n}\n\nfunction parseCalendarEvent(\n row: Record<string, unknown>,\n): LifeOpsCalendarEvent {\n return {\n id: toText(row.id),\n externalId: toText(row.external_event_id),\n agentId: toText(row.agent_id),\n provider: toText(\n row.provider,\n \"google\",\n ) as LifeOpsCalendarEvent[\"provider\"],\n side: toText(row.side, \"owner\") as LifeOpsCalendarEvent[\"side\"],\n calendarId: toText(row.calendar_id),\n connectorAccountId: row.connector_account_id\n ? toText(row.connector_account_id)\n : undefined,\n title: toText(row.title),\n description: toText(row.description),\n location: toText(row.location),\n status: toText(row.status),\n startAt: toText(row.start_at),\n endAt: toText(row.end_at),\n isAllDay: toBoolean(row.is_all_day),\n timezone: row.timezone ? toText(row.timezone) : null,\n htmlLink: row.html_link ? toText(row.html_link) : null,\n conferenceLink: row.conference_link ? toText(row.conference_link) : null,\n organizer: row.organizer_json ? parseJsonRecord(row.organizer_json) : null,\n attendees: parseJsonArray(\n row.attendees_json,\n ) as LifeOpsCalendarEvent[\"attendees\"],\n metadata: parseJsonRecord(row.metadata_json),\n syncedAt: toText(row.synced_at),\n updatedAt: toText(row.updated_at),\n grantId: row.grant_id ? toText(row.grant_id) : undefined,\n };\n}\n\nfunction parseGmailMessageSummary(\n row: Record<string, unknown>,\n): LifeOpsGmailMessageSummary {\n return {\n id: toText(row.id),\n externalId: toText(row.external_message_id),\n agentId: toText(row.agent_id),\n provider: \"google\",\n side: toText(row.side, \"owner\") as LifeOpsGmailMessageSummary[\"side\"],\n connectorAccountId: row.connector_account_id\n ? toText(row.connector_account_id)\n : undefined,\n grantId: row.grant_id ? toText(row.grant_id) : undefined,\n threadId: toText(row.thread_id),\n subject: toText(row.subject),\n from: toText(row.from_display),\n fromEmail: row.from_email ? toText(row.from_email) : null,\n replyTo: row.reply_to ? toText(row.reply_to) : null,\n to: parseJsonArray(row.to_json),\n cc: parseJsonArray(row.cc_json),\n snippet: toText(row.snippet),\n receivedAt: toText(row.received_at),\n isUnread: toBoolean(row.is_unread),\n isImportant: toBoolean(row.is_important),\n likelyReplyNeeded: toBoolean(row.likely_reply_needed),\n triageScore: toNumber(row.triage_score),\n triageReason: toText(row.triage_reason),\n labels: parseJsonArray(row.label_ids_json),\n htmlLink: row.html_link ? toText(row.html_link) : null,\n metadata: parseJsonRecord(row.metadata_json),\n syncedAt: toText(row.synced_at),\n updatedAt: toText(row.updated_at),\n };\n}\n\nfunction normalizeInboxChatType(\n channel: LifeOpsInboxChannel,\n value: unknown,\n participantCount: number | undefined,\n): NonNullable<LifeOpsInboxMessage[\"chatType\"]> {\n if (typeof value === \"string\" && value.trim().length > 0) {\n const normalized = value.trim().toLowerCase();\n if (\n LIFEOPS_INBOX_CHAT_TYPES.has(\n normalized as NonNullable<LifeOpsInboxMessage[\"chatType\"]>,\n )\n ) {\n return normalized as NonNullable<LifeOpsInboxMessage[\"chatType\"]>;\n }\n throw new Error(`[LifeOpsRepository] invalid inbox chat type: ${value}`);\n }\n if (channel === \"gmail\") return \"dm\";\n if (typeof participantCount === \"number\") {\n return participantCount > 2 ? \"group\" : \"dm\";\n }\n return \"channel\";\n}\n\nfunction normalizeInboxChannelValue(\n value: unknown,\n label = \"inbox channel\",\n): LifeOpsInboxChannel {\n if (typeof value === \"string\") {\n const normalized = value.trim().toLowerCase();\n if (LIFEOPS_INBOX_CHANNEL_SET.has(normalized as LifeOpsInboxChannel)) {\n return normalized as LifeOpsInboxChannel;\n }\n }\n throw new Error(`[LifeOpsRepository] invalid ${label}: ${String(value)}`);\n}\n\nfunction requireInboxExternalId(value: unknown, label: string): string {\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value;\n }\n throw new Error(`[LifeOpsRepository] missing ${label}`);\n}\n\nfunction parseCachedInboxSourceRef(\n value: unknown,\n channel: LifeOpsInboxChannel,\n externalId: string,\n): LifeOpsInboxMessage[\"sourceRef\"] {\n const sourceRef = parseJsonRecord(value);\n const sourceRefChannel =\n sourceRef.channel === undefined || sourceRef.channel === null\n ? channel\n : normalizeInboxChannelValue(\n sourceRef.channel,\n \"inbox sourceRef channel\",\n );\n if (sourceRefChannel !== channel) {\n throw new Error(\n `[LifeOpsRepository] inbox sourceRef channel ${sourceRefChannel} does not match row channel ${channel}`,\n );\n }\n return {\n channel: sourceRefChannel,\n externalId:\n sourceRef.externalId === undefined || sourceRef.externalId === null\n ? externalId\n : requireInboxExternalId(\n sourceRef.externalId,\n \"inbox sourceRef externalId\",\n ),\n ...(typeof sourceRef.phoneAccountId === \"string\" &&\n sourceRef.phoneAccountId.trim().length > 0\n ? { phoneAccountId: sourceRef.phoneAccountId.trim() }\n : {}),\n ...(typeof sourceRef.phoneAccountLabel === \"string\" &&\n sourceRef.phoneAccountLabel.trim().length > 0\n ? { phoneAccountLabel: sourceRef.phoneAccountLabel.trim() }\n : {}),\n ...(typeof sourceRef.phoneNumber === \"string\" &&\n sourceRef.phoneNumber.trim().length > 0\n ? { phoneNumber: sourceRef.phoneNumber.trim() }\n : {}),\n };\n}\n\nfunction normalizeInboxWriteSourceRef(\n sourceRef: LifeOpsInboxMessage[\"sourceRef\"],\n channel: LifeOpsInboxChannel,\n): LifeOpsInboxMessage[\"sourceRef\"] {\n const sourceRefChannel = normalizeInboxChannelValue(\n sourceRef.channel,\n \"inbox sourceRef channel\",\n );\n if (sourceRefChannel !== channel) {\n throw new Error(\n `[LifeOpsRepository] inbox sourceRef channel ${sourceRefChannel} does not match message channel ${channel}`,\n );\n }\n return {\n channel: sourceRefChannel,\n externalId: requireInboxExternalId(\n sourceRef.externalId,\n \"inbox sourceRef externalId\",\n ),\n ...(typeof sourceRef.phoneAccountId === \"string\" &&\n sourceRef.phoneAccountId.trim().length > 0\n ? { phoneAccountId: sourceRef.phoneAccountId.trim() }\n : {}),\n ...(typeof sourceRef.phoneAccountLabel === \"string\" &&\n sourceRef.phoneAccountLabel.trim().length > 0\n ? { phoneAccountLabel: sourceRef.phoneAccountLabel.trim() }\n : {}),\n ...(typeof sourceRef.phoneNumber === \"string\" &&\n sourceRef.phoneNumber.trim().length > 0\n ? { phoneNumber: sourceRef.phoneNumber.trim() }\n : {}),\n };\n}\n\nfunction normalizeInboxPriorityCategory(\n value: unknown,\n): LifeOpsInboxMessage[\"priorityCategory\"] {\n if (value === null || value === undefined || value === \"\") {\n return undefined;\n }\n if (typeof value !== \"string\") {\n throw new Error(\"[LifeOpsRepository] invalid inbox priority category\");\n }\n const normalized = value.trim().toLowerCase();\n if (\n LIFEOPS_INBOX_PRIORITY_CATEGORIES.has(\n normalized as NonNullable<LifeOpsInboxMessage[\"priorityCategory\"]>,\n )\n ) {\n return normalized as NonNullable<LifeOpsInboxMessage[\"priorityCategory\"]>;\n }\n throw new Error(\n `[LifeOpsRepository] invalid inbox priority category: ${value}`,\n );\n}\n\nfunction normalizeInboxPriorityFlags(\n flags: readonly string[] | undefined,\n): string[] {\n if (!flags) return [];\n const out: string[] = [];\n const seen = new Set<string>();\n for (const flag of flags) {\n const normalized = flag.trim();\n if (!normalized || seen.has(normalized)) continue;\n seen.add(normalized);\n out.push(normalized);\n }\n return out;\n}\n\nfunction hasOwnPriorityFlags(message: LifeOpsInboxCacheWriteMessage): boolean {\n return Object.hasOwn(message, \"priorityFlags\");\n}\n\nfunction parseCachedInboxMessage(\n row: Record<string, unknown>,\n): LifeOpsCachedInboxMessage {\n const channel = normalizeInboxChannelValue(row.channel);\n const externalId = requireInboxExternalId(\n row.external_id,\n \"inbox external_id\",\n );\n const priorityScore =\n row.priority_score === null || row.priority_score === undefined\n ? undefined\n : toNumber(row.priority_score);\n const priorityCategory =\n row.priority_category === null || row.priority_category === undefined\n ? undefined\n : toText(row.priority_category);\n const participantCount =\n row.participant_count === null || row.participant_count === undefined\n ? undefined\n : toNumber(row.participant_count);\n const chatType = normalizeInboxChatType(\n channel,\n row.chat_type,\n participantCount,\n );\n const sourceRef = parseCachedInboxSourceRef(\n row.source_ref_json,\n channel,\n externalId,\n );\n const flags = parseJsonArray<string>(row.priority_flags_json).filter(\n (flag): flag is string => typeof flag === \"string\",\n );\n return {\n id: toText(row.id),\n channel,\n sender: {\n id: toText(row.sender_id),\n displayName: toText(row.sender_display),\n email: row.sender_email ? toText(row.sender_email) : null,\n avatarUrl: null,\n },\n subject: row.subject ? toText(row.subject) : null,\n snippet: toText(row.snippet),\n receivedAt: toText(row.received_at),\n unread: toBoolean(row.is_unread),\n deepLink: row.deep_link ? toText(row.deep_link) : null,\n sourceRef,\n threadId: row.thread_id ? toText(row.thread_id) : undefined,\n chatType,\n participantCount,\n gmailAccountId: row.gmail_account_id\n ? toText(row.gmail_account_id)\n : undefined,\n connectorAccountId: row.connector_account_id\n ? toText(row.connector_account_id)\n : undefined,\n gmailAccountEmail: row.gmail_account_email\n ? toText(row.gmail_account_email)\n : undefined,\n phoneAccountId: sourceRef.phoneAccountId,\n phoneAccountLabel: sourceRef.phoneAccountLabel,\n phoneNumber: sourceRef.phoneNumber,\n lastSeenAt: row.last_seen_at ? toText(row.last_seen_at) : undefined,\n repliedAt: row.replied_at ? toText(row.replied_at) : undefined,\n priorityScore,\n priorityCategory: normalizeInboxPriorityCategory(priorityCategory),\n cachedAt: toText(row.cached_at),\n updatedAt: toText(row.updated_at),\n priorityFlags: flags,\n };\n}\n\nfunction parseGmailSpamReviewItem(\n row: Record<string, unknown>,\n): LifeOpsGmailSpamReviewItem {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n provider: \"google\",\n side: toText(row.side, \"owner\") as LifeOpsGmailSpamReviewItem[\"side\"],\n grantId: toText(row.grant_id),\n accountEmail: row.account_email ? toText(row.account_email) : null,\n messageId: toText(row.message_id),\n externalMessageId: toText(row.external_message_id),\n threadId: toText(row.thread_id),\n subject: toText(row.subject),\n from: toText(row.from_display),\n fromEmail: row.from_email ? toText(row.from_email) : null,\n receivedAt: toText(row.received_at),\n snippet: toText(row.snippet),\n labels: parseJsonArray(row.label_ids_json),\n rationale: toText(row.rationale),\n confidence: toNumber(row.confidence),\n status: toText(row.status, \"pending\") as LifeOpsGmailSpamReviewStatus,\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n reviewedAt: row.reviewed_at ? toText(row.reviewed_at) : null,\n };\n}\n\nfunction parseWorkflowDefinition(\n row: Record<string, unknown>,\n): LifeOpsWorkflowDefinition {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n ...parseOwnershipFields(row),\n title: toText(row.title),\n triggerType: toText(\n row.trigger_type,\n ) as LifeOpsWorkflowDefinition[\"triggerType\"],\n schedule: parseJsonValue<LifeOpsWorkflowDefinition[\"schedule\"]>(\n row.schedule_json,\n { kind: \"manual\" },\n ),\n actionPlan: parseJsonValue<LifeOpsWorkflowDefinition[\"actionPlan\"]>(\n row.action_plan_json,\n { steps: [] },\n ),\n permissionPolicy: parseJsonValue<\n LifeOpsWorkflowDefinition[\"permissionPolicy\"]\n >(row.permission_policy_json, DEFAULT_WORKFLOW_PERMISSION_POLICY),\n status: toText(row.status) as LifeOpsWorkflowDefinition[\"status\"],\n createdBy: toText(row.created_by) as LifeOpsWorkflowDefinition[\"createdBy\"],\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n };\n}\n\nfunction parseWorkflowRun(row: Record<string, unknown>): LifeOpsWorkflowRun {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n workflowId: toText(row.workflow_id),\n startedAt: toText(row.started_at),\n finishedAt: row.finished_at ? toText(row.finished_at) : null,\n status: toText(row.status) as LifeOpsWorkflowRun[\"status\"],\n result: parseJsonRecord(row.result_json),\n auditRef: row.audit_ref ? toText(row.audit_ref) : null,\n };\n}\n\nfunction parseReminderAttempt(\n row: Record<string, unknown>,\n): LifeOpsReminderAttempt {\n const deliveryMetadata = parseJsonRecord(row.delivery_metadata_json);\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n planId: toText(row.plan_id),\n ownerType: toText(row.owner_type) as LifeOpsReminderAttempt[\"ownerType\"],\n ownerId: toText(row.owner_id),\n occurrenceId: row.occurrence_id ? toText(row.occurrence_id) : null,\n channel: toText(row.channel) as LifeOpsReminderAttempt[\"channel\"],\n stepIndex: toNumber(row.step_index, 0),\n scheduledFor: toText(row.scheduled_for),\n attemptedAt: row.attempted_at ? toText(row.attempted_at) : null,\n outcome: toText(row.outcome) as LifeOpsReminderAttempt[\"outcome\"],\n connectorRef: row.connector_ref ? toText(row.connector_ref) : null,\n deliveryMetadata,\n reviewAt: row.review_at ? toText(row.review_at) : null,\n reviewStatus: row.review_status\n ? (toText(row.review_status) as LifeOpsReminderAttempt[\"reviewStatus\"])\n : null,\n };\n}\n\nfunction readReminderReviewColumnValues(\n metadata: Record<string, unknown> | null | undefined,\n): {\n reviewAt: string | null;\n reviewStatus: LifeOpsReminderAttempt[\"reviewStatus\"];\n} {\n const reviewAt = metadata?.[REMINDER_REVIEW_AT_METADATA_KEY];\n const reviewStatus = metadata?.[REMINDER_REVIEW_STATUS_METADATA_KEY];\n return {\n reviewAt: typeof reviewAt === \"string\" ? reviewAt : null,\n reviewStatus:\n typeof reviewStatus === \"string\"\n ? (reviewStatus as LifeOpsReminderAttempt[\"reviewStatus\"])\n : null,\n };\n}\n\nfunction parseBrowserSession(\n row: Record<string, unknown>,\n): LifeOpsBrowserSession {\n const rawStatus = toText(row.status);\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n ...parseOwnershipFields(row),\n workflowId: row.workflow_id ? toText(row.workflow_id) : null,\n browser: row.browser\n ? (toText(row.browser) as LifeOpsBrowserSession[\"browser\"])\n : null,\n companionId: row.companion_id ? toText(row.companion_id) : null,\n profileId: row.profile_id ? toText(row.profile_id) : null,\n windowId: row.window_id ? toText(row.window_id) : null,\n tabId: row.tab_id ? toText(row.tab_id) : null,\n title: toText(row.title),\n status:\n rawStatus === \"navigating\"\n ? \"running\"\n : (rawStatus as LifeOpsBrowserSession[\"status\"]),\n actions: parseJsonArray(\n row.actions_json,\n ) as LifeOpsBrowserSession[\"actions\"],\n currentActionIndex: toNumber(row.current_action_index, 0),\n awaitingConfirmationForActionId: row.awaiting_confirmation_for_action_id\n ? toText(row.awaiting_confirmation_for_action_id)\n : null,\n result: parseJsonRecord(row.result_json),\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n finishedAt: row.finished_at ? toText(row.finished_at) : null,\n };\n}\n\nfunction parseBrowserPermissionState(\n value: unknown,\n): BrowserBridgePermissionState {\n const input = parseJsonRecord(value);\n return {\n tabs: Boolean(input.tabs),\n scripting: Boolean(input.scripting),\n activeTab: Boolean(input.activeTab),\n allOrigins: Boolean(input.allOrigins),\n grantedOrigins: Array.isArray(input.grantedOrigins)\n ? input.grantedOrigins\n .filter(\n (candidate): candidate is string => typeof candidate === \"string\",\n )\n .map((candidate) => candidate.trim())\n .filter((candidate) => candidate.length > 0)\n : [],\n incognitoEnabled: Boolean(input.incognitoEnabled),\n };\n}\n\nfunction parseBrowserSettings(\n row: Record<string, unknown>,\n): BrowserBridgeSettings {\n return {\n enabled: toBoolean(row.enabled, false),\n trackingMode: toText(\n row.tracking_mode,\n \"current_tab\",\n ) as BrowserBridgeSettings[\"trackingMode\"],\n allowBrowserControl: toBoolean(row.allow_browser_control, false),\n requireConfirmationForAccountAffecting: toBoolean(\n row.require_confirmation_for_account_affecting,\n true,\n ),\n incognitoEnabled: toBoolean(row.incognito_enabled, false),\n siteAccessMode: toText(\n row.site_access_mode,\n \"current_site_only\",\n ) as BrowserBridgeSettings[\"siteAccessMode\"],\n grantedOrigins: parseJsonArray(row.granted_origins_json).filter(\n (candidate): candidate is string => typeof candidate === \"string\",\n ),\n blockedOrigins: parseJsonArray(row.blocked_origins_json).filter(\n (candidate): candidate is string => typeof candidate === \"string\",\n ),\n maxRememberedTabs: toNumber(row.max_remembered_tabs, 10),\n pauseUntil: row.pause_until ? toText(row.pause_until) : null,\n metadata: parseJsonRecord(row.metadata_json),\n updatedAt: row.updated_at ? toText(row.updated_at) : null,\n };\n}\n\nfunction parseBrowserCompanion(\n row: Record<string, unknown>,\n): BrowserBridgeCompanionStatus {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n browser: toText(row.browser) as BrowserBridgeCompanionStatus[\"browser\"],\n profileId: toText(row.profile_id),\n profileLabel: toText(row.profile_label),\n label: toText(row.label),\n extensionVersion: row.extension_version\n ? toText(row.extension_version)\n : null,\n connectionState: toText(\n row.connection_state,\n ) as BrowserBridgeCompanionStatus[\"connectionState\"],\n permissions: parseBrowserPermissionState(row.permissions_json),\n lastSeenAt: row.last_seen_at ? toText(row.last_seen_at) : null,\n pairedAt: row.paired_at ? toText(row.paired_at) : null,\n pairingTokenExpiresAt: row.pairing_token_expires_at\n ? toText(row.pairing_token_expires_at)\n : null,\n pairingTokenRevokedAt: row.pairing_token_revoked_at\n ? toText(row.pairing_token_revoked_at)\n : null,\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n };\n}\n\nfunction parseBrowserCompanionPendingPairingTokens(\n value: unknown,\n): BrowserCompanionPendingPairingToken[] {\n return parseJsonArray(value)\n .map((candidate): BrowserCompanionPendingPairingToken | null => {\n if (typeof candidate === \"string\" && candidate.length > 0) {\n return { hash: candidate, expiresAt: null };\n }\n if (\n !candidate ||\n typeof candidate !== \"object\" ||\n Array.isArray(candidate)\n ) {\n return null;\n }\n const record = candidate as Record<string, unknown>;\n if (typeof record.hash !== \"string\" || record.hash.length === 0) {\n return null;\n }\n return {\n hash: record.hash,\n expiresAt:\n typeof record.expiresAt === \"string\" && record.expiresAt.length > 0\n ? record.expiresAt\n : null,\n };\n })\n .filter(\n (candidate): candidate is BrowserCompanionPendingPairingToken =>\n candidate !== null,\n );\n}\n\nfunction parseBrowserCompanionCredential(\n row: Record<string, unknown>,\n): BrowserCompanionCredential {\n const pendingPairingTokens = parseBrowserCompanionPendingPairingTokens(\n row.pending_pairing_token_hashes_json,\n );\n return {\n companion: parseBrowserCompanion(row),\n pairingTokenHash: row.pairing_token_hash\n ? toText(row.pairing_token_hash)\n : null,\n pendingPairingTokens,\n pendingPairingTokenHashes: pendingPairingTokens.map((token) => token.hash),\n };\n}\n\nfunction parseBrowserTabSummary(\n row: Record<string, unknown>,\n): BrowserBridgeTabSummary {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n companionId: row.companion_id ? toText(row.companion_id) : null,\n browser: toText(row.browser) as BrowserBridgeTabSummary[\"browser\"],\n profileId: toText(row.profile_id),\n windowId: toText(row.window_id),\n tabId: toText(row.tab_id),\n url: toText(row.url),\n title: toText(row.title),\n activeInWindow: toBoolean(row.active_in_window, false),\n focusedWindow: toBoolean(row.focused_window, false),\n focusedActive: toBoolean(row.focused_active, false),\n incognito: toBoolean(row.incognito, false),\n faviconUrl: row.favicon_url ? toText(row.favicon_url) : null,\n lastSeenAt: toText(row.last_seen_at),\n lastFocusedAt: row.last_focused_at ? toText(row.last_focused_at) : null,\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n };\n}\n\nfunction parseBrowserPageContext(\n row: Record<string, unknown>,\n): BrowserBridgePageContext {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n browser: toText(row.browser) as BrowserBridgePageContext[\"browser\"],\n profileId: toText(row.profile_id),\n windowId: toText(row.window_id),\n tabId: toText(row.tab_id),\n url: toText(row.url),\n title: toText(row.title),\n selectionText: row.selection_text ? toText(row.selection_text) : null,\n mainText: row.main_text ? toText(row.main_text) : null,\n headings: parseJsonArray(row.headings_json).filter(\n (candidate): candidate is string => typeof candidate === \"string\",\n ),\n links: parseJsonArray(row.links_json).filter(\n (candidate): candidate is BrowserBridgePageContext[\"links\"][number] =>\n (() => {\n if (!candidate || typeof candidate !== \"object\") {\n return false;\n }\n const record = candidate as Record<string, unknown>;\n return (\n typeof record.href === \"string\" && typeof record.text === \"string\"\n );\n })(),\n ),\n forms: parseJsonArray(row.forms_json).filter(\n (candidate): candidate is BrowserBridgePageContext[\"forms\"][number] =>\n (() => {\n if (!candidate || typeof candidate !== \"object\") {\n return false;\n }\n const record = candidate as Record<string, unknown>;\n return (\n (record.action === null ||\n record.action === undefined ||\n typeof record.action === \"string\") &&\n Array.isArray(record.fields) &&\n record.fields.every((field) => typeof field === \"string\")\n );\n })(),\n ),\n capturedAt: toText(row.captured_at),\n metadata: parseJsonRecord(row.metadata_json),\n };\n}\n\ninterface LifeOpsCalendarSyncState {\n id: string;\n agentId: string;\n provider: LifeOpsConnectorGrant[\"provider\"];\n side: LifeOpsConnectorSide;\n calendarId: string;\n windowStartAt: string;\n windowEndAt: string;\n syncedAt: string;\n updatedAt: string;\n}\n\nfunction parseCalendarSyncState(\n row: Record<string, unknown>,\n): LifeOpsCalendarSyncState {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n provider: toText(row.provider) as LifeOpsConnectorGrant[\"provider\"],\n side: toText(row.side, \"owner\") as LifeOpsConnectorSide,\n calendarId: toText(row.calendar_id),\n windowStartAt: toText(row.window_start_at),\n windowEndAt: toText(row.window_end_at),\n syncedAt: toText(row.synced_at),\n updatedAt: toText(row.updated_at),\n };\n}\n\ninterface LifeOpsGmailSyncState {\n id: string;\n agentId: string;\n provider: LifeOpsConnectorGrant[\"provider\"];\n side: LifeOpsConnectorSide;\n mailbox: string;\n grantId: string;\n maxResults: number;\n syncedAt: string;\n updatedAt: string;\n}\n\nfunction parseGmailSyncState(\n row: Record<string, unknown>,\n): LifeOpsGmailSyncState {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n provider: toText(row.provider) as LifeOpsConnectorGrant[\"provider\"],\n side: toText(row.side, \"owner\") as LifeOpsConnectorSide,\n mailbox: toText(row.mailbox),\n grantId: toText(row.grant_id),\n maxResults: toNumber(row.max_results, 0),\n syncedAt: toText(row.synced_at),\n updatedAt: toText(row.updated_at),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Escalation state row — used by EscalationService for write-through cache\n// ---------------------------------------------------------------------------\n\nexport interface LifeOpsEscalationStateRow {\n id: string;\n agentId: string;\n reason: string;\n text: string;\n currentStep: number;\n channelsSent: string[];\n startedAt: string;\n lastSentAt: string;\n resolved: boolean;\n resolvedAt: string | null;\n metadata: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n}\n\nfunction parseEscalationStateRow(\n row: Record<string, unknown>,\n): LifeOpsEscalationStateRow {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n reason: toText(row.reason),\n text: toText(row.text),\n currentStep: toNumber(row.current_step, 0),\n channelsSent: parseJsonArray<string>(row.channels_sent_json),\n startedAt: toText(row.started_at),\n lastSentAt: toText(row.last_sent_at),\n resolved: toBoolean(row.resolved),\n resolvedAt: row.resolved_at ? toText(row.resolved_at) : null,\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n };\n}\n\nfunction parseXDm(row: Record<string, unknown>): LifeOpsXDm {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n externalDmId: toText(row.external_dm_id),\n conversationId: toText(row.conversation_id),\n senderHandle: toText(row.sender_handle),\n senderId: toText(row.sender_id),\n isInbound: toBoolean(row.is_inbound),\n text: toText(row.text),\n receivedAt: toText(row.received_at),\n readAt: row.read_at ? toText(row.read_at) : null,\n repliedAt: row.replied_at ? toText(row.replied_at) : null,\n metadata: parseJsonRecord(row.metadata_json),\n syncedAt: toText(row.synced_at),\n updatedAt: toText(row.updated_at),\n };\n}\n\nfunction parseXFeedItem(row: Record<string, unknown>): LifeOpsXFeedItem {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n externalTweetId: toText(row.external_tweet_id),\n authorHandle: toText(row.author_handle),\n authorId: toText(row.author_id),\n text: toText(row.text),\n createdAtSource: toText(row.created_at_source),\n feedType: toText(row.feed_type) as LifeOpsXFeedType,\n metadata: parseJsonRecord(row.metadata_json),\n syncedAt: toText(row.synced_at),\n updatedAt: toText(row.updated_at),\n };\n}\n\nfunction parseXSyncState(row: Record<string, unknown>): LifeOpsXSyncState {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n feedType: toText(row.feed_type) as LifeOpsXFeedType,\n lastCursor: row.last_cursor ? toText(row.last_cursor) : null,\n syncedAt: toText(row.synced_at),\n updatedAt: toText(row.updated_at),\n };\n}\n\nfunction parseScreenTimeSession(\n row: Record<string, unknown>,\n): LifeOpsScreenTimeSession {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n source: toText(row.source) as \"app\" | \"website\",\n identifier: toText(row.identifier),\n displayName: toText(row.display_name, toText(row.identifier)),\n startAt: toText(row.start_at),\n endAt: row.end_at ? toText(row.end_at) : null,\n durationSeconds: toNumber(row.duration_seconds, 0),\n isActive: toBoolean(row.is_active),\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n };\n}\n\nfunction parseScreenTimeDaily(\n row: Record<string, unknown>,\n): LifeOpsScreenTimeDaily {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n source: toText(row.source) as \"app\" | \"website\",\n identifier: toText(row.identifier),\n date: toText(row.date),\n totalSeconds: toNumber(row.total_seconds, 0),\n sessionCount: toNumber(row.session_count, 0),\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n };\n}\n\nfunction defaultAwakeProbability(computedAt: string): LifeOpsAwakeProbability {\n return {\n pAwake: 0,\n pAsleep: 0,\n pUnknown: 1,\n contributingSources: [],\n computedAt,\n };\n}\n\nfunction parseAwakeProbability(\n value: unknown,\n computedAt: string,\n): LifeOpsAwakeProbability {\n if (value === null || value === undefined || value === \"\") {\n return defaultAwakeProbability(computedAt);\n }\n const record = parseJsonRecord(value);\n const contributors = Array.isArray(record.contributingSources)\n ? record.contributingSources\n .filter(\n (candidate): candidate is Record<string, unknown> =>\n Boolean(candidate) && typeof candidate === \"object\",\n )\n .map((candidate) => ({\n source: toText(\n candidate.source,\n ) as LifeOpsAwakeProbabilityContributor[\"source\"],\n logLikelihoodRatio: toNumber(candidate.logLikelihoodRatio, 0),\n }))\n : [];\n return {\n pAwake: toNumber(record.pAwake, 0),\n pAsleep: toNumber(record.pAsleep, 0),\n pUnknown: toNumber(record.pUnknown, 1),\n contributingSources: contributors,\n computedAt: toText(record.computedAt, computedAt),\n };\n}\n\nfunction defaultScheduleRegularity(): LifeOpsScheduleRegularity {\n return {\n sri: 0,\n bedtimeStddevMin: 0,\n wakeStddevMin: 0,\n midSleepStddevMin: 0,\n regularityClass: \"insufficient_data\",\n sampleCount: 0,\n windowDays: 28,\n };\n}\n\nfunction parseScheduleRegularity(value: unknown): LifeOpsScheduleRegularity {\n if (value === null || value === undefined || value === \"\") {\n return defaultScheduleRegularity();\n }\n const record = parseJsonRecord(value);\n return {\n sri: toNumber(record.sri, 0),\n bedtimeStddevMin: toNumber(record.bedtimeStddevMin, 0),\n wakeStddevMin: toNumber(record.wakeStddevMin, 0),\n midSleepStddevMin: toNumber(record.midSleepStddevMin, 0),\n regularityClass: toText(\n record.regularityClass,\n \"insufficient_data\",\n ) as LifeOpsScheduleRegularity[\"regularityClass\"],\n sampleCount: toNumber(record.sampleCount, 0),\n windowDays: toNumber(record.windowDays, 28),\n };\n}\n\nfunction parseTelemetryEventRow(\n row: Record<string, unknown>,\n): LifeOpsTelemetryEvent {\n const payload = parseJsonValue<LifeOpsTelemetryPayload>(row.payload_json, {\n family: \"manual_override_event\",\n platform: \"macos_desktop\",\n kind: \"going_to_bed\",\n note: null,\n });\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n family: toText(row.family) as LifeOpsTelemetryFamily,\n occurredAt: toText(row.occurred_at),\n ingestedAt: toText(row.ingested_at),\n dedupeKey: toText(row.dedupe_key),\n sourceReliability: toNumber(row.source_reliability, 0.5),\n payload,\n };\n}\n\nexport interface LifeOpsCircadianStateRow {\n agentId: string;\n circadianState: LifeOpsCircadianState;\n stateConfidence: number;\n uncertaintyReason: LifeOpsUnclearReason | null;\n enteredAt: string;\n sinceSleepDetectedAt: string | null;\n sinceWakeObservedAt: string | null;\n sinceWakeConfirmedAt: string | null;\n evidenceRefs: string[];\n createdAt: string;\n updatedAt: string;\n}\n\nfunction parseCircadianStateRow(\n row: Record<string, unknown>,\n): LifeOpsCircadianStateRow {\n return {\n agentId: toText(row.agent_id),\n circadianState: toText(row.circadian_state) as LifeOpsCircadianState,\n stateConfidence: toNumber(row.state_confidence, 0),\n uncertaintyReason: row.uncertainty_reason\n ? (toText(row.uncertainty_reason) as LifeOpsUnclearReason)\n : null,\n enteredAt: toText(row.entered_at),\n sinceSleepDetectedAt: row.since_sleep_detected_at\n ? toText(row.since_sleep_detected_at)\n : null,\n sinceWakeObservedAt: row.since_wake_observed_at\n ? toText(row.since_wake_observed_at)\n : null,\n sinceWakeConfirmedAt: row.since_wake_confirmed_at\n ? toText(row.since_wake_confirmed_at)\n : null,\n evidenceRefs: parseJsonArray<string>(row.evidence_refs_json),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n };\n}\n\nfunction parsePersonalBaseline(value: unknown): LifeOpsPersonalBaseline | null {\n if (value === null || value === undefined || value === \"\") {\n return null;\n }\n const record = parseJsonRecord(value);\n if (Object.keys(record).length === 0) {\n return null;\n }\n return {\n medianWakeLocalHour: toNumber(record.medianWakeLocalHour, 0),\n medianBedtimeLocalHour: toNumber(record.medianBedtimeLocalHour, 0),\n medianSleepDurationMin: toNumber(record.medianSleepDurationMin, 0),\n bedtimeStddevMin: toNumber(record.bedtimeStddevMin, 0),\n wakeStddevMin: toNumber(record.wakeStddevMin, 0),\n sampleCount: toNumber(record.sampleCount, 0),\n windowDays: toNumber(record.windowDays, 28),\n };\n}\n\nfunction parseSleepEpisode(\n row: Record<string, unknown>,\n): LifeOpsSleepEpisodeRecord {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n startAt: toText(row.start_at),\n endAt: row.end_at ? toText(row.end_at) : null,\n source: toText(row.source) as LifeOpsSleepEpisodeRecord[\"source\"],\n confidence: toNumber(row.confidence, 0),\n cycleType: toText(\n row.cycle_type,\n \"unknown\",\n ) as LifeOpsSleepEpisodeRecord[\"cycleType\"],\n sealed: toBoolean(row.sealed, false),\n evidence: parseJsonArray<LifeOpsSleepCycleEvidence>(row.evidence_json),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n };\n}\n\nfunction parseScheduleObservation(\n row: Record<string, unknown>,\n): LifeOpsScheduleObservationRecord {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n origin: toText(row.origin) as LifeOpsScheduleObservationRecord[\"origin\"],\n deviceId: toText(row.device_id),\n deviceKind: toText(\n row.device_kind,\n ) as LifeOpsScheduleObservationRecord[\"deviceKind\"],\n timezone: toText(row.timezone, \"UTC\"),\n observedAt: toText(row.observed_at),\n windowStartAt: toText(row.window_start_at),\n windowEndAt: row.window_end_at ? toText(row.window_end_at) : null,\n circadianState: toText(row.circadian_state) as LifeOpsCircadianState,\n stateConfidence: toNumber(row.state_confidence, 0),\n uncertaintyReason: row.uncertainty_reason\n ? (toText(row.uncertainty_reason) as LifeOpsUnclearReason)\n : null,\n mealLabel: row.meal_label\n ? (toText(\n row.meal_label,\n ) as LifeOpsScheduleObservationRecord[\"mealLabel\"])\n : null,\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n };\n}\n\nfunction parseScheduleMergedState(\n row: Record<string, unknown>,\n): LifeOpsScheduleMergedStateRecord {\n const inferredAt = toText(row.inferred_at);\n return refreshLifeOpsRelativeTime(\n {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n scope: toText(row.scope) as LifeOpsScheduleMergedStateRecord[\"scope\"],\n mergedAt: toText(row.merged_at),\n effectiveDayKey: toText(row.effective_day_key),\n localDate: toText(row.local_date),\n timezone: toText(row.timezone, \"UTC\"),\n inferredAt,\n circadianState: toText(\n row.circadian_state,\n \"unclear\",\n ) as LifeOpsCircadianState,\n stateConfidence: toNumber(row.state_confidence, 0),\n uncertaintyReason: row.uncertainty_reason\n ? (toText(row.uncertainty_reason) as LifeOpsUnclearReason)\n : null,\n awakeProbability: parseAwakeProbability(\n row.awake_probability_json,\n inferredAt,\n ),\n regularity: parseScheduleRegularity(row.regularity_json),\n baseline: parsePersonalBaseline(row.baseline_json),\n circadianRuleFirings: parseJsonArray<LifeOpsCircadianRuleFiring>(\n row.circadian_rule_firings_json,\n ),\n sleepStatus: toText(\n row.sleep_status,\n ) as LifeOpsScheduleMergedStateRecord[\"sleepStatus\"],\n sleepConfidence: toNumber(row.sleep_confidence, 0),\n currentSleepStartedAt: row.current_sleep_started_at\n ? toText(row.current_sleep_started_at)\n : null,\n lastSleepStartedAt: row.last_sleep_started_at\n ? toText(row.last_sleep_started_at)\n : null,\n lastSleepEndedAt: row.last_sleep_ended_at\n ? toText(row.last_sleep_ended_at)\n : null,\n lastSleepDurationMinutes:\n row.last_sleep_duration_minutes !== null &&\n row.last_sleep_duration_minutes !== undefined &&\n row.last_sleep_duration_minutes !== \"\"\n ? toNumber(row.last_sleep_duration_minutes, 0)\n : null,\n wakeAt: row.wake_at ? toText(row.wake_at) : null,\n firstActiveAt: row.first_active_at ? toText(row.first_active_at) : null,\n lastActiveAt: row.last_active_at ? toText(row.last_active_at) : null,\n meals: parseJsonArray<LifeOpsScheduleMealInsight>(row.meals_json),\n lastMealAt: row.last_meal_at ? toText(row.last_meal_at) : null,\n nextMealLabel: row.next_meal_label\n ? (toText(\n row.next_meal_label,\n ) as LifeOpsScheduleMergedStateRecord[\"nextMealLabel\"])\n : null,\n nextMealWindowStartAt: row.next_meal_window_start_at\n ? toText(row.next_meal_window_start_at)\n : null,\n nextMealWindowEndAt: row.next_meal_window_end_at\n ? toText(row.next_meal_window_end_at)\n : null,\n nextMealConfidence: toNumber(row.next_meal_confidence, 0),\n observationCount: toNumber(row.observation_count, 0),\n deviceCount: toNumber(row.device_count, 0),\n contributingDeviceKinds: parseJsonArray<\n LifeOpsScheduleMergedStateRecord[\"contributingDeviceKinds\"][number]\n >(row.contributing_device_kinds_json),\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n },\n new Date(toText(row.inferred_at, toText(row.updated_at))),\n );\n}\n\nfunction parseSchedulingNegotiation(\n row: Record<string, unknown>,\n): LifeOpsSchedulingNegotiation {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n subject: toText(row.subject),\n relationshipId: row.relationship_id ? toText(row.relationship_id) : null,\n durationMinutes: toNumber(row.duration_minutes, 0),\n timezone: toText(row.timezone, \"UTC\"),\n state: toText(row.state, \"initiated\") as LifeOpsNegotiationState,\n acceptedProposalId: row.accepted_proposal_id\n ? toText(row.accepted_proposal_id)\n : null,\n startedAt: toText(row.started_at),\n finalizedAt: row.finalized_at ? toText(row.finalized_at) : null,\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n };\n}\n\nfunction parseSchedulingProposal(\n row: Record<string, unknown>,\n): LifeOpsSchedulingProposal {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n negotiationId: toText(row.negotiation_id),\n startAt: toText(row.start_at),\n endAt: toText(row.end_at),\n proposedBy: toText(row.proposed_by, \"agent\") as LifeOpsProposalProposer,\n status: toText(row.status, \"pending\") as LifeOpsProposalStatus,\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n };\n}\n\nfunction isMissingTableError(error: unknown, table: string): boolean {\n const message = errorMessagesWithCauses(error).join(\"\\n\");\n const escaped = table.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const schema = table.includes(\".\") ? table.split(\".\")[0] : \"\";\n const pattern = new RegExp(\n `no such table: ${escaped}|relation [\"']?${escaped}[\"']? does not exist|undefined table`,\n \"i\",\n );\n return (\n pattern.test(message) ||\n (schema.length > 0 &&\n new RegExp(`schema [\"']?${schema}[\"']? does not exist`, \"i\").test(\n message,\n ))\n );\n}\n\n/**\n * Probe whether a table exists by running a no-op query against it.\n *\n * Boot-order contract: callers MUST run after `adapter.runPluginMigrations`\n * has completed in `bootstrapSchema`, which already early-returns when the\n * adapter is missing or `adapter.isReady() === false`. We rely on that\n * gating; this helper does not re-check.\n *\n * SECURITY: `table` is interpolated directly into the SQL. Callers MUST\n * pass a hardcoded literal, NEVER a user-derived or runtime-derived name.\n * The current three callers (app_lifeops.life_scheduling_negotiations,\n * app_lifeops.life_activity_signals, app_lifeops.life_inbox_messages) all pass string literals.\n *\n * Failure mode: any error other than the recognized \"missing table\"\n * patterns (`isMissingTableError`) rethrows. We deliberately fail loud on\n * connection / syntax / permission errors rather than silent-skip the\n * column-repair pass.\n */\nasync function tableExists(\n runtime: IAgentRuntime,\n table: string,\n): Promise<boolean> {\n try {\n await executeRawSql(runtime, `SELECT 1 FROM ${table} WHERE 1=0`);\n return true;\n } catch (error) {\n if (isMissingTableError(error, table)) {\n return false;\n }\n throw error;\n }\n}\n\ntype BrowserBridgeTableKey =\n | \"companions\"\n | \"settings\"\n | \"tabs\"\n | \"pageContexts\";\n\nconst BROWSER_BRIDGE_TABLE_NAMES = {\n companions: \"browser_bridge_companions\",\n settings: \"browser_bridge_settings\",\n tabs: \"browser_bridge_tabs\",\n pageContexts: \"browser_bridge_page_contexts\",\n} as const satisfies Record<BrowserBridgeTableKey, string>;\n\nconst browserBridgeTableCache = new WeakMap<\n IAgentRuntime,\n Partial<Record<BrowserBridgeTableKey, string>>\n>();\n\nasync function resolveBrowserBridgeTable(\n runtime: IAgentRuntime,\n key: BrowserBridgeTableKey,\n): Promise<string> {\n let cached = browserBridgeTableCache.get(runtime);\n if (!cached) {\n cached = {};\n browserBridgeTableCache.set(runtime, cached);\n }\n if (cached[key]) {\n return cached[key];\n }\n\n const publicTable = BROWSER_BRIDGE_TABLE_NAMES[key];\n const schemaTable = `browser.${publicTable}`;\n if (await tableExists(runtime, schemaTable)) {\n cached[key] = schemaTable;\n return schemaTable;\n }\n if (await tableExists(runtime, publicTable)) {\n cached[key] = publicTable;\n return publicTable;\n }\n\n cached[key] = schemaTable;\n return schemaTable;\n}\n\nfunction errorMessagesWithCauses(error: unknown): string[] {\n const messages: string[] = [];\n let current: unknown = error;\n while (current && typeof current === \"object\") {\n if (current instanceof Error) {\n messages.push(current.message);\n }\n const cause = (current as { cause?: unknown }).cause;\n if (!cause || cause === current) {\n break;\n }\n current = cause;\n }\n if (messages.length === 0) {\n messages.push(String(error));\n }\n return messages;\n}\n\n// ScheduledTask row parsers (private helpers).\n\nfunction parseOptionalJsonRecord<T>(value: unknown): T | undefined {\n if (value === null || value === undefined) return undefined;\n if (typeof value === \"string\" && value.length === 0) return undefined;\n const parsed = parseJsonRecord(value);\n if (Object.keys(parsed).length === 0) return undefined;\n return parsed as T;\n}\n\nfunction parseScheduledTaskRow(\n row: Record<string, unknown>,\n): import(\"@elizaos/plugin-scheduling\").ScheduledTask {\n type StateShape = import(\"@elizaos/plugin-scheduling\").ScheduledTaskState;\n type TaskShape = import(\"@elizaos/plugin-scheduling\").ScheduledTask;\n const stateRaw = parseJsonRecord(row.state_json);\n const state: StateShape = {\n status: ((stateRaw.status as string) ??\n \"scheduled\") as StateShape[\"status\"],\n firedAt:\n typeof stateRaw.firedAt === \"string\" ? stateRaw.firedAt : undefined,\n acknowledgedAt:\n typeof stateRaw.acknowledgedAt === \"string\"\n ? stateRaw.acknowledgedAt\n : undefined,\n completedAt:\n typeof stateRaw.completedAt === \"string\"\n ? stateRaw.completedAt\n : undefined,\n followupCount:\n typeof stateRaw.followupCount === \"number\" ? stateRaw.followupCount : 0,\n lastFollowupAt:\n typeof stateRaw.lastFollowupAt === \"string\"\n ? stateRaw.lastFollowupAt\n : undefined,\n pipelineParentId:\n typeof stateRaw.pipelineParentId === \"string\"\n ? stateRaw.pipelineParentId\n : undefined,\n lastDecisionLog:\n typeof stateRaw.lastDecisionLog === \"string\"\n ? stateRaw.lastDecisionLog\n : undefined,\n };\n const subjectKind = toText(row.subject_kind, \"\");\n const subjectId = toText(row.subject_id, \"\");\n const parsedMetadata =\n parseOptionalJsonRecord<Record<string, unknown>>(row.metadata_json) ?? {};\n if (\n typeof row.created_at === \"string\" &&\n typeof parsedMetadata.createdAtIso !== \"string\"\n ) {\n parsedMetadata.createdAtIso = row.created_at;\n }\n return {\n taskId: toText(row.id),\n kind: toText(row.kind) as TaskShape[\"kind\"],\n promptInstructions: toText(row.prompt_instructions),\n contextRequest: parseOptionalJsonRecord<TaskShape[\"contextRequest\"]>(\n row.context_request_json,\n ),\n trigger: parseJsonRecord(row.trigger_json) as TaskShape[\"trigger\"],\n priority: toText(row.priority, \"medium\") as TaskShape[\"priority\"],\n shouldFire: parseOptionalJsonRecord<TaskShape[\"shouldFire\"]>(\n row.should_fire_json,\n ),\n completionCheck: parseOptionalJsonRecord<TaskShape[\"completionCheck\"]>(\n row.completion_check_json,\n ),\n escalation: parseOptionalJsonRecord<TaskShape[\"escalation\"]>(\n row.escalation_json,\n ),\n output: parseOptionalJsonRecord<TaskShape[\"output\"]>(row.output_json),\n pipeline: parseOptionalJsonRecord<TaskShape[\"pipeline\"]>(row.pipeline_json),\n subject:\n subjectKind && subjectId\n ? ({\n kind: subjectKind,\n id: subjectId,\n } as TaskShape[\"subject\"])\n : undefined,\n idempotencyKey:\n typeof row.idempotency_key === \"string\" && row.idempotency_key.length > 0\n ? row.idempotency_key\n : undefined,\n respectsGlobalPause: toBoolean(row.respects_global_pause, true),\n state,\n source: toText(row.source, \"user_chat\") as TaskShape[\"source\"],\n createdBy: toText(row.created_by, \"\"),\n ownerVisible: toBoolean(row.owner_visible, true),\n metadata: parsedMetadata,\n };\n}\n\nfunction parseScheduledTaskLogRow(\n row: Record<string, unknown>,\n): import(\"@elizaos/plugin-scheduling\").ScheduledTaskLogEntry {\n type LogShape = import(\"@elizaos/plugin-scheduling\").ScheduledTaskLogEntry;\n return {\n logId: toText(row.id),\n taskId: toText(row.task_id),\n agentId: toText(row.agent_id),\n occurredAtIso: toText(row.occurred_at),\n transition: toText(row.transition) as LogShape[\"transition\"],\n reason: typeof row.reason === \"string\" ? row.reason : undefined,\n rolledUp: toBoolean(row.rolled_up, false),\n detail: parseOptionalJsonRecord<Record<string, unknown>>(row.detail_json),\n };\n}\n\nfunction parseThreadSourceRefs(\n value: unknown,\n): import(\"./work-threads/types.js\").ThreadSourceRef[] {\n return parseJsonArray<import(\"./work-threads/types.js\").ThreadSourceRef>(\n value,\n ).filter(\n (ref) =>\n ref &&\n typeof ref === \"object\" &&\n typeof ref.connector === \"string\" &&\n ref.connector.length > 0,\n );\n}\n\nfunction parseWorkThreadRow(\n row: Record<string, unknown>,\n): import(\"./work-threads/types.js\").WorkThread {\n const primary = parseOptionalJsonRecord<\n import(\"./work-threads/types.js\").ThreadSourceRef\n >(row.primary_source_ref_json) ?? { connector: \"unknown\" };\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n ownerEntityId:\n typeof row.owner_entity_id === \"string\" && row.owner_entity_id.length > 0\n ? row.owner_entity_id\n : null,\n status: toText(\n row.status,\n \"active\",\n ) as import(\"./work-threads/types.js\").WorkThreadStatus,\n title: toText(row.title),\n summary: toText(row.summary),\n currentPlanSummary:\n typeof row.current_plan_summary === \"string\"\n ? row.current_plan_summary\n : null,\n primarySourceRef: primary,\n sourceRefs: parseThreadSourceRefs(row.source_refs_json),\n participantEntityIds: parseJsonArray<string>(\n row.participant_entity_ids_json,\n ).filter((id) => typeof id === \"string\" && id.length > 0),\n currentScheduledTaskId:\n typeof row.current_scheduled_task_id === \"string\" &&\n row.current_scheduled_task_id.length > 0\n ? row.current_scheduled_task_id\n : null,\n workflowRunId:\n typeof row.workflow_run_id === \"string\" && row.workflow_run_id.length > 0\n ? row.workflow_run_id\n : null,\n approvalId:\n typeof row.approval_id === \"string\" && row.approval_id.length > 0\n ? row.approval_id\n : null,\n lastMessageMemoryId:\n typeof row.last_message_memory_id === \"string\" &&\n row.last_message_memory_id.length > 0\n ? row.last_message_memory_id\n : null,\n version: toNumber(row.version, 1),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n lastActivityAt: toText(row.last_activity_at),\n metadata: parseOptionalJsonRecord<Record<string, unknown>>(\n row.metadata_json,\n ),\n };\n}\n\nfunction parseWorkThreadEventRow(\n row: Record<string, unknown>,\n): import(\"./work-threads/types.js\").WorkThreadEvent {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n workThreadId: toText(row.work_thread_id),\n occurredAt: toText(row.occurred_at),\n type: toText(\n row.type,\n \"updated\",\n ) as import(\"./work-threads/types.js\").WorkThreadEventType,\n reason:\n typeof row.reason === \"string\" && row.reason.length > 0\n ? row.reason\n : null,\n detail: parseOptionalJsonRecord<Record<string, unknown>>(row.detail_json),\n };\n}\n\nexport class LifeOpsRepository {\n /**\n * Per-agent counter for telemetry-mirror failures inside\n * {@link createActivitySignal}. The live signal insert is the primary\n * source of truth; mirror failures must not block persistence, but we\n * still want visibility when the mirror is broken. First failure logs,\n * then we throttle to once every 100 failures so a broken backend\n * doesn't flood logs.\n */\n private static telemetryMirrorFailures = new Map<string, number>();\n\n /**\n * Finance back-end repository. The finance tables (payment sources /\n * transactions, subscription audits / candidates / cancellations) moved to\n * @elizaos/plugin-finances; the finance methods below delegate here so the\n * subscriptions mixin keeps reaching them through `this.repository`.\n */\n private readonly financesRepo: FinancesRepository;\n\n constructor(private readonly runtime: IAgentRuntime) {\n this.financesRepo = new FinancesRepository(runtime);\n }\n\n /**\n * EntityStore / RelationshipStore accessors for the typed graph. The\n * knowledge graph is a runtime primitive owned by `@elizaos/agent`; these\n * factories resolve the per-agent stores from the registered\n * `KnowledgeGraphService` rather than constructing them directly.\n */\n private knowledgeGraph(): NonNullable<\n ReturnType<typeof resolveKnowledgeGraphService>\n > {\n const service = resolveKnowledgeGraphService(this.runtime);\n if (!service) {\n throw new Error(\n \"[LifeOpsRepository] KnowledgeGraphService is not registered on the runtime\",\n );\n }\n return service;\n }\n\n async entityStore(agentId: string): Promise<EntityStore> {\n return this.knowledgeGraph().getEntityStore(agentId);\n }\n\n async relationshipStore(agentId: string): Promise<RelationshipStore> {\n return this.knowledgeGraph().getRelationshipStore(agentId);\n }\n\n static async bootstrapSchema(runtime: IAgentRuntime): Promise<void> {\n const adapter = runtime.adapter;\n if (!adapter || typeof adapter.runPluginMigrations !== \"function\") {\n return;\n }\n if (typeof adapter.isReady === \"function\" && !(await adapter.isReady())) {\n return;\n }\n await adapter.runPluginMigrations(\n [\n {\n name: \"@elizaos/plugin-browser\",\n schema: browserBridgeSchema,\n },\n {\n name: \"@elizaos/plugin-personal-assistant\",\n schema: lifeOpsSchema,\n },\n // Inbox-triage tables were carved to @elizaos/plugin-inbox (app_inbox);\n // PA auto-registers that plugin in production. Mirror it here so test\n // harnesses that only call bootstrapSchema still materialize the\n // app_inbox tables the inbox repositories read.\n {\n name: \"@elizaos/plugin-inbox\",\n schema: inboxDbSchema,\n },\n // The knowledge-graph tables are runtime-owned (registered by the\n // agent \"eliza\" plugin in production). Migrate them under the same\n // plugin name here so test harnesses that only call\n // bootstrapSchema still get the app_lifeops graph tables.\n {\n name: \"eliza\",\n schema: knowledgeGraphSchema,\n },\n ],\n {\n verbose: process.env.NODE_ENV !== \"production\",\n force: process.env.ELIZA_ALLOW_DESTRUCTIVE_MIGRATIONS === \"true\",\n dryRun: false,\n },\n );\n await LifeOpsRepository.ensureActivitySignalColumns(runtime);\n await LifeOpsRepository.ensureSchedulingNegotiationColumns(runtime);\n await LifeOpsRepository.ensureReminderReviewColumns(runtime);\n await LifeOpsRepository.ensureBrowserBridgeCompanionTokenColumns(runtime);\n await LifeOpsRepository.ensureConnectorAccountColumns(runtime);\n await LifeOpsRepository.ensureInboxCacheIndexes(runtime);\n }\n\n static async ensureSchedulingNegotiationColumns(\n runtime: IAgentRuntime,\n ): Promise<void> {\n if (\n !(await tableExists(runtime, \"app_lifeops.life_scheduling_negotiations\"))\n ) {\n return;\n }\n await executeRawSql(\n runtime,\n \"ALTER TABLE app_lifeops.life_scheduling_negotiations ADD COLUMN IF NOT EXISTS accepted_proposal_id TEXT\",\n );\n }\n\n static async ensureActivitySignalColumns(\n runtime: IAgentRuntime,\n ): Promise<void> {\n if (!(await tableExists(runtime, \"app_lifeops.life_activity_signals\"))) {\n return;\n }\n await executeRawSql(\n runtime,\n \"ALTER TABLE app_lifeops.life_activity_signals ADD COLUMN IF NOT EXISTS platform TEXT NOT NULL DEFAULT ''\",\n );\n await executeRawSql(\n runtime,\n \"ALTER TABLE app_lifeops.life_activity_signals ADD COLUMN IF NOT EXISTS idle_state TEXT\",\n );\n await executeRawSql(\n runtime,\n \"ALTER TABLE app_lifeops.life_activity_signals ADD COLUMN IF NOT EXISTS idle_time_seconds INTEGER\",\n );\n await executeRawSql(\n runtime,\n \"ALTER TABLE app_lifeops.life_activity_signals ADD COLUMN IF NOT EXISTS on_battery BOOLEAN\",\n );\n await executeRawSql(\n runtime,\n \"CREATE INDEX IF NOT EXISTS idx_life_activity_signals_agent ON app_lifeops.life_activity_signals (agent_id, observed_at)\",\n );\n }\n\n static async ensureBrowserBridgeCompanionTokenColumns(\n runtime: IAgentRuntime,\n ): Promise<void> {\n const companionsTable = await resolveBrowserBridgeTable(\n runtime,\n \"companions\",\n );\n if (!(await tableExists(runtime, companionsTable))) {\n return;\n }\n const companionTokenColumnRepairs = [\n `ALTER TABLE ${companionsTable} ADD COLUMN IF NOT EXISTS pairing_token_expires_at TEXT`,\n `ALTER TABLE ${companionsTable} ADD COLUMN IF NOT EXISTS pairing_token_revoked_at TEXT`,\n ];\n for (const statement of companionTokenColumnRepairs) {\n await executeRawSql(runtime, statement);\n }\n }\n\n static async ensureReminderReviewColumns(\n runtime: IAgentRuntime,\n ): Promise<void> {\n if (!(await tableExists(runtime, \"app_reminders.life_reminder_attempts\"))) {\n return;\n }\n const reminderReviewColumnRepairs = [\n \"ALTER TABLE app_reminders.life_reminder_attempts ADD COLUMN IF NOT EXISTS review_at TEXT\",\n \"ALTER TABLE app_reminders.life_reminder_attempts ADD COLUMN IF NOT EXISTS review_status TEXT\",\n \"ALTER TABLE app_reminders.life_reminder_attempts ADD COLUMN IF NOT EXISTS review_claimed_at TEXT\",\n \"ALTER TABLE app_reminders.life_reminder_attempts ADD COLUMN IF NOT EXISTS review_claimed_by TEXT\",\n \"ALTER TABLE app_reminders.life_reminder_attempts ADD COLUMN IF NOT EXISTS review_attempt_count INTEGER NOT NULL DEFAULT 0\",\n \"ALTER TABLE app_reminders.life_reminder_attempts ADD COLUMN IF NOT EXISTS review_next_retry_at TEXT\",\n \"ALTER TABLE app_reminders.life_reminder_attempts ADD COLUMN IF NOT EXISTS review_last_error TEXT\",\n ];\n for (const statement of reminderReviewColumnRepairs) {\n await executeRawSql(runtime, statement);\n }\n await executeRawSql(\n runtime,\n `UPDATE app_reminders.life_reminder_attempts\n SET review_at = delivery_metadata_json::jsonb ->> ${sqlQuote(REMINDER_REVIEW_AT_METADATA_KEY)}\n WHERE review_at IS NULL\n AND delivery_metadata_json::jsonb ? ${sqlQuote(REMINDER_REVIEW_AT_METADATA_KEY)}`,\n );\n await executeRawSql(\n runtime,\n `UPDATE app_reminders.life_reminder_attempts\n SET review_status = delivery_metadata_json::jsonb ->> ${sqlQuote(REMINDER_REVIEW_STATUS_METADATA_KEY)}\n WHERE review_status IS NULL\n AND delivery_metadata_json::jsonb ? ${sqlQuote(REMINDER_REVIEW_STATUS_METADATA_KEY)}`,\n );\n await executeRawSql(\n runtime,\n `CREATE INDEX IF NOT EXISTS idx_life_reminder_attempts_review_due\n ON app_reminders.life_reminder_attempts (agent_id, review_status, review_at)`,\n );\n }\n\n static async ensureConnectorAccountColumns(\n runtime: IAgentRuntime,\n ): Promise<void> {\n const tableColumnRepairs: Array<{\n table: string;\n statements: string[];\n }> = [\n {\n table: \"app_lifeops.life_connector_grants\",\n statements: [\n \"ALTER TABLE app_lifeops.life_connector_grants ADD COLUMN IF NOT EXISTS connector_account_id TEXT\",\n \"CREATE INDEX IF NOT EXISTS idx_life_connector_grants_account ON app_lifeops.life_connector_grants (agent_id, provider, connector_account_id)\",\n ],\n },\n // Calendar tables were carved to @elizaos/plugin-calendar (app_calendar);\n // these repairs stay on app_lifeops to keep the migration SOURCE\n // column-complete so CalendarMigrationService's row copy is shape-safe.\n {\n table: \"app_lifeops.life_calendar_events\",\n statements: [\n \"ALTER TABLE app_lifeops.life_calendar_events ADD COLUMN IF NOT EXISTS connector_account_id TEXT\",\n \"ALTER TABLE app_lifeops.life_calendar_events ADD COLUMN IF NOT EXISTS purge_resync_required BOOLEAN NOT NULL DEFAULT FALSE\",\n \"ALTER TABLE app_lifeops.life_calendar_events ADD COLUMN IF NOT EXISTS purge_resync_reason TEXT\",\n \"CREATE INDEX IF NOT EXISTS idx_life_calendar_events_account ON app_lifeops.life_calendar_events (agent_id, provider, connector_account_id)\",\n ],\n },\n {\n table: \"app_lifeops.life_calendar_sync_states\",\n statements: [\n \"ALTER TABLE app_lifeops.life_calendar_sync_states ADD COLUMN IF NOT EXISTS connector_account_id TEXT\",\n \"ALTER TABLE app_lifeops.life_calendar_sync_states ADD COLUMN IF NOT EXISTS purge_resync_required BOOLEAN NOT NULL DEFAULT FALSE\",\n \"ALTER TABLE app_lifeops.life_calendar_sync_states ADD COLUMN IF NOT EXISTS purge_resync_reason TEXT\",\n \"CREATE INDEX IF NOT EXISTS idx_life_calendar_sync_states_account ON app_lifeops.life_calendar_sync_states (agent_id, provider, connector_account_id)\",\n ],\n },\n {\n table: \"app_lifeops.life_gmail_messages\",\n statements: [\n \"ALTER TABLE app_lifeops.life_gmail_messages ADD COLUMN IF NOT EXISTS connector_account_id TEXT\",\n \"CREATE INDEX IF NOT EXISTS idx_life_gmail_messages_account ON app_lifeops.life_gmail_messages (agent_id, provider, connector_account_id)\",\n ],\n },\n {\n table: \"app_lifeops.life_inbox_messages\",\n statements: [\n \"ALTER TABLE app_lifeops.life_inbox_messages ADD COLUMN IF NOT EXISTS connector_account_id TEXT\",\n \"CREATE INDEX IF NOT EXISTS idx_life_inbox_messages_account ON app_lifeops.life_inbox_messages (agent_id, connector_account_id)\",\n ],\n },\n ];\n\n for (const repair of tableColumnRepairs) {\n if (!(await tableExists(runtime, repair.table))) continue;\n for (const statement of repair.statements) {\n await executeRawSql(runtime, statement);\n }\n }\n }\n\n static async ensureInboxCacheIndexes(runtime: IAgentRuntime): Promise<void> {\n if (!(await tableExists(runtime, \"app_lifeops.life_inbox_messages\"))) {\n return;\n }\n\n await executeRawSql(\n runtime,\n `DELETE FROM app_lifeops.life_inbox_messages\n WHERE id IN (\n SELECT id\n FROM (\n SELECT id,\n ROW_NUMBER() OVER (\n PARTITION BY agent_id, channel, external_id\n ORDER BY updated_at DESC, cached_at DESC, id DESC\n ) AS row_number\n FROM app_lifeops.life_inbox_messages\n ) ranked\n WHERE row_number > 1\n )`,\n );\n await executeRawSql(\n runtime,\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_life_inbox_messages_agent_channel_external\n ON app_lifeops.life_inbox_messages (agent_id, channel, external_id)`,\n );\n const inboxCacheColumnRepairs = [\n \"ALTER TABLE app_lifeops.life_inbox_messages ADD COLUMN IF NOT EXISTS thread_id TEXT\",\n \"ALTER TABLE app_lifeops.life_inbox_messages ADD COLUMN IF NOT EXISTS sender_email TEXT\",\n \"ALTER TABLE app_lifeops.life_inbox_messages ADD COLUMN IF NOT EXISTS subject TEXT\",\n \"ALTER TABLE app_lifeops.life_inbox_messages ADD COLUMN IF NOT EXISTS deep_link TEXT\",\n \"ALTER TABLE app_lifeops.life_inbox_messages ADD COLUMN IF NOT EXISTS source_ref_json TEXT NOT NULL DEFAULT '{}'\",\n \"ALTER TABLE app_lifeops.life_inbox_messages ADD COLUMN IF NOT EXISTS chat_type TEXT NOT NULL DEFAULT 'channel'\",\n \"ALTER TABLE app_lifeops.life_inbox_messages ADD COLUMN IF NOT EXISTS participant_count INTEGER\",\n \"ALTER TABLE app_lifeops.life_inbox_messages ADD COLUMN IF NOT EXISTS gmail_account_id TEXT\",\n \"ALTER TABLE app_lifeops.life_inbox_messages ADD COLUMN IF NOT EXISTS gmail_account_email TEXT\",\n \"ALTER TABLE app_lifeops.life_inbox_messages ADD COLUMN IF NOT EXISTS last_seen_at TEXT\",\n \"ALTER TABLE app_lifeops.life_inbox_messages ADD COLUMN IF NOT EXISTS replied_at TEXT\",\n \"ALTER TABLE app_lifeops.life_inbox_messages ADD COLUMN IF NOT EXISTS priority_score INTEGER\",\n \"ALTER TABLE app_lifeops.life_inbox_messages ADD COLUMN IF NOT EXISTS priority_category TEXT\",\n \"ALTER TABLE app_lifeops.life_inbox_messages ADD COLUMN IF NOT EXISTS priority_flags_json TEXT NOT NULL DEFAULT '[]'\",\n ];\n for (const statement of inboxCacheColumnRepairs) {\n await executeRawSql(runtime, statement);\n }\n }\n\n async createDefinition(definition: LifeOpsTaskDefinition): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_task_definitions (\n id, agent_id, domain, subject_type, subject_id, visibility_scope,\n context_policy, kind, title, description, original_intent, timezone,\n status, priority, cadence_json, window_policy_json,\n progression_rule_json, website_access_json, reminder_plan_id, goal_id, source,\n metadata_json, created_at, updated_at\n ) VALUES (\n ${sqlQuote(definition.id)},\n ${sqlQuote(definition.agentId)},\n ${sqlQuote(definition.domain)},\n ${sqlQuote(definition.subjectType)},\n ${sqlQuote(definition.subjectId)},\n ${sqlQuote(definition.visibilityScope)},\n ${sqlQuote(definition.contextPolicy)},\n ${sqlQuote(definition.kind)},\n ${sqlQuote(definition.title)},\n ${sqlQuote(definition.description)},\n ${sqlQuote(definition.originalIntent)},\n ${sqlQuote(definition.timezone)},\n ${sqlQuote(definition.status)},\n ${sqlInteger(definition.priority)},\n ${sqlJson(definition.cadence)},\n ${sqlJson(definition.windowPolicy)},\n ${sqlJson(definition.progressionRule)},\n ${sqlText(\n definition.websiteAccess\n ? JSON.stringify(definition.websiteAccess)\n : null,\n )},\n ${sqlText(definition.reminderPlanId)},\n ${sqlText(definition.goalId)},\n ${sqlQuote(definition.source)},\n ${sqlJson(definition.metadata)},\n ${sqlQuote(definition.createdAt)},\n ${sqlQuote(definition.updatedAt)}\n )`,\n );\n }\n\n async updateDefinition(definition: LifeOpsTaskDefinition): Promise<void> {\n await executeRawSql(\n this.runtime,\n `UPDATE app_lifeops.life_task_definitions\n SET domain = ${sqlQuote(definition.domain)},\n subject_type = ${sqlQuote(definition.subjectType)},\n subject_id = ${sqlQuote(definition.subjectId)},\n visibility_scope = ${sqlQuote(definition.visibilityScope)},\n context_policy = ${sqlQuote(definition.contextPolicy)},\n title = ${sqlQuote(definition.title)},\n description = ${sqlQuote(definition.description)},\n original_intent = ${sqlQuote(definition.originalIntent)},\n timezone = ${sqlQuote(definition.timezone)},\n status = ${sqlQuote(definition.status)},\n priority = ${sqlInteger(definition.priority)},\n cadence_json = ${sqlJson(definition.cadence)},\n window_policy_json = ${sqlJson(definition.windowPolicy)},\n progression_rule_json = ${sqlJson(definition.progressionRule)},\n website_access_json = ${sqlText(\n definition.websiteAccess\n ? JSON.stringify(definition.websiteAccess)\n : null,\n )},\n reminder_plan_id = ${sqlText(definition.reminderPlanId)},\n goal_id = ${sqlText(definition.goalId)},\n source = ${sqlQuote(definition.source)},\n metadata_json = ${sqlJson(definition.metadata)},\n updated_at = ${sqlQuote(definition.updatedAt)}\n WHERE id = ${sqlQuote(definition.id)}\n AND agent_id = ${sqlQuote(definition.agentId)}`,\n );\n }\n\n async getDefinition(\n agentId: string,\n definitionId: string,\n ): Promise<LifeOpsTaskDefinition | null> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_task_definitions\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(definitionId)}\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parseTaskDefinition(row) : null;\n }\n\n async listDefinitions(agentId: string): Promise<LifeOpsTaskDefinition[]> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_task_definitions\n WHERE agent_id = ${sqlQuote(agentId)}\n ORDER BY created_at ASC`,\n );\n return rows.map(parseTaskDefinition);\n }\n\n async listActiveDefinitions(\n agentId: string,\n ): Promise<LifeOpsTaskDefinition[]> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_task_definitions\n WHERE agent_id = ${sqlQuote(agentId)}\n AND status = 'active'\n ORDER BY created_at ASC`,\n );\n return rows.map(parseTaskDefinition);\n }\n\n async deleteDefinition(agentId: string, definitionId: string): Promise<void> {\n await executeRawSql(\n this.runtime,\n `DELETE FROM app_reminders.life_reminder_plans\n WHERE agent_id = ${sqlQuote(agentId)}\n AND owner_type = 'definition'\n AND owner_id = ${sqlQuote(definitionId)}`,\n );\n await executeRawSql(\n this.runtime,\n `DELETE FROM app_goals.life_goal_links\n WHERE agent_id = ${sqlQuote(agentId)}\n AND linked_type = 'definition'\n AND linked_id = ${sqlQuote(definitionId)}`,\n );\n await executeRawSql(\n this.runtime,\n `DELETE FROM app_lifeops.life_task_occurrences\n WHERE agent_id = ${sqlQuote(agentId)}\n AND definition_id = ${sqlQuote(definitionId)}`,\n );\n await executeRawSql(\n this.runtime,\n `DELETE FROM app_lifeops.life_task_definitions\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(definitionId)}`,\n );\n }\n\n async upsertOccurrence(occurrence: LifeOpsOccurrence): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_task_occurrences (\n id, agent_id, domain, subject_type, subject_id, visibility_scope,\n context_policy, definition_id, occurrence_key, scheduled_at, due_at,\n relevance_start_at, relevance_end_at, window_name, state,\n snoozed_until, completion_payload_json, derived_target_json,\n metadata_json, created_at, updated_at\n ) VALUES (\n ${sqlQuote(occurrence.id)},\n ${sqlQuote(occurrence.agentId)},\n ${sqlQuote(occurrence.domain)},\n ${sqlQuote(occurrence.subjectType)},\n ${sqlQuote(occurrence.subjectId)},\n ${sqlQuote(occurrence.visibilityScope)},\n ${sqlQuote(occurrence.contextPolicy)},\n ${sqlQuote(occurrence.definitionId)},\n ${sqlQuote(occurrence.occurrenceKey)},\n ${sqlText(occurrence.scheduledAt)},\n ${sqlText(occurrence.dueAt)},\n ${sqlQuote(occurrence.relevanceStartAt)},\n ${sqlQuote(occurrence.relevanceEndAt)},\n ${sqlText(occurrence.windowName)},\n ${sqlQuote(occurrence.state)},\n ${sqlText(occurrence.snoozedUntil)},\n ${occurrence.completionPayload ? sqlJson(occurrence.completionPayload) : \"NULL\"},\n ${occurrence.derivedTarget ? sqlJson(occurrence.derivedTarget) : \"NULL\"},\n ${sqlJson(occurrence.metadata)},\n ${sqlQuote(occurrence.createdAt)},\n ${sqlQuote(occurrence.updatedAt)}\n )\n ON CONFLICT(agent_id, definition_id, occurrence_key) DO UPDATE SET\n domain = excluded.domain,\n subject_type = excluded.subject_type,\n subject_id = excluded.subject_id,\n visibility_scope = excluded.visibility_scope,\n context_policy = excluded.context_policy,\n scheduled_at = excluded.scheduled_at,\n due_at = excluded.due_at,\n relevance_start_at = excluded.relevance_start_at,\n relevance_end_at = excluded.relevance_end_at,\n window_name = excluded.window_name,\n state = excluded.state,\n snoozed_until = excluded.snoozed_until,\n completion_payload_json = excluded.completion_payload_json,\n derived_target_json = excluded.derived_target_json,\n metadata_json = excluded.metadata_json,\n updated_at = excluded.updated_at`,\n );\n }\n\n async listOccurrencesForDefinition(\n agentId: string,\n definitionId: string,\n ): Promise<LifeOpsOccurrence[]> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_task_occurrences\n WHERE agent_id = ${sqlQuote(agentId)}\n AND definition_id = ${sqlQuote(definitionId)}\n ORDER BY relevance_start_at ASC`,\n );\n return rows.map(parseOccurrence);\n }\n\n async listOccurrencesForDefinitions(\n agentId: string,\n definitionIds: string[],\n ): Promise<LifeOpsOccurrence[]> {\n if (definitionIds.length === 0) {\n return [];\n }\n const definitionList = definitionIds\n .map((definitionId) => sqlQuote(definitionId))\n .join(\", \");\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_task_occurrences\n WHERE agent_id = ${sqlQuote(agentId)}\n AND definition_id IN (${definitionList})\n ORDER BY definition_id ASC, relevance_start_at ASC`,\n );\n return rows.map(parseOccurrence);\n }\n\n async getOccurrence(\n agentId: string,\n occurrenceId: string,\n ): Promise<LifeOpsOccurrence | null> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_task_occurrences\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(occurrenceId)}\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parseOccurrence(row) : null;\n }\n\n async getOccurrenceView(\n agentId: string,\n occurrenceId: string,\n ): Promise<LifeOpsOccurrenceView | null> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT occurrence.*,\n definition.kind AS definition_kind,\n definition.status AS definition_status,\n definition.cadence_json AS definition_cadence_json,\n definition.title AS definition_title,\n definition.description AS definition_description,\n definition.priority AS definition_priority,\n definition.timezone AS definition_timezone,\n definition.source AS definition_source,\n definition.goal_id AS definition_goal_id\n FROM app_lifeops.life_task_occurrences AS occurrence\n JOIN app_lifeops.life_task_definitions AS definition\n ON definition.id = occurrence.definition_id\n AND definition.agent_id = occurrence.agent_id\n WHERE occurrence.agent_id = ${sqlQuote(agentId)}\n AND occurrence.id = ${sqlQuote(occurrenceId)}\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parseOccurrenceView(row) : null;\n }\n\n async listOccurrenceViewsForOverview(\n agentId: string,\n horizonIso: string,\n ): Promise<LifeOpsOccurrenceView[]> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT occurrence.*,\n definition.kind AS definition_kind,\n definition.status AS definition_status,\n definition.cadence_json AS definition_cadence_json,\n definition.title AS definition_title,\n definition.description AS definition_description,\n definition.priority AS definition_priority,\n definition.timezone AS definition_timezone,\n definition.source AS definition_source,\n definition.goal_id AS definition_goal_id\n FROM app_lifeops.life_task_occurrences AS occurrence\n JOIN app_lifeops.life_task_definitions AS definition\n ON definition.id = occurrence.definition_id\n AND definition.agent_id = occurrence.agent_id\n WHERE occurrence.agent_id = ${sqlQuote(agentId)}\n AND definition.status = 'active'\n AND (\n occurrence.state IN ('visible', 'snoozed')\n OR (\n occurrence.state = 'pending'\n AND occurrence.relevance_start_at <= ${sqlQuote(horizonIso)}\n )\n )\n ORDER BY occurrence.relevance_start_at ASC, definition.priority ASC`,\n );\n return rows.map(parseOccurrenceView);\n }\n\n async updateOccurrence(occurrence: LifeOpsOccurrence): Promise<void> {\n await executeRawSql(\n this.runtime,\n `UPDATE app_lifeops.life_task_occurrences\n SET domain = ${sqlQuote(occurrence.domain)},\n subject_type = ${sqlQuote(occurrence.subjectType)},\n subject_id = ${sqlQuote(occurrence.subjectId)},\n visibility_scope = ${sqlQuote(occurrence.visibilityScope)},\n context_policy = ${sqlQuote(occurrence.contextPolicy)},\n scheduled_at = ${sqlText(occurrence.scheduledAt)},\n due_at = ${sqlText(occurrence.dueAt)},\n relevance_start_at = ${sqlQuote(occurrence.relevanceStartAt)},\n relevance_end_at = ${sqlQuote(occurrence.relevanceEndAt)},\n window_name = ${sqlText(occurrence.windowName)},\n state = ${sqlQuote(occurrence.state)},\n snoozed_until = ${sqlText(occurrence.snoozedUntil)},\n completion_payload_json = ${occurrence.completionPayload ? sqlJson(occurrence.completionPayload) : \"NULL\"},\n derived_target_json = ${occurrence.derivedTarget ? sqlJson(occurrence.derivedTarget) : \"NULL\"},\n metadata_json = ${sqlJson(occurrence.metadata)},\n updated_at = ${sqlQuote(occurrence.updatedAt)}\n WHERE id = ${sqlQuote(occurrence.id)}\n AND agent_id = ${sqlQuote(occurrence.agentId)}`,\n );\n }\n\n async pruneNonTerminalOccurrences(\n agentId: string,\n definitionId: string,\n keepOccurrenceKeys: string[],\n ): Promise<void> {\n const keepClause =\n keepOccurrenceKeys.length > 0\n ? `AND occurrence_key NOT IN (${keepOccurrenceKeys\n .map((occurrenceKey) => sqlQuote(occurrenceKey))\n .join(\", \")})`\n : \"\";\n await executeRawSql(\n this.runtime,\n `DELETE FROM app_lifeops.life_task_occurrences\n WHERE agent_id = ${sqlQuote(agentId)}\n AND definition_id = ${sqlQuote(definitionId)}\n AND state IN ('pending', 'visible', 'snoozed', 'expired')\n ${keepClause}`,\n );\n }\n\n async createGoal(goal: LifeOpsGoalDefinition): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_goals.life_goal_definitions (\n id, agent_id, domain, subject_type, subject_id, visibility_scope,\n context_policy, title, description, cadence_json, support_strategy_json,\n success_criteria_json, status, review_state, metadata_json,\n created_at, updated_at\n ) VALUES (\n ${sqlQuote(goal.id)},\n ${sqlQuote(goal.agentId)},\n ${sqlQuote(goal.domain)},\n ${sqlQuote(goal.subjectType)},\n ${sqlQuote(goal.subjectId)},\n ${sqlQuote(goal.visibilityScope)},\n ${sqlQuote(goal.contextPolicy)},\n ${sqlQuote(goal.title)},\n ${sqlQuote(goal.description)},\n ${goal.cadence ? sqlJson(goal.cadence) : \"NULL\"},\n ${sqlJson(goal.supportStrategy)},\n ${sqlJson(goal.successCriteria)},\n ${sqlQuote(goal.status)},\n ${sqlQuote(goal.reviewState)},\n ${sqlJson(goal.metadata)},\n ${sqlQuote(goal.createdAt)},\n ${sqlQuote(goal.updatedAt)}\n )`,\n );\n }\n\n async updateGoal(goal: LifeOpsGoalDefinition): Promise<void> {\n await executeRawSql(\n this.runtime,\n `UPDATE app_goals.life_goal_definitions\n SET domain = ${sqlQuote(goal.domain)},\n subject_type = ${sqlQuote(goal.subjectType)},\n subject_id = ${sqlQuote(goal.subjectId)},\n visibility_scope = ${sqlQuote(goal.visibilityScope)},\n context_policy = ${sqlQuote(goal.contextPolicy)},\n title = ${sqlQuote(goal.title)},\n description = ${sqlQuote(goal.description)},\n cadence_json = ${goal.cadence ? sqlJson(goal.cadence) : \"NULL\"},\n support_strategy_json = ${sqlJson(goal.supportStrategy)},\n success_criteria_json = ${sqlJson(goal.successCriteria)},\n status = ${sqlQuote(goal.status)},\n review_state = ${sqlQuote(goal.reviewState)},\n metadata_json = ${sqlJson(goal.metadata)},\n updated_at = ${sqlQuote(goal.updatedAt)}\n WHERE id = ${sqlQuote(goal.id)}\n AND agent_id = ${sqlQuote(goal.agentId)}`,\n );\n }\n\n async getGoal(\n agentId: string,\n goalId: string,\n ): Promise<LifeOpsGoalDefinition | null> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_goals.life_goal_definitions\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(goalId)}\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parseGoal(row) : null;\n }\n\n async listGoals(agentId: string): Promise<LifeOpsGoalDefinition[]> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_goals.life_goal_definitions\n WHERE agent_id = ${sqlQuote(agentId)}\n ORDER BY created_at ASC`,\n );\n return rows.map(parseGoal);\n }\n\n async deleteGoal(agentId: string, goalId: string): Promise<void> {\n await executeRawSql(\n this.runtime,\n `DELETE FROM app_goals.life_goal_links\n WHERE agent_id = ${sqlQuote(agentId)}\n AND goal_id = ${sqlQuote(goalId)}`,\n );\n await executeRawSql(\n this.runtime,\n `UPDATE app_lifeops.life_task_definitions\n SET goal_id = NULL\n WHERE agent_id = ${sqlQuote(agentId)}\n AND goal_id = ${sqlQuote(goalId)}`,\n );\n await executeRawSql(\n this.runtime,\n `DELETE FROM app_goals.life_goal_definitions\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(goalId)}`,\n );\n }\n\n async upsertGoalLink(link: LifeOpsGoalLink): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_goals.life_goal_links (\n id, agent_id, goal_id, linked_type, linked_id, created_at\n ) VALUES (\n ${sqlQuote(link.id)},\n ${sqlQuote(link.agentId)},\n ${sqlQuote(link.goalId)},\n ${sqlQuote(link.linkedType)},\n ${sqlQuote(link.linkedId)},\n ${sqlQuote(link.createdAt)}\n )\n ON CONFLICT(agent_id, goal_id, linked_type, linked_id) DO NOTHING`,\n );\n }\n\n async deleteGoalLinksForLinked(\n agentId: string,\n linkedType: LifeOpsGoalLink[\"linkedType\"],\n linkedId: string,\n ): Promise<void> {\n await executeRawSql(\n this.runtime,\n `DELETE FROM app_goals.life_goal_links\n WHERE agent_id = ${sqlQuote(agentId)}\n AND linked_type = ${sqlQuote(linkedType)}\n AND linked_id = ${sqlQuote(linkedId)}`,\n );\n }\n\n async listGoalLinksForGoal(\n agentId: string,\n goalId: string,\n ): Promise<LifeOpsGoalLink[]> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_goals.life_goal_links\n WHERE agent_id = ${sqlQuote(agentId)}\n AND goal_id = ${sqlQuote(goalId)}\n ORDER BY created_at ASC`,\n );\n return rows.map(parseGoalLink);\n }\n\n async createReminderPlan(plan: LifeOpsReminderPlan): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_reminders.life_reminder_plans (\n id, agent_id, owner_type, owner_id, steps_json,\n mute_policy_json, quiet_hours_json, created_at, updated_at\n ) VALUES (\n ${sqlQuote(plan.id)},\n ${sqlQuote(plan.agentId)},\n ${sqlQuote(plan.ownerType)},\n ${sqlQuote(plan.ownerId)},\n ${sqlJson(plan.steps)},\n ${sqlJson(plan.mutePolicy)},\n ${sqlJson(plan.quietHours)},\n ${sqlQuote(plan.createdAt)},\n ${sqlQuote(plan.updatedAt)}\n )`,\n );\n }\n\n async updateReminderPlan(plan: LifeOpsReminderPlan): Promise<void> {\n await executeRawSql(\n this.runtime,\n `UPDATE app_reminders.life_reminder_plans\n SET steps_json = ${sqlJson(plan.steps)},\n mute_policy_json = ${sqlJson(plan.mutePolicy)},\n quiet_hours_json = ${sqlJson(plan.quietHours)},\n updated_at = ${sqlQuote(plan.updatedAt)}\n WHERE id = ${sqlQuote(plan.id)}\n AND agent_id = ${sqlQuote(plan.agentId)}`,\n );\n }\n\n async deleteReminderPlan(agentId: string, planId: string): Promise<void> {\n await executeRawSql(\n this.runtime,\n `DELETE FROM app_reminders.life_reminder_plans\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(planId)}`,\n );\n }\n\n async getReminderPlan(\n agentId: string,\n planId: string,\n ): Promise<LifeOpsReminderPlan | null> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_reminders.life_reminder_plans\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(planId)}\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parseReminderPlan(row) : null;\n }\n\n async listReminderPlansForOwners(\n agentId: string,\n ownerType: string,\n ownerIds: string[],\n ): Promise<LifeOpsReminderPlan[]> {\n if (ownerIds.length === 0) return [];\n const ownerList = ownerIds.map((ownerId) => sqlQuote(ownerId)).join(\", \");\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_reminders.life_reminder_plans\n WHERE agent_id = ${sqlQuote(agentId)}\n AND owner_type = ${sqlQuote(ownerType)}\n AND owner_id IN (${ownerList})`,\n );\n return rows.map(parseReminderPlan);\n }\n\n async createAuditEvent(event: LifeOpsAuditEvent): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_audit_events (\n id, agent_id, event_type, owner_type, owner_id, reason,\n inputs_json, decision_json, actor, created_at\n ) VALUES (\n ${sqlQuote(event.id)},\n ${sqlQuote(event.agentId)},\n ${sqlQuote(event.eventType)},\n ${sqlQuote(event.ownerType)},\n ${sqlQuote(event.ownerId)},\n ${sqlQuote(event.reason)},\n ${sqlJson(event.inputs)},\n ${sqlJson(event.decision)},\n ${sqlQuote(event.actor)},\n ${sqlQuote(event.createdAt)}\n )\n ON CONFLICT(id) DO NOTHING`,\n );\n }\n\n /**\n * Returns `true` when the audit row for this id was newly inserted, `false`\n * when the id already existed. Used by circadian event emission to dedupe\n * across runtime restarts (same state transition -> same id).\n */\n async createAuditEventIfNew(event: LifeOpsAuditEvent): Promise<boolean> {\n const rows = await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_audit_events (\n id, agent_id, event_type, owner_type, owner_id, reason,\n inputs_json, decision_json, actor, created_at\n ) VALUES (\n ${sqlQuote(event.id)},\n ${sqlQuote(event.agentId)},\n ${sqlQuote(event.eventType)},\n ${sqlQuote(event.ownerType)},\n ${sqlQuote(event.ownerId)},\n ${sqlQuote(event.reason)},\n ${sqlJson(event.inputs)},\n ${sqlJson(event.decision)},\n ${sqlQuote(event.actor)},\n ${sqlQuote(event.createdAt)}\n )\n ON CONFLICT(id) DO NOTHING\n RETURNING id`,\n );\n return rows.length > 0;\n }\n\n async listAuditEvents(\n agentId: string,\n ownerType: string,\n ownerId: string,\n ): Promise<LifeOpsAuditEvent[]> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_audit_events\n WHERE agent_id = ${sqlQuote(agentId)}\n AND owner_type = ${sqlQuote(ownerType)}\n AND owner_id = ${sqlQuote(ownerId)}\n ORDER BY created_at DESC`,\n );\n return rows.map(parseAuditEvent);\n }\n\n // ---------------------------------------------------------------------\n // Finance (subscription) delegations → @elizaos/plugin-finances.\n // The raw SQL lives in FinancesRepository; these wrappers keep the\n // subscriptions mixin reaching the finance tables through `this.repository`.\n // ---------------------------------------------------------------------\n\n async createSubscriptionAudit(\n audit: LifeOpsSubscriptionAudit,\n ): Promise<void> {\n return this.financesRepo.createSubscriptionAudit(audit);\n }\n\n async updateSubscriptionAudit(\n audit: LifeOpsSubscriptionAudit,\n ): Promise<void> {\n return this.financesRepo.updateSubscriptionAudit(audit);\n }\n\n async getSubscriptionAudit(\n agentId: string,\n auditId: string,\n ): Promise<LifeOpsSubscriptionAudit | null> {\n return this.financesRepo.getSubscriptionAudit(agentId, auditId);\n }\n\n async getLatestSubscriptionAudit(\n agentId: string,\n ): Promise<LifeOpsSubscriptionAudit | null> {\n return this.financesRepo.getLatestSubscriptionAudit(agentId);\n }\n\n async createSubscriptionCandidate(\n candidate: LifeOpsSubscriptionCandidate,\n ): Promise<void> {\n return this.financesRepo.createSubscriptionCandidate(candidate);\n }\n\n async listSubscriptionCandidatesForAudit(\n agentId: string,\n auditId: string,\n ): Promise<LifeOpsSubscriptionCandidate[]> {\n return this.financesRepo.listSubscriptionCandidatesForAudit(\n agentId,\n auditId,\n );\n }\n\n async getSubscriptionCandidate(\n agentId: string,\n candidateId: string,\n ): Promise<LifeOpsSubscriptionCandidate | null> {\n return this.financesRepo.getSubscriptionCandidate(agentId, candidateId);\n }\n\n async createSubscriptionCancellation(\n cancellation: LifeOpsSubscriptionCancellation,\n ): Promise<void> {\n return this.financesRepo.createSubscriptionCancellation(cancellation);\n }\n\n async updateSubscriptionCancellation(\n cancellation: LifeOpsSubscriptionCancellation,\n ): Promise<void> {\n return this.financesRepo.updateSubscriptionCancellation(cancellation);\n }\n\n async getSubscriptionCancellation(\n agentId: string,\n cancellationId: string,\n ): Promise<LifeOpsSubscriptionCancellation | null> {\n return this.financesRepo.getSubscriptionCancellation(\n agentId,\n cancellationId,\n );\n }\n\n async getLatestSubscriptionCancellation(\n agentId: string,\n serviceSlug?: string,\n ): Promise<LifeOpsSubscriptionCancellation | null> {\n return this.financesRepo.getLatestSubscriptionCancellation(\n agentId,\n serviceSlug,\n );\n }\n\n // Email-unsubscribe persistence (the `app_lifeops.life_email_unsubscribes`\n // table this schema still registers) moved to `@elizaos/plugin-inbox`'s\n // `InboxUnsubscribeRepository`. PA's email-unsubscribe mixin now delegates to\n // the inbox service, so LifeOpsRepository no longer carries those reads/writes.\n\n // ---------------------------------------------------------------------\n // Finance (payment) delegations → @elizaos/plugin-finances.\n // ---------------------------------------------------------------------\n\n async upsertPaymentSource(source: LifeOpsPaymentSource): Promise<void> {\n return this.financesRepo.upsertPaymentSource(source);\n }\n\n async listPaymentSources(agentId: string): Promise<LifeOpsPaymentSource[]> {\n return this.financesRepo.listPaymentSources(agentId);\n }\n\n async getPaymentSource(\n agentId: string,\n sourceId: string,\n ): Promise<LifeOpsPaymentSource | null> {\n return this.financesRepo.getPaymentSource(agentId, sourceId);\n }\n\n async deletePaymentSource(agentId: string, sourceId: string): Promise<void> {\n return this.financesRepo.deletePaymentSource(agentId, sourceId);\n }\n\n async deletePaymentTransactionById(\n agentId: string,\n transactionId: string,\n ): Promise<void> {\n return this.financesRepo.deletePaymentTransactionById(\n agentId,\n transactionId,\n );\n }\n\n async insertPaymentTransaction(\n transaction: LifeOpsPaymentTransaction,\n ): Promise<boolean> {\n return this.financesRepo.insertPaymentTransaction(transaction);\n }\n\n async listPaymentTransactions(\n agentId: string,\n args: {\n sourceId?: string | null;\n sinceAt?: string | null;\n untilAt?: string | null;\n limit?: number | null;\n merchantContains?: string | null;\n onlyDebits?: boolean | null;\n } = {},\n ): Promise<LifeOpsPaymentTransaction[]> {\n return this.financesRepo.listPaymentTransactions(agentId, args);\n }\n\n async countPaymentTransactionsForSource(\n agentId: string,\n sourceId: string,\n ): Promise<number> {\n return this.financesRepo.countPaymentTransactionsForSource(\n agentId,\n sourceId,\n );\n }\n\n async createActivitySignal(signal: LifeOpsActivitySignal): Promise<void> {\n const metadata =\n signal.health !== null && signal.health !== undefined\n ? { ...signal.metadata, health: signal.health }\n : signal.metadata;\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_activity_signals (\n id, agent_id, source, platform, state, observed_at, idle_state,\n idle_time_seconds, on_battery, metadata_json, created_at\n ) VALUES (\n ${sqlQuote(signal.id)},\n ${sqlQuote(signal.agentId)},\n ${sqlQuote(signal.source)},\n ${sqlQuote(signal.platform)},\n ${sqlQuote(signal.state)},\n ${sqlQuote(signal.observedAt)},\n ${sqlText(signal.idleState)},\n ${sqlInteger(signal.idleTimeSeconds)},\n ${signal.onBattery === null ? \"NULL\" : sqlBoolean(signal.onBattery)},\n ${sqlJson(metadata)},\n ${sqlQuote(signal.createdAt)}\n )`,\n );\n\n // Mirror into the canonical telemetry store. Dedupes on\n // (agent_id, dedupe_key) so re-persists and migrator replays are safe.\n // Failures here must not block signal persistence, but they are counted\n // and logged (first + every 100th) so broken mirrors surface in\n // observability.\n try {\n const telemetry = buildTelemetryEventFromSignal(\n signal,\n new Date().toISOString(),\n );\n if (telemetry) {\n await this.insertTelemetryEvent(telemetry);\n }\n LifeOpsRepository.telemetryMirrorFailures.delete(signal.agentId);\n } catch (error) {\n const nextCount =\n (LifeOpsRepository.telemetryMirrorFailures.get(signal.agentId) ?? 0) +\n 1;\n LifeOpsRepository.telemetryMirrorFailures.set(signal.agentId, nextCount);\n if (nextCount === 1 || nextCount % 100 === 0) {\n logger.warn(\n {\n agentId: signal.agentId,\n source: signal.source,\n platform: signal.platform,\n consecutiveFailures: nextCount,\n error: error instanceof Error ? error.message : String(error),\n },\n \"[lifeops] Telemetry mirror failed for activity signal.\",\n );\n }\n }\n }\n\n async listActivitySignals(\n agentId: string,\n args: {\n sinceAt?: string | null;\n limit?: number | null;\n states?: LifeOpsActivitySignal[\"state\"][] | null;\n } = {},\n ): Promise<LifeOpsActivitySignal[]> {\n const clauses = [`agent_id = ${sqlQuote(agentId)}`];\n if (args.sinceAt) {\n clauses.push(`observed_at >= ${sqlQuote(args.sinceAt)}`);\n }\n if (args.states && args.states.length > 0) {\n const stateList = args.states.map((state) => sqlQuote(state)).join(\", \");\n clauses.push(`state IN (${stateList})`);\n }\n const limitClause =\n typeof args.limit === \"number\" && args.limit > 0\n ? `LIMIT ${Math.trunc(args.limit)}`\n : \"\";\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_activity_signals\n WHERE ${clauses.join(\"\\n AND \")}\n ORDER BY observed_at DESC\n ${limitClause}`,\n );\n return rows.map(parseActivitySignal);\n }\n\n async upsertHealthMetricSample(\n sample: LifeOpsHealthMetricSample,\n ): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_health_metric_samples (\n id, agent_id, provider, grant_id, metric, value, unit, start_at, end_at,\n local_date, source_external_id, metadata_json, created_at, updated_at\n ) VALUES (\n ${sqlQuote(sample.id)},\n ${sqlQuote(sample.agentId)},\n ${sqlQuote(sample.provider)},\n ${sqlText(sample.grantId)},\n ${sqlQuote(sample.metric)},\n ${sqlNumber(sample.value)},\n ${sqlQuote(sample.unit)},\n ${sqlQuote(sample.startAt)},\n ${sqlQuote(sample.endAt)},\n ${sqlQuote(sample.localDate)},\n ${sqlText(sample.sourceExternalId)},\n ${sqlJson(sample.metadata)},\n ${sqlQuote(sample.createdAt)},\n ${sqlQuote(sample.updatedAt)}\n )\n ON CONFLICT(agent_id, provider, grant_id, metric, start_at, source_external_id)\n DO UPDATE SET\n value = excluded.value,\n unit = excluded.unit,\n end_at = excluded.end_at,\n local_date = excluded.local_date,\n metadata_json = excluded.metadata_json,\n updated_at = excluded.updated_at`,\n );\n }\n\n async listHealthMetricSamples(\n agentId: string,\n args: {\n provider?: LifeOpsHealthMetricSample[\"provider\"] | null;\n startDate?: string | null;\n endDate?: string | null;\n metrics?: LifeOpsHealthMetricSample[\"metric\"][] | null;\n limit?: number | null;\n } = {},\n ): Promise<LifeOpsHealthMetricSample[]> {\n const clauses = [`agent_id = ${sqlQuote(agentId)}`];\n if (args.provider) {\n clauses.push(`provider = ${sqlQuote(args.provider)}`);\n }\n if (args.startDate) {\n clauses.push(`local_date >= ${sqlQuote(args.startDate)}`);\n }\n if (args.endDate) {\n clauses.push(`local_date <= ${sqlQuote(args.endDate)}`);\n }\n if (args.metrics && args.metrics.length > 0) {\n clauses.push(\n `metric IN (${args.metrics.map((metric) => sqlQuote(metric)).join(\", \")})`,\n );\n }\n const limitClause =\n typeof args.limit === \"number\" && args.limit > 0\n ? `LIMIT ${Math.trunc(args.limit)}`\n : \"\";\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_health_metric_samples\n WHERE ${clauses.join(\"\\n AND \")}\n ORDER BY start_at DESC, metric ASC\n ${limitClause}`,\n );\n return rows.map(parseHealthMetricSample);\n }\n\n async upsertHealthWorkout(workout: LifeOpsHealthWorkout): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_health_workouts (\n id, agent_id, provider, grant_id, source_external_id, workout_type,\n title, start_at, end_at, duration_seconds, distance_meters, calories,\n average_heart_rate, max_heart_rate, metadata_json, created_at,\n updated_at\n ) VALUES (\n ${sqlQuote(workout.id)},\n ${sqlQuote(workout.agentId)},\n ${sqlQuote(workout.provider)},\n ${sqlText(workout.grantId)},\n ${sqlQuote(workout.sourceExternalId)},\n ${sqlQuote(workout.workoutType)},\n ${sqlQuote(workout.title)},\n ${sqlQuote(workout.startAt)},\n ${sqlText(workout.endAt)},\n ${sqlInteger(workout.durationSeconds)},\n ${sqlNumber(workout.distanceMeters)},\n ${sqlNumber(workout.calories)},\n ${sqlNumber(workout.averageHeartRate)},\n ${sqlNumber(workout.maxHeartRate)},\n ${sqlJson(workout.metadata)},\n ${sqlQuote(workout.createdAt)},\n ${sqlQuote(workout.updatedAt)}\n )\n ON CONFLICT(agent_id, provider, grant_id, source_external_id) DO UPDATE SET\n workout_type = excluded.workout_type,\n title = excluded.title,\n start_at = excluded.start_at,\n end_at = excluded.end_at,\n duration_seconds = excluded.duration_seconds,\n distance_meters = excluded.distance_meters,\n calories = excluded.calories,\n average_heart_rate = excluded.average_heart_rate,\n max_heart_rate = excluded.max_heart_rate,\n metadata_json = excluded.metadata_json,\n updated_at = excluded.updated_at`,\n );\n }\n\n async listHealthWorkouts(\n agentId: string,\n args: {\n provider?: LifeOpsHealthWorkout[\"provider\"] | null;\n startDate?: string | null;\n endDate?: string | null;\n limit?: number | null;\n } = {},\n ): Promise<LifeOpsHealthWorkout[]> {\n const clauses = [`agent_id = ${sqlQuote(agentId)}`];\n if (args.provider) {\n clauses.push(`provider = ${sqlQuote(args.provider)}`);\n }\n if (args.startDate) {\n clauses.push(\n `start_at >= ${sqlQuote(`${args.startDate}T00:00:00.000Z`)}`,\n );\n }\n if (args.endDate) {\n clauses.push(`start_at <= ${sqlQuote(`${args.endDate}T23:59:59.999Z`)}`);\n }\n const limitClause =\n typeof args.limit === \"number\" && args.limit > 0\n ? `LIMIT ${Math.trunc(args.limit)}`\n : \"\";\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_health_workouts\n WHERE ${clauses.join(\"\\n AND \")}\n ORDER BY start_at DESC\n ${limitClause}`,\n );\n return rows.map(parseHealthWorkout);\n }\n\n async upsertHealthSleepEpisode(\n episode: LifeOpsHealthSleepEpisode,\n ): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_health_sleep_episodes (\n id, agent_id, provider, grant_id, source_external_id, local_date,\n timezone, start_at, end_at, is_main_sleep, sleep_type,\n duration_seconds, time_in_bed_seconds, efficiency, latency_seconds,\n awake_seconds, light_sleep_seconds, deep_sleep_seconds,\n rem_sleep_seconds, sleep_score, readiness_score, average_heart_rate,\n lowest_heart_rate, average_hrv_ms, respiratory_rate,\n blood_oxygen_percent, stage_samples_json, metadata_json, created_at,\n updated_at\n ) VALUES (\n ${sqlQuote(episode.id)},\n ${sqlQuote(episode.agentId)},\n ${sqlQuote(episode.provider)},\n ${sqlQuote(episode.grantId)},\n ${sqlQuote(episode.sourceExternalId)},\n ${sqlQuote(episode.localDate)},\n ${sqlText(episode.timezone)},\n ${sqlQuote(episode.startAt)},\n ${sqlQuote(episode.endAt)},\n ${sqlBoolean(episode.isMainSleep)},\n ${sqlText(episode.sleepType)},\n ${sqlInteger(episode.durationSeconds)},\n ${sqlInteger(episode.timeInBedSeconds)},\n ${sqlNumber(episode.efficiency)},\n ${sqlInteger(episode.latencySeconds)},\n ${sqlInteger(episode.awakeSeconds)},\n ${sqlInteger(episode.lightSleepSeconds)},\n ${sqlInteger(episode.deepSleepSeconds)},\n ${sqlInteger(episode.remSleepSeconds)},\n ${sqlNumber(episode.sleepScore)},\n ${sqlNumber(episode.readinessScore)},\n ${sqlNumber(episode.averageHeartRate)},\n ${sqlNumber(episode.lowestHeartRate)},\n ${sqlNumber(episode.averageHrvMs)},\n ${sqlNumber(episode.respiratoryRate)},\n ${sqlNumber(episode.bloodOxygenPercent)},\n ${sqlJson(episode.stageSamples)},\n ${sqlJson(episode.metadata)},\n ${sqlQuote(episode.createdAt)},\n ${sqlQuote(episode.updatedAt)}\n )\n ON CONFLICT(agent_id, provider, grant_id, source_external_id) DO UPDATE SET\n local_date = excluded.local_date,\n timezone = excluded.timezone,\n start_at = excluded.start_at,\n end_at = excluded.end_at,\n is_main_sleep = excluded.is_main_sleep,\n sleep_type = excluded.sleep_type,\n duration_seconds = excluded.duration_seconds,\n time_in_bed_seconds = excluded.time_in_bed_seconds,\n efficiency = excluded.efficiency,\n latency_seconds = excluded.latency_seconds,\n awake_seconds = excluded.awake_seconds,\n light_sleep_seconds = excluded.light_sleep_seconds,\n deep_sleep_seconds = excluded.deep_sleep_seconds,\n rem_sleep_seconds = excluded.rem_sleep_seconds,\n sleep_score = excluded.sleep_score,\n readiness_score = excluded.readiness_score,\n average_heart_rate = excluded.average_heart_rate,\n lowest_heart_rate = excluded.lowest_heart_rate,\n average_hrv_ms = excluded.average_hrv_ms,\n respiratory_rate = excluded.respiratory_rate,\n blood_oxygen_percent = excluded.blood_oxygen_percent,\n stage_samples_json = excluded.stage_samples_json,\n metadata_json = excluded.metadata_json,\n updated_at = excluded.updated_at`,\n );\n }\n\n async listHealthSleepEpisodes(\n agentId: string,\n args: {\n provider?: LifeOpsHealthSleepEpisode[\"provider\"] | null;\n startDate?: string | null;\n endDate?: string | null;\n limit?: number | null;\n } = {},\n ): Promise<LifeOpsHealthSleepEpisode[]> {\n const clauses = [`agent_id = ${sqlQuote(agentId)}`];\n if (args.provider) {\n clauses.push(`provider = ${sqlQuote(args.provider)}`);\n }\n if (args.startDate) {\n clauses.push(`local_date >= ${sqlQuote(args.startDate)}`);\n }\n if (args.endDate) {\n clauses.push(`local_date <= ${sqlQuote(args.endDate)}`);\n }\n const limitClause =\n typeof args.limit === \"number\" && args.limit > 0\n ? `LIMIT ${Math.trunc(args.limit)}`\n : \"\";\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_health_sleep_episodes\n WHERE ${clauses.join(\"\\n AND \")}\n ORDER BY start_at DESC\n ${limitClause}`,\n );\n return rows.map(parseHealthSleepEpisode);\n }\n\n async upsertHealthSyncState(state: LifeOpsHealthSyncState): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_health_sync_states (\n id, agent_id, provider, grant_id, cursor, last_synced_at,\n last_sync_started_at, last_sync_error, metadata_json, updated_at\n ) VALUES (\n ${sqlQuote(state.id)},\n ${sqlQuote(state.agentId)},\n ${sqlQuote(state.provider)},\n ${sqlQuote(state.grantId)},\n ${sqlText(state.cursor)},\n ${sqlText(state.lastSyncedAt)},\n ${sqlText(state.lastSyncStartedAt)},\n ${sqlText(state.lastSyncError)},\n ${sqlJson(state.metadata)},\n ${sqlQuote(state.updatedAt)}\n )\n ON CONFLICT(agent_id, provider, grant_id) DO UPDATE SET\n cursor = excluded.cursor,\n last_synced_at = excluded.last_synced_at,\n last_sync_started_at = excluded.last_sync_started_at,\n last_sync_error = excluded.last_sync_error,\n metadata_json = excluded.metadata_json,\n updated_at = excluded.updated_at`,\n );\n }\n\n async getHealthSyncState(\n agentId: string,\n provider: LifeOpsHealthSyncState[\"provider\"],\n grantId: string,\n ): Promise<LifeOpsHealthSyncState | null> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_health_sync_states\n WHERE agent_id = ${sqlQuote(agentId)}\n AND provider = ${sqlQuote(provider)}\n AND grant_id = ${sqlQuote(grantId)}\n ORDER BY updated_at DESC\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parseHealthSyncState(row) : null;\n }\n\n async upsertChannelPolicy(policy: LifeOpsChannelPolicy): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_channel_policies (\n id, agent_id, channel_type, channel_ref, privacy_class,\n allow_reminders, allow_escalation, allow_posts,\n require_confirmation_for_actions, metadata_json, created_at, updated_at\n ) VALUES (\n ${sqlQuote(policy.id)},\n ${sqlQuote(policy.agentId)},\n ${sqlQuote(policy.channelType)},\n ${sqlQuote(policy.channelRef)},\n ${sqlQuote(policy.privacyClass)},\n ${sqlBoolean(policy.allowReminders)},\n ${sqlBoolean(policy.allowEscalation)},\n ${sqlBoolean(policy.allowPosts)},\n ${sqlBoolean(policy.requireConfirmationForActions)},\n ${sqlJson(policy.metadata)},\n ${sqlQuote(policy.createdAt)},\n ${sqlQuote(policy.updatedAt)}\n )\n ON CONFLICT(agent_id, channel_type, channel_ref) DO UPDATE SET\n privacy_class = excluded.privacy_class,\n allow_reminders = excluded.allow_reminders,\n allow_escalation = excluded.allow_escalation,\n allow_posts = excluded.allow_posts,\n require_confirmation_for_actions = excluded.require_confirmation_for_actions,\n metadata_json = excluded.metadata_json,\n updated_at = excluded.updated_at`,\n );\n }\n\n async listChannelPolicies(agentId: string): Promise<LifeOpsChannelPolicy[]> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_channel_policies\n WHERE agent_id = ${sqlQuote(agentId)}\n ORDER BY created_at ASC`,\n );\n return rows.map(parseChannelPolicy);\n }\n\n async getChannelPolicy(\n agentId: string,\n channelType: LifeOpsChannelPolicy[\"channelType\"],\n channelRef: string,\n ): Promise<LifeOpsChannelPolicy | null> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_channel_policies\n WHERE agent_id = ${sqlQuote(agentId)}\n AND channel_type = ${sqlQuote(channelType)}\n AND channel_ref = ${sqlQuote(channelRef)}\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parseChannelPolicy(row) : null;\n }\n\n async upsertWebsiteAccessGrant(\n grant: LifeOpsWebsiteAccessGrant,\n ): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_website_access_grants (\n id, agent_id, group_key, definition_id, occurrence_id, websites_json,\n unlock_mode, unlock_duration_minutes, callback_key, unlocked_at,\n expires_at, revoked_at, metadata_json, created_at, updated_at\n ) VALUES (\n ${sqlQuote(grant.id)},\n ${sqlQuote(grant.agentId)},\n ${sqlQuote(grant.groupKey)},\n ${sqlQuote(grant.definitionId)},\n ${sqlText(grant.occurrenceId)},\n ${sqlJson(grant.websites)},\n ${sqlQuote(grant.unlockMode)},\n ${sqlInteger(grant.unlockDurationMinutes)},\n ${sqlText(grant.callbackKey)},\n ${sqlQuote(grant.unlockedAt)},\n ${sqlText(grant.expiresAt)},\n ${sqlText(grant.revokedAt)},\n ${sqlJson(grant.metadata)},\n ${sqlQuote(grant.createdAt)},\n ${sqlQuote(grant.updatedAt)}\n )`,\n );\n }\n\n async listWebsiteAccessGrants(\n agentId: string,\n ): Promise<LifeOpsWebsiteAccessGrant[]> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_website_access_grants\n WHERE agent_id = ${sqlQuote(agentId)}\n ORDER BY updated_at DESC, created_at DESC`,\n );\n return rows.map(parseWebsiteAccessGrant);\n }\n\n async revokeWebsiteAccessGrants(\n agentId: string,\n args: {\n groupKey?: string;\n callbackKey?: string;\n revokedAt: string;\n },\n ): Promise<void> {\n const clauses = [`agent_id = ${sqlQuote(agentId)}`, \"revoked_at IS NULL\"];\n if (args.groupKey) {\n clauses.push(`group_key = ${sqlQuote(args.groupKey)}`);\n }\n if (args.callbackKey) {\n clauses.push(`callback_key = ${sqlQuote(args.callbackKey)}`);\n }\n await executeRawSql(\n this.runtime,\n `UPDATE app_lifeops.life_website_access_grants\n SET revoked_at = ${sqlQuote(args.revokedAt)},\n updated_at = ${sqlQuote(args.revokedAt)}\n WHERE ${clauses.join(\"\\n AND \")}`,\n );\n }\n\n async ensureConnectorAccountPrivacy(input: {\n agentId: string;\n provider: string;\n connectorAccountId: string;\n }): Promise<LifeOpsConnectorAccountPrivacyPolicy> {\n const existing = await this.getConnectorAccountPrivacy(\n input.agentId,\n input.provider,\n input.connectorAccountId,\n );\n if (existing) return existing;\n\n const policy = createConnectorAccountPrivacyPolicy(input);\n await this.upsertConnectorAccountPrivacy(policy);\n return policy;\n }\n\n async upsertConnectorAccountPrivacy(\n input: LifeOpsConnectorAccountPrivacyPolicy,\n ): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_account_privacy (\n id, agent_id, provider, connector_account_id, visibility_scope,\n allowed_data_classes_json, metadata_json, created_at, updated_at\n ) VALUES (\n ${sqlQuote(input.id)},\n ${sqlQuote(input.agentId)},\n ${sqlQuote(input.provider)},\n ${sqlQuote(input.connectorAccountId)},\n ${sqlQuote(input.visibilityScope)},\n ${sqlJson(input.allowedDataClasses)},\n ${sqlJson(input.metadata)},\n ${sqlQuote(input.createdAt)},\n ${sqlQuote(input.updatedAt)}\n )\n ON CONFLICT(agent_id, provider, connector_account_id) DO UPDATE SET\n visibility_scope = excluded.visibility_scope,\n allowed_data_classes_json = excluded.allowed_data_classes_json,\n metadata_json = excluded.metadata_json,\n updated_at = excluded.updated_at`,\n );\n }\n\n async listConnectorAccountPrivacy(\n agentId: string,\n ): Promise<LifeOpsConnectorAccountPrivacyPolicy[]> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_account_privacy\n WHERE agent_id = ${sqlQuote(agentId)}\n ORDER BY provider ASC, connector_account_id ASC`,\n );\n return rows.map(parseConnectorAccountPrivacyPolicy);\n }\n\n async getConnectorAccountPrivacy(\n agentId: string,\n provider: string,\n connectorAccountId: string,\n ): Promise<LifeOpsConnectorAccountPrivacyPolicy | null> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_account_privacy\n WHERE agent_id = ${sqlQuote(agentId)}\n AND provider = ${sqlQuote(provider)}\n AND connector_account_id = ${sqlQuote(connectorAccountId)}\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parseConnectorAccountPrivacyPolicy(row) : null;\n }\n\n async upsertConnectorGrant(grant: LifeOpsConnectorGrant): Promise<void> {\n const identityEmail = deriveConnectorIdentityEmail(grant.identity);\n const connectorAccountId =\n grant.connectorAccountId ?? deriveConnectorAccountIdFromGrant(grant);\n const logicalIdentityClause =\n identityEmail === null\n ? \"identity_email IS NULL\"\n : `identity_email = ${sqlQuote(identityEmail)}`;\n const existingRows = await executeRawSql(\n this.runtime,\n `SELECT id, created_at\n FROM app_lifeops.life_connector_grants\n WHERE agent_id = ${sqlQuote(grant.agentId)}\n AND provider = ${sqlQuote(grant.provider)}\n AND side = ${sqlQuote(grant.side)}\n AND mode = ${sqlQuote(grant.mode)}\n AND ${logicalIdentityClause}\n ORDER BY updated_at DESC, created_at DESC\n LIMIT 1`,\n );\n const existingRow = existingRows[0] ?? null;\n const targetId = existingRow ? toText(existingRow.id, grant.id) : grant.id;\n const createdAt = existingRow\n ? toText(existingRow.created_at, grant.createdAt)\n : grant.createdAt;\n\n if (existingRow) {\n await executeRawSql(\n this.runtime,\n `UPDATE app_lifeops.life_connector_grants\n SET connector_account_id = ${sqlText(connectorAccountId)},\n identity_json = ${sqlJson(grant.identity)},\n identity_email = ${sqlText(identityEmail)},\n granted_scopes_json = ${sqlJson(grant.grantedScopes)},\n capabilities_json = ${sqlJson(grant.capabilities)},\n token_ref = ${sqlText(grant.tokenRef)},\n execution_target = ${sqlQuote(grant.executionTarget)},\n source_of_truth = ${sqlQuote(grant.sourceOfTruth)},\n preferred_by_agent = ${sqlBoolean(grant.preferredByAgent)},\n cloud_connection_id = ${sqlText(grant.cloudConnectionId)},\n metadata_json = ${sqlJson(grant.metadata)},\n last_refresh_at = ${sqlText(grant.lastRefreshAt)},\n updated_at = ${sqlQuote(grant.updatedAt)}\n WHERE id = ${sqlQuote(targetId)}`,\n );\n } else {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_connector_grants (\n id, agent_id, provider, connector_account_id, side, identity_json,\n identity_email, granted_scopes_json, capabilities_json, token_ref,\n mode, execution_target, source_of_truth, preferred_by_agent,\n cloud_connection_id, metadata_json, last_refresh_at, created_at,\n updated_at\n ) VALUES (\n ${sqlQuote(targetId)},\n ${sqlQuote(grant.agentId)},\n ${sqlQuote(grant.provider)},\n ${sqlText(connectorAccountId)},\n ${sqlQuote(grant.side)},\n ${sqlJson(grant.identity)},\n ${sqlText(identityEmail)},\n ${sqlJson(grant.grantedScopes)},\n ${sqlJson(grant.capabilities)},\n ${sqlText(grant.tokenRef)},\n ${sqlQuote(grant.mode)},\n ${sqlQuote(grant.executionTarget)},\n ${sqlQuote(grant.sourceOfTruth)},\n ${sqlBoolean(grant.preferredByAgent)},\n ${sqlText(grant.cloudConnectionId)},\n ${sqlJson(grant.metadata)},\n ${sqlText(grant.lastRefreshAt)},\n ${sqlQuote(createdAt)},\n ${sqlQuote(grant.updatedAt)}\n )\n ON CONFLICT(id) DO UPDATE SET\n agent_id = excluded.agent_id,\n provider = excluded.provider,\n connector_account_id = excluded.connector_account_id,\n side = excluded.side,\n identity_json = excluded.identity_json,\n identity_email = excluded.identity_email,\n granted_scopes_json = excluded.granted_scopes_json,\n capabilities_json = excluded.capabilities_json,\n token_ref = excluded.token_ref,\n execution_target = excluded.execution_target,\n source_of_truth = excluded.source_of_truth,\n preferred_by_agent = excluded.preferred_by_agent,\n cloud_connection_id = excluded.cloud_connection_id,\n metadata_json = excluded.metadata_json,\n last_refresh_at = excluded.last_refresh_at,\n created_at = app_lifeops.life_connector_grants.created_at,\n updated_at = excluded.updated_at`,\n );\n }\n\n await this.ensureConnectorAccountPrivacy({\n agentId: grant.agentId,\n provider: grant.provider,\n connectorAccountId,\n });\n }\n\n async listConnectorGrants(agentId: string): Promise<LifeOpsConnectorGrant[]> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_connector_grants\n WHERE agent_id = ${sqlQuote(agentId)}\n ORDER BY created_at ASC`,\n );\n return rows.map(parseConnectorGrant);\n }\n\n async getConnectorGrant(\n agentId: string,\n provider: LifeOpsConnectorGrant[\"provider\"],\n mode: LifeOpsConnectorGrant[\"mode\"],\n side: LifeOpsConnectorSide = \"owner\",\n ): Promise<LifeOpsConnectorGrant | null> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_connector_grants\n WHERE agent_id = ${sqlQuote(agentId)}\n AND provider = ${sqlQuote(provider)}\n AND side = ${sqlQuote(side)}\n AND mode = ${sqlQuote(mode)}\n ORDER BY updated_at DESC, created_at DESC\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parseConnectorGrant(row) : null;\n }\n\n async deleteConnectorGrant(\n agentId: string,\n provider: LifeOpsConnectorGrant[\"provider\"],\n mode?: LifeOpsConnectorGrant[\"mode\"],\n side?: LifeOpsConnectorSide,\n grantId?: string,\n ): Promise<void> {\n const modeClause = mode ? `AND mode = ${sqlQuote(mode)}` : \"\";\n const sideClause = side ? `AND side = ${sqlQuote(side)}` : \"\";\n const grantClause = grantId ? `AND id = ${sqlQuote(grantId)}` : \"\";\n await executeRawSql(\n this.runtime,\n `DELETE FROM app_lifeops.life_connector_grants\n WHERE agent_id = ${sqlQuote(agentId)}\n AND provider = ${sqlQuote(provider)}\n ${modeClause}\n ${sideClause}\n ${grantClause}`,\n );\n }\n\n async upsertCalendarEvent(\n event: LifeOpsCalendarEvent,\n side: LifeOpsConnectorSide = event.side,\n ): Promise<void> {\n const connectorAccountId =\n event.connectorAccountId ??\n deriveConnectorAccountId({\n provider: event.provider,\n side,\n identityEmail: event.accountEmail,\n grantId: event.grantId,\n });\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_calendar.life_calendar_events (\n id, agent_id, provider, side, calendar_id, external_event_id, title,\n description, location, status, start_at, end_at, is_all_day,\n timezone, html_link, conference_link, organizer_json, attendees_json,\n connector_account_id, grant_id, metadata_json, synced_at, updated_at\n ) VALUES (\n ${sqlQuote(event.id)},\n ${sqlQuote(event.agentId)},\n ${sqlQuote(event.provider)},\n ${sqlQuote(side)},\n ${sqlQuote(event.calendarId)},\n ${sqlQuote(event.externalId)},\n ${sqlQuote(event.title)},\n ${sqlQuote(event.description)},\n ${sqlQuote(event.location)},\n ${sqlQuote(event.status)},\n ${sqlQuote(event.startAt)},\n ${sqlQuote(event.endAt)},\n ${sqlBoolean(event.isAllDay)},\n ${sqlText(event.timezone)},\n ${sqlText(event.htmlLink)},\n ${sqlText(event.conferenceLink)},\n ${event.organizer ? sqlJson(event.organizer) : \"NULL\"},\n ${sqlJson(event.attendees)},\n ${sqlText(connectorAccountId)},\n ${sqlText(event.grantId)},\n ${sqlJson(event.metadata)},\n ${sqlQuote(event.syncedAt)},\n ${sqlQuote(event.updatedAt)}\n )\n ON CONFLICT(agent_id, provider, side, calendar_id, external_event_id) DO UPDATE SET\n title = excluded.title,\n description = excluded.description,\n location = excluded.location,\n status = excluded.status,\n start_at = excluded.start_at,\n end_at = excluded.end_at,\n is_all_day = excluded.is_all_day,\n timezone = excluded.timezone,\n html_link = excluded.html_link,\n conference_link = excluded.conference_link,\n organizer_json = excluded.organizer_json,\n attendees_json = excluded.attendees_json,\n connector_account_id = COALESCE(excluded.connector_account_id, app_calendar.life_calendar_events.connector_account_id),\n grant_id = COALESCE(excluded.grant_id, app_calendar.life_calendar_events.grant_id),\n metadata_json = excluded.metadata_json,\n synced_at = excluded.synced_at,\n updated_at = excluded.updated_at`,\n );\n }\n\n async deleteCalendarEventsForProvider(\n agentId: string,\n provider: LifeOpsConnectorGrant[\"provider\"],\n calendarId?: string,\n side?: LifeOpsConnectorSide,\n ): Promise<void> {\n const calendarClause = calendarId\n ? `AND calendar_id = ${sqlQuote(calendarId)}`\n : \"\";\n const sideClause = side ? `AND side = ${sqlQuote(side)}` : \"\";\n await executeRawSql(\n this.runtime,\n `DELETE FROM app_calendar.life_calendar_events\n WHERE agent_id = ${sqlQuote(agentId)}\n AND provider = ${sqlQuote(provider)}\n ${calendarClause}\n ${sideClause}`,\n );\n }\n\n async deleteCalendarEventByExternalId(\n agentId: string,\n provider: LifeOpsConnectorGrant[\"provider\"],\n calendarId: string | null | undefined,\n externalEventId: string,\n side?: LifeOpsConnectorSide,\n ): Promise<void> {\n const sideClause = side ? `AND side = ${sqlQuote(side)}` : \"\";\n const calendarClause =\n calendarId && calendarId !== \"all\"\n ? `AND calendar_id = ${sqlQuote(calendarId)}`\n : \"\";\n await executeRawSql(\n this.runtime,\n `DELETE FROM app_calendar.life_calendar_events\n WHERE agent_id = ${sqlQuote(agentId)}\n AND provider = ${sqlQuote(provider)}\n ${calendarClause}\n AND external_event_id = ${sqlQuote(externalEventId)}\n ${sideClause}`,\n );\n }\n\n async pruneCalendarEventsInWindow(\n agentId: string,\n provider: LifeOpsConnectorGrant[\"provider\"],\n calendarId: string,\n timeMin: string,\n timeMax: string,\n keepExternalIds: readonly string[],\n side: LifeOpsConnectorSide = \"owner\",\n ): Promise<void> {\n const calendarClause =\n calendarId && calendarId !== \"all\"\n ? `AND calendar_id = ${sqlQuote(calendarId)}`\n : \"\";\n const keepClause =\n keepExternalIds.length > 0\n ? `AND external_event_id NOT IN (${keepExternalIds\n .map((externalId) => sqlQuote(externalId))\n .join(\", \")})`\n : \"\";\n await executeRawSql(\n this.runtime,\n `DELETE FROM app_calendar.life_calendar_events\n WHERE agent_id = ${sqlQuote(agentId)}\n AND provider = ${sqlQuote(provider)}\n AND side = ${sqlQuote(side)}\n ${calendarClause}\n AND end_at > ${sqlQuote(timeMin)}\n AND start_at < ${sqlQuote(timeMax)}\n ${keepClause}`,\n );\n }\n\n async listCalendarEvents(\n agentId: string,\n provider: LifeOpsConnectorGrant[\"provider\"],\n timeMin?: string,\n timeMax?: string,\n side?: LifeOpsConnectorSide,\n ): Promise<LifeOpsCalendarEvent[]> {\n const timeMinClause = timeMin ? `AND end_at > ${sqlQuote(timeMin)}` : \"\";\n const timeMaxClause = timeMax ? `AND start_at < ${sqlQuote(timeMax)}` : \"\";\n const sideClause = side ? `AND side = ${sqlQuote(side)}` : \"\";\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_calendar.life_calendar_events\n WHERE agent_id = ${sqlQuote(agentId)}\n AND provider = ${sqlQuote(provider)}\n ${sideClause}\n ${timeMinClause}\n ${timeMaxClause}\n ORDER BY start_at ASC`,\n );\n return rows.map(parseCalendarEvent);\n }\n\n /**\n * Returns events whose `end_at` falls in (cursorEndAt, upToIso] OR\n * (end_at == cursorEndAt AND id > cursorId). Ordered by (end_at, id) ascending\n * so callers can advance a tuple cursor and never re-fire for the same event.\n */\n async listCalendarEventsEndedAfterCursor(args: {\n agentId: string;\n provider: LifeOpsConnectorGrant[\"provider\"];\n side?: LifeOpsConnectorSide;\n cursorEndAt: string | null;\n cursorEventId: string | null;\n upToIso: string;\n limit: number;\n }): Promise<LifeOpsCalendarEvent[]> {\n const sideClause = args.side ? `AND side = ${sqlQuote(args.side)}` : \"\";\n let cursorClause = \"\";\n if (args.cursorEndAt) {\n cursorClause = args.cursorEventId\n ? `AND (end_at > ${sqlQuote(args.cursorEndAt)}\n OR (end_at = ${sqlQuote(args.cursorEndAt)} AND id > ${sqlQuote(args.cursorEventId)}))`\n : `AND end_at > ${sqlQuote(args.cursorEndAt)}`;\n }\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_calendar.life_calendar_events\n WHERE agent_id = ${sqlQuote(args.agentId)}\n AND provider = ${sqlQuote(args.provider)}\n ${sideClause}\n AND end_at <= ${sqlQuote(args.upToIso)}\n ${cursorClause}\n ORDER BY end_at ASC, id ASC\n LIMIT ${Math.max(1, Math.floor(args.limit))}`,\n );\n return rows.map(parseCalendarEvent);\n }\n\n async upsertCalendarSyncState(\n state: LifeOpsCalendarSyncState,\n ): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_calendar.life_calendar_sync_states (\n id, agent_id, provider, side, calendar_id, window_start_at,\n window_end_at, synced_at, updated_at\n ) VALUES (\n ${sqlQuote(state.id)},\n ${sqlQuote(state.agentId)},\n ${sqlQuote(state.provider)},\n ${sqlQuote(state.side)},\n ${sqlQuote(state.calendarId)},\n ${sqlQuote(state.windowStartAt)},\n ${sqlQuote(state.windowEndAt)},\n ${sqlQuote(state.syncedAt)},\n ${sqlQuote(state.updatedAt)}\n )\n ON CONFLICT(agent_id, provider, side, calendar_id) DO UPDATE SET\n window_start_at = excluded.window_start_at,\n window_end_at = excluded.window_end_at,\n synced_at = excluded.synced_at,\n updated_at = excluded.updated_at`,\n );\n }\n\n async getCalendarSyncState(\n agentId: string,\n provider: LifeOpsConnectorGrant[\"provider\"],\n calendarId: string,\n side?: LifeOpsConnectorSide,\n ): Promise<LifeOpsCalendarSyncState | null> {\n const sideClause = side ? `AND side = ${sqlQuote(side)}` : \"\";\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_calendar.life_calendar_sync_states\n WHERE agent_id = ${sqlQuote(agentId)}\n AND provider = ${sqlQuote(provider)}\n AND calendar_id = ${sqlQuote(calendarId)}\n ${sideClause}\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parseCalendarSyncState(row) : null;\n }\n\n async deleteCalendarSyncState(\n agentId: string,\n provider: LifeOpsConnectorGrant[\"provider\"],\n calendarId?: string,\n side?: LifeOpsConnectorSide,\n ): Promise<void> {\n const calendarClause = calendarId\n ? `AND calendar_id = ${sqlQuote(calendarId)}`\n : \"\";\n const sideClause = side ? `AND side = ${sqlQuote(side)}` : \"\";\n await executeRawSql(\n this.runtime,\n `DELETE FROM app_calendar.life_calendar_sync_states\n WHERE agent_id = ${sqlQuote(agentId)}\n AND provider = ${sqlQuote(provider)}\n ${calendarClause}\n ${sideClause}`,\n );\n }\n\n async upsertGmailMessage(\n message: LifeOpsGmailMessageSummary,\n side: LifeOpsConnectorSide = message.side,\n ): Promise<void> {\n const grantId = requireScopedGmailGrantId(message.grantId);\n const connectorAccountId =\n message.connectorAccountId ??\n deriveConnectorAccountId({\n provider: message.provider,\n side,\n identityEmail: message.accountEmail,\n grantId,\n });\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_gmail_messages (\n id, agent_id, provider, side, external_message_id,\n connector_account_id, grant_id, thread_id, subject, from_display,\n from_email, reply_to, to_json, cc_json, snippet, received_at,\n is_unread, is_important, likely_reply_needed, triage_score,\n triage_reason, label_ids_json, html_link, metadata_json, synced_at,\n updated_at\n ) VALUES (\n ${sqlQuote(message.id)},\n ${sqlQuote(message.agentId)},\n ${sqlQuote(message.provider)},\n ${sqlQuote(side)},\n ${sqlQuote(message.externalId)},\n ${sqlText(connectorAccountId)},\n ${sqlQuote(grantId)},\n ${sqlQuote(message.threadId)},\n ${sqlQuote(message.subject)},\n ${sqlQuote(message.from)},\n ${sqlText(message.fromEmail)},\n ${sqlText(message.replyTo)},\n ${sqlJson(message.to)},\n ${sqlJson(message.cc)},\n ${sqlQuote(message.snippet)},\n ${sqlQuote(message.receivedAt)},\n ${sqlBoolean(message.isUnread)},\n ${sqlBoolean(message.isImportant)},\n ${sqlBoolean(message.likelyReplyNeeded)},\n ${sqlInteger(message.triageScore)},\n ${sqlQuote(message.triageReason)},\n ${sqlJson(message.labels)},\n ${sqlText(message.htmlLink)},\n ${sqlJson(message.metadata)},\n ${sqlQuote(message.syncedAt)},\n ${sqlQuote(message.updatedAt)}\n )\n ON CONFLICT(agent_id, provider, side, grant_id, external_message_id) DO UPDATE SET\n id = excluded.id,\n connector_account_id = COALESCE(excluded.connector_account_id, app_lifeops.life_gmail_messages.connector_account_id),\n thread_id = excluded.thread_id,\n subject = excluded.subject,\n from_display = excluded.from_display,\n from_email = excluded.from_email,\n reply_to = excluded.reply_to,\n to_json = excluded.to_json,\n cc_json = excluded.cc_json,\n snippet = excluded.snippet,\n received_at = excluded.received_at,\n is_unread = excluded.is_unread,\n is_important = excluded.is_important,\n likely_reply_needed = excluded.likely_reply_needed,\n triage_score = excluded.triage_score,\n triage_reason = excluded.triage_reason,\n label_ids_json = excluded.label_ids_json,\n html_link = excluded.html_link,\n metadata_json = excluded.metadata_json,\n synced_at = excluded.synced_at,\n updated_at = excluded.updated_at`,\n );\n }\n\n async pruneGmailMessages(\n agentId: string,\n provider: LifeOpsConnectorGrant[\"provider\"],\n keepExternalIds: readonly string[],\n side?: LifeOpsConnectorSide,\n grantId?: string,\n ): Promise<void> {\n const keepClause =\n keepExternalIds.length > 0\n ? `AND external_message_id NOT IN (${keepExternalIds\n .map((externalId) => sqlQuote(externalId))\n .join(\", \")})`\n : \"\";\n const sideClause = side ? `AND side = ${sqlQuote(side)}` : \"\";\n const grantClause = grantId ? `AND grant_id = ${sqlQuote(grantId)}` : \"\";\n await executeRawSql(\n this.runtime,\n `DELETE FROM app_lifeops.life_gmail_messages\n WHERE agent_id = ${sqlQuote(agentId)}\n AND provider = ${sqlQuote(provider)}\n ${sideClause}\n ${grantClause}\n ${keepClause}`,\n );\n }\n\n async listGmailMessages(\n agentId: string,\n provider: LifeOpsConnectorGrant[\"provider\"],\n options?: {\n maxResults?: number;\n threadId?: string;\n since?: string;\n grantId?: string;\n },\n side?: LifeOpsConnectorSide,\n ): Promise<LifeOpsGmailMessageSummary[]> {\n const DEFAULT_GMAIL_LIST_LIMIT = 200;\n const limit =\n options?.maxResults !== undefined && Number.isFinite(options.maxResults)\n ? options.maxResults\n : DEFAULT_GMAIL_LIST_LIMIT;\n const maxResultsClause = `LIMIT ${sqlInteger(limit)}`;\n const threadClause = options?.threadId\n ? `AND thread_id = ${sqlQuote(options.threadId)}`\n : \"\";\n const sinceClause = options?.since\n ? `AND received_at >= ${sqlQuote(options.since)}`\n : \"\";\n const sideClause = side ? `AND side = ${sqlQuote(side)}` : \"\";\n const grantClause = options?.grantId\n ? `AND grant_id = ${sqlQuote(options.grantId)}`\n : \"\";\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_gmail_messages\n WHERE agent_id = ${sqlQuote(agentId)}\n AND provider = ${sqlQuote(provider)}\n ${sideClause}\n ${grantClause}\n ${threadClause}\n ${sinceClause}\n ORDER BY triage_score DESC, received_at DESC\n ${maxResultsClause}`,\n );\n return rows.map(parseGmailMessageSummary);\n }\n\n async getGmailMessage(\n agentId: string,\n provider: LifeOpsConnectorGrant[\"provider\"],\n messageId: string,\n side?: LifeOpsConnectorSide,\n grantId?: string,\n ): Promise<LifeOpsGmailMessageSummary | null> {\n const sideClause = side ? `AND side = ${sqlQuote(side)}` : \"\";\n const grantClause = grantId ? `AND grant_id = ${sqlQuote(grantId)}` : \"\";\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_gmail_messages\n WHERE agent_id = ${sqlQuote(agentId)}\n AND provider = ${sqlQuote(provider)}\n ${sideClause}\n ${grantClause}\n AND id = ${sqlQuote(messageId)}\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parseGmailMessageSummary(row) : null;\n }\n\n async upsertCachedInboxMessages(\n agentId: string,\n messages: readonly LifeOpsInboxCacheWriteMessage[],\n ): Promise<void> {\n if (messages.length === 0) return;\n const now = isoNow();\n for (const message of messages) {\n const channel = normalizeInboxChannelValue(message.channel);\n const sourceRef = normalizeInboxWriteSourceRef(\n message.sourceRef,\n channel,\n );\n const chatType = normalizeInboxChatType(\n channel,\n message.chatType,\n message.participantCount,\n );\n const hasPriorityFlags = hasOwnPriorityFlags(message);\n const priorityFlags = normalizeInboxPriorityFlags(message.priorityFlags);\n const priorityFlagsUpdate = hasPriorityFlags\n ? \"excluded.priority_flags_json\"\n : \"app_lifeops.life_inbox_messages.priority_flags_json\";\n const connectorAccountId =\n message.connectorAccountId ??\n (channel === \"gmail\"\n ? (deriveConnectorAccountId({\n provider: \"google\",\n side: \"owner\",\n identityEmail: message.gmailAccountEmail,\n grantId: message.gmailAccountId,\n }) ??\n (message.gmailAccountId\n ? grantScopedConnectorAccountId({\n provider: \"google\",\n side: \"owner\",\n grantId: message.gmailAccountId,\n })\n : null))\n : null);\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_inbox_messages (\n id, agent_id, channel, external_id, thread_id, sender_id,\n sender_display, sender_email, subject, snippet, received_at,\n is_unread, deep_link, source_ref_json, chat_type, participant_count,\n gmail_account_id, gmail_account_email, last_seen_at, replied_at, priority_score,\n priority_category, priority_flags_json, connector_account_id, cached_at, updated_at\n ) VALUES (\n ${sqlQuote(message.id)},\n ${sqlQuote(agentId)},\n ${sqlQuote(channel)},\n ${sqlQuote(sourceRef.externalId)},\n ${sqlText(message.threadId)},\n ${sqlQuote(message.sender.id)},\n ${sqlQuote(message.sender.displayName)},\n ${sqlText(message.sender.email)},\n ${sqlText(message.subject)},\n ${sqlQuote(message.snippet)},\n ${sqlQuote(message.receivedAt)},\n ${sqlBoolean(message.unread)},\n ${sqlText(message.deepLink)},\n ${sqlJson(sourceRef)},\n ${sqlQuote(chatType)},\n ${sqlInteger(message.participantCount)},\n ${sqlText(message.gmailAccountId)},\n ${sqlText(message.gmailAccountEmail)},\n ${sqlText(message.lastSeenAt)},\n ${sqlText(message.repliedAt)},\n ${sqlInteger(message.priorityScore)},\n ${sqlText(message.priorityCategory)},\n ${sqlJson(priorityFlags)},\n ${sqlText(connectorAccountId)},\n ${sqlQuote(now)},\n ${sqlQuote(now)}\n )\n ON CONFLICT(agent_id, channel, external_id) DO UPDATE SET\n id = excluded.id,\n thread_id = excluded.thread_id,\n sender_id = excluded.sender_id,\n sender_display = excluded.sender_display,\n sender_email = excluded.sender_email,\n subject = excluded.subject,\n snippet = excluded.snippet,\n received_at = excluded.received_at,\n is_unread = excluded.is_unread,\n deep_link = excluded.deep_link,\n source_ref_json = excluded.source_ref_json,\n chat_type = excluded.chat_type,\n participant_count = excluded.participant_count,\n gmail_account_id = excluded.gmail_account_id,\n gmail_account_email = excluded.gmail_account_email,\n last_seen_at = COALESCE(excluded.last_seen_at, app_lifeops.life_inbox_messages.last_seen_at),\n replied_at = COALESCE(excluded.replied_at, app_lifeops.life_inbox_messages.replied_at),\n priority_score = COALESCE(excluded.priority_score, app_lifeops.life_inbox_messages.priority_score),\n priority_category = COALESCE(excluded.priority_category, app_lifeops.life_inbox_messages.priority_category),\n priority_flags_json = ${priorityFlagsUpdate},\n connector_account_id = COALESCE(excluded.connector_account_id, app_lifeops.life_inbox_messages.connector_account_id),\n cached_at = excluded.cached_at,\n updated_at = excluded.updated_at`,\n );\n }\n }\n\n async listCachedInboxMessages(\n agentId: string,\n options?: {\n channels?: readonly LifeOpsInboxChannel[];\n maxResults?: number;\n gmailAccountId?: string;\n },\n ): Promise<LifeOpsCachedInboxMessage[]> {\n const channels =\n options?.channels?.map((channel) =>\n normalizeInboxChannelValue(channel),\n ) ?? [];\n const channelClause =\n channels.length > 0\n ? `AND channel IN (${channels\n .map((channel) => sqlQuote(channel))\n .join(\", \")})`\n : \"\";\n const gmailAccountClause = options?.gmailAccountId\n ? `AND gmail_account_id = ${sqlQuote(options.gmailAccountId)}`\n : \"\";\n const limit =\n options?.maxResults !== undefined && Number.isFinite(options.maxResults)\n ? Math.max(1, Math.floor(options.maxResults))\n : 500;\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_inbox_messages\n WHERE agent_id = ${sqlQuote(agentId)}\n ${channelClause}\n ${gmailAccountClause}\n ORDER BY received_at DESC\n LIMIT ${sqlInteger(limit)}`,\n );\n return rows.map(parseCachedInboxMessage);\n }\n\n async markCachedInboxMessageRead(\n agentId: string,\n messageId: string,\n readAt = isoNow(),\n ): Promise<LifeOpsCachedInboxMessage | null> {\n await executeRawSql(\n this.runtime,\n `UPDATE app_lifeops.life_inbox_messages\n SET is_unread = ${sqlBoolean(false)},\n last_seen_at = ${sqlQuote(readAt)},\n updated_at = ${sqlQuote(readAt)}\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(messageId)}`,\n );\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_inbox_messages\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(messageId)}\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parseCachedInboxMessage(row) : null;\n }\n\n async deleteGmailMessages(\n agentId: string,\n provider: LifeOpsConnectorGrant[\"provider\"],\n messageIds: readonly string[],\n side?: LifeOpsConnectorSide,\n grantId?: string,\n ): Promise<void> {\n if (messageIds.length === 0) {\n return;\n }\n const sideClause = side ? `AND side = ${sqlQuote(side)}` : \"\";\n const grantClause = grantId ? `AND grant_id = ${sqlQuote(grantId)}` : \"\";\n await executeRawSql(\n this.runtime,\n `DELETE FROM app_lifeops.life_gmail_messages\n WHERE agent_id = ${sqlQuote(agentId)}\n AND provider = ${sqlQuote(provider)}\n ${sideClause}\n ${grantClause}\n AND id IN (${messageIds.map((messageId) => sqlQuote(messageId)).join(\", \")})`,\n );\n }\n\n async deleteGmailMessagesForProvider(\n agentId: string,\n provider: LifeOpsConnectorGrant[\"provider\"],\n side?: LifeOpsConnectorSide,\n grantId?: string,\n ): Promise<void> {\n const sideClause = side ? `AND side = ${sqlQuote(side)}` : \"\";\n const grantClause = grantId ? `AND grant_id = ${sqlQuote(grantId)}` : \"\";\n await executeRawSql(\n this.runtime,\n `DELETE FROM app_lifeops.life_gmail_messages\n WHERE agent_id = ${sqlQuote(agentId)}\n AND provider = ${sqlQuote(provider)}\n ${sideClause}\n ${grantClause}`,\n );\n }\n\n async upsertGmailSyncState(state: LifeOpsGmailSyncState): Promise<void> {\n const grantId = requireScopedGmailGrantId(state.grantId);\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_gmail_sync_states (\n id, agent_id, provider, side, mailbox, grant_id, max_results, synced_at,\n updated_at\n ) VALUES (\n ${sqlQuote(state.id)},\n ${sqlQuote(state.agentId)},\n ${sqlQuote(state.provider)},\n ${sqlQuote(state.side)},\n ${sqlQuote(state.mailbox)},\n ${sqlQuote(grantId)},\n ${sqlInteger(state.maxResults)},\n ${sqlQuote(state.syncedAt)},\n ${sqlQuote(state.updatedAt)}\n )\n ON CONFLICT(agent_id, provider, side, grant_id, mailbox) DO UPDATE SET\n id = excluded.id,\n max_results = excluded.max_results,\n synced_at = excluded.synced_at,\n updated_at = excluded.updated_at`,\n );\n }\n\n async getGmailSyncState(\n agentId: string,\n provider: LifeOpsConnectorGrant[\"provider\"],\n mailbox: string,\n side?: LifeOpsConnectorSide,\n grantId?: string,\n ): Promise<LifeOpsGmailSyncState | null> {\n const sideClause = side ? `AND side = ${sqlQuote(side)}` : \"\";\n const grantClause = grantId ? `AND grant_id = ${sqlQuote(grantId)}` : \"\";\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_gmail_sync_states\n WHERE agent_id = ${sqlQuote(agentId)}\n AND provider = ${sqlQuote(provider)}\n AND mailbox = ${sqlQuote(mailbox)}\n ${sideClause}\n ${grantClause}\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parseGmailSyncState(row) : null;\n }\n\n async deleteGmailSyncState(\n agentId: string,\n provider: LifeOpsConnectorGrant[\"provider\"],\n mailbox?: string,\n side?: LifeOpsConnectorSide,\n grantId?: string,\n ): Promise<void> {\n const mailboxClause = mailbox ? `AND mailbox = ${sqlQuote(mailbox)}` : \"\";\n const sideClause = side ? `AND side = ${sqlQuote(side)}` : \"\";\n const grantClause = grantId ? `AND grant_id = ${sqlQuote(grantId)}` : \"\";\n await executeRawSql(\n this.runtime,\n `DELETE FROM app_lifeops.life_gmail_sync_states\n WHERE agent_id = ${sqlQuote(agentId)}\n AND provider = ${sqlQuote(provider)}\n ${mailboxClause}\n ${sideClause}\n ${grantClause}`,\n );\n }\n\n async upsertGmailSpamReviewItem(\n item: LifeOpsGmailSpamReviewItem,\n ): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_gmail_spam_review_items (\n id, agent_id, provider, side, grant_id, account_email, message_id,\n external_message_id, thread_id, subject, from_display, from_email,\n received_at, snippet, label_ids_json, rationale, confidence, status,\n created_at, updated_at, reviewed_at\n ) VALUES (\n ${sqlQuote(item.id)},\n ${sqlQuote(item.agentId)},\n ${sqlQuote(item.provider)},\n ${sqlQuote(item.side)},\n ${sqlQuote(item.grantId)},\n ${sqlText(item.accountEmail)},\n ${sqlQuote(item.messageId)},\n ${sqlQuote(item.externalMessageId)},\n ${sqlQuote(item.threadId)},\n ${sqlQuote(item.subject)},\n ${sqlQuote(item.from)},\n ${sqlText(item.fromEmail)},\n ${sqlQuote(item.receivedAt)},\n ${sqlQuote(item.snippet)},\n ${sqlJson(item.labels)},\n ${sqlQuote(item.rationale)},\n ${sqlNumber(item.confidence)},\n ${sqlQuote(item.status)},\n ${sqlQuote(item.createdAt)},\n ${sqlQuote(item.updatedAt)},\n ${sqlText(item.reviewedAt)}\n )\n ON CONFLICT(agent_id, provider, side, grant_id, external_message_id) DO UPDATE SET\n account_email = excluded.account_email,\n message_id = excluded.message_id,\n thread_id = excluded.thread_id,\n subject = excluded.subject,\n from_display = excluded.from_display,\n from_email = excluded.from_email,\n received_at = excluded.received_at,\n snippet = excluded.snippet,\n label_ids_json = excluded.label_ids_json,\n rationale = excluded.rationale,\n confidence = excluded.confidence,\n updated_at = excluded.updated_at`,\n );\n }\n\n async listGmailSpamReviewItems(\n agentId: string,\n provider: LifeOpsConnectorGrant[\"provider\"],\n options?: {\n maxResults?: number;\n status?: LifeOpsGmailSpamReviewStatus;\n grantId?: string;\n },\n side?: LifeOpsConnectorSide,\n ): Promise<LifeOpsGmailSpamReviewItem[]> {\n const limit =\n options?.maxResults !== undefined && Number.isFinite(options.maxResults)\n ? options.maxResults\n : 100;\n const sideClause = side ? `AND side = ${sqlQuote(side)}` : \"\";\n const statusClause = options?.status\n ? `AND status = ${sqlQuote(options.status)}`\n : \"\";\n const grantClause = options?.grantId\n ? `AND grant_id = ${sqlQuote(options.grantId)}`\n : \"\";\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_gmail_spam_review_items\n WHERE agent_id = ${sqlQuote(agentId)}\n AND provider = ${sqlQuote(provider)}\n ${sideClause}\n ${statusClause}\n ${grantClause}\n ORDER BY updated_at DESC, received_at DESC\n LIMIT ${sqlInteger(limit)}`,\n );\n return rows.map(parseGmailSpamReviewItem);\n }\n\n async getGmailSpamReviewItem(\n agentId: string,\n provider: LifeOpsConnectorGrant[\"provider\"],\n itemId: string,\n side?: LifeOpsConnectorSide,\n ): Promise<LifeOpsGmailSpamReviewItem | null> {\n const sideClause = side ? `AND side = ${sqlQuote(side)}` : \"\";\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_gmail_spam_review_items\n WHERE agent_id = ${sqlQuote(agentId)}\n AND provider = ${sqlQuote(provider)}\n ${sideClause}\n AND id = ${sqlQuote(itemId)}\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parseGmailSpamReviewItem(row) : null;\n }\n\n async updateGmailSpamReviewItemStatus(\n agentId: string,\n provider: LifeOpsConnectorGrant[\"provider\"],\n itemId: string,\n status: LifeOpsGmailSpamReviewStatus,\n reviewedAt: string | null,\n updatedAt: string,\n side?: LifeOpsConnectorSide,\n ): Promise<void> {\n const sideClause = side ? `AND side = ${sqlQuote(side)}` : \"\";\n await executeRawSql(\n this.runtime,\n `UPDATE app_lifeops.life_gmail_spam_review_items\n SET status = ${sqlQuote(status)},\n reviewed_at = ${sqlText(reviewedAt)},\n updated_at = ${sqlQuote(updatedAt)}\n WHERE agent_id = ${sqlQuote(agentId)}\n AND provider = ${sqlQuote(provider)}\n ${sideClause}\n AND id = ${sqlQuote(itemId)}`,\n );\n }\n\n async deleteGmailSpamReviewItemsForProvider(\n agentId: string,\n provider: LifeOpsConnectorGrant[\"provider\"],\n side?: LifeOpsConnectorSide,\n grantId?: string,\n ): Promise<void> {\n const sideClause = side ? `AND side = ${sqlQuote(side)}` : \"\";\n const grantClause = grantId ? `AND grant_id = ${sqlQuote(grantId)}` : \"\";\n await executeRawSql(\n this.runtime,\n `DELETE FROM app_lifeops.life_gmail_spam_review_items\n WHERE agent_id = ${sqlQuote(agentId)}\n AND provider = ${sqlQuote(provider)}\n ${sideClause}\n ${grantClause}`,\n );\n }\n\n async createWorkflow(definition: LifeOpsWorkflowDefinition): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_workflow_definitions (\n id, agent_id, domain, subject_type, subject_id, visibility_scope,\n context_policy, title, trigger_type, schedule_json, action_plan_json,\n permission_policy_json, status, created_by, metadata_json,\n created_at, updated_at\n ) VALUES (\n ${sqlQuote(definition.id)},\n ${sqlQuote(definition.agentId)},\n ${sqlQuote(definition.domain)},\n ${sqlQuote(definition.subjectType)},\n ${sqlQuote(definition.subjectId)},\n ${sqlQuote(definition.visibilityScope)},\n ${sqlQuote(definition.contextPolicy)},\n ${sqlQuote(definition.title)},\n ${sqlQuote(definition.triggerType)},\n ${sqlJson(definition.schedule)},\n ${sqlJson(definition.actionPlan)},\n ${sqlJson(definition.permissionPolicy)},\n ${sqlQuote(definition.status)},\n ${sqlQuote(definition.createdBy)},\n ${sqlJson(definition.metadata)},\n ${sqlQuote(definition.createdAt)},\n ${sqlQuote(definition.updatedAt)}\n )`,\n );\n }\n\n async updateWorkflow(definition: LifeOpsWorkflowDefinition): Promise<void> {\n await executeRawSql(\n this.runtime,\n `UPDATE app_lifeops.life_workflow_definitions\n SET domain = ${sqlQuote(definition.domain)},\n subject_type = ${sqlQuote(definition.subjectType)},\n subject_id = ${sqlQuote(definition.subjectId)},\n visibility_scope = ${sqlQuote(definition.visibilityScope)},\n context_policy = ${sqlQuote(definition.contextPolicy)},\n title = ${sqlQuote(definition.title)},\n trigger_type = ${sqlQuote(definition.triggerType)},\n schedule_json = ${sqlJson(definition.schedule)},\n action_plan_json = ${sqlJson(definition.actionPlan)},\n permission_policy_json = ${sqlJson(definition.permissionPolicy)},\n status = ${sqlQuote(definition.status)},\n metadata_json = ${sqlJson(definition.metadata)},\n updated_at = ${sqlQuote(definition.updatedAt)}\n WHERE id = ${sqlQuote(definition.id)}\n AND agent_id = ${sqlQuote(definition.agentId)}`,\n );\n }\n\n async listWorkflows(agentId: string): Promise<LifeOpsWorkflowDefinition[]> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_workflow_definitions\n WHERE agent_id = ${sqlQuote(agentId)}\n ORDER BY updated_at DESC, created_at DESC`,\n );\n return rows.map(parseWorkflowDefinition);\n }\n\n async deleteWorkflow(agentId: string, workflowId: string): Promise<void> {\n await executeRawSql(\n this.runtime,\n `DELETE FROM app_lifeops.life_workflow_runs\n WHERE agent_id = ${sqlQuote(agentId)}\n AND workflow_id = ${sqlQuote(workflowId)}`,\n );\n await executeRawSql(\n this.runtime,\n `UPDATE app_lifeops.life_workflow_browser_sessions\n SET workflow_id = NULL\n WHERE agent_id = ${sqlQuote(agentId)}\n AND workflow_id = ${sqlQuote(workflowId)}`,\n );\n await executeRawSql(\n this.runtime,\n `DELETE FROM app_lifeops.life_workflow_definitions\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(workflowId)}`,\n );\n }\n\n async getWorkflow(\n agentId: string,\n workflowId: string,\n ): Promise<LifeOpsWorkflowDefinition | null> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_workflow_definitions\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(workflowId)}\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parseWorkflowDefinition(row) : null;\n }\n\n async createWorkflowRun(run: LifeOpsWorkflowRun): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_workflow_runs (\n id, agent_id, workflow_id, started_at, finished_at, status,\n result_json, audit_ref\n ) VALUES (\n ${sqlQuote(run.id)},\n ${sqlQuote(run.agentId)},\n ${sqlQuote(run.workflowId)},\n ${sqlQuote(run.startedAt)},\n ${sqlText(run.finishedAt)},\n ${sqlQuote(run.status)},\n ${sqlJson(run.result)},\n ${sqlText(run.auditRef)}\n )`,\n );\n }\n\n async listWorkflowRuns(\n agentId: string,\n workflowId: string,\n ): Promise<LifeOpsWorkflowRun[]> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_workflow_runs\n WHERE agent_id = ${sqlQuote(agentId)}\n AND workflow_id = ${sqlQuote(workflowId)}\n ORDER BY started_at DESC`,\n );\n return rows.map(parseWorkflowRun);\n }\n\n async createReminderAttempt(attempt: LifeOpsReminderAttempt): Promise<void> {\n const metadataReviewColumns = readReminderReviewColumnValues(\n attempt.deliveryMetadata,\n );\n const reviewAt = attempt.reviewAt ?? metadataReviewColumns.reviewAt;\n const reviewStatus =\n attempt.reviewStatus ?? metadataReviewColumns.reviewStatus;\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_reminders.life_reminder_attempts (\n id, agent_id, plan_id, owner_type, owner_id, occurrence_id,\n channel, step_index, scheduled_for, attempted_at, outcome,\n connector_ref, delivery_metadata_json, review_at, review_status\n ) VALUES (\n ${sqlQuote(attempt.id)},\n ${sqlQuote(attempt.agentId)},\n ${sqlQuote(attempt.planId)},\n ${sqlQuote(attempt.ownerType)},\n ${sqlQuote(attempt.ownerId)},\n ${sqlText(attempt.occurrenceId)},\n ${sqlQuote(attempt.channel)},\n ${sqlInteger(attempt.stepIndex)},\n ${sqlQuote(attempt.scheduledFor)},\n ${sqlText(attempt.attemptedAt)},\n ${sqlQuote(attempt.outcome)},\n ${sqlText(attempt.connectorRef)},\n ${sqlJson(attempt.deliveryMetadata)},\n ${sqlText(reviewAt)},\n ${sqlText(reviewStatus)}\n )`,\n );\n }\n\n async listReminderAttempts(\n agentId: string,\n options?: {\n ownerType?: LifeOpsReminderAttempt[\"ownerType\"];\n ownerId?: string;\n planId?: string;\n },\n ): Promise<LifeOpsReminderAttempt[]> {\n const ownerTypeClause = options?.ownerType\n ? `AND owner_type = ${sqlQuote(options.ownerType)}`\n : \"\";\n const ownerIdClause = options?.ownerId\n ? `AND owner_id = ${sqlQuote(options.ownerId)}`\n : \"\";\n const planIdClause = options?.planId\n ? `AND plan_id = ${sqlQuote(options.planId)}`\n : \"\";\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_reminders.life_reminder_attempts\n WHERE agent_id = ${sqlQuote(agentId)}\n ${ownerTypeClause}\n ${ownerIdClause}\n ${planIdClause}\n ORDER BY scheduled_for ASC, step_index ASC, attempted_at ASC`,\n );\n return rows.map(parseReminderAttempt);\n }\n\n async listDueReminderReviewAttempts(\n agentId: string,\n nowIso: string,\n limit = 50,\n ): Promise<LifeOpsReminderAttempt[]> {\n const normalizedLimit = Math.max(1, Math.min(500, Math.trunc(limit)));\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_reminders.life_reminder_attempts\n WHERE agent_id = ${sqlQuote(agentId)}\n AND attempted_at IS NOT NULL\n AND outcome IN ('delivered', 'delivered_read', 'delivered_unread')\n AND review_at IS NOT NULL\n AND review_at <= ${sqlQuote(nowIso)}\n AND COALESCE(review_status, '') NOT IN ('resolved', 'escalated', 'clarification_requested')\n AND (review_next_retry_at IS NULL OR review_next_retry_at <= ${sqlQuote(nowIso)})\n ORDER BY review_at ASC, attempted_at ASC\n LIMIT ${sqlInteger(normalizedLimit)}`,\n );\n return rows\n .map(parseReminderAttempt)\n .filter((attempt) => {\n if (!attempt.reviewAt || attempt.reviewAt > nowIso) {\n return false;\n }\n return (\n attempt.reviewStatus !== \"resolved\" &&\n attempt.reviewStatus !== \"escalated\" &&\n attempt.reviewStatus !== \"clarification_requested\"\n );\n })\n .sort((left, right) => {\n const leftReviewAt = left.reviewAt ?? \"\";\n const rightReviewAt = right.reviewAt ?? \"\";\n const reviewDelta = leftReviewAt.localeCompare(rightReviewAt);\n if (reviewDelta !== 0) {\n return reviewDelta;\n }\n return (left.attemptedAt ?? \"\").localeCompare(right.attemptedAt ?? \"\");\n })\n .slice(0, normalizedLimit);\n }\n\n async claimDueReminderReviewAttempts(\n agentId: string,\n nowIso: string,\n limit = 50,\n claimedBy = crypto.randomUUID(),\n ): Promise<LifeOpsReminderAttempt[]> {\n const normalizedLimit = Math.max(1, Math.min(500, Math.trunc(limit)));\n const rows = await executeRawSql(\n this.runtime,\n `UPDATE app_reminders.life_reminder_attempts\n SET review_claimed_at = ${sqlQuote(nowIso)},\n review_claimed_by = ${sqlQuote(claimedBy)},\n review_attempt_count = COALESCE(review_attempt_count, 0) + 1\n WHERE id IN (\n SELECT id\n FROM app_reminders.life_reminder_attempts\n WHERE agent_id = ${sqlQuote(agentId)}\n AND attempted_at IS NOT NULL\n AND outcome IN ('delivered', 'delivered_read', 'delivered_unread')\n AND review_at IS NOT NULL\n AND review_at <= ${sqlQuote(nowIso)}\n AND COALESCE(review_status, '') NOT IN ('resolved', 'escalated', 'clarification_requested')\n AND (review_next_retry_at IS NULL OR review_next_retry_at <= ${sqlQuote(nowIso)})\n AND (\n review_claimed_at IS NULL OR\n review_claimed_at <= ${sqlQuote(new Date(Date.parse(nowIso) - 5 * 60_000).toISOString())}\n )\n ORDER BY review_at ASC, attempted_at ASC\n LIMIT ${sqlInteger(normalizedLimit)}\n )\n RETURNING *`,\n );\n return rows.map(parseReminderAttempt);\n }\n\n async updateReminderAttemptOutcome(\n id: string,\n outcome: string,\n metadata?: Record<string, unknown>,\n ): Promise<void> {\n if (metadata && Object.keys(metadata).length > 0) {\n const reviewColumns = readReminderReviewColumnValues(metadata);\n const reviewColumnAssignments: string[] = [];\n if (reviewColumns.reviewAt !== null) {\n reviewColumnAssignments.push(\n `review_at = ${sqlText(reviewColumns.reviewAt)}`,\n );\n }\n if (reviewColumns.reviewStatus !== null) {\n reviewColumnAssignments.push(\n `review_status = ${sqlText(reviewColumns.reviewStatus)}`,\n );\n }\n await executeRawSql(\n this.runtime,\n `UPDATE app_reminders.life_reminder_attempts\n SET outcome = ${sqlQuote(outcome)},\n delivery_metadata_json = delivery_metadata_json::jsonb || ${sqlJson(metadata)}::jsonb\n ${\n reviewColumnAssignments.length > 0\n ? `, ${reviewColumnAssignments.join(\", \")}`\n : \"\"\n }\n WHERE id = ${sqlQuote(id)}`,\n );\n } else {\n await executeRawSql(\n this.runtime,\n `UPDATE app_reminders.life_reminder_attempts\n SET outcome = ${sqlQuote(outcome)}\n WHERE id = ${sqlQuote(id)}`,\n );\n }\n }\n\n async createBrowserSession(session: LifeOpsBrowserSession): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_workflow_browser_sessions (\n id, agent_id, domain, subject_type, subject_id, visibility_scope,\n context_policy, workflow_id, browser, companion_id, profile_id,\n window_id, tab_id, title, status, actions_json,\n current_action_index, awaiting_confirmation_for_action_id,\n result_json, metadata_json, created_at, updated_at, finished_at\n ) VALUES (\n ${sqlQuote(session.id)},\n ${sqlQuote(session.agentId)},\n ${sqlQuote(session.domain)},\n ${sqlQuote(session.subjectType)},\n ${sqlQuote(session.subjectId)},\n ${sqlQuote(session.visibilityScope)},\n ${sqlQuote(session.contextPolicy)},\n ${sqlText(session.workflowId)},\n ${sqlText(session.browser)},\n ${sqlText(session.companionId)},\n ${sqlText(session.profileId)},\n ${sqlText(session.windowId)},\n ${sqlText(session.tabId)},\n ${sqlQuote(session.title)},\n ${sqlQuote(session.status)},\n ${sqlJson(session.actions)},\n ${sqlInteger(session.currentActionIndex)},\n ${sqlText(session.awaitingConfirmationForActionId)},\n ${sqlJson(session.result)},\n ${sqlJson(session.metadata)},\n ${sqlQuote(session.createdAt)},\n ${sqlQuote(session.updatedAt)},\n ${sqlText(session.finishedAt)}\n )`,\n );\n }\n\n async updateBrowserSession(session: LifeOpsBrowserSession): Promise<void> {\n await executeRawSql(\n this.runtime,\n `UPDATE app_lifeops.life_workflow_browser_sessions\n SET domain = ${sqlQuote(session.domain)},\n subject_type = ${sqlQuote(session.subjectType)},\n subject_id = ${sqlQuote(session.subjectId)},\n visibility_scope = ${sqlQuote(session.visibilityScope)},\n context_policy = ${sqlQuote(session.contextPolicy)},\n workflow_id = ${sqlText(session.workflowId)},\n browser = ${sqlText(session.browser)},\n companion_id = ${sqlText(session.companionId)},\n profile_id = ${sqlText(session.profileId)},\n window_id = ${sqlText(session.windowId)},\n tab_id = ${sqlText(session.tabId)},\n title = ${sqlQuote(session.title)},\n status = ${sqlQuote(session.status)},\n actions_json = ${sqlJson(session.actions)},\n current_action_index = ${sqlInteger(session.currentActionIndex)},\n awaiting_confirmation_for_action_id = ${sqlText(session.awaitingConfirmationForActionId)},\n result_json = ${sqlJson(session.result)},\n metadata_json = ${sqlJson(session.metadata)},\n updated_at = ${sqlQuote(session.updatedAt)},\n finished_at = ${sqlText(session.finishedAt)}\n WHERE id = ${sqlQuote(session.id)}\n AND agent_id = ${sqlQuote(session.agentId)}`,\n );\n }\n\n async getBrowserSession(\n agentId: string,\n sessionId: string,\n ): Promise<LifeOpsBrowserSession | null> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_workflow_browser_sessions\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(sessionId)}\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parseBrowserSession(row) : null;\n }\n\n async listBrowserSessions(agentId: string): Promise<LifeOpsBrowserSession[]> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_workflow_browser_sessions\n WHERE agent_id = ${sqlQuote(agentId)}\n ORDER BY updated_at DESC, created_at DESC`,\n );\n return rows.map(parseBrowserSession);\n }\n\n async getBrowserSettings(\n agentId: string,\n ): Promise<BrowserBridgeSettings | null> {\n const settingsTable = await resolveBrowserBridgeTable(\n this.runtime,\n \"settings\",\n );\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM ${settingsTable}\n WHERE agent_id = ${sqlQuote(agentId)}\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parseBrowserSettings(row) : null;\n }\n\n async upsertBrowserSettings(\n agentId: string,\n settings: BrowserBridgeSettings,\n ): Promise<void> {\n const createdAt = settings.updatedAt ?? isoNow();\n const settingsTable = await resolveBrowserBridgeTable(\n this.runtime,\n \"settings\",\n );\n await executeRawSql(\n this.runtime,\n `INSERT INTO ${settingsTable} (\n agent_id, enabled, tracking_mode, allow_browser_control,\n require_confirmation_for_account_affecting, incognito_enabled,\n site_access_mode, granted_origins_json, blocked_origins_json,\n max_remembered_tabs, pause_until, metadata_json, created_at, updated_at\n ) VALUES (\n ${sqlQuote(agentId)},\n ${sqlBoolean(settings.enabled)},\n ${sqlQuote(settings.trackingMode)},\n ${sqlBoolean(settings.allowBrowserControl)},\n ${sqlBoolean(settings.requireConfirmationForAccountAffecting)},\n ${sqlBoolean(settings.incognitoEnabled)},\n ${sqlQuote(settings.siteAccessMode)},\n ${sqlJson(settings.grantedOrigins)},\n ${sqlJson(settings.blockedOrigins)},\n ${sqlInteger(settings.maxRememberedTabs)},\n ${sqlText(settings.pauseUntil)},\n ${sqlJson(settings.metadata)},\n ${sqlQuote(createdAt)},\n ${sqlQuote(settings.updatedAt ?? createdAt)}\n )\n ON CONFLICT(agent_id) DO UPDATE SET\n enabled = excluded.enabled,\n tracking_mode = excluded.tracking_mode,\n allow_browser_control = excluded.allow_browser_control,\n require_confirmation_for_account_affecting = excluded.require_confirmation_for_account_affecting,\n incognito_enabled = excluded.incognito_enabled,\n site_access_mode = excluded.site_access_mode,\n granted_origins_json = excluded.granted_origins_json,\n blocked_origins_json = excluded.blocked_origins_json,\n max_remembered_tabs = excluded.max_remembered_tabs,\n pause_until = excluded.pause_until,\n metadata_json = excluded.metadata_json,\n updated_at = excluded.updated_at`,\n );\n }\n\n async getBrowserCompanionByProfile(\n agentId: string,\n browser: BrowserBridgeCompanionStatus[\"browser\"],\n profileId: string,\n ): Promise<BrowserBridgeCompanionStatus | null> {\n const companionsTable = await resolveBrowserBridgeTable(\n this.runtime,\n \"companions\",\n );\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM ${companionsTable}\n WHERE agent_id = ${sqlQuote(agentId)}\n AND browser = ${sqlQuote(browser)}\n AND profile_id = ${sqlQuote(profileId)}\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parseBrowserCompanion(row) : null;\n }\n\n async getBrowserCompanionCredential(\n agentId: string,\n companionId: string,\n ): Promise<BrowserCompanionCredential | null> {\n const companionsTable = await resolveBrowserBridgeTable(\n this.runtime,\n \"companions\",\n );\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM ${companionsTable}\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(companionId)}\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parseBrowserCompanionCredential(row) : null;\n }\n\n async upsertBrowserCompanion(\n companion: BrowserBridgeCompanionStatus,\n ): Promise<void> {\n const companionsTable = await resolveBrowserBridgeTable(\n this.runtime,\n \"companions\",\n );\n await executeRawSql(\n this.runtime,\n `INSERT INTO ${companionsTable} (\n id, agent_id, browser, profile_id, profile_label, label,\n extension_version, connection_state, permissions_json, last_seen_at,\n paired_at, metadata_json, created_at, updated_at\n ) VALUES (\n ${sqlQuote(companion.id)},\n ${sqlQuote(companion.agentId)},\n ${sqlQuote(companion.browser)},\n ${sqlQuote(companion.profileId)},\n ${sqlQuote(companion.profileLabel)},\n ${sqlQuote(companion.label)},\n ${sqlText(companion.extensionVersion)},\n ${sqlQuote(companion.connectionState)},\n ${sqlJson(companion.permissions)},\n ${sqlText(companion.lastSeenAt)},\n ${sqlText(companion.pairedAt)},\n ${sqlJson(companion.metadata)},\n ${sqlQuote(companion.createdAt)},\n ${sqlQuote(companion.updatedAt)}\n )\n ON CONFLICT(agent_id, browser, profile_id) DO UPDATE SET\n profile_label = excluded.profile_label,\n label = excluded.label,\n extension_version = excluded.extension_version,\n connection_state = excluded.connection_state,\n permissions_json = excluded.permissions_json,\n last_seen_at = excluded.last_seen_at,\n paired_at = COALESCE(${companionsTable}.paired_at, excluded.paired_at),\n metadata_json = excluded.metadata_json,\n updated_at = excluded.updated_at`,\n );\n }\n\n async updateBrowserCompanionPairingToken(\n agentId: string,\n companionId: string,\n pairingTokenHash: string,\n pairingTokenExpiresAt: string | null,\n pairedAt: string,\n updatedAt: string,\n ): Promise<void> {\n const companionsTable = await resolveBrowserBridgeTable(\n this.runtime,\n \"companions\",\n );\n await executeRawSql(\n this.runtime,\n `UPDATE ${companionsTable}\n SET pairing_token_hash = ${sqlQuote(pairingTokenHash)},\n pairing_token_expires_at = ${sqlText(pairingTokenExpiresAt)},\n pairing_token_revoked_at = NULL,\n pending_pairing_token_hashes_json = '[]',\n paired_at = ${sqlQuote(pairedAt)},\n updated_at = ${sqlQuote(updatedAt)}\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(companionId)}`,\n );\n }\n\n async updateBrowserCompanionPendingPairingTokenHashes(\n agentId: string,\n companionId: string,\n pendingPairingTokenHashes: Array<\n string | { hash: string; expiresAt?: string | null }\n >,\n updatedAt: string,\n ): Promise<void> {\n const companionsTable = await resolveBrowserBridgeTable(\n this.runtime,\n \"companions\",\n );\n await executeRawSql(\n this.runtime,\n `UPDATE ${companionsTable}\n SET pending_pairing_token_hashes_json = ${sqlJson(pendingPairingTokenHashes)},\n updated_at = ${sqlQuote(updatedAt)}\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(companionId)}`,\n );\n }\n\n async promoteBrowserCompanionPendingPairingToken(\n agentId: string,\n companionId: string,\n pairingTokenHash: string,\n pendingPairingTokenHashes: Array<\n string | { hash: string; expiresAt?: string | null }\n >,\n pairingTokenExpiresAt: string | null,\n pairedAt: string,\n updatedAt: string,\n ): Promise<void> {\n const companionsTable = await resolveBrowserBridgeTable(\n this.runtime,\n \"companions\",\n );\n await executeRawSql(\n this.runtime,\n `UPDATE ${companionsTable}\n SET pairing_token_hash = ${sqlQuote(pairingTokenHash)},\n pairing_token_expires_at = ${sqlText(pairingTokenExpiresAt)},\n pairing_token_revoked_at = NULL,\n pending_pairing_token_hashes_json = ${sqlJson(pendingPairingTokenHashes)},\n paired_at = ${sqlQuote(pairedAt)},\n updated_at = ${sqlQuote(updatedAt)}\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(companionId)}`,\n );\n }\n\n async revokeBrowserCompanionPairingToken(\n agentId: string,\n companionId: string,\n revokedAt: string,\n ): Promise<void> {\n const companionsTable = await resolveBrowserBridgeTable(\n this.runtime,\n \"companions\",\n );\n await executeRawSql(\n this.runtime,\n `UPDATE ${companionsTable}\n SET pairing_token_revoked_at = ${sqlQuote(revokedAt)},\n pending_pairing_token_hashes_json = '[]',\n connection_state = 'disconnected',\n updated_at = ${sqlQuote(revokedAt)}\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(companionId)}`,\n );\n }\n\n async listBrowserCompanions(\n agentId: string,\n ): Promise<BrowserBridgeCompanionStatus[]> {\n const companionsTable = await resolveBrowserBridgeTable(\n this.runtime,\n \"companions\",\n );\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM ${companionsTable}\n WHERE agent_id = ${sqlQuote(agentId)}\n ORDER BY browser ASC, profile_label ASC, label ASC`,\n );\n return rows.map(parseBrowserCompanion);\n }\n\n async upsertBrowserTab(tab: BrowserBridgeTabSummary): Promise<void> {\n const tabsTable = await resolveBrowserBridgeTable(this.runtime, \"tabs\");\n await executeRawSql(\n this.runtime,\n `INSERT INTO ${tabsTable} (\n id, agent_id, companion_id, browser, profile_id, window_id, tab_id,\n url, title, active_in_window, focused_window, focused_active,\n incognito, favicon_url, last_seen_at, last_focused_at, metadata_json,\n created_at, updated_at\n ) VALUES (\n ${sqlQuote(tab.id)},\n ${sqlQuote(tab.agentId)},\n ${sqlText(tab.companionId)},\n ${sqlQuote(tab.browser)},\n ${sqlQuote(tab.profileId)},\n ${sqlQuote(tab.windowId)},\n ${sqlQuote(tab.tabId)},\n ${sqlQuote(tab.url)},\n ${sqlQuote(tab.title)},\n ${sqlBoolean(tab.activeInWindow)},\n ${sqlBoolean(tab.focusedWindow)},\n ${sqlBoolean(tab.focusedActive)},\n ${sqlBoolean(tab.incognito)},\n ${sqlText(tab.faviconUrl)},\n ${sqlQuote(tab.lastSeenAt)},\n ${sqlText(tab.lastFocusedAt)},\n ${sqlJson(tab.metadata)},\n ${sqlQuote(tab.createdAt)},\n ${sqlQuote(tab.updatedAt)}\n )\n ON CONFLICT(agent_id, browser, profile_id, window_id, tab_id) DO UPDATE SET\n companion_id = excluded.companion_id,\n url = excluded.url,\n title = excluded.title,\n active_in_window = excluded.active_in_window,\n focused_window = excluded.focused_window,\n focused_active = excluded.focused_active,\n incognito = excluded.incognito,\n favicon_url = excluded.favicon_url,\n last_seen_at = excluded.last_seen_at,\n last_focused_at = excluded.last_focused_at,\n metadata_json = excluded.metadata_json,\n updated_at = excluded.updated_at`,\n );\n }\n\n async listBrowserTabs(agentId: string): Promise<BrowserBridgeTabSummary[]> {\n const tabsTable = await resolveBrowserBridgeTable(this.runtime, \"tabs\");\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM ${tabsTable}\n WHERE agent_id = ${sqlQuote(agentId)}\n ORDER BY focused_active DESC,\n active_in_window DESC,\n COALESCE(last_focused_at, last_seen_at) DESC,\n updated_at DESC`,\n );\n return rows.map(parseBrowserTabSummary);\n }\n\n async deleteBrowserTabsByIds(agentId: string, ids: string[]): Promise<void> {\n if (ids.length === 0) return;\n const values = ids.map((id) => sqlQuote(id)).join(\", \");\n const tabsTable = await resolveBrowserBridgeTable(this.runtime, \"tabs\");\n await executeRawSql(\n this.runtime,\n `DELETE FROM ${tabsTable}\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id IN (${values})`,\n );\n }\n\n async deleteAllBrowserTabs(agentId: string): Promise<void> {\n const tabsTable = await resolveBrowserBridgeTable(this.runtime, \"tabs\");\n await executeRawSql(\n this.runtime,\n `DELETE FROM ${tabsTable}\n WHERE agent_id = ${sqlQuote(agentId)}`,\n );\n }\n\n async upsertBrowserPageContext(\n context: BrowserBridgePageContext,\n ): Promise<void> {\n const pageContextsTable = await resolveBrowserBridgeTable(\n this.runtime,\n \"pageContexts\",\n );\n await executeRawSql(\n this.runtime,\n `INSERT INTO ${pageContextsTable} (\n id, agent_id, browser, profile_id, window_id, tab_id, url, title,\n selection_text, main_text, headings_json, links_json, forms_json,\n captured_at, metadata_json\n ) VALUES (\n ${sqlQuote(context.id)},\n ${sqlQuote(context.agentId)},\n ${sqlQuote(context.browser)},\n ${sqlQuote(context.profileId)},\n ${sqlQuote(context.windowId)},\n ${sqlQuote(context.tabId)},\n ${sqlQuote(context.url)},\n ${sqlQuote(context.title)},\n ${sqlText(context.selectionText)},\n ${sqlText(context.mainText)},\n ${sqlJson(context.headings)},\n ${sqlJson(context.links)},\n ${sqlJson(context.forms)},\n ${sqlQuote(context.capturedAt)},\n ${sqlJson(context.metadata)}\n )\n ON CONFLICT(agent_id, browser, profile_id, window_id, tab_id) DO UPDATE SET\n url = excluded.url,\n title = excluded.title,\n selection_text = excluded.selection_text,\n main_text = excluded.main_text,\n headings_json = excluded.headings_json,\n links_json = excluded.links_json,\n forms_json = excluded.forms_json,\n captured_at = excluded.captured_at,\n metadata_json = excluded.metadata_json`,\n );\n }\n\n async listBrowserPageContexts(\n agentId: string,\n ): Promise<BrowserBridgePageContext[]> {\n const pageContextsTable = await resolveBrowserBridgeTable(\n this.runtime,\n \"pageContexts\",\n );\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM ${pageContextsTable}\n WHERE agent_id = ${sqlQuote(agentId)}\n ORDER BY captured_at DESC`,\n );\n return rows.map(parseBrowserPageContext);\n }\n\n async deleteBrowserPageContextsByIds(\n agentId: string,\n ids: string[],\n ): Promise<void> {\n if (ids.length === 0) return;\n const values = ids.map((id) => sqlQuote(id)).join(\", \");\n const pageContextsTable = await resolveBrowserBridgeTable(\n this.runtime,\n \"pageContexts\",\n );\n await executeRawSql(\n this.runtime,\n `DELETE FROM ${pageContextsTable}\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id IN (${values})`,\n );\n }\n\n async deleteAllBrowserPageContexts(agentId: string): Promise<void> {\n const pageContextsTable = await resolveBrowserBridgeTable(\n this.runtime,\n \"pageContexts\",\n );\n await executeRawSql(\n this.runtime,\n `DELETE FROM ${pageContextsTable}\n WHERE agent_id = ${sqlQuote(agentId)}`,\n );\n }\n\n async deleteBrowserSession(\n agentId: string,\n sessionId: string,\n ): Promise<void> {\n await executeRawSql(\n this.runtime,\n `DELETE FROM app_lifeops.life_workflow_browser_sessions\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(sessionId)}`,\n );\n }\n\n // ---------------------------------------------------------------------------\n // Escalation state persistence\n // ---------------------------------------------------------------------------\n\n async upsertEscalationState(state: {\n id: string;\n agentId: string;\n reason: string;\n text: string;\n currentStep: number;\n channelsSent: string[];\n startedAt: string;\n lastSentAt: string;\n resolved: boolean;\n resolvedAt?: string | null;\n metadata?: Record<string, unknown>;\n }): Promise<void> {\n const now = isoNow();\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_reminders.life_escalation_states (\n id, agent_id, reason, text, current_step,\n channels_sent_json, started_at, last_sent_at,\n resolved, resolved_at, metadata_json,\n created_at, updated_at\n ) VALUES (\n ${sqlQuote(state.id)},\n ${sqlQuote(state.agentId)},\n ${sqlQuote(state.reason)},\n ${sqlQuote(state.text)},\n ${sqlInteger(state.currentStep)},\n ${sqlJson(state.channelsSent)},\n ${sqlQuote(state.startedAt)},\n ${sqlQuote(state.lastSentAt)},\n ${sqlBoolean(state.resolved)},\n ${sqlText(state.resolvedAt)},\n ${sqlJson(state.metadata ?? {})},\n ${sqlQuote(now)},\n ${sqlQuote(now)}\n )\n ON CONFLICT(id) DO UPDATE SET\n reason = excluded.reason,\n text = excluded.text,\n current_step = excluded.current_step,\n channels_sent_json = excluded.channels_sent_json,\n last_sent_at = excluded.last_sent_at,\n resolved = excluded.resolved,\n resolved_at = excluded.resolved_at,\n metadata_json = excluded.metadata_json,\n updated_at = excluded.updated_at`,\n );\n }\n\n async getActiveEscalationState(\n agentId: string,\n ): Promise<LifeOpsEscalationStateRow | null> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_reminders.life_escalation_states\n WHERE agent_id = ${sqlQuote(agentId)}\n AND resolved = FALSE\n ORDER BY started_at DESC\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parseEscalationStateRow(row) : null;\n }\n\n async resolveEscalationState(id: string, resolvedAt: string): Promise<void> {\n const now = isoNow();\n await executeRawSql(\n this.runtime,\n `UPDATE app_reminders.life_escalation_states\n SET resolved = TRUE,\n resolved_at = ${sqlQuote(resolvedAt)},\n updated_at = ${sqlQuote(now)}\n WHERE id = ${sqlQuote(id)}`,\n );\n }\n\n async listRecentEscalationStates(\n agentId: string,\n limit = 10,\n ): Promise<LifeOpsEscalationStateRow[]> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_reminders.life_escalation_states\n WHERE agent_id = ${sqlQuote(agentId)}\n ORDER BY started_at DESC\n LIMIT ${sqlInteger(limit)}`,\n );\n return rows.map(parseEscalationStateRow);\n }\n\n async deleteAllEscalationStates(agentId: string): Promise<void> {\n await executeRawSql(\n this.runtime,\n `DELETE FROM app_reminders.life_escalation_states\n WHERE agent_id = ${sqlQuote(agentId)}`,\n );\n }\n\n // -----------------------------------------------------------------------\n // Relationship interactions (per-edge audit log; keyed by graph entityId).\n // Contacts themselves live in the runtime knowledge graph\n // (EntityStore / RelationshipStore) — there is no life_relationships table.\n // -----------------------------------------------------------------------\n\n async logRelationshipInteraction(\n interaction: LifeOpsRelationshipInteraction,\n ): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_relationship_interactions (\n id, agent_id, relationship_id, channel, direction, summary,\n occurred_at, metadata_json, created_at\n ) VALUES (\n ${sqlQuote(interaction.id)},\n ${sqlQuote(interaction.agentId)},\n ${sqlQuote(interaction.relationshipId)},\n ${sqlQuote(interaction.channel)},\n ${sqlQuote(interaction.direction)},\n ${sqlQuote(interaction.summary)},\n ${sqlQuote(interaction.occurredAt)},\n ${sqlJson(interaction.metadata)},\n ${sqlQuote(interaction.createdAt)}\n )`,\n );\n }\n\n // -----------------------------------------------------------------------\n // X (Twitter) DMs, feed items, and sync state\n // -----------------------------------------------------------------------\n\n async upsertXDm(dm: LifeOpsXDm): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_x_dms (\n id, agent_id, external_dm_id, conversation_id, sender_handle, sender_id,\n is_inbound, text, received_at, read_at, replied_at, metadata_json,\n synced_at, updated_at\n ) VALUES (\n ${sqlQuote(dm.id)},\n ${sqlQuote(dm.agentId)},\n ${sqlQuote(dm.externalDmId)},\n ${sqlQuote(dm.conversationId)},\n ${sqlQuote(dm.senderHandle)},\n ${sqlQuote(dm.senderId)},\n ${sqlBoolean(dm.isInbound)},\n ${sqlQuote(dm.text)},\n ${sqlQuote(dm.receivedAt)},\n ${sqlText(dm.readAt)},\n ${sqlText(dm.repliedAt)},\n ${sqlJson(dm.metadata)},\n ${sqlQuote(dm.syncedAt)},\n ${sqlQuote(dm.updatedAt)}\n )\n ON CONFLICT(agent_id, external_dm_id) DO UPDATE SET\n conversation_id = excluded.conversation_id,\n sender_handle = excluded.sender_handle,\n sender_id = excluded.sender_id,\n is_inbound = excluded.is_inbound,\n text = excluded.text,\n received_at = excluded.received_at,\n read_at = COALESCE(excluded.read_at, app_lifeops.life_x_dms.read_at),\n replied_at = COALESCE(excluded.replied_at, app_lifeops.life_x_dms.replied_at),\n metadata_json = excluded.metadata_json,\n synced_at = excluded.synced_at,\n updated_at = excluded.updated_at`,\n );\n }\n\n async listXDms(\n agentId: string,\n opts: { conversationId?: string; limit?: number } = {},\n ): Promise<LifeOpsXDm[]> {\n const DEFAULT_LIMIT = 100;\n const limit =\n opts.limit !== undefined && Number.isFinite(opts.limit)\n ? opts.limit\n : DEFAULT_LIMIT;\n const conversationClause = opts.conversationId\n ? `AND conversation_id = ${sqlQuote(opts.conversationId)}`\n : \"\";\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_x_dms\n WHERE agent_id = ${sqlQuote(agentId)}\n ${conversationClause}\n ORDER BY received_at DESC\n LIMIT ${sqlInteger(limit)}`,\n );\n return rows.map(parseXDm);\n }\n\n async upsertXFeedItem(item: LifeOpsXFeedItem): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_x_feed_items (\n id, agent_id, external_tweet_id, author_handle, author_id, text,\n created_at_source, feed_type, metadata_json, synced_at, updated_at\n ) VALUES (\n ${sqlQuote(item.id)},\n ${sqlQuote(item.agentId)},\n ${sqlQuote(item.externalTweetId)},\n ${sqlQuote(item.authorHandle)},\n ${sqlQuote(item.authorId)},\n ${sqlQuote(item.text)},\n ${sqlQuote(item.createdAtSource)},\n ${sqlQuote(item.feedType)},\n ${sqlJson(item.metadata)},\n ${sqlQuote(item.syncedAt)},\n ${sqlQuote(item.updatedAt)}\n )\n ON CONFLICT(agent_id, external_tweet_id, feed_type) DO UPDATE SET\n author_handle = excluded.author_handle,\n author_id = excluded.author_id,\n text = excluded.text,\n created_at_source = excluded.created_at_source,\n metadata_json = excluded.metadata_json,\n synced_at = excluded.synced_at,\n updated_at = excluded.updated_at`,\n );\n }\n\n async listXFeedItems(\n agentId: string,\n feedType: LifeOpsXFeedType,\n opts: { limit?: number } = {},\n ): Promise<LifeOpsXFeedItem[]> {\n const DEFAULT_LIMIT = 100;\n const limit =\n opts.limit !== undefined && Number.isFinite(opts.limit)\n ? opts.limit\n : DEFAULT_LIMIT;\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_x_feed_items\n WHERE agent_id = ${sqlQuote(agentId)}\n AND feed_type = ${sqlQuote(feedType)}\n ORDER BY created_at_source DESC\n LIMIT ${sqlInteger(limit)}`,\n );\n return rows.map(parseXFeedItem);\n }\n\n async upsertXSyncState(state: LifeOpsXSyncState): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_x_sync_states (\n id, agent_id, feed_type, last_cursor, synced_at, updated_at\n ) VALUES (\n ${sqlQuote(state.id)},\n ${sqlQuote(state.agentId)},\n ${sqlQuote(state.feedType)},\n ${sqlText(state.lastCursor)},\n ${sqlQuote(state.syncedAt)},\n ${sqlQuote(state.updatedAt)}\n )\n ON CONFLICT(agent_id, feed_type) DO UPDATE SET\n last_cursor = excluded.last_cursor,\n synced_at = excluded.synced_at,\n updated_at = excluded.updated_at`,\n );\n }\n\n async getXSyncState(\n agentId: string,\n feedType: LifeOpsXFeedType,\n ): Promise<LifeOpsXSyncState | null> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_x_sync_states\n WHERE agent_id = ${sqlQuote(agentId)}\n AND feed_type = ${sqlQuote(feedType)}\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parseXSyncState(row) : null;\n }\n\n // -----------------------------------------------------------------------\n // Screen time — per-app and per-website dwell sessions + daily rollups\n // -----------------------------------------------------------------------\n\n async upsertScreenTimeSession(\n session: LifeOpsScreenTimeSession,\n ): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_screen_time_sessions (\n id, agent_id, source, identifier, display_name, start_at, end_at,\n duration_seconds, is_active, metadata_json, created_at, updated_at\n ) VALUES (\n ${sqlQuote(session.id)},\n ${sqlQuote(session.agentId)},\n ${sqlQuote(session.source)},\n ${sqlQuote(session.identifier)},\n ${sqlQuote(session.displayName)},\n ${sqlQuote(session.startAt)},\n ${sqlText(session.endAt)},\n ${sqlInteger(session.durationSeconds)},\n ${sqlBoolean(session.isActive)},\n ${sqlJson(session.metadata)},\n ${sqlQuote(session.createdAt)},\n ${sqlQuote(session.updatedAt)}\n )\n ON CONFLICT (id) DO UPDATE SET\n source = EXCLUDED.source,\n identifier = EXCLUDED.identifier,\n display_name = EXCLUDED.display_name,\n start_at = EXCLUDED.start_at,\n end_at = EXCLUDED.end_at,\n duration_seconds = EXCLUDED.duration_seconds,\n is_active = EXCLUDED.is_active,\n metadata_json = EXCLUDED.metadata_json,\n updated_at = EXCLUDED.updated_at`,\n );\n }\n\n async getScreenTimeSession(\n agentId: string,\n id: string,\n ): Promise<LifeOpsScreenTimeSession | null> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_screen_time_sessions\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(id)}\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parseScreenTimeSession(row) : null;\n }\n\n async finishScreenTimeSession(\n agentId: string,\n id: string,\n endAt: string,\n durationSeconds: number,\n ): Promise<void> {\n const now = isoNow();\n await executeRawSql(\n this.runtime,\n `UPDATE app_lifeops.life_screen_time_sessions\n SET end_at = ${sqlQuote(endAt)},\n duration_seconds = ${sqlInteger(durationSeconds)},\n is_active = ${sqlBoolean(false)},\n updated_at = ${sqlQuote(now)}\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(id)}`,\n );\n }\n\n async listScreenTimeSessionsBetween(\n agentId: string,\n start: string,\n end: string,\n opts?: { source?: string; limit?: number },\n ): Promise<LifeOpsScreenTimeSession[]> {\n const clauses = [\n `agent_id = ${sqlQuote(agentId)}`,\n `start_at >= ${sqlQuote(start)}`,\n `start_at < ${sqlQuote(end)}`,\n ];\n if (opts?.source) {\n clauses.push(`source = ${sqlQuote(opts.source)}`);\n }\n const limitClause =\n typeof opts?.limit === \"number\" ? `LIMIT ${sqlInteger(opts.limit)}` : \"\";\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_screen_time_sessions\n WHERE ${clauses.join(\" AND \")}\n ORDER BY start_at ASC\n ${limitClause}`,\n );\n return rows.map(parseScreenTimeSession);\n }\n\n async listScreenTimeSessionsOverlapping(\n agentId: string,\n start: string,\n end: string,\n opts?: { source?: string; limit?: number },\n ): Promise<LifeOpsScreenTimeSession[]> {\n const clauses = [\n `agent_id = ${sqlQuote(agentId)}`,\n `start_at < ${sqlQuote(end)}`,\n `(end_at IS NULL OR end_at > ${sqlQuote(start)})`,\n ];\n if (opts?.source) {\n clauses.push(`source = ${sqlQuote(opts.source)}`);\n }\n const limitClause =\n typeof opts?.limit === \"number\" ? `LIMIT ${sqlInteger(opts.limit)}` : \"\";\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_screen_time_sessions\n WHERE ${clauses.join(\" AND \")}\n ORDER BY start_at ASC\n ${limitClause}`,\n );\n return rows.map(parseScreenTimeSession);\n }\n\n async upsertScreenTimeDaily(row: LifeOpsScreenTimeDaily): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_screen_time_daily (\n id, agent_id, source, identifier, date, total_seconds, session_count,\n metadata_json, created_at, updated_at\n ) VALUES (\n ${sqlQuote(row.id)},\n ${sqlQuote(row.agentId)},\n ${sqlQuote(row.source)},\n ${sqlQuote(row.identifier)},\n ${sqlQuote(row.date)},\n ${sqlInteger(row.totalSeconds)},\n ${sqlInteger(row.sessionCount)},\n ${sqlJson(row.metadata)},\n ${sqlQuote(row.createdAt)},\n ${sqlQuote(row.updatedAt)}\n )\n ON CONFLICT (agent_id, source, identifier, date) DO UPDATE SET\n total_seconds = EXCLUDED.total_seconds,\n session_count = EXCLUDED.session_count,\n metadata_json = EXCLUDED.metadata_json,\n updated_at = EXCLUDED.updated_at`,\n );\n }\n\n async upsertScheduleInsight(\n insight: LifeOpsScheduleInsightRecord,\n ): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_schedule_insights (\n id, agent_id, effective_day_key, local_date, timezone, inferred_at,\n circadian_state, state_confidence, uncertainty_reason, sleep_status,\n sleep_confidence,\n current_sleep_started_at, last_sleep_started_at, last_sleep_ended_at,\n last_sleep_duration_minutes, wake_at, first_active_at, last_active_at,\n last_meal_at,\n next_meal_label, next_meal_window_start_at, next_meal_window_end_at,\n next_meal_confidence, meals_json, awake_probability_json,\n regularity_json, baseline_json, circadian_rule_firings_json,\n metadata_json, created_at, updated_at\n ) VALUES (\n ${sqlQuote(insight.id)},\n ${sqlQuote(insight.agentId)},\n ${sqlQuote(insight.effectiveDayKey)},\n ${sqlQuote(insight.localDate)},\n ${sqlQuote(insight.timezone)},\n ${sqlQuote(insight.inferredAt)},\n ${sqlQuote(insight.circadianState)},\n ${sqlNumber(insight.stateConfidence)},\n ${sqlText(insight.uncertaintyReason)},\n ${sqlQuote(insight.sleepStatus)},\n ${sqlNumber(insight.sleepConfidence)},\n ${sqlText(insight.currentSleepStartedAt)},\n ${sqlText(insight.lastSleepStartedAt)},\n ${sqlText(insight.lastSleepEndedAt)},\n ${sqlInteger(insight.lastSleepDurationMinutes)},\n ${sqlText(insight.wakeAt)},\n ${sqlText(insight.firstActiveAt)},\n ${sqlText(insight.lastActiveAt)},\n ${sqlText(insight.lastMealAt)},\n ${sqlText(insight.nextMealLabel)},\n ${sqlText(insight.nextMealWindowStartAt)},\n ${sqlText(insight.nextMealWindowEndAt)},\n ${sqlNumber(insight.nextMealConfidence)},\n ${sqlJson(insight.meals)},\n ${sqlJson(insight.awakeProbability)},\n ${sqlJson(insight.regularity)},\n ${sqlJson(insight.baseline)},\n ${sqlJson(insight.circadianRuleFirings)},\n ${sqlJson(insight.metadata)},\n ${sqlQuote(insight.createdAt)},\n ${sqlQuote(insight.updatedAt)}\n )\n ON CONFLICT(agent_id, effective_day_key) DO UPDATE SET\n local_date = EXCLUDED.local_date,\n timezone = EXCLUDED.timezone,\n inferred_at = EXCLUDED.inferred_at,\n circadian_state = EXCLUDED.circadian_state,\n state_confidence = EXCLUDED.state_confidence,\n uncertainty_reason = EXCLUDED.uncertainty_reason,\n sleep_status = EXCLUDED.sleep_status,\n sleep_confidence = EXCLUDED.sleep_confidence,\n current_sleep_started_at = EXCLUDED.current_sleep_started_at,\n last_sleep_started_at = EXCLUDED.last_sleep_started_at,\n last_sleep_ended_at = EXCLUDED.last_sleep_ended_at,\n last_sleep_duration_minutes = EXCLUDED.last_sleep_duration_minutes,\n wake_at = EXCLUDED.wake_at,\n first_active_at = EXCLUDED.first_active_at,\n last_active_at = EXCLUDED.last_active_at,\n last_meal_at = EXCLUDED.last_meal_at,\n next_meal_label = EXCLUDED.next_meal_label,\n next_meal_window_start_at = EXCLUDED.next_meal_window_start_at,\n next_meal_window_end_at = EXCLUDED.next_meal_window_end_at,\n next_meal_confidence = EXCLUDED.next_meal_confidence,\n meals_json = EXCLUDED.meals_json,\n awake_probability_json = EXCLUDED.awake_probability_json,\n regularity_json = EXCLUDED.regularity_json,\n baseline_json = EXCLUDED.baseline_json,\n circadian_rule_firings_json = EXCLUDED.circadian_rule_firings_json,\n metadata_json = EXCLUDED.metadata_json,\n updated_at = EXCLUDED.updated_at`,\n );\n }\n\n /**\n * Insert a telemetry event with content-hash dedupe. Returns `true` when a\n * new row was written, `false` when the `(agent_id, dedupe_key)` pair\n * already existed. See `telemetry-event-families.md` §5 for the derivation\n * of `dedupeKey`.\n */\n async insertTelemetryEvent(event: LifeOpsTelemetryEvent): Promise<boolean> {\n const rows = await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_telemetry_events (\n id, agent_id, family, occurred_at, ingested_at, dedupe_key,\n source_reliability, payload_json\n ) VALUES (\n ${sqlQuote(event.id)},\n ${sqlQuote(event.agentId)},\n ${sqlQuote(event.family)},\n ${sqlQuote(event.occurredAt)},\n ${sqlQuote(event.ingestedAt)},\n ${sqlQuote(event.dedupeKey)},\n ${sqlNumber(event.sourceReliability)},\n ${sqlJson(event.payload)}\n )\n ON CONFLICT(agent_id, dedupe_key) DO NOTHING\n RETURNING id`,\n );\n return rows.length > 0;\n }\n\n async listTelemetryEvents(args: {\n agentId: string;\n familyIn?: LifeOpsTelemetryFamily[];\n sinceIso?: string;\n untilIso?: string;\n limit?: number;\n }): Promise<LifeOpsTelemetryEvent[]> {\n const clauses = [`agent_id = ${sqlQuote(args.agentId)}`];\n if (args.familyIn && args.familyIn.length > 0) {\n const inList = args.familyIn.map((family) => sqlQuote(family)).join(\", \");\n clauses.push(`family IN (${inList})`);\n }\n if (args.sinceIso) {\n clauses.push(`occurred_at >= ${sqlQuote(args.sinceIso)}`);\n }\n if (args.untilIso) {\n clauses.push(`occurred_at <= ${sqlQuote(args.untilIso)}`);\n }\n const limitClause =\n typeof args.limit === \"number\" ? `LIMIT ${sqlInteger(args.limit)}` : \"\";\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_telemetry_events\n WHERE ${clauses.join(\" AND \")}\n ORDER BY occurred_at ASC\n ${limitClause}`,\n );\n return rows.map(parseTelemetryEventRow);\n }\n\n /**\n * Delete telemetry rows older than the retention window. Callers should\n * prune daily via the scheduler. Daily rollups in\n * `app_lifeops.life_telemetry_rollup_daily` are retained indefinitely.\n */\n async pruneTelemetryEvents(args: {\n agentId: string;\n retentionDays: number;\n }): Promise<{ deletedCount: number }> {\n const cutoff = new Date(\n Date.now() - args.retentionDays * 24 * 60 * 60 * 1_000,\n ).toISOString();\n const rows = await executeRawSql(\n this.runtime,\n `DELETE FROM app_lifeops.life_telemetry_events\n WHERE agent_id = ${sqlQuote(args.agentId)}\n AND occurred_at < ${sqlQuote(cutoff)}\n RETURNING id`,\n );\n return { deletedCount: rows.length };\n }\n\n /**\n * Roll up raw telemetry events within `[sinceIso, untilIso)` into daily\n * per-family aggregates. Upserts per (agent, family, local_date). Callers\n * should run this before `pruneTelemetryEvents` so the 60-day retention\n * cutoff doesn't drop un-aggregated history.\n *\n * The bucket key (`local_date`) is the UTC date of `occurred_at` — local\n * timezone bucketing would require per-agent TZ, which higher-level callers\n * can project off the merged schedule state when they need it.\n */\n async upsertTelemetryDailyRollup(args: {\n agentId: string;\n sinceIso: string;\n untilIso: string;\n }): Promise<{ bucketsWritten: number }> {\n const nowIso = new Date().toISOString();\n const rows = await executeRawSql(\n this.runtime,\n `SELECT family,\n SUBSTR(occurred_at, 1, 10) AS local_date,\n COUNT(*) AS event_count,\n MAX(occurred_at) AS last_observed_at\n FROM app_lifeops.life_telemetry_events\n WHERE agent_id = ${sqlQuote(args.agentId)}\n AND occurred_at >= ${sqlQuote(args.sinceIso)}\n AND occurred_at < ${sqlQuote(args.untilIso)}\n GROUP BY family, SUBSTR(occurred_at, 1, 10)`,\n );\n let bucketsWritten = 0;\n for (const row of rows) {\n const family = toText(row.family);\n const localDate = toText(row.local_date);\n const eventCount = Number(row.event_count ?? 0);\n const lastObservedAt = toText(row.last_observed_at);\n if (!family || !localDate || !lastObservedAt) continue;\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_telemetry_rollup_daily (\n agent_id, family, local_date, event_count,\n last_observed_at, created_at, updated_at\n ) VALUES (\n ${sqlQuote(args.agentId)},\n ${sqlQuote(family)},\n ${sqlQuote(localDate)},\n ${sqlInteger(eventCount)},\n ${sqlQuote(lastObservedAt)},\n ${sqlQuote(nowIso)},\n ${sqlQuote(nowIso)}\n )\n ON CONFLICT(agent_id, family, local_date) DO UPDATE SET\n event_count = EXCLUDED.event_count,\n last_observed_at = EXCLUDED.last_observed_at,\n updated_at = EXCLUDED.updated_at`,\n );\n bucketsWritten += 1;\n }\n return { bucketsWritten };\n }\n\n async readCircadianState(\n agentId: string,\n ): Promise<LifeOpsCircadianStateRow | null> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_circadian_states\n WHERE agent_id = ${sqlQuote(agentId)}\n LIMIT 1`,\n );\n return rows[0] ? parseCircadianStateRow(rows[0]) : null;\n }\n\n async upsertCircadianState(state: LifeOpsCircadianStateRow): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_circadian_states (\n agent_id, circadian_state, state_confidence, uncertainty_reason,\n entered_at, since_sleep_detected_at, since_wake_observed_at,\n since_wake_confirmed_at, evidence_refs_json, created_at, updated_at\n ) VALUES (\n ${sqlQuote(state.agentId)},\n ${sqlQuote(state.circadianState)},\n ${sqlNumber(state.stateConfidence)},\n ${sqlText(state.uncertaintyReason)},\n ${sqlQuote(state.enteredAt)},\n ${sqlText(state.sinceSleepDetectedAt)},\n ${sqlText(state.sinceWakeObservedAt)},\n ${sqlText(state.sinceWakeConfirmedAt)},\n ${sqlJson(state.evidenceRefs)},\n ${sqlQuote(state.createdAt)},\n ${sqlQuote(state.updatedAt)}\n )\n ON CONFLICT(agent_id) DO UPDATE SET\n circadian_state = EXCLUDED.circadian_state,\n state_confidence = EXCLUDED.state_confidence,\n uncertainty_reason = EXCLUDED.uncertainty_reason,\n entered_at = EXCLUDED.entered_at,\n since_sleep_detected_at = EXCLUDED.since_sleep_detected_at,\n since_wake_observed_at = EXCLUDED.since_wake_observed_at,\n since_wake_confirmed_at = EXCLUDED.since_wake_confirmed_at,\n evidence_refs_json = EXCLUDED.evidence_refs_json,\n updated_at = EXCLUDED.updated_at`,\n );\n }\n\n async upsertSleepEpisode(episode: LifeOpsSleepEpisodeRecord): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_sleep_episodes (\n id, agent_id, start_at, end_at, source, confidence, cycle_type,\n sealed, evidence_json, created_at, updated_at\n ) VALUES (\n ${sqlQuote(episode.id)},\n ${sqlQuote(episode.agentId)},\n ${sqlQuote(episode.startAt)},\n ${sqlText(episode.endAt)},\n ${sqlQuote(episode.source)},\n ${sqlNumber(episode.confidence)},\n ${sqlQuote(episode.cycleType)},\n ${sqlBoolean(episode.sealed)},\n ${sqlJson(episode.evidence)},\n ${sqlQuote(episode.createdAt)},\n ${sqlQuote(episode.updatedAt)}\n )\n ON CONFLICT(agent_id, start_at) DO UPDATE SET\n end_at = EXCLUDED.end_at,\n source = EXCLUDED.source,\n confidence = EXCLUDED.confidence,\n cycle_type = EXCLUDED.cycle_type,\n sealed = EXCLUDED.sealed,\n evidence_json = EXCLUDED.evidence_json,\n updated_at = EXCLUDED.updated_at`,\n );\n }\n\n async listSleepEpisodesBetween(\n agentId: string,\n startAt: string,\n endAt: string,\n opts?: { includeOpen?: boolean; limit?: number },\n ): Promise<LifeOpsSleepEpisodeRecord[]> {\n const clauses = [\n `agent_id = ${sqlQuote(agentId)}`,\n `(end_at IS NULL OR end_at >= ${sqlQuote(startAt)})`,\n `start_at <= ${sqlQuote(endAt)}`,\n ];\n if (opts?.includeOpen !== true) {\n clauses.push(\"sealed = TRUE\");\n }\n const limitClause =\n typeof opts?.limit === \"number\" ? `LIMIT ${sqlInteger(opts.limit)}` : \"\";\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_sleep_episodes\n WHERE ${clauses.join(\" AND \")}\n ORDER BY start_at ASC\n ${limitClause}`,\n );\n return rows.map(parseSleepEpisode);\n }\n\n async upsertScheduleObservation(\n observation: LifeOpsScheduleObservationRecord,\n ): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_schedule_observations (\n id, agent_id, origin, device_id, device_kind, timezone, observed_at,\n window_start_at, window_end_at, circadian_state, state_confidence,\n uncertainty_reason, meal_label, metadata_json, created_at, updated_at\n ) VALUES (\n ${sqlQuote(observation.id)},\n ${sqlQuote(observation.agentId)},\n ${sqlQuote(observation.origin)},\n ${sqlQuote(observation.deviceId)},\n ${sqlQuote(observation.deviceKind)},\n ${sqlQuote(observation.timezone)},\n ${sqlQuote(observation.observedAt)},\n ${sqlQuote(observation.windowStartAt)},\n ${sqlText(observation.windowEndAt)},\n ${sqlQuote(observation.circadianState)},\n ${sqlNumber(observation.stateConfidence)},\n ${sqlText(observation.uncertaintyReason)},\n ${sqlText(observation.mealLabel)},\n ${sqlJson(observation.metadata)},\n ${sqlQuote(observation.createdAt)},\n ${sqlQuote(observation.updatedAt)}\n )\n ON CONFLICT(id) DO UPDATE SET\n observed_at = EXCLUDED.observed_at,\n window_end_at = EXCLUDED.window_end_at,\n circadian_state = EXCLUDED.circadian_state,\n state_confidence = EXCLUDED.state_confidence,\n uncertainty_reason = EXCLUDED.uncertainty_reason,\n meal_label = EXCLUDED.meal_label,\n metadata_json = EXCLUDED.metadata_json,\n updated_at = EXCLUDED.updated_at`,\n );\n }\n\n async listScheduleObservations(\n agentId: string,\n sinceAt: string,\n opts?: {\n origin?: LifeOpsScheduleObservationRecord[\"origin\"];\n deviceId?: string;\n limit?: number;\n },\n ): Promise<LifeOpsScheduleObservationRecord[]> {\n const clauses = [\n `agent_id = ${sqlQuote(agentId)}`,\n `observed_at >= ${sqlQuote(sinceAt)}`,\n ];\n if (opts?.origin) {\n clauses.push(`origin = ${sqlQuote(opts.origin)}`);\n }\n if (opts?.deviceId) {\n clauses.push(`device_id = ${sqlQuote(opts.deviceId)}`);\n }\n const limitClause =\n typeof opts?.limit === \"number\" ? `LIMIT ${sqlInteger(opts.limit)}` : \"\";\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_schedule_observations\n WHERE ${clauses.join(\" AND \")}\n ORDER BY observed_at DESC\n ${limitClause}`,\n );\n return rows.map(parseScheduleObservation);\n }\n\n async upsertScheduleMergedState(\n state: LifeOpsScheduleMergedStateRecord,\n ): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_schedule_merged_states (\n id, agent_id, scope, effective_day_key, local_date, timezone,\n merged_at, inferred_at, circadian_state, state_confidence,\n uncertainty_reason, sleep_status, sleep_confidence,\n current_sleep_started_at, last_sleep_started_at,\n last_sleep_ended_at, last_sleep_duration_minutes,\n wake_at, first_active_at, last_active_at,\n last_meal_at, next_meal_label, next_meal_window_start_at,\n next_meal_window_end_at, next_meal_confidence, meals_json,\n awake_probability_json, regularity_json, baseline_json,\n circadian_rule_firings_json,\n observation_count, device_count, contributing_device_kinds_json,\n metadata_json, created_at, updated_at\n ) VALUES (\n ${sqlQuote(state.id)},\n ${sqlQuote(state.agentId)},\n ${sqlQuote(state.scope)},\n ${sqlQuote(state.effectiveDayKey)},\n ${sqlQuote(state.localDate)},\n ${sqlQuote(state.timezone)},\n ${sqlQuote(state.mergedAt)},\n ${sqlQuote(state.inferredAt)},\n ${sqlQuote(state.circadianState)},\n ${sqlNumber(state.stateConfidence)},\n ${sqlText(state.uncertaintyReason)},\n ${sqlQuote(state.sleepStatus)},\n ${sqlNumber(state.sleepConfidence)},\n ${sqlText(state.currentSleepStartedAt)},\n ${sqlText(state.lastSleepStartedAt)},\n ${sqlText(state.lastSleepEndedAt)},\n ${sqlInteger(state.lastSleepDurationMinutes)},\n ${sqlText(state.wakeAt)},\n ${sqlText(state.firstActiveAt)},\n ${sqlText(state.lastActiveAt)},\n ${sqlText(state.lastMealAt)},\n ${sqlText(state.nextMealLabel)},\n ${sqlText(state.nextMealWindowStartAt)},\n ${sqlText(state.nextMealWindowEndAt)},\n ${sqlNumber(state.nextMealConfidence)},\n ${sqlJson(state.meals)},\n ${sqlJson(state.awakeProbability)},\n ${sqlJson(state.regularity)},\n ${state.baseline === null ? \"NULL\" : sqlJson(state.baseline)},\n ${sqlJson(state.circadianRuleFirings)},\n ${sqlInteger(state.observationCount)},\n ${sqlInteger(state.deviceCount)},\n ${sqlJson(state.contributingDeviceKinds)},\n ${sqlJson(state.metadata)},\n ${sqlQuote(state.createdAt)},\n ${sqlQuote(state.updatedAt)}\n )\n ON CONFLICT(agent_id, scope, timezone) DO UPDATE SET\n effective_day_key = EXCLUDED.effective_day_key,\n local_date = EXCLUDED.local_date,\n merged_at = EXCLUDED.merged_at,\n inferred_at = EXCLUDED.inferred_at,\n circadian_state = EXCLUDED.circadian_state,\n state_confidence = EXCLUDED.state_confidence,\n uncertainty_reason = EXCLUDED.uncertainty_reason,\n sleep_status = EXCLUDED.sleep_status,\n sleep_confidence = EXCLUDED.sleep_confidence,\n current_sleep_started_at = EXCLUDED.current_sleep_started_at,\n last_sleep_started_at = EXCLUDED.last_sleep_started_at,\n last_sleep_ended_at = EXCLUDED.last_sleep_ended_at,\n last_sleep_duration_minutes = EXCLUDED.last_sleep_duration_minutes,\n wake_at = EXCLUDED.wake_at,\n first_active_at = EXCLUDED.first_active_at,\n last_active_at = EXCLUDED.last_active_at,\n last_meal_at = EXCLUDED.last_meal_at,\n next_meal_label = EXCLUDED.next_meal_label,\n next_meal_window_start_at = EXCLUDED.next_meal_window_start_at,\n next_meal_window_end_at = EXCLUDED.next_meal_window_end_at,\n next_meal_confidence = EXCLUDED.next_meal_confidence,\n meals_json = EXCLUDED.meals_json,\n awake_probability_json = EXCLUDED.awake_probability_json,\n regularity_json = EXCLUDED.regularity_json,\n baseline_json = EXCLUDED.baseline_json,\n circadian_rule_firings_json = EXCLUDED.circadian_rule_firings_json,\n observation_count = EXCLUDED.observation_count,\n device_count = EXCLUDED.device_count,\n contributing_device_kinds_json = EXCLUDED.contributing_device_kinds_json,\n metadata_json = EXCLUDED.metadata_json,\n updated_at = EXCLUDED.updated_at`,\n );\n }\n\n async getScheduleMergedState(\n agentId: string,\n scope: LifeOpsScheduleMergedStateRecord[\"scope\"],\n timezone: string,\n ): Promise<LifeOpsScheduleMergedStateRecord | null> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_schedule_merged_states\n WHERE agent_id = ${sqlQuote(agentId)}\n AND scope = ${sqlQuote(scope)}\n AND timezone = ${sqlQuote(timezone)}\n LIMIT 1`,\n );\n return rows[0] ? parseScheduleMergedState(rows[0]) : null;\n }\n\n async listScreenTimeDaily(\n agentId: string,\n date: string,\n opts?: { source?: string; limit?: number },\n ): Promise<LifeOpsScreenTimeDaily[]> {\n const clauses = [\n `agent_id = ${sqlQuote(agentId)}`,\n `date = ${sqlQuote(date)}`,\n ];\n if (opts?.source) {\n clauses.push(`source = ${sqlQuote(opts.source)}`);\n }\n const limitClause =\n typeof opts?.limit === \"number\" ? `LIMIT ${sqlInteger(opts.limit)}` : \"\";\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_screen_time_daily\n WHERE ${clauses.join(\" AND \")}\n ORDER BY total_seconds DESC\n ${limitClause}`,\n );\n return rows.map(parseScreenTimeDaily);\n }\n\n async aggregateScreenTimeDailyForDate(\n agentId: string,\n date: string,\n ): Promise<{ updated: number }> {\n // Sessions counted when their start_at falls within the UTC day window.\n const dayStart = `${date}T00:00:00.000Z`;\n const dayEnd = `${date}T23:59:59.999Z`;\n const rows = await executeRawSql(\n this.runtime,\n `SELECT source,\n identifier,\n MAX(display_name) AS display_name,\n SUM(duration_seconds) AS total_seconds,\n COUNT(*) AS session_count\n FROM app_lifeops.life_screen_time_sessions\n WHERE agent_id = ${sqlQuote(agentId)}\n AND start_at >= ${sqlQuote(dayStart)}\n AND start_at <= ${sqlQuote(dayEnd)}\n GROUP BY source, identifier`,\n );\n const now = isoNow();\n let updated = 0;\n for (const row of rows) {\n const rollup: LifeOpsScreenTimeDaily = {\n id: crypto.randomUUID(),\n agentId,\n source: toText(row.source) as \"app\" | \"website\",\n identifier: toText(row.identifier),\n date,\n totalSeconds: toNumber(row.total_seconds, 0),\n sessionCount: toNumber(row.session_count, 0),\n metadata: {\n displayName: toText(row.display_name, toText(row.identifier)),\n },\n createdAt: now,\n updatedAt: now,\n };\n await this.upsertScreenTimeDaily(rollup);\n updated += 1;\n }\n return { updated };\n }\n\n // -----------------------------------------------------------------------\n // Scheduling negotiations + proposals\n // -----------------------------------------------------------------------\n\n async upsertSchedulingNegotiation(\n neg: LifeOpsSchedulingNegotiation,\n ): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_scheduling_negotiations (\n id, agent_id, subject, relationship_id, duration_minutes, timezone,\n state, accepted_proposal_id, started_at, finalized_at, metadata_json,\n created_at, updated_at\n ) VALUES (\n ${sqlQuote(neg.id)},\n ${sqlQuote(neg.agentId)},\n ${sqlQuote(neg.subject)},\n ${sqlText(neg.relationshipId)},\n ${sqlInteger(neg.durationMinutes)},\n ${sqlQuote(neg.timezone)},\n ${sqlQuote(neg.state)},\n ${sqlText(neg.acceptedProposalId)},\n ${sqlQuote(neg.startedAt)},\n ${sqlText(neg.finalizedAt)},\n ${sqlJson(neg.metadata)},\n ${sqlQuote(neg.createdAt)},\n ${sqlQuote(neg.updatedAt)}\n )\n ON CONFLICT (id) DO UPDATE SET\n subject = EXCLUDED.subject,\n relationship_id = EXCLUDED.relationship_id,\n duration_minutes = EXCLUDED.duration_minutes,\n timezone = EXCLUDED.timezone,\n state = EXCLUDED.state,\n accepted_proposal_id = EXCLUDED.accepted_proposal_id,\n finalized_at = EXCLUDED.finalized_at,\n metadata_json = EXCLUDED.metadata_json,\n updated_at = EXCLUDED.updated_at`,\n );\n }\n\n async getSchedulingNegotiation(\n agentId: string,\n id: string,\n ): Promise<LifeOpsSchedulingNegotiation | null> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_scheduling_negotiations\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(id)}\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parseSchedulingNegotiation(row) : null;\n }\n\n async listSchedulingNegotiations(\n agentId: string,\n opts?: { state?: string; limit?: number },\n ): Promise<LifeOpsSchedulingNegotiation[]> {\n const clauses = [`agent_id = ${sqlQuote(agentId)}`];\n if (opts?.state) {\n clauses.push(`state = ${sqlQuote(opts.state)}`);\n }\n const limitClause =\n typeof opts?.limit === \"number\" ? `LIMIT ${sqlInteger(opts.limit)}` : \"\";\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_scheduling_negotiations\n WHERE ${clauses.join(\" AND \")}\n ORDER BY updated_at DESC\n ${limitClause}`,\n );\n return rows.map(parseSchedulingNegotiation);\n }\n\n async updateSchedulingNegotiationState(\n agentId: string,\n id: string,\n state: string,\n finalizedAt?: string | null,\n ): Promise<void> {\n const now = isoNow();\n const finalizedClause =\n finalizedAt === undefined\n ? \"\"\n : `, finalized_at = ${sqlText(finalizedAt)}`;\n await executeRawSql(\n this.runtime,\n `UPDATE app_lifeops.life_scheduling_negotiations\n SET state = ${sqlQuote(state)},\n updated_at = ${sqlQuote(now)}${finalizedClause}\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(id)}`,\n );\n }\n\n async upsertSchedulingProposal(p: LifeOpsSchedulingProposal): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_scheduling_proposals (\n id, agent_id, negotiation_id, start_at, end_at, proposed_by, status,\n metadata_json, created_at, updated_at\n ) VALUES (\n ${sqlQuote(p.id)},\n ${sqlQuote(p.agentId)},\n ${sqlQuote(p.negotiationId)},\n ${sqlQuote(p.startAt)},\n ${sqlQuote(p.endAt)},\n ${sqlQuote(p.proposedBy)},\n ${sqlQuote(p.status)},\n ${sqlJson(p.metadata)},\n ${sqlQuote(p.createdAt)},\n ${sqlQuote(p.updatedAt)}\n )\n ON CONFLICT (id) DO UPDATE SET\n start_at = EXCLUDED.start_at,\n end_at = EXCLUDED.end_at,\n proposed_by = EXCLUDED.proposed_by,\n status = EXCLUDED.status,\n metadata_json = EXCLUDED.metadata_json,\n updated_at = EXCLUDED.updated_at`,\n );\n }\n\n async getSchedulingProposal(\n agentId: string,\n id: string,\n ): Promise<LifeOpsSchedulingProposal | null> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_scheduling_proposals\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(id)}\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parseSchedulingProposal(row) : null;\n }\n\n async listSchedulingProposals(\n agentId: string,\n negotiationId: string,\n ): Promise<LifeOpsSchedulingProposal[]> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_scheduling_proposals\n WHERE agent_id = ${sqlQuote(agentId)}\n AND negotiation_id = ${sqlQuote(negotiationId)}\n ORDER BY created_at ASC`,\n );\n return rows.map(parseSchedulingProposal);\n }\n\n async updateSchedulingProposalStatus(\n agentId: string,\n id: string,\n status: string,\n ): Promise<void> {\n const now = isoNow();\n await executeRawSql(\n this.runtime,\n `UPDATE app_lifeops.life_scheduling_proposals\n SET status = ${sqlQuote(status)},\n updated_at = ${sqlQuote(now)}\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(id)}`,\n );\n }\n\n // ScheduledTask spine. The runner is the only writer for these tables;\n // tables are created by the drizzle plugin-migration system from\n // `lifeOpsSchema`.\n\n /**\n * Upsert a scheduled task. When `expectedVersion` is omitted, behavior\n * matches the pre-version contract: last-write-wins. When provided, the\n * UPDATE clause filters on `version = expectedVersion` AND increments\n * `version = version + 1` atomically. If the UPDATE affects 0 rows (the row\n * doesn't exist or another caller already bumped the version) we throw\n * {@link import(\"./sql.js\").OptimisticLockError}.\n *\n * Use `expectedVersion` for the scheduler's `fire()` transition so two\n * concurrent fires for the same task can't both dispatch.\n */\n async upsertScheduledTask(\n agentId: string,\n task: import(\"@elizaos/plugin-scheduling\").ScheduledTask,\n options?: {\n expectedVersion?: number;\n tx?: TransactionalDb;\n nextFireAtIso?: string | null;\n },\n ): Promise<void> {\n const now = isoNow();\n const expectedVersion = options?.expectedVersion;\n const tx = options?.tx;\n const nextFireAtSql =\n options?.nextFireAtIso === null ||\n options?.nextFireAtIso === undefined ||\n options.nextFireAtIso.length === 0\n ? \"NULL\"\n : `${sqlQuote(options.nextFireAtIso)}::timestamptz`;\n if (typeof expectedVersion === \"number\") {\n const updateSql = `UPDATE app_lifeops.life_scheduled_tasks\n SET kind = ${sqlQuote(task.kind)},\n prompt_instructions = ${sqlQuote(task.promptInstructions)},\n context_request_json = ${sqlText(task.contextRequest ? JSON.stringify(task.contextRequest) : null)},\n trigger_json = ${sqlJson(task.trigger)},\n priority = ${sqlQuote(task.priority)},\n should_fire_json = ${sqlText(task.shouldFire ? JSON.stringify(task.shouldFire) : null)},\n completion_check_json = ${sqlText(task.completionCheck ? JSON.stringify(task.completionCheck) : null)},\n escalation_json = ${sqlText(task.escalation ? JSON.stringify(task.escalation) : null)},\n output_json = ${sqlText(task.output ? JSON.stringify(task.output) : null)},\n pipeline_json = ${sqlText(task.pipeline ? JSON.stringify(task.pipeline) : null)},\n subject_kind = ${sqlText(task.subject?.kind ?? null)},\n subject_id = ${sqlText(task.subject?.id ?? null)},\n idempotency_key = ${sqlText(task.idempotencyKey ?? null)},\n respects_global_pause = ${sqlBoolean(task.respectsGlobalPause)},\n state_json = ${sqlJson(task.state)},\n source = ${sqlQuote(task.source)},\n created_by = ${sqlQuote(task.createdBy)},\n owner_visible = ${sqlBoolean(task.ownerVisible)},\n metadata_json = ${sqlJson(task.metadata ?? {})},\n next_fire_at = ${nextFireAtSql},\n updated_at = ${sqlQuote(now)},\n version = version + 1\n WHERE id = ${sqlQuote(task.taskId)}\n AND agent_id = ${sqlQuote(agentId)}\n AND version = ${sqlInteger(expectedVersion)}\n RETURNING id`;\n const rows = tx\n ? await executeRawSqlTx(tx, updateSql)\n : await executeRawSql(this.runtime, updateSql);\n if (rows.length === 0) {\n throw new OptimisticLockError({\n table: \"life_scheduled_tasks\",\n id: task.taskId,\n expectedVersion,\n });\n }\n return;\n }\n const upsertSql = `INSERT INTO app_lifeops.life_scheduled_tasks (\n id, agent_id, kind, prompt_instructions, context_request_json,\n trigger_json, priority, should_fire_json, completion_check_json,\n escalation_json, output_json, pipeline_json, subject_kind, subject_id,\n idempotency_key, respects_global_pause, state_json, source,\n created_by, owner_visible, metadata_json, next_fire_at,\n created_at, updated_at\n ) VALUES (\n ${sqlQuote(task.taskId)},\n ${sqlQuote(agentId)},\n ${sqlQuote(task.kind)},\n ${sqlQuote(task.promptInstructions)},\n ${sqlText(task.contextRequest ? JSON.stringify(task.contextRequest) : null)},\n ${sqlJson(task.trigger)},\n ${sqlQuote(task.priority)},\n ${sqlText(task.shouldFire ? JSON.stringify(task.shouldFire) : null)},\n ${sqlText(task.completionCheck ? JSON.stringify(task.completionCheck) : null)},\n ${sqlText(task.escalation ? JSON.stringify(task.escalation) : null)},\n ${sqlText(task.output ? JSON.stringify(task.output) : null)},\n ${sqlText(task.pipeline ? JSON.stringify(task.pipeline) : null)},\n ${sqlText(task.subject?.kind ?? null)},\n ${sqlText(task.subject?.id ?? null)},\n ${sqlText(task.idempotencyKey ?? null)},\n ${sqlBoolean(task.respectsGlobalPause)},\n ${sqlJson(task.state)},\n ${sqlQuote(task.source)},\n ${sqlQuote(task.createdBy)},\n ${sqlBoolean(task.ownerVisible)},\n ${sqlJson(task.metadata ?? {})},\n ${nextFireAtSql},\n ${sqlQuote(now)},\n ${sqlQuote(now)}\n )\n ON CONFLICT (id) DO UPDATE SET\n kind = EXCLUDED.kind,\n prompt_instructions = EXCLUDED.prompt_instructions,\n context_request_json = EXCLUDED.context_request_json,\n trigger_json = EXCLUDED.trigger_json,\n priority = EXCLUDED.priority,\n should_fire_json = EXCLUDED.should_fire_json,\n completion_check_json = EXCLUDED.completion_check_json,\n escalation_json = EXCLUDED.escalation_json,\n output_json = EXCLUDED.output_json,\n pipeline_json = EXCLUDED.pipeline_json,\n subject_kind = EXCLUDED.subject_kind,\n subject_id = EXCLUDED.subject_id,\n idempotency_key = EXCLUDED.idempotency_key,\n respects_global_pause = EXCLUDED.respects_global_pause,\n state_json = EXCLUDED.state_json,\n source = EXCLUDED.source,\n created_by = EXCLUDED.created_by,\n owner_visible = EXCLUDED.owner_visible,\n metadata_json = EXCLUDED.metadata_json,\n next_fire_at = EXCLUDED.next_fire_at,\n updated_at = ${sqlQuote(now)}`;\n if (tx) {\n await executeRawSqlTx(tx, upsertSql);\n } else {\n await executeRawSql(this.runtime, upsertSql);\n }\n }\n\n /**\n * Atomically transition a ScheduledTask row from\n * `state_json->>'status' = 'scheduled'` to `'fired'`. The whole flip\n * happens inside one Postgres statement so two parallel ticks racing on\n * the same task cannot both see \"scheduled\". The loser sees zero rows\n * affected → `{ kind: \"raced\" }`; the winner gets the post-update row.\n *\n * Also clears `next_fire_at` so the partial index slice no longer keeps\n * the row in the per-tick due-task scan until the runner re-computes a\n * fresh value on its next mutation.\n */\n async claimScheduledTaskForFire(\n agentId: string,\n args: { taskId: string; firedAtIso: string },\n ): Promise<\n | {\n kind: \"fired\";\n task: import(\"@elizaos/plugin-scheduling\").ScheduledTask;\n }\n | { kind: \"raced\" }\n > {\n const now = isoNow();\n const rows = await executeRawSql(\n this.runtime,\n `UPDATE app_lifeops.life_scheduled_tasks\n SET state_json = jsonb_set(\n jsonb_set(\n state_json::jsonb,\n '{status}',\n '\"fired\"'::jsonb,\n true\n ),\n '{firedAt}',\n to_jsonb(${sqlQuote(args.firedAtIso)}::text),\n true\n )::text,\n next_fire_at = NULL,\n updated_at = ${sqlQuote(now)},\n version = version + 1\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(args.taskId)}\n AND (state_json::jsonb ->> 'status') = 'scheduled'\n RETURNING *`,\n );\n const row = rows[0];\n if (!row) return { kind: \"raced\" };\n return { kind: \"fired\", task: parseScheduledTaskRow(row) };\n }\n\n async getScheduledTask(\n agentId: string,\n taskId: string,\n ): Promise<import(\"@elizaos/plugin-scheduling\").ScheduledTask | null> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_scheduled_tasks\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(taskId)}\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parseScheduledTaskRow(row) : null;\n }\n\n async getScheduledTaskByIdempotencyKey(\n agentId: string,\n idempotencyKey: string,\n ): Promise<import(\"@elizaos/plugin-scheduling\").ScheduledTask | null> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_scheduled_tasks\n WHERE agent_id = ${sqlQuote(agentId)}\n AND idempotency_key = ${sqlQuote(idempotencyKey)}\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parseScheduledTaskRow(row) : null;\n }\n\n async listScheduledTasks(\n agentId: string,\n filter?: {\n kind?: string;\n status?: string | string[];\n subjectKind?: string;\n subjectId?: string;\n source?: string;\n ownerVisibleOnly?: boolean;\n /**\n * When set, the SELECT restricts to rows whose `next_fire_at <= value`\n * or whose `next_fire_at IS NULL` (the latter so event/manual/after_task\n * triggers — which deliberately have no wall-clock fire time but may\n * still need a tick pass for completion-timeout handling — remain\n * visible). The partial index `idx_life_scheduled_tasks_due` is used\n * when this filter is combined with a status list of\n * `('scheduled', 'fired')`.\n */\n dueAtOrBeforeIso?: string;\n /**\n * Restrict to rows with `next_fire_at IS NOT NULL`. Used by tests\n * that want to validate the index slice without the NULL escape hatch.\n */\n requireNextFireAt?: boolean;\n },\n ): Promise<import(\"@elizaos/plugin-scheduling\").ScheduledTask[]> {\n const clauses: string[] = [`agent_id = ${sqlQuote(agentId)}`];\n if (filter?.kind) {\n clauses.push(`kind = ${sqlQuote(filter.kind)}`);\n }\n if (filter?.subjectKind) {\n clauses.push(`subject_kind = ${sqlQuote(filter.subjectKind)}`);\n }\n if (filter?.subjectId) {\n clauses.push(`subject_id = ${sqlQuote(filter.subjectId)}`);\n }\n if (filter?.source) {\n clauses.push(`source = ${sqlQuote(filter.source)}`);\n }\n if (filter?.ownerVisibleOnly) {\n clauses.push(`owner_visible = TRUE`);\n }\n if (filter?.status) {\n const arr = Array.isArray(filter.status)\n ? filter.status\n : [filter.status];\n const inList = arr\n .filter((s) => typeof s === \"string\" && s.length > 0)\n .map((s) => sqlQuote(s))\n .join(\", \");\n if (inList.length > 0) {\n // status is stored inside state_json — we filter post-fetch\n // but include the full row in case the caller wants it.\n clauses.push(`(state_json::jsonb ->> 'status') IN (${inList})`);\n }\n }\n if (typeof filter?.dueAtOrBeforeIso === \"string\") {\n const at = sqlQuote(filter.dueAtOrBeforeIso);\n clauses.push(\n `(next_fire_at IS NULL OR next_fire_at <= ${at}::timestamptz)`,\n );\n }\n if (filter?.requireNextFireAt === true) {\n clauses.push(`next_fire_at IS NOT NULL`);\n }\n const where = clauses.join(\" AND \");\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_scheduled_tasks\n WHERE ${where}\n ORDER BY created_at ASC`,\n );\n return rows.map(parseScheduledTaskRow);\n }\n\n async deleteScheduledTask(agentId: string, taskId: string): Promise<void> {\n await executeRawSql(\n this.runtime,\n `DELETE FROM app_lifeops.life_scheduled_tasks\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(taskId)}`,\n );\n await executeRawSql(\n this.runtime,\n `DELETE FROM app_lifeops.life_scheduled_task_log\n WHERE agent_id = ${sqlQuote(agentId)}\n AND task_id = ${sqlQuote(taskId)}`,\n );\n }\n\n async appendScheduledTaskLog(\n entry: import(\"@elizaos/plugin-scheduling\").ScheduledTaskLogEntry,\n ): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_scheduled_task_log (\n id, agent_id, task_id, occurred_at, transition, reason, rolled_up, detail_json\n ) VALUES (\n ${sqlQuote(entry.logId)},\n ${sqlQuote(entry.agentId)},\n ${sqlQuote(entry.taskId)},\n ${sqlQuote(entry.occurredAtIso)},\n ${sqlQuote(entry.transition)},\n ${sqlText(entry.reason ?? null)},\n ${sqlBoolean(entry.rolledUp)},\n ${sqlText(entry.detail ? JSON.stringify(entry.detail) : null)}\n )`,\n );\n }\n\n async listScheduledTaskLog(args: {\n agentId: string;\n taskId: string;\n sinceIso?: string;\n untilIso?: string;\n excludeRollups?: boolean;\n limit?: number;\n }): Promise<import(\"@elizaos/plugin-scheduling\").ScheduledTaskLogEntry[]> {\n const clauses: string[] = [\n `agent_id = ${sqlQuote(args.agentId)}`,\n `task_id = ${sqlQuote(args.taskId)}`,\n ];\n if (args.sinceIso)\n clauses.push(`occurred_at >= ${sqlQuote(args.sinceIso)}`);\n if (args.untilIso) clauses.push(`occurred_at < ${sqlQuote(args.untilIso)}`);\n if (args.excludeRollups) clauses.push(`rolled_up = FALSE`);\n const limit =\n typeof args.limit === \"number\" && args.limit > 0\n ? `LIMIT ${sqlInteger(args.limit)}`\n : \"\";\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_scheduled_task_log\n WHERE ${clauses.join(\" AND \")}\n ORDER BY occurred_at ASC\n ${limit}`,\n );\n return rows.map(parseScheduledTaskLogRow);\n }\n\n async rollupScheduledTaskLog(args: {\n agentId: string;\n olderThanIso: string;\n }): Promise<{ rolledUp: number; deletedRaw: number }> {\n // Read all expired raw rows for the agent.\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_scheduled_task_log\n WHERE agent_id = ${sqlQuote(args.agentId)}\n AND rolled_up = FALSE\n AND occurred_at < ${sqlQuote(args.olderThanIso)}`,\n );\n if (rows.length === 0) {\n return { rolledUp: 0, deletedRaw: 0 };\n }\n const summary = new Map<\n string,\n {\n taskId: string;\n transition: string;\n dayIso: string;\n count: number;\n firstReason: string | null;\n }\n >();\n for (const r of rows) {\n const occurredAt = toText(r.occurred_at);\n const dayIso = occurredAt.slice(0, 10);\n const key = `${toText(r.task_id)}::${dayIso}::${toText(r.transition)}`;\n const existing = summary.get(key);\n if (existing) {\n existing.count += 1;\n } else {\n summary.set(key, {\n taskId: toText(r.task_id),\n transition: toText(r.transition),\n dayIso,\n count: 1,\n firstReason: typeof r.reason === \"string\" ? r.reason : null,\n });\n }\n }\n // Delete the raw rows we just summarized.\n await executeRawSql(\n this.runtime,\n `DELETE FROM app_lifeops.life_scheduled_task_log\n WHERE agent_id = ${sqlQuote(args.agentId)}\n AND rolled_up = FALSE\n AND occurred_at < ${sqlQuote(args.olderThanIso)}`,\n );\n let counter = 0;\n for (const s of summary.values()) {\n counter += 1;\n const id = `rollup-${s.taskId}-${s.dayIso}-${s.transition}-${counter}`;\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_scheduled_task_log (\n id, agent_id, task_id, occurred_at, transition, reason, rolled_up, detail_json\n ) VALUES (\n ${sqlQuote(id)},\n ${sqlQuote(args.agentId)},\n ${sqlQuote(s.taskId)},\n ${sqlQuote(`${s.dayIso}T00:00:00.000Z`)},\n ${sqlQuote(s.transition)},\n ${sqlText(s.firstReason ?? null)},\n ${sqlBoolean(true)},\n ${sqlText(JSON.stringify({ rollupCount: s.count }))}\n )`,\n );\n }\n return { rolledUp: summary.size, deletedRaw: rows.length };\n }\n\n /**\n * Upsert a work thread. When `expectedVersion` is omitted, behavior matches\n * the pre-version contract: last-write-wins. When provided, the UPDATE clause\n * filters on `version = expectedVersion` AND increments `version = version + 1`\n * atomically. If the UPDATE affects 0 rows (someone else bumped the version\n * first) we throw {@link import(\"./sql.js\").OptimisticLockError}.\n *\n * Use `expectedVersion` from inside `withTransaction` for any multi-step\n * operation that must observe a consistent snapshot of the row across reads\n * and writes (e.g., thread merge).\n */\n async upsertWorkThread(\n agentId: string,\n thread: import(\"./work-threads/types.js\").WorkThread,\n options?: { expectedVersion?: number },\n ): Promise<void> {\n const now = isoNow();\n const createdAt = thread.createdAt || now;\n const updatedAt = thread.updatedAt || now;\n const lastActivityAt = thread.lastActivityAt || updatedAt;\n const expectedVersion = options?.expectedVersion;\n if (typeof expectedVersion === \"number\") {\n const rows = await executeRawSql(\n this.runtime,\n `UPDATE app_lifeops.life_work_threads\n SET owner_entity_id = ${sqlText(thread.ownerEntityId ?? null)},\n status = ${sqlQuote(thread.status)},\n title = ${sqlQuote(thread.title)},\n summary = ${sqlQuote(thread.summary)},\n current_plan_summary = ${sqlText(thread.currentPlanSummary ?? null)},\n primary_source_ref_json = ${sqlJson(thread.primarySourceRef)},\n source_refs_json = ${sqlJson(thread.sourceRefs)},\n participant_entity_ids_json = ${sqlJson(thread.participantEntityIds)},\n current_scheduled_task_id = ${sqlText(thread.currentScheduledTaskId ?? null)},\n workflow_run_id = ${sqlText(thread.workflowRunId ?? null)},\n approval_id = ${sqlText(thread.approvalId ?? null)},\n last_message_memory_id = ${sqlText(thread.lastMessageMemoryId ?? null)},\n metadata_json = ${sqlJson(thread.metadata ?? {})},\n updated_at = ${sqlQuote(updatedAt)},\n last_activity_at = ${sqlQuote(lastActivityAt)},\n version = version + 1\n WHERE id = ${sqlQuote(thread.id)}\n AND agent_id = ${sqlQuote(agentId)}\n AND version = ${sqlInteger(expectedVersion)}\n RETURNING id`,\n );\n if (rows.length === 0) {\n throw new OptimisticLockError({\n table: \"life_work_threads\",\n id: thread.id,\n expectedVersion,\n });\n }\n return;\n }\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_work_threads (\n id, agent_id, owner_entity_id, status, title, summary,\n current_plan_summary, primary_source_ref_json, source_refs_json,\n participant_entity_ids_json, current_scheduled_task_id, workflow_run_id,\n approval_id, last_message_memory_id, metadata_json, created_at,\n updated_at, last_activity_at\n ) VALUES (\n ${sqlQuote(thread.id)},\n ${sqlQuote(agentId)},\n ${sqlText(thread.ownerEntityId ?? null)},\n ${sqlQuote(thread.status)},\n ${sqlQuote(thread.title)},\n ${sqlQuote(thread.summary)},\n ${sqlText(thread.currentPlanSummary ?? null)},\n ${sqlJson(thread.primarySourceRef)},\n ${sqlJson(thread.sourceRefs)},\n ${sqlJson(thread.participantEntityIds)},\n ${sqlText(thread.currentScheduledTaskId ?? null)},\n ${sqlText(thread.workflowRunId ?? null)},\n ${sqlText(thread.approvalId ?? null)},\n ${sqlText(thread.lastMessageMemoryId ?? null)},\n ${sqlJson(thread.metadata ?? {})},\n ${sqlQuote(createdAt)},\n ${sqlQuote(updatedAt)},\n ${sqlQuote(lastActivityAt)}\n )\n ON CONFLICT (id) DO UPDATE SET\n owner_entity_id = EXCLUDED.owner_entity_id,\n status = EXCLUDED.status,\n title = EXCLUDED.title,\n summary = EXCLUDED.summary,\n current_plan_summary = EXCLUDED.current_plan_summary,\n primary_source_ref_json = EXCLUDED.primary_source_ref_json,\n source_refs_json = EXCLUDED.source_refs_json,\n participant_entity_ids_json = EXCLUDED.participant_entity_ids_json,\n current_scheduled_task_id = EXCLUDED.current_scheduled_task_id,\n workflow_run_id = EXCLUDED.workflow_run_id,\n approval_id = EXCLUDED.approval_id,\n last_message_memory_id = EXCLUDED.last_message_memory_id,\n metadata_json = EXCLUDED.metadata_json,\n updated_at = EXCLUDED.updated_at,\n last_activity_at = EXCLUDED.last_activity_at`,\n );\n }\n\n async getWorkThread(\n agentId: string,\n workThreadId: string,\n ): Promise<import(\"./work-threads/types.js\").WorkThread | null> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_work_threads\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(workThreadId)}\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parseWorkThreadRow(row) : null;\n }\n\n async listWorkThreads(\n agentId: string,\n filter: import(\"./work-threads/types.js\").WorkThreadListFilter = {},\n ): Promise<import(\"./work-threads/types.js\").WorkThread[]> {\n const clauses: string[] = [`agent_id = ${sqlQuote(agentId)}`];\n if (filter.statuses && filter.statuses.length > 0) {\n const statuses = filter.statuses\n .map((status) => sqlQuote(status))\n .join(\", \");\n clauses.push(`status IN (${statuses})`);\n }\n if (filter.ownerEntityId) {\n clauses.push(`owner_entity_id = ${sqlQuote(filter.ownerEntityId)}`);\n }\n const shouldApplyLimitInSql = !filter.roomId;\n const requestedLimit =\n typeof filter.limit === \"number\" && filter.limit > 0\n ? Math.floor(filter.limit)\n : null;\n const sqlLimit =\n shouldApplyLimitInSql && requestedLimit\n ? `LIMIT ${sqlInteger(requestedLimit)}`\n : \"\";\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_work_threads\n WHERE ${clauses.join(\" AND \")}\n ORDER BY last_activity_at DESC\n ${sqlLimit}`,\n );\n let threads = rows.map(parseWorkThreadRow);\n if (filter.roomId) {\n threads = threads.filter((thread) =>\n [thread.primarySourceRef, ...thread.sourceRefs].some(\n (ref) => ref.roomId === filter.roomId,\n ),\n );\n }\n if (!filter.includeCrossChannel && filter.roomId) {\n threads = threads.filter((thread) =>\n [thread.primarySourceRef, ...thread.sourceRefs].some(\n (ref) => ref.roomId === filter.roomId && ref.canRead !== false,\n ),\n );\n }\n if (!shouldApplyLimitInSql && requestedLimit) {\n threads = threads.slice(0, requestedLimit);\n }\n return threads;\n }\n\n async appendWorkThreadEvent(\n event: import(\"./work-threads/types.js\").WorkThreadEvent,\n ): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_work_thread_events (\n id, agent_id, work_thread_id, occurred_at, type, reason, detail_json\n ) VALUES (\n ${sqlQuote(event.id)},\n ${sqlQuote(event.agentId)},\n ${sqlQuote(event.workThreadId)},\n ${sqlQuote(event.occurredAt)},\n ${sqlQuote(event.type)},\n ${sqlText(event.reason ?? null)},\n ${sqlText(event.detail ? JSON.stringify(event.detail) : null)}\n )`,\n );\n }\n\n /**\n * Transactional analogue of `appendWorkThreadEvent`. Pass the `tx` handle\n * from `withTransaction`'s callback so the INSERT participates in the same\n * transaction as the surrounding UPDATEs.\n */\n async appendWorkThreadEventTx(\n tx: TransactionalDb,\n event: import(\"./work-threads/types.js\").WorkThreadEvent,\n ): Promise<void> {\n await executeRawSqlTx(\n tx,\n `INSERT INTO app_lifeops.life_work_thread_events (\n id, agent_id, work_thread_id, occurred_at, type, reason, detail_json\n ) VALUES (\n ${sqlQuote(event.id)},\n ${sqlQuote(event.agentId)},\n ${sqlQuote(event.workThreadId)},\n ${sqlQuote(event.occurredAt)},\n ${sqlQuote(event.type)},\n ${sqlText(event.reason ?? null)},\n ${sqlText(event.detail ? JSON.stringify(event.detail) : null)}\n )`,\n );\n }\n\n /**\n * Find an existing merge event by mergeRequestId on a target thread. Used\n * for idempotency: if a merge with the same request id already happened,\n * `mergeWorkThreadsAtomic` returns the recorded result without re-running.\n */\n async findWorkThreadMergeEvent(args: {\n agentId: string;\n targetWorkThreadId: string;\n mergeRequestId: string;\n }): Promise<{\n sourceWorkThreadIds: string[];\n occurredAt: string;\n } | null> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT detail_json, occurred_at\n FROM app_lifeops.life_work_thread_events\n WHERE agent_id = ${sqlQuote(args.agentId)}\n AND work_thread_id = ${sqlQuote(args.targetWorkThreadId)}\n AND type = ${sqlQuote(\"merged\")}\n AND detail_json::jsonb @> ${sqlJson({\n mergeRequestId: args.mergeRequestId,\n })}::jsonb\n LIMIT 1`,\n );\n const row = rows[0];\n if (!row) return null;\n const detail = parseJsonRecord(row.detail_json);\n const rawSourceIds = (detail as { sourceWorkThreadIds?: unknown })\n .sourceWorkThreadIds;\n const sourceWorkThreadIds = Array.isArray(rawSourceIds)\n ? rawSourceIds.filter((s): s is string => typeof s === \"string\")\n : [];\n return {\n sourceWorkThreadIds,\n occurredAt: toText(row.occurred_at),\n };\n }\n\n /**\n * Atomic thread merge. All four steps below commit together or none:\n * 1. UPDATE target thread (sourceRefs, participants, summary, plan, metadata, version+1)\n * 2. UPDATE each source thread (status=stopped, metadata.mergedIntoWorkThreadId, version+1)\n * 3. INSERT 'merged' event on target (with mergeRequestId in detail_json)\n * 4. INSERT 'merged_into' event on each source (with mergeRequestId in detail_json)\n *\n * Throws {@link OptimisticLockError} if any UPDATE affects 0 rows (someone\n * else bumped a version first). Caller catches and retries via\n * {@link withOptimisticRetry}.\n *\n * Idempotency: if a 'merged' event on the target already exists with the\n * given `mergeRequestId`, this is a no-op and returns null without writing.\n */\n async mergeWorkThreadsAtomic(args: {\n agentId: string;\n target: import(\"./work-threads/types.js\").WorkThread;\n sources: import(\"./work-threads/types.js\").WorkThread[];\n nextTarget: import(\"./work-threads/types.js\").WorkThread;\n mergeRequestId: string;\n reason?: string | null;\n instruction?: string | null;\n }): Promise<{ targetWorkThreadId: string; sourceWorkThreadIds: string[] }> {\n return await import(\"./sql.js\").then(async ({ withTransaction }) =>\n withTransaction(this.runtime, async (tx) => {\n // Idempotency check: do not re-merge if we already did this request.\n const existing = await this.findWorkThreadMergeEventTx(tx, {\n agentId: args.agentId,\n targetWorkThreadId: args.target.id,\n mergeRequestId: args.mergeRequestId,\n });\n if (existing) {\n return {\n targetWorkThreadId: args.target.id,\n sourceWorkThreadIds: existing.sourceWorkThreadIds,\n };\n }\n\n const updatedAt = args.nextTarget.updatedAt;\n const lastActivityAt = args.nextTarget.lastActivityAt;\n\n // 1. UPDATE target with version check.\n const targetRows = await executeRawSqlTx(\n tx,\n `UPDATE app_lifeops.life_work_threads\n SET summary = ${sqlQuote(args.nextTarget.summary)},\n current_plan_summary = ${sqlText(args.nextTarget.currentPlanSummary ?? null)},\n source_refs_json = ${sqlJson(args.nextTarget.sourceRefs)},\n participant_entity_ids_json = ${sqlJson(args.nextTarget.participantEntityIds)},\n last_message_memory_id = ${sqlText(args.nextTarget.lastMessageMemoryId ?? null)},\n metadata_json = ${sqlJson(args.nextTarget.metadata ?? {})},\n updated_at = ${sqlQuote(updatedAt)},\n last_activity_at = ${sqlQuote(lastActivityAt)},\n version = version + 1\n WHERE id = ${sqlQuote(args.target.id)}\n AND agent_id = ${sqlQuote(args.agentId)}\n AND version = ${sqlInteger(args.target.version)}\n RETURNING id`,\n );\n if (targetRows.length === 0) {\n throw new OptimisticLockError({\n table: \"life_work_threads\",\n id: args.target.id,\n expectedVersion: args.target.version,\n });\n }\n\n // 2. UPDATE each source with version check (status=stopped + metadata).\n const sourceMetadataPatch = (\n existingMetadata: Record<string, unknown>,\n ) => ({\n ...existingMetadata,\n mergedIntoWorkThreadId: args.target.id,\n mergeRequestId: args.mergeRequestId,\n });\n for (const source of args.sources) {\n const nextMetadata = sourceMetadataPatch(source.metadata ?? {});\n const sourceRows = await executeRawSqlTx(\n tx,\n `UPDATE app_lifeops.life_work_threads\n SET status = ${sqlQuote(\"stopped\")},\n metadata_json = ${sqlJson(nextMetadata)},\n updated_at = ${sqlQuote(updatedAt)},\n last_activity_at = ${sqlQuote(lastActivityAt)},\n version = version + 1\n WHERE id = ${sqlQuote(source.id)}\n AND agent_id = ${sqlQuote(args.agentId)}\n AND version = ${sqlInteger(source.version)}\n RETURNING id`,\n );\n if (sourceRows.length === 0) {\n throw new OptimisticLockError({\n table: \"life_work_threads\",\n id: source.id,\n expectedVersion: source.version,\n });\n }\n }\n\n // 3. INSERT 'merged' event on target.\n const sourceIds = args.sources.map((s) => s.id);\n await this.appendWorkThreadEventTx(tx, {\n id: crypto.randomUUID(),\n agentId: args.agentId,\n workThreadId: args.target.id,\n occurredAt: updatedAt,\n type: \"merged\",\n reason: args.reason ?? null,\n detail: {\n mergeRequestId: args.mergeRequestId,\n sourceWorkThreadIds: sourceIds,\n instruction: args.instruction ?? null,\n },\n });\n\n // 4. INSERT 'merged_into' event on each source.\n for (const source of args.sources) {\n await this.appendWorkThreadEventTx(tx, {\n id: crypto.randomUUID(),\n agentId: args.agentId,\n workThreadId: source.id,\n occurredAt: updatedAt,\n type: \"merged_into\",\n reason: args.reason ?? null,\n detail: {\n mergeRequestId: args.mergeRequestId,\n targetWorkThreadId: args.target.id,\n },\n });\n }\n\n return {\n targetWorkThreadId: args.target.id,\n sourceWorkThreadIds: sourceIds,\n };\n }),\n );\n }\n\n /**\n * Transactional version of {@link findWorkThreadMergeEvent}, scoped to the\n * `tx` so the lookup sees uncommitted changes within the same transaction.\n */\n private async findWorkThreadMergeEventTx(\n tx: TransactionalDb,\n args: {\n agentId: string;\n targetWorkThreadId: string;\n mergeRequestId: string;\n },\n ): Promise<{ sourceWorkThreadIds: string[]; occurredAt: string } | null> {\n const rows = await executeRawSqlTx(\n tx,\n `SELECT detail_json, occurred_at\n FROM app_lifeops.life_work_thread_events\n WHERE agent_id = ${sqlQuote(args.agentId)}\n AND work_thread_id = ${sqlQuote(args.targetWorkThreadId)}\n AND type = ${sqlQuote(\"merged\")}\n AND detail_json::jsonb @> ${sqlJson({\n mergeRequestId: args.mergeRequestId,\n })}::jsonb\n LIMIT 1`,\n );\n const row = rows[0];\n if (!row) return null;\n const detail = parseJsonRecord(row.detail_json);\n const rawSourceIds = (detail as { sourceWorkThreadIds?: unknown })\n .sourceWorkThreadIds;\n const sourceWorkThreadIds = Array.isArray(rawSourceIds)\n ? rawSourceIds.filter((s): s is string => typeof s === \"string\")\n : [];\n return {\n sourceWorkThreadIds,\n occurredAt: toText(row.occurred_at),\n };\n }\n\n async listWorkThreadEvents(args: {\n agentId: string;\n workThreadId: string;\n limit?: number;\n }): Promise<import(\"./work-threads/types.js\").WorkThreadEvent[]> {\n const limit =\n typeof args.limit === \"number\" && args.limit > 0\n ? `LIMIT ${sqlInteger(args.limit)}`\n : \"\";\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_lifeops.life_work_thread_events\n WHERE agent_id = ${sqlQuote(args.agentId)}\n AND work_thread_id = ${sqlQuote(args.workThreadId)}\n ORDER BY occurred_at DESC\n ${limit}`,\n );\n return rows.map(parseWorkThreadEventRow);\n }\n}\n\nexport function createLifeOpsTaskDefinition(\n params: Omit<LifeOpsTaskDefinition, \"id\" | \"createdAt\" | \"updatedAt\">,\n): LifeOpsTaskDefinition {\n const timestamp = isoNow();\n return {\n ...params,\n id: crypto.randomUUID(),\n createdAt: timestamp,\n updatedAt: timestamp,\n };\n}\n\nexport function createLifeOpsGoalDefinition(\n params: Omit<LifeOpsGoalDefinition, \"id\" | \"createdAt\" | \"updatedAt\">,\n): LifeOpsGoalDefinition {\n const timestamp = isoNow();\n return {\n ...params,\n id: crypto.randomUUID(),\n createdAt: timestamp,\n updatedAt: timestamp,\n };\n}\n\nexport function createLifeOpsReminderPlan(\n params: Omit<LifeOpsReminderPlan, \"id\" | \"createdAt\" | \"updatedAt\">,\n): LifeOpsReminderPlan {\n const timestamp = isoNow();\n return {\n ...params,\n id: crypto.randomUUID(),\n createdAt: timestamp,\n updatedAt: timestamp,\n };\n}\n\nexport function createLifeOpsChannelPolicy(\n params: Omit<LifeOpsChannelPolicy, \"id\" | \"createdAt\" | \"updatedAt\">,\n): LifeOpsChannelPolicy {\n const timestamp = isoNow();\n return {\n ...params,\n id: crypto.randomUUID(),\n createdAt: timestamp,\n updatedAt: timestamp,\n };\n}\n\nexport function createLifeOpsWebsiteAccessGrant(\n params: Omit<LifeOpsWebsiteAccessGrant, \"id\" | \"createdAt\" | \"updatedAt\">,\n): LifeOpsWebsiteAccessGrant {\n const timestamp = isoNow();\n return {\n ...params,\n id: crypto.randomUUID(),\n createdAt: timestamp,\n updatedAt: timestamp,\n };\n}\n\nexport function createLifeOpsAuditEvent(\n params: Omit<LifeOpsAuditEvent, \"id\" | \"createdAt\">,\n): LifeOpsAuditEvent {\n return {\n ...params,\n id: crypto.randomUUID(),\n createdAt: isoNow(),\n };\n}\n\n// createLifeOpsSubscriptionAudit / Candidate / Cancellation moved to\n// @elizaos/plugin-finances along with the finance tables. The subscriptions\n// mixin imports them from there directly.\n\nexport function createLifeOpsActivitySignal(\n params: Omit<LifeOpsActivitySignal, \"id\" | \"createdAt\">,\n): LifeOpsActivitySignal {\n return {\n ...params,\n id: crypto.randomUUID(),\n createdAt: isoNow(),\n };\n}\n\n// `createLifeOpsSleepEpisode` lives in `@elizaos/plugin-health`; re-exported\n// at the top of this file.\n\nexport function createLifeOpsConnectorGrant(\n params: Omit<\n LifeOpsConnectorGrant,\n | \"id\"\n | \"createdAt\"\n | \"updatedAt\"\n | \"side\"\n | \"executionTarget\"\n | \"sourceOfTruth\"\n | \"preferredByAgent\"\n | \"cloudConnectionId\"\n > &\n Partial<\n Pick<\n LifeOpsConnectorGrant,\n | \"side\"\n | \"executionTarget\"\n | \"sourceOfTruth\"\n | \"preferredByAgent\"\n | \"cloudConnectionId\"\n >\n >,\n): LifeOpsConnectorGrant {\n const timestamp = isoNow();\n const id = crypto.randomUUID();\n const grant: LifeOpsConnectorGrant = {\n ...params,\n connectorAccountId: params.connectorAccountId ?? null,\n side: params.side ?? \"owner\",\n executionTarget: params.executionTarget ?? \"local\",\n sourceOfTruth: params.sourceOfTruth ?? \"local_storage\",\n preferredByAgent: params.preferredByAgent ?? false,\n cloudConnectionId: params.cloudConnectionId ?? null,\n id,\n createdAt: timestamp,\n updatedAt: timestamp,\n };\n return {\n ...grant,\n connectorAccountId:\n grant.connectorAccountId ?? deriveConnectorAccountIdFromGrant(grant),\n };\n}\n\n// `createLifeOpsHealth*` factories live in `@elizaos/plugin-health`;\n// re-exported at the top of this file.\n\nexport function createLifeOpsCalendarSyncState(\n params: Omit<LifeOpsCalendarSyncState, \"id\" | \"updatedAt\">,\n): LifeOpsCalendarSyncState {\n return {\n ...params,\n id: crypto.randomUUID(),\n updatedAt: isoNow(),\n };\n}\n\nexport function createLifeOpsGmailSyncState(\n params: Omit<LifeOpsGmailSyncState, \"id\" | \"updatedAt\">,\n): LifeOpsGmailSyncState {\n return {\n ...params,\n id: crypto.randomUUID(),\n updatedAt: isoNow(),\n };\n}\n\nexport function createLifeOpsWorkflowDefinition(\n params: Omit<LifeOpsWorkflowDefinition, \"id\" | \"createdAt\" | \"updatedAt\">,\n): LifeOpsWorkflowDefinition {\n const timestamp = isoNow();\n return {\n ...params,\n id: crypto.randomUUID(),\n createdAt: timestamp,\n updatedAt: timestamp,\n };\n}\n\nexport function createLifeOpsWorkflowRun(\n params: Omit<LifeOpsWorkflowRun, \"id\">,\n): LifeOpsWorkflowRun {\n return {\n ...params,\n id: crypto.randomUUID(),\n };\n}\n\nexport function createLifeOpsReminderAttempt(\n params: Omit<LifeOpsReminderAttempt, \"id\">,\n): LifeOpsReminderAttempt {\n const reviewColumns = readReminderReviewColumnValues(params.deliveryMetadata);\n return {\n ...params,\n id: crypto.randomUUID(),\n reviewAt: params.reviewAt ?? reviewColumns.reviewAt,\n reviewStatus: params.reviewStatus ?? reviewColumns.reviewStatus,\n };\n}\n\nexport function createLifeOpsBrowserSession(\n params: Omit<LifeOpsBrowserSession, \"id\" | \"createdAt\" | \"updatedAt\">,\n): LifeOpsBrowserSession {\n const timestamp = isoNow();\n return {\n ...params,\n id: crypto.randomUUID(),\n createdAt: timestamp,\n updatedAt: timestamp,\n };\n}\n"],"mappings":"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","names":[]}
|