@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,282 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.createLocalCoreRuntimeState = createLocalCoreRuntimeState;
37
+ const node_fs_1 = require("node:fs");
38
+ const node_path_1 = require("node:path");
39
+ const TOML = __importStar(require("@iarna/toml"));
40
+ const DEFAULT_CONFIG = `# Managed by Local AI Core
41
+ [[projects]]
42
+ name = "default"
43
+
44
+ [projects.agent]
45
+ type = "opencode"
46
+ `;
47
+ const LOG_FILE_NAME = 'local-core.log';
48
+ const LOG_FILE_MAX_BYTES = 2 * 1024 * 1024;
49
+ class FileBackedLocalCoreRuntimeState {
50
+ userDataPath;
51
+ onLog;
52
+ runtimeDir;
53
+ settingsPath;
54
+ cliBinDir;
55
+ logPath;
56
+ settings;
57
+ logs = [];
58
+ constructor(userDataPath, onLog) {
59
+ this.userDataPath = userDataPath;
60
+ this.onLog = onLog;
61
+ this.runtimeDir = (0, node_path_1.join)(userDataPath, 'runtime');
62
+ this.settingsPath = (0, node_path_1.join)(this.runtimeDir, 'local-core-settings.json');
63
+ this.logPath = (0, node_path_1.join)(this.runtimeDir, LOG_FILE_NAME);
64
+ (0, node_fs_1.mkdirSync)(this.runtimeDir, { recursive: true });
65
+ this.cliBinDir = this.ensureCliWrapper();
66
+ this.settings = this.loadSettings();
67
+ this.ensureConfigFile();
68
+ }
69
+ getSettings() {
70
+ return this.settings;
71
+ }
72
+ async saveSettings(input) {
73
+ this.settings = {
74
+ ...this.settings,
75
+ ...(input.defaultProject ? { defaultProject: input.defaultProject } : {}),
76
+ ...(typeof input.autoStartService === 'boolean' ? { autoStartService: input.autoStartService } : {}),
77
+ ...(input.configPath ? { configPath: input.configPath } : {}),
78
+ plugins: input.plugins
79
+ ? Object.fromEntries(Object.entries({
80
+ ...this.settings.plugins,
81
+ ...Object.fromEntries(Object.entries(input.plugins).map(([pluginId, value]) => [
82
+ pluginId,
83
+ {
84
+ ...this.settings.plugins[pluginId],
85
+ ...value,
86
+ config: {
87
+ ...(this.settings.plugins[pluginId]?.config || {}),
88
+ ...(value.config || {}),
89
+ },
90
+ },
91
+ ])),
92
+ }))
93
+ : this.settings.plugins,
94
+ knowledge: input.knowledge
95
+ ? {
96
+ ...this.settings.knowledge,
97
+ ...input.knowledge,
98
+ }
99
+ : this.settings.knowledge,
100
+ };
101
+ this.persistSettings();
102
+ return this.settings;
103
+ }
104
+ getKnowledgeConfig() {
105
+ return this.settings.knowledge;
106
+ }
107
+ async updateKnowledgeConfig(input) {
108
+ this.settings = {
109
+ ...this.settings,
110
+ knowledge: {
111
+ ...this.settings.knowledge,
112
+ ...input,
113
+ },
114
+ };
115
+ this.persistSettings();
116
+ return this.settings.knowledge;
117
+ }
118
+ getLogs(limit = 200) {
119
+ return this.logs.slice(-Math.max(limit, 1));
120
+ }
121
+ pushLog(message) {
122
+ if (!message) {
123
+ return;
124
+ }
125
+ this.logs.push(message);
126
+ this.appendLogFile(message);
127
+ this.onLog?.(message);
128
+ if (this.logs.length > 400) {
129
+ this.logs.splice(0, this.logs.length - 400);
130
+ }
131
+ }
132
+ appendLogFile(message) {
133
+ try {
134
+ if ((0, node_fs_1.existsSync)(this.logPath) && (0, node_fs_1.statSync)(this.logPath).size > LOG_FILE_MAX_BYTES) {
135
+ const rotatedPath = `${this.logPath}.1`;
136
+ try {
137
+ (0, node_fs_1.renameSync)(this.logPath, rotatedPath);
138
+ }
139
+ catch {
140
+ // Keep runtime logging best-effort; stdout/UI logs still work.
141
+ }
142
+ }
143
+ const line = `${new Date().toISOString()} ${message.replace(/\r?\n/g, '\\n')}\n`;
144
+ (0, node_fs_1.appendFileSync)(this.logPath, line, 'utf-8');
145
+ }
146
+ catch {
147
+ // File logging must never break Local AI Core runtime behavior.
148
+ }
149
+ }
150
+ async readConfigFile() {
151
+ const path = this.settings.configPath;
152
+ if (!(0, node_fs_1.existsSync)(path)) {
153
+ return { path, exists: false, raw: '', parsed: null };
154
+ }
155
+ const raw = (0, node_fs_1.readFileSync)(path, 'utf8');
156
+ try {
157
+ const parsed = TOML.parse(raw);
158
+ return { path, exists: true, raw, parsed };
159
+ }
160
+ catch (error) {
161
+ return {
162
+ path,
163
+ exists: true,
164
+ raw,
165
+ parsed: null,
166
+ error: error instanceof Error ? error.message : String(error),
167
+ };
168
+ }
169
+ }
170
+ async saveRawConfigFile(raw) {
171
+ (0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(this.settings.configPath), { recursive: true });
172
+ (0, node_fs_1.writeFileSync)(this.settings.configPath, raw, 'utf8');
173
+ return this.readConfigFile();
174
+ }
175
+ async saveStructuredConfigFile(config) {
176
+ (0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(this.settings.configPath), { recursive: true });
177
+ (0, node_fs_1.writeFileSync)(this.settings.configPath, TOML.stringify(config), 'utf8');
178
+ return this.readConfigFile();
179
+ }
180
+ loadSettings() {
181
+ const defaults = {
182
+ configPath: (0, node_path_1.join)(this.runtimeDir, 'config.toml'),
183
+ defaultProject: 'default',
184
+ autoStartService: true,
185
+ plugins: {},
186
+ knowledge: {
187
+ baseUrl: '',
188
+ authMode: 'none',
189
+ token: '',
190
+ headerName: 'X-API-Key',
191
+ defaultCollection: 'personal_knowledge',
192
+ },
193
+ };
194
+ if (!(0, node_fs_1.existsSync)(this.settingsPath)) {
195
+ return {
196
+ binaryPath: '',
197
+ configPath: defaults.configPath,
198
+ autoStartService: defaults.autoStartService,
199
+ defaultProject: defaults.defaultProject,
200
+ managementPort: 0,
201
+ managementToken: '',
202
+ bridgePort: 0,
203
+ bridgeToken: '',
204
+ bridgePath: '',
205
+ knowledge: defaults.knowledge,
206
+ plugins: defaults.plugins,
207
+ };
208
+ }
209
+ const raw = JSON.parse((0, node_fs_1.readFileSync)(this.settingsPath, 'utf8'));
210
+ return {
211
+ binaryPath: '',
212
+ configPath: String(raw.configPath || defaults.configPath),
213
+ autoStartService: typeof raw.autoStartService === 'boolean' ? raw.autoStartService : defaults.autoStartService,
214
+ defaultProject: String(raw.defaultProject || defaults.defaultProject),
215
+ managementPort: 0,
216
+ managementToken: '',
217
+ bridgePort: 0,
218
+ bridgeToken: '',
219
+ bridgePath: '',
220
+ plugins: normalizePluginSettings(raw.plugins),
221
+ knowledge: {
222
+ ...defaults.knowledge,
223
+ ...(raw.knowledge || {}),
224
+ },
225
+ };
226
+ }
227
+ persistSettings() {
228
+ const payload = {
229
+ configPath: this.settings.configPath,
230
+ defaultProject: this.settings.defaultProject,
231
+ autoStartService: this.settings.autoStartService,
232
+ plugins: this.settings.plugins,
233
+ knowledge: this.settings.knowledge,
234
+ };
235
+ (0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(this.settingsPath), { recursive: true });
236
+ (0, node_fs_1.writeFileSync)(this.settingsPath, `${JSON.stringify(payload, null, 2)}\n`, 'utf8');
237
+ }
238
+ ensureConfigFile() {
239
+ if ((0, node_fs_1.existsSync)(this.settings.configPath)) {
240
+ return;
241
+ }
242
+ (0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(this.settings.configPath), { recursive: true });
243
+ (0, node_fs_1.writeFileSync)(this.settings.configPath, DEFAULT_CONFIG, 'utf8');
244
+ }
245
+ ensureCliWrapper() {
246
+ const binDir = (0, node_path_1.join)(this.runtimeDir, 'bin');
247
+ (0, node_fs_1.mkdirSync)(binDir, { recursive: true });
248
+ const cliEntry = (0, node_path_1.join)(__dirname, '..', 'cli', 'lac.js');
249
+ const wrapperPath = (0, node_path_1.join)(binDir, 'lac');
250
+ const script = [
251
+ '#!/bin/sh',
252
+ 'export ELECTRON_RUN_AS_NODE=1',
253
+ `exec "${process.execPath.replace(/"/g, '\\"')}" "${cliEntry.replace(/"/g, '\\"')}" "$@"`,
254
+ '',
255
+ ].join('\n');
256
+ (0, node_fs_1.writeFileSync)(wrapperPath, script, 'utf8');
257
+ (0, node_fs_1.chmodSync)(wrapperPath, 0o755);
258
+ return binDir;
259
+ }
260
+ }
261
+ function normalizePluginSettings(input) {
262
+ if (!input || typeof input !== 'object') {
263
+ return {};
264
+ }
265
+ const output = {};
266
+ for (const [pluginId, value] of Object.entries(input)) {
267
+ if (!value || typeof value !== 'object') {
268
+ continue;
269
+ }
270
+ const record = value;
271
+ output[pluginId] = {
272
+ enabled: typeof record.enabled === 'boolean' ? record.enabled : true,
273
+ config: record.config && typeof record.config === 'object'
274
+ ? record.config
275
+ : {},
276
+ };
277
+ }
278
+ return output;
279
+ }
280
+ function createLocalCoreRuntimeState(options) {
281
+ return new FileBackedLocalCoreRuntimeState(options.userDataPath, options.onLog);
282
+ }