kiku-agent 1.0.4 → 1.0.6
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 +25 -2
- package/package.json +12 -3
- package/server/agent/agentCore.js +164 -55
- package/server/agent/cli.js +1300 -695
- package/server/agent/commandRegistry.js +436 -74
- package/server/agent/commands.js +629 -63
- package/server/agent/doctor.js +7 -6
- package/server/agent/mcpClient.js +436 -364
- package/server/agent/queryDetails.js +182 -0
- package/server/agent/sanitizer.js +4 -4
- package/server/agent/subagent.js +1 -0
- package/server/agent/suggestions.js +346 -0
- package/server/agent/theme.js +12 -12
- package/server/agent/tools.js +118 -7
- package/server/agent/ui.js +433 -31
- package/server/agent/updateManager.js +438 -0
- package/server/agent/version.js +10 -0
- package/server/mcp/data/brands.js +9 -4
- package/server/mcp/server.js +2 -1
- package/src/data/brandsData.js +65 -0
package/server/agent/doctor.js
CHANGED
|
@@ -26,10 +26,10 @@ function commandAvailable(command, args = ['--version']) {
|
|
|
26
26
|
});
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
async function checkDataDirectory() {
|
|
30
|
-
const probe = path.join(
|
|
29
|
+
async function checkDataDirectory(dataDir = KIKU_DATA_DIR) {
|
|
30
|
+
const probe = path.join(dataDir, `.write-test-${process.pid}`);
|
|
31
31
|
try {
|
|
32
|
-
await fs.mkdir(
|
|
32
|
+
await fs.mkdir(dataDir, { recursive: true, mode: 0o700 });
|
|
33
33
|
await fs.writeFile(probe, 'ok', { mode: 0o600 });
|
|
34
34
|
await fs.unlink(probe);
|
|
35
35
|
return true;
|
|
@@ -42,8 +42,9 @@ import { getGpuMetrics } from './gpuMetrics.js';
|
|
|
42
42
|
|
|
43
43
|
export async function runDoctor(options = {}) {
|
|
44
44
|
const client = options.client;
|
|
45
|
+
const dataDir = options.dataDir || KIKU_DATA_DIR;
|
|
45
46
|
const [dataWritable, speaker, ffmpegStatic, fluentFfmpeg, ytDlp, lm, gpu] = await Promise.all([
|
|
46
|
-
checkDataDirectory(),
|
|
47
|
+
checkDataDirectory(dataDir),
|
|
47
48
|
optionalImport('speaker'),
|
|
48
49
|
optionalImport('ffmpeg-static'),
|
|
49
50
|
optionalImport('fluent-ffmpeg'),
|
|
@@ -54,7 +55,7 @@ export async function runDoctor(options = {}) {
|
|
|
54
55
|
const nodeMajor = Number(process.versions.node.split('.')[0]);
|
|
55
56
|
const checks = [
|
|
56
57
|
{ id: 'node', required: true, ok: nodeMajor >= 20, detail: `Node ${process.versions.node} (requires >=20)` },
|
|
57
|
-
{ id: 'data', required: true, ok: dataWritable, detail:
|
|
58
|
+
{ id: 'data', required: true, ok: dataWritable, detail: dataDir },
|
|
58
59
|
{ id: 'gpu', required: false, ok: Boolean(gpu.available), detail: gpu.available && gpu.primary ? `${gpu.primary.name} (${gpu.primary.totalGb} GB VRAM${gpu.primary.driverVersion !== 'N/A' ? `, Driver ${gpu.primary.driverVersion}` : ''})` : 'CPU fallback / no dedicated acceleration detected' },
|
|
59
60
|
{ id: 'lmstudio', required: false, ok: Boolean(lm.connected), detail: lm.connected ? `${lm.models?.length || 0} loaded model(s)` : 'offline; catalog-only mode is available' },
|
|
60
61
|
{ id: 'ffmpeg', required: false, ok: ffmpegStatic && fluentFfmpeg, detail: 'audio add-on only; intentionally not installed with the core CLI' },
|
|
@@ -64,6 +65,6 @@ export async function runDoctor(options = {}) {
|
|
|
64
65
|
return {
|
|
65
66
|
ok: checks.every(check => !check.required || check.ok),
|
|
66
67
|
checks,
|
|
67
|
-
dataDir
|
|
68
|
+
dataDir,
|
|
68
69
|
};
|
|
69
70
|
}
|