@kafca/agentdock 0.1.42 → 0.1.44

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 (106) hide show
  1. package/README.md +10 -0
  2. package/dist/renderer/assets/{Badge-D-WU4kUV.js → Badge-Qk9qHovH.js} +1 -1
  3. package/dist/renderer/assets/{Chat-BGkC5tAe.js → Chat-BK-fm0Xr.js} +1 -1
  4. package/dist/renderer/assets/{ChatMarkdown-CfbC1jRd.js → ChatMarkdown-BKdW8OON.js} +1 -1
  5. package/dist/renderer/assets/{Config-qQb4bX5D.js → Config-B93CQGvY.js} +2 -2
  6. package/dist/renderer/assets/CronList-Z3TvSRKP.js +1 -0
  7. package/dist/renderer/assets/{Dashboard-xn6cUy_n.js → Dashboard-Ch3QkWwf.js} +2 -2
  8. package/dist/renderer/assets/{EmptyState-BdKBBUpr.js → EmptyState-kD9yAwtw.js} +1 -1
  9. package/dist/renderer/assets/{KnowledgeDetail-Duk8IQP3.js → KnowledgeDetail-BAMCLrjz.js} +2 -2
  10. package/dist/renderer/assets/{KnowledgeHome-BfjX_4Sv.js → KnowledgeHome-ChvjOfrc.js} +2 -2
  11. package/dist/renderer/assets/{Logs-Bfq61QMn.js → Logs-Cv0nth3j.js} +1 -1
  12. package/dist/renderer/assets/{Modal-B3vlBmBr.js → Modal-DwY4lecS.js} +1 -1
  13. package/dist/renderer/assets/MonitorList-JEvMoWUm.js +1 -0
  14. package/dist/renderer/assets/{Page-CPsLOP3z.js → Page-CnB9ePsb.js} +1 -1
  15. package/dist/renderer/assets/{ProjectDetail-D-g46wyF.js → ProjectDetail-DJa3sMmU.js} +2 -2
  16. package/dist/renderer/assets/{ProjectList-BrQEKDQ8.js → ProjectList-D6CXumR_.js} +1 -1
  17. package/dist/renderer/assets/{Select-C4CFMQmF.js → Select-zfoksLGB.js} +1 -1
  18. package/dist/renderer/assets/SessionChat-DUTh4WoM.js +1 -0
  19. package/dist/renderer/assets/{SessionList-DPWIUbOg.js → SessionList-D9o-lUst.js} +1 -1
  20. package/dist/renderer/assets/{ThreadChat-BjtU-j9q.js → ThreadChat-BYXlT-Kc.js} +7 -7
  21. package/dist/renderer/assets/{Workspace-BcNmHuJx.js → Workspace-BrhSwRQ-.js} +1 -1
  22. package/dist/renderer/assets/{arrow-left-DPzSmidS.js → arrow-left-CNEAuElg.js} +1 -1
  23. package/dist/renderer/assets/{book-open-B0xhoRqZ.js → book-open-BNJMhNI-.js} +1 -1
  24. package/dist/renderer/assets/{check-BTJTyd0C.js → check-BnclClRU.js} +1 -1
  25. package/dist/renderer/assets/{chevron-down-B6jJXlhi.js → chevron-down-Bh53e0O-.js} +1 -1
  26. package/dist/renderer/assets/{circle-qRhJR9qR.js → circle-ClZTWCWO.js} +1 -1
  27. package/dist/renderer/assets/desktop-C5vBT0yM.js +1 -0
  28. package/dist/renderer/assets/desktop-C6q6wBae.js +5 -0
  29. package/dist/renderer/assets/en-D2SkCrhG.js +1 -0
  30. package/dist/renderer/assets/{funnel-CbYKGTn8.js → funnel-_5hsz0xI.js} +1 -1
  31. package/dist/renderer/assets/{heart-DjwWJfkz.js → heart-u4Q1aOqj.js} +1 -1
  32. package/dist/renderer/assets/{index-BWmHJRhe.js → index-B36eowj-.js} +39 -34
  33. package/dist/renderer/assets/{index-CyZs_2NJ.js → index-BNFx4uYv.js} +3 -3
  34. package/dist/renderer/assets/{pencil-1dfAivmj.js → pencil-DLh9QNmT.js} +1 -1
  35. package/dist/renderer/assets/{play-CB3w1G6S.js → play-BDTk9Scm.js} +1 -1
  36. package/dist/renderer/assets/{plug-Bvep5o3r.js → plug-BG0JHW6B.js} +1 -1
  37. package/dist/renderer/assets/{plus-DJVg9m09.js → plus-BSc8POsz.js} +1 -1
  38. package/dist/renderer/assets/projects-DwfZwxDW.js +1 -0
  39. package/dist/renderer/assets/{save-xjJn3qf2.js → save-D5AO_G6a.js} +1 -1
  40. package/dist/renderer/assets/{search-BK3UrQxM.js → search-CniPk7Ey.js} +1 -1
  41. package/dist/renderer/assets/{server-Dyd2eXJu.js → server-GsXyQAZm.js} +1 -1
  42. package/dist/renderer/assets/{session-utils-eXC0020s.js → session-utils-BDxzgTBC.js} +1 -1
  43. package/dist/renderer/assets/{sessions-WLYpkyUt.js → sessions-CLcKA1Tt.js} +1 -1
  44. package/dist/renderer/assets/{shield-check-C0N6aWzF.js → shield-check-4i0E3hmf.js} +1 -1
  45. package/dist/renderer/assets/{trash-2-BGMTNJA6.js → trash-2-DhtOCsO5.js} +1 -1
  46. package/dist/renderer/assets/{user-BcGMLyhu.js → user-BtC_pVXV.js} +1 -1
  47. package/dist/renderer/assets/{wifi-off-FhcQx0HK.js → wifi-off-BHPzPY_B.js} +1 -1
  48. package/dist/renderer/assets/zh-DIcdHycM.js +1 -0
  49. package/dist/renderer/index.html +1 -1
  50. package/dist-electron/packages/contracts/src/local-core.js +28 -0
  51. package/dist-electron/packages/core-sdk/src/index.js +32 -0
  52. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-backend.js +51 -0
  53. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-store.js +4 -1364
  54. package/dist-electron/services/local-ai-core/src/acp/store/agent-task-store.js +166 -0
  55. package/dist-electron/services/local-ai-core/src/acp/store/automation-monitor-store.js +231 -0
  56. package/dist-electron/services/local-ai-core/src/acp/store/local-core-acp-store.js +263 -0
  57. package/dist-electron/services/local-ai-core/src/acp/store/platform-store.js +186 -0
  58. package/dist-electron/services/local-ai-core/src/acp/store/scheduler-store.js +201 -0
  59. package/dist-electron/services/local-ai-core/src/acp/store/schema.js +275 -0
  60. package/dist-electron/services/local-ai-core/src/acp/store/security-store.js +266 -0
  61. package/dist-electron/services/local-ai-core/src/acp/store/thread-store.js +232 -0
  62. package/dist-electron/services/local-ai-core/src/acp/store/utils.js +47 -0
  63. package/dist-electron/services/local-ai-core/src/acp/store/workspace-registry-store.js +109 -0
  64. package/dist-electron/services/local-ai-core/src/automation/automation-conversation-executor.js +136 -0
  65. package/dist-electron/services/local-ai-core/src/automation/automation-monitor-repository.js +56 -0
  66. package/dist-electron/services/local-ai-core/src/automation/automation-monitor-service.js +359 -0
  67. package/dist-electron/services/local-ai-core/src/automation/condition-evaluator.js +77 -0
  68. package/dist-electron/services/local-ai-core/src/automation/mock-stock-provider.js +40 -0
  69. package/dist-electron/services/local-ai-core/src/automation/monitor-id.js +10 -0
  70. package/dist-electron/services/local-ai-core/src/channel/lark/cards.js +55 -0
  71. package/dist-electron/services/local-ai-core/src/channel/lark/config.js +2 -0
  72. package/dist-electron/services/local-ai-core/src/channel/lark/inbound.js +114 -0
  73. package/dist-electron/services/local-ai-core/src/channel/lark/local-core-lark-gateway.js +153 -94
  74. package/dist-electron/services/local-ai-core/src/channel/shared/session-command-runtime.js +53 -0
  75. package/dist-electron/services/local-ai-core/src/channel/shared/thread-routing.js +34 -0
  76. package/dist-electron/services/local-ai-core/src/channel/weixin/local-core-weixin-gateway.js +63 -51
  77. package/dist-electron/services/local-ai-core/src/cli/lac.js +196 -0
  78. package/dist-electron/services/local-ai-core/src/cli/monitor-cli-parsers.js +37 -0
  79. package/dist-electron/services/local-ai-core/src/kernel/bootstrap.js +43 -0
  80. package/dist-electron/services/local-ai-core/src/kernel/capability-registry.js +12 -0
  81. package/dist-electron/services/local-ai-core/src/plugins/builtin/monitor-stock-plugin.js +30 -0
  82. package/dist-electron/services/local-ai-core/src/runtime/local-core-controller.js +41 -0
  83. package/dist-electron/services/local-ai-core/src/runtime/server-routes.js +31 -0
  84. package/dist-electron/services/local-ai-core/src/runtime/server.js +36 -0
  85. package/dist-electron/services/local-ai-core/src/scheduler/scheduled-bridge-session.js +25 -11
  86. package/dist-electron/services/local-ai-core/src/thread/session-command-service.js +275 -0
  87. package/dist-electron/services/local-ai-core/src/thread/slash-command-registry.js +27 -0
  88. package/dist-electron/services/local-ai-core/src/thread/thread-command-service.js +15 -15
  89. package/dist-electron/shared/desktop.js +21 -1
  90. package/dist-electron/tests/contracts/local-core-contracts.test.js +9 -0
  91. package/dist-electron/tests/electron/automation-monitor.test.js +38 -0
  92. package/dist-electron/tests/electron/lac-cli.test.js +146 -0
  93. package/dist-electron/tests/integration/channel-gateways.test.js +32 -0
  94. package/dist-electron/tests/integration/lark-gateway.test.js +1918 -0
  95. package/dist-electron/tests/integration/local-core-acp-progress.test.js +1772 -0
  96. package/dist-electron/tests/integration/local-core-refactor.test.js +216 -4566
  97. package/dist-electron/tests/integration/local-core-routes.test.js +204 -0
  98. package/dist-electron/tests/integration/weixin-gateway.test.js +927 -0
  99. package/package.json +1 -1
  100. package/dist/renderer/assets/CronList-CKhggzYk.js +0 -1
  101. package/dist/renderer/assets/SessionChat-06Jny5_G.js +0 -1
  102. package/dist/renderer/assets/desktop-DXmXjjUR.js +0 -1
  103. package/dist/renderer/assets/desktop-O8_6ZCVZ.js +0 -4
  104. package/dist/renderer/assets/en-CKhCF6St.js +0 -1
  105. package/dist/renderer/assets/projects-xnW0fTtq.js +0 -1
  106. package/dist/renderer/assets/zh-Dz5FLTBV.js +0 -1
@@ -0,0 +1,38 @@
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 condition_evaluator_js_1 = require("../../services/local-ai-core/src/automation/condition-evaluator.js");
9
+ const event = {
10
+ id: 'event-1',
11
+ sourceType: 'stock.quote',
12
+ occurredAt: '2026-05-11T00:00:00.000Z',
13
+ subject: 'AAPL',
14
+ payload: {
15
+ latestPrice: 188,
16
+ change_percent: 4.2,
17
+ volumeRatio: 2.1,
18
+ },
19
+ };
20
+ (0, node_test_1.default)('monitor condition evaluator supports simple comparisons and safe boolean expressions', () => {
21
+ strict_1.default.equal((0, condition_evaluator_js_1.evaluateMonitorCondition)({
22
+ metric: 'abs_change_percent',
23
+ operator: '>=',
24
+ value: 3,
25
+ }, event), true);
26
+ strict_1.default.equal((0, condition_evaluator_js_1.evaluateMonitorCondition)({
27
+ metric: 'expression',
28
+ operator: '==',
29
+ value: true,
30
+ expression: 'abs_change_percent >= 3 && latestPrice > 100',
31
+ }, event), true);
32
+ strict_1.default.equal((0, condition_evaluator_js_1.evaluateMonitorCondition)({
33
+ metric: 'expression',
34
+ operator: '==',
35
+ value: true,
36
+ expression: 'latestPrice < 100 || volumeRatio >= 2',
37
+ }, event), true);
38
+ });
@@ -326,6 +326,152 @@ function createIo() {
326
326
  });
327
327
  strict_1.default.match(read().stdout, /Sent file absolute\.pdf to chat-1: msg-file-2/);
328
328
  });
329
+ (0, node_test_1.default)('lac monitor add posts thread context and stock source config', async () => {
330
+ let capturedBody = null;
331
+ const server = (0, node_http_1.createServer)(async (req, res) => {
332
+ if (req.method === 'POST' && req.url === '/api/local/v1/automation/monitors') {
333
+ const chunks = [];
334
+ for await (const chunk of req) {
335
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
336
+ }
337
+ capturedBody = Buffer.concat(chunks).toString('utf8');
338
+ res.setHeader('content-type', 'application/json');
339
+ res.end(JSON.stringify({
340
+ ok: true,
341
+ data: {
342
+ id: 'monitor:826aff79-570b-4308-822e-18318e2c96ba',
343
+ workspaceId: '知识库',
344
+ title: 'AAPL swing',
345
+ sourceType: 'stock.quote',
346
+ sourceConfig: { symbol: 'AAPL', price: 188.5 },
347
+ condition: { metric: 'abs_change_percent', operator: '>=', value: 3 },
348
+ promptTemplate: 'analyze AAPL',
349
+ platform: 'lark',
350
+ route: { type: 'channel.chat', channelId: 'chat-1', participantId: 'user-1' },
351
+ executionMode: 'side-thread',
352
+ enabled: true,
353
+ cooldownMs: 900000,
354
+ concurrencyPolicy: 'skip_if_running',
355
+ createdAt: '2026-04-22T06:00:00.000Z',
356
+ updatedAt: '2026-04-22T06:00:00.000Z',
357
+ },
358
+ }));
359
+ return;
360
+ }
361
+ res.statusCode = 404;
362
+ res.end(JSON.stringify({ ok: false, error: 'not found' }));
363
+ });
364
+ await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve));
365
+ const address = server.address();
366
+ (0, strict_1.default)(address && typeof address === 'object');
367
+ const { io, read } = createIo();
368
+ const exitCode = await (0, lac_js_1.runCli)([
369
+ 'monitor',
370
+ 'add',
371
+ '--title',
372
+ 'AAPL swing',
373
+ '--source',
374
+ 'stock.quote',
375
+ '--symbol',
376
+ 'aapl',
377
+ '--price',
378
+ '188.5',
379
+ '--condition',
380
+ 'abs_change_percent >= 3',
381
+ '--message',
382
+ 'analyze AAPL',
383
+ ], {
384
+ LOCAL_AI_CORE_BASE: `http://127.0.0.1:${address.port}/api/local/v1`,
385
+ LOCAL_AI_WORKSPACE_ID: '知识库',
386
+ LOCAL_AI_THREAD_ID: 'thread-1',
387
+ LOCAL_AI_PLATFORM: 'lark',
388
+ LOCAL_AI_CHAT_ID: 'chat-1',
389
+ LOCAL_AI_PLATFORM_USER_ID: 'user-1',
390
+ }, io);
391
+ server.close();
392
+ strict_1.default.equal(exitCode, 0);
393
+ (0, strict_1.default)(capturedBody);
394
+ strict_1.default.deepEqual(JSON.parse(capturedBody), {
395
+ workspaceId: '知识库',
396
+ threadId: 'thread-1',
397
+ title: 'AAPL swing',
398
+ sourceType: 'stock.quote',
399
+ sourceConfig: { symbol: 'AAPL', price: 188.5 },
400
+ condition: { metric: 'abs_change_percent', operator: '>=', value: 3 },
401
+ promptTemplate: 'analyze AAPL',
402
+ executionMode: 'side-thread',
403
+ cooldownMs: 900000,
404
+ enabled: true,
405
+ });
406
+ strict_1.default.match(read().stdout, /Created monitor 826aff79/);
407
+ });
408
+ (0, node_test_1.default)('lac monitor list filters by current thread context', async () => {
409
+ const server = (0, node_http_1.createServer)((req, res) => {
410
+ if (req.method === 'GET' && req.url === '/api/local/v1/automation/monitors?workspace_id=%E7%9F%A5%E8%AF%86%E5%BA%93') {
411
+ res.setHeader('content-type', 'application/json');
412
+ res.end(JSON.stringify({
413
+ ok: true,
414
+ data: {
415
+ monitors: [
416
+ {
417
+ id: 'monitor-1',
418
+ workspaceId: '知识库',
419
+ title: 'current',
420
+ sourceType: 'stock.quote',
421
+ sourceConfig: { symbol: 'AAPL' },
422
+ condition: { metric: 'abs_change_percent', operator: '>=', value: 3 },
423
+ promptTemplate: 'ping',
424
+ platform: 'lark',
425
+ route: { type: 'channel.chat', channelId: 'chat-1', participantId: 'user-1' },
426
+ executionMode: 'side-thread',
427
+ enabled: true,
428
+ cooldownMs: 900000,
429
+ concurrencyPolicy: 'skip_if_running',
430
+ createdAt: '2026-04-22T06:00:00.000Z',
431
+ updatedAt: '2026-04-22T06:00:00.000Z',
432
+ },
433
+ {
434
+ id: 'monitor-2',
435
+ workspaceId: '知识库',
436
+ title: 'other',
437
+ sourceType: 'stock.quote',
438
+ sourceConfig: { symbol: 'MSFT' },
439
+ condition: { metric: 'abs_change_percent', operator: '>=', value: 3 },
440
+ promptTemplate: 'pong',
441
+ platform: 'lark',
442
+ route: { type: 'channel.chat', channelId: 'chat-2', participantId: 'user-2' },
443
+ executionMode: 'side-thread',
444
+ enabled: true,
445
+ cooldownMs: 900000,
446
+ concurrencyPolicy: 'skip_if_running',
447
+ createdAt: '2026-04-22T06:00:00.000Z',
448
+ updatedAt: '2026-04-22T06:00:00.000Z',
449
+ },
450
+ ],
451
+ },
452
+ }));
453
+ return;
454
+ }
455
+ res.statusCode = 404;
456
+ res.end(JSON.stringify({ ok: false, error: 'not found' }));
457
+ });
458
+ await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve));
459
+ const address = server.address();
460
+ (0, strict_1.default)(address && typeof address === 'object');
461
+ const { io, read } = createIo();
462
+ const exitCode = await (0, lac_js_1.runCli)(['monitor', 'list', '--thread'], {
463
+ LOCAL_AI_CORE_BASE: `http://127.0.0.1:${address.port}/api/local/v1`,
464
+ LOCAL_AI_WORKSPACE_ID: '知识库',
465
+ LOCAL_AI_THREAD_ID: 'thread-1',
466
+ LOCAL_AI_PLATFORM: 'lark',
467
+ LOCAL_AI_CHAT_ID: 'chat-1',
468
+ LOCAL_AI_PLATFORM_USER_ID: 'user-1',
469
+ }, io);
470
+ server.close();
471
+ strict_1.default.equal(exitCode, 0);
472
+ strict_1.default.match(read().stdout, /monitor-1/);
473
+ strict_1.default.doesNotMatch(read().stdout, /monitor-2/);
474
+ });
329
475
  (0, node_test_1.default)('lac scheduler list shows workspace jobs by default', async () => {
330
476
  const server = (0, node_http_1.createServer)((req, res) => {
331
477
  if (req.method === 'GET' && req.url === '/api/local/v1/scheduler/jobs?workspace_id=%E7%9F%A5%E8%AF%86%E5%BA%93') {
@@ -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
+ });