kiku-agent 1.2.0 → 1.3.0

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 (100) hide show
  1. package/README.md +459 -407
  2. package/package.json +27 -3
  3. package/server/agent/agentCore.js +635 -267
  4. package/server/agent/appPaths.js +2 -0
  5. package/server/agent/catalogEntityResolver.js +629 -0
  6. package/server/agent/citations.js +0 -21
  7. package/server/agent/clarificationAnalytics.js +1 -1
  8. package/server/agent/clarifyingQuestions.js +286 -216
  9. package/server/agent/cli.js +528 -73
  10. package/server/agent/commandFeatures.js +123 -24
  11. package/server/agent/commandRegistry.js +128 -62
  12. package/server/agent/commands.js +1410 -95
  13. package/server/agent/config.js +253 -163
  14. package/server/agent/contextCompactor.js +239 -25
  15. package/server/agent/dynamicCatalog.js +192 -0
  16. package/server/agent/envBootstrap.js +46 -0
  17. package/server/agent/envManager.js +317 -0
  18. package/server/agent/eventBus.js +3 -3
  19. package/server/agent/feedbackLearning.js +0 -8
  20. package/server/agent/gpuMetrics.js +188 -55
  21. package/server/agent/ingestionWorker.js +339 -0
  22. package/server/agent/lanDiscovery.js +369 -0
  23. package/server/agent/llmClient.js +111 -39
  24. package/server/agent/lmStudioWakeup.js +144 -0
  25. package/server/agent/mcpClient.js +2 -2
  26. package/server/agent/memory.js +635 -494
  27. package/server/agent/modelConfig.js +487 -0
  28. package/server/agent/newsIntelligence.js +219 -0
  29. package/server/agent/newsWatch.js +85 -0
  30. package/server/agent/prompts.js +146 -0
  31. package/server/agent/publicTools.js +7 -0
  32. package/server/agent/queryDetails.js +62 -1
  33. package/server/agent/research.js +314 -35
  34. package/server/agent/routingInterceptor.js +77 -0
  35. package/server/agent/rumoredProjects.js +15 -0
  36. package/server/agent/sanitizer.js +117 -17
  37. package/server/agent/subagent.js +52 -9
  38. package/server/agent/suggestionTui.js +33 -13
  39. package/server/agent/suggestions.js +29 -13
  40. package/server/agent/telemetry.js +0 -11
  41. package/server/agent/terminalImage.js +0 -1
  42. package/server/agent/textToolProtocol.js +190 -0
  43. package/server/agent/tokenTracker.js +220 -0
  44. package/server/agent/toolRouter.js +362 -216
  45. package/server/agent/tools.js +1155 -194
  46. package/server/agent/ui.js +144 -41
  47. package/server/agent/vramService.js +572 -0
  48. package/server/agent/webSearch.js +2279 -273
  49. package/server/agent/youtubeAuth.js +82 -73
  50. package/server/agent/youtubeTranscript.js +209 -0
  51. package/server/apiRouter.js +383 -179
  52. package/server/mcp/data/brands.js +5 -5
  53. package/server/mcp/data/discography.js +56 -45
  54. package/server/mcp/data/gallery.js +9 -0
  55. package/server/mcp/data/index.js +1 -0
  56. package/server/mcp/data/industryIndex.js +251 -0
  57. package/server/mcp/data/profile.js +5 -5
  58. package/server/mcp/data/timeline.js +2 -2
  59. package/server/mcp/data/works.js +2 -2
  60. package/server/mcp/handler.js +0 -2
  61. package/server/mcp/prompts.js +42 -2
  62. package/server/mcp/resources.js +5 -1
  63. package/server/mcp/security.js +25 -14
  64. package/server/mcp/server.js +92 -3
  65. package/server/mcp/tools.js +20 -11
  66. package/server/web-chat/core/connection.js +218 -194
  67. package/server/web-chat/core/conversationContext.js +1 -1
  68. package/server/web-chat/core/directCatalogEngine.js +190 -184
  69. package/server/web-chat/core/followUpEngine.js +88 -11
  70. package/server/web-chat/core/security.js +7 -4
  71. package/server/web-chat/router.js +54 -17
  72. package/server/web-chat/routes/bilibiliRoute.js +34 -0
  73. package/server/web-chat/routes/chatRoute.js +488 -397
  74. package/server/web-chat/routes/clarifyConfigRoute.js +1 -2
  75. package/server/web-chat/routes/exportRoute.js +2 -1
  76. package/server/web-chat/routes/lanDiscoveryRoute.js +90 -0
  77. package/server/web-chat/routes/newsRoute.js +36 -6
  78. package/server/web-chat/routes/providerRoute.js +87 -0
  79. package/server/web-chat/routes/staticRoute.js +61 -13
  80. package/server/web-chat/routes/statusRoute.js +23 -2
  81. package/server/web-chat/routes/vramRoute.js +22 -0
  82. package/server/web-chat/server.js +135 -106
  83. package/server/web-chat/ui/htmlBuilder.js +8 -8
  84. package/server/web-chat/ui/previews/modelSettings.preview.html +41 -0
  85. package/server/web-chat/ui/scripts/agentBubbleSystem.js +0 -5
  86. package/server/web-chat/ui/scripts/client.js +10526 -8397
  87. package/server/web-chat/ui/scripts/webchatI18n.js +190 -138
  88. package/server/web-chat/ui/styles/main.css +7471 -4246
  89. package/server/web-chat/ui/templates/body.html +305 -179
  90. package/src/data/brandsData.js +29 -6
  91. package/src/data/discographyData.js +918 -900
  92. package/src/data/galleryData.js +66 -0
  93. package/src/data/industryIndexData.js +292 -0
  94. package/src/data/musicVideoData.js +48 -5
  95. package/src/data/profileData.js +15 -1
  96. package/src/data/timelineData.js +4 -3
  97. package/src/data/worksData.js +536 -535
  98. package/src/lib/vram/estimator.js +464 -0
  99. package/src/lib/vram/modelRegistry.js +387 -0
  100. package/tokens.css +33 -2
