@kafca/agentdock 0.1.39 → 0.1.41

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 (57) hide show
  1. package/README.md +5 -0
  2. package/dist/renderer/assets/{Badge-B8Arb9Yy.js → Badge-BX3RC8l6.js} +1 -1
  3. package/dist/renderer/assets/{Chat-BpHN2UcX.js → Chat-DJwIciel.js} +1 -1
  4. package/dist/renderer/assets/{ChatMarkdown-C_zHbGhg.js → ChatMarkdown-DfGbRR0S.js} +1 -1
  5. package/dist/renderer/assets/{Config-357M6MbD.js → Config-2x2RDL3j.js} +1 -1
  6. package/dist/renderer/assets/{CronList-BHgDIhFo.js → CronList-C6nPAmEo.js} +1 -1
  7. package/dist/renderer/assets/{Dashboard-CZQj79ep.js → Dashboard-2Wcx_bvJ.js} +2 -2
  8. package/dist/renderer/assets/{EmptyState-DpSPN3kz.js → EmptyState-DoCpF2tn.js} +1 -1
  9. package/dist/renderer/assets/{KnowledgeDetail-Cbv2Oje7.js → KnowledgeDetail-CBRu2bXX.js} +1 -1
  10. package/dist/renderer/assets/{KnowledgeHome-CEbNw_Za.js → KnowledgeHome-CItdlDVR.js} +1 -1
  11. package/dist/renderer/assets/{Logs-IXayiVGS.js → Logs-Cd_7ZOXc.js} +1 -1
  12. package/dist/renderer/assets/{Modal-BTKWx2e5.js → Modal-B4eOiBsB.js} +1 -1
  13. package/dist/renderer/assets/{Page-DCDVvqIU.js → Page-C5VH4D9U.js} +1 -1
  14. package/dist/renderer/assets/{ProjectDetail-C6as_oba.js → ProjectDetail-D_DA--IP.js} +1 -1
  15. package/dist/renderer/assets/{ProjectList-DJfBaPyw.js → ProjectList-CtCXJ50u.js} +1 -1
  16. package/dist/renderer/assets/{Select-BYijPrOF.js → Select-B6E68LcN.js} +1 -1
  17. package/dist/renderer/assets/{SessionChat-KapIGn1O.js → SessionChat-D1HtMdQS.js} +1 -1
  18. package/dist/renderer/assets/{SessionList-C0ATtS_m.js → SessionList-Do-5-Xx6.js} +1 -1
  19. package/dist/renderer/assets/{ThreadChat-CKWcyHia.js → ThreadChat-B1tEtE3V.js} +1 -1
  20. package/dist/renderer/assets/{Workspace-MYHdNNV2.js → Workspace-BlhS2RFw.js} +1 -1
  21. package/dist/renderer/assets/{arrow-left-Dl2cYCYQ.js → arrow-left-DF1_F9Pk.js} +1 -1
  22. package/dist/renderer/assets/{book-open-CJCjYKCj.js → book-open-DxRTGpWO.js} +1 -1
  23. package/dist/renderer/assets/{check-Cknz-_NI.js → check-BAqPPYkf.js} +1 -1
  24. package/dist/renderer/assets/{chevron-down-v4poAoll.js → chevron-down-DIZZgSb3.js} +1 -1
  25. package/dist/renderer/assets/{circle-BnxuF8S1.js → circle-B5raL_XK.js} +1 -1
  26. package/dist/renderer/assets/{desktop-B9xqa1yi.js → desktop-CFcnzwcY.js} +1 -1
  27. package/dist/renderer/assets/{funnel-Cl1EldnW.js → funnel-BPjLpVSB.js} +1 -1
  28. package/dist/renderer/assets/{heart-274KWkSA.js → heart-D2M1xN1N.js} +1 -1
  29. package/dist/renderer/assets/{index-GaRPrxQn.js → index-BijJAYmo.js} +1 -1
  30. package/dist/renderer/assets/{index-CAi_EMRl.js → index-Cx71F_Lz.js} +2 -2
  31. package/dist/renderer/assets/{pencil-BfYhgp9_.js → pencil-DlDr8Mmp.js} +1 -1
  32. package/dist/renderer/assets/{play-CLir9KyW.js → play-BOEG_mY8.js} +1 -1
  33. package/dist/renderer/assets/{plug-CTKL_TK4.js → plug-BI27elC-.js} +1 -1
  34. package/dist/renderer/assets/{plus-9pP7UU-H.js → plus-BhURuFIQ.js} +1 -1
  35. package/dist/renderer/assets/projects-DpR972HM.js +1 -0
  36. package/dist/renderer/assets/{save-DZOLXcQU.js → save-RwkHNm9e.js} +1 -1
  37. package/dist/renderer/assets/{search-DjFl-8XR.js → search-DMNtm2WP.js} +1 -1
  38. package/dist/renderer/assets/{server-UI3KEpUw.js → server-CNaxKyAq.js} +1 -1
  39. package/dist/renderer/assets/{session-utils-b9gwOizd.js → session-utils-vsALZkZN.js} +1 -1
  40. package/dist/renderer/assets/{sessions-DzSZ5A3m.js → sessions-BY-R1IL_.js} +1 -1
  41. package/dist/renderer/assets/{shield-check-6fT5xdT3.js → shield-check-BF-4oJbj.js} +1 -1
  42. package/dist/renderer/assets/{trash-2-DNBg0OLf.js → trash-2-DduflM4q.js} +1 -1
  43. package/dist/renderer/assets/{user-B0MGTipJ.js → user-DBcvnuW4.js} +1 -1
  44. package/dist/renderer/assets/{wifi-off-DBxNxGco.js → wifi-off-X1nXESYu.js} +1 -1
  45. package/dist/renderer/index.html +1 -1
  46. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-backend.js +2 -0
  47. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-progress.js +25 -0
  48. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-turn-coordinator.js +31 -8
  49. package/dist-electron/services/local-ai-core/src/channel/lark/local-core-lark-gateway.js +21 -11
  50. package/dist-electron/services/local-ai-core/src/channel/lark/post.js +7 -70
  51. package/dist-electron/services/local-ai-core/src/channel/lark/rendering/markdown.js +94 -0
  52. package/dist-electron/services/local-ai-core/src/channel/lark/rendering/messages.js +51 -0
  53. package/dist-electron/services/local-ai-core/src/channel/lark/runtime-state.js +14 -0
  54. package/dist-electron/tests/integration/lark-rendering.test.js +123 -0
  55. package/dist-electron/tests/integration/local-core-refactor.test.js +176 -22
  56. package/package.json +1 -1
  57. package/dist/renderer/assets/projects-DRdvUEj2.js +0 -1
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_test_1 = __importDefault(require("node:test"));
7
+ const strict_1 = __importDefault(require("node:assert/strict"));
8
+ const local_core_lark_gateway_js_1 = require("../../services/local-ai-core/src/channel/lark/local-core-lark-gateway.js");
9
+ const messages_js_1 = require("../../services/local-ai-core/src/channel/lark/rendering/messages.js");
10
+ function findLarkPostMdText(content) {
11
+ for (const line of content.zh_cn?.content || []) {
12
+ for (const item of Array.isArray(line) ? line : []) {
13
+ if (item?.tag === 'md') {
14
+ return String(item.text || '');
15
+ }
16
+ }
17
+ }
18
+ return '';
19
+ }
20
+ function tableMarkdown(index) {
21
+ return [
22
+ `| # | 标题 | 状态 | 一句话 |`,
23
+ `|---|------|------|--------|`,
24
+ `| ${index} | **标题 ${index}** | 待处理 | 摘要 ${index} |`,
25
+ ].join('\n');
26
+ }
27
+ (0, node_test_1.default)('lark text renderer keeps plain markdown on post messages', () => {
28
+ const rendered = (0, messages_js_1.renderLarkTextMessage)('### 标题\n\n普通回复');
29
+ strict_1.default.equal(rendered.msgType, 'post');
30
+ strict_1.default.equal(rendered.renderKind, 'post_md');
31
+ strict_1.default.equal(rendered.reason, 'plain_markdown');
32
+ strict_1.default.equal(rendered.tableCount, 0);
33
+ strict_1.default.equal(findLarkPostMdText(rendered.content), '### 标题\n\n普通回复');
34
+ });
35
+ (0, node_test_1.default)('lark text renderer sends markdown tables through schema 2.0 cards', () => {
36
+ const markdown = [
37
+ '### 各收件内容摘要',
38
+ '',
39
+ tableMarkdown(1),
40
+ ].join('\n');
41
+ const rendered = (0, messages_js_1.renderLarkTextMessage)(markdown);
42
+ strict_1.default.equal(rendered.msgType, 'interactive');
43
+ strict_1.default.equal(rendered.renderKind, 'markdown_card');
44
+ strict_1.default.equal(rendered.reason, 'markdown_table');
45
+ strict_1.default.equal(rendered.tableCount, 1);
46
+ strict_1.default.equal(rendered.content.schema, '2.0');
47
+ strict_1.default.equal(rendered.content.body?.elements?.[0]?.tag, 'markdown');
48
+ strict_1.default.match(rendered.content.body?.elements?.[0]?.content || '', /\| 1 \| \*\*标题 1\*\* \| 待处理 \|/);
49
+ });
50
+ (0, node_test_1.default)('lark post fallback renders markdown table rows as visible text', () => {
51
+ const content = (0, messages_js_1.buildLarkPostContent)([
52
+ '### 各收件内容摘要',
53
+ '',
54
+ tableMarkdown(1),
55
+ tableMarkdown(2),
56
+ tableMarkdown(3),
57
+ tableMarkdown(4),
58
+ tableMarkdown(5),
59
+ tableMarkdown(6),
60
+ '',
61
+ '需要我对哪个文件做进一步处理?',
62
+ ].join('\n'));
63
+ const text = findLarkPostMdText(content);
64
+ strict_1.default.doesNotMatch(text, /\|---\|/);
65
+ strict_1.default.match(text, /1\. 标题: \*\*标题 1\*\*;状态: 待处理;一句话: 摘要 1/);
66
+ strict_1.default.match(text, /6\. 标题: \*\*标题 6\*\*;状态: 待处理;一句话: 摘要 6/);
67
+ strict_1.default.match(text, /需要我对哪个文件做进一步处理?/);
68
+ });
69
+ (0, node_test_1.default)('lark text renderer falls back to post when card table count exceeds the platform limit', () => {
70
+ const rendered = (0, messages_js_1.renderLarkTextMessage)([
71
+ tableMarkdown(1),
72
+ tableMarkdown(2),
73
+ tableMarkdown(3),
74
+ tableMarkdown(4),
75
+ tableMarkdown(5),
76
+ tableMarkdown(6),
77
+ ].join('\n\n'));
78
+ strict_1.default.equal(rendered.msgType, 'post');
79
+ strict_1.default.equal(rendered.renderKind, 'post_md');
80
+ strict_1.default.equal(rendered.reason, 'table_limit_fallback');
81
+ strict_1.default.equal(rendered.tableCount, 6);
82
+ strict_1.default.match(findLarkPostMdText(rendered.content), /6\. 标题: \*\*标题 6\*\*/);
83
+ });
84
+ (0, node_test_1.default)('lark text renderer sanitizes non-http markdown links', () => {
85
+ const rendered = (0, messages_js_1.renderLarkTextMessage)('[本地文件](file:///tmp/a.md) 和 [官网](https://example.com)');
86
+ const text = findLarkPostMdText(rendered.content);
87
+ strict_1.default.match(text, /本地文件 \(file:\/\/\/tmp\/a\.md\)/);
88
+ strict_1.default.match(text, /\[官网\]\(https:\/\/example\.com\)/);
89
+ });
90
+ (0, node_test_1.default)('lark gateway sends rendered text message payloads without owning render strategy', async () => {
91
+ const requests = [];
92
+ const logs = [];
93
+ const gateway = new local_core_lark_gateway_js_1.LocalCoreLarkGateway({
94
+ store: {},
95
+ readConfig: async () => null,
96
+ getWorkspaceRouter: () => ({}),
97
+ eventBus: { emit: () => { }, on: () => () => { } },
98
+ log: (line) => logs.push(line),
99
+ });
100
+ const result = await gateway.sendTextAsMessage({
101
+ client: {
102
+ im: {
103
+ message: {
104
+ create: async (request) => {
105
+ requests.push(request);
106
+ return { data: { message_id: 'lark-msg-1' } };
107
+ },
108
+ },
109
+ },
110
+ },
111
+ }, 'chat-1', [
112
+ '### 各收件内容摘要',
113
+ '',
114
+ tableMarkdown(1),
115
+ ].join('\n'));
116
+ const request = requests[0];
117
+ const content = JSON.parse(String(request?.data?.content || '{}'));
118
+ strict_1.default.equal(result.messageId, 'lark-msg-1');
119
+ strict_1.default.equal(result.renderKind, 'markdown_card');
120
+ strict_1.default.equal(request?.data?.msg_type, 'interactive');
121
+ strict_1.default.equal(content.schema, '2.0');
122
+ strict_1.default.match(logs.join('\n'), /msgType=interactive reason=markdown_table tableCount=1/);
123
+ });
@@ -35,16 +35,12 @@ function extractLarkCreatedMessage(request) {
35
35
  }
