foliko 1.0.74 → 1.0.75
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 +29 -0
- package/.agent/data/plugins-state.json +255 -0
- package/.agent/mcp_config.json +4 -0
- package/.agent/mcp_config_updated.json +12 -0
- package/.agent/plugins.json +5 -0
- 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/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 +157 -149
- package/.editorconfig +56 -0
- package/.husky/pre-commit +4 -0
- package/.lintstagedrc +7 -0
- package/.prettierignore +29 -0
- package/.prettierrc +11 -0
- package/CLAUDE.md +2 -0
- package/README.md +64 -55
- package/SPEC.md +102 -61
- package/cli/bin/foliko.js +4 -4
- package/cli/src/commands/chat.js +53 -51
- package/cli/src/commands/list.js +40 -37
- package/cli/src/index.js +18 -18
- package/cli/src/ui/chat-ui.js +78 -76
- package/cli/src/utils/ansi.js +15 -15
- package/cli/src/utils/markdown.js +112 -116
- package/docker-compose.yml +1 -1
- package/docs/ai-sdk-optimization.md +655 -643
- package/docs/features.md +80 -80
- package/docs/quick-reference.md +49 -46
- package/docs/user-manual.md +411 -380
- package/examples/ambient-example.js +95 -97
- package/examples/basic.js +115 -110
- package/examples/bootstrap.js +52 -43
- package/examples/mcp-example.js +56 -53
- package/examples/skill-example.js +49 -49
- package/examples/test-chat.js +60 -58
- package/examples/test-mcp.js +49 -43
- package/examples/test-reload.js +38 -40
- package/examples/test-telegram.js +3 -3
- package/examples/test-tg-bot.js +7 -4
- package/examples/test-tg-simple.js +4 -3
- package/examples/test-tg.js +3 -3
- package/examples/test-think.js +13 -7
- package/examples/test-web-plugin.js +61 -56
- package/examples/test-weixin-feishu.js +40 -37
- package/examples/workflow.js +49 -49
- package/foliko-1.0.75.tgz +0 -0
- package/package.json +37 -3
- package/plugins/ai-plugin.js +7 -5
- package/plugins/ambient-agent/EventWatcher.js +113 -0
- package/plugins/ambient-agent/ExplorerLoop.js +640 -0
- package/plugins/ambient-agent/GoalManager.js +197 -0
- package/plugins/ambient-agent/Reflector.js +95 -0
- package/plugins/ambient-agent/StateStore.js +90 -0
- package/plugins/ambient-agent/constants.js +101 -0
- package/plugins/ambient-agent/index.js +579 -0
- package/plugins/default-plugins.js +62 -49
- package/plugins/email/constants.js +64 -0
- package/plugins/email/handlers.js +461 -0
- package/plugins/email/index.js +278 -0
- package/plugins/email/monitor.js +269 -0
- package/plugins/email/parser.js +138 -0
- package/plugins/email/reply.js +151 -0
- package/plugins/email/utils.js +124 -0
- package/plugins/feishu-plugin.js +23 -19
- package/plugins/file-system-plugin.js +456 -106
- package/plugins/install-plugin.js +6 -4
- package/plugins/python-executor-plugin.js +3 -1
- package/plugins/python-plugin-loader.js +10 -8
- package/plugins/rules-plugin.js +5 -3
- package/plugins/scheduler-plugin.js +18 -16
- package/plugins/session-plugin.js +3 -1
- package/plugins/storage-plugin.js +5 -3
- package/plugins/subagent-plugin.js +152 -92
- package/plugins/telegram-plugin.js +26 -19
- package/plugins/think-plugin.js +4 -2
- package/plugins/tools-plugin.js +3 -1
- package/plugins/web-plugin.js +15 -13
- package/plugins/weixin-plugin.js +43 -36
- package/reports/system-health-report-20260401.md +79 -0
- package/skills/ambient-agent/SKILL.md +49 -39
- package/skills/foliko-dev/AGENTS.md +64 -61
- package/skills/foliko-dev/SKILL.md +125 -119
- package/skills/mcp-usage/SKILL.md +19 -17
- package/skills/python-plugin-dev/SKILL.md +16 -15
- package/skills/skill-guide/SKILL.md +12 -12
- package/skills/subagent-guide/SKILL.md +237 -0
- package/skills/workflow-guide/SKILL.md +90 -45
- package/skills/workflow-troubleshooting/DEBUGGING.md +36 -21
- package/skills/workflow-troubleshooting/SKILL.md +156 -79
- package/src/capabilities/index.js +4 -4
- package/src/capabilities/skill-manager.js +211 -197
- package/src/capabilities/workflow-engine.js +461 -547
- package/src/core/agent-chat.js +426 -279
- package/src/core/agent.js +453 -249
- package/src/core/framework.js +183 -149
- package/src/core/index.js +8 -8
- package/src/core/plugin-base.js +52 -52
- package/src/core/plugin-manager.js +377 -281
- package/src/core/provider.js +35 -32
- package/src/core/sub-agent-config.js +264 -0
- package/src/core/system-prompt-builder.js +120 -0
- package/src/core/tool-registry.js +416 -33
- package/src/core/tool-router.js +149 -68
- package/src/executors/executor-base.js +58 -58
- package/src/executors/mcp-executor.js +269 -257
- package/src/index.js +5 -17
- package/src/utils/circuit-breaker.js +301 -0
- package/src/utils/error-boundary.js +363 -0
- package/src/utils/error.js +374 -0
- package/src/utils/event-emitter.js +20 -20
- package/src/utils/id.js +133 -0
- package/src/utils/index.js +217 -3
- package/src/utils/logger.js +181 -0
- package/src/utils/plugin-helpers.js +90 -0
- package/src/utils/retry.js +122 -0
- package/src/utils/sandbox.js +292 -0
- package/test/tool-registry-validation.test.js +218 -0
- package/test_report.md +70 -0
- package/website/docs/api.html +169 -107
- package/website/docs/configuration.html +296 -144
- package/website/docs/plugin-development.html +154 -85
- package/website/docs/project-structure.html +110 -109
- package/website/docs/skill-development.html +117 -61
- package/website/index.html +209 -205
- package/website/script.js +20 -17
- package/website/styles.css +1 -1
- package/plugins/ambient-agent-plugin.js +0 -1565
- package/plugins/email.js +0 -1142
|
@@ -7,6 +7,8 @@ const { execSync } = require('child_process')
|
|
|
7
7
|
const fs = require('fs')
|
|
8
8
|
const path = require('path')
|
|
9
9
|
const { Plugin } = require('../src/core/plugin-base')
|
|
10
|
+
const { logger } = require('../src/utils/logger')
|
|
11
|
+
const log = logger.child('InstallPlugin')
|
|
10
12
|
const { z } = require('zod')
|
|
11
13
|
|
|
12
14
|
class InstallPlugin extends Plugin {
|
|
@@ -85,7 +87,7 @@ class InstallPlugin extends Plugin {
|
|
|
85
87
|
? path.resolve(process.cwd(), targetPath)
|
|
86
88
|
: this._agentDir
|
|
87
89
|
|
|
88
|
-
|
|
90
|
+
log.info(` Installing ${packageName} to ${installPath}...`)
|
|
89
91
|
|
|
90
92
|
// 确保目标目录存在
|
|
91
93
|
if (!fs.existsSync(installPath)) {
|
|
@@ -98,7 +100,7 @@ class InstallPlugin extends Plugin {
|
|
|
98
100
|
cwd: installPath
|
|
99
101
|
})
|
|
100
102
|
|
|
101
|
-
|
|
103
|
+
log.info(` Successfully installed ${packageName}`)
|
|
102
104
|
|
|
103
105
|
return {
|
|
104
106
|
success: true,
|
|
@@ -125,7 +127,7 @@ class InstallPlugin extends Plugin {
|
|
|
125
127
|
? path.resolve(process.cwd(), targetPath)
|
|
126
128
|
: pkgDir
|
|
127
129
|
|
|
128
|
-
|
|
130
|
+
log.info(` Installing dependencies from ${resolvedPkgPath} to ${installPath}...`)
|
|
129
131
|
|
|
130
132
|
// 读取 package.json 获取要安装的包
|
|
131
133
|
const pkg = JSON.parse(fs.readFileSync(resolvedPkgPath, 'utf-8'))
|
|
@@ -153,7 +155,7 @@ class InstallPlugin extends Plugin {
|
|
|
153
155
|
cwd: pkgDir
|
|
154
156
|
})
|
|
155
157
|
|
|
156
|
-
|
|
158
|
+
log.info(` Successfully installed ${packages.length} packages`)
|
|
157
159
|
|
|
158
160
|
return {
|
|
159
161
|
success: true,
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
const { Plugin } = require('../src/core/plugin-base')
|
|
7
|
+
const { logger } = require('../src/utils/logger')
|
|
8
|
+
const log = logger.child('PythonExecutor')
|
|
7
9
|
const { spawn } = require('child_process')
|
|
8
10
|
const fs = require('fs')
|
|
9
11
|
const path = require('path')
|
|
@@ -355,7 +357,7 @@ except Exception:
|
|
|
355
357
|
try {
|
|
356
358
|
fs.rmSync(this._tempDir, { recursive: true, force: true })
|
|
357
359
|
} catch (e) {
|
|
358
|
-
|
|
360
|
+
log.warn(` Failed to cleanup temp dir: ${e.message}`)
|
|
359
361
|
}
|
|
360
362
|
}
|
|
361
363
|
this._framework = null
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
const fs = require('fs')
|
|
7
7
|
const path = require('path')
|
|
8
8
|
const { Plugin } = require('../src/core/plugin-base')
|
|
9
|
+
const { logger } = require('../src/utils/logger')
|
|
10
|
+
const log = logger.child('PythonPluginLoader')
|
|
9
11
|
const { z } = require('zod')
|
|
10
12
|
|
|
11
13
|
// 将 JSON Schema 转换为 Zod Schema
|
|
@@ -196,7 +198,7 @@ class PythonPluginLoader extends Plugin {
|
|
|
196
198
|
info: pluginInfo,
|
|
197
199
|
code: fs.readFileSync(pluginPath, 'utf-8')
|
|
198
200
|
})
|
|
199
|
-
|
|
201
|
+
log.info(` Loaded: ${pluginName}`)
|
|
200
202
|
|
|
201
203
|
// 注册插件的每个工具
|
|
202
204
|
if (pluginInfo.tools && Array.isArray(pluginInfo.tools)) {
|
|
@@ -206,11 +208,11 @@ class PythonPluginLoader extends Plugin {
|
|
|
206
208
|
}
|
|
207
209
|
}
|
|
208
210
|
} catch (err) {
|
|
209
|
-
|
|
211
|
+
log.error(` Failed to load ${file}:`, err.message)
|
|
210
212
|
}
|
|
211
213
|
}
|
|
212
214
|
|
|
213
|
-
|
|
215
|
+
log.info(` Total Python plugins: ${this._pythonPlugins.size}`)
|
|
214
216
|
}
|
|
215
217
|
|
|
216
218
|
/**
|
|
@@ -228,9 +230,9 @@ class PythonPluginLoader extends Plugin {
|
|
|
228
230
|
return this._executePythonTool(pluginName, tool.name, args)
|
|
229
231
|
}
|
|
230
232
|
})
|
|
231
|
-
//
|
|
233
|
+
//log.info(` Registered tool: ${tool.name}`)
|
|
232
234
|
} catch (err) {
|
|
233
|
-
|
|
235
|
+
log.error(` Failed to register tool ${tool.name}:`, err.message)
|
|
234
236
|
}
|
|
235
237
|
}
|
|
236
238
|
|
|
@@ -275,7 +277,7 @@ class PythonPluginLoader extends Plugin {
|
|
|
275
277
|
// 找到 plugin_info = {
|
|
276
278
|
const startIdx = code.indexOf('plugin_info')
|
|
277
279
|
if (startIdx === -1) {
|
|
278
|
-
|
|
280
|
+
log.warn(` ${path.basename(pluginPath)}: no plugin_info found`)
|
|
279
281
|
return null
|
|
280
282
|
}
|
|
281
283
|
|
|
@@ -298,7 +300,7 @@ class PythonPluginLoader extends Plugin {
|
|
|
298
300
|
}
|
|
299
301
|
|
|
300
302
|
if (endIdx === -1) {
|
|
301
|
-
|
|
303
|
+
log.warn(` ${path.basename(pluginPath)}: unclosed brace`)
|
|
302
304
|
return null
|
|
303
305
|
}
|
|
304
306
|
|
|
@@ -319,7 +321,7 @@ class PythonPluginLoader extends Plugin {
|
|
|
319
321
|
const info = JSON.parse(infoStr)
|
|
320
322
|
return info
|
|
321
323
|
} catch (err) {
|
|
322
|
-
|
|
324
|
+
log.warn(` Failed to parse ${path.basename(pluginPath)}:`, err.message)
|
|
323
325
|
return null
|
|
324
326
|
}
|
|
325
327
|
}
|
package/plugins/rules-plugin.js
CHANGED
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
const { Plugin } = require('../src/core/plugin-base')
|
|
7
|
+
const { logger } = require('../src/utils/logger')
|
|
8
|
+
const log = logger.child('RulesPlugin')
|
|
7
9
|
const { z } = require('zod')
|
|
8
10
|
const fs = require('fs')
|
|
9
11
|
const path = require('path')
|
|
@@ -169,7 +171,7 @@ class RulesPlugin extends Plugin {
|
|
|
169
171
|
const resolvedDir = path.resolve(process.cwd(), rulesDir)
|
|
170
172
|
|
|
171
173
|
if (!fs.existsSync(resolvedDir)) {
|
|
172
|
-
|
|
174
|
+
log.info(` Rules directory not found: ${resolvedDir}`)
|
|
173
175
|
return
|
|
174
176
|
}
|
|
175
177
|
|
|
@@ -189,10 +191,10 @@ class RulesPlugin extends Plugin {
|
|
|
189
191
|
this._rules.push(rule)
|
|
190
192
|
}
|
|
191
193
|
|
|
192
|
-
|
|
194
|
+
log.info(` Loaded ${rules.length} rules from ${file}`)
|
|
193
195
|
}
|
|
194
196
|
} catch (err) {
|
|
195
|
-
|
|
197
|
+
log.error(` Failed to load rules: ${err.message}`)
|
|
196
198
|
}
|
|
197
199
|
}
|
|
198
200
|
|
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
const { Plugin } = require('../src/core/plugin-base')
|
|
8
|
+
const { logger } = require('../src/utils/logger')
|
|
9
|
+
const log = logger.child('Scheduler')
|
|
8
10
|
const { z } = require('zod')
|
|
9
11
|
const fs = require('fs')
|
|
10
12
|
const path = require('path')
|
|
@@ -14,7 +16,7 @@ let cron = null
|
|
|
14
16
|
try {
|
|
15
17
|
cron = require('node-cron')
|
|
16
18
|
} catch (e) {
|
|
17
|
-
|
|
19
|
+
log.warn(' node-cron not installed, cron tasks will not work')
|
|
18
20
|
}
|
|
19
21
|
|
|
20
22
|
// ============================================================================
|
|
@@ -57,7 +59,7 @@ class TaskStore {
|
|
|
57
59
|
}))
|
|
58
60
|
fs.writeFileSync(this._getTasksPath(), JSON.stringify(serializable, null, 2))
|
|
59
61
|
} catch (err) {
|
|
60
|
-
|
|
62
|
+
log.error(' 保存任务失败:', err.message)
|
|
61
63
|
}
|
|
62
64
|
}
|
|
63
65
|
|
|
@@ -69,7 +71,7 @@ class TaskStore {
|
|
|
69
71
|
return JSON.parse(data)
|
|
70
72
|
}
|
|
71
73
|
} catch (err) {
|
|
72
|
-
|
|
74
|
+
log.error(' 加载任务失败:', err.message)
|
|
73
75
|
}
|
|
74
76
|
return []
|
|
75
77
|
}
|
|
@@ -210,7 +212,7 @@ class SchedulerPlugin extends Plugin {
|
|
|
210
212
|
return bTime - aTime
|
|
211
213
|
})
|
|
212
214
|
targetSessionId = sessions[0].id
|
|
213
|
-
//
|
|
215
|
+
//log.info(` Auto-detected active session: ${targetSessionId}`)
|
|
214
216
|
}
|
|
215
217
|
}
|
|
216
218
|
}
|
|
@@ -467,12 +469,12 @@ class SchedulerPlugin extends Plugin {
|
|
|
467
469
|
const savedTasks = this._taskStore.loadTasks()
|
|
468
470
|
if (!savedTasks || savedTasks.length === 0) return
|
|
469
471
|
|
|
470
|
-
|
|
472
|
+
log.info(` 加载 ${savedTasks.length} 个持久化任务...`)
|
|
471
473
|
|
|
472
474
|
for (const saved of savedTasks) {
|
|
473
475
|
// 跳过已过期的任务或已清理的任务
|
|
474
476
|
if (saved.type === 'once' && saved.runCount > 0) {
|
|
475
|
-
|
|
477
|
+
log.info(` 跳过已完成的一次性任务: ${saved.name}`)
|
|
476
478
|
continue
|
|
477
479
|
}
|
|
478
480
|
|
|
@@ -486,9 +488,9 @@ class SchedulerPlugin extends Plugin {
|
|
|
486
488
|
})
|
|
487
489
|
this._tasks.set(task.id, task)
|
|
488
490
|
this._taskStats.total++
|
|
489
|
-
|
|
491
|
+
log.info(` 已恢复 Cron 任务: ${task.name}`)
|
|
490
492
|
} catch (err) {
|
|
491
|
-
|
|
493
|
+
log.error(` 恢复 Cron 任务失败: ${task.name}`, err.message)
|
|
492
494
|
}
|
|
493
495
|
}
|
|
494
496
|
// 重新调度相对时间任务(计算新的执行时间)
|
|
@@ -501,7 +503,7 @@ class SchedulerPlugin extends Plugin {
|
|
|
501
503
|
}, newDelay)
|
|
502
504
|
this._tasks.set(task.id, task)
|
|
503
505
|
this._taskStats.total++
|
|
504
|
-
|
|
506
|
+
log.info(` 已恢复一次性任务: ${task.name},将在 ${newDelay}ms 后执行`)
|
|
505
507
|
}
|
|
506
508
|
}
|
|
507
509
|
// 重新调度绝对时间任务
|
|
@@ -514,9 +516,9 @@ class SchedulerPlugin extends Plugin {
|
|
|
514
516
|
}, delay)
|
|
515
517
|
this._tasks.set(task.id, task)
|
|
516
518
|
this._taskStats.total++
|
|
517
|
-
|
|
519
|
+
log.info(` 已恢复一次性任务: ${task.name},将在 ${runAt} 执行`)
|
|
518
520
|
} else {
|
|
519
|
-
|
|
521
|
+
log.info(` 跳过已过期的任务: ${task.name}`)
|
|
520
522
|
}
|
|
521
523
|
}
|
|
522
524
|
}
|
|
@@ -541,12 +543,12 @@ class SchedulerPlugin extends Plugin {
|
|
|
541
543
|
* 执行任务
|
|
542
544
|
*/
|
|
543
545
|
async _executeTask(task) {
|
|
544
|
-
//
|
|
545
|
-
//
|
|
546
|
+
// log.info(` Executing task: ${task.name} (${task.id})`)
|
|
547
|
+
// log.info(` Message: ${task.message}`)
|
|
546
548
|
// if (task.sessionId) {
|
|
547
|
-
//
|
|
549
|
+
// log.info(` Target session: ${task.sessionId}`)
|
|
548
550
|
// }
|
|
549
|
-
//
|
|
551
|
+
// log.info(` LLM mode: ${task.llm ? 'enabled' : 'disabled'}`)
|
|
550
552
|
|
|
551
553
|
task.lastRun = new Date()
|
|
552
554
|
task.runCount++
|
|
@@ -610,7 +612,7 @@ class SchedulerPlugin extends Plugin {
|
|
|
610
612
|
return { success: true }
|
|
611
613
|
} catch (err) {
|
|
612
614
|
this._taskStats.failed++
|
|
613
|
-
|
|
615
|
+
log.error(` Task ${task.name} failed: ${err.message}`)
|
|
614
616
|
|
|
615
617
|
// 发送统一的通知事件
|
|
616
618
|
this._framework.emit('notification', {
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
const { Plugin } = require('../src/core/plugin-base')
|
|
7
|
+
const { logger } = require('../src/utils/logger')
|
|
8
|
+
const log = logger.child('Session')
|
|
7
9
|
const { z } = require('zod')
|
|
8
10
|
const { EventEmitter } = require('events')
|
|
9
11
|
|
|
@@ -345,7 +347,7 @@ class SessionPlugin extends Plugin {
|
|
|
345
347
|
this._cleanupTimer = setInterval(() => {
|
|
346
348
|
const cleaned = this.cleanup()
|
|
347
349
|
if (cleaned > 0) {
|
|
348
|
-
|
|
350
|
+
log.info(` Cleaned up ${cleaned} expired sessions`)
|
|
349
351
|
}
|
|
350
352
|
}, this.config.cleanupInterval)
|
|
351
353
|
}
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
const { Plugin } = require('../src/core/plugin-base')
|
|
7
|
+
const { logger } = require('../src/utils/logger')
|
|
8
|
+
const log = logger.child('Storage')
|
|
7
9
|
const { z } = require('zod')
|
|
8
10
|
const fs = require('fs')
|
|
9
11
|
const path = require('path')
|
|
@@ -193,9 +195,9 @@ class StoragePlugin extends Plugin {
|
|
|
193
195
|
this._store.set(key, entry)
|
|
194
196
|
}
|
|
195
197
|
|
|
196
|
-
|
|
198
|
+
log.info(` Loaded ${this._store.size} entries from ${this._filePath}`)
|
|
197
199
|
} catch (err) {
|
|
198
|
-
|
|
200
|
+
log.warn(` Failed to load storage file: ${err.message}`)
|
|
199
201
|
}
|
|
200
202
|
}
|
|
201
203
|
}
|
|
@@ -210,7 +212,7 @@ class StoragePlugin extends Plugin {
|
|
|
210
212
|
const data = Object.fromEntries(this._store)
|
|
211
213
|
fs.writeFileSync(this._filePath, JSON.stringify(data, null, 2), 'utf-8')
|
|
212
214
|
} catch (err) {
|
|
213
|
-
|
|
215
|
+
log.error(` Failed to persist: ${err.message}`)
|
|
214
216
|
}
|
|
215
217
|
}
|
|
216
218
|
|