@kafca/agentdock 0.1.21 → 0.1.22

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 (65) hide show
  1. package/README.md +6 -0
  2. package/dist/renderer/assets/{Badge-BRmQIqbd.js → Badge-B_rgzxYO.js} +1 -1
  3. package/dist/renderer/assets/{Chat-D94ODABB.js → Chat-CYtp6m7T.js} +1 -1
  4. package/dist/renderer/assets/{ChatMarkdown-DqW7OUvV.js → ChatMarkdown-DOBMwa9d.js} +1 -1
  5. package/dist/renderer/assets/{Config-9lgzpTCp.js → Config-DppMSPHF.js} +2 -2
  6. package/dist/renderer/assets/CronList-BDtB1SuA.js +1 -0
  7. package/dist/renderer/assets/{Dashboard-COISXbQy.js → Dashboard-iFlRnd7Y.js} +2 -2
  8. package/dist/renderer/assets/{EmptyState-w5-I9zg7.js → EmptyState-bKDt_T88.js} +1 -1
  9. package/dist/renderer/assets/{KnowledgeDetail-DVxwrTLw.js → KnowledgeDetail-CKPhKPIg.js} +2 -2
  10. package/dist/renderer/assets/{KnowledgeHome-BKkubcwi.js → KnowledgeHome-CFeJre6i.js} +3 -3
  11. package/dist/renderer/assets/Logs-CyxSVOFK.js +1 -0
  12. package/dist/renderer/assets/{Modal-Ceu_MP2e.js → Modal-CxPnk1Ey.js} +1 -1
  13. package/dist/renderer/assets/{Page-CpSczAz8.js → Page-kU9vubzj.js} +1 -1
  14. package/dist/renderer/assets/{ProjectDetail-FJ_bNXLF.js → ProjectDetail-D9FY9NWZ.js} +1 -1
  15. package/dist/renderer/assets/{ProjectList-DZKL4K9C.js → ProjectList-DIwr2TXg.js} +1 -1
  16. package/dist/renderer/assets/{Select-BHQk6qCU.js → Select-BaWoz5Dn.js} +2 -7
  17. package/dist/renderer/assets/SessionChat-Cm9CW8Zx.js +1 -0
  18. package/dist/renderer/assets/SessionList-UPnWlXXO.js +1 -0
  19. package/dist/renderer/assets/{ThreadChat-D3s4GXGh.js → ThreadChat-YvVsACW3.js} +7 -7
  20. package/dist/renderer/assets/{Workspace-B7looTVo.js → Workspace-ST7V8u6T.js} +2 -2
  21. package/dist/renderer/assets/{arrow-left-Dtal-eOi.js → arrow-left-BmZAVGV7.js} +1 -1
  22. package/dist/renderer/assets/{book-open-q814R_Ov.js → book-open-DZ3GXFgI.js} +1 -1
  23. package/dist/renderer/assets/{check-DjfCdLvw.js → check-CeVSvDCv.js} +1 -1
  24. package/dist/renderer/assets/chevron-down-yryuMoQ-.js +6 -0
  25. package/dist/renderer/assets/{circle-vfhmyE8v.js → circle-eASsFISH.js} +1 -1
  26. package/dist/renderer/assets/desktop-Che1cbpE.js +4 -0
  27. package/dist/renderer/assets/desktop-DkrP_s-b.js +1 -0
  28. package/dist/renderer/assets/{funnel-CUQibo1I.js → funnel-pwAe2Ixp.js} +1 -1
  29. package/dist/renderer/assets/{heart-DG9_b8P1.js → heart-B2Sp-bCm.js} +1 -1
  30. package/dist/renderer/assets/{index-Bn8ane6_.js → index-BC3MWbS1.js} +3 -3
  31. package/dist/renderer/assets/{index-Ds0IN5rP.js → index-Cse2Br64.js} +1 -1
  32. package/dist/renderer/assets/{index-3CzgyQYB.css → index-DFiJR0vv.css} +1 -1
  33. package/dist/renderer/assets/{pencil-Dij0LlRY.js → pencil-BfEunUF3.js} +1 -1
  34. package/dist/renderer/assets/{play-CPFGjIyJ.js → play-Dcs9Lj_Z.js} +1 -1
  35. package/dist/renderer/assets/{plug-DH3RKQyn.js → plug-B_YschQe.js} +1 -1
  36. package/dist/renderer/assets/{plus-afkK9_Y8.js → plus-Pqo-cXHQ.js} +1 -1
  37. package/dist/renderer/assets/projects-BCj0k_Gy.js +1 -0
  38. package/dist/renderer/assets/{save-B-cKgWcy.js → save-BKM5yi1A.js} +1 -1
  39. package/dist/renderer/assets/{search-DR6PeYkt.js → search-BU42h10M.js} +1 -1
  40. package/dist/renderer/assets/{server-BM6KOB5a.js → server-DA5t3Rtr.js} +1 -1
  41. package/dist/renderer/assets/{session-utils-BDuThM0a.js → session-utils-Cr9VhNSq.js} +1 -1
  42. package/dist/renderer/assets/{sessions-C1yKps4T.js → sessions-bvV8ZMfX.js} +1 -1
  43. package/dist/renderer/assets/{shield-check-BFjMG-r2.js → shield-check-BeOJKur_.js} +1 -1
  44. package/dist/renderer/assets/{trash-2-CW1heMCf.js → trash-2-CQ7HKO3q.js} +1 -1
  45. package/dist/renderer/assets/{user-r_2sHG7m.js → user-CtFjY9SV.js} +1 -1
  46. package/dist/renderer/assets/{wifi-off-VMUokMpE.js → wifi-off-Ci5m0ysf.js} +1 -1
  47. package/dist/renderer/index.html +2 -2
  48. package/dist-electron/electron/local-core-refactor.test.js +307 -3
  49. package/dist-electron/services/local-ai-core/src/{gateway → channel/lark}/local-core-lark-gateway.js +249 -8
  50. package/dist-electron/services/local-ai-core/src/channel/shared/file-utils.js +33 -0
  51. package/dist-electron/services/local-ai-core/src/{gateway → channel/weixin}/local-core-weixin-gateway.js +188 -1
  52. package/dist-electron/services/local-ai-core/src/cli/lac.js +41 -1
  53. package/dist-electron/services/local-ai-core/src/plugins/builtin/channel-lark-plugin.js +1 -1
  54. package/dist-electron/services/local-ai-core/src/plugins/builtin/channel-weixin-plugin.js +1 -1
  55. package/dist-electron/services/local-ai-core/src/runtime/local-core-controller.js +41 -0
  56. package/dist-electron/services/local-ai-core/src/runtime/server.js +10 -0
  57. package/dist-electron/shared/desktop.js +14 -1
  58. package/package.json +1 -1
  59. package/dist/renderer/assets/CronList-BYZ-x_bp.js +0 -1
  60. package/dist/renderer/assets/Logs-D7HxZ8Nb.js +0 -1
  61. package/dist/renderer/assets/SessionChat-DpgSXF3m.js +0 -1
  62. package/dist/renderer/assets/SessionList-CU6drQ4N.js +0 -1
  63. package/dist/renderer/assets/desktop-BPIxWbkM.js +0 -1
  64. package/dist/renderer/assets/desktop-DZHC4PDB.js +0 -3
  65. package/dist/renderer/assets/projects-DTDS9SnT.js +0 -1