@@ -1,42 +1,47 @@
1
1
  import { handleStaticRoute } from './routes/staticRoute.js';
2
2
  import { handleStatusRoute } from './routes/statusRoute.js';
3
3
  import { handleChatRoute } from './routes/chatRoute.js';
4
+ import { handleProviderGetRoute, handleProviderUpdateRoute } from './routes/providerRoute.js';
5
+ import { handleLanDiscoveryRoute, handleLanApplyRoute } from './routes/lanDiscoveryRoute.js';
4
6
  import { handleSuggestionsRoute, handleAiSuggestRoute } from './routes/suggestRoute.js';
5
7
  import { handleVerifyRoute } from './routes/verifyRoute.js';
6
8
  import { handleNewsRoute } from './routes/newsRoute.js';
7
9
  import { handleCompareRoute } from './routes/compareRoute.js';
8
10
  import { handleQuizRoute } from './routes/quizRoute.js';
9
11
  import { handleTimelineRoute } from './routes/timelineRoute.js';
12
+ import { handleBilibiliCoverRoute } from './routes/bilibiliRoute.js';
10
13
  import { handleExportRoute } from './routes/exportRoute.js';
11
14
  import { handleClarifyRoute } from './routes/clarifyRoute.js';
12
15
  import { handleFeedbackRoute, handleFeedbackStatsRoute } from './routes/feedbackRoute.js';
13
16
  import { handleClarifyAnalyticsRoute, handleClarifyConfigRoute } from './routes/clarifyConfigRoute.js';
14
- import { applySecurityHeaders, checkChatRateLimitDistributed, resolveClientIp } from './core/security.js';
17
+ import { handleSystemHardwareRoute, handleEstimateVramRoute } from './routes/vramRoute.js';
18
+ import { applySecurityHeaders, checkChatRateLimitDistributed, resolveClientIp } from './core/security.js';
15
19
  import { sendError } from './core/errorHandler.js';
20
+ import { handleApiRequest } from '../apiRouter.js';
16
21
 
