@kafca/agentdock 0.1.56 → 0.1.58

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 (200) hide show
  1. package/README.md +7 -0
  2. package/dist/renderer/assets/{Badge-DjcoXx2J.js → Badge-BfY1VaHS.js} +1 -1
  3. package/dist/renderer/assets/Card-DWA_Tww_.js +1 -0
  4. package/dist/renderer/assets/Config-nHj3g1U5.js +21 -0
  5. package/dist/renderer/assets/CronList-BwkA_I7v.js +1 -0
  6. package/dist/renderer/assets/Dashboard-D0_A7k02.js +41 -0
  7. package/dist/renderer/assets/{EmptyState-DIZLiccW.js → EmptyState-zatDjLj_.js} +1 -1
  8. package/dist/renderer/assets/HighlightedMarkdown-CsM5n70d.js +12 -0
  9. package/dist/renderer/assets/Input-R1XdFK1K.js +1 -0
  10. package/dist/renderer/assets/{KnowledgeDetail-CJ9IYOsa.js → KnowledgeDetail-Co5sxeGd.js} +2 -2
  11. package/dist/renderer/assets/{KnowledgeHome-BLGPwnBO.js → KnowledgeHome-DwziPw5m.js} +3 -3
  12. package/dist/renderer/assets/Logs-NwZUtR_G.js +6 -0
  13. package/dist/renderer/assets/{Modal-CQiUpfl4.js → Modal-CrcIwIFL.js} +3 -3
  14. package/dist/renderer/assets/MonitorList-CS1uLS5A.js +1 -0
  15. package/dist/renderer/assets/Page-Dp0obeSw.js +1 -0
  16. package/dist/renderer/assets/{Select-D6z65IT3.js → Select-6mVQaf84.js} +2 -2
  17. package/dist/renderer/assets/ThreadChat-BFzbn3L6.js +86 -0
  18. package/dist/renderer/assets/Workspace-DCmo8BMm.js +19 -0
  19. package/dist/renderer/assets/{arrow-left-CV5cL3f4.js → arrow-left-9rjg_Hp4.js} +1 -1
  20. package/dist/renderer/assets/{book-open-DThvB7pj.js → book-open-Bu8GCHnG.js} +1 -1
  21. package/dist/renderer/assets/channels-BxVbG-6j.js +6 -0
  22. package/dist/renderer/assets/chevron-down-BE8uQmWM.js +11 -0
  23. package/dist/renderer/assets/index-B7TeF6Es.js +41 -0
  24. package/dist/renderer/assets/index-BIKL3fTP.css +11 -0
  25. package/dist/renderer/assets/index-BkI9POxj.js +167 -0
  26. package/dist/renderer/assets/knowledge-Kl19SqGS.js +1 -0
  27. package/dist/renderer/assets/{pencil-Dv5WxhdC.js → pencil-CPB7SK1m.js} +1 -1
  28. package/dist/renderer/assets/{play-DnCnft83.js → play-DGAO4OCu.js} +1 -1
  29. package/dist/renderer/assets/{plus-DsxIagzS.js → plus-Bt26z-4q.js} +1 -1
  30. package/dist/renderer/assets/{save-CST01lIc.js → save-Une7GMxT.js} +1 -1
  31. package/dist/renderer/assets/{search-B_bqy6Wd.js → search-DE0agJjJ.js} +1 -1
  32. package/dist/renderer/assets/{shield-check-D6lG5Aoc.js → shield-check-De7xaXZh.js} +1 -1
  33. package/dist/renderer/assets/threads-BnsNL5ei.js +1 -0
  34. package/dist/renderer/assets/{trash-2-Cefngb6Q.js → trash-2-6iGF59Ac.js} +1 -1
  35. package/dist/renderer/index.html +2 -2
  36. package/dist-electron/packages/contracts/src/automation.js +2 -0
  37. package/dist-electron/packages/contracts/src/channels.js +2 -0
  38. package/dist-electron/packages/contracts/src/knowledge.js +2 -0
  39. package/dist-electron/packages/contracts/src/local-core.js +15 -0
  40. package/dist-electron/packages/contracts/src/runtime.js +2 -0
  41. package/dist-electron/packages/contracts/src/scheduler.js +2 -0
  42. package/dist-electron/packages/contracts/src/threads.js +2 -0
  43. package/dist-electron/packages/core-sdk/src/automation.js +32 -0
  44. package/dist-electron/packages/core-sdk/src/channels.js +121 -0
  45. package/dist-electron/packages/core-sdk/src/client.js +455 -0
  46. package/dist-electron/packages/core-sdk/src/index.js +43 -607
  47. package/dist-electron/packages/core-sdk/src/knowledge.js +85 -0
  48. package/dist-electron/packages/core-sdk/src/request.js +22 -0
  49. package/dist-electron/packages/core-sdk/src/runtime.js +214 -0
  50. package/dist-electron/packages/core-sdk/src/scheduler.js +32 -0
  51. package/dist-electron/packages/core-sdk/src/threads.js +67 -0
  52. package/dist-electron/packages/plugin-sdk/src/agents.js +2 -0
  53. package/dist-electron/packages/plugin-sdk/src/automation.js +2 -0
  54. package/dist-electron/packages/plugin-sdk/src/channels.js +2 -0
  55. package/dist-electron/packages/plugin-sdk/src/index.js +21 -0
  56. package/dist-electron/packages/plugin-sdk/src/knowledge.js +2 -0
  57. package/dist-electron/packages/plugin-sdk/src/runtime.js +2 -0
  58. package/dist-electron/packages/plugin-sdk/src/scheduler.js +2 -0
  59. package/dist-electron/packages/plugin-sdk/src/threads.js +2 -0
  60. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-backend.js +5 -8
  61. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-content.js +2 -2
  62. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-turn-coordinator.js +3 -3
  63. package/dist-electron/services/local-ai-core/src/acp/store/agent-task-store.js +5 -5
  64. package/dist-electron/services/local-ai-core/src/acp/store/automation-monitor-store.js +12 -12
  65. package/dist-electron/services/local-ai-core/src/acp/store/local-core-acp-store.js +2 -2
  66. package/dist-electron/services/local-ai-core/src/acp/store/scheduler-store.js +11 -11
  67. package/dist-electron/services/local-ai-core/src/acp/store/security-store.js +3 -3
  68. package/dist-electron/services/local-ai-core/src/acp/store/thread-store.js +7 -7
  69. package/dist-electron/services/local-ai-core/src/acp/workspace-acp-permissions.js +2 -2
  70. package/dist-electron/services/local-ai-core/src/agents/claudecode/definition.js +3 -3
  71. package/dist-electron/services/local-ai-core/src/agents/codex/definition.js +3 -3
  72. package/dist-electron/services/local-ai-core/src/agents/localcore-acp/definition.js +2 -2
  73. package/dist-electron/services/local-ai-core/src/agents/localcore-acp/index.js +4 -4
  74. package/dist-electron/services/local-ai-core/src/agents/opencode/launch.js +2 -2
  75. package/dist-electron/services/local-ai-core/src/agents/pi/definition.js +2 -2
  76. package/dist-electron/services/local-ai-core/src/agents/pi/launch.js +3 -3
  77. package/dist-electron/services/local-ai-core/src/agents/pi/provider-materializer.js +1 -1
  78. package/dist-electron/services/local-ai-core/src/agents/shared/agent-plugin.js +4 -4
  79. package/dist-electron/services/local-ai-core/src/automation/automation-conversation-executor.js +6 -47
  80. package/dist-electron/services/local-ai-core/src/automation/automation-monitor-service.js +2 -5
  81. package/dist-electron/services/local-ai-core/src/channel/lark/cards.js +33 -18
  82. package/dist-electron/services/local-ai-core/src/channel/lark/config.js +2 -2
  83. package/dist-electron/services/local-ai-core/src/channel/lark/gateway-utils.js +91 -0
  84. package/dist-electron/services/local-ai-core/src/channel/lark/inbound-handler.js +180 -0
  85. package/dist-electron/services/local-ai-core/src/channel/lark/local-core-lark-gateway.js +58 -539
  86. package/dist-electron/services/local-ai-core/src/channel/lark/outbound-transport.js +112 -0
  87. package/dist-electron/services/local-ai-core/src/channel/lark/runtime-state.js +5 -20
  88. package/dist-electron/services/local-ai-core/src/channel/shared/base-channel-gateway.js +37 -0
  89. package/dist-electron/services/local-ai-core/src/channel/shared/bridge-event-helpers.js +23 -0
  90. package/dist-electron/services/local-ai-core/src/channel/shared/channel-keys.js +6 -0
  91. package/dist-electron/services/local-ai-core/src/channel/shared/inbound-authorization.js +54 -0
  92. package/dist-electron/services/local-ai-core/src/channel/weixin/config.js +2 -2
  93. package/dist-electron/services/local-ai-core/src/channel/weixin/inbound-media.js +21 -0
  94. package/dist-electron/services/local-ai-core/src/channel/weixin/inbound-poller.js +167 -0
  95. package/dist-electron/services/local-ai-core/src/channel/weixin/local-core-weixin-gateway.js +55 -512
  96. package/dist-electron/services/local-ai-core/src/channel/weixin/runtime-state.js +149 -0
  97. package/dist-electron/services/local-ai-core/src/channel/weixin/text-utils.js +92 -0
  98. package/dist-electron/services/local-ai-core/src/cli/lac.js +9 -11
  99. package/dist-electron/services/local-ai-core/src/cli/monitor-cli-parsers.js +2 -2
  100. package/dist-electron/services/local-ai-core/src/kernel/bootstrap.js +28 -70
  101. package/dist-electron/services/local-ai-core/src/kernel/local-core-errors.js +8 -0
  102. package/dist-electron/services/local-ai-core/src/plugins/builtin/knowledge-ai-vector-plugin.js +2 -2
  103. package/dist-electron/services/local-ai-core/src/plugins/builtin/knowledge-noop-plugin.js +2 -2
  104. package/dist-electron/services/local-ai-core/src/router/workspace-bridge-event-stream.js +29 -0
  105. package/dist-electron/services/local-ai-core/src/router/workspace-route-config.js +5 -5
  106. package/dist-electron/services/local-ai-core/src/router/workspace-router.js +47 -60
  107. package/dist-electron/services/local-ai-core/src/runtime/agent-runtime-detector.js +5 -5
  108. package/dist-electron/services/local-ai-core/src/runtime/config-migration.js +6 -6
  109. package/dist-electron/services/local-ai-core/src/runtime/deployment-diagnostics.js +3 -3
  110. package/dist-electron/services/local-ai-core/src/runtime/external-service.js +3 -1
  111. package/dist-electron/services/local-ai-core/src/runtime/handlers/automation-handler.js +11 -2
  112. package/dist-electron/services/local-ai-core/src/runtime/handlers/channel-handler.js +12 -6
  113. package/dist-electron/services/local-ai-core/src/runtime/handlers/external-handler.js +10 -2
  114. package/dist-electron/services/local-ai-core/src/runtime/handlers/knowledge-handler.js +18 -6
  115. package/dist-electron/services/local-ai-core/src/runtime/handlers/provider-handler.js +7 -2
  116. package/dist-electron/services/local-ai-core/src/runtime/handlers/runtime-handler.js +28 -3
  117. package/dist-electron/services/local-ai-core/src/runtime/handlers/scheduler-handler.js +10 -2
  118. package/dist-electron/services/local-ai-core/src/runtime/handlers/security-handler.js +18 -5
  119. package/dist-electron/services/local-ai-core/src/runtime/handlers/task-handler.js +14 -2
  120. package/dist-electron/services/local-ai-core/src/runtime/handlers/thread-handler.js +18 -15
  121. package/dist-electron/services/local-ai-core/src/runtime/handlers/workspace-handler.js +13 -2
  122. package/dist-electron/services/local-ai-core/src/runtime/local-core-controller.js +35 -8
  123. package/dist-electron/services/local-ai-core/src/runtime/request-validation.js +79 -0
  124. package/dist-electron/services/local-ai-core/src/runtime/runtime-detection-service.js +9 -9
  125. package/dist-electron/services/local-ai-core/src/runtime/server-helpers.js +10 -1
  126. package/dist-electron/services/local-ai-core/src/runtime/server.js +2 -1
  127. package/dist-electron/services/local-ai-core/src/runtime/workspace-project-registry.js +76 -0
  128. package/dist-electron/services/local-ai-core/src/sandbox/opensandbox-client.js +3 -2
  129. package/dist-electron/services/local-ai-core/src/sandbox/sandbox-config.js +8 -8
  130. package/dist-electron/services/local-ai-core/src/scheduler/base-channel-schedule-adapter.js +77 -0
  131. package/dist-electron/services/local-ai-core/src/scheduler/lark-schedule-adapter.js +13 -79
  132. package/dist-electron/services/local-ai-core/src/scheduler/local-schedule-adapter.js +2 -10
  133. package/dist-electron/services/local-ai-core/src/scheduler/run-polling.js +19 -0
  134. package/dist-electron/services/local-ai-core/src/scheduler/scheduled-conversation-executor.js +3 -37
  135. package/dist-electron/services/local-ai-core/src/scheduler/scheduled-job-route.js +20 -0
  136. package/dist-electron/services/local-ai-core/src/scheduler/scheduler-service.js +15 -28
  137. package/dist-electron/services/local-ai-core/src/scheduler/thread-resolution.js +12 -0
  138. package/dist-electron/services/local-ai-core/src/scheduler/weixin-schedule-adapter.js +13 -79
  139. package/dist-electron/services/local-ai-core/src/thread/agent-message-policy.js +75 -0
  140. package/dist-electron/shared/desktop.js +1 -64
  141. package/dist-electron/src/components/chat/chat-controller-state.js +60 -0
  142. package/dist-electron/src/components/chat/chat-event-gate.js +146 -0
  143. package/dist-electron/src/components/chat/markdown-code-block.js +8 -0
  144. package/dist-electron/src/pages/Desktop/workspace-model.js +212 -0
  145. package/dist-electron/src/pages/Threads/thread-chat-model.js +50 -51
  146. package/dist-electron/tests/contracts/agent-message-policy.test.js +21 -0
  147. package/dist-electron/tests/contracts/architecture-docs.test.js +56 -33
  148. package/dist-electron/tests/contracts/chat-event-gate.test.js +114 -0
  149. package/dist-electron/tests/contracts/chat-markdown.test.js +16 -0
  150. package/dist-electron/tests/contracts/thread-task-state.test.js +32 -0
  151. package/dist-electron/tests/contracts/workspace-identity.test.js +23 -0
  152. package/dist-electron/tests/electron/core-client.test.js +284 -0
  153. package/dist-electron/tests/electron/plugin-kernel.test.js +54 -0
  154. package/dist-electron/tests/electron/renderer-packaging.test.js +9 -0
  155. package/dist-electron/tests/electron/workspace-task-store.test.js +31 -0
  156. package/dist-electron/tests/integration/channel-inbound-authorization.test.js +80 -0
  157. package/dist-electron/tests/integration/lark-gateway-utils.test.js +13 -0
  158. package/dist-electron/tests/integration/lark-gateway.test.js +4 -4
  159. package/dist-electron/tests/integration/local-core-refactor.test.js +15 -8
  160. package/dist-electron/tests/integration/weixin-runtime-state.test.js +32 -0
  161. package/dist-electron/tests/integration/weixin-text-utils.test.js +15 -0
  162. package/package.json +9 -4
  163. package/dist/renderer/assets/Chat-C5Bkm9-M.js +0 -2
  164. package/dist/renderer/assets/ChatMarkdown-uc36EzyD.js +0 -45
  165. package/dist/renderer/assets/Config-DHtQuuLy.js +0 -21
  166. package/dist/renderer/assets/CronList-BYUnhzSC.js +0 -1
  167. package/dist/renderer/assets/Dashboard-BPnGMDg3.js +0 -26
  168. package/dist/renderer/assets/Logs-Dyd2Uwlt.js +0 -1
  169. package/dist/renderer/assets/MonitorList-Byg3E3Gt.js +0 -1
  170. package/dist/renderer/assets/Page-7DxXvTMm.js +0 -1
  171. package/dist/renderer/assets/ProjectDetail-Dfr5s0Ja.js +0 -11
  172. package/dist/renderer/assets/ProjectList-CDDQjAQ_.js +0 -1
  173. package/dist/renderer/assets/SessionChat-s7CAaCPL.js +0 -1
  174. package/dist/renderer/assets/SessionList-D-OycKKS.js +0 -1
  175. package/dist/renderer/assets/ThreadChat-CLdFynB5.js +0 -28
  176. package/dist/renderer/assets/Workspace-xfT5z4j_.js +0 -19
  177. package/dist/renderer/assets/bot-CWQ5-ovl.js +0 -6
  178. package/dist/renderer/assets/check-DKM7zfWG.js +0 -6
  179. package/dist/renderer/assets/chevron-down-Dfw2KU87.js +0 -6
  180. package/dist/renderer/assets/circle-CoP4RA4s.js +0 -6
  181. package/dist/renderer/assets/desktop-CsDYrOOU.js +0 -1
  182. package/dist/renderer/assets/desktop-JQkhNOF4.js +0 -5
  183. package/dist/renderer/assets/funnel-DpVLlG3g.js +0 -6
  184. package/dist/renderer/assets/heart-BMD36ejP.js +0 -6
  185. package/dist/renderer/assets/index-COxSYBjE.js +0 -182
  186. package/dist/renderer/assets/index-CTGTI-cm.js +0 -41
  187. package/dist/renderer/assets/index-CjCuR6DI.css +0 -11
  188. package/dist/renderer/assets/projects-DgjHcNgt.js +0 -1
  189. package/dist/renderer/assets/server-ecH4GNwa.js +0 -11
  190. package/dist/renderer/assets/session-utils-Dd_WKMYW.js +0 -6
  191. package/dist/renderer/assets/sessions-BQ33Mv4k.js +0 -1
  192. package/dist/renderer/assets/user-D_8RSH-T.js +0 -6
  193. package/dist/renderer/assets/wifi-off-DB9D-pOu.js +0 -11
  194. package/dist-electron/services/local-ai-core/src/scheduler/lark-execution-policies.js +0 -13
  195. package/dist-electron/services/local-ai-core/src/scheduler/weixin-execution-policies.js +0 -13
  196. package/dist-electron/src/api/client.js +0 -73
  197. package/dist-electron/src/api/sessions.js +0 -21
  198. package/dist-electron/src/lib/session-utils.js +0 -51
  199. package/dist-electron/src/pages/Projects/project-provider-config.js +0 -75
  200. package/dist-electron/tests/electron/project-provider-config.test.js +0 -71