@@ -1 +1 @@
1
- import{y as o}from"./index-Bn8ane6_.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};
1
+ import{z as o}from"./index-BC3MWbS1.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};
@@ -1,4 +1,4 @@
1
- import{c}from"./index-Bn8ane6_.js";/**
1
+ import{c}from"./index-BC3MWbS1.js";/**
2
2
  * @license lucide-react v0.487.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{c as e}from"./index-Bn8ane6_.js";/**
1
+ import{c as e}from"./index-BC3MWbS1.js";/**
2
2
  * @license lucide-react v0.487.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{c as e}from"./index-Bn8ane6_.js";/**
1
+ import{c as e}from"./index-BC3MWbS1.js";/**
2
2
  * @license lucide-react v0.487.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{c as a}from"./index-Bn8ane6_.js";/**
1
+ import{c as a}from"./index-BC3MWbS1.js";/**
2
2
  * @license lucide-react v0.487.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -5,8 +5,8 @@
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-Bn8ane6_.js"></script>
9
- <link rel="stylesheet" crossorigin href="./assets/index-3CzgyQYB.css">
8
+ <script type="module" crossorigin src="./assets/index-BC3MWbS1.js"></script>
9
+ <link rel="stylesheet" crossorigin href="./assets/index-DFiJR0vv.css">
10
10
  </head>
11
11
  <body class="bg-[#f5f5f7] dark:bg-[#151516]">
12
12
  <div id="root"></div>
@@ -14,8 +14,8 @@ const scheduled_conversation_executor_js_1 = require("../services/local-ai-core/
14
14
  const scheduler_run_lifecycle_js_1 = require("../services/local-ai-core/src/scheduler/scheduler-run-lifecycle.js");
15
15
  const lark_execution_policies_js_1 = require("../services/local-ai-core/src/scheduler/lark-execution-policies.js");
16
16
  const local_schedule_adapter_js_1 = require("../services/local-ai-core/src/scheduler/local-schedule-adapter.js");
17
- const local_core_weixin_gateway_js_1 = require("../services/local-ai-core/src/gateway/local-core-weixin-gateway.js");
18
- const local_core_lark_gateway_js_1 = require("../services/local-ai-core/src/gateway/local-core-lark-gateway.js");
17
+ const local_core_weixin_gateway_js_1 = require("../services/local-ai-core/src/channel/weixin/local-core-weixin-gateway.js");
18
+ const local_core_lark_gateway_js_1 = require("../services/local-ai-core/src/channel/lark/local-core-lark-gateway.js");
19
19
  const local_core_acp_turn_coordinator_js_1 = require("../services/local-ai-core/src/acp/local-core-acp-turn-coordinator.js");
20
20
  const local_core_acp_store_js_1 = require("../services/local-ai-core/src/acp/local-core-acp-store.js");
21
21
  (0, node_test_1.default)('ACP tool call update is emitted with its pending tool name', () => {
@@ -669,6 +669,7 @@ const local_core_acp_store_js_1 = require("../services/local-ai-core/src/acp/loc
669
669
  });
670
670
  (0, node_test_1.default)('lark permission requests render as clickable card buttons', async () => {
671
671
  const createdCards = [];
672
+ const patchedCards = [];
672
673
  const threadActions = [];
673
674
  const client = {
674
675
  im: {
@@ -677,7 +678,12 @@ const local_core_acp_store_js_1 = require("../services/local-ai-core/src/acp/loc
677
678
  createdCards.push(JSON.parse(String(request.data.content || '{}')));
678
679
  return { data: { message_id: 'permission-msg-1' } };
679
680
  },
680
- patch: async () => { },
681
+ patch: async (request) => {
682
+ patchedCards.push({
683
+ messageId: request.path?.message_id,
684
+ card: JSON.parse(String(request.data.content || '{}')),
685
+ });
686
+ },
681
687
  },
682
688
  },
683
689
  };
@@ -757,13 +763,134 @@ const local_core_acp_store_js_1 = require("../services/local-ai-core/src/acp/loc
757
763
  action: 'permission_response',
758
764
  response: 'allow all',
759
765
  thread_id: 'thread-1',
766
+ session_key: 'session:thread-1',
760
767
  },
761
768
  },
769
+ context: {
770
+ open_message_id: 'permission-msg-1',
771
+ },
762
772
  },
763
773
  });
764
774
  strict_1.default.deepEqual(threadActions, [
765
775
  { threadId: 'thread-1', action: 'allow all' },
766
776
  ]);
777
+ strict_1.default.equal(patchedCards.length, 1);
778
+ strict_1.default.equal(patchedCards[0]?.messageId, 'permission-msg-1');
779
+ strict_1.default.match(patchedCards[0]?.card?.elements?.[0]?.content || '', /工具确认已处理/);
780
+ strict_1.default.equal(patchedCards[0]?.card?.elements?.some((element) => element.tag === 'action'), false);
781
+ });
782
+ (0, node_test_1.default)('lark channel folds tool result output in progress cards', async () => {
783
+ const createdCards = [];
784
+ const patchedCards = [];
785
+ const client = {
786
+ im: {
787
+ message: {
788
+ create: async (request) => {
789
+ createdCards.push(JSON.parse(String(request.data.content || '{}')));
790
+ return { data: { message_id: 'tool-msg-1' } };
791
+ },
792
+ patch: async (request) => {
793
+ patchedCards.push(JSON.parse(String(request.data.content || '{}')));
794
+ },
795
+ },
796
+ },
797
+ };
798
+ const gateway = new local_core_lark_gateway_js_1.LocalCoreLarkGateway({
799
+ store: {
800
+ getPlatformThreadBinding: () => ({
801
+ workspace_id: 'default',
802
+ platform: 'lark',
803
+ chat_id: 'chat-1',
804
+ platform_user_id: 'user-1',
805
+ thread_id: 'thread-1',
806
+ last_platform_message_id: null,
807
+ }),
808
+ },
809
+ readConfig: async () => null,
810
+ getWorkspaceRouter: () => ({}),
811
+ eventBus: { emit: () => { }, on: () => () => { } },
812
+ });
813
+ const internals = gateway;
814
+ internals.runtime.set('default', {
815
+ workspaceId: 'default',
816
+ enabled: true,
817
+ status: 'running',
818
+ connected: true,
819
+ appId: 'app-1',
820
+ client,
821
+ });
822
+ internals.threadRouting.set('session:thread-1', {
823
+ workspaceId: 'default',
824
+ platformUserId: 'user-1',
825
+ chatId: 'chat-1',
826
+ threadId: 'thread-1',
827
+ });
828
+ await gateway.onBridgeEvent({
829
+ type: 'reply',
830
+ sessionKey: 'session:thread-1',
831
+ replyCtx: 'run-1',
832
+ messageId: 'tool-1',
833
+ content: '🔧 Terminal: ls - completed - secret terminal output',
834
+ });
835
+ const text = createdCards[0]?.elements?.[0]?.content || patchedCards[0]?.elements?.[0]?.content || '';
836
+ strict_1.default.match(text, /Terminal: ls - completed/);
837
+ strict_1.default.doesNotMatch(text, /secret terminal output/);
838
+ });
839
+ (0, node_test_1.default)('lark card action message id can be extracted from full callback payload', async () => {
840
+ const patchedCards = [];
841
+ const threadActions = [];
842
+ const client = {
843
+ im: {
844
+ message: {
845
+ patch: async (request) => {
846
+ patchedCards.push({
847
+ messageId: request.path?.message_id,
848
+ card: JSON.parse(String(request.data.content || '{}')),
849
+ });
850
+ },
851
+ },
852
+ },
853
+ };
854
+ const gateway = new local_core_lark_gateway_js_1.LocalCoreLarkGateway({
855
+ store: {},
856
+ readConfig: async () => null,
857
+ getWorkspaceRouter: () => ({
858
+ sendThreadAction: async (threadId, action) => {
859
+ threadActions.push({ threadId, action });
860
+ return { runId: 'run-1' };
861
+ },
862
+ }),
863
+ eventBus: { emit: () => { }, on: () => () => { } },
864
+ });
865
+ const internals = gateway;
866
+ internals.runtime.set('default', {
867
+ workspaceId: 'default',
868
+ enabled: true,
869
+ status: 'running',
870
+ connected: true,
871
+ appId: 'app-1',
872
+ client,
873
+ });
874
+ await internals.handleCardActionEvent('default', {
875
+ schema: '2.0',
876
+ event: {
877
+ action: {
878
+ value: {
879
+ action: 'permission_response',
880
+ response: 'allow',
881
+ thread_id: 'thread-1',
882
+ },
883
+ },
884
+ },
885
+ event_context: {
886
+ open_message_id: 'permission-msg-nested',
887
+ },
888
+ });
889
+ strict_1.default.deepEqual(threadActions, [
890
+ { threadId: 'thread-1', action: 'allow' },
891
+ ]);
892
+ strict_1.default.equal(patchedCards[0]?.messageId, 'permission-msg-nested');
893
+ strict_1.default.equal(patchedCards[0]?.card?.elements?.some((element) => element.tag === 'action'), false);
767
894
  });
768
895
  (0, node_test_1.default)('lark permission requests fall back to text commands when card actions are disabled', async () => {
769
896
  const createdCards = [];
@@ -917,6 +1044,183 @@ const local_core_acp_store_js_1 = require("../services/local-ai-core/src/acp/loc
917
1044
  strict_1.default.equal(sentMessages[0]?.content?.contentParts?.[1]?.mimeType, 'image/png');
918
1045
  strict_1.default.equal(sentMessages[0]?.content?.contentParts?.[1]?.data, pngBytes.toString('base64'));
919
1046
  });
1047
+ (0, node_test_1.default)('lark channel can upload and send a local file', async () => {
1048
+ const tempDir = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'lark-file-send-'));
1049
+ try {
1050
+ const filePath = (0, node_path_1.join)(tempDir, 'report.pdf');
1051
+ (0, node_fs_1.writeFileSync)(filePath, 'pdf content');
1052
+ const uploads = [];
1053
+ const messages = [];
1054
+ const client = {
1055
+ im: {
1056
+ file: {
1057
+ create: async (request) => {
1058
+ uploads.push(request);
1059
+ await new Promise((resolve, reject) => {
1060
+ request.data.file.on('data', () => { });
1061
+ request.data.file.on('error', reject);
1062
+ request.data.file.on('end', resolve);
1063
+ });
1064
+ return { file_key: 'file-key-1' };
1065
+ },
1066
+ },
1067
+ message: {
1068
+ create: async (request) => {
1069
+ messages.push(request);
1070
+ return { data: { message_id: 'msg-file-1' } };
1071
+ },
1072
+ },
1073
+ },
1074
+ };
1075
+ const gateway = new local_core_lark_gateway_js_1.LocalCoreLarkGateway({
1076
+ store: {},
1077
+ readConfig: async () => null,
1078
+ getWorkspaceRouter: () => ({}),
1079
+ eventBus: { emit: () => { }, on: () => () => { } },
1080
+ });
1081
+ const internals = gateway;
1082
+ internals.runtime.set('default', {
1083
+ workspaceId: 'default',
1084
+ enabled: true,
1085
+ status: 'running',
1086
+ connected: true,
1087
+ appId: 'app-1',
1088
+ client,
1089
+ });
1090
+ const result = await gateway.sendFile('default', {
1091
+ path: filePath,
1092
+ channelId: 'oc_chat_1',
1093
+ });
1094
+ strict_1.default.equal(uploads.length, 1);
1095
+ strict_1.default.equal(uploads[0]?.data?.file_type, 'pdf');
1096
+ strict_1.default.equal(uploads[0]?.data?.file_name, 'report.pdf');
1097
+ strict_1.default.equal(messages.length, 1);
1098
+ strict_1.default.equal(messages[0]?.params?.receive_id_type, 'chat_id');
1099
+ strict_1.default.equal(messages[0]?.data?.receive_id, 'oc_chat_1');
1100
+ strict_1.default.equal(messages[0]?.data?.msg_type, 'file');
1101
+ strict_1.default.deepEqual(JSON.parse(messages[0]?.data?.content), { file_key: 'file-key-1' });
1102
+ strict_1.default.deepEqual(result, {
1103
+ platform: 'lark',
1104
+ workspaceId: 'default',
1105
+ channelId: 'oc_chat_1',
1106
+ messageId: 'msg-file-1',
1107
+ fileKey: 'file-key-1',
1108
+ fileName: 'report.pdf',
1109
+ fileSize: Buffer.byteLength('pdf content'),
1110
+ });
1111
+ }
1112
+ finally {
1113
+ (0, node_fs_1.rmSync)(tempDir, { recursive: true, force: true });
1114
+ }
1115
+ });
1116
+ (0, node_test_1.default)('weixin channel can encrypt, upload, and send a local file', async () => {
1117
+ const tempDir = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'weixin-file-send-'));
1118
+ const originalFetch = globalThis.fetch;
1119
+ try {
1120
+ const filePath = (0, node_path_1.join)(tempDir, 'report.txt');
1121
+ (0, node_fs_1.writeFileSync)(filePath, 'hello weixin');
1122
+ const uploadUrlRequests = [];
1123
+ const cdnUploads = [];
1124
+ const sentMessages = [];
1125
+ globalThis.fetch = (async (url, init) => {
1126
+ const target = String(url);
1127
+ if (target.endsWith('/ilink/bot/getuploadurl')) {
1128
+ uploadUrlRequests.push(JSON.parse(String(init?.body || '{}')));
1129
+ return {
1130
+ ok: true,
1131
+ json: async () => ({ ret: 0, upload_param: 'upload-param-1' }),
1132
+ };
1133
+ }
1134
+ if (target.includes('/upload?')) {
1135
+ const body = init?.body instanceof Uint8Array ? init.body : new Uint8Array();
1136
+ cdnUploads.push({ url: target, size: body.byteLength });
1137
+ return {
1138
+ ok: true,
1139
+ headers: {
1140
+ get: (name) => name.toLowerCase() === 'x-encrypted-param' ? 'download-param-1' : null,
1141
+ },
1142
+ };
1143
+ }
1144
+ if (target.endsWith('/ilink/bot/sendmessage')) {
1145
+ sentMessages.push(JSON.parse(String(init?.body || '{}')));
1146
+ return {
1147
+ ok: true,
1148
+ json: async () => ({ ret: 0 }),
1149
+ };
1150
+ }
1151
+ throw new Error(`Unexpected fetch ${target}`);
1152
+ });
1153
+ const gateway = new local_core_weixin_gateway_js_1.LocalCoreWeixinGateway({
1154
+ store: {
1155
+ getPlatformThreadBinding: () => ({
1156
+ workspace_id: 'default',
1157
+ platform: 'weixin',
1158
+ chat_id: 'user-1',
1159
+ platform_user_id: 'user-1',
1160
+ thread_id: 'thread-1',
1161
+ last_platform_message_id: 'ctx-1',
1162
+ }),
1163
+ listAuthorizedUsers: () => [],
1164
+ },
1165
+ readConfig: async () => ({
1166
+ projects: [{
1167
+ name: 'default',
1168
+ root: '/tmp/project',
1169
+ platforms: [{
1170
+ type: 'weixin',
1171
+ options: {
1172
+ token: 'token-1',
1173
+ account_id: 'account-1',
1174
+ base_url: 'https://weixin.example',
1175
+ cdn_base_url: 'https://cdn.example/c2c',
1176
+ },
1177
+ }],
1178
+ }],
1179
+ }),
1180
+ getWorkspaceRouter: () => ({}),
1181
+ eventBus: { emit: () => { }, on: () => () => { } },
1182
+ });
1183
+ const internals = gateway;
1184
+ internals.runtime.set('default', {
1185
+ workspaceId: 'default',
1186
+ enabled: true,
1187
+ status: 'running',
1188
+ connected: true,
1189
+ accountId: 'account-1',
1190
+ });
1191
+ const result = await gateway.sendFile('default', {
1192
+ path: filePath,
1193
+ channelId: 'user-1',
1194
+ participantId: 'user-1',
1195
+ });
1196
+ strict_1.default.equal(uploadUrlRequests.length, 1);
1197
+ strict_1.default.equal(uploadUrlRequests[0]?.media_type, 3);
1198
+ strict_1.default.equal(uploadUrlRequests[0]?.to_user_id, 'user-1');
1199
+ strict_1.default.equal(uploadUrlRequests[0]?.rawsize, Buffer.byteLength('hello weixin'));
1200
+ strict_1.default.equal(uploadUrlRequests[0]?.filesize, 16);
1201
+ strict_1.default.equal(cdnUploads.length, 1);
1202
+ strict_1.default.match(cdnUploads[0]?.url || '', /encrypted_query_param=upload-param-1/);
1203
+ strict_1.default.equal(cdnUploads[0]?.size, 16);
1204
+ strict_1.default.equal(sentMessages.length, 1);
1205
+ const message = sentMessages[0]?.msg;
1206
+ strict_1.default.equal(message?.to_user_id, 'user-1');
1207
+ strict_1.default.equal(message?.context_token, 'ctx-1');
1208
+ strict_1.default.equal(message?.item_list?.[0]?.type, 4);
1209
+ strict_1.default.equal(message?.item_list?.[0]?.file_item?.file_name, 'report.txt');
1210
+ strict_1.default.equal(message?.item_list?.[0]?.file_item?.len, String(Buffer.byteLength('hello weixin')));
1211
+ strict_1.default.equal(message?.item_list?.[0]?.file_item?.media?.encrypt_query_param, 'download-param-1');
1212
+ strict_1.default.equal(result.platform, 'weixin');
1213
+ strict_1.default.equal(result.channelId, 'user-1');
1214
+ strict_1.default.equal(result.fileName, 'report.txt');
1215
+ strict_1.default.equal(result.fileSize, Buffer.byteLength('hello weixin'));
1216
+ strict_1.default.match(result.messageId, /^openclaw-weixin-/);
1217
+ strict_1.default.ok(result.fileKey);
1218
+ }
1219
+ finally {
1220
+ globalThis.fetch = originalFetch;
1221
+ (0, node_fs_1.rmSync)(tempDir, { recursive: true, force: true });
1222
+ }
1223
+ });
920
1224
  (0, node_test_1.default)('lark message callbacks acknowledge before long thread runs finish', async () => {
921
1225
  let registeredHandlers = {};
922
1226
  let sentMessages = 0;