forge-openclaw-plugin 0.2.25 → 0.2.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/README.md +59 -3
  2. package/dist/assets/{board-VmF4FAfr.js → board-C6jCchjI.js} +3 -3
  3. package/dist/assets/{board-VmF4FAfr.js.map → board-C6jCchjI.js.map} +1 -1
  4. package/dist/assets/index-DVvS8iiU.css +1 -0
  5. package/dist/assets/index-zYB-9Dfo.js +85 -0
  6. package/dist/assets/index-zYB-9Dfo.js.map +1 -0
  7. package/dist/assets/knowledge-graph-layout.worker-DRvzPxhP.js +2 -0
  8. package/dist/assets/knowledge-graph-layout.worker-DRvzPxhP.js.map +1 -0
  9. package/dist/assets/{motion-DvkU14p-.js → motion-DFHrH2rd.js} +2 -2
  10. package/dist/assets/{motion-DvkU14p-.js.map → motion-DFHrH2rd.js.map} +1 -1
  11. package/dist/assets/{table-DgiPof9E.js → table-ZL7Di_u3.js} +2 -2
  12. package/dist/assets/{table-DgiPof9E.js.map → table-ZL7Di_u3.js.map} +1 -1
  13. package/dist/assets/{ui-nYfoC0Gq.js → ui-CKNPpz7q.js} +2 -2
  14. package/dist/assets/{ui-nYfoC0Gq.js.map → ui-CKNPpz7q.js.map} +1 -1
  15. package/dist/assets/vendor-DoNZuFhn.js +1247 -0
  16. package/dist/assets/vendor-DoNZuFhn.js.map +1 -0
  17. package/dist/index.html +7 -8
  18. package/dist/openclaw/local-runtime.d.ts +3 -1
  19. package/dist/openclaw/local-runtime.js +67 -15
  20. package/dist/openclaw/plugin-entry-shared.js +24 -2
  21. package/dist/openclaw/plugin-sdk-types.d.ts +17 -0
  22. package/dist/openclaw/routes.d.ts +27 -0
  23. package/dist/openclaw/routes.js +16 -12
  24. package/dist/openclaw/tools.js +0 -3
  25. package/dist/server/server/migrations/001_core.sql +411 -0
  26. package/dist/server/server/migrations/002_psyche.sql +392 -0
  27. package/dist/server/server/migrations/003_habits.sql +30 -0
  28. package/dist/server/server/migrations/004_habit_links.sql +8 -0
  29. package/dist/server/server/migrations/005_habit_psyche_links.sql +24 -0
  30. package/dist/server/server/migrations/006_work_adjustments.sql +14 -0
  31. package/dist/server/server/migrations/007_weekly_review_closures.sql +17 -0
  32. package/dist/server/server/migrations/008_calendar_execution.sql +147 -0
  33. package/dist/server/server/migrations/009_true_calendar_events.sql +195 -0
  34. package/dist/server/server/migrations/010_calendar_selection_state.sql +6 -0
  35. package/dist/server/server/migrations/011_calendar_timezone_backfill.sql +11 -0
  36. package/dist/server/server/migrations/012_work_block_ranges.sql +7 -0
  37. package/dist/server/server/migrations/013_microsoft_local_auth_settings.sql +8 -0
  38. package/dist/server/server/migrations/014_note_tags_and_ephemeral.sql +8 -0
  39. package/dist/server/server/migrations/015_multi_user_and_strategies.sql +244 -0
  40. package/dist/server/server/migrations/016_health_companion.sql +158 -0
  41. package/dist/server/server/migrations/016_strategy_contracts_and_user_graph.sql +22 -0
  42. package/dist/server/server/migrations/017_preferences.sql +131 -0
  43. package/dist/server/server/migrations/018_preference_catalogs.sql +31 -0
  44. package/dist/server/server/migrations/019_wiki_memory.sql +255 -0
  45. package/dist/server/server/migrations/020_wiki_page_hierarchy.sql +11 -0
  46. package/dist/server/server/migrations/021_hide_evidence_from_wiki_index.sql +3 -0
  47. package/dist/server/server/migrations/022_wiki_ingest_background.sql +85 -0
  48. package/dist/server/server/migrations/023_diagnostic_logs.sql +28 -0
  49. package/dist/server/server/migrations/024_questionnaires.sql +96 -0
  50. package/dist/server/server/migrations/025_ai_model_connections.sql +26 -0
  51. package/dist/server/server/migrations/026_custom_theme_settings.sql +2 -0
  52. package/dist/server/server/migrations/027_ai_processors.sql +31 -0
  53. package/dist/server/server/migrations/028_movement_domain.sql +136 -0
  54. package/dist/server/server/migrations/029_watch_micro_capture.sql +23 -0
  55. package/dist/server/server/migrations/030_surface_layouts.sql +5 -0
  56. package/dist/server/server/migrations/031_ai_processor_runtime_upgrades.sql +10 -0
  57. package/dist/server/server/migrations/032_ai_connectors.sql +44 -0
  58. package/dist/server/server/migrations/033_movement_trip_point_sync.sql +36 -0
  59. package/dist/server/server/migrations/034_movement_segment_sync.sql +49 -0
  60. package/dist/server/server/migrations/035_google_local_auth_settings.sql +2 -0
  61. package/dist/server/server/migrations/036_google_local_auth_client_secret.sql +2 -0
  62. package/dist/server/server/migrations/037_workbench_public_inputs_and_run_inputs.sql +5 -0
  63. package/dist/server/server/migrations/038_data_management_settings.sql +11 -0
  64. package/dist/server/server/migrations/039_life_force_and_action_points.sql +114 -0
  65. package/dist/server/server/migrations/040_screen_time_domain.sql +89 -0
  66. package/dist/server/server/migrations/041_companion_source_states.sql +21 -0
  67. package/dist/server/server/migrations/042_movement_boxes.sql +47 -0
  68. package/dist/server/server/migrations/043_movement_box_overlap_overrides.sql +26 -0
  69. package/dist/server/{app.js → server/src/app.js} +2112 -414
  70. package/dist/server/server/src/connectors/box-registry.js +223 -0
  71. package/dist/server/server/src/data-management-types.js +107 -0
  72. package/dist/server/{db.js → server/src/db.js} +72 -4
  73. package/dist/server/server/src/debug.js +19 -0
  74. package/dist/server/{demo-data.js → server/src/demo-data.js} +2 -2
  75. package/dist/server/{health.js → server/src/health.js} +702 -18
  76. package/dist/server/{managers → server/src/managers}/platform/llm-manager.js +7 -4
  77. package/dist/server/server/src/managers/platform/mock-workbench-provider.js +149 -0
  78. package/dist/server/{managers → server/src/managers}/platform/secrets-manager.js +18 -1
  79. package/dist/server/{managers → server/src/managers}/runtime.js +9 -0
  80. package/dist/server/{movement.js → server/src/movement.js} +1971 -112
  81. package/dist/server/{openapi.js → server/src/openapi.js} +491 -3
  82. package/dist/server/{psyche-types.js → server/src/psyche-types.js} +9 -1
  83. package/dist/server/{repositories → server/src/repositories}/activity-events.js +8 -0
  84. package/dist/server/{repositories → server/src/repositories}/ai-connectors.js +758 -47
  85. package/dist/server/{repositories → server/src/repositories}/calendar.js +1 -1
  86. package/dist/server/{repositories → server/src/repositories}/habits.js +37 -1
  87. package/dist/server/{repositories → server/src/repositories}/model-settings.js +13 -3
  88. package/dist/server/{repositories → server/src/repositories}/notes.js +3 -0
  89. package/dist/server/{repositories → server/src/repositories}/settings.js +431 -21
  90. package/dist/server/{repositories → server/src/repositories}/tasks.js +170 -10
  91. package/dist/server/server/src/runtime-data-root.js +82 -0
  92. package/dist/server/server/src/screen-time.js +802 -0
  93. package/dist/server/{services → server/src/services}/calendar-runtime.js +775 -58
  94. package/dist/server/server/src/services/data-management.js +788 -0
  95. package/dist/server/{services → server/src/services}/entity-crud.js +205 -2
  96. package/dist/server/server/src/services/google-calendar-oauth-config.js +176 -0
  97. package/dist/server/server/src/services/knowledge-graph.js +1455 -0
  98. package/dist/server/server/src/services/life-force-model.js +197 -0
  99. package/dist/server/server/src/services/life-force.js +1270 -0
  100. package/dist/server/server/src/services/psyche-observation-calendar.js +413 -0
  101. package/dist/server/{types.js → server/src/types.js} +420 -29
  102. package/dist/server/server/src/web.js +332 -0
  103. package/dist/server/src/components/customization/utility-widgets.js +439 -0
  104. package/dist/server/src/components/ui/info-tooltip.js +25 -0
  105. package/dist/server/src/components/workbench-boxes/calendar/calendar-boxes.js +78 -0
  106. package/dist/server/src/components/workbench-boxes/goals/goals-boxes.js +62 -0
  107. package/dist/server/src/components/workbench-boxes/habits/habits-boxes.js +62 -0
  108. package/dist/server/src/components/workbench-boxes/health/health-boxes.js +147 -0
  109. package/dist/server/src/components/workbench-boxes/insights/insights-boxes.js +50 -0
  110. package/dist/server/src/components/workbench-boxes/kanban/kanban-boxes.js +136 -0
  111. package/dist/server/src/components/workbench-boxes/movement/movement-boxes.js +47 -0
  112. package/dist/server/src/components/workbench-boxes/notes/notes-boxes.js +132 -0
  113. package/dist/server/src/components/workbench-boxes/overview/overview-boxes.js +65 -0
  114. package/dist/server/src/components/workbench-boxes/preferences/preferences-boxes.js +78 -0
  115. package/dist/server/src/components/workbench-boxes/projects/projects-boxes.js +62 -0
  116. package/dist/server/src/components/workbench-boxes/psyche/psyche-boxes.js +88 -0
  117. package/dist/server/src/components/workbench-boxes/questionnaires/questionnaires-boxes.js +61 -0
  118. package/dist/server/src/components/workbench-boxes/review/review-boxes.js +53 -0
  119. package/dist/server/src/components/workbench-boxes/shared/define-workbench-box.js +6 -0
  120. package/dist/server/src/components/workbench-boxes/shared/generic-node-view.js +49 -0
  121. package/dist/server/src/components/workbench-boxes/strategies/strategies-boxes.js +62 -0
  122. package/dist/server/src/components/workbench-boxes/tasks/tasks-boxes.js +76 -0
  123. package/dist/server/src/components/workbench-boxes/today/today-boxes.js +78 -0
  124. package/dist/server/src/components/workbench-boxes/wiki/wiki-boxes.js +60 -0
  125. package/dist/server/src/lib/api-error.js +37 -0
  126. package/dist/server/src/lib/api.js +2118 -0
  127. package/dist/server/src/lib/calendar-name-deduper.js +144 -0
  128. package/dist/server/src/lib/data-management-types.js +1 -0
  129. package/dist/server/src/lib/diagnostics.js +67 -0
  130. package/dist/server/src/lib/entity-visuals.js +279 -0
  131. package/dist/server/src/lib/knowledge-graph-types.js +276 -0
  132. package/dist/server/src/lib/knowledge-graph.js +470 -0
  133. package/dist/server/src/lib/psyche-types.js +1 -0
  134. package/dist/server/src/lib/questionnaire-types.js +1 -0
  135. package/dist/server/src/lib/runtime-paths.js +24 -0
  136. package/dist/server/src/lib/schemas.js +238 -0
  137. package/dist/server/src/lib/snapshot-normalizer.js +416 -0
  138. package/dist/server/src/lib/theme-system.js +319 -0
  139. package/dist/server/src/lib/types.js +1 -0
  140. package/dist/server/src/lib/utils.js +22 -0
  141. package/dist/server/src/lib/workbench/boxes.js +16 -0
  142. package/dist/server/src/lib/workbench/contracts.js +229 -0
  143. package/dist/server/src/lib/workbench/nodes.js +215 -0
  144. package/dist/server/src/lib/workbench/registry.js +120 -0
  145. package/dist/server/src/lib/workbench/runtime.js +397 -0
  146. package/dist/server/src/lib/workbench/tool-catalog.js +68 -0
  147. package/openclaw.plugin.json +1 -1
  148. package/package.json +1 -1
  149. package/server/index.js +68 -0
  150. package/server/migrations/035_google_local_auth_settings.sql +2 -0
  151. package/server/migrations/036_google_local_auth_client_secret.sql +2 -0
  152. package/server/migrations/037_workbench_public_inputs_and_run_inputs.sql +5 -0
  153. package/server/migrations/038_data_management_settings.sql +11 -0
  154. package/server/migrations/039_life_force_and_action_points.sql +114 -0
  155. package/server/migrations/040_screen_time_domain.sql +89 -0
  156. package/server/migrations/041_companion_source_states.sql +21 -0
  157. package/server/migrations/042_movement_boxes.sql +47 -0
  158. package/server/migrations/043_movement_box_overlap_overrides.sql +26 -0
  159. package/skills/forge-openclaw/SKILL.md +27 -11
  160. package/skills/forge-openclaw/entity_conversation_playbooks.md +411 -46
  161. package/skills/forge-openclaw/psyche_entity_playbooks.md +195 -20
  162. package/dist/assets/index-CFCKDIMH.js +0 -67
  163. package/dist/assets/index-CFCKDIMH.js.map +0 -1
  164. package/dist/assets/index-ZPY6U1TU.css +0 -1
  165. package/dist/assets/vendor-D9PTEPSB.js +0 -824
  166. package/dist/assets/vendor-D9PTEPSB.js.map +0 -1
  167. package/dist/assets/viz-Cqb6s--o.js +0 -34
  168. package/dist/assets/viz-Cqb6s--o.js.map +0 -1
  169. package/dist/server/connectors/box-registry.js +0 -257
  170. package/dist/server/services/psyche-observation-calendar.js +0 -46
  171. package/dist/server/web.js +0 -98
  172. /package/dist/server/{discovery-advertiser.js → server/src/discovery-advertiser.js} +0 -0
  173. /package/dist/server/{e2e-server.js → server/src/e2e-server.js} +0 -0
  174. /package/dist/server/{errors.js → server/src/errors.js} +0 -0
  175. /package/dist/server/{index.js → server/src/index.js} +0 -0
  176. /package/dist/server/{managers → server/src/managers}/base.js +0 -0
  177. /package/dist/server/{managers → server/src/managers}/contracts.js +0 -0
  178. /package/dist/server/{managers → server/src/managers}/platform/api-gateway-manager.js +0 -0
  179. /package/dist/server/{managers → server/src/managers}/platform/audit-manager.js +0 -0
  180. /package/dist/server/{managers → server/src/managers}/platform/authentication-manager.js +0 -0
  181. /package/dist/server/{managers → server/src/managers}/platform/authorization-manager.js +0 -0
  182. /package/dist/server/{managers → server/src/managers}/platform/background-job-manager.js +0 -0
  183. /package/dist/server/{managers → server/src/managers}/platform/configuration-manager.js +0 -0
  184. /package/dist/server/{managers → server/src/managers}/platform/database-manager.js +0 -0
  185. /package/dist/server/{managers → server/src/managers}/platform/event-bus-manager.js +0 -0
  186. /package/dist/server/{managers → server/src/managers}/platform/external-service-manager.js +0 -0
  187. /package/dist/server/{managers → server/src/managers}/platform/health-manager.js +0 -0
  188. /package/dist/server/{managers → server/src/managers}/platform/migration-manager.js +0 -0
  189. /package/dist/server/{managers → server/src/managers}/platform/openai-responses-provider.js +0 -0
  190. /package/dist/server/{managers → server/src/managers}/platform/search-index-manager.js +0 -0
  191. /package/dist/server/{managers → server/src/managers}/platform/session-manager.js +0 -0
  192. /package/dist/server/{managers → server/src/managers}/platform/storage-manager.js +0 -0
  193. /package/dist/server/{managers → server/src/managers}/platform/token-manager.js +0 -0
  194. /package/dist/server/{managers → server/src/managers}/platform/transaction-manager.js +0 -0
  195. /package/dist/server/{managers → server/src/managers}/platform/trusted-network.js +0 -0
  196. /package/dist/server/{managers → server/src/managers}/type-guards.js +0 -0
  197. /package/dist/server/{preferences-seeds.js → server/src/preferences-seeds.js} +0 -0
  198. /package/dist/server/{preferences-types.js → server/src/preferences-types.js} +0 -0
  199. /package/dist/server/{questionnaire-flow.js → server/src/questionnaire-flow.js} +0 -0
  200. /package/dist/server/{questionnaire-seeds.js → server/src/questionnaire-seeds.js} +0 -0
  201. /package/dist/server/{questionnaire-types.js → server/src/questionnaire-types.js} +0 -0
  202. /package/dist/server/{repositories → server/src/repositories}/ai-processors.js +0 -0
  203. /package/dist/server/{repositories → server/src/repositories}/collaboration.js +0 -0
  204. /package/dist/server/{repositories → server/src/repositories}/deleted-entities.js +0 -0
  205. /package/dist/server/{repositories → server/src/repositories}/diagnostic-logs.js +0 -0
  206. /package/dist/server/{repositories → server/src/repositories}/domains.js +0 -0
  207. /package/dist/server/{repositories → server/src/repositories}/entity-ownership.js +0 -0
  208. /package/dist/server/{repositories → server/src/repositories}/event-log.js +0 -0
  209. /package/dist/server/{repositories → server/src/repositories}/goals.js +0 -0
  210. /package/dist/server/{repositories → server/src/repositories}/preferences.js +0 -0
  211. /package/dist/server/{repositories → server/src/repositories}/projects.js +0 -0
  212. /package/dist/server/{repositories → server/src/repositories}/psyche.js +0 -0
  213. /package/dist/server/{repositories → server/src/repositories}/questionnaires.js +0 -0
  214. /package/dist/server/{repositories → server/src/repositories}/rewards.js +0 -0
  215. /package/dist/server/{repositories → server/src/repositories}/strategies.js +0 -0
  216. /package/dist/server/{repositories → server/src/repositories}/surface-layouts.js +0 -0
  217. /package/dist/server/{repositories → server/src/repositories}/tags.js +0 -0
  218. /package/dist/server/{repositories → server/src/repositories}/task-runs.js +0 -0
  219. /package/dist/server/{repositories → server/src/repositories}/users.js +0 -0
  220. /package/dist/server/{repositories → server/src/repositories}/weekly-reviews.js +0 -0
  221. /package/dist/server/{repositories → server/src/repositories}/wiki-memory.js +0 -0
  222. /package/dist/server/{repositories → server/src/repositories}/work-adjustments.js +0 -0
  223. /package/dist/server/{seed-demo.js → server/src/seed-demo.js} +0 -0
  224. /package/dist/server/{services → server/src/services}/context.js +0 -0
  225. /package/dist/server/{services → server/src/services}/dashboard.js +0 -0
  226. /package/dist/server/{services → server/src/services}/gamification.js +0 -0
  227. /package/dist/server/{services → server/src/services}/insights.js +0 -0
  228. /package/dist/server/{services → server/src/services}/openai-codex-oauth.js +0 -0
  229. /package/dist/server/{services → server/src/services}/projects.js +0 -0
  230. /package/dist/server/{services → server/src/services}/psyche.js +0 -0
  231. /package/dist/server/{services → server/src/services}/relations.js +0 -0
  232. /package/dist/server/{services → server/src/services}/reviews.js +0 -0
  233. /package/dist/server/{services → server/src/services}/run-recovery.js +0 -0
  234. /package/dist/server/{services → server/src/services}/tagging.js +0 -0
  235. /package/dist/server/{services → server/src/services}/task-run-watchdog.js +0 -0
  236. /package/dist/server/{services → server/src/services}/work-time.js +0 -0
  237. /package/dist/server/{watch-mobile.js → server/src/watch-mobile.js} +0 -0
