@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.
- package/README.md +2 -0
- package/dist/renderer/assets/{Badge-CXcUMqb-.js → Badge-qZHTUGI3.js} +1 -1
- package/dist/renderer/assets/{Chat-BRxdPzi-.js → Chat-W35BzaZk.js} +1 -1
- package/dist/renderer/assets/{ChatMarkdown-sWGBIfIb.js → ChatMarkdown-DxKT_YGp.js} +1 -1
- package/dist/renderer/assets/{Config-DqxuxIGg.js → Config-COTX6LDN.js} +1 -1
- package/dist/renderer/assets/{CronList-OgHxbti5.js → CronList-kxlfu9Iq.js} +1 -1
- package/dist/renderer/assets/{Dashboard-DmklXiH1.js → Dashboard-Y4PGxzuV.js} +2 -2
- package/dist/renderer/assets/{EmptyState-BvDmi8dq.js → EmptyState-Cjq33EOF.js} +1 -1
- package/dist/renderer/assets/{KnowledgeDetail-Bj59Hdpo.js → KnowledgeDetail-CztNt7i8.js} +1 -1
- package/dist/renderer/assets/{KnowledgeHome-CigQ-nSo.js → KnowledgeHome-BAOyy3I9.js} +1 -1
- package/dist/renderer/assets/{Logs-Bfc7gBpY.js → Logs-PRZ1IIEi.js} +1 -1
- package/dist/renderer/assets/{Modal-CfmiFknz.js → Modal-B1rgqkBM.js} +1 -1
- package/dist/renderer/assets/{Page-BxtLEw_b.js → Page-CjzAhgaU.js} +1 -1
- package/dist/renderer/assets/{ProjectDetail-CcUphxGm.js → ProjectDetail-XGh_5XxQ.js} +1 -1
- package/dist/renderer/assets/{ProjectList-CVkvDIfy.js → ProjectList-BkPTpQRZ.js} +1 -1
- package/dist/renderer/assets/{Select-DgQMZ0MD.js → Select-BZd1QJVw.js} +1 -1
- package/dist/renderer/assets/{SessionChat-CRmGKfBx.js → SessionChat-C3sOTWGT.js} +1 -1
- package/dist/renderer/assets/{SessionList-D0E8XbYw.js → SessionList-B5WK1big.js} +1 -1
- package/dist/renderer/assets/ThreadChat-DWiBLHC7.js +23 -0
- package/dist/renderer/assets/{Workspace-Q4g4rlRT.js → Workspace-CQ64VK-o.js} +1 -1
- package/dist/renderer/assets/{arrow-left-BySN_zhF.js → arrow-left-FLdaWHZ8.js} +1 -1
- package/dist/renderer/assets/{book-open-BGlrnrTc.js → book-open-DaSioPS9.js} +1 -1
- package/dist/renderer/assets/{check-BiJogEa5.js → check-BiSmsuGR.js} +1 -1
- package/dist/renderer/assets/{chevron-down-D2fHRJv6.js → chevron-down-pZ2KjmDR.js} +1 -1
- package/dist/renderer/assets/{circle-CIcjixmI.js → circle-296S3nw9.js} +1 -1
- package/dist/renderer/assets/{desktop-DyA_NYew.js → desktop-88jgnOZV.js} +1 -1
- package/dist/renderer/assets/{desktop-DAXY9Bxv.js → desktop-BkMW-h5p.js} +2 -2
- package/dist/renderer/assets/{funnel-BUzwb-id.js → funnel-Dvz31PLy.js} +1 -1
- package/dist/renderer/assets/{heart-DZEQ1z_V.js → heart-D9mxSZVO.js} +1 -1
- package/dist/renderer/assets/{index-DgsIo4vJ.js → index-CZA4lqvM.js} +1 -1
- package/dist/renderer/assets/{index-CB_KyLOr.js → index-dOdOWAa2.js} +3 -3
- package/dist/renderer/assets/{pencil-DGL4agcl.js → pencil-B2fRbaAo.js} +1 -1
- package/dist/renderer/assets/{play-DzasCLM4.js → play-CWPRHypD.js} +1 -1
- package/dist/renderer/assets/{plug-dubNMe_m.js → plug-B7IBVwSo.js} +1 -1
- package/dist/renderer/assets/{plus-DN4kML4k.js → plus-Cn3Awirs.js} +1 -1
- package/dist/renderer/assets/projects-CmCopAi6.js +1 -0
- package/dist/renderer/assets/{save-CNIc9tjl.js → save-MVjXRqom.js} +1 -1
- package/dist/renderer/assets/{search-C0EGbF3I.js → search-Bu5c7wTX.js} +1 -1
- package/dist/renderer/assets/{server-BMxQ4zmc.js → server-aDvfqBg_.js} +1 -1
- package/dist/renderer/assets/{session-utils-Bf5O-iMi.js → session-utils-DjDpjT9r.js} +1 -1
- package/dist/renderer/assets/{sessions-BMSs6rEI.js → sessions-D7dV8h0H.js} +1 -1
- package/dist/renderer/assets/{shield-check-i3Tf1TUz.js → shield-check-DJdEhc_e.js} +1 -1
- package/dist/renderer/assets/{trash-2-SKrcp18f.js → trash-2-BF3ejnXL.js} +1 -1
- package/dist/renderer/assets/{user-cNUZddjZ.js → user-BwuWCrin.js} +1 -1
- package/dist/renderer/assets/{wifi-off-Dyb84ANR.js → wifi-off-BahJZfDs.js} +1 -1
- package/dist/renderer/index.html +1 -1
- package/dist-electron/electron/agent-runtime-detector.test.js +64 -0
- package/dist-electron/electron/architecture-docs.test.js +56 -0
- package/dist-electron/electron/channel-content.test.js +8 -0
- package/dist-electron/electron/lac-cli.test.js +248 -0
- package/dist-electron/electron/local-core-refactor.test.js +795 -20
- package/dist-electron/electron/plugin-kernel.test.js +108 -0
- package/dist-electron/electron/renderer-packaging.test.js +77 -0
- package/dist-electron/electron/workspace-task-store.test.js +57 -0
- package/dist-electron/services/local-ai-core/src/acp/local-core-acp-backend.js +67 -6
- package/dist-electron/services/local-ai-core/src/acp/local-core-acp-permission-lifecycle.js +76 -0
- package/dist-electron/services/local-ai-core/src/acp/local-core-acp-progress.js +201 -0
- package/dist-electron/services/local-ai-core/src/acp/local-core-acp-session-coordinator.js +29 -0
- package/dist-electron/services/local-ai-core/src/acp/local-core-acp-store.js +30 -18
- package/dist-electron/services/local-ai-core/src/acp/local-core-acp-turn-coordinator.js +112 -210
- package/dist-electron/services/local-ai-core/src/acp/local-core-slash-commands.js +60 -0
- package/dist-electron/services/local-ai-core/src/channel/lark/local-core-lark-gateway.js +44 -27
- package/dist-electron/services/local-ai-core/src/channel/lark/runtime-state.js +104 -12
- package/dist-electron/services/local-ai-core/src/channel/shared/file-utils.js +13 -1
- package/dist-electron/services/local-ai-core/src/channel/weixin/local-core-weixin-gateway.js +8 -1
- package/dist-electron/services/local-ai-core/src/cli/lac.js +3 -1
- package/dist-electron/services/local-ai-core/src/kernel/bootstrap.js +1 -0
- package/dist-electron/services/local-ai-core/src/plugins/builtin/agent-localcore-acp-plugin.js +9 -0
- package/dist-electron/services/local-ai-core/src/router/workspace-route-config.js +221 -10
- package/dist-electron/services/local-ai-core/src/runtime/agent-runtime-detector.js +39 -9
- package/dist-electron/services/local-ai-core/src/runtime/local-core-controller.js +1 -0
- package/dist-electron/services/local-ai-core/src/runtime/runtime-detection-service.js +1 -0
- package/dist-electron/services/local-ai-core/src/runtime/server-routes.js +439 -0
- package/dist-electron/services/local-ai-core/src/runtime/server.js +208 -303
- package/dist-electron/shared/desktop.js +7 -3
- package/dist-electron/src/pages/Threads/thread-chat-message-blocks.js +187 -0
- package/dist-electron/src/pages/Threads/thread-chat-model.js +1 -0
- package/dist-electron/src/pages/Threads/thread-chat-page-state.js +96 -0
- package/dist-electron/src/pages/Threads/thread-chat-permission.js +18 -0
- package/dist-electron/src/pages/Threads/thread-chat-permission.test.js +277 -0
- package/package.json +4 -2
- package/dist/renderer/assets/ThreadChat-DUgqZSBB.js +0 -23
- 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 === '
|
|
66
|
-
? resolveBundledAcpPackage(options.requireFrom, desktop_js_1.
|
|
67
|
-
:
|
|
68
|
-
'
|
|
69
|
-
|
|
70
|
-
|
|
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
|
|
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];
|
|
@@ -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
|
+
}
|