@kafca/agentdock 0.1.7

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 (79) hide show
  1. package/README.md +70 -0
  2. package/bin/agentdock.mjs +275 -0
  3. package/build/icon.png +0 -0
  4. package/dist/renderer/assets/index-BaNpzC6d.js +482 -0
  5. package/dist/renderer/assets/index-CLWJyO0E.css +11 -0
  6. package/dist/renderer/favicon.svg +19 -0
  7. package/dist/renderer/index.html +14 -0
  8. package/dist/renderer/logo-options.svg +153 -0
  9. package/dist-electron/electron/knowledge-skill-script.test.js +125 -0
  10. package/dist-electron/electron/lac-cli.test.js +221 -0
  11. package/dist-electron/electron/local-core-refactor.test.js +1075 -0
  12. package/dist-electron/electron/main.js +163 -0
  13. package/dist-electron/electron/plugin-kernel.test.js +534 -0
  14. package/dist-electron/electron/preload.js +2 -0
  15. package/dist-electron/package.json +3 -0
  16. package/dist-electron/packages/contracts/src/index.js +18 -0
  17. package/dist-electron/packages/contracts/src/local-core.js +2 -0
  18. package/dist-electron/packages/core-sdk/src/index.js +406 -0
  19. package/dist-electron/packages/knowledge-api/src/ai-vector-provider.js +388 -0
  20. package/dist-electron/packages/knowledge-api/src/index.js +146 -0
  21. package/dist-electron/packages/knowledge-api/src/sqlite-store.js +467 -0
  22. package/dist-electron/packages/knowledge-api/src/thread-knowledge-store.js +21 -0
  23. package/dist-electron/packages/knowledge-api/test/ai-vector-provider.test.js +412 -0
  24. package/dist-electron/packages/plugin-sdk/src/index.js +2 -0
  25. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-backend.js +369 -0
  26. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-response-processor.js +110 -0
  27. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-session-coordinator.js +171 -0
  28. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-store.js +635 -0
  29. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-transport.js +190 -0
  30. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-turn-coordinator.js +244 -0
  31. package/dist-electron/services/local-ai-core/src/acp/workspace-acp-permissions.js +52 -0
  32. package/dist-electron/services/local-ai-core/src/cli/lac.js +290 -0
  33. package/dist-electron/services/local-ai-core/src/gateway/local-core-lark-gateway.js +976 -0
  34. package/dist-electron/services/local-ai-core/src/gateway/local-core-weixin-gateway.js +1143 -0
  35. package/dist-electron/services/local-ai-core/src/kernel/bootstrap.js +291 -0
  36. package/dist-electron/services/local-ai-core/src/kernel/capability-registry.js +67 -0
  37. package/dist-electron/services/local-ai-core/src/kernel/diagnostics.js +27 -0
  38. package/dist-electron/services/local-ai-core/src/kernel/event-bus.js +27 -0
  39. package/dist-electron/services/local-ai-core/src/kernel/lifecycle-manager.js +85 -0
  40. package/dist-electron/services/local-ai-core/src/kernel/plugin-registry.js +60 -0
  41. package/dist-electron/services/local-ai-core/src/plugins/builtin/agent-localcore-acp-plugin.js +114 -0
  42. package/dist-electron/services/local-ai-core/src/plugins/builtin/channel-lark-plugin.js +59 -0
  43. package/dist-electron/services/local-ai-core/src/plugins/builtin/channel-weixin-plugin.js +56 -0
  44. package/dist-electron/services/local-ai-core/src/plugins/builtin/knowledge-ai-vector-plugin.js +7 -0
  45. package/dist-electron/services/local-ai-core/src/plugins/builtin/knowledge-noop-plugin.js +7 -0
  46. package/dist-electron/services/local-ai-core/src/plugins/builtin/runtime-capabilities-plugin.js +62 -0
  47. package/dist-electron/services/local-ai-core/src/plugins/builtin/scheduler-cron-plugin.js +49 -0
  48. package/dist-electron/services/local-ai-core/src/plugins/builtin/scheduler-lark-plugin.js +38 -0
  49. package/dist-electron/services/local-ai-core/src/plugins/builtin/scheduler-weixin-plugin.js +38 -0
  50. package/dist-electron/services/local-ai-core/src/router/workspace-route-config.js +230 -0
  51. package/dist-electron/services/local-ai-core/src/router/workspace-router-types.js +2 -0
  52. package/dist-electron/services/local-ai-core/src/router/workspace-router.js +389 -0
  53. package/dist-electron/services/local-ai-core/src/runtime/local-core-controller.js +315 -0
  54. package/dist-electron/services/local-ai-core/src/runtime/local-core-runtime-state.js +282 -0
  55. package/dist-electron/services/local-ai-core/src/runtime/server.js +465 -0
  56. package/dist-electron/services/local-ai-core/src/runtime/standalone.js +38 -0
  57. package/dist-electron/services/local-ai-core/src/scheduler/adapters.js +2 -0
  58. package/dist-electron/services/local-ai-core/src/scheduler/cron-command-detector.js +70 -0
  59. package/dist-electron/services/local-ai-core/src/scheduler/cron.js +53 -0
  60. package/dist-electron/services/local-ai-core/src/scheduler/execution-policy.js +2 -0
  61. package/dist-electron/services/local-ai-core/src/scheduler/lark-execution-policies.js +66 -0
  62. package/dist-electron/services/local-ai-core/src/scheduler/lark-schedule-adapter.js +77 -0
  63. package/dist-electron/services/local-ai-core/src/scheduler/scheduled-conversation-executor.js +46 -0
  64. package/dist-electron/services/local-ai-core/src/scheduler/scheduler-run-lifecycle.js +64 -0
  65. package/dist-electron/services/local-ai-core/src/scheduler/scheduler-service.js +133 -0
  66. package/dist-electron/services/local-ai-core/src/scheduler/weixin-execution-policies.js +66 -0
  67. package/dist-electron/services/local-ai-core/src/scheduler/weixin-schedule-adapter.js +78 -0
  68. package/dist-electron/services/local-ai-core/src/thread/workspace-thread-id.js +17 -0
  69. package/dist-electron/services/local-ai-core/src/thread/workspace-thread-mappers.js +43 -0
  70. package/dist-electron/shared/desktop.js +195 -0
  71. package/dist-electron/src/api/client.js +73 -0
  72. package/dist-electron/src/api/sessions.js +21 -0
  73. package/dist-electron/src/lib/session-utils.js +51 -0
  74. package/dist-electron/src/pages/Threads/thread-chat-model.js +246 -0
  75. package/dist-electron/src/pages/Threads/thread-chat-model.test.js +76 -0
  76. package/dist-electron/src/pages/Threads/thread-chat-permission.js +26 -0
  77. package/dist-electron/src/pages/Threads/thread-chat-permission.test.js +102 -0
  78. package/dist-electron/src/pages/Threads/thread-chat-task-state.js +65 -0
  79. package/package.json +146 -0
