kiku-agent 1.3.2 → 1.3.4
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 +69 -12
- package/package.json +2 -1
- package/server/agent/agentCore.js +319 -46
- package/server/agent/appPaths.js +31 -0
- package/server/agent/audioPlayer.js +339 -12
- package/server/agent/autoContext.js +193 -0
- package/server/agent/catalogEntityResolver.js +170 -28
- package/server/agent/clarifyingQuestions.js +137 -35
- package/server/agent/cli.js +177 -48
- package/server/agent/cloudAdapters.js +116 -0
- package/server/agent/commandRegistry.js +409 -80
- package/server/agent/commands.js +1056 -125
- package/server/agent/config.js +1088 -690
- package/server/agent/contextCompactor.js +213 -21
- package/server/agent/cpuMetrics.js +199 -0
- package/server/agent/engineService.js +591 -0
- package/server/agent/eval/modules/evaluation/runner.js +4 -14
- package/server/agent/eval/modules/evaluation/scoring.js +15 -3
- package/server/agent/eval/modules/server/evalApi.js +5 -5
- package/server/agent/eval/modules/ui/evalUi.js +7 -4
- package/server/agent/eventBus.js +1 -0
- package/server/agent/ink/main.jsx +196 -191
- package/server/agent/jobManager.js +11 -1
- package/server/agent/lanDiscovery.js +721 -23
- package/server/agent/llmClient.js +317 -71
- package/server/agent/lmStudioWakeup.js +517 -65
- package/server/agent/locationService.js +797 -0
- package/server/agent/mcpQuizData.js +509 -0
- package/server/agent/memory/contextAllocator.js +19 -7
- package/server/agent/memory.js +3 -1
- package/server/agent/modelCompatibility.js +352 -0
- package/server/agent/modelDefaults.js +1 -0
- package/server/agent/modelManager.js +46 -2
- package/server/agent/newsWatch.js +9 -3
- package/server/agent/processManager.js +229 -0
- package/server/agent/prompts.js +174 -8
- package/server/agent/routingInterceptor.js +9 -1
- package/server/agent/sanitizer.js +41 -6
- package/server/agent/searchQueryPlanner.js +202 -0
- package/server/agent/session.js +59 -4
- package/server/agent/tests/agentFollowUps.test.js +128 -2
- package/server/agent/tests/agentMusicControl.test.js +245 -0
- package/server/agent/tests/apiRouter.test.js +1 -1
- package/server/agent/tests/autoContext.test.js +176 -0
- package/server/agent/tests/bilibiliEmbed.test.js +45 -0
- package/server/agent/tests/chatHardening.test.js +121 -0
- package/server/agent/tests/chineseWebSearchEscalation.test.js +62 -0
- package/server/agent/tests/clarifyingQuestions.test.js +33 -0
- package/server/agent/tests/cliAutomation.test.js +38 -1
- package/server/agent/tests/cloudProviders.test.js +91 -3
- package/server/agent/tests/commands.test.js +92 -3
- package/server/agent/tests/contextIntelligence.test.js +50 -3
- package/server/agent/tests/cpuMetrics.test.js +101 -0
- package/server/agent/tests/decisionAndSearchEnhancements.test.js +32 -0
- package/server/agent/tests/edgeCasesScenarios.test.js +82 -0
- package/server/agent/tests/engineService.test.js +436 -0
- package/server/agent/tests/engineUnload.test.js +94 -0
- package/server/agent/tests/envCommand.test.js +69 -0
- package/server/agent/tests/evalMetrics.test.js +8 -0
- package/server/agent/tests/fetchApi.test.js +99 -0
- package/server/agent/tests/hybridWebSearch.test.js +2 -0
- package/server/agent/tests/lanDiscovery.test.js +5 -0
- package/server/agent/tests/lanInterfaces.test.js +510 -0
- package/server/agent/tests/lmStudioWakeup.test.js +278 -0
- package/server/agent/tests/locationTool.test.js +278 -0
- package/server/agent/tests/memoryRoute.test.js +173 -0
- package/server/agent/tests/memoryUiNormalization.test.js +75 -0
- package/server/agent/tests/modelCompatibility.test.js +148 -0
- package/server/agent/tests/modelManager.test.js +32 -0
- package/server/agent/tests/musicControlUiBridge.test.js +113 -0
- package/server/agent/tests/nextGenArchitecture.test.js +4 -2
- package/server/agent/tests/openDomainPrompt.test.js +197 -0
- package/server/agent/tests/openDomainSearch.test.js +121 -0
- package/server/agent/tests/processManager.test.js +144 -0
- package/server/agent/tests/providerPersistence.test.js +10 -5
- package/server/agent/tests/quickActionsAndModals.test.js +180 -0
- package/server/agent/tests/searchQueryPlanner.test.js +108 -0
- package/server/agent/tests/securityAuditRemediation.test.js +16 -9
- package/server/agent/tests/securityAuditRemediations2.test.js +154 -0
- package/server/agent/tests/securityHardening.test.js +4 -4
- package/server/agent/tests/sessionAndCopy.test.js +39 -4
- package/server/agent/tests/sidebarControls.test.js +34 -0
- package/server/agent/tests/statefulMemory.test.js +8 -1
- package/server/agent/tests/textProtocolLoop.test.js +71 -0
- package/server/agent/tests/textToolParsing.test.js +48 -0
- package/server/agent/tests/toolRoutingRegressions.test.js +41 -0
- package/server/agent/tests/unifiedEndpoints.test.js +13 -6
- package/server/agent/tests/v110Features.test.js +1 -1
- package/server/agent/tests/vramEstimator.test.js +75 -0
- package/server/agent/tests/webChatDocs.test.js +199 -0
- package/server/agent/tests/webChatInferenceControl.test.js +298 -0
- package/server/agent/tests/webChatInspection.test.js +256 -5
- package/server/agent/tests/webChatMcp.test.js +94 -0
- package/server/agent/tests/webExtract.test.js +23 -0
- package/server/agent/tests/webSources.test.js +46 -12
- package/server/agent/textToolProtocol.js +173 -46
- package/server/agent/toolRouter.js +318 -44
- package/server/agent/tools.js +877 -96
- package/server/agent/ui.js +39 -34
- package/server/agent/vramService.js +35 -54
- package/server/agent/webSearch.js +441 -162
- package/server/agent/websearch/orchestrator.js +15 -5
- package/server/agent/websearch/resilience/cache.js +9 -2
- package/server/agent/websearch/security/ssrf.js +41 -10
- package/server/agent/youtubeAuth.js +5 -20
- package/server/apiRouter.js +5558 -4422
- package/server/mcp/data/discography.js +2 -2
- package/server/mcp/examples/antigravity.example.json +17 -0
- package/server/mcp/handler.js +8 -4
- package/server/mcp/security.js +220 -21
- package/server/mcp/server.js +2 -1
- package/server/mcp/tests/connection.test.js +14 -8
- package/server/mcp/tests/mcpKeyAuth.test.js +156 -0
- package/server/mcp/tools.js +7 -1
- package/server/supabase_migration_prefix.sql +102 -0
- package/server/supabase_schema.sql +18 -18
- package/server/web-chat/core/connection.js +179 -218
- package/server/web-chat/core/conversationContext.js +9 -2
- package/server/web-chat/core/directCatalogEngine.js +52 -28
- package/server/web-chat/core/dramaKnowledge.js +33 -22
- package/server/web-chat/core/followUpEngine.js +735 -81
- package/server/web-chat/core/futureEventGuard.js +5 -1
- package/server/web-chat/core/musicControlAction.js +70 -0
- package/server/web-chat/core/security.js +32 -21
- package/server/web-chat/core/toolInspector.js +6 -6
- package/server/web-chat/core/urlGuard.js +45 -0
- package/server/web-chat/router.js +204 -157
- package/server/web-chat/routes/chatRoute.js +885 -488
- package/server/web-chat/routes/engineRoute.js +270 -0
- package/server/web-chat/routes/exportRoute.js +1 -1
- package/server/web-chat/routes/lanDiscoveryRoute.js +17 -2
- package/server/web-chat/routes/lmStudioLoadRoute.js +172 -0
- package/server/web-chat/routes/mcpRoute.js +386 -0
- package/server/web-chat/routes/memoryRoute.js +253 -0
- package/server/web-chat/routes/providerRoute.js +49 -16
- package/server/web-chat/routes/staticRoute.js +306 -17
- package/server/web-chat/routes/statusRoute.js +194 -73
- package/server/web-chat/routes/suggestRoute.js +11 -3
- package/server/web-chat/routes/verifyRoute.js +26 -4
- package/server/web-chat/server.js +7 -6
- package/server/web-chat/ui/docsBuilder.js +3558 -0
- package/server/web-chat/ui/htmlBuilder.js +12 -0
- package/server/web-chat/ui/scripts/client.js +3401 -1302
- package/server/web-chat/ui/scripts/webchatI18n.js +155 -153
- package/server/web-chat/ui/settingsBuilder.js +7870 -0
- package/server/web-chat/ui/styles/lan-card.css +165 -0
- package/server/web-chat/ui/styles/main.css +4289 -447
- package/server/web-chat/ui/sw.js +64 -0
- package/server/web-chat/ui/templates/body.html +407 -281
- package/src/data/awardsData.js +146 -146
- package/src/data/musicVideoData.js +6 -4
- package/src/lib/vram/estimator.js +195 -19
|
@@ -109,7 +109,7 @@ export class MetaSearchOrchestrator {
|
|
|
109
109
|
const isNews = options.isNews === true;
|
|
110
110
|
|
|
111
111
|
|
|
112
|
-
const cacheKey = computeSearchCacheKey('meta', query, limit);
|
|
112
|
+
const cacheKey = computeSearchCacheKey('meta', query, limit, options);
|
|
113
113
|
const cached = this.cache.get(cacheKey);
|
|
114
114
|
if (cached && !options.noCache) {
|
|
115
115
|
return { ...cached, fromCache: true };
|
|
@@ -144,8 +144,18 @@ export class MetaSearchOrchestrator {
|
|
|
144
144
|
fallbackTriggered = engineChain.length > 1 && firstEngineResults.length < Math.ceil(limit / 2);
|
|
145
145
|
successfulEngine = engineChain.find((engine, index) => engineLists[index].length > 0) || null;
|
|
146
146
|
|
|
147
|
+
const uniqueHosts = new Set();
|
|
148
|
+
for (const list of collectedLists) {
|
|
149
|
+
for (const item of list) {
|
|
150
|
+
try {
|
|
151
|
+
const host = new URL(item.link || item.url).hostname;
|
|
152
|
+
if (host) uniqueHosts.add(host);
|
|
153
|
+
} catch {}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
147
156
|
let fusedInputCount = collectedLists.reduce((sum, list) => sum + list.length, 0);
|
|
148
|
-
|
|
157
|
+
const isThin = fusedInputCount < Math.max(5, limit) || uniqueHosts.size < 3;
|
|
158
|
+
if (isThin && options.fanOut !== false) {
|
|
149
159
|
const expansions = this.expandQuery(query).slice(1);
|
|
150
160
|
const fanSettled = await Promise.allSettled(
|
|
151
161
|
expansions.map(expQuery => this._searchSingleEngine('duckduckgo', expQuery, options))
|
|
@@ -159,10 +169,8 @@ export class MetaSearchOrchestrator {
|
|
|
159
169
|
}
|
|
160
170
|
}
|
|
161
171
|
|
|
162
|
-
|
|
163
172
|
const fused = fuseSearchResults(collectedLists, { limit, k: options.k || 60 });
|
|
164
173
|
|
|
165
|
-
|
|
166
174
|
const filtered = fused.filter(item => {
|
|
167
175
|
try {
|
|
168
176
|
const host = new URL(item.link).hostname;
|
|
@@ -191,7 +199,9 @@ export class MetaSearchOrchestrator {
|
|
|
191
199
|
results: filtered
|
|
192
200
|
};
|
|
193
201
|
|
|
194
|
-
|
|
202
|
+
if (!zeroResult) {
|
|
203
|
+
this.cache.set(cacheKey, response, isNews ? TTL_NEWS_MS : TTL_GENERAL_MS);
|
|
204
|
+
}
|
|
195
205
|
|
|
196
206
|
return response;
|
|
197
207
|
}
|
|
@@ -3,8 +3,15 @@ import crypto from 'node:crypto';
|
|
|
3
3
|
export const TTL_GENERAL_MS = 10 * 60 * 1000;
|
|
4
4
|
export const TTL_NEWS_MS = 2 * 60 * 1000;
|
|
5
5
|
|
|
6
|
-
export function computeSearchCacheKey(engine, query, count = 10) {
|
|
7
|
-
const
|
|
6
|
+
export function computeSearchCacheKey(engine, query, count = 10, options = {}) {
|
|
7
|
+
const relevantOptions = {
|
|
8
|
+
language: options.language || 'en',
|
|
9
|
+
isNews: options.isNews === true,
|
|
10
|
+
fanOut: options.fanOut !== false,
|
|
11
|
+
searxngUrl: options.searxngUrl || process.env.SEARXNG_URL || '',
|
|
12
|
+
k: Number(options.k) || 60
|
|
13
|
+
};
|
|
14
|
+
const normalized = `${String(engine || '').toLowerCase()}:${String(query || '').toLowerCase().trim()}:${count}:${JSON.stringify(relevantOptions)}`;
|
|
8
15
|
return crypto.createHash('sha256').update(normalized).digest('hex');
|
|
9
16
|
}
|
|
10
17
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import http from 'node:http';
|
|
2
2
|
import https from 'node:https';
|
|
3
|
+
import { isIP } from 'node:net';
|
|
3
4
|
import { lookup as dnsLookup } from 'node:dns/promises';
|
|
4
5
|
|
|
5
6
|
export function parseIPv4(host) {
|
|
@@ -76,16 +77,46 @@ export function isPrivateIPv4(ip) {
|
|
|
76
77
|
}
|
|
77
78
|
|
|
78
79
|
export function isPrivateIPv6(ip) {
|
|
79
|
-
const clean = ip.toLowerCase().trim();
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
if (
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
80
|
+
const clean = String(ip || '').toLowerCase().trim();
|
|
81
|
+
if (isIP(clean) !== 6) return false;
|
|
82
|
+
|
|
83
|
+
const halves = clean.split('::');
|
|
84
|
+
if (halves.length > 2) return false;
|
|
85
|
+
const left = halves[0] ? halves[0].split(':').filter(Boolean) : [];
|
|
86
|
+
const right = halves[1] ? halves[1].split(':').filter(Boolean) : [];
|
|
87
|
+
const embeddedIpv4 = right.length > 0 && right[right.length - 1].includes('.');
|
|
88
|
+
if (embeddedIpv4) {
|
|
89
|
+
const parsed = parseIPv4(right.pop());
|
|
90
|
+
if (!parsed) return false;
|
|
91
|
+
const value = parsed.split('.').map(Number);
|
|
92
|
+
right.push(((value[0] << 8) | value[1]).toString(16));
|
|
93
|
+
right.push(((value[2] << 8) | value[3]).toString(16));
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const missing = 8 - left.length - right.length;
|
|
97
|
+
if (missing < 0) return false;
|
|
98
|
+
const groups = [
|
|
99
|
+
...left.map(group => parseInt(group, 16)),
|
|
100
|
+
...Array(missing).fill(0),
|
|
101
|
+
...right.map(group => parseInt(group, 16))
|
|
102
|
+
];
|
|
103
|
+
if (groups.length !== 8 || groups.some(group => !Number.isInteger(group) || group < 0 || group > 0xffff)) return false;
|
|
104
|
+
|
|
105
|
+
if (groups[0] === 0 && groups.slice(1).every(group => group === 0)) return true;
|
|
106
|
+
if ((groups[0] & 0xfe00) === 0xfc00) return true;
|
|
107
|
+
if ((groups[0] & 0xffc0) === 0xfe80) return true;
|
|
108
|
+
|
|
109
|
+
const isIpv4MappedOrCompatible = groups.slice(0, 6).every(group => group === 0) ||
|
|
110
|
+
(groups.slice(0, 5).every(group => group === 0) && groups[5] === 0xffff);
|
|
111
|
+
if (isIpv4MappedOrCompatible) {
|
|
112
|
+
const ipv4 = [
|
|
113
|
+
groups[6] >>> 8,
|
|
114
|
+
groups[6] & 255,
|
|
115
|
+
groups[7] >>> 8,
|
|
116
|
+
groups[7] & 255
|
|
117
|
+
].join('.');
|
|
118
|
+
return isPrivateIPv4(ipv4);
|
|
119
|
+
}
|
|
89
120
|
|
|
90
121
|
return false;
|
|
91
122
|
}
|
|
@@ -3,7 +3,7 @@ import path from 'path';
|
|
|
3
3
|
import { spawn, execFile } from 'child_process';
|
|
4
4
|
import { promisify } from 'util';
|
|
5
5
|
import { fileURLToPath } from 'url';
|
|
6
|
-
import { KIKU_DATA_DIR } from './appPaths.js';
|
|
6
|
+
import { KIKU_DATA_DIR, resolveDynamicWindowsAppPaths } from './appPaths.js';
|
|
7
7
|
import { PACKAGE_ENV_PATH, USER_ENV_PATH, upsertEnvKey } from './envManager.js';
|
|
8
8
|
import { bootstrapEnv } from './envBootstrap.js';
|
|
9
9
|
|
|
@@ -27,34 +27,19 @@ async function findBrowserExeAsync(browser, { execImpl = execFileAsync } = {}) {
|
|
|
27
27
|
const probes = {
|
|
28
28
|
firefox: {
|
|
29
29
|
cmd: 'firefox',
|
|
30
|
-
paths: [
|
|
31
|
-
'C:\\Program Files\\Mozilla Firefox\\firefox.exe',
|
|
32
|
-
'C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe',
|
|
33
|
-
(process.env.LOCALAPPDATA || '') + '\\Mozilla Firefox\\firefox.exe'
|
|
34
|
-
]
|
|
30
|
+
paths: isWin ? resolveDynamicWindowsAppPaths('Mozilla Firefox', 'firefox.exe') : []
|
|
35
31
|
},
|
|
36
32
|
chrome: {
|
|
37
33
|
cmd: isWin ? 'chrome' : 'google-chrome',
|
|
38
|
-
paths: [
|
|
39
|
-
'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',
|
|
40
|
-
(process.env.LOCALAPPDATA || '') + '\\Google\\Chrome\\Application\\chrome.exe',
|
|
41
|
-
'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe'
|
|
42
|
-
]
|
|
34
|
+
paths: isWin ? resolveDynamicWindowsAppPaths('Google', 'Chrome', 'Application', 'chrome.exe') : []
|
|
43
35
|
},
|
|
44
36
|
edge: {
|
|
45
37
|
cmd: isWin ? 'msedge' : 'microsoft-edge',
|
|
46
|
-
paths: [
|
|
47
|
-
'C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe',
|
|
48
|
-
'C:\\Program Files\\Microsoft\\Edge\\Application\\msedge.exe',
|
|
49
|
-
(process.env.LOCALAPPDATA || '') + '\\Microsoft\\Edge\\Application\\msedge.exe'
|
|
50
|
-
]
|
|
38
|
+
paths: isWin ? resolveDynamicWindowsAppPaths('Microsoft', 'Edge', 'Application', 'msedge.exe') : []
|
|
51
39
|
},
|
|
52
40
|
brave: {
|
|
53
41
|
cmd: isWin ? 'brave' : 'brave-browser',
|
|
54
|
-
paths: [
|
|
55
|
-
'C:\\Program Files\\BraveSoftware\\Brave-Browser\\Application\\brave.exe',
|
|
56
|
-
(process.env.LOCALAPPDATA || '') + '\\BraveSoftware\\Brave-Browser\\Application\\brave.exe'
|
|
57
|
-
]
|
|
42
|
+
paths: isWin ? resolveDynamicWindowsAppPaths('BraveSoftware', 'Brave-Browser', 'Application', 'brave.exe') : []
|
|
58
43
|
}
|
|
59
44
|
};
|
|
60
45
|
|