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
@@ -93,6 +93,12 @@ export const activityEntityTypeSchema = z.enum([
93
93
  "mode_profile",
94
94
  "mode_guide_session",
95
95
  "trigger_report",
96
+ "preference_catalog",
97
+ "preference_catalog_item",
98
+ "preference_context",
99
+ "preference_item",
100
+ "questionnaire_instrument",
101
+ "questionnaire_run",
96
102
  "note",
97
103
  "event_type",
98
104
  "emotion_definition",
@@ -199,7 +205,12 @@ export const crudEntityTypeSchema = z.enum([
199
205
  "mode_guide_session",
200
206
  "event_type",
201
207
  "emotion_definition",
202
- "trigger_report"
208
+ "trigger_report",
209
+ "preference_catalog",
210
+ "preference_catalog_item",
211
+ "preference_context",
212
+ "preference_item",
213
+ "questionnaire_instrument"
203
214
  ]);
204
215
  export const rewardableEntityTypeSchema = z.enum([
205
216
  "system",
@@ -235,6 +246,11 @@ export const rewardRuleFamilySchema = z.enum([
235
246
  "ambient"
236
247
  ]);
237
248
  export const appLocaleSchema = z.enum(["en", "fr"]);
249
+ export const surfaceWidgetDensitySchema = z.enum([
250
+ "dense",
251
+ "compact",
252
+ "comfortable"
253
+ ]);
238
254
  const trimmedString = z.string().trim();
239
255
  const nonEmptyTrimmedString = trimmedString.min(1);
240
256
  const rewardConfigValueSchema = z.union([
@@ -876,7 +892,7 @@ export const activityEventSchema = z.object({
876
892
  description: z.string(),
877
893
  actor: z.string().nullable(),
878
894
  source: activitySourceSchema,
879
- metadata: z.record(z.string(), z.union([z.string(), z.number(), z.boolean(), z.null()])),
895
+ metadata: z.record(z.string(), z.unknown()),
880
896
  createdAt: z.string(),
881
897
  ...ownershipShape
882
898
  });
@@ -1195,7 +1211,32 @@ export const notificationPreferencesSchema = z.object({
1195
1211
  dailyQuestReminders: z.boolean(),
1196
1212
  achievementCelebrations: z.boolean()
1197
1213
  });
1198
- export const themePreferenceSchema = z.enum(["obsidian", "solar", "system"]);
1214
+ const hexColorSchema = z
1215
+ .string()
1216
+ .trim()
1217
+ .regex(/^#[0-9a-fA-F]{6}$/, "Use a 6-digit hex color");
1218
+ export const themePreferenceSchema = z.enum([
1219
+ "obsidian",
1220
+ "solar",
1221
+ "aurora",
1222
+ "ember",
1223
+ "paper",
1224
+ "dawn",
1225
+ "atelier",
1226
+ "custom",
1227
+ "system"
1228
+ ]);
1229
+ export const customThemeSchema = z.object({
1230
+ label: z.string().trim().min(1).max(40),
1231
+ primary: hexColorSchema,
1232
+ secondary: hexColorSchema,
1233
+ tertiary: hexColorSchema,
1234
+ canvas: hexColorSchema,
1235
+ panel: hexColorSchema,
1236
+ panelHigh: hexColorSchema,
1237
+ panelLow: hexColorSchema,
1238
+ ink: hexColorSchema
1239
+ });
1199
1240
  export const executionSettingsSchema = z.object({
1200
1241
  maxActiveTasks: z.number().int().min(1).max(8),
1201
1242
  timeAccountingMode: timeAccountingModeSchema
@@ -1211,6 +1252,384 @@ export const microsoftCalendarAuthSettingsSchema = z.object({
1211
1252
  isReadyForSignIn: z.boolean(),
1212
1253
  setupMessage: z.string()
1213
1254
  });
1255
+ export const googleCalendarAuthSettingsSchema = z.object({
1256
+ clientId: z.string(),
1257
+ clientSecret: z.string(),
1258
+ storedClientId: z.string(),
1259
+ storedClientSecret: z.string(),
1260
+ appBaseUrl: z.string(),
1261
+ redirectUri: z.string(),
1262
+ allowedOrigins: z.array(z.string()),
1263
+ usesPkce: z.literal(true),
1264
+ requiresServerClientSecret: z.literal(false),
1265
+ oauthClientType: z.literal("desktop_app"),
1266
+ authMode: z.literal("localhost_pkce"),
1267
+ isConfigured: z.boolean(),
1268
+ isReadyForPairing: z.boolean(),
1269
+ isLocalOnly: z.literal(true),
1270
+ runtimeOrigin: z.string(),
1271
+ setupMessage: z.string()
1272
+ });
1273
+ export const aiModelProviderSchema = z.enum([
1274
+ "openai-api",
1275
+ "openai-codex",
1276
+ "openai-compatible"
1277
+ ]);
1278
+ export const aiModelAuthModeSchema = z.enum(["api_key", "oauth"]);
1279
+ export const aiModelConnectionStatusSchema = z.enum([
1280
+ "connected",
1281
+ "needs_attention"
1282
+ ]);
1283
+ export const aiModelConnectionSchema = z.object({
1284
+ id: z.string(),
1285
+ label: z.string(),
1286
+ provider: aiModelProviderSchema,
1287
+ authMode: aiModelAuthModeSchema,
1288
+ baseUrl: z.string(),
1289
+ model: z.string(),
1290
+ accountLabel: z.string().nullable(),
1291
+ enabled: z.boolean(),
1292
+ status: aiModelConnectionStatusSchema,
1293
+ hasStoredCredential: z.boolean(),
1294
+ usesOAuth: z.boolean(),
1295
+ supportsCustomBaseUrl: z.boolean(),
1296
+ agentId: z.string(),
1297
+ agentLabel: z.string(),
1298
+ createdAt: z.string(),
1299
+ updatedAt: z.string()
1300
+ });
1301
+ export const forgeAgentModelSlotSchema = z.object({
1302
+ connectionId: z.string().nullable(),
1303
+ connectionLabel: z.string().nullable(),
1304
+ provider: aiModelProviderSchema.nullable(),
1305
+ baseUrl: z.string().nullable(),
1306
+ model: z.string()
1307
+ });
1308
+ export const modelSettingsPayloadSchema = z.object({
1309
+ forgeAgent: z.object({
1310
+ basicChat: forgeAgentModelSlotSchema,
1311
+ wiki: forgeAgentModelSlotSchema
1312
+ }),
1313
+ connections: z.array(aiModelConnectionSchema),
1314
+ oauth: z.object({
1315
+ openAiCodex: z.object({
1316
+ authorizeUrl: z.string(),
1317
+ callbackUrl: z.string(),
1318
+ setupMessage: z.string()
1319
+ })
1320
+ })
1321
+ });
1322
+ export const aiProcessorTriggerModeSchema = z.enum([
1323
+ "manual",
1324
+ "route",
1325
+ "cron"
1326
+ ]);
1327
+ export const aiProcessorCapabilityModeSchema = z.enum([
1328
+ "content",
1329
+ "tool",
1330
+ "mcp",
1331
+ "processor"
1332
+ ]);
1333
+ export const aiProcessorAccessModeSchema = z.enum([
1334
+ "read",
1335
+ "write",
1336
+ "read_write",
1337
+ "exec"
1338
+ ]);
1339
+ export const aiProcessorMachineAccessSchema = z.object({
1340
+ read: z.boolean().default(false),
1341
+ write: z.boolean().default(false),
1342
+ exec: z.boolean().default(false)
1343
+ });
1344
+ export const aiProcessorAgentConfigSchema = z.object({
1345
+ agentId: nonEmptyTrimmedString,
1346
+ connectionId: trimmedString.nullable().default(null),
1347
+ model: trimmedString.default("")
1348
+ });
1349
+ export const aiProcessorToolSchema = z.object({
1350
+ key: nonEmptyTrimmedString,
1351
+ label: nonEmptyTrimmedString,
1352
+ description: trimmedString.default(""),
1353
+ endpoint: trimmedString.default(""),
1354
+ mode: aiProcessorCapabilityModeSchema.default("tool")
1355
+ });
1356
+ export const surfaceWidgetPreferencesSchema = z.object({
1357
+ hidden: z.boolean().default(false),
1358
+ fullWidth: z.boolean().default(false),
1359
+ titleVisible: z.boolean().default(true),
1360
+ descriptionVisible: z.boolean().default(true)
1361
+ });
1362
+ export const surfaceLayoutPayloadSchema = z.object({
1363
+ surfaceId: nonEmptyTrimmedString,
1364
+ order: z.array(nonEmptyTrimmedString).default([]),
1365
+ widgets: z.record(z.string(), surfaceWidgetPreferencesSchema).default({}),
1366
+ updatedAt: z.string()
1367
+ });
1368
+ export const writeSurfaceLayoutSchema = z.object({
1369
+ order: z.array(nonEmptyTrimmedString).default([]),
1370
+ widgets: z.record(z.string(), surfaceWidgetPreferencesSchema).default({})
1371
+ });
1372
+ export const aiProcessorSchema = z.object({
1373
+ id: z.string(),
1374
+ slug: z.string(),
1375
+ surfaceId: z.string(),
1376
+ title: z.string(),
1377
+ promptFlow: z.string(),
1378
+ contextInput: z.string(),
1379
+ toolConfig: z.array(aiProcessorToolSchema),
1380
+ agentIds: z.array(z.string()),
1381
+ agentConfigs: z.array(aiProcessorAgentConfigSchema),
1382
+ triggerMode: aiProcessorTriggerModeSchema,
1383
+ cronExpression: z.string(),
1384
+ machineAccess: aiProcessorMachineAccessSchema,
1385
+ endpointEnabled: z.boolean(),
1386
+ lastRunAt: z.string().nullable(),
1387
+ lastRunStatus: z.enum(["idle", "running", "completed", "failed"]).nullable(),
1388
+ lastRunOutput: z
1389
+ .object({
1390
+ concatenated: z.string(),
1391
+ byAgent: z.record(z.string(), z.string())
1392
+ })
1393
+ .nullable(),
1394
+ runHistory: z.array(z.object({
1395
+ id: z.string(),
1396
+ trigger: z.enum(["manual", "route", "cron"]),
1397
+ startedAt: z.string(),
1398
+ completedAt: z.string().nullable(),
1399
+ status: z.enum(["running", "completed", "failed"]),
1400
+ input: z.string(),
1401
+ output: z
1402
+ .object({
1403
+ concatenated: z.string(),
1404
+ byAgent: z.record(z.string(), z.string())
1405
+ })
1406
+ .nullable(),
1407
+ error: z.string().nullable()
1408
+ })),
1409
+ createdAt: z.string(),
1410
+ updatedAt: z.string()
1411
+ });
1412
+ export const aiProcessorLinkSchema = z.object({
1413
+ id: z.string(),
1414
+ surfaceId: z.string(),
1415
+ sourceWidgetId: z.string(),
1416
+ targetProcessorId: z.string(),
1417
+ accessMode: aiProcessorAccessModeSchema,
1418
+ capabilityMode: aiProcessorCapabilityModeSchema,
1419
+ metadata: z.record(z.string(), z.unknown()),
1420
+ createdAt: z.string(),
1421
+ updatedAt: z.string()
1422
+ });
1423
+ export const surfaceProcessorGraphPayloadSchema = z.object({
1424
+ surfaceId: z.string(),
1425
+ processors: z.array(aiProcessorSchema),
1426
+ links: z.array(aiProcessorLinkSchema)
1427
+ });
1428
+ export const forgeBoxCapabilityModeSchema = z.enum([
1429
+ "content",
1430
+ "tool",
1431
+ "action",
1432
+ "mcp"
1433
+ ]);
1434
+ export const forgeBoxToolAdapterSchema = z.object({
1435
+ key: nonEmptyTrimmedString,
1436
+ label: nonEmptyTrimmedString,
1437
+ description: trimmedString.default(""),
1438
+ accessMode: aiProcessorAccessModeSchema.default("read")
1439
+ });
1440
+ export const forgeBoxPortDefinitionSchema = z.object({
1441
+ key: nonEmptyTrimmedString,
1442
+ label: nonEmptyTrimmedString,
1443
+ kind: nonEmptyTrimmedString.default("content"),
1444
+ required: z.boolean().default(false),
1445
+ expandableKeys: z.array(nonEmptyTrimmedString).default([])
1446
+ });
1447
+ export const forgeBoxCatalogEntrySchema = z.object({
1448
+ id: nonEmptyTrimmedString,
1449
+ boxId: trimmedString.optional(),
1450
+ surfaceId: trimmedString.nullable(),
1451
+ routePath: trimmedString.nullable(),
1452
+ title: nonEmptyTrimmedString,
1453
+ label: trimmedString.optional(),
1454
+ icon: trimmedString.nullable().optional(),
1455
+ description: trimmedString.default(""),
1456
+ category: nonEmptyTrimmedString,
1457
+ tags: z.array(nonEmptyTrimmedString).default([]),
1458
+ capabilityModes: z.array(forgeBoxCapabilityModeSchema).default(["content"]).optional(),
1459
+ inputs: z.array(forgeBoxPortDefinitionSchema).default([]),
1460
+ params: z.array(forgeBoxPortDefinitionSchema).default([]),
1461
+ output: z.array(forgeBoxPortDefinitionSchema).default([]),
1462
+ tools: z.array(forgeBoxToolAdapterSchema).default([]),
1463
+ outputs: z.array(forgeBoxPortDefinitionSchema).default([]).optional(),
1464
+ toolAdapters: z.array(forgeBoxToolAdapterSchema).default([]).optional(),
1465
+ snapshotResolverKey: trimmedString.optional()
1466
+ });
1467
+ export const forgeBoxSnapshotSchema = z.object({
1468
+ boxId: nonEmptyTrimmedString,
1469
+ label: nonEmptyTrimmedString,
1470
+ capturedAt: z.string(),
1471
+ contentText: z.string(),
1472
+ contentJson: z.record(z.string(), z.unknown()).nullable(),
1473
+ tools: z.array(forgeBoxToolAdapterSchema).default([])
1474
+ });
1475
+ export const aiConnectorKindSchema = z.enum(["functor", "chat"]);
1476
+ export const aiConnectorNodeTypeSchema = z.enum([
1477
+ "box",
1478
+ "box_input",
1479
+ "value",
1480
+ "user_input",
1481
+ "functor",
1482
+ "chat",
1483
+ "output",
1484
+ "merge",
1485
+ "template",
1486
+ "pick_key"
1487
+ ]);
1488
+ export const aiConnectorNodeModelConfigSchema = z.object({
1489
+ connectionId: trimmedString.nullable().default(null),
1490
+ provider: aiModelProviderSchema.nullable().default(null),
1491
+ baseUrl: trimmedString.nullable().default(null),
1492
+ model: trimmedString.default(""),
1493
+ thinking: trimmedString.nullable().default(null),
1494
+ verbosity: trimmedString.nullable().default(null)
1495
+ });
1496
+ export const aiConnectorNodeSchema = z.object({
1497
+ id: nonEmptyTrimmedString,
1498
+ type: aiConnectorNodeTypeSchema,
1499
+ position: z.object({
1500
+ x: z.number(),
1501
+ y: z.number()
1502
+ }),
1503
+ data: z.object({
1504
+ label: nonEmptyTrimmedString,
1505
+ description: trimmedString.default(""),
1506
+ boxId: trimmedString.nullable().optional(),
1507
+ prompt: trimmedString.optional(),
1508
+ promptTemplate: trimmedString.optional(),
1509
+ systemPrompt: trimmedString.optional(),
1510
+ outputKey: trimmedString.optional(),
1511
+ enabledToolKeys: z.array(nonEmptyTrimmedString).default([]),
1512
+ inputs: z.array(forgeBoxPortDefinitionSchema).default([]).optional(),
1513
+ outputs: z.array(forgeBoxPortDefinitionSchema).default([]).optional(),
1514
+ params: z.array(forgeBoxPortDefinitionSchema).default([]).optional(),
1515
+ paramValues: z.record(z.string(), z.unknown()).default({}).optional(),
1516
+ template: trimmedString.optional(),
1517
+ selectedKey: trimmedString.optional(),
1518
+ valueType: z
1519
+ .enum(["string", "number", "boolean", "null", "array", "object"])
1520
+ .optional(),
1521
+ valueLiteral: trimmedString.optional(),
1522
+ modelConfig: aiConnectorNodeModelConfigSchema.optional()
1523
+ })
1524
+ });
1525
+ export const aiConnectorEdgeSchema = z.object({
1526
+ id: nonEmptyTrimmedString,
1527
+ source: nonEmptyTrimmedString,
1528
+ target: nonEmptyTrimmedString,
1529
+ sourceHandle: trimmedString.nullable().optional(),
1530
+ targetHandle: trimmedString.nullable().optional(),
1531
+ label: trimmedString.nullable().optional()
1532
+ });
1533
+ export const aiConnectorOutputSchema = z.object({
1534
+ id: nonEmptyTrimmedString,
1535
+ nodeId: nonEmptyTrimmedString,
1536
+ label: nonEmptyTrimmedString,
1537
+ apiPath: nonEmptyTrimmedString
1538
+ });
1539
+ export const aiConnectorRunResultSchema = z.object({
1540
+ primaryText: z.string(),
1541
+ outputs: z.record(z.string(), z.object({
1542
+ label: z.string(),
1543
+ text: z.string(),
1544
+ json: z.record(z.string(), z.unknown()).nullable()
1545
+ })),
1546
+ debugTrace: z
1547
+ .object({
1548
+ nodes: z.array(z.object({
1549
+ nodeId: nonEmptyTrimmedString,
1550
+ nodeType: aiConnectorNodeTypeSchema,
1551
+ label: nonEmptyTrimmedString,
1552
+ input: z.array(z.object({
1553
+ sourceNodeId: nonEmptyTrimmedString,
1554
+ sourceHandle: trimmedString.nullable(),
1555
+ targetHandle: trimmedString.nullable(),
1556
+ text: z.string(),
1557
+ json: z.record(z.string(), z.unknown()).nullable()
1558
+ })),
1559
+ output: z.object({
1560
+ text: z.string(),
1561
+ json: z.record(z.string(), z.unknown()).nullable()
1562
+ }),
1563
+ tools: z.array(z.string()).default([]),
1564
+ logs: z.array(z.string()).default([]),
1565
+ error: z.string().nullable()
1566
+ })),
1567
+ errors: z.array(z.string()).default([])
1568
+ })
1569
+ .optional()
1570
+ });
1571
+ export const aiConnectorRunSchema = z.object({
1572
+ id: nonEmptyTrimmedString,
1573
+ connectorId: nonEmptyTrimmedString,
1574
+ mode: z.enum(["run", "chat"]),
1575
+ status: z.enum(["running", "completed", "failed"]),
1576
+ userInput: z.string(),
1577
+ context: z.record(z.string(), z.unknown()).default({}),
1578
+ conversationId: trimmedString.nullable(),
1579
+ result: aiConnectorRunResultSchema.nullable(),
1580
+ error: z.string().nullable(),
1581
+ createdAt: z.string(),
1582
+ completedAt: z.string().nullable()
1583
+ });
1584
+ export const aiConnectorConversationSchema = z.object({
1585
+ id: nonEmptyTrimmedString,
1586
+ connectorId: nonEmptyTrimmedString,
1587
+ provider: trimmedString.nullable(),
1588
+ externalConversationId: trimmedString.nullable(),
1589
+ transcript: z.array(z.object({
1590
+ role: z.enum(["system", "developer", "user", "assistant", "tool"]),
1591
+ text: z.string(),
1592
+ createdAt: z.string()
1593
+ })),
1594
+ createdAt: z.string(),
1595
+ updatedAt: z.string()
1596
+ });
1597
+ export const aiConnectorSchema = z.object({
1598
+ id: nonEmptyTrimmedString,
1599
+ slug: nonEmptyTrimmedString,
1600
+ title: nonEmptyTrimmedString,
1601
+ description: trimmedString.default(""),
1602
+ kind: aiConnectorKindSchema,
1603
+ homeSurfaceId: trimmedString.nullable(),
1604
+ endpointEnabled: z.boolean().default(true),
1605
+ graph: z.object({
1606
+ nodes: z.array(aiConnectorNodeSchema).default([]),
1607
+ edges: z.array(aiConnectorEdgeSchema).default([])
1608
+ }),
1609
+ publishedOutputs: z.array(aiConnectorOutputSchema).default([]),
1610
+ lastRun: aiConnectorRunSchema.nullable(),
1611
+ legacyProcessorId: trimmedString.nullable().default(null),
1612
+ createdAt: z.string(),
1613
+ updatedAt: z.string()
1614
+ });
1615
+ export const openAiCodexOauthSessionSchema = z.object({
1616
+ id: z.string(),
1617
+ status: z.enum([
1618
+ "starting",
1619
+ "awaiting_browser",
1620
+ "awaiting_manual_input",
1621
+ "authorized",
1622
+ "error",
1623
+ "consumed",
1624
+ "expired"
1625
+ ]),
1626
+ authUrl: z.string().nullable(),
1627
+ accountLabel: z.string().nullable(),
1628
+ error: z.string().nullable(),
1629
+ createdAt: z.string(),
1630
+ expiresAt: z.string(),
1631
+ credentialExpiresAt: z.string().nullable()
1632
+ });
1214
1633
  export const agentTokenSummarySchema = z.object({
1215
1634
  id: z.string(),
1216
1635
  label: z.string(),
@@ -1440,6 +1859,7 @@ export const settingsPayloadSchema = z.object({
1440
1859
  notifications: notificationPreferencesSchema,
1441
1860
  execution: executionSettingsSchema,
1442
1861
  themePreference: themePreferenceSchema,
1862
+ customTheme: customThemeSchema.nullable(),
1443
1863
  localePreference: appLocaleSchema,
1444
1864
  security: z.object({
1445
1865
  integrityScore: z.number().int().min(0).max(100),
@@ -1450,8 +1870,10 @@ export const settingsPayloadSchema = z.object({
1450
1870
  psycheAuthRequired: z.boolean()
1451
1871
  }),
1452
1872
  calendarProviders: z.object({
1873
+ google: googleCalendarAuthSettingsSchema,
1453
1874
  microsoft: microsoftCalendarAuthSettingsSchema
1454
1875
  }),
1876
+ modelSettings: modelSettingsPayloadSchema,
1455
1877
  agents: z.array(agentIdentitySchema),
1456
1878
  agentTokens: z.array(agentTokenSummarySchema)
1457
1879
  });
@@ -1665,10 +2087,7 @@ export const createCalendarConnectionSchema = z.discriminatedUnion("provider", [
1665
2087
  z.object({
1666
2088
  provider: z.literal("google"),
1667
2089
  label: nonEmptyTrimmedString,
1668
- username: nonEmptyTrimmedString,
1669
- clientId: nonEmptyTrimmedString,
1670
- clientSecret: nonEmptyTrimmedString,
1671
- refreshToken: nonEmptyTrimmedString,
2090
+ authSessionId: nonEmptyTrimmedString,
1672
2091
  selectedCalendarUrls: z.array(nonEmptyTrimmedString.url()).min(1),
1673
2092
  forgeCalendarUrl: nonEmptyTrimmedString.url().nullable().optional(),
1674
2093
  createForgeCalendar: z.boolean().optional().default(false)
@@ -1700,13 +2119,6 @@ export const createCalendarConnectionSchema = z.discriminatedUnion("provider", [
1700
2119
  })
1701
2120
  ]);
1702
2121
  export const discoverCalendarConnectionSchema = z.discriminatedUnion("provider", [
1703
- z.object({
1704
- provider: z.literal("google"),
1705
- username: nonEmptyTrimmedString,
1706
- clientId: nonEmptyTrimmedString,
1707
- clientSecret: nonEmptyTrimmedString,
1708
- refreshToken: nonEmptyTrimmedString
1709
- }),
1710
2122
  z.object({
1711
2123
  provider: z.literal("apple"),
1712
2124
  username: nonEmptyTrimmedString,
@@ -1722,6 +2134,10 @@ export const discoverCalendarConnectionSchema = z.discriminatedUnion("provider",
1722
2134
  export const startMicrosoftCalendarOauthSchema = z.object({
1723
2135
  label: nonEmptyTrimmedString.optional()
1724
2136
  });
2137
+ export const startGoogleCalendarOauthSchema = z.object({
2138
+ label: nonEmptyTrimmedString.optional(),
2139
+ browserOrigin: trimmedString.optional()
2140
+ });
1725
2141
  export const testMicrosoftCalendarOauthConfigurationSchema = z.object({
1726
2142
  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."),
1727
2143
  tenantId: trimmedString.default("common"),
@@ -1735,6 +2151,14 @@ export const microsoftCalendarOauthSessionSchema = z.object({
1735
2151
  error: z.string().nullable(),
1736
2152
  discovery: calendarDiscoveryPayloadSchema.nullable()
1737
2153
  });
2154
+ export const googleCalendarOauthSessionSchema = z.object({
2155
+ sessionId: nonEmptyTrimmedString,
2156
+ status: z.enum(["pending", "authorized", "error", "consumed", "expired"]),
2157
+ authUrl: z.string().url().nullable(),
2158
+ accountLabel: z.string().nullable(),
2159
+ error: z.string().nullable(),
2160
+ discovery: calendarDiscoveryPayloadSchema.nullable()
2161
+ });
1738
2162
  export const updateCalendarConnectionSchema = z.object({
1739
2163
  label: nonEmptyTrimmedString.optional(),
1740
2164
  selectedCalendarUrls: z.array(nonEmptyTrimmedString.url()).optional()
@@ -2243,6 +2667,7 @@ export const updateSettingsSchema = z.object({
2243
2667
  notifications: notificationPreferencesSchema.partial().optional(),
2244
2668
  execution: executionSettingsSchema.partial().optional(),
2245
2669
  themePreference: themePreferenceSchema.optional(),
2670
+ customTheme: customThemeSchema.nullable().optional(),
2246
2671
  localePreference: appLocaleSchema.optional(),
2247
2672
  security: z
2248
2673
  .object({
@@ -2251,6 +2676,12 @@ export const updateSettingsSchema = z.object({
2251
2676
  .optional(),
2252
2677
  calendarProviders: z
2253
2678
  .object({
2679
+ google: z
2680
+ .object({
2681
+ clientId: trimmedString.optional(),
2682
+ clientSecret: trimmedString.optional()
2683
+ })
2684
+ .optional(),
2254
2685
  microsoft: z
2255
2686
  .object({
2256
2687
  clientId: trimmedString.optional(),
@@ -2260,6 +2691,182 @@ export const updateSettingsSchema = z.object({
2260
2691
  .optional()
2261
2692
  })
2262
2693
  .optional()
2694
+ .superRefine((value, context) => {
2695
+ if (!value) {
2696
+ return;
2697
+ }
2698
+ const google = value.google;
2699
+ if (!google) {
2700
+ return;
2701
+ }
2702
+ const hasClientIdField = google.clientId !== undefined;
2703
+ const hasClientSecretField = google.clientSecret !== undefined;
2704
+ const hasClientIdValue = (google.clientId?.length ?? 0) > 0;
2705
+ const hasClientSecretValue = (google.clientSecret?.length ?? 0) > 0;
2706
+ if (hasClientIdField !== hasClientSecretField) {
2707
+ const message = "When overriding Google OAuth credentials, provide both the client ID and client secret together, or clear both fields together.";
2708
+ context.addIssue({
2709
+ code: z.ZodIssueCode.custom,
2710
+ path: ["google", hasClientIdField ? "clientSecret" : "clientId"],
2711
+ message
2712
+ });
2713
+ return;
2714
+ }
2715
+ if (hasClientIdValue !== hasClientSecretValue) {
2716
+ const message = "When overriding Google OAuth credentials, provide both the client ID and client secret together, or clear both fields together.";
2717
+ context.addIssue({
2718
+ code: z.ZodIssueCode.custom,
2719
+ path: ["google", hasClientIdValue ? "clientSecret" : "clientId"],
2720
+ message
2721
+ });
2722
+ }
2723
+ }),
2724
+ modelSettings: z
2725
+ .object({
2726
+ forgeAgent: z
2727
+ .object({
2728
+ basicChat: z
2729
+ .object({
2730
+ connectionId: trimmedString.nullable().optional(),
2731
+ model: trimmedString.optional()
2732
+ })
2733
+ .optional(),
2734
+ wiki: z
2735
+ .object({
2736
+ connectionId: trimmedString.nullable().optional(),
2737
+ model: trimmedString.optional()
2738
+ })
2739
+ .optional()
2740
+ })
2741
+ .optional()
2742
+ })
2743
+ .optional()
2744
+ });
2745
+ export const upsertAiModelConnectionSchema = z
2746
+ .object({
2747
+ id: trimmedString.optional(),
2748
+ label: nonEmptyTrimmedString,
2749
+ provider: aiModelProviderSchema,
2750
+ authMode: aiModelAuthModeSchema.optional(),
2751
+ baseUrl: trimmedString.optional(),
2752
+ model: nonEmptyTrimmedString,
2753
+ apiKey: trimmedString.optional(),
2754
+ oauthSessionId: trimmedString.optional(),
2755
+ enabled: z.boolean().default(true)
2756
+ })
2757
+ .superRefine((value, context) => {
2758
+ const authMode = value.authMode ??
2759
+ (value.provider === "openai-codex" ? "oauth" : "api_key");
2760
+ if (value.provider === "openai-codex" && authMode !== "oauth") {
2761
+ context.addIssue({
2762
+ code: z.ZodIssueCode.custom,
2763
+ path: ["authMode"],
2764
+ message: "OpenAI Codex connections must use OAuth."
2765
+ });
2766
+ }
2767
+ if (authMode === "api_key" &&
2768
+ !value.id?.trim() &&
2769
+ !value.apiKey?.trim()) {
2770
+ context.addIssue({
2771
+ code: z.ZodIssueCode.custom,
2772
+ path: ["apiKey"],
2773
+ message: "API key is required for a new API-backed connection."
2774
+ });
2775
+ }
2776
+ if (authMode === "oauth" &&
2777
+ !value.id?.trim() &&
2778
+ !value.oauthSessionId?.trim()) {
2779
+ context.addIssue({
2780
+ code: z.ZodIssueCode.custom,
2781
+ path: ["oauthSessionId"],
2782
+ message: "OAuth session is required for a new OAuth-backed connection."
2783
+ });
2784
+ }
2785
+ });
2786
+ export const testAiModelConnectionSchema = z.object({
2787
+ connectionId: trimmedString.optional(),
2788
+ provider: aiModelProviderSchema.optional(),
2789
+ baseUrl: trimmedString.optional(),
2790
+ model: nonEmptyTrimmedString,
2791
+ apiKey: trimmedString.optional()
2792
+ });
2793
+ export const submitOpenAiCodexOauthManualCodeSchema = z.object({
2794
+ codeOrUrl: nonEmptyTrimmedString
2795
+ });
2796
+ export const createAiProcessorSchema = z.object({
2797
+ surfaceId: nonEmptyTrimmedString,
2798
+ title: nonEmptyTrimmedString,
2799
+ promptFlow: trimmedString.default(""),
2800
+ contextInput: trimmedString.default(""),
2801
+ toolConfig: z.array(aiProcessorToolSchema).default([]),
2802
+ agentIds: z.array(z.string().trim().min(1)).default([]),
2803
+ agentConfigs: z.array(aiProcessorAgentConfigSchema).default([]),
2804
+ triggerMode: aiProcessorTriggerModeSchema.default("manual"),
2805
+ cronExpression: trimmedString.default(""),
2806
+ machineAccess: aiProcessorMachineAccessSchema.default({
2807
+ read: false,
2808
+ write: false,
2809
+ exec: false
2810
+ }),
2811
+ endpointEnabled: z.boolean().default(true)
2812
+ });
2813
+ export const updateAiProcessorSchema = z.object({
2814
+ title: nonEmptyTrimmedString.optional(),
2815
+ promptFlow: trimmedString.optional(),
2816
+ contextInput: trimmedString.optional(),
2817
+ toolConfig: z.array(aiProcessorToolSchema).optional(),
2818
+ agentIds: z.array(z.string().trim().min(1)).optional(),
2819
+ agentConfigs: z.array(aiProcessorAgentConfigSchema).optional(),
2820
+ triggerMode: aiProcessorTriggerModeSchema.optional(),
2821
+ cronExpression: trimmedString.optional(),
2822
+ machineAccess: aiProcessorMachineAccessSchema.partial().optional(),
2823
+ endpointEnabled: z.boolean().optional()
2824
+ });
2825
+ export const createAiProcessorLinkSchema = z.object({
2826
+ surfaceId: nonEmptyTrimmedString,
2827
+ sourceWidgetId: nonEmptyTrimmedString,
2828
+ targetProcessorId: nonEmptyTrimmedString,
2829
+ accessMode: aiProcessorAccessModeSchema.default("read"),
2830
+ capabilityMode: aiProcessorCapabilityModeSchema.default("content"),
2831
+ metadata: z.record(z.string(), z.unknown()).default({})
2832
+ });
2833
+ export const runAiProcessorSchema = z.object({
2834
+ input: trimmedString.default(""),
2835
+ context: z.record(z.string(), z.unknown()).default({}),
2836
+ widgetSnapshots: z.record(z.string(), z.unknown()).default({})
2837
+ });
2838
+ export const createAiConnectorSchema = z.object({
2839
+ title: nonEmptyTrimmedString,
2840
+ description: trimmedString.default(""),
2841
+ kind: aiConnectorKindSchema.default("functor"),
2842
+ homeSurfaceId: trimmedString.nullable().default(null),
2843
+ endpointEnabled: z.boolean().default(true),
2844
+ graph: z
2845
+ .object({
2846
+ nodes: z.array(aiConnectorNodeSchema).default([]),
2847
+ edges: z.array(aiConnectorEdgeSchema).default([])
2848
+ })
2849
+ .default({ nodes: [], edges: [] })
2850
+ });
2851
+ export const updateAiConnectorSchema = z.object({
2852
+ title: nonEmptyTrimmedString.optional(),
2853
+ description: trimmedString.optional(),
2854
+ kind: aiConnectorKindSchema.optional(),
2855
+ homeSurfaceId: trimmedString.nullable().optional(),
2856
+ endpointEnabled: z.boolean().optional(),
2857
+ graph: z
2858
+ .object({
2859
+ nodes: z.array(aiConnectorNodeSchema).default([]),
2860
+ edges: z.array(aiConnectorEdgeSchema).default([])
2861
+ })
2862
+ .optional()
2863
+ });
2864
+ export const runAiConnectorSchema = z.object({
2865
+ userInput: trimmedString.default(""),
2866
+ context: z.record(z.string(), z.unknown()).default({}),
2867
+ boxSnapshots: z.record(z.string(), z.unknown()).default({}),
2868
+ conversationId: trimmedString.nullable().default(null),
2869
+ debug: z.boolean().default(false)
2263
2870
  });
2264
2871
  export const createAgentTokenSchema = z.object({
2265
2872
  label: nonEmptyTrimmedString,