36
36
  function extractLarkCreatedMessageText(msgType, content) {
37
37
  if (msgType === 'interactive') {
38
- return String(content.elements?.[0]?.content || '');
38
+ return String(content.elements?.[0]?.content || content.body?.elements?.[0]?.content || '');
39
39
  }
40
40
  if (msgType === 'post') {
41
41
  return (content.zh_cn?.content || [])
42
42
  .map((line) => (Array.isArray(line) ? line : [])
43
43
  .map((item) => {
44
- if (item?.tag === 'code_block') {
45
- const language = String(item.language || '').trim();
46
- return `\`\`\`${language}\n${String(item.text || '')}\n\`\`\``;
47
- }
48
44
  return String(item?.text || item?.href || '');
49
45
  })
50
46
  .join(''))
@@ -52,15 +48,15 @@ function extractLarkCreatedMessageText(msgType, content) {
52
48
  }
53
49
  return String(content.text || '');
54
50
  }
55
- function findLarkPostCodeBlock(content) {
51
+ function findLarkPostMdText(content) {
56
52
  for (const line of content.zh_cn?.content || []) {
57
53
  for (const item of Array.isArray(line) ? line : []) {
58
- if (item?.tag === 'code_block') {
59
- return item;
54
+ if (item?.tag === 'md') {
55
+ return String(item.text || '');
60
56
  }
61
57
  }
62
58
  }
63
- return null;
59
+ return '';
64
60
  }
65
61
  (0, node_test_1.default)('local core route parser separates runtime refresh and runtime detail routes', () => {
66
62
  strict_1.default.deepEqual((0, server_routes_js_1.parseLocalAiCoreRoute)('GET', '/api/local/v1/logs'), { name: 'logs.list' });
@@ -1146,6 +1142,92 @@ function findLarkPostCodeBlock(content) {
1146
1142
  strict_1.default.equal(emitted[0]?.content, '🔧 Terminal');
1147
1143
  strict_1.default.equal(session.currentTurn.assistantText, 'done');
1148
1144
  });
1145
+ (0, node_test_1.default)('ACP closes assistant message segments at event boundaries without folding them into final', () => {
1146
+ const upserted = [];
1147
+ const emitted = [];
1148
+ const coordinator = new local_core_acp_turn_coordinator_js_1.LocalCoreAcpTurnCoordinator({
1149
+ appendMessage: () => { },
1150
+ upsertMessage: (_threadId, id, _role, content, _kind, _toolCall, bridgeKind) => {
1151
+ upserted.push({ id, content, bridgeKind });
1152
+ },
1153
+ emitBridge: (event) => emitted.push(event),
1154
+ updateRunStatus: () => { },
1155
+ sendRaw: () => true,
1156
+ });
1157
+ const session = {
1158
+ threadId: 'thread-1',
1159
+ bridgeSessionKey: 'session:thread-1',
1160
+ currentRunId: 'run-1',
1161
+ currentTurn: {
1162
+ runId: 'run-1',
1163
+ replyCtx: 'run-1',
1164
+ previewHandle: 'run-1-assistant-preview-1',
1165
+ assistantMessageId: 'run-1-assistant-1',
1166
+ assistantSequence: 1,
1167
+ thoughtPreviewHandle: 'thought-preview-1',
1168
+ thoughtMessageId: 'run-1-thought-1',
1169
+ assistantText: '',
1170
+ rawAssistantText: '',
1171
+ thoughtText: '',
1172
+ typingStarted: true,
1173
+ previewStarted: false,
1174
+ thoughtPreviewStarted: false,
1175
+ pendingToolCalls: {},
1176
+ pendingToolCallOrder: [],
1177
+ toolCallSequence: 0,
1178
+ toolObservations: [],
1179
+ permission: null,
1180
+ },
1181
+ loadReplayMode: false,
1182
+ schedulerJobCreatedByRun: new Map(),
1183
+ };
1184
+ coordinator.handleAgentNotification(session, {
1185
+ method: 'session/update',
1186
+ params: {
1187
+ update: {
1188
+ sessionUpdate: 'agent_message_chunk',
1189
+ content: { type: 'text', text: '我先检查一下' },
1190
+ },
1191
+ },
1192
+ });
1193
+ strict_1.default.deepEqual(emitted, []);
1194
+ strict_1.default.deepEqual(upserted, []);
1195
+ coordinator.handleAgentNotification(session, {
1196
+ method: 'session/update',
1197
+ params: {
1198
+ update: {
1199
+ sessionUpdate: 'tool_call',
1200
+ title: 'Terminal',
1201
+ },
1202
+ },
1203
+ });
1204
+ strict_1.default.deepEqual(upserted, [{
1205
+ id: 'run-1-assistant-1',
1206
+ content: '我先检查一下',
1207
+ bridgeKind: 'assistant',
1208
+ }]);
1209
+ strict_1.default.equal(emitted.length, 1);
1210
+ strict_1.default.equal(emitted[0]?.type, 'reply');
1211
+ strict_1.default.equal(emitted[0]?.content, '我先检查一下');
1212
+ strict_1.default.equal(emitted[0]?.messageId, 'run-1-assistant-1');
1213
+ strict_1.default.equal(emitted[0]?.bridgeKind, 'assistant');
1214
+ strict_1.default.equal(session.currentTurn.assistantText, '');
1215
+ strict_1.default.equal(session.currentTurn.rawAssistantText, '');
1216
+ coordinator.handleAgentNotification(session, {
1217
+ method: 'session/update',
1218
+ params: {
1219
+ update: {
1220
+ sessionUpdate: 'agent_message_chunk',
1221
+ content: { type: 'text', text: '最终回答' },
1222
+ },
1223
+ },
1224
+ });
1225
+ strict_1.default.equal(session.currentTurn.assistantText, '最终回答');
1226
+ strict_1.default.equal(session.currentTurn.rawAssistantText, '最终回答');
1227
+ strict_1.default.equal(upserted.filter((entry) => entry.bridgeKind === 'assistant').length, 1);
1228
+ strict_1.default.equal(emitted.length, 2);
1229
+ strict_1.default.equal(emitted[1]?.bridgeKind, 'tool');
1230
+ });
1149
1231
  (0, node_test_1.default)('ACP tool-scoped assistant chunks stay out of final assistant buffer', () => {
1150
1232
  const appended = [];
1151
1233
  const emitted = [];
@@ -1241,7 +1323,7 @@ function findLarkPostCodeBlock(content) {
1241
1323
  });
1242
1324
  }
1243
1325
  strict_1.default.equal(session.currentTurn.assistantText, '确认删除前需要你确认。');
1244
- strict_1.default.deepEqual(emitted.map((event) => event.content), ['确认删除前需要你确认。']);
1326
+ strict_1.default.deepEqual(emitted.map((event) => event.content), []);
1245
1327
  });
1246
1328
  (0, node_test_1.default)('Hermes ACP assistant chunks strip replay even when stored prior final is already polluted', () => {
1247
1329
  const emitted = [];
@@ -1295,7 +1377,7 @@ function findLarkPostCodeBlock(content) {
1295
1377
  });
1296
1378
  }
1297
1379
  strict_1.default.equal(session.currentTurn.assistantText, '已删除 **Sisyphus_介绍.txt**,现在 Text 文件夹是空的了。');
1298
- strict_1.default.deepEqual(emitted.map((event) => event.content), ['已删除 **Sisyphus_介绍.txt**,现在 Text 文件夹是空的了。']);
1380
+ strict_1.default.deepEqual(emitted.map((event) => event.content), []);
1299
1381
  });
