@kafca/agentdock 0.1.24 → 0.1.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 (83) hide show
  1. package/README.md +2 -0
  2. package/dist/renderer/assets/{Badge-CXcUMqb-.js → Badge-qZHTUGI3.js} +1 -1
  3. package/dist/renderer/assets/{Chat-BRxdPzi-.js → Chat-W35BzaZk.js} +1 -1
  4. package/dist/renderer/assets/{ChatMarkdown-sWGBIfIb.js → ChatMarkdown-DxKT_YGp.js} +1 -1
  5. package/dist/renderer/assets/{Config-DqxuxIGg.js → Config-COTX6LDN.js} +1 -1
  6. package/dist/renderer/assets/{CronList-OgHxbti5.js → CronList-kxlfu9Iq.js} +1 -1
  7. package/dist/renderer/assets/{Dashboard-DmklXiH1.js → Dashboard-Y4PGxzuV.js} +2 -2
  8. package/dist/renderer/assets/{EmptyState-BvDmi8dq.js → EmptyState-Cjq33EOF.js} +1 -1
  9. package/dist/renderer/assets/{KnowledgeDetail-Bj59Hdpo.js → KnowledgeDetail-CztNt7i8.js} +1 -1
  10. package/dist/renderer/assets/{KnowledgeHome-CigQ-nSo.js → KnowledgeHome-BAOyy3I9.js} +1 -1
  11. package/dist/renderer/assets/{Logs-Bfc7gBpY.js → Logs-PRZ1IIEi.js} +1 -1
  12. package/dist/renderer/assets/{Modal-CfmiFknz.js → Modal-B1rgqkBM.js} +1 -1
  13. package/dist/renderer/assets/{Page-BxtLEw_b.js → Page-CjzAhgaU.js} +1 -1
  14. package/dist/renderer/assets/{ProjectDetail-CcUphxGm.js → ProjectDetail-XGh_5XxQ.js} +1 -1
  15. package/dist/renderer/assets/{ProjectList-CVkvDIfy.js → ProjectList-BkPTpQRZ.js} +1 -1
  16. package/dist/renderer/assets/{Select-DgQMZ0MD.js → Select-BZd1QJVw.js} +1 -1
  17. package/dist/renderer/assets/{SessionChat-CRmGKfBx.js → SessionChat-C3sOTWGT.js} +1 -1
  18. package/dist/renderer/assets/{SessionList-D0E8XbYw.js → SessionList-B5WK1big.js} +1 -1
  19. package/dist/renderer/assets/ThreadChat-DWiBLHC7.js +23 -0
  20. package/dist/renderer/assets/{Workspace-Q4g4rlRT.js → Workspace-CQ64VK-o.js} +1 -1
  21. package/dist/renderer/assets/{arrow-left-BySN_zhF.js → arrow-left-FLdaWHZ8.js} +1 -1
  22. package/dist/renderer/assets/{book-open-BGlrnrTc.js → book-open-DaSioPS9.js} +1 -1
  23. package/dist/renderer/assets/{check-BiJogEa5.js → check-BiSmsuGR.js} +1 -1
  24. package/dist/renderer/assets/{chevron-down-D2fHRJv6.js → chevron-down-pZ2KjmDR.js} +1 -1
  25. package/dist/renderer/assets/{circle-CIcjixmI.js → circle-296S3nw9.js} +1 -1
  26. package/dist/renderer/assets/{desktop-DyA_NYew.js → desktop-88jgnOZV.js} +1 -1
  27. package/dist/renderer/assets/{desktop-DAXY9Bxv.js → desktop-BkMW-h5p.js} +2 -2
  28. package/dist/renderer/assets/{funnel-BUzwb-id.js → funnel-Dvz31PLy.js} +1 -1
  29. package/dist/renderer/assets/{heart-DZEQ1z_V.js → heart-D9mxSZVO.js} +1 -1
  30. package/dist/renderer/assets/{index-DgsIo4vJ.js → index-CZA4lqvM.js} +1 -1
  31. package/dist/renderer/assets/{index-CB_KyLOr.js → index-dOdOWAa2.js} +3 -3
  32. package/dist/renderer/assets/{pencil-DGL4agcl.js → pencil-B2fRbaAo.js} +1 -1
  33. package/dist/renderer/assets/{play-DzasCLM4.js → play-CWPRHypD.js} +1 -1
  34. package/dist/renderer/assets/{plug-dubNMe_m.js → plug-B7IBVwSo.js} +1 -1
  35. package/dist/renderer/assets/{plus-DN4kML4k.js → plus-Cn3Awirs.js} +1 -1
  36. package/dist/renderer/assets/projects-CmCopAi6.js +1 -0
  37. package/dist/renderer/assets/{save-CNIc9tjl.js → save-MVjXRqom.js} +1 -1
  38. package/dist/renderer/assets/{search-C0EGbF3I.js → search-Bu5c7wTX.js} +1 -1
  39. package/dist/renderer/assets/{server-BMxQ4zmc.js → server-aDvfqBg_.js} +1 -1
  40. package/dist/renderer/assets/{session-utils-Bf5O-iMi.js → session-utils-DjDpjT9r.js} +1 -1
  41. package/dist/renderer/assets/{sessions-BMSs6rEI.js → sessions-D7dV8h0H.js} +1 -1
  42. package/dist/renderer/assets/{shield-check-i3Tf1TUz.js → shield-check-DJdEhc_e.js} +1 -1
  43. package/dist/renderer/assets/{trash-2-SKrcp18f.js → trash-2-BF3ejnXL.js} +1 -1
  44. package/dist/renderer/assets/{user-cNUZddjZ.js → user-BwuWCrin.js} +1 -1
  45. package/dist/renderer/assets/{wifi-off-Dyb84ANR.js → wifi-off-BahJZfDs.js} +1 -1
  46. package/dist/renderer/index.html +1 -1
  47. package/dist-electron/electron/agent-runtime-detector.test.js +64 -0
  48. package/dist-electron/electron/architecture-docs.test.js +56 -0
  49. package/dist-electron/electron/channel-content.test.js +8 -0
  50. package/dist-electron/electron/lac-cli.test.js +248 -0
  51. package/dist-electron/electron/local-core-refactor.test.js +795 -20
  52. package/dist-electron/electron/plugin-kernel.test.js +108 -0
  53. package/dist-electron/electron/renderer-packaging.test.js +77 -0
  54. package/dist-electron/electron/workspace-task-store.test.js +57 -0
  55. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-backend.js +67 -6
  56. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-permission-lifecycle.js +76 -0
  57. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-progress.js +201 -0
  58. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-session-coordinator.js +29 -0
  59. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-store.js +30 -18
  60. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-turn-coordinator.js +112 -210
  61. package/dist-electron/services/local-ai-core/src/acp/local-core-slash-commands.js +60 -0
  62. package/dist-electron/services/local-ai-core/src/channel/lark/local-core-lark-gateway.js +44 -27
  63. package/dist-electron/services/local-ai-core/src/channel/lark/runtime-state.js +104 -12
  64. package/dist-electron/services/local-ai-core/src/channel/shared/file-utils.js +13 -1
  65. package/dist-electron/services/local-ai-core/src/channel/weixin/local-core-weixin-gateway.js +8 -1
  66. package/dist-electron/services/local-ai-core/src/cli/lac.js +3 -1
  67. package/dist-electron/services/local-ai-core/src/kernel/bootstrap.js +1 -0
  68. package/dist-electron/services/local-ai-core/src/plugins/builtin/agent-localcore-acp-plugin.js +9 -0
  69. package/dist-electron/services/local-ai-core/src/router/workspace-route-config.js +221 -10
  70. package/dist-electron/services/local-ai-core/src/runtime/agent-runtime-detector.js +39 -9
  71. package/dist-electron/services/local-ai-core/src/runtime/local-core-controller.js +1 -0
  72. package/dist-electron/services/local-ai-core/src/runtime/runtime-detection-service.js +1 -0
  73. package/dist-electron/services/local-ai-core/src/runtime/server-routes.js +439 -0
  74. package/dist-electron/services/local-ai-core/src/runtime/server.js +208 -303
  75. package/dist-electron/shared/desktop.js +7 -3
  76. package/dist-electron/src/pages/Threads/thread-chat-message-blocks.js +187 -0
  77. package/dist-electron/src/pages/Threads/thread-chat-model.js +1 -0
  78. package/dist-electron/src/pages/Threads/thread-chat-page-state.js +96 -0
  79. package/dist-electron/src/pages/Threads/thread-chat-permission.js +18 -0
  80. package/dist-electron/src/pages/Threads/thread-chat-permission.test.js +277 -0
  81. package/package.json +4 -2
  82. package/dist/renderer/assets/ThreadChat-DUgqZSBB.js +0 -23
  83. package/dist/renderer/assets/projects-migPtfRe.js +0 -1
