@kafca/agentdock 0.1.41 → 0.1.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/dist/renderer/assets/{Badge-BX3RC8l6.js → Badge-D-WU4kUV.js} +1 -1
- package/dist/renderer/assets/{Chat-DJwIciel.js → Chat-BGkC5tAe.js} +1 -1
- package/dist/renderer/assets/{ChatMarkdown-DfGbRR0S.js → ChatMarkdown-CfbC1jRd.js} +1 -1
- package/dist/renderer/assets/{Config-2x2RDL3j.js → Config-qQb4bX5D.js} +1 -1
- package/dist/renderer/assets/{CronList-C6nPAmEo.js → CronList-CKhggzYk.js} +1 -1
- package/dist/renderer/assets/{Dashboard-2Wcx_bvJ.js → Dashboard-xn6cUy_n.js} +2 -2
- package/dist/renderer/assets/{EmptyState-DoCpF2tn.js → EmptyState-BdKBBUpr.js} +1 -1
- package/dist/renderer/assets/{KnowledgeDetail-CBRu2bXX.js → KnowledgeDetail-Duk8IQP3.js} +1 -1
- package/dist/renderer/assets/{KnowledgeHome-CItdlDVR.js → KnowledgeHome-BfjX_4Sv.js} +1 -1
- package/dist/renderer/assets/{Logs-Cd_7ZOXc.js → Logs-Bfq61QMn.js} +1 -1
- package/dist/renderer/assets/{Modal-B4eOiBsB.js → Modal-B3vlBmBr.js} +1 -1
- package/dist/renderer/assets/{Page-C5VH4D9U.js → Page-CPsLOP3z.js} +1 -1
- package/dist/renderer/assets/{ProjectDetail-D_DA--IP.js → ProjectDetail-D-g46wyF.js} +1 -1
- package/dist/renderer/assets/{ProjectList-CtCXJ50u.js → ProjectList-BrQEKDQ8.js} +1 -1
- package/dist/renderer/assets/{Select-B6E68LcN.js → Select-C4CFMQmF.js} +1 -1
- package/dist/renderer/assets/{SessionChat-D1HtMdQS.js → SessionChat-06Jny5_G.js} +1 -1
- package/dist/renderer/assets/{SessionList-Do-5-Xx6.js → SessionList-DPWIUbOg.js} +1 -1
- package/dist/renderer/assets/{ThreadChat-B1tEtE3V.js → ThreadChat-BjtU-j9q.js} +1 -1
- package/dist/renderer/assets/{Workspace-BlhS2RFw.js → Workspace-BcNmHuJx.js} +1 -1
- package/dist/renderer/assets/{arrow-left-DF1_F9Pk.js → arrow-left-DPzSmidS.js} +1 -1
- package/dist/renderer/assets/{book-open-DxRTGpWO.js → book-open-B0xhoRqZ.js} +1 -1
- package/dist/renderer/assets/{check-BAqPPYkf.js → check-BTJTyd0C.js} +1 -1
- package/dist/renderer/assets/{chevron-down-DIZZgSb3.js → chevron-down-B6jJXlhi.js} +1 -1
- package/dist/renderer/assets/{circle-B5raL_XK.js → circle-qRhJR9qR.js} +1 -1
- package/dist/renderer/assets/{desktop-CFcnzwcY.js → desktop-DXmXjjUR.js} +1 -1
- package/dist/renderer/assets/{funnel-BPjLpVSB.js → funnel-CbYKGTn8.js} +1 -1
- package/dist/renderer/assets/{heart-D2M1xN1N.js → heart-DjwWJfkz.js} +1 -1
- package/dist/renderer/assets/{index-Cx71F_Lz.js → index-BWmHJRhe.js} +2 -2
- package/dist/renderer/assets/{index-BijJAYmo.js → index-CyZs_2NJ.js} +1 -1
- package/dist/renderer/assets/{pencil-DlDr8Mmp.js → pencil-1dfAivmj.js} +1 -1
- package/dist/renderer/assets/{play-BOEG_mY8.js → play-CB3w1G6S.js} +1 -1
- package/dist/renderer/assets/{plug-BI27elC-.js → plug-Bvep5o3r.js} +1 -1
- package/dist/renderer/assets/{plus-BhURuFIQ.js → plus-DJVg9m09.js} +1 -1
- package/dist/renderer/assets/projects-xnW0fTtq.js +1 -0
- package/dist/renderer/assets/{save-RwkHNm9e.js → save-xjJn3qf2.js} +1 -1
- package/dist/renderer/assets/{search-DMNtm2WP.js → search-BK3UrQxM.js} +1 -1
- package/dist/renderer/assets/{server-CNaxKyAq.js → server-Dyd2eXJu.js} +1 -1
- package/dist/renderer/assets/{session-utils-vsALZkZN.js → session-utils-eXC0020s.js} +1 -1
- package/dist/renderer/assets/{sessions-BY-R1IL_.js → sessions-WLYpkyUt.js} +1 -1
- package/dist/renderer/assets/{shield-check-BF-4oJbj.js → shield-check-C0N6aWzF.js} +1 -1
- package/dist/renderer/assets/{trash-2-DduflM4q.js → trash-2-BGMTNJA6.js} +1 -1
- package/dist/renderer/assets/{user-DBcvnuW4.js → user-BcGMLyhu.js} +1 -1
- package/dist/renderer/assets/{wifi-off-X1nXESYu.js → wifi-off-FhcQx0HK.js} +1 -1
- package/dist/renderer/index.html +1 -1
- package/dist-electron/services/local-ai-core/src/acp/local-core-acp-backend.js +25 -39
- package/dist-electron/services/local-ai-core/src/acp/local-core-acp-session-coordinator.js +13 -0
- package/dist-electron/services/local-ai-core/src/acp/local-core-acp-store.js +7 -0
- package/dist-electron/services/local-ai-core/src/acp/local-core-slash-commands.js +28 -0
- package/dist-electron/services/local-ai-core/src/router/workspace-router.js +40 -4
- package/dist-electron/services/local-ai-core/src/thread/thread-command-service.js +134 -0
- package/dist-electron/tests/electron/plugin-kernel.test.js +26 -0
- package/dist-electron/tests/integration/local-core-refactor.test.js +165 -0
- package/package.json +1 -1
- package/dist/renderer/assets/projects-DpR972HM.js +0 -1
|
@@ -302,6 +302,32 @@ type = "codex"
|
|
|
302
302
|
(0, node_fs_1.rmSync)(userDataPath, { recursive: true, force: true });
|
|
303
303
|
}
|
|
304
304
|
});
|
|
305
|
+
(0, node_test_1.default)('thread slash agent reset resolves the workspace default agent through the router', async () => {
|
|
306
|
+
const userDataPath = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'agentdock-kernel-agent-reset-'));
|
|
307
|
+
try {
|
|
308
|
+
const runtime = (0, bootstrap_js_2.bootstrapLocalCoreRuntime)({
|
|
309
|
+
userDataPath,
|
|
310
|
+
enableKnowledge: false,
|
|
311
|
+
});
|
|
312
|
+
await runtime.state.saveRawConfigFile(`
|
|
313
|
+
[[projects]]
|
|
314
|
+
name = "agent-workspace"
|
|
315
|
+
|
|
316
|
+
[projects.agent]
|
|
317
|
+
type = "codex"
|
|
318
|
+
`);
|
|
319
|
+
const thread = await runtime.workspaceRouter.createThread('agent-workspace', 'Agent reset');
|
|
320
|
+
await runtime.workspaceRouter.sendThreadMessage(thread.id, '/agent use pi');
|
|
321
|
+
strict_1.default.equal(runtime.store.getThreadRow(thread.id)?.agent_type, 'pi');
|
|
322
|
+
await runtime.workspaceRouter.sendThreadMessage(thread.id, '/agent reset');
|
|
323
|
+
strict_1.default.equal(runtime.store.getThreadRow(thread.id)?.agent_type, 'codex');
|
|
324
|
+
strict_1.default.match(runtime.store.getThread(thread.id, []).messages.at(-1)?.content || '', /回到默认 Agent:codex/);
|
|
325
|
+
await runtime.stop();
|
|
326
|
+
}
|
|
327
|
+
finally {
|
|
328
|
+
(0, node_fs_1.rmSync)(userDataPath, { recursive: true, force: true });
|
|
329
|
+
}
|
|
330
|
+
});
|
|
305
331
|
(0, node_test_1.default)('hermes agent runtime routes projects through hermes ACP command', async () => {
|
|
306
332
|
const userDataPath = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'agentdock-kernel-'));
|
|
307
333
|
try {
|
|
@@ -18,8 +18,10 @@ const local_schedule_adapter_js_1 = require("../../services/local-ai-core/src/sc
|
|
|
18
18
|
const local_core_weixin_gateway_js_1 = require("../../services/local-ai-core/src/channel/weixin/local-core-weixin-gateway.js");
|
|
19
19
|
const local_core_lark_gateway_js_1 = require("../../services/local-ai-core/src/channel/lark/local-core-lark-gateway.js");
|
|
20
20
|
const runtime_state_js_1 = require("../../services/local-ai-core/src/channel/lark/runtime-state.js");
|
|
21
|
+
const local_core_acp_backend_js_1 = require("../../services/local-ai-core/src/acp/local-core-acp-backend.js");
|
|
21
22
|
const local_core_acp_turn_coordinator_js_1 = require("../../services/local-ai-core/src/acp/local-core-acp-turn-coordinator.js");
|
|
22
23
|
const local_core_acp_store_js_1 = require("../../services/local-ai-core/src/acp/local-core-acp-store.js");
|
|
24
|
+
const thread_command_service_js_1 = require("../../services/local-ai-core/src/thread/thread-command-service.js");
|
|
23
25
|
const local_core_acp_progress_js_1 = require("../../services/local-ai-core/src/acp/local-core-acp-progress.js");
|
|
24
26
|
const local_core_acp_permission_lifecycle_js_1 = require("../../services/local-ai-core/src/acp/local-core-acp-permission-lifecycle.js");
|
|
25
27
|
const workspace_acp_permissions_js_1 = require("../../services/local-ai-core/src/acp/workspace-acp-permissions.js");
|
|
@@ -3718,6 +3720,94 @@ function findLarkPostMdText(content) {
|
|
|
3718
3720
|
strict_1.default.equal((0, local_core_slash_commands_js_1.formatAgentMode)('bypassPermissions'), 'yolo');
|
|
3719
3721
|
strict_1.default.match((0, local_core_slash_commands_js_1.modeHelpText)('bypassPermissions'), /当前模式:yolo/);
|
|
3720
3722
|
});
|
|
3723
|
+
(0, node_test_1.default)('slash agent commands normalize aliases and expose current help', () => {
|
|
3724
|
+
strict_1.default.deepEqual((0, local_core_slash_commands_js_1.parseSlashCommand)('/agent use Pi'), { name: 'agent', args: ['use', 'Pi'] });
|
|
3725
|
+
strict_1.default.equal((0, local_core_slash_commands_js_1.normalizeAgentCommandTarget)('Pi'), 'pi');
|
|
3726
|
+
strict_1.default.equal((0, local_core_slash_commands_js_1.normalizeAgentCommandTarget)('claude'), 'claudecode');
|
|
3727
|
+
strict_1.default.equal((0, local_core_slash_commands_js_1.normalizeAgentCommandTarget)('claude-code'), 'claudecode');
|
|
3728
|
+
strict_1.default.match((0, local_core_slash_commands_js_1.agentHelpText)({
|
|
3729
|
+
currentAgent: 'pi',
|
|
3730
|
+
defaultAgent: 'codex',
|
|
3731
|
+
availableAgents: ['codex', 'pi', 'hermes'],
|
|
3732
|
+
}), /当前线程 Agent:pi/);
|
|
3733
|
+
});
|
|
3734
|
+
(0, node_test_1.default)('thread command service handles local slash commands without ACP transport', async () => {
|
|
3735
|
+
const row = {
|
|
3736
|
+
id: 'thread-1',
|
|
3737
|
+
workspace_id: 'workspace-a',
|
|
3738
|
+
session_id: 'session-1',
|
|
3739
|
+
bridge_session_key: 'bridge-1',
|
|
3740
|
+
title: 'Command service',
|
|
3741
|
+
agent_type: 'codex',
|
|
3742
|
+
created_at: '2026-05-11T00:00:00.000Z',
|
|
3743
|
+
updated_at: '2026-05-11T00:00:00.000Z',
|
|
3744
|
+
history_count: 0,
|
|
3745
|
+
excerpt: '',
|
|
3746
|
+
acp_session_id: null,
|
|
3747
|
+
acp_supports_load: 0,
|
|
3748
|
+
agent_mode: 'default',
|
|
3749
|
+
};
|
|
3750
|
+
const audits = [];
|
|
3751
|
+
const syncedModes = [];
|
|
3752
|
+
const closedThreads = [];
|
|
3753
|
+
const service = new thread_command_service_js_1.ThreadCommandService({
|
|
3754
|
+
getThreadRow: () => row,
|
|
3755
|
+
updateThreadAgentMode: (_threadId, mode) => {
|
|
3756
|
+
row.agent_mode = mode;
|
|
3757
|
+
},
|
|
3758
|
+
updateThreadAgentType: (_threadId, agentType) => {
|
|
3759
|
+
row.agent_type = agentType;
|
|
3760
|
+
},
|
|
3761
|
+
getLatestRunForThread: () => undefined,
|
|
3762
|
+
createAuditEvent: (input) => {
|
|
3763
|
+
audits.push(input);
|
|
3764
|
+
},
|
|
3765
|
+
getAgentTypes: () => ['codex', 'pi', 'hermes', 'claudecode'],
|
|
3766
|
+
setThreadMode: async (_threadId, mode) => {
|
|
3767
|
+
syncedModes.push(mode);
|
|
3768
|
+
},
|
|
3769
|
+
closeThreadSession: (threadId) => {
|
|
3770
|
+
closedThreads.push(threadId);
|
|
3771
|
+
},
|
|
3772
|
+
});
|
|
3773
|
+
strict_1.default.deepEqual(await service.execute({
|
|
3774
|
+
threadId: row.id,
|
|
3775
|
+
workspaceId: row.workspace_id,
|
|
3776
|
+
content: '/not-local',
|
|
3777
|
+
defaultAgentType: 'codex',
|
|
3778
|
+
}), { handled: false, displayText: '' });
|
|
3779
|
+
const modeResult = await service.execute({
|
|
3780
|
+
threadId: row.id,
|
|
3781
|
+
workspaceId: row.workspace_id,
|
|
3782
|
+
content: '/mode yolo',
|
|
3783
|
+
defaultAgentType: 'codex',
|
|
3784
|
+
});
|
|
3785
|
+
strict_1.default.equal(modeResult.handled, true);
|
|
3786
|
+
strict_1.default.equal(row.agent_mode, 'bypassPermissions');
|
|
3787
|
+
strict_1.default.deepEqual(syncedModes, ['bypassPermissions']);
|
|
3788
|
+
strict_1.default.equal(audits.at(-1)?.type, 'permission.changed');
|
|
3789
|
+
const agentResult = await service.execute({
|
|
3790
|
+
threadId: row.id,
|
|
3791
|
+
workspaceId: row.workspace_id,
|
|
3792
|
+
content: '/agent use pi',
|
|
3793
|
+
defaultAgentType: 'codex',
|
|
3794
|
+
});
|
|
3795
|
+
strict_1.default.equal(agentResult.handled, true);
|
|
3796
|
+
strict_1.default.equal(row.agent_type, 'pi');
|
|
3797
|
+
strict_1.default.match(agentResult.displayText, /已将当前线程 Agent 切换为 pi/);
|
|
3798
|
+
strict_1.default.deepEqual(closedThreads, ['thread-1']);
|
|
3799
|
+
strict_1.default.equal(audits.at(-1)?.type, 'agent.changed');
|
|
3800
|
+
const resetResult = await service.execute({
|
|
3801
|
+
threadId: row.id,
|
|
3802
|
+
workspaceId: row.workspace_id,
|
|
3803
|
+
content: '/agent reset',
|
|
3804
|
+
defaultAgentType: 'codex',
|
|
3805
|
+
});
|
|
3806
|
+
strict_1.default.equal(resetResult.handled, true);
|
|
3807
|
+
strict_1.default.equal(row.agent_type, 'codex');
|
|
3808
|
+
strict_1.default.match(resetResult.displayText, /回到默认 Agent:codex/);
|
|
3809
|
+
strict_1.default.deepEqual(closedThreads, ['thread-1', 'thread-1']);
|
|
3810
|
+
});
|
|
3721
3811
|
(0, node_test_1.default)('thread agent mode persists with thread state', () => {
|
|
3722
3812
|
const dir = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'agentdock-mode-'));
|
|
3723
3813
|
try {
|
|
@@ -3734,6 +3824,81 @@ function findLarkPostMdText(content) {
|
|
|
3734
3824
|
(0, node_fs_1.rmSync)(dir, { recursive: true, force: true });
|
|
3735
3825
|
}
|
|
3736
3826
|
});
|
|
3827
|
+
(0, node_test_1.default)('thread agent type persists and clears stale ACP session state', () => {
|
|
3828
|
+
const dir = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'agentdock-agent-type-'));
|
|
3829
|
+
try {
|
|
3830
|
+
const store = new local_core_acp_store_js_1.LocalCoreAcpStore(dir);
|
|
3831
|
+
const thread = store.createThread('workspace-a', 'Agent test', 'codex');
|
|
3832
|
+
store.updateThreadSession(thread.id, 'old-session', true);
|
|
3833
|
+
store.updateThreadAgentType(thread.id, 'pi');
|
|
3834
|
+
const row = store.getThreadRow(thread.id);
|
|
3835
|
+
strict_1.default.equal(row?.agent_type, 'pi');
|
|
3836
|
+
strict_1.default.equal(row?.acp_session_id, null);
|
|
3837
|
+
strict_1.default.equal(row?.acp_supports_load, 0);
|
|
3838
|
+
store.close();
|
|
3839
|
+
}
|
|
3840
|
+
finally {
|
|
3841
|
+
(0, node_fs_1.rmSync)(dir, { recursive: true, force: true });
|
|
3842
|
+
}
|
|
3843
|
+
});
|
|
3844
|
+
(0, node_test_1.default)('slash agent commands switch and reset the current thread agent', async () => {
|
|
3845
|
+
const dir = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'agentdock-agent-command-'));
|
|
3846
|
+
try {
|
|
3847
|
+
const store = new local_core_acp_store_js_1.LocalCoreAcpStore(dir);
|
|
3848
|
+
const thread = store.createThread('workspace-a', 'Agent command', 'codex');
|
|
3849
|
+
const bridgeEvents = [];
|
|
3850
|
+
const acceptedMessages = [];
|
|
3851
|
+
const backend = new local_core_acp_backend_js_1.LocalCoreAcpBackend({
|
|
3852
|
+
store,
|
|
3853
|
+
runThreadMap: new Map(),
|
|
3854
|
+
emitBridge: (event) => bridgeEvents.push(event),
|
|
3855
|
+
eventBus: {
|
|
3856
|
+
emit: (event) => acceptedMessages.push(event),
|
|
3857
|
+
on: () => () => { },
|
|
3858
|
+
},
|
|
3859
|
+
scheduler: {
|
|
3860
|
+
createJob: async () => { throw new Error('not used'); },
|
|
3861
|
+
listJobsForThread: async () => [],
|
|
3862
|
+
deleteJob: async () => { },
|
|
3863
|
+
},
|
|
3864
|
+
getAgentTypes: () => ['codex', 'pi', 'hermes', 'claudecode'],
|
|
3865
|
+
});
|
|
3866
|
+
const config = {
|
|
3867
|
+
workspaceId: 'workspace-a',
|
|
3868
|
+
agentType: 'codex',
|
|
3869
|
+
workDir: dir,
|
|
3870
|
+
command: process.execPath,
|
|
3871
|
+
args: ['-e', ''],
|
|
3872
|
+
env: {},
|
|
3873
|
+
model: '',
|
|
3874
|
+
};
|
|
3875
|
+
strict_1.default.deepEqual(await backend.sendThreadMessage(thread.id, '/agent use pi', config), { runId: '' });
|
|
3876
|
+
strict_1.default.equal(store.getThreadRow(thread.id)?.agent_type, 'pi');
|
|
3877
|
+
strict_1.default.match(store.getThread(thread.id, []).messages.at(-1)?.content || '', /已将当前线程 Agent 切换为 pi/);
|
|
3878
|
+
strict_1.default.equal(bridgeEvents.at(-2)?.type, 'reply');
|
|
3879
|
+
strict_1.default.match(bridgeEvents.at(-2)?.content || '', /后续消息将使用 pi 处理/);
|
|
3880
|
+
await backend.sendThreadMessage(thread.id, '/agent current', config);
|
|
3881
|
+
strict_1.default.match(store.getThread(thread.id, []).messages.at(-1)?.content || '', /来源:线程设置/);
|
|
3882
|
+
await backend.sendThreadMessage(thread.id, '/agent use claude', config);
|
|
3883
|
+
strict_1.default.equal(store.getThreadRow(thread.id)?.agent_type, 'claudecode');
|
|
3884
|
+
await backend.sendThreadMessage(thread.id, '/agent reset', config);
|
|
3885
|
+
strict_1.default.equal(store.getThreadRow(thread.id)?.agent_type, 'codex');
|
|
3886
|
+
strict_1.default.match(store.getThread(thread.id, []).messages.at(-1)?.content || '', /回到默认 Agent:codex/);
|
|
3887
|
+
await backend.sendThreadMessage(thread.id, '/agent use missing-agent', config);
|
|
3888
|
+
strict_1.default.equal(store.getThreadRow(thread.id)?.agent_type, 'codex');
|
|
3889
|
+
strict_1.default.match(store.getThread(thread.id, []).messages.at(-1)?.content || '', /未知 Agent:missing-agent/);
|
|
3890
|
+
store.updateRun('run-active', thread.id, 'running');
|
|
3891
|
+
await backend.sendThreadMessage(thread.id, '/agent use hermes', config);
|
|
3892
|
+
strict_1.default.equal(store.getThreadRow(thread.id)?.agent_type, 'hermes');
|
|
3893
|
+
strict_1.default.match(store.getThread(thread.id, []).messages.at(-1)?.content || '', /下一轮开始生效/);
|
|
3894
|
+
strict_1.default.ok(acceptedMessages.length >= 8);
|
|
3895
|
+
backend.close();
|
|
3896
|
+
store.close();
|
|
3897
|
+
}
|
|
3898
|
+
finally {
|
|
3899
|
+
(0, node_fs_1.rmSync)(dir, { recursive: true, force: true });
|
|
3900
|
+
}
|
|
3901
|
+
});
|
|
3737
3902
|
(0, node_test_1.default)('scheduled conversation executor uses execution policy hooks around a thread run', async () => {
|
|
3738
3903
|
const calls = [];
|
|
3739
3904
|
let runtimeEnv;
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{z as t}from"./index-Cx71F_Lz.js";const e=()=>t.get("/projects"),r=o=>t.get(`/projects/${o}`);export{r as g,e as l};
|