foliko 1.1.0 → 1.1.2
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/.agent/.shared/ui-ux-pro-max/data/charts.csv +26 -0
- package/.agent/.shared/ui-ux-pro-max/data/colors.csv +97 -0
- package/.agent/.shared/ui-ux-pro-max/data/icons.csv +101 -0
- package/.agent/.shared/ui-ux-pro-max/data/landing.csv +31 -0
- package/.agent/.shared/ui-ux-pro-max/data/products.csv +97 -0
- package/.agent/.shared/ui-ux-pro-max/data/prompts.csv +24 -0
- package/.agent/.shared/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/.agent/.shared/ui-ux-pro-max/data/styles.csv +59 -0
- package/.agent/.shared/ui-ux-pro-max/data/typography.csv +58 -0
- package/.agent/.shared/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/.agent/.shared/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/.agent/.shared/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/.agent/.shared/ui-ux-pro-max/scripts/__pycache__/core.cpython-313.pyc +0 -0
- package/.agent/.shared/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-313.pyc +0 -0
- package/.agent/.shared/ui-ux-pro-max/scripts/core.py +258 -0
- package/.agent/.shared/ui-ux-pro-max/scripts/design_system.py +1067 -0
- package/.agent/.shared/ui-ux-pro-max/scripts/search.py +106 -0
- package/.agent/ARCHITECTURE.md +288 -0
- package/.agent/agents/ambient-agent.md +57 -0
- package/.agent/agents/debugger.md +55 -0
- package/.agent/agents/email-assistant.md +49 -0
- package/.agent/agents/file-manager.md +42 -0
- package/.agent/agents/python-developer.md +60 -0
- package/.agent/agents/scheduler.md +59 -0
- package/.agent/agents/web-developer.md +45 -0
- package/.agent/data/default.json +412 -3
- package/.agent/data/plugins-state.json +173 -174
- package/.agent/data/puppeteer-sessions/undefined.json +6 -0
- package/.agent/data/weixin-media/2026-04-08/img_1775618677512.jpg +0 -0
- package/.agent/data/weixin-media/2026-04-08/img_1775619073340.jpg +0 -0
- package/.agent/data/weixin-media/2026-04-08/img_1775619097536.jpg +0 -0
- package/.agent/data/weixin-media/2026-04-08/img_1775619209388.jpg +0 -0
- package/.agent/mcp_config_updated.json +12 -0
- package/.agent/plugins/poster-plugin/fonts/NotoColorEmoji-Regular.ttf +0 -0
- package/.agent/plugins/poster-plugin/package.json +2 -1
- package/.agent/plugins/poster-plugin/src/canvas.js +70 -7
- package/.agent/plugins/poster-plugin/src/components/barcode.js +120 -0
- package/.agent/plugins/poster-plugin/src/components/bubble.js +153 -0
- package/.agent/plugins/poster-plugin/src/components/button.js +124 -0
- package/.agent/plugins/poster-plugin/src/components/cta.js +26 -24
- package/.agent/plugins/poster-plugin/src/components/featureGrid.js +22 -17
- package/.agent/plugins/poster-plugin/src/components/frame.js +230 -0
- package/.agent/plugins/poster-plugin/src/components/highlightText.js +144 -0
- package/.agent/plugins/poster-plugin/src/components/icon.js +94 -0
- package/.agent/plugins/poster-plugin/src/components/index.js +19 -0
- package/.agent/plugins/poster-plugin/src/components/listItem.js +6 -5
- package/.agent/plugins/poster-plugin/src/components/qrcode.js +74 -0
- package/.agent/plugins/poster-plugin/src/components/ribbon.js +193 -0
- package/.agent/plugins/poster-plugin/src/components/seal.js +146 -0
- package/.agent/plugins/poster-plugin/src/components/table.js +17 -9
- package/.agent/plugins/poster-plugin/src/components/tagCloud.js +24 -17
- package/.agent/plugins/poster-plugin/src/components/timeline.js +24 -12
- package/.agent/plugins/poster-plugin/src/composer.js +392 -150
- package/.agent/plugins/poster-plugin/src/elements/background.js +36 -4
- package/.agent/plugins/poster-plugin/src/elements/image.js +4 -47
- package/.agent/plugins/poster-plugin/src/elements/index.js +2 -0
- package/.agent/plugins/poster-plugin/src/elements/polygon.js +37 -6
- package/.agent/plugins/poster-plugin/src/elements/richText.js +230 -0
- package/.agent/plugins/poster-plugin/src/elements/svg.js +35 -19
- package/.agent/plugins/poster-plugin/src/elements/text.js +71 -2
- package/.agent/plugins/poster-plugin/src/fonts.js +123 -8
- package/.agent/plugins/poster-plugin/src/index.js +445 -23
- package/.agent/plugins/poster-plugin/src/utils/imageLoader.js +84 -0
- package/.agent/plugins/poster-plugin/test-background.svg +1 -0
- package/.agent/plugins/poster-plugin/test-full-poster.svg +2 -0
- package/.agent/plugins/poster-plugin/test-image.png +0 -0
- package/.agent/plugins/puppeteer-plugin/README.md +147 -0
- package/.agent/plugins/puppeteer-plugin/index.js +1418 -0
- package/.agent/plugins/puppeteer-plugin/package.json +9 -0
- package/.agent/plugins.json +5 -11
- package/.agent/rules/GEMINI.md +273 -0
- package/.agent/rules/allow-rule.md +77 -0
- package/.agent/rules/log-rule.md +83 -0
- package/.agent/rules/security-rule.md +93 -0
- package/.agent/scripts/auto_preview.py +148 -0
- package/.agent/scripts/checklist.py +217 -0
- package/.agent/scripts/session_manager.py +120 -0
- package/.agent/scripts/verify_all.py +327 -0
- package/.agent/sessions/cli_default.json +678 -23580
- package/.agent/sessions/weixin_o9cq80zgZqKPA2-s59PN43GdDy1w@im.wechat.json +11097 -0
- package/.agent/skills/api-patterns/SKILL.md +81 -0
- package/.agent/skills/api-patterns/api-style.md +42 -0
- package/.agent/skills/api-patterns/auth.md +24 -0
- package/.agent/skills/api-patterns/documentation.md +26 -0
- package/.agent/skills/api-patterns/graphql.md +41 -0
- package/.agent/skills/api-patterns/rate-limiting.md +31 -0
- package/.agent/skills/api-patterns/response.md +37 -0
- package/.agent/skills/api-patterns/rest.md +40 -0
- package/.agent/skills/api-patterns/scripts/api_validator.py +211 -0
- package/.agent/skills/api-patterns/security-testing.md +122 -0
- package/.agent/skills/api-patterns/trpc.md +41 -0
- package/.agent/skills/api-patterns/versioning.md +22 -0
- package/.agent/skills/app-builder/SKILL.md +75 -0
- package/.agent/skills/app-builder/agent-coordination.md +71 -0
- package/.agent/skills/app-builder/feature-building.md +53 -0
- package/.agent/skills/app-builder/project-detection.md +34 -0
- package/.agent/skills/app-builder/scaffolding.md +118 -0
- package/.agent/skills/app-builder/tech-stack.md +40 -0
- package/.agent/skills/app-builder/templates/SKILL.md +39 -0
- package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -0
- package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -0
- package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -0
- package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -0
- package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +83 -0
- package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -0
- package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -0
- package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +122 -0
- package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +122 -0
- package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +169 -0
- package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +134 -0
- package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -0
- package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +119 -0
- package/.agent/skills/architecture/SKILL.md +55 -0
- package/.agent/skills/architecture/context-discovery.md +43 -0
- package/.agent/skills/architecture/examples.md +94 -0
- package/.agent/skills/architecture/pattern-selection.md +68 -0
- package/.agent/skills/architecture/patterns-reference.md +50 -0
- package/.agent/skills/architecture/trade-off-analysis.md +77 -0
- package/.agent/skills/clean-code/SKILL.md +201 -0
- package/.agent/skills/doc.md +177 -0
- package/.agent/skills/frontend-design/SKILL.md +418 -0
- package/.agent/skills/frontend-design/animation-guide.md +331 -0
- package/.agent/skills/frontend-design/color-system.md +311 -0
- package/.agent/skills/frontend-design/decision-trees.md +418 -0
- package/.agent/skills/frontend-design/motion-graphics.md +306 -0
- package/.agent/skills/frontend-design/scripts/accessibility_checker.py +183 -0
- package/.agent/skills/frontend-design/scripts/ux_audit.py +722 -0
- package/.agent/skills/frontend-design/typography-system.md +345 -0
- package/.agent/skills/frontend-design/ux-psychology.md +1116 -0
- package/.agent/skills/frontend-design/visual-effects.md +383 -0
- package/.agent/skills/i18n-localization/SKILL.md +154 -0
- package/.agent/skills/i18n-localization/scripts/i18n_checker.py +241 -0
- package/.agent/skills/mcp-builder/SKILL.md +176 -0
- package/.agent/skills/web-design-guidelines/SKILL.md +57 -0
- package/.agent/workflows/brainstorm.md +113 -0
- package/.agent/workflows/create.md +59 -0
- package/.agent/workflows/debug.md +103 -0
- package/.agent/workflows/deploy.md +176 -0
- package/.agent/workflows/enhance.md +63 -0
- package/.agent/workflows/orchestrate.md +237 -0
- package/.agent/workflows/plan.md +89 -0
- package/.agent/workflows/preview.md +81 -0
- package/.agent/workflows/simple-test.md +42 -0
- package/.agent/workflows/status.md +86 -0
- package/.agent/workflows/structured-orchestrate.md +180 -0
- package/.agent/workflows/test.md +144 -0
- package/.agent/workflows/ui-ux-pro-max.md +296 -0
- package/.claude/settings.local.json +21 -1
- package/.env.example +56 -56
- package/README.md +441 -441
- package/cli/src/commands/chat.js +2 -1
- package/output/international-news-daily.png +0 -0
- package/package.json +2 -1
- package/plugins/extension-executor-plugin.js +91 -12
- package/plugins/file-system-plugin.js +4 -19
- package/plugins/subagent-plugin.js +37 -14
- package/plugins/weixin-plugin.js +168 -40
- package/poster-test-2.png +0 -0
- package/skills/find-skills/AGENTS.md +162 -162
- package/skills/find-skills/SKILL.md +133 -133
- package/skills/poster-guide/SKILL.md +1435 -627
- package/src/core/agent-chat.js +223 -11
- package/src/core/agent.js +6 -3
- package/.agent/agents/code-assistant.json +0 -14
- package/.agent/agents/email-assistant.json +0 -14
- package/.agent/agents/file-assistant.json +0 -15
- package/.agent/agents/system-assistant.json +0 -15
- package/.agent/agents/web-assistant.json +0 -12
- package/.agent/data/ambient/goals.json +0 -50
- package/.agent/data/ambient/memories.json +0 -7
- package/.agent/data/scheduler/tasks.json +0 -1
- package/.agent/memory/core.md +0 -1
- package/.agent/memory/project/mnn93ogy-ypjn27.md +0 -9
- package/.agent/memory/project/mnn98fqy-5nhc1u.md +0 -25
- package/.agent/memory/user/mnm67t9m-x8rekk.md +0 -9
- package/.agent/memory/user/mnn5mmqh-w6aktx.md +0 -11
- package/.agent/memory/user/mnnbfhhn-dk1bd1.md +0 -22
- package/.agent/package.json +0 -8
- package/.agent/plugins/__pycache__/file_writer.cpython-312.pyc +0 -0
- package/.agent/plugins/daytona/README.md +0 -89
- package/.agent/plugins/daytona/index.js +0 -377
- package/.agent/plugins/daytona/package.json +0 -12
- package/.agent/plugins/marknative/README.md +0 -134
- package/.agent/plugins/marknative/index.js +0 -228
- package/.agent/plugins/marknative/package.json +0 -12
- package/.agent/plugins/marknative/update-readme.js +0 -134
- package/.agent/plugins/system-info/index.js +0 -387
- package/.agent/plugins/system-info/package.json +0 -4
- package/.agent/plugins/system-info/test.js +0 -40
- package/.agent/python-scripts/test_sample.py +0 -24
- package/.agent/skills/agent-browser/SKILL.md +0 -311
- package/.agent/skills/agent-browser/TEST_PLAN.md +0 -200
- package/.agent/skills/sysinfo/SKILL.md +0 -38
- package/.agent/skills/sysinfo/system-info.sh +0 -130
- package/.agent/skills/workflow/SKILL.md +0 -324
- package/.agent/weixin.json +0 -6
- package/.agent/workflows/email-digest.json +0 -50
- package/.agent/workflows/file-backup.json +0 -21
- package/.agent/workflows/get-ip-notify.json +0 -32
- package/.agent/workflows/news-aggregator.json +0 -93
- package/.agent/workflows/news-dashboard-v2.json +0 -94
- package/.agent/workflows/notification-batch.json +0 -32
package/src/core/agent-chat.js
CHANGED
|
@@ -31,7 +31,7 @@ const MODEL_CONTEXT_LIMITS = {
|
|
|
31
31
|
'deepseek-chat': 28000,
|
|
32
32
|
'deepseek-coder': 28000,
|
|
33
33
|
// MiniMax
|
|
34
|
-
'MiniMax-M2.7':
|
|
34
|
+
'MiniMax-M2.7': 130800,
|
|
35
35
|
// OpenAI
|
|
36
36
|
'gpt-4': 100000,
|
|
37
37
|
'gpt-4o': 100000,
|
|
@@ -93,7 +93,7 @@ class SimpleTokenizer {
|
|
|
93
93
|
const _globalTokenizer = new SimpleTokenizer();
|
|
94
94
|
|
|
95
95
|
// 压缩超时时间(毫秒)
|
|
96
|
-
const COMPRESSION_TIMEOUT =
|
|
96
|
+
const COMPRESSION_TIMEOUT = 120000; // 2分钟
|
|
97
97
|
|
|
98
98
|
class AgentChatHandler extends EventEmitter {
|
|
99
99
|
/**
|
|
@@ -334,9 +334,48 @@ class AgentChatHandler extends EventEmitter {
|
|
|
334
334
|
total += this._countTokens(msg.content);
|
|
335
335
|
} else if (Array.isArray(msg.content)) {
|
|
336
336
|
for (const part of msg.content) {
|
|
337
|
-
if (part
|
|
337
|
+
if (!part || typeof part !== 'object') continue;
|
|
338
|
+
|
|
339
|
+
// 处理普通文本
|
|
340
|
+
if (part.text) {
|
|
338
341
|
total += this._countTokens(String(part.text));
|
|
339
342
|
}
|
|
343
|
+
|
|
344
|
+
// 处理 tool-result 的 output 字段
|
|
345
|
+
if (part.type === 'tool-result' && part.output) {
|
|
346
|
+
if (typeof part.output === 'string') {
|
|
347
|
+
total += this._countTokens(part.output);
|
|
348
|
+
} else if (part.output && typeof part.output === 'object') {
|
|
349
|
+
// 处理 { type: 'text', value: '...' } 或 { type: 'text', html: '...' } 等
|
|
350
|
+
if (part.output.value) {
|
|
351
|
+
total += this._countTokens(String(part.output.value));
|
|
352
|
+
}
|
|
353
|
+
if (part.output.html) {
|
|
354
|
+
total += this._countTokens(part.output.html);
|
|
355
|
+
}
|
|
356
|
+
// 其他字段也序列化计算
|
|
357
|
+
try {
|
|
358
|
+
const others = {};
|
|
359
|
+
for (const [k, v] of Object.entries(part.output)) {
|
|
360
|
+
if (k !== 'value' && k !== 'html') others[k] = v;
|
|
361
|
+
}
|
|
362
|
+
if (Object.keys(others).length > 0) {
|
|
363
|
+
total += this._countTokens(JSON.stringify(others));
|
|
364
|
+
}
|
|
365
|
+
} catch (e) {
|
|
366
|
+
// 忽略
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// 处理 tool-use 的 input 字段
|
|
372
|
+
if (part.type === 'tool_use' && part.input) {
|
|
373
|
+
try {
|
|
374
|
+
total += this._countTokens(JSON.stringify(part.input));
|
|
375
|
+
} catch (e) {
|
|
376
|
+
// 忽略
|
|
377
|
+
}
|
|
378
|
+
}
|
|
340
379
|
}
|
|
341
380
|
} else if (msg.content && typeof msg.content === 'object') {
|
|
342
381
|
// 处理工具结果等对象类型
|
|
@@ -579,6 +618,9 @@ class AgentChatHandler extends EventEmitter {
|
|
|
579
618
|
const sortedIndices = Array.from(indicesToKeep).sort((a, b) => a - b);
|
|
580
619
|
const filteredRecentMessages = sortedIndices.map((i) => recentMessages[i]);
|
|
581
620
|
|
|
621
|
+
// 清理孤立 tool results(tool call 已被总结,但 result 还在)
|
|
622
|
+
this._cleanOrphanedToolResults(filteredRecentMessages);
|
|
623
|
+
|
|
582
624
|
// 直接修改传入的 messages 数组
|
|
583
625
|
messages.length = 0;
|
|
584
626
|
messages.push(...systemMessages, summary, ...filteredRecentMessages);
|
|
@@ -699,6 +741,9 @@ class AgentChatHandler extends EventEmitter {
|
|
|
699
741
|
const sortedIndices = Array.from(indicesToKeep).sort((a, b) => a - b);
|
|
700
742
|
const filteredRecentMessages = sortedIndices.map((i) => recentMessages[i]);
|
|
701
743
|
|
|
744
|
+
// 清理孤立 tool results(tool call 已被总结,但 result 还在)
|
|
745
|
+
this._cleanOrphanedToolResults(filteredRecentMessages);
|
|
746
|
+
|
|
702
747
|
// 直接修改传入的 messages 数组
|
|
703
748
|
messages.length = 0;
|
|
704
749
|
messages.push(...systemMessages, summary, ...filteredRecentMessages);
|
|
@@ -721,6 +766,38 @@ class AgentChatHandler extends EventEmitter {
|
|
|
721
766
|
}
|
|
722
767
|
}
|
|
723
768
|
|
|
769
|
+
/**
|
|
770
|
+
* 清理孤立的 tool results(对应的 tool call 已被压缩删除)
|
|
771
|
+
* @param {Array} messages - 消息数组
|
|
772
|
+
* @private
|
|
773
|
+
*/
|
|
774
|
+
_cleanOrphanedToolResults(messages) {
|
|
775
|
+
// 构建当前消息中存在的 toolCallId 集合
|
|
776
|
+
const validToolCallIds = new Set();
|
|
777
|
+
for (const msg of messages) {
|
|
778
|
+
if (msg.role === 'assistant' && msg.content) {
|
|
779
|
+
const content = Array.isArray(msg.content) ? msg.content : [msg.content];
|
|
780
|
+
for (const item of content) {
|
|
781
|
+
if (item.type === 'tool-call' && item.toolCallId) {
|
|
782
|
+
validToolCallIds.add(item.toolCallId);
|
|
783
|
+
}
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
// 过滤掉孤立 tool results
|
|
789
|
+
for (const msg of messages) {
|
|
790
|
+
if (msg.role === 'tool' && Array.isArray(msg.content)) {
|
|
791
|
+
msg.content = msg.content.filter((item) => {
|
|
792
|
+
if (item && item.type === 'tool-result' && item.toolCallId) {
|
|
793
|
+
return validToolCallIds.has(item.toolCallId);
|
|
794
|
+
}
|
|
795
|
+
return true;
|
|
796
|
+
});
|
|
797
|
+
}
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
|
|
724
801
|
/**
|
|
725
802
|
* 使用 AI 对消息进行总结
|
|
726
803
|
* @param {Array} messages - 要总结的消息
|
|
@@ -1019,12 +1096,18 @@ ${truncatedContent}${truncatedNote}
|
|
|
1019
1096
|
return messages;
|
|
1020
1097
|
}
|
|
1021
1098
|
|
|
1022
|
-
// 2.
|
|
1099
|
+
// 2. 检查并移除不完整的 tool-call 和对应的 tool result
|
|
1100
|
+
const validated = this._validateToolCallsForPrepare(messages);
|
|
1101
|
+
if (validated !== messages) {
|
|
1102
|
+
return validated;
|
|
1103
|
+
}
|
|
1104
|
+
|
|
1105
|
+
// 3. 消息数量超过阈值才修剪
|
|
1023
1106
|
if (messages.length <= 50) {
|
|
1024
1107
|
return messages;
|
|
1025
1108
|
}
|
|
1026
1109
|
|
|
1027
|
-
//
|
|
1110
|
+
// 4. 保留配对完整的消息
|
|
1028
1111
|
const pruned = this._prepareMessagesForAI(messages);
|
|
1029
1112
|
return pruned;
|
|
1030
1113
|
} catch (err) {
|
|
@@ -1042,6 +1125,7 @@ ${truncatedContent}${truncatedNote}
|
|
|
1042
1125
|
model: this._aiClient,
|
|
1043
1126
|
instructions: this._systemPrompt,
|
|
1044
1127
|
tools: tools,
|
|
1128
|
+
stopWhen: stepCountIs(30),
|
|
1045
1129
|
prepareStep: prepareStepChainStream,
|
|
1046
1130
|
});
|
|
1047
1131
|
|
|
@@ -1068,8 +1152,6 @@ ${truncatedContent}${truncatedNote}
|
|
|
1068
1152
|
stepCount: result.stepCount || 1,
|
|
1069
1153
|
};
|
|
1070
1154
|
} finally {
|
|
1071
|
-
// 校验并修复消息中的不完整工具调用
|
|
1072
|
-
this._validateToolCalls(messages);
|
|
1073
1155
|
// 确保保存聊天历史到 session(无论成功还是失败)
|
|
1074
1156
|
messageStore.save();
|
|
1075
1157
|
}
|
|
@@ -1129,12 +1211,18 @@ ${truncatedContent}${truncatedNote}
|
|
|
1129
1211
|
return messages;
|
|
1130
1212
|
}
|
|
1131
1213
|
|
|
1132
|
-
// 2.
|
|
1214
|
+
// 2. 检查并移除不完整的 tool-call 和对应的 tool result
|
|
1215
|
+
const validated = this._validateToolCallsForPrepare(messages);
|
|
1216
|
+
if (validated !== messages) {
|
|
1217
|
+
return validated;
|
|
1218
|
+
}
|
|
1219
|
+
|
|
1220
|
+
// 3. 消息数量超过阈值才修剪
|
|
1133
1221
|
if (messages.length <= 50) {
|
|
1134
1222
|
return messages;
|
|
1135
1223
|
}
|
|
1136
1224
|
|
|
1137
|
-
//
|
|
1225
|
+
// 4. 保留配对完整的消息
|
|
1138
1226
|
const pruned = this._prepareMessagesForAI(messages);
|
|
1139
1227
|
return pruned;
|
|
1140
1228
|
} catch (err) {
|
|
@@ -1147,6 +1235,7 @@ ${truncatedContent}${truncatedNote}
|
|
|
1147
1235
|
model: this._aiClient,
|
|
1148
1236
|
instructions: this._systemPrompt,
|
|
1149
1237
|
tools: tools,
|
|
1238
|
+
stopWhen: stepCountIs(30),
|
|
1150
1239
|
prepareStep: prepareStepChainStream,
|
|
1151
1240
|
});
|
|
1152
1241
|
|
|
@@ -1190,8 +1279,6 @@ ${truncatedContent}${truncatedNote}
|
|
|
1190
1279
|
this.emit('error', { error: err.message });
|
|
1191
1280
|
yield { type: 'error', error: err.message };
|
|
1192
1281
|
} finally {
|
|
1193
|
-
// 校验并修复消息中的不完整工具调用
|
|
1194
|
-
this._validateToolCalls(messages);
|
|
1195
1282
|
// 确保保存聊天历史到 session(无论成功还是失败)
|
|
1196
1283
|
messageStore.save();
|
|
1197
1284
|
}
|
|
@@ -1383,6 +1470,19 @@ ${truncatedContent}${truncatedNote}
|
|
|
1383
1470
|
delete item.toolName;
|
|
1384
1471
|
delete item.input;
|
|
1385
1472
|
fixedCount++;
|
|
1473
|
+
} else {
|
|
1474
|
+
// 检查 JSON 是否能完整解析
|
|
1475
|
+
try {
|
|
1476
|
+
JSON.parse(trimmed);
|
|
1477
|
+
} catch (e) {
|
|
1478
|
+
// JSON 解析失败,说明是不完整的 JSON
|
|
1479
|
+
item.type = 'text';
|
|
1480
|
+
item.text = `(工具调用 ${item.toolName} 参数不完整(${e.message}),已跳过)`;
|
|
1481
|
+
delete item.toolCallId;
|
|
1482
|
+
delete item.toolName;
|
|
1483
|
+
delete item.input;
|
|
1484
|
+
fixedCount++;
|
|
1485
|
+
}
|
|
1386
1486
|
}
|
|
1387
1487
|
}
|
|
1388
1488
|
}
|
|
@@ -1392,6 +1492,118 @@ ${truncatedContent}${truncatedNote}
|
|
|
1392
1492
|
}
|
|
1393
1493
|
}
|
|
1394
1494
|
|
|
1495
|
+
/**
|
|
1496
|
+
* 在 prepareStep 中检查并移除不完整的 tool-call 和对应的 tool result
|
|
1497
|
+
* 返回修改后的消息数组(如果没修改则返回原数组)
|
|
1498
|
+
* @param {Array} messages - 消息列表
|
|
1499
|
+
* @returns {Array} 修改后的消息数组或原数组
|
|
1500
|
+
* @private
|
|
1501
|
+
*/
|
|
1502
|
+
_validateToolCallsForPrepare(messages) {
|
|
1503
|
+
// 收集不完整的 toolCallId
|
|
1504
|
+
const invalidToolCallIds = new Set();
|
|
1505
|
+
|
|
1506
|
+
for (const msg of messages) {
|
|
1507
|
+
if (msg.role !== 'assistant' || !Array.isArray(msg.content)) {
|
|
1508
|
+
continue;
|
|
1509
|
+
}
|
|
1510
|
+
|
|
1511
|
+
for (const item of msg.content) {
|
|
1512
|
+
if (item.type !== 'tool-call' || !item.toolCallId) {
|
|
1513
|
+
continue;
|
|
1514
|
+
}
|
|
1515
|
+
|
|
1516
|
+
const input = item.input;
|
|
1517
|
+
if (typeof input !== 'string') {
|
|
1518
|
+
continue;
|
|
1519
|
+
}
|
|
1520
|
+
|
|
1521
|
+
// 检查 input 是否是有效的 JSON
|
|
1522
|
+
const trimmed = input.trim();
|
|
1523
|
+
let isInvalid = false;
|
|
1524
|
+
|
|
1525
|
+
if (trimmed === '{' || trimmed === '' || !trimmed.startsWith('{')) {
|
|
1526
|
+
isInvalid = true;
|
|
1527
|
+
} else {
|
|
1528
|
+
try {
|
|
1529
|
+
JSON.parse(trimmed);
|
|
1530
|
+
} catch (e) {
|
|
1531
|
+
isInvalid = true;
|
|
1532
|
+
}
|
|
1533
|
+
}
|
|
1534
|
+
|
|
1535
|
+
if (isInvalid) {
|
|
1536
|
+
invalidToolCallIds.add(item.toolCallId);
|
|
1537
|
+
logger.warn(`Found incomplete tool call: ${item.toolName} (${item.toolCallId})`);
|
|
1538
|
+
}
|
|
1539
|
+
}
|
|
1540
|
+
}
|
|
1541
|
+
|
|
1542
|
+
// 如果没有不完整的 tool-call,返回原数组
|
|
1543
|
+
if (invalidToolCallIds.size === 0) {
|
|
1544
|
+
return messages;
|
|
1545
|
+
}
|
|
1546
|
+
|
|
1547
|
+
// 构建新的消息数组,移除不完整的 tool-call 和对应的 tool result
|
|
1548
|
+
const result = [];
|
|
1549
|
+
|
|
1550
|
+
for (const msg of messages) {
|
|
1551
|
+
if (msg.role === 'tool') {
|
|
1552
|
+
// 检查 tool result 是否对应不完整的 tool-call
|
|
1553
|
+
if (Array.isArray(msg.content)) {
|
|
1554
|
+
const newContent = [];
|
|
1555
|
+
for (const item of msg.content) {
|
|
1556
|
+
if (
|
|
1557
|
+
item.type === 'tool-result' &&
|
|
1558
|
+
item.toolCallId &&
|
|
1559
|
+
invalidToolCallIds.has(item.toolCallId)
|
|
1560
|
+
) {
|
|
1561
|
+
// 跳过这个 tool result
|
|
1562
|
+
continue;
|
|
1563
|
+
}
|
|
1564
|
+
newContent.push(item);
|
|
1565
|
+
}
|
|
1566
|
+
// 如果所有 content 都被移除了,跳过这条消息
|
|
1567
|
+
if (newContent.length === 0) {
|
|
1568
|
+
continue;
|
|
1569
|
+
}
|
|
1570
|
+
// 浅拷贝消息对象
|
|
1571
|
+
result.push({ ...msg, content: newContent });
|
|
1572
|
+
} else {
|
|
1573
|
+
result.push(msg);
|
|
1574
|
+
}
|
|
1575
|
+
} else if (msg.role === 'assistant') {
|
|
1576
|
+
// 检查并移除 assistant 消息中的不完整 tool-call
|
|
1577
|
+
if (Array.isArray(msg.content)) {
|
|
1578
|
+
const newContent = [];
|
|
1579
|
+
for (const item of msg.content) {
|
|
1580
|
+
if (
|
|
1581
|
+
item.type === 'tool-call' &&
|
|
1582
|
+
item.toolCallId &&
|
|
1583
|
+
invalidToolCallIds.has(item.toolCallId)
|
|
1584
|
+
) {
|
|
1585
|
+
// 跳过不完整的 tool-call
|
|
1586
|
+
continue;
|
|
1587
|
+
}
|
|
1588
|
+
newContent.push(item);
|
|
1589
|
+
}
|
|
1590
|
+
// 如果所有 content 都被移除了,跳过这条消息
|
|
1591
|
+
if (newContent.length === 0) {
|
|
1592
|
+
continue;
|
|
1593
|
+
}
|
|
1594
|
+
result.push({ ...msg, content: newContent });
|
|
1595
|
+
} else {
|
|
1596
|
+
result.push(msg);
|
|
1597
|
+
}
|
|
1598
|
+
} else {
|
|
1599
|
+
result.push(msg);
|
|
1600
|
+
}
|
|
1601
|
+
}
|
|
1602
|
+
|
|
1603
|
+
logger.info(`Removed ${invalidToolCallIds.size} incomplete tool calls and their results`);
|
|
1604
|
+
return result;
|
|
1605
|
+
}
|
|
1606
|
+
|
|
1395
1607
|
/**
|
|
1396
1608
|
* 获取 AI SDK 格式的工具
|
|
1397
1609
|
* AI SDK 6.x 需要对象形式 { toolName: tool }
|
package/src/core/agent.js
CHANGED
|
@@ -334,6 +334,8 @@ class Agent extends EventEmitter {
|
|
|
334
334
|
desc += ' - 根据上述【子 Agent 匹配表】,将任务委托给最匹配的子Agent处理\n';
|
|
335
335
|
desc += ' - 使用 subagent_call 工具并指定 agentName 来委托任务\n';
|
|
336
336
|
desc += ' - 只有当没有匹配的子Agent时,才直接调用工具\n';
|
|
337
|
+
desc +=
|
|
338
|
+
' - 子Agent返回结果后,必须将结果中的 result 字段内容整理后呈现给用户,不要直接输出 JSON 对象\n';
|
|
337
339
|
|
|
338
340
|
return desc.trim();
|
|
339
341
|
}
|
|
@@ -523,20 +525,21 @@ class Agent extends EventEmitter {
|
|
|
523
525
|
5. **结果导向**:调用工具后,基于返回结果回答,不要重复工具的内部实现细节。
|
|
524
526
|
6. **多步骤任务**:复杂任务拆解为多个工具调用,逐步完成,每步基于结果决定下一步。
|
|
525
527
|
7. **步骤未完成必须提示继续**:如果任务需要多步骤操作,在返回前必须明确告知用户当前进度和下一步操作。如果回复内容为空或不完整,必须说明"步骤进行中,请继续"。
|
|
526
|
-
|
|
528
|
+
8. **子Agent结果必须完整呈现**:调用 subagent_call 后,工具返回的内容就是子Agent的查询结果,**必须将返回内容完整地呈现给用户**,不要省略、截断或只说"以上是..."就结束。
|
|
527
529
|
|
|
528
530
|
【响应规范】
|
|
529
531
|
- 直接给出结论或结果,不说"我需要..."、"我建议..."等铺垫话术
|
|
530
532
|
- 如果工具返回错误,说明错误原因并给出解决建议
|
|
531
533
|
- 如果信息不足,先调用工具获取必要信息,不要假设或猜测
|
|
532
534
|
- **重要:如果任务需要多步骤操作,在回复末尾必须提示用户"请继续"或"是否继续下一步"**
|
|
533
|
-
|
|
535
|
+
- **调用子Agent后,必须完整展示返回内容,不允许省略**
|
|
534
536
|
|
|
535
537
|
【禁止事项】
|
|
536
538
|
- 不调用工具就直接回答
|
|
537
539
|
- 编造不存在的数据、文件、订单、用户等信息
|
|
538
540
|
- 回复含糊不清,让用户无法确定答案是否正确
|
|
539
|
-
-
|
|
541
|
+
- **多步骤任务未完成就结束,不提示用户继续**
|
|
542
|
+
- **省略子Agent返回的内容,或只说"以上是..."没有实际内容**`;
|
|
540
543
|
}
|
|
541
544
|
|
|
542
545
|
/**
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "code-assistant",
|
|
3
|
-
"description": "代码助手 - 专业的编程和代码分析助手",
|
|
4
|
-
"instructions": "你是一个专业的代码助手,精通多种编程语言和开发技术。\n\n【核心能力】\n- 代码编写、调试和优化\n- 代码审查和重构建议\n- 多种编程语言支持(Python、JavaScript、TypeScript、Java等)\n- 代码问题诊断和解决\n- 解释复杂代码逻辑\n\n【工作原则】\n- 提供清晰、规范的代码\n- 包含必要的注释说明\n- 考虑代码性能和安全性\n- 遵循最佳实践",
|
|
5
|
-
"tools": [
|
|
6
|
-
"read_file",
|
|
7
|
-
"write_file",
|
|
8
|
-
"modify_file",
|
|
9
|
-
"search_file",
|
|
10
|
-
"python-execute",
|
|
11
|
-
"execute_command",
|
|
12
|
-
"shell"
|
|
13
|
-
]
|
|
14
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "email-assistant",
|
|
3
|
-
"description": "邮件助手 - 专业的邮件管理助手",
|
|
4
|
-
"instructions": "你是一个专业的邮件助手,擅长邮件的读写、筛选和管理。\n\n【核心能力】\n- 读取和回复邮件\n- 发送新邮件(支持附件)\n- 邮件搜索和筛选\n- 邮件摘要生成\n- 批量邮件处理\n\n【工作原则】\n- 保持邮件格式规范\n- 回复内容专业得体\n- 保护隐私信息\n- 及时处理重要邮件",
|
|
5
|
-
"tools": [
|
|
6
|
-
"email_read",
|
|
7
|
-
"email_send",
|
|
8
|
-
"email_mark_read",
|
|
9
|
-
"email_delete",
|
|
10
|
-
"email_unread_count",
|
|
11
|
-
"email_configure",
|
|
12
|
-
"notification_send"
|
|
13
|
-
]
|
|
14
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "file-assistant",
|
|
3
|
-
"description": "文件助手 - 专业的文件管理和操作助手",
|
|
4
|
-
"instructions": "你是一个专业的文件助手,擅长文件操作、目录管理、文件搜索和内容编辑。\n\n【核心能力】\n- 读取、创建、编辑、删除文件和目录\n- 搜索文件内容和文件名称\n- 批量文件操作\n- 文件内容分析和提取\n\n【工作原则】\n- 执行操作前确认路径正确\n- 危险操作(如删除)需要谨慎\n- 保持文件编码一致性\n- 重要文件操作前可创建备份",
|
|
5
|
-
"tools": [
|
|
6
|
-
"read_file",
|
|
7
|
-
"write_file",
|
|
8
|
-
"delete_file",
|
|
9
|
-
"modify_file",
|
|
10
|
-
"search_file",
|
|
11
|
-
"read_directory",
|
|
12
|
-
"create_directory",
|
|
13
|
-
"execute_command"
|
|
14
|
-
]
|
|
15
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "system-assistant",
|
|
3
|
-
"description": "系统助手 - 专业的系统信息监控和管理助手",
|
|
4
|
-
"instructions": "你是一个专业的系统助手,精通系统信息监控和基础管理。\n\n【核心能力】\n- CPU、内存、磁盘使用情况监控\n- 网络接口信息查询\n- 系统运行状态分析\n- 性能问题诊断\n- 定时监控和报告\n\n【工作原则】\n- 提供清晰的数据展示\n- 发现异常及时提醒\n- 给出合理的优化建议\n- 保护系统安全",
|
|
5
|
-
"tools": [
|
|
6
|
-
"get_basic_info",
|
|
7
|
-
"get_cpu_info",
|
|
8
|
-
"get_memory_info",
|
|
9
|
-
"get_disk_info",
|
|
10
|
-
"get_network_info",
|
|
11
|
-
"get_full_system_info",
|
|
12
|
-
"notification_send",
|
|
13
|
-
"schedule_task"
|
|
14
|
-
]
|
|
15
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "web-assistant",
|
|
3
|
-
"description": "网络助手 - 专业的网络数据获取和处理助手",
|
|
4
|
-
"instructions": "你是一个专业的网络助手,精通网络数据获取和处理。\n\n【核心能力】\n- HTTP请求发送(GET/POST/PUT/DELETE等)\n- 网页内容抓取和解析\n- API调用和数据处理\n- JSON/XML数据解析\n- 网络问题诊断\n\n【工作原则】\n- 遵守网站使用协议\n- 合理控制请求频率\n- 数据处理规范\n- 异常情况妥善处理",
|
|
5
|
-
"tools": [
|
|
6
|
-
"fetch",
|
|
7
|
-
"web_request",
|
|
8
|
-
"execute_command",
|
|
9
|
-
"python-execute",
|
|
10
|
-
"notification_send"
|
|
11
|
-
]
|
|
12
|
-
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
[
|
|
2
|
-
{
|
|
3
|
-
"id": "041f34d6-8ada-4a0f-932d-147f8476a830",
|
|
4
|
-
"title": "邮箱监控与自动回复",
|
|
5
|
-
"description": "监控邮箱,收到新邮件时自动分析内容并回复,无需用户确认",
|
|
6
|
-
"priority": 8,
|
|
7
|
-
"state": "active",
|
|
8
|
-
"actions": [
|
|
9
|
-
{
|
|
10
|
-
"type": "tool",
|
|
11
|
-
"name": "email_auto_reply",
|
|
12
|
-
"args": {
|
|
13
|
-
"to": "${event.to}",
|
|
14
|
-
"subject": "${event.subject}",
|
|
15
|
-
"body": "${event.text}",
|
|
16
|
-
"from": "${event.from}",
|
|
17
|
-
"messageId": "${event.messageId}"
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
],
|
|
21
|
-
"_originalActions": [
|
|
22
|
-
{
|
|
23
|
-
"type": "tool",
|
|
24
|
-
"name": "email_auto_reply",
|
|
25
|
-
"args": {
|
|
26
|
-
"to": "${event.to}",
|
|
27
|
-
"subject": "${event.subject}",
|
|
28
|
-
"body": "${event.text}",
|
|
29
|
-
"from": "${event.from}",
|
|
30
|
-
"messageId": "${event.messageId}"
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
],
|
|
34
|
-
"conditions": {
|
|
35
|
-
"events": [
|
|
36
|
-
"email:received"
|
|
37
|
-
]
|
|
38
|
-
},
|
|
39
|
-
"createdAt": "2026-03-29T18:15:42.180Z",
|
|
40
|
-
"updatedAt": "2026-03-29T19:00:39.406Z",
|
|
41
|
-
"activatedAt": "2026-03-29T18:15:44.186Z",
|
|
42
|
-
"completedAt": "2026-03-29T18:54:56.861Z",
|
|
43
|
-
"failedAt": null,
|
|
44
|
-
"attempts": 11,
|
|
45
|
-
"maxAttempts": 10,
|
|
46
|
-
"consecutiveSameActions": 0,
|
|
47
|
-
"lastActionId": null,
|
|
48
|
-
"eventsReceived": []
|
|
49
|
-
}
|
|
50
|
-
]
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
[]
|
package/.agent/memory/core.md
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
测试数据 - 姓名: 李四, 职业: 工程师, 城市: 北京, 兴趣: 编程
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: "mnn93ogy-ypjn27"
|
|
3
|
-
name: "Foliko AI Agent Platform"
|
|
4
|
-
type: "project"
|
|
5
|
-
project: "foliko"
|
|
6
|
-
tags: [foliko, ai-agent, poster, design]
|
|
7
|
-
created: "2026-04-06"
|
|
8
|
-
---
|
|
9
|
-
Foliko 是一个 AI Agent 平台项目,位于 D:\Code\vb-agent 目录。用户正在测试不同的海报设计风格,目前已经测试了 simple、business、social 和 modern 四种模板样式。这表明用户在为项目选择合适的视觉设计风格。后续可以使用此记忆来理解用户的设计偏好,或在类似项目中提供风格建议。
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: "mnn98fqy-5nhc1u"
|
|
3
|
-
name: "Foliko AI 海报设计规范"
|
|
4
|
-
type: "project"
|
|
5
|
-
project: "Foliko"
|
|
6
|
-
tags: [海报设计, AI, 品牌视觉, 项目展示]
|
|
7
|
-
created: "2026-04-06"
|
|
8
|
-
---
|
|
9
|
-
Foliko 是一个 AI 项目,slogan 是「AI 驱动的创意灵感和效率工具」。为 Foliko 制作海报的设计经验:
|
|
10
|
-
|
|
11
|
-
**设计原则**:
|
|
12
|
-
- 视觉层次:大标题 > 副标题 > 核心特性 > 行动号召
|
|
13
|
-
- 色彩搭配:深色背景 + 霓虹渐变(科技感),蓝色代表科技/信任,绿色代表创新
|
|
14
|
-
- 留白:保持简洁,不要过于拥挤
|
|
15
|
-
- 对比:使用深色背景+亮色文字产生强烈对比
|
|
16
|
-
- 品牌识别:保持 Foliko 的品牌色
|
|
17
|
-
|
|
18
|
-
**成功实践**:
|
|
19
|
-
- 使用渐变标题突出品牌名
|
|
20
|
-
- 添加装饰性几何元素(圆、线条、发光点)增强科技感
|
|
21
|
-
- 卡片式展示核心功能
|
|
22
|
-
- 英文 + 中文双语展示增强国际感
|
|
23
|
-
- 暗底亮字是有效的视觉策略
|
|
24
|
-
|
|
25
|
-
**How to apply**: 在后续海报生成中,应优先使用深色背景、渐变品牌色、科技感装饰元素,聚焦核心功能展示,保持简洁有力的视觉层次。
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: "mnnbfhhn-dk1bd1"
|
|
3
|
-
name: "何建成"
|
|
4
|
-
type: "user"
|
|
5
|
-
project: "null"
|
|
6
|
-
tags: []
|
|
7
|
-
created: "2026-04-06"
|
|
8
|
-
---
|
|
9
|
-
用户姓名:何建成
|
|
10
|
-
|
|
11
|
-
项目:Foliko - 简约的插件化 Agent 框架
|
|
12
|
-
工作目录:D:\Code\vb-agent
|
|
13
|
-
|
|
14
|
-
已发布插件:poster-plugin
|
|
15
|
-
|
|
16
|
-
创建的海报:
|
|
17
|
-
- foliko-poster.png (1080x1080)
|
|
18
|
-
- foliko-twitter-cover.png (1500x500)
|
|
19
|
-
- foliko-instagram-story.png (1080x1920)
|
|
20
|
-
- foliko-japanese-minimal.png (1080x1350)
|
|
21
|
-
- zen-card-japanese.png (800x1100)
|
|
22
|
-
- foliko-final-poster.png
|
package/.agent/package.json
DELETED
|
Binary file
|