@@ -9,6 +9,10 @@ const local_core_slash_commands_js_1 = require("../acp/local-core-slash-commands
9
9
  const workspace_thread_id_js_1 = require("../thread/workspace-thread-id.js");
10
10
  const command_risk_js_1 = require("../security/command-risk.js");
11
11
  const workspace_route_config_js_1 = require("./workspace-route-config.js");
12
+ const workspace_project_registry_js_1 = require("../runtime/workspace-project-registry.js");
13
+ const agent_message_policy_js_1 = require("../thread/agent-message-policy.js");
14
+ const content_js_1 = require("../channel/shared/content.js");
15
+ const workspace_bridge_event_stream_js_1 = require("./workspace-bridge-event-stream.js");
12
16
  var workspace_thread_id_js_2 = require("../thread/workspace-thread-id.js");
13
17
  Object.defineProperty(exports, "decodeThreadId", { enumerable: true, get: function () { return workspace_thread_id_js_2.decodeThreadId; } });
14
18
  Object.defineProperty(exports, "encodeThreadId", { enumerable: true, get: function () { return workspace_thread_id_js_2.encodeThreadId; } });
@@ -17,17 +21,18 @@ class WorkspaceRouter {
17
21
  store;
18
22
  localCoreAcp;
19
23
  runThreadMap = new Map();
20
- bridgeSubscribers = new Set();
24
+ bridgeEvents;
21
25
  schedulerBridge = null;
22
26
  constructor(options) {
23
27
  this.options = options;
24
28
  this.store = options.store;
29
+ this.bridgeEvents = new workspace_bridge_event_stream_js_1.WorkspaceBridgeEventStream(options.eventBus);
25
30
  this.localCoreAcp = new local_core_acp_backend_js_1.LocalCoreAcpBackend({
26
31
  store: this.store,
27
32
  runThreadMap: this.runThreadMap,
28
33
  cliBinDir: options.cliBinDir,
29
34
  localCoreBase: options.localCoreBase,
30
- emitBridge: (event) => this.emitBridgeEvent(event),
35
+ emitBridge: (event) => this.bridgeEvents.emit(event),
31
36
  eventBus: options.eventBus,
32
37
  scheduler: {
33
38
  createJob: async (input) => {
@@ -55,7 +60,7 @@ class WorkspaceRouter {
55
60
  }
56
61
  close() {
57
62
  this.localCoreAcp.close();
58
- this.bridgeSubscribers.clear();
63
+ this.bridgeEvents.clear();
59
64
  this.store.close();
60
65
  }
61
66
  getThreadSessionKey(threadId) {
@@ -74,23 +79,22 @@ class WorkspaceRouter {
74
79
  if (!route) {
75
80
  continue;
76
81
  }
77
- workspaceMap.set(project.name, {
78
- id: project.name,
82
+ const workspaceId = (0, workspace_project_registry_js_1.projectWorkspaceId)(project);
83
+ workspaceMap.set(workspaceId, {
84
+ id: workspaceId,
79
85
  name: project.name,
80
86
  agentType: route.agentType,
81
87
  platforms: (0, workspace_route_config_js_1.normalizePlatformTypes)(project),
82
- sessionsCount: this.store.countThreads(project.name),
88
+ sessionsCount: this.store.countThreads(workspaceId),
83
89
  heartbeatEnabled: false,
84
90
  });
85
91
  }
86
92
  return [...workspaceMap.values()].sort((a, b) => a.name.localeCompare(b.name));
87
93
  }
88
94
  async listWorkspaceRegistry() {
89
- await this.syncConfiguredWorkspaces();
90
95
  return this.store.listWorkspaceRegistry();
91
96
  }
92
97
  async getWorkspaceRegistryEntry(workspaceId) {
93
- await this.syncConfiguredWorkspaces();
94
98
  const workspace = this.store.getWorkspaceRegistryEntry(workspaceId);
95
99
  if (!workspace) {
96
100
  throw new Error(`Workspace not found: ${workspaceId}`);
@@ -209,7 +213,8 @@ class WorkspaceRouter {
209
213
  const route = isLocalSlashCommand(content)
210
214
  ? await this.getWorkspaceRoute(workspaceId)
211
215
  : await this.getThreadWorkspaceRoute(threadId, workspaceId);
212
- return this.localCoreAcp.sendThreadMessage(threadId, content, route.config, options);
216
+ const preparedContent = await this.prepareAgentMessage(threadId, content);
217
+ return this.localCoreAcp.sendThreadMessage(threadId, preparedContent, route.config, options);
213
218
  }
214
219
  async sendThreadAction(threadId, content) {
215
220
  const { workspaceId } = (0, workspace_thread_id_js_1.decodeThreadId)(threadId);
@@ -262,23 +267,24 @@ class WorkspaceRouter {
262
267
  selectedKnowledgeBaseIds: await this.options.knowledgeAttachments.listThreadKnowledgeBaseIds(detail.id),
263
268
  };
264
269
  }
265
- emitBridgeEvent(event) {
266
- this.options.eventBus.emit({
267
- type: 'platform.bridge.updated',
268
- payload: event,
269
- });
270
- this.notifyBridgeSubscribers(event);
271
- }
272
- notifyBridgeSubscribers(event) {
273
- for (const listener of this.bridgeSubscribers) {
274
- listener(event);
270
+ async prepareAgentMessage(threadId, content) {
271
+ const displayText = typeof content === 'string' ? content : content.displayText;
272
+ if (displayText.trim().startsWith('/')) {
273
+ return content;
275
274
  }
275
+ const selectedIds = new Set(await this.options.knowledgeAttachments.listThreadKnowledgeBaseIds(threadId));
276
+ const knowledgeBases = selectedIds.size
277
+ ? (await this.options.knowledgeProvider.listKnowledgeBases())
278
+ .filter((base) => selectedIds.has(base.id))
279
+ .map(({ id, name }) => ({ id, name }))
280
+ : [];
281
+ const wrapped = (0, agent_message_policy_js_1.composeAgentMessage)(displayText, knowledgeBases);
282
+ return typeof content === 'string'
283
+ ? wrapped
284
+ : (0, content_js_1.createChannelThreadMessageInput)(wrapped, content.contentParts);
276
285
  }
277
286
  subscribeBridge(listener) {
278
- this.bridgeSubscribers.add(listener);
279
- return () => {
280
- this.bridgeSubscribers.delete(listener);
281
- };
287
+ return this.bridgeEvents.subscribe(listener);
282
288
  }
283
289
  subscribeBridgeEvents(listener) {
284
290
  return this.subscribeBridge(listener);
@@ -465,10 +471,20 @@ class WorkspaceRouter {
465
471
  }
466
472
  async getWorkspaceRoute(workspaceId, agentTypeOverride = '') {
467
473
  const configState = await this.options.readRuntimeConfig();
468
- const projects = Array.isArray(configState.config?.projects) ? configState.config.projects : [];
469
- const matched = projects.find((project) => String(project?.name || '').trim() === workspaceId);
474
+ const embeddedProjects = Array.isArray(configState.config?.projects) ? configState.config.projects : [];
475
+ const projects = embeddedProjects.length
476
+ ? (0, workspace_project_registry_js_1.persistProjectsInRegistry)(this.store, embeddedProjects, { preserveLegacyIds: true })
477
+ : (0, workspace_project_registry_js_1.listRegistryProjects)(this.store);
478
+ if (embeddedProjects.length) {
479
+ this.store.saveRuntimeConfig((0, workspace_project_registry_js_1.withoutRuntimeProjects)(configState.config));
480
+ }
481
+ const projectedConfigState = {
482
+ ...configState,
483
+ config: { ...configState.config, projects },
484
+ };
485
+ const matched = projects.find((project) => (0, workspace_project_registry_js_1.projectWorkspaceId)(project) === workspaceId);
470
486
  const project = matched && agentTypeOverride ? withAgentTypeOverride(matched, agentTypeOverride) : matched;
471
- const route = project ? this.resolveProjectRoute(configState, project) : null;
487
+ const route = project ? this.resolveProjectRoute(projectedConfigState, project) : null;
472
488
  if (!matched || !route) {
473
489
  throw new Error(`Workspace "${workspaceId}" is not configured as a Local AI Core ACP workspace.`);
474
490
  }
@@ -476,31 +492,12 @@ class WorkspaceRouter {
476
492
  }
477
493
  async listLocalCoreProjects() {
478
494
  const configState = await this.options.readRuntimeConfig();
479
- const projects = Array.isArray(configState.config?.projects) ? configState.config.projects : [];
480
- return projects.filter((project) => this.resolveProjectRoute(configState, project));
481
- }
482
- async syncConfiguredWorkspaces() {
483
- const config = await this.options.readRuntimeConfig();
484
- const projects = Array.isArray(config.config?.projects) ? config.config.projects : [];
485
- for (const project of projects) {
486
- const route = this.resolveProjectRoute(config, project);
487
- if (!route) {
488
- continue;
489
- }
490
- const path = inferWorkspacePath(project);
491
- this.store.upsertWorkspaceRegistryEntry({
492
- workspaceId: project.name,
493
- displayName: project.name,
494
- path,
495
- deviceId: 'local',
496
- defaultRuntimeId: route.agentType,
497
- git: detectGitSummary(path),
498
- health: workspaceHealth(path),
499
- metadata: {
500
- platforms: (0, workspace_route_config_js_1.normalizePlatformTypes)(project),
501
- },
502
- });
495
+ let projects = (0, workspace_project_registry_js_1.listRegistryProjects)(this.store);
496
+ if (projects.length === 0 && configState.config.projects?.length) {
497
+ projects = (0, workspace_project_registry_js_1.persistProjectsInRegistry)(this.store, configState.config.projects, { preserveLegacyIds: true });
498
+ this.store.saveRuntimeConfig((0, workspace_project_registry_js_1.withoutRuntimeProjects)(configState.config));
503
499
  }
500
+ return projects.filter((project) => this.resolveProjectRoute(configState, project));
504
501
  }
505
502
  resolveProjectRoute(configState, project) {
506
503
  const routeProject = this.withResolvedProjectProvider(project);
@@ -559,16 +556,6 @@ exports.WorkspaceRouter = WorkspaceRouter;
559
556
  function createWorkspaceRouter(options) {
560
557
  return new WorkspaceRouter(options);
561
558
  }
562
- function inferWorkspacePath(project) {
563
- const options = project.agent?.options || {};
564
- for (const key of ['cwd', 'path', 'workspacePath', 'root']) {
565
- const value = options[key];
566
- if (typeof value === 'string' && value.trim()) {
567
- return value.trim();
568
- }
569
- }
570
- return '';
571
- }
572
559
  function withAgentTypeOverride(project, agentType) {
573
560
  const options = project.agent?.options && typeof project.agent.options === 'object'
574
561
  ? { ...project.agent.options }
@@ -5,7 +5,7 @@ const node_fs_1 = require("node:fs");
5
5
  const node_path_1 = require("node:path");
6
6
  const node_module_1 = require("node:module");
7
7
  const node_child_process_1 = require("node:child_process");
8
- const desktop_js_1 = require("../../../../shared/desktop.js");
8
+ const superai_contracts_1 = require("../../../../packages/contracts/src/index.js");
9
9
  const index_js_1 = require("../agents/index.js");
10
10
  const env_utils_js_1 = require("./env-utils.js");
11
11
  function detectInstalledAgentRuntimes(options = {}) {
@@ -14,12 +14,12 @@ function detectInstalledAgentRuntimes(options = {}) {
14
14
  const detectedAt = (options.now || new Date()).toISOString();
15
15
  const versionTimeoutMs = options.versionTimeoutMs ?? 3000;
16
16
  const agentTypes = options.runtimeId
17
- ? desktop_js_1.DESKTOP_AGENT_TYPE_OPTIONS.filter((agentType) => agentType === options.runtimeId)
18
- : desktop_js_1.DESKTOP_AGENT_TYPE_OPTIONS;
17
+ ? superai_contracts_1.DESKTOP_AGENT_TYPE_OPTIONS.filter((agentType) => agentType === options.runtimeId)
18
+ : superai_contracts_1.DESKTOP_AGENT_TYPE_OPTIONS;
19
19
  return agentTypes.map((agentType) => {
20
20
  const definition = (0, index_js_1.resolveAgentRuntimeDefinition)(agentType);
21
21
  const detection = definition?.detection;
22
- if (detection?.builtin || agentType === desktop_js_1.LOCALCORE_ACP_AGENT_TYPE) {
22
+ if (detection?.builtin || agentType === superai_contracts_1.LOCALCORE_ACP_AGENT_TYPE) {
23
23
  return {
24
24
  agentType,
25
25
  runtimeId: agentType,
@@ -163,7 +163,7 @@ function isExecutableFile(path) {
163
163
  }
164
164
  function detectRuntimeVersion(agentType, command, env, timeoutMs) {
165
165
  const args = (0, index_js_1.resolveAgentRuntimeDefinition)(agentType)?.detection?.versionArgs;
166
- if (!args || agentType === desktop_js_1.LOCALCORE_ACP_AGENT_TYPE) {
166
+ if (!args || agentType === superai_contracts_1.LOCALCORE_ACP_AGENT_TYPE) {
167
167
  return {};
168
168
  }
169
169
  try {
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CURRENT_DESKTOP_CONFIG_VERSION = void 0;
4
4
  exports.migrateDesktopConnectConfig = migrateDesktopConnectConfig;
5
5
  exports.normalizeDesktopProviderForStorage = normalizeDesktopProviderForStorage;
6
- const index_js_1 = require("../../../../packages/contracts/src/index.js");
6
+ const superai_contracts_1 = require("../../../../packages/contracts/src/index.js");
7
7
  exports.CURRENT_DESKTOP_CONFIG_VERSION = 2;
8
8
  function migrateDesktopConnectConfig(input) {
9
9
  const config = cloneConfig(input);
@@ -75,7 +75,7 @@ function normalizeSandboxOptions(input) {
75
75
  let changed = false;
76
76
  if (sandbox.enabled) {
77
77
  if (!sandbox.provider_id) {
78
- sandbox.provider_id = index_js_1.DEFAULT_SANDBOX_PROVIDER_ID;
78
+ sandbox.provider_id = superai_contracts_1.DEFAULT_SANDBOX_PROVIDER_ID;
79
79
  changed = true;
80
80
  }
81
81
  if (!sandbox.state_scope) {
@@ -94,13 +94,13 @@ function normalizeSandboxOptions(input) {
94
94
  return { value: sandbox, changed };
95
95
  }
96
96
  function migrateProjectSandboxProvider(config, sandbox, deploymentProfile) {
97
- const providerId = String(sandbox.provider_id || index_js_1.DEFAULT_SANDBOX_PROVIDER_ID).trim() || index_js_1.DEFAULT_SANDBOX_PROVIDER_ID;
97
+ const providerId = String(sandbox.provider_id || superai_contracts_1.DEFAULT_SANDBOX_PROVIDER_ID).trim() || superai_contracts_1.DEFAULT_SANDBOX_PROVIDER_ID;
98
98
  config.sandbox_providers = Array.isArray(config.sandbox_providers) ? config.sandbox_providers : [];
99
99
  const existing = config.sandbox_providers.find((provider) => provider.id === providerId);
100
100
  if (existing) {
101
101
  return { changed: false };
102
102
  }
103
- const defaultProvider = (0, index_js_1.defaultSandboxProviderForProfile)(deploymentProfile);
103
+ const defaultProvider = (0, superai_contracts_1.defaultSandboxProviderForProfile)(deploymentProfile);
104
104
  config.sandbox_providers.push({
105
105
  ...defaultProvider,
106
106
  id: providerId,
@@ -112,7 +112,7 @@ function migrateProjectSandboxProvider(config, sandbox, deploymentProfile) {
112
112
  }
113
113
  function migrateProjectSandboxRuntimeImage(config, project, sandbox) {
114
114
  const agentType = String(project.agent?.type || 'pi').trim().toLowerCase() || 'pi';
115
- const fallback = (0, index_js_1.defaultSandboxRuntimeImage)(agentType);
115
+ const fallback = (0, superai_contracts_1.defaultSandboxRuntimeImage)(agentType);
116
116
  const imageId = String(sandbox.runtime_image_id || fallback.id).trim() || fallback.id;
117
117
  const assignedRuntimeImage = sandbox.runtime_image_id === imageId;
118
118
  sandbox.runtime_image_id = imageId;
@@ -145,7 +145,7 @@ function migrateProjectSandboxRuntimeImage(config, project, sandbox) {
145
145
  return { changed: true };
146
146
  }
147
147
  function isBuiltInHttpSandboxRuntimeImage(id, image, fallbackImage) {
148
- return id === index_js_1.DEFAULT_SANDBOX_RUNTIME_IMAGE_ID && String(image || fallbackImage).trim() === fallbackImage;
148
+ return id === superai_contracts_1.DEFAULT_SANDBOX_RUNTIME_IMAGE_ID && String(image || fallbackImage).trim() === fallbackImage;
149
149
  }
150
150
  function cloneConfig(input) {
151
151
  return JSON.parse(JSON.stringify(input || {}));
@@ -2,17 +2,17 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.runDeploymentDiagnostics = runDeploymentDiagnostics;
4
4
  const node_fs_1 = require("node:fs");
5
- const index_js_1 = require("../../../../packages/contracts/src/index.js");
5
+ const superai_contracts_1 = require("../../../../packages/contracts/src/index.js");
6
6
  const sandbox_config_js_1 = require("../sandbox/sandbox-config.js");
7
7
  async function runDeploymentDiagnostics(input) {
8
8
  const env = input.env || process.env;
9
9
  const checkedAt = new Date().toISOString();
10
10
  const config = input.config || {};
11
- const profile = (0, index_js_1.getDesktopDeploymentProfile)(String(config.deployment_profile || env.AGENTDOCK_DEPLOYMENT_PROFILE || '').trim());
11
+ const profile = (0, superai_contracts_1.getDesktopDeploymentProfile)(String(config.deployment_profile || env.AGENTDOCK_DEPLOYMENT_PROFILE || '').trim());
12
12
  const provider = Array.isArray(config.sandbox_providers)
13
13
  ? config.sandbox_providers.find((item) => item.id === profile.defaultSandboxProviderId) || config.sandbox_providers[0]
14
14
  : undefined;
15
- const sandboxProvider = provider || (0, index_js_1.defaultSandboxProviderForProfile)(profile.id);
15
+ const sandboxProvider = provider || (0, superai_contracts_1.defaultSandboxProviderForProfile)(profile.id);
16
16
  const opensandboxUrl = normalizeUrl(sandboxProvider.server_url || env.AGENTDOCK_OPENSANDBOX_SERVER_URL || (0, sandbox_config_js_1.defaultOpenSandboxServerUrl)(env));
17
17
  const checks = [
18
18
  {
@@ -48,6 +48,7 @@ class ExternalService {
48
48
  defaultRuntimeId: project.agentType,
49
49
  health: { status: 'healthy', summary: 'External workspace is available.', issues: [], checkedAt: now },
50
50
  metadata: {
51
+ ...(this.store.getWorkspaceRegistryEntry(project.workspaceId)?.metadata || {}),
51
52
  external: true,
52
53
  userId: project.userId,
53
54
  externalProjectId: project.externalProjectId,
@@ -110,7 +111,7 @@ class ExternalService {
110
111
  ...(current.config || {}),
111
112
  projects: Array.isArray(current.config?.projects) ? [...current.config.projects] : [],
112
113
  };
113
- const existingIndex = config.projects.findIndex((item) => item?.name === project.workspaceId);
114
+ const existingIndex = config.projects.findIndex((item) => item?.workspace_id === project.workspaceId || item?.name === project.workspaceId);
114
115
  const existing = existingIndex >= 0 ? config.projects[existingIndex] : undefined;
115
116
  const defaultRuntimeImageId = Array.isArray(config.sandbox_runtime_images)
116
117
  ? config.sandbox_runtime_images.find((image) => image?.agent_type === project.agentType)?.id
@@ -130,6 +131,7 @@ class ExternalService {
130
131
  },
131
132
  };
132
133
  const nextProject = {
134
+ workspace_id: project.workspaceId,
133
135
  name: project.workspaceId,
134
136
  agent: {
135
137
  ...(existing?.agent || {}),
@@ -2,13 +2,19 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.registerAutomationHandlers = registerAutomationHandlers;
4
4
  const server_helpers_js_1 = require("../server-helpers.js");
5
+ const request_validation_js_1 = require("../request-validation.js");
5
6
  function registerAutomationHandlers(map, automationMonitors) {
6
7
  map.set('automation.monitors.list', async (_route, _req, res, url) => {
7
8
  const workspaceId = String(url.searchParams.get('workspace_id') || '');
8
9
  (0, server_helpers_js_1.json)(res, 200, { monitors: await automationMonitors.listMonitors(workspaceId || undefined) });
9
10
  });
10
11
  map.set('automation.monitors.create', async (_route, req, res) => {
11
- const body = await (0, server_helpers_js_1.readJsonBody)(req);
12
+ const body = (0, request_validation_js_1.validateBody)(await (0, server_helpers_js_1.readJsonBody)(req), {
13
+ workspaceId: { kind: 'string', required: true }, title: { kind: 'string', required: true },
14
+ sourceType: { kind: 'string', required: true }, sourceConfig: 'object', condition: { kind: 'object', required: true },
15
+ promptTemplate: { kind: 'string', required: true }, platform: 'string', route: 'object', threadId: 'string',
16
+ executionMode: 'string', enabled: 'boolean', cooldownMs: 'number',
17
+ });
12
18
  (0, server_helpers_js_1.json)(res, 200, await automationMonitors.createMonitor(body));
13
19
  });
14
20
  map.set('automation.monitor.get', async (route, _req, res) => {
@@ -25,7 +31,10 @@ function registerAutomationHandlers(map, automationMonitors) {
25
31
  (0, server_helpers_js_1.json)(res, 200, await automationMonitors.runMonitorNow(route.monitorId));
26
32
  });
27
33
  map.set('automation.monitor.update', async (route, req, res) => {
28
- const body = await (0, server_helpers_js_1.readJsonBody)(req);
34
+ const body = (0, request_validation_js_1.validateBody)(await (0, server_helpers_js_1.readJsonBody)(req), {
35
+ title: 'string', sourceConfig: 'object', condition: 'object', promptTemplate: 'string', route: 'object',
36
+ executionMode: 'string', enabled: 'boolean', cooldownMs: 'number',
37
+ });
29
38
  (0, server_helpers_js_1.json)(res, 200, await automationMonitors.updateMonitor(route.monitorId, body));
30
39
  });
31
40
  map.set('automation.monitor.delete', async (route, _req, res) => {
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.registerChannelHandlers = registerChannelHandlers;
4
4
  const server_helpers_js_1 = require("../server-helpers.js");
5
+ const request_validation_js_1 = require("../request-validation.js");
5
6
  function registerChannelHandlers(map, channelService) {
6
7
  const cid = (url) => String(url.searchParams.get('instance_id') || url.searchParams.get('instanceId') || '').trim() || undefined;
7
8
  map.set('platform.gateways.list', async (route, _req, res) => {
@@ -29,12 +30,12 @@ function registerChannelHandlers(map, channelService) {
29
30
  (0, server_helpers_js_1.json)(res, 200, await channelService.checkQrCodeStatus(p, route.workspaceId, ticket, cid(url)));
30
31
  });
31
32
  map.set('platform.pairing.approve', async (route, req, res) => {
32
- const body = await (0, server_helpers_js_1.readJsonBody)(req);
33
- (0, server_helpers_js_1.json)(res, 200, await channelService.approvePairing(route.platform, String(body.code || '')));
33
+ const body = (0, request_validation_js_1.validateBody)(await (0, server_helpers_js_1.readJsonBody)(req), { code: { kind: 'string', required: true } });
34
+ (0, server_helpers_js_1.json)(res, 200, await channelService.approvePairing(route.platform, body.code));
34
35
  });
35
36
  map.set('platform.pairing.reject', async (route, req, res) => {
36
- const body = await (0, server_helpers_js_1.readJsonBody)(req);
37
- (0, server_helpers_js_1.json)(res, 200, await channelService.rejectPairing(route.platform, String(body.code || '')));
37
+ const body = (0, request_validation_js_1.validateBody)(await (0, server_helpers_js_1.readJsonBody)(req), { code: { kind: 'string', required: true } });
38
+ (0, server_helpers_js_1.json)(res, 200, await channelService.rejectPairing(route.platform, body.code));
38
39
  });
39
40
  map.set('platform.gateway.test', async (route, _req, res, url) => {
40
41
  const p = route.platform;
@@ -49,12 +50,17 @@ function registerChannelHandlers(map, channelService) {
49
50
  (0, server_helpers_js_1.json)(res, 200, await channelService.disable(p, route.workspaceId, cid(url)));
50
51
  });
51
52
  map.set('platform.file.send', async (route, req, res) => {
52
- const body = await (0, server_helpers_js_1.readJsonBody)(req);
53
+ const body = (0, request_validation_js_1.validateBody)(await (0, server_helpers_js_1.readJsonBody)(req), {
54
+ path: { kind: 'string', required: true }, channelId: { kind: 'string', required: true }, participantId: 'string',
55
+ fileName: 'string', workspacePath: 'string',
56
+ });
53
57
  const p = route.platform;
54
58
  (0, server_helpers_js_1.json)(res, 200, await channelService.sendFile(p, route.workspaceId, body));
55
59
  });
56
60
  map.set('platform.message.send', async (route, req, res) => {
57
- const body = await (0, server_helpers_js_1.readJsonBody)(req);
61
+ const body = (0, request_validation_js_1.validateBody)(await (0, server_helpers_js_1.readJsonBody)(req), {
62
+ route: { kind: 'object', required: true }, parts: { kind: 'array', required: true }, metadata: 'object',
63
+ });
58
64
  const p = route.platform;
59
65
  (0, server_helpers_js_1.json)(res, 200, await channelService.sendMessage(p, route.workspaceId, body));
60
66
  });
@@ -2,13 +2,21 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.registerExternalHandlers = registerExternalHandlers;
4
4
  const server_helpers_js_1 = require("../server-helpers.js");
5
+ const request_validation_js_1 = require("../request-validation.js");
6
+ const externalProjectSchema = {
7
+ user_id: { kind: 'string', required: true }, external_project_id: { kind: 'string', required: true },
8
+ display_name: 'string', agent_type: 'string', provider_id: 'string', model: 'string', metadata: 'object',
9
+ };
5
10
  function registerExternalHandlers(map, externalService, attachExternalRunSseClient) {
6
11
  map.set('external.project.ensure', async (_route, req, res) => {
7
- const body = await (0, server_helpers_js_1.readJsonBody)(req);
12
+ const body = (0, request_validation_js_1.validateBody)(await (0, server_helpers_js_1.readJsonBody)(req), externalProjectSchema);
8
13
  (0, server_helpers_js_1.json)(res, 200, await externalService.ensureProject(body));
9
14
  });
10
15
  map.set('external.run.create', async (_route, req, res) => {
11
- const body = await (0, server_helpers_js_1.readJsonBody)(req);
16
+ const body = (0, request_validation_js_1.validateBody)(await (0, server_helpers_js_1.readJsonBody)(req), {
17
+ ...externalProjectSchema, external_thread_id: 'string', title: 'string', prompt: { kind: 'string', required: true },
18
+ permission_mode: 'string', runtime_env: 'object',
19
+ });
12
20
  (0, server_helpers_js_1.json)(res, 200, await externalService.createRun(body));
13
21
  });
14
22
  map.set('external.run.events', async (route, _req, res) => {
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.registerKnowledgeHandlers = registerKnowledgeHandlers;
4
4
  const server_helpers_js_1 = require("../server-helpers.js");
5
+ const request_validation_js_1 = require("../request-validation.js");
5
6
  function registerKnowledgeHandlers(map, knowledgeProvider) {
6
7
  map.set('knowledge.sources.list', async (_route, _req, res) => {
7
8
  (0, server_helpers_js_1.json)(res, 200, { sources: await knowledgeProvider.listSources() });
@@ -10,18 +11,22 @@ function registerKnowledgeHandlers(map, knowledgeProvider) {
10
11
  (0, server_helpers_js_1.json)(res, 200, await knowledgeProvider.getConfig());
11
12
  });
12
13
  map.set('knowledge.config.update', async (_route, req, res) => {
13
- const body = await (0, server_helpers_js_1.readJsonBody)(req);
14
+ const body = (0, request_validation_js_1.validateBody)(await (0, server_helpers_js_1.readJsonBody)(req), {
15
+ baseUrl: 'string', authMode: 'string', token: 'string', headerName: 'string', defaultCollection: 'string',
16
+ });
14
17
  (0, server_helpers_js_1.json)(res, 200, await knowledgeProvider.updateConfig(body));
15
18
  });
16
19
  map.set('knowledge.folders.list', async (_route, _req, res) => {
17
20
  (0, server_helpers_js_1.json)(res, 200, { folders: await knowledgeProvider.listFolders() });
18
21
  });
19
22
  map.set('knowledge.folders.create', async (_route, req, res) => {
20
- const body = await (0, server_helpers_js_1.readJsonBody)(req);
23
+ const body = (0, request_validation_js_1.validateBody)(await (0, server_helpers_js_1.readJsonBody)(req), {
24
+ name: { kind: 'string', required: true }, parentId: { kind: 'string', nullable: true },
25
+ });
21
26
  (0, server_helpers_js_1.json)(res, 200, await knowledgeProvider.createFolder(body));
22
27
  });
23
28
  map.set('knowledge.folder.update', async (route, req, res) => {
24
- const body = await (0, server_helpers_js_1.readJsonBody)(req);
29
+ const body = (0, request_validation_js_1.validateBody)(await (0, server_helpers_js_1.readJsonBody)(req), { name: { kind: 'string', required: true } });
25
30
  (0, server_helpers_js_1.json)(res, 200, await knowledgeProvider.updateFolder(route.folderId, body));
26
31
  });
27
32
  map.set('knowledge.folder.delete', async (route, _req, res) => {
@@ -31,14 +36,19 @@ function registerKnowledgeHandlers(map, knowledgeProvider) {
31
36
  (0, server_helpers_js_1.json)(res, 200, { bases: await knowledgeProvider.listKnowledgeBases() });
32
37
  });
33
38
  map.set('knowledge.bases.create', async (_route, req, res) => {
34
- const body = await (0, server_helpers_js_1.readJsonBody)(req);
39
+ const body = (0, request_validation_js_1.validateBody)(await (0, server_helpers_js_1.readJsonBody)(req), {
40
+ name: { kind: 'string', required: true }, description: 'string', folderId: { kind: 'string', nullable: true },
41
+ creatorName: 'string', icon: 'string',
42
+ });
35
43
  (0, server_helpers_js_1.json)(res, 200, await knowledgeProvider.createKnowledgeBase(body));
36
44
  });
37
45
  map.set('knowledge.base.get', async (route, _req, res) => {
38
46
  (0, server_helpers_js_1.json)(res, 200, await knowledgeProvider.getKnowledgeBase(route.knowledgeBaseId));
39
47
  });
40
48
  map.set('knowledge.base.update', async (route, req, res) => {
41
- const body = await (0, server_helpers_js_1.readJsonBody)(req);
49
+ const body = (0, request_validation_js_1.validateBody)(await (0, server_helpers_js_1.readJsonBody)(req), {
50
+ name: 'string', description: 'string', folderId: { kind: 'string', nullable: true }, creatorName: 'string', icon: 'string',
51
+ });
42
52
  (0, server_helpers_js_1.json)(res, 200, await knowledgeProvider.updateKnowledgeBase(route.knowledgeBaseId, body));
43
53
  });
44
54
  map.set('knowledge.base.delete', async (route, _req, res) => {
@@ -59,7 +69,9 @@ function registerKnowledgeHandlers(map, knowledgeProvider) {
59
69
  (0, server_helpers_js_1.json)(res, 200, await knowledgeProvider.deleteKnowledgeBaseFile(route.knowledgeBaseId, route.fileId));
60
70
  });
61
71
  map.set('knowledge.base.search', async (route, req, res) => {
62
- const body = await (0, server_helpers_js_1.readJsonBody)(req);
72
+ const body = (0, request_validation_js_1.validateBody)(await (0, server_helpers_js_1.readJsonBody)(req), {
73
+ query: { kind: 'string', required: true }, limit: 'number',
74
+ });
63
75
  (0, server_helpers_js_1.json)(res, 200, { results: await knowledgeProvider.searchKnowledgeBase(route.knowledgeBaseId, body) });
64
76
  });
65
77
  }
@@ -2,16 +2,21 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.registerProviderHandlers = registerProviderHandlers;
4
4
  const server_helpers_js_1 = require("../server-helpers.js");
5
+ const request_validation_js_1 = require("../request-validation.js");
6
+ const providerSchema = {
7
+ id: 'string', name: { kind: 'string', required: true }, api_key: 'string', base_url: 'string', model: 'string',
8
+ models: 'array', thinking: 'string', env: 'object',
9
+ };
5
10
  function registerProviderHandlers(map, store) {
6
11
  map.set('providers.list', async (_route, _req, res) => {
7
12
  (0, server_helpers_js_1.json)(res, 200, { providers: store.listModelProviders() });
8
13
  });
9
14
  map.set('providers.create', async (_route, req, res) => {
10
- const body = await (0, server_helpers_js_1.readJsonBody)(req);
15
+ const body = (0, request_validation_js_1.validateBody)(await (0, server_helpers_js_1.readJsonBody)(req), providerSchema);
11
16
  (0, server_helpers_js_1.json)(res, 200, await store.upsertModelProvider(body));
12
17
  });
13
18
  map.set('provider.update', async (route, req, res) => {
14
- const body = await (0, server_helpers_js_1.readJsonBody)(req);
19
+ const body = (0, request_validation_js_1.validateBody)(await (0, server_helpers_js_1.readJsonBody)(req), providerSchema);
15
20
  const existing = store.getModelProvider(route.providerId);
16
21
  if (!existing) {
17
22
  throw new Error(`Provider not found: ${route.providerId}`);
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.registerRuntimeHandlers = registerRuntimeHandlers;
4
4
  const server_helpers_js_1 = require("../server-helpers.js");
5
+ const request_validation_js_1 = require("../request-validation.js");
5
6
  function registerRuntimeHandlers(map, controller, errorReporter, attachSseClient) {
6
7
  map.set('health', async (_route, _req, res) => {
7
8
  (0, server_helpers_js_1.json)(res, 200, { name: 'local-ai-core', version: '0.1.0' });
@@ -42,11 +43,35 @@ function registerRuntimeHandlers(map, controller, errorReporter, attachSseClient
42
43
  (0, server_helpers_js_1.json)(res, 200, await controller.readRuntimeConfig());
43
44
  });
44
45
  map.set('runtime.runtime-config.save', async (_route, req, res) => {
45
- const body = await (0, server_helpers_js_1.readJsonBody)(req);
46
- (0, server_helpers_js_1.json)(res, 200, await controller.saveRuntimeConfig((body.config || {})));
46
+ const body = (0, request_validation_js_1.validateBody)(await (0, server_helpers_js_1.readJsonBody)(req), {
47
+ config: { kind: 'object', required: true },
48
+ });
49
+ (0, server_helpers_js_1.json)(res, 200, await controller.saveRuntimeConfig(body.config));
47
50
  });
48
51
  map.set('runtime.settings.save', async (_route, req, res) => {
49
- const body = await (0, server_helpers_js_1.readJsonBody)(req);
52
+ const body = (0, request_validation_js_1.validateBody)(await (0, server_helpers_js_1.readJsonBody)(req), {
53
+ binaryPath: 'string',
54
+ configPath: 'string',
55
+ autoStartService: 'boolean',
56
+ defaultProject: 'string',
57
+ knowledge: {
58
+ kind: 'object',
59
+ fields: {
60
+ baseUrl: 'string',
61
+ authMode: { kind: 'string', allowedValues: ['none', 'bearer', 'header'] },
62
+ token: 'string',
63
+ headerName: 'string',
64
+ defaultCollection: 'string',
65
+ },
66
+ },
67
+ plugins: {
68
+ kind: 'object',
69
+ valueSchema: {
70
+ enabled: 'boolean',
71
+ config: 'object',
72
+ },
73
+ },
74
+ });
50
75
  (0, server_helpers_js_1.json)(res, 200, await controller.saveSettings(body));
51
76
  });
52
77
  map.set('diagnostics.doctor', async (_route, _req, res) => {
@@ -2,13 +2,18 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.registerSchedulerHandlers = registerSchedulerHandlers;
4
4
  const server_helpers_js_1 = require("../server-helpers.js");
5
+ const request_validation_js_1 = require("../request-validation.js");
5
6
  function registerSchedulerHandlers(map, scheduledJobs) {
6
7
  map.set('scheduler.jobs.list', async (_route, _req, res, url) => {
7
8
  const workspaceId = String(url.searchParams.get('workspace_id') || '');
8
9
  (0, server_helpers_js_1.json)(res, 200, { jobs: await scheduledJobs.listJobs(workspaceId || undefined) });
9
10
  });
10
11
  map.set('scheduler.jobs.create', async (_route, req, res) => {
11
- const body = await (0, server_helpers_js_1.readJsonBody)(req);
12
+ const body = (0, request_validation_js_1.validateBody)(await (0, server_helpers_js_1.readJsonBody)(req), {
13
+ workspaceId: { kind: 'string', required: true }, platform: 'string', route: 'object', threadId: 'string',
14
+ executionMode: 'string', triggerType: { kind: 'string', required: true }, cronExpr: 'string', runAt: 'string',
15
+ promptTemplate: { kind: 'string', required: true }, description: 'string', enabled: 'boolean',
16
+ });
12
17
  (0, server_helpers_js_1.json)(res, 200, await scheduledJobs.createJob(body));
13
18
  });
14
19
  map.set('scheduler.job.get', async (route, _req, res) => {
@@ -25,7 +30,10 @@ function registerSchedulerHandlers(map, scheduledJobs) {
25
30
  (0, server_helpers_js_1.json)(res, 200, await scheduledJobs.runJobNow(route.jobId));
26
31
  });
27
32
  map.set('scheduler.job.update', async (route, req, res) => {
28
- const body = await (0, server_helpers_js_1.readJsonBody)(req);
33
+ const body = (0, request_validation_js_1.validateBody)(await (0, server_helpers_js_1.readJsonBody)(req), {
34
+ route: 'object', executionMode: 'string', triggerType: 'string', cronExpr: 'string', runAt: 'string',
35
+ promptTemplate: 'string', description: 'string', enabled: 'boolean',
36
+ });
29
37
  (0, server_helpers_js_1.json)(res, 200, await scheduledJobs.updateJob(route.jobId, body));
30
38
  });
31
39
  map.set('scheduler.job.delete', async (route, _req, res) => {