@@ -7,6 +7,7 @@ const node_module_1 = require("node:module");
7
7
  const node_child_process_1 = require("node:child_process");
8
8
  const desktop_js_1 = require("../../../../shared/desktop.js");
9
9
  const DISPLAY_NAMES = {
10
+ pi: 'Pi',
10
11
  opencode: 'OpenCode',
11
12
  codex: 'Codex',
12
13
  claudecode: 'Claude Code',
@@ -17,6 +18,7 @@ const DISPLAY_NAMES = {
17
18
  [desktop_js_1.LOCALCORE_ACP_AGENT_TYPE]: 'LocalCore ACP',
18
19
  };
19
20
  const COMMAND_CANDIDATES = {
21
+ pi: ['pi'],
20
22
  opencode: ['opencode'],
21
23
  codex: ['codex-acp', 'codex'],
22
24
  claudecode: ['claude-agent-acp'],
@@ -26,6 +28,7 @@ const COMMAND_CANDIDATES = {
26
28
  iflow: ['iflow'],
27
29
  };
28
30
  const VERSION_ARGUMENTS = {
31
+ pi: ['--version'],
29
32
  opencode: ['--version'],
30
33
  codex: ['--version'],
31
34
  claudecode: ['--version'],
@@ -61,14 +64,16 @@ function detectInstalledAgentRuntimes(options = {}) {
61
64
  ? installedRuntime(agentType, resolved, 'config', detectedAt, env, versionTimeoutMs)
62
65
  : missingRuntime(agentType, detectedAt, `Configured command not found: ${configured}`);
63
66
  }
64
- if (agentType === 'codex' || agentType === 'claudecode') {
65
- const bundled = agentType === 'codex'
66
- ? resolveBundledAcpPackage(options.requireFrom, desktop_js_1.DESKTOP_CODEX_ACP_PACKAGE, ['bin/codex-acp.js'])
67
- : resolveBundledAcpPackage(options.requireFrom, desktop_js_1.DESKTOP_CLAUDECODE_ACP_PACKAGE, [
68
- 'dist/cli.js',
69
- 'bin/claude-agent-acp.js',
70
- 'cli.js',
71
- ]);
67
+ if (agentType === 'pi' || agentType === 'codex' || agentType === 'claudecode') {
68
+ const bundled = agentType === 'pi'
69
+ ? resolveBundledAcpPackage(options.requireFrom, desktop_js_1.DESKTOP_PI_CODING_AGENT_PACKAGE, ['dist/cli.js'])
70
+ : agentType === 'codex'
71
+ ? resolveBundledAcpPackage(options.requireFrom, desktop_js_1.DESKTOP_CODEX_ACP_PACKAGE, ['bin/codex-acp.js'])
72
+ : resolveBundledAcpPackage(options.requireFrom, desktop_js_1.DESKTOP_CLAUDECODE_ACP_PACKAGE, [
73
+ 'dist/cli.js',
74
+ 'bin/claude-agent-acp.js',
75
+ 'cli.js',
76
+ ]);
72
77
  if (bundled) {
73
78
  return installedRuntime(agentType, bundled, 'bundled', detectedAt, env, versionTimeoutMs);
74
79
  }
@@ -224,7 +229,7 @@ function parseVersionOutput(output) {
224
229
  function resolveBundledAcpPackage(requireFrom, packageName, candidates) {
225
230
  try {
226
231
  const require = (0, node_module_1.createRequire)(requireFrom || (0, node_path_1.join)(process.cwd(), 'package.json'));
227
- const packageJsonPath = require.resolve(`${packageName}/package.json`);
232
+ const packageJsonPath = resolveBundledPackageJsonPath(require, packageName);
228
233
  const packageDir = (0, node_path_1.dirname)(packageJsonPath);
229
234
  const packageJson = require(packageJsonPath);
230
235
  const binField = packageJson.bin;
@@ -246,3 +251,28 @@ function resolveBundledAcpPackage(requireFrom, packageName, candidates) {
246
251
  return null;
247
252
  }
248
253
  }
254
+ function resolveBundledPackageJsonPath(require, packageName) {
255
+ try {
256
+ return require.resolve(`${packageName}/package.json`);
257
+ }
258
+ catch (error) {
259
+ if (error?.code !== 'ERR_PACKAGE_PATH_NOT_EXPORTED') {
260
+ throw error;
261
+ }
262
+ }
263
+ for (const basePath of require.resolve.paths(packageName) || []) {
264
+ const packageJsonPath = (0, node_path_1.join)(basePath, ...packageName.split('/'), 'package.json');
265
+ if ((0, node_fs_1.existsSync)(packageJsonPath)) {
266
+ return packageJsonPath;
267
+ }
268
+ }
269
+ let current = (0, node_path_1.dirname)(require.resolve(packageName));
270
+ while (current && current !== (0, node_path_1.dirname)(current)) {
271
+ const packageJsonPath = (0, node_path_1.join)(current, 'package.json');
272
+ if ((0, node_fs_1.existsSync)(packageJsonPath)) {
273
+ return packageJsonPath;
274
+ }
275
+ current = (0, node_path_1.dirname)(current);
276
+ }
277
+ throw new Error(`Bundled package "${packageName}" package.json could not be resolved.`);
278
+ }
@@ -348,6 +348,7 @@ class LocalCoreController extends node_events_1.EventEmitter {
348
348
  type: 'file',
349
349
  path: input.path,
350
350
  fileName: input.fileName,
351
+ metadata: input.workspacePath ? { workspacePath: input.workspacePath } : undefined,
351
352
  }],
352
353
  });
353
354
  const attachment = result.attachments?.[0];
@@ -125,6 +125,7 @@ function changedRuntimes(previous, next) {
125
125
  }
126
126
  function displayName(agentType) {
127
127
  const names = {
128
+ pi: 'Pi',
128
129
  opencode: 'OpenCode',
129
130
  codex: 'Codex',
130
131
  claudecode: 'Claude Code',
@@ -0,0 +1,439 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseLocalAiCoreRoute = parseLocalAiCoreRoute;
4
+ const API_PREFIX = '/api/local/v1';
5
+ function parseLocalAiCoreRoute(method, path) {
6
+ const normalizedMethod = String(method || '').toUpperCase();
7
+ const relativePath = path.startsWith(API_PREFIX) ? path.slice(API_PREFIX.length) || '/' : path;
8
+ if (normalizedMethod === 'GET' && relativePath === '/health') {
9
+ return { name: 'health' };
10
+ }
11
+ if (normalizedMethod === 'GET' && relativePath === '/runtime') {
12
+ return { name: 'runtime.status' };
13
+ }
14
+ if (normalizedMethod === 'POST' && relativePath === '/runtime/service/start') {
15
+ return { name: 'runtime.service.start' };
16
+ }
17
+ if (normalizedMethod === 'POST' && relativePath === '/runtime/service/stop') {
18
+ return { name: 'runtime.service.stop' };
19
+ }
20
+ if (normalizedMethod === 'POST' && relativePath === '/runtime/service/restart') {
21
+ return { name: 'runtime.service.restart' };
22
+ }
23
+ if (normalizedMethod === 'GET' && relativePath === '/runtime/logs') {
24
+ return { name: 'runtime.logs' };
25
+ }
26
+ if (normalizedMethod === 'GET' && relativePath === '/runtime/agent-runtimes') {
27
+ return { name: 'runtime.agent-runtimes' };
28
+ }
29
+ if (normalizedMethod === 'GET' && relativePath === '/runtime/config') {
30
+ return { name: 'runtime.config.read' };
31
+ }
32
+ if (normalizedMethod === 'POST' && relativePath === '/runtime/config/raw') {
33
+ return { name: 'runtime.config.save-raw' };
34
+ }
35
+ if (normalizedMethod === 'POST' && relativePath === '/runtime/config/structured') {
36
+ return { name: 'runtime.config.save-structured' };
37
+ }
38
+ if (normalizedMethod === 'POST' && relativePath === '/runtime/settings') {
39
+ return { name: 'runtime.settings.save' };
40
+ }
41
+ const segments = splitRouteSegments(relativePath);
42
+ if (segments[0] === 'runtimes') {
43
+ return parseRuntimesRoute(normalizedMethod, segments);
44
+ }
45
+ if (segments[0] === 'scheduler' && segments[1] === 'jobs') {
46
+ return parseSchedulerJobsRoute(normalizedMethod, segments);
47
+ }
48
+ if (segments[0] === 'threads') {
49
+ return parseThreadsRoute(normalizedMethod, segments);
50
+ }
51
+ if (segments[0] === 'runs') {
52
+ return parseRunsRoute(normalizedMethod, segments);
53
+ }
54
+ if (segments[0] === 'workspaces') {
55
+ return parseWorkspacesRoute(normalizedMethod, segments);
56
+ }
57
+ if (segments[0] === 'workspace-registry') {
58
+ return parseWorkspaceRegistryRoute(normalizedMethod, segments);
59
+ }
60
+ if (segments[0] === 'workspace-security') {
61
+ return parseWorkspaceSecurityRoute(normalizedMethod, segments);
62
+ }
63
+ if (segments[0] === 'security') {
64
+ return parseSecurityRoute(normalizedMethod, segments);
65
+ }
66
+ if (segments[0] === 'approvals') {
67
+ return parseApprovalsRoute(normalizedMethod, segments);
68
+ }
69
+ if (segments[0] === 'audit-events') {
70
+ return parseAuditEventsRoute(normalizedMethod, segments);
71
+ }
72
+ if (segments[0] === 'tasks') {
73
+ return parseTasksRoute(normalizedMethod, segments);
74
+ }
75
+ if (segments[0] === 'knowledge') {
76
+ return parseKnowledgeRoute(normalizedMethod, segments);
77
+ }
78
+ if (segments[0] === 'capabilities') {
79
+ return parseCapabilitiesRoute(normalizedMethod, segments);
80
+ }
81
+ if (segments[0] === 'plugins') {
82
+ return parsePluginsRoute(normalizedMethod, segments);
83
+ }
84
+ if (normalizedMethod === 'GET' && segments.length === 1 && segments[0] === 'events') {
85
+ return { name: 'events.stream' };
86
+ }
87
+ if (segments[0] === 'platforms') {
88
+ return parsePlatformsRoute(normalizedMethod, segments);
89
+ }
90
+ return null;
91
+ }
92
+ function parseRuntimesRoute(method, segments) {
93
+ if (method === 'GET' && segments.length === 1) {
94
+ return { name: 'runtimes.list' };
95
+ }
96
+ if (method === 'POST' && segments.length === 2 && segments[1] === 'refresh') {
97
+ return { name: 'runtimes.refresh' };
98
+ }
99
+ if (method === 'GET' && segments.length === 2) {
100
+ return { name: 'runtimes.detail', runtimeId: decodeURIComponent(segments[1] || '') };
101
+ }
102
+ if (method === 'POST' && segments.length === 3 && segments[2] === 'refresh') {
103
+ return { name: 'runtimes.refresh-one', runtimeId: decodeURIComponent(segments[1] || '') };
104
+ }
105
+ return null;
106
+ }
107
+ function parseSchedulerJobsRoute(method, segments) {
108
+ if (method === 'GET' && segments.length === 2) {
109
+ return { name: 'scheduler.jobs.list' };
110
+ }
111
+ if (method === 'POST' && segments.length === 2) {
112
+ return { name: 'scheduler.jobs.create' };
113
+ }
114
+ const jobId = segments.length >= 3 ? decodeURIComponent(segments[2] || '') : '';
115
+ if (!jobId) {
116
+ return null;
117
+ }
118
+ if (method === 'GET' && segments.length === 3) {
119
+ return { name: 'scheduler.job.get', jobId };
120
+ }
121
+ if (method === 'GET' && segments.length === 4 && segments[3] === 'runs') {
122
+ return { name: 'scheduler.job.runs', jobId };
123
+ }
124
+ if (method === 'POST' && segments.length === 4 && segments[3] === 'run') {
125
+ return { name: 'scheduler.job.run', jobId };
126
+ }
127
+ if (method === 'PATCH' && segments.length === 3) {
128
+ return { name: 'scheduler.job.update', jobId };
129
+ }
130
+ if (method === 'DELETE' && segments.length === 3) {
131
+ return { name: 'scheduler.job.delete', jobId };
132
+ }
133
+ return null;
134
+ }
135
+ function parseThreadsRoute(method, segments) {
136
+ if (method === 'GET' && segments.length === 1) {
137
+ return { name: 'threads.list' };
138
+ }
139
+ if (method === 'POST' && segments.length === 1) {
140
+ return { name: 'threads.create' };
141
+ }
142
+ const threadId = segments.length >= 2 ? decodeURIComponent(segments[1] || '') : '';
143
+ if (!threadId) {
144
+ return null;
145
+ }
146
+ if (method === 'GET' && segments.length === 2) {
147
+ return { name: 'thread.get', threadId };
148
+ }
149
+ if (method === 'PATCH' && segments.length === 2) {
150
+ return { name: 'thread.rename', threadId };
151
+ }
152
+ if (method === 'DELETE' && segments.length === 2) {
153
+ return { name: 'thread.delete', threadId };
154
+ }
155
+ if (method === 'PATCH' && segments.length === 3 && segments[2] === 'knowledge-bases') {
156
+ return { name: 'thread.update-knowledge-bases', threadId };
157
+ }
158
+ if (method === 'POST' && segments.length === 3 && segments[2] === 'messages') {
159
+ return { name: 'thread.messages.send', threadId };
160
+ }
161
+ if (method === 'POST' && segments.length === 3 && segments[2] === 'actions') {
162
+ return { name: 'thread.actions.send', threadId };
163
+ }
164
+ return null;
165
+ }
166
+ function parseRunsRoute(method, segments) {
167
+ const runId = segments.length >= 2 ? decodeURIComponent(segments[1] || '') : '';
168
+ if (method === 'POST' && runId && segments.length === 3 && segments[2] === 'interrupt') {
169
+ return { name: 'run.interrupt', runId };
170
+ }
171
+ return null;
172
+ }
173
+ function parseWorkspacesRoute(method, segments) {
174
+ if (method === 'GET' && segments.length === 1) {
175
+ return { name: 'workspaces.list' };
176
+ }
177
+ const workspaceId = segments.length >= 2 ? decodeURIComponent(segments[1] || '') : '';
178
+ if (method === 'POST' && workspaceId && segments.length === 3 && segments[2] === 'streaming-probe') {
179
+ return { name: 'workspace.streaming-probe', workspaceId };
180
+ }
181
+ return null;
182
+ }
183
+ function parseWorkspaceRegistryRoute(method, segments) {
184
+ if (method === 'GET' && segments.length === 1) {
185
+ return { name: 'workspace-registry.list' };
186
+ }
187
+ if (method === 'POST' && segments.length === 1) {
188
+ return { name: 'workspace-registry.create' };
189
+ }
190
+ const workspaceId = segments.length >= 2 ? decodeURIComponent(segments[1] || '') : '';
191
+ if (!workspaceId || segments.length !== 2) {
192
+ return null;
193
+ }
194
+ if (method === 'GET') {
195
+ return { name: 'workspace-registry.get', workspaceId };
196
+ }
197
+ if (method === 'PATCH') {
198
+ return { name: 'workspace-registry.update', workspaceId };
199
+ }
200
+ if (method === 'DELETE') {
201
+ return { name: 'workspace-registry.delete', workspaceId };
202
+ }
203
+ return null;
204
+ }
205
+ function parseWorkspaceSecurityRoute(method, segments) {
206
+ const workspaceId = segments.length >= 2 ? decodeURIComponent(segments[1] || '') : '';
207
+ if (!workspaceId || segments.length !== 2) {
208
+ return null;
209
+ }
210
+ if (method === 'GET') {
211
+ return { name: 'workspace-security.get', workspaceId };
212
+ }
213
+ if (method === 'PATCH') {
214
+ return { name: 'workspace-security.update', workspaceId };
215
+ }
216
+ return null;
217
+ }
218
+ function parseSecurityRoute(method, segments) {
219
+ if (method === 'POST' && segments.length === 2 && segments[1] === 'command-risk') {
220
+ return { name: 'security.command-risk.classify' };
221
+ }
222
+ return null;
223
+ }
224
+ function parseApprovalsRoute(method, segments) {
225
+ if (method === 'GET' && segments.length === 1) {
226
+ return { name: 'approvals.list' };
227
+ }
228
+ if (method === 'POST' && segments.length === 1) {
229
+ return { name: 'approvals.create' };
230
+ }
231
+ const approvalId = segments.length >= 2 ? decodeURIComponent(segments[1] || '') : '';
232
+ if (!approvalId) {
233
+ return null;
234
+ }
235
+ if (method === 'GET' && segments.length === 2) {
236
+ return { name: 'approval.get', approvalId };
237
+ }
238
+ if (method === 'POST' && segments.length === 3 && segments[2] === 'resolve') {
239
+ return { name: 'approval.resolve', approvalId };
240
+ }
241
+ return null;
242
+ }
243
+ function parseAuditEventsRoute(method, segments) {
244
+ if (method === 'GET' && segments.length === 1) {
245
+ return { name: 'audit-events.list' };
246
+ }
247
+ return null;
248
+ }
249
+ function parseTasksRoute(method, segments) {
250
+ if (method === 'GET' && segments.length === 1) {
251
+ return { name: 'tasks.list' };
252
+ }
253
+ if (method === 'POST' && segments.length === 1) {
254
+ return { name: 'tasks.create' };
255
+ }
256
+ const taskId = segments.length >= 2 ? decodeURIComponent(segments[1] || '') : '';
257
+ if (!taskId || segments.length !== 2) {
258
+ return null;
259
+ }
260
+ if (method === 'GET') {
261
+ return { name: 'task.get', taskId };
262
+ }
263
+ if (method === 'PATCH') {
264
+ return { name: 'task.update', taskId };
265
+ }
266
+ return null;
267
+ }
268
+ function parseKnowledgeRoute(method, segments) {
269
+ if (method === 'GET' && segments.length === 2 && segments[1] === 'sources') {
270
+ return { name: 'knowledge.sources.list' };
271
+ }
272
+ if (segments.length === 2 && segments[1] === 'config') {
273
+ if (method === 'GET') {
274
+ return { name: 'knowledge.config.read' };
275
+ }
276
+ if (method === 'POST') {
277
+ return { name: 'knowledge.config.update' };
278
+ }
279
+ return null;
280
+ }
281
+ if (segments[1] === 'folders') {
282
+ return parseKnowledgeFoldersRoute(method, segments);
283
+ }
284
+ if (segments[1] === 'bases') {
285
+ return parseKnowledgeBasesRoute(method, segments);
286
+ }
287
+ return null;
288
+ }
289
+ function parseKnowledgeFoldersRoute(method, segments) {
290
+ if (segments.length === 2) {
291
+ if (method === 'GET') {
292
+ return { name: 'knowledge.folders.list' };
293
+ }
294
+ if (method === 'POST') {
295
+ return { name: 'knowledge.folders.create' };
296
+ }
297
+ return null;
298
+ }
299
+ const folderId = segments.length >= 3 ? decodeURIComponent(segments[2] || '') : '';
300
+ if (!folderId || segments.length !== 3) {
301
+ return null;
302
+ }
303
+ if (method === 'PATCH') {
304
+ return { name: 'knowledge.folder.update', folderId };
305
+ }
306
+ if (method === 'DELETE') {
307
+ return { name: 'knowledge.folder.delete', folderId };
308
+ }
309
+ return null;
310
+ }
311
+ function parseKnowledgeBasesRoute(method, segments) {
312
+ if (segments.length === 2) {
313
+ if (method === 'GET') {
314
+ return { name: 'knowledge.bases.list' };
315
+ }
316
+ if (method === 'POST') {
317
+ return { name: 'knowledge.bases.create' };
318
+ }
319
+ return null;
320
+ }
321
+ const knowledgeBaseId = segments.length >= 3 ? decodeURIComponent(segments[2] || '') : '';
322
+ if (!knowledgeBaseId) {
323
+ return null;
324
+ }
325
+ if (segments.length === 3) {
326
+ if (method === 'GET') {
327
+ return { name: 'knowledge.base.get', knowledgeBaseId };
328
+ }
329
+ if (method === 'PATCH') {
330
+ return { name: 'knowledge.base.update', knowledgeBaseId };
331
+ }
332
+ if (method === 'DELETE') {
333
+ return { name: 'knowledge.base.delete', knowledgeBaseId };
334
+ }
335
+ return null;
336
+ }
337
+ if (segments.length === 4 && segments[3] === 'files') {
338
+ if (method === 'GET') {
339
+ return { name: 'knowledge.base.files.list', knowledgeBaseId };
340
+ }
341
+ if (method === 'POST') {
342
+ return { name: 'knowledge.base.files.upload', knowledgeBaseId };
343
+ }
344
+ return null;
345
+ }
346
+ if (method === 'DELETE' && segments.length === 5 && segments[3] === 'files') {
347
+ const fileId = decodeURIComponent(segments[4] || '');
348
+ return fileId ? { name: 'knowledge.base.file.delete', knowledgeBaseId, fileId } : null;
349
+ }
350
+ if (method === 'POST' && segments.length === 4 && segments[3] === 'search') {
351
+ return { name: 'knowledge.base.search', knowledgeBaseId };
352
+ }
353
+ return null;
354
+ }
355
+ function parseCapabilitiesRoute(method, segments) {
356
+ if (method === 'GET' && segments.length === 1) {
357
+ return { name: 'capabilities.read' };
358
+ }
359
+ if (method === 'GET' && segments.length === 2 && segments[1] === 'snapshot') {
360
+ return { name: 'capabilities.snapshot' };
361
+ }
362
+ return null;
363
+ }
364
+ function parsePluginsRoute(method, segments) {
365
+ if (method === 'GET' && segments.length === 2 && segments[1] === 'diagnostics') {
366
+ return { name: 'plugins.diagnostics' };
367
+ }
368
+ return null;
369
+ }
370
+ function parsePlatformsRoute(method, segments) {
371
+ const platform = segments.length >= 2 ? decodeURIComponent(segments[1] || '') : '';
372
+ if (!platform) {
373
+ return null;
374
+ }
375
+ if (method === 'GET') {
376
+ return parsePlatformReadRoute(platform, segments);
377
+ }
378
+ if (method === 'POST') {
379
+ return parsePlatformWriteRoute(platform, segments);
380
+ }
381
+ return null;
382
+ }
383
+ function parsePlatformReadRoute(platform, segments) {
384
+ if (segments.length === 2) {
385
+ return { name: 'platform.gateways.list', platform };
386
+ }
387
+ if (segments.length === 3 && segments[2] === 'pairings') {
388
+ return { name: 'platform.pairings.list', platform };
389
+ }
390
+ if (segments.length === 3 && segments[2] === 'users') {
391
+ return { name: 'platform.users.list', platform };
392
+ }
393
+ const workspaceId = segments.length >= 3 ? decodeURIComponent(segments[2] || '') : '';
394
+ if (!workspaceId) {
395
+ return null;
396
+ }
397
+ if (segments.length === 3) {
398
+ return { name: 'platform.gateway.get', platform, workspaceId };
399
+ }
400
+ if (segments.length === 5 && segments[3] === 'qrcode' && segments[4] === 'status') {
401
+ return { name: 'platform.qrcode.status', platform, workspaceId };
402
+ }
403
+ return null;
404
+ }
405
+ function parsePlatformWriteRoute(platform, segments) {
406
+ if (segments.length === 4 && segments[2] === 'pairings' && segments[3] === 'approve') {
407
+ return { name: 'platform.pairing.approve', platform };
408
+ }
409
+ if (segments.length === 4 && segments[2] === 'pairings' && segments[3] === 'reject') {
410
+ return { name: 'platform.pairing.reject', platform };
411
+ }
412
+ const workspaceId = segments.length >= 3 ? decodeURIComponent(segments[2] || '') : '';
413
+ const action = segments[3] || '';
414
+ if (!workspaceId || segments.length !== 4 || segments[2] === 'pairings') {
415
+ return null;
416
+ }
417
+ if (action === 'test') {
418
+ return { name: 'platform.gateway.test', platform, workspaceId };
419
+ }
420
+ if (action === 'enable') {
421
+ return { name: 'platform.gateway.enable', platform, workspaceId };
422
+ }
423
+ if (action === 'disable') {
424
+ return { name: 'platform.gateway.disable', platform, workspaceId };
425
+ }
426
+ if (action === 'files') {
427
+ return { name: 'platform.file.send', platform, workspaceId };
428
+ }
429
+ if (action === 'messages') {
430
+ return { name: 'platform.message.send', platform, workspaceId };
431
+ }
432
+ if (action === 'qrcode') {
433
+ return { name: 'platform.qrcode.create', platform, workspaceId };
434
+ }
435
+ return null;
436
+ }
437
+ function splitRouteSegments(path) {
438
+ return path.split('/').filter(Boolean);
439
+ }