flycode-mcp 1.9.2 → 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.
- package/README.md +69 -18
- package/dist/flycode-mcp.min.js +2 -0
- package/package.json +21 -8
- package/dist/clients/authClient.js +0 -43
- package/dist/clients/authClient.js.map +0 -1
- package/dist/clients/databaseFunctionClient.js +0 -16
- package/dist/clients/databaseFunctionClient.js.map +0 -1
- package/dist/clients/entityClient.js +0 -28
- package/dist/clients/entityClient.js.map +0 -1
- package/dist/clients/formClient.js +0 -30
- package/dist/clients/formClient.js.map +0 -1
- package/dist/clients/functionClient.js +0 -30
- package/dist/clients/functionClient.js.map +0 -1
- package/dist/clients/logicClient.js +0 -45
- package/dist/clients/logicClient.js.map +0 -1
- package/dist/clients/runClient.js +0 -16
- package/dist/clients/runClient.js.map +0 -1
- package/dist/clients/types.js +0 -7
- package/dist/clients/types.js.map +0 -1
- package/dist/index.js +0 -53
- package/dist/index.js.map +0 -1
- package/dist/service/auth.js +0 -84
- package/dist/service/auth.js.map +0 -1
- package/dist/service/logic.js +0 -261
- package/dist/service/logic.js.map +0 -1
- package/dist/store/tenant.js +0 -20
- package/dist/store/tenant.js.map +0 -1
- package/dist/store/token.js +0 -25
- package/dist/store/token.js.map +0 -1
- package/dist/tools/common.js +0 -61
- package/dist/tools/common.js.map +0 -1
- package/dist/tools/database-function/read.js +0 -98
- package/dist/tools/database-function/read.js.map +0 -1
- package/dist/tools/entity/read.js +0 -169
- package/dist/tools/entity/read.js.map +0 -1
- package/dist/tools/entity/schemas.js +0 -65
- package/dist/tools/entity/schemas.js.map +0 -1
- package/dist/tools/form/read.js +0 -202
- package/dist/tools/form/read.js.map +0 -1
- package/dist/tools/function/read.js +0 -187
- package/dist/tools/function/read.js.map +0 -1
- package/dist/tools/logic/read.js +0 -170
- package/dist/tools/logic/read.js.map +0 -1
- package/dist/tools/logic/schemas.js +0 -122
- package/dist/tools/logic/schemas.js.map +0 -1
- package/dist/tools/logic/write.js +0 -303
- package/dist/tools/logic/write.js.map +0 -1
- package/dist/tools/run/read.js +0 -65
- package/dist/tools/run/read.js.map +0 -1
- package/dist/utils/config.js +0 -26
- package/dist/utils/config.js.map +0 -1
- package/dist/utils/date.js +0 -45
- package/dist/utils/date.js.map +0 -1
- package/dist/utils/error.js +0 -30
- package/dist/utils/error.js.map +0 -1
- package/dist/utils/mcp-types.js +0 -2
- package/dist/utils/mcp-types.js.map +0 -1
- package/dist/utils/request.js +0 -74
- package/dist/utils/request.js.map +0 -1
- package/dist/utils/snowflake.js +0 -119
- package/dist/utils/snowflake.js.map +0 -1
- package/dist/utils/str-replace.js +0 -353
- package/dist/utils/str-replace.js.map +0 -1
package/dist/utils/error.js
DELETED
|
@@ -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
|
package/dist/utils/error.js.map
DELETED
|
@@ -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"}
|
package/dist/utils/mcp-types.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-types.js","sourceRoot":"","sources":["../../src/utils/mcp-types.ts"],"names":[],"mappings":""}
|
package/dist/utils/request.js
DELETED
|
@@ -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"}
|
package/dist/utils/snowflake.js
DELETED
|
@@ -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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"}
|