baxian 1.2.57 → 1.2.58
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/dist/agent/branch.d.ts +6 -1
- package/dist/agent/branch.d.ts.map +1 -1
- package/dist/agent/branch.js +45 -9
- package/dist/agent/branch.js.map +1 -1
- package/dist/agent/manager.d.ts +67 -5
- package/dist/agent/manager.d.ts.map +1 -1
- package/dist/agent/manager.js +1224 -92
- package/dist/agent/manager.js.map +1 -1
- package/dist/agent/phase-signal-watcher.d.ts +2 -0
- package/dist/agent/phase-signal-watcher.d.ts.map +1 -1
- package/dist/agent/phase-signal-watcher.js +28 -1
- package/dist/agent/phase-signal-watcher.js.map +1 -1
- package/dist/agent/tmux.d.ts +8 -1
- package/dist/agent/tmux.d.ts.map +1 -1
- package/dist/agent/tmux.js +61 -1
- package/dist/agent/tmux.js.map +1 -1
- package/dist/api/projects.js +18 -3
- package/dist/api/projects.js.map +1 -1
- package/dist/config/normalizer.d.ts.map +1 -1
- package/dist/config/normalizer.js +1 -0
- package/dist/config/normalizer.js.map +1 -1
- package/dist/config/validator.d.ts +3 -1
- package/dist/config/validator.d.ts.map +1 -1
- package/dist/config/validator.js +104 -7
- package/dist/config/validator.js.map +1 -1
- package/dist/event/handlers.d.ts.map +1 -1
- package/dist/event/handlers.js +157 -47
- package/dist/event/handlers.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/platform/body-digest.d.ts +4 -0
- package/dist/platform/body-digest.d.ts.map +1 -0
- package/dist/platform/body-digest.js +13 -0
- package/dist/platform/body-digest.js.map +1 -0
- package/dist/platform/command-renderer.d.ts +22 -0
- package/dist/platform/command-renderer.d.ts.map +1 -0
- package/dist/platform/command-renderer.js +82 -0
- package/dist/platform/command-renderer.js.map +1 -0
- package/dist/platform/comment-cursor.d.ts +36 -0
- package/dist/platform/comment-cursor.d.ts.map +1 -0
- package/dist/platform/comment-cursor.js +235 -0
- package/dist/platform/comment-cursor.js.map +1 -0
- package/dist/platform/driver-spec.d.ts +7 -0
- package/dist/platform/driver-spec.d.ts.map +1 -0
- package/dist/platform/driver-spec.js +475 -0
- package/dist/platform/driver-spec.js.map +1 -0
- package/dist/platform/field-mapper.d.ts +7 -0
- package/dist/platform/field-mapper.d.ts.map +1 -0
- package/dist/platform/field-mapper.js +117 -0
- package/dist/platform/field-mapper.js.map +1 -0
- package/dist/platform/git-driver.d.ts +55 -0
- package/dist/platform/git-driver.d.ts.map +1 -0
- package/dist/platform/git-driver.js +171 -0
- package/dist/platform/git-driver.js.map +1 -0
- package/dist/platform/manifest.d.ts +12 -0
- package/dist/platform/manifest.d.ts.map +1 -0
- package/dist/platform/manifest.js +57 -0
- package/dist/platform/manifest.js.map +1 -0
- package/dist/platform/markers.d.ts +46 -0
- package/dist/platform/markers.d.ts.map +1 -0
- package/dist/platform/markers.js +121 -0
- package/dist/platform/markers.js.map +1 -0
- package/dist/platform/platform-poller.d.ts +67 -0
- package/dist/platform/platform-poller.d.ts.map +1 -0
- package/dist/platform/platform-poller.js +632 -0
- package/dist/platform/platform-poller.js.map +1 -0
- package/dist/platform/plugin-registry.d.ts +31 -0
- package/dist/platform/plugin-registry.d.ts.map +1 -0
- package/dist/platform/plugin-registry.js +238 -0
- package/dist/platform/plugin-registry.js.map +1 -0
- package/dist/platform/plugin-roots.d.ts +3 -0
- package/dist/platform/plugin-roots.d.ts.map +1 -0
- package/dist/platform/plugin-roots.js +11 -0
- package/dist/platform/plugin-roots.js.map +1 -0
- package/dist/platform/plugins/github/baxian-plugin.json +8 -0
- package/dist/platform/plugins/github/driver.json +134 -0
- package/dist/platform/plugins/github/skills/baxian-cli-gh/SKILL.md +99 -0
- package/dist/platform/response-parser.d.ts +6 -0
- package/dist/platform/response-parser.d.ts.map +1 -0
- package/dist/platform/response-parser.js +92 -0
- package/dist/platform/response-parser.js.map +1 -0
- package/dist/platform/row-schema.d.ts +12 -0
- package/dist/platform/row-schema.d.ts.map +1 -0
- package/dist/platform/row-schema.js +127 -0
- package/dist/platform/row-schema.js.map +1 -0
- package/dist/platform/startup.d.ts +16 -0
- package/dist/platform/startup.d.ts.map +1 -0
- package/dist/platform/startup.js +52 -0
- package/dist/platform/startup.js.map +1 -0
- package/dist/platform/types.d.ts +56 -0
- package/dist/platform/types.d.ts.map +1 -0
- package/dist/platform/types.js +32 -0
- package/dist/platform/types.js.map +1 -0
- package/dist/platform/verdict-engine.d.ts +54 -0
- package/dist/platform/verdict-engine.d.ts.map +1 -0
- package/dist/platform/verdict-engine.js +125 -0
- package/dist/platform/verdict-engine.js.map +1 -0
- package/dist/shared/constants.d.ts +2 -0
- package/dist/shared/constants.d.ts.map +1 -1
- package/dist/shared/constants.js +3 -0
- package/dist/shared/constants.js.map +1 -1
- package/dist/shared/git-url.d.ts +8 -0
- package/dist/shared/git-url.d.ts.map +1 -1
- package/dist/shared/git-url.js +38 -0
- package/dist/shared/git-url.js.map +1 -1
- package/dist/shared/types.d.ts +17 -1
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/shared/types.js.map +1 -1
- package/dist/state/agent-store.js +2 -0
- package/dist/state/agent-store.js.map +1 -1
- package/dist/state/task-store.d.ts.map +1 -1
- package/dist/state/task-store.js +20 -2
- package/dist/state/task-store.js.map +1 -1
- package/dist/web/assets/index-DskVWe7e.js +13 -0
- package/dist/web/index.html +1 -1
- package/package.json +1 -1
- package/dist/web/assets/index-3Ypk8Gfo.js +0 -13
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
export function sha256Hex(text) {
|
|
3
|
+
return createHash('sha256').update(text, 'utf8').digest('hex');
|
|
4
|
+
}
|
|
5
|
+
// digest 线协议(spec §6,core 与 skill 共享唯一定义):API 解码原文按 UTF-8 取 SHA-256
|
|
6
|
+
// 完整小写 hex——不规范化 Unicode/CRLF、不剥标记、不 trim;8-hex 截断只有 32 位空间,
|
|
7
|
+
// 能编辑评论者可构造同前缀正文让旧 ack 复活。
|
|
8
|
+
export function bodyDigest(body) {
|
|
9
|
+
return sha256Hex(body);
|
|
10
|
+
}
|
|
11
|
+
// digest 段文法与产出函数同居:ack 线协议解析与 cursor 结构校验都从这里取形状。
|
|
12
|
+
export const BODY_DIGEST_SOURCE = '[0-9a-f]{64}';
|
|
13
|
+
//# sourceMappingURL=body-digest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"body-digest.js","sourceRoot":"","sources":["../../src/platform/body-digest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACjE,CAAC;AAED,oEAAoE;AACpE,6DAA6D;AAC7D,2BAA2B;AAC3B,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,mDAAmD;AACnD,MAAM,CAAC,MAAM,kBAAkB,GAAG,cAAc,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface RenderContext {
|
|
2
|
+
scheme: 'http' | 'https';
|
|
3
|
+
hostname: string;
|
|
4
|
+
host: string;
|
|
5
|
+
repoPath: string;
|
|
6
|
+
binary: string;
|
|
7
|
+
prNumber?: number;
|
|
8
|
+
expectedHeadSha?: string;
|
|
9
|
+
branch?: string;
|
|
10
|
+
page?: number;
|
|
11
|
+
}
|
|
12
|
+
export declare class PlaceholderValueError extends Error {
|
|
13
|
+
constructor(message: string);
|
|
14
|
+
}
|
|
15
|
+
export declare function renderCommand(op: {
|
|
16
|
+
argv: string[];
|
|
17
|
+
env?: Record<string, string>;
|
|
18
|
+
}, ctx: RenderContext): string;
|
|
19
|
+
export declare function renderFixMessage(template: string, ctx: RenderContext & {
|
|
20
|
+
minToolVersion?: string;
|
|
21
|
+
}): string;
|
|
22
|
+
//# sourceMappingURL=command-renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-renderer.d.ts","sourceRoot":"","sources":["../../src/platform/command-renderer.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM;CAI5B;AA2DD,wBAAgB,aAAa,CAC3B,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,EACpD,GAAG,EAAE,aAAa,GACjB,MAAM,CAWR;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,aAAa,GAAG;IAAE,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/C,MAAM,CAER"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { shellQuote } from '../agent/runner.js';
|
|
2
|
+
import { isValidBranchName } from '../shared/constants.js';
|
|
3
|
+
import { ENV_KEY_PATTERN, SHA_HEX_SOURCE } from './types.js';
|
|
4
|
+
export class PlaceholderValueError extends Error {
|
|
5
|
+
constructor(message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = 'PlaceholderValueError';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
const SHA_RE = new RegExp(`^${SHA_HEX_SOURCE}$`);
|
|
11
|
+
// String.replace 对全局正则自重置 lastIndex,模块级复用安全。
|
|
12
|
+
const PLACEHOLDER_RE = /\{([a-zA-Z]+)\}/g;
|
|
13
|
+
function placeholderValue(name, ctx) {
|
|
14
|
+
switch (name) {
|
|
15
|
+
case 'scheme': return ctx.scheme;
|
|
16
|
+
case 'hostname': return ctx.hostname;
|
|
17
|
+
case 'host': return ctx.host;
|
|
18
|
+
case 'hostUrl': return `${ctx.scheme}://${ctx.host}`;
|
|
19
|
+
case 'repoPath': return ctx.repoPath;
|
|
20
|
+
case 'repoPathEncoded': return encodeURIComponent(ctx.repoPath);
|
|
21
|
+
case 'binary': return ctx.binary;
|
|
22
|
+
case 'prNumber': {
|
|
23
|
+
if (ctx.prNumber === undefined || !Number.isInteger(ctx.prNumber) || ctx.prNumber <= 0) {
|
|
24
|
+
throw new PlaceholderValueError(`prNumber must be a positive integer (got ${ctx.prNumber})`);
|
|
25
|
+
}
|
|
26
|
+
return String(ctx.prNumber);
|
|
27
|
+
}
|
|
28
|
+
case 'expectedHeadSha': {
|
|
29
|
+
if (ctx.expectedHeadSha === undefined || !SHA_RE.test(ctx.expectedHeadSha)) {
|
|
30
|
+
throw new PlaceholderValueError(`expectedHeadSha must be hex sha (got ${ctx.expectedHeadSha})`);
|
|
31
|
+
}
|
|
32
|
+
return ctx.expectedHeadSha;
|
|
33
|
+
}
|
|
34
|
+
case 'branch': {
|
|
35
|
+
if (ctx.branch === undefined)
|
|
36
|
+
throw new PlaceholderValueError('branch required for {branch}');
|
|
37
|
+
// 原样值进 URL 路径(GitHub refs 端点按字面 / 展开,spec §5.3 增量⑤):入口同款
|
|
38
|
+
// isValidBranchName 挡路径遍历——第二套渲染期专属谓词会与它各自漂移。
|
|
39
|
+
if (!isValidBranchName(ctx.branch)) {
|
|
40
|
+
throw new PlaceholderValueError(`branch has invalid shape (got ${ctx.branch})`);
|
|
41
|
+
}
|
|
42
|
+
return ctx.branch;
|
|
43
|
+
}
|
|
44
|
+
case 'branchEncoded': {
|
|
45
|
+
if (ctx.branch === undefined)
|
|
46
|
+
throw new PlaceholderValueError('branch required for {branchEncoded}');
|
|
47
|
+
return encodeURIComponent(ctx.branch);
|
|
48
|
+
}
|
|
49
|
+
case 'page': {
|
|
50
|
+
if (ctx.page === undefined || !Number.isInteger(ctx.page) || ctx.page <= 0) {
|
|
51
|
+
throw new PlaceholderValueError(`page must be a positive integer (got ${ctx.page})`);
|
|
52
|
+
}
|
|
53
|
+
return String(ctx.page);
|
|
54
|
+
}
|
|
55
|
+
case 'minToolVersion': {
|
|
56
|
+
if (ctx.minToolVersion === undefined)
|
|
57
|
+
throw new PlaceholderValueError('minToolVersion unavailable');
|
|
58
|
+
return ctx.minToolVersion;
|
|
59
|
+
}
|
|
60
|
+
default:
|
|
61
|
+
throw new PlaceholderValueError(`unknown placeholder {${name}}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function substitute(template, ctx) {
|
|
65
|
+
return template.replace(PLACEHOLDER_RE, (_, name) => placeholderValue(name, ctx));
|
|
66
|
+
}
|
|
67
|
+
export function renderCommand(op, ctx) {
|
|
68
|
+
const envPrefix = Object.entries(op.env ?? {})
|
|
69
|
+
.map(([k, v]) => {
|
|
70
|
+
if (!ENV_KEY_PATTERN.test(k)) {
|
|
71
|
+
throw new PlaceholderValueError(`env key must match ${ENV_KEY_PATTERN} (got ${k})`);
|
|
72
|
+
}
|
|
73
|
+
return `${k}=${shellQuote(substitute(v, ctx))}`;
|
|
74
|
+
})
|
|
75
|
+
.join(' ');
|
|
76
|
+
const argv = op.argv.map(a => shellQuote(substitute(a, ctx))).join(' ');
|
|
77
|
+
return envPrefix === '' ? argv : `${envPrefix} ${argv}`;
|
|
78
|
+
}
|
|
79
|
+
export function renderFixMessage(template, ctx) {
|
|
80
|
+
return substitute(template, ctx);
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=command-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-renderer.js","sourceRoot":"","sources":["../../src/platform/command-renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type NormalizedRow } from './row-schema.js';
|
|
2
|
+
export interface SourceCursorView {
|
|
3
|
+
watermarkTime: number | null;
|
|
4
|
+
bucket: Record<string, string>;
|
|
5
|
+
ledger: Record<string, string>;
|
|
6
|
+
}
|
|
7
|
+
export interface ClassifiedRows {
|
|
8
|
+
fresh: NormalizedRow[];
|
|
9
|
+
undated: number;
|
|
10
|
+
}
|
|
11
|
+
export declare function platformPollerStatePath(stateDir: string, repoUrl: string): string;
|
|
12
|
+
export declare class CommentCursorStore {
|
|
13
|
+
private readonly filePath;
|
|
14
|
+
private readonly repoUrl;
|
|
15
|
+
private state;
|
|
16
|
+
private readonly repoKey;
|
|
17
|
+
private dirty;
|
|
18
|
+
constructor(filePath: string, repoUrl: string);
|
|
19
|
+
load(): Promise<void>;
|
|
20
|
+
flushIfDirty(): Promise<void>;
|
|
21
|
+
source(taskId: string, prNumber: number, sourceKey: string): SourceCursorView;
|
|
22
|
+
classify(view: SourceCursorView, rows: NormalizedRow[], cutoffMs: number): ClassifiedRows;
|
|
23
|
+
isDelivered(view: SourceCursorView, id: string, digest: string): boolean;
|
|
24
|
+
markDelivered(taskId: string, prNumber: number, sourceKey: string, id: string, digest: string): Promise<void>;
|
|
25
|
+
commitSource(taskId: string, prNumber: number, sourceKey: string, rows: NormalizedRow[], cutoffMs: number): Promise<void>;
|
|
26
|
+
listPrsCursor(): {
|
|
27
|
+
watermarkTime: number | null;
|
|
28
|
+
};
|
|
29
|
+
commitListPrs(rows: NormalizedRow[], cutoffMs: number): Promise<void>;
|
|
30
|
+
generations(): string[];
|
|
31
|
+
dropGeneration(taskId: string): Promise<void>;
|
|
32
|
+
pruneSources(activeKeys: ReadonlySet<string>): Promise<void>;
|
|
33
|
+
private mutableSource;
|
|
34
|
+
private persist;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=comment-cursor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment-cursor.d.ts","sourceRoot":"","sources":["../../src/platform/comment-cursor.ts"],"names":[],"mappings":"AAIA,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIpE,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AASD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAGD,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEjF;AA8DD,qBAAa,kBAAkB;IAKjB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAAU,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJvE,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,KAAK,CAAS;gBAEO,QAAQ,EAAE,MAAM,EAAmB,OAAO,EAAE,MAAM;IAKzE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBrB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAInC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,gBAAgB;IAI7E,QAAQ,CAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc;IAqBzF,WAAW,CAAC,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAIlE,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS7G,YAAY,CAChB,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE,MAAM,GAC3F,OAAO,CAAC,IAAI,CAAC;IA2BhB,aAAa,IAAI;QAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE;IAK3C,aAAa,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW3E,WAAW,IAAI,MAAM,EAAE;IAIjB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ7C,YAAY,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAelE,OAAO,CAAC,aAAa;YAMP,OAAO;CAatB"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { mkdir, readFile, rename, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
import { BODY_DIGEST_SOURCE, sha256Hex } from './body-digest.js';
|
|
4
|
+
import { rowBodyDigest } from './markers.js';
|
|
5
|
+
import { versionTimeOf } from './row-schema.js';
|
|
6
|
+
import { isRecord } from '../shared/index.js';
|
|
7
|
+
import { repoIdentityKey } from '../shared/git-url.js';
|
|
8
|
+
// 定长 digest 文件名:深层 namespace 不撞 ENAMETOOLONG;键出自 repoIdentityKey 单一归一化函数(spec §4)。
|
|
9
|
+
export function platformPollerStatePath(stateDir, repoUrl) {
|
|
10
|
+
return join(stateDir, 'state', `poller-git-${sha256Hex(repoIdentityKey(repoUrl))}.json`);
|
|
11
|
+
}
|
|
12
|
+
// 协议键(source key/comment id)的合法形态包含 'constructor'/'__proto__' 等原型特殊名:
|
|
13
|
+
// 普通对象上 `??=` 会读到继承的 Object 构造器、'__proto__' 赋值被 setter 吞掉——
|
|
14
|
+
// 所有 cursor 容器一律 null-prototype,磁盘加载后同样重建(JSON.parse 产出的是普通对象)。
|
|
15
|
+
const dict = () => Object.create(null);
|
|
16
|
+
const emptySource = () => ({ watermarkTime: null, bucket: dict(), ledger: dict() });
|
|
17
|
+
// 提交值均出自 Date.parse(整数毫秒):1e300 这类「有限但超 Date 量程」的损坏值会把全部
|
|
18
|
+
// 真实行判旧、健康停页——按 ECMAScript Date 有效范围收紧。
|
|
19
|
+
const MAX_DATE_MS = 8_640_000_000_000_000;
|
|
20
|
+
const isWatermark = (v) => v === null || (typeof v === 'number' && Number.isSafeInteger(v) && Math.abs(v) <= MAX_DATE_MS);
|
|
21
|
+
const DIGEST_RE = new RegExp(`^${BODY_DIGEST_SOURCE}$`);
|
|
22
|
+
const isDigestMap = (v) => isRecord(v) && Object.values(v).every(x => typeof x === 'string' && DIGEST_RE.test(x));
|
|
23
|
+
// 类型断言不校验磁盘内容:watermarkTime 落成字符串会参与数值强转、把历史行静默判旧——
|
|
24
|
+
// 语法合法但结构损坏的文件与坏 JSON 同级:抛出而非带病运行。
|
|
25
|
+
function validateCursorFile(parsed) {
|
|
26
|
+
if (parsed.version !== 1)
|
|
27
|
+
throw new Error(`cursor file version unsupported (got ${JSON.stringify(parsed.version)})`);
|
|
28
|
+
const bad = (what) => {
|
|
29
|
+
throw new Error(`cursor file structure invalid: ${what}`);
|
|
30
|
+
};
|
|
31
|
+
if (!isRecord(parsed.listPrs) || !isWatermark(parsed.listPrs.watermarkTime))
|
|
32
|
+
bad('listPrs');
|
|
33
|
+
if (!isRecord(parsed.generations))
|
|
34
|
+
bad('generations');
|
|
35
|
+
for (const [taskId, prs] of Object.entries(parsed.generations)) {
|
|
36
|
+
if (!isRecord(prs))
|
|
37
|
+
bad(`generations.${taskId}`);
|
|
38
|
+
for (const [pr, sources] of Object.entries(prs)) {
|
|
39
|
+
if (!isRecord(sources))
|
|
40
|
+
bad(`generations.${taskId}.${pr}`);
|
|
41
|
+
for (const [key, view] of Object.entries(sources)) {
|
|
42
|
+
if (!isRecord(view) || !isWatermark(view.watermarkTime)
|
|
43
|
+
|| !isDigestMap(view.bucket) || !isDigestMap(view.ledger)) {
|
|
44
|
+
bad(`generations.${taskId}.${pr}.${key}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function rebuildNullProto(parsed) {
|
|
51
|
+
const generations = dict();
|
|
52
|
+
for (const [taskId, prs] of Object.entries(parsed.generations)) {
|
|
53
|
+
const prDict = dict();
|
|
54
|
+
for (const [pr, sources] of Object.entries(prs)) {
|
|
55
|
+
const srcDict = dict();
|
|
56
|
+
for (const [key, view] of Object.entries(sources)) {
|
|
57
|
+
srcDict[key] = {
|
|
58
|
+
watermarkTime: view.watermarkTime,
|
|
59
|
+
bucket: Object.assign(dict(), view.bucket),
|
|
60
|
+
ledger: Object.assign(dict(), view.ledger),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
prDict[pr] = srcDict;
|
|
64
|
+
}
|
|
65
|
+
generations[taskId] = prDict;
|
|
66
|
+
}
|
|
67
|
+
return { version: 1, repoUrl: parsed.repoUrl, listPrs: { watermarkTime: parsed.listPrs.watermarkTime }, generations };
|
|
68
|
+
}
|
|
69
|
+
let tmpSeq = 0;
|
|
70
|
+
export class CommentCursorStore {
|
|
71
|
+
filePath;
|
|
72
|
+
repoUrl;
|
|
73
|
+
state;
|
|
74
|
+
repoKey;
|
|
75
|
+
dirty = false;
|
|
76
|
+
constructor(filePath, repoUrl) {
|
|
77
|
+
this.filePath = filePath;
|
|
78
|
+
this.repoUrl = repoUrl;
|
|
79
|
+
this.repoKey = repoIdentityKey(repoUrl);
|
|
80
|
+
this.state = { version: 1, repoUrl, listPrs: { watermarkTime: null }, generations: dict() };
|
|
81
|
+
}
|
|
82
|
+
async load() {
|
|
83
|
+
let raw;
|
|
84
|
+
try {
|
|
85
|
+
raw = await readFile(this.filePath, 'utf8');
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
if (e.code === 'ENOENT')
|
|
89
|
+
return;
|
|
90
|
+
throw e;
|
|
91
|
+
}
|
|
92
|
+
// 损坏/失配一律抛出(周期跳过),空状态覆盖会把全部水位清零、整段历史重放。
|
|
93
|
+
const parsed = JSON.parse(raw);
|
|
94
|
+
// 文件名已按 repoIdentityKey 归一:同一仓库的 https/ssh/.git 拼写变体命中同一文件,
|
|
95
|
+
// 按原始配置串比较会在合法改写后永久拒载——一致性按归一化身份判。
|
|
96
|
+
if (typeof parsed.repoUrl !== 'string' || repoIdentityKey(parsed.repoUrl) !== this.repoKey) {
|
|
97
|
+
throw new Error(`cursor file repo mismatch: file has ${JSON.stringify(parsed.repoUrl)}, entry is ${this.repoUrl}`);
|
|
98
|
+
}
|
|
99
|
+
validateCursorFile(parsed);
|
|
100
|
+
this.state = rebuildNullProto(parsed);
|
|
101
|
+
}
|
|
102
|
+
// persist 失败后内存已前移而磁盘落后:唯一会跳过重写的路径(水位未变早退/代际已删)需要
|
|
103
|
+
// 这个补写钩子,调用方在每周期开头 flush 一次,磁盘在文件系统恢复后无需重启即收敛。
|
|
104
|
+
async flushIfDirty() {
|
|
105
|
+
if (this.dirty)
|
|
106
|
+
await this.persist();
|
|
107
|
+
}
|
|
108
|
+
source(taskId, prNumber, sourceKey) {
|
|
109
|
+
return this.state.generations[taskId]?.[String(prNumber)]?.[sourceKey] ?? emptySource();
|
|
110
|
+
}
|
|
111
|
+
classify(view, rows, cutoffMs) {
|
|
112
|
+
const fresh = [];
|
|
113
|
+
let undated = 0;
|
|
114
|
+
for (const row of rows) {
|
|
115
|
+
const vt = versionTimeOf(row);
|
|
116
|
+
if (vt === undefined) {
|
|
117
|
+
undated++;
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
if (vt > cutoffMs)
|
|
121
|
+
continue;
|
|
122
|
+
if (view.watermarkTime === null || vt > view.watermarkTime) {
|
|
123
|
+
fresh.push(row);
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
if (vt === view.watermarkTime) {
|
|
127
|
+
if (view.bucket[String(row.id)] !== rowBodyDigest(row))
|
|
128
|
+
fresh.push(row);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return { fresh, undated };
|
|
132
|
+
}
|
|
133
|
+
isDelivered(view, id, digest) {
|
|
134
|
+
return view.ledger[id] === digest;
|
|
135
|
+
}
|
|
136
|
+
async markDelivered(taskId, prNumber, sourceKey, id, digest) {
|
|
137
|
+
this.mutableSource(taskId, prNumber, sourceKey).ledger[id] = digest;
|
|
138
|
+
await this.persist();
|
|
139
|
+
}
|
|
140
|
+
// 提交条件由调用方保证:该源全部新 revision 的下游投递成功后才调用。可见性截断在此
|
|
141
|
+
// 统一应用(与 classify 同源的稳定 cutoff)——靠调用方预过滤会让新调用方漏做时水位越过
|
|
142
|
+
// held-back 行、评论永久跳过。桶在水位未前移时也重建——同秒编辑(d1→d2)消费后若桶残留
|
|
143
|
+
// d1,同一 revision 每轮重判新;水位/桶/账本全部无变化的稳态周期跳过落盘。
|
|
144
|
+
async commitSource(taskId, prNumber, sourceKey, rows, cutoffMs) {
|
|
145
|
+
const settled = rows.filter(row => {
|
|
146
|
+
const vt = versionTimeOf(row);
|
|
147
|
+
return vt !== undefined && vt <= cutoffMs;
|
|
148
|
+
});
|
|
149
|
+
const cursor = this.mutableSource(taskId, prNumber, sourceKey);
|
|
150
|
+
let max = cursor.watermarkTime;
|
|
151
|
+
for (const row of settled) {
|
|
152
|
+
const vt = versionTimeOf(row);
|
|
153
|
+
if (vt !== undefined && (max === null || vt > max))
|
|
154
|
+
max = vt;
|
|
155
|
+
}
|
|
156
|
+
const bucket = dict();
|
|
157
|
+
for (const row of settled) {
|
|
158
|
+
if (versionTimeOf(row) !== max || max === null)
|
|
159
|
+
continue;
|
|
160
|
+
bucket[String(row.id)] = rowBodyDigest(row);
|
|
161
|
+
}
|
|
162
|
+
const unchanged = max === cursor.watermarkTime
|
|
163
|
+
&& Object.keys(cursor.ledger).length === 0
|
|
164
|
+
&& Object.keys(bucket).length === Object.keys(cursor.bucket).length
|
|
165
|
+
&& Object.entries(bucket).every(([id, digest]) => cursor.bucket[id] === digest);
|
|
166
|
+
if (unchanged)
|
|
167
|
+
return;
|
|
168
|
+
cursor.watermarkTime = max;
|
|
169
|
+
cursor.bucket = bucket;
|
|
170
|
+
cursor.ledger = dict();
|
|
171
|
+
await this.persist();
|
|
172
|
+
}
|
|
173
|
+
listPrsCursor() {
|
|
174
|
+
return this.state.listPrs;
|
|
175
|
+
}
|
|
176
|
+
// 同款 cutoff 内化:水位 = 截断内最大 versionTime,未前移即免落盘。
|
|
177
|
+
async commitListPrs(rows, cutoffMs) {
|
|
178
|
+
let max = this.state.listPrs.watermarkTime;
|
|
179
|
+
for (const row of rows) {
|
|
180
|
+
const vt = versionTimeOf(row);
|
|
181
|
+
if (vt !== undefined && vt <= cutoffMs && (max === null || vt > max))
|
|
182
|
+
max = vt;
|
|
183
|
+
}
|
|
184
|
+
if (max === null || max === this.state.listPrs.watermarkTime)
|
|
185
|
+
return;
|
|
186
|
+
this.state.listPrs = { watermarkTime: max };
|
|
187
|
+
await this.persist();
|
|
188
|
+
}
|
|
189
|
+
generations() {
|
|
190
|
+
return Object.keys(this.state.generations);
|
|
191
|
+
}
|
|
192
|
+
async dropGeneration(taskId) {
|
|
193
|
+
if (!(taskId in this.state.generations))
|
|
194
|
+
return;
|
|
195
|
+
delete this.state.generations[taskId];
|
|
196
|
+
await this.persist();
|
|
197
|
+
}
|
|
198
|
+
// 删除 key 即丢弃其 cursor(spec §5.3 增量①):残留水位会让「删除后重加」的源
|
|
199
|
+
// 把缺席期间的评论按旧水位永久跳过。
|
|
200
|
+
async pruneSources(activeKeys) {
|
|
201
|
+
let changed = false;
|
|
202
|
+
for (const prs of Object.values(this.state.generations)) {
|
|
203
|
+
for (const sources of Object.values(prs)) {
|
|
204
|
+
for (const key of Object.keys(sources)) {
|
|
205
|
+
if (!activeKeys.has(key)) {
|
|
206
|
+
delete sources[key];
|
|
207
|
+
changed = true;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
if (changed)
|
|
213
|
+
await this.persist();
|
|
214
|
+
}
|
|
215
|
+
mutableSource(taskId, prNumber, sourceKey) {
|
|
216
|
+
const gen = (this.state.generations[taskId] ??= dict());
|
|
217
|
+
const pr = (gen[String(prNumber)] ??= dict());
|
|
218
|
+
return (pr[sourceKey] ??= emptySource());
|
|
219
|
+
}
|
|
220
|
+
async persist() {
|
|
221
|
+
try {
|
|
222
|
+
await mkdir(dirname(this.filePath), { recursive: true });
|
|
223
|
+
// 计数器保证并发/同毫秒调用各持唯一 tmp 路径(防重入之外的纵深)。
|
|
224
|
+
const tmp = `${this.filePath}.${process.pid}.${Date.now()}.${tmpSeq++}.tmp`;
|
|
225
|
+
await writeFile(tmp, JSON.stringify(this.state));
|
|
226
|
+
await rename(tmp, this.filePath);
|
|
227
|
+
this.dirty = false;
|
|
228
|
+
}
|
|
229
|
+
catch (e) {
|
|
230
|
+
this.dirty = true;
|
|
231
|
+
throw e;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=comment-cursor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment-cursor.js","sourceRoot":"","sources":["../../src/platform/comment-cursor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver-spec.d.ts","sourceRoot":"","sources":["../../src/platform/driver-spec.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EAA2C,qBAAqB,EAG3E,MAAM,YAAY,CAAC;AAyCpB,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,GACjB;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,qBAAqB,EAAE,CAAA;CAAE,CA+Z5D"}
|