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,374 @@
1
+ const EMPTY_CALENDAR_RULES = {
2
+ allowWorkBlockKinds: [],
3
+ blockWorkBlockKinds: [],
4
+ allowCalendarIds: [],
5
+ blockCalendarIds: [],
6
+ allowEventTypes: [],
7
+ blockEventTypes: [],
8
+ allowEventKeywords: [],
9
+ blockEventKeywords: [],
10
+ allowAvailability: [],
11
+ blockAvailability: []
12
+ };
13
+ function normalizeTask(task) {
14
+ return {
15
+ id: task?.id ?? "",
16
+ title: task?.title ?? "",
17
+ description: task?.description ?? "",
18
+ status: task?.status ?? "backlog",
19
+ priority: task?.priority ?? "medium",
20
+ owner: task?.owner ?? "Albert",
21
+ goalId: task?.goalId ?? null,
22
+ projectId: task?.projectId ?? null,
23
+ dueDate: task?.dueDate ?? null,
24
+ effort: task?.effort ?? "deep",
25
+ energy: task?.energy ?? "steady",
26
+ points: task?.points ?? 0,
27
+ plannedDurationSeconds: task?.plannedDurationSeconds ?? null,
28
+ schedulingRules: task?.schedulingRules ?? null,
29
+ sortOrder: task?.sortOrder ?? 0,
30
+ completedAt: task?.completedAt ?? null,
31
+ createdAt: task?.createdAt ?? new Date(0).toISOString(),
32
+ updatedAt: task?.updatedAt ?? new Date(0).toISOString(),
33
+ tagIds: task?.tagIds ?? [],
34
+ userId: task?.userId ?? null,
35
+ user: task?.user ?? null,
36
+ time: task?.time ?? {
37
+ totalTrackedSeconds: 0,
38
+ totalCreditedSeconds: 0,
39
+ liveTrackedSeconds: 0,
40
+ liveCreditedSeconds: 0,
41
+ manualAdjustedSeconds: 0,
42
+ activeRunCount: 0,
43
+ hasCurrentRun: false,
44
+ currentRunId: null
45
+ }
46
+ };
47
+ }
48
+ function normalizeGoal(goal) {
49
+ return {
50
+ id: goal?.id ?? "",
51
+ title: goal?.title ?? "",
52
+ description: goal?.description ?? "",
53
+ horizon: goal?.horizon === "quarter" || goal?.horizon === "lifetime"
54
+ ? goal.horizon
55
+ : "year",
56
+ status: goal?.status === "paused" || goal?.status === "completed"
57
+ ? goal.status
58
+ : "active",
59
+ targetPoints: goal?.targetPoints ?? 0,
60
+ themeColor: goal?.themeColor ?? "#c8a46b",
61
+ createdAt: goal?.createdAt ?? new Date(0).toISOString(),
62
+ updatedAt: goal?.updatedAt ?? new Date(0).toISOString(),
63
+ tagIds: goal?.tagIds ?? [],
64
+ userId: goal?.userId ?? null,
65
+ user: goal?.user ?? null
66
+ };
67
+ }
68
+ function normalizeTag(tag) {
69
+ return {
70
+ id: tag?.id ?? "",
71
+ name: tag?.name ?? "",
72
+ kind: tag?.kind === "value" || tag?.kind === "execution"
73
+ ? tag.kind
74
+ : "category",
75
+ color: tag?.color ?? "#71717a",
76
+ description: tag?.description ?? "",
77
+ userId: tag?.userId ?? null,
78
+ user: tag?.user ?? null
79
+ };
80
+ }
81
+ function normalizeProject(project) {
82
+ return {
83
+ id: project?.id ?? "",
84
+ goalId: project?.goalId ?? "",
85
+ title: project?.title ?? "",
86
+ description: project?.description ?? project?.summary ?? "",
87
+ status: project?.status === "paused" || project?.status === "completed"
88
+ ? project.status
89
+ : "active",
90
+ targetPoints: project?.targetPoints ?? project?.totalPoints ?? 0,
91
+ themeColor: project?.themeColor ?? "#c0c1ff",
92
+ schedulingRules: project?.schedulingRules ?? EMPTY_CALENDAR_RULES,
93
+ createdAt: project?.createdAt ?? new Date(0).toISOString(),
94
+ updatedAt: project?.updatedAt ?? new Date(0).toISOString(),
95
+ goalTitle: project?.goalTitle ?? "",
96
+ activeTaskCount: project?.activeTaskCount ?? 0,
97
+ completedTaskCount: project?.completedTaskCount ?? 0,
98
+ totalTasks: project?.totalTasks ?? 0,
99
+ earnedPoints: project?.earnedPoints ?? project?.totalPoints ?? 0,
100
+ progress: project?.progress ?? 0,
101
+ nextTaskId: project?.nextTaskId ?? null,
102
+ nextTaskTitle: project?.nextTaskTitle ?? null,
103
+ momentumLabel: project?.momentumLabel ?? "No momentum yet",
104
+ userId: project?.userId ?? null,
105
+ user: project?.user ?? null,
106
+ time: project?.time ?? {
107
+ totalTrackedSeconds: 0,
108
+ totalCreditedSeconds: 0,
109
+ liveTrackedSeconds: 0,
110
+ liveCreditedSeconds: 0,
111
+ manualAdjustedSeconds: 0,
112
+ activeRunCount: 0,
113
+ hasCurrentRun: false,
114
+ currentRunId: null
115
+ }
116
+ };
117
+ }
118
+ function normalizeHabit(habit) {
119
+ return {
120
+ id: habit?.id ?? "",
121
+ title: habit?.title ?? "",
122
+ description: habit?.description ?? "",
123
+ status: habit?.status ?? "active",
124
+ polarity: habit?.polarity ?? "positive",
125
+ frequency: habit?.frequency ?? "daily",
126
+ targetCount: habit?.targetCount ?? 1,
127
+ weekDays: habit?.weekDays ?? [],
128
+ linkedGoalIds: habit?.linkedGoalIds ?? [],
129
+ linkedProjectIds: habit?.linkedProjectIds ?? [],
130
+ linkedTaskIds: habit?.linkedTaskIds ?? [],
131
+ linkedValueIds: habit?.linkedValueIds ?? [],
132
+ linkedPatternIds: habit?.linkedPatternIds ?? [],
133
+ linkedBehaviorIds: habit?.linkedBehaviorIds ?? [],
134
+ linkedBeliefIds: habit?.linkedBeliefIds ?? [],
135
+ linkedModeIds: habit?.linkedModeIds ?? [],
136
+ linkedReportIds: habit?.linkedReportIds ?? [],
137
+ linkedBehaviorId: habit?.linkedBehaviorId ?? null,
138
+ linkedBehaviorTitle: habit?.linkedBehaviorTitle ?? null,
139
+ linkedBehaviorTitles: habit?.linkedBehaviorTitles ?? [],
140
+ rewardXp: habit?.rewardXp ?? 12,
141
+ penaltyXp: habit?.penaltyXp ?? 8,
142
+ generatedHealthEventTemplate: habit?.generatedHealthEventTemplate ?? {
143
+ enabled: false,
144
+ workoutType: "",
145
+ title: "",
146
+ durationMinutes: 60,
147
+ xpReward: 0,
148
+ tags: [],
149
+ links: [],
150
+ notesTemplate: ""
151
+ },
152
+ createdAt: habit?.createdAt ?? new Date(0).toISOString(),
153
+ updatedAt: habit?.updatedAt ?? new Date(0).toISOString(),
154
+ lastCheckInAt: habit?.lastCheckInAt ?? null,
155
+ lastCheckInStatus: habit?.lastCheckInStatus ?? null,
156
+ streakCount: habit?.streakCount ?? 0,
157
+ completionRate: habit?.completionRate ?? 0,
158
+ dueToday: habit?.dueToday ?? false,
159
+ userId: habit?.userId ?? null,
160
+ user: habit?.user ?? null,
161
+ checkIns: habit?.checkIns ?? []
162
+ };
163
+ }
164
+ function normalizeUser(user) {
165
+ return {
166
+ id: user?.id ?? "",
167
+ kind: user?.kind ?? "human",
168
+ handle: user?.handle ?? "",
169
+ displayName: user?.displayName ?? "",
170
+ description: user?.description ?? "",
171
+ accentColor: user?.accentColor ?? "#c0c1ff",
172
+ createdAt: user?.createdAt ?? new Date(0).toISOString(),
173
+ updatedAt: user?.updatedAt ?? new Date(0).toISOString()
174
+ };
175
+ }
176
+ function normalizeStrategy(strategy) {
177
+ return {
178
+ id: strategy?.id ?? "",
179
+ title: strategy?.title ?? "",
180
+ overview: strategy?.overview ?? "",
181
+ endStateDescription: strategy?.endStateDescription ?? "",
182
+ status: strategy?.status === "paused" || strategy?.status === "completed"
183
+ ? strategy.status
184
+ : "active",
185
+ targetGoalIds: strategy?.targetGoalIds ?? [],
186
+ targetProjectIds: strategy?.targetProjectIds ?? [],
187
+ linkedEntities: strategy?.linkedEntities ?? [],
188
+ graph: strategy?.graph ?? { nodes: [], edges: [] },
189
+ metrics: strategy?.metrics ?? {
190
+ alignmentScore: 0,
191
+ planCoverageScore: 0,
192
+ sequencingScore: 100,
193
+ scopeDisciplineScore: 100,
194
+ qualityScore: 0,
195
+ targetProgressScore: 0,
196
+ completedNodeCount: 0,
197
+ startedNodeCount: 0,
198
+ readyNodeCount: 0,
199
+ totalNodeCount: 1,
200
+ completedTargetCount: 0,
201
+ totalTargetCount: 0,
202
+ offPlanEntityCount: 0,
203
+ offPlanActiveEntityCount: 0,
204
+ offPlanCompletedEntityCount: 0,
205
+ activeNodeIds: [],
206
+ nextNodeIds: [],
207
+ blockedNodeIds: [],
208
+ outOfOrderNodeIds: []
209
+ },
210
+ isLocked: strategy?.isLocked ?? false,
211
+ lockedAt: strategy?.lockedAt ?? null,
212
+ lockedByUserId: strategy?.lockedByUserId ?? null,
213
+ lockedByUser: strategy?.lockedByUser ?? null,
214
+ createdAt: strategy?.createdAt ?? new Date(0).toISOString(),
215
+ updatedAt: strategy?.updatedAt ?? new Date(0).toISOString(),
216
+ userId: strategy?.userId ?? null,
217
+ user: strategy?.user ?? null
218
+ };
219
+ }
220
+ export function normalizeForgeSnapshot(raw) {
221
+ const legacy = raw;
222
+ const rootProjects = (legacy.projects ?? legacy.campaigns ?? []).map(normalizeProject);
223
+ const dashboardProjects = (legacy.dashboard?.projects ??
224
+ legacy.dashboard?.campaigns ??
225
+ rootProjects).map(normalizeProject);
226
+ const overviewProjects = (legacy.overview?.projects ??
227
+ legacy.overview?.campaigns ??
228
+ dashboardProjects).map(normalizeProject);
229
+ return {
230
+ ...raw,
231
+ meta: {
232
+ apiVersion: "v1",
233
+ transport: "rest+sse",
234
+ generatedAt: raw.meta?.generatedAt ?? new Date().toISOString(),
235
+ backend: raw.meta?.backend ?? "forge-node-runtime",
236
+ mode: raw.meta?.mode ?? "transitional-node"
237
+ },
238
+ metrics: {
239
+ totalXp: raw.metrics?.totalXp ?? 0,
240
+ level: raw.metrics?.level ?? 1,
241
+ currentLevelXp: raw.metrics?.currentLevelXp ?? 0,
242
+ nextLevelXp: raw.metrics?.nextLevelXp ?? 120,
243
+ weeklyXp: raw.metrics?.weeklyXp ?? 0,
244
+ streakDays: raw.metrics?.streakDays ?? 0,
245
+ comboMultiplier: raw.metrics?.comboMultiplier ?? 1,
246
+ momentumScore: raw.metrics?.momentumScore ?? 0,
247
+ topGoalId: raw.metrics?.topGoalId ?? null,
248
+ topGoalTitle: raw.metrics?.topGoalTitle ?? null
249
+ },
250
+ users: (raw.users ?? []).map(normalizeUser),
251
+ strategies: (raw.strategies ?? []).map(normalizeStrategy),
252
+ userScope: {
253
+ selectedUserIds: raw.userScope?.selectedUserIds ?? [],
254
+ selectedUsers: (raw.userScope?.selectedUsers ?? []).map(normalizeUser)
255
+ },
256
+ dashboard: {
257
+ stats: {
258
+ totalPoints: raw.dashboard?.stats?.totalPoints ?? 0,
259
+ completedThisWeek: raw.dashboard?.stats?.completedThisWeek ?? 0,
260
+ activeGoals: raw.dashboard?.stats?.activeGoals ?? 0,
261
+ alignmentScore: raw.dashboard?.stats?.alignmentScore ?? 0,
262
+ focusTasks: raw.dashboard?.stats?.focusTasks ?? 0,
263
+ overdueTasks: raw.dashboard?.stats?.overdueTasks ?? 0,
264
+ dueThisWeek: raw.dashboard?.stats?.dueThisWeek ?? 0
265
+ },
266
+ goals: (raw.dashboard?.goals ?? []).map((goal) => ({
267
+ ...goal,
268
+ ...normalizeGoal(goal)
269
+ })),
270
+ projects: dashboardProjects,
271
+ tasks: (raw.dashboard?.tasks ?? []).map(normalizeTask),
272
+ habits: (raw.dashboard?.habits ?? raw.habits ?? []).map(normalizeHabit),
273
+ tags: (raw.dashboard?.tags ?? []).map(normalizeTag),
274
+ suggestedTags: (raw.dashboard?.suggestedTags ?? []).map(normalizeTag),
275
+ owners: raw.dashboard?.owners ?? [],
276
+ executionBuckets: (raw.dashboard?.executionBuckets ?? []).map((bucket) => ({
277
+ ...bucket,
278
+ tasks: (bucket.tasks ?? []).map(normalizeTask)
279
+ })),
280
+ gamification: raw.dashboard?.gamification ?? {
281
+ totalXp: raw.metrics?.totalXp ?? 0,
282
+ level: raw.metrics?.level ?? 1,
283
+ currentLevelXp: raw.metrics?.currentLevelXp ?? 0,
284
+ nextLevelXp: raw.metrics?.nextLevelXp ?? 120,
285
+ weeklyXp: raw.metrics?.weeklyXp ?? 0,
286
+ streakDays: raw.metrics?.streakDays ?? 0,
287
+ comboMultiplier: raw.metrics?.comboMultiplier ?? 1,
288
+ momentumScore: raw.metrics?.momentumScore ?? 0,
289
+ topGoalId: raw.metrics?.topGoalId ?? null,
290
+ topGoalTitle: raw.metrics?.topGoalTitle ?? null
291
+ },
292
+ achievements: raw.dashboard?.achievements ?? [],
293
+ milestoneRewards: raw.dashboard?.milestoneRewards ?? [],
294
+ recentActivity: raw.dashboard?.recentActivity ?? [],
295
+ notesSummaryByEntity: raw.dashboard?.notesSummaryByEntity ?? {}
296
+ },
297
+ overview: {
298
+ generatedAt: raw.overview?.generatedAt ?? new Date().toISOString(),
299
+ strategicHeader: {
300
+ streakDays: raw.overview?.strategicHeader?.streakDays ??
301
+ raw.metrics?.streakDays ??
302
+ 0,
303
+ level: raw.overview?.strategicHeader?.level ?? raw.metrics?.level ?? 1,
304
+ totalXp: raw.overview?.strategicHeader?.totalXp ?? raw.metrics?.totalXp ?? 0,
305
+ currentLevelXp: raw.overview?.strategicHeader?.currentLevelXp ??
306
+ raw.metrics?.currentLevelXp ??
307
+ 0,
308
+ nextLevelXp: raw.overview?.strategicHeader?.nextLevelXp ??
309
+ raw.metrics?.nextLevelXp ??
310
+ 120,
311
+ momentumScore: raw.overview?.strategicHeader?.momentumScore ??
312
+ raw.metrics?.momentumScore ??
313
+ 0,
314
+ focusTasks: raw.overview?.strategicHeader?.focusTasks ?? 0,
315
+ overdueTasks: raw.overview?.strategicHeader?.overdueTasks ?? 0
316
+ },
317
+ projects: overviewProjects,
318
+ activeGoals: (raw.overview?.activeGoals ?? []).map((goal) => ({
319
+ ...goal,
320
+ ...normalizeGoal(goal)
321
+ })),
322
+ topTasks: (raw.overview?.topTasks ?? []).map(normalizeTask),
323
+ dueHabits: (raw.overview?.dueHabits ??
324
+ raw.today?.dueHabits ??
325
+ raw.dashboard?.habits ??
326
+ []).map(normalizeHabit),
327
+ recentEvidence: raw.overview?.recentEvidence ?? [],
328
+ achievements: raw.overview?.achievements ?? [],
329
+ domainBalance: raw.overview?.domainBalance ?? [],
330
+ neglectedGoals: raw.overview?.neglectedGoals ?? []
331
+ },
332
+ today: {
333
+ generatedAt: raw.today?.generatedAt ?? new Date().toISOString(),
334
+ directive: {
335
+ task: raw.today?.directive?.task
336
+ ? normalizeTask(raw.today.directive.task)
337
+ : null,
338
+ goalTitle: raw.today?.directive?.goalTitle ?? null,
339
+ rewardXp: raw.today?.directive?.rewardXp ?? 0,
340
+ sessionLabel: raw.today?.directive?.sessionLabel ?? "No active session"
341
+ },
342
+ timeline: (raw.today?.timeline ?? []).map((bucket) => ({
343
+ ...bucket,
344
+ tasks: (bucket.tasks ?? []).map(normalizeTask)
345
+ })),
346
+ dueHabits: (raw.today?.dueHabits ??
347
+ raw.overview?.dueHabits ??
348
+ raw.dashboard?.habits ??
349
+ []).map(normalizeHabit),
350
+ dailyQuests: raw.today?.dailyQuests ?? [],
351
+ milestoneRewards: raw.today?.milestoneRewards ?? [],
352
+ recentHabitRewards: raw.today?.recentHabitRewards ?? [],
353
+ momentum: {
354
+ streakDays: raw.today?.momentum?.streakDays ?? 0,
355
+ momentumScore: raw.today?.momentum?.momentumScore ?? 0,
356
+ recoveryHint: raw.today?.momentum?.recoveryHint ?? ""
357
+ }
358
+ },
359
+ risk: {
360
+ generatedAt: raw.risk?.generatedAt ?? new Date().toISOString(),
361
+ overdueTasks: (raw.risk?.overdueTasks ?? []).map(normalizeTask),
362
+ blockedTasks: (raw.risk?.blockedTasks ?? []).map(normalizeTask),
363
+ neglectedGoals: raw.risk?.neglectedGoals ?? [],
364
+ summary: raw.risk?.summary ?? ""
365
+ },
366
+ goals: (raw.goals ?? []).map(normalizeGoal),
367
+ projects: rootProjects,
368
+ tags: (raw.tags ?? []).map(normalizeTag),
369
+ tasks: (raw.tasks ?? []).map(normalizeTask),
370
+ habits: (raw.habits ?? raw.dashboard?.habits ?? []).map(normalizeHabit),
371
+ activity: raw.activity ?? [],
372
+ activeTaskRuns: raw.activeTaskRuns ?? []
373
+ };
374
+ }
@@ -0,0 +1,319 @@
1
+ import { z } from "zod";
2
+ export const forgeThemePreferenceValues = [
3
+ "obsidian",
4
+ "solar",
5
+ "aurora",
6
+ "ember",
7
+ "paper",
8
+ "dawn",
9
+ "atelier",
10
+ "custom",
11
+ "system"
12
+ ];
13
+ export const forgeThemePreferenceSchema = z.enum(forgeThemePreferenceValues);
14
+ const hexColorSchema = z
15
+ .string()
16
+ .trim()
17
+ .regex(/^#[0-9a-fA-F]{6}$/, "Use a 6-digit hex color");
18
+ export const forgeCustomThemeSchema = z.object({
19
+ label: z.string().trim().min(1, "Theme name is required").max(40),
20
+ primary: hexColorSchema,
21
+ secondary: hexColorSchema,
22
+ tertiary: hexColorSchema,
23
+ canvas: hexColorSchema,
24
+ panel: hexColorSchema,
25
+ panelHigh: hexColorSchema,
26
+ panelLow: hexColorSchema,
27
+ ink: hexColorSchema
28
+ });
29
+ const CUSTOM_THEME_STORAGE_KEYS = [
30
+ "--primary",
31
+ "--secondary",
32
+ "--tertiary",
33
+ "--surface",
34
+ "--surface-low",
35
+ "--surface-panel",
36
+ "--surface-high",
37
+ "--surface-glass",
38
+ "--surface-psyche",
39
+ "--surface-psyche-high",
40
+ "--hero-gradient",
41
+ "--card-gradient",
42
+ "--card-shadow",
43
+ "--card-shadow-hover",
44
+ "--forge-body-ambient-primary",
45
+ "--forge-body-ambient-secondary",
46
+ "--forge-body-gradient-start",
47
+ "--forge-body-gradient-end",
48
+ "--forge-body-text"
49
+ ];
50
+ export const defaultCustomTheme = {
51
+ label: "Custom Forge",
52
+ primary: "#7cc7ff",
53
+ secondary: "#4edea3",
54
+ tertiary: "#ffb95f",
55
+ canvas: "#0b1326",
56
+ panel: "#171f33",
57
+ panelHigh: "#222a3d",
58
+ panelLow: "#131b2e",
59
+ ink: "#eef2ff"
60
+ };
61
+ export const forgeThemeCatalog = {
62
+ obsidian: {
63
+ label: "Obsidian",
64
+ description: "Deep indigo with cool neon edges. This is the current default.",
65
+ mode: "dark",
66
+ preview: {
67
+ label: "Obsidian",
68
+ primary: "#c0c1ff",
69
+ secondary: "#4edea3",
70
+ tertiary: "#ffb95f",
71
+ canvas: "#0b1326",
72
+ panel: "#171f33",
73
+ panelHigh: "#222a3d",
74
+ panelLow: "#131b2e",
75
+ ink: "#eef2ff"
76
+ }
77
+ },
78
+ solar: {
79
+ label: "Catppuccin",
80
+ description: "Pastel mocha surfaces inspired by the widely adopted Catppuccin palette.",
81
+ mode: "dark",
82
+ preview: {
83
+ label: "Catppuccin",
84
+ primary: "#cba6f7",
85
+ secondary: "#94e2d5",
86
+ tertiary: "#fab387",
87
+ canvas: "#1e1e2e",
88
+ panel: "#313244",
89
+ panelHigh: "#45475a",
90
+ panelLow: "#181825",
91
+ ink: "#cdd6f4"
92
+ }
93
+ },
94
+ aurora: {
95
+ label: "Nord",
96
+ description: "Arctic blue-grey surfaces based on Nord's clean and uncluttered palette.",
97
+ mode: "dark",
98
+ preview: {
99
+ label: "Nord",
100
+ primary: "#88c0d0",
101
+ secondary: "#a3be8c",
102
+ tertiary: "#ebcb8b",
103
+ canvas: "#2e3440",
104
+ panel: "#3b4252",
105
+ panelHigh: "#434c5e",
106
+ panelLow: "#242933",
107
+ ink: "#eceff4"
108
+ }
109
+ },
110
+ ember: {
111
+ label: "Dracula",
112
+ description: "High-contrast purple and pink accents drawn from the official Dracula specification.",
113
+ mode: "dark",
114
+ preview: {
115
+ label: "Dracula",
116
+ primary: "#bd93f9",
117
+ secondary: "#8be9fd",
118
+ tertiary: "#ff79c6",
119
+ canvas: "#282a36",
120
+ panel: "#343746",
121
+ panelHigh: "#424450",
122
+ panelLow: "#21222c",
123
+ ink: "#f8f8f2"
124
+ }
125
+ },
126
+ paper: {
127
+ label: "Paper",
128
+ description: "Warm ivory surfaces with navy ink and restrained blue-green accents for a crisp daytime workspace.",
129
+ mode: "light",
130
+ preview: {
131
+ label: "Paper",
132
+ primary: "#2f6fed",
133
+ secondary: "#1d8f6b",
134
+ tertiary: "#c9772b",
135
+ canvas: "#f4efe6",
136
+ panel: "#fbf7f1",
137
+ panelHigh: "#ffffff",
138
+ panelLow: "#e5ddd0",
139
+ ink: "#182235"
140
+ }
141
+ },
142
+ dawn: {
143
+ label: "Dawn",
144
+ description: "Rosy morning tones with plum-blue ink and enough contrast to stay readable across dense settings screens.",
145
+ mode: "light",
146
+ preview: {
147
+ label: "Dawn",
148
+ primary: "#8b5cf6",
149
+ secondary: "#ec7a6b",
150
+ tertiary: "#d0a12b",
151
+ canvas: "#f8eef1",
152
+ panel: "#fff7f8",
153
+ panelHigh: "#ffffff",
154
+ panelLow: "#ead9df",
155
+ ink: "#2d1834"
156
+ }
157
+ },
158
+ atelier: {
159
+ label: "Atelier",
160
+ description: "Cool drafting-table neutrals with slate ink and modern cobalt accents for a brighter, studio-like shell.",
161
+ mode: "light",
162
+ preview: {
163
+ label: "Atelier",
164
+ primary: "#2563eb",
165
+ secondary: "#0f8b6d",
166
+ tertiary: "#b85c38",
167
+ canvas: "#edf3f7",
168
+ panel: "#f8fbfd",
169
+ panelHigh: "#ffffff",
170
+ panelLow: "#dbe5ec",
171
+ ink: "#162334"
172
+ }
173
+ }
174
+ };
175
+ export const forgeThemeOptions = [
176
+ {
177
+ value: "obsidian",
178
+ label: forgeThemeCatalog.obsidian.label,
179
+ description: forgeThemeCatalog.obsidian.description
180
+ },
181
+ {
182
+ value: "solar",
183
+ label: forgeThemeCatalog.solar.label,
184
+ description: forgeThemeCatalog.solar.description
185
+ },
186
+ {
187
+ value: "aurora",
188
+ label: forgeThemeCatalog.aurora.label,
189
+ description: forgeThemeCatalog.aurora.description
190
+ },
191
+ {
192
+ value: "ember",
193
+ label: forgeThemeCatalog.ember.label,
194
+ description: forgeThemeCatalog.ember.description
195
+ },
196
+ {
197
+ value: "paper",
198
+ label: forgeThemeCatalog.paper.label,
199
+ description: forgeThemeCatalog.paper.description
200
+ },
201
+ {
202
+ value: "dawn",
203
+ label: forgeThemeCatalog.dawn.label,
204
+ description: forgeThemeCatalog.dawn.description
205
+ },
206
+ {
207
+ value: "atelier",
208
+ label: forgeThemeCatalog.atelier.label,
209
+ description: forgeThemeCatalog.atelier.description
210
+ },
211
+ {
212
+ value: "custom",
213
+ label: "Custom",
214
+ description: "Use your own Forge token set through the guided editor or direct JSON import."
215
+ },
216
+ {
217
+ value: "system",
218
+ label: "System",
219
+ description: "Follow the device preference. Forge maps dark mode to Obsidian and light mode to Paper."
220
+ }
221
+ ];
222
+ function hexToRgb(value) {
223
+ const normalized = value.replace("#", "");
224
+ return {
225
+ r: Number.parseInt(normalized.slice(0, 2), 16),
226
+ g: Number.parseInt(normalized.slice(2, 4), 16),
227
+ b: Number.parseInt(normalized.slice(4, 6), 16)
228
+ };
229
+ }
230
+ function rgbToHex({ r, g, b }) {
231
+ return `#${[r, g, b]
232
+ .map((channel) => Math.max(0, Math.min(255, Math.round(channel)))
233
+ .toString(16)
234
+ .padStart(2, "0"))
235
+ .join("")}`;
236
+ }
237
+ function mixHex(base, overlay, weight) {
238
+ const baseRgb = hexToRgb(base);
239
+ const overlayRgb = hexToRgb(overlay);
240
+ return rgbToHex({
241
+ r: baseRgb.r + (overlayRgb.r - baseRgb.r) * weight,
242
+ g: baseRgb.g + (overlayRgb.g - baseRgb.g) * weight,
243
+ b: baseRgb.b + (overlayRgb.b - baseRgb.b) * weight
244
+ });
245
+ }
246
+ function alpha(hex, opacity) {
247
+ const { r, g, b } = hexToRgb(hex);
248
+ return `rgba(${r}, ${g}, ${b}, ${opacity})`;
249
+ }
250
+ export function resolveForgeThemePreference(preference, prefersDark) {
251
+ if (preference === "system") {
252
+ return prefersDark ? "obsidian" : "paper";
253
+ }
254
+ return preference;
255
+ }
256
+ export function getForgeThemePreview(preference, customTheme) {
257
+ if (preference === "custom") {
258
+ return customTheme ?? defaultCustomTheme;
259
+ }
260
+ if (preference === "system") {
261
+ return forgeThemeCatalog.obsidian.preview;
262
+ }
263
+ return forgeThemeCatalog[preference].preview;
264
+ }
265
+ export function buildForgeThemeVariables(theme) {
266
+ const cardTop = mixHex(theme.panelHigh, theme.primary, 0.08);
267
+ const heroTop = mixHex(theme.panelHigh, theme.primary, 0.16);
268
+ const heroBottom = mixHex(theme.canvas, theme.secondary, 0.06);
269
+ return {
270
+ "--primary": theme.primary,
271
+ "--secondary": theme.secondary,
272
+ "--tertiary": theme.tertiary,
273
+ "--surface": theme.canvas,
274
+ "--surface-low": theme.panelLow,
275
+ "--surface-panel": theme.panel,
276
+ "--surface-high": theme.panelHigh,
277
+ "--surface-glass": alpha(theme.canvas, 0.82),
278
+ "--surface-psyche": alpha(mixHex(theme.canvas, theme.secondary, 0.12), 0.94),
279
+ "--surface-psyche-high": alpha(mixHex(theme.panelHigh, theme.secondary, 0.1), 0.96),
280
+ "--hero-gradient": `linear-gradient(180deg, ${alpha(heroTop, 0.95)}, ${alpha(heroBottom, 0.95)})`,
281
+ "--card-gradient": `linear-gradient(180deg, ${alpha(cardTop, 0.96)}, ${alpha(theme.panelLow, 0.94)})`,
282
+ "--card-shadow": `0 24px 60px ${alpha(theme.canvas, 0.3)}`,
283
+ "--card-shadow-hover": `0 32px 80px ${alpha(theme.canvas, 0.38)}`,
284
+ "--forge-body-ambient-primary": alpha(theme.primary, 0.2),
285
+ "--forge-body-ambient-secondary": alpha(theme.secondary, 0.14),
286
+ "--forge-body-gradient-start": mixHex(theme.panel, theme.primary, 0.08),
287
+ "--forge-body-gradient-end": mixHex(theme.canvas, "#000000", 0.16),
288
+ "--forge-body-text": theme.ink
289
+ };
290
+ }
291
+ export function applyForgeThemeToDocument(preference, customTheme) {
292
+ if (typeof document === "undefined") {
293
+ return;
294
+ }
295
+ const prefersDark = typeof window !== "undefined" &&
296
+ typeof window.matchMedia === "function" &&
297
+ window.matchMedia("(prefers-color-scheme: dark)").matches;
298
+ const resolved = resolveForgeThemePreference(preference, prefersDark);
299
+ const body = document.body;
300
+ const root = document.documentElement;
301
+ body.classList.remove("theme-forge-dark", "theme-forge-light", "theme-forge-obsidian", "theme-forge-solar", "theme-forge-aurora", "theme-forge-ember", "theme-forge-paper", "theme-forge-dawn", "theme-forge-atelier", "theme-forge-custom");
302
+ if (resolved === "custom") {
303
+ const theme = customTheme ?? defaultCustomTheme;
304
+ const variables = buildForgeThemeVariables(theme);
305
+ body.classList.add("theme-forge-custom");
306
+ body.classList.add("theme-forge-dark");
307
+ for (const [name, value] of Object.entries(variables)) {
308
+ root.style.setProperty(name, value);
309
+ }
310
+ root.dataset.forgeTheme = theme.label;
311
+ return;
312
+ }
313
+ for (const name of CUSTOM_THEME_STORAGE_KEYS) {
314
+ root.style.removeProperty(name);
315
+ }
316
+ delete root.dataset.forgeTheme;
317
+ body.classList.add(forgeThemeCatalog[resolved].mode === "light" ? "theme-forge-light" : "theme-forge-dark");
318
+ body.classList.add(`theme-forge-${resolved}`);
319
+ }
@@ -0,0 +1 @@
1
+ export {};