@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,102 @@
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 thread_chat_permission_1 = require("./thread-chat-permission");
9
+ const thread_chat_task_state_1 = require("./thread-chat-task-state");
10
+ function createPermissionActions() {
11
+ return [[
12
+ { text: 'Allow', data: 'allow' },
13
+ { text: 'Deny', data: 'deny' },
14
+ ]];
15
+ }
16
+ function createMessage(overrides) {
17
+ const { id, ...rest } = overrides;
18
+ return {
19
+ role: 'assistant',
20
+ content: 'Permission required',
21
+ order: 0,
22
+ ...rest,
23
+ id,
24
+ };
25
+ }
26
+ (0, node_test_1.default)('toPendingPermissionRequest returns an actionable permission prompt payload', () => {
27
+ const prompt = (0, thread_chat_permission_1.toPendingPermissionRequest)(createMessage({
28
+ id: 'latest-permission',
29
+ order: 3,
30
+ actionMode: 'permission',
31
+ actionInteractive: true,
32
+ actionReplyCtx: 'run-1',
33
+ actions: createPermissionActions(),
34
+ }));
35
+ strict_1.default.ok(prompt);
36
+ strict_1.default.equal(prompt.id, 'latest-permission');
37
+ strict_1.default.deepEqual(prompt.actions, createPermissionActions());
38
+ strict_1.default.equal(prompt.actionReplyCtx, 'run-1');
39
+ });
40
+ (0, node_test_1.default)('taskStateAfterTypingStop keeps awaiting_permission prompts visible', () => {
41
+ strict_1.default.equal((0, thread_chat_task_state_1.taskStateAfterTypingStop)('awaiting_permission'), 'awaiting_permission');
42
+ strict_1.default.equal((0, thread_chat_task_state_1.taskStateAfterTypingStop)('running'), 'idle');
43
+ strict_1.default.equal((0, thread_chat_task_state_1.taskStateAfterTypingStop)('permission_submitted'), 'idle');
44
+ });
45
+ (0, node_test_1.default)('taskStateForBridgeButtons prioritizes interactive permission requests', () => {
46
+ strict_1.default.equal((0, thread_chat_task_state_1.taskStateForBridgeButtons)(true, true), 'awaiting_permission');
47
+ strict_1.default.equal((0, thread_chat_task_state_1.taskStateReasonForBridgeButtons)(true, true), 'bridge-buttons-awaiting-permission');
48
+ strict_1.default.equal((0, thread_chat_task_state_1.taskStateForBridgeButtons)(true, false), 'awaiting_input');
49
+ strict_1.default.equal((0, thread_chat_task_state_1.taskStateReasonForBridgeButtons)(true, false), 'bridge-buttons-awaiting-input');
50
+ strict_1.default.equal((0, thread_chat_task_state_1.taskStateForBridgeButtons)(false, false), 'idle');
51
+ strict_1.default.equal((0, thread_chat_task_state_1.taskStateReasonForBridgeButtons)(false, false), 'bridge-buttons-idle');
52
+ });
53
+ (0, node_test_1.default)('deriveTaskStateFromThreadDetail recognizes permission and input blocking states', () => {
54
+ const pendingPermission = (0, thread_chat_task_state_1.deriveTaskStateFromThreadDetail)({
55
+ id: 'thread-1',
56
+ workspaceId: 'default',
57
+ title: 'Thread',
58
+ live: false,
59
+ updatedAt: '2026-04-22T00:00:00.000Z',
60
+ createdAt: '2026-04-22T00:00:00.000Z',
61
+ historyCount: 1,
62
+ excerpt: '',
63
+ messages: [],
64
+ selectedKnowledgeBaseIds: [],
65
+ pendingPermissionRequest: {
66
+ id: 'permission-1',
67
+ content: 'Permission required',
68
+ actions: createPermissionActions(),
69
+ actionMode: 'permission',
70
+ actionInteractive: true,
71
+ },
72
+ }, 0, 0);
73
+ strict_1.default.deepEqual(pendingPermission, {
74
+ state: 'awaiting_permission',
75
+ reason: 'local-core-poll-awaiting-permission',
76
+ });
77
+ const awaitingInput = (0, thread_chat_task_state_1.deriveTaskStateFromThreadDetail)({
78
+ id: 'thread-1',
79
+ workspaceId: 'default',
80
+ title: 'Thread',
81
+ live: false,
82
+ updatedAt: '2026-04-22T00:00:00.000Z',
83
+ createdAt: '2026-04-22T00:00:00.000Z',
84
+ historyCount: 1,
85
+ excerpt: '',
86
+ messages: [
87
+ {
88
+ id: 'assistant-1',
89
+ role: 'assistant',
90
+ content: '等待你的回复,请直接回复选项编号',
91
+ timestamp: '2026-04-22T00:00:00.000Z',
92
+ kind: 'progress',
93
+ },
94
+ ],
95
+ selectedKnowledgeBaseIds: [],
96
+ pendingPermissionRequest: null,
97
+ }, 0, 0);
98
+ strict_1.default.deepEqual(awaitingInput, {
99
+ state: 'awaiting_input',
100
+ reason: 'local-core-poll-awaiting-input',
101
+ });
102
+ });
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.taskStateAfterTypingStop = taskStateAfterTypingStop;
4
+ exports.taskStateForBridgeButtons = taskStateForBridgeButtons;
5
+ exports.taskStateReasonForBridgeButtons = taskStateReasonForBridgeButtons;
6
+ exports.deriveTaskStateFromThreadDetail = deriveTaskStateFromThreadDetail;
7
+ function isAwaitingInputMessage(content) {
8
+ if (!content) {
9
+ return false;
10
+ }
11
+ const normalized = content.replace(/\s+/g, ' ').trim();
12
+ return (/^Agent 提问(?:\s*\(\d+\/\d+\))?/i.test(normalized) ||
13
+ normalized.includes('请回复选项编号') ||
14
+ normalized.includes('直接输入你的回答') ||
15
+ normalized.includes('等待你的回复') ||
16
+ normalized.includes('请直接回复') ||
17
+ normalized.includes('请输入你的回答'));
18
+ }
19
+ function taskStateAfterTypingStop(taskState) {
20
+ return taskState === 'awaiting_permission' ? 'awaiting_permission' : 'idle';
21
+ }
22
+ function taskStateForBridgeButtons(hasActions, hasInteractivePermission) {
23
+ if (hasInteractivePermission) {
24
+ return 'awaiting_permission';
25
+ }
26
+ if (hasActions) {
27
+ return 'awaiting_input';
28
+ }
29
+ return 'idle';
30
+ }
31
+ function taskStateReasonForBridgeButtons(hasActions, hasInteractivePermission) {
32
+ if (hasInteractivePermission) {
33
+ return 'bridge-buttons-awaiting-permission';
34
+ }
35
+ if (hasActions) {
36
+ return 'bridge-buttons-awaiting-input';
37
+ }
38
+ return 'bridge-buttons-idle';
39
+ }
40
+ function deriveTaskStateFromThreadDetail(detail, baselineResponseCount, unchangedPolls) {
41
+ if (detail.pendingPermissionRequest) {
42
+ return {
43
+ state: 'awaiting_permission',
44
+ reason: 'local-core-poll-awaiting-permission',
45
+ };
46
+ }
47
+ const assistantMessages = detail.messages.filter((message) => message.role === 'assistant');
48
+ const latestAssistantMessage = assistantMessages[assistantMessages.length - 1];
49
+ if (latestAssistantMessage && isAwaitingInputMessage(latestAssistantMessage.content)) {
50
+ return {
51
+ state: 'awaiting_input',
52
+ reason: 'local-core-poll-awaiting-input',
53
+ };
54
+ }
55
+ if (latestAssistantMessage &&
56
+ latestAssistantMessage.kind !== 'progress' &&
57
+ detail.messages.filter((message) => message.role !== 'user' && message.kind !== 'progress').length > baselineResponseCount &&
58
+ unchangedPolls >= 1) {
59
+ return {
60
+ state: 'idle',
61
+ reason: 'local-core-poll-complete',
62
+ };
63
+ }
64
+ return null;
65
+ }
package/package.json ADDED
@@ -0,0 +1,146 @@
1
+ {
2
+ "name": "@kafca/agentdock",
3
+ "version": "0.1.7",
4
+ "type": "module",
5
+ "main": "dist-electron/electron/main.js",
6
+ "bin": {
7
+ "agentdock": "bin/agentdock.mjs"
8
+ },
9
+ "files": [
10
+ "bin/**",
11
+ "dist/renderer/**",
12
+ "dist-electron/**",
13
+ "build/icon.png",
14
+ "README.md",
15
+ "package.json"
16
+ ],
17
+ "publishConfig": {
18
+ "access": "public"
19
+ },
20
+ "scripts": {
21
+ "dev": "node scripts/dev.mjs",
22
+ "dev:web": "pnpm exec vite --host 127.0.0.1 --port 5173",
23
+ "dev:core": "pnpm build:electron && node scripts/launch-core.mjs",
24
+ "build": "vite build && node scripts/write-electron-package.mjs && tsc -p tsconfig.electron.json",
25
+ "build:npm": "VITE_LOCAL_AI_CORE_BASE=/api/local/v1 pnpm build",
26
+ "build:web": "vite build",
27
+ "build:renderer": "vite build",
28
+ "build:electron": "node scripts/write-electron-package.mjs && tsc -p tsconfig.electron.json",
29
+ "build:core": "pnpm build:electron",
30
+ "test": "pnpm build:electron && node --test dist-electron/electron/*.test.js dist-electron/packages/knowledge-api/test/*.test.js dist-electron/src/pages/Threads/thread-chat-permission.test.js",
31
+ "e2e:smoke": "pnpm build && node scripts/e2e-smoke.mjs",
32
+ "dist:mac": "pnpm build && electron-builder --mac dmg zip --arm64",
33
+ "dist:win": "pnpm build && electron-builder --win nsis zip --x64",
34
+ "start": "node scripts/dev.mjs",
35
+ "start:core": "node scripts/launch-core.mjs",
36
+ "start:prod": "node scripts/launch-electron.mjs .",
37
+ "preview": "vite preview",
38
+ "preview:web": "vite preview --host 127.0.0.1 --port 4173"
39
+ },
40
+ "dependencies": {
41
+ "@agentclientprotocol/claude-agent-acp": "^0.30.0",
42
+ "@iarna/toml": "^2.2.5",
43
+ "@larksuiteoapi/node-sdk": "^1.58.0",
44
+ "@radix-ui/react-dialog": "^1.1.15",
45
+ "@radix-ui/react-select": "^2.2.6",
46
+ "@radix-ui/react-slot": "^1.2.4",
47
+ "@tailwindcss/typography": "^0.5.19",
48
+ "clsx": "^2.1.1",
49
+ "highlight.js": "^11.11.1",
50
+ "i18next": "^25.1.2",
51
+ "lucide-react": "^0.487.0",
52
+ "qrcode.react": "^4.2.0",
53
+ "react": "^19.1.0",
54
+ "react-dom": "^19.1.0",
55
+ "react-i18next": "^15.5.1",
56
+ "react-markdown": "^10.1.0",
57
+ "react-router-dom": "^7.5.0",
58
+ "rehype-highlight": "^7.0.2",
59
+ "remark-gfm": "^4.0.1",
60
+ "ws": "^8.18.1",
61
+ "zustand": "^5.0.5"
62
+ },
63
+ "devDependencies": {
64
+ "@types/node": "^24.0.0",
65
+ "@types/react": "^19.1.2",
66
+ "@types/react-dom": "^19.1.2",
67
+ "@types/ws": "^8.18.1",
68
+ "@vitejs/plugin-react": "^4.4.1",
69
+ "autoprefixer": "^10.4.21",
70
+ "electron": "^35.0.2",
71
+ "electron-builder": "^26.8.1",
72
+ "postcss": "^8.5.3",
73
+ "tailwindcss": "^3.4.17",
74
+ "typescript": "~5.8.3",
75
+ "vite": "^6.3.2"
76
+ },
77
+ "pnpm": {
78
+ "onlyBuiltDependencies": [
79
+ "electron",
80
+ "protobufjs"
81
+ ]
82
+ },
83
+ "build": {
84
+ "appId": "com.helloimcx.agentdock",
85
+ "productName": "AgentDock",
86
+ "directories": {
87
+ "output": "release"
88
+ },
89
+ "asar": false,
90
+ "files": [
91
+ "dist/renderer/**",
92
+ "dist-electron/**",
93
+ "build/icon.png",
94
+ "node_modules/**",
95
+ "package.json"
96
+ ],
97
+ "mac": {
98
+ "icon": "build/icon.icns",
99
+ "category": "public.app-category.productivity",
100
+ "identity": null,
101
+ "target": [
102
+ {
103
+ "target": "dmg",
104
+ "arch": [
105
+ "arm64"
106
+ ]
107
+ },
108
+ {
109
+ "target": "zip",
110
+ "arch": [
111
+ "arm64"
112
+ ]
113
+ }
114
+ ]
115
+ },
116
+ "win": {
117
+ "icon": "build/icon.ico",
118
+ "target": [
119
+ {
120
+ "target": "nsis",
121
+ "arch": [
122
+ "x64"
123
+ ]
124
+ },
125
+ {
126
+ "target": "zip",
127
+ "arch": [
128
+ "x64"
129
+ ]
130
+ }
131
+ ]
132
+ },
133
+ "dmg": {
134
+ "artifactName": "${productName}-${version}-${arch}.${ext}"
135
+ },
136
+ "artifactName": "${productName}-${version}-${arch}.${ext}",
137
+ "publish": [
138
+ {
139
+ "provider": "github",
140
+ "owner": "helloimcx",
141
+ "repo": "agentdock",
142
+ "releaseType": "release"
143
+ }
144
+ ]
145
+ }
146
+ }