openvibe 0.63.2 → 0.63.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/CHANGELOG.md +81 -0
- package/README.md +39 -0
- package/README_CN.md +1 -1
- package/dist/cli/args.d.ts +3 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +22 -2
- package/dist/cli/args.js.map +1 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +5 -3
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/companion/executor/bash-executor.d.ts +30 -0
- package/dist/core/companion/executor/bash-executor.d.ts.map +1 -0
- package/dist/core/companion/executor/bash-executor.js +105 -0
- package/dist/core/companion/executor/bash-executor.js.map +1 -0
- package/dist/core/companion/executor/code-executor.d.ts +33 -0
- package/dist/core/companion/executor/code-executor.d.ts.map +1 -0
- package/dist/core/companion/executor/code-executor.js +144 -0
- package/dist/core/companion/executor/code-executor.js.map +1 -0
- package/dist/core/companion/executor/resource-monitor.d.ts +55 -0
- package/dist/core/companion/executor/resource-monitor.d.ts.map +1 -0
- package/dist/core/companion/executor/resource-monitor.js +141 -0
- package/dist/core/companion/executor/resource-monitor.js.map +1 -0
- package/dist/core/companion/http-server.d.ts +92 -0
- package/dist/core/companion/http-server.d.ts.map +1 -0
- package/dist/core/companion/http-server.js +229 -0
- package/dist/core/companion/http-server.js.map +1 -0
- package/dist/core/companion/index.d.ts +29 -0
- package/dist/core/companion/index.d.ts.map +1 -0
- package/dist/core/companion/index.js +48 -0
- package/dist/core/companion/index.js.map +1 -0
- package/dist/core/companion/scheduler/resource-scheduler.d.ts +82 -0
- package/dist/core/companion/scheduler/resource-scheduler.d.ts.map +1 -0
- package/dist/core/companion/scheduler/resource-scheduler.js +333 -0
- package/dist/core/companion/scheduler/resource-scheduler.js.map +1 -0
- package/dist/core/companion/scheduler/workers/base-worker.d.ts +87 -0
- package/dist/core/companion/scheduler/workers/base-worker.d.ts.map +1 -0
- package/dist/core/companion/scheduler/workers/base-worker.js +70 -0
- package/dist/core/companion/scheduler/workers/base-worker.js.map +1 -0
- package/dist/core/companion/scheduler/workers/cpu-worker.d.ts +12 -0
- package/dist/core/companion/scheduler/workers/cpu-worker.d.ts.map +1 -0
- package/dist/core/companion/scheduler/workers/cpu-worker.js +134 -0
- package/dist/core/companion/scheduler/workers/cpu-worker.js.map +1 -0
- package/dist/core/companion/scheduler/workers/gpu-worker.d.ts +16 -0
- package/dist/core/companion/scheduler/workers/gpu-worker.d.ts.map +1 -0
- package/dist/core/companion/scheduler/workers/gpu-worker.js +167 -0
- package/dist/core/companion/scheduler/workers/gpu-worker.js.map +1 -0
- package/dist/core/companion/scheduler/workers/index.d.ts +6 -0
- package/dist/core/companion/scheduler/workers/index.d.ts.map +1 -0
- package/dist/core/companion/scheduler/workers/index.js +6 -0
- package/dist/core/companion/scheduler/workers/index.js.map +1 -0
- package/dist/core/companion/scheduler/workers/io-worker.d.ts +17 -0
- package/dist/core/companion/scheduler/workers/io-worker.d.ts.map +1 -0
- package/dist/core/companion/scheduler/workers/io-worker.js +197 -0
- package/dist/core/companion/scheduler/workers/io-worker.js.map +1 -0
- package/dist/core/companion/scheduler/workers/network-worker.d.ts +13 -0
- package/dist/core/companion/scheduler/workers/network-worker.d.ts.map +1 -0
- package/dist/core/companion/scheduler/workers/network-worker.js +167 -0
- package/dist/core/companion/scheduler/workers/network-worker.js.map +1 -0
- package/dist/core/companion/security/security-manager.d.ts +50 -0
- package/dist/core/companion/security/security-manager.d.ts.map +1 -0
- package/dist/core/companion/security/security-manager.js +102 -0
- package/dist/core/companion/security/security-manager.js.map +1 -0
- package/dist/core/hybrid-cloud/extension.d.ts +8 -0
- package/dist/core/hybrid-cloud/extension.d.ts.map +1 -0
- package/dist/core/hybrid-cloud/extension.js +64 -0
- package/dist/core/hybrid-cloud/extension.js.map +1 -0
- package/dist/core/hybrid-cloud/index.d.ts +98 -0
- package/dist/core/hybrid-cloud/index.d.ts.map +1 -0
- package/dist/core/hybrid-cloud/index.js +211 -0
- package/dist/core/hybrid-cloud/index.js.map +1 -0
- package/dist/core/keybindings.d.ts +1 -1
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +3 -1
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +6 -1
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +13 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +35 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +7 -0
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +46 -0
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/todo-manager.d.ts +32 -0
- package/dist/core/todo-manager.d.ts.map +1 -0
- package/dist/core/todo-manager.js +117 -0
- package/dist/core/todo-manager.js.map +1 -0
- package/dist/core/tools/batch-write.d.ts +42 -0
- package/dist/core/tools/batch-write.d.ts.map +1 -0
- package/dist/core/tools/batch-write.js +267 -0
- package/dist/core/tools/batch-write.js.map +1 -0
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +10 -2
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/fast-executor.d.ts +6 -1
- package/dist/core/tools/fast-executor.d.ts.map +1 -1
- package/dist/core/tools/fast-executor.js +83 -4
- package/dist/core/tools/fast-executor.js.map +1 -1
- package/dist/core/tools/index.d.ts +141 -0
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +30 -0
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/todo.d.ts +47 -0
- package/dist/core/tools/todo.d.ts.map +1 -0
- package/dist/core/tools/todo.js +212 -0
- package/dist/core/tools/todo.js.map +1 -0
- package/dist/core/tools/unified.d.ts +121 -0
- package/dist/core/tools/unified.d.ts.map +1 -0
- package/dist/core/tools/unified.js +481 -0
- package/dist/core/tools/unified.js.map +1 -0
- package/dist/core/tools/write.d.ts +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +20 -5
- package/dist/core/tools/write.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +63 -1
- package/dist/main.js.map +1 -1
- package/dist/modes/index.d.ts +2 -0
- package/dist/modes/index.d.ts.map +1 -1
- package/dist/modes/index.js +2 -0
- package/dist/modes/index.js.map +1 -1
- package/dist/modes/interactive/components/index.d.ts +1 -0
- package/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/index.js +1 -0
- package/dist/modes/interactive/components/index.js.map +1 -1
- package/dist/modes/interactive/components/todo-display.d.ts +9 -0
- package/dist/modes/interactive/components/todo-display.d.ts.map +1 -0
- package/dist/modes/interactive/components/todo-display.js +60 -0
- package/dist/modes/interactive/components/todo-display.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +8 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +151 -0
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/plan-mode.d.ts +14 -0
- package/dist/modes/plan-mode.d.ts.map +1 -0
- package/dist/modes/plan-mode.js +107 -0
- package/dist/modes/plan-mode.js.map +1 -0
- package/dist/modes/spec-mode.d.ts +16 -0
- package/dist/modes/spec-mode.d.ts.map +1 -0
- package/dist/modes/spec-mode.js +186 -0
- package/dist/modes/spec-mode.js.map +1 -0
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +2 -2
- package/dist/utils/version-check.js.map +1 -1
- package/docs/HYBRID_CLOUD_README.md +188 -0
- package/docs/hybrid-architecture-design.md +317 -0
- package/docs/todo.md +71 -0
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/custom-provider-qwen-cli/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { AgentSession } from "../core/agent-session.js";
|
|
2
|
+
export interface PlanModeOptions {
|
|
3
|
+
/** 初始提示词或问题 */
|
|
4
|
+
initialPrompt?: string;
|
|
5
|
+
/** 是否使用 JSON 输出 */
|
|
6
|
+
jsonOutput?: boolean;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Plan Mode - 规划模式
|
|
10
|
+
* 专注于项目规划、任务分解和架构设计
|
|
11
|
+
* 提供结构化的规划提示词和输出格式
|
|
12
|
+
*/
|
|
13
|
+
export declare function runPlanMode(session: AgentSession, options?: PlanModeOptions): Promise<void>;
|
|
14
|
+
//# sourceMappingURL=plan-mode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-mode.d.ts","sourceRoot":"","sources":["../../src/modes/plan-mode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,WAAW,eAAe;IAC/B,+BAAe;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+BAAmB;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwGrG","sourcesContent":["import type { AgentSession } from \"../core/agent-session.js\";\n\nexport interface PlanModeOptions {\n\t/** 初始提示词或问题 */\n\tinitialPrompt?: string;\n\t/** 是否使用 JSON 输出 */\n\tjsonOutput?: boolean;\n}\n\n/**\n * Plan Mode - 规划模式\n * 专注于项目规划、任务分解和架构设计\n * 提供结构化的规划提示词和输出格式\n */\nexport async function runPlanMode(session: AgentSession, options: PlanModeOptions = {}): Promise<void> {\n\tconst { initialPrompt, jsonOutput = false } = options;\n\n\t// Plan Mode 专属系统提示词\n\tconst planModeSystemPrompt = `You are in PLAN MODE - a specialized mode for project planning, task breakdown, and architectural design.\n\n## Your Role\nYou are an expert software architect and project planner. Your goal is to help users:\n- Break down complex projects into manageable tasks\n- Design system architectures and component structures\n- Create detailed technical specifications\n- Identify dependencies and potential risks\n- Estimate effort and prioritize work items\n\n## Output Format\nAlways structure your responses with:\n\n1. **Project Overview** - High-level description of what needs to be built\n2. **Requirements Analysis** - Functional and non-functional requirements\n3. **Architecture Design** - System components, data flow, technology stack\n4. **Task Breakdown** - Hierarchical task list with dependencies\n5. **Implementation Plan** - Phased approach with milestones\n6. **Risk Assessment** - Potential challenges and mitigation strategies\n\n## Task Structure\nEach task should include:\n- Task ID (e.g., T001)\n- Title and description\n- Acceptance criteria\n- Estimated complexity (S/M/L/XL)\n- Dependencies (blocked by / blocks)\n- Priority (P0/P1/P2)\n\n## Planning Principles\n- Be specific and actionable\n- Consider edge cases and error handling\n- Account for testing and documentation\n- Include deployment and monitoring considerations\n- Suggest iterative delivery where possible\n\n## Mode Indicator\nAlways start your response with: \"📋 [PLAN MODE]\" to remind the user of the current mode.\n\nRemember: Focus on planning and design, not implementation details. Save coding for later phases.`;\n\n\t// 设置 Plan Mode 的系统提示词\n\tsession.agent.setSystemPrompt(planModeSystemPrompt);\n\n\t// 绑定扩展\n\tawait session.bindExtensions({\n\t\tcommandContextActions: {\n\t\t\twaitForIdle: () => session.agent.waitForIdle(),\n\t\t\tnewSession: async (options) => {\n\t\t\t\tconst success = await session.newSession({ parentSession: options?.parentSession });\n\t\t\t\tif (success && options?.setup) {\n\t\t\t\t\tawait options.setup(session.sessionManager);\n\t\t\t\t}\n\t\t\t\treturn { cancelled: !success };\n\t\t\t},\n\t\t\tfork: async (entryId) => {\n\t\t\t\tconst result = await session.fork(entryId);\n\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t},\n\t\t\tnavigateTree: async (targetId, options) => {\n\t\t\t\tconst result = await session.navigateTree(targetId, {\n\t\t\t\t\tsummarize: options?.summarize,\n\t\t\t\t\tcustomInstructions: options?.customInstructions,\n\t\t\t\t\treplaceInstructions: options?.replaceInstructions,\n\t\t\t\t\tlabel: options?.label,\n\t\t\t\t});\n\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t},\n\t\t\tswitchSession: async (sessionPath) => {\n\t\t\t\tconst success = await session.switchSession(sessionPath);\n\t\t\t\treturn { cancelled: !success };\n\t\t\t},\n\t\t\treload: async () => {\n\t\t\t\tawait session.reload();\n\t\t\t},\n\t\t},\n\t\tonError: (err) => {\n\t\t\tconsole.error(`Extension error (${err.extensionPath}): ${err.error}`);\n\t\t},\n\t});\n\n\t// 订阅会话事件\n\tsession.subscribe((event) => {\n\t\tif (jsonOutput) {\n\t\t\tconsole.log(JSON.stringify(event));\n\t\t}\n\t});\n\n\t// 如果有初始提示词,发送请求\n\tif (initialPrompt) {\n\t\tawait session.prompt(initialPrompt);\n\t}\n\n\t// 等待所有输出完成\n\tawait new Promise<void>((resolve, reject) => {\n\t\tprocess.stdout.write(\"\", (err) => {\n\t\t\tif (err) reject(err);\n\t\t\telse resolve();\n\t\t});\n\t});\n}\n"]}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plan Mode - 规划模式
|
|
3
|
+
* 专注于项目规划、任务分解和架构设计
|
|
4
|
+
* 提供结构化的规划提示词和输出格式
|
|
5
|
+
*/
|
|
6
|
+
export async function runPlanMode(session, options = {}) {
|
|
7
|
+
const { initialPrompt, jsonOutput = false } = options;
|
|
8
|
+
// Plan Mode 专属系统提示词
|
|
9
|
+
const planModeSystemPrompt = `You are in PLAN MODE - a specialized mode for project planning, task breakdown, and architectural design.
|
|
10
|
+
|
|
11
|
+
## Your Role
|
|
12
|
+
You are an expert software architect and project planner. Your goal is to help users:
|
|
13
|
+
- Break down complex projects into manageable tasks
|
|
14
|
+
- Design system architectures and component structures
|
|
15
|
+
- Create detailed technical specifications
|
|
16
|
+
- Identify dependencies and potential risks
|
|
17
|
+
- Estimate effort and prioritize work items
|
|
18
|
+
|
|
19
|
+
## Output Format
|
|
20
|
+
Always structure your responses with:
|
|
21
|
+
|
|
22
|
+
1. **Project Overview** - High-level description of what needs to be built
|
|
23
|
+
2. **Requirements Analysis** - Functional and non-functional requirements
|
|
24
|
+
3. **Architecture Design** - System components, data flow, technology stack
|
|
25
|
+
4. **Task Breakdown** - Hierarchical task list with dependencies
|
|
26
|
+
5. **Implementation Plan** - Phased approach with milestones
|
|
27
|
+
6. **Risk Assessment** - Potential challenges and mitigation strategies
|
|
28
|
+
|
|
29
|
+
## Task Structure
|
|
30
|
+
Each task should include:
|
|
31
|
+
- Task ID (e.g., T001)
|
|
32
|
+
- Title and description
|
|
33
|
+
- Acceptance criteria
|
|
34
|
+
- Estimated complexity (S/M/L/XL)
|
|
35
|
+
- Dependencies (blocked by / blocks)
|
|
36
|
+
- Priority (P0/P1/P2)
|
|
37
|
+
|
|
38
|
+
## Planning Principles
|
|
39
|
+
- Be specific and actionable
|
|
40
|
+
- Consider edge cases and error handling
|
|
41
|
+
- Account for testing and documentation
|
|
42
|
+
- Include deployment and monitoring considerations
|
|
43
|
+
- Suggest iterative delivery where possible
|
|
44
|
+
|
|
45
|
+
## Mode Indicator
|
|
46
|
+
Always start your response with: "📋 [PLAN MODE]" to remind the user of the current mode.
|
|
47
|
+
|
|
48
|
+
Remember: Focus on planning and design, not implementation details. Save coding for later phases.`;
|
|
49
|
+
// 设置 Plan Mode 的系统提示词
|
|
50
|
+
session.agent.setSystemPrompt(planModeSystemPrompt);
|
|
51
|
+
// 绑定扩展
|
|
52
|
+
await session.bindExtensions({
|
|
53
|
+
commandContextActions: {
|
|
54
|
+
waitForIdle: () => session.agent.waitForIdle(),
|
|
55
|
+
newSession: async (options) => {
|
|
56
|
+
const success = await session.newSession({ parentSession: options?.parentSession });
|
|
57
|
+
if (success && options?.setup) {
|
|
58
|
+
await options.setup(session.sessionManager);
|
|
59
|
+
}
|
|
60
|
+
return { cancelled: !success };
|
|
61
|
+
},
|
|
62
|
+
fork: async (entryId) => {
|
|
63
|
+
const result = await session.fork(entryId);
|
|
64
|
+
return { cancelled: result.cancelled };
|
|
65
|
+
},
|
|
66
|
+
navigateTree: async (targetId, options) => {
|
|
67
|
+
const result = await session.navigateTree(targetId, {
|
|
68
|
+
summarize: options?.summarize,
|
|
69
|
+
customInstructions: options?.customInstructions,
|
|
70
|
+
replaceInstructions: options?.replaceInstructions,
|
|
71
|
+
label: options?.label,
|
|
72
|
+
});
|
|
73
|
+
return { cancelled: result.cancelled };
|
|
74
|
+
},
|
|
75
|
+
switchSession: async (sessionPath) => {
|
|
76
|
+
const success = await session.switchSession(sessionPath);
|
|
77
|
+
return { cancelled: !success };
|
|
78
|
+
},
|
|
79
|
+
reload: async () => {
|
|
80
|
+
await session.reload();
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
onError: (err) => {
|
|
84
|
+
console.error(`Extension error (${err.extensionPath}): ${err.error}`);
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
// 订阅会话事件
|
|
88
|
+
session.subscribe((event) => {
|
|
89
|
+
if (jsonOutput) {
|
|
90
|
+
console.log(JSON.stringify(event));
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
// 如果有初始提示词,发送请求
|
|
94
|
+
if (initialPrompt) {
|
|
95
|
+
await session.prompt(initialPrompt);
|
|
96
|
+
}
|
|
97
|
+
// 等待所有输出完成
|
|
98
|
+
await new Promise((resolve, reject) => {
|
|
99
|
+
process.stdout.write("", (err) => {
|
|
100
|
+
if (err)
|
|
101
|
+
reject(err);
|
|
102
|
+
else
|
|
103
|
+
resolve();
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=plan-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-mode.js","sourceRoot":"","sources":["../../src/modes/plan-mode.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentSession } from \"../core/agent-session.js\";\n\nexport interface PlanModeOptions {\n\t/** 初始提示词或问题 */\n\tinitialPrompt?: string;\n\t/** 是否使用 JSON 输出 */\n\tjsonOutput?: boolean;\n}\n\n/**\n * Plan Mode - 规划模式\n * 专注于项目规划、任务分解和架构设计\n * 提供结构化的规划提示词和输出格式\n */\nexport async function runPlanMode(session: AgentSession, options: PlanModeOptions = {}): Promise<void> {\n\tconst { initialPrompt, jsonOutput = false } = options;\n\n\t// Plan Mode 专属系统提示词\n\tconst planModeSystemPrompt = `You are in PLAN MODE - a specialized mode for project planning, task breakdown, and architectural design.\n\n## Your Role\nYou are an expert software architect and project planner. Your goal is to help users:\n- Break down complex projects into manageable tasks\n- Design system architectures and component structures\n- Create detailed technical specifications\n- Identify dependencies and potential risks\n- Estimate effort and prioritize work items\n\n## Output Format\nAlways structure your responses with:\n\n1. **Project Overview** - High-level description of what needs to be built\n2. **Requirements Analysis** - Functional and non-functional requirements\n3. **Architecture Design** - System components, data flow, technology stack\n4. **Task Breakdown** - Hierarchical task list with dependencies\n5. **Implementation Plan** - Phased approach with milestones\n6. **Risk Assessment** - Potential challenges and mitigation strategies\n\n## Task Structure\nEach task should include:\n- Task ID (e.g., T001)\n- Title and description\n- Acceptance criteria\n- Estimated complexity (S/M/L/XL)\n- Dependencies (blocked by / blocks)\n- Priority (P0/P1/P2)\n\n## Planning Principles\n- Be specific and actionable\n- Consider edge cases and error handling\n- Account for testing and documentation\n- Include deployment and monitoring considerations\n- Suggest iterative delivery where possible\n\n## Mode Indicator\nAlways start your response with: \"📋 [PLAN MODE]\" to remind the user of the current mode.\n\nRemember: Focus on planning and design, not implementation details. Save coding for later phases.`;\n\n\t// 设置 Plan Mode 的系统提示词\n\tsession.agent.setSystemPrompt(planModeSystemPrompt);\n\n\t// 绑定扩展\n\tawait session.bindExtensions({\n\t\tcommandContextActions: {\n\t\t\twaitForIdle: () => session.agent.waitForIdle(),\n\t\t\tnewSession: async (options) => {\n\t\t\t\tconst success = await session.newSession({ parentSession: options?.parentSession });\n\t\t\t\tif (success && options?.setup) {\n\t\t\t\t\tawait options.setup(session.sessionManager);\n\t\t\t\t}\n\t\t\t\treturn { cancelled: !success };\n\t\t\t},\n\t\t\tfork: async (entryId) => {\n\t\t\t\tconst result = await session.fork(entryId);\n\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t},\n\t\t\tnavigateTree: async (targetId, options) => {\n\t\t\t\tconst result = await session.navigateTree(targetId, {\n\t\t\t\t\tsummarize: options?.summarize,\n\t\t\t\t\tcustomInstructions: options?.customInstructions,\n\t\t\t\t\treplaceInstructions: options?.replaceInstructions,\n\t\t\t\t\tlabel: options?.label,\n\t\t\t\t});\n\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t},\n\t\t\tswitchSession: async (sessionPath) => {\n\t\t\t\tconst success = await session.switchSession(sessionPath);\n\t\t\t\treturn { cancelled: !success };\n\t\t\t},\n\t\t\treload: async () => {\n\t\t\t\tawait session.reload();\n\t\t\t},\n\t\t},\n\t\tonError: (err) => {\n\t\t\tconsole.error(`Extension error (${err.extensionPath}): ${err.error}`);\n\t\t},\n\t});\n\n\t// 订阅会话事件\n\tsession.subscribe((event) => {\n\t\tif (jsonOutput) {\n\t\t\tconsole.log(JSON.stringify(event));\n\t\t}\n\t});\n\n\t// 如果有初始提示词,发送请求\n\tif (initialPrompt) {\n\t\tawait session.prompt(initialPrompt);\n\t}\n\n\t// 等待所有输出完成\n\tawait new Promise<void>((resolve, reject) => {\n\t\tprocess.stdout.write(\"\", (err) => {\n\t\t\tif (err) reject(err);\n\t\t\telse resolve();\n\t\t});\n\t});\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { AgentSession } from "../core/agent-session.js";
|
|
2
|
+
export interface SpecModeOptions {
|
|
3
|
+
/** 初始需求描述 */
|
|
4
|
+
initialRequirement?: string;
|
|
5
|
+
/** 是否使用 JSON 输出 */
|
|
6
|
+
jsonOutput?: boolean;
|
|
7
|
+
/** 规范类型:functional(功能规范) / technical(技术规范) / api(API 规范) */
|
|
8
|
+
specType?: "functional" | "technical" | "api";
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Spec Mode - 规范模式
|
|
12
|
+
* 专注于编写详细的技术规范、API 文档和功能说明
|
|
13
|
+
* 提供结构化的规范文档模板和最佳实践
|
|
14
|
+
*/
|
|
15
|
+
export declare function runSpecMode(session: AgentSession, options?: SpecModeOptions): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=spec-mode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-mode.d.ts","sourceRoot":"","sources":["../../src/modes/spec-mode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,WAAW,eAAe;IAC/B,yBAAa;IACb,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,+BAAmB;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,0FAA4D;IAC5D,QAAQ,CAAC,EAAE,YAAY,GAAG,WAAW,GAAG,KAAK,CAAC;CAC9C;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuLrG","sourcesContent":["import type { AgentSession } from \"../core/agent-session.js\";\n\nexport interface SpecModeOptions {\n\t/** 初始需求描述 */\n\tinitialRequirement?: string;\n\t/** 是否使用 JSON 输出 */\n\tjsonOutput?: boolean;\n\t/** 规范类型:functional(功能规范) / technical(技术规范) / api(API 规范) */\n\tspecType?: \"functional\" | \"technical\" | \"api\";\n}\n\n/**\n * Spec Mode - 规范模式\n * 专注于编写详细的技术规范、API 文档和功能说明\n * 提供结构化的规范文档模板和最佳实践\n */\nexport async function runSpecMode(session: AgentSession, options: SpecModeOptions = {}): Promise<void> {\n\tconst { initialRequirement, jsonOutput = false, specType = \"functional\" } = options;\n\n\t// Spec Mode 专属系统提示词\n\tconst specModeSystemPrompt = `You are in SPEC MODE - a specialized mode for writing detailed technical specifications and documentation.\n\n## Your Role\nYou are a senior technical writer and system architect. Your goal is to help users create:\n- Comprehensive functional specifications\n- Detailed technical design documents\n- Clear API documentation\n- User stories and acceptance criteria\n- System interface definitions\n\n## Specification Types\n\n### Functional Specification (functional)\nFocus on WHAT the system should do:\n- User stories and use cases\n- Business requirements\n- User interface mockups (text-based)\n- Workflow diagrams\n- Acceptance criteria\n\n### Technical Specification (technical)\nFocus on HOW the system will work:\n- System architecture\n- Data models and schemas\n- Component interfaces\n- Database design\n- Performance requirements\n- Security considerations\n\n### API Specification (api)\nFocus on integration contracts:\n- Endpoint definitions\n- Request/response schemas\n- Authentication methods\n- Error handling\n- Rate limiting\n- Versioning strategy\n\n## Output Structure\n\nAlways organize specifications with:\n\n1. **Introduction**\n - Purpose and scope\n - Definitions and acronyms\n - References\n\n2. **Overview**\n - System context\n - Assumptions and dependencies\n - Constraints\n\n3. **Detailed Requirements**\n - Use hierarchical numbering (1.1, 1.2, etc.)\n - Include rationale for key decisions\n - Mark requirements as [MUST], [SHOULD], or [COULD]\n\n4. **Diagrams** (ASCII/text-based)\n - Component diagrams\n - Sequence diagrams\n - Data flow diagrams\n\n5. **Appendices**\n - Glossary\n - Related documents\n - Revision history\n\n## Quality Criteria\nEvery specification should be:\n- **Clear**: Unambiguous language, defined terms\n- **Complete**: All scenarios covered\n- **Consistent**: No contradictions\n- **Testable**: Verifiable acceptance criteria\n- **Traceable**: Links to requirements\n\n## Notation Standards\n- Use [MUST] for mandatory requirements\n- Use [SHOULD] for recommended practices\n- Use [COULD] for optional features\n- Use [WILL NOT] for explicitly excluded items\n\n## Mode Indicator\nAlways start your response with: \"📐 [SPEC MODE]\" followed by the specification type.\n\nRemember: Good specifications answer questions before they're asked.`;\n\n\t// 根据规范类型调整提示词\n\tlet adjustedPrompt = specModeSystemPrompt;\n\n\tif (specType === \"functional\") {\n\t\tadjustedPrompt += `\n\n## Current Mode: FUNCTIONAL SPECIFICATION\nFocus on user-centric requirements and business logic.`;\n\t} else if (specType === \"technical\") {\n\t\tadjustedPrompt += `\n\n## Current Mode: TECHNICAL SPECIFICATION\nFocus on implementation details and system design.`;\n\t} else if (specType === \"api\") {\n\t\tadjustedPrompt += `\n\n## Current Mode: API SPECIFICATION\nFocus on interface contracts and integration points.\n\n### API Documentation Template\nFor each endpoint, include:\n- HTTP method and path\n- Description\n- Authentication required\n- Request headers\n- Path parameters\n- Query parameters\n- Request body schema\n- Response codes (2xx, 4xx, 5xx)\n- Response body schema\n- Example requests/responses\n- Error codes and meanings`;\n\t}\n\n\t// 设置 Spec Mode 的系统提示词\n\tsession.agent.setSystemPrompt(adjustedPrompt);\n\n\t// 绑定扩展\n\tawait session.bindExtensions({\n\t\tcommandContextActions: {\n\t\t\twaitForIdle: () => session.agent.waitForIdle(),\n\t\t\tnewSession: async (options) => {\n\t\t\t\tconst success = await session.newSession({ parentSession: options?.parentSession });\n\t\t\t\tif (success && options?.setup) {\n\t\t\t\t\tawait options.setup(session.sessionManager);\n\t\t\t\t}\n\t\t\t\treturn { cancelled: !success };\n\t\t\t},\n\t\t\tfork: async (entryId) => {\n\t\t\t\tconst result = await session.fork(entryId);\n\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t},\n\t\t\tnavigateTree: async (targetId, options) => {\n\t\t\t\tconst result = await session.navigateTree(targetId, {\n\t\t\t\t\tsummarize: options?.summarize,\n\t\t\t\t\tcustomInstructions: options?.customInstructions,\n\t\t\t\t\treplaceInstructions: options?.replaceInstructions,\n\t\t\t\t\tlabel: options?.label,\n\t\t\t\t});\n\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t},\n\t\t\tswitchSession: async (sessionPath) => {\n\t\t\t\tconst success = await session.switchSession(sessionPath);\n\t\t\t\treturn { cancelled: !success };\n\t\t\t},\n\t\t\treload: async () => {\n\t\t\t\tawait session.reload();\n\t\t\t},\n\t\t},\n\t\tonError: (err) => {\n\t\t\tconsole.error(`Extension error (${err.extensionPath}): ${err.error}`);\n\t\t},\n\t});\n\n\t// 订阅会话事件\n\tsession.subscribe((event) => {\n\t\tif (jsonOutput) {\n\t\t\tconsole.log(JSON.stringify(event));\n\t\t}\n\t});\n\n\t// 如果有初始需求,发送请求\n\tif (initialRequirement) {\n\t\tawait session.prompt(initialRequirement);\n\t}\n\n\t// 等待所有输出完成\n\tawait new Promise<void>((resolve, reject) => {\n\t\tprocess.stdout.write(\"\", (err) => {\n\t\t\tif (err) reject(err);\n\t\t\telse resolve();\n\t\t});\n\t});\n}\n"]}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spec Mode - 规范模式
|
|
3
|
+
* 专注于编写详细的技术规范、API 文档和功能说明
|
|
4
|
+
* 提供结构化的规范文档模板和最佳实践
|
|
5
|
+
*/
|
|
6
|
+
export async function runSpecMode(session, options = {}) {
|
|
7
|
+
const { initialRequirement, jsonOutput = false, specType = "functional" } = options;
|
|
8
|
+
// Spec Mode 专属系统提示词
|
|
9
|
+
const specModeSystemPrompt = `You are in SPEC MODE - a specialized mode for writing detailed technical specifications and documentation.
|
|
10
|
+
|
|
11
|
+
## Your Role
|
|
12
|
+
You are a senior technical writer and system architect. Your goal is to help users create:
|
|
13
|
+
- Comprehensive functional specifications
|
|
14
|
+
- Detailed technical design documents
|
|
15
|
+
- Clear API documentation
|
|
16
|
+
- User stories and acceptance criteria
|
|
17
|
+
- System interface definitions
|
|
18
|
+
|
|
19
|
+
## Specification Types
|
|
20
|
+
|
|
21
|
+
### Functional Specification (functional)
|
|
22
|
+
Focus on WHAT the system should do:
|
|
23
|
+
- User stories and use cases
|
|
24
|
+
- Business requirements
|
|
25
|
+
- User interface mockups (text-based)
|
|
26
|
+
- Workflow diagrams
|
|
27
|
+
- Acceptance criteria
|
|
28
|
+
|
|
29
|
+
### Technical Specification (technical)
|
|
30
|
+
Focus on HOW the system will work:
|
|
31
|
+
- System architecture
|
|
32
|
+
- Data models and schemas
|
|
33
|
+
- Component interfaces
|
|
34
|
+
- Database design
|
|
35
|
+
- Performance requirements
|
|
36
|
+
- Security considerations
|
|
37
|
+
|
|
38
|
+
### API Specification (api)
|
|
39
|
+
Focus on integration contracts:
|
|
40
|
+
- Endpoint definitions
|
|
41
|
+
- Request/response schemas
|
|
42
|
+
- Authentication methods
|
|
43
|
+
- Error handling
|
|
44
|
+
- Rate limiting
|
|
45
|
+
- Versioning strategy
|
|
46
|
+
|
|
47
|
+
## Output Structure
|
|
48
|
+
|
|
49
|
+
Always organize specifications with:
|
|
50
|
+
|
|
51
|
+
1. **Introduction**
|
|
52
|
+
- Purpose and scope
|
|
53
|
+
- Definitions and acronyms
|
|
54
|
+
- References
|
|
55
|
+
|
|
56
|
+
2. **Overview**
|
|
57
|
+
- System context
|
|
58
|
+
- Assumptions and dependencies
|
|
59
|
+
- Constraints
|
|
60
|
+
|
|
61
|
+
3. **Detailed Requirements**
|
|
62
|
+
- Use hierarchical numbering (1.1, 1.2, etc.)
|
|
63
|
+
- Include rationale for key decisions
|
|
64
|
+
- Mark requirements as [MUST], [SHOULD], or [COULD]
|
|
65
|
+
|
|
66
|
+
4. **Diagrams** (ASCII/text-based)
|
|
67
|
+
- Component diagrams
|
|
68
|
+
- Sequence diagrams
|
|
69
|
+
- Data flow diagrams
|
|
70
|
+
|
|
71
|
+
5. **Appendices**
|
|
72
|
+
- Glossary
|
|
73
|
+
- Related documents
|
|
74
|
+
- Revision history
|
|
75
|
+
|
|
76
|
+
## Quality Criteria
|
|
77
|
+
Every specification should be:
|
|
78
|
+
- **Clear**: Unambiguous language, defined terms
|
|
79
|
+
- **Complete**: All scenarios covered
|
|
80
|
+
- **Consistent**: No contradictions
|
|
81
|
+
- **Testable**: Verifiable acceptance criteria
|
|
82
|
+
- **Traceable**: Links to requirements
|
|
83
|
+
|
|
84
|
+
## Notation Standards
|
|
85
|
+
- Use [MUST] for mandatory requirements
|
|
86
|
+
- Use [SHOULD] for recommended practices
|
|
87
|
+
- Use [COULD] for optional features
|
|
88
|
+
- Use [WILL NOT] for explicitly excluded items
|
|
89
|
+
|
|
90
|
+
## Mode Indicator
|
|
91
|
+
Always start your response with: "📐 [SPEC MODE]" followed by the specification type.
|
|
92
|
+
|
|
93
|
+
Remember: Good specifications answer questions before they're asked.`;
|
|
94
|
+
// 根据规范类型调整提示词
|
|
95
|
+
let adjustedPrompt = specModeSystemPrompt;
|
|
96
|
+
if (specType === "functional") {
|
|
97
|
+
adjustedPrompt += `
|
|
98
|
+
|
|
99
|
+
## Current Mode: FUNCTIONAL SPECIFICATION
|
|
100
|
+
Focus on user-centric requirements and business logic.`;
|
|
101
|
+
}
|
|
102
|
+
else if (specType === "technical") {
|
|
103
|
+
adjustedPrompt += `
|
|
104
|
+
|
|
105
|
+
## Current Mode: TECHNICAL SPECIFICATION
|
|
106
|
+
Focus on implementation details and system design.`;
|
|
107
|
+
}
|
|
108
|
+
else if (specType === "api") {
|
|
109
|
+
adjustedPrompt += `
|
|
110
|
+
|
|
111
|
+
## Current Mode: API SPECIFICATION
|
|
112
|
+
Focus on interface contracts and integration points.
|
|
113
|
+
|
|
114
|
+
### API Documentation Template
|
|
115
|
+
For each endpoint, include:
|
|
116
|
+
- HTTP method and path
|
|
117
|
+
- Description
|
|
118
|
+
- Authentication required
|
|
119
|
+
- Request headers
|
|
120
|
+
- Path parameters
|
|
121
|
+
- Query parameters
|
|
122
|
+
- Request body schema
|
|
123
|
+
- Response codes (2xx, 4xx, 5xx)
|
|
124
|
+
- Response body schema
|
|
125
|
+
- Example requests/responses
|
|
126
|
+
- Error codes and meanings`;
|
|
127
|
+
}
|
|
128
|
+
// 设置 Spec Mode 的系统提示词
|
|
129
|
+
session.agent.setSystemPrompt(adjustedPrompt);
|
|
130
|
+
// 绑定扩展
|
|
131
|
+
await session.bindExtensions({
|
|
132
|
+
commandContextActions: {
|
|
133
|
+
waitForIdle: () => session.agent.waitForIdle(),
|
|
134
|
+
newSession: async (options) => {
|
|
135
|
+
const success = await session.newSession({ parentSession: options?.parentSession });
|
|
136
|
+
if (success && options?.setup) {
|
|
137
|
+
await options.setup(session.sessionManager);
|
|
138
|
+
}
|
|
139
|
+
return { cancelled: !success };
|
|
140
|
+
},
|
|
141
|
+
fork: async (entryId) => {
|
|
142
|
+
const result = await session.fork(entryId);
|
|
143
|
+
return { cancelled: result.cancelled };
|
|
144
|
+
},
|
|
145
|
+
navigateTree: async (targetId, options) => {
|
|
146
|
+
const result = await session.navigateTree(targetId, {
|
|
147
|
+
summarize: options?.summarize,
|
|
148
|
+
customInstructions: options?.customInstructions,
|
|
149
|
+
replaceInstructions: options?.replaceInstructions,
|
|
150
|
+
label: options?.label,
|
|
151
|
+
});
|
|
152
|
+
return { cancelled: result.cancelled };
|
|
153
|
+
},
|
|
154
|
+
switchSession: async (sessionPath) => {
|
|
155
|
+
const success = await session.switchSession(sessionPath);
|
|
156
|
+
return { cancelled: !success };
|
|
157
|
+
},
|
|
158
|
+
reload: async () => {
|
|
159
|
+
await session.reload();
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
onError: (err) => {
|
|
163
|
+
console.error(`Extension error (${err.extensionPath}): ${err.error}`);
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
// 订阅会话事件
|
|
167
|
+
session.subscribe((event) => {
|
|
168
|
+
if (jsonOutput) {
|
|
169
|
+
console.log(JSON.stringify(event));
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
// 如果有初始需求,发送请求
|
|
173
|
+
if (initialRequirement) {
|
|
174
|
+
await session.prompt(initialRequirement);
|
|
175
|
+
}
|
|
176
|
+
// 等待所有输出完成
|
|
177
|
+
await new Promise((resolve, reject) => {
|
|
178
|
+
process.stdout.write("", (err) => {
|
|
179
|
+
if (err)
|
|
180
|
+
reject(err);
|
|
181
|
+
else
|
|
182
|
+
resolve();
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=spec-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-mode.js","sourceRoot":"","sources":["../../src/modes/spec-mode.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentSession } from \"../core/agent-session.js\";\n\nexport interface SpecModeOptions {\n\t/** 初始需求描述 */\n\tinitialRequirement?: string;\n\t/** 是否使用 JSON 输出 */\n\tjsonOutput?: boolean;\n\t/** 规范类型:functional(功能规范) / technical(技术规范) / api(API 规范) */\n\tspecType?: \"functional\" | \"technical\" | \"api\";\n}\n\n/**\n * Spec Mode - 规范模式\n * 专注于编写详细的技术规范、API 文档和功能说明\n * 提供结构化的规范文档模板和最佳实践\n */\nexport async function runSpecMode(session: AgentSession, options: SpecModeOptions = {}): Promise<void> {\n\tconst { initialRequirement, jsonOutput = false, specType = \"functional\" } = options;\n\n\t// Spec Mode 专属系统提示词\n\tconst specModeSystemPrompt = `You are in SPEC MODE - a specialized mode for writing detailed technical specifications and documentation.\n\n## Your Role\nYou are a senior technical writer and system architect. Your goal is to help users create:\n- Comprehensive functional specifications\n- Detailed technical design documents\n- Clear API documentation\n- User stories and acceptance criteria\n- System interface definitions\n\n## Specification Types\n\n### Functional Specification (functional)\nFocus on WHAT the system should do:\n- User stories and use cases\n- Business requirements\n- User interface mockups (text-based)\n- Workflow diagrams\n- Acceptance criteria\n\n### Technical Specification (technical)\nFocus on HOW the system will work:\n- System architecture\n- Data models and schemas\n- Component interfaces\n- Database design\n- Performance requirements\n- Security considerations\n\n### API Specification (api)\nFocus on integration contracts:\n- Endpoint definitions\n- Request/response schemas\n- Authentication methods\n- Error handling\n- Rate limiting\n- Versioning strategy\n\n## Output Structure\n\nAlways organize specifications with:\n\n1. **Introduction**\n - Purpose and scope\n - Definitions and acronyms\n - References\n\n2. **Overview**\n - System context\n - Assumptions and dependencies\n - Constraints\n\n3. **Detailed Requirements**\n - Use hierarchical numbering (1.1, 1.2, etc.)\n - Include rationale for key decisions\n - Mark requirements as [MUST], [SHOULD], or [COULD]\n\n4. **Diagrams** (ASCII/text-based)\n - Component diagrams\n - Sequence diagrams\n - Data flow diagrams\n\n5. **Appendices**\n - Glossary\n - Related documents\n - Revision history\n\n## Quality Criteria\nEvery specification should be:\n- **Clear**: Unambiguous language, defined terms\n- **Complete**: All scenarios covered\n- **Consistent**: No contradictions\n- **Testable**: Verifiable acceptance criteria\n- **Traceable**: Links to requirements\n\n## Notation Standards\n- Use [MUST] for mandatory requirements\n- Use [SHOULD] for recommended practices\n- Use [COULD] for optional features\n- Use [WILL NOT] for explicitly excluded items\n\n## Mode Indicator\nAlways start your response with: \"📐 [SPEC MODE]\" followed by the specification type.\n\nRemember: Good specifications answer questions before they're asked.`;\n\n\t// 根据规范类型调整提示词\n\tlet adjustedPrompt = specModeSystemPrompt;\n\n\tif (specType === \"functional\") {\n\t\tadjustedPrompt += `\n\n## Current Mode: FUNCTIONAL SPECIFICATION\nFocus on user-centric requirements and business logic.`;\n\t} else if (specType === \"technical\") {\n\t\tadjustedPrompt += `\n\n## Current Mode: TECHNICAL SPECIFICATION\nFocus on implementation details and system design.`;\n\t} else if (specType === \"api\") {\n\t\tadjustedPrompt += `\n\n## Current Mode: API SPECIFICATION\nFocus on interface contracts and integration points.\n\n### API Documentation Template\nFor each endpoint, include:\n- HTTP method and path\n- Description\n- Authentication required\n- Request headers\n- Path parameters\n- Query parameters\n- Request body schema\n- Response codes (2xx, 4xx, 5xx)\n- Response body schema\n- Example requests/responses\n- Error codes and meanings`;\n\t}\n\n\t// 设置 Spec Mode 的系统提示词\n\tsession.agent.setSystemPrompt(adjustedPrompt);\n\n\t// 绑定扩展\n\tawait session.bindExtensions({\n\t\tcommandContextActions: {\n\t\t\twaitForIdle: () => session.agent.waitForIdle(),\n\t\t\tnewSession: async (options) => {\n\t\t\t\tconst success = await session.newSession({ parentSession: options?.parentSession });\n\t\t\t\tif (success && options?.setup) {\n\t\t\t\t\tawait options.setup(session.sessionManager);\n\t\t\t\t}\n\t\t\t\treturn { cancelled: !success };\n\t\t\t},\n\t\t\tfork: async (entryId) => {\n\t\t\t\tconst result = await session.fork(entryId);\n\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t},\n\t\t\tnavigateTree: async (targetId, options) => {\n\t\t\t\tconst result = await session.navigateTree(targetId, {\n\t\t\t\t\tsummarize: options?.summarize,\n\t\t\t\t\tcustomInstructions: options?.customInstructions,\n\t\t\t\t\treplaceInstructions: options?.replaceInstructions,\n\t\t\t\t\tlabel: options?.label,\n\t\t\t\t});\n\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t},\n\t\t\tswitchSession: async (sessionPath) => {\n\t\t\t\tconst success = await session.switchSession(sessionPath);\n\t\t\t\treturn { cancelled: !success };\n\t\t\t},\n\t\t\treload: async () => {\n\t\t\t\tawait session.reload();\n\t\t\t},\n\t\t},\n\t\tonError: (err) => {\n\t\t\tconsole.error(`Extension error (${err.extensionPath}): ${err.error}`);\n\t\t},\n\t});\n\n\t// 订阅会话事件\n\tsession.subscribe((event) => {\n\t\tif (jsonOutput) {\n\t\t\tconsole.log(JSON.stringify(event));\n\t\t}\n\t});\n\n\t// 如果有初始需求,发送请求\n\tif (initialRequirement) {\n\t\tawait session.prompt(initialRequirement);\n\t}\n\n\t// 等待所有输出完成\n\tawait new Promise<void>((resolve, reject) => {\n\t\tprocess.stdout.write(\"\", (err) => {\n\t\t\tif (err) reject(err);\n\t\t\telse resolve();\n\t\t});\n\t});\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version-check.d.ts","sourceRoot":"","sources":["../../src/utils/version-check.ts"],"names":[],"mappings":"AA+EA,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CA4CrD","sourcesContent":["import chalk from \"chalk\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\n\nconst CACHE_DIR = join(homedir(), \".openvibe\");\nconst CACHE_FILE = join(CACHE_DIR, \"version-check.json\");\n\ninterface VersionCache {\n\tlastCheck: number;\n\tlatestVersion: string;\n}\n\nfunction getCurrentVersion(): string {\n\ttry {\n\t\tconst pkg = JSON.parse(readFileSync(new URL(\"../../package.json\", import.meta.url), \"utf-8\"));\n\t\treturn pkg.version;\n\t} catch {\n\t\treturn \"0.0.0\";\n\t}\n}\n\nfunction parseVersion(version: string): number[] {\n\treturn version.split(\".\").map((v) => parseInt(v, 10));\n}\n\nfunction isNewer(current: string, latest: string): boolean {\n\tconst currentParts = parseVersion(current);\n\tconst latestParts = parseVersion(latest);\n\n\tfor (let i = 0; i < Math.max(currentParts.length, latestParts.length); i++) {\n\t\tconst currentPart = currentParts[i] || 0;\n\t\tconst latestPart = latestParts[i] || 0;\n\t\tif (latestPart > currentPart) return true;\n\t\tif (latestPart < currentPart) return false;\n\t}\n\treturn false;\n}\n\nasync function fetchLatestVersion(): Promise<string | null> {\n\ttry {\n\t\tconst controller = new AbortController();\n\t\tconst timeout = setTimeout(() => controller.abort(), 5000);\n\n\t\tconst response = await fetch(\"https://registry.npmjs.org/openvibe\", {\n\t\t\tsignal: controller.signal,\n\t\t});\n\t\tclearTimeout(timeout);\n\n\t\tif (!response.ok) return null;\n\n\t\tconst data = (await response.json()) as { \"dist-tags\"?: { latest?: string } };\n\t\treturn data[\"dist-tags\"]?.latest || null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction
|
|
1
|
+
{"version":3,"file":"version-check.d.ts","sourceRoot":"","sources":["../../src/utils/version-check.ts"],"names":[],"mappings":"AA+EA,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CA4CrD","sourcesContent":["import chalk from \"chalk\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\n\nconst CACHE_DIR = join(homedir(), \".openvibe\");\nconst CACHE_FILE = join(CACHE_DIR, \"version-check.json\");\n\ninterface VersionCache {\n\tlastCheck: number;\n\tlatestVersion: string;\n}\n\nfunction getCurrentVersion(): string {\n\ttry {\n\t\tconst pkg = JSON.parse(readFileSync(new URL(\"../../package.json\", import.meta.url), \"utf-8\"));\n\t\treturn pkg.version;\n\t} catch {\n\t\treturn \"0.0.0\";\n\t}\n}\n\nfunction parseVersion(version: string): number[] {\n\treturn version.split(\".\").map((v) => parseInt(v, 10));\n}\n\nfunction isNewer(current: string, latest: string): boolean {\n\tconst currentParts = parseVersion(current);\n\tconst latestParts = parseVersion(latest);\n\n\tfor (let i = 0; i < Math.max(currentParts.length, latestParts.length); i++) {\n\t\tconst currentPart = currentParts[i] || 0;\n\t\tconst latestPart = latestParts[i] || 0;\n\t\tif (latestPart > currentPart) return true;\n\t\tif (latestPart < currentPart) return false;\n\t}\n\treturn false;\n}\n\nasync function fetchLatestVersion(): Promise<string | null> {\n\ttry {\n\t\tconst controller = new AbortController();\n\t\tconst timeout = setTimeout(() => controller.abort(), 5000);\n\n\t\tconst response = await fetch(\"https://registry.npmjs.org/openvibe\", {\n\t\t\tsignal: controller.signal,\n\t\t});\n\t\tclearTimeout(timeout);\n\n\t\tif (!response.ok) return null;\n\n\t\tconst data = (await response.json()) as { \"dist-tags\"?: { latest?: string } };\n\t\treturn data[\"dist-tags\"]?.latest || null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction _readCache(): VersionCache | null {\n\ttry {\n\t\tif (!existsSync(CACHE_FILE)) return null;\n\t\tconst content = readFileSync(CACHE_FILE, \"utf-8\");\n\t\treturn JSON.parse(content);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction writeCache(cache: VersionCache): void {\n\ttry {\n\t\tif (!existsSync(CACHE_DIR)) {\n\t\t\tmkdirSync(CACHE_DIR, { recursive: true });\n\t\t}\n\t\twriteFileSync(CACHE_FILE, JSON.stringify(cache));\n\t} catch {\n\t\t// Ignore cache write errors\n\t}\n}\n\nexport async function checkForUpdates(): Promise<void> {\n\tconst currentVersion = getCurrentVersion();\n\n\t// Always fetch from npm registry (no cache)\n\tconst latestVersion = await fetchLatestVersion();\n\n\tif (latestVersion) {\n\t\t// Still write to cache for other purposes (e.g., display last known version offline)\n\t\twriteCache({ lastCheck: Date.now(), latestVersion });\n\t}\n\n\tif (latestVersion && isNewer(currentVersion, latestVersion)) {\n\t\tconsole.log();\n\t\tconsole.log(chalk.yellow(\"┌─────────────────────────────────────────────────────────┐\"));\n\t\tconsole.log(\n\t\t\tchalk.yellow(\"│\") +\n\t\t\t\t\" \" +\n\t\t\t\tchalk.bold(\"Update Available\") +\n\t\t\t\t\" \" +\n\t\t\t\tchalk.yellow(\"│\"),\n\t\t);\n\t\tconsole.log(\n\t\t\tchalk.yellow(\"│\") +\n\t\t\t\t` Current: ${chalk.gray(currentVersion)}` +\n\t\t\t\t\" \" +\n\t\t\t\tchalk.yellow(\"│\"),\n\t\t);\n\t\tconsole.log(\n\t\t\tchalk.yellow(\"│\") +\n\t\t\t\t` Latest: ${chalk.green(latestVersion)}` +\n\t\t\t\t\" \" +\n\t\t\t\tchalk.yellow(\"│\"),\n\t\t);\n\t\tconsole.log(`${chalk.yellow(\"│\")} ${chalk.yellow(\"│\")}`);\n\t\tconsole.log(\n\t\t\tchalk.yellow(\"│\") +\n\t\t\t\t\" Run \" +\n\t\t\t\tchalk.cyan(\"npm i -g openvibe\") +\n\t\t\t\t\" to update \" +\n\t\t\t\tchalk.yellow(\"│\"),\n\t\t);\n\t\tconsole.log(chalk.yellow(\"└─────────────────────────────────────────────────────────┘\"));\n\t\tconsole.log();\n\t}\n}\n"]}
|
|
@@ -46,7 +46,7 @@ async function fetchLatestVersion() {
|
|
|
46
46
|
return null;
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
|
-
function
|
|
49
|
+
function _readCache() {
|
|
50
50
|
try {
|
|
51
51
|
if (!existsSync(CACHE_FILE))
|
|
52
52
|
return null;
|
|
@@ -92,7 +92,7 @@ export async function checkForUpdates() {
|
|
|
92
92
|
` Latest: ${chalk.green(latestVersion)}` +
|
|
93
93
|
" " +
|
|
94
94
|
chalk.yellow("│"));
|
|
95
|
-
console.log(chalk.yellow("│")
|
|
95
|
+
console.log(`${chalk.yellow("│")} ${chalk.yellow("│")}`);
|
|
96
96
|
console.log(chalk.yellow("│") +
|
|
97
97
|
" Run " +
|
|
98
98
|
chalk.cyan("npm i -g openvibe") +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version-check.js","sourceRoot":"","sources":["../../src/utils/version-check.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;AAOzD,SAAS,iBAAiB,GAAW;IACpC,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QAC9F,OAAO,GAAG,CAAC,OAAO,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,OAAO,CAAC;IAChB,CAAC;AAAA,CACD;AAED,SAAS,YAAY,CAAC,OAAe,EAAY;IAChD,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAAA,CACtD;AAED,SAAS,OAAO,CAAC,OAAe,EAAE,MAAc,EAAW;IAC1D,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAEzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5E,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,UAAU,GAAG,WAAW;YAAE,OAAO,IAAI,CAAC;QAC1C,IAAI,UAAU,GAAG,WAAW;YAAE,OAAO,KAAK,CAAC;IAC5C,CAAC;IACD,OAAO,KAAK,CAAC;AAAA,CACb;AAED,KAAK,UAAU,kBAAkB,GAA2B;IAC3D,IAAI,CAAC;QACJ,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;QAE3D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,qCAAqC,EAAE;YACnE,MAAM,EAAE,UAAU,CAAC,MAAM;SACzB,CAAC,CAAC;QACH,YAAY,CAAC,OAAO,CAAC,CAAC;QAEtB,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAE9B,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA0C,CAAC;QAC9E,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,IAAI,IAAI,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AAAA,CACD;AAED,SAAS,
|
|
1
|
+
{"version":3,"file":"version-check.js","sourceRoot":"","sources":["../../src/utils/version-check.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from \"chalk\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\n\nconst CACHE_DIR = join(homedir(), \".openvibe\");\nconst CACHE_FILE = join(CACHE_DIR, \"version-check.json\");\n\ninterface VersionCache {\n\tlastCheck: number;\n\tlatestVersion: string;\n}\n\nfunction getCurrentVersion(): string {\n\ttry {\n\t\tconst pkg = JSON.parse(readFileSync(new URL(\"../../package.json\", import.meta.url), \"utf-8\"));\n\t\treturn pkg.version;\n\t} catch {\n\t\treturn \"0.0.0\";\n\t}\n}\n\nfunction parseVersion(version: string): number[] {\n\treturn version.split(\".\").map((v) => parseInt(v, 10));\n}\n\nfunction isNewer(current: string, latest: string): boolean {\n\tconst currentParts = parseVersion(current);\n\tconst latestParts = parseVersion(latest);\n\n\tfor (let i = 0; i < Math.max(currentParts.length, latestParts.length); i++) {\n\t\tconst currentPart = currentParts[i] || 0;\n\t\tconst latestPart = latestParts[i] || 0;\n\t\tif (latestPart > currentPart) return true;\n\t\tif (latestPart < currentPart) return false;\n\t}\n\treturn false;\n}\n\nasync function fetchLatestVersion(): Promise<string | null> {\n\ttry {\n\t\tconst controller = new AbortController();\n\t\tconst timeout = setTimeout(() => controller.abort(), 5000);\n\n\t\tconst response = await fetch(\"https://registry.npmjs.org/openvibe\", {\n\t\t\tsignal: controller.signal,\n\t\t});\n\t\tclearTimeout(timeout);\n\n\t\tif (!response.ok) return null;\n\n\t\tconst data = (await response.json()) as { \"dist-tags\"?: { latest?: string } };\n\t\treturn data[\"dist-tags\"]?.latest || null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction _readCache(): VersionCache | null {\n\ttry {\n\t\tif (!existsSync(CACHE_FILE)) return null;\n\t\tconst content = readFileSync(CACHE_FILE, \"utf-8\");\n\t\treturn JSON.parse(content);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction writeCache(cache: VersionCache): void {\n\ttry {\n\t\tif (!existsSync(CACHE_DIR)) {\n\t\t\tmkdirSync(CACHE_DIR, { recursive: true });\n\t\t}\n\t\twriteFileSync(CACHE_FILE, JSON.stringify(cache));\n\t} catch {\n\t\t// Ignore cache write errors\n\t}\n}\n\nexport async function checkForUpdates(): Promise<void> {\n\tconst currentVersion = getCurrentVersion();\n\n\t// Always fetch from npm registry (no cache)\n\tconst latestVersion = await fetchLatestVersion();\n\n\tif (latestVersion) {\n\t\t// Still write to cache for other purposes (e.g., display last known version offline)\n\t\twriteCache({ lastCheck: Date.now(), latestVersion });\n\t}\n\n\tif (latestVersion && isNewer(currentVersion, latestVersion)) {\n\t\tconsole.log();\n\t\tconsole.log(chalk.yellow(\"┌─────────────────────────────────────────────────────────┐\"));\n\t\tconsole.log(\n\t\t\tchalk.yellow(\"│\") +\n\t\t\t\t\" \" +\n\t\t\t\tchalk.bold(\"Update Available\") +\n\t\t\t\t\" \" +\n\t\t\t\tchalk.yellow(\"│\"),\n\t\t);\n\t\tconsole.log(\n\t\t\tchalk.yellow(\"│\") +\n\t\t\t\t` Current: ${chalk.gray(currentVersion)}` +\n\t\t\t\t\" \" +\n\t\t\t\tchalk.yellow(\"│\"),\n\t\t);\n\t\tconsole.log(\n\t\t\tchalk.yellow(\"│\") +\n\t\t\t\t` Latest: ${chalk.green(latestVersion)}` +\n\t\t\t\t\" \" +\n\t\t\t\tchalk.yellow(\"│\"),\n\t\t);\n\t\tconsole.log(`${chalk.yellow(\"│\")} ${chalk.yellow(\"│\")}`);\n\t\tconsole.log(\n\t\t\tchalk.yellow(\"│\") +\n\t\t\t\t\" Run \" +\n\t\t\t\tchalk.cyan(\"npm i -g openvibe\") +\n\t\t\t\t\" to update \" +\n\t\t\t\tchalk.yellow(\"│\"),\n\t\t);\n\t\tconsole.log(chalk.yellow(\"└─────────────────────────────────────────────────────────┘\"));\n\t\tconsole.log();\n\t}\n}\n"]}
|