@kafca/agentdock 0.1.18 → 0.1.20
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-BIuWuNsC.js → Badge-C1f8JpRb.js} +1 -1
- package/dist/renderer/assets/Chat-S50iFg3I.js +2 -0
- package/dist/renderer/assets/{ChatMarkdown-C-BlK1yX.js → ChatMarkdown-VWL9Vnpz.js} +4 -4
- package/dist/renderer/assets/{Config-DSqG53SF.js → Config-Yc9ExUI6.js} +1 -1
- package/dist/renderer/assets/{CronList-BP6eOFIl.js → CronList-DTboWazi.js} +1 -1
- package/dist/renderer/assets/{Dashboard-yNvLuZ9h.js → Dashboard-CzXCvZVR.js} +2 -2
- package/dist/renderer/assets/{EmptyState-DrCleE-v.js → EmptyState-9FbY2o6z.js} +1 -1
- package/dist/renderer/assets/{KnowledgeDetail-DTpTUVcH.js → KnowledgeDetail-D_BDc4Zt.js} +1 -1
- package/dist/renderer/assets/{KnowledgeHome-gN27MIm8.js → KnowledgeHome-DsUA_BCR.js} +1 -1
- package/dist/renderer/assets/{Logs-DSEpn2aP.js → Logs-DDAmR67f.js} +1 -1
- package/dist/renderer/assets/{Modal-DRn2QI8p.js → Modal-Bt5VBC6S.js} +1 -1
- package/dist/renderer/assets/{Page-DFPQdZab.js → Page-Da_Kc6Qm.js} +1 -1
- package/dist/renderer/assets/{ProjectDetail-CPAlBCe1.js → ProjectDetail-B4Ps80yv.js} +1 -1
- package/dist/renderer/assets/{ProjectList-D1YqnA_p.js → ProjectList-BWTP9npz.js} +1 -1
- package/dist/renderer/assets/{Select-BOoDNxoe.js → Select-DWs3hVUh.js} +1 -1
- package/dist/renderer/assets/SessionChat-DOhUnOfH.js +1 -0
- package/dist/renderer/assets/{SessionList-EwaQ7I9m.js → SessionList-ChZYFXuo.js} +1 -1
- package/dist/renderer/assets/{ThreadChat-rmnoSpy7.js → ThreadChat-nhnikHnk.js} +5 -5
- package/dist/renderer/assets/Workspace-pq_JYdTN.js +14 -0
- package/dist/renderer/assets/{arrow-left-DLijH4Ma.js → arrow-left-CR39hNvq.js} +1 -1
- package/dist/renderer/assets/{book-open-C39iVsTl.js → book-open-Bot2WKl8.js} +1 -1
- package/dist/renderer/assets/{check-CIzPQt9l.js → check-Drbl2nU3.js} +1 -1
- package/dist/renderer/assets/{circle-C22V7KHC.js → circle-BXFfAwnA.js} +1 -1
- package/dist/renderer/assets/{desktop-SfDg5_P-.js → desktop-5k3W66fH.js} +1 -1
- package/dist/renderer/assets/{funnel-Uqe7wSsV.js → funnel-BNKYan_N.js} +1 -1
- package/dist/renderer/assets/{heart-BAV26w-r.js → heart-wUOSwQE-.js} +1 -1
- package/dist/renderer/assets/index-3CzgyQYB.css +11 -0
- package/dist/renderer/assets/{index-HCsfse2M.js → index-CmOphqrf.js} +1 -1
- package/dist/renderer/assets/{index-bNsLuLje.js → index-DT5la73R.js} +2 -2
- package/dist/renderer/assets/{pencil-DrFGidyy.js → pencil-D7-8ggue.js} +1 -1
- package/dist/renderer/assets/{play-CUr5dfBa.js → play-BCYOAfet.js} +1 -1
- package/dist/renderer/assets/{plug-CLHivmxo.js → plug-Dsik74Yl.js} +1 -1
- package/dist/renderer/assets/{plus-B96DRLtO.js → plus-CKrU26_l.js} +1 -1
- package/dist/renderer/assets/projects-CGDtNb0M.js +1 -0
- package/dist/renderer/assets/{save-BGOA2LdX.js → save-q7M2_eAl.js} +1 -1
- package/dist/renderer/assets/{search-bWm0yagY.js → search-BptY4_MT.js} +1 -1
- package/dist/renderer/assets/{server-wa53brxF.js → server-DSSEF0D8.js} +1 -1
- package/dist/renderer/assets/{session-utils-7J-omgrc.js → session-utils-BFuqPZ5x.js} +1 -1
- package/dist/renderer/assets/{sessions-BIMMb8YC.js → sessions-CrWo3g3u.js} +1 -1
- package/dist/renderer/assets/{shield-check-MBIcswd2.js → shield-check-CCU722RQ.js} +1 -1
- package/dist/renderer/assets/{trash-2-CEov4VLH.js → trash-2-DaeeiV8x.js} +1 -1
- package/dist/renderer/assets/{user-B93Dje9X.js → user-Bkz8J7Yw.js} +1 -1
- package/dist/renderer/assets/{wifi-off-cCUI9WRl.js → wifi-off-P8xdIOHU.js} +1 -1
- package/dist/renderer/index.html +2 -2
- package/dist-electron/electron/local-core-refactor.test.js +426 -0
- package/dist-electron/electron/plugin-kernel.test.js +34 -0
- package/dist-electron/services/local-ai-core/src/gateway/local-core-lark-gateway.js +216 -50
- package/dist-electron/services/local-ai-core/src/runtime/local-core-controller.js +34 -0
- package/package.json +1 -1
- package/dist/renderer/assets/Chat-bI6xVd_L.js +0 -2
- package/dist/renderer/assets/SessionChat-BoqnI_Sb.js +0 -1
- package/dist/renderer/assets/Workspace-CIoiGaPJ.js +0 -14
- package/dist/renderer/assets/index-CVrF_DwQ.css +0 -11
- package/dist/renderer/assets/projects-DC4slOOB.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{y as t}from"./index-DT5la73R.js";const e=()=>t.get("/projects"),r=o=>t.get(`/projects/${o}`);export{r as g,e as l};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{y as o}from"./index-
|
|
1
|
+
import{y as o}from"./index-DT5la73R.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,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-
|
|
9
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
8
|
+
<script type="module" crossorigin src="./assets/index-DT5la73R.js"></script>
|
|
9
|
+
<link rel="stylesheet" crossorigin href="./assets/index-3CzgyQYB.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body class="bg-[#f5f5f7] dark:bg-[#151516]">
|
|
12
12
|
<div id="root"></div>
|
|
@@ -14,6 +14,7 @@ const scheduler_run_lifecycle_js_1 = require("../services/local-ai-core/src/sche
|
|
|
14
14
|
const lark_execution_policies_js_1 = require("../services/local-ai-core/src/scheduler/lark-execution-policies.js");
|
|
15
15
|
const local_schedule_adapter_js_1 = require("../services/local-ai-core/src/scheduler/local-schedule-adapter.js");
|
|
16
16
|
const local_core_weixin_gateway_js_1 = require("../services/local-ai-core/src/gateway/local-core-weixin-gateway.js");
|
|
17
|
+
const local_core_lark_gateway_js_1 = require("../services/local-ai-core/src/gateway/local-core-lark-gateway.js");
|
|
17
18
|
const local_core_acp_turn_coordinator_js_1 = require("../services/local-ai-core/src/acp/local-core-acp-turn-coordinator.js");
|
|
18
19
|
const local_core_acp_store_js_1 = require("../services/local-ai-core/src/acp/local-core-acp-store.js");
|
|
19
20
|
(0, node_test_1.default)('ACP tool call update is emitted with its pending tool name', () => {
|
|
@@ -484,6 +485,431 @@ const local_core_acp_store_js_1 = require("../services/local-ai-core/src/acp/loc
|
|
|
484
485
|
(0, node_fs_1.rmSync)(userDataPath, { recursive: true, force: true });
|
|
485
486
|
}
|
|
486
487
|
});
|
|
488
|
+
(0, node_test_1.default)('lark bridge keeps thought preview and final answer in separate messages', async () => {
|
|
489
|
+
const createdCards = [];
|
|
490
|
+
const patchedCards = [];
|
|
491
|
+
const storedMessageIds = [];
|
|
492
|
+
const client = {
|
|
493
|
+
im: {
|
|
494
|
+
message: {
|
|
495
|
+
create: async (request) => {
|
|
496
|
+
const messageId = `lark-msg-${createdCards.length + 1}`;
|
|
497
|
+
const card = JSON.parse(String(request.data.content || '{}'));
|
|
498
|
+
createdCards.push({
|
|
499
|
+
messageId,
|
|
500
|
+
text: String(card.elements?.[0]?.content || ''),
|
|
501
|
+
});
|
|
502
|
+
return { data: { message_id: messageId } };
|
|
503
|
+
},
|
|
504
|
+
patch: async (request) => {
|
|
505
|
+
const card = JSON.parse(String(request.data.content || '{}'));
|
|
506
|
+
patchedCards.push({
|
|
507
|
+
messageId: String(request.path.message_id || ''),
|
|
508
|
+
text: String(card.elements?.[0]?.content || ''),
|
|
509
|
+
});
|
|
510
|
+
},
|
|
511
|
+
},
|
|
512
|
+
},
|
|
513
|
+
};
|
|
514
|
+
const gateway = new local_core_lark_gateway_js_1.LocalCoreLarkGateway({
|
|
515
|
+
store: {
|
|
516
|
+
getPlatformThreadBinding: () => ({
|
|
517
|
+
workspace_id: 'default',
|
|
518
|
+
platform: 'lark',
|
|
519
|
+
chat_id: 'chat-1',
|
|
520
|
+
platform_user_id: 'user-1',
|
|
521
|
+
thread_id: 'thread-1',
|
|
522
|
+
last_platform_message_id: null,
|
|
523
|
+
}),
|
|
524
|
+
updatePlatformThreadMessageId: (_workspaceId, _chatId, _platformUserId, messageId) => {
|
|
525
|
+
storedMessageIds.push(messageId);
|
|
526
|
+
},
|
|
527
|
+
},
|
|
528
|
+
readConfig: async () => null,
|
|
529
|
+
getWorkspaceRouter: () => ({}),
|
|
530
|
+
eventBus: { emit: () => { }, on: () => () => { } },
|
|
531
|
+
});
|
|
532
|
+
const internals = gateway;
|
|
533
|
+
internals.runtime.set('default', {
|
|
534
|
+
workspaceId: 'default',
|
|
535
|
+
enabled: true,
|
|
536
|
+
status: 'running',
|
|
537
|
+
connected: true,
|
|
538
|
+
appId: 'app-1',
|
|
539
|
+
client,
|
|
540
|
+
});
|
|
541
|
+
internals.threadRouting.set('session:thread-1', {
|
|
542
|
+
workspaceId: 'default',
|
|
543
|
+
platformUserId: 'user-1',
|
|
544
|
+
chatId: 'chat-1',
|
|
545
|
+
threadId: 'thread-1',
|
|
546
|
+
});
|
|
547
|
+
await gateway.onBridgeEvent({
|
|
548
|
+
type: 'preview_start',
|
|
549
|
+
sessionKey: 'session:thread-1',
|
|
550
|
+
replyCtx: 'run-1',
|
|
551
|
+
previewHandle: 'thought-preview-1',
|
|
552
|
+
content: '💭 先理解问题',
|
|
553
|
+
});
|
|
554
|
+
await gateway.onBridgeEvent({
|
|
555
|
+
type: 'update_message',
|
|
556
|
+
sessionKey: 'session:thread-1',
|
|
557
|
+
replyCtx: 'run-1',
|
|
558
|
+
previewHandle: 'thought-preview-1',
|
|
559
|
+
content: '💭 先理解问题,再检查代码',
|
|
560
|
+
});
|
|
561
|
+
await gateway.onBridgeEvent({
|
|
562
|
+
type: 'reply',
|
|
563
|
+
sessionKey: 'session:thread-1',
|
|
564
|
+
replyCtx: 'run-1',
|
|
565
|
+
content: '最终回答',
|
|
566
|
+
});
|
|
567
|
+
strict_1.default.equal(createdCards.length, 2);
|
|
568
|
+
strict_1.default.equal(createdCards[0]?.text, '💭 先理解问题');
|
|
569
|
+
strict_1.default.equal(createdCards[1]?.text, '最终回答');
|
|
570
|
+
strict_1.default.equal(patchedCards.length, 1);
|
|
571
|
+
strict_1.default.equal(patchedCards[0]?.messageId, 'lark-msg-1');
|
|
572
|
+
strict_1.default.equal(patchedCards[0]?.text, '💭 先理解问题,再检查代码');
|
|
573
|
+
strict_1.default.deepEqual(storedMessageIds, ['lark-msg-2']);
|
|
574
|
+
});
|
|
575
|
+
(0, node_test_1.default)('lark bridge does not leave typing placeholders or throttle thought updates', async () => {
|
|
576
|
+
const createdCards = [];
|
|
577
|
+
const patchedCards = [];
|
|
578
|
+
const client = {
|
|
579
|
+
im: {
|
|
580
|
+
message: {
|
|
581
|
+
create: async (request) => {
|
|
582
|
+
const messageId = `lark-msg-${createdCards.length + 1}`;
|
|
583
|
+
const card = JSON.parse(String(request.data.content || '{}'));
|
|
584
|
+
createdCards.push({
|
|
585
|
+
messageId,
|
|
586
|
+
text: String(card.elements?.[0]?.content || ''),
|
|
587
|
+
});
|
|
588
|
+
return { data: { message_id: messageId } };
|
|
589
|
+
},
|
|
590
|
+
patch: async (request) => {
|
|
591
|
+
const card = JSON.parse(String(request.data.content || '{}'));
|
|
592
|
+
patchedCards.push({
|
|
593
|
+
messageId: String(request.path.message_id || ''),
|
|
594
|
+
text: String(card.elements?.[0]?.content || ''),
|
|
595
|
+
});
|
|
596
|
+
},
|
|
597
|
+
},
|
|
598
|
+
},
|
|
599
|
+
};
|
|
600
|
+
const gateway = new local_core_lark_gateway_js_1.LocalCoreLarkGateway({
|
|
601
|
+
store: {
|
|
602
|
+
getPlatformThreadBinding: () => ({
|
|
603
|
+
workspace_id: 'default',
|
|
604
|
+
platform: 'lark',
|
|
605
|
+
chat_id: 'chat-1',
|
|
606
|
+
platform_user_id: 'user-1',
|
|
607
|
+
thread_id: 'thread-1',
|
|
608
|
+
last_platform_message_id: null,
|
|
609
|
+
}),
|
|
610
|
+
updatePlatformThreadMessageId: () => { },
|
|
611
|
+
},
|
|
612
|
+
readConfig: async () => null,
|
|
613
|
+
getWorkspaceRouter: () => ({}),
|
|
614
|
+
eventBus: { emit: () => { }, on: () => () => { } },
|
|
615
|
+
});
|
|
616
|
+
const internals = gateway;
|
|
617
|
+
internals.runtime.set('default', {
|
|
618
|
+
workspaceId: 'default',
|
|
619
|
+
enabled: true,
|
|
620
|
+
status: 'running',
|
|
621
|
+
connected: true,
|
|
622
|
+
appId: 'app-1',
|
|
623
|
+
client,
|
|
624
|
+
});
|
|
625
|
+
internals.threadRouting.set('session:thread-1', {
|
|
626
|
+
workspaceId: 'default',
|
|
627
|
+
platformUserId: 'user-1',
|
|
628
|
+
chatId: 'chat-1',
|
|
629
|
+
threadId: 'thread-1',
|
|
630
|
+
});
|
|
631
|
+
await gateway.onBridgeEvent({
|
|
632
|
+
type: 'typing_start',
|
|
633
|
+
sessionKey: 'session:thread-1',
|
|
634
|
+
replyCtx: 'run-1',
|
|
635
|
+
});
|
|
636
|
+
await gateway.onBridgeEvent({
|
|
637
|
+
type: 'preview_start',
|
|
638
|
+
sessionKey: 'session:thread-1',
|
|
639
|
+
replyCtx: 'run-1',
|
|
640
|
+
previewHandle: 'thought-preview-1',
|
|
641
|
+
content: '💭 The user',
|
|
642
|
+
});
|
|
643
|
+
await gateway.onBridgeEvent({
|
|
644
|
+
type: 'update_message',
|
|
645
|
+
sessionKey: 'session:thread-1',
|
|
646
|
+
replyCtx: 'run-1',
|
|
647
|
+
previewHandle: 'thought-preview-1',
|
|
648
|
+
content: '💭 The user sent a short casual message.',
|
|
649
|
+
});
|
|
650
|
+
await gateway.onBridgeEvent({
|
|
651
|
+
type: 'update_message',
|
|
652
|
+
sessionKey: 'session:thread-1',
|
|
653
|
+
replyCtx: 'run-1',
|
|
654
|
+
previewHandle: 'thought-preview-1',
|
|
655
|
+
content: '💭 The user sent a short casual message. I should reply briefly.',
|
|
656
|
+
});
|
|
657
|
+
await gateway.onBridgeEvent({
|
|
658
|
+
type: 'typing_stop',
|
|
659
|
+
sessionKey: 'session:thread-1',
|
|
660
|
+
replyCtx: 'run-1',
|
|
661
|
+
});
|
|
662
|
+
strict_1.default.deepEqual(createdCards.map((card) => card.text), ['💭 The user']);
|
|
663
|
+
strict_1.default.deepEqual(patchedCards.map((card) => card.text), [
|
|
664
|
+
'💭 The user sent a short casual message.',
|
|
665
|
+
'💭 The user sent a short casual message. I should reply briefly.',
|
|
666
|
+
]);
|
|
667
|
+
strict_1.default.ok(!createdCards.some((card) => /处理中|正在思考/.test(card.text)));
|
|
668
|
+
});
|
|
669
|
+
(0, node_test_1.default)('lark permission requests render as clickable card buttons', async () => {
|
|
670
|
+
const createdCards = [];
|
|
671
|
+
const threadActions = [];
|
|
672
|
+
const client = {
|
|
673
|
+
im: {
|
|
674
|
+
message: {
|
|
675
|
+
create: async (request) => {
|
|
676
|
+
createdCards.push(JSON.parse(String(request.data.content || '{}')));
|
|
677
|
+
return { data: { message_id: 'permission-msg-1' } };
|
|
678
|
+
},
|
|
679
|
+
patch: async () => { },
|
|
680
|
+
},
|
|
681
|
+
},
|
|
682
|
+
};
|
|
683
|
+
const gateway = new local_core_lark_gateway_js_1.LocalCoreLarkGateway({
|
|
684
|
+
store: {
|
|
685
|
+
getPlatformThreadBinding: () => ({
|
|
686
|
+
workspace_id: 'default',
|
|
687
|
+
platform: 'lark',
|
|
688
|
+
chat_id: 'chat-1',
|
|
689
|
+
platform_user_id: 'user-1',
|
|
690
|
+
thread_id: 'thread-1',
|
|
691
|
+
last_platform_message_id: null,
|
|
692
|
+
}),
|
|
693
|
+
},
|
|
694
|
+
readConfig: async () => null,
|
|
695
|
+
getWorkspaceRouter: () => ({
|
|
696
|
+
sendThreadAction: async (threadId, action) => {
|
|
697
|
+
threadActions.push({ threadId, action });
|
|
698
|
+
return { runId: 'run-1' };
|
|
699
|
+
},
|
|
700
|
+
}),
|
|
701
|
+
eventBus: { emit: () => { }, on: () => () => { } },
|
|
702
|
+
});
|
|
703
|
+
const internals = gateway;
|
|
704
|
+
internals.runtime.set('default', {
|
|
705
|
+
workspaceId: 'default',
|
|
706
|
+
enabled: true,
|
|
707
|
+
status: 'running',
|
|
708
|
+
connected: true,
|
|
709
|
+
appId: 'app-1',
|
|
710
|
+
cardActionsEnabled: true,
|
|
711
|
+
client,
|
|
712
|
+
});
|
|
713
|
+
internals.threadRouting.set('session:thread-1', {
|
|
714
|
+
workspaceId: 'default',
|
|
715
|
+
platformUserId: 'user-1',
|
|
716
|
+
chatId: 'chat-1',
|
|
717
|
+
threadId: 'thread-1',
|
|
718
|
+
});
|
|
719
|
+
await gateway.onBridgeEvent({
|
|
720
|
+
type: 'buttons',
|
|
721
|
+
sessionKey: 'session:thread-1',
|
|
722
|
+
replyCtx: 'run-1',
|
|
723
|
+
content: [
|
|
724
|
+
'等待工具确认',
|
|
725
|
+
'',
|
|
726
|
+
'Terminal',
|
|
727
|
+
'',
|
|
728
|
+
'parameters:',
|
|
729
|
+
'{"command":"ls"}',
|
|
730
|
+
'',
|
|
731
|
+
'请选择一个选项继续执行。',
|
|
732
|
+
].join('\n'),
|
|
733
|
+
buttonRows: [[
|
|
734
|
+
{ text: 'allow', data: 'allow' },
|
|
735
|
+
{ text: 'allow all', data: 'allow all' },
|
|
736
|
+
{ text: 'deny', data: 'deny' },
|
|
737
|
+
]],
|
|
738
|
+
});
|
|
739
|
+
const actionElement = createdCards[0]?.elements?.find((element) => element.tag === 'action');
|
|
740
|
+
strict_1.default.equal(createdCards.length, 1);
|
|
741
|
+
strict_1.default.match(createdCards[0]?.elements?.[0]?.content || '', /需要工具确认/);
|
|
742
|
+
strict_1.default.deepEqual(actionElement?.actions?.map((action) => ({
|
|
743
|
+
label: action.text?.content,
|
|
744
|
+
type: action.type,
|
|
745
|
+
response: action.value?.response,
|
|
746
|
+
threadId: action.value?.thread_id,
|
|
747
|
+
})), [
|
|
748
|
+
{ label: '允许一次', type: 'primary', response: 'allow', threadId: 'thread-1' },
|
|
749
|
+
{ label: '始终允许', type: 'default', response: 'allow all', threadId: 'thread-1' },
|
|
750
|
+
{ label: '拒绝', type: 'danger', response: 'deny', threadId: 'thread-1' },
|
|
751
|
+
]);
|
|
752
|
+
await internals.handleCardActionEvent('default', {
|
|
753
|
+
event: {
|
|
754
|
+
action: {
|
|
755
|
+
value: {
|
|
756
|
+
action: 'permission_response',
|
|
757
|
+
response: 'allow all',
|
|
758
|
+
thread_id: 'thread-1',
|
|
759
|
+
},
|
|
760
|
+
},
|
|
761
|
+
},
|
|
762
|
+
});
|
|
763
|
+
strict_1.default.deepEqual(threadActions, [
|
|
764
|
+
{ threadId: 'thread-1', action: 'allow all' },
|
|
765
|
+
]);
|
|
766
|
+
});
|
|
767
|
+
(0, node_test_1.default)('lark permission requests fall back to text commands when card actions are disabled', async () => {
|
|
768
|
+
const createdCards = [];
|
|
769
|
+
const gateway = new local_core_lark_gateway_js_1.LocalCoreLarkGateway({
|
|
770
|
+
store: {
|
|
771
|
+
getPlatformThreadBinding: () => ({
|
|
772
|
+
workspace_id: 'default',
|
|
773
|
+
platform: 'lark',
|
|
774
|
+
chat_id: 'chat-1',
|
|
775
|
+
platform_user_id: 'user-1',
|
|
776
|
+
thread_id: 'thread-1',
|
|
777
|
+
last_platform_message_id: null,
|
|
778
|
+
}),
|
|
779
|
+
},
|
|
780
|
+
readConfig: async () => null,
|
|
781
|
+
getWorkspaceRouter: () => ({}),
|
|
782
|
+
eventBus: { emit: () => { }, on: () => () => { } },
|
|
783
|
+
});
|
|
784
|
+
const internals = gateway;
|
|
785
|
+
internals.runtime.set('default', {
|
|
786
|
+
workspaceId: 'default',
|
|
787
|
+
enabled: true,
|
|
788
|
+
status: 'running',
|
|
789
|
+
connected: true,
|
|
790
|
+
appId: 'app-1',
|
|
791
|
+
cardActionsEnabled: false,
|
|
792
|
+
client: {
|
|
793
|
+
im: {
|
|
794
|
+
message: {
|
|
795
|
+
create: async (request) => {
|
|
796
|
+
createdCards.push(JSON.parse(String(request.data.content || '{}')));
|
|
797
|
+
return { data: { message_id: 'permission-msg-1' } };
|
|
798
|
+
},
|
|
799
|
+
patch: async () => { },
|
|
800
|
+
},
|
|
801
|
+
},
|
|
802
|
+
},
|
|
803
|
+
});
|
|
804
|
+
internals.threadRouting.set('session:thread-1', {
|
|
805
|
+
workspaceId: 'default',
|
|
806
|
+
platformUserId: 'user-1',
|
|
807
|
+
chatId: 'chat-1',
|
|
808
|
+
threadId: 'thread-1',
|
|
809
|
+
});
|
|
810
|
+
await gateway.onBridgeEvent({
|
|
811
|
+
type: 'buttons',
|
|
812
|
+
sessionKey: 'session:thread-1',
|
|
813
|
+
replyCtx: 'run-1',
|
|
814
|
+
content: '等待工具确认\n\nTerminal\n\n请选择一个选项继续执行。',
|
|
815
|
+
buttonRows: [[
|
|
816
|
+
{ text: 'allow', data: 'allow' },
|
|
817
|
+
{ text: 'deny', data: 'deny' },
|
|
818
|
+
]],
|
|
819
|
+
});
|
|
820
|
+
strict_1.default.equal(createdCards.length, 1);
|
|
821
|
+
strict_1.default.match(createdCards[0]?.elements?.[0]?.content || '', /请直接回复/);
|
|
822
|
+
strict_1.default.equal(createdCards[0]?.elements?.some((element) => element.tag === 'action'), false);
|
|
823
|
+
});
|
|
824
|
+
(0, node_test_1.default)('lark message callbacks acknowledge before long thread runs finish', async () => {
|
|
825
|
+
let registeredHandlers = {};
|
|
826
|
+
let sentMessages = 0;
|
|
827
|
+
const logs = [];
|
|
828
|
+
const gateway = new local_core_lark_gateway_js_1.LocalCoreLarkGateway({
|
|
829
|
+
store: {
|
|
830
|
+
expirePendingPairings: () => { },
|
|
831
|
+
getAuthorizedUser: () => ({
|
|
832
|
+
id: 'auth-1',
|
|
833
|
+
workspace_id: 'default',
|
|
834
|
+
platform_user_id: 'user-1',
|
|
835
|
+
chat_id: 'chat-1',
|
|
836
|
+
display_name: 'User',
|
|
837
|
+
thread_id: 'thread-1',
|
|
838
|
+
}),
|
|
839
|
+
getPlatformThreadBinding: () => ({
|
|
840
|
+
workspace_id: 'default',
|
|
841
|
+
platform: 'lark',
|
|
842
|
+
chat_id: 'chat-1',
|
|
843
|
+
platform_user_id: 'user-1',
|
|
844
|
+
thread_id: 'thread-1',
|
|
845
|
+
last_platform_message_id: null,
|
|
846
|
+
}),
|
|
847
|
+
getLatestRunForThread: () => null,
|
|
848
|
+
clearPlatformThreadMessageId: () => { },
|
|
849
|
+
listPendingPairings: () => [],
|
|
850
|
+
listAuthorizedUsers: () => [],
|
|
851
|
+
},
|
|
852
|
+
readConfig: async () => ({
|
|
853
|
+
projects: [
|
|
854
|
+
{
|
|
855
|
+
name: 'default',
|
|
856
|
+
agent: { type: 'claudecode', providers: [] },
|
|
857
|
+
platforms: [{ type: 'lark', options: { app_id: 'app-1', app_secret: 'secret-1', auto_approve: true } }],
|
|
858
|
+
},
|
|
859
|
+
],
|
|
860
|
+
}),
|
|
861
|
+
getWorkspaceRouter: () => ({
|
|
862
|
+
getThreadSessionKey: (threadId) => `session:${threadId}`,
|
|
863
|
+
sendThreadMessage: async () => {
|
|
864
|
+
sentMessages++;
|
|
865
|
+
return new Promise(() => { });
|
|
866
|
+
},
|
|
867
|
+
}),
|
|
868
|
+
eventBus: { emit: () => { }, on: () => () => { } },
|
|
869
|
+
log: (message) => logs.push(message),
|
|
870
|
+
});
|
|
871
|
+
gateway.larkModulePromise = Promise.resolve({
|
|
872
|
+
AppType: { SelfBuild: 'self-build' },
|
|
873
|
+
Domain: { Feishu: 'feishu' },
|
|
874
|
+
LoggerLevel: { info: 'info' },
|
|
875
|
+
Client: class {
|
|
876
|
+
},
|
|
877
|
+
EventDispatcher: class {
|
|
878
|
+
register(handlers) {
|
|
879
|
+
registeredHandlers = handlers;
|
|
880
|
+
}
|
|
881
|
+
},
|
|
882
|
+
WSClient: class {
|
|
883
|
+
async start() { }
|
|
884
|
+
},
|
|
885
|
+
});
|
|
886
|
+
await gateway.enable('default');
|
|
887
|
+
const handler = registeredHandlers['im.message.receive_v1'];
|
|
888
|
+
strict_1.default.equal(typeof handler, 'function');
|
|
889
|
+
const result = await Promise.race([
|
|
890
|
+
handler({
|
|
891
|
+
event: {
|
|
892
|
+
sender: { sender_id: { user_id: 'user-1' } },
|
|
893
|
+
message: {
|
|
894
|
+
message_id: 'msg-1',
|
|
895
|
+
chat_id: 'chat-1',
|
|
896
|
+
message_type: 'text',
|
|
897
|
+
content: JSON.stringify({ text: 'hi' }),
|
|
898
|
+
},
|
|
899
|
+
},
|
|
900
|
+
}),
|
|
901
|
+
new Promise((resolve) => setTimeout(() => resolve('timed-out'), 25)),
|
|
902
|
+
]);
|
|
903
|
+
strict_1.default.notEqual(result, 'timed-out');
|
|
904
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
905
|
+
strict_1.default.equal(sentMessages, 1);
|
|
906
|
+
strict_1.default.ok(logs.some((line) => line.includes('received im.message.receive_v1') &&
|
|
907
|
+
line.includes('message=msg-1') &&
|
|
908
|
+
line.includes('type=text') &&
|
|
909
|
+
line.includes('chat=chat-1') &&
|
|
910
|
+
line.includes('sender=user-1')));
|
|
911
|
+
strict_1.default.ok(logs.some((line) => line.includes('handling message event') && line.includes('contentBytes=')));
|
|
912
|
+
});
|
|
487
913
|
(0, node_test_1.default)('ACP skips empty generic running tool updates', () => {
|
|
488
914
|
const appended = [];
|
|
489
915
|
const emitted = [];
|
|
@@ -408,6 +408,40 @@ function plugin(id, dependsOn = []) {
|
|
|
408
408
|
(0, node_fs_1.rmSync)(userDataPath, { recursive: true, force: true });
|
|
409
409
|
}
|
|
410
410
|
});
|
|
411
|
+
(0, node_test_1.default)('controller logs are persisted to local-core.log', () => {
|
|
412
|
+
const userDataPath = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'agentdock-controller-logs-'));
|
|
413
|
+
try {
|
|
414
|
+
const runtime = (0, bootstrap_js_2.bootstrapLocalCoreRuntime)({
|
|
415
|
+
userDataPath,
|
|
416
|
+
enableKnowledge: false,
|
|
417
|
+
});
|
|
418
|
+
const controller = new local_core_controller_js_1.LocalCoreController(userDataPath, runtime);
|
|
419
|
+
const emittedLogs = [];
|
|
420
|
+
controller.on('logs', (line) => emittedLogs.push(line));
|
|
421
|
+
controller.handleLog('localcore-lark inbound message for project-1');
|
|
422
|
+
const logPath = (0, node_path_1.join)(userDataPath, 'runtime', 'local-core.log');
|
|
423
|
+
const raw = (0, node_fs_1.readFileSync)(logPath, 'utf-8');
|
|
424
|
+
strict_1.default.deepEqual(emittedLogs, ['localcore-lark inbound message for project-1']);
|
|
425
|
+
strict_1.default.match(raw, /^\d{4}-\d{2}-\d{2}T.* localcore-lark inbound message for project-1/m);
|
|
426
|
+
}
|
|
427
|
+
finally {
|
|
428
|
+
(0, node_fs_1.rmSync)(userDataPath, { recursive: true, force: true });
|
|
429
|
+
}
|
|
430
|
+
});
|
|
431
|
+
(0, node_test_1.default)('controller buffers bootstrap logs until runtime state is assigned', () => {
|
|
432
|
+
const userDataPath = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'agentdock-bootstrap-logs-'));
|
|
433
|
+
try {
|
|
434
|
+
const controller = new local_core_controller_js_1.LocalCoreController(userDataPath);
|
|
435
|
+
const logPath = (0, node_path_1.join)(userDataPath, 'runtime', 'local-core.log');
|
|
436
|
+
const raw = (0, node_fs_1.readFileSync)(logPath, 'utf-8');
|
|
437
|
+
strict_1.default.match(raw, /\[plugin:builtin\.agent-codex\] registered/);
|
|
438
|
+
strict_1.default.equal((raw.match(/\[plugin:builtin\.agent-codex\] registered/g) || []).length, 1);
|
|
439
|
+
void controller.close();
|
|
440
|
+
}
|
|
441
|
+
finally {
|
|
442
|
+
(0, node_fs_1.rmSync)(userDataPath, { recursive: true, force: true });
|
|
443
|
+
}
|
|
444
|
+
});
|
|
411
445
|
(0, node_test_1.default)('channel plugin lifecycle start and stop are driven by the kernel lifecycle', async () => {
|
|
412
446
|
const calls = [];
|
|
413
447
|
const registry = new plugin_registry_js_1.LocalCorePluginRegistry();
|