@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.
- package/README.md +67 -0
- package/dist/renderer/assets/{Badge-BDxYXRKv.js → Badge-BM4WCcua.js} +1 -1
- package/dist/renderer/assets/{Chat-B-ZXd4Ld.js → Chat-DoyBHOsx.js} +1 -1
- package/dist/renderer/assets/{ChatMarkdown-Dn4XvCke.js → ChatMarkdown-BWj04kgW.js} +1 -1
- package/dist/renderer/assets/{Config-DMOYyKOD.js → Config-A95OuazQ.js} +1 -1
- package/dist/renderer/assets/{CronList-CMBhMs1J.js → CronList-DsPU4zGT.js} +1 -1
- package/dist/renderer/assets/{Dashboard-DApD4wOA.js → Dashboard-D8Vpj97x.js} +2 -2
- package/dist/renderer/assets/{EmptyState-CqcPky2i.js → EmptyState-x1uVoSxZ.js} +1 -1
- package/dist/renderer/assets/{KnowledgeDetail-DMOXK9Nz.js → KnowledgeDetail-C9TbcyNJ.js} +1 -1
- package/dist/renderer/assets/{KnowledgeHome-Dv4Ttb6N.js → KnowledgeHome-Cg9Fb41Q.js} +1 -1
- package/dist/renderer/assets/Logs-oWaKA60u.js +1 -0
- package/dist/renderer/assets/{Modal-Cj_0qtXr.js → Modal-24hTXXHK.js} +1 -1
- package/dist/renderer/assets/{Page-BlKjqLN4.js → Page-YRtQonKZ.js} +1 -1
- package/dist/renderer/assets/{ProjectDetail-aMl1VGTt.js → ProjectDetail-DScsxJO-.js} +1 -1
- package/dist/renderer/assets/{ProjectList-R2YvsII0.js → ProjectList-8L5GD7PN.js} +1 -1
- package/dist/renderer/assets/{Select-CrqwGrrm.js → Select-BI8Uw_DF.js} +1 -1
- package/dist/renderer/assets/{SessionChat-CGtpyGKR.js → SessionChat-BIoCWdDD.js} +1 -1
- package/dist/renderer/assets/{SessionList-D8gRUc8M.js → SessionList-BsEJeDxI.js} +1 -1
- package/dist/renderer/assets/{ThreadChat-BCGm6bQP.js → ThreadChat-DJi0UBta.js} +1 -1
- package/dist/renderer/assets/{Workspace-DnePK6tn.js → Workspace-tlJxrgC5.js} +1 -1
- package/dist/renderer/assets/{arrow-left-SVmCyBR4.js → arrow-left-pzaBhi9y.js} +1 -1
- package/dist/renderer/assets/{book-open-CZi1avEJ.js → book-open-CNhlVyqh.js} +1 -1
- package/dist/renderer/assets/{check-C76I9BFh.js → check-Cg2LLCdl.js} +1 -1
- package/dist/renderer/assets/{chevron-down-C7YSxzHw.js → chevron-down-Dgqg07wf.js} +1 -1
- package/dist/renderer/assets/{circle-_s8tmsAJ.js → circle-BBd_jIS2.js} +1 -1
- package/dist/renderer/assets/{desktop-66ot_8sB.js → desktop-C0S-Yv8G.js} +1 -1
- package/dist/renderer/assets/{funnel-cDV0Q_Mr.js → funnel-DwSh-SrX.js} +1 -1
- package/dist/renderer/assets/{heart-qMUQm0tf.js → heart-CWVc-KhZ.js} +1 -1
- package/dist/renderer/assets/{index-DFiJR0vv.css → index-CaQZSRbg.css} +1 -1
- package/dist/renderer/assets/{index-BY88QEsS.js → index-DZbeAYVk.js} +2 -2
- package/dist/renderer/assets/{index-Cr6erCLm.js → index-HYmDNQ9k.js} +1 -1
- package/dist/renderer/assets/{pencil-C3MA3apq.js → pencil-tI4tCLz0.js} +1 -1
- package/dist/renderer/assets/{play-VZKHv5dN.js → play-Coi2HA1w.js} +1 -1
- package/dist/renderer/assets/{plug-Cm7l0fVk.js → plug-D4TCyW9b.js} +1 -1
- package/dist/renderer/assets/{plus-DjGK7f-K.js → plus-p62AgpoB.js} +1 -1
- package/dist/renderer/assets/projects-CTDuVxeQ.js +1 -0
- package/dist/renderer/assets/{save-Doi-FwDR.js → save-fpMhkVV0.js} +1 -1
- package/dist/renderer/assets/{search-DHqpbK_c.js → search-BHKIStdA.js} +1 -1
- package/dist/renderer/assets/{server-Bmtxxlph.js → server-0oTWed8U.js} +1 -1
- package/dist/renderer/assets/{session-utils-Z-jLtVLY.js → session-utils-D0Qv0I0-.js} +1 -1
- package/dist/renderer/assets/{sessions-C5TSSo_R.js → sessions-C8ApKQgC.js} +1 -1
- package/dist/renderer/assets/{shield-check-DhZ05nhI.js → shield-check-BAJI9jzC.js} +1 -1
- package/dist/renderer/assets/{trash-2-DiyFflVR.js → trash-2-B-Ygm-x6.js} +1 -1
- package/dist/renderer/assets/{user-CgsIPd7T.js → user-Cv8rzw8l.js} +1 -1
- package/dist/renderer/assets/{wifi-off-CqWbWFzp.js → wifi-off-BImS3nkm.js} +1 -1
- package/dist/renderer/index.html +2 -2
- package/dist-electron/services/local-ai-core/src/kernel/rotating-logger.js +232 -0
- package/dist-electron/services/local-ai-core/src/runtime/local-core-controller.js +3 -0
- package/dist-electron/services/local-ai-core/src/runtime/local-core-runtime-state.js +40 -84
- package/dist-electron/services/local-ai-core/src/runtime/server-routes.js +3 -0
- package/dist-electron/services/local-ai-core/src/runtime/server.js +14 -0
- package/dist-electron/src/api/client.js +1 -1
- package/dist-electron/tests/electron/plugin-kernel.test.js +161 -44
- package/dist-electron/tests/integration/local-core-refactor.test.js +1 -0
- package/package.json +1 -1
- package/dist/renderer/assets/Logs-CHrUm25Y.js +0 -1
- 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
|
|
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
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
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
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
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
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
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
|
-
|
|
642
|
-
|
|
643
|
-
|
|
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)('
|
|
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
|
-
|
|
653
|
-
|
|
654
|
-
|
|
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
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
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 +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};
|