@kafca/agentdock 0.1.23 → 0.1.25

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 (93) hide show
  1. package/README.md +3 -0
  2. package/dist/renderer/assets/{Badge-C2K5apfV.js → Badge-Bn2h-Qkf.js} +1 -1
  3. package/dist/renderer/assets/{Chat-DI2YeVKb.js → Chat-Cgo9aneg.js} +1 -1
  4. package/dist/renderer/assets/{ChatMarkdown-DMAr15Oi.js → ChatMarkdown-CYzHfSiR.js} +1 -1
  5. package/dist/renderer/assets/{Config-7rP3EuUf.js → Config-DljB2-eP.js} +1 -1
  6. package/dist/renderer/assets/{CronList-81QslYE8.js → CronList-DeVbiY9a.js} +1 -1
  7. package/dist/renderer/assets/{Dashboard-Db2T7rSZ.js → Dashboard-fSqx5sm8.js} +2 -2
  8. package/dist/renderer/assets/{EmptyState-BBJ3cTvB.js → EmptyState-DgqKDwlq.js} +1 -1
  9. package/dist/renderer/assets/{KnowledgeDetail-Dz_6flG3.js → KnowledgeDetail-u8s2SmPV.js} +1 -1
  10. package/dist/renderer/assets/{KnowledgeHome-DIh046mN.js → KnowledgeHome-BdQw8nbY.js} +1 -1
  11. package/dist/renderer/assets/{Logs-BXBtHJLf.js → Logs-DSbndMpy.js} +1 -1
  12. package/dist/renderer/assets/{Modal-BB2Av_Xs.js → Modal-0d0EmAuK.js} +1 -1
  13. package/dist/renderer/assets/{Page-DPSdvMgU.js → Page-CVbOH_Kh.js} +1 -1
  14. package/dist/renderer/assets/{ProjectDetail-C6EWGvGg.js → ProjectDetail-C91tF7uA.js} +1 -1
  15. package/dist/renderer/assets/{ProjectList-BBo5ygnS.js → ProjectList-D78Pc-BQ.js} +1 -1
  16. package/dist/renderer/assets/{Select-CNX-Tx_O.js → Select-BbKzAIuO.js} +1 -1
  17. package/dist/renderer/assets/{SessionChat-BIn46jqZ.js → SessionChat-BERvL5e4.js} +1 -1
  18. package/dist/renderer/assets/{SessionList-CZt6f1Rd.js → SessionList-Bomz335M.js} +1 -1
  19. package/dist/renderer/assets/ThreadChat-CLr3amU2.js +23 -0
  20. package/dist/renderer/assets/{Workspace-C_4tdpjX.js → Workspace-In91z4W2.js} +1 -1
  21. package/dist/renderer/assets/{arrow-left-cHr5wkpq.js → arrow-left-FBnVKKBl.js} +1 -1
  22. package/dist/renderer/assets/{book-open-4nx5C8T-.js → book-open-4_CuP6Sa.js} +1 -1
  23. package/dist/renderer/assets/{check-exTS-R-x.js → check-vsoVjvac.js} +1 -1
  24. package/dist/renderer/assets/{chevron-down-DSvxXQa0.js → chevron-down-DFpmFTJW.js} +1 -1
  25. package/dist/renderer/assets/{circle-DyvEovdw.js → circle-vRULegER.js} +1 -1
  26. package/dist/renderer/assets/desktop-BkMW-h5p.js +4 -0
  27. package/dist/renderer/assets/{desktop-B-KVT10D.js → desktop-ul0Tpzyc.js} +1 -1
  28. package/dist/renderer/assets/{funnel-DA9qVdTy.js → funnel-Gu0E_hJ_.js} +1 -1
  29. package/dist/renderer/assets/{heart-DuEV0ZRJ.js → heart-DsdofOHf.js} +1 -1
  30. package/dist/renderer/assets/{index-Biz-aexG.js → index-BD3aCyBa.js} +3 -3
  31. package/dist/renderer/assets/{index-BgflqkCN.js → index-pJUFobU7.js} +1 -1
  32. package/dist/renderer/assets/{pencil-DBDxeNmO.js → pencil-DbKmV8nD.js} +1 -1
  33. package/dist/renderer/assets/{play-IzlP83_7.js → play-BDMsRxSm.js} +1 -1
  34. package/dist/renderer/assets/{plug-CuT-qFnW.js → plug-t2dMl78-.js} +1 -1
  35. package/dist/renderer/assets/{plus-DEqgkn63.js → plus-BUb6zOAe.js} +1 -1
  36. package/dist/renderer/assets/projects-4F6D_Q8t.js +1 -0
  37. package/dist/renderer/assets/{save-D4sRo07y.js → save-C-_5rQdv.js} +1 -1
  38. package/dist/renderer/assets/{search-DbPZLuV8.js → search-R3ekHFPM.js} +1 -1
  39. package/dist/renderer/assets/{server-D1jUQmwN.js → server-BTuvHf5n.js} +1 -1
  40. package/dist/renderer/assets/{session-utils-Aife8ep2.js → session-utils-ClX6VPFG.js} +1 -1
  41. package/dist/renderer/assets/{sessions-DaH3H7gC.js → sessions-AFKIC-ub.js} +1 -1
  42. package/dist/renderer/assets/{shield-check-BGwUFWNr.js → shield-check-CqMW8CHe.js} +1 -1
  43. package/dist/renderer/assets/{trash-2-CIFBioBa.js → trash-2-BNLcHyUw.js} +1 -1
  44. package/dist/renderer/assets/{user-CnKcvHdo.js → user-BCCN8FYK.js} +1 -1
  45. package/dist/renderer/assets/{wifi-off-ClO53WGa.js → wifi-off-BsNsx3oX.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 +37 -0
  50. package/dist-electron/electron/lac-cli.test.js +297 -4
  51. package/dist-electron/electron/local-core-acp-content.test.js +39 -0
  52. package/dist-electron/electron/local-core-contracts.test.js +67 -0
  53. package/dist-electron/electron/local-core-refactor.test.js +789 -3
  54. package/dist-electron/electron/plugin-kernel.test.js +108 -0
  55. package/dist-electron/electron/renderer-packaging.test.js +77 -0
  56. package/dist-electron/electron/workspace-task-store.test.js +181 -0
  57. package/dist-electron/packages/contracts/src/local-core.js +110 -0
  58. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-backend.js +67 -6
  59. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-content.js +25 -4
  60. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-permission-lifecycle.js +76 -0
  61. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-progress.js +201 -0
  62. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-response-processor.js +3 -2
  63. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-session-coordinator.js +29 -0
  64. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-store.js +74 -46
  65. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-turn-coordinator.js +112 -210
  66. package/dist-electron/services/local-ai-core/src/acp/local-core-slash-commands.js +60 -0
  67. package/dist-electron/services/local-ai-core/src/acp/workspace-acp-permissions.js +5 -48
  68. package/dist-electron/services/local-ai-core/src/channel/lark/local-core-lark-gateway.js +83 -28
  69. package/dist-electron/services/local-ai-core/src/channel/lark/runtime-state.js +11 -0
  70. package/dist-electron/services/local-ai-core/src/channel/shared/content.js +23 -0
  71. package/dist-electron/services/local-ai-core/src/channel/shared/file-utils.js +13 -1
  72. package/dist-electron/services/local-ai-core/src/channel/weixin/local-core-weixin-gateway.js +31 -29
  73. package/dist-electron/services/local-ai-core/src/cli/lac.js +22 -17
  74. package/dist-electron/services/local-ai-core/src/kernel/bootstrap.js +1 -0
  75. package/dist-electron/services/local-ai-core/src/plugins/builtin/agent-localcore-acp-plugin.js +9 -0
  76. package/dist-electron/services/local-ai-core/src/router/workspace-route-config.js +221 -10
  77. package/dist-electron/services/local-ai-core/src/runtime/agent-runtime-detector.js +39 -9
  78. package/dist-electron/services/local-ai-core/src/runtime/local-core-controller.js +1 -0
  79. package/dist-electron/services/local-ai-core/src/runtime/runtime-detection-service.js +1 -0
  80. package/dist-electron/services/local-ai-core/src/runtime/server-routes.js +439 -0
  81. package/dist-electron/services/local-ai-core/src/runtime/server.js +208 -303
  82. package/dist-electron/services/local-ai-core/src/scheduler/job-id.js +15 -0
  83. package/dist-electron/services/local-ai-core/src/scheduler/scheduler-service.js +30 -5
  84. package/dist-electron/shared/desktop.js +34 -8
  85. package/dist-electron/src/pages/Threads/thread-chat-message-blocks.js +187 -0
  86. package/dist-electron/src/pages/Threads/thread-chat-model.js +58 -0
  87. package/dist-electron/src/pages/Threads/thread-chat-page-state.js +96 -0
  88. package/dist-electron/src/pages/Threads/thread-chat-permission.js +18 -0
  89. package/dist-electron/src/pages/Threads/thread-chat-permission.test.js +347 -0
  90. package/package.json +4 -2
  91. package/dist/renderer/assets/ThreadChat-BotD0gKQ.js +0 -23
  92. package/dist/renderer/assets/desktop-CVibRyAw.js +0 -4
  93. package/dist/renderer/assets/projects-DDtDN1rc.js +0 -1
@@ -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
+ }