@@ -0,0 +1,406 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LOCAL_AI_CORE_ORIGIN = exports.LOCAL_AI_CORE_BASE = void 0;
4
+ exports.detectLocalAiCore = detectLocalAiCore;
5
+ exports.subscribeEvents = subscribeEvents;
6
+ exports.getCoreRuntime = getCoreRuntime;
7
+ exports.startCoreService = startCoreService;
8
+ exports.stopCoreService = stopCoreService;
9
+ exports.restartCoreService = restartCoreService;
10
+ exports.getCoreLogs = getCoreLogs;
11
+ exports.readCoreConfigFile = readCoreConfigFile;
12
+ exports.saveCoreRawConfigFile = saveCoreRawConfigFile;
13
+ exports.saveCoreStructuredConfigFile = saveCoreStructuredConfigFile;
14
+ exports.saveCoreSettings = saveCoreSettings;
15
+ exports.listChannelGateways = listChannelGateways;
16
+ exports.getChannelGatewayStatus = getChannelGatewayStatus;
17
+ exports.testChannelConnection = testChannelConnection;
18
+ exports.enableChannelGateway = enableChannelGateway;
19
+ exports.disableChannelGateway = disableChannelGateway;
20
+ exports.listChannelPendingPairings = listChannelPendingPairings;
21
+ exports.approveChannelPairing = approveChannelPairing;
22
+ exports.rejectChannelPairing = rejectChannelPairing;
23
+ exports.listChannelAuthorizedUsers = listChannelAuthorizedUsers;
24
+ exports.listLarkGateways = listLarkGateways;
25
+ exports.getLarkGatewayStatus = getLarkGatewayStatus;
26
+ exports.testLarkConnection = testLarkConnection;
27
+ exports.enableLarkGateway = enableLarkGateway;
28
+ exports.disableLarkGateway = disableLarkGateway;
29
+ exports.listLarkPendingPairings = listLarkPendingPairings;
30
+ exports.approveLarkPairing = approveLarkPairing;
31
+ exports.rejectLarkPairing = rejectLarkPairing;
32
+ exports.listLarkAuthorizedUsers = listLarkAuthorizedUsers;
33
+ exports.getWeixinQrCode = getWeixinQrCode;
34
+ exports.checkWeixinQrCodeStatus = checkWeixinQrCodeStatus;
35
+ exports.listWorkspaces = listWorkspaces;
36
+ exports.listScheduledJobs = listScheduledJobs;
37
+ exports.getScheduledJob = getScheduledJob;
38
+ exports.createScheduledJob = createScheduledJob;
39
+ exports.updateScheduledJob = updateScheduledJob;
40
+ exports.deleteScheduledJob = deleteScheduledJob;
41
+ exports.runScheduledJob = runScheduledJob;
42
+ exports.listScheduledJobRuns = listScheduledJobRuns;
43
+ exports.listThreads = listThreads;
44
+ exports.createThread = createThread;
45
+ exports.getThread = getThread;
46
+ exports.renameThread = renameThread;
47
+ exports.updateThreadKnowledgeBases = updateThreadKnowledgeBases;
48
+ exports.deleteThread = deleteThread;
49
+ exports.sendMessage = sendMessage;
50
+ exports.sendAction = sendAction;
51
+ exports.interruptRun = interruptRun;
52
+ exports.listKnowledgeSources = listKnowledgeSources;
53
+ exports.getKnowledgeConfig = getKnowledgeConfig;
54
+ exports.saveKnowledgeConfig = saveKnowledgeConfig;
55
+ exports.listKnowledgeFolders = listKnowledgeFolders;
56
+ exports.createKnowledgeFolder = createKnowledgeFolder;
57
+ exports.updateKnowledgeFolder = updateKnowledgeFolder;
58
+ exports.deleteKnowledgeFolder = deleteKnowledgeFolder;
59
+ exports.listKnowledgeBases = listKnowledgeBases;
60
+ exports.createKnowledgeBase = createKnowledgeBase;
61
+ exports.getKnowledgeBase = getKnowledgeBase;
62
+ exports.updateKnowledgeBase = updateKnowledgeBase;
63
+ exports.deleteKnowledgeBase = deleteKnowledgeBase;
64
+ exports.listKnowledgeBaseFiles = listKnowledgeBaseFiles;
65
+ exports.uploadKnowledgeBaseFiles = uploadKnowledgeBaseFiles;
66
+ exports.deleteKnowledgeBaseFile = deleteKnowledgeBaseFile;
67
+ exports.searchKnowledgeBase = searchKnowledgeBase;
68
+ exports.getCapabilities = getCapabilities;
69
+ exports.getCapabilitySnapshot = getCapabilitySnapshot;
70
+ exports.getPluginDiagnostics = getPluginDiagnostics;
71
+ exports.probeWorkspaceStreaming = probeWorkspaceStreaming;
72
+ exports.onRuntimeUpdated = onRuntimeUpdated;
73
+ exports.onBridgeUpdated = onBridgeUpdated;
74
+ const DEFAULT_LOCAL_AI_CORE_ORIGIN = 'http://127.0.0.1:9831';
75
+ const DEFAULT_LOCAL_AI_CORE_BASE = `${DEFAULT_LOCAL_AI_CORE_ORIGIN}/api/local/v1`;
76
+ function normalizeLocalAiCoreBase(baseUrl) {
77
+ const trimmed = baseUrl.trim();
78
+ if (!trimmed) {
79
+ return DEFAULT_LOCAL_AI_CORE_BASE;
80
+ }
81
+ return trimmed.replace(/\/+$/, '');
82
+ }
83
+ exports.LOCAL_AI_CORE_BASE = normalizeLocalAiCoreBase(typeof __LOCAL_AI_CORE_BASE__ !== 'undefined' ? __LOCAL_AI_CORE_BASE__ : '');
84
+ exports.LOCAL_AI_CORE_ORIGIN = exports.LOCAL_AI_CORE_BASE.endsWith('/api/local/v1')
85
+ ? exports.LOCAL_AI_CORE_BASE.slice(0, -'/api/local/v1'.length) || DEFAULT_LOCAL_AI_CORE_ORIGIN
86
+ : DEFAULT_LOCAL_AI_CORE_ORIGIN;
87
+ const listeners = new Set();
88
+ let eventSource = null;
89
+ async function coreRequest(method, path, body) {
90
+ const response = await fetch(`${exports.LOCAL_AI_CORE_BASE}${path}`, {
91
+ method,
92
+ headers: {
93
+ 'Content-Type': 'application/json',
94
+ },
95
+ body: body ? JSON.stringify(body) : undefined,
96
+ });
97
+ const json = await response.json();
98
+ if (!response.ok || !json.ok) {
99
+ throw new Error(json.error || `Local AI Core request failed: ${response.status}`);
100
+ }
101
+ return json.data;
102
+ }
103
+ function ensureEventSource() {
104
+ if (eventSource || typeof window === 'undefined') {
105
+ return;
106
+ }
107
+ eventSource = new EventSource(`${exports.LOCAL_AI_CORE_BASE}/events`);
108
+ const forward = (event) => {
109
+ try {
110
+ const payload = JSON.parse(event.data);
111
+ listeners.forEach((listener) => listener(payload));
112
+ }
113
+ catch {
114
+ // Ignore malformed payloads from a local dev server.
115
+ }
116
+ };
117
+ [
118
+ 'runtime.updated',
119
+ 'thread.updated',
120
+ 'message.created',
121
+ 'message.updated',
122
+ 'run.updated',
123
+ 'scheduler.job.updated',
124
+ 'scheduler.run.updated',
125
+ 'presence.updated',
126
+ 'stream.updated',
127
+ ].forEach((eventName) => {
128
+ eventSource?.addEventListener(eventName, forward);
129
+ });
130
+ eventSource.onerror = () => {
131
+ eventSource?.close();
132
+ eventSource = null;
133
+ if (listeners.size > 0) {
134
+ window.setTimeout(() => ensureEventSource(), 1000);
135
+ }
136
+ };
137
+ }
138
+ function maybeCloseEventSource() {
139
+ if (listeners.size === 0 && eventSource) {
140
+ eventSource.close();
141
+ eventSource = null;
142
+ }
143
+ }
144
+ async function detectLocalAiCore(timeoutMs = 350) {
145
+ const controller = new AbortController();
146
+ const timer = window.setTimeout(() => controller.abort(), timeoutMs);
147
+ try {
148
+ const response = await fetch(`${exports.LOCAL_AI_CORE_BASE}/health`, { signal: controller.signal });
149
+ const json = await response.json();
150
+ return response.ok && json.ok && json.data?.name === 'local-ai-core';
151
+ }
152
+ catch {
153
+ return false;
154
+ }
155
+ finally {
156
+ window.clearTimeout(timer);
157
+ }
158
+ }
159
+ function subscribeEvents(listener) {
160
+ listeners.add(listener);
161
+ ensureEventSource();
162
+ return () => {
163
+ listeners.delete(listener);
164
+ maybeCloseEventSource();
165
+ };
166
+ }
167
+ async function getCoreRuntime() {
168
+ return coreRequest('GET', '/runtime');
169
+ }
170
+ async function startCoreService() {
171
+ return coreRequest('POST', '/runtime/service/start');
172
+ }
173
+ async function stopCoreService() {
174
+ return coreRequest('POST', '/runtime/service/stop');
175
+ }
176
+ async function restartCoreService() {
177
+ return coreRequest('POST', '/runtime/service/restart');
178
+ }
179
+ async function getCoreLogs(limit) {
180
+ const suffix = typeof limit === 'number' ? `?limit=${encodeURIComponent(String(limit))}` : '';
181
+ return coreRequest('GET', `/runtime/logs${suffix}`);
182
+ }
183
+ async function readCoreConfigFile() {
184
+ return coreRequest('GET', '/runtime/config');
185
+ }
186
+ async function saveCoreRawConfigFile(raw) {
187
+ return coreRequest('POST', '/runtime/config/raw', { raw });
188
+ }
189
+ async function saveCoreStructuredConfigFile(config) {
190
+ return coreRequest('POST', '/runtime/config/structured', { config });
191
+ }
192
+ async function saveCoreSettings(input) {
193
+ return coreRequest('POST', '/runtime/settings', input);
194
+ }
195
+ async function listChannelGateways(platform) {
196
+ return coreRequest('GET', `/platforms/${encodeURIComponent(platform)}`);
197
+ }
198
+ async function getChannelGatewayStatus(platform, workspaceId) {
199
+ return coreRequest('GET', `/platforms/${encodeURIComponent(platform)}/${encodeURIComponent(workspaceId)}`);
200
+ }
201
+ async function testChannelConnection(platform, workspaceId) {
202
+ return coreRequest('POST', `/platforms/${encodeURIComponent(platform)}/${encodeURIComponent(workspaceId)}/test`);
203
+ }
204
+ async function enableChannelGateway(platform, workspaceId) {
205
+ return coreRequest('POST', `/platforms/${encodeURIComponent(platform)}/${encodeURIComponent(workspaceId)}/enable`);
206
+ }
207
+ async function disableChannelGateway(platform, workspaceId) {
208
+ return coreRequest('POST', `/platforms/${encodeURIComponent(platform)}/${encodeURIComponent(workspaceId)}/disable`);
209
+ }
210
+ async function listChannelPendingPairings(platform, workspaceId) {
211
+ const suffix = workspaceId ? `?workspace_id=${encodeURIComponent(workspaceId)}` : '';
212
+ return coreRequest('GET', `/platforms/${encodeURIComponent(platform)}/pairings${suffix}`);
213
+ }
214
+ async function approveChannelPairing(platform, code) {
215
+ return coreRequest('POST', `/platforms/${encodeURIComponent(platform)}/pairings/approve`, { code });
216
+ }
217
+ async function rejectChannelPairing(platform, code) {
218
+ return coreRequest('POST', `/platforms/${encodeURIComponent(platform)}/pairings/reject`, { code });
219
+ }
220
+ async function listChannelAuthorizedUsers(platform, workspaceId) {
221
+ const suffix = workspaceId ? `?workspace_id=${encodeURIComponent(workspaceId)}` : '';
222
+ return coreRequest('GET', `/platforms/${encodeURIComponent(platform)}/users${suffix}`);
223
+ }
224
+ async function listLarkGateways() {
225
+ return listChannelGateways('lark');
226
+ }
227
+ async function getLarkGatewayStatus(workspaceId) {
228
+ return getChannelGatewayStatus('lark', workspaceId);
229
+ }
230
+ async function testLarkConnection(workspaceId) {
231
+ return testChannelConnection('lark', workspaceId);
232
+ }
233
+ async function enableLarkGateway(workspaceId) {
234
+ return enableChannelGateway('lark', workspaceId);
235
+ }
236
+ async function disableLarkGateway(workspaceId) {
237
+ return disableChannelGateway('lark', workspaceId);
238
+ }
239
+ async function listLarkPendingPairings(workspaceId) {
240
+ return listChannelPendingPairings('lark', workspaceId);
241
+ }
242
+ async function approveLarkPairing(code) {
243
+ return approveChannelPairing('lark', code);
244
+ }
245
+ async function rejectLarkPairing(code) {
246
+ return rejectChannelPairing('lark', code);
247
+ }
248
+ async function listLarkAuthorizedUsers(workspaceId) {
249
+ return listChannelAuthorizedUsers('lark', workspaceId);
250
+ }
251
+ async function getWeixinQrCode(workspaceId) {
252
+ return coreRequest('POST', `/platforms/weixin/${encodeURIComponent(workspaceId)}/qrcode`);
253
+ }
254
+ async function checkWeixinQrCodeStatus(workspaceId, ticket) {
255
+ return coreRequest('GET', `/platforms/weixin/${encodeURIComponent(workspaceId)}/qrcode/status?ticket=${encodeURIComponent(ticket)}`);
256
+ }
257
+ async function listWorkspaces() {
258
+ return coreRequest('GET', '/workspaces');
259
+ }
260
+ async function listScheduledJobs(workspaceId) {
261
+ const suffix = workspaceId ? `?workspace_id=${encodeURIComponent(workspaceId)}` : '';
262
+ return coreRequest('GET', `/scheduler/jobs${suffix}`);
263
+ }
264
+ async function getScheduledJob(jobId) {
265
+ return coreRequest('GET', `/scheduler/jobs/${encodeURIComponent(jobId)}`);
266
+ }
267
+ async function createScheduledJob(input) {
268
+ return coreRequest('POST', '/scheduler/jobs', input);
269
+ }
270
+ async function updateScheduledJob(jobId, input) {
271
+ return coreRequest('PATCH', `/scheduler/jobs/${encodeURIComponent(jobId)}`, input);
272
+ }
273
+ async function deleteScheduledJob(jobId) {
274
+ return coreRequest('DELETE', `/scheduler/jobs/${encodeURIComponent(jobId)}`);
275
+ }
276
+ async function runScheduledJob(jobId) {
277
+ return coreRequest('POST', `/scheduler/jobs/${encodeURIComponent(jobId)}/run`);
278
+ }
279
+ async function listScheduledJobRuns(jobId) {
280
+ return coreRequest('GET', `/scheduler/jobs/${encodeURIComponent(jobId)}/runs`);
281
+ }
282
+ async function listThreads(workspaceId) {
283
+ return coreRequest('GET', `/threads?workspace_id=${encodeURIComponent(workspaceId)}`);
284
+ }
285
+ async function createThread(workspaceId, title) {
286
+ return coreRequest('POST', '/threads', { workspaceId, title });
287
+ }
288
+ async function getThread(threadId) {
289
+ return coreRequest('GET', `/threads/${encodeURIComponent(threadId)}`);
290
+ }
291
+ async function renameThread(threadId, title) {
292
+ return coreRequest('PATCH', `/threads/${encodeURIComponent(threadId)}`, { title });
293
+ }
294
+ async function updateThreadKnowledgeBases(threadId, knowledgeBaseIds) {
295
+ return coreRequest('PATCH', `/threads/${encodeURIComponent(threadId)}/knowledge-bases`, { knowledgeBaseIds });
296
+ }
297
+ async function deleteThread(threadId) {
298
+ return coreRequest('DELETE', `/threads/${encodeURIComponent(threadId)}`);
299
+ }
300
+ async function sendMessage(threadId, content) {
301
+ return coreRequest('POST', `/threads/${encodeURIComponent(threadId)}/messages`, { content });
302
+ }
303
+ async function sendAction(threadId, content) {
304
+ return coreRequest('POST', `/threads/${encodeURIComponent(threadId)}/actions`, { content });
305
+ }
306
+ async function interruptRun(runId) {
307
+ return coreRequest('POST', `/runs/${encodeURIComponent(runId)}/interrupt`);
308
+ }
309
+ async function listKnowledgeSources() {
310
+ return coreRequest('GET', '/knowledge/sources');
311
+ }
312
+ async function getKnowledgeConfig() {
313
+ return coreRequest('GET', '/knowledge/config');
314
+ }
315
+ async function saveKnowledgeConfig(input) {
316
+ return coreRequest('POST', '/knowledge/config', input);
317
+ }
318
+ async function listKnowledgeFolders() {
319
+ return coreRequest('GET', '/knowledge/folders');
320
+ }
321
+ async function createKnowledgeFolder(input) {
322
+ return coreRequest('POST', '/knowledge/folders', input);
323
+ }
324
+ async function updateKnowledgeFolder(folderId, input) {
325
+ return coreRequest('PATCH', `/knowledge/folders/${encodeURIComponent(folderId)}`, input);
326
+ }
327
+ async function deleteKnowledgeFolder(folderId) {
328
+ return coreRequest('DELETE', `/knowledge/folders/${encodeURIComponent(folderId)}`);
329
+ }
330
+ async function listKnowledgeBases() {
331
+ return coreRequest('GET', '/knowledge/bases');
332
+ }
333
+ async function createKnowledgeBase(input) {
334
+ return coreRequest('POST', '/knowledge/bases', input);
335
+ }
336
+ async function getKnowledgeBase(knowledgeBaseId) {
337
+ return coreRequest('GET', `/knowledge/bases/${encodeURIComponent(knowledgeBaseId)}`);
338
+ }
339
+ async function updateKnowledgeBase(knowledgeBaseId, input) {
340
+ return coreRequest('PATCH', `/knowledge/bases/${encodeURIComponent(knowledgeBaseId)}`, input);
341
+ }
342
+ async function deleteKnowledgeBase(knowledgeBaseId) {
343
+ return coreRequest('DELETE', `/knowledge/bases/${encodeURIComponent(knowledgeBaseId)}`);
344
+ }
345
+ async function listKnowledgeBaseFiles(knowledgeBaseId) {
346
+ return coreRequest('GET', `/knowledge/bases/${encodeURIComponent(knowledgeBaseId)}/files`);
347
+ }
348
+ async function uploadKnowledgeBaseFiles(knowledgeBaseId, input) {
349
+ const formData = new FormData();
350
+ formData.append('collection', input.collection);
351
+ formData.append('knowledgebase_id', knowledgeBaseId);
352
+ if (input.folder) {
353
+ formData.append('folder', input.folder);
354
+ }
355
+ input.files.forEach((file) => {
356
+ formData.append('files', file, file.name);
357
+ });
358
+ const response = await fetch(`${exports.LOCAL_AI_CORE_BASE}/knowledge/bases/${encodeURIComponent(knowledgeBaseId)}/files`, {
359
+ method: 'POST',
360
+ body: formData,
361
+ });
362
+ const json = await response.json();
363
+ if (!response.ok || !json.ok) {
364
+ throw new Error(json.error || `Local AI Core upload failed: ${response.status}`);
365
+ }
366
+ return json.data;
367
+ }
368
+ async function deleteKnowledgeBaseFile(knowledgeBaseId, fileId) {
369
+ return coreRequest('DELETE', `/knowledge/bases/${encodeURIComponent(knowledgeBaseId)}/files/${encodeURIComponent(fileId)}`);
370
+ }
371
+ async function searchKnowledgeBase(knowledgeBaseId, input) {
372
+ return coreRequest('POST', `/knowledge/bases/${encodeURIComponent(knowledgeBaseId)}/search`, input);
373
+ }
374
+ async function getCapabilities() {
375
+ return coreRequest('GET', '/capabilities');
376
+ }
377
+ async function getCapabilitySnapshot() {
378
+ return coreRequest('GET', '/capabilities/snapshot');
379
+ }
380
+ async function getPluginDiagnostics() {
381
+ return coreRequest('GET', '/plugins/diagnostics');
382
+ }
383
+ async function probeWorkspaceStreaming(workspaceId) {
384
+ return coreRequest('POST', `/workspaces/${encodeURIComponent(workspaceId)}/streaming-probe`);
385
+ }
386
+ function onRuntimeUpdated(listener) {
387
+ return subscribeEvents((event) => {
388
+ if (event.type === 'runtime.updated') {
389
+ listener(event.runtime);
390
+ }
391
+ });
392
+ }
393
+ function onBridgeUpdated(listener) {
394
+ return subscribeEvents((event) => {
395
+ if (event.type === 'stream.updated') {
396
+ listener(event.stream);
397
+ }
398
+ if (event.type === 'message.created' ||
399
+ event.type === 'message.updated' ||
400
+ event.type === 'run.updated') {
401
+ if ('stream' in event && event.stream) {
402
+ listener(event.stream);
403
+ }
404
+ }
405
+ });
406
+ }