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,144 @@
1
+ function normalizeNameKey(value) {
2
+ return value.trim().replace(/\s+/g, " ").toLocaleLowerCase();
3
+ }
4
+ function cleanLabel(value) {
5
+ const trimmed = value?.trim();
6
+ return trimmed ? trimmed : null;
7
+ }
8
+ function readBaseCalendarName(value) {
9
+ return cleanLabel(value) ?? "Unnamed calendar";
10
+ }
11
+ function shortCalendarProviderLabel(provider) {
12
+ switch (provider) {
13
+ case "google":
14
+ return "Google";
15
+ case "apple":
16
+ return "Apple";
17
+ case "microsoft":
18
+ return "Microsoft";
19
+ case "caldav":
20
+ default:
21
+ return "CalDAV";
22
+ }
23
+ }
24
+ function readUrlQualifier(value) {
25
+ const trimmed = cleanLabel(value);
26
+ if (!trimmed) {
27
+ return null;
28
+ }
29
+ try {
30
+ const url = new URL(trimmed);
31
+ const segments = url.pathname
32
+ .split("/")
33
+ .map((segment) => segment.trim())
34
+ .filter(Boolean);
35
+ const lastSegment = segments.at(-1);
36
+ if (lastSegment) {
37
+ return `${url.host}/${decodeURIComponent(lastSegment)}`;
38
+ }
39
+ return url.host;
40
+ }
41
+ catch {
42
+ return trimmed;
43
+ }
44
+ }
45
+ function joinQualifier(parts) {
46
+ const cleaned = parts
47
+ .map(cleanLabel)
48
+ .filter((part) => Boolean(part));
49
+ return cleaned.length > 0 ? cleaned.join(" · ") : null;
50
+ }
51
+ function selectUniqueQualifier(group) {
52
+ const selectors = [
53
+ (entry) => entry.providerLabel,
54
+ (entry) => joinQualifier([entry.providerLabel, entry.accountLabel]),
55
+ (entry) => joinQualifier([entry.providerLabel, entry.connectionLabel]),
56
+ (entry) => entry.connectionLabel,
57
+ (entry) => entry.accountLabel,
58
+ (entry) => readUrlQualifier(entry.url),
59
+ (entry) => entry.url
60
+ ];
61
+ for (const select of selectors) {
62
+ const qualifiers = group.map(select);
63
+ if (qualifiers.some((qualifier) => !cleanLabel(qualifier))) {
64
+ continue;
65
+ }
66
+ const normalized = qualifiers.map((qualifier) => normalizeNameKey(qualifier));
67
+ if (new Set(normalized).size === group.length) {
68
+ return qualifiers;
69
+ }
70
+ }
71
+ return group.map((entry, index) => joinQualifier([entry.providerLabel, `${index + 1}`]) ?? `${index + 1}`);
72
+ }
73
+ function buildDedupedNameMap(entries) {
74
+ const deduped = new Map();
75
+ const groups = new Map();
76
+ for (const entry of entries) {
77
+ const key = normalizeNameKey(entry.baseName);
78
+ const bucket = groups.get(key) ?? [];
79
+ bucket.push(entry);
80
+ groups.set(key, bucket);
81
+ }
82
+ for (const group of groups.values()) {
83
+ if (group.length === 1) {
84
+ deduped.set(group[0].id, group[0].baseName);
85
+ continue;
86
+ }
87
+ const qualifiers = selectUniqueQualifier(group);
88
+ group.forEach((entry, index) => {
89
+ deduped.set(entry.id, `${entry.baseName} (${qualifiers[index]})`);
90
+ });
91
+ }
92
+ return deduped;
93
+ }
94
+ export function dedupeCalendarDiscoveryPayload(payload) {
95
+ const dedupedNames = buildDedupedNameMap(payload.calendars.map((calendar) => ({
96
+ id: calendar.url,
97
+ baseName: readBaseCalendarName(calendar.displayName),
98
+ providerLabel: shortCalendarProviderLabel(payload.provider),
99
+ connectionLabel: null,
100
+ accountLabel: payload.accountLabel,
101
+ url: calendar.url
102
+ })));
103
+ return {
104
+ ...payload,
105
+ calendars: payload.calendars.map((calendar) => ({
106
+ ...calendar,
107
+ dedupedName: dedupedNames.get(calendar.url) ??
108
+ readBaseCalendarName(calendar.displayName)
109
+ }))
110
+ };
111
+ }
112
+ export function dedupeCalendarResourcesWithConnections(calendars, connections) {
113
+ const connectionsById = new Map(connections.map((connection) => [connection.id, connection]));
114
+ const dedupedNames = buildDedupedNameMap(calendars.map((calendar) => {
115
+ const connection = connectionsById.get(calendar.connectionId);
116
+ return {
117
+ id: calendar.id,
118
+ baseName: readBaseCalendarName(calendar.title),
119
+ providerLabel: connection
120
+ ? shortCalendarProviderLabel(connection.provider)
121
+ : null,
122
+ connectionLabel: connection?.label ?? null,
123
+ accountLabel: connection?.accountLabel ?? null,
124
+ url: calendar.remoteId
125
+ };
126
+ }));
127
+ return calendars.map((calendar) => ({
128
+ ...calendar,
129
+ dedupedName: dedupedNames.get(calendar.id) ?? readBaseCalendarName(calendar.title)
130
+ }));
131
+ }
132
+ export function dedupeCalendarOverviewPayload(payload) {
133
+ return {
134
+ ...payload,
135
+ calendars: dedupeCalendarResourcesWithConnections(payload.calendars, payload.connections)
136
+ };
137
+ }
138
+ export function readCalendarDisplayName(calendar) {
139
+ if ("title" in calendar) {
140
+ return (cleanLabel(calendar.dedupedName) ?? readBaseCalendarName(calendar.title));
141
+ }
142
+ return (cleanLabel(calendar.dedupedName) ??
143
+ readBaseCalendarName(calendar.displayName));
144
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,67 @@
1
+ import { resolveForgePath } from "./runtime-paths.js";
2
+ function sanitizeValue(value, depth = 0) {
3
+ if (value === null ||
4
+ typeof value === "boolean" ||
5
+ typeof value === "number" ||
6
+ typeof value === "string") {
7
+ return value;
8
+ }
9
+ if (typeof value === "bigint") {
10
+ return value.toString();
11
+ }
12
+ if (value instanceof Error) {
13
+ return {
14
+ name: value.name,
15
+ message: value.message,
16
+ stack: value.stack ?? null
17
+ };
18
+ }
19
+ if (Array.isArray(value)) {
20
+ if (depth >= 3) {
21
+ return `[Array(${value.length})]`;
22
+ }
23
+ return value.slice(0, 20).map((entry) => sanitizeValue(entry, depth + 1));
24
+ }
25
+ if (value && typeof value === "object") {
26
+ if (depth >= 3) {
27
+ return "[Object]";
28
+ }
29
+ return Object.fromEntries(Object.entries(value)
30
+ .slice(0, 30)
31
+ .map(([key, entry]) => [key, sanitizeValue(entry, depth + 1)]));
32
+ }
33
+ return String(value);
34
+ }
35
+ function sanitizeDetails(details) {
36
+ if (!details) {
37
+ return {};
38
+ }
39
+ return Object.fromEntries(Object.entries(details).map(([key, value]) => [key, sanitizeValue(value)]));
40
+ }
41
+ export async function publishUiDiagnosticLog(input) {
42
+ try {
43
+ await fetch(resolveForgePath("/api/v1/diagnostics/logs"), {
44
+ method: "POST",
45
+ credentials: "same-origin",
46
+ keepalive: true,
47
+ headers: {
48
+ "content-type": "application/json",
49
+ "x-forge-source": "ui"
50
+ },
51
+ body: JSON.stringify({
52
+ ...input,
53
+ source: input.source ?? "ui",
54
+ details: sanitizeDetails(input.details)
55
+ })
56
+ });
57
+ }
58
+ catch {
59
+ // Diagnostics should never break the user flow.
60
+ }
61
+ }
62
+ export function createUiDiagnosticLogger(defaults) {
63
+ return (input) => publishUiDiagnosticLog({
64
+ ...defaults,
65
+ ...input
66
+ });
67
+ }
@@ -0,0 +1,279 @@
1
+ import { Bot, CalendarDays, Compass, FileText, FolderOpen, GitBranch, Heart, ListTodo, Network, NotebookPen, PanelTop, Quote, RefreshCw, Repeat, Route, Shapes, Sparkles, StickyNote, Target, Timer, Workflow } from "lucide-react";
2
+ export const ENTITY_KINDS = [
3
+ "goal",
4
+ "project",
5
+ "task",
6
+ "strategy",
7
+ "habit",
8
+ "tag",
9
+ "note",
10
+ "wiki_page",
11
+ "wiki_space",
12
+ "insight",
13
+ "calendar_event",
14
+ "work_block",
15
+ "timebox",
16
+ "value",
17
+ "pattern",
18
+ "behavior",
19
+ "belief",
20
+ "mode",
21
+ "mode_session",
22
+ "report",
23
+ "event_type",
24
+ "emotion",
25
+ "workbench",
26
+ "functor",
27
+ "chat"
28
+ ];
29
+ const ENTITY_VISUAL_SEEDS = [
30
+ {
31
+ kind: "goal",
32
+ label: "Goal",
33
+ icon: Target,
34
+ iconName: "Target",
35
+ accentRgb: [251, 191, 36]
36
+ },
37
+ {
38
+ kind: "project",
39
+ label: "Project",
40
+ icon: FolderOpen,
41
+ iconName: "FolderOpen",
42
+ accentRgb: [56, 189, 248]
43
+ },
44
+ {
45
+ kind: "task",
46
+ label: "Task",
47
+ icon: ListTodo,
48
+ iconName: "ListTodo",
49
+ accentRgb: [129, 140, 248]
50
+ },
51
+ {
52
+ kind: "strategy",
53
+ label: "Strategy",
54
+ icon: GitBranch,
55
+ iconName: "GitBranch",
56
+ accentRgb: [34, 211, 238]
57
+ },
58
+ {
59
+ kind: "habit",
60
+ label: "Habit",
61
+ icon: RefreshCw,
62
+ iconName: "RefreshCw",
63
+ accentRgb: [45, 212, 191]
64
+ },
65
+ {
66
+ kind: "tag",
67
+ label: "Tag",
68
+ icon: PanelTop,
69
+ iconName: "PanelTop",
70
+ accentRgb: [163, 230, 53]
71
+ },
72
+ {
73
+ kind: "note",
74
+ label: "Note",
75
+ icon: NotebookPen,
76
+ iconName: "NotebookPen",
77
+ accentRgb: [148, 163, 184]
78
+ },
79
+ {
80
+ kind: "wiki_page",
81
+ label: "Wiki Page",
82
+ icon: StickyNote,
83
+ iconName: "StickyNote",
84
+ accentRgb: [125, 211, 252]
85
+ },
86
+ {
87
+ kind: "wiki_space",
88
+ label: "Wiki Space",
89
+ icon: Network,
90
+ iconName: "Network",
91
+ accentRgb: [99, 102, 241]
92
+ },
93
+ {
94
+ kind: "insight",
95
+ label: "Insight",
96
+ icon: Sparkles,
97
+ iconName: "Sparkles",
98
+ accentRgb: [244, 63, 94]
99
+ },
100
+ {
101
+ kind: "calendar_event",
102
+ label: "Calendar Event",
103
+ icon: CalendarDays,
104
+ iconName: "CalendarDays",
105
+ accentRgb: [14, 165, 233]
106
+ },
107
+ {
108
+ kind: "work_block",
109
+ label: "Work Block",
110
+ icon: PanelTop,
111
+ iconName: "PanelTop",
112
+ accentRgb: [16, 185, 129]
113
+ },
114
+ {
115
+ kind: "timebox",
116
+ label: "Timebox",
117
+ icon: Timer,
118
+ iconName: "Timer",
119
+ accentRgb: [244, 114, 182]
120
+ },
121
+ {
122
+ kind: "value",
123
+ label: "Value",
124
+ icon: Heart,
125
+ iconName: "Heart",
126
+ accentRgb: [52, 211, 153]
127
+ },
128
+ {
129
+ kind: "pattern",
130
+ label: "Pattern",
131
+ icon: Repeat,
132
+ iconName: "Repeat",
133
+ accentRgb: [251, 113, 133]
134
+ },
135
+ {
136
+ kind: "behavior",
137
+ label: "Behavior",
138
+ icon: Route,
139
+ iconName: "Route",
140
+ accentRgb: [251, 146, 60]
141
+ },
142
+ {
143
+ kind: "belief",
144
+ label: "Belief",
145
+ icon: Quote,
146
+ iconName: "Quote",
147
+ accentRgb: [167, 139, 250]
148
+ },
149
+ {
150
+ kind: "mode",
151
+ label: "Mode",
152
+ icon: Shapes,
153
+ iconName: "Shapes",
154
+ accentRgb: [217, 70, 239]
155
+ },
156
+ {
157
+ kind: "mode_session",
158
+ label: "Mode Session",
159
+ icon: Compass,
160
+ iconName: "Compass",
161
+ accentRgb: [192, 132, 252]
162
+ },
163
+ {
164
+ kind: "report",
165
+ label: "Report",
166
+ icon: FileText,
167
+ iconName: "FileText",
168
+ accentRgb: [96, 165, 250]
169
+ },
170
+ {
171
+ kind: "event_type",
172
+ label: "Event Type",
173
+ icon: CalendarDays,
174
+ iconName: "CalendarDays",
175
+ accentRgb: [45, 212, 191]
176
+ },
177
+ {
178
+ kind: "emotion",
179
+ label: "Emotion",
180
+ icon: Heart,
181
+ iconName: "Heart",
182
+ accentRgb: [248, 113, 113]
183
+ },
184
+ {
185
+ kind: "workbench",
186
+ label: "Workbench",
187
+ icon: Workflow,
188
+ iconName: "Workflow",
189
+ accentRgb: [45, 212, 191]
190
+ },
191
+ {
192
+ kind: "functor",
193
+ label: "Functor",
194
+ icon: Sparkles,
195
+ iconName: "Sparkles",
196
+ accentRgb: [250, 204, 21]
197
+ },
198
+ {
199
+ kind: "chat",
200
+ label: "Chat",
201
+ icon: Bot,
202
+ iconName: "Bot",
203
+ accentRgb: [129, 140, 248]
204
+ }
205
+ ];
206
+ function toHex(rgb) {
207
+ return `#${rgb.map((value) => value.toString(16).padStart(2, "0")).join("")}`;
208
+ }
209
+ function toRgbaVar(kind, rgb, alpha) {
210
+ return `rgba(var(--forge-entity-${kind}-rgb,${rgb.join(",")}),${alpha})`;
211
+ }
212
+ function createEntityVisual(seed) {
213
+ return {
214
+ kind: seed.kind,
215
+ label: seed.label,
216
+ icon: seed.icon,
217
+ iconName: seed.iconName,
218
+ colorToken: {
219
+ cssVariable: `--forge-entity-${seed.kind}-rgb`,
220
+ rgb: seed.accentRgb,
221
+ hex: toHex(seed.accentRgb)
222
+ },
223
+ iconClassName: `text-[${toRgbaVar(seed.kind, seed.accentRgb, 0.96)}]`,
224
+ nameClassName: `text-[${toRgbaVar(seed.kind, seed.accentRgb, 0.96)}]`,
225
+ badgeClassName: `border-[${toRgbaVar(seed.kind, seed.accentRgb, 0.24)}] ` +
226
+ `bg-[linear-gradient(135deg,${toRgbaVar(seed.kind, seed.accentRgb, 0.24)},${toRgbaVar(seed.kind, seed.accentRgb, 0.08)})] text-white`,
227
+ subtleBadgeClassName: `border-[${toRgbaVar(seed.kind, seed.accentRgb, 0.18)}] ` +
228
+ `bg-[${toRgbaVar(seed.kind, seed.accentRgb, 0.08)}] text-[${toRgbaVar(seed.kind, seed.accentRgb, 0.92)}]`,
229
+ buttonClassName: `border-[${toRgbaVar(seed.kind, seed.accentRgb, 0.2)}] ` +
230
+ `bg-[${toRgbaVar(seed.kind, seed.accentRgb, 0.12)}] text-white hover:bg-[${toRgbaVar(seed.kind, seed.accentRgb, 0.18)}]`
231
+ };
232
+ }
233
+ const ENTITY_VISUALS = Object.fromEntries(ENTITY_VISUAL_SEEDS.map((seed) => [seed.kind, createEntityVisual(seed)]));
234
+ const CRUD_ENTITY_KIND_MAP = {
235
+ goal: "goal",
236
+ project: "project",
237
+ task: "task",
238
+ strategy: "strategy",
239
+ habit: "habit",
240
+ tag: "tag",
241
+ note: "note",
242
+ insight: "insight",
243
+ calendar_event: "calendar_event",
244
+ work_block_template: "work_block",
245
+ task_timebox: "timebox",
246
+ psyche_value: "value",
247
+ behavior_pattern: "pattern",
248
+ behavior: "behavior",
249
+ belief_entry: "belief",
250
+ mode_profile: "mode",
251
+ mode_guide_session: "mode_session",
252
+ event_type: "event_type",
253
+ emotion_definition: "emotion",
254
+ trigger_report: "report"
255
+ };
256
+ export function getEntityVisual(kind) {
257
+ return ENTITY_VISUALS[kind];
258
+ }
259
+ export function getEntityVisualCatalog() {
260
+ return ENTITY_KINDS.map((kind) => getEntityVisual(kind));
261
+ }
262
+ export function isEntityKind(value) {
263
+ return ENTITY_KINDS.includes(value);
264
+ }
265
+ export function getEntityKindForCrudEntityType(entityType, options) {
266
+ if (entityType === "note" && options?.noteKind === "wiki") {
267
+ return "wiki_page";
268
+ }
269
+ return CRUD_ENTITY_KIND_MAP[entityType] ?? null;
270
+ }
271
+ export function getEntityKindForWorkbenchFlowKind(kind) {
272
+ return kind === "chat" ? "chat" : "functor";
273
+ }
274
+ export function getEntityButtonClassName(kind, selected) {
275
+ const visual = getEntityVisual(kind);
276
+ return selected
277
+ ? `border ${visual.buttonClassName}`
278
+ : "border border-white/8 bg-white/[0.05] text-white/62 hover:bg-white/[0.08] hover:text-white";
279
+ }