clover-hackathon 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 (52) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +82 -0
  3. package/dist/cli/commands.d.ts +18 -0
  4. package/dist/cli/commands.js +474 -0
  5. package/dist/cli/commands.js.map +1 -0
  6. package/dist/cli/index.d.ts +1 -0
  7. package/dist/cli/index.js +205 -0
  8. package/dist/cli/index.js.map +1 -0
  9. package/dist/core/agent.d.ts +27 -0
  10. package/dist/core/agent.js +108 -0
  11. package/dist/core/agent.js.map +1 -0
  12. package/dist/core/permissions.d.ts +9 -0
  13. package/dist/core/permissions.js +45 -0
  14. package/dist/core/permissions.js.map +1 -0
  15. package/dist/core/session.d.ts +7 -0
  16. package/dist/core/session.js +42 -0
  17. package/dist/core/session.js.map +1 -0
  18. package/dist/core/tools.d.ts +7 -0
  19. package/dist/core/tools.js +216 -0
  20. package/dist/core/tools.js.map +1 -0
  21. package/dist/hackathon/workflows.d.ts +13 -0
  22. package/dist/hackathon/workflows.js +132 -0
  23. package/dist/hackathon/workflows.js.map +1 -0
  24. package/dist/index.d.ts +2 -0
  25. package/dist/index.js +8 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/models/provider.d.ts +26 -0
  28. package/dist/models/provider.js +347 -0
  29. package/dist/models/provider.js.map +1 -0
  30. package/dist/types.d.ts +131 -0
  31. package/dist/types.js +3 -0
  32. package/dist/types.js.map +1 -0
  33. package/dist/utils/config.d.ts +15 -0
  34. package/dist/utils/config.js +93 -0
  35. package/dist/utils/config.js.map +1 -0
  36. package/dist/utils/cost.d.ts +16 -0
  37. package/dist/utils/cost.js +48 -0
  38. package/dist/utils/cost.js.map +1 -0
  39. package/dist/utils/input.d.ts +4 -0
  40. package/dist/utils/input.js +37 -0
  41. package/dist/utils/input.js.map +1 -0
  42. package/dist/utils/logger.d.ts +6 -0
  43. package/dist/utils/logger.js +33 -0
  44. package/dist/utils/logger.js.map +1 -0
  45. package/dist/utils/pet.d.ts +9 -0
  46. package/dist/utils/pet.js +74 -0
  47. package/dist/utils/pet.js.map +1 -0
  48. package/package.json +53 -0
  49. package/src/templates/pitch.md +30 -0
  50. package/src/templates/readme.md +36 -0
  51. package/src/templates/submission.md +40 -0
  52. package/src/templates/timeline.md +28 -0
@@ -0,0 +1,216 @@
1
+ // 工具注册表:Clover 的通用 Agent 能力(读写文件、执行命令)
2
+ // M2:工具带参数 Schema,供各家 function calling 协议转换;运行基于 process.cwd()。
3
+ import fs from "node:fs";
4
+ import path from "node:path";
5
+ import { execFile } from "node:child_process";
6
+ import { promisify } from "node:util";
7
+ const execFileAsync = promisify(execFile);
8
+ function resolvePath(file) {
9
+ return path.resolve(process.cwd(), file);
10
+ }
11
+ export const TOOLS = [
12
+ {
13
+ name: "read_file",
14
+ description: "读取文件内容 (read file content)",
15
+ parameters: [
16
+ { name: "path", type: "string", description: "文件路径,相对于项目根目录", required: true },
17
+ ],
18
+ async run(args) {
19
+ const file = args.path ?? "";
20
+ if (!file)
21
+ return { ok: false, output: "缺少 path 参数" };
22
+ const target = resolvePath(file);
23
+ if (!fs.existsSync(target))
24
+ return { ok: false, output: "文件不存在: " + file };
25
+ const stat = fs.statSync(target);
26
+ if (stat.size > 200_000)
27
+ return { ok: false, output: "文件过大(>200KB),请分段查看: " + file };
28
+ return { ok: true, output: fs.readFileSync(target, "utf8") };
29
+ },
30
+ },
31
+ {
32
+ name: "write_file",
33
+ description: "写入文件内容,覆盖已存在的文件 (write file content)",
34
+ parameters: [
35
+ { name: "path", type: "string", description: "文件路径,相对于项目根目录", required: true },
36
+ { name: "content", type: "string", description: "要写入的完整内容", required: true },
37
+ ],
38
+ async run(args) {
39
+ const file = args.path ?? "";
40
+ const content = args.content ?? "";
41
+ if (!file)
42
+ return { ok: false, output: "缺少 path 参数" };
43
+ const target = resolvePath(file);
44
+ fs.mkdirSync(path.dirname(target), { recursive: true });
45
+ fs.writeFileSync(target, content, "utf8");
46
+ return { ok: true, output: "已写入 " + file + "(" + Buffer.byteLength(content, "utf8") + " 字节)" };
47
+ },
48
+ },
49
+ {
50
+ name: "list_dir",
51
+ description: "列出目录内容 (list directory)",
52
+ parameters: [
53
+ { name: "path", type: "string", description: "目录路径,默认为项目根目录" },
54
+ ],
55
+ async run(args) {
56
+ const dir = args.path ?? ".";
57
+ const target = resolvePath(dir);
58
+ if (!fs.existsSync(target))
59
+ return { ok: false, output: "目录不存在: " + dir };
60
+ const entries = fs.readdirSync(target, { withFileTypes: true });
61
+ const lines = entries.map((e) => (e.isDirectory() ? e.name + "/" : e.name));
62
+ return { ok: true, output: lines.join("\n") };
63
+ },
64
+ },
65
+ {
66
+ name: "run_command",
67
+ description: "执行终端命令,执行前会请求用户批准 (run a shell command)",
68
+ parameters: [
69
+ { name: "command", type: "string", description: "要执行的完整命令", required: true },
70
+ ],
71
+ async run(args) {
72
+ const command = args.command ?? "";
73
+ if (!command)
74
+ return { ok: false, output: "缺少 command 参数" };
75
+ try {
76
+ const { stdout, stderr } = await execFileAsync(command, [], {
77
+ cwd: process.cwd(),
78
+ shell: true,
79
+ timeout: 60_000,
80
+ maxBuffer: 5_000_000,
81
+ });
82
+ return { ok: true, output: (stdout + stderr).slice(0, 50_000) };
83
+ }
84
+ catch (err) {
85
+ const e = err;
86
+ return { ok: false, output: String(e.stdout ?? "") + String(e.stderr ?? "") + " " + e.message };
87
+ }
88
+ },
89
+ },
90
+ {
91
+ name: "web_search",
92
+ description: "联网搜索网页,返回标题/链接/摘要 (web search)",
93
+ parameters: [
94
+ { name: "query", type: "string", description: "搜索关键词", required: true },
95
+ { name: "max_results", type: "number", description: "返回条数,默认 5,最多 10" },
96
+ ],
97
+ async run(args) {
98
+ const query = args.query ?? "";
99
+ if (!query)
100
+ return { ok: false, output: "缺少 query 参数" };
101
+ const max = Math.min(Number(args.max_results ?? 5) || 5, 10);
102
+ return { ok: true, output: await searchWeb(query, max) };
103
+ },
104
+ },
105
+ ];
106
+ export function findTool(name) {
107
+ return TOOLS.find((t) => t.name === name);
108
+ }
109
+ /** 把工具的 parameters 转成 JSON Schema,供各家 API 使用 */
110
+ export function toJsonSchema(tool) {
111
+ const properties = {};
112
+ const required = [];
113
+ for (const p of tool.parameters) {
114
+ properties[p.name] = { type: p.type, description: p.description };
115
+ if (p.required)
116
+ required.push(p.name);
117
+ }
118
+ return { type: "object", properties, required };
119
+ }
120
+ // ---------- 联网搜索(DuckDuckGo 优先,Bing 兜底;均无需 API Key) ----------
121
+ const DDG_HTML = "https://html.duckduckgo.com/html/?q=";
122
+ const BING_HTML = "https://www.bing.com/search?q=";
123
+ function decodeEntities(text) {
124
+ return text
125
+ .replace(/&/g, "&")
126
+ .replace(/&lt;/g, "<")
127
+ .replace(/&gt;/g, ">")
128
+ .replace(/&quot;/g, '"')
129
+ .replace(/&#x27;/g, "'")
130
+ .replace(/&ensp;/g, " ")
131
+ .replace(/&nbsp;/g, " ")
132
+ .replace(/&#(\d+);/g, (_m, n) => String.fromCharCode(Number(n)))
133
+ .replace(/&#39;/g, "'");
134
+ }
135
+ function stripTags(text) {
136
+ return text.replace(/<[^>]+>/g, " ").replace(/\s+/g, " ").trim();
137
+ }
138
+ function cleanUrl(href) {
139
+ const match = href.match(/uddg=([^&]+)/);
140
+ if (match) {
141
+ try {
142
+ return decodeURIComponent(match[1] ?? "");
143
+ }
144
+ catch {
145
+ // 解码失败则用原始链接
146
+ }
147
+ }
148
+ return href.replace(/^\/\//, "https://");
149
+ }
150
+ async function fetchHtml(url, timeoutMs) {
151
+ const controller = new AbortController();
152
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
153
+ try {
154
+ const res = await fetch(url, {
155
+ headers: { "User-Agent": "Mozilla/5.0 (compatible; Clover/0.1; hackathon-agent)" },
156
+ signal: controller.signal,
157
+ });
158
+ if (!res.ok)
159
+ return null;
160
+ return await res.text();
161
+ }
162
+ catch {
163
+ return null;
164
+ }
165
+ finally {
166
+ clearTimeout(timer);
167
+ }
168
+ }
169
+ function parseDuckDuckGo(html, maxResults) {
170
+ const blocks = html.split('<div class="result results_links');
171
+ const lines = [];
172
+ for (let i = 1; i < blocks.length && lines.length < maxResults; i++) {
173
+ const block = blocks[i];
174
+ const title = block.match(new RegExp('class="result__a"[^>]*>(.*?)</a>', "s"))?.[1];
175
+ const snippet = block.match(new RegExp('class="result__snippet"[^>]*>(.*?)</a>', "s"))?.[1];
176
+ const href = block.match(new RegExp('class="result__a" href="([^"]+)"'))?.[1];
177
+ if (!title && !href)
178
+ continue;
179
+ const cleanTitle = title ? stripTags(title) : "(无标题)";
180
+ const cleanSnippet = snippet ? stripTags(snippet) : "";
181
+ const url = href ? cleanUrl(href) : "";
182
+ lines.push(cleanTitle + (url ? "\n " + url : "") + (cleanSnippet ? "\n " + cleanSnippet : ""));
183
+ }
184
+ return lines.length > 0 ? lines.join("\n\n") : null;
185
+ }
186
+ function parseBing(html, maxResults) {
187
+ const blocks = html.split('<li class="b_algo"');
188
+ const lines = [];
189
+ for (let i = 1; i < blocks.length && lines.length < maxResults; i++) {
190
+ const block = blocks[i];
191
+ const href = block.match(/<h2[^>]*><a[^>]*href="([^"]+)"/)?.[1];
192
+ const title = block.match(/<h2[^>]*><a[^>]*>(.*?)<\/a><\/h2>/s)?.[1];
193
+ const snippet = block.match(/<p[^>]*>(.*?)<\/p>/s)?.[1];
194
+ if (!title && !href)
195
+ continue;
196
+ const cleanTitle = title ? stripTags(title) : "(无标题)";
197
+ const cleanSnippet = snippet ? stripTags(snippet) : "";
198
+ lines.push(cleanTitle + (href ? "\n " + href : "") + (cleanSnippet ? "\n " + cleanSnippet : ""));
199
+ }
200
+ return lines.length > 0 ? lines.join("\n\n") : null;
201
+ }
202
+ /** 联网搜索,返回最多 maxResults 条:标题 / 链接 / 摘要 */
203
+ export async function searchWeb(query, maxResults = 5) {
204
+ const ddgHtml = await fetchHtml(DDG_HTML + encodeURIComponent(query), 8000);
205
+ if (ddgHtml) {
206
+ const ddg = parseDuckDuckGo(ddgHtml, maxResults);
207
+ if (ddg)
208
+ return ddg;
209
+ }
210
+ const bingHtml = await fetchHtml(BING_HTML + encodeURIComponent(query), 15_000);
211
+ if (!bingHtml)
212
+ return "搜索失败:无法访问搜索服务";
213
+ const bing = parseBing(bingHtml, maxResults);
214
+ return bing ?? "没有搜到结果:" + query;
215
+ }
216
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/core/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { HackathonMeta, SessionRecord } from "../types.js";
2
+ export declare function buildAnalyzePrompt(raw: string): string;
3
+ export declare function buildIdeatePrompt(summary: string, skills: string): string;
4
+ export declare function buildEvaluatePrompt(idea: string): string;
5
+ export declare function buildMvpPrompt(summary: string, idea: string, durationHours: number): string;
6
+ export declare function buildPitchPrompt(projectName: string, info: string): string;
7
+ export interface CheckItem {
8
+ name: string;
9
+ detail: string;
10
+ pass: boolean;
11
+ }
12
+ export declare function runSubmissionChecks(meta: HackathonMeta | null): Promise<CheckItem[]>;
13
+ export declare function buildRetrospectivePrompt(meta: HackathonMeta | null, session: SessionRecord | null): string;
@@ -0,0 +1,132 @@
1
+ // 黑客松领域工作流:赛题解析 / 点子 / 评估 / MVP / Pitch / 检查 / 复盘
2
+ // M1 提供 prompt 构建与规则型检查;LLM 执行在 M2/M3 接入。
3
+ import fs from "node:fs";
4
+ import path from "node:path";
5
+ // ---------- 赛题解析 ----------
6
+ export function buildAnalyzePrompt(raw) {
7
+ return [
8
+ "你是黑客松赛题分析师。请把以下赛题材料结构化整理,输出 Markdown:",
9
+ "",
10
+ "## 主题",
11
+ "## 硬性要求(必须满足)",
12
+ "## 评分标准(评委怎么打分)",
13
+ "## 加分项",
14
+ "## 限制与注意(技术栈限制、素材限制、提交格式)",
15
+ "## 关键时间节点",
16
+ "",
17
+ "赛题材料:",
18
+ raw.slice(0, 30_000),
19
+ ].join("\n");
20
+ }
21
+ // ---------- 点子生成与评估 ----------
22
+ export function buildIdeatePrompt(summary, skills) {
23
+ return [
24
+ "你是黑客松创意顾问。基于赛题,给出 5 个候选项目点子。",
25
+ "要求:",
26
+ "- 每个点子 1-2 句话说明核心,标注创新点",
27
+ "- 考虑参赛者技能:" + skills,
28
+ "- 优先选择 48 小时~一周内能做出 Demo 的规模",
29
+ "- 避免过于常见或纯套壳的点子",
30
+ "",
31
+ "赛题摘要:",
32
+ summary,
33
+ ].join("\n");
34
+ }
35
+ export function buildEvaluatePrompt(idea) {
36
+ return [
37
+ "你是创业与市场分析师。请对以下黑客松项目点子做评估,输出 Markdown:",
38
+ "",
39
+ "## 一句话总结",
40
+ "## 合理性分析(技术可行性 / 需求真实性 / 团队匹配度,各 1-2 句)",
41
+ "## 市场分析(目标用户、市场规模、竞品情况)",
42
+ "## 蓝海还是红海(判断依据)",
43
+ "## 差异化机会",
44
+ "## 风险与翻车点",
45
+ "## 综合评分(0-10)与建议",
46
+ "",
47
+ "点子:",
48
+ idea,
49
+ ].join("\n");
50
+ }
51
+ // ---------- MVP 规划 ----------
52
+ export function buildMvpPrompt(summary, idea, durationHours) {
53
+ return [
54
+ "你是黑客松项目规划师。把以下点子拆成可在 " + durationHours + " 小时内完成并提交的 MVP 计划,输出 Markdown:",
55
+ "",
56
+ "## MVP 目标(一句)",
57
+ "## 核心功能(P0 / P1 / P2 分级,P0 必须有 Demo)",
58
+ "## 里程碑(按时间切分,标注每个阶段做什么)",
59
+ "## 演示策略(Demo 里要演示什么)",
60
+ "## 放弃清单(明确不做什么)",
61
+ "",
62
+ "赛题摘要:" + summary,
63
+ "",
64
+ "点子:" + idea,
65
+ ].join("\n");
66
+ }
67
+ // ---------- Pitch 辅助 ----------
68
+ export function buildPitchPrompt(projectName, info) {
69
+ return [
70
+ "你是黑客松路演教练。基于以下项目信息,生成 3 分钟 Pitch 稿,输出 Markdown:",
71
+ "",
72
+ "## 开场钩子(15 秒,抓评委注意力)",
73
+ "## 问题与痛点(30 秒)",
74
+ "## 解决方案与 Demo 亮点(90 秒,突出演示顺序)",
75
+ "## 市场与独特价值(30 秒)",
76
+ "## 收尾 Call to Action(15 秒)",
77
+ "## 评委可能问的 5 个问题与建议回答",
78
+ "",
79
+ "项目名:" + projectName,
80
+ "",
81
+ "项目信息:" + info.slice(0, 10_000),
82
+ ].join("\n");
83
+ }
84
+ export async function runSubmissionChecks(meta) {
85
+ const cwd = process.cwd();
86
+ const has = (p) => fs.existsSync(path.join(cwd, p));
87
+ const items = [
88
+ {
89
+ name: "README.md 存在",
90
+ pass: has("README.md"),
91
+ detail: has("README.md") ? "已存在" : "缺少 README.md",
92
+ },
93
+ {
94
+ name: "Git 仓库已初始化",
95
+ pass: has(".git"),
96
+ detail: has(".git") ? "已初始化" : "未初始化 git",
97
+ },
98
+ {
99
+ name: "代码可构建(package.json / pyproject.toml / Cargo.toml / go.mod)",
100
+ pass: has("package.json") || has("pyproject.toml") || has("Cargo.toml") || has("go.mod"),
101
+ detail: "未检测到常见构建配置",
102
+ },
103
+ {
104
+ name: "比赛档案已填写(名称/链接/截止时间)",
105
+ pass: meta !== null && Boolean(meta.name && meta.url && meta.endAt),
106
+ detail: meta === null ? "未初始化比赛档案" : "档案字段不完整(name/url/endAt)",
107
+ },
108
+ {
109
+ name: "演示文件存在(demo.mp4 / demo.gif / demo.webm)",
110
+ pass: has("demo.mp4") || has("demo.gif") || has("demo.webm"),
111
+ detail: "未找到 demo 视频文件",
112
+ },
113
+ ];
114
+ return items;
115
+ }
116
+ // ---------- 赛后复盘 ----------
117
+ export function buildRetrospectivePrompt(meta, session) {
118
+ return [
119
+ "你是黑客松复盘教练。基于比赛档案与会话记录,生成复盘报告,输出 Markdown:",
120
+ "",
121
+ "## 结果回顾(做了什么、完成度)",
122
+ "## 时间花销分析(哪些环节超时)",
123
+ "## 翻车点(技术/规划/演示/提交)",
124
+ "## 亮点(做对了什么)",
125
+ "## 下次改进(3-5 条具体建议)",
126
+ "",
127
+ "比赛:" + JSON.stringify(meta ?? {}),
128
+ "",
129
+ "会话摘要:" + JSON.stringify((session?.messages ?? []).slice(-20).map((m) => m.role + ": " + m.content.slice(0, 200))),
130
+ ].join("\n");
131
+ }
132
+ //# sourceMappingURL=workflows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../src/hackathon/workflows.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,0CAA0C;AAE1C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,6BAA6B;AAE7B,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,OAAO;QACL,uCAAuC;QACvC,EAAE;QACF,OAAO;QACP,eAAe;QACf,iBAAiB;QACjB,QAAQ;QACR,2BAA2B;QAC3B,WAAW;QACX,EAAE;QACF,OAAO;QACP,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,gCAAgC;AAEhC,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,MAAc;IAC/D,OAAO;QACL,8BAA8B;QAC9B,KAAK;QACL,yBAAyB;QACzB,YAAY,GAAG,MAAM;QACrB,8BAA8B;QAC9B,iBAAiB;QACjB,EAAE;QACF,OAAO;QACP,OAAO;KACR,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO;QACL,wCAAwC;QACxC,EAAE;QACF,UAAU;QACV,yCAAyC;QACzC,yBAAyB;QACzB,iBAAiB;QACjB,UAAU;QACV,WAAW;QACX,kBAAkB;QAClB,EAAE;QACF,KAAK;QACL,IAAI;KACL,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,+BAA+B;AAE/B,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,IAAY,EAAE,aAAqB;IACjF,OAAO;QACL,uBAAuB,GAAG,aAAa,GAAG,gCAAgC;QAC1E,EAAE;QACF,eAAe;QACf,sCAAsC;QACtC,yBAAyB;QACzB,sBAAsB;QACtB,iBAAiB;QACjB,EAAE;QACF,OAAO,GAAG,OAAO;QACjB,EAAE;QACF,KAAK,GAAG,IAAI;KACb,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,iCAAiC;AAEjC,MAAM,UAAU,gBAAgB,CAAC,WAAmB,EAAE,IAAY;IAChE,OAAO;QACL,iDAAiD;QACjD,EAAE;QACF,sBAAsB;QACtB,gBAAgB;QAChB,+BAA+B;QAC/B,kBAAkB;QAClB,4BAA4B;QAC5B,sBAAsB;QACtB,EAAE;QACF,MAAM,GAAG,WAAW;QACpB,EAAE;QACF,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC;KAChC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAUD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAA0B;IAClE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAgB;QACzB;YACE,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,GAAG,CAAC,WAAW,CAAC;YACtB,MAAM,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc;SAClD;QACD;YACE,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC;YACjB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU;SAC1C;QACD;YACE,IAAI,EAAE,4DAA4D;YAClE,IAAI,EAAE,GAAG,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC;YACxF,MAAM,EAAE,YAAY;SACrB;QACD;YACE,IAAI,EAAE,qBAAqB;YAC3B,IAAI,EAAE,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC;YACnE,MAAM,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,yBAAyB;SAC/D;QACD;YACE,IAAI,EAAE,yCAAyC;YAC/C,IAAI,EAAE,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC;YAC5D,MAAM,EAAE,eAAe;SACxB;KACF,CAAC;IACF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,6BAA6B;AAE7B,MAAM,UAAU,wBAAwB,CAAC,IAA0B,EAAE,OAA6B;IAChG,OAAO;QACL,2CAA2C;QAC3C,EAAE;QACF,mBAAmB;QACnB,mBAAmB;QACnB,qBAAqB;QACrB,cAAc;QACd,oBAAoB;QACpB,EAAE;QACF,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC;QAClC,EAAE;QACF,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;KACnH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ // Clover 入口
3
+ import { runCli } from "./cli/index.js";
4
+ runCli().catch((err) => {
5
+ console.error("✖ Clover 运行出错:" + (err instanceof Error ? err.message : err));
6
+ process.exit(1);
7
+ });
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,YAAY;AAEZ,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,gBAAgB,GAAG,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { ChatMessage, ChatOptions, ChatResult, ProviderConfig } from "../types.js";
2
+ export declare class CloverError extends Error {
3
+ }
4
+ export interface ModelProvider {
5
+ readonly config: ProviderConfig;
6
+ chat(messages: ChatMessage[], options?: ChatOptions): Promise<ChatResult>;
7
+ }
8
+ /** OpenAI 风格消息转换(OpenAI / custom / Ollama 共用;arguments 按各家要求决定字符串化与否) */
9
+ export declare function toOpenAIMessages(messages: ChatMessage[], argsAsString: boolean): Array<Record<string, unknown>>;
10
+ type AnthropicBlock = Record<string, unknown>;
11
+ type AnthropicMessage = {
12
+ role: string;
13
+ content: AnthropicBlock[];
14
+ };
15
+ /** Anthropic 消息转换:tool_use/tool_result 与图片块,合并相邻 user 消息 */
16
+ export declare function toAnthropicMessages(messages: ChatMessage[]): AnthropicMessage[];
17
+ type GeminiContent = {
18
+ role: string;
19
+ parts: Array<Record<string, unknown>>;
20
+ };
21
+ /** Gemini 消息转换:functionCall/functionResponse 与内联图片,合并相邻同角色消息 */
22
+ export declare function toGeminiContents(messages: ChatMessage[]): GeminiContent[];
23
+ /** Ollama 消息转换:OpenAI 形态,图片走 images 字段 */
24
+ export declare function toOllamaMessages(messages: ChatMessage[]): Array<Record<string, unknown>>;
25
+ export declare function createProvider(config: ProviderConfig): ModelProvider;
26
+ export {};