17
22
  export async function handleWebChatRequest(req, res, options = {}) {
18
- const port = Number(options.port || 3001);
23
+ const port = Number(options.port || 3002);
19
24
  const urlObj = new URL(req.url, `http://localhost:${port}`);
20
25
  const pathname = urlObj.pathname;
21
26
 
22
- const originAllowed = applySecurityHeaders(req, res);
23
- if (!originAllowed) {
24
- return sendError(res, 403, 'Origin is not allowed');
25
- }
27
+ const originAllowed = applySecurityHeaders(req, res);
28
+ if (!originAllowed) {
29
+ return sendError(res, 403, 'Origin is not allowed');
30
+ }
26
31
 
27
- if (req.method === 'OPTIONS') {
32
+ if (req.method === 'OPTIONS') {
28
33
  res.writeHead(204);
29
34
  res.end();
30
- return;
31
- }
32
-
33
- if (pathname.startsWith('/api/')) {
34
- const rate = await checkChatRateLimitDistributed(resolveClientIp(req));
35
- if (!rate.allowed) {
36
- res.setHeader('Retry-After', String(rate.retryAfter || 60));
37
- return sendError(res, 429, `Rate limit exceeded. Please retry in ${rate.retryAfter || 60} seconds.`);
38
- }
39
- }
35
+ return;
36
+ }
37
+
38
+ if (pathname.startsWith('/api/')) {
39
+ const rate = await checkChatRateLimitDistributed(resolveClientIp(req));
40
+ if (!rate.allowed) {
41
+ res.setHeader('Retry-After', String(rate.retryAfter || 60));
42
+ return sendError(res, 429, `Rate limit exceeded. Please retry in ${rate.retryAfter || 60} seconds.`);
43
+ }
44
+ }
40
45
 
41
46
  try {
42
47
 
@@ -48,6 +53,22 @@ export async function handleWebChatRequest(req, res, options = {}) {
48
53
  return await handleStatusRoute(req, res, urlObj, port);
49
54
  }
50
55
 
56
+ if (pathname === '/api/provider' && req.method === 'GET') {
57
+ return await handleProviderGetRoute(req, res);
58
+ }
59
+
60
+ if (pathname === '/api/provider' && req.method === 'POST') {
61
+ return await handleProviderUpdateRoute(req, res);
62
+ }
63
+
64
+ if (pathname === '/api/lan/discovery' && req.method === 'GET') {
65
+ return await handleLanDiscoveryRoute(req, res);
66
+ }
67
+
68
+ if (pathname === '/api/lan/discovery/apply' && req.method === 'POST') {
69
+ return await handleLanApplyRoute(req, res);
70
+ }
71
+
51
72
  if (pathname === '/api/suggestions') {
52
73
  return await handleSuggestionsRoute(req, res);
53
74
  }
@@ -64,10 +85,22 @@ export async function handleWebChatRequest(req, res, options = {}) {
64
85
  return await handleTimelineRoute(req, res, urlObj);
65
86
  }
66
87
 
88
+ if (pathname === '/api/bilibili/cover') {
89
+ return await handleBilibiliCoverRoute(req, res, urlObj);
90
+ }
91
+
67
92
  if (pathname === '/api/chat' && req.method === 'POST') {
68
93
  return await handleChatRoute(req, res, urlObj);
69
94
  }
70
95
 
96
+ if (pathname === '/api/v1/system/hardware' && req.method === 'GET') {
97
+ return await handleSystemHardwareRoute(req, res);
98
+ }
99
+
100
+ if (pathname === '/api/v1/models/estimate-vram' && (req.method === 'POST' || req.method === 'GET')) {
101
+ return await handleEstimateVramRoute(req, res, urlObj);
102
+ }
103
+
71
104
  if (pathname === '/api/export' && req.method === 'POST') {
72
105
  return await handleExportRoute(req, res);
73
106
  }
@@ -112,6 +145,10 @@ export async function handleWebChatRequest(req, res, options = {}) {
112
145
  return await handleClarifyConfigRoute(req, res, options, 'reset');
113
146
  }
114
147
 
148
+ if (pathname.startsWith('/api/v1') || pathname === '/api-docs' || pathname === '/api/api-docs' || pathname === '/openapi.json') {
149
+ return await handleApiRequest(req, res);
150
+ }
151
+
115
152
  res.writeHead(404, { 'Content-Type': 'application/json' });
116
153
  res.end(JSON.stringify({ error: 'Not found' }));
117
154
  } catch (err) {
@@ -0,0 +1,34 @@
1
+ import { fetchBilibiliVideoInfo, BILIBILI_BVID_PATTERN } from '../../agent/webSearch.js';
2
+ import { sendJson } from '../core/errorHandler.js';
3
+
4
+ export async function handleBilibiliCoverRoute(req, res, urlObj) {
5
+ if (req.method !== 'GET') {
6
+ sendJson(res, 405, { status: 'error', error: 'Method not allowed' });
7
+ return;
8
+ }
9
+
10
+ const bvid = String(urlObj.searchParams.get('bvid') || '').trim();
11
+ if (!BILIBILI_BVID_PATTERN.test(bvid)) {
12
+ sendJson(res, 400, { status: 'error', error: 'A valid bvid query param (BV + 10 chars) is required' });
13
+ return;
14
+ }
15
+
16
+ const info = await fetchBilibiliVideoInfo(bvid);
17
+ if (info.status !== 'success') {
18
+ sendJson(res, 502, { status: 'error', error: info.message || 'Bilibili lookup failed', bvid });
19
+ return;
20
+ }
21
+
22
+ sendJson(res, 200, {
23
+ status: 'success',
24
+ bvid,
25
+ video: {
26
+ title: info.video.title,
27
+ author: info.video.author,
28
+ pic: info.video.pic,
29
+ playCount: info.video.playCount,
30
+ url: info.video.url,
31
+ embedUrl: info.video.embedUrl
32
+ }
33
+ });
34
+ }