@kafca/agentdock 0.1.43 → 0.1.45
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 +77 -11
- package/bin/agentdock.mjs +5 -5
- package/dist/renderer/assets/{Badge-CbG6yRSm.js → Badge-BIojwD6s.js} +1 -1
- package/dist/renderer/assets/{Chat-BvNNWGGX.js → Chat-wjBR3XEX.js} +1 -1
- package/dist/renderer/assets/{ChatMarkdown-Ct-PvJB8.js → ChatMarkdown-DqszsPB_.js} +1 -1
- package/dist/renderer/assets/Config-BDCHs5A2.js +21 -0
- package/dist/renderer/assets/{CronList-Dj_3muVG.js → CronList-CEWQYTov.js} +1 -1
- package/dist/renderer/assets/Dashboard-DrWftfk3.js +26 -0
- package/dist/renderer/assets/{EmptyState-Bn2Qh14U.js → EmptyState-BqCx1oWr.js} +1 -1
- package/dist/renderer/assets/{KnowledgeDetail-Bsz6Ou41.js → KnowledgeDetail-BwK8Gpfa.js} +2 -2
- package/dist/renderer/assets/{KnowledgeHome-Cgj4XFXn.js → KnowledgeHome-hhDTZMDO.js} +3 -3
- package/dist/renderer/assets/{Logs-Dp-NF6GN.js → Logs-C9xPEhFT.js} +1 -1
- package/dist/renderer/assets/{Modal-B6YPPBN6.js → Modal-D2U4r2V0.js} +1 -1
- package/dist/renderer/assets/{MonitorList-xEZWg460.js → MonitorList-CayKbfwJ.js} +1 -1
- package/dist/renderer/assets/{Page-Bn7RjGOS.js → Page-urf5GcT_.js} +1 -1
- package/dist/renderer/assets/ProjectDetail-B1GyAr7a.js +11 -0
- package/dist/renderer/assets/{ProjectList-BDk5_gqY.js → ProjectList-BoipQypE.js} +1 -1
- package/dist/renderer/assets/{Select-xshfMIEQ.js → Select-CAscWpy5.js} +1 -1
- package/dist/renderer/assets/{SessionChat-BkHy90z3.js → SessionChat-BAVy5221.js} +1 -1
- package/dist/renderer/assets/{SessionList-BZyXT92L.js → SessionList-BZpuMvh0.js} +1 -1
- package/dist/renderer/assets/{ThreadChat-DUOIyXrS.js → ThreadChat-JX7m9biG.js} +1 -1
- package/dist/renderer/assets/Workspace-CFW8otjU.js +14 -0
- package/dist/renderer/assets/{arrow-left-C54ZI-AS.js → arrow-left-7HrNuS-V.js} +1 -1
- package/dist/renderer/assets/{book-open-Dl7GO0zn.js → book-open-BDoAu82s.js} +1 -1
- package/dist/renderer/assets/{check-CiqgtrOL.js → check-DGlyq4xX.js} +1 -1
- package/dist/renderer/assets/{chevron-down-DTL2OuVh.js → chevron-down-Bb_3EHq9.js} +1 -1
- package/dist/renderer/assets/{circle-DaVKfa3P.js → circle-DIpqZnYw.js} +1 -1
- package/dist/renderer/assets/desktop-Ci1fnRDR.js +1 -0
- package/dist/renderer/assets/{desktop-C6q6wBae.js → desktop-Do_UrC-o.js} +5 -5
- package/dist/renderer/assets/en-CmAr_0e6.js +1 -0
- package/dist/renderer/assets/es-Cs9x52ca.js +1 -0
- package/dist/renderer/assets/{funnel-CrmnLMJI.js → funnel-Bbf0ERLP.js} +1 -1
- package/dist/renderer/assets/{heart-BMfQI7y_.js → heart-CGqU-qfw.js} +1 -1
- package/dist/renderer/assets/{index-nreiKY1f.js → index-Df-Trovt.js} +2 -2
- package/dist/renderer/assets/{index-HPNb1zfx.js → index-DwhTjLA1.js} +36 -36
- package/dist/renderer/assets/index-RaTga2BC.css +11 -0
- package/dist/renderer/assets/ja-DtvtBRTW.js +1 -0
- package/dist/renderer/assets/{pencil-wTQ4l465.js → pencil-CHiy1MvK.js} +1 -1
- package/dist/renderer/assets/{play-BK--MXmw.js → play-CGYnmC4Q.js} +1 -1
- package/dist/renderer/assets/{plug-BIx9fjip.js → plug-Mexu4gyV.js} +1 -1
- package/dist/renderer/assets/{plus-Dn7JFWQ8.js → plus-B_Q5-Oj7.js} +1 -1
- package/dist/renderer/assets/projects-C6bbkC-O.js +1 -0
- package/dist/renderer/assets/{save-CC3zOSWb.js → save-CJ_QFPw0.js} +1 -1
- package/dist/renderer/assets/{search-CDTy9Czu.js → search-D8Dkhsyq.js} +1 -1
- package/dist/renderer/assets/{server-DtQk3t2a.js → server-Cd96R7WL.js} +1 -1
- package/dist/renderer/assets/{session-utils-4ep5D66T.js → session-utils-BNUbQBfF.js} +1 -1
- package/dist/renderer/assets/{sessions-Dor1LteH.js → sessions-BACfV8s1.js} +1 -1
- package/dist/renderer/assets/{shield-check-Cz2LpU6r.js → shield-check-Cnn-yQUA.js} +1 -1
- package/dist/renderer/assets/{trash-2-C2EmWFZV.js → trash-2-oWCxwQ9D.js} +1 -1
- package/dist/renderer/assets/{user-I8B-cs5A.js → user-BzE9BwsY.js} +1 -1
- package/dist/renderer/assets/{wifi-off-CPevTQJn.js → wifi-off-DHxnNkdY.js} +1 -1
- package/dist/renderer/assets/zh-CcJ9vBZj.js +1 -0
- package/dist/renderer/assets/zh-TW-elI72AC1.js +1 -0
- package/dist/renderer/index.html +2 -2
- package/dist-electron/electron/main.js +26 -1
- package/dist-electron/packages/core-sdk/src/index.js +28 -0
- package/dist-electron/services/local-ai-core/src/acp/local-core-acp-backend.js +111 -62
- package/dist-electron/services/local-ai-core/src/acp/local-core-acp-session-coordinator.js +80 -7
- package/dist-electron/services/local-ai-core/src/acp/local-core-acp-transport.js +78 -5
- package/dist-electron/services/local-ai-core/src/acp/store/external-store.js +98 -0
- package/dist-electron/services/local-ai-core/src/acp/store/local-core-acp-store.js +33 -0
- package/dist-electron/services/local-ai-core/src/acp/store/model-provider-store.js +88 -0
- package/dist-electron/services/local-ai-core/src/acp/store/schema.js +43 -0
- package/dist-electron/services/local-ai-core/src/agents/pi/launch.js +2 -119
- package/dist-electron/services/local-ai-core/src/agents/pi/provider-materializer.js +148 -0
- package/dist-electron/services/local-ai-core/src/channel/lark/config.js +2 -0
- package/dist-electron/services/local-ai-core/src/channel/lark/inbound.js +114 -0
- package/dist-electron/services/local-ai-core/src/channel/lark/local-core-lark-gateway.js +117 -75
- package/dist-electron/services/local-ai-core/src/channel/shared/session-command-runtime.js +4 -2
- package/dist-electron/services/local-ai-core/src/channel/shared/thread-routing.js +34 -0
- package/dist-electron/services/local-ai-core/src/channel/weixin/local-core-weixin-gateway.js +151 -47
- package/dist-electron/services/local-ai-core/src/execution/agent-execution-backend.js +56 -0
- package/dist-electron/services/local-ai-core/src/kernel/bootstrap.js +18 -57
- package/dist-electron/services/local-ai-core/src/kernel/local-core-errors.js +255 -0
- package/dist-electron/services/local-ai-core/src/plugins/builtin/catalog.js +78 -0
- package/dist-electron/services/local-ai-core/src/router/workspace-route-config.js +3 -1
- package/dist-electron/services/local-ai-core/src/router/workspace-router.js +64 -9
- package/dist-electron/services/local-ai-core/src/runtime/agent-runtime-detector.js +5 -2
- package/dist-electron/services/local-ai-core/src/runtime/config-migration.js +152 -0
- package/dist-electron/services/local-ai-core/src/runtime/deployment-diagnostics.js +175 -0
- package/dist-electron/services/local-ai-core/src/runtime/local-core-controller.js +330 -3
- package/dist-electron/services/local-ai-core/src/runtime/local-core-runtime-state.js +11 -2
- package/dist-electron/services/local-ai-core/src/runtime/provider-config-migration.js +32 -0
- package/dist-electron/services/local-ai-core/src/runtime/runtime-detection-service.js +76 -8
- package/dist-electron/services/local-ai-core/src/runtime/server-routes.js +62 -0
- package/dist-electron/services/local-ai-core/src/runtime/server.js +708 -4
- package/dist-electron/services/local-ai-core/src/runtime/standalone.js +13 -3
- package/dist-electron/services/local-ai-core/src/sandbox/opensandbox-client.js +113 -0
- package/dist-electron/services/local-ai-core/src/sandbox/sandbox-config.js +273 -0
- package/dist-electron/services/local-ai-core/src/sandbox/sandbox-manager.js +215 -0
- package/dist-electron/services/local-ai-core/src/sandbox/sandbox-stdio-proxy.js +188 -0
- package/dist-electron/services/local-ai-core/src/thread/slash-command-registry.js +3 -0
- package/dist-electron/services/local-ai-core/src/thread/thread-command-service.js +32 -0
- package/dist-electron/services/local-ai-core/src/thread/thread-slash-command-dispatcher.js +71 -0
- package/dist-electron/shared/desktop.js +85 -1
- package/dist-electron/tests/contracts/architecture-docs.test.js +83 -0
- package/dist-electron/tests/electron/plugin-kernel.test.js +225 -18
- package/dist-electron/tests/electron/runtime-detection-service.test.js +57 -5
- package/dist-electron/tests/electron/sandbox-config.test.js +541 -0
- package/dist-electron/tests/electron/workspace-task-store.test.js +257 -0
- package/dist-electron/tests/integration/channel-gateways.test.js +32 -0
- package/dist-electron/tests/integration/lark-gateway.test.js +1977 -0
- package/dist-electron/tests/integration/local-core-acp-progress.test.js +1772 -0
- package/dist-electron/tests/integration/local-core-refactor.test.js +775 -5156
- package/dist-electron/tests/integration/local-core-routes.test.js +238 -0
- package/dist-electron/tests/integration/weixin-gateway.test.js +927 -0
- package/package.json +2 -3
- package/dist/renderer/assets/Config-lQX2qVVV.js +0 -16
- package/dist/renderer/assets/Dashboard-eh_RhGYb.js +0 -26
- package/dist/renderer/assets/ProjectDetail-Cv_jIE61.js +0 -11
- package/dist/renderer/assets/Workspace-Dl80fNEC.js +0 -14
- package/dist/renderer/assets/desktop-jaAiayNB.js +0 -1
- package/dist/renderer/assets/en-D2SkCrhG.js +0 -1
- package/dist/renderer/assets/es-C8UBPhxM.js +0 -1
- package/dist/renderer/assets/index-CaQZSRbg.css +0 -11
- package/dist/renderer/assets/ja-ChF4vbBL.js +0 -1
- package/dist/renderer/assets/projects-brJZgwEJ.js +0 -1
- package/dist/renderer/assets/zh-DIcdHycM.js +0 -1
- package/dist/renderer/assets/zh-TW-BtRwreY_.js +0 -1
|
@@ -10,6 +10,7 @@ const node_path_1 = require("node:path");
|
|
|
10
10
|
const node_os_1 = require("node:os");
|
|
11
11
|
const local_core_acp_store_js_1 = require("../../services/local-ai-core/src/acp/local-core-acp-store.js");
|
|
12
12
|
const local_core_acp_session_coordinator_js_1 = require("../../services/local-ai-core/src/acp/local-core-acp-session-coordinator.js");
|
|
13
|
+
const local_core_acp_transport_js_1 = require("../../services/local-ai-core/src/acp/local-core-acp-transport.js");
|
|
13
14
|
const local_core_acp_turn_coordinator_js_1 = require("../../services/local-ai-core/src/acp/local-core-acp-turn-coordinator.js");
|
|
14
15
|
const scheduler_service_js_1 = require("../../services/local-ai-core/src/scheduler/scheduler-service.js");
|
|
15
16
|
const lark_schedule_adapter_js_1 = require("../../services/local-ai-core/src/scheduler/lark-schedule-adapter.js");
|
|
@@ -40,6 +41,141 @@ const local_core_controller_js_1 = require("../../services/local-ai-core/src/run
|
|
|
40
41
|
(0, node_fs_1.rmSync)(userDataPath, { recursive: true, force: true });
|
|
41
42
|
}
|
|
42
43
|
});
|
|
44
|
+
(0, node_test_1.default)('model providers persist independently from workspace config', () => {
|
|
45
|
+
const userDataPath = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'model-provider-store-'));
|
|
46
|
+
try {
|
|
47
|
+
const store = new local_core_acp_store_js_1.LocalCoreAcpStore(userDataPath);
|
|
48
|
+
const provider = store.upsertModelProvider({
|
|
49
|
+
name: 'deepseek',
|
|
50
|
+
api_key: 'secret',
|
|
51
|
+
base_url: 'https://api.deepseek.com',
|
|
52
|
+
model: 'deepseek-v4-flash',
|
|
53
|
+
env: { CUSTOM_PROVIDER_ENV: '1' },
|
|
54
|
+
});
|
|
55
|
+
strict_1.default.equal(provider.id, 'deepseek');
|
|
56
|
+
strict_1.default.equal(provider.api_key, 'secret');
|
|
57
|
+
strict_1.default.equal(store.listModelProviders().length, 1);
|
|
58
|
+
const reopened = new local_core_acp_store_js_1.LocalCoreAcpStore(userDataPath);
|
|
59
|
+
strict_1.default.equal(reopened.getModelProvider('deepseek')?.model, 'deepseek-v4-flash');
|
|
60
|
+
reopened.close();
|
|
61
|
+
store.close();
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
(0, node_fs_1.rmSync)(userDataPath, { recursive: true, force: true });
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
(0, node_test_1.default)('external project and thread mappings persist with isolated workspace paths', () => {
|
|
68
|
+
const userDataPath = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'external-store-'));
|
|
69
|
+
try {
|
|
70
|
+
const store = new local_core_acp_store_js_1.LocalCoreAcpStore(userDataPath);
|
|
71
|
+
const project = store.upsertExternalProject({
|
|
72
|
+
userId: 'user-a',
|
|
73
|
+
externalProjectId: 'project-a',
|
|
74
|
+
workspaceId: 'external-user-a-project-a',
|
|
75
|
+
workspacePath: '/data/users/user-a/projects/project-a',
|
|
76
|
+
displayName: 'Project A',
|
|
77
|
+
agentType: 'pi',
|
|
78
|
+
providerId: 'deepseek',
|
|
79
|
+
metadata: { source: 'external' },
|
|
80
|
+
createdAt: '2026-05-15T00:00:00.000Z',
|
|
81
|
+
updatedAt: '2026-05-15T00:00:00.000Z',
|
|
82
|
+
});
|
|
83
|
+
const thread = store.createThread(project.workspaceId, 'Thread A', 'pi');
|
|
84
|
+
store.upsertExternalThread({
|
|
85
|
+
userId: project.userId,
|
|
86
|
+
externalProjectId: project.externalProjectId,
|
|
87
|
+
externalThreadId: 'thread-a',
|
|
88
|
+
workspaceId: project.workspaceId,
|
|
89
|
+
threadId: thread.id,
|
|
90
|
+
workspacePath: '/data/users/user-a/projects/project-a/threads/thread-a/workspace',
|
|
91
|
+
metadata: { channel: 'api' },
|
|
92
|
+
createdAt: '2026-05-15T00:00:00.000Z',
|
|
93
|
+
updatedAt: '2026-05-15T00:00:00.000Z',
|
|
94
|
+
});
|
|
95
|
+
store.close();
|
|
96
|
+
const reopened = new local_core_acp_store_js_1.LocalCoreAcpStore(userDataPath);
|
|
97
|
+
strict_1.default.equal(reopened.getExternalProject('user-a', 'project-a')?.workspacePath, '/data/users/user-a/projects/project-a');
|
|
98
|
+
strict_1.default.equal(reopened.getExternalThreadByThreadId(thread.id)?.workspacePath, '/data/users/user-a/projects/project-a/threads/thread-a/workspace');
|
|
99
|
+
reopened.close();
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
(0, node_fs_1.rmSync)(userDataPath, { recursive: true, force: true });
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
(0, node_test_1.default)('controller migrates embedded project providers into shared provider store', async () => {
|
|
106
|
+
const userDataPath = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'model-provider-migration-'));
|
|
107
|
+
try {
|
|
108
|
+
const runtime = (0, bootstrap_js_1.bootstrapLocalCoreRuntime)({
|
|
109
|
+
userDataPath,
|
|
110
|
+
enableKnowledge: false,
|
|
111
|
+
log: () => { },
|
|
112
|
+
});
|
|
113
|
+
const controller = new local_core_controller_js_1.LocalCoreController(userDataPath, runtime);
|
|
114
|
+
await controller.saveStructuredConfigFile({
|
|
115
|
+
projects: [{
|
|
116
|
+
name: 'workspace-a',
|
|
117
|
+
agent: {
|
|
118
|
+
type: 'pi',
|
|
119
|
+
options: { work_dir: '/tmp/workspace-a' },
|
|
120
|
+
providers: [{
|
|
121
|
+
name: 'deepseek-v4-flash',
|
|
122
|
+
api_key: 'secret',
|
|
123
|
+
base_url: 'https://api.deepseek.com',
|
|
124
|
+
model: 'deepseek-v4-flash',
|
|
125
|
+
}],
|
|
126
|
+
},
|
|
127
|
+
platforms: [],
|
|
128
|
+
}],
|
|
129
|
+
});
|
|
130
|
+
const config = await controller.readConfigFile();
|
|
131
|
+
strict_1.default.equal(config.parsed?.projects?.[0]?.agent.options?.provider_id, 'deepseek');
|
|
132
|
+
strict_1.default.equal(config.parsed?.projects?.[0]?.agent.providers, undefined);
|
|
133
|
+
const providers = await controller.listModelProviders();
|
|
134
|
+
strict_1.default.equal(providers.providers[0]?.id, 'deepseek');
|
|
135
|
+
strict_1.default.equal(providers.providers[0]?.name, 'deepseek');
|
|
136
|
+
await controller.close();
|
|
137
|
+
}
|
|
138
|
+
finally {
|
|
139
|
+
(0, node_fs_1.rmSync)(userDataPath, { recursive: true, force: true });
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
(0, node_test_1.default)('workspace router resolves projects that select a shared provider', async () => {
|
|
143
|
+
const userDataPath = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'workspace-provider-ref-'));
|
|
144
|
+
try {
|
|
145
|
+
const runtime = (0, bootstrap_js_1.bootstrapLocalCoreRuntime)({
|
|
146
|
+
userDataPath,
|
|
147
|
+
enableKnowledge: false,
|
|
148
|
+
log: () => { },
|
|
149
|
+
});
|
|
150
|
+
const controller = new local_core_controller_js_1.LocalCoreController(userDataPath, runtime);
|
|
151
|
+
const provider = await controller.createModelProvider({
|
|
152
|
+
name: 'deepseek',
|
|
153
|
+
api_key: 'secret',
|
|
154
|
+
base_url: 'https://api.deepseek.com',
|
|
155
|
+
model: 'deepseek-v4-flash',
|
|
156
|
+
});
|
|
157
|
+
await controller.saveStructuredConfigFile({
|
|
158
|
+
projects: [{
|
|
159
|
+
name: 'workspace-a',
|
|
160
|
+
agent: {
|
|
161
|
+
type: 'pi',
|
|
162
|
+
options: {
|
|
163
|
+
work_dir: '/tmp/workspace-a',
|
|
164
|
+
provider_id: provider.id,
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
platforms: [],
|
|
168
|
+
}],
|
|
169
|
+
});
|
|
170
|
+
const workspaces = await controller.listWorkspaces();
|
|
171
|
+
strict_1.default.equal(workspaces[0]?.id, 'workspace-a');
|
|
172
|
+
strict_1.default.equal(workspaces[0]?.agentType, 'pi');
|
|
173
|
+
await controller.close();
|
|
174
|
+
}
|
|
175
|
+
finally {
|
|
176
|
+
(0, node_fs_1.rmSync)(userDataPath, { recursive: true, force: true });
|
|
177
|
+
}
|
|
178
|
+
});
|
|
43
179
|
(0, node_test_1.default)('scheduler create resolves a Lark delivery route without binding the job to a thread', async () => {
|
|
44
180
|
const userDataPath = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'scheduler-binding-route-'));
|
|
45
181
|
try {
|
|
@@ -443,6 +579,50 @@ const local_core_controller_js_1 = require("../../services/local-ai-core/src/run
|
|
|
443
579
|
(0, node_fs_1.rmSync)(userDataPath, { recursive: true, force: true });
|
|
444
580
|
}
|
|
445
581
|
});
|
|
582
|
+
(0, node_test_1.default)('ACP runtime PATH includes service-safe user bin directories', () => {
|
|
583
|
+
const previousHome = process.env.HOME;
|
|
584
|
+
process.env.HOME = '/home/agentdock-test';
|
|
585
|
+
try {
|
|
586
|
+
const path = (0, local_core_acp_session_coordinator_js_1.buildAgentPath)('/usr/bin:/bin', '/opt/agentdock/bin');
|
|
587
|
+
strict_1.default.equal(path, '/opt/agentdock/bin:/home/agentdock-test/.local/bin:/home/agentdock-test/bin:/usr/bin:/bin');
|
|
588
|
+
}
|
|
589
|
+
finally {
|
|
590
|
+
if (previousHome === undefined) {
|
|
591
|
+
delete process.env.HOME;
|
|
592
|
+
}
|
|
593
|
+
else {
|
|
594
|
+
process.env.HOME = previousHome;
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
});
|
|
598
|
+
(0, node_test_1.default)('ACP transport reports missing agent commands without an unhandled process error', async () => {
|
|
599
|
+
const closed = new Promise((resolve) => {
|
|
600
|
+
const transport = new local_core_acp_transport_js_1.LocalCoreAcpTransport({
|
|
601
|
+
log: () => { },
|
|
602
|
+
onAgentRequest: () => { },
|
|
603
|
+
onAgentNotification: () => { },
|
|
604
|
+
onSessionClosed: (_session, error) => {
|
|
605
|
+
resolve(error);
|
|
606
|
+
},
|
|
607
|
+
});
|
|
608
|
+
transport.spawnSession({
|
|
609
|
+
threadId: 'thread-missing-command',
|
|
610
|
+
bridgeSessionKey: 'session:missing-command',
|
|
611
|
+
config: {
|
|
612
|
+
workspaceId: 'workspace-a',
|
|
613
|
+
agentType: 'hermes',
|
|
614
|
+
command: 'agentdock-command-that-does-not-exist',
|
|
615
|
+
args: ['acp'],
|
|
616
|
+
env: {},
|
|
617
|
+
workDir: (0, node_os_1.tmpdir)(),
|
|
618
|
+
model: '',
|
|
619
|
+
},
|
|
620
|
+
runtimeEnv: {},
|
|
621
|
+
});
|
|
622
|
+
});
|
|
623
|
+
const error = await closed;
|
|
624
|
+
strict_1.default.equal(error.message, 'ACP agent command not found: agentdock-command-that-does-not-exist');
|
|
625
|
+
});
|
|
446
626
|
(0, node_test_1.default)('ACP scheduled session can override permission mode without changing thread mode', async () => {
|
|
447
627
|
const userDataPath = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'scheduler-permission-mode-'));
|
|
448
628
|
try {
|
|
@@ -515,6 +695,83 @@ const local_core_controller_js_1 = require("../../services/local-ai-core/src/run
|
|
|
515
695
|
(0, node_fs_1.rmSync)(userDataPath, { recursive: true, force: true });
|
|
516
696
|
}
|
|
517
697
|
});
|
|
698
|
+
(0, node_test_1.default)('ACP sandbox sessions use container workspace cwd', async () => {
|
|
699
|
+
const userDataPath = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'sandbox-session-cwd-'));
|
|
700
|
+
try {
|
|
701
|
+
const store = new local_core_acp_store_js_1.LocalCoreAcpStore(userDataPath);
|
|
702
|
+
const thread = store.createThread('workspace-a', 'Thread');
|
|
703
|
+
let sessionNewParams;
|
|
704
|
+
const coordinator = new local_core_acp_session_coordinator_js_1.LocalCoreAcpSessionCoordinator({
|
|
705
|
+
store,
|
|
706
|
+
transport: {
|
|
707
|
+
spawnSession(input) {
|
|
708
|
+
return {
|
|
709
|
+
threadId: input.threadId,
|
|
710
|
+
bridgeSessionKey: input.bridgeSessionKey,
|
|
711
|
+
closed: false,
|
|
712
|
+
sessionId: '',
|
|
713
|
+
supportsLoad: false,
|
|
714
|
+
pendingPermissionByRun: new Map(),
|
|
715
|
+
schedulerJobCreatedByRun: new Map(),
|
|
716
|
+
launchPermissionMode: '',
|
|
717
|
+
};
|
|
718
|
+
},
|
|
719
|
+
initializeSession: async () => { },
|
|
720
|
+
request: async (_session, method, params) => {
|
|
721
|
+
if (method === 'session/new') {
|
|
722
|
+
sessionNewParams = params;
|
|
723
|
+
return { sessionId: 'session-1' };
|
|
724
|
+
}
|
|
725
|
+
return {};
|
|
726
|
+
},
|
|
727
|
+
closeSession: () => { },
|
|
728
|
+
closeSessionWithError: () => { },
|
|
729
|
+
sendRaw: () => true,
|
|
730
|
+
},
|
|
731
|
+
runThreadMap: new Map(),
|
|
732
|
+
emitBridge: () => { },
|
|
733
|
+
});
|
|
734
|
+
await coordinator.ensureSession(thread.id, 'session:thread-1', {
|
|
735
|
+
workspaceId: 'workspace-a',
|
|
736
|
+
agentType: 'pi',
|
|
737
|
+
command: process.execPath,
|
|
738
|
+
args: ['/host/sandbox-stdio-proxy.js'],
|
|
739
|
+
env: {},
|
|
740
|
+
workDir: '/host/workspace-a',
|
|
741
|
+
model: '',
|
|
742
|
+
sandbox: {
|
|
743
|
+
enabled: true,
|
|
744
|
+
provider: 'opensandbox',
|
|
745
|
+
transport: 'http-ndjson',
|
|
746
|
+
serverUrl: 'http://127.0.0.1:8080',
|
|
747
|
+
apiKeyEnv: 'OPEN_SANDBOX_API_KEY',
|
|
748
|
+
image: 'agentdock/pi-acp:local',
|
|
749
|
+
acpPort: 8080,
|
|
750
|
+
entrypoint: ['node', '/opt/agentdock/acp-bridge.mjs'],
|
|
751
|
+
timeoutSeconds: 600,
|
|
752
|
+
lifecycle: 'per_thread',
|
|
753
|
+
idleSeconds: 900,
|
|
754
|
+
warmPoolSize: 0,
|
|
755
|
+
cpu: '1000m',
|
|
756
|
+
memory: '1Gi',
|
|
757
|
+
userId: 'local',
|
|
758
|
+
projectId: 'workspace-a',
|
|
759
|
+
stateScope: 'project',
|
|
760
|
+
workspaceHostPath: '/host/workspace-a',
|
|
761
|
+
workspaceMountPath: '/workspace',
|
|
762
|
+
stateHostPath: '/host/state',
|
|
763
|
+
stateMountPath: '/agent-state',
|
|
764
|
+
runtimeCommand: '/usr/local/bin/pi-acp',
|
|
765
|
+
runtimeArgs: [],
|
|
766
|
+
runtimeEnv: {},
|
|
767
|
+
},
|
|
768
|
+
});
|
|
769
|
+
strict_1.default.equal(sessionNewParams?.cwd, '/workspace');
|
|
770
|
+
}
|
|
771
|
+
finally {
|
|
772
|
+
(0, node_fs_1.rmSync)(userDataPath, { recursive: true, force: true });
|
|
773
|
+
}
|
|
774
|
+
});
|
|
518
775
|
(0, node_test_1.default)('ACP permission requests honor scheduled session permission override', () => {
|
|
519
776
|
const sentPayloads = [];
|
|
520
777
|
let approvalCreated = false;
|
|
@@ -0,0 +1,32 @@
|
|
|
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_weixin_gateway_js_1 = require("../../services/local-ai-core/src/channel/weixin/local-core-weixin-gateway.js");
|
|
9
|
+
const local_core_lark_gateway_js_1 = require("../../services/local-ai-core/src/channel/lark/local-core-lark-gateway.js");
|
|
10
|
+
(0, node_test_1.default)('channel gateways ignore unowned bridge events without route miss log noise', async () => {
|
|
11
|
+
const logs = [];
|
|
12
|
+
const commonOptions = {
|
|
13
|
+
store: {},
|
|
14
|
+
readConfig: async () => null,
|
|
15
|
+
getWorkspaceRouter: () => ({}),
|
|
16
|
+
eventBus: { emit: () => { }, on: () => () => { } },
|
|
17
|
+
log: (line) => logs.push(line),
|
|
18
|
+
};
|
|
19
|
+
const larkGateway = new local_core_lark_gateway_js_1.LocalCoreLarkGateway(commonOptions);
|
|
20
|
+
const weixinGateway = new local_core_weixin_gateway_js_1.LocalCoreWeixinGateway(commonOptions);
|
|
21
|
+
await larkGateway.onBridgeEvent({
|
|
22
|
+
type: 'update_message',
|
|
23
|
+
sessionKey: 'localcore-acp:project-1:thread-1',
|
|
24
|
+
content: 'stream chunk',
|
|
25
|
+
});
|
|
26
|
+
await weixinGateway.onBridgeEvent({
|
|
27
|
+
type: 'update_message',
|
|
28
|
+
sessionKey: 'localcore-acp:project-1:thread-1',
|
|
29
|
+
content: 'stream chunk',
|
|
30
|
+
});
|
|
31
|
+
strict_1.default.deepEqual(logs, []);
|
|
32
|
+
});
|