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
@@ -1,4 +1,5 @@
1
1
  import { z } from "zod";
2
+ import { LEGACY_WORKBENCH_PORT_KINDS, WORKBENCH_PORT_KINDS, normalizeWorkbenchPortKind } from "../../src/lib/workbench/nodes.js";
2
3
  export const taskStatusSchema = z.enum([
3
4
  "backlog",
4
5
  "focus",
@@ -33,6 +34,13 @@ export const habitFrequencySchema = z.enum(["daily", "weekly"]);
33
34
  export const habitPolaritySchema = z.enum(["positive", "negative"]);
34
35
  export const habitStatusSchema = z.enum(["active", "paused", "archived"]);
35
36
  export const habitCheckInStatusSchema = z.enum(["done", "missed"]);
37
+ export const habitOrderBySchema = z.enum([
38
+ "needs_attention",
39
+ "name",
40
+ "streak",
41
+ "created_at",
42
+ "updated_at"
43
+ ]);
36
44
  export const calendarProviderSchema = z.enum([
37
45
  "google",
38
46
  "apple",
@@ -79,6 +87,35 @@ export const calendarTimeboxSourceSchema = z.enum([
79
87
  "live_run"
80
88
  ]);
81
89
  export const workAdjustmentEntityTypeSchema = z.enum(["task", "project"]);
90
+ export const taskResolutionKindSchema = z.enum(["completed", "split"]);
91
+ export const actionProfileModeSchema = z.enum([
92
+ "impulse",
93
+ "rate",
94
+ "hybrid",
95
+ "recovery",
96
+ "container"
97
+ ]);
98
+ export const actionProfileSourceMethodSchema = z.enum([
99
+ "seeded",
100
+ "inferred",
101
+ "manual",
102
+ "learned"
103
+ ]);
104
+ export const actionCostBandSchema = z.enum([
105
+ "tiny",
106
+ "light",
107
+ "standard",
108
+ "heavy",
109
+ "brutal"
110
+ ]);
111
+ export const lifeForceStatKeySchema = z.enum([
112
+ "life_force",
113
+ "activation",
114
+ "focus",
115
+ "vigor",
116
+ "composure",
117
+ "flow"
118
+ ]);
82
119
  export const activityEntityTypeSchema = z.enum([
83
120
  "task",
84
121
  "habit",
@@ -115,7 +152,9 @@ export const activityEntityTypeSchema = z.enum([
115
152
  "calendar_event",
116
153
  "work_block",
117
154
  "work_block_template",
118
- "task_timebox"
155
+ "task_timebox",
156
+ "sleep_session",
157
+ "workout_session"
119
158
  ]);
120
159
  export const activitySourceSchema = z.enum([
121
160
  "ui",
@@ -123,12 +162,18 @@ export const activitySourceSchema = z.enum([
123
162
  "agent",
124
163
  "system"
125
164
  ]);
126
- export const diagnosticLogLevelSchema = z.enum([
165
+ export const diagnosticLogLevelSchema = z.preprocess((value) => {
166
+ if (typeof value !== "string") {
167
+ return value;
168
+ }
169
+ const normalized = value.trim().toLowerCase();
170
+ return normalized === "warn" ? "warning" : normalized;
171
+ }, z.enum([
127
172
  "debug",
128
173
  "info",
129
174
  "warning",
130
175
  "error"
131
- ]);
176
+ ]));
132
177
  export const diagnosticLogSourceSchema = z.enum([
133
178
  "ui",
134
179
  "openclaw",
@@ -210,7 +255,9 @@ export const crudEntityTypeSchema = z.enum([
210
255
  "preference_catalog_item",
211
256
  "preference_context",
212
257
  "preference_item",
213
- "questionnaire_instrument"
258
+ "questionnaire_instrument",
259
+ "sleep_session",
260
+ "workout_session"
214
261
  ]);
215
262
  export const rewardableEntityTypeSchema = z.enum([
216
263
  "system",
@@ -447,6 +494,108 @@ export const workAdjustmentResultSchema = z.object({
447
494
  reward: z.lazy(() => rewardLedgerEventSchema).nullable(),
448
495
  metrics: z.lazy(() => xpMetricsPayloadSchema)
449
496
  });
497
+ export const actionDemandWeightsSchema = z.object({
498
+ activation: z.number().min(0).max(1),
499
+ focus: z.number().min(0).max(1),
500
+ vigor: z.number().min(0).max(1),
501
+ composure: z.number().min(0).max(1),
502
+ flow: z.number().min(0).max(1)
503
+ });
504
+ export const actionProfileSchema = z.object({
505
+ id: z.string(),
506
+ profileKey: nonEmptyTrimmedString,
507
+ title: nonEmptyTrimmedString,
508
+ entityType: trimmedString.nullable().default(null),
509
+ mode: actionProfileModeSchema,
510
+ startupAp: z.number().min(0).default(0),
511
+ totalCostAp: z.number().min(0).default(0),
512
+ expectedDurationSeconds: z.number().int().positive().nullable().default(null),
513
+ sustainRateApPerHour: z.number().min(0).default(0),
514
+ demandWeights: actionDemandWeightsSchema,
515
+ doubleCountPolicy: z.enum([
516
+ "primary_only",
517
+ "secondary_weighted",
518
+ "always_count",
519
+ "container_only"
520
+ ]),
521
+ sourceMethod: actionProfileSourceMethodSchema,
522
+ costBand: actionCostBandSchema.default("standard"),
523
+ recoveryEffect: z.number().default(0),
524
+ metadata: z.record(z.string(), z.unknown()).default({}),
525
+ createdAt: z.string(),
526
+ updatedAt: z.string()
527
+ });
528
+ export const taskActionPointSummarySchema = z.object({
529
+ costBand: actionCostBandSchema,
530
+ totalCostAp: z.number().min(0),
531
+ expectedDurationSeconds: z.number().int().positive(),
532
+ sustainRateApPerHour: z.number().min(0),
533
+ spentTodayAp: z.number().min(0),
534
+ spentTotalAp: z.number().min(0),
535
+ remainingAp: z.number().min(0)
536
+ });
537
+ export const taskSplitSuggestionSchema = z.object({
538
+ shouldSplit: z.boolean(),
539
+ reason: trimmedString.nullable().default(null),
540
+ thresholdSeconds: z.number().int().positive()
541
+ });
542
+ export const lifeForceStatStateSchema = z.object({
543
+ key: lifeForceStatKeySchema,
544
+ label: nonEmptyTrimmedString,
545
+ level: z.number().int().min(1),
546
+ xp: z.number().min(0),
547
+ xpToNextLevel: z.number().min(0),
548
+ costModifier: z.number().min(0)
549
+ });
550
+ export const lifeForceCurvePointSchema = z.object({
551
+ minuteOfDay: z.number().int().min(0).max(24 * 60),
552
+ rateApPerHour: z.number().min(0),
553
+ locked: z.boolean().optional()
554
+ });
555
+ export const lifeForceDrainEntrySchema = z.object({
556
+ id: z.string(),
557
+ sourceType: nonEmptyTrimmedString,
558
+ sourceId: nonEmptyTrimmedString,
559
+ title: nonEmptyTrimmedString,
560
+ role: z.enum(["primary", "secondary", "background", "recovery"]),
561
+ apPerHour: z.number(),
562
+ instantAp: z.number(),
563
+ why: trimmedString.default(""),
564
+ startedAt: z.string().nullable().default(null),
565
+ endsAt: z.string().nullable().default(null)
566
+ });
567
+ export const lifeForceWarningSchema = z.object({
568
+ id: z.string(),
569
+ tone: z.enum(["info", "warning", "danger", "success"]),
570
+ title: nonEmptyTrimmedString,
571
+ detail: trimmedString.default("")
572
+ });
573
+ export const lifeForcePayloadSchema = z.object({
574
+ userId: z.string(),
575
+ dateKey: dateOnlySchema,
576
+ baselineDailyAp: z.number().min(0),
577
+ dailyBudgetAp: z.number().min(0),
578
+ spentTodayAp: z.number(),
579
+ remainingAp: z.number(),
580
+ forecastAp: z.number(),
581
+ targetBandMinAp: z.number().min(0),
582
+ targetBandMaxAp: z.number().min(0),
583
+ instantCapacityApPerHour: z.number().min(0),
584
+ instantFreeApPerHour: z.number(),
585
+ overloadApPerHour: z.number().min(0),
586
+ currentDrainApPerHour: z.number().min(0),
587
+ fatigueBufferApPerHour: z.number().min(0),
588
+ sleepRecoveryMultiplier: z.number().min(0),
589
+ readinessMultiplier: z.number().min(0),
590
+ fatigueDebtCarry: z.number().min(0),
591
+ stats: z.array(lifeForceStatStateSchema),
592
+ currentCurve: z.array(lifeForceCurvePointSchema),
593
+ activeDrains: z.array(lifeForceDrainEntrySchema),
594
+ warnings: z.array(lifeForceWarningSchema),
595
+ recommendations: z.array(trimmedString),
596
+ topTaskIdsNeedingSplit: z.array(z.string()),
597
+ updatedAt: z.string()
598
+ });
450
599
  export const noteLinkSchema = z.object({
451
600
  entityType: crudEntityTypeSchema,
452
601
  entityId: nonEmptyTrimmedString,
@@ -558,10 +707,12 @@ export const taskSchema = z.object({
558
707
  .number()
559
708
  .int()
560
709
  .min(60)
561
- .max(86_400)
710
+ .max(7 * 86_400)
562
711
  .nullable()
563
- .default(null),
712
+ .default(86_400),
564
713
  schedulingRules: calendarSchedulingRulesSchema.nullable().default(null),
714
+ resolutionKind: taskResolutionKindSchema.nullable().default(null),
715
+ splitParentTaskId: z.string().nullable().default(null),
565
716
  completedAt: z.string().nullable(),
566
717
  createdAt: z.string(),
567
718
  updatedAt: z.string(),
@@ -576,6 +727,20 @@ export const taskSchema = z.object({
576
727
  activeRunCount: 0,
577
728
  hasCurrentRun: false,
578
729
  currentRunId: null
730
+ }),
731
+ actionPointSummary: taskActionPointSummarySchema.default({
732
+ costBand: "standard",
733
+ totalCostAp: 100,
734
+ expectedDurationSeconds: 86_400,
735
+ sustainRateApPerHour: 100 / 24,
736
+ spentTodayAp: 0,
737
+ spentTotalAp: 0,
738
+ remainingAp: 100
739
+ }),
740
+ splitSuggestion: taskSplitSuggestionSchema.default({
741
+ shouldSplit: false,
742
+ reason: null,
743
+ thresholdSeconds: 2 * 86_400
579
744
  })
580
745
  });
581
746
  export const taskRunSchema = z.object({
@@ -1220,6 +1385,9 @@ export const themePreferenceSchema = z.enum([
1220
1385
  "solar",
1221
1386
  "aurora",
1222
1387
  "ember",
1388
+ "paper",
1389
+ "dawn",
1390
+ "atelier",
1223
1391
  "custom",
1224
1392
  "system"
1225
1393
  ]);
@@ -1249,10 +1417,29 @@ export const microsoftCalendarAuthSettingsSchema = z.object({
1249
1417
  isReadyForSignIn: z.boolean(),
1250
1418
  setupMessage: z.string()
1251
1419
  });
1420
+ export const googleCalendarAuthSettingsSchema = z.object({
1421
+ clientId: z.string(),
1422
+ clientSecret: z.string(),
1423
+ storedClientId: z.string(),
1424
+ storedClientSecret: z.string(),
1425
+ appBaseUrl: z.string(),
1426
+ redirectUri: z.string(),
1427
+ allowedOrigins: z.array(z.string()),
1428
+ usesPkce: z.literal(true),
1429
+ requiresServerClientSecret: z.literal(false),
1430
+ oauthClientType: z.literal("desktop_app"),
1431
+ authMode: z.literal("localhost_pkce"),
1432
+ isConfigured: z.boolean(),
1433
+ isReadyForPairing: z.boolean(),
1434
+ isLocalOnly: z.literal(true),
1435
+ runtimeOrigin: z.string(),
1436
+ setupMessage: z.string()
1437
+ });
1252
1438
  export const aiModelProviderSchema = z.enum([
1253
1439
  "openai-api",
1254
1440
  "openai-codex",
1255
- "openai-compatible"
1441
+ "openai-compatible",
1442
+ "mock"
1256
1443
  ]);
1257
1444
  export const aiModelAuthModeSchema = z.enum(["api_key", "oauth"]);
1258
1445
  export const aiModelConnectionStatusSchema = z.enum([
@@ -1414,17 +1601,59 @@ export const forgeBoxToolAdapterSchema = z.object({
1414
1601
  key: nonEmptyTrimmedString,
1415
1602
  label: nonEmptyTrimmedString,
1416
1603
  description: trimmedString.default(""),
1417
- accessMode: aiProcessorAccessModeSchema.default("read")
1604
+ accessMode: aiProcessorAccessModeSchema.default("read"),
1605
+ argsSchema: z.record(z.string(), z.unknown()).optional()
1606
+ });
1607
+ const workbenchPortKindSchema = z
1608
+ .enum([...WORKBENCH_PORT_KINDS, ...LEGACY_WORKBENCH_PORT_KINDS])
1609
+ .transform((value) => normalizeWorkbenchPortKind({ kind: value }));
1610
+ export const forgeBoxPortShapeFieldSchema = z.object({
1611
+ key: nonEmptyTrimmedString,
1612
+ label: nonEmptyTrimmedString,
1613
+ kind: workbenchPortKindSchema.default("record"),
1614
+ description: trimmedString.optional(),
1615
+ required: z.boolean().default(false)
1616
+ });
1617
+ export const forgeBoxPortDefinitionSchema = z.object({
1618
+ key: nonEmptyTrimmedString,
1619
+ label: nonEmptyTrimmedString,
1620
+ kind: workbenchPortKindSchema.default("record"),
1621
+ description: trimmedString.optional(),
1622
+ required: z.boolean().default(false),
1623
+ expandableKeys: z.array(nonEmptyTrimmedString).default([]),
1624
+ modelName: trimmedString.optional(),
1625
+ itemKind: trimmedString.optional(),
1626
+ shape: z.array(forgeBoxPortShapeFieldSchema).default([]),
1627
+ exampleValue: trimmedString.optional()
1628
+ });
1629
+ export const aiConnectorPublicInputBindingSchema = z.object({
1630
+ nodeId: nonEmptyTrimmedString,
1631
+ targetKey: nonEmptyTrimmedString,
1632
+ targetKind: z.enum(["input", "param"]).default("input")
1633
+ });
1634
+ export const aiConnectorPublicInputSchema = forgeBoxPortDefinitionSchema.extend({
1635
+ defaultValue: z.unknown().optional(),
1636
+ bindings: z.array(aiConnectorPublicInputBindingSchema).default([])
1418
1637
  });
1419
1638
  export const forgeBoxCatalogEntrySchema = z.object({
1420
- boxId: nonEmptyTrimmedString,
1639
+ id: nonEmptyTrimmedString,
1640
+ boxId: trimmedString.optional(),
1421
1641
  surfaceId: trimmedString.nullable(),
1422
1642
  routePath: trimmedString.nullable(),
1423
- label: nonEmptyTrimmedString,
1643
+ title: nonEmptyTrimmedString,
1644
+ label: trimmedString.optional(),
1645
+ icon: trimmedString.nullable().optional(),
1424
1646
  description: trimmedString.default(""),
1425
1647
  category: nonEmptyTrimmedString,
1426
- capabilityModes: z.array(forgeBoxCapabilityModeSchema).default(["content"]),
1427
- toolAdapters: z.array(forgeBoxToolAdapterSchema).default([])
1648
+ tags: z.array(nonEmptyTrimmedString).default([]),
1649
+ capabilityModes: z.array(forgeBoxCapabilityModeSchema).default(["content"]).optional(),
1650
+ inputs: z.array(forgeBoxPortDefinitionSchema).default([]),
1651
+ params: z.array(forgeBoxPortDefinitionSchema).default([]),
1652
+ output: z.array(forgeBoxPortDefinitionSchema).default([]),
1653
+ tools: z.array(forgeBoxToolAdapterSchema).default([]),
1654
+ outputs: z.array(forgeBoxPortDefinitionSchema).default([]).optional(),
1655
+ toolAdapters: z.array(forgeBoxToolAdapterSchema).default([]).optional(),
1656
+ snapshotResolverKey: trimmedString.optional()
1428
1657
  });
1429
1658
  export const forgeBoxSnapshotSchema = z.object({
1430
1659
  boxId: nonEmptyTrimmedString,
@@ -1436,11 +1665,16 @@ export const forgeBoxSnapshotSchema = z.object({
1436
1665
  });
1437
1666
  export const aiConnectorKindSchema = z.enum(["functor", "chat"]);
1438
1667
  export const aiConnectorNodeTypeSchema = z.enum([
1668
+ "box",
1439
1669
  "box_input",
1670
+ "value",
1440
1671
  "user_input",
1441
1672
  "functor",
1442
1673
  "chat",
1443
- "output"
1674
+ "output",
1675
+ "merge",
1676
+ "template",
1677
+ "pick_key"
1444
1678
  ]);
1445
1679
  export const aiConnectorNodeModelConfigSchema = z.object({
1446
1680
  connectionId: trimmedString.nullable().default(null),
@@ -1462,9 +1696,20 @@ export const aiConnectorNodeSchema = z.object({
1462
1696
  description: trimmedString.default(""),
1463
1697
  boxId: trimmedString.nullable().optional(),
1464
1698
  prompt: trimmedString.optional(),
1699
+ promptTemplate: trimmedString.optional(),
1465
1700
  systemPrompt: trimmedString.optional(),
1466
1701
  outputKey: trimmedString.optional(),
1467
1702
  enabledToolKeys: z.array(nonEmptyTrimmedString).default([]),
1703
+ inputs: z.array(forgeBoxPortDefinitionSchema).default([]).optional(),
1704
+ outputs: z.array(forgeBoxPortDefinitionSchema).default([]).optional(),
1705
+ params: z.array(forgeBoxPortDefinitionSchema).default([]).optional(),
1706
+ paramValues: z.record(z.string(), z.unknown()).default({}).optional(),
1707
+ template: trimmedString.optional(),
1708
+ selectedKey: trimmedString.optional(),
1709
+ valueType: z
1710
+ .enum(["string", "number", "boolean", "null", "array", "object"])
1711
+ .optional(),
1712
+ valueLiteral: trimmedString.optional(),
1468
1713
  modelConfig: aiConnectorNodeModelConfigSchema.optional()
1469
1714
  })
1470
1715
  });
@@ -1488,7 +1733,55 @@ export const aiConnectorRunResultSchema = z.object({
1488
1733
  label: z.string(),
1489
1734
  text: z.string(),
1490
1735
  json: z.record(z.string(), z.unknown()).nullable()
1736
+ })),
1737
+ nodeResults: z
1738
+ .array(z.object({
1739
+ nodeId: nonEmptyTrimmedString,
1740
+ nodeType: aiConnectorNodeTypeSchema,
1741
+ label: nonEmptyTrimmedString,
1742
+ input: z.array(z.object({
1743
+ sourceNodeId: nonEmptyTrimmedString,
1744
+ sourceHandle: trimmedString.nullable(),
1745
+ targetHandle: trimmedString.nullable(),
1746
+ text: z.string(),
1747
+ json: z.record(z.string(), z.unknown()).nullable()
1748
+ })),
1749
+ primaryText: z.string(),
1750
+ payload: z.record(z.string(), z.unknown()).nullable(),
1751
+ outputMap: z.record(z.string(), z.object({
1752
+ text: z.string(),
1753
+ json: z.record(z.string(), z.unknown()).nullable()
1754
+ })),
1755
+ tools: z.array(z.string()).default([]),
1756
+ logs: z.array(z.string()).default([]),
1757
+ error: z.string().nullable(),
1758
+ timingMs: z.number().int().nonnegative().nullable().optional()
1491
1759
  }))
1760
+ .default([]),
1761
+ debugTrace: z
1762
+ .object({
1763
+ nodes: z.array(z.object({
1764
+ nodeId: nonEmptyTrimmedString,
1765
+ nodeType: aiConnectorNodeTypeSchema,
1766
+ label: nonEmptyTrimmedString,
1767
+ input: z.array(z.object({
1768
+ sourceNodeId: nonEmptyTrimmedString,
1769
+ sourceHandle: trimmedString.nullable(),
1770
+ targetHandle: trimmedString.nullable(),
1771
+ text: z.string(),
1772
+ json: z.record(z.string(), z.unknown()).nullable()
1773
+ })),
1774
+ output: z.object({
1775
+ text: z.string(),
1776
+ json: z.record(z.string(), z.unknown()).nullable()
1777
+ }),
1778
+ tools: z.array(z.string()).default([]),
1779
+ logs: z.array(z.string()).default([]),
1780
+ error: z.string().nullable()
1781
+ })),
1782
+ errors: z.array(z.string()).default([])
1783
+ })
1784
+ .optional()
1492
1785
  });
1493
1786
  export const aiConnectorRunSchema = z.object({
1494
1787
  id: nonEmptyTrimmedString,
@@ -1496,6 +1789,7 @@ export const aiConnectorRunSchema = z.object({
1496
1789
  mode: z.enum(["run", "chat"]),
1497
1790
  status: z.enum(["running", "completed", "failed"]),
1498
1791
  userInput: z.string(),
1792
+ inputs: z.record(z.string(), z.unknown()).default({}),
1499
1793
  context: z.record(z.string(), z.unknown()).default({}),
1500
1794
  conversationId: trimmedString.nullable(),
1501
1795
  result: aiConnectorRunResultSchema.nullable(),
@@ -1528,6 +1822,7 @@ export const aiConnectorSchema = z.object({
1528
1822
  nodes: z.array(aiConnectorNodeSchema).default([]),
1529
1823
  edges: z.array(aiConnectorEdgeSchema).default([])
1530
1824
  }),
1825
+ publicInputs: z.array(aiConnectorPublicInputSchema).default([]),
1531
1826
  publishedOutputs: z.array(aiConnectorOutputSchema).default([]),
1532
1827
  lastRun: aiConnectorRunSchema.nullable(),
1533
1828
  legacyProcessorId: trimmedString.nullable().default(null),
@@ -1792,6 +2087,7 @@ export const settingsPayloadSchema = z.object({
1792
2087
  psycheAuthRequired: z.boolean()
1793
2088
  }),
1794
2089
  calendarProviders: z.object({
2090
+ google: googleCalendarAuthSettingsSchema,
1795
2091
  microsoft: microsoftCalendarAuthSettingsSchema
1796
2092
  }),
1797
2093
  modelSettings: modelSettingsPayloadSchema,
@@ -1982,6 +2278,8 @@ export const activityListQuerySchema = z.object({
1982
2278
  entityType: activityEntityTypeSchema.optional(),
1983
2279
  entityId: nonEmptyTrimmedString.optional(),
1984
2280
  source: activitySourceSchema.optional(),
2281
+ from: flexibleCalendarQueryDateSchema.optional(),
2282
+ to: flexibleCalendarQueryDateSchema.optional(),
1985
2283
  includeCorrected: z.coerce.boolean().optional(),
1986
2284
  userIds: repeatedTrimmedStringQuerySchema.optional(),
1987
2285
  limit: z.coerce.number().int().positive().max(100).optional()
@@ -2004,14 +2302,28 @@ export const calendarOverviewQuerySchema = z.object({
2004
2302
  to: flexibleCalendarQueryDateSchema.optional(),
2005
2303
  userIds: repeatedTrimmedStringQuerySchema.optional()
2006
2304
  });
2305
+ export const psycheObservationCalendarExportFormatSchema = z.enum([
2306
+ "json",
2307
+ "csv",
2308
+ "markdown",
2309
+ "ics"
2310
+ ]);
2311
+ export const psycheObservationCalendarExportQuerySchema = z.object({
2312
+ from: flexibleCalendarQueryDateSchema.optional(),
2313
+ to: flexibleCalendarQueryDateSchema.optional(),
2314
+ userIds: repeatedTrimmedStringQuerySchema.optional(),
2315
+ tags: repeatedTrimmedStringQuerySchema.optional(),
2316
+ includeObservations: z.coerce.boolean().optional(),
2317
+ includeActivity: z.coerce.boolean().optional(),
2318
+ onlyHumanOwned: z.coerce.boolean().optional(),
2319
+ search: trimmedString.optional(),
2320
+ format: psycheObservationCalendarExportFormatSchema.default("markdown")
2321
+ });
2007
2322
  export const createCalendarConnectionSchema = z.discriminatedUnion("provider", [
2008
2323
  z.object({
2009
2324
  provider: z.literal("google"),
2010
2325
  label: nonEmptyTrimmedString,
2011
- username: nonEmptyTrimmedString,
2012
- clientId: nonEmptyTrimmedString,
2013
- clientSecret: nonEmptyTrimmedString,
2014
- refreshToken: nonEmptyTrimmedString,
2326
+ authSessionId: nonEmptyTrimmedString,
2015
2327
  selectedCalendarUrls: z.array(nonEmptyTrimmedString.url()).min(1),
2016
2328
  forgeCalendarUrl: nonEmptyTrimmedString.url().nullable().optional(),
2017
2329
  createForgeCalendar: z.boolean().optional().default(false)
@@ -2043,13 +2355,6 @@ export const createCalendarConnectionSchema = z.discriminatedUnion("provider", [
2043
2355
  })
2044
2356
  ]);
2045
2357
  export const discoverCalendarConnectionSchema = z.discriminatedUnion("provider", [
2046
- z.object({
2047
- provider: z.literal("google"),
2048
- username: nonEmptyTrimmedString,
2049
- clientId: nonEmptyTrimmedString,
2050
- clientSecret: nonEmptyTrimmedString,
2051
- refreshToken: nonEmptyTrimmedString
2052
- }),
2053
2358
  z.object({
2054
2359
  provider: z.literal("apple"),
2055
2360
  username: nonEmptyTrimmedString,
@@ -2065,6 +2370,10 @@ export const discoverCalendarConnectionSchema = z.discriminatedUnion("provider",
2065
2370
  export const startMicrosoftCalendarOauthSchema = z.object({
2066
2371
  label: nonEmptyTrimmedString.optional()
2067
2372
  });
2373
+ export const startGoogleCalendarOauthSchema = z.object({
2374
+ label: nonEmptyTrimmedString.optional(),
2375
+ browserOrigin: trimmedString.optional()
2376
+ });
2068
2377
  export const testMicrosoftCalendarOauthConfigurationSchema = z.object({
2069
2378
  clientId: nonEmptyTrimmedString.regex(/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/, "Microsoft client IDs must use the standard app registration GUID format."),
2070
2379
  tenantId: trimmedString.default("common"),
@@ -2078,6 +2387,14 @@ export const microsoftCalendarOauthSessionSchema = z.object({
2078
2387
  error: z.string().nullable(),
2079
2388
  discovery: calendarDiscoveryPayloadSchema.nullable()
2080
2389
  });
2390
+ export const googleCalendarOauthSessionSchema = z.object({
2391
+ sessionId: nonEmptyTrimmedString,
2392
+ status: z.enum(["pending", "authorized", "error", "consumed", "expired"]),
2393
+ authUrl: z.string().url().nullable(),
2394
+ accountLabel: z.string().nullable(),
2395
+ error: z.string().nullable(),
2396
+ discovery: calendarDiscoveryPayloadSchema.nullable()
2397
+ });
2081
2398
  export const updateCalendarConnectionSchema = z.object({
2082
2399
  label: nonEmptyTrimmedString.optional(),
2083
2400
  selectedCalendarUrls: z.array(nonEmptyTrimmedString.url()).optional()
@@ -2288,6 +2605,7 @@ export const habitListQuerySchema = z.object({
2288
2605
  status: habitStatusSchema.optional(),
2289
2606
  polarity: habitPolaritySchema.optional(),
2290
2607
  dueToday: z.coerce.boolean().optional(),
2608
+ orderBy: habitOrderBySchema.optional(),
2291
2609
  userIds: repeatedTrimmedStringQuerySchema.optional(),
2292
2610
  limit: z.coerce.number().int().positive().max(100).optional()
2293
2611
  });
@@ -2360,12 +2678,13 @@ export const taskMutationShape = {
2360
2678
  .number()
2361
2679
  .int()
2362
2680
  .min(60)
2363
- .max(86_400)
2681
+ .max(7 * 86_400)
2364
2682
  .nullable()
2365
- .default(null),
2683
+ .default(86_400),
2366
2684
  schedulingRules: calendarSchedulingRulesSchema.nullable().default(null),
2367
2685
  sortOrder: z.number().int().nonnegative().optional(),
2368
2686
  tagIds: uniqueStringArraySchema.default([]),
2687
+ actionCostBand: actionCostBandSchema.default("standard"),
2369
2688
  notes: z.array(nestedCreateNoteSchema).default([])
2370
2689
  };
2371
2690
  export const createTaskSchema = z.object(taskMutationShape);
@@ -2508,14 +2827,44 @@ export const updateTaskSchema = z.object({
2508
2827
  .number()
2509
2828
  .int()
2510
2829
  .min(60)
2511
- .max(86_400)
2830
+ .max(7 * 86_400)
2512
2831
  .nullable()
2513
2832
  .optional(),
2514
2833
  schedulingRules: calendarSchedulingRulesSchema.nullable().optional(),
2834
+ resolutionKind: taskResolutionKindSchema.nullable().optional(),
2835
+ splitParentTaskId: z.string().nullable().optional(),
2836
+ enforceTodayWorkLog: z.boolean().optional(),
2837
+ completedTodayWorkSeconds: z
2838
+ .number()
2839
+ .int()
2840
+ .min(0)
2841
+ .max(7 * 86_400)
2842
+ .optional(),
2843
+ actionCostBand: actionCostBandSchema.optional(),
2515
2844
  sortOrder: z.number().int().nonnegative().optional(),
2516
2845
  tagIds: uniqueStringArraySchema.optional(),
2517
2846
  notes: z.array(nestedCreateNoteSchema).optional()
2518
2847
  });
2848
+ export const lifeForceProfilePatchSchema = z.object({
2849
+ baseDailyAp: z.number().int().min(50).max(500).optional(),
2850
+ readinessMultiplier: z.number().min(0.5).max(1.5).optional(),
2851
+ stats: z
2852
+ .record(lifeForceStatKeySchema, z.number().int().min(1).max(100))
2853
+ .optional()
2854
+ });
2855
+ export const lifeForceTemplateUpdateSchema = z.object({
2856
+ points: z.array(lifeForceCurvePointSchema).min(2)
2857
+ });
2858
+ export const fatigueSignalCreateSchema = z.object({
2859
+ signalType: z.enum(["tired", "okay_again"]),
2860
+ observedAt: dateTimeSchema.optional(),
2861
+ note: trimmedString.optional()
2862
+ });
2863
+ export const taskSplitCreateSchema = z.object({
2864
+ firstTitle: nonEmptyTrimmedString,
2865
+ secondTitle: nonEmptyTrimmedString,
2866
+ remainingRatio: z.number().min(0.1).max(0.9).default(0.5)
2867
+ });
2519
2868
  export const tagSuggestionRequestSchema = z.object({
2520
2869
  title: trimmedString.default(""),
2521
2870
  description: trimmedString.default(""),
@@ -2595,6 +2944,12 @@ export const updateSettingsSchema = z.object({
2595
2944
  .optional(),
2596
2945
  calendarProviders: z
2597
2946
  .object({
2947
+ google: z
2948
+ .object({
2949
+ clientId: trimmedString.optional(),
2950
+ clientSecret: trimmedString.optional()
2951
+ })
2952
+ .optional(),
2598
2953
  microsoft: z
2599
2954
  .object({
2600
2955
  clientId: trimmedString.optional(),
@@ -2603,7 +2958,37 @@ export const updateSettingsSchema = z.object({
2603
2958
  })
2604
2959
  .optional()
2605
2960
  })
2606
- .optional(),
2961
+ .optional()
2962
+ .superRefine((value, context) => {
2963
+ if (!value) {
2964
+ return;
2965
+ }
2966
+ const google = value.google;
2967
+ if (!google) {
2968
+ return;
2969
+ }
2970
+ const hasClientIdField = google.clientId !== undefined;
2971
+ const hasClientSecretField = google.clientSecret !== undefined;
2972
+ const hasClientIdValue = (google.clientId?.length ?? 0) > 0;
2973
+ const hasClientSecretValue = (google.clientSecret?.length ?? 0) > 0;
2974
+ if (hasClientIdField !== hasClientSecretField) {
2975
+ const message = "When overriding Google OAuth credentials, provide both the client ID and client secret together, or clear both fields together.";
2976
+ context.addIssue({
2977
+ code: z.ZodIssueCode.custom,
2978
+ path: ["google", hasClientIdField ? "clientSecret" : "clientId"],
2979
+ message
2980
+ });
2981
+ return;
2982
+ }
2983
+ if (hasClientIdValue !== hasClientSecretValue) {
2984
+ const message = "When overriding Google OAuth credentials, provide both the client ID and client secret together, or clear both fields together.";
2985
+ context.addIssue({
2986
+ code: z.ZodIssueCode.custom,
2987
+ path: ["google", hasClientIdValue ? "clientSecret" : "clientId"],
2988
+ message
2989
+ });
2990
+ }
2991
+ }),
2607
2992
  modelSettings: z
2608
2993
  .object({
2609
2994
  forgeAgent: z
@@ -2640,6 +3025,7 @@ export const upsertAiModelConnectionSchema = z
2640
3025
  .superRefine((value, context) => {
2641
3026
  const authMode = value.authMode ??
2642
3027
  (value.provider === "openai-codex" ? "oauth" : "api_key");
3028
+ const isMockProvider = value.provider === "mock";
2643
3029
  if (value.provider === "openai-codex" && authMode !== "oauth") {
2644
3030
  context.addIssue({
2645
3031
  code: z.ZodIssueCode.custom,
@@ -2648,6 +3034,7 @@ export const upsertAiModelConnectionSchema = z
2648
3034
  });
2649
3035
  }
2650
3036
  if (authMode === "api_key" &&
3037
+ !isMockProvider &&
2651
3038
  !value.id?.trim() &&
2652
3039
  !value.apiKey?.trim()) {
2653
3040
  context.addIssue({
@@ -2724,6 +3111,7 @@ export const createAiConnectorSchema = z.object({
2724
3111
  kind: aiConnectorKindSchema.default("functor"),
2725
3112
  homeSurfaceId: trimmedString.nullable().default(null),
2726
3113
  endpointEnabled: z.boolean().default(true),
3114
+ publicInputs: z.array(aiConnectorPublicInputSchema).default([]),
2727
3115
  graph: z
2728
3116
  .object({
2729
3117
  nodes: z.array(aiConnectorNodeSchema).default([]),
@@ -2737,6 +3125,7 @@ export const updateAiConnectorSchema = z.object({
2737
3125
  kind: aiConnectorKindSchema.optional(),
2738
3126
  homeSurfaceId: trimmedString.nullable().optional(),
2739
3127
  endpointEnabled: z.boolean().optional(),
3128
+ publicInputs: z.array(aiConnectorPublicInputSchema).optional(),
2740
3129
  graph: z
2741
3130
  .object({
2742
3131
  nodes: z.array(aiConnectorNodeSchema).default([]),
@@ -2746,9 +3135,11 @@ export const updateAiConnectorSchema = z.object({
2746
3135
  });
2747
3136
  export const runAiConnectorSchema = z.object({
2748
3137
  userInput: trimmedString.default(""),
3138
+ inputs: z.record(z.string(), z.unknown()).default({}),
2749
3139
  context: z.record(z.string(), z.unknown()).default({}),
2750
3140
  boxSnapshots: z.record(z.string(), z.unknown()).default({}),
2751
- conversationId: trimmedString.nullable().default(null)
3141
+ conversationId: trimmedString.nullable().default(null),
3142
+ debug: z.boolean().default(false)
2752
3143
  });
2753
3144
  export const createAgentTokenSchema = z.object({
2754
3145
  label: nonEmptyTrimmedString,