@kafca/agentdock 0.1.24 → 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.
- package/README.md +2 -0
- package/dist/renderer/assets/{Badge-CXcUMqb-.js → Badge-Bn2h-Qkf.js} +1 -1
- package/dist/renderer/assets/{Chat-BRxdPzi-.js → Chat-Cgo9aneg.js} +1 -1
- package/dist/renderer/assets/{ChatMarkdown-sWGBIfIb.js → ChatMarkdown-CYzHfSiR.js} +1 -1
- package/dist/renderer/assets/{Config-DqxuxIGg.js → Config-DljB2-eP.js} +1 -1
- package/dist/renderer/assets/{CronList-OgHxbti5.js → CronList-DeVbiY9a.js} +1 -1
- package/dist/renderer/assets/{Dashboard-DmklXiH1.js → Dashboard-fSqx5sm8.js} +2 -2
- package/dist/renderer/assets/{EmptyState-BvDmi8dq.js → EmptyState-DgqKDwlq.js} +1 -1
- package/dist/renderer/assets/{KnowledgeDetail-Bj59Hdpo.js → KnowledgeDetail-u8s2SmPV.js} +1 -1
- package/dist/renderer/assets/{KnowledgeHome-CigQ-nSo.js → KnowledgeHome-BdQw8nbY.js} +1 -1
- package/dist/renderer/assets/{Logs-Bfc7gBpY.js → Logs-DSbndMpy.js} +1 -1
- package/dist/renderer/assets/{Modal-CfmiFknz.js → Modal-0d0EmAuK.js} +1 -1
- package/dist/renderer/assets/{Page-BxtLEw_b.js → Page-CVbOH_Kh.js} +1 -1
- package/dist/renderer/assets/{ProjectDetail-CcUphxGm.js → ProjectDetail-C91tF7uA.js} +1 -1
- package/dist/renderer/assets/{ProjectList-CVkvDIfy.js → ProjectList-D78Pc-BQ.js} +1 -1
- package/dist/renderer/assets/{Select-DgQMZ0MD.js → Select-BbKzAIuO.js} +1 -1
- package/dist/renderer/assets/{SessionChat-CRmGKfBx.js → SessionChat-BERvL5e4.js} +1 -1
- package/dist/renderer/assets/{SessionList-D0E8XbYw.js → SessionList-Bomz335M.js} +1 -1
- package/dist/renderer/assets/ThreadChat-CLr3amU2.js +23 -0
- package/dist/renderer/assets/{Workspace-Q4g4rlRT.js → Workspace-In91z4W2.js} +1 -1
- package/dist/renderer/assets/{arrow-left-BySN_zhF.js → arrow-left-FBnVKKBl.js} +1 -1
- package/dist/renderer/assets/{book-open-BGlrnrTc.js → book-open-4_CuP6Sa.js} +1 -1
- package/dist/renderer/assets/{check-BiJogEa5.js → check-vsoVjvac.js} +1 -1
- package/dist/renderer/assets/{chevron-down-D2fHRJv6.js → chevron-down-DFpmFTJW.js} +1 -1
- package/dist/renderer/assets/{circle-CIcjixmI.js → circle-vRULegER.js} +1 -1
- package/dist/renderer/assets/{desktop-DAXY9Bxv.js → desktop-BkMW-h5p.js} +2 -2
- package/dist/renderer/assets/{desktop-DyA_NYew.js → desktop-ul0Tpzyc.js} +1 -1
- package/dist/renderer/assets/{funnel-BUzwb-id.js → funnel-Gu0E_hJ_.js} +1 -1
- package/dist/renderer/assets/{heart-DZEQ1z_V.js → heart-DsdofOHf.js} +1 -1
- package/dist/renderer/assets/{index-CB_KyLOr.js → index-BD3aCyBa.js} +3 -3
- package/dist/renderer/assets/{index-DgsIo4vJ.js → index-pJUFobU7.js} +1 -1
- package/dist/renderer/assets/{pencil-DGL4agcl.js → pencil-DbKmV8nD.js} +1 -1
- package/dist/renderer/assets/{play-DzasCLM4.js → play-BDMsRxSm.js} +1 -1
- package/dist/renderer/assets/{plug-dubNMe_m.js → plug-t2dMl78-.js} +1 -1
- package/dist/renderer/assets/{plus-DN4kML4k.js → plus-BUb6zOAe.js} +1 -1
- package/dist/renderer/assets/projects-4F6D_Q8t.js +1 -0
- package/dist/renderer/assets/{save-CNIc9tjl.js → save-C-_5rQdv.js} +1 -1
- package/dist/renderer/assets/{search-C0EGbF3I.js → search-R3ekHFPM.js} +1 -1
- package/dist/renderer/assets/{server-BMxQ4zmc.js → server-BTuvHf5n.js} +1 -1
- package/dist/renderer/assets/{session-utils-Bf5O-iMi.js → session-utils-ClX6VPFG.js} +1 -1
- package/dist/renderer/assets/{sessions-BMSs6rEI.js → sessions-AFKIC-ub.js} +1 -1
- package/dist/renderer/assets/{shield-check-i3Tf1TUz.js → shield-check-CqMW8CHe.js} +1 -1
- package/dist/renderer/assets/{trash-2-SKrcp18f.js → trash-2-BNLcHyUw.js} +1 -1
- package/dist/renderer/assets/{user-cNUZddjZ.js → user-BCCN8FYK.js} +1 -1
- package/dist/renderer/assets/{wifi-off-Dyb84ANR.js → wifi-off-BsNsx3oX.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 +666 -3
- 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 +15 -3
- package/dist-electron/services/local-ai-core/src/channel/lark/runtime-state.js +11 -0
- 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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CHANNEL_PROTOCOL_INSTRUCTION = exports.SCHEDULER_PROTOCOL_INSTRUCTION = exports.LOCALCORE_ACP_AGENT_TYPE = exports.DESKTOP_INTERACTIVE_PERMISSION_AGENT_TYPES = exports.DESKTOP_PROVIDER_THINKING_OPTIONS = exports.DESKTOP_PROVIDER_PRESET_OPTIONS = exports.DESKTOP_PLATFORM_TYPE_OPTIONS = exports.DESKTOP_AGENT_TYPE_OPTIONS = exports.DESKTOP_LARK_SDK_PACKAGE = exports.DESKTOP_CLAUDECODE_ACP_PACKAGE = exports.DESKTOP_CODEX_ACP_PACKAGE = exports.DEFAULT_DESKTOP_CLAUDECODE_MODEL = exports.DEFAULT_DESKTOP_OPENCODE_MODEL = exports.DEFAULT_DESKTOP_AGENT_TYPE = void 0;
|
|
3
|
+
exports.CHANNEL_PROTOCOL_INSTRUCTION = exports.SCHEDULER_PROTOCOL_INSTRUCTION = exports.LOCALCORE_ACP_AGENT_TYPE = exports.DESKTOP_INTERACTIVE_PERMISSION_AGENT_TYPES = exports.DESKTOP_PROVIDER_THINKING_OPTIONS = exports.DESKTOP_PROVIDER_PRESET_OPTIONS = exports.DESKTOP_PLATFORM_TYPE_OPTIONS = exports.DESKTOP_AGENT_TYPE_OPTIONS = exports.DESKTOP_LARK_SDK_PACKAGE = exports.DESKTOP_CLAUDECODE_ACP_PACKAGE = exports.DESKTOP_CODEX_ACP_PACKAGE = exports.DESKTOP_PI_CODING_AGENT_PACKAGE = exports.DESKTOP_PI_ACP_PACKAGE = exports.DEFAULT_DESKTOP_CLAUDECODE_MODEL = exports.DEFAULT_DESKTOP_OPENCODE_MODEL = exports.DEFAULT_DESKTOP_AGENT_TYPE = void 0;
|
|
4
4
|
exports.deriveDesktopRuntimePhase = deriveDesktopRuntimePhase;
|
|
5
5
|
exports.deriveDesktopRuntimeRoles = deriveDesktopRuntimeRoles;
|
|
6
6
|
exports.normalizeDesktopPlatformType = normalizeDesktopPlatformType;
|
|
@@ -12,13 +12,16 @@ exports.isPermissionButtonOption = isPermissionButtonOption;
|
|
|
12
12
|
exports.normalizeDesktopBridgeButtonOption = normalizeDesktopBridgeButtonOption;
|
|
13
13
|
exports.supportsInteractivePermission = supportsInteractivePermission;
|
|
14
14
|
exports.isAcpAgentType = isAcpAgentType;
|
|
15
|
-
exports.DEFAULT_DESKTOP_AGENT_TYPE = '
|
|
15
|
+
exports.DEFAULT_DESKTOP_AGENT_TYPE = 'pi';
|
|
16
16
|
exports.DEFAULT_DESKTOP_OPENCODE_MODEL = 'opencode/minimax-m2.5-free';
|
|
17
17
|
exports.DEFAULT_DESKTOP_CLAUDECODE_MODEL = '';
|
|
18
|
+
exports.DESKTOP_PI_ACP_PACKAGE = 'pi-acp';
|
|
19
|
+
exports.DESKTOP_PI_CODING_AGENT_PACKAGE = '@mariozechner/pi-coding-agent';
|
|
18
20
|
exports.DESKTOP_CODEX_ACP_PACKAGE = '@zed-industries/codex-acp';
|
|
19
21
|
exports.DESKTOP_CLAUDECODE_ACP_PACKAGE = '@agentclientprotocol/claude-agent-acp';
|
|
20
22
|
exports.DESKTOP_LARK_SDK_PACKAGE = '@larksuiteoapi/node-sdk';
|
|
21
23
|
exports.DESKTOP_AGENT_TYPE_OPTIONS = [
|
|
24
|
+
'pi',
|
|
22
25
|
'opencode',
|
|
23
26
|
'codex',
|
|
24
27
|
'claudecode',
|
|
@@ -53,7 +56,7 @@ exports.DESKTOP_PROVIDER_PRESET_OPTIONS = [
|
|
|
53
56
|
'ollama',
|
|
54
57
|
];
|
|
55
58
|
exports.DESKTOP_PROVIDER_THINKING_OPTIONS = ['', 'enabled', 'disabled'];
|
|
56
|
-
exports.DESKTOP_INTERACTIVE_PERMISSION_AGENT_TYPES = ['opencode', 'codex', 'claudecode', 'acp', 'localcore-acp'];
|
|
59
|
+
exports.DESKTOP_INTERACTIVE_PERMISSION_AGENT_TYPES = ['pi', 'opencode', 'codex', 'claudecode', 'acp', 'localcore-acp'];
|
|
57
60
|
exports.LOCALCORE_ACP_AGENT_TYPE = 'localcore-acp';
|
|
58
61
|
exports.SCHEDULER_PROTOCOL_INSTRUCTION = [
|
|
59
62
|
'[Scheduler Tools]',
|
|
@@ -235,6 +238,7 @@ function supportsInteractivePermission(agentType) {
|
|
|
235
238
|
function isAcpAgentType(agentType) {
|
|
236
239
|
const normalized = String(agentType || '').trim().toLowerCase();
|
|
237
240
|
return normalized === 'acp'
|
|
241
|
+
|| normalized === 'pi'
|
|
238
242
|
|| normalized === 'opencode'
|
|
239
243
|
|| normalized === 'codex'
|
|
240
244
|
|| normalized === 'claudecode'
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isInteractivePermissionMessage = isInteractivePermissionMessage;
|
|
4
|
+
exports.parseToolResultCard = parseToolResultCard;
|
|
5
|
+
exports.toolCallToResultCard = toolCallToResultCard;
|
|
6
|
+
exports.isEmptyRunningToolUpdateContent = isEmptyRunningToolUpdateContent;
|
|
7
|
+
exports.isHiddenProgressMessage = isHiddenProgressMessage;
|
|
8
|
+
exports.shouldCollapseToolResultByDefault = shouldCollapseToolResultByDefault;
|
|
9
|
+
exports.parsePermissionCardContent = parsePermissionCardContent;
|
|
10
|
+
const thread_chat_permission_1 = require("./thread-chat-permission");
|
|
11
|
+
function isInteractivePermissionMessage(message, pendingPermissionRequest) {
|
|
12
|
+
if (message.role === 'system') {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
return (0, thread_chat_permission_1.isStructuredPermissionMessage)({
|
|
16
|
+
id: message.id,
|
|
17
|
+
role: message.role,
|
|
18
|
+
actionMode: message.actionMode,
|
|
19
|
+
actionInteractive: message.actionInteractive,
|
|
20
|
+
}, pendingPermissionRequest);
|
|
21
|
+
}
|
|
22
|
+
function parseToolResultCard(content) {
|
|
23
|
+
const statusFirstMatch = content.match(/^\s*🔧\s*(.+?)\s*:\s*(running|completed|failed|error|cancelled|canceled)(?:\s*-\s*([\s\S]+?))?\s*$/i);
|
|
24
|
+
if (statusFirstMatch) {
|
|
25
|
+
const [, toolName, status, payload = ''] = statusFirstMatch;
|
|
26
|
+
return {
|
|
27
|
+
title: toolName.trim() || 'Tool call',
|
|
28
|
+
status: status.trim(),
|
|
29
|
+
output: parseToolResultPayload(payload),
|
|
30
|
+
label: /^running$/i.test(status) ? '工具调用' : '工具结果',
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
const namedStatusMatch = content.match(/^\s*🔧\s*(.+?)\s*:\s*([\s\S]*?)\s*-\s*(running|completed|failed|error|cancelled|canceled)(?:\s*-\s*([\s\S]+?))?\s*$/i);
|
|
34
|
+
if (namedStatusMatch) {
|
|
35
|
+
const [, toolName, detail, status, payload = ''] = namedStatusMatch;
|
|
36
|
+
const trimmedDetail = detail.trim();
|
|
37
|
+
return {
|
|
38
|
+
title: toolName.trim() || 'Tool call',
|
|
39
|
+
status: status.trim(),
|
|
40
|
+
output: parseToolResultPayload(payload),
|
|
41
|
+
label: /^running$/i.test(status) ? '工具调用' : '工具结果',
|
|
42
|
+
subtitle: trimmedDetail || undefined,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
const namedUpdateMatch = content.match(/^\s*🔧\s*(.+?)\s*:\s*(Tool update)\s*-\s*([^-]+?)\s*-\s*([\s\S]+?)\s*$/i);
|
|
46
|
+
if (namedUpdateMatch) {
|
|
47
|
+
const [, toolName, updateTitle, status, payload] = namedUpdateMatch;
|
|
48
|
+
const trimmedPayload = payload.trim();
|
|
49
|
+
try {
|
|
50
|
+
const parsed = JSON.parse(trimmedPayload);
|
|
51
|
+
const value = typeof parsed.output === 'string'
|
|
52
|
+
? parsed.output
|
|
53
|
+
: parsed.output ?? parsed.error ?? parsed;
|
|
54
|
+
return {
|
|
55
|
+
title: toolName.trim() || updateTitle,
|
|
56
|
+
status: status.trim(),
|
|
57
|
+
output: typeof value === 'string' ? value : JSON.stringify(value, null, 2),
|
|
58
|
+
label: '工具结果',
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return {
|
|
63
|
+
title: toolName.trim() || updateTitle,
|
|
64
|
+
status: status.trim(),
|
|
65
|
+
output: trimmedPayload,
|
|
66
|
+
label: '工具结果',
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const updateMatch = content.match(/^\s*(?:🔧\s*)?(Tool update)\s*-\s*([^-]+?)\s*-\s*([\s\S]+?)\s*$/i);
|
|
71
|
+
if (updateMatch) {
|
|
72
|
+
const [, title, status, payload] = updateMatch;
|
|
73
|
+
const trimmedPayload = payload.trim();
|
|
74
|
+
if (isEmptyRunningToolUpdateContent(title, status.trim(), trimmedPayload)) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
const parsed = JSON.parse(trimmedPayload);
|
|
79
|
+
const value = typeof parsed.output === 'string'
|
|
80
|
+
? parsed.output
|
|
81
|
+
: parsed.output ?? parsed.error ?? parsed;
|
|
82
|
+
return {
|
|
83
|
+
title,
|
|
84
|
+
status: status.trim(),
|
|
85
|
+
output: typeof value === 'string' ? value : JSON.stringify(value, null, 2),
|
|
86
|
+
label: '工具结果',
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return {
|
|
91
|
+
title,
|
|
92
|
+
status: status.trim(),
|
|
93
|
+
output: trimmedPayload,
|
|
94
|
+
label: '工具结果',
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const callMatch = content.match(/^\s*🔧\s*(.+?)\s*$/);
|
|
99
|
+
if (callMatch) {
|
|
100
|
+
const rawTitle = callMatch[1].trim();
|
|
101
|
+
if (/^Tool update\s*-\s*running(?:\s*-\s*)?$/i.test(rawTitle)) {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
const [name, ...rest] = rawTitle.split(':');
|
|
105
|
+
const output = rest.join(':').trim();
|
|
106
|
+
const statusMatch = output.match(/^(.*?)\s*-\s*(running|completed|failed|error|cancelled|canceled)\s*$/i);
|
|
107
|
+
return {
|
|
108
|
+
title: name.trim() || 'Tool call',
|
|
109
|
+
status: statusMatch?.[2]?.trim() || 'running',
|
|
110
|
+
output: statusMatch?.[1]?.trim() || output,
|
|
111
|
+
label: statusMatch && !/^running$/i.test(statusMatch[2]) ? '工具结果' : '工具调用',
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
function toolCallToResultCard(toolCall) {
|
|
117
|
+
if (!toolCall) {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
const status = toolCall.status.trim() || 'running';
|
|
121
|
+
return {
|
|
122
|
+
title: toolCall.name.trim() || 'Tool call',
|
|
123
|
+
status,
|
|
124
|
+
output: toolCall.output || '',
|
|
125
|
+
label: toolCall.label || (/^running$/i.test(status) ? '工具调用' : '工具结果'),
|
|
126
|
+
subtitle: toolCall.detail?.trim() || summarizeToolCallInput(toolCall.input),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
function summarizeToolCallInput(input) {
|
|
130
|
+
if (!input || typeof input !== 'object') {
|
|
131
|
+
return typeof input === 'string' && input.trim() ? input.trim() : undefined;
|
|
132
|
+
}
|
|
133
|
+
const record = input;
|
|
134
|
+
for (const key of ['command', 'cmd', 'path', 'file', 'query']) {
|
|
135
|
+
const value = record[key];
|
|
136
|
+
if (typeof value === 'string' && value.trim()) {
|
|
137
|
+
return value.trim();
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
const entries = Object.entries(record)
|
|
141
|
+
.filter(([, value]) => value !== undefined && value !== null && value !== '')
|
|
142
|
+
.slice(0, 2)
|
|
143
|
+
.map(([key, value]) => `${key}: ${typeof value === 'string' ? value : JSON.stringify(value)}`);
|
|
144
|
+
return entries.length > 0 ? entries.join(', ') : undefined;
|
|
145
|
+
}
|
|
146
|
+
function parseToolResultPayload(payload) {
|
|
147
|
+
const trimmedPayload = payload.trim();
|
|
148
|
+
if (!trimmedPayload) {
|
|
149
|
+
return '';
|
|
150
|
+
}
|
|
151
|
+
try {
|
|
152
|
+
const parsed = JSON.parse(trimmedPayload);
|
|
153
|
+
const value = typeof parsed.output === 'string'
|
|
154
|
+
? parsed.output
|
|
155
|
+
: parsed.output ?? parsed.error ?? parsed;
|
|
156
|
+
return typeof value === 'string' ? value : JSON.stringify(value, null, 2);
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
return trimmedPayload;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
function isEmptyRunningToolUpdateContent(title, status, payload) {
|
|
163
|
+
return /^Tool update$/i.test(title.trim()) && /^running$/i.test(status.trim()) && !payload.trim();
|
|
164
|
+
}
|
|
165
|
+
function isHiddenProgressMessage(content) {
|
|
166
|
+
const normalized = content.trim();
|
|
167
|
+
return /^🔧\s*Tool update\s*-\s*running(?:\s*-\s*)?$/i.test(normalized);
|
|
168
|
+
}
|
|
169
|
+
function shouldCollapseToolResultByDefault(card) {
|
|
170
|
+
return card.label === '工具结果' && Boolean(card.output.trim());
|
|
171
|
+
}
|
|
172
|
+
function parsePermissionCardContent(content) {
|
|
173
|
+
const lines = content
|
|
174
|
+
.split('\n')
|
|
175
|
+
.map((line) => line.trim())
|
|
176
|
+
.filter(Boolean);
|
|
177
|
+
const fallbackIndex = lines.findIndex((line) => line.includes('若按钮没有显示'));
|
|
178
|
+
const visibleLines = fallbackIndex >= 0 ? lines.slice(0, fallbackIndex) : lines;
|
|
179
|
+
const title = visibleLines[0] || '等待工具确认';
|
|
180
|
+
const bodyLines = visibleLines
|
|
181
|
+
.slice(1)
|
|
182
|
+
.filter((line) => !line.includes('请选择一个选项继续执行'));
|
|
183
|
+
return {
|
|
184
|
+
title,
|
|
185
|
+
bodyLines,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
@@ -150,6 +150,7 @@ function toMessagesFromThread(history) {
|
|
|
150
150
|
id: message.id || `${index}-${message.timestamp || message.role}`,
|
|
151
151
|
role: message.role === 'user' ? 'user' : message.role === 'system' ? 'system' : 'assistant',
|
|
152
152
|
content: message.role === 'user' ? extractVisibleMessageContent(message.content) : message.content,
|
|
153
|
+
toolCall: message.toolCall,
|
|
153
154
|
kind: message.kind === 'progress'
|
|
154
155
|
? 'progress'
|
|
155
156
|
: message.kind === 'system'
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toSelectedKnowledgeBases = toSelectedKnowledgeBases;
|
|
4
|
+
exports.filterKnowledgeBases = filterKnowledgeBases;
|
|
5
|
+
exports.orderKnowledgeBases = orderKnowledgeBases;
|
|
6
|
+
exports.getVisibleSessionGroups = getVisibleSessionGroups;
|
|
7
|
+
exports.getVisibleProjects = getVisibleProjects;
|
|
8
|
+
exports.hasVisibleSessions = hasVisibleSessions;
|
|
9
|
+
exports.toComposerPermissionCard = toComposerPermissionCard;
|
|
10
|
+
exports.shouldRenderThreadChatMessage = shouldRenderThreadChatMessage;
|
|
11
|
+
exports.getComposerPlaceholder = getComposerPlaceholder;
|
|
12
|
+
exports.canSubmitComposer = canSubmitComposer;
|
|
13
|
+
const thread_chat_message_blocks_1 = require("./thread-chat-message-blocks");
|
|
14
|
+
function toSelectedKnowledgeBases(knowledgeBaseIds, availableKnowledgeBases) {
|
|
15
|
+
return knowledgeBaseIds.map((knowledgeBaseId) => {
|
|
16
|
+
const matched = availableKnowledgeBases.find((base) => base.id === knowledgeBaseId);
|
|
17
|
+
return {
|
|
18
|
+
id: knowledgeBaseId,
|
|
19
|
+
name: matched?.name || knowledgeBaseId,
|
|
20
|
+
fileCount: matched?.fileCount || 0,
|
|
21
|
+
};
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
function filterKnowledgeBases(knowledgeBases, search) {
|
|
25
|
+
const query = search.trim().toLowerCase();
|
|
26
|
+
if (!query) {
|
|
27
|
+
return knowledgeBases;
|
|
28
|
+
}
|
|
29
|
+
return knowledgeBases.filter((base) => [base.name, base.description, base.id].join(' ').toLowerCase().includes(query));
|
|
30
|
+
}
|
|
31
|
+
function orderKnowledgeBases(knowledgeBases, selectedKnowledgeBaseIds) {
|
|
32
|
+
const selectedIds = new Set(selectedKnowledgeBaseIds);
|
|
33
|
+
return [...knowledgeBases].sort((a, b) => {
|
|
34
|
+
const aSelected = selectedIds.has(a.id);
|
|
35
|
+
const bSelected = selectedIds.has(b.id);
|
|
36
|
+
if (aSelected !== bSelected) {
|
|
37
|
+
return aSelected ? -1 : 1;
|
|
38
|
+
}
|
|
39
|
+
return a.name.localeCompare(b.name, 'zh-CN');
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
function getVisibleSessionGroups(sessionGroups, selectedProject) {
|
|
43
|
+
if (!selectedProject) {
|
|
44
|
+
return sessionGroups;
|
|
45
|
+
}
|
|
46
|
+
return sessionGroups.filter((group) => group.project === selectedProject);
|
|
47
|
+
}
|
|
48
|
+
function getVisibleProjects(projects, selectedProject) {
|
|
49
|
+
return selectedProject && !projects.includes(selectedProject) ? [selectedProject, ...projects] : projects;
|
|
50
|
+
}
|
|
51
|
+
function hasVisibleSessions(sessionGroups) {
|
|
52
|
+
return sessionGroups.some((group) => group.sessions.length > 0);
|
|
53
|
+
}
|
|
54
|
+
function toComposerPermissionCard(pendingPermissionRequest) {
|
|
55
|
+
if (!pendingPermissionRequest) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
id: pendingPermissionRequest.id,
|
|
60
|
+
content: pendingPermissionRequest.content,
|
|
61
|
+
actions: pendingPermissionRequest.actions,
|
|
62
|
+
actionReplyCtx: pendingPermissionRequest.actionReplyCtx,
|
|
63
|
+
actionPending: pendingPermissionRequest.actionPending,
|
|
64
|
+
actionStatus: pendingPermissionRequest.actionStatus,
|
|
65
|
+
actionMode: 'permission',
|
|
66
|
+
actionInteractive: true,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function shouldRenderThreadChatMessage(message, composerPermissionCard) {
|
|
70
|
+
if (message.kind === 'progress' && (0, thread_chat_message_blocks_1.isHiddenProgressMessage)(message.content)) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
return !(0, thread_chat_message_blocks_1.isInteractivePermissionMessage)(message, composerPermissionCard);
|
|
74
|
+
}
|
|
75
|
+
function getComposerPlaceholder(input) {
|
|
76
|
+
if (!input.serviceRunning) {
|
|
77
|
+
return input.startFirstPlaceholder;
|
|
78
|
+
}
|
|
79
|
+
if (!input.transportReady) {
|
|
80
|
+
return input.waitingRuntimePlaceholder;
|
|
81
|
+
}
|
|
82
|
+
if (input.taskState === 'awaiting_input') {
|
|
83
|
+
return 'Agent 正在等待你的回复,可直接继续输入。';
|
|
84
|
+
}
|
|
85
|
+
if (input.taskInputLocked) {
|
|
86
|
+
return '任务正在运行,点击停止可中断当前执行。';
|
|
87
|
+
}
|
|
88
|
+
return input.sendPlaceholder;
|
|
89
|
+
}
|
|
90
|
+
function canSubmitComposer(input) {
|
|
91
|
+
return Boolean(input.draft.trim() &&
|
|
92
|
+
input.serviceRunning &&
|
|
93
|
+
input.transportReady &&
|
|
94
|
+
!input.sending &&
|
|
95
|
+
input.selectedProject);
|
|
96
|
+
}
|
|
@@ -1,10 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.permissionSubmittedStatus = void 0;
|
|
3
4
|
exports.shouldEchoBridgeActionResponse = shouldEchoBridgeActionResponse;
|
|
5
|
+
exports.isStructuredPermissionMessage = isStructuredPermissionMessage;
|
|
4
6
|
exports.toPendingPermissionRequest = toPendingPermissionRequest;
|
|
7
|
+
exports.markPermissionMessageSubmitted = markPermissionMessageSubmitted;
|
|
8
|
+
exports.permissionSubmittedStatus = 'Permission sent. Waiting for the agent to continue…';
|
|
5
9
|
function shouldEchoBridgeActionResponse(message) {
|
|
6
10
|
return !(message.actionMode === 'permission' && message.actionInteractive);
|
|
7
11
|
}
|
|
12
|
+
function isStructuredPermissionMessage(message, pendingPermissionRequest) {
|
|
13
|
+
if (pendingPermissionRequest?.id === message.id) {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
return message.role !== 'user' && message.actionMode === 'permission' && Boolean(message.actionInteractive);
|
|
17
|
+
}
|
|
8
18
|
function toPendingPermissionRequest(message) {
|
|
9
19
|
if (!message.id ||
|
|
10
20
|
message.role !== 'assistant' ||
|
|
@@ -28,3 +38,11 @@ function toPendingPermissionRequest(message) {
|
|
|
28
38
|
actionInteractive: true,
|
|
29
39
|
};
|
|
30
40
|
}
|
|
41
|
+
function markPermissionMessageSubmitted(message) {
|
|
42
|
+
return {
|
|
43
|
+
...message,
|
|
44
|
+
actions: [],
|
|
45
|
+
actionPending: false,
|
|
46
|
+
actionStatus: exports.permissionSubmittedStatus,
|
|
47
|
+
};
|
|
48
|
+
}
|