1300
1382
  (0, node_test_1.default)('Hermes ACP assistant chunks keep a fresh answer when no replay anchor is present', () => {
1301
1383
  const emitted = [];
@@ -1334,7 +1416,7 @@ function findLarkPostCodeBlock(content) {
1334
1416
  },
1335
1417
  });
1336
1418
  strict_1.default.equal(session.currentTurn.assistantText, '已删除文件。');
1337
- strict_1.default.deepEqual(emitted.map((event) => event.content), ['已删除文件。']);
1419
+ strict_1.default.deepEqual(emitted.map((event) => event.content), []);
1338
1420
  });
1339
1421
  (0, node_test_1.default)('Hermes ACP progress updates suppress restored tool and thought replay only', () => {
1340
1422
  const upserted = [];
@@ -2033,6 +2115,86 @@ function findLarkPostCodeBlock(content) {
2033
2115
  strict_1.default.deepEqual(patchedCards, []);
2034
2116
  strict_1.default.deepEqual(storedMessageIds, ['lark-msg-1']);
2035
2117
  });
2118
+ (0, node_test_1.default)('lark bridge sends completed assistant segments as separate non-final messages', async () => {
2119
+ const createdMessages = [];
2120
+ const patchedCards = [];
2121
+ const storedMessageIds = [];
2122
+ const client = {
2123
+ im: {
2124
+ message: {
2125
+ create: async (request) => {
2126
+ const messageId = `lark-msg-${createdMessages.length + 1}`;
2127
+ const message = extractLarkCreatedMessage(request);
2128
+ createdMessages.push({
2129
+ messageId,
2130
+ msgType: message.msgType,
2131
+ text: message.text,
2132
+ content: message.content,
2133
+ });
2134
+ return { data: { message_id: messageId } };
2135
+ },
2136
+ patch: async (request) => {
2137
+ const card = JSON.parse(String(request.data.content || '{}'));
2138
+ patchedCards.push({
2139
+ messageId: String(request.path.message_id || ''),
2140
+ text: String(card.elements?.[0]?.content || ''),
2141
+ });
2142
+ },
2143
+ },
2144
+ },
2145
+ };
2146
+ const gateway = new local_core_lark_gateway_js_1.LocalCoreLarkGateway({
2147
+ store: {
2148
+ getPlatformThreadBinding: () => ({
2149
+ workspace_id: 'default',
2150
+ platform: 'lark',
2151
+ chat_id: 'chat-1',
2152
+ platform_user_id: 'user-1',
2153
+ thread_id: 'thread-1',
2154
+ last_platform_message_id: null,
2155
+ }),
2156
+ updatePlatformThreadMessageId: (_workspaceId, _chatId, _platformUserId, messageId) => {
2157
+ storedMessageIds.push(messageId);
2158
+ },
2159
+ },
2160
+ readConfig: async () => null,
2161
+ getWorkspaceRouter: () => ({}),
2162
+ eventBus: { emit: () => { }, on: () => () => { } },
2163
+ });
2164
+ const internals = gateway;
2165
+ internals.runtime.set('default', {
2166
+ workspaceId: 'default',
2167
+ enabled: true,
2168
+ status: 'running',
2169
+ connected: true,
2170
+ appId: 'app-1',
2171
+ client,
2172
+ });
2173
+ internals.threadRouting.set('session:thread-1', {
2174
+ workspaceId: 'default',
2175
+ platformUserId: 'user-1',
2176
+ chatId: 'chat-1',
2177
+ threadId: 'thread-1',
2178
+ });
2179
+ await gateway.onBridgeEvent({
2180
+ type: 'reply',
2181
+ sessionKey: 'session:thread-1',
2182
+ replyCtx: 'run-1',
2183
+ messageId: 'run-1-assistant-1',
2184
+ bridgeKind: 'assistant',
2185
+ content: '我先检查一下',
2186
+ });
2187
+ await gateway.onBridgeEvent({
2188
+ type: 'reply',
2189
+ sessionKey: 'session:thread-1',
2190
+ replyCtx: 'run-1',
2191
+ content: '最终回答',
2192
+ });
2193
+ strict_1.default.deepEqual(createdMessages.map((message) => message.msgType), ['post', 'post']);
2194
+ strict_1.default.deepEqual(createdMessages.map((message) => message.text), ['我先检查一下', '最终回答']);
2195
+ strict_1.default.deepEqual(patchedCards, []);
2196
+ strict_1.default.deepEqual(storedMessageIds, ['lark-msg-2']);
2197
+ });
2036
2198
  (0, node_test_1.default)('lark bridge creates final replies without patching prior final messages', async () => {
2037
2199
  const createdMessages = [];
2038
2200
  const patchedCards = [];
@@ -2330,11 +2492,7 @@ function findLarkPostCodeBlock(content) {
2330
2492
  '看到了 Linux',
2331
2493
  '最终回答',
2332
2494
  ]);
2333
- strict_1.default.deepEqual(findLarkPostCodeBlock(createdMessages[1]?.content), {
2334
- tag: 'code_block',
2335
- language: 'json',
2336
- text: '{\n "command": "uname -a",\n "description": "Get system info"\n}',
2337
- });
2495
+ strict_1.default.equal(findLarkPostMdText(createdMessages[1]?.content), '🔧 Terminal\n\n```json\n{\n "command": "uname -a",\n "description": "Get system info"\n}\n```');
2338
2496
  strict_1.default.deepEqual(patchedCards, []);
2339
2497
  strict_1.default.deepEqual(storedMessageIds, ['lark-msg-4']);
2340
2498
  });
