@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.
Files changed (84) hide show
  1. package/.claude/settings.local.json +13 -0
  2. package/.claude/skills/bi-cli/SKILL.md +87 -0
  3. package/.claude/skills/comfy-cli/SKILL.md +234 -0
  4. package/.claude/skills/commerce-i18n/SKILL.md +460 -0
  5. package/.claude/skills/commerce-inventory/SKILL.md +291 -0
  6. package/.claude/skills/commerce-order/SKILL.md +201 -0
  7. package/.claude/skills/commerce-product/SKILL.md +307 -0
  8. package/.claude/skills/commerce-storefront/SKILL.md +560 -0
  9. package/.claude/skills/google-ads-cli/SKILL.md +101 -0
  10. package/.claude/skills/optima-scout/SKILL.md +480 -0
  11. package/README.md +66 -0
  12. package/dist/bin/optima.d.ts +3 -0
  13. package/dist/bin/optima.d.ts.map +1 -0
  14. package/dist/bin/optima.js +115 -0
  15. package/dist/bin/optima.js.map +1 -0
  16. package/dist/bin/serve.d.ts +3 -0
  17. package/dist/bin/serve.d.ts.map +1 -0
  18. package/dist/bin/serve.js +53 -0
  19. package/dist/bin/serve.js.map +1 -0
  20. package/dist/src/agent.d.ts +24 -0
  21. package/dist/src/agent.d.ts.map +1 -0
  22. package/dist/src/agent.js +97 -0
  23. package/dist/src/agent.js.map +1 -0
  24. package/dist/src/config.d.ts +22 -0
  25. package/dist/src/config.d.ts.map +1 -0
  26. package/dist/src/config.js +60 -0
  27. package/dist/src/config.js.map +1 -0
  28. package/dist/src/index.d.ts +3 -0
  29. package/dist/src/index.d.ts.map +1 -0
  30. package/dist/src/index.js +2 -0
  31. package/dist/src/index.js.map +1 -0
  32. package/dist/src/server/index.d.ts +4 -0
  33. package/dist/src/server/index.d.ts.map +1 -0
  34. package/dist/src/server/index.js +150 -0
  35. package/dist/src/server/index.js.map +1 -0
  36. package/dist/src/server/types.d.ts +60 -0
  37. package/dist/src/server/types.d.ts.map +1 -0
  38. package/dist/src/server/types.js +2 -0
  39. package/dist/src/server/types.js.map +1 -0
  40. package/dist/src/system-prompt.d.ts +2 -0
  41. package/dist/src/system-prompt.d.ts.map +1 -0
  42. package/dist/src/system-prompt.js +71 -0
  43. package/dist/src/system-prompt.js.map +1 -0
  44. package/dist/src/types.d.ts +37 -0
  45. package/dist/src/types.d.ts.map +1 -0
  46. package/dist/src/types.js +2 -0
  47. package/dist/src/types.js.map +1 -0
  48. package/dist/src/ui/App.d.ts +6 -0
  49. package/dist/src/ui/App.d.ts.map +1 -0
  50. package/dist/src/ui/App.js +139 -0
  51. package/dist/src/ui/App.js.map +1 -0
  52. package/dist/src/ui/components/Composer.d.ts +9 -0
  53. package/dist/src/ui/components/Composer.d.ts.map +1 -0
  54. package/dist/src/ui/components/Composer.js +12 -0
  55. package/dist/src/ui/components/Composer.js.map +1 -0
  56. package/dist/src/ui/components/Header.d.ts +6 -0
  57. package/dist/src/ui/components/Header.d.ts.map +1 -0
  58. package/dist/src/ui/components/Header.js +6 -0
  59. package/dist/src/ui/components/Header.js.map +1 -0
  60. package/dist/src/ui/components/Message.d.ts +11 -0
  61. package/dist/src/ui/components/Message.d.ts.map +1 -0
  62. package/dist/src/ui/components/Message.js +17 -0
  63. package/dist/src/ui/components/Message.js.map +1 -0
  64. package/dist/src/ui/components/MessageList.d.ts +7 -0
  65. package/dist/src/ui/components/MessageList.d.ts.map +1 -0
  66. package/dist/src/ui/components/MessageList.js +7 -0
  67. package/dist/src/ui/components/MessageList.js.map +1 -0
  68. package/dist/src/ui/components/Spinner.d.ts +6 -0
  69. package/dist/src/ui/components/Spinner.d.ts.map +1 -0
  70. package/dist/src/ui/components/Spinner.js +7 -0
  71. package/dist/src/ui/components/Spinner.js.map +1 -0
  72. package/dist/src/ui/components/StatusBar.d.ts +10 -0
  73. package/dist/src/ui/components/StatusBar.d.ts.map +1 -0
  74. package/dist/src/ui/components/StatusBar.js +6 -0
  75. package/dist/src/ui/components/StatusBar.js.map +1 -0
  76. package/dist/src/ui/components/index.d.ts +7 -0
  77. package/dist/src/ui/components/index.d.ts.map +1 -0
  78. package/dist/src/ui/components/index.js +7 -0
  79. package/dist/src/ui/components/index.js.map +1 -0
  80. package/dist/src/ui/index.d.ts +2 -0
  81. package/dist/src/ui/index.d.ts.map +1 -0
  82. package/dist/src/ui/index.js +7 -0
  83. package/dist/src/ui/index.js.map +1 -0
  84. 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,3 @@
1
+ export { OptimaAgent } from "./agent.js";
2
+ export type { AgentOptions, ChatOptions, HooksConfig, HookCallback, HookResult, } from "./types.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,2 @@
1
+ export { OptimaAgent } from "./agent.js";
2
+ //# sourceMappingURL=index.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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"}