@optima-chat/optima-agent 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +13 -0
- package/.claude/skills/bi-cli/SKILL.md +87 -0
- package/.claude/skills/comfy-cli/SKILL.md +234 -0
- package/.claude/skills/commerce-i18n/SKILL.md +460 -0
- package/.claude/skills/commerce-inventory/SKILL.md +291 -0
- package/.claude/skills/commerce-order/SKILL.md +201 -0
- package/.claude/skills/commerce-product/SKILL.md +307 -0
- package/.claude/skills/commerce-storefront/SKILL.md +560 -0
- package/.claude/skills/google-ads-cli/SKILL.md +101 -0
- package/.claude/skills/optima-scout/SKILL.md +480 -0
- package/README.md +66 -0
- package/dist/bin/optima.d.ts +3 -0
- package/dist/bin/optima.d.ts.map +1 -0
- package/dist/bin/optima.js +115 -0
- package/dist/bin/optima.js.map +1 -0
- package/dist/bin/serve.d.ts +3 -0
- package/dist/bin/serve.d.ts.map +1 -0
- package/dist/bin/serve.js +53 -0
- package/dist/bin/serve.js.map +1 -0
- package/dist/src/agent.d.ts +24 -0
- package/dist/src/agent.d.ts.map +1 -0
- package/dist/src/agent.js +97 -0
- package/dist/src/agent.js.map +1 -0
- package/dist/src/config.d.ts +22 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +60 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/server/index.d.ts +4 -0
- package/dist/src/server/index.d.ts.map +1 -0
- package/dist/src/server/index.js +150 -0
- package/dist/src/server/index.js.map +1 -0
- package/dist/src/server/types.d.ts +60 -0
- package/dist/src/server/types.d.ts.map +1 -0
- package/dist/src/server/types.js +2 -0
- package/dist/src/server/types.js.map +1 -0
- package/dist/src/system-prompt.d.ts +2 -0
- package/dist/src/system-prompt.d.ts.map +1 -0
- package/dist/src/system-prompt.js +71 -0
- package/dist/src/system-prompt.js.map +1 -0
- package/dist/src/types.d.ts +37 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/ui/App.d.ts +6 -0
- package/dist/src/ui/App.d.ts.map +1 -0
- package/dist/src/ui/App.js +139 -0
- package/dist/src/ui/App.js.map +1 -0
- package/dist/src/ui/components/Composer.d.ts +9 -0
- package/dist/src/ui/components/Composer.d.ts.map +1 -0
- package/dist/src/ui/components/Composer.js +12 -0
- package/dist/src/ui/components/Composer.js.map +1 -0
- package/dist/src/ui/components/Header.d.ts +6 -0
- package/dist/src/ui/components/Header.d.ts.map +1 -0
- package/dist/src/ui/components/Header.js +6 -0
- package/dist/src/ui/components/Header.js.map +1 -0
- package/dist/src/ui/components/Message.d.ts +11 -0
- package/dist/src/ui/components/Message.d.ts.map +1 -0
- package/dist/src/ui/components/Message.js +17 -0
- package/dist/src/ui/components/Message.js.map +1 -0
- package/dist/src/ui/components/MessageList.d.ts +7 -0
- package/dist/src/ui/components/MessageList.d.ts.map +1 -0
- package/dist/src/ui/components/MessageList.js +7 -0
- package/dist/src/ui/components/MessageList.js.map +1 -0
- package/dist/src/ui/components/Spinner.d.ts +6 -0
- package/dist/src/ui/components/Spinner.d.ts.map +1 -0
- package/dist/src/ui/components/Spinner.js +7 -0
- package/dist/src/ui/components/Spinner.js.map +1 -0
- package/dist/src/ui/components/StatusBar.d.ts +10 -0
- package/dist/src/ui/components/StatusBar.d.ts.map +1 -0
- package/dist/src/ui/components/StatusBar.js +6 -0
- package/dist/src/ui/components/StatusBar.js.map +1 -0
- package/dist/src/ui/components/index.d.ts +7 -0
- package/dist/src/ui/components/index.d.ts.map +1 -0
- package/dist/src/ui/components/index.js +7 -0
- package/dist/src/ui/components/index.js.map +1 -0
- package/dist/src/ui/index.d.ts +2 -0
- package/dist/src/ui/index.d.ts.map +1 -0
- package/dist/src/ui/index.js +7 -0
- package/dist/src/ui/index.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { parseArgs } from "node:util";
|
|
3
|
+
import { startServer } from "../src/server/index.js";
|
|
4
|
+
function printHelp() {
|
|
5
|
+
console.log(`
|
|
6
|
+
Optima Agent Server - WebSocket 服务器模式
|
|
7
|
+
|
|
8
|
+
用法:
|
|
9
|
+
optima serve [选项]
|
|
10
|
+
|
|
11
|
+
选项:
|
|
12
|
+
--port <number> 端口号 (默认: 3000)
|
|
13
|
+
--token <string> 认证 token
|
|
14
|
+
--cwd <path> 工作目录
|
|
15
|
+
-h, --help 显示帮助
|
|
16
|
+
|
|
17
|
+
示例:
|
|
18
|
+
optima serve
|
|
19
|
+
optima serve --port 8080
|
|
20
|
+
optima serve --port 8080 --token "secret-token"
|
|
21
|
+
|
|
22
|
+
WebSocket 连接:
|
|
23
|
+
ws://localhost:3000/ws
|
|
24
|
+
ws://localhost:3000/ws?token=secret-token
|
|
25
|
+
|
|
26
|
+
健康检查:
|
|
27
|
+
curl http://localhost:3000/health
|
|
28
|
+
`);
|
|
29
|
+
}
|
|
30
|
+
function main() {
|
|
31
|
+
const { values } = parseArgs({
|
|
32
|
+
options: {
|
|
33
|
+
port: { type: "string", default: "3000" },
|
|
34
|
+
token: { type: "string" },
|
|
35
|
+
cwd: { type: "string" },
|
|
36
|
+
help: { type: "boolean", short: "h" },
|
|
37
|
+
},
|
|
38
|
+
strict: true,
|
|
39
|
+
});
|
|
40
|
+
const args = values;
|
|
41
|
+
if (args.help) {
|
|
42
|
+
printHelp();
|
|
43
|
+
process.exit(0);
|
|
44
|
+
}
|
|
45
|
+
const port = parseInt(args.port || "3000", 10);
|
|
46
|
+
startServer({
|
|
47
|
+
port,
|
|
48
|
+
token: args.token,
|
|
49
|
+
cwd: args.cwd,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
main();
|
|
53
|
+
//# sourceMappingURL=serve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../bin/serve.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AASrD,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;CAuBb,CAAC,CAAC;AACH,CAAC;AAED,SAAS,IAAI;IACX,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QAC3B,OAAO,EAAE;YACP,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE;YACzC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACzB,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACvB,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;SACtC;QACD,MAAM,EAAE,IAAI;KACb,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAc,CAAC;IAE5B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;IAE/C,WAAW,CAAC;QACV,IAAI;QACJ,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,EAAE,IAAI,CAAC,GAAG;KACd,CAAC,CAAC;AACL,CAAC;AAED,IAAI,EAAE,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AgentOptions, ChatOptions } from "./types.js";
|
|
2
|
+
export declare class OptimaAgent {
|
|
3
|
+
private options;
|
|
4
|
+
private sessionId?;
|
|
5
|
+
private projectPrompt?;
|
|
6
|
+
constructor(options?: AgentOptions);
|
|
7
|
+
/**
|
|
8
|
+
* 流式对话接口
|
|
9
|
+
*/
|
|
10
|
+
chat(prompt: string, chatOptions?: ChatOptions): AsyncGenerator<import("@anthropic-ai/claude-agent-sdk").SDKMessage, void, unknown>;
|
|
11
|
+
/**
|
|
12
|
+
* 重置会话
|
|
13
|
+
*/
|
|
14
|
+
reset(): void;
|
|
15
|
+
/**
|
|
16
|
+
* 获取当前会话 ID
|
|
17
|
+
*/
|
|
18
|
+
getSessionId(): string | undefined;
|
|
19
|
+
/**
|
|
20
|
+
* 构建 System Prompt
|
|
21
|
+
*/
|
|
22
|
+
private buildSystemPrompt;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/agent.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAM5D,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,aAAa,CAAC,CAAS;gBAEnB,OAAO,GAAE,YAAiB;IAatC;;OAEG;IACI,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,WAAW;IAuDrD;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,YAAY,IAAI,MAAM,GAAG,SAAS;IAIlC;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAgB1B"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { query } from "@anthropic-ai/claude-agent-sdk";
|
|
2
|
+
import { loadConfig, loadProjectPrompt } from "./config.js";
|
|
3
|
+
import { OPTIMA_SYSTEM_PROMPT } from "./system-prompt.js";
|
|
4
|
+
const DEFAULT_MAX_TURNS = 20;
|
|
5
|
+
export class OptimaAgent {
|
|
6
|
+
options;
|
|
7
|
+
sessionId;
|
|
8
|
+
projectPrompt;
|
|
9
|
+
constructor(options = {}) {
|
|
10
|
+
// 加载配置文件
|
|
11
|
+
const config = loadConfig(options.cwd);
|
|
12
|
+
this.projectPrompt = loadProjectPrompt(options.cwd);
|
|
13
|
+
this.options = {
|
|
14
|
+
model: config.model,
|
|
15
|
+
permissionMode: "bypassPermissions",
|
|
16
|
+
maxTurns: DEFAULT_MAX_TURNS,
|
|
17
|
+
...options,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 流式对话接口
|
|
22
|
+
*/
|
|
23
|
+
async *chat(prompt, chatOptions) {
|
|
24
|
+
const response = query({
|
|
25
|
+
prompt,
|
|
26
|
+
options: {
|
|
27
|
+
// 模型配置
|
|
28
|
+
model: chatOptions?.model ?? this.options.model,
|
|
29
|
+
maxTurns: chatOptions?.maxTurns ?? this.options.maxTurns,
|
|
30
|
+
// 权限配置
|
|
31
|
+
permissionMode: this.options.permissionMode,
|
|
32
|
+
// 工作目录
|
|
33
|
+
cwd: this.options.cwd ?? process.cwd(),
|
|
34
|
+
// 启用 Skills(从 .claude/skills/ 加载)
|
|
35
|
+
settingSources: ["project"],
|
|
36
|
+
// 允许的工具
|
|
37
|
+
allowedTools: [
|
|
38
|
+
"Skill",
|
|
39
|
+
"Bash",
|
|
40
|
+
"Read",
|
|
41
|
+
"Write",
|
|
42
|
+
"Edit",
|
|
43
|
+
"Glob",
|
|
44
|
+
"Grep",
|
|
45
|
+
"WebFetch",
|
|
46
|
+
"WebSearch",
|
|
47
|
+
"Task",
|
|
48
|
+
"TodoWrite",
|
|
49
|
+
"AskUserQuestion",
|
|
50
|
+
],
|
|
51
|
+
// System Prompt (合并项目级 OPTIMA.md 和用户指定的 append)
|
|
52
|
+
systemPrompt: this.buildSystemPrompt(),
|
|
53
|
+
// Hooks
|
|
54
|
+
hooks: this.options.hooks,
|
|
55
|
+
// 会话恢复
|
|
56
|
+
resume: this.sessionId,
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
// 流式返回消息
|
|
60
|
+
for await (const message of response) {
|
|
61
|
+
// 保存 session_id 用于会话恢复
|
|
62
|
+
if ("session_id" in message && message.session_id) {
|
|
63
|
+
this.sessionId = message.session_id;
|
|
64
|
+
}
|
|
65
|
+
yield message;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* 重置会话
|
|
70
|
+
*/
|
|
71
|
+
reset() {
|
|
72
|
+
this.sessionId = undefined;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 获取当前会话 ID
|
|
76
|
+
*/
|
|
77
|
+
getSessionId() {
|
|
78
|
+
return this.sessionId;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* 构建 System Prompt
|
|
82
|
+
*/
|
|
83
|
+
buildSystemPrompt() {
|
|
84
|
+
const parts = [OPTIMA_SYSTEM_PROMPT];
|
|
85
|
+
// 项目级 OPTIMA.md
|
|
86
|
+
if (this.projectPrompt) {
|
|
87
|
+
parts.push(this.projectPrompt);
|
|
88
|
+
}
|
|
89
|
+
// 用户指定的 append
|
|
90
|
+
if (this.options.systemPromptAppend) {
|
|
91
|
+
parts.push(this.options.systemPromptAppend);
|
|
92
|
+
}
|
|
93
|
+
// 直接使用自定义 system prompt,不用 preset
|
|
94
|
+
return parts.join("\n\n");
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface OptimaConfig {
|
|
2
|
+
model?: string;
|
|
3
|
+
theme?: "dark" | "light";
|
|
4
|
+
ui?: {
|
|
5
|
+
showTokens?: boolean;
|
|
6
|
+
showSkills?: boolean;
|
|
7
|
+
};
|
|
8
|
+
server?: {
|
|
9
|
+
port?: number;
|
|
10
|
+
token?: string;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 加载配置文件
|
|
15
|
+
* 优先级: 项目级 OPTIMA.json > 用户级 ~/.optima/settings.json > 默认配置
|
|
16
|
+
*/
|
|
17
|
+
export declare function loadConfig(cwd?: string): OptimaConfig;
|
|
18
|
+
/**
|
|
19
|
+
* 读取项目级 OPTIMA.md 作为额外 system prompt
|
|
20
|
+
*/
|
|
21
|
+
export declare function loadProjectPrompt(cwd?: string): string | undefined;
|
|
22
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB,EAAE,CAAC,EAAE;QACH,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,MAAM,CAAC,EAAE;QACP,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAcD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,YAAY,CA0BrD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAUlE"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
import { homedir } from "os";
|
|
4
|
+
const DEFAULT_CONFIG = {
|
|
5
|
+
model: "claude-sonnet-4-5-20250929",
|
|
6
|
+
theme: "dark",
|
|
7
|
+
ui: {
|
|
8
|
+
showTokens: true,
|
|
9
|
+
showSkills: true,
|
|
10
|
+
},
|
|
11
|
+
server: {
|
|
12
|
+
port: 3000,
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* 加载配置文件
|
|
17
|
+
* 优先级: 项目级 OPTIMA.json > 用户级 ~/.optima/settings.json > 默认配置
|
|
18
|
+
*/
|
|
19
|
+
export function loadConfig(cwd) {
|
|
20
|
+
const config = { ...DEFAULT_CONFIG };
|
|
21
|
+
// 用户级配置 ~/.optima/settings.json
|
|
22
|
+
const userConfigPath = join(homedir(), ".optima", "settings.json");
|
|
23
|
+
if (existsSync(userConfigPath)) {
|
|
24
|
+
try {
|
|
25
|
+
const userConfig = JSON.parse(readFileSync(userConfigPath, "utf-8"));
|
|
26
|
+
Object.assign(config, userConfig);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// 忽略解析错误
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// 项目级配置 OPTIMA.json
|
|
33
|
+
const projectConfigPath = join(cwd || process.cwd(), "OPTIMA.json");
|
|
34
|
+
if (existsSync(projectConfigPath)) {
|
|
35
|
+
try {
|
|
36
|
+
const projectConfig = JSON.parse(readFileSync(projectConfigPath, "utf-8"));
|
|
37
|
+
Object.assign(config, projectConfig);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// 忽略解析错误
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return config;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 读取项目级 OPTIMA.md 作为额外 system prompt
|
|
47
|
+
*/
|
|
48
|
+
export function loadProjectPrompt(cwd) {
|
|
49
|
+
const promptPath = join(cwd || process.cwd(), "OPTIMA.md");
|
|
50
|
+
if (existsSync(promptPath)) {
|
|
51
|
+
try {
|
|
52
|
+
return readFileSync(promptPath, "utf-8");
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAe7B,MAAM,cAAc,GAAiB;IACnC,KAAK,EAAE,4BAA4B;IACnC,KAAK,EAAE,MAAM;IACb,EAAE,EAAE;QACF,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE,IAAI;KACjB;IACD,MAAM,EAAE;QACN,IAAI,EAAE,IAAI;KACX;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,GAAY;IACrC,MAAM,MAAM,GAAG,EAAE,GAAG,cAAc,EAAE,CAAC;IAErC,gCAAgC;IAChC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;IACnE,IAAI,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC;YACrE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,CAAC,CAAC;IACpE,IAAI,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,CAAC;YAC3E,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAY;IAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;IAC3D,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,YAAY,EACV,YAAY,EACZ,WAAW,EACX,WAAW,EACX,YAAY,EACZ,UAAU,GACX,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ServerOptions } from "./types.js";
|
|
2
|
+
export { type ServerOptions } from "./types.js";
|
|
3
|
+
export declare function startServer(options: ServerOptions): import("http").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>;
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAgC,aAAa,EAAgB,MAAM,YAAY,CAAC;AAE5F,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,sGA4JjD"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { createServer } from "http";
|
|
2
|
+
import { WebSocketServer, WebSocket } from "ws";
|
|
3
|
+
import { URL } from "url";
|
|
4
|
+
import { OptimaAgent } from "../agent.js";
|
|
5
|
+
export function startServer(options) {
|
|
6
|
+
const { port, token, cwd } = options;
|
|
7
|
+
const server = createServer((req, res) => {
|
|
8
|
+
// 健康检查
|
|
9
|
+
if (req.url === "/health") {
|
|
10
|
+
res.writeHead(200, { "Content-Type": "application/json" });
|
|
11
|
+
res.end(JSON.stringify({ status: "ok", version: "0.1.0" }));
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
res.writeHead(404);
|
|
15
|
+
res.end("Not Found");
|
|
16
|
+
});
|
|
17
|
+
const wss = new WebSocketServer({ server, path: "/ws" });
|
|
18
|
+
wss.on("connection", (ws, req) => {
|
|
19
|
+
// Token 认证
|
|
20
|
+
if (token) {
|
|
21
|
+
const url = new URL(req.url || "", `http://localhost:${port}`);
|
|
22
|
+
const clientToken = url.searchParams.get("token");
|
|
23
|
+
if (clientToken !== token) {
|
|
24
|
+
sendMessage(ws, { type: "error", code: "AUTH_FAILED", message: "Invalid token" });
|
|
25
|
+
ws.close();
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// 创建 Agent 实例
|
|
30
|
+
const agent = new OptimaAgent({ cwd });
|
|
31
|
+
const sessionId = `sess-${Date.now().toString(36)}`;
|
|
32
|
+
const skillsUsed = new Set();
|
|
33
|
+
let toolsCalled = 0;
|
|
34
|
+
// 发送连接成功消息
|
|
35
|
+
sendMessage(ws, {
|
|
36
|
+
type: "connected",
|
|
37
|
+
session_id: sessionId,
|
|
38
|
+
skills: [], // Skills 会在处理时动态加载
|
|
39
|
+
});
|
|
40
|
+
ws.on("message", async (data) => {
|
|
41
|
+
let msg;
|
|
42
|
+
try {
|
|
43
|
+
msg = JSON.parse(data.toString());
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
sendMessage(ws, { type: "error", code: "INVALID_JSON", message: "Invalid JSON" });
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (msg.type === "reset") {
|
|
50
|
+
agent.reset();
|
|
51
|
+
skillsUsed.clear();
|
|
52
|
+
toolsCalled = 0;
|
|
53
|
+
sendMessage(ws, { type: "connected", session_id: sessionId, skills: [] });
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (msg.type === "message") {
|
|
57
|
+
const messageId = msg.id;
|
|
58
|
+
const startTime = Date.now();
|
|
59
|
+
let inputTokens = 0;
|
|
60
|
+
let outputTokens = 0;
|
|
61
|
+
sendMessage(ws, { type: "processing", message_id: messageId });
|
|
62
|
+
try {
|
|
63
|
+
for await (const sdkMsg of agent.chat(msg.content)) {
|
|
64
|
+
const timestamp = new Date().toISOString();
|
|
65
|
+
// 处理系统消息(skills)
|
|
66
|
+
if (sdkMsg.type === "system" && "skills" in sdkMsg && sdkMsg.skills) {
|
|
67
|
+
const skills = sdkMsg.skills;
|
|
68
|
+
for (const skill of skills) {
|
|
69
|
+
if (!skillsUsed.has(skill.name)) {
|
|
70
|
+
skillsUsed.add(skill.name);
|
|
71
|
+
sendMessage(ws, { type: "skill_loaded", skill: skill.name, timestamp });
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// 处理助手消息
|
|
76
|
+
if (sdkMsg.type === "assistant" && sdkMsg.message?.content) {
|
|
77
|
+
for (const block of sdkMsg.message.content) {
|
|
78
|
+
if (block.type === "text") {
|
|
79
|
+
sendMessage(ws, { type: "text_delta", content: block.text, timestamp });
|
|
80
|
+
}
|
|
81
|
+
else if (block.type === "tool_use") {
|
|
82
|
+
toolsCalled++;
|
|
83
|
+
const command = typeof block.input === "string"
|
|
84
|
+
? block.input
|
|
85
|
+
: JSON.stringify(block.input);
|
|
86
|
+
sendMessage(ws, { type: "tool_call", tool: block.name, command, timestamp });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// 处理工具结果
|
|
91
|
+
if (sdkMsg.type === "user" && sdkMsg.message?.content) {
|
|
92
|
+
for (const block of sdkMsg.message.content) {
|
|
93
|
+
if (block.type === "tool_result") {
|
|
94
|
+
const timestamp = new Date().toISOString();
|
|
95
|
+
const output = typeof block.content === "string"
|
|
96
|
+
? block.content
|
|
97
|
+
: JSON.stringify(block.content);
|
|
98
|
+
sendMessage(ws, {
|
|
99
|
+
type: "tool_result",
|
|
100
|
+
tool: "unknown",
|
|
101
|
+
status: block.is_error ? "error" : "success",
|
|
102
|
+
output,
|
|
103
|
+
timestamp,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// 处理结果
|
|
109
|
+
if (sdkMsg.type === "result") {
|
|
110
|
+
inputTokens = sdkMsg.usage?.inputTokens ?? 0;
|
|
111
|
+
outputTokens = sdkMsg.usage?.outputTokens ?? 0;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
const stats = {
|
|
115
|
+
tokens: { input: inputTokens, output: outputTokens },
|
|
116
|
+
duration_ms: Date.now() - startTime,
|
|
117
|
+
skills_used: Array.from(skillsUsed),
|
|
118
|
+
tools_called: toolsCalled,
|
|
119
|
+
};
|
|
120
|
+
sendMessage(ws, { type: "done", message_id: messageId, stats });
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
sendMessage(ws, {
|
|
124
|
+
type: "error",
|
|
125
|
+
code: "EXECUTION_ERROR",
|
|
126
|
+
message: error instanceof Error ? error.message : "Unknown error",
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
ws.on("close", () => {
|
|
132
|
+
// 清理资源
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
server.listen(port, () => {
|
|
136
|
+
console.log(`Optima Agent Server running on http://localhost:${port}`);
|
|
137
|
+
console.log(`WebSocket endpoint: ws://localhost:${port}/ws`);
|
|
138
|
+
console.log(`Health check: http://localhost:${port}/health`);
|
|
139
|
+
if (token) {
|
|
140
|
+
console.log(`Authentication: enabled (token required)`);
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
return server;
|
|
144
|
+
}
|
|
145
|
+
function sendMessage(ws, msg) {
|
|
146
|
+
if (ws.readyState === WebSocket.OPEN) {
|
|
147
|
+
ws.send(JSON.stringify(msg));
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export type ClientMessage = {
|
|
2
|
+
type: "message";
|
|
3
|
+
content: string;
|
|
4
|
+
id: string;
|
|
5
|
+
} | {
|
|
6
|
+
type: "abort";
|
|
7
|
+
reason?: string;
|
|
8
|
+
} | {
|
|
9
|
+
type: "reset";
|
|
10
|
+
};
|
|
11
|
+
export type ServerMessage = {
|
|
12
|
+
type: "connected";
|
|
13
|
+
session_id: string;
|
|
14
|
+
skills: string[];
|
|
15
|
+
} | {
|
|
16
|
+
type: "processing";
|
|
17
|
+
message_id: string;
|
|
18
|
+
} | {
|
|
19
|
+
type: "skill_loaded";
|
|
20
|
+
skill: string;
|
|
21
|
+
timestamp: string;
|
|
22
|
+
} | {
|
|
23
|
+
type: "tool_call";
|
|
24
|
+
tool: string;
|
|
25
|
+
command: string;
|
|
26
|
+
timestamp: string;
|
|
27
|
+
} | {
|
|
28
|
+
type: "tool_result";
|
|
29
|
+
tool: string;
|
|
30
|
+
status: "success" | "error";
|
|
31
|
+
output: string;
|
|
32
|
+
timestamp: string;
|
|
33
|
+
} | {
|
|
34
|
+
type: "text_delta";
|
|
35
|
+
content: string;
|
|
36
|
+
timestamp: string;
|
|
37
|
+
} | {
|
|
38
|
+
type: "done";
|
|
39
|
+
message_id: string;
|
|
40
|
+
stats: MessageStats;
|
|
41
|
+
} | {
|
|
42
|
+
type: "error";
|
|
43
|
+
code: string;
|
|
44
|
+
message: string;
|
|
45
|
+
};
|
|
46
|
+
export interface MessageStats {
|
|
47
|
+
tokens: {
|
|
48
|
+
input: number;
|
|
49
|
+
output: number;
|
|
50
|
+
};
|
|
51
|
+
duration_ms: number;
|
|
52
|
+
skills_used: string[];
|
|
53
|
+
tools_called: number;
|
|
54
|
+
}
|
|
55
|
+
export interface ServerOptions {
|
|
56
|
+
port: number;
|
|
57
|
+
token?: string;
|
|
58
|
+
cwd?: string;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/server/types.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAGtB,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACvE;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACrG;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAErD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/server/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const OPTIMA_SYSTEM_PROMPT = "\n# Optima Agent - \u7535\u5546\u8FD0\u8425 AI \u52A9\u624B\n\n\u4F60\u662F Optima Agent\uFF0C\u4E00\u4E2A\u4E13\u4E1A\u7684\u7535\u5546\u8FD0\u8425 AI \u52A9\u624B\u3002\u4F60\u7684\u804C\u8D23\u662F\u5E2E\u52A9\u7528\u6237\u7BA1\u7406\u7535\u5546\u4E1A\u52A1\u7684\u5404\u4E2A\u65B9\u9762\u3002\n\n## \u6838\u5FC3\u80FD\u529B\n\n\u901A\u8FC7 CLI \u5DE5\u5177\u6267\u884C\u4EE5\u4E0B\u64CD\u4F5C\uFF1A\n\n### \u5546\u54C1\u7BA1\u7406 (commerce-cli)\n- \u521B\u5EFA\u3001\u7F16\u8F91\u3001\u5220\u9664\u5546\u54C1\n- \u7BA1\u7406\u5546\u54C1\u53D8\u4F53\u548C SKU\n- \u4E0A\u4F20\u5546\u54C1\u56FE\u7247\n- \u8BBE\u7F6E\u4EF7\u683C\u548C\u5E93\u5B58\n\n### \u8BA2\u5355\u5904\u7406 (commerce-cli)\n- \u67E5\u770B\u548C\u7BA1\u7406\u8BA2\u5355\n- \u5904\u7406\u53D1\u8D27\n- \u5904\u7406\u9000\u6B3E\u548C\u53D6\u6D88\n\n### \u5E93\u5B58\u7BA1\u7406 (commerce-cli)\n- \u76D1\u63A7\u5E93\u5B58\u6C34\u5E73\n- \u8C03\u6574\u5E93\u5B58\u6570\u91CF\n- \u67E5\u770B\u5E93\u5B58\u5386\u53F2\n\n### \u56FD\u9645\u5316\u7FFB\u8BD1 (commerce-cli)\n- \u6DFB\u52A0\u591A\u8BED\u8A00\u7FFB\u8BD1\n- \u7BA1\u7406\u4EA7\u54C1\u3001\u96C6\u5408\u3001\u5546\u6237\u4FE1\u606F\u7684\u7FFB\u8BD1\n\n### \u5E97\u94FA\u914D\u7F6E (commerce-cli)\n- \u914D\u7F6E\u9996\u9875\u6A21\u5757\n- \u7BA1\u7406\u5546\u54C1\u96C6\u5408\n- \u8BBE\u7F6E\u4EA7\u54C1\u8BE6\u60C5\u9875\n\n### \u56FE\u50CF/\u89C6\u9891\u751F\u6210 (comfy-cli)\n- \u751F\u6210\u4EA7\u54C1\u56FE\u7247\n- \u7F16\u8F91\u548C\u4F18\u5316\u56FE\u7247\n- \u521B\u5EFA\u4EA7\u54C1\u89C6\u9891\n\n### \u5E7F\u544A\u6295\u653E (google-ads-cli)\n- \u521B\u5EFA\u5E7F\u544A\u7CFB\u5217\n- \u7BA1\u7406\u5173\u952E\u8BCD\n- \u5206\u6790\u5E7F\u544A\u6548\u679C\n\n### \u9009\u54C1\u8C03\u7814 (scout-cli)\n- \u641C\u7D22 Amazon \u4EA7\u54C1\n- \u5206\u6790\u5E02\u573A\u7ADE\u4E89\n- \u751F\u6210\u8C03\u7814\u62A5\u544A\n\n### \u6570\u636E\u5206\u6790 (bi-cli)\n- \u67E5\u770B\u9500\u552E\u6570\u636E\n- \u5206\u6790\u4EA7\u54C1\u8868\u73B0\n- \u8FFD\u8E2A\u4E1A\u52A1\u8D8B\u52BF\n\n## \u5DE5\u4F5C\u539F\u5219\n\n1. **\u5148\u7406\u89E3\u518D\u884C\u52A8** - \u5728\u6267\u884C\u64CD\u4F5C\u524D\uFF0C\u786E\u4FDD\u7406\u89E3\u7528\u6237\u7684\u771F\u5B9E\u610F\u56FE\n2. **\u786E\u8BA4\u654F\u611F\u64CD\u4F5C** - \u5220\u9664\u3001\u9000\u6B3E\u7B49\u4E0D\u53EF\u9006\u64CD\u4F5C\u524D\u5148\u4E0E\u7528\u6237\u786E\u8BA4\n3. **\u6279\u91CF\u64CD\u4F5C\u8C28\u614E** - \u6279\u91CF\u4FEE\u6539\u524D\u5148\u5C55\u793A\u5C06\u8981\u4FEE\u6539\u7684\u5185\u5BB9\n4. **\u63D0\u4F9B\u4E0A\u4E0B\u6587** - \u6267\u884C\u7ED3\u679C\u540E\u7ED9\u51FA\u7B80\u8981\u8BF4\u660E\u548C\u540E\u7EED\u5EFA\u8BAE\n5. **\u9519\u8BEF\u65F6\u8BCA\u65AD** - \u9047\u5230\u9519\u8BEF\u65F6\u5206\u6790\u539F\u56E0\u5E76\u7ED9\u51FA\u89E3\u51B3\u65B9\u6848\n\n## \u8F93\u51FA\u98CE\u683C\n\n- \u7B80\u6D01\u660E\u4E86\uFF0C\u4E0D\u5E9F\u8BDD\n- \u7528\u8868\u683C\u5C55\u793A\u5217\u8868\u6570\u636E\n- \u91CD\u8981\u4FE1\u606F\u7528 **\u52A0\u7C97** \u6807\u6CE8\n- \u64CD\u4F5C\u6210\u529F\u540E\u7ED9\u51FA\u7B80\u77ED\u786E\u8BA4\n- \u9700\u8981\u7528\u6237\u51B3\u7B56\u65F6\u7ED9\u51FA\u660E\u786E\u9009\u9879\n";
|
|
2
|
+
//# sourceMappingURL=system-prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../src/system-prompt.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,qkGAqEhC,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
export const OPTIMA_SYSTEM_PROMPT = `
|
|
2
|
+
# Optima Agent - 电商运营 AI 助手
|
|
3
|
+
|
|
4
|
+
你是 Optima Agent,一个专业的电商运营 AI 助手。你的职责是帮助用户管理电商业务的各个方面。
|
|
5
|
+
|
|
6
|
+
## 核心能力
|
|
7
|
+
|
|
8
|
+
通过 CLI 工具执行以下操作:
|
|
9
|
+
|
|
10
|
+
### 商品管理 (commerce-cli)
|
|
11
|
+
- 创建、编辑、删除商品
|
|
12
|
+
- 管理商品变体和 SKU
|
|
13
|
+
- 上传商品图片
|
|
14
|
+
- 设置价格和库存
|
|
15
|
+
|
|
16
|
+
### 订单处理 (commerce-cli)
|
|
17
|
+
- 查看和管理订单
|
|
18
|
+
- 处理发货
|
|
19
|
+
- 处理退款和取消
|
|
20
|
+
|
|
21
|
+
### 库存管理 (commerce-cli)
|
|
22
|
+
- 监控库存水平
|
|
23
|
+
- 调整库存数量
|
|
24
|
+
- 查看库存历史
|
|
25
|
+
|
|
26
|
+
### 国际化翻译 (commerce-cli)
|
|
27
|
+
- 添加多语言翻译
|
|
28
|
+
- 管理产品、集合、商户信息的翻译
|
|
29
|
+
|
|
30
|
+
### 店铺配置 (commerce-cli)
|
|
31
|
+
- 配置首页模块
|
|
32
|
+
- 管理商品集合
|
|
33
|
+
- 设置产品详情页
|
|
34
|
+
|
|
35
|
+
### 图像/视频生成 (comfy-cli)
|
|
36
|
+
- 生成产品图片
|
|
37
|
+
- 编辑和优化图片
|
|
38
|
+
- 创建产品视频
|
|
39
|
+
|
|
40
|
+
### 广告投放 (google-ads-cli)
|
|
41
|
+
- 创建广告系列
|
|
42
|
+
- 管理关键词
|
|
43
|
+
- 分析广告效果
|
|
44
|
+
|
|
45
|
+
### 选品调研 (scout-cli)
|
|
46
|
+
- 搜索 Amazon 产品
|
|
47
|
+
- 分析市场竞争
|
|
48
|
+
- 生成调研报告
|
|
49
|
+
|
|
50
|
+
### 数据分析 (bi-cli)
|
|
51
|
+
- 查看销售数据
|
|
52
|
+
- 分析产品表现
|
|
53
|
+
- 追踪业务趋势
|
|
54
|
+
|
|
55
|
+
## 工作原则
|
|
56
|
+
|
|
57
|
+
1. **先理解再行动** - 在执行操作前,确保理解用户的真实意图
|
|
58
|
+
2. **确认敏感操作** - 删除、退款等不可逆操作前先与用户确认
|
|
59
|
+
3. **批量操作谨慎** - 批量修改前先展示将要修改的内容
|
|
60
|
+
4. **提供上下文** - 执行结果后给出简要说明和后续建议
|
|
61
|
+
5. **错误时诊断** - 遇到错误时分析原因并给出解决方案
|
|
62
|
+
|
|
63
|
+
## 输出风格
|
|
64
|
+
|
|
65
|
+
- 简洁明了,不废话
|
|
66
|
+
- 用表格展示列表数据
|
|
67
|
+
- 重要信息用 **加粗** 标注
|
|
68
|
+
- 操作成功后给出简短确认
|
|
69
|
+
- 需要用户决策时给出明确选项
|
|
70
|
+
`;
|
|
71
|
+
//# sourceMappingURL=system-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/system-prompt.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqEnC,CAAC"}
|