foliko 2.0.23 → 2.0.24

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "foliko",
3
- "version": "2.0.23",
3
+ "version": "2.0.24",
4
4
  "description": "简约的插件化 Agent 框架",
5
5
  "main": "src/index.js",
6
6
  "type": "commonjs",
@@ -49,6 +49,7 @@ class SubAgentPlugin extends Plugin {
49
49
  }
50
50
 
51
51
  start(framework) {
52
+ this._framework = framework
52
53
  this._createSubAgent()
53
54
  this._registerDelegateTool()
54
55
  return this
@@ -59,7 +60,7 @@ class SubAgentPlugin extends Plugin {
59
60
  if (!parentAgent) {
60
61
  if (this._framework) {
61
62
  this._framework.on('agent:created', (agent) => {
62
- if (this._framework._mainAgent && agent === this._framework._mainAgent) {
63
+ if (this._framework && this._framework._mainAgent && agent === this._framework._mainAgent) {
63
64
  this._parentAgent = agent
64
65
  this._doCreateSubAgent(agent)
65
66
  this._registerDelegateTool()
@@ -117,9 +118,11 @@ class SubAgentPlugin extends Plugin {
117
118
  return this._framework._mainAgent
118
119
  }
119
120
 
121
+ // 只有 MainAgent 才能作为 parent,不要返回 SubAgent
120
122
  const agents = this._framework._agents || []
121
- if (agents.length > 0) {
122
- return agents[agents.length - 1]
123
+ const mainAgent = agents.find(a => a.constructor.name === 'MainAgent')
124
+ if (mainAgent) {
125
+ return mainAgent
123
126
  }
124
127
 
125
128
  return null
@@ -515,7 +518,7 @@ class SubAgentManagerPlugin extends Plugin {
515
518
 
516
519
  framework.registerTool({
517
520
  name: 'subagent_call',
518
- description: '调用指定的子Agent处理任务',
521
+ description: '【首选】委托任务给指定的子Agent处理。根据子Agent匹配表选择合适的Agent,用此工具调用。禁止用chat工具代替。',
519
522
  inputSchema: z.object({
520
523
  agentName: z.string().describe('子Agent名称'),
521
524
  task: z.string().describe('任务描述')
@@ -763,6 +766,7 @@ class SubAgentManagerPlugin extends Plugin {
763
766
  }
764
767
 
765
768
  reload(framework) {
769
+ super.reload(framework); // 设置 this._framework,清理 prompts
766
770
  for (const plugin of this._subAgents.values()) {
767
771
  plugin.uninstall(framework)
768
772
  }
@@ -45,7 +45,7 @@ class FileSystemPlugin extends Plugin {
45
45
 
46
46
  this.tool.register({
47
47
  name: 'chat',
48
- description: ' AI 进行对话(通过临时子 Agent)。返回 LLM 的 message 文本。',
48
+ description: '【最后手段】仅当需要独立分析、复杂推理或多轮思考时使用。子 Agent 和工具能完成的任务,禁止调用此工具。',
49
49
  inputSchema: z.object({
50
50
  message: z.string().describe('要发送的消息'),
51
51
  systemPrompt: z.string().optional().describe('系统提示语'),
@@ -51,10 +51,10 @@ const DEFAULT_MAX_MESSAGES_PER_SESSION = 1000;
51
51
  // ============================================================================
52
52
 
53
53
  /** 保留最近的 N 条消息 */
54
- const KEEP_RECENT_MESSAGES = 20;
54
+ const KEEP_RECENT_MESSAGES = 50;
55
55
 
56
56
  /** 压缩消息数量阈值 */
57
- const COMPRESSION_MESSAGE_THRESHOLD = 200;
57
+ const COMPRESSION_MESSAGE_THRESHOLD = 500;
58
58
 
59
59
  /** 智能压缩启用 */
60
60
  const ENABLE_SMART_COMPRESS = true;
@@ -854,10 +854,11 @@ class Plugin {
854
854
  // 解析文件路径:相对路径基于插件文件目录,绝对路径直接用
855
855
  let fullPath = filePath;
856
856
  if (!path.isAbsolute(filePath)) {
857
- // 优先使用插件实例的 sourcePath(更可靠)
857
+ // 优先使用 pluginManager 中存储的 sourcePath(最可靠)
858
858
  let pluginDir = null;
859
- if (this.sourcePath) {
860
- pluginDir = path.dirname(path.resolve(this.sourcePath));
859
+ const pmEntry = this._framework?.pluginManager?.get?.(this.name);
860
+ if (pmEntry?.sourcePath) {
861
+ pluginDir = path.dirname(path.resolve(pmEntry.sourcePath));
861
862
  }
862
863
  // 备用:使用栈追踪获取插件文件路径
863
864
  if (!pluginDir) {