@@ -2740,11 +2898,7 @@ function findLarkPostCodeBlock(content) {
2740
2898
  strict_1.default.match(text, /🔧 Terminal/);
2741
2899
  strict_1.default.match(text, /```json\n{\n "command": "ls ~\/Desktop"\n}\n```/);
2742
2900
  strict_1.default.doesNotMatch(text, /参数/);
2743
- strict_1.default.deepEqual(findLarkPostCodeBlock(createdMessages[0]?.content), {
2744
- tag: 'code_block',
2745
- language: 'json',
2746
- text: '{\n "command": "ls ~/Desktop"\n}',
2747
- });
2901
+ strict_1.default.equal(findLarkPostMdText(createdMessages[0]?.content), '🔧 Terminal\n\n```json\n{\n "command": "ls ~/Desktop"\n}\n```');
2748
2902
  strict_1.default.equal(patchedCards.length, 0);
2749
2903
  strict_1.default.doesNotMatch(text, /completed/);
2750
2904
  strict_1.default.doesNotMatch(text, /secret terminal output/);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kafca/agentdock",
3
- "version": "0.1.39",
3
+ "version": "0.1.41",
4
4
  "license": "PolyForm-Noncommercial-1.0.0",
5
5
  "type": "module",
6
6
  "main": "dist-electron/electron/main.js",
@@ -1 +0,0 @@
1
- import{z as t}from"./index-CAi_EMRl.js";const e=()=>t.get("/projects"),r=o=>t.get(`/projects/${o}`);export{r as g,e as l};