feihong-code 0.2.1
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/.github/ISSUE_TEMPLATE/bug_report.md +37 -0
- package/.github/ISSUE_TEMPLATE/config.yml +14 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +28 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +46 -0
- package/.github/SECURITY.md +67 -0
- package/.github/workflows/ci.yml +140 -0
- package/AGENT-GUIDE.md +237 -0
- package/CHANGELOG.md +73 -0
- package/CODE_OF_CONDUCT.md +56 -0
- package/CONTRIBUTING.md +68 -0
- package/LICENSE +22 -0
- package/README.md +500 -0
- package/dist/agent/code-review.js +115 -0
- package/dist/agent/code-review.js.map +1 -0
- package/dist/agent/code-writer.js +227 -0
- package/dist/agent/code-writer.js.map +1 -0
- package/dist/agent/context-compactor.js +108 -0
- package/dist/agent/context-compactor.js.map +1 -0
- package/dist/agent/experience.js +190 -0
- package/dist/agent/experience.js.map +1 -0
- package/dist/agent/orchestrator.js +212 -0
- package/dist/agent/orchestrator.js.map +1 -0
- package/dist/agent/parallel-orchestrator.js +94 -0
- package/dist/agent/parallel-orchestrator.js.map +1 -0
- package/dist/agent/planner.js +53 -0
- package/dist/agent/planner.js.map +1 -0
- package/dist/agent/prompts.js +26 -0
- package/dist/agent/prompts.js.map +1 -0
- package/dist/agent/quality-gate.js +143 -0
- package/dist/agent/quality-gate.js.map +1 -0
- package/dist/agent/repo-reader.js +384 -0
- package/dist/agent/repo-reader.js.map +1 -0
- package/dist/agent/repo-underwriter.js +132 -0
- package/dist/agent/repo-underwriter.js.map +1 -0
- package/dist/agent/self-heal.js +134 -0
- package/dist/agent/self-heal.js.map +1 -0
- package/dist/agent/self-improver.js +148 -0
- package/dist/agent/self-improver.js.map +1 -0
- package/dist/agent/subagent.js +75 -0
- package/dist/agent/subagent.js.map +1 -0
- package/dist/agent/swe-agent.js +162 -0
- package/dist/agent/swe-agent.js.map +1 -0
- package/dist/agent/swe-planner.js +155 -0
- package/dist/agent/swe-planner.js.map +1 -0
- package/dist/agent/swe-verifier.js +113 -0
- package/dist/agent/swe-verifier.js.map +1 -0
- package/dist/cli/commands.js +167 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/index.js +179 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/repl.js +67 -0
- package/dist/cli/repl.js.map +1 -0
- package/dist/cli/run.js +762 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/version.js +14 -0
- package/dist/cli/version.js.map +1 -0
- package/dist/enterprise/audit.js +294 -0
- package/dist/enterprise/audit.js.map +1 -0
- package/dist/enterprise/guard.js +58 -0
- package/dist/enterprise/guard.js.map +1 -0
- package/dist/enterprise/index.js +99 -0
- package/dist/enterprise/index.js.map +1 -0
- package/dist/enterprise/policy.js +242 -0
- package/dist/enterprise/policy.js.map +1 -0
- package/dist/enterprise/quota.js +58 -0
- package/dist/enterprise/quota.js.map +1 -0
- package/dist/enterprise/tenant.js +143 -0
- package/dist/enterprise/tenant.js.map +1 -0
- package/dist/models/cost.js +13 -0
- package/dist/models/cost.js.map +1 -0
- package/dist/models/model-router.js +170 -0
- package/dist/models/model-router.js.map +1 -0
- package/dist/models/model.dto.js +61 -0
- package/dist/models/model.dto.js.map +1 -0
- package/dist/models/model.interface.js +3 -0
- package/dist/models/model.interface.js.map +1 -0
- package/dist/models/providers/mock.provider.js +35 -0
- package/dist/models/providers/mock.provider.js.map +1 -0
- package/dist/models/providers/ollama.provider.js +88 -0
- package/dist/models/providers/ollama.provider.js.map +1 -0
- package/dist/models/providers/openai-compatible.provider.js +106 -0
- package/dist/models/providers/openai-compatible.provider.js.map +1 -0
- package/dist/runtime/event-log.js +42 -0
- package/dist/runtime/event-log.js.map +1 -0
- package/dist/runtime/git.js +106 -0
- package/dist/runtime/git.js.map +1 -0
- package/dist/runtime/session-persist.js +60 -0
- package/dist/runtime/session-persist.js.map +1 -0
- package/dist/runtime/session-store.js +34 -0
- package/dist/runtime/session-store.js.map +1 -0
- package/dist/runtime/worktree.js +117 -0
- package/dist/runtime/worktree.js.map +1 -0
- package/dist/shared/config.js +184 -0
- package/dist/shared/config.js.map +1 -0
- package/dist/shared/errors.js +66 -0
- package/dist/shared/errors.js.map +1 -0
- package/dist/shared/logger.js +51 -0
- package/dist/shared/logger.js.map +1 -0
- package/dist/shared/types.js +9 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/skills/goal.js +60 -0
- package/dist/skills/goal.js.map +1 -0
- package/dist/skills/grill.js +129 -0
- package/dist/skills/grill.js.map +1 -0
- package/dist/skills/plan.js +40 -0
- package/dist/skills/plan.js.map +1 -0
- package/dist/tools/analysis/code-analyzer.js +136 -0
- package/dist/tools/analysis/code-analyzer.js.map +1 -0
- package/dist/tools/file/edit.tool.js +43 -0
- package/dist/tools/file/edit.tool.js.map +1 -0
- package/dist/tools/file/list.tool.js +36 -0
- package/dist/tools/file/list.tool.js.map +1 -0
- package/dist/tools/file/read.tool.js +34 -0
- package/dist/tools/file/read.tool.js.map +1 -0
- package/dist/tools/file/write.tool.js +39 -0
- package/dist/tools/file/write.tool.js.map +1 -0
- package/dist/tools/generator/code-generator.js +119 -0
- package/dist/tools/generator/code-generator.js.map +1 -0
- package/dist/tools/generator/test-generator.js +65 -0
- package/dist/tools/generator/test-generator.js.map +1 -0
- package/dist/tools/index.js +53 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/safe-path.js +36 -0
- package/dist/tools/safe-path.js.map +1 -0
- package/dist/tools/search/grep.tool.js +81 -0
- package/dist/tools/search/grep.tool.js.map +1 -0
- package/dist/tools/shell/exec.js +50 -0
- package/dist/tools/shell/exec.js.map +1 -0
- package/dist/tools/shell/run-shell.tool.js +49 -0
- package/dist/tools/shell/run-shell.tool.js.map +1 -0
- package/dist/tools/tool.interface.js +8 -0
- package/dist/tools/tool.interface.js.map +1 -0
- package/dist/tools/tool.registry.js +75 -0
- package/dist/tools/tool.registry.js.map +1 -0
- package/dist/tools/verify/build-check.tool.js +37 -0
- package/dist/tools/verify/build-check.tool.js.map +1 -0
- package/dist/tools/verify/test-run.tool.js +37 -0
- package/dist/tools/verify/test-run.tool.js.map +1 -0
- package/dist/web/auth.js +25 -0
- package/dist/web/auth.js.map +1 -0
- package/dist/web/public/index.html +39 -0
- package/dist/web/server.js +60 -0
- package/dist/web/server.js.map +1 -0
- package/docs//344/272/247/345/223/201/345/274/200/345/217/221/346/226/207/346/241/243.md +614 -0
- package/docs//344/274/201/344/270/232/351/203/250/347/275/262/344/270/216/345/220/210/350/247/204.md +267 -0
- package/docs//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +358 -0
- package/docs//345/270/270/350/247/201/351/227/256/351/242/230/344/270/216/346/225/205/351/232/234/346/216/222/346/237/245.md +130 -0
- package/docs//346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +303 -0
- package/docs//346/236/266/346/236/204/344/270/216API.md +238 -0
- package/docs//347/224/250/346/210/267/346/211/213/345/206/214.md +196 -0
- package/docs//351/203/250/347/275/262/346/214/207/345/215/227.md +165 -0
- package/docs//351/205/215/347/275/256/345/217/202/350/200/203.md +127 -0
- package/package.json +83 -0
- package/tool-schema.json +127 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-router.js","sourceRoot":"","sources":["../../src/models/model-router.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ollamaChatResponseSchema = exports.openAIChatResponseSchema = exports.openAIMessageSchema = void 0;
|
|
4
|
+
exports.parseToolArgs = parseToolArgs;
|
|
5
|
+
/**
|
|
6
|
+
* 飞虹 Code (Muse Code 参照复刻)
|
|
7
|
+
* 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
|
|
8
|
+
*
|
|
9
|
+
* 模型响应 zod 校验 + 工具参数归一化(供应商返回结构不可信,必须校验)
|
|
10
|
+
*/
|
|
11
|
+
const zod_1 = require("zod");
|
|
12
|
+
exports.openAIMessageSchema = zod_1.z.object({
|
|
13
|
+
role: zod_1.z.string(),
|
|
14
|
+
content: zod_1.z.string().nullable().optional(),
|
|
15
|
+
tool_calls: zod_1.z
|
|
16
|
+
.array(zod_1.z.object({
|
|
17
|
+
id: zod_1.z.string(),
|
|
18
|
+
type: zod_1.z.literal('function'),
|
|
19
|
+
function: zod_1.z.object({
|
|
20
|
+
name: zod_1.z.string(),
|
|
21
|
+
arguments: zod_1.z.union([zod_1.z.string(), zod_1.z.record(zod_1.z.string(), zod_1.z.unknown())]),
|
|
22
|
+
}),
|
|
23
|
+
}))
|
|
24
|
+
.optional(),
|
|
25
|
+
tool_call_id: zod_1.z.string().optional(),
|
|
26
|
+
});
|
|
27
|
+
exports.openAIChatResponseSchema = zod_1.z.object({
|
|
28
|
+
model: zod_1.z.string(),
|
|
29
|
+
choices: zod_1.z
|
|
30
|
+
.array(zod_1.z.object({ message: exports.openAIMessageSchema, finish_reason: zod_1.z.string().optional() }))
|
|
31
|
+
.min(1),
|
|
32
|
+
usage: zod_1.z
|
|
33
|
+
.object({
|
|
34
|
+
prompt_tokens: zod_1.z.number(),
|
|
35
|
+
completion_tokens: zod_1.z.number(),
|
|
36
|
+
total_tokens: zod_1.z.number(),
|
|
37
|
+
})
|
|
38
|
+
.optional(),
|
|
39
|
+
});
|
|
40
|
+
exports.ollamaChatResponseSchema = zod_1.z.object({
|
|
41
|
+
model: zod_1.z.string(),
|
|
42
|
+
message: exports.openAIMessageSchema,
|
|
43
|
+
done: zod_1.z.boolean().optional(),
|
|
44
|
+
prompt_eval_count: zod_1.z.number().optional(),
|
|
45
|
+
eval_count: zod_1.z.number().optional(),
|
|
46
|
+
});
|
|
47
|
+
/** 将模型返回的工具参数(可能是 JSON 字符串或对象)归一为对象 */
|
|
48
|
+
function parseToolArgs(raw) {
|
|
49
|
+
if (typeof raw === 'string') {
|
|
50
|
+
try {
|
|
51
|
+
return JSON.parse(raw);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return {};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (raw && typeof raw === 'object')
|
|
58
|
+
return raw;
|
|
59
|
+
return {};
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=model.dto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.dto.js","sourceRoot":"","sources":["../../src/models/model.dto.ts"],"names":[],"mappings":";;;AAiDA,sCAUC;AA3DD;;;;;GAKG;AACH,6BAAwB;AAEX,QAAA,mBAAmB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC1C,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;IAChB,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACzC,UAAU,EAAE,OAAC;SACV,KAAK,CACJ,OAAC,CAAC,MAAM,CAAC;QACP,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE;QACd,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,UAAU,CAAC;QAC3B,QAAQ,EAAE,OAAC,CAAC,MAAM,CAAC;YACjB,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;YAChB,SAAS,EAAE,OAAC,CAAC,KAAK,CAAC,CAAC,OAAC,CAAC,MAAM,EAAE,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,MAAM,EAAE,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;SACpE,CAAC;KACH,CAAC,CACH;SACA,QAAQ,EAAE;IACb,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC;AAEU,QAAA,wBAAwB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC/C,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE;IACjB,OAAO,EAAE,OAAC;SACP,KAAK,CAAC,OAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,2BAAmB,EAAE,aAAa,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;SACvF,GAAG,CAAC,CAAC,CAAC;IACT,KAAK,EAAE,OAAC;SACL,MAAM,CAAC;QACN,aAAa,EAAE,OAAC,CAAC,MAAM,EAAE;QACzB,iBAAiB,EAAE,OAAC,CAAC,MAAM,EAAE;QAC7B,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE;KACzB,CAAC;SACD,QAAQ,EAAE;CACd,CAAC,CAAC;AAEU,QAAA,wBAAwB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC/C,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE;IACjB,OAAO,EAAE,2BAAmB;IAC5B,IAAI,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC5B,iBAAiB,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACxC,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAClC,CAAC,CAAC;AAEH,uCAAuC;AACvC,SAAgB,aAAa,CAAC,GAAY;IACxC,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IACD,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAA8B,CAAC;IAC1E,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.interface.js","sourceRoot":"","sources":["../../src/models/model.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ScriptedMockProvider = void 0;
|
|
4
|
+
const ZERO_USAGE = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };
|
|
5
|
+
/**
|
|
6
|
+
* 按预设步骤依次返回响应的 provider。
|
|
7
|
+
* orchestrator 每轮调用一次 chat(),依次消费 steps;
|
|
8
|
+
* 步骤耗尽后固定返回最后一步(通常用于最终总结,不含 toolCalls)。
|
|
9
|
+
*/
|
|
10
|
+
class ScriptedMockProvider {
|
|
11
|
+
steps;
|
|
12
|
+
id = 'mock';
|
|
13
|
+
model = 'mock-model';
|
|
14
|
+
tags = ['code-gen', 'cheap'];
|
|
15
|
+
costPer1k = 0;
|
|
16
|
+
idx = 0;
|
|
17
|
+
constructor(steps) {
|
|
18
|
+
this.steps = steps;
|
|
19
|
+
if (steps.length === 0)
|
|
20
|
+
throw new Error('ScriptedMockProvider 至少需要一个步骤');
|
|
21
|
+
}
|
|
22
|
+
async chat(_req) {
|
|
23
|
+
const step = this.steps[Math.min(this.idx, this.steps.length - 1)];
|
|
24
|
+
this.idx += 1;
|
|
25
|
+
return {
|
|
26
|
+
message: step.message,
|
|
27
|
+
usage: step.usage ?? ZERO_USAGE,
|
|
28
|
+
providerId: this.id,
|
|
29
|
+
model: this.model,
|
|
30
|
+
costUsd: 0,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.ScriptedMockProvider = ScriptedMockProvider;
|
|
35
|
+
//# sourceMappingURL=mock.provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock.provider.js","sourceRoot":"","sources":["../../../src/models/providers/mock.provider.ts"],"names":[],"mappings":";;;AAeA,MAAM,UAAU,GAAe,EAAE,YAAY,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;AAExF;;;;GAIG;AACH,MAAa,oBAAoB;IAOF;IANpB,EAAE,GAAG,MAAM,CAAC;IACZ,KAAK,GAAG,YAAY,CAAC;IACrB,IAAI,GAAoB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC9C,SAAS,GAAG,CAAC,CAAC;IACf,GAAG,GAAG,CAAC,CAAC;IAEhB,YAA6B,KAAiB;QAAjB,UAAK,GAAL,KAAK,CAAY;QAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAiB;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACnE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QACd,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,UAAU;YAC/B,UAAU,EAAE,IAAI,CAAC,EAAE;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,CAAC;SACX,CAAC;IACJ,CAAC;CACF;AAtBD,oDAsBC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OllamaProvider = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* 飞虹 Code (Muse Code 参照复刻)
|
|
6
|
+
* 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
|
|
7
|
+
*
|
|
8
|
+
* Ollama 本地供应商(数据不出本机,零成本)
|
|
9
|
+
*/
|
|
10
|
+
const errors_1 = require("../../shared/errors");
|
|
11
|
+
const model_dto_1 = require("../model.dto");
|
|
12
|
+
const cost_1 = require("../cost");
|
|
13
|
+
class OllamaProvider {
|
|
14
|
+
id;
|
|
15
|
+
model;
|
|
16
|
+
tags;
|
|
17
|
+
costPer1k;
|
|
18
|
+
baseURL;
|
|
19
|
+
constructor(cfg) {
|
|
20
|
+
this.id = cfg.id;
|
|
21
|
+
this.model = cfg.model ?? cfg.id;
|
|
22
|
+
this.tags = cfg.tags;
|
|
23
|
+
this.costPer1k = cfg.costPer1k ?? 0;
|
|
24
|
+
this.baseURL = cfg.baseURL.replace(/\/$/, '');
|
|
25
|
+
}
|
|
26
|
+
async chat(req) {
|
|
27
|
+
const body = {
|
|
28
|
+
model: this.model,
|
|
29
|
+
messages: req.messages.map((m) => ({
|
|
30
|
+
role: m.role,
|
|
31
|
+
content: m.content,
|
|
32
|
+
tool_calls: m.toolCalls && m.toolCalls.length > 0 ? m.toolCalls : undefined,
|
|
33
|
+
})),
|
|
34
|
+
tools: req.tools && req.tools.length > 0 ? req.tools : undefined,
|
|
35
|
+
stream: false,
|
|
36
|
+
};
|
|
37
|
+
const controller = new AbortController();
|
|
38
|
+
let timer;
|
|
39
|
+
if (req.timeoutMs && req.timeoutMs > 0) {
|
|
40
|
+
timer = setTimeout(() => controller.abort(), req.timeoutMs);
|
|
41
|
+
}
|
|
42
|
+
let res;
|
|
43
|
+
try {
|
|
44
|
+
res = await fetch(`${this.baseURL}/api/chat`, {
|
|
45
|
+
method: 'POST',
|
|
46
|
+
headers: { 'Content-Type': 'application/json' },
|
|
47
|
+
body: JSON.stringify(body),
|
|
48
|
+
signal: controller.signal,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
throw new errors_1.ModelError(`网络请求失败: ${e instanceof Error ? e.message : String(e)}`, this.id);
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
if (timer)
|
|
56
|
+
clearTimeout(timer);
|
|
57
|
+
}
|
|
58
|
+
if (!res.ok) {
|
|
59
|
+
const text = await res.text().catch(() => '');
|
|
60
|
+
throw new errors_1.ModelError(`HTTP ${res.status} ${text.slice(0, 200)}`, this.id);
|
|
61
|
+
}
|
|
62
|
+
const json = await res.json().catch(() => undefined);
|
|
63
|
+
const parsed = model_dto_1.ollamaChatResponseSchema.safeParse(json);
|
|
64
|
+
if (!parsed.success) {
|
|
65
|
+
throw new errors_1.ModelError(`响应结构校验失败: ${parsed.error.message}`, this.id);
|
|
66
|
+
}
|
|
67
|
+
const msg = parsed.data.message;
|
|
68
|
+
const toolCalls = msg.tool_calls?.map((tc) => ({
|
|
69
|
+
id: tc.id,
|
|
70
|
+
name: tc.function.name,
|
|
71
|
+
arguments: (0, model_dto_1.parseToolArgs)(tc.function.arguments),
|
|
72
|
+
}));
|
|
73
|
+
const usage = {
|
|
74
|
+
promptTokens: parsed.data.prompt_eval_count ?? 0,
|
|
75
|
+
completionTokens: parsed.data.eval_count ?? 0,
|
|
76
|
+
totalTokens: (parsed.data.prompt_eval_count ?? 0) + (parsed.data.eval_count ?? 0),
|
|
77
|
+
};
|
|
78
|
+
return {
|
|
79
|
+
message: { role: 'assistant', content: msg.content ?? '', toolCalls },
|
|
80
|
+
usage,
|
|
81
|
+
providerId: this.id,
|
|
82
|
+
model: this.model,
|
|
83
|
+
costUsd: (0, cost_1.estimateCost)(usage, this.costPer1k),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
exports.OllamaProvider = OllamaProvider;
|
|
88
|
+
//# sourceMappingURL=ollama.provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.provider.js","sourceRoot":"","sources":["../../../src/models/providers/ollama.provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OpenAICompatibleProvider = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* 飞虹 Code (Muse Code 参照复刻)
|
|
6
|
+
* 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
|
|
7
|
+
*
|
|
8
|
+
* OpenAI 兼容供应商(DeepSeek / 通义 / OpenRouter 等 OpenAI 协议接口)
|
|
9
|
+
*/
|
|
10
|
+
const errors_1 = require("../../shared/errors");
|
|
11
|
+
const model_dto_1 = require("../model.dto");
|
|
12
|
+
const cost_1 = require("../cost");
|
|
13
|
+
class OpenAICompatibleProvider {
|
|
14
|
+
id;
|
|
15
|
+
model;
|
|
16
|
+
tags;
|
|
17
|
+
costPer1k;
|
|
18
|
+
baseURL;
|
|
19
|
+
apiKey;
|
|
20
|
+
constructor(cfg) {
|
|
21
|
+
this.id = cfg.id;
|
|
22
|
+
this.model = cfg.model ?? cfg.id;
|
|
23
|
+
this.tags = cfg.tags;
|
|
24
|
+
this.costPer1k = cfg.costPer1k ?? 0;
|
|
25
|
+
this.baseURL = cfg.baseURL.replace(/\/$/, '');
|
|
26
|
+
this.apiKey = cfg.apiKey;
|
|
27
|
+
}
|
|
28
|
+
async chat(req) {
|
|
29
|
+
const body = {
|
|
30
|
+
model: this.model,
|
|
31
|
+
messages: req.messages.map((m) => ({
|
|
32
|
+
role: m.role,
|
|
33
|
+
content: m.content,
|
|
34
|
+
tool_calls: m.toolCalls?.map((t) => ({
|
|
35
|
+
id: t.id,
|
|
36
|
+
type: 'function',
|
|
37
|
+
function: { name: t.name, arguments: JSON.stringify(t.arguments) },
|
|
38
|
+
})),
|
|
39
|
+
tool_call_id: m.toolCallId,
|
|
40
|
+
})),
|
|
41
|
+
tools: req.tools && req.tools.length > 0
|
|
42
|
+
? req.tools.map((t) => ({
|
|
43
|
+
type: 'function',
|
|
44
|
+
function: { name: t.name, description: t.description, parameters: t.parameters },
|
|
45
|
+
}))
|
|
46
|
+
: undefined,
|
|
47
|
+
temperature: req.temperature ?? 0,
|
|
48
|
+
max_tokens: req.maxTokens ?? 4096,
|
|
49
|
+
};
|
|
50
|
+
const controller = new AbortController();
|
|
51
|
+
let timer;
|
|
52
|
+
if (req.timeoutMs && req.timeoutMs > 0) {
|
|
53
|
+
timer = setTimeout(() => controller.abort(), req.timeoutMs);
|
|
54
|
+
}
|
|
55
|
+
let res;
|
|
56
|
+
try {
|
|
57
|
+
res = await fetch(`${this.baseURL}/chat/completions`, {
|
|
58
|
+
method: 'POST',
|
|
59
|
+
headers: {
|
|
60
|
+
'Content-Type': 'application/json',
|
|
61
|
+
...(this.apiKey ? { Authorization: `Bearer ${this.apiKey}` } : {}),
|
|
62
|
+
},
|
|
63
|
+
body: JSON.stringify(body),
|
|
64
|
+
signal: controller.signal,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
catch (e) {
|
|
68
|
+
throw new errors_1.ModelError(`网络请求失败: ${e instanceof Error ? e.message : String(e)}`, this.id);
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
if (timer)
|
|
72
|
+
clearTimeout(timer);
|
|
73
|
+
}
|
|
74
|
+
if (!res.ok) {
|
|
75
|
+
const text = await res.text().catch(() => '');
|
|
76
|
+
throw new errors_1.ModelError(`HTTP ${res.status} ${text.slice(0, 200)}`, this.id);
|
|
77
|
+
}
|
|
78
|
+
const json = await res.json().catch(() => undefined);
|
|
79
|
+
const parsed = model_dto_1.openAIChatResponseSchema.safeParse(json);
|
|
80
|
+
if (!parsed.success) {
|
|
81
|
+
throw new errors_1.ModelError(`响应结构校验失败: ${parsed.error.message}`, this.id);
|
|
82
|
+
}
|
|
83
|
+
const choice = parsed.data.choices[0];
|
|
84
|
+
const usage = parsed.data.usage
|
|
85
|
+
? {
|
|
86
|
+
promptTokens: parsed.data.usage.prompt_tokens,
|
|
87
|
+
completionTokens: parsed.data.usage.completion_tokens,
|
|
88
|
+
totalTokens: parsed.data.usage.total_tokens,
|
|
89
|
+
}
|
|
90
|
+
: { promptTokens: 0, completionTokens: 0, totalTokens: 0 };
|
|
91
|
+
const toolCalls = choice.message.tool_calls?.map((tc) => ({
|
|
92
|
+
id: tc.id,
|
|
93
|
+
name: tc.function.name,
|
|
94
|
+
arguments: (0, model_dto_1.parseToolArgs)(tc.function.arguments),
|
|
95
|
+
}));
|
|
96
|
+
return {
|
|
97
|
+
message: { role: 'assistant', content: choice.message.content ?? '', toolCalls },
|
|
98
|
+
usage,
|
|
99
|
+
providerId: this.id,
|
|
100
|
+
model: this.model,
|
|
101
|
+
costUsd: (0, cost_1.estimateCost)(usage, this.costPer1k),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
exports.OpenAICompatibleProvider = OpenAICompatibleProvider;
|
|
106
|
+
//# sourceMappingURL=openai-compatible.provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-compatible.provider.js","sourceRoot":"","sources":["../../../src/models/providers/openai-compatible.provider.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACH,gDAAiD;AAIjD,4CAAuE;AACvE,kCAAuC;AAEvC,MAAa,wBAAwB;IAC1B,EAAE,CAAS;IACX,KAAK,CAAS;IACd,IAAI,CAAkB;IACtB,SAAS,CAAS;IACV,OAAO,CAAS;IAChB,MAAM,CAAU;IAEjC,YAAY,GAAmB;QAC7B,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAgB;QACzB,MAAM,IAAI,GAAG;YACX,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACjC,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,UAAU,EAAE,CAAC,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACnC,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,IAAI,EAAE,UAAU;oBAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE;iBACnE,CAAC,CAAC;gBACH,YAAY,EAAE,CAAC,CAAC,UAAU;aAC3B,CAAC,CAAC;YACH,KAAK,EACH,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;gBAC/B,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAiB,EAAE,EAAE,CAAC,CAAC;oBACpC,IAAI,EAAE,UAAU;oBAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE;iBACjF,CAAC,CAAC;gBACL,CAAC,CAAC,SAAS;YACf,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,CAAC;YACjC,UAAU,EAAE,GAAG,CAAC,SAAS,IAAI,IAAI;SAClC,CAAC;QAEF,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,IAAI,KAAiC,CAAC;QACtC,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;YACvC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,GAAa,CAAC;QAClB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,mBAAmB,EAAE;gBACpD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACnE;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAC1B,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,mBAAU,CAAC,WAAW,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACzF,CAAC;gBAAS,CAAC;YACT,IAAI,KAAK;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9C,MAAM,IAAI,mBAAU,CAAC,QAAQ,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,IAAI,GAAY,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,oCAAwB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,mBAAU,CAAC,aAAa,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK;YAC7B,CAAC,CAAC;gBACE,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa;gBAC7C,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB;gBACrD,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY;aAC5C;YACH,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;QAE7D,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACxD,EAAE,EAAE,EAAE,CAAC,EAAE;YACT,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI;YACtB,SAAS,EAAE,IAAA,yBAAa,EAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;SAChD,CAAC,CAAC,CAAC;QAEJ,OAAO;YACL,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,SAAS,EAAE;YAChF,KAAK;YACL,UAAU,EAAE,IAAI,CAAC,EAAE;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAA,mBAAY,EAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC;SAC7C,CAAC;IACJ,CAAC;CACF;AAlGD,4DAkGC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EventLog = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* 飞虹 Code (Muse Code 参照复刻)
|
|
6
|
+
* 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
|
|
7
|
+
*
|
|
8
|
+
* 事件日志(append-only JSONL,单一可信源)。
|
|
9
|
+
* 所有模型调用、工具调用、结果都落盘,便于审计与 M3 长时任务恢复。
|
|
10
|
+
*/
|
|
11
|
+
const promises_1 = require("fs/promises");
|
|
12
|
+
const path_1 = require("path");
|
|
13
|
+
const os_1 = require("os");
|
|
14
|
+
const logger_1 = require("../shared/logger");
|
|
15
|
+
function expandHome(p) {
|
|
16
|
+
return p.startsWith('~') ? p.replace(/^~/, (0, os_1.homedir)()) : p;
|
|
17
|
+
}
|
|
18
|
+
class EventLog {
|
|
19
|
+
runId;
|
|
20
|
+
file;
|
|
21
|
+
constructor(runId, logDir) {
|
|
22
|
+
this.runId = runId;
|
|
23
|
+
this.file = `${expandHome(logDir)}/${runId}.jsonl`;
|
|
24
|
+
}
|
|
25
|
+
async append(type, payload) {
|
|
26
|
+
const ev = { ts: new Date().toISOString(), runId: this.runId, type, ...payload };
|
|
27
|
+
try {
|
|
28
|
+
await (0, promises_1.mkdir)((0, path_1.dirname)(this.file), { recursive: true });
|
|
29
|
+
await (0, promises_1.appendFile)(this.file, JSON.stringify(ev) + '\n', 'utf8');
|
|
30
|
+
}
|
|
31
|
+
catch (e) {
|
|
32
|
+
logger_1.logger.warn('event-log append failed', {
|
|
33
|
+
error: e instanceof Error ? e.message : String(e),
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
get filePath() {
|
|
38
|
+
return this.file;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.EventLog = EventLog;
|
|
42
|
+
//# sourceMappingURL=event-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-log.js","sourceRoot":"","sources":["../../src/runtime/event-log.ts"],"names":[],"mappings":";;;AAAA;;;;;;GAMG;AACH,0CAAgD;AAChD,+BAA+B;AAC/B,2BAA6B;AAE7B,6CAA0C;AAuB1C,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,IAAA,YAAO,GAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,MAAa,QAAQ;IACF,KAAK,CAAQ;IACb,IAAI,CAAS;IAE9B,YAAY,KAAY,EAAE,MAAc;QACtC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAe,EAAE,OAAgC;QAC5D,MAAM,EAAE,GAAe,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC;QAC7F,IAAI,CAAC;YACH,MAAM,IAAA,gBAAK,EAAC,IAAA,cAAO,EAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACrD,MAAM,IAAA,qBAAU,EAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;QACjE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,eAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;gBACrC,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;aAClD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;CACF;AAxBD,4BAwBC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isGitRepo = isGitRepo;
|
|
4
|
+
exports.gitDiff = gitDiff;
|
|
5
|
+
exports.gitRollback = gitRollback;
|
|
6
|
+
/**
|
|
7
|
+
* 飞虹 Code (Muse Code 参照复刻)
|
|
8
|
+
* 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
|
|
9
|
+
*
|
|
10
|
+
* Git 辅助(M3 diff/rollback):仅作用于会话 touchedFiles,绝不整仓回滚,避免误删。
|
|
11
|
+
* 非 git 仓库时安全退出并提示,不执行任何破坏性操作。
|
|
12
|
+
*/
|
|
13
|
+
const child_process_1 = require("child_process");
|
|
14
|
+
const fs_1 = require("fs");
|
|
15
|
+
const path_1 = require("path");
|
|
16
|
+
const os_1 = require("os");
|
|
17
|
+
/** 跨平台空设备路径(Windows 用 nul,POSIX 用 /dev/null) */
|
|
18
|
+
const NULL_DEVICE = (0, os_1.platform)() === 'win32' ? 'nul' : '/dev/null';
|
|
19
|
+
function git(args, cwd) {
|
|
20
|
+
return new Promise((resolve) => {
|
|
21
|
+
const child = (0, child_process_1.spawn)('git', args, { cwd, shell: false });
|
|
22
|
+
let out = '';
|
|
23
|
+
let err = '';
|
|
24
|
+
child.stdout?.on('data', (d) => (out += d.toString()));
|
|
25
|
+
child.stderr?.on('data', (d) => (err += d.toString()));
|
|
26
|
+
child.on('close', (code) => resolve({ code: code ?? 1, out, err }));
|
|
27
|
+
child.on('error', (e) => resolve({ code: 1, out, err: e.message }));
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
function isGitRepo(cwd) {
|
|
31
|
+
return (0, fs_1.existsSync)((0, path_1.join)(cwd, '.git'));
|
|
32
|
+
}
|
|
33
|
+
/** 生成会话作用域的 diff(追踪文件走 git diff,未跟踪文件走 --no-index) */
|
|
34
|
+
async function gitDiff(cwd, files) {
|
|
35
|
+
if (!isGitRepo(cwd)) {
|
|
36
|
+
return '(当前目录不是 git 仓库,无法生成 diff;请手动核对 touchedFiles)';
|
|
37
|
+
}
|
|
38
|
+
const parts = [];
|
|
39
|
+
const target = files && files.length ? files : null;
|
|
40
|
+
const trackedArgs = ['diff', '--color=never'];
|
|
41
|
+
if (target)
|
|
42
|
+
trackedArgs.push('--', ...target);
|
|
43
|
+
const tracked = await git(trackedArgs, cwd);
|
|
44
|
+
if (tracked.out.trim())
|
|
45
|
+
parts.push(tracked.out);
|
|
46
|
+
const status = await git(['status', '--porcelain', '--'], cwd);
|
|
47
|
+
const untracked = status.out
|
|
48
|
+
.split('\n')
|
|
49
|
+
.map((l) => l.trim())
|
|
50
|
+
.filter(Boolean)
|
|
51
|
+
.filter((l) => l.startsWith('??'))
|
|
52
|
+
.map((l) => l.slice(2).trim());
|
|
53
|
+
const untrackedToShow = target ? untracked.filter((f) => target.includes(f)) : untracked;
|
|
54
|
+
for (const f of untrackedToShow) {
|
|
55
|
+
const abs = (0, path_1.join)(cwd, f);
|
|
56
|
+
if (!(0, fs_1.existsSync)(abs))
|
|
57
|
+
continue;
|
|
58
|
+
const ni = await git(['diff', '--no-index', '--color=never', NULL_DEVICE, abs.replace(/\\/g, '/')], cwd);
|
|
59
|
+
parts.push(ni.out || `(新增文件: ${f})`);
|
|
60
|
+
}
|
|
61
|
+
return parts.join('\n').trim() || '(无变更)';
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 回滚会话 touchedFiles:
|
|
65
|
+
* - 已跟踪文件 → git checkout -- <file>
|
|
66
|
+
* - 未跟踪文件 → 删除
|
|
67
|
+
* 未确认(--yes)或非 git 仓库时拒绝执行,绝不静默破坏。
|
|
68
|
+
*/
|
|
69
|
+
async function gitRollback(cwd, files, opts = {}) {
|
|
70
|
+
const res = { reverted: [], removed: [], errors: [] };
|
|
71
|
+
if (!isGitRepo(cwd)) {
|
|
72
|
+
res.errors.push('当前目录不是 git 仓库,回滚已中止(避免误删)');
|
|
73
|
+
return res;
|
|
74
|
+
}
|
|
75
|
+
if (!opts.yes) {
|
|
76
|
+
res.errors.push('回滚是破坏性操作,请加 --yes 显式确认');
|
|
77
|
+
return res;
|
|
78
|
+
}
|
|
79
|
+
const status = await git(['status', '--porcelain', '--'], cwd);
|
|
80
|
+
const untracked = new Set(status.out
|
|
81
|
+
.split('\n')
|
|
82
|
+
.map((l) => l.trim())
|
|
83
|
+
.filter(Boolean)
|
|
84
|
+
.filter((l) => l.startsWith('??'))
|
|
85
|
+
.map((l) => l.slice(2).trim()));
|
|
86
|
+
for (const f of files) {
|
|
87
|
+
if (untracked.has(f)) {
|
|
88
|
+
try {
|
|
89
|
+
(0, fs_1.rmSync)((0, path_1.join)(cwd, f), { force: true, recursive: true });
|
|
90
|
+
res.removed.push(f);
|
|
91
|
+
}
|
|
92
|
+
catch (e) {
|
|
93
|
+
res.errors.push(`${f}: ${e instanceof Error ? e.message : String(e)}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
const r = await git(['checkout', '--', f], cwd);
|
|
98
|
+
if (r.code === 0)
|
|
99
|
+
res.reverted.push(f);
|
|
100
|
+
else
|
|
101
|
+
res.errors.push(`${f}: ${r.err.trim() || 'checkout 失败'}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return res;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/runtime/git.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.saveCheckpoint = saveCheckpoint;
|
|
4
|
+
exports.loadCheckpoint = loadCheckpoint;
|
|
5
|
+
exports.listCheckpoints = listCheckpoints;
|
|
6
|
+
exports.updateStatus = updateStatus;
|
|
7
|
+
/**
|
|
8
|
+
* 飞虹 Code (Muse Code 参照复刻)
|
|
9
|
+
* 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
|
|
10
|
+
*
|
|
11
|
+
* 会话检查点持久化(M3 恢复与审计):
|
|
12
|
+
* - 每次迭代后把完整对话、迭代计数、成本、被改动文件落盘为 <runId>.session.json
|
|
13
|
+
* - resume 读取检查点续跑;sessions 列出历史;diff/rollback 依赖 touchedFiles
|
|
14
|
+
*/
|
|
15
|
+
const promises_1 = require("fs/promises");
|
|
16
|
+
const fs_1 = require("fs");
|
|
17
|
+
const path_1 = require("path");
|
|
18
|
+
/** 检查点落盘(文件名固定,便于 list/load) */
|
|
19
|
+
async function saveCheckpoint(logDir, cp) {
|
|
20
|
+
await (0, promises_1.mkdir)(logDir, { recursive: true });
|
|
21
|
+
const file = (0, path_1.join)(logDir, `${cp.runId}.session.json`);
|
|
22
|
+
await (0, promises_1.writeFile)(file, JSON.stringify(cp, null, 2), 'utf8');
|
|
23
|
+
}
|
|
24
|
+
async function loadCheckpoint(logDir, runId) {
|
|
25
|
+
const file = (0, path_1.join)(logDir, `${runId}.session.json`);
|
|
26
|
+
if (!(0, fs_1.existsSync)(file))
|
|
27
|
+
return null;
|
|
28
|
+
try {
|
|
29
|
+
return JSON.parse(await (0, promises_1.readFile)(file, 'utf8'));
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async function listCheckpoints(logDir) {
|
|
36
|
+
if (!(0, fs_1.existsSync)(logDir))
|
|
37
|
+
return [];
|
|
38
|
+
const files = (await (0, promises_1.readdir)(logDir)).filter((f) => f.endsWith('.session.json'));
|
|
39
|
+
const out = [];
|
|
40
|
+
for (const f of files) {
|
|
41
|
+
try {
|
|
42
|
+
const cp = JSON.parse(await (0, promises_1.readFile)((0, path_1.join)(logDir, f), 'utf8'));
|
|
43
|
+
if (cp && cp.runId)
|
|
44
|
+
out.push(cp);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
/* 跳过损坏文件 */
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return out.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
|
|
51
|
+
}
|
|
52
|
+
async function updateStatus(logDir, runId, status) {
|
|
53
|
+
const cp = await loadCheckpoint(logDir, runId);
|
|
54
|
+
if (!cp)
|
|
55
|
+
return;
|
|
56
|
+
cp.status = status;
|
|
57
|
+
cp.updatedAt = new Date().toISOString();
|
|
58
|
+
await saveCheckpoint(logDir, cp);
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=session-persist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-persist.js","sourceRoot":"","sources":["../../src/runtime/session-persist.ts"],"names":[],"mappings":";;AAgCA,wCAIC;AAED,wCAQC;AAED,0CAaC;AAED,oCAMC;AArED;;;;;;;GAOG;AACH,0CAAkE;AAClE,2BAAgC;AAChC,+BAA4B;AAqB5B,gCAAgC;AACzB,KAAK,UAAU,cAAc,CAAC,MAAc,EAAE,EAAqB;IACxE,MAAM,IAAA,gBAAK,EAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,IAAA,WAAI,EAAC,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,eAAe,CAAC,CAAC;IACtD,MAAM,IAAA,oBAAS,EAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAC7D,CAAC;AAEM,KAAK,UAAU,cAAc,CAAC,MAAc,EAAE,KAAY;IAC/D,MAAM,IAAI,GAAG,IAAA,WAAI,EAAC,MAAM,EAAE,GAAG,KAAK,eAAe,CAAC,CAAC;IACnD,IAAI,CAAC,IAAA,eAAU,EAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,IAAA,mBAAQ,EAAC,IAAI,EAAE,MAAM,CAAC,CAAsB,CAAC;IACvE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,eAAe,CAAC,MAAc;IAClD,IAAI,CAAC,IAAA,eAAU,EAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,KAAK,GAAG,CAAC,MAAM,IAAA,kBAAO,EAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC;IACjF,MAAM,GAAG,GAAwB,EAAE,CAAC;IACpC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAA,mBAAQ,EAAC,IAAA,WAAI,EAAC,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAsB,CAAC;YACpF,IAAI,EAAE,IAAI,EAAE,CAAC,KAAK;gBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AACpE,CAAC;AAEM,KAAK,UAAU,YAAY,CAAC,MAAc,EAAE,KAAY,EAAE,MAAqB;IACpF,MAAM,EAAE,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC/C,IAAI,CAAC,EAAE;QAAE,OAAO;IAChB,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC;IACnB,EAAE,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACxC,MAAM,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SessionStore = void 0;
|
|
4
|
+
class SessionStore {
|
|
5
|
+
state;
|
|
6
|
+
constructor(runId, cwd) {
|
|
7
|
+
const now = new Date().toISOString();
|
|
8
|
+
this.state = { runId, cwd, messages: [], createdAt: now, updatedAt: now };
|
|
9
|
+
}
|
|
10
|
+
get runId() {
|
|
11
|
+
return this.state.runId;
|
|
12
|
+
}
|
|
13
|
+
get messages() {
|
|
14
|
+
return this.state.messages;
|
|
15
|
+
}
|
|
16
|
+
append(msg) {
|
|
17
|
+
this.state.messages.push(msg);
|
|
18
|
+
this.state.updatedAt = new Date().toISOString();
|
|
19
|
+
}
|
|
20
|
+
snapshot() {
|
|
21
|
+
return structuredClone(this.state);
|
|
22
|
+
}
|
|
23
|
+
/** 从持久化检查点恢复会话(M3 resume 用) */
|
|
24
|
+
static restore(state) {
|
|
25
|
+
const inst = new SessionStore(state.runId, state.cwd);
|
|
26
|
+
inst.state = {
|
|
27
|
+
...structuredClone(state),
|
|
28
|
+
messages: structuredClone(state.messages),
|
|
29
|
+
};
|
|
30
|
+
return inst;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.SessionStore = SessionStore;
|
|
34
|
+
//# sourceMappingURL=session-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/runtime/session-store.ts"],"names":[],"mappings":";;;AAiBA,MAAa,YAAY;IACf,KAAK,CAAe;IAE5B,YAAY,KAAY,EAAE,GAAW;QACnC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC,KAAK,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;IAC5E,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IAC1B,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,GAAgB;QACrB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAClD,CAAC;IAED,QAAQ;QACN,OAAO,eAAe,CAAC,IAAI,CAAC,KAAK,CAAiB,CAAC;IACrD,CAAC;IAED,+BAA+B;IAC/B,MAAM,CAAC,OAAO,CAAC,KAAmB;QAChC,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QACrD,IAA2C,CAAC,KAAK,GAAG;YACnD,GAAG,eAAe,CAAC,KAAK,CAAC;YACzB,QAAQ,EAAE,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC;SAC1C,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAlCD,oCAkCC"}
|