flycode-mcp 1.9.1 → 1.10.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 (63) hide show
  1. package/README.md +69 -18
  2. package/dist/flycode-mcp.min.js +2 -0
  3. package/package.json +21 -8
  4. package/dist/clients/authClient.js +0 -43
  5. package/dist/clients/authClient.js.map +0 -1
  6. package/dist/clients/databaseFunctionClient.js +0 -16
  7. package/dist/clients/databaseFunctionClient.js.map +0 -1
  8. package/dist/clients/entityClient.js +0 -28
  9. package/dist/clients/entityClient.js.map +0 -1
  10. package/dist/clients/formClient.js +0 -30
  11. package/dist/clients/formClient.js.map +0 -1
  12. package/dist/clients/functionClient.js +0 -30
  13. package/dist/clients/functionClient.js.map +0 -1
  14. package/dist/clients/logicClient.js +0 -45
  15. package/dist/clients/logicClient.js.map +0 -1
  16. package/dist/clients/runClient.js +0 -16
  17. package/dist/clients/runClient.js.map +0 -1
  18. package/dist/clients/types.js +0 -7
  19. package/dist/clients/types.js.map +0 -1
  20. package/dist/index.js +0 -53
  21. package/dist/index.js.map +0 -1
  22. package/dist/service/auth.js +0 -84
  23. package/dist/service/auth.js.map +0 -1
  24. package/dist/service/logic.js +0 -261
  25. package/dist/service/logic.js.map +0 -1
  26. package/dist/store/tenant.js +0 -20
  27. package/dist/store/tenant.js.map +0 -1
  28. package/dist/store/token.js +0 -25
  29. package/dist/store/token.js.map +0 -1
  30. package/dist/tools/common.js +0 -61
  31. package/dist/tools/common.js.map +0 -1
  32. package/dist/tools/database-function/read.js +0 -98
  33. package/dist/tools/database-function/read.js.map +0 -1
  34. package/dist/tools/entity/read.js +0 -169
  35. package/dist/tools/entity/read.js.map +0 -1
  36. package/dist/tools/entity/schemas.js +0 -65
  37. package/dist/tools/entity/schemas.js.map +0 -1
  38. package/dist/tools/form/read.js +0 -202
  39. package/dist/tools/form/read.js.map +0 -1
  40. package/dist/tools/function/read.js +0 -187
  41. package/dist/tools/function/read.js.map +0 -1
  42. package/dist/tools/logic/read.js +0 -170
  43. package/dist/tools/logic/read.js.map +0 -1
  44. package/dist/tools/logic/schemas.js +0 -122
  45. package/dist/tools/logic/schemas.js.map +0 -1
  46. package/dist/tools/logic/write.js +0 -296
  47. package/dist/tools/logic/write.js.map +0 -1
  48. package/dist/tools/run/read.js +0 -65
  49. package/dist/tools/run/read.js.map +0 -1
  50. package/dist/utils/config.js +0 -26
  51. package/dist/utils/config.js.map +0 -1
  52. package/dist/utils/date.js +0 -45
  53. package/dist/utils/date.js.map +0 -1
  54. package/dist/utils/error.js +0 -30
  55. package/dist/utils/error.js.map +0 -1
  56. package/dist/utils/mcp-types.js +0 -2
  57. package/dist/utils/mcp-types.js.map +0 -1
  58. package/dist/utils/request.js +0 -74
  59. package/dist/utils/request.js.map +0 -1
  60. package/dist/utils/snowflake.js +0 -119
  61. package/dist/utils/snowflake.js.map +0 -1
  62. package/dist/utils/str-replace.js +0 -353
  63. package/dist/utils/str-replace.js.map +0 -1
@@ -1,30 +0,0 @@
1
- /**
2
- * 统一提取错误信息为可读字符串,供 MCP 工具的 catch 兜底使用。
3
- *
4
- * 背景:原先各 handler 的 catch 直接 `JSON.stringify(err)` 兜底,
5
- * 而 Error 实例的 message 等字段多为非枚举属性,`JSON.stringify`
6
- * 会得到 `"{}"`,导致模型只看到空对象、无法获知真实失败原因
7
- * (见代码审查 #3 / #8)。此函数把该逻辑收敛到一处。
8
- *
9
- * 规则:
10
- * - AxiosError(携带 response.data):优先返回服务端响应体,保持原行为,
11
- * 将后端错误 JSON 原样透传给模型,不做二次包装。
12
- * - 普通 Error / 其他:返回 e.message(或最终的 String(e) 兜底),
13
- * 避免信息丢失。
14
- */
15
- export function extractError(e) {
16
- const err = e;
17
- if (err?.response?.data != null) {
18
- try {
19
- return JSON.stringify(err.response.data);
20
- }
21
- catch {
22
- return String(err.response.data);
23
- }
24
- }
25
- if (e instanceof Error) {
26
- return e.message;
27
- }
28
- return String(e);
29
- }
30
- //# sourceMappingURL=error.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/utils/error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,YAAY,CAAC,CAAU;IACrC,MAAM,GAAG,GAAG,CAAyD,CAAA;IACrE,IAAI,GAAG,EAAE,QAAQ,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QAClC,CAAC;IACH,CAAC;IACD,IAAI,CAAC,YAAY,KAAK,EAAE,CAAC;QACvB,OAAO,CAAC,CAAC,OAAO,CAAA;IAClB,CAAC;IACD,OAAO,MAAM,CAAC,CAAC,CAAC,CAAA;AAClB,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=mcp-types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-types.js","sourceRoot":"","sources":["../../src/utils/mcp-types.ts"],"names":[],"mappings":""}
@@ -1,74 +0,0 @@
1
- import axios from "axios";
2
- import { BASE_URL } from "./config.js";
3
- import { getToken } from "../store/token.js";
4
- import { getTenant } from "../store/tenant.js";
5
- /**
6
- * 内部 axios 实例,统一配置超时与基础地址。
7
- * baseURL 为默认值(center),具体请求可在 request() 中按 type 覆盖。
8
- */
9
- const service = axios.create({
10
- baseURL: BASE_URL || "",
11
- timeout: 20000,
12
- headers: {
13
- "Content-Type": "application/json",
14
- },
15
- });
16
- /**
17
- * 请求拦截器:从 token 存储器读取 token(环境变量或内存缓存),
18
- * 若已鉴权则注入到请求头,key 为 `token`,使后续业务请求自动携带鉴权信息。
19
- */
20
- service.interceptors.request.use((config) => {
21
- const token = getToken();
22
- if (token) {
23
- config.headers = config.headers || {};
24
- config.headers.token = token;
25
- }
26
- return config;
27
- });
28
- /**
29
- * 响应拦截器:剥离 AxiosResponse 包装,直接返回响应体 data,
30
- * 使 `request<T>()` 的返回类型即为业务数据类型 T。
31
- */
32
- service.interceptors.response.use((response) => response.data, (error) => Promise.reject(error));
33
- /**
34
- * 统一请求入口。
35
- *
36
- * 用法:
37
- * ```ts
38
- * // 中心服务(默认)
39
- * request<Resp>({ url: "/api/x", method: "post", data: {} })
40
- * // 指定租户服务
41
- * request<Resp>({ url: "/api/y", method: "get", type: "tenant" })
42
- * ```
43
- * - `type` 可选,默认 `"center"`:用 BASE_URL 作为基础地址。
44
- * - `type: "tenant"`:用当前租户 `Tenant.conn.config` 作为基础地址;
45
- * "business":用当前租户 `Tenant.conn.business` 作为基础地址;
46
- * 若尚未设置租户信息(未调用 setTenant)则直接 reject。
47
- *
48
- * 返回值为响应体(已剥离 AxiosResponse 包装),类型即传入的泛型 T。
49
- *
50
- * @typeParam T 响应体 data 的类型,默认 any
51
- * @param config 请求配置,可额外携带 `type`
52
- */
53
- export default function request(config) {
54
- const { type = "center", ...rest } = config;
55
- let baseURL;
56
- switch (type) {
57
- case "center":
58
- baseURL = BASE_URL || "";
59
- break;
60
- // tenant 与 business 共用同一段租户校验,仅在最终取用的连接地址上不同
61
- case "tenant":
62
- case "business": {
63
- const tenant = getTenant();
64
- if (!tenant) {
65
- return Promise.reject(new Error(`type 为 ${type} 时,必须先调用 setTenant() 设置租户信息`));
66
- }
67
- baseURL = type === "tenant" ? tenant.conn.config : tenant.conn.business;
68
- break;
69
- }
70
- }
71
- // 用展开拷贝而非改写入参,避免副作用;同时剔除自定义的 type 字段,不泄漏给 Axios
72
- return service({ ...rest, baseURL });
73
- }
74
- //# sourceMappingURL=request.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/utils/request.ts"],"names":[],"mappings":"AAAA,OAAO,KAA4C,MAAM,OAAO,CAAA;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAiB9C;;;GAGG;AACH,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC;IAC3B,OAAO,EAAE,QAAQ,IAAI,EAAE;IACvB,OAAO,EAAE,KAAK;IACd,OAAO,EAAE;QACP,cAAc,EAAE,kBAAkB;KACnC;CACF,CAAC,CAAA;AAEF;;;GAGG;AACH,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;IAC1C,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAA;IACxB,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAA;QACrC,MAAM,CAAC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAA;IAC9B,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC,CAAC,CAAA;AAEF;;;GAGG;AACH,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAC/B,CAAC,QAAuB,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAC1C,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CACjC,CAAA;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,OAAO,UAAU,OAAO,CAAU,MAAqB;IAC5D,MAAM,EAAE,IAAI,GAAG,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAA;IAE3C,IAAI,OAAe,CAAA;IACnB,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,GAAG,QAAQ,IAAI,EAAE,CAAA;YACxB,MAAK;QACP,6CAA6C;QAC7C,KAAK,QAAQ,CAAC;QACd,KAAK,UAAU,EAAE,CAAC;YAChB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;YAC1B,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,OAAO,CAAC,MAAM,CACnB,IAAI,KAAK,CAAC,UAAU,IAAI,6BAA6B,CAAC,CACvD,CAAA;YACH,CAAC;YACD,OAAO,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAA;YACvE,MAAK;QACP,CAAC;IACH,CAAC;IAED,gDAAgD;IAChD,OAAO,OAAO,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAA0B,CAAA;AAC/D,CAAC"}
@@ -1,119 +0,0 @@
1
- /**
2
- * 雪花算法 ID 生成器(无分号风格)
3
- * 结构: 1 位符号位 + 41 位时间戳(毫秒) + 10 位机器 ID + 12 位序列号
4
- * 默认纪元: 2020-01-01 00:00:00 UTC
5
- */
6
- class Snowflake {
7
- // 各部分的位数
8
- workerIdBits = 5;
9
- datacenterIdBits = 5;
10
- sequenceBits = 12;
11
- // 最大取值
12
- maxWorkerId = -1 ^ (-1 << this.workerIdBits); // 31
13
- maxDatacenterId = -1 ^ (-1 << this.datacenterIdBits); // 31
14
- sequenceMask = -1 ^ (-1 << this.sequenceBits); // 4095
15
- // 左移位数
16
- workerIdShift = this.sequenceBits; // 12
17
- datacenterIdShift = this.sequenceBits + this.workerIdBits; // 17
18
- timestampShift = this.sequenceBits + this.workerIdBits + this.datacenterIdBits; // 22
19
- // 自定义纪元(毫秒时间戳)
20
- epoch;
21
- // 上次生成时间戳及序列号
22
- lastTimestamp = -1n;
23
- sequence = 0n;
24
- // 机器 ID 和数据中心 ID
25
- workerId;
26
- datacenterId;
27
- /**
28
- * @param workerId 机器 ID (0 ~ 31)
29
- * @param datacenterId 数据中心 ID (0 ~ 31)
30
- * @param epoch 自定义纪元(毫秒),默认 2020-01-01 00:00:00 UTC
31
- */
32
- constructor(workerId, datacenterId, epoch = 1577836800000) {
33
- if (workerId > this.maxWorkerId || workerId < 0) {
34
- throw new Error(`workerId 必须在 0 ~ ${this.maxWorkerId} 之间`);
35
- }
36
- if (datacenterId > this.maxDatacenterId || datacenterId < 0) {
37
- throw new Error(`datacenterId 必须在 0 ~ ${this.maxDatacenterId} 之间`);
38
- }
39
- this.workerId = BigInt(workerId);
40
- this.datacenterId = BigInt(datacenterId);
41
- this.epoch = BigInt(epoch);
42
- }
43
- /**
44
- * 生成下一个唯一 ID (BigInt)
45
- */
46
- nextId() {
47
- let timestamp = this.currentTimestamp();
48
- // 时钟回拨处理:等待或抛异常
49
- if (timestamp < this.lastTimestamp) {
50
- const offset = this.lastTimestamp - timestamp;
51
- if (offset <= 5n) {
52
- while (timestamp < this.lastTimestamp) {
53
- timestamp = this.currentTimestamp();
54
- }
55
- }
56
- else {
57
- throw new Error(`时钟回拨过大: ${offset}ms,无法生成 ID`);
58
- }
59
- }
60
- // 同一毫秒内序列号递增
61
- if (timestamp === this.lastTimestamp) {
62
- this.sequence = (this.sequence + 1n) & BigInt(this.sequenceMask);
63
- if (this.sequence === 0n) {
64
- timestamp = this.waitNextMillis(this.lastTimestamp);
65
- }
66
- }
67
- else {
68
- this.sequence = 0n;
69
- }
70
- this.lastTimestamp = timestamp;
71
- // 拼装 ID
72
- const id = ((timestamp - this.epoch) << BigInt(this.timestampShift)) |
73
- (this.datacenterId << BigInt(this.datacenterIdShift)) |
74
- (this.workerId << BigInt(this.workerIdShift)) |
75
- this.sequence;
76
- return id;
77
- }
78
- /**
79
- * 等待直到下一毫秒
80
- */
81
- waitNextMillis(lastTimestamp) {
82
- let timestamp = this.currentTimestamp();
83
- while (timestamp <= lastTimestamp) {
84
- timestamp = this.currentTimestamp();
85
- }
86
- return timestamp;
87
- }
88
- /**
89
- * 当前毫秒时间戳
90
- */
91
- currentTimestamp() {
92
- return BigInt(Date.now());
93
- }
94
- /**
95
- * 解析 ID 各组成部分
96
- */
97
- parse(id) {
98
- const timestamp = (id >> BigInt(this.timestampShift)) + this.epoch;
99
- const datacenterId = (id >> BigInt(this.datacenterIdShift)) & BigInt(this.maxDatacenterId);
100
- const workerId = (id >> BigInt(this.workerIdShift)) & BigInt(this.maxWorkerId);
101
- const sequence = id & BigInt(this.sequenceMask);
102
- return {
103
- timestamp,
104
- datacenterId,
105
- workerId,
106
- sequence,
107
- generateTime: new Date(Number(timestamp))
108
- };
109
- }
110
- }
111
- /** workerId */
112
- export const WORKER_ID = 1;
113
- /** datacenterId */
114
- export const DATACENTER_ID = 1;
115
- /** Snowflake 实例 */
116
- export const snowflake = new Snowflake(WORKER_ID, DATACENTER_ID);
117
- /** 生成 ID 方法(箭头函数保持 this 绑定,避免作为独立引用调用时丢失实例) */
118
- export const nextId = () => snowflake.nextId();
119
- //# sourceMappingURL=snowflake.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"snowflake.js","sourceRoot":"","sources":["../../src/utils/snowflake.ts"],"names":[],"mappings":"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"}
@@ -1,353 +0,0 @@
1
- /**
2
- * str_replace_editor 模式的纯文本替换工具集。
3
- *
4
- * 设计目标:让 MCP 调用方只传「改动片段」(oldString / newString),
5
- * 由本模块在服务端拉取到的完整脚本文本上完成定位与替换,
6
- * 从而避免整份脚本在上下文中往返。
7
- *
8
- * 本文件全部为纯函数(无网络、无 MCP 依赖),便于单测与复用。
9
- */
10
- /**
11
- * 按模式归一化文本,并给出「归一化文本下标 → 原文本下标」的映射。
12
- *
13
- * normalized 模式做两件事:
14
- * 1. CRLF / CR 统一成 LF(CRLF 整体只映射到一个下标,避免重复);
15
- * 2. 丢弃紧邻换行符(或文本末尾)之前的空格与制表符,即行尾空白。
16
- *
17
- * exact 模式下映射为恒等映射,文本原样返回。
18
- */
19
- function buildNormalized(src, mode) {
20
- const text = [];
21
- const map = [];
22
- if (mode === 'exact') {
23
- for (let i = 0; i < src.length; i++) {
24
- text.push(src[i]);
25
- map.push(i);
26
- }
27
- return { text: text.join(''), map };
28
- }
29
- for (let i = 0; i < src.length; i++) {
30
- const c = src[i];
31
- // 换行符归一:\r\n 与 \r 都记为一个 \n,映射指向 \r 所在下标
32
- if (c === '\r') {
33
- text.push('\n');
34
- map.push(i);
35
- if (src[i + 1] === '\n')
36
- i++;
37
- continue;
38
- }
39
- // 行尾空白:整段吞掉(不进归一化文本),仅当其后是换行或文本末尾
40
- if (c === ' ' || c === '\t') {
41
- let j = i;
42
- while (j < src.length && (src[j] === ' ' || src[j] === '\t'))
43
- j++;
44
- if (j >= src.length || src[j] === '\n' || src[j] === '\r') {
45
- i = j - 1;
46
- continue;
47
- }
48
- text.push(c);
49
- map.push(i);
50
- continue;
51
- }
52
- text.push(c);
53
- map.push(i);
54
- }
55
- return { text: text.join(''), map };
56
- }
57
- /**
58
- * 把 \r\n / \r 统一成 \n(仅用于切行、预览等只读场景,不做偏移映射)。
59
- */
60
- function toLf(src) {
61
- return src.replace(/\r\n?/g, '\n');
62
- }
63
- /**
64
- * 统计 [0, offset) 区间内的换行数,得到 offset 处的行号(1-based)。
65
- */
66
- function lineAt(src, offset) {
67
- let line = 1;
68
- const end = Math.min(offset, src.length);
69
- for (let i = 0; i < end; i++) {
70
- if (src[i] === '\n')
71
- line++;
72
- }
73
- return line;
74
- }
75
- /**
76
- * 在 source 中查找 oldStr 的全部非重叠匹配。
77
- *
78
- * 偏移量会映射回原文本坐标系,因此调用方可以直接用返回的 range 对原文做切片替换。
79
- */
80
- export function findRanges(source, oldStr, mode = 'normalized') {
81
- if (oldStr.length === 0)
82
- return [];
83
- const nSrc = buildNormalized(source, mode);
84
- const nOld = buildNormalized(oldStr, mode);
85
- if (nOld.text.length === 0)
86
- return [];
87
- const ranges = [];
88
- let from = 0;
89
- for (;;) {
90
- const idx = nSrc.text.indexOf(nOld.text, from);
91
- if (idx === -1)
92
- break;
93
- const startOffset = nSrc.map[idx];
94
- const endOffset = nSrc.map[idx + nOld.text.length - 1] + 1;
95
- ranges.push({
96
- startOffset,
97
- endOffset,
98
- startLine: lineAt(source, startOffset),
99
- endLine: lineAt(source, Math.max(endOffset - 1, 0))
100
- });
101
- // 步进 oldStr 长度,避免 "aa" 在 "aaa" 中产生重叠匹配
102
- from = idx + nOld.text.length;
103
- }
104
- return ranges;
105
- }
106
- /**
107
- * 生成字符串的大二元组(bigram)计数表,用于 Dice 相似度计算。
108
- */
109
- function bigrams(text) {
110
- const m = new Map();
111
- if (text.length < 2) {
112
- if (text.length === 1)
113
- m.set(text, 1);
114
- return m;
115
- }
116
- for (let i = 0; i < text.length - 1; i++) {
117
- const g = text.slice(i, i + 2);
118
- m.set(g, (m.get(g) ?? 0) + 1);
119
- }
120
- return m;
121
- }
122
- /**
123
- * Dice 系数:2 * 交集 / (|A| + |B|),取值 0~1。
124
- */
125
- function diceCoefficient(a, b) {
126
- if (a.size === 0 && b.size === 0)
127
- return 1;
128
- if (a.size === 0 || b.size === 0)
129
- return 0;
130
- let intersection = 0;
131
- const [small, large] = a.size <= b.size ? [a, b] : [b, a];
132
- for (const [g, count] of small) {
133
- const other = large.get(g);
134
- if (other)
135
- intersection += Math.min(count, other);
136
- }
137
- let total = 0;
138
- for (const count of a.values())
139
- total += count;
140
- for (const count of b.values())
141
- total += count;
142
- return total === 0 ? 0 : (2 * intersection) / total;
143
- }
144
- /**
145
- * 「0 命中」时给出最相似的若干候选片段,帮助模型一次修正。
146
- *
147
- * 实现上以行为窗口滑动,用 bigram Dice 系数打分;
148
- * 比较时按行 trim 后比较,以容忍 LLM 复述时的缩进差异;
149
- * 窗口大小取 oldString 行数 ±1,容忍行数差异。
150
- */
151
- export function suggestCandidates(source, oldStr, topN = 3) {
152
- const srcLines = toLf(source).split('\n');
153
- const oldLines = toLf(oldStr).split('\n');
154
- if (srcLines.length === 0 || oldLines.length === 0)
155
- return [];
156
- const oldText = oldLines.map((l) => l.trim()).join('\n');
157
- const oldBigrams = bigrams(oldText);
158
- const trimmedLines = srcLines.map((l) => l.trim());
159
- const bestByStart = new Map();
160
- const sizes = new Set([oldLines.length - 1, oldLines.length, oldLines.length + 1]);
161
- for (const size of sizes) {
162
- if (size < 1)
163
- continue;
164
- for (let i = 0; i + size <= srcLines.length; i++) {
165
- const window = trimmedLines.slice(i, i + size).join('\n');
166
- const score = diceCoefficient(bigrams(window), oldBigrams);
167
- if (score <= 0.3)
168
- continue;
169
- const prev = bestByStart.get(i);
170
- if (!prev || score > prev.score) {
171
- bestByStart.set(i, { score, preview: srcLines.slice(i, i + size).join('\n').slice(0, 120) });
172
- }
173
- }
174
- }
175
- return Array.from(bestByStart.entries())
176
- .map(([i, v]) => ({
177
- startLine: i + 1,
178
- score: Math.round(v.score * 100) / 100,
179
- preview: v.preview
180
- }))
181
- .sort((a, b) => b.score - a.score)
182
- .slice(0, topN);
183
- }
184
- /**
185
- * 探测文本的主导换行符。
186
- *
187
- * 背景:脚本在库里可能是 CRLF,而模型给的 newString 通常是 LF。
188
- * 若直接拼接,替换区域内部会与文件其余部分风格不一致(混用换行符)。
189
- * 故以多数的那一方为准,把 newString 的换行符统一成源文本的主导换行符。
190
- */
191
- function detectEol(src) {
192
- const crlf = (src.match(/\r\n/g) ?? []).length;
193
- const lf = (src.match(/\n/g) ?? []).length - crlf;
194
- return crlf > lf ? '\r\n' : '\n';
195
- }
196
- /**
197
- * 把 newString 的换行符统一成源文本的主导换行符。
198
- */
199
- function adaptEol(newString, src) {
200
- const eol = detectEol(src);
201
- return newString.replace(/\r\n?|\n/g, eol);
202
- }
203
- /**
204
- * 单个 hunk 的内容行数上限,避免超大替换把上下文又吃回去。
205
- */
206
- const MAX_HUNK_LINES = 40;
207
- /**
208
- * 渲染 unified diff 形态的片段。
209
- *
210
- * 由于已精确知道匹配区间,无需 diff 算法:直接取匹配区前后各 contextLines 行作上下文,
211
- * 中间以 -/+ 输出被替换与新增内容。
212
- */
213
- export function renderHunk(before, targets, newString, contextLines = 3) {
214
- const lines = toLf(before).split('\n');
215
- const parts = [];
216
- const sorted = targets.slice().sort((a, b) => a.startOffset - b.startOffset);
217
- for (const t of sorted) {
218
- const ctxStart = Math.max(1, t.startLine - contextLines);
219
- const ctxEnd = Math.min(lines.length, t.endLine + contextLines);
220
- const oldLines = before.slice(t.startOffset, t.endOffset).split('\n').map((l) => l.replace(/\r$/, ''));
221
- const newLines = newString.split('\n');
222
- const oldCount = oldLines.length;
223
- const newCount = newLines.length;
224
- const header = ['@@', `-${t.startLine},${oldCount}`, `+${t.startLine},${newCount}`, '@@'].join(' ');
225
- const body = [header];
226
- for (let i = ctxStart; i < t.startLine; i++)
227
- body.push(` ${lines[i - 1]}`);
228
- for (const l of oldLines.slice(0, MAX_HUNK_LINES))
229
- body.push(`-${l}`);
230
- if (oldCount > MAX_HUNK_LINES)
231
- body.push(`... 省略 ${oldCount - MAX_HUNK_LINES} 行`);
232
- for (const l of newLines.slice(0, MAX_HUNK_LINES))
233
- body.push(`+${l}`);
234
- if (newCount > MAX_HUNK_LINES)
235
- body.push(`... 省略 ${newCount - MAX_HUNK_LINES} 行`);
236
- for (let i = t.endLine + 1; i <= ctxEnd; i++)
237
- body.push(` ${lines[i - 1]}`);
238
- parts.push(body.join('\n'));
239
- }
240
- return parts.join('\n');
241
- }
242
- /**
243
- * 在脚本文本数组上按顺序批量应用替换操作。
244
- *
245
- * 语义要点:
246
- * 1. 按 ops 数组顺序依次执行,op[i+1] 在 op[i] 的结果上匹配,
247
- * 因此允许「先插入一段、再改这段里的某行」这类依赖;
248
- * 2. 失败不早停:失败 op 记 FAILED 并视作 no-op,继续校验剩余 op,
249
- * 以便一次调用回报全部问题;受影响的后续 op 会标记 dependentOnFailedOp;
250
- * 3. 调用方须以 ok 决定是否落库——ok 为 false 时本批次不应产生任何写入。
251
- *
252
- * @param scripts 脚本文本数组(通常对应 logic.operations[].templateparams.flycode)
253
- * @param ops 替换操作数组,至少一个元素
254
- * @param opts contextLines:diff 上下文行数;topN:候选建议条数
255
- */
256
- export function applyOps(scripts, ops, opts = {}) {
257
- const contextLines = opts.contextLines ?? 3;
258
- const topN = opts.topN ?? 3;
259
- const work = scripts.slice();
260
- const results = [];
261
- let failedBefore = false;
262
- for (let i = 0; i < ops.length; i++) {
263
- const op = ops[i];
264
- const oi = op.operationIndex ?? 0;
265
- const base = () => ({
266
- index: i,
267
- label: op.label ?? null,
268
- status: 'FAILED',
269
- errorCode: 'OK',
270
- message: null,
271
- operationIndex: oi,
272
- matchCount: 0,
273
- replacedCount: 0,
274
- range: null,
275
- suggestions: null,
276
- dependentOnFailedOp: failedBefore,
277
- hunk: null
278
- });
279
- const fail = (errorCode, message, extra = {}) => {
280
- results.push({ ...base(), status: 'FAILED', errorCode, message, ...extra });
281
- failedBefore = true;
282
- };
283
- // 校验:目标 operation 必须存在
284
- if (!Number.isInteger(oi) || oi < 0 || oi >= work.length) {
285
- fail('NO_TARGET', `operationIndex=${oi} 不存在,当前共有 ${work.length} 个 operation(可用下标 0~${Math.max(work.length - 1, 0)})`);
286
- continue;
287
- }
288
- // 校验:oldString 必须非空(空串会让「插入位置」变得不可判定)
289
- if (typeof op.oldString !== 'string' || op.oldString.length === 0) {
290
- fail('EMPTY_OLD_STRING', 'oldString 不能为空字符串;如需整份重写请改用 simple_save_flycode_model_logic');
291
- continue;
292
- }
293
- // 校验:replaceAll 与 occurrence 互斥
294
- if (op.replaceAll === true && op.occurrence != null) {
295
- fail('INVALID_PARAMS', 'replaceAll 与 occurrence 互斥,只能二选一');
296
- continue;
297
- }
298
- const mode = op.matchMode ?? 'normalized';
299
- const src = work[oi];
300
- const ranges = findRanges(src, op.oldString, mode);
301
- if (ranges.length === 0) {
302
- fail('NOT_FOUND', `oldString 在 operation[${oi}] 的脚本中未匹配到任何内容(matchMode=${mode})`, {
303
- suggestions: suggestCandidates(src, op.oldString, topN)
304
- });
305
- continue;
306
- }
307
- let targets;
308
- if (op.replaceAll === true) {
309
- targets = ranges;
310
- }
311
- else if (op.occurrence != null) {
312
- if (!Number.isInteger(op.occurrence) || op.occurrence < 1 || op.occurrence > ranges.length) {
313
- fail('OCCURRENCE_OUT_OF_RANGE', `occurrence=${op.occurrence} 越界,实际匹配数为 ${ranges.length}`, { matchCount: ranges.length });
314
- continue;
315
- }
316
- targets = [ranges[op.occurrence - 1]];
317
- }
318
- else if (ranges.length > 1) {
319
- const where = ranges.map((r) => `第 ${r.startLine}~${r.endLine} 行`).join('、');
320
- fail('NOT_UNIQUE', `oldString 匹配到 ${ranges.length} 处(${where})。请扩大 oldString 的上下文使其唯一,或使用 occurrence 指定第几处,或 replaceAll=true 全部替换`, {
321
- matchCount: ranges.length
322
- });
323
- continue;
324
- }
325
- else {
326
- targets = ranges;
327
- }
328
- // 应用:从后往前替换,避免前面的替换让后面的偏移失效。
329
- // newString 的换行符统一成源文本的主导换行符,避免替换区域内部出现混用。
330
- const newText = adaptEol(op.newString, src);
331
- let out = src;
332
- for (let k = targets.length - 1; k >= 0; k--) {
333
- out = out.slice(0, targets[k].startOffset) + newText + out.slice(targets[k].endOffset);
334
- }
335
- const hunk = renderHunk(src, targets, newText, contextLines);
336
- work[oi] = out;
337
- results.push({
338
- ...base(),
339
- status: 'OK',
340
- errorCode: 'OK',
341
- matchCount: ranges.length,
342
- replacedCount: targets.length,
343
- range: targets[0],
344
- hunk
345
- });
346
- }
347
- return {
348
- scripts: work,
349
- results,
350
- ok: results.length > 0 && results.every((r) => r.status === 'OK')
351
- };
352
- }
353
- //# sourceMappingURL=str-replace.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"str-replace.js","sourceRoot":"","sources":["../../src/utils/str-replace.ts"],"names":[],"mappings":"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"}