@@ -0,0 +1,31 @@
1
+ CREATE TABLE IF NOT EXISTS ai_processors (
2
+ id TEXT PRIMARY KEY,
3
+ surface_id TEXT NOT NULL,
4
+ title TEXT NOT NULL,
5
+ prompt_flow TEXT NOT NULL DEFAULT '',
6
+ context_input TEXT NOT NULL DEFAULT '',
7
+ tool_config_json TEXT NOT NULL DEFAULT '[]',
8
+ agent_ids_json TEXT NOT NULL DEFAULT '[]',
9
+ trigger_mode TEXT NOT NULL DEFAULT 'manual',
10
+ cron_expression TEXT NOT NULL DEFAULT '',
11
+ machine_access_json TEXT NOT NULL DEFAULT '{"read":false,"write":false,"exec":false}',
12
+ endpoint_enabled INTEGER NOT NULL DEFAULT 1,
13
+ last_run_at TEXT,
14
+ last_run_status TEXT,
15
+ last_run_output_json TEXT,
16
+ created_at TEXT NOT NULL,
17
+ updated_at TEXT NOT NULL
18
+ );
19
+
20
+ CREATE TABLE IF NOT EXISTS ai_processor_links (
21
+ id TEXT PRIMARY KEY,
22
+ surface_id TEXT NOT NULL,
23
+ source_widget_id TEXT NOT NULL,
24
+ target_processor_id TEXT NOT NULL,
25
+ access_mode TEXT NOT NULL DEFAULT 'read',
26
+ capability_mode TEXT NOT NULL DEFAULT 'content',
27
+ metadata_json TEXT NOT NULL DEFAULT '{}',
28
+ created_at TEXT NOT NULL,
29
+ updated_at TEXT NOT NULL,
30
+ FOREIGN KEY (target_processor_id) REFERENCES ai_processors(id) ON DELETE CASCADE
31
+ );
@@ -0,0 +1,136 @@
1
+ CREATE TABLE IF NOT EXISTS movement_places (
2
+ id TEXT PRIMARY KEY,
3
+ external_uid TEXT NOT NULL DEFAULT '',
4
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
5
+ label TEXT NOT NULL,
6
+ aliases_json TEXT NOT NULL DEFAULT '[]',
7
+ latitude REAL NOT NULL,
8
+ longitude REAL NOT NULL,
9
+ radius_meters REAL NOT NULL DEFAULT 100,
10
+ category_tags_json TEXT NOT NULL DEFAULT '[]',
11
+ visibility TEXT NOT NULL DEFAULT 'shared',
12
+ wiki_note_id TEXT REFERENCES notes(id) ON DELETE SET NULL,
13
+ linked_entities_json TEXT NOT NULL DEFAULT '[]',
14
+ linked_people_json TEXT NOT NULL DEFAULT '[]',
15
+ metadata_json TEXT NOT NULL DEFAULT '{}',
16
+ source TEXT NOT NULL DEFAULT 'user',
17
+ created_at TEXT NOT NULL,
18
+ updated_at TEXT NOT NULL,
19
+ UNIQUE (user_id, source, external_uid)
20
+ );
21
+
22
+ CREATE INDEX IF NOT EXISTS idx_movement_places_user
23
+ ON movement_places(user_id, updated_at DESC);
24
+
25
+ CREATE TABLE IF NOT EXISTS movement_settings (
26
+ user_id TEXT PRIMARY KEY REFERENCES users(id) ON DELETE CASCADE,
27
+ tracking_enabled INTEGER NOT NULL DEFAULT 0,
28
+ publish_mode TEXT NOT NULL DEFAULT 'auto_publish',
29
+ retention_mode TEXT NOT NULL DEFAULT 'aggregates_only',
30
+ location_permission_status TEXT NOT NULL DEFAULT 'not_determined',
31
+ motion_permission_status TEXT NOT NULL DEFAULT 'unknown',
32
+ background_tracking_ready INTEGER NOT NULL DEFAULT 0,
33
+ last_companion_sync_at TEXT,
34
+ metadata_json TEXT NOT NULL DEFAULT '{}',
35
+ created_at TEXT NOT NULL,
36
+ updated_at TEXT NOT NULL
37
+ );
38
+
39
+ CREATE TABLE IF NOT EXISTS movement_stays (
40
+ id TEXT PRIMARY KEY,
41
+ external_uid TEXT NOT NULL,
42
+ pairing_session_id TEXT REFERENCES companion_pairing_sessions(id) ON DELETE SET NULL,
43
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
44
+ place_id TEXT REFERENCES movement_places(id) ON DELETE SET NULL,
45
+ label TEXT NOT NULL DEFAULT '',
46
+ status TEXT NOT NULL DEFAULT 'completed',
47
+ classification TEXT NOT NULL DEFAULT 'stationary',
48
+ started_at TEXT NOT NULL,
49
+ ended_at TEXT NOT NULL,
50
+ center_latitude REAL NOT NULL,
51
+ center_longitude REAL NOT NULL,
52
+ radius_meters REAL NOT NULL DEFAULT 100,
53
+ sample_count INTEGER NOT NULL DEFAULT 0,
54
+ weather_json TEXT NOT NULL DEFAULT '{}',
55
+ metrics_json TEXT NOT NULL DEFAULT '{}',
56
+ metadata_json TEXT NOT NULL DEFAULT '{}',
57
+ published_note_id TEXT REFERENCES notes(id) ON DELETE SET NULL,
58
+ created_at TEXT NOT NULL,
59
+ updated_at TEXT NOT NULL,
60
+ UNIQUE (user_id, external_uid)
61
+ );
62
+
63
+ CREATE INDEX IF NOT EXISTS idx_movement_stays_user
64
+ ON movement_stays(user_id, started_at DESC);
65
+
66
+ CREATE TABLE IF NOT EXISTS movement_trips (
67
+ id TEXT PRIMARY KEY,
68
+ external_uid TEXT NOT NULL,
69
+ pairing_session_id TEXT REFERENCES companion_pairing_sessions(id) ON DELETE SET NULL,
70
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
71
+ start_place_id TEXT REFERENCES movement_places(id) ON DELETE SET NULL,
72
+ end_place_id TEXT REFERENCES movement_places(id) ON DELETE SET NULL,
73
+ label TEXT NOT NULL DEFAULT '',
74
+ status TEXT NOT NULL DEFAULT 'completed',
75
+ travel_mode TEXT NOT NULL DEFAULT 'travel',
76
+ activity_type TEXT NOT NULL DEFAULT '',
77
+ started_at TEXT NOT NULL,
78
+ ended_at TEXT NOT NULL,
79
+ distance_meters REAL NOT NULL DEFAULT 0,
80
+ moving_seconds INTEGER NOT NULL DEFAULT 0,
81
+ idle_seconds INTEGER NOT NULL DEFAULT 0,
82
+ average_speed_mps REAL,
83
+ max_speed_mps REAL,
84
+ calories_kcal REAL,
85
+ expected_met REAL,
86
+ weather_json TEXT NOT NULL DEFAULT '{}',
87
+ tags_json TEXT NOT NULL DEFAULT '[]',
88
+ linked_entities_json TEXT NOT NULL DEFAULT '[]',
89
+ linked_people_json TEXT NOT NULL DEFAULT '[]',
90
+ metadata_json TEXT NOT NULL DEFAULT '{}',
91
+ published_note_id TEXT REFERENCES notes(id) ON DELETE SET NULL,
92
+ created_at TEXT NOT NULL,
93
+ updated_at TEXT NOT NULL,
94
+ UNIQUE (user_id, external_uid)
95
+ );
96
+
97
+ CREATE INDEX IF NOT EXISTS idx_movement_trips_user
98
+ ON movement_trips(user_id, started_at DESC);
99
+
100
+ CREATE TABLE IF NOT EXISTS movement_trip_points (
101
+ id TEXT PRIMARY KEY,
102
+ trip_id TEXT NOT NULL REFERENCES movement_trips(id) ON DELETE CASCADE,
103
+ sequence_index INTEGER NOT NULL,
104
+ recorded_at TEXT NOT NULL,
105
+ latitude REAL NOT NULL,
106
+ longitude REAL NOT NULL,
107
+ accuracy_meters REAL,
108
+ altitude_meters REAL,
109
+ speed_mps REAL,
110
+ is_stop_anchor INTEGER NOT NULL DEFAULT 0,
111
+ created_at TEXT NOT NULL
112
+ );
113
+
114
+ CREATE INDEX IF NOT EXISTS idx_movement_trip_points_trip
115
+ ON movement_trip_points(trip_id, sequence_index ASC);
116
+
117
+ CREATE TABLE IF NOT EXISTS movement_trip_stops (
118
+ id TEXT PRIMARY KEY,
119
+ external_uid TEXT NOT NULL DEFAULT '',
120
+ trip_id TEXT NOT NULL REFERENCES movement_trips(id) ON DELETE CASCADE,
121
+ sequence_index INTEGER NOT NULL DEFAULT 0,
122
+ label TEXT NOT NULL DEFAULT '',
123
+ place_id TEXT REFERENCES movement_places(id) ON DELETE SET NULL,
124
+ started_at TEXT NOT NULL,
125
+ ended_at TEXT NOT NULL,
126
+ duration_seconds INTEGER NOT NULL DEFAULT 0,
127
+ latitude REAL NOT NULL,
128
+ longitude REAL NOT NULL,
129
+ radius_meters REAL NOT NULL DEFAULT 80,
130
+ metadata_json TEXT NOT NULL DEFAULT '{}',
131
+ created_at TEXT NOT NULL,
132
+ updated_at TEXT NOT NULL
133
+ );
134
+
135
+ CREATE INDEX IF NOT EXISTS idx_movement_trip_stops_trip
136
+ ON movement_trip_stops(trip_id, sequence_index ASC);
@@ -0,0 +1,23 @@
1
+ CREATE TABLE IF NOT EXISTS watch_capture_events (
2
+ id TEXT PRIMARY KEY,
3
+ pairing_session_id TEXT REFERENCES companion_pairing_sessions(id) ON DELETE SET NULL,
4
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
5
+ dedupe_key TEXT NOT NULL,
6
+ source_device TEXT NOT NULL DEFAULT 'Apple Watch',
7
+ event_type TEXT NOT NULL,
8
+ prompt_id TEXT,
9
+ recorded_at TEXT NOT NULL,
10
+ received_at TEXT NOT NULL,
11
+ linked_context_json TEXT NOT NULL DEFAULT '{}',
12
+ payload_json TEXT NOT NULL DEFAULT '{}',
13
+ projection_status TEXT NOT NULL DEFAULT 'stored',
14
+ projection_details_json TEXT NOT NULL DEFAULT '{}',
15
+ created_at TEXT NOT NULL,
16
+ UNIQUE (user_id, dedupe_key)
17
+ );
18
+
19
+ CREATE INDEX IF NOT EXISTS idx_watch_capture_events_user_recorded
20
+ ON watch_capture_events(user_id, recorded_at DESC);
21
+
22
+ CREATE INDEX IF NOT EXISTS idx_watch_capture_events_event_type
23
+ ON watch_capture_events(user_id, event_type, recorded_at DESC);
@@ -0,0 +1,5 @@
1
+ CREATE TABLE IF NOT EXISTS surface_layouts (
2
+ surface_id TEXT PRIMARY KEY,
3
+ payload_json TEXT NOT NULL,
4
+ updated_at TEXT NOT NULL
5
+ );
@@ -0,0 +1,10 @@
1
+ ALTER TABLE ai_processors ADD COLUMN slug TEXT NOT NULL DEFAULT '';
2
+ ALTER TABLE ai_processors ADD COLUMN agent_config_json TEXT NOT NULL DEFAULT '[]';
3
+ ALTER TABLE ai_processors ADD COLUMN run_history_json TEXT NOT NULL DEFAULT '[]';
4
+
5
+ UPDATE ai_processors
6
+ SET slug = lower(replace(replace(trim(title), ' ', '-'), '--', '-')) || '-' || substr(id, -6)
7
+ WHERE trim(slug) = '';
8
+
9
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_ai_processors_slug
10
+ ON ai_processors(slug);
@@ -0,0 +1,44 @@
1
+ CREATE TABLE IF NOT EXISTS ai_connectors (
2
+ id TEXT PRIMARY KEY,
3
+ slug TEXT NOT NULL UNIQUE,
4
+ title TEXT NOT NULL,
5
+ description TEXT NOT NULL DEFAULT '',
6
+ kind TEXT NOT NULL,
7
+ home_surface_id TEXT,
8
+ endpoint_enabled INTEGER NOT NULL DEFAULT 1,
9
+ graph_json TEXT NOT NULL,
10
+ published_outputs_json TEXT NOT NULL DEFAULT '[]',
11
+ last_run_json TEXT,
12
+ legacy_processor_id TEXT UNIQUE,
13
+ created_at TEXT NOT NULL,
14
+ updated_at TEXT NOT NULL
15
+ );
16
+
17
+ CREATE TABLE IF NOT EXISTS ai_connector_runs (
18
+ id TEXT PRIMARY KEY,
19
+ connector_id TEXT NOT NULL,
20
+ mode TEXT NOT NULL,
21
+ status TEXT NOT NULL,
22
+ user_input TEXT NOT NULL DEFAULT '',
23
+ context_json TEXT NOT NULL DEFAULT '{}',
24
+ conversation_id TEXT,
25
+ result_json TEXT,
26
+ error TEXT,
27
+ created_at TEXT NOT NULL,
28
+ completed_at TEXT,
29
+ FOREIGN KEY(connector_id) REFERENCES ai_connectors(id) ON DELETE CASCADE
30
+ );
31
+
32
+ CREATE INDEX IF NOT EXISTS idx_ai_connector_runs_connector_created
33
+ ON ai_connector_runs(connector_id, created_at DESC);
34
+
35
+ CREATE TABLE IF NOT EXISTS ai_connector_conversations (
36
+ id TEXT PRIMARY KEY,
37
+ connector_id TEXT NOT NULL UNIQUE,
38
+ provider TEXT,
39
+ external_conversation_id TEXT,
40
+ transcript_json TEXT NOT NULL DEFAULT '[]',
41
+ created_at TEXT NOT NULL,
42
+ updated_at TEXT NOT NULL,
43
+ FOREIGN KEY(connector_id) REFERENCES ai_connectors(id) ON DELETE CASCADE
44
+ );
@@ -0,0 +1,36 @@
1
+ ALTER TABLE movement_trip_points
2
+ ADD COLUMN external_uid TEXT NOT NULL DEFAULT '';
3
+
4
+ UPDATE movement_trip_points
5
+ SET external_uid = id
6
+ WHERE trim(external_uid) = '';
7
+
8
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_movement_trip_points_trip_external
9
+ ON movement_trip_points(trip_id, external_uid);
10
+
11
+ CREATE TABLE IF NOT EXISTS movement_trip_point_tombstones (
12
+ id TEXT PRIMARY KEY,
13
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
14
+ trip_external_uid TEXT NOT NULL,
15
+ point_external_uid TEXT NOT NULL,
16
+ created_at TEXT NOT NULL,
17
+ updated_at TEXT NOT NULL,
18
+ UNIQUE (user_id, trip_external_uid, point_external_uid)
19
+ );
20
+
21
+ CREATE INDEX IF NOT EXISTS idx_movement_trip_point_tombstones_user_trip
22
+ ON movement_trip_point_tombstones(user_id, trip_external_uid, updated_at DESC);
23
+
24
+ CREATE TABLE IF NOT EXISTS movement_trip_point_overrides (
25
+ id TEXT PRIMARY KEY,
26
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
27
+ trip_external_uid TEXT NOT NULL,
28
+ point_external_uid TEXT NOT NULL,
29
+ point_json TEXT NOT NULL,
30
+ created_at TEXT NOT NULL,
31
+ updated_at TEXT NOT NULL,
32
+ UNIQUE (user_id, trip_external_uid, point_external_uid)
33
+ );
34
+
35
+ CREATE INDEX IF NOT EXISTS idx_movement_trip_point_overrides_user_trip
36
+ ON movement_trip_point_overrides(user_id, trip_external_uid, updated_at DESC);
@@ -0,0 +1,49 @@
1
+ CREATE TABLE IF NOT EXISTS movement_stay_tombstones (
2
+ id TEXT PRIMARY KEY,
3
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
4
+ stay_external_uid TEXT NOT NULL,
5
+ created_at TEXT NOT NULL,
6
+ updated_at TEXT NOT NULL,
7
+ UNIQUE (user_id, stay_external_uid)
8
+ );
9
+
10
+ CREATE INDEX IF NOT EXISTS idx_movement_stay_tombstones_user
11
+ ON movement_stay_tombstones(user_id, updated_at DESC);
12
+
13
+ CREATE TABLE IF NOT EXISTS movement_stay_overrides (
14
+ id TEXT PRIMARY KEY,
15
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
16
+ stay_external_uid TEXT NOT NULL,
17
+ stay_json TEXT NOT NULL,
18
+ created_at TEXT NOT NULL,
19
+ updated_at TEXT NOT NULL,
20
+ UNIQUE (user_id, stay_external_uid)
21
+ );
22
+
23
+ CREATE INDEX IF NOT EXISTS idx_movement_stay_overrides_user
24
+ ON movement_stay_overrides(user_id, updated_at DESC);
25
+
26
+ CREATE TABLE IF NOT EXISTS movement_trip_tombstones (
27
+ id TEXT PRIMARY KEY,
28
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
29
+ trip_external_uid TEXT NOT NULL,
30
+ created_at TEXT NOT NULL,
31
+ updated_at TEXT NOT NULL,
32
+ UNIQUE (user_id, trip_external_uid)
33
+ );
34
+
35
+ CREATE INDEX IF NOT EXISTS idx_movement_trip_tombstones_user
36
+ ON movement_trip_tombstones(user_id, updated_at DESC);
37
+
38
+ CREATE TABLE IF NOT EXISTS movement_trip_overrides (
39
+ id TEXT PRIMARY KEY,
40
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
41
+ trip_external_uid TEXT NOT NULL,
42
+ trip_json TEXT NOT NULL,
43
+ created_at TEXT NOT NULL,
44
+ updated_at TEXT NOT NULL,
45
+ UNIQUE (user_id, trip_external_uid)
46
+ );
47
+
48
+ CREATE INDEX IF NOT EXISTS idx_movement_trip_overrides_user
49
+ ON movement_trip_overrides(user_id, updated_at DESC);
@@ -0,0 +1,2 @@
1
+ ALTER TABLE app_settings
2
+ ADD COLUMN google_client_id TEXT NOT NULL DEFAULT '';
@@ -0,0 +1,2 @@
1
+ ALTER TABLE app_settings
2
+ ADD COLUMN google_client_secret TEXT NOT NULL DEFAULT '';
@@ -0,0 +1,5 @@
1
+ ALTER TABLE ai_connectors
2
+ ADD COLUMN public_inputs_json TEXT NOT NULL DEFAULT '[]';
3
+
4
+ ALTER TABLE ai_connector_runs
5
+ ADD COLUMN inputs_json TEXT NOT NULL DEFAULT '{}';
@@ -0,0 +1,11 @@
1
+ CREATE TABLE IF NOT EXISTS data_management_settings (
2
+ id INTEGER PRIMARY KEY CHECK (id = 1),
3
+ preferred_data_root TEXT NOT NULL DEFAULT '',
4
+ backup_directory TEXT NOT NULL DEFAULT '',
5
+ backup_frequency_hours INTEGER,
6
+ auto_repair_enabled INTEGER NOT NULL DEFAULT 1,
7
+ last_auto_backup_at TEXT,
8
+ last_manual_backup_at TEXT,
9
+ created_at TEXT NOT NULL,
10
+ updated_at TEXT NOT NULL
11
+ );
@@ -0,0 +1,114 @@
1
+ ALTER TABLE tasks
2
+ ADD COLUMN resolution_kind TEXT;
3
+
4
+ ALTER TABLE tasks
5
+ ADD COLUMN split_parent_task_id TEXT;
6
+
7
+ CREATE TABLE IF NOT EXISTS life_force_profiles (
8
+ user_id TEXT PRIMARY KEY,
9
+ base_daily_ap INTEGER NOT NULL DEFAULT 200,
10
+ readiness_multiplier REAL NOT NULL DEFAULT 1.0,
11
+ life_force_level INTEGER NOT NULL DEFAULT 1,
12
+ activation_level INTEGER NOT NULL DEFAULT 1,
13
+ focus_level INTEGER NOT NULL DEFAULT 1,
14
+ vigor_level INTEGER NOT NULL DEFAULT 1,
15
+ composure_level INTEGER NOT NULL DEFAULT 1,
16
+ flow_level INTEGER NOT NULL DEFAULT 1,
17
+ created_at TEXT NOT NULL,
18
+ updated_at TEXT NOT NULL
19
+ );
20
+
21
+ CREATE TABLE IF NOT EXISTS life_force_weekday_templates (
22
+ id TEXT PRIMARY KEY,
23
+ user_id TEXT NOT NULL,
24
+ weekday INTEGER NOT NULL,
25
+ baseline_daily_ap INTEGER NOT NULL DEFAULT 200,
26
+ points_json TEXT NOT NULL,
27
+ created_at TEXT NOT NULL,
28
+ updated_at TEXT NOT NULL,
29
+ UNIQUE(user_id, weekday)
30
+ );
31
+
32
+ CREATE TABLE IF NOT EXISTS life_force_day_snapshots (
33
+ id TEXT PRIMARY KEY,
34
+ user_id TEXT NOT NULL,
35
+ date_key TEXT NOT NULL,
36
+ daily_budget_ap REAL NOT NULL,
37
+ sleep_recovery_multiplier REAL NOT NULL DEFAULT 1.0,
38
+ readiness_multiplier REAL NOT NULL DEFAULT 1.0,
39
+ fatigue_debt_carry REAL NOT NULL DEFAULT 0,
40
+ points_json TEXT NOT NULL,
41
+ created_at TEXT NOT NULL,
42
+ updated_at TEXT NOT NULL,
43
+ UNIQUE(user_id, date_key)
44
+ );
45
+
46
+ CREATE TABLE IF NOT EXISTS action_profile_templates (
47
+ id TEXT PRIMARY KEY,
48
+ profile_key TEXT NOT NULL UNIQUE,
49
+ entity_type TEXT,
50
+ title TEXT NOT NULL,
51
+ profile_json TEXT NOT NULL,
52
+ created_at TEXT NOT NULL,
53
+ updated_at TEXT NOT NULL
54
+ );
55
+
56
+ CREATE TABLE IF NOT EXISTS entity_action_profiles (
57
+ id TEXT PRIMARY KEY,
58
+ entity_type TEXT NOT NULL,
59
+ entity_id TEXT NOT NULL,
60
+ profile_json TEXT NOT NULL,
61
+ created_at TEXT NOT NULL,
62
+ updated_at TEXT NOT NULL,
63
+ UNIQUE(entity_type, entity_id)
64
+ );
65
+
66
+ CREATE TABLE IF NOT EXISTS ap_ledger_events (
67
+ id TEXT PRIMARY KEY,
68
+ user_id TEXT NOT NULL,
69
+ date_key TEXT NOT NULL,
70
+ entity_type TEXT NOT NULL,
71
+ entity_id TEXT NOT NULL,
72
+ event_kind TEXT NOT NULL,
73
+ source_kind TEXT NOT NULL,
74
+ starts_at TEXT,
75
+ ends_at TEXT,
76
+ total_ap REAL NOT NULL,
77
+ rate_ap_per_hour REAL,
78
+ metadata_json TEXT NOT NULL DEFAULT '{}',
79
+ created_at TEXT NOT NULL
80
+ );
81
+
82
+ CREATE INDEX IF NOT EXISTS idx_ap_ledger_user_date
83
+ ON ap_ledger_events(user_id, date_key, created_at DESC);
84
+
85
+ CREATE INDEX IF NOT EXISTS idx_ap_ledger_entity
86
+ ON ap_ledger_events(entity_type, entity_id, created_at DESC);
87
+
88
+ CREATE TABLE IF NOT EXISTS stat_xp_events (
89
+ id TEXT PRIMARY KEY,
90
+ user_id TEXT NOT NULL,
91
+ stat_key TEXT NOT NULL,
92
+ delta_xp REAL NOT NULL,
93
+ entity_type TEXT,
94
+ entity_id TEXT,
95
+ metadata_json TEXT NOT NULL DEFAULT '{}',
96
+ created_at TEXT NOT NULL
97
+ );
98
+
99
+ CREATE INDEX IF NOT EXISTS idx_stat_xp_user_stat
100
+ ON stat_xp_events(user_id, stat_key, created_at DESC);
101
+
102
+ CREATE TABLE IF NOT EXISTS fatigue_signals (
103
+ id TEXT PRIMARY KEY,
104
+ user_id TEXT NOT NULL,
105
+ date_key TEXT NOT NULL,
106
+ signal_type TEXT NOT NULL,
107
+ observed_at TEXT NOT NULL,
108
+ note TEXT NOT NULL DEFAULT '',
109
+ delta REAL NOT NULL DEFAULT 0,
110
+ created_at TEXT NOT NULL
111
+ );
112
+
113
+ CREATE INDEX IF NOT EXISTS idx_fatigue_signals_user_date
114
+ ON fatigue_signals(user_id, date_key, observed_at DESC);
@@ -0,0 +1,89 @@
1
+ CREATE TABLE IF NOT EXISTS screen_time_settings (
2
+ user_id TEXT PRIMARY KEY REFERENCES users(id) ON DELETE CASCADE,
3
+ tracking_enabled INTEGER NOT NULL DEFAULT 0,
4
+ sync_enabled INTEGER NOT NULL DEFAULT 1,
5
+ authorization_status TEXT NOT NULL DEFAULT 'not_determined',
6
+ capture_state TEXT NOT NULL DEFAULT 'disabled',
7
+ last_captured_day_key TEXT,
8
+ last_capture_started_at TEXT,
9
+ last_capture_ended_at TEXT,
10
+ metadata_json TEXT NOT NULL DEFAULT '{}',
11
+ created_at TEXT NOT NULL,
12
+ updated_at TEXT NOT NULL
13
+ );
14
+
15
+ CREATE TABLE IF NOT EXISTS screen_time_day_summaries (
16
+ id TEXT PRIMARY KEY,
17
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
18
+ pairing_session_id TEXT REFERENCES companion_pairing_sessions(id) ON DELETE SET NULL,
19
+ source_device TEXT NOT NULL DEFAULT 'iPhone',
20
+ date_key TEXT NOT NULL,
21
+ total_activity_seconds INTEGER NOT NULL DEFAULT 0,
22
+ pickup_count INTEGER NOT NULL DEFAULT 0,
23
+ notification_count INTEGER NOT NULL DEFAULT 0,
24
+ first_pickup_at TEXT,
25
+ longest_activity_seconds INTEGER NOT NULL DEFAULT 0,
26
+ top_app_bundle_ids_json TEXT NOT NULL DEFAULT '[]',
27
+ top_category_labels_json TEXT NOT NULL DEFAULT '[]',
28
+ metadata_json TEXT NOT NULL DEFAULT '{}',
29
+ created_at TEXT NOT NULL,
30
+ updated_at TEXT NOT NULL,
31
+ UNIQUE (user_id, source_device, date_key)
32
+ );
33
+
34
+ CREATE INDEX IF NOT EXISTS idx_screen_time_day_summaries_user
35
+ ON screen_time_day_summaries(user_id, date_key DESC);
36
+
37
+ CREATE TABLE IF NOT EXISTS screen_time_hourly_segments (
38
+ id TEXT PRIMARY KEY,
39
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
40
+ pairing_session_id TEXT REFERENCES companion_pairing_sessions(id) ON DELETE SET NULL,
41
+ source_device TEXT NOT NULL DEFAULT 'iPhone',
42
+ date_key TEXT NOT NULL,
43
+ hour_index INTEGER NOT NULL,
44
+ started_at TEXT NOT NULL,
45
+ ended_at TEXT NOT NULL,
46
+ total_activity_seconds INTEGER NOT NULL DEFAULT 0,
47
+ pickup_count INTEGER NOT NULL DEFAULT 0,
48
+ notification_count INTEGER NOT NULL DEFAULT 0,
49
+ first_pickup_at TEXT,
50
+ longest_activity_started_at TEXT,
51
+ longest_activity_ended_at TEXT,
52
+ metadata_json TEXT NOT NULL DEFAULT '{}',
53
+ created_at TEXT NOT NULL,
54
+ updated_at TEXT NOT NULL,
55
+ UNIQUE (user_id, source_device, date_key, hour_index)
56
+ );
57
+
58
+ CREATE INDEX IF NOT EXISTS idx_screen_time_hourly_segments_user
59
+ ON screen_time_hourly_segments(user_id, started_at DESC);
60
+
61
+ CREATE TABLE IF NOT EXISTS screen_time_app_usage (
62
+ id TEXT PRIMARY KEY,
63
+ segment_id TEXT NOT NULL REFERENCES screen_time_hourly_segments(id) ON DELETE CASCADE,
64
+ bundle_identifier TEXT NOT NULL,
65
+ display_name TEXT NOT NULL DEFAULT '',
66
+ category_label TEXT,
67
+ total_activity_seconds INTEGER NOT NULL DEFAULT 0,
68
+ pickup_count INTEGER NOT NULL DEFAULT 0,
69
+ notification_count INTEGER NOT NULL DEFAULT 0,
70
+ created_at TEXT NOT NULL,
71
+ updated_at TEXT NOT NULL,
72
+ UNIQUE (segment_id, bundle_identifier)
73
+ );
74
+
75
+ CREATE INDEX IF NOT EXISTS idx_screen_time_app_usage_segment
76
+ ON screen_time_app_usage(segment_id, total_activity_seconds DESC);
77
+
78
+ CREATE TABLE IF NOT EXISTS screen_time_category_usage (
79
+ id TEXT PRIMARY KEY,
80
+ segment_id TEXT NOT NULL REFERENCES screen_time_hourly_segments(id) ON DELETE CASCADE,
81
+ category_label TEXT NOT NULL,
82
+ total_activity_seconds INTEGER NOT NULL DEFAULT 0,
83
+ created_at TEXT NOT NULL,
84
+ updated_at TEXT NOT NULL,
85
+ UNIQUE (segment_id, category_label)
86
+ );
87
+
88
+ CREATE INDEX IF NOT EXISTS idx_screen_time_category_usage_segment
89
+ ON screen_time_category_usage(segment_id, total_activity_seconds DESC);
@@ -0,0 +1,21 @@
1
+ CREATE TABLE IF NOT EXISTS companion_pairing_source_states (
2
+ id TEXT PRIMARY KEY,
3
+ pairing_session_id TEXT NOT NULL REFERENCES companion_pairing_sessions(id) ON DELETE CASCADE,
4
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
5
+ source_key TEXT NOT NULL,
6
+ desired_enabled INTEGER NOT NULL DEFAULT 1,
7
+ applied_enabled INTEGER NOT NULL DEFAULT 0,
8
+ authorization_status TEXT NOT NULL DEFAULT 'not_determined',
9
+ sync_eligible INTEGER NOT NULL DEFAULT 0,
10
+ last_observed_at TEXT,
11
+ metadata_json TEXT NOT NULL DEFAULT '{}',
12
+ created_at TEXT NOT NULL,
13
+ updated_at TEXT NOT NULL,
14
+ UNIQUE (pairing_session_id, source_key)
15
+ );
16
+
17
+ CREATE INDEX IF NOT EXISTS idx_companion_pairing_source_states_pairing
18
+ ON companion_pairing_source_states(pairing_session_id, source_key);
19
+
20
+ CREATE INDEX IF NOT EXISTS idx_companion_pairing_source_states_user
21
+ ON companion_pairing_source_states(user_id, updated_at DESC);
@@ -0,0 +1,47 @@
1
+ CREATE TABLE IF NOT EXISTS movement_boxes (
2
+ id TEXT PRIMARY KEY,
3
+ user_id TEXT NOT NULL,
4
+ kind TEXT NOT NULL CHECK (kind IN ('stay', 'trip', 'missing')),
5
+ source_kind TEXT NOT NULL CHECK (source_kind IN ('automatic', 'user_defined')),
6
+ origin TEXT NOT NULL CHECK (
7
+ origin IN (
8
+ 'recorded',
9
+ 'continued_stay',
10
+ 'repaired_gap',
11
+ 'missing',
12
+ 'user_defined',
13
+ 'user_invalidated'
14
+ )
15
+ ),
16
+ started_at TEXT NOT NULL,
17
+ ended_at TEXT NOT NULL,
18
+ title TEXT NOT NULL DEFAULT '',
19
+ subtitle TEXT NOT NULL DEFAULT '',
20
+ place_label TEXT,
21
+ anchor_external_uid TEXT,
22
+ tags_json TEXT NOT NULL DEFAULT '[]',
23
+ distance_meters REAL,
24
+ average_speed_mps REAL,
25
+ editable INTEGER NOT NULL DEFAULT 0,
26
+ override_count INTEGER NOT NULL DEFAULT 0,
27
+ overridden_automatic_box_ids_json TEXT NOT NULL DEFAULT '[]',
28
+ raw_stay_ids_json TEXT NOT NULL DEFAULT '[]',
29
+ raw_trip_ids_json TEXT NOT NULL DEFAULT '[]',
30
+ raw_point_count INTEGER NOT NULL DEFAULT 0,
31
+ has_legacy_corrections INTEGER NOT NULL DEFAULT 0,
32
+ legacy_origin_key TEXT,
33
+ metadata_json TEXT NOT NULL DEFAULT '{}',
34
+ deleted_at TEXT,
35
+ created_at TEXT NOT NULL,
36
+ updated_at TEXT NOT NULL
37
+ );
38
+
39
+ CREATE INDEX IF NOT EXISTS idx_movement_boxes_user_time
40
+ ON movement_boxes(user_id, started_at, ended_at);
41
+
42
+ CREATE INDEX IF NOT EXISTS idx_movement_boxes_user_source
43
+ ON movement_boxes(user_id, source_kind, deleted_at, started_at);
44
+
45
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_movement_boxes_legacy_origin
46
+ ON movement_boxes(user_id, legacy_origin_key)
47
+ WHERE legacy_origin_key IS NOT NULL;
@@ -0,0 +1,26 @@
1
+ ALTER TABLE movement_boxes
2
+ ADD COLUMN true_started_at TEXT;
3
+
4
+ ALTER TABLE movement_boxes
5
+ ADD COLUMN true_ended_at TEXT;
6
+
7
+ ALTER TABLE movement_boxes
8
+ ADD COLUMN overridden_started_at TEXT;
9
+
10
+ ALTER TABLE movement_boxes
11
+ ADD COLUMN overridden_ended_at TEXT;
12
+
13
+ ALTER TABLE movement_boxes
14
+ ADD COLUMN overridden_by_box_id TEXT;
15
+
16
+ ALTER TABLE movement_boxes
17
+ ADD COLUMN overridden_user_box_ids_json TEXT NOT NULL DEFAULT '[]';
18
+
19
+ ALTER TABLE movement_boxes
20
+ ADD COLUMN override_ranges_json TEXT NOT NULL DEFAULT '[]';
21
+
22
+ ALTER TABLE movement_boxes
23
+ ADD COLUMN is_overridden INTEGER NOT NULL DEFAULT 0;
24
+
25
+ ALTER TABLE movement_boxes
26
+ ADD COLUMN is_fully_hidden INTEGER NOT NULL DEFAULT 0;