@kafca/agentdock 0.1.34 → 0.1.35

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 (57) hide show
  1. package/README.md +67 -0
  2. package/dist/renderer/assets/{Badge-BDxYXRKv.js → Badge-BM4WCcua.js} +1 -1
  3. package/dist/renderer/assets/{Chat-B-ZXd4Ld.js → Chat-DoyBHOsx.js} +1 -1
  4. package/dist/renderer/assets/{ChatMarkdown-Dn4XvCke.js → ChatMarkdown-BWj04kgW.js} +1 -1
  5. package/dist/renderer/assets/{Config-DMOYyKOD.js → Config-A95OuazQ.js} +1 -1
  6. package/dist/renderer/assets/{CronList-CMBhMs1J.js → CronList-DsPU4zGT.js} +1 -1
  7. package/dist/renderer/assets/{Dashboard-DApD4wOA.js → Dashboard-D8Vpj97x.js} +2 -2
  8. package/dist/renderer/assets/{EmptyState-CqcPky2i.js → EmptyState-x1uVoSxZ.js} +1 -1
  9. package/dist/renderer/assets/{KnowledgeDetail-DMOXK9Nz.js → KnowledgeDetail-C9TbcyNJ.js} +1 -1
  10. package/dist/renderer/assets/{KnowledgeHome-Dv4Ttb6N.js → KnowledgeHome-Cg9Fb41Q.js} +1 -1
  11. package/dist/renderer/assets/Logs-oWaKA60u.js +1 -0
  12. package/dist/renderer/assets/{Modal-Cj_0qtXr.js → Modal-24hTXXHK.js} +1 -1
  13. package/dist/renderer/assets/{Page-BlKjqLN4.js → Page-YRtQonKZ.js} +1 -1
  14. package/dist/renderer/assets/{ProjectDetail-aMl1VGTt.js → ProjectDetail-DScsxJO-.js} +1 -1
  15. package/dist/renderer/assets/{ProjectList-R2YvsII0.js → ProjectList-8L5GD7PN.js} +1 -1
  16. package/dist/renderer/assets/{Select-CrqwGrrm.js → Select-BI8Uw_DF.js} +1 -1
  17. package/dist/renderer/assets/{SessionChat-CGtpyGKR.js → SessionChat-BIoCWdDD.js} +1 -1
  18. package/dist/renderer/assets/{SessionList-D8gRUc8M.js → SessionList-BsEJeDxI.js} +1 -1
  19. package/dist/renderer/assets/{ThreadChat-BCGm6bQP.js → ThreadChat-DJi0UBta.js} +1 -1
  20. package/dist/renderer/assets/{Workspace-DnePK6tn.js → Workspace-tlJxrgC5.js} +1 -1
  21. package/dist/renderer/assets/{arrow-left-SVmCyBR4.js → arrow-left-pzaBhi9y.js} +1 -1
  22. package/dist/renderer/assets/{book-open-CZi1avEJ.js → book-open-CNhlVyqh.js} +1 -1
  23. package/dist/renderer/assets/{check-C76I9BFh.js → check-Cg2LLCdl.js} +1 -1
  24. package/dist/renderer/assets/{chevron-down-C7YSxzHw.js → chevron-down-Dgqg07wf.js} +1 -1
  25. package/dist/renderer/assets/{circle-_s8tmsAJ.js → circle-BBd_jIS2.js} +1 -1
  26. package/dist/renderer/assets/{desktop-66ot_8sB.js → desktop-C0S-Yv8G.js} +1 -1
  27. package/dist/renderer/assets/{funnel-cDV0Q_Mr.js → funnel-DwSh-SrX.js} +1 -1
  28. package/dist/renderer/assets/{heart-qMUQm0tf.js → heart-CWVc-KhZ.js} +1 -1
  29. package/dist/renderer/assets/{index-DFiJR0vv.css → index-CaQZSRbg.css} +1 -1
  30. package/dist/renderer/assets/{index-BY88QEsS.js → index-DZbeAYVk.js} +2 -2
  31. package/dist/renderer/assets/{index-Cr6erCLm.js → index-HYmDNQ9k.js} +1 -1
  32. package/dist/renderer/assets/{pencil-C3MA3apq.js → pencil-tI4tCLz0.js} +1 -1
  33. package/dist/renderer/assets/{play-VZKHv5dN.js → play-Coi2HA1w.js} +1 -1
  34. package/dist/renderer/assets/{plug-Cm7l0fVk.js → plug-D4TCyW9b.js} +1 -1
  35. package/dist/renderer/assets/{plus-DjGK7f-K.js → plus-p62AgpoB.js} +1 -1
  36. package/dist/renderer/assets/projects-CTDuVxeQ.js +1 -0
  37. package/dist/renderer/assets/{save-Doi-FwDR.js → save-fpMhkVV0.js} +1 -1
  38. package/dist/renderer/assets/{search-DHqpbK_c.js → search-BHKIStdA.js} +1 -1
  39. package/dist/renderer/assets/{server-Bmtxxlph.js → server-0oTWed8U.js} +1 -1
  40. package/dist/renderer/assets/{session-utils-Z-jLtVLY.js → session-utils-D0Qv0I0-.js} +1 -1
  41. package/dist/renderer/assets/{sessions-C5TSSo_R.js → sessions-C8ApKQgC.js} +1 -1
  42. package/dist/renderer/assets/{shield-check-DhZ05nhI.js → shield-check-BAJI9jzC.js} +1 -1
  43. package/dist/renderer/assets/{trash-2-DiyFflVR.js → trash-2-B-Ygm-x6.js} +1 -1
  44. package/dist/renderer/assets/{user-CgsIPd7T.js → user-Cv8rzw8l.js} +1 -1
  45. package/dist/renderer/assets/{wifi-off-CqWbWFzp.js → wifi-off-BImS3nkm.js} +1 -1
  46. package/dist/renderer/index.html +2 -2
  47. package/dist-electron/services/local-ai-core/src/kernel/rotating-logger.js +232 -0
  48. package/dist-electron/services/local-ai-core/src/runtime/local-core-controller.js +3 -0
  49. package/dist-electron/services/local-ai-core/src/runtime/local-core-runtime-state.js +40 -84
  50. package/dist-electron/services/local-ai-core/src/runtime/server-routes.js +3 -0
  51. package/dist-electron/services/local-ai-core/src/runtime/server.js +14 -0
  52. package/dist-electron/src/api/client.js +1 -1
  53. package/dist-electron/tests/electron/plugin-kernel.test.js +161 -44
  54. package/dist-electron/tests/integration/local-core-refactor.test.js +1 -0
  55. package/package.json +1 -1
  56. package/dist/renderer/assets/Logs-CHrUm25Y.js +0 -1
  57. package/dist/renderer/assets/projects-Dcki78KB.js +0 -1
@@ -14,7 +14,7 @@ class ApiClient {
14
14
  this.baseUrl = DEFAULT_API_BASE;
15
15
  return;
16
16
  }
17
- this.baseUrl = trimmed.endsWith('/api/v1')
17
+ this.baseUrl = trimmed.endsWith('/api/v1') || trimmed.endsWith('/api/local/v1')
18
18
  ? trimmed
19
19
  : `${trimmed.replace(/\/+$/, '')}/api/v1`;
20
20
  }
@@ -18,6 +18,60 @@ const plugin_registry_js_1 = require("../../services/local-ai-core/src/kernel/pl
18
18
  const local_core_controller_js_1 = require("../../services/local-ai-core/src/runtime/local-core-controller.js");
19
19
  const local_core_runtime_state_js_1 = require("../../services/local-ai-core/src/runtime/local-core-runtime-state.js");
20
20
  const server_js_1 = require("../../services/local-ai-core/src/runtime/server.js");
21
+ function withLogEnv(logDir, fn, options = {}) {
22
+ const previousLogDir = process.env.AGENTDOCK_LOG_DIR;
23
+ const previousMaxBytes = process.env.AGENTDOCK_LOG_MAX_BYTES;
24
+ const previousMaxFiles = process.env.AGENTDOCK_LOG_MAX_FILES;
25
+ process.env.AGENTDOCK_LOG_DIR = logDir;
26
+ if (options.maxBytes !== undefined) {
27
+ process.env.AGENTDOCK_LOG_MAX_BYTES = String(options.maxBytes);
28
+ }
29
+ else {
30
+ delete process.env.AGENTDOCK_LOG_MAX_BYTES;
31
+ }
32
+ if (options.maxFiles !== undefined) {
33
+ process.env.AGENTDOCK_LOG_MAX_FILES = String(options.maxFiles);
34
+ }
35
+ else {
36
+ delete process.env.AGENTDOCK_LOG_MAX_FILES;
37
+ }
38
+ const restore = () => {
39
+ if (previousLogDir === undefined) {
40
+ delete process.env.AGENTDOCK_LOG_DIR;
41
+ }
42
+ else {
43
+ process.env.AGENTDOCK_LOG_DIR = previousLogDir;
44
+ }
45
+ if (previousMaxBytes === undefined) {
46
+ delete process.env.AGENTDOCK_LOG_MAX_BYTES;
47
+ }
48
+ else {
49
+ process.env.AGENTDOCK_LOG_MAX_BYTES = previousMaxBytes;
50
+ }
51
+ if (previousMaxFiles === undefined) {
52
+ delete process.env.AGENTDOCK_LOG_MAX_FILES;
53
+ }
54
+ else {
55
+ process.env.AGENTDOCK_LOG_MAX_FILES = previousMaxFiles;
56
+ }
57
+ };
58
+ try {
59
+ const result = fn();
60
+ const maybePromise = result;
61
+ if (maybePromise && typeof maybePromise.finally === 'function') {
62
+ return maybePromise.finally(restore);
63
+ }
64
+ restore();
65
+ return result;
66
+ }
67
+ catch (error) {
68
+ restore();
69
+ throw error;
70
+ }
71
+ }
72
+ function parseLogLine(line) {
73
+ return JSON.parse(line);
74
+ }
21
75
  function plugin(id, dependsOn = []) {
22
76
  return {
23
77
  manifest: {
@@ -540,6 +594,7 @@ model = "deepseek-v4-flash"
540
594
  plugins: {},
541
595
  }),
542
596
  getLogs: () => [],
597
+ getLogEntries: () => [],
543
598
  readConfigFile: async () => ({
544
599
  path: '',
545
600
  exists: false,
@@ -588,20 +643,41 @@ model = "deepseek-v4-flash"
588
643
  await controller.close();
589
644
  strict_1.default.equal(stopped, true);
590
645
  });
591
- (0, node_test_1.default)('runtime logs are persisted to local-core.log', () => {
646
+ (0, node_test_1.default)('runtime logs are persisted to unified sys and level logs', () => {
592
647
  const userDataPath = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'agentdock-logs-'));
648
+ const logDir = (0, node_path_1.join)(userDataPath, 'logs');
593
649
  try {
594
- const runtime = (0, bootstrap_js_2.bootstrapLocalCoreRuntime)({
595
- userDataPath,
596
- enableKnowledge: false,
597
- log: () => { },
650
+ withLogEnv(logDir, () => {
651
+ const runtime = (0, bootstrap_js_2.bootstrapLocalCoreRuntime)({
652
+ userDataPath,
653
+ enableKnowledge: false,
654
+ log: () => { },
655
+ });
656
+ runtime.state.pushLog('localcore-weixin send failed for sessionKey=test');
657
+ runtime.state.pushLog('second line');
658
+ const sysRaw = (0, node_fs_1.readFileSync)((0, node_path_1.join)(logDir, 'sys.log'), 'utf-8');
659
+ const errorRaw = (0, node_fs_1.readFileSync)((0, node_path_1.join)(logDir, 'error.log'), 'utf-8');
660
+ const infoRaw = (0, node_fs_1.readFileSync)((0, node_path_1.join)(logDir, 'info.log'), 'utf-8');
661
+ const sysLines = sysRaw.trim().split(/\r?\n/).map(parseLogLine);
662
+ strict_1.default.equal(runtime.state.logPath, (0, node_path_1.join)(logDir, 'sys.log'));
663
+ for (const fileName of ['sys.log', 'debug.log', 'info.log', 'warn.log', 'error.log']) {
664
+ strict_1.default.equal((0, node_fs_1.existsSync)((0, node_path_1.join)(logDir, fileName)), true);
665
+ }
666
+ strict_1.default.equal(sysLines.at(-2)?.level, 'error');
667
+ strict_1.default.match(sysLines.at(-2)?.ts || '', /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3}$/);
668
+ strict_1.default.equal(sysLines.at(-2)?.message, 'localcore-weixin send failed for sessionKey=test');
669
+ strict_1.default.equal(sysLines.at(-1)?.level, 'info');
670
+ strict_1.default.equal(sysLines.at(-1)?.message, 'second line');
671
+ strict_1.default.match(errorRaw, /localcore-weixin send failed for sessionKey=test/);
672
+ strict_1.default.match(infoRaw, /second line/);
673
+ strict_1.default.deepEqual(runtime.state.getLogEntries('error', 10).map((entry) => entry.message), [
674
+ 'localcore-weixin send failed for sessionKey=test',
675
+ ]);
676
+ strict_1.default.deepEqual(runtime.state.getLogEntries('sys', 2).map((entry) => entry.message), [
677
+ 'localcore-weixin send failed for sessionKey=test',
678
+ 'second line',
679
+ ]);
598
680
  });
599
- runtime.state.pushLog('localcore-weixin send failed for sessionKey=test');
600
- runtime.state.pushLog('second line');
601
- const logPath = (0, node_path_1.join)(userDataPath, 'runtime', 'local-core.log');
602
- const raw = (0, node_fs_1.readFileSync)(logPath, 'utf-8');
603
- strict_1.default.match(raw, /^\d{4}-\d{2}-\d{2}T.* localcore-weixin send failed for sessionKey=test/m);
604
- strict_1.default.match(raw, /^\d{4}-\d{2}-\d{2}T.* second line/m);
605
681
  }
606
682
  finally {
607
683
  (0, node_fs_1.rmSync)(userDataPath, { recursive: true, force: true });
@@ -609,15 +685,18 @@ model = "deepseek-v4-flash"
609
685
  });
610
686
  (0, node_test_1.default)('runtime getLogs reads from disk after state is recreated', () => {
611
687
  const userDataPath = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'agentdock-disk-logs-'));
688
+ const logDir = (0, node_path_1.join)(userDataPath, 'logs');
612
689
  try {
613
- const state = (0, local_core_runtime_state_js_1.createLocalCoreRuntimeState)({ userDataPath });
614
- state.pushLog('first persisted line');
615
- state.pushLog('second persisted line');
616
- const recreated = (0, local_core_runtime_state_js_1.createLocalCoreRuntimeState)({ userDataPath });
617
- strict_1.default.deepEqual(recreated.getLogs(2).map((line) => line.replace(/^\S+\s+/, '')), [
618
- 'first persisted line',
619
- 'second persisted line',
620
- ]);
690
+ withLogEnv(logDir, () => {
691
+ const state = (0, local_core_runtime_state_js_1.createLocalCoreRuntimeState)({ userDataPath });
692
+ state.pushLog('first persisted line');
693
+ state.pushLog('second persisted line');
694
+ const recreated = (0, local_core_runtime_state_js_1.createLocalCoreRuntimeState)({ userDataPath });
695
+ strict_1.default.deepEqual(recreated.getLogs(2).map((line) => parseLogLine(line).message), [
696
+ 'first persisted line',
697
+ 'second persisted line',
698
+ ]);
699
+ });
621
700
  }
622
701
  finally {
623
702
  (0, node_fs_1.rmSync)(userDataPath, { recursive: true, force: true });
@@ -625,11 +704,19 @@ model = "deepseek-v4-flash"
625
704
  });
626
705
  (0, node_test_1.default)('runtime getLogs fills from rotated log when current log has fewer lines', () => {
627
706
  const userDataPath = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'agentdock-rotated-logs-'));
707
+ const logDir = (0, node_path_1.join)(userDataPath, 'logs');
628
708
  try {
629
- const state = (0, local_core_runtime_state_js_1.createLocalCoreRuntimeState)({ userDataPath });
630
- (0, node_fs_1.writeFileSync)(`${state.logPath}.1`, 'old-1\nold-2\nold-3\n', 'utf8');
631
- (0, node_fs_1.writeFileSync)(state.logPath, 'new-1\n', 'utf8');
632
- strict_1.default.deepEqual(state.getLogs(3), ['old-2', 'old-3', 'new-1']);
709
+ withLogEnv(logDir, () => {
710
+ const state = (0, local_core_runtime_state_js_1.createLocalCoreRuntimeState)({ userDataPath });
711
+ (0, node_fs_1.writeFileSync)(`${state.logPath}.1`, [
712
+ JSON.stringify({ ts: '2026-01-01 00:00:00.000', level: 'info', scope: 'test', message: 'old-1' }),
713
+ JSON.stringify({ ts: '2026-01-01 00:00:01.000', level: 'info', scope: 'test', message: 'old-2' }),
714
+ JSON.stringify({ ts: '2026-01-01 00:00:02.000', level: 'info', scope: 'test', message: 'old-3' }),
715
+ '',
716
+ ].join('\n'), 'utf8');
717
+ (0, node_fs_1.writeFileSync)(state.logPath, `${JSON.stringify({ ts: '2026-01-01 00:00:03.000', level: 'info', scope: 'test', message: 'new-1' })}\n`, 'utf8');
718
+ strict_1.default.deepEqual(state.getLogs(3).map((line) => parseLogLine(line).message), ['old-2', 'old-3', 'new-1']);
719
+ });
633
720
  }
634
721
  finally {
635
722
  (0, node_fs_1.rmSync)(userDataPath, { recursive: true, force: true });
@@ -637,30 +724,58 @@ model = "deepseek-v4-flash"
637
724
  });
638
725
  (0, node_test_1.default)('runtime getLogs returns only the requested tail lines from disk', () => {
639
726
  const userDataPath = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'agentdock-tail-logs-'));
727
+ const logDir = (0, node_path_1.join)(userDataPath, 'logs');
640
728
  try {
641
- const state = (0, local_core_runtime_state_js_1.createLocalCoreRuntimeState)({ userDataPath });
642
- (0, node_fs_1.writeFileSync)(state.logPath, Array.from({ length: 1000 }, (_, index) => `line-${index + 1}`).join('\n') + '\n', 'utf8');
643
- strict_1.default.deepEqual(state.getLogs(4), ['line-997', 'line-998', 'line-999', 'line-1000']);
729
+ withLogEnv(logDir, () => {
730
+ const state = (0, local_core_runtime_state_js_1.createLocalCoreRuntimeState)({ userDataPath });
731
+ (0, node_fs_1.writeFileSync)(state.logPath, Array.from({ length: 1000 }, (_, index) => JSON.stringify({ ts: '2026-01-01 00:00:00.000', level: 'info', scope: 'test', message: `line-${index + 1}` })).join('\n') + '\n', 'utf8');
732
+ strict_1.default.deepEqual(state.getLogs(4).map((line) => parseLogLine(line).message), ['line-997', 'line-998', 'line-999', 'line-1000']);
733
+ });
644
734
  }
645
735
  finally {
646
736
  (0, node_fs_1.rmSync)(userDataPath, { recursive: true, force: true });
647
737
  }
648
738
  });
649
- (0, node_test_1.default)('controller logs are persisted to local-core.log', () => {
739
+ (0, node_test_1.default)('runtime logs rotate by file size', () => {
740
+ const userDataPath = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'agentdock-size-rotated-logs-'));
741
+ const logDir = (0, node_path_1.join)(userDataPath, 'logs');
742
+ try {
743
+ withLogEnv(logDir, () => {
744
+ const state = (0, local_core_runtime_state_js_1.createLocalCoreRuntimeState)({ userDataPath });
745
+ state.pushLog('first failed line with enough text to rotate');
746
+ state.pushLog('second failed line with enough text to rotate');
747
+ state.pushLog('third failed line with enough text to rotate');
748
+ const currentSys = (0, node_fs_1.readFileSync)((0, node_path_1.join)(logDir, 'sys.log'), 'utf8');
749
+ const rotatedSys = (0, node_fs_1.readFileSync)((0, node_path_1.join)(logDir, 'sys.log.1'), 'utf8');
750
+ const currentError = (0, node_fs_1.readFileSync)((0, node_path_1.join)(logDir, 'error.log'), 'utf8');
751
+ const rotatedError = (0, node_fs_1.readFileSync)((0, node_path_1.join)(logDir, 'error.log.1'), 'utf8');
752
+ strict_1.default.match(currentSys, /third failed line/);
753
+ strict_1.default.match(rotatedSys, /second failed line/);
754
+ strict_1.default.match(currentError, /third failed line/);
755
+ strict_1.default.match(rotatedError, /second failed line/);
756
+ }, { maxBytes: 120, maxFiles: 2 });
757
+ }
758
+ finally {
759
+ (0, node_fs_1.rmSync)(userDataPath, { recursive: true, force: true });
760
+ }
761
+ });
762
+ (0, node_test_1.default)('controller logs are persisted to sys.log', () => {
650
763
  const userDataPath = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'agentdock-controller-logs-'));
764
+ const logDir = (0, node_path_1.join)(userDataPath, 'logs');
651
765
  try {
652
- const runtime = (0, bootstrap_js_2.bootstrapLocalCoreRuntime)({
653
- userDataPath,
654
- enableKnowledge: false,
766
+ withLogEnv(logDir, () => {
767
+ const runtime = (0, bootstrap_js_2.bootstrapLocalCoreRuntime)({
768
+ userDataPath,
769
+ enableKnowledge: false,
770
+ });
771
+ const controller = new local_core_controller_js_1.LocalCoreController(userDataPath, runtime);
772
+ const emittedLogs = [];
773
+ controller.on('logs', (line) => emittedLogs.push(line));
774
+ controller.handleLog('localcore-lark inbound message for project-1');
775
+ const raw = (0, node_fs_1.readFileSync)((0, node_path_1.join)(logDir, 'sys.log'), 'utf-8');
776
+ strict_1.default.deepEqual(emittedLogs, ['localcore-lark inbound message for project-1']);
777
+ strict_1.default.equal(parseLogLine(raw.trim().split(/\r?\n/).at(-1) || '').message, 'localcore-lark inbound message for project-1');
655
778
  });
656
- const controller = new local_core_controller_js_1.LocalCoreController(userDataPath, runtime);
657
- const emittedLogs = [];
658
- controller.on('logs', (line) => emittedLogs.push(line));
659
- controller.handleLog('localcore-lark inbound message for project-1');
660
- const logPath = (0, node_path_1.join)(userDataPath, 'runtime', 'local-core.log');
661
- const raw = (0, node_fs_1.readFileSync)(logPath, 'utf-8');
662
- strict_1.default.deepEqual(emittedLogs, ['localcore-lark inbound message for project-1']);
663
- strict_1.default.match(raw, /^\d{4}-\d{2}-\d{2}T.* localcore-lark inbound message for project-1/m);
664
779
  }
665
780
  finally {
666
781
  (0, node_fs_1.rmSync)(userDataPath, { recursive: true, force: true });
@@ -668,13 +783,15 @@ model = "deepseek-v4-flash"
668
783
  });
669
784
  (0, node_test_1.default)('controller buffers bootstrap logs until runtime state is assigned', () => {
670
785
  const userDataPath = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'agentdock-bootstrap-logs-'));
786
+ const logDir = (0, node_path_1.join)(userDataPath, 'logs');
671
787
  try {
672
- const controller = new local_core_controller_js_1.LocalCoreController(userDataPath);
673
- const logPath = (0, node_path_1.join)(userDataPath, 'runtime', 'local-core.log');
674
- const raw = (0, node_fs_1.readFileSync)(logPath, 'utf-8');
675
- strict_1.default.match(raw, /\[plugin:builtin\.agent-codex\] registered/);
676
- strict_1.default.equal((raw.match(/\[plugin:builtin\.agent-codex\] registered/g) || []).length, 1);
677
- void controller.close();
788
+ withLogEnv(logDir, () => {
789
+ const controller = new local_core_controller_js_1.LocalCoreController(userDataPath);
790
+ const raw = (0, node_fs_1.readFileSync)((0, node_path_1.join)(logDir, 'sys.log'), 'utf-8');
791
+ strict_1.default.match(raw, /\[plugin:builtin\.agent-codex\] registered/);
792
+ strict_1.default.equal((raw.match(/\[plugin:builtin\.agent-codex\] registered/g) || []).length, 1);
793
+ void controller.close();
794
+ });
678
795
  }
679
796
  finally {
680
797
  (0, node_fs_1.rmSync)(userDataPath, { recursive: true, force: true });
@@ -25,6 +25,7 @@ const local_core_acp_permission_lifecycle_js_1 = require("../../services/local-a
25
25
  const workspace_acp_permissions_js_1 = require("../../services/local-ai-core/src/acp/workspace-acp-permissions.js");
26
26
  const server_routes_js_1 = require("../../services/local-ai-core/src/runtime/server-routes.js");
27
27
  (0, node_test_1.default)('local core route parser separates runtime refresh and runtime detail routes', () => {
28
+ strict_1.default.deepEqual((0, server_routes_js_1.parseLocalAiCoreRoute)('GET', '/api/local/v1/logs'), { name: 'logs.list' });
28
29
  strict_1.default.deepEqual((0, server_routes_js_1.parseLocalAiCoreRoute)('GET', '/api/local/v1/runtimes'), { name: 'runtimes.list' });
29
30
  strict_1.default.deepEqual((0, server_routes_js_1.parseLocalAiCoreRoute)('POST', '/api/local/v1/runtimes/refresh'), { name: 'runtimes.refresh' });
30
31
  strict_1.default.deepEqual((0, server_routes_js_1.parseLocalAiCoreRoute)('GET', '/api/local/v1/runtimes/codex'), {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kafca/agentdock",
3
- "version": "0.1.34",
3
+ "version": "0.1.35",
4
4
  "license": "PolyForm-Noncommercial-1.0.0",
5
5
  "type": "module",
6
6
  "main": "dist-electron/electron/main.js",
@@ -1 +0,0 @@
1
- import{u as h,r as t,az as v,j as e,L as j,B as d,C as y}from"./index-BY88QEsS.js";import{B as N}from"./Badge-BDxYXRKv.js";import{S as m}from"./Select-CrqwGrrm.js";import{P as b}from"./Page-BlKjqLN4.js";import{A as w}from"./arrow-left-SVmCyBR4.js";import{F as L}from"./funnel-cDV0Q_Mr.js";import"./index-Cr6erCLm.js";import"./chevron-down-C7YSxzHw.js";import"./check-C76I9BFh.js";const C={debug:"text-gray-400",info:"text-blue-400",warn:"text-amber-400",error:"text-red-400"},S={debug:"default",info:"info",warn:"warning",error:"danger"};function I(){const{t:a}=h(),[i,x]=t.useState([]),[r,u]=t.useState("info"),[n,f]=t.useState("100"),[g,l]=t.useState(!0),o=t.useCallback(async()=>{l(!0);try{const s=await v({level:r,limit:n});x(s.entries||[])}finally{l(!1)}},[r,n]);return t.useEffect(()=>{o()},[o]),e.jsxs("div",{className:"space-y-4 animate-fade-in",children:[e.jsx(b,{title:a("system.logs"),description:"Filtered runtime logs for troubleshooting.",actions:e.jsx(j,{to:"/system",children:e.jsxs(d,{variant:"secondary",size:"sm",children:[e.jsx(w,{size:14})," ",a("nav.system")]})})}),e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(L,{size:14,className:"text-muted-foreground"}),e.jsxs(m,{value:r,onChange:s=>u(s.target.value),className:"w-auto",children:[e.jsx("option",{value:"debug",children:"Debug"}),e.jsx("option",{value:"info",children:"Info"}),e.jsx("option",{value:"warn",children:"Warn"}),e.jsx("option",{value:"error",children:"Error"})]})]}),e.jsxs(m,{value:n,onChange:s=>f(s.target.value),className:"w-auto",children:[e.jsx("option",{value:"50",children:"50"}),e.jsx("option",{value:"100",children:"100"}),e.jsx("option",{value:"500",children:"500"}),e.jsx("option",{value:"1000",children:"1000"})]}),e.jsx(d,{size:"sm",variant:"secondary",onClick:o,children:a("common.refresh")})]}),e.jsx(y,{children:g?e.jsx("div",{className:"text-muted-foreground animate-pulse text-sm",children:"Loading..."}):i.length===0?e.jsx("p",{className:"text-sm text-muted-foreground text-center py-8",children:a("common.noData")}):e.jsx("div",{className:"space-y-1 max-h-[65vh] overflow-y-auto font-mono text-xs",children:i.map((s,p)=>{var c;return e.jsxs("div",{className:"flex items-start gap-3 py-1.5 border-b last:border-0",children:[e.jsx("span",{className:"text-muted-foreground shrink-0 w-36",children:(c=s.time)==null?void 0:c.slice(0,19)}),e.jsx(N,{variant:S[s.level]||"default",children:s.level}),e.jsx("span",{className:`${C[s.level]||"text-gray-500"} flex-1`,children:s.message})]},p)})})})]})}export{I as default};
@@ -1 +0,0 @@
1
- import{z as t}from"./index-BY88QEsS.js";const e=()=>t.get("/projects"),r=o=>t.get(`/projects/${o}`);export{r as g,e as l};