forge-openclaw-plugin 0.2.24 → 0.2.26

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 (208) hide show
  1. package/README.md +13 -0
  2. package/dist/assets/{board-_C6oMy5w.js → board-ta0rUHOf.js} +3 -3
  3. package/dist/assets/{board-_C6oMy5w.js.map → board-ta0rUHOf.js.map} +1 -1
  4. package/dist/assets/index-Ro0ZF_az.css +1 -0
  5. package/dist/assets/index-ytlpSj23.js +79 -0
  6. package/dist/assets/index-ytlpSj23.js.map +1 -0
  7. package/dist/assets/{motion-D4sZgCHd.js → motion-fBKPB6yw.js} +3 -3
  8. package/dist/assets/motion-fBKPB6yw.js.map +1 -0
  9. package/dist/assets/{table-BWzTaky1.js → table-C-IGTQni.js} +2 -2
  10. package/dist/assets/{table-BWzTaky1.js.map → table-C-IGTQni.js.map} +1 -1
  11. package/dist/assets/{ui-BzK4azQb.js → ui-DInOpaYF.js} +2 -2
  12. package/dist/assets/{ui-BzK4azQb.js.map → ui-DInOpaYF.js.map} +1 -1
  13. package/dist/assets/vendor-lE3tZJcC.js +876 -0
  14. package/dist/assets/vendor-lE3tZJcC.js.map +1 -0
  15. package/dist/index.html +7 -8
  16. package/dist/openclaw/local-runtime.d.ts +3 -1
  17. package/dist/openclaw/local-runtime.js +51 -15
  18. package/dist/openclaw/parity.d.ts +1 -1
  19. package/dist/openclaw/parity.js +29 -0
  20. package/dist/openclaw/plugin-entry-shared.d.ts +1 -0
  21. package/dist/openclaw/plugin-entry-shared.js +31 -6
  22. package/dist/openclaw/plugin-sdk-types.d.ts +29 -0
  23. package/dist/openclaw/routes.js +236 -0
  24. package/dist/openclaw/session-bootstrap.d.ts +78 -0
  25. package/dist/openclaw/session-bootstrap.js +240 -0
  26. package/dist/openclaw/tools.js +279 -6
  27. package/dist/server/server/migrations/001_core.sql +411 -0
  28. package/dist/server/server/migrations/002_psyche.sql +392 -0
  29. package/dist/server/server/migrations/003_habits.sql +30 -0
  30. package/dist/server/server/migrations/004_habit_links.sql +8 -0
  31. package/dist/server/server/migrations/005_habit_psyche_links.sql +24 -0
  32. package/dist/server/server/migrations/006_work_adjustments.sql +14 -0
  33. package/dist/server/server/migrations/007_weekly_review_closures.sql +17 -0
  34. package/dist/server/server/migrations/008_calendar_execution.sql +147 -0
  35. package/dist/server/server/migrations/009_true_calendar_events.sql +195 -0
  36. package/dist/server/server/migrations/010_calendar_selection_state.sql +6 -0
  37. package/dist/server/server/migrations/011_calendar_timezone_backfill.sql +11 -0
  38. package/dist/server/server/migrations/012_work_block_ranges.sql +7 -0
  39. package/dist/server/server/migrations/013_microsoft_local_auth_settings.sql +8 -0
  40. package/dist/server/server/migrations/014_note_tags_and_ephemeral.sql +8 -0
  41. package/dist/server/server/migrations/015_multi_user_and_strategies.sql +244 -0
  42. package/dist/server/server/migrations/016_health_companion.sql +158 -0
  43. package/dist/server/server/migrations/016_strategy_contracts_and_user_graph.sql +22 -0
  44. package/dist/server/server/migrations/017_preferences.sql +131 -0
  45. package/dist/server/server/migrations/018_preference_catalogs.sql +31 -0
  46. package/dist/server/server/migrations/019_wiki_memory.sql +255 -0
  47. package/dist/server/server/migrations/020_wiki_page_hierarchy.sql +11 -0
  48. package/dist/server/server/migrations/021_hide_evidence_from_wiki_index.sql +3 -0
  49. package/dist/server/server/migrations/022_wiki_ingest_background.sql +85 -0
  50. package/dist/server/server/migrations/023_diagnostic_logs.sql +28 -0
  51. package/dist/server/server/migrations/024_questionnaires.sql +96 -0
  52. package/dist/server/server/migrations/025_ai_model_connections.sql +26 -0
  53. package/dist/server/server/migrations/026_custom_theme_settings.sql +2 -0
  54. package/dist/server/server/migrations/027_ai_processors.sql +31 -0
  55. package/dist/server/server/migrations/028_movement_domain.sql +136 -0
  56. package/dist/server/server/migrations/029_watch_micro_capture.sql +23 -0
  57. package/dist/server/server/migrations/030_surface_layouts.sql +5 -0
  58. package/dist/server/server/migrations/031_ai_processor_runtime_upgrades.sql +10 -0
  59. package/dist/server/server/migrations/032_ai_connectors.sql +44 -0
  60. package/dist/server/server/migrations/033_movement_trip_point_sync.sql +36 -0
  61. package/dist/server/server/migrations/034_movement_segment_sync.sql +49 -0
  62. package/dist/server/server/migrations/035_google_local_auth_settings.sql +2 -0
  63. package/dist/server/server/migrations/036_google_local_auth_client_secret.sql +2 -0
  64. package/dist/server/{app.js → server/src/app.js} +992 -25
  65. package/dist/server/server/src/connectors/box-registry.js +188 -0
  66. package/dist/server/{db.js → server/src/db.js} +6 -0
  67. package/dist/server/server/src/debug.js +19 -0
  68. package/dist/server/server/src/discovery-advertiser.js +114 -0
  69. package/dist/server/{health.js → server/src/health.js} +39 -11
  70. package/dist/server/{index.js → server/src/index.js} +4 -0
  71. package/dist/server/{managers → server/src/managers}/platform/llm-manager.js +40 -4
  72. package/dist/server/{managers → server/src/managers}/platform/openai-responses-provider.js +129 -19
  73. package/dist/server/server/src/movement.js +2935 -0
  74. package/dist/server/{openapi.js → server/src/openapi.js} +628 -5
  75. package/dist/server/{psyche-types.js → server/src/psyche-types.js} +15 -1
  76. package/dist/server/server/src/questionnaire-flow.js +552 -0
  77. package/dist/server/server/src/questionnaire-seeds.js +853 -0
  78. package/dist/server/server/src/questionnaire-types.js +340 -0
  79. package/dist/server/server/src/repositories/ai-connectors.js +1207 -0
  80. package/dist/server/server/src/repositories/ai-processors.js +547 -0
  81. package/dist/server/{repositories → server/src/repositories}/calendar.js +1 -1
  82. package/dist/server/{repositories → server/src/repositories}/entity-ownership.js +9 -1
  83. package/dist/server/{repositories → server/src/repositories}/habits.js +69 -5
  84. package/dist/server/server/src/repositories/model-settings.js +216 -0
  85. package/dist/server/{repositories → server/src/repositories}/notes.js +57 -15
  86. package/dist/server/{repositories → server/src/repositories}/preferences.js +124 -0
  87. package/dist/server/server/src/repositories/questionnaires.js +1338 -0
  88. package/dist/server/{repositories → server/src/repositories}/settings.js +156 -12
  89. package/dist/server/server/src/repositories/surface-layouts.js +76 -0
  90. package/dist/server/{repositories → server/src/repositories}/wiki-memory.js +5 -1
  91. package/dist/server/{services → server/src/services}/calendar-runtime.js +775 -58
  92. package/dist/server/{services → server/src/services}/entity-crud.js +81 -2
  93. package/dist/server/server/src/services/google-calendar-oauth-config.js +176 -0
  94. package/dist/server/server/src/services/openai-codex-oauth.js +153 -0
  95. package/dist/server/server/src/services/psyche-observation-calendar.js +46 -0
  96. package/dist/server/{types.js → server/src/types.js} +621 -14
  97. package/dist/server/server/src/watch-mobile.js +562 -0
  98. package/dist/server/{web.js → server/src/web.js} +30 -4
  99. package/dist/server/src/components/customization/utility-widgets.js +330 -0
  100. package/dist/server/src/components/workbench-boxes/health/health-boxes.js +92 -0
  101. package/dist/server/src/components/workbench-boxes/kanban/kanban-boxes.js +128 -0
  102. package/dist/server/src/components/workbench-boxes/movement/movement-boxes.js +37 -0
  103. package/dist/server/src/components/workbench-boxes/notes/notes-boxes.js +114 -0
  104. package/dist/server/src/components/workbench-boxes/projects/projects-boxes.js +57 -0
  105. package/dist/server/src/components/workbench-boxes/shared/define-workbench-box.js +4 -0
  106. package/dist/server/src/components/workbench-boxes/shared/generic-node-view.js +13 -0
  107. package/dist/server/src/components/workbench-boxes/today/today-boxes.js +63 -0
  108. package/dist/server/src/lib/api-error.js +37 -0
  109. package/dist/server/src/lib/api.js +1859 -0
  110. package/dist/server/src/lib/calendar-name-deduper.js +144 -0
  111. package/dist/server/src/lib/diagnostics.js +67 -0
  112. package/dist/server/src/lib/psyche-types.js +1 -0
  113. package/dist/server/src/lib/questionnaire-types.js +1 -0
  114. package/dist/server/src/lib/runtime-paths.js +24 -0
  115. package/dist/server/src/lib/schemas.js +234 -0
  116. package/dist/server/src/lib/snapshot-normalizer.js +374 -0
  117. package/dist/server/src/lib/theme-system.js +319 -0
  118. package/dist/server/src/lib/types.js +1 -0
  119. package/dist/server/src/lib/utils.js +22 -0
  120. package/dist/server/src/lib/workbench/boxes.js +16 -0
  121. package/dist/server/src/lib/workbench/nodes.js +15 -0
  122. package/dist/server/src/lib/workbench/registry.js +73 -0
  123. package/dist/server/src/lib/workbench/runtime.js +181 -0
  124. package/openclaw.plugin.json +1 -1
  125. package/package.json +6 -1
  126. package/server/index.js +68 -0
  127. package/server/migrations/024_questionnaires.sql +96 -0
  128. package/server/migrations/025_ai_model_connections.sql +26 -0
  129. package/server/migrations/026_custom_theme_settings.sql +2 -0
  130. package/server/migrations/027_ai_processors.sql +31 -0
  131. package/server/migrations/028_movement_domain.sql +136 -0
  132. package/server/migrations/029_watch_micro_capture.sql +23 -0
  133. package/server/migrations/030_surface_layouts.sql +5 -0
  134. package/server/migrations/031_ai_processor_runtime_upgrades.sql +10 -0
  135. package/server/migrations/032_ai_connectors.sql +44 -0
  136. package/server/migrations/033_movement_trip_point_sync.sql +36 -0
  137. package/server/migrations/034_movement_segment_sync.sql +49 -0
  138. package/server/migrations/035_google_local_auth_settings.sql +2 -0
  139. package/server/migrations/036_google_local_auth_client_secret.sql +2 -0
  140. package/skills/forge-openclaw/SKILL.md +15 -1
  141. package/skills/forge-openclaw/entity_conversation_playbooks.md +523 -87
  142. package/skills/forge-openclaw/psyche_entity_playbooks.md +331 -221
  143. package/dist/assets/index-DTCwBWAs.js +0 -65
  144. package/dist/assets/index-DTCwBWAs.js.map +0 -1
  145. package/dist/assets/index-DttXlAgi.css +0 -1
  146. package/dist/assets/motion-D4sZgCHd.js.map +0 -1
  147. package/dist/assets/vendor-De38P6YR.js +0 -729
  148. package/dist/assets/vendor-De38P6YR.js.map +0 -1
  149. package/dist/assets/viz-C6hfyqzu.js +0 -34
  150. package/dist/assets/viz-C6hfyqzu.js.map +0 -1
  151. package/skills/forge-openclaw/cron_jobs.md +0 -395
  152. /package/dist/server/{demo-data.js → server/src/demo-data.js} +0 -0
  153. /package/dist/server/{e2e-server.js → server/src/e2e-server.js} +0 -0
  154. /package/dist/server/{errors.js → server/src/errors.js} +0 -0
  155. /package/dist/server/{managers → server/src/managers}/base.js +0 -0
  156. /package/dist/server/{managers → server/src/managers}/contracts.js +0 -0
  157. /package/dist/server/{managers → server/src/managers}/platform/api-gateway-manager.js +0 -0
  158. /package/dist/server/{managers → server/src/managers}/platform/audit-manager.js +0 -0
  159. /package/dist/server/{managers → server/src/managers}/platform/authentication-manager.js +0 -0
  160. /package/dist/server/{managers → server/src/managers}/platform/authorization-manager.js +0 -0
  161. /package/dist/server/{managers → server/src/managers}/platform/background-job-manager.js +0 -0
  162. /package/dist/server/{managers → server/src/managers}/platform/configuration-manager.js +0 -0
  163. /package/dist/server/{managers → server/src/managers}/platform/database-manager.js +0 -0
  164. /package/dist/server/{managers → server/src/managers}/platform/event-bus-manager.js +0 -0
  165. /package/dist/server/{managers → server/src/managers}/platform/external-service-manager.js +0 -0
  166. /package/dist/server/{managers → server/src/managers}/platform/health-manager.js +0 -0
  167. /package/dist/server/{managers → server/src/managers}/platform/migration-manager.js +0 -0
  168. /package/dist/server/{managers → server/src/managers}/platform/search-index-manager.js +0 -0
  169. /package/dist/server/{managers → server/src/managers}/platform/secrets-manager.js +0 -0
  170. /package/dist/server/{managers → server/src/managers}/platform/session-manager.js +0 -0
  171. /package/dist/server/{managers → server/src/managers}/platform/storage-manager.js +0 -0
  172. /package/dist/server/{managers → server/src/managers}/platform/token-manager.js +0 -0
  173. /package/dist/server/{managers → server/src/managers}/platform/transaction-manager.js +0 -0
  174. /package/dist/server/{managers → server/src/managers}/platform/trusted-network.js +0 -0
  175. /package/dist/server/{managers → server/src/managers}/runtime.js +0 -0
  176. /package/dist/server/{managers → server/src/managers}/type-guards.js +0 -0
  177. /package/dist/server/{preferences-seeds.js → server/src/preferences-seeds.js} +0 -0
  178. /package/dist/server/{preferences-types.js → server/src/preferences-types.js} +0 -0
  179. /package/dist/server/{repositories → server/src/repositories}/activity-events.js +0 -0
  180. /package/dist/server/{repositories → server/src/repositories}/collaboration.js +0 -0
  181. /package/dist/server/{repositories → server/src/repositories}/deleted-entities.js +0 -0
  182. /package/dist/server/{repositories → server/src/repositories}/diagnostic-logs.js +0 -0
  183. /package/dist/server/{repositories → server/src/repositories}/domains.js +0 -0
  184. /package/dist/server/{repositories → server/src/repositories}/event-log.js +0 -0
  185. /package/dist/server/{repositories → server/src/repositories}/goals.js +0 -0
  186. /package/dist/server/{repositories → server/src/repositories}/projects.js +0 -0
  187. /package/dist/server/{repositories → server/src/repositories}/psyche.js +0 -0
  188. /package/dist/server/{repositories → server/src/repositories}/rewards.js +0 -0
  189. /package/dist/server/{repositories → server/src/repositories}/strategies.js +0 -0
  190. /package/dist/server/{repositories → server/src/repositories}/tags.js +0 -0
  191. /package/dist/server/{repositories → server/src/repositories}/task-runs.js +0 -0
  192. /package/dist/server/{repositories → server/src/repositories}/tasks.js +0 -0
  193. /package/dist/server/{repositories → server/src/repositories}/users.js +0 -0
  194. /package/dist/server/{repositories → server/src/repositories}/weekly-reviews.js +0 -0
  195. /package/dist/server/{repositories → server/src/repositories}/work-adjustments.js +0 -0
  196. /package/dist/server/{seed-demo.js → server/src/seed-demo.js} +0 -0
  197. /package/dist/server/{services → server/src/services}/context.js +0 -0
  198. /package/dist/server/{services → server/src/services}/dashboard.js +0 -0
  199. /package/dist/server/{services → server/src/services}/gamification.js +0 -0
  200. /package/dist/server/{services → server/src/services}/insights.js +0 -0
  201. /package/dist/server/{services → server/src/services}/projects.js +0 -0
  202. /package/dist/server/{services → server/src/services}/psyche.js +0 -0
  203. /package/dist/server/{services → server/src/services}/relations.js +0 -0
  204. /package/dist/server/{services → server/src/services}/reviews.js +0 -0
  205. /package/dist/server/{services → server/src/services}/run-recovery.js +0 -0
  206. /package/dist/server/{services → server/src/services}/tagging.js +0 -0
  207. /package/dist/server/{services → server/src/services}/task-run-watchdog.js +0 -0
  208. /package/dist/server/{services → server/src/services}/work-time.js +0 -0
@@ -0,0 +1,131 @@
1
+ CREATE TABLE IF NOT EXISTS preference_profiles (
2
+ id TEXT PRIMARY KEY,
3
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
4
+ domain TEXT NOT NULL,
5
+ default_context_id TEXT,
6
+ model_version TEXT NOT NULL,
7
+ created_at TEXT NOT NULL,
8
+ updated_at TEXT NOT NULL,
9
+ UNIQUE (user_id, domain)
10
+ );
11
+
12
+ CREATE TABLE IF NOT EXISTS preference_contexts (
13
+ id TEXT PRIMARY KEY,
14
+ profile_id TEXT NOT NULL REFERENCES preference_profiles(id) ON DELETE CASCADE,
15
+ name TEXT NOT NULL,
16
+ description TEXT NOT NULL DEFAULT '',
17
+ share_mode TEXT NOT NULL DEFAULT 'blended' CHECK (share_mode IN ('shared', 'isolated', 'blended')),
18
+ active INTEGER NOT NULL DEFAULT 1,
19
+ is_default INTEGER NOT NULL DEFAULT 0,
20
+ decay_days INTEGER NOT NULL DEFAULT 90,
21
+ created_at TEXT NOT NULL,
22
+ updated_at TEXT NOT NULL
23
+ );
24
+
25
+ CREATE TABLE IF NOT EXISTS preference_items (
26
+ id TEXT PRIMARY KEY,
27
+ profile_id TEXT NOT NULL REFERENCES preference_profiles(id) ON DELETE CASCADE,
28
+ label TEXT NOT NULL,
29
+ description TEXT NOT NULL DEFAULT '',
30
+ tags_json TEXT NOT NULL DEFAULT '[]',
31
+ feature_weights_json TEXT NOT NULL DEFAULT '{}',
32
+ source_entity_type TEXT,
33
+ source_entity_id 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 pairwise_judgments (
40
+ id TEXT PRIMARY KEY,
41
+ profile_id TEXT NOT NULL REFERENCES preference_profiles(id) ON DELETE CASCADE,
42
+ context_id TEXT NOT NULL REFERENCES preference_contexts(id) ON DELETE CASCADE,
43
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
44
+ left_item_id TEXT NOT NULL REFERENCES preference_items(id) ON DELETE CASCADE,
45
+ right_item_id TEXT NOT NULL REFERENCES preference_items(id) ON DELETE CASCADE,
46
+ outcome TEXT NOT NULL CHECK (outcome IN ('left', 'right', 'tie', 'skip')),
47
+ strength REAL NOT NULL DEFAULT 1,
48
+ response_time_ms INTEGER,
49
+ source TEXT NOT NULL DEFAULT 'ui',
50
+ reason_tags_json TEXT NOT NULL DEFAULT '[]',
51
+ created_at TEXT NOT NULL
52
+ );
53
+
54
+ CREATE TABLE IF NOT EXISTS absolute_signals (
55
+ id TEXT PRIMARY KEY,
56
+ profile_id TEXT NOT NULL REFERENCES preference_profiles(id) ON DELETE CASCADE,
57
+ context_id TEXT NOT NULL REFERENCES preference_contexts(id) ON DELETE CASCADE,
58
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
59
+ item_id TEXT NOT NULL REFERENCES preference_items(id) ON DELETE CASCADE,
60
+ signal_type TEXT NOT NULL CHECK (signal_type IN ('favorite', 'veto', 'must_have', 'bookmark', 'neutral', 'compare_later')),
61
+ strength REAL NOT NULL DEFAULT 1,
62
+ source TEXT NOT NULL DEFAULT 'ui',
63
+ created_at TEXT NOT NULL
64
+ );
65
+
66
+ CREATE TABLE IF NOT EXISTS preference_item_scores (
67
+ id TEXT PRIMARY KEY,
68
+ profile_id TEXT NOT NULL REFERENCES preference_profiles(id) ON DELETE CASCADE,
69
+ context_id TEXT NOT NULL REFERENCES preference_contexts(id) ON DELETE CASCADE,
70
+ item_id TEXT NOT NULL REFERENCES preference_items(id) ON DELETE CASCADE,
71
+ latent_score REAL NOT NULL DEFAULT 0,
72
+ confidence REAL NOT NULL DEFAULT 0,
73
+ uncertainty REAL NOT NULL DEFAULT 1,
74
+ evidence_count INTEGER NOT NULL DEFAULT 0,
75
+ pairwise_wins INTEGER NOT NULL DEFAULT 0,
76
+ pairwise_losses INTEGER NOT NULL DEFAULT 0,
77
+ pairwise_ties INTEGER NOT NULL DEFAULT 0,
78
+ signal_count INTEGER NOT NULL DEFAULT 0,
79
+ conflict_count INTEGER NOT NULL DEFAULT 0,
80
+ status TEXT NOT NULL DEFAULT 'uncertain',
81
+ dominant_dimensions_json TEXT NOT NULL DEFAULT '[]',
82
+ explanation_json TEXT NOT NULL DEFAULT '[]',
83
+ manual_status TEXT,
84
+ manual_score REAL,
85
+ confidence_lock REAL,
86
+ bookmarked INTEGER NOT NULL DEFAULT 0,
87
+ compare_later INTEGER NOT NULL DEFAULT 0,
88
+ frozen INTEGER NOT NULL DEFAULT 0,
89
+ last_inferred_at TEXT NOT NULL,
90
+ last_judgment_at TEXT,
91
+ updated_at TEXT NOT NULL,
92
+ UNIQUE (context_id, item_id)
93
+ );
94
+
95
+ CREATE TABLE IF NOT EXISTS preference_dimension_summaries (
96
+ id TEXT PRIMARY KEY,
97
+ profile_id TEXT NOT NULL REFERENCES preference_profiles(id) ON DELETE CASCADE,
98
+ context_id TEXT NOT NULL REFERENCES preference_contexts(id) ON DELETE CASCADE,
99
+ dimension_id TEXT NOT NULL,
100
+ leaning REAL NOT NULL DEFAULT 0,
101
+ confidence REAL NOT NULL DEFAULT 0,
102
+ movement REAL NOT NULL DEFAULT 0,
103
+ context_sensitivity REAL NOT NULL DEFAULT 0,
104
+ evidence_count INTEGER NOT NULL DEFAULT 0,
105
+ updated_at TEXT NOT NULL,
106
+ UNIQUE (context_id, dimension_id)
107
+ );
108
+
109
+ CREATE TABLE IF NOT EXISTS preference_snapshots (
110
+ id TEXT PRIMARY KEY,
111
+ profile_id TEXT NOT NULL REFERENCES preference_profiles(id) ON DELETE CASCADE,
112
+ context_id TEXT NOT NULL REFERENCES preference_contexts(id) ON DELETE CASCADE,
113
+ summary_metrics_json TEXT NOT NULL DEFAULT '{}',
114
+ serialized_model_state_json TEXT NOT NULL DEFAULT '{}',
115
+ created_at TEXT NOT NULL
116
+ );
117
+
118
+ CREATE INDEX IF NOT EXISTS idx_preference_profiles_user_domain
119
+ ON preference_profiles(user_id, domain);
120
+ CREATE INDEX IF NOT EXISTS idx_preference_contexts_profile_active
121
+ ON preference_contexts(profile_id, active, is_default);
122
+ CREATE INDEX IF NOT EXISTS idx_preference_items_profile
123
+ ON preference_items(profile_id, updated_at DESC);
124
+ CREATE INDEX IF NOT EXISTS idx_pairwise_judgments_context_created
125
+ ON pairwise_judgments(context_id, created_at DESC);
126
+ CREATE INDEX IF NOT EXISTS idx_absolute_signals_context_created
127
+ ON absolute_signals(context_id, created_at DESC);
128
+ CREATE INDEX IF NOT EXISTS idx_preference_scores_context
129
+ ON preference_item_scores(context_id, status, confidence DESC, latent_score DESC);
130
+ CREATE INDEX IF NOT EXISTS idx_preference_snapshots_context
131
+ ON preference_snapshots(context_id, created_at DESC);
@@ -0,0 +1,31 @@
1
+ CREATE TABLE IF NOT EXISTS preference_catalogs (
2
+ id TEXT PRIMARY KEY,
3
+ profile_id TEXT NOT NULL REFERENCES preference_profiles(id) ON DELETE CASCADE,
4
+ domain TEXT NOT NULL,
5
+ slug TEXT NOT NULL,
6
+ title TEXT NOT NULL,
7
+ description TEXT NOT NULL DEFAULT '',
8
+ source TEXT NOT NULL DEFAULT 'custom' CHECK (source IN ('seeded', 'custom')),
9
+ archived INTEGER NOT NULL DEFAULT 0,
10
+ created_at TEXT NOT NULL,
11
+ updated_at TEXT NOT NULL,
12
+ UNIQUE (profile_id, slug)
13
+ );
14
+
15
+ CREATE TABLE IF NOT EXISTS preference_catalog_items (
16
+ id TEXT PRIMARY KEY,
17
+ catalog_id TEXT NOT NULL REFERENCES preference_catalogs(id) ON DELETE CASCADE,
18
+ label TEXT NOT NULL,
19
+ description TEXT NOT NULL DEFAULT '',
20
+ tags_json TEXT NOT NULL DEFAULT '[]',
21
+ feature_weights_json TEXT NOT NULL DEFAULT '{}',
22
+ position INTEGER NOT NULL DEFAULT 0,
23
+ archived INTEGER NOT NULL DEFAULT 0,
24
+ created_at TEXT NOT NULL,
25
+ updated_at TEXT NOT NULL
26
+ );
27
+
28
+ CREATE INDEX IF NOT EXISTS idx_preference_catalogs_profile
29
+ ON preference_catalogs(profile_id, archived, source, title);
30
+ CREATE INDEX IF NOT EXISTS idx_preference_catalog_items_catalog
31
+ ON preference_catalog_items(catalog_id, archived, position, label);
@@ -0,0 +1,255 @@
1
+ ALTER TABLE notes
2
+ ADD COLUMN kind TEXT NOT NULL DEFAULT 'evidence';
3
+
4
+ ALTER TABLE notes
5
+ ADD COLUMN title TEXT NOT NULL DEFAULT '';
6
+
7
+ ALTER TABLE notes
8
+ ADD COLUMN slug TEXT NOT NULL DEFAULT '';
9
+
10
+ ALTER TABLE notes
11
+ ADD COLUMN space_id TEXT NOT NULL DEFAULT '';
12
+
13
+ ALTER TABLE notes
14
+ ADD COLUMN aliases_json TEXT NOT NULL DEFAULT '[]';
15
+
16
+ ALTER TABLE notes
17
+ ADD COLUMN summary TEXT NOT NULL DEFAULT '';
18
+
19
+ ALTER TABLE notes
20
+ ADD COLUMN source_path TEXT NOT NULL DEFAULT '';
21
+
22
+ ALTER TABLE notes
23
+ ADD COLUMN frontmatter_json TEXT NOT NULL DEFAULT '{}';
24
+
25
+ ALTER TABLE notes
26
+ ADD COLUMN revision_hash TEXT NOT NULL DEFAULT '';
27
+
28
+ ALTER TABLE notes
29
+ ADD COLUMN last_synced_at TEXT;
30
+
31
+ CREATE INDEX IF NOT EXISTS idx_notes_kind_updated
32
+ ON notes (kind, updated_at DESC);
33
+
34
+ CREATE INDEX IF NOT EXISTS idx_notes_space_updated
35
+ ON notes (space_id, updated_at DESC);
36
+
37
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_notes_space_slug_unique
38
+ ON notes (space_id, slug)
39
+ WHERE slug != '';
40
+
41
+ CREATE TABLE IF NOT EXISTS wiki_spaces (
42
+ id TEXT PRIMARY KEY,
43
+ slug TEXT NOT NULL UNIQUE,
44
+ label TEXT NOT NULL,
45
+ description TEXT NOT NULL DEFAULT '',
46
+ owner_user_id TEXT,
47
+ visibility TEXT NOT NULL DEFAULT 'personal',
48
+ created_at TEXT NOT NULL,
49
+ updated_at TEXT NOT NULL
50
+ );
51
+
52
+ CREATE INDEX IF NOT EXISTS idx_wiki_spaces_owner
53
+ ON wiki_spaces (owner_user_id, updated_at DESC);
54
+
55
+ INSERT INTO wiki_spaces (id, slug, label, description, owner_user_id, visibility, created_at, updated_at)
56
+ VALUES (
57
+ 'wiki_space_shared',
58
+ 'shared',
59
+ 'Shared Forge Memory',
60
+ 'Shared wiki space for file-backed Forge knowledge.',
61
+ NULL,
62
+ 'shared',
63
+ CURRENT_TIMESTAMP,
64
+ CURRENT_TIMESTAMP
65
+ )
66
+ ON CONFLICT(id) DO NOTHING;
67
+
68
+ UPDATE notes
69
+ SET space_id = 'wiki_space_shared'
70
+ WHERE trim(space_id) = '';
71
+
72
+ UPDATE notes
73
+ SET title = CASE
74
+ WHEN trim(title) != '' THEN title
75
+ WHEN trim(content_plain) != '' THEN substr(trim(content_plain), 1, 120)
76
+ ELSE 'Untitled note'
77
+ END
78
+ WHERE trim(title) = '';
79
+
80
+ UPDATE notes
81
+ SET slug = replace(replace(lower(id), '_', '-'), ' ', '-')
82
+ WHERE trim(slug) = '';
83
+
84
+ CREATE TABLE IF NOT EXISTS wiki_link_edges (
85
+ source_note_id TEXT NOT NULL,
86
+ target_type TEXT NOT NULL,
87
+ target_note_id TEXT,
88
+ target_entity_type TEXT,
89
+ target_entity_id TEXT,
90
+ label TEXT NOT NULL DEFAULT '',
91
+ raw_target TEXT NOT NULL DEFAULT '',
92
+ is_embed INTEGER NOT NULL DEFAULT 0,
93
+ created_at TEXT NOT NULL,
94
+ updated_at TEXT NOT NULL,
95
+ PRIMARY KEY (
96
+ source_note_id,
97
+ target_type,
98
+ target_note_id,
99
+ target_entity_type,
100
+ target_entity_id,
101
+ raw_target,
102
+ is_embed
103
+ ),
104
+ FOREIGN KEY (source_note_id) REFERENCES notes(id) ON DELETE CASCADE,
105
+ FOREIGN KEY (target_note_id) REFERENCES notes(id) ON DELETE CASCADE
106
+ );
107
+
108
+ CREATE INDEX IF NOT EXISTS idx_wiki_link_edges_source
109
+ ON wiki_link_edges (source_note_id, updated_at DESC);
110
+
111
+ CREATE INDEX IF NOT EXISTS idx_wiki_link_edges_target_note
112
+ ON wiki_link_edges (target_note_id, updated_at DESC);
113
+
114
+ CREATE INDEX IF NOT EXISTS idx_wiki_link_edges_target_entity
115
+ ON wiki_link_edges (target_entity_type, target_entity_id, updated_at DESC);
116
+
117
+ CREATE VIRTUAL TABLE IF NOT EXISTS wiki_pages_fts
118
+ USING fts5(
119
+ note_id UNINDEXED,
120
+ title,
121
+ slug,
122
+ aliases,
123
+ summary,
124
+ content_plain,
125
+ linked_entities
126
+ );
127
+
128
+ INSERT INTO wiki_pages_fts (note_id, title, slug, aliases, summary, content_plain, linked_entities)
129
+ SELECT
130
+ notes.id,
131
+ notes.title,
132
+ notes.slug,
133
+ COALESCE(notes.aliases_json, '[]'),
134
+ COALESCE(notes.summary, ''),
135
+ notes.content_plain,
136
+ ''
137
+ FROM notes
138
+ WHERE NOT EXISTS (
139
+ SELECT 1
140
+ FROM wiki_pages_fts
141
+ WHERE wiki_pages_fts.note_id = notes.id
142
+ );
143
+
144
+ CREATE TABLE IF NOT EXISTS wiki_media_assets (
145
+ id TEXT PRIMARY KEY,
146
+ space_id TEXT NOT NULL,
147
+ note_id TEXT,
148
+ label TEXT NOT NULL,
149
+ mime_type TEXT NOT NULL,
150
+ file_name TEXT NOT NULL,
151
+ file_path TEXT NOT NULL,
152
+ size_bytes INTEGER NOT NULL DEFAULT 0,
153
+ checksum TEXT NOT NULL DEFAULT '',
154
+ transcript_note_id TEXT,
155
+ metadata_json TEXT NOT NULL DEFAULT '{}',
156
+ created_at TEXT NOT NULL,
157
+ updated_at TEXT NOT NULL,
158
+ FOREIGN KEY (note_id) REFERENCES notes(id) ON DELETE SET NULL,
159
+ FOREIGN KEY (transcript_note_id) REFERENCES notes(id) ON DELETE SET NULL
160
+ );
161
+
162
+ CREATE INDEX IF NOT EXISTS idx_wiki_media_assets_space
163
+ ON wiki_media_assets (space_id, updated_at DESC);
164
+
165
+ CREATE TABLE IF NOT EXISTS wiki_llm_profiles (
166
+ id TEXT PRIMARY KEY,
167
+ label TEXT NOT NULL,
168
+ provider TEXT NOT NULL,
169
+ base_url TEXT NOT NULL DEFAULT '',
170
+ model TEXT NOT NULL,
171
+ secret_id TEXT,
172
+ system_prompt TEXT NOT NULL DEFAULT '',
173
+ enabled INTEGER NOT NULL DEFAULT 1,
174
+ metadata_json TEXT NOT NULL DEFAULT '{}',
175
+ created_at TEXT NOT NULL,
176
+ updated_at TEXT NOT NULL
177
+ );
178
+
179
+ CREATE TABLE IF NOT EXISTS wiki_embedding_profiles (
180
+ id TEXT PRIMARY KEY,
181
+ label TEXT NOT NULL,
182
+ provider TEXT NOT NULL,
183
+ base_url TEXT NOT NULL DEFAULT '',
184
+ model TEXT NOT NULL,
185
+ secret_id TEXT,
186
+ dimensions INTEGER,
187
+ chunk_size INTEGER NOT NULL DEFAULT 1200,
188
+ chunk_overlap INTEGER NOT NULL DEFAULT 200,
189
+ enabled INTEGER NOT NULL DEFAULT 1,
190
+ metadata_json TEXT NOT NULL DEFAULT '{}',
191
+ created_at TEXT NOT NULL,
192
+ updated_at TEXT NOT NULL
193
+ );
194
+
195
+ CREATE TABLE IF NOT EXISTS wiki_embedding_chunks (
196
+ id TEXT PRIMARY KEY,
197
+ note_id TEXT NOT NULL,
198
+ space_id TEXT NOT NULL,
199
+ profile_id TEXT NOT NULL,
200
+ chunk_key TEXT NOT NULL,
201
+ heading_path TEXT NOT NULL DEFAULT '',
202
+ content_text TEXT NOT NULL,
203
+ vector_json TEXT NOT NULL,
204
+ created_at TEXT NOT NULL,
205
+ updated_at TEXT NOT NULL,
206
+ FOREIGN KEY (note_id) REFERENCES notes(id) ON DELETE CASCADE,
207
+ FOREIGN KEY (profile_id) REFERENCES wiki_embedding_profiles(id) ON DELETE CASCADE
208
+ );
209
+
210
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_wiki_embedding_chunks_unique
211
+ ON wiki_embedding_chunks (note_id, profile_id, chunk_key);
212
+
213
+ CREATE INDEX IF NOT EXISTS idx_wiki_embedding_chunks_profile_space
214
+ ON wiki_embedding_chunks (profile_id, space_id, updated_at DESC);
215
+
216
+ CREATE TABLE IF NOT EXISTS wiki_ingest_jobs (
217
+ id TEXT PRIMARY KEY,
218
+ space_id TEXT NOT NULL,
219
+ llm_profile_id TEXT,
220
+ status TEXT NOT NULL,
221
+ source_kind TEXT NOT NULL,
222
+ source_locator TEXT NOT NULL DEFAULT '',
223
+ mime_type TEXT NOT NULL DEFAULT '',
224
+ title_hint TEXT NOT NULL DEFAULT '',
225
+ summary TEXT NOT NULL DEFAULT '',
226
+ page_note_id TEXT,
227
+ created_by_actor TEXT,
228
+ error_message TEXT NOT NULL DEFAULT '',
229
+ created_at TEXT NOT NULL,
230
+ updated_at TEXT NOT NULL,
231
+ completed_at TEXT,
232
+ FOREIGN KEY (llm_profile_id) REFERENCES wiki_llm_profiles(id) ON DELETE SET NULL,
233
+ FOREIGN KEY (page_note_id) REFERENCES notes(id) ON DELETE SET NULL
234
+ );
235
+
236
+ CREATE INDEX IF NOT EXISTS idx_wiki_ingest_jobs_space
237
+ ON wiki_ingest_jobs (space_id, created_at DESC);
238
+
239
+ CREATE TABLE IF NOT EXISTS wiki_ingest_job_items (
240
+ id TEXT PRIMARY KEY,
241
+ job_id TEXT NOT NULL,
242
+ item_type TEXT NOT NULL,
243
+ status TEXT NOT NULL,
244
+ note_id TEXT,
245
+ media_asset_id TEXT,
246
+ payload_json TEXT NOT NULL DEFAULT '{}',
247
+ created_at TEXT NOT NULL,
248
+ updated_at TEXT NOT NULL,
249
+ FOREIGN KEY (job_id) REFERENCES wiki_ingest_jobs(id) ON DELETE CASCADE,
250
+ FOREIGN KEY (note_id) REFERENCES notes(id) ON DELETE SET NULL,
251
+ FOREIGN KEY (media_asset_id) REFERENCES wiki_media_assets(id) ON DELETE SET NULL
252
+ );
253
+
254
+ CREATE INDEX IF NOT EXISTS idx_wiki_ingest_job_items_job
255
+ ON wiki_ingest_job_items (job_id, created_at DESC);
@@ -0,0 +1,11 @@
1
+ ALTER TABLE notes
2
+ ADD COLUMN parent_slug TEXT;
3
+
4
+ ALTER TABLE notes
5
+ ADD COLUMN index_order INTEGER NOT NULL DEFAULT 0;
6
+
7
+ ALTER TABLE notes
8
+ ADD COLUMN show_in_index INTEGER NOT NULL DEFAULT 1;
9
+
10
+ CREATE INDEX IF NOT EXISTS idx_notes_space_parent_order
11
+ ON notes (space_id, parent_slug, index_order, updated_at DESC);
@@ -0,0 +1,3 @@
1
+ UPDATE notes
2
+ SET show_in_index = 0
3
+ WHERE kind = 'evidence';
@@ -0,0 +1,85 @@
1
+ ALTER TABLE wiki_ingest_jobs
2
+ ADD COLUMN phase TEXT NOT NULL DEFAULT 'queued';
3
+
4
+ ALTER TABLE wiki_ingest_jobs
5
+ ADD COLUMN progress_percent INTEGER NOT NULL DEFAULT 0;
6
+
7
+ ALTER TABLE wiki_ingest_jobs
8
+ ADD COLUMN total_files INTEGER NOT NULL DEFAULT 0;
9
+
10
+ ALTER TABLE wiki_ingest_jobs
11
+ ADD COLUMN processed_files INTEGER NOT NULL DEFAULT 0;
12
+
13
+ ALTER TABLE wiki_ingest_jobs
14
+ ADD COLUMN created_page_count INTEGER NOT NULL DEFAULT 0;
15
+
16
+ ALTER TABLE wiki_ingest_jobs
17
+ ADD COLUMN created_entity_count INTEGER NOT NULL DEFAULT 0;
18
+
19
+ ALTER TABLE wiki_ingest_jobs
20
+ ADD COLUMN accepted_count INTEGER NOT NULL DEFAULT 0;
21
+
22
+ ALTER TABLE wiki_ingest_jobs
23
+ ADD COLUMN rejected_count INTEGER NOT NULL DEFAULT 0;
24
+
25
+ ALTER TABLE wiki_ingest_jobs
26
+ ADD COLUMN latest_message TEXT NOT NULL DEFAULT '';
27
+
28
+ ALTER TABLE wiki_ingest_jobs
29
+ ADD COLUMN input_json TEXT NOT NULL DEFAULT '{}';
30
+
31
+ CREATE TABLE IF NOT EXISTS wiki_ingest_job_logs (
32
+ id TEXT PRIMARY KEY,
33
+ job_id TEXT NOT NULL,
34
+ level TEXT NOT NULL DEFAULT 'info',
35
+ message TEXT NOT NULL,
36
+ metadata_json TEXT NOT NULL DEFAULT '{}',
37
+ created_at TEXT NOT NULL,
38
+ FOREIGN KEY (job_id) REFERENCES wiki_ingest_jobs(id) ON DELETE CASCADE
39
+ );
40
+
41
+ CREATE INDEX IF NOT EXISTS idx_wiki_ingest_job_logs_job
42
+ ON wiki_ingest_job_logs (job_id, created_at ASC);
43
+
44
+ CREATE TABLE IF NOT EXISTS wiki_ingest_job_assets (
45
+ id TEXT PRIMARY KEY,
46
+ job_id TEXT NOT NULL,
47
+ status TEXT NOT NULL DEFAULT 'queued',
48
+ source_kind TEXT NOT NULL,
49
+ source_locator TEXT NOT NULL DEFAULT '',
50
+ file_name TEXT NOT NULL DEFAULT '',
51
+ mime_type TEXT NOT NULL DEFAULT '',
52
+ file_path TEXT NOT NULL DEFAULT '',
53
+ size_bytes INTEGER NOT NULL DEFAULT 0,
54
+ checksum TEXT NOT NULL DEFAULT '',
55
+ metadata_json TEXT NOT NULL DEFAULT '{}',
56
+ created_at TEXT NOT NULL,
57
+ updated_at TEXT NOT NULL,
58
+ FOREIGN KEY (job_id) REFERENCES wiki_ingest_jobs(id) ON DELETE CASCADE
59
+ );
60
+
61
+ CREATE INDEX IF NOT EXISTS idx_wiki_ingest_job_assets_job
62
+ ON wiki_ingest_job_assets (job_id, created_at ASC);
63
+
64
+ CREATE TABLE IF NOT EXISTS wiki_ingest_job_candidates (
65
+ id TEXT PRIMARY KEY,
66
+ job_id TEXT NOT NULL,
67
+ source_asset_id TEXT,
68
+ candidate_type TEXT NOT NULL,
69
+ status TEXT NOT NULL DEFAULT 'suggested',
70
+ title TEXT NOT NULL DEFAULT '',
71
+ summary TEXT NOT NULL DEFAULT '',
72
+ target_key TEXT NOT NULL DEFAULT '',
73
+ payload_json TEXT NOT NULL DEFAULT '{}',
74
+ published_note_id TEXT,
75
+ published_entity_type TEXT,
76
+ published_entity_id TEXT,
77
+ created_at TEXT NOT NULL,
78
+ updated_at TEXT NOT NULL,
79
+ FOREIGN KEY (job_id) REFERENCES wiki_ingest_jobs(id) ON DELETE CASCADE,
80
+ FOREIGN KEY (source_asset_id) REFERENCES wiki_ingest_job_assets(id) ON DELETE SET NULL,
81
+ FOREIGN KEY (published_note_id) REFERENCES notes(id) ON DELETE SET NULL
82
+ );
83
+
84
+ CREATE INDEX IF NOT EXISTS idx_wiki_ingest_job_candidates_job
85
+ ON wiki_ingest_job_candidates (job_id, created_at ASC);
@@ -0,0 +1,28 @@
1
+ CREATE TABLE IF NOT EXISTS diagnostic_logs (
2
+ id TEXT PRIMARY KEY,
3
+ level TEXT NOT NULL DEFAULT 'info',
4
+ source TEXT NOT NULL DEFAULT 'server',
5
+ scope TEXT NOT NULL,
6
+ event_key TEXT NOT NULL DEFAULT '',
7
+ message TEXT NOT NULL,
8
+ route TEXT,
9
+ function_name TEXT,
10
+ request_id TEXT,
11
+ entity_type TEXT,
12
+ entity_id TEXT,
13
+ job_id TEXT,
14
+ details_json TEXT NOT NULL DEFAULT '{}',
15
+ created_at TEXT NOT NULL
16
+ );
17
+
18
+ CREATE INDEX IF NOT EXISTS idx_diagnostic_logs_created
19
+ ON diagnostic_logs (created_at DESC);
20
+
21
+ CREATE INDEX IF NOT EXISTS idx_diagnostic_logs_scope
22
+ ON diagnostic_logs (scope, created_at DESC);
23
+
24
+ CREATE INDEX IF NOT EXISTS idx_diagnostic_logs_job
25
+ ON diagnostic_logs (job_id, created_at DESC);
26
+
27
+ CREATE INDEX IF NOT EXISTS idx_diagnostic_logs_entity
28
+ ON diagnostic_logs (entity_type, entity_id, created_at DESC);
@@ -0,0 +1,96 @@
1
+ CREATE TABLE IF NOT EXISTS questionnaire_instruments (
2
+ id TEXT PRIMARY KEY,
3
+ key TEXT NOT NULL UNIQUE,
4
+ slug TEXT NOT NULL UNIQUE,
5
+ title TEXT NOT NULL,
6
+ subtitle TEXT NOT NULL DEFAULT '',
7
+ description TEXT NOT NULL DEFAULT '',
8
+ aliases_json TEXT NOT NULL DEFAULT '[]',
9
+ symptom_domains_json TEXT NOT NULL DEFAULT '[]',
10
+ tags_json TEXT NOT NULL DEFAULT '[]',
11
+ source_class TEXT NOT NULL,
12
+ availability TEXT NOT NULL,
13
+ is_self_report INTEGER NOT NULL DEFAULT 1,
14
+ is_system INTEGER NOT NULL DEFAULT 0,
15
+ status TEXT NOT NULL DEFAULT 'active',
16
+ owner_user_id TEXT,
17
+ current_draft_version_id TEXT,
18
+ current_published_version_id TEXT,
19
+ created_at TEXT NOT NULL,
20
+ updated_at TEXT NOT NULL
21
+ );
22
+
23
+ CREATE TABLE IF NOT EXISTS questionnaire_versions (
24
+ id TEXT PRIMARY KEY,
25
+ instrument_id TEXT NOT NULL REFERENCES questionnaire_instruments(id) ON DELETE CASCADE,
26
+ version_number INTEGER NOT NULL,
27
+ status TEXT NOT NULL,
28
+ label TEXT NOT NULL DEFAULT '',
29
+ definition_json TEXT NOT NULL,
30
+ scoring_json TEXT NOT NULL,
31
+ provenance_json TEXT NOT NULL,
32
+ is_read_only INTEGER NOT NULL DEFAULT 0,
33
+ created_by TEXT,
34
+ created_at TEXT NOT NULL,
35
+ updated_at TEXT NOT NULL,
36
+ published_at TEXT,
37
+ UNIQUE (instrument_id, version_number)
38
+ );
39
+
40
+ CREATE TABLE IF NOT EXISTS questionnaire_runs (
41
+ id TEXT PRIMARY KEY,
42
+ instrument_id TEXT NOT NULL REFERENCES questionnaire_instruments(id) ON DELETE CASCADE,
43
+ version_id TEXT NOT NULL REFERENCES questionnaire_versions(id) ON DELETE CASCADE,
44
+ user_id TEXT,
45
+ status TEXT NOT NULL,
46
+ progress_index INTEGER NOT NULL DEFAULT 0,
47
+ started_at TEXT NOT NULL,
48
+ updated_at TEXT NOT NULL,
49
+ completed_at TEXT
50
+ );
51
+
52
+ CREATE TABLE IF NOT EXISTS questionnaire_answers (
53
+ id TEXT PRIMARY KEY,
54
+ run_id TEXT NOT NULL REFERENCES questionnaire_runs(id) ON DELETE CASCADE,
55
+ item_id TEXT NOT NULL,
56
+ option_key TEXT,
57
+ value_text TEXT NOT NULL DEFAULT '',
58
+ numeric_value REAL,
59
+ answer_json TEXT NOT NULL DEFAULT '{}',
60
+ created_at TEXT NOT NULL,
61
+ updated_at TEXT NOT NULL,
62
+ UNIQUE (run_id, item_id)
63
+ );
64
+
65
+ CREATE TABLE IF NOT EXISTS questionnaire_run_scores (
66
+ id TEXT PRIMARY KEY,
67
+ run_id TEXT NOT NULL REFERENCES questionnaire_runs(id) ON DELETE CASCADE,
68
+ score_key TEXT NOT NULL,
69
+ label TEXT NOT NULL,
70
+ value_numeric REAL,
71
+ value_text TEXT,
72
+ band_label TEXT NOT NULL DEFAULT '',
73
+ severity TEXT NOT NULL DEFAULT '',
74
+ sort_order INTEGER NOT NULL DEFAULT 0,
75
+ details_json TEXT NOT NULL DEFAULT '{}',
76
+ created_at TEXT NOT NULL,
77
+ UNIQUE (run_id, score_key)
78
+ );
79
+
80
+ CREATE INDEX IF NOT EXISTS idx_questionnaire_versions_instrument
81
+ ON questionnaire_versions (instrument_id, version_number);
82
+
83
+ CREATE INDEX IF NOT EXISTS idx_questionnaire_runs_instrument
84
+ ON questionnaire_runs (instrument_id, updated_at DESC);
85
+
86
+ CREATE INDEX IF NOT EXISTS idx_questionnaire_runs_version
87
+ ON questionnaire_runs (version_id, updated_at DESC);
88
+
89
+ CREATE INDEX IF NOT EXISTS idx_questionnaire_runs_user
90
+ ON questionnaire_runs (user_id, updated_at DESC);
91
+
92
+ CREATE INDEX IF NOT EXISTS idx_questionnaire_answers_run
93
+ ON questionnaire_answers (run_id, item_id);
94
+
95
+ CREATE INDEX IF NOT EXISTS idx_questionnaire_run_scores_run
96
+ ON questionnaire_run_scores (run_id, sort_order, score_key);
@@ -0,0 +1,26 @@
1
+ CREATE TABLE IF NOT EXISTS ai_model_connections (
2
+ id TEXT PRIMARY KEY,
3
+ label TEXT NOT NULL,
4
+ provider TEXT NOT NULL,
5
+ auth_mode TEXT NOT NULL,
6
+ base_url TEXT NOT NULL,
7
+ model TEXT NOT NULL,
8
+ account_label TEXT,
9
+ secret_id TEXT,
10
+ enabled INTEGER NOT NULL DEFAULT 1,
11
+ metadata_json TEXT NOT NULL DEFAULT '{}',
12
+ created_at TEXT NOT NULL,
13
+ updated_at TEXT NOT NULL
14
+ );
15
+
16
+ ALTER TABLE app_settings
17
+ ADD COLUMN forge_basic_chat_connection_id TEXT NOT NULL DEFAULT '';
18
+
19
+ ALTER TABLE app_settings
20
+ ADD COLUMN forge_basic_chat_model TEXT NOT NULL DEFAULT 'gpt-5.4-mini';
21
+
22
+ ALTER TABLE app_settings
23
+ ADD COLUMN forge_wiki_connection_id TEXT NOT NULL DEFAULT '';
24
+
25
+ ALTER TABLE app_settings
26
+ ADD COLUMN forge_wiki_model TEXT NOT NULL DEFAULT 'gpt-5.4-mini';
@@ -0,0 +1,2 @@
1
+ ALTER TABLE app_settings
2
+ ADD COLUMN custom_theme_json TEXT NOT NULL DEFAULT '';