@kafca/agentdock 0.1.25 → 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/dist/renderer/assets/{Badge-Bn2h-Qkf.js → Badge-qZHTUGI3.js} +1 -1
- package/dist/renderer/assets/{Chat-Cgo9aneg.js → Chat-W35BzaZk.js} +1 -1
- package/dist/renderer/assets/{ChatMarkdown-CYzHfSiR.js → ChatMarkdown-DxKT_YGp.js} +1 -1
- package/dist/renderer/assets/{Config-DljB2-eP.js → Config-COTX6LDN.js} +1 -1
- package/dist/renderer/assets/{CronList-DeVbiY9a.js → CronList-kxlfu9Iq.js} +1 -1
- package/dist/renderer/assets/{Dashboard-fSqx5sm8.js → Dashboard-Y4PGxzuV.js} +2 -2
- package/dist/renderer/assets/{EmptyState-DgqKDwlq.js → EmptyState-Cjq33EOF.js} +1 -1
- package/dist/renderer/assets/{KnowledgeDetail-u8s2SmPV.js → KnowledgeDetail-CztNt7i8.js} +1 -1
- package/dist/renderer/assets/{KnowledgeHome-BdQw8nbY.js → KnowledgeHome-BAOyy3I9.js} +1 -1
- package/dist/renderer/assets/{Logs-DSbndMpy.js → Logs-PRZ1IIEi.js} +1 -1
- package/dist/renderer/assets/{Modal-0d0EmAuK.js → Modal-B1rgqkBM.js} +1 -1
- package/dist/renderer/assets/{Page-CVbOH_Kh.js → Page-CjzAhgaU.js} +1 -1
- package/dist/renderer/assets/{ProjectDetail-C91tF7uA.js → ProjectDetail-XGh_5XxQ.js} +1 -1
- package/dist/renderer/assets/{ProjectList-D78Pc-BQ.js → ProjectList-BkPTpQRZ.js} +1 -1
- package/dist/renderer/assets/{Select-BbKzAIuO.js → Select-BZd1QJVw.js} +1 -1
- package/dist/renderer/assets/{SessionChat-BERvL5e4.js → SessionChat-C3sOTWGT.js} +1 -1
- package/dist/renderer/assets/{SessionList-Bomz335M.js → SessionList-B5WK1big.js} +1 -1
- package/dist/renderer/assets/{ThreadChat-CLr3amU2.js → ThreadChat-DWiBLHC7.js} +1 -1
- package/dist/renderer/assets/{Workspace-In91z4W2.js → Workspace-CQ64VK-o.js} +1 -1
- package/dist/renderer/assets/{arrow-left-FBnVKKBl.js → arrow-left-FLdaWHZ8.js} +1 -1
- package/dist/renderer/assets/{book-open-4_CuP6Sa.js → book-open-DaSioPS9.js} +1 -1
- package/dist/renderer/assets/{check-vsoVjvac.js → check-BiSmsuGR.js} +1 -1
- package/dist/renderer/assets/{chevron-down-DFpmFTJW.js → chevron-down-pZ2KjmDR.js} +1 -1
- package/dist/renderer/assets/{circle-vRULegER.js → circle-296S3nw9.js} +1 -1
- package/dist/renderer/assets/{desktop-ul0Tpzyc.js → desktop-88jgnOZV.js} +1 -1
- package/dist/renderer/assets/{funnel-Gu0E_hJ_.js → funnel-Dvz31PLy.js} +1 -1
- package/dist/renderer/assets/{heart-DsdofOHf.js → heart-D9mxSZVO.js} +1 -1
- package/dist/renderer/assets/{index-pJUFobU7.js → index-CZA4lqvM.js} +1 -1
- package/dist/renderer/assets/{index-BD3aCyBa.js → index-dOdOWAa2.js} +2 -2
- package/dist/renderer/assets/{pencil-DbKmV8nD.js → pencil-B2fRbaAo.js} +1 -1
- package/dist/renderer/assets/{play-BDMsRxSm.js → play-CWPRHypD.js} +1 -1
- package/dist/renderer/assets/{plug-t2dMl78-.js → plug-B7IBVwSo.js} +1 -1
- package/dist/renderer/assets/{plus-BUb6zOAe.js → plus-Cn3Awirs.js} +1 -1
- package/dist/renderer/assets/projects-CmCopAi6.js +1 -0
- package/dist/renderer/assets/{save-C-_5rQdv.js → save-MVjXRqom.js} +1 -1
- package/dist/renderer/assets/{search-R3ekHFPM.js → search-Bu5c7wTX.js} +1 -1
- package/dist/renderer/assets/{server-BTuvHf5n.js → server-aDvfqBg_.js} +1 -1
- package/dist/renderer/assets/{session-utils-ClX6VPFG.js → session-utils-DjDpjT9r.js} +1 -1
- package/dist/renderer/assets/{sessions-AFKIC-ub.js → sessions-D7dV8h0H.js} +1 -1
- package/dist/renderer/assets/{shield-check-CqMW8CHe.js → shield-check-DJdEhc_e.js} +1 -1
- package/dist/renderer/assets/{trash-2-BNLcHyUw.js → trash-2-BF3ejnXL.js} +1 -1
- package/dist/renderer/assets/{user-BCCN8FYK.js → user-BwuWCrin.js} +1 -1
- package/dist/renderer/assets/{wifi-off-BsNsx3oX.js → wifi-off-BahJZfDs.js} +1 -1
- package/dist/renderer/index.html +1 -1
- package/dist-electron/electron/local-core-refactor.test.js +131 -19
- package/dist-electron/services/local-ai-core/src/channel/lark/local-core-lark-gateway.js +30 -25
- package/dist-electron/services/local-ai-core/src/channel/lark/runtime-state.js +93 -12
- package/package.json +1 -1
- package/dist/renderer/assets/projects-4F6D_Q8t.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{z as t}from"./index-dOdOWAa2.js";const e=()=>t.get("/projects"),r=o=>t.get(`/projects/${o}`);export{r as g,e as l};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{z as o}from"./index-
|
|
1
|
+
import{z as o}from"./index-dOdOWAa2.js";const i=s=>o.get(`/projects/${s}/sessions`),c=(s,e,t)=>o.get(`/projects/${s}/sessions/${e}`,{history_limit:String(t)}),r=(s,e,t)=>o.patch(`/projects/${s}/sessions/${e}`,t),a=(s,e)=>o.delete(`/projects/${s}/sessions/${e}`),p=(s,e)=>o.post(`/projects/${s}/sessions/switch`,e),$=(s,e)=>o.post(`/projects/${s}/send`,e);export{$ as a,a as d,c as g,i as l,r,p as s};
|
package/dist/renderer/index.html
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<link rel="icon" type="image/svg+xml" href="./favicon.svg" />
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
7
|
<title>AgentDock</title>
|
|
8
|
-
<script type="module" crossorigin src="./assets/index-
|
|
8
|
+
<script type="module" crossorigin src="./assets/index-dOdOWAa2.js"></script>
|
|
9
9
|
<link rel="stylesheet" crossorigin href="./assets/index-DFiJR0vv.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body class="bg-[#f5f5f7] dark:bg-[#151516]">
|
|
@@ -1176,7 +1176,7 @@ const server_routes_js_1 = require("../services/local-ai-core/src/runtime/server
|
|
|
1176
1176
|
(0, node_fs_1.rmSync)(userDataPath, { recursive: true, force: true });
|
|
1177
1177
|
}
|
|
1178
1178
|
});
|
|
1179
|
-
(0, node_test_1.default)('lark bridge
|
|
1179
|
+
(0, node_test_1.default)('lark bridge sends completed thought once before final answer', async () => {
|
|
1180
1180
|
const createdCards = [];
|
|
1181
1181
|
const patchedCards = [];
|
|
1182
1182
|
const storedMessageIds = [];
|
|
@@ -1256,14 +1256,12 @@ const server_routes_js_1 = require("../services/local-ai-core/src/runtime/server
|
|
|
1256
1256
|
content: '最终回答',
|
|
1257
1257
|
});
|
|
1258
1258
|
strict_1.default.equal(createdCards.length, 2);
|
|
1259
|
-
strict_1.default.equal(createdCards[0]?.text, '💭
|
|
1259
|
+
strict_1.default.equal(createdCards[0]?.text, '💭 先理解问题,再检查代码');
|
|
1260
1260
|
strict_1.default.equal(createdCards[1]?.text, '最终回答');
|
|
1261
|
-
strict_1.default.equal(patchedCards.length,
|
|
1262
|
-
strict_1.default.equal(patchedCards[0]?.messageId, 'lark-msg-1');
|
|
1263
|
-
strict_1.default.equal(patchedCards[0]?.text, '💭 先理解问题,再检查代码');
|
|
1261
|
+
strict_1.default.equal(patchedCards.length, 0);
|
|
1264
1262
|
strict_1.default.deepEqual(storedMessageIds, ['lark-msg-2']);
|
|
1265
1263
|
});
|
|
1266
|
-
(0, node_test_1.default)('lark bridge
|
|
1264
|
+
(0, node_test_1.default)('lark bridge patches streamed final card with final reply', async () => {
|
|
1267
1265
|
const createdCards = [];
|
|
1268
1266
|
const patchedCards = [];
|
|
1269
1267
|
const storedMessageIds = [];
|
|
@@ -1334,11 +1332,103 @@ const server_routes_js_1 = require("../services/local-ai-core/src/runtime/server
|
|
|
1334
1332
|
replyCtx: 'run-1',
|
|
1335
1333
|
content: '真正最终回答',
|
|
1336
1334
|
});
|
|
1337
|
-
strict_1.default.deepEqual(createdCards.map((card) => card.text), ['流式中的最终回答草稿'
|
|
1338
|
-
strict_1.default.
|
|
1339
|
-
|
|
1335
|
+
strict_1.default.deepEqual(createdCards.map((card) => card.text), ['流式中的最终回答草稿']);
|
|
1336
|
+
strict_1.default.deepEqual(patchedCards, [
|
|
1337
|
+
{ messageId: 'lark-msg-1', text: '真正最终回答' },
|
|
1338
|
+
]);
|
|
1339
|
+
strict_1.default.deepEqual(storedMessageIds, ['lark-msg-1']);
|
|
1340
1340
|
});
|
|
1341
|
-
(0, node_test_1.default)('lark bridge
|
|
1341
|
+
(0, node_test_1.default)('lark bridge patches partial final card after tool progress', async () => {
|
|
1342
|
+
const createdCards = [];
|
|
1343
|
+
const patchedCards = [];
|
|
1344
|
+
const storedMessageIds = [];
|
|
1345
|
+
const client = {
|
|
1346
|
+
im: {
|
|
1347
|
+
message: {
|
|
1348
|
+
create: async (request) => {
|
|
1349
|
+
const messageId = `lark-msg-${createdCards.length + 1}`;
|
|
1350
|
+
const card = JSON.parse(String(request.data.content || '{}'));
|
|
1351
|
+
createdCards.push({
|
|
1352
|
+
messageId,
|
|
1353
|
+
text: String(card.elements?.[0]?.content || ''),
|
|
1354
|
+
});
|
|
1355
|
+
return { data: { message_id: messageId } };
|
|
1356
|
+
},
|
|
1357
|
+
patch: async (request) => {
|
|
1358
|
+
const card = JSON.parse(String(request.data.content || '{}'));
|
|
1359
|
+
patchedCards.push({
|
|
1360
|
+
messageId: String(request.path.message_id || ''),
|
|
1361
|
+
text: String(card.elements?.[0]?.content || ''),
|
|
1362
|
+
});
|
|
1363
|
+
},
|
|
1364
|
+
},
|
|
1365
|
+
},
|
|
1366
|
+
};
|
|
1367
|
+
const gateway = new local_core_lark_gateway_js_1.LocalCoreLarkGateway({
|
|
1368
|
+
store: {
|
|
1369
|
+
getPlatformThreadBinding: () => ({
|
|
1370
|
+
workspace_id: 'default',
|
|
1371
|
+
platform: 'lark',
|
|
1372
|
+
chat_id: 'chat-1',
|
|
1373
|
+
platform_user_id: 'user-1',
|
|
1374
|
+
thread_id: 'thread-1',
|
|
1375
|
+
last_platform_message_id: null,
|
|
1376
|
+
}),
|
|
1377
|
+
updatePlatformThreadMessageId: (_workspaceId, _chatId, _platformUserId, messageId) => {
|
|
1378
|
+
storedMessageIds.push(messageId);
|
|
1379
|
+
},
|
|
1380
|
+
},
|
|
1381
|
+
readConfig: async () => null,
|
|
1382
|
+
getWorkspaceRouter: () => ({}),
|
|
1383
|
+
eventBus: { emit: () => { }, on: () => () => { } },
|
|
1384
|
+
});
|
|
1385
|
+
const internals = gateway;
|
|
1386
|
+
internals.runtime.set('default', {
|
|
1387
|
+
workspaceId: 'default',
|
|
1388
|
+
enabled: true,
|
|
1389
|
+
status: 'running',
|
|
1390
|
+
connected: true,
|
|
1391
|
+
appId: 'app-1',
|
|
1392
|
+
client,
|
|
1393
|
+
});
|
|
1394
|
+
internals.threadRouting.set('session:thread-1', {
|
|
1395
|
+
workspaceId: 'default',
|
|
1396
|
+
platformUserId: 'user-1',
|
|
1397
|
+
chatId: 'chat-1',
|
|
1398
|
+
threadId: 'thread-1',
|
|
1399
|
+
});
|
|
1400
|
+
await gateway.onBridgeEvent({
|
|
1401
|
+
type: 'update_message',
|
|
1402
|
+
sessionKey: 'session:thread-1',
|
|
1403
|
+
replyCtx: 'run-1',
|
|
1404
|
+
content: '好的,文件存在,现在发送给你:已',
|
|
1405
|
+
});
|
|
1406
|
+
await gateway.onBridgeEvent({
|
|
1407
|
+
type: 'reply',
|
|
1408
|
+
sessionKey: 'session:thread-1',
|
|
1409
|
+
replyCtx: 'run-1',
|
|
1410
|
+
messageId: 'tool-1',
|
|
1411
|
+
content: '🔧 bash: completed - Sent file CLAUDE.md to chat-1: msg-file-1',
|
|
1412
|
+
});
|
|
1413
|
+
await gateway.onBridgeEvent({
|
|
1414
|
+
type: 'reply',
|
|
1415
|
+
sessionKey: 'session:thread-1',
|
|
1416
|
+
replyCtx: 'run-1',
|
|
1417
|
+
content: '好的,文件存在,现在发送给你:已发送!`CLAUDE.md` 文件已经发出去了,请查收',
|
|
1418
|
+
});
|
|
1419
|
+
strict_1.default.deepEqual(createdCards.map((card) => card.text), [
|
|
1420
|
+
'好的,文件存在,现在发送给你:已',
|
|
1421
|
+
'🔧 bash',
|
|
1422
|
+
]);
|
|
1423
|
+
strict_1.default.deepEqual(patchedCards, [
|
|
1424
|
+
{
|
|
1425
|
+
messageId: 'lark-msg-1',
|
|
1426
|
+
text: '好的,文件存在,现在发送给你:已发送!`CLAUDE.md` 文件已经发出去了,请查收',
|
|
1427
|
+
},
|
|
1428
|
+
]);
|
|
1429
|
+
strict_1.default.deepEqual(storedMessageIds, ['lark-msg-1']);
|
|
1430
|
+
});
|
|
1431
|
+
(0, node_test_1.default)('lark bridge does not stream thought updates before completion', async () => {
|
|
1342
1432
|
const createdCards = [];
|
|
1343
1433
|
const patchedCards = [];
|
|
1344
1434
|
const client = {
|
|
@@ -1425,10 +1515,8 @@ const server_routes_js_1 = require("../services/local-ai-core/src/runtime/server
|
|
|
1425
1515
|
sessionKey: 'session:thread-1',
|
|
1426
1516
|
replyCtx: 'run-1',
|
|
1427
1517
|
});
|
|
1428
|
-
strict_1.default.deepEqual(createdCards.map((card) => card.text), ['💭 The user']);
|
|
1429
|
-
strict_1.default.deepEqual(patchedCards.map((card) => card.text), [
|
|
1430
|
-
'💭 The user sent a short casual message.',
|
|
1431
|
-
]);
|
|
1518
|
+
strict_1.default.deepEqual(createdCards.map((card) => card.text), ['💭 The user sent a short casual message. I should reply briefly.']);
|
|
1519
|
+
strict_1.default.deepEqual(patchedCards.map((card) => card.text), []);
|
|
1432
1520
|
strict_1.default.ok(!createdCards.some((card) => /处理中|正在思考/.test(card.text)));
|
|
1433
1521
|
});
|
|
1434
1522
|
(0, node_test_1.default)('lark permission requests render as clickable card buttons', async () => {
|
|
@@ -1653,7 +1741,7 @@ const server_routes_js_1 = require("../services/local-ai-core/src/runtime/server
|
|
|
1653
1741
|
strict_1.default.equal(createdCards.length, 1);
|
|
1654
1742
|
strict_1.default.match(createdCards[0]?.card?.elements?.[0]?.content || '', /桌面文件列表/);
|
|
1655
1743
|
});
|
|
1656
|
-
(0, node_test_1.default)('lark channel
|
|
1744
|
+
(0, node_test_1.default)('lark channel sends tool name and parameters once without streaming output', async () => {
|
|
1657
1745
|
const createdCards = [];
|
|
1658
1746
|
const patchedCards = [];
|
|
1659
1747
|
const client = {
|
|
@@ -1704,10 +1792,34 @@ const server_routes_js_1 = require("../services/local-ai-core/src/runtime/server
|
|
|
1704
1792
|
sessionKey: 'session:thread-1',
|
|
1705
1793
|
replyCtx: 'run-1',
|
|
1706
1794
|
messageId: 'tool-1',
|
|
1707
|
-
content: '🔧 Terminal
|
|
1795
|
+
content: '🔧 Terminal',
|
|
1796
|
+
toolCall: {
|
|
1797
|
+
id: 'tool-1',
|
|
1798
|
+
name: 'Terminal',
|
|
1799
|
+
status: 'running',
|
|
1800
|
+
input: { command: 'ls ~/Desktop' },
|
|
1801
|
+
output: '',
|
|
1802
|
+
},
|
|
1708
1803
|
});
|
|
1709
|
-
|
|
1710
|
-
|
|
1804
|
+
await gateway.onBridgeEvent({
|
|
1805
|
+
type: 'reply',
|
|
1806
|
+
sessionKey: 'session:thread-1',
|
|
1807
|
+
replyCtx: 'run-1',
|
|
1808
|
+
messageId: 'tool-1',
|
|
1809
|
+
content: '🔧 Terminal: ls ~/Desktop - completed - secret terminal output',
|
|
1810
|
+
toolCall: {
|
|
1811
|
+
id: 'tool-1',
|
|
1812
|
+
name: 'Terminal',
|
|
1813
|
+
status: 'completed',
|
|
1814
|
+
input: { command: 'ls ~/Desktop' },
|
|
1815
|
+
output: 'secret terminal output',
|
|
1816
|
+
},
|
|
1817
|
+
});
|
|
1818
|
+
const text = createdCards[0]?.elements?.[0]?.content || '';
|
|
1819
|
+
strict_1.default.match(text, /🔧 Terminal/);
|
|
1820
|
+
strict_1.default.match(text, /参数:`\{"command":"ls ~\/Desktop"\}`/);
|
|
1821
|
+
strict_1.default.equal(patchedCards.length, 0);
|
|
1822
|
+
strict_1.default.doesNotMatch(text, /completed/);
|
|
1711
1823
|
strict_1.default.doesNotMatch(text, /secret terminal output/);
|
|
1712
1824
|
});
|
|
1713
1825
|
(0, node_test_1.default)('lark card action message id can be extracted from full callback payload', async () => {
|
|
@@ -2376,7 +2488,7 @@ const server_routes_js_1 = require("../services/local-ai-core/src/runtime/server
|
|
|
2376
2488
|
previewHandle: 'tool-1',
|
|
2377
2489
|
content: '🔧 bash: Tool update - completed - verbose output',
|
|
2378
2490
|
});
|
|
2379
|
-
strict_1.default.equal(completed.text, '🔧 bash: Tool update
|
|
2491
|
+
strict_1.default.equal(completed.text, '🔧 bash: Tool update');
|
|
2380
2492
|
});
|
|
2381
2493
|
(0, node_test_1.default)('ACP skips empty generic running tool updates', () => {
|
|
2382
2494
|
const appended = [];
|
|
@@ -471,34 +471,39 @@ class LocalCoreLarkGateway extends node_events_1.EventEmitter {
|
|
|
471
471
|
return;
|
|
472
472
|
}
|
|
473
473
|
this.consumeBridgeEvent(turn, event);
|
|
474
|
-
const
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
474
|
+
const renderedMessages = (0, runtime_state_js_1.renderLarkBridgeEventMessages)(turn, event);
|
|
475
|
+
for (const renderedMessage of renderedMessages) {
|
|
476
|
+
if (!renderedMessage.text && renderedMessage.buttonRows.length === 0) {
|
|
477
|
+
this.options.log?.(`localcore-lark bridge event produced empty render for sessionKey=${sessionKey} type=${event.type}`);
|
|
478
|
+
continue;
|
|
479
|
+
}
|
|
480
|
+
const existingMessageId = (0, runtime_state_js_1.getLarkRenderedMessageId)(turn, renderedMessage);
|
|
481
|
+
const shouldThrottle = event.type === 'update_message' &&
|
|
482
|
+
existingMessageId &&
|
|
483
|
+
Date.now() - (turn.lastPatchedAtByMessageId[existingMessageId] || 0) < (renderedMessage.isFinal ? LARK_FINAL_PATCH_INTERVAL_MS : LARK_PROGRESS_PATCH_INTERVAL_MS);
|
|
484
|
+
this.options.log?.(`localcore-lark bridge event type=${event.type} sessionKey=${sessionKey} hasMessageId=${Boolean(existingMessageId)} throttle=${shouldThrottle}`);
|
|
485
|
+
if (shouldThrottle) {
|
|
486
|
+
continue;
|
|
487
|
+
}
|
|
488
|
+
if (existingMessageId && renderedMessage.updatePolicy === 'create-only') {
|
|
489
|
+
continue;
|
|
490
|
+
}
|
|
491
|
+
if (!existingMessageId) {
|
|
492
|
+
const createdId = await this.sendTextAsCard(state, route.chatId, renderedMessage.text, renderedMessage.buttonRows, sessionKey, binding.thread_id);
|
|
493
|
+
if (createdId) {
|
|
494
|
+
(0, runtime_state_js_1.setLarkRenderedMessageId)(turn, renderedMessage, createdId);
|
|
495
|
+
if (renderedMessage.isFinal) {
|
|
496
|
+
this.options.store.updatePlatformThreadMessageId(route.workspaceId, route.chatId, route.platformUserId, createdId, routePlatformKey);
|
|
497
|
+
}
|
|
498
|
+
this.options.log?.(`localcore-lark sent new card message ${createdId} for sessionKey=${sessionKey}`);
|
|
493
499
|
}
|
|
494
|
-
|
|
500
|
+
continue;
|
|
495
501
|
}
|
|
496
|
-
|
|
502
|
+
await this.patchTextCard(state, existingMessageId, renderedMessage.text, renderedMessage.buttonRows, sessionKey, binding.thread_id);
|
|
503
|
+
turn.lastPatchedAt = Date.now();
|
|
504
|
+
turn.lastPatchedAtByMessageId[existingMessageId] = turn.lastPatchedAt;
|
|
505
|
+
this.options.log?.(`localcore-lark patched card message ${existingMessageId} for sessionKey=${sessionKey}`);
|
|
497
506
|
}
|
|
498
|
-
await this.patchTextCard(state, existingMessageId, rendered.text, rendered.buttonRows, sessionKey, binding.thread_id);
|
|
499
|
-
turn.lastPatchedAt = Date.now();
|
|
500
|
-
turn.lastPatchedAtByMessageId[existingMessageId] = turn.lastPatchedAt;
|
|
501
|
-
this.options.log?.(`localcore-lark patched card message ${existingMessageId} for sessionKey=${sessionKey}`);
|
|
502
507
|
}
|
|
503
508
|
catch (error) {
|
|
504
509
|
this.options.log?.(`localcore-lark bridge send failed for sessionKey=${sessionKey}: ${error instanceof Error ? error.message : String(error)}`);
|
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createLarkTurnState = createLarkTurnState;
|
|
4
4
|
exports.foldToolResultForLark = foldToolResultForLark;
|
|
5
|
+
exports.summarizeToolCallForLark = summarizeToolCallForLark;
|
|
5
6
|
exports.isPendingToolProgressForLark = isPendingToolProgressForLark;
|
|
6
7
|
exports.consumeLarkBridgeEvent = consumeLarkBridgeEvent;
|
|
7
8
|
exports.renderLarkBridgeEventMessage = renderLarkBridgeEventMessage;
|
|
9
|
+
exports.renderLarkBridgeEventMessages = renderLarkBridgeEventMessages;
|
|
8
10
|
exports.getLarkRenderedMessageId = getLarkRenderedMessageId;
|
|
9
11
|
exports.setLarkRenderedMessageId = setLarkRenderedMessageId;
|
|
10
12
|
function createLarkTurnState(sessionKey, sourceMessageId) {
|
|
@@ -17,6 +19,8 @@ function createLarkTurnState(sessionKey, sourceMessageId) {
|
|
|
17
19
|
finalText: '',
|
|
18
20
|
progressMessageIds: {},
|
|
19
21
|
thinkingSteps: [],
|
|
22
|
+
pendingThoughtKey: undefined,
|
|
23
|
+
pendingThoughtText: undefined,
|
|
20
24
|
toolCalls: [],
|
|
21
25
|
statusLines: [],
|
|
22
26
|
buttonRows: [],
|
|
@@ -34,6 +38,17 @@ function foldToolResultForLark(content) {
|
|
|
34
38
|
return normalized;
|
|
35
39
|
return parts.slice(0, 2).join(' - ');
|
|
36
40
|
}
|
|
41
|
+
function summarizeToolCallForLark(event, content) {
|
|
42
|
+
const toolCall = event.toolCall;
|
|
43
|
+
if (toolCall) {
|
|
44
|
+
const name = String(toolCall.name || '').trim() || summarizeToolContentForLark(content);
|
|
45
|
+
const input = formatToolInputForLark(toolCall.input);
|
|
46
|
+
return [name.startsWith('🔧 ') ? name : `🔧 ${name}`, input ? `参数:${input}` : '']
|
|
47
|
+
.filter(Boolean)
|
|
48
|
+
.join('\n\n');
|
|
49
|
+
}
|
|
50
|
+
return summarizeToolContentForLark(content);
|
|
51
|
+
}
|
|
37
52
|
function isPendingToolProgressForLark(content) {
|
|
38
53
|
const normalized = foldToolResultForLark(content).toLowerCase();
|
|
39
54
|
return normalized.startsWith('🔧 ') && normalized.includes(' - pending');
|
|
@@ -50,6 +65,8 @@ function consumeLarkBridgeEvent(turn, event, options) {
|
|
|
50
65
|
turn.previewText = '';
|
|
51
66
|
turn.finalText = '';
|
|
52
67
|
turn.thinkingSteps = [];
|
|
68
|
+
turn.pendingThoughtKey = undefined;
|
|
69
|
+
turn.pendingThoughtText = undefined;
|
|
53
70
|
turn.toolCalls = [];
|
|
54
71
|
turn.buttonRows = [];
|
|
55
72
|
turn.statusLines = [];
|
|
@@ -61,6 +78,12 @@ function consumeLarkBridgeEvent(turn, event, options) {
|
|
|
61
78
|
return;
|
|
62
79
|
}
|
|
63
80
|
if (event.type === 'preview_start' || event.type === 'update_message') {
|
|
81
|
+
if (content.startsWith('💭 ')) {
|
|
82
|
+
turn.pendingThoughtKey = event.previewHandle || 'thinking-preview';
|
|
83
|
+
turn.pendingThoughtText = content;
|
|
84
|
+
pushUniqueLarkTurnLine(turn.thinkingSteps, content.slice(3).trim());
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
64
87
|
turn.previewText = content;
|
|
65
88
|
return;
|
|
66
89
|
}
|
|
@@ -82,6 +105,8 @@ function consumeLarkBridgeEvent(turn, event, options) {
|
|
|
82
105
|
return;
|
|
83
106
|
}
|
|
84
107
|
if (content.startsWith('💭 ')) {
|
|
108
|
+
turn.pendingThoughtKey = progressKey('thinking', event);
|
|
109
|
+
turn.pendingThoughtText = content;
|
|
85
110
|
pushUniqueLarkTurnLine(turn.thinkingSteps, content.slice(3).trim());
|
|
86
111
|
return;
|
|
87
112
|
}
|
|
@@ -100,13 +125,13 @@ function renderLarkBridgeEventMessage(turn, event) {
|
|
|
100
125
|
const content = foldToolResultForLark(String(event.content || '').trim());
|
|
101
126
|
if (event.type === 'preview_start' || event.type === 'update_message') {
|
|
102
127
|
if (content.startsWith('💭 ')) {
|
|
103
|
-
return
|
|
128
|
+
return { key: 'noop', text: '', buttonRows: [], isFinal: false };
|
|
104
129
|
}
|
|
105
130
|
if (content.startsWith('🔧 ')) {
|
|
106
131
|
if (isPendingToolProgressForLark(content)) {
|
|
107
132
|
return { key: 'noop', text: '', buttonRows: [], isFinal: false };
|
|
108
133
|
}
|
|
109
|
-
return
|
|
134
|
+
return renderToolMessage(progressKey('tool', event), summarizeToolCallForLark(event, content));
|
|
110
135
|
}
|
|
111
136
|
return {
|
|
112
137
|
key: 'final',
|
|
@@ -121,13 +146,13 @@ function renderLarkBridgeEventMessage(turn, event) {
|
|
|
121
146
|
}
|
|
122
147
|
if (event.type === 'reply') {
|
|
123
148
|
if (content.startsWith('💭 ')) {
|
|
124
|
-
return
|
|
149
|
+
return { key: 'noop', text: '', buttonRows: [], isFinal: false };
|
|
125
150
|
}
|
|
126
151
|
if (content.startsWith('🔧 ')) {
|
|
127
152
|
if (isPendingToolProgressForLark(content)) {
|
|
128
153
|
return { key: 'noop', text: '', buttonRows: [], isFinal: false };
|
|
129
154
|
}
|
|
130
|
-
return
|
|
155
|
+
return renderToolMessage(progressKey('tool', event), summarizeToolCallForLark(event, content));
|
|
131
156
|
}
|
|
132
157
|
if (content.startsWith('⏳ ') || content.startsWith('📤 ')) {
|
|
133
158
|
return renderProgressMessage(progressKey('status', event), content);
|
|
@@ -150,23 +175,35 @@ function renderLarkBridgeEventMessage(turn, event) {
|
|
|
150
175
|
isFinal: false,
|
|
151
176
|
};
|
|
152
177
|
}
|
|
178
|
+
function renderLarkBridgeEventMessages(turn, event) {
|
|
179
|
+
const rendered = renderLarkBridgeEventMessage(turn, event);
|
|
180
|
+
if (isThoughtBridgeEvent(event)) {
|
|
181
|
+
return [rendered];
|
|
182
|
+
}
|
|
183
|
+
const pendingThought = takePendingLarkThoughtRender(turn);
|
|
184
|
+
return pendingThought ? [pendingThought, rendered] : [rendered];
|
|
185
|
+
}
|
|
186
|
+
function takePendingLarkThoughtRender(turn) {
|
|
187
|
+
const text = String(turn.pendingThoughtText || '').trim();
|
|
188
|
+
if (!text) {
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
const rendered = renderProgressMessage(turn.pendingThoughtKey || 'thinking-preview', text);
|
|
192
|
+
turn.pendingThoughtKey = undefined;
|
|
193
|
+
turn.pendingThoughtText = undefined;
|
|
194
|
+
return rendered;
|
|
195
|
+
}
|
|
153
196
|
function getLarkRenderedMessageId(turn, rendered) {
|
|
154
197
|
if (rendered.isFinal) {
|
|
155
|
-
|
|
156
|
-
return turn.replyMessageId;
|
|
157
|
-
}
|
|
158
|
-
return turn.finalMessageId || turn.messageId;
|
|
198
|
+
return turn.finalMessageId || turn.messageId || turn.replyMessageId;
|
|
159
199
|
}
|
|
160
200
|
return turn.progressMessageIds[rendered.key];
|
|
161
201
|
}
|
|
162
202
|
function setLarkRenderedMessageId(turn, rendered, messageId) {
|
|
163
203
|
if (rendered.isFinal) {
|
|
164
|
-
if (rendered.finalSource === 'reply') {
|
|
165
|
-
turn.replyMessageId = messageId;
|
|
166
|
-
return;
|
|
167
|
-
}
|
|
168
204
|
turn.finalMessageId = messageId;
|
|
169
205
|
turn.messageId = messageId;
|
|
206
|
+
turn.replyMessageId = messageId;
|
|
170
207
|
return;
|
|
171
208
|
}
|
|
172
209
|
turn.progressMessageIds[rendered.key] = messageId;
|
|
@@ -179,6 +216,12 @@ function renderProgressMessage(key, text) {
|
|
|
179
216
|
isFinal: false,
|
|
180
217
|
};
|
|
181
218
|
}
|
|
219
|
+
function renderToolMessage(key, text) {
|
|
220
|
+
return {
|
|
221
|
+
...renderProgressMessage(key, text),
|
|
222
|
+
updatePolicy: 'create-only',
|
|
223
|
+
};
|
|
224
|
+
}
|
|
182
225
|
function progressKey(prefix, event) {
|
|
183
226
|
const stableId = String(event.messageId || event.previewHandle || '').trim();
|
|
184
227
|
if (stableId) {
|
|
@@ -187,6 +230,44 @@ function progressKey(prefix, event) {
|
|
|
187
230
|
const content = String(event.content || '').trim().replace(/\s+/g, ' ');
|
|
188
231
|
return `${prefix}:${content.slice(0, 120)}`;
|
|
189
232
|
}
|
|
233
|
+
function isThoughtBridgeEvent(event) {
|
|
234
|
+
if (event.type !== 'preview_start' && event.type !== 'update_message' && event.type !== 'reply') {
|
|
235
|
+
return false;
|
|
236
|
+
}
|
|
237
|
+
return String(event.content || '').trim().startsWith('💭 ');
|
|
238
|
+
}
|
|
239
|
+
function summarizeToolContentForLark(content) {
|
|
240
|
+
const normalized = String(content || '').trim();
|
|
241
|
+
if (!normalized.startsWith('🔧 ')) {
|
|
242
|
+
return normalized;
|
|
243
|
+
}
|
|
244
|
+
const withoutOutput = normalized.split(' - ')[0]?.trim() || normalized;
|
|
245
|
+
return withoutOutput
|
|
246
|
+
.replace(/\s+-\s*(running|pending|completed|failed|error|cancelled|canceled)\s*$/i, '')
|
|
247
|
+
.replace(/:\s*(running|pending|completed|failed|error|cancelled|canceled)\s*$/i, '')
|
|
248
|
+
.trim();
|
|
249
|
+
}
|
|
250
|
+
function formatToolInputForLark(input) {
|
|
251
|
+
if (input == null) {
|
|
252
|
+
return '';
|
|
253
|
+
}
|
|
254
|
+
if (typeof input === 'string') {
|
|
255
|
+
return inlineCode(input);
|
|
256
|
+
}
|
|
257
|
+
try {
|
|
258
|
+
return inlineCode(JSON.stringify(input));
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
return inlineCode(String(input));
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
function inlineCode(value) {
|
|
265
|
+
const normalized = value.trim();
|
|
266
|
+
if (!normalized) {
|
|
267
|
+
return '';
|
|
268
|
+
}
|
|
269
|
+
return `\`${normalized.replace(/`/g, '\\`')}\``;
|
|
270
|
+
}
|
|
190
271
|
function pushUniqueLarkTurnLine(target, value) {
|
|
191
272
|
const normalized = value.trim();
|
|
192
273
|
if (!normalized) {
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{z as t}from"./index-BD3aCyBa.js";const e=()=>t.get("/projects"),r=o=>t.get(`/projects/${o}`);export{r as g,e as l};
|