kiokuko-dsh 0.1.76 → 0.1.78
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/PERMISSIONS.md +8 -0
- package/README.ja.md +1 -0
- package/dist/client.cjs +418 -0
- package/dist/client.d.ts +9 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/diff-review/analyzer.d.ts +15 -0
- package/dist/diff-review/analyzer.d.ts.map +1 -0
- package/dist/diff-review/analyzer.js +180 -0
- package/dist/diff-review/analyzer.js.map +1 -0
- package/dist/diff-review/controller.d.ts +66 -0
- package/dist/diff-review/controller.d.ts.map +1 -0
- package/dist/diff-review/controller.js +264 -0
- package/dist/diff-review/controller.js.map +1 -0
- package/dist/diff-review/current-git-source.d.ts +77 -0
- package/dist/diff-review/current-git-source.d.ts.map +1 -0
- package/dist/diff-review/current-git-source.js +300 -0
- package/dist/diff-review/current-git-source.js.map +1 -0
- package/dist/diff-review/markdown.d.ts +3 -0
- package/dist/diff-review/markdown.d.ts.map +1 -0
- package/dist/diff-review/markdown.js +48 -0
- package/dist/diff-review/markdown.js.map +1 -0
- package/dist/diff-review/native-turn-source.d.ts +38 -0
- package/dist/diff-review/native-turn-source.d.ts.map +1 -0
- package/dist/diff-review/native-turn-source.js +43 -0
- package/dist/diff-review/native-turn-source.js.map +1 -0
- package/dist/diff-review/redaction.d.ts +5 -0
- package/dist/diff-review/redaction.d.ts.map +1 -0
- package/dist/diff-review/redaction.js +26 -0
- package/dist/diff-review/redaction.js.map +1 -0
- package/dist/diff-review/schema.d.ts +191 -0
- package/dist/diff-review/schema.d.ts.map +1 -0
- package/dist/diff-review/schema.js +45 -0
- package/dist/diff-review/schema.js.map +1 -0
- package/dist/dsh/answer-review/evidence.d.ts +24 -2
- package/dist/dsh/answer-review/evidence.d.ts.map +1 -1
- package/dist/dsh/composition.d.ts +2 -0
- package/dist/dsh/composition.d.ts.map +1 -1
- package/dist/dsh/composition.js +3 -0
- package/dist/dsh/composition.js.map +1 -1
- package/dist/dsh/config.d.ts +43 -0
- package/dist/dsh/config.d.ts.map +1 -1
- package/dist/dsh/config.js +14 -0
- package/dist/dsh/config.js.map +1 -1
- package/dist/dsh/core/host.d.ts +16 -0
- package/dist/dsh/core/host.d.ts.map +1 -1
- package/dist/dsh/core/index.d.ts +33 -1
- package/dist/dsh/core/index.d.ts.map +1 -1
- package/dist/dsh/decisions/config.d.ts +16 -0
- package/dist/dsh/decisions/config.d.ts.map +1 -1
- package/dist/dsh/decisions/config.js +10 -0
- package/dist/dsh/decisions/config.js.map +1 -1
- package/dist/dsh/decisions/contracts.d.ts +86 -8
- package/dist/dsh/decisions/contracts.d.ts.map +1 -1
- package/dist/dsh/decisions/contracts.js +41 -7
- package/dist/dsh/decisions/contracts.js.map +1 -1
- package/dist/dsh/decisions/laya-coreml.d.ts.map +1 -1
- package/dist/dsh/decisions/laya-coreml.js +5 -4
- package/dist/dsh/decisions/laya-coreml.js.map +1 -1
- package/dist/dsh/decisions/laya-v1.d.ts.map +1 -1
- package/dist/dsh/decisions/laya-v1.js +2 -2
- package/dist/dsh/decisions/laya-v1.js.map +1 -1
- package/dist/dsh/decisions/memory-batches.d.ts.map +1 -1
- package/dist/dsh/decisions/memory-batches.js +70 -10
- package/dist/dsh/decisions/memory-batches.js.map +1 -1
- package/dist/dsh/decisions/providers.d.ts +6 -2
- package/dist/dsh/decisions/providers.d.ts.map +1 -1
- package/dist/dsh/decisions/providers.js +64 -7
- package/dist/dsh/decisions/providers.js.map +1 -1
- package/dist/dsh/decisions/readiness.d.ts.map +1 -1
- package/dist/dsh/decisions/readiness.js +10 -5
- package/dist/dsh/decisions/readiness.js.map +1 -1
- package/dist/dsh/decisions/score-consistency.d.ts +3 -0
- package/dist/dsh/decisions/score-consistency.d.ts.map +1 -0
- package/dist/dsh/decisions/score-consistency.js +6 -0
- package/dist/dsh/decisions/score-consistency.js.map +1 -0
- package/dist/dsh/decisions/service.d.ts +31 -2
- package/dist/dsh/decisions/service.d.ts.map +1 -1
- package/dist/dsh/decisions/service.js +80 -10
- package/dist/dsh/decisions/service.js.map +1 -1
- package/dist/dsh/decisions/workflows.d.ts.map +1 -1
- package/dist/dsh/decisions/workflows.js +26 -1
- package/dist/dsh/decisions/workflows.js.map +1 -1
- package/dist/dsh/diff-review-surface.d.ts +6 -0
- package/dist/dsh/diff-review-surface.d.ts.map +1 -0
- package/dist/dsh/diff-review-surface.js +93 -0
- package/dist/dsh/diff-review-surface.js.map +1 -0
- package/dist/dsh/host-adapter.d.ts +2 -0
- package/dist/dsh/host-adapter.d.ts.map +1 -1
- package/dist/dsh/host-adapter.js +14 -0
- package/dist/dsh/host-adapter.js.map +1 -1
- package/dist/dsh/index.js +1 -1
- package/dist/dsh/index.js.map +1 -1
- package/dist/dsh/memory-reuse.d.ts.map +1 -1
- package/dist/dsh/memory-reuse.js +32 -5
- package/dist/dsh/memory-reuse.js.map +1 -1
- package/dist/dsh/session-review-context.d.ts +30 -0
- package/dist/dsh/session-review-context.d.ts.map +1 -0
- package/dist/dsh/session-review-context.js +102 -0
- package/dist/dsh/session-review-context.js.map +1 -0
- package/dist/dsh/typesafe/contracts.d.ts.map +1 -1
- package/dist/dsh/typesafe/contracts.js +3 -1
- package/dist/dsh/typesafe/contracts.js.map +1 -1
- package/docs/diff-review.ja.md +16 -0
- package/docs/memory-reuse.md +24 -8
- package/docs/typed-decisions.md +46 -0
- package/dsh/cordis.patch.yml +1 -1
- package/package.json +7 -2
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { type DiffFile, type DiffHunk, type ReviewMode } from './schema.js';
|
|
2
|
+
export interface SubprocessService {
|
|
3
|
+
resolveExecutable(command: string, env?: Readonly<Record<string, string>>, signal?: AbortSignal): Promise<string>;
|
|
4
|
+
spawn(spec: {
|
|
5
|
+
argv: readonly string[];
|
|
6
|
+
cwd: string;
|
|
7
|
+
stdio: {
|
|
8
|
+
stdin: 'ignore';
|
|
9
|
+
stdout: {
|
|
10
|
+
maxBytes: number;
|
|
11
|
+
};
|
|
12
|
+
stderr: {
|
|
13
|
+
maxBytes: number;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
graceMs: number;
|
|
17
|
+
signal: AbortSignal;
|
|
18
|
+
env: NodeJS.ProcessEnv;
|
|
19
|
+
}): {
|
|
20
|
+
done: PromiseLike<{
|
|
21
|
+
exitCode: number | null;
|
|
22
|
+
}>;
|
|
23
|
+
collected: {
|
|
24
|
+
stdout?: {
|
|
25
|
+
readFrom(offset: number): {
|
|
26
|
+
text: string;
|
|
27
|
+
lossy: boolean;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
stderr?: {
|
|
31
|
+
readFrom(offset: number): {
|
|
32
|
+
text: string;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export interface GitLimits {
|
|
39
|
+
maxFiles: number;
|
|
40
|
+
maxFileBytes: number;
|
|
41
|
+
maxSnapshotBytes: number;
|
|
42
|
+
timeoutMs: number;
|
|
43
|
+
}
|
|
44
|
+
interface StatusEntry {
|
|
45
|
+
path: string;
|
|
46
|
+
oldPath?: string;
|
|
47
|
+
x: string;
|
|
48
|
+
y: string;
|
|
49
|
+
}
|
|
50
|
+
export declare class GitReader {
|
|
51
|
+
private readonly subprocess;
|
|
52
|
+
private readonly root;
|
|
53
|
+
private readonly limits;
|
|
54
|
+
private executable;
|
|
55
|
+
constructor(subprocess: SubprocessService, root: string, limits: GitLimits);
|
|
56
|
+
private run;
|
|
57
|
+
private required;
|
|
58
|
+
available(signal: AbortSignal): Promise<boolean>;
|
|
59
|
+
status(signal: AbortSignal): Promise<StatusEntry[]>;
|
|
60
|
+
fingerprint(signal: AbortSignal): Promise<string>;
|
|
61
|
+
matchesCapturedFiles(files: readonly DiffFile[]): Promise<boolean>;
|
|
62
|
+
matchesWorkingDigest(path: string, digest: string): Promise<boolean>;
|
|
63
|
+
capture(mode: ReviewMode, selectedUntracked: readonly string[], signal: AbortSignal): Promise<{
|
|
64
|
+
files: DiffFile[];
|
|
65
|
+
total: number;
|
|
66
|
+
headOid?: string;
|
|
67
|
+
indexDigest: string;
|
|
68
|
+
}>;
|
|
69
|
+
private captureFile;
|
|
70
|
+
private readWorking;
|
|
71
|
+
private readIndex;
|
|
72
|
+
private readHead;
|
|
73
|
+
}
|
|
74
|
+
export declare function safeRelativePath(path: string): boolean;
|
|
75
|
+
export declare function parseHunks(patch: string): DiffHunk[];
|
|
76
|
+
export {};
|
|
77
|
+
//# sourceMappingURL=current-git-source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"current-git-source.d.ts","sourceRoot":"","sources":["../../src/diff-review/current-git-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
import { lstat, open, realpath } from 'node:fs/promises';
|
|
2
|
+
import { constants } from 'node:fs';
|
|
3
|
+
import { dirname, isAbsolute, join, relative, sep } from 'node:path';
|
|
4
|
+
import { randomUUID } from 'node:crypto';
|
|
5
|
+
import { DiffReviewError, sha256 } from './schema.js';
|
|
6
|
+
import { exclusionReason, sanitizeFile } from './redaction.js';
|
|
7
|
+
export class GitReader {
|
|
8
|
+
subprocess;
|
|
9
|
+
root;
|
|
10
|
+
limits;
|
|
11
|
+
executable;
|
|
12
|
+
constructor(subprocess, root, limits) {
|
|
13
|
+
this.subprocess = subprocess;
|
|
14
|
+
this.root = root;
|
|
15
|
+
this.limits = limits;
|
|
16
|
+
}
|
|
17
|
+
async run(args, signal, maxBytes = this.limits.maxSnapshotBytes) {
|
|
18
|
+
const executable = await (this.executable ??= this.subprocess.resolveExecutable('git', {}, signal));
|
|
19
|
+
const timeout = AbortSignal.timeout(this.limits.timeoutMs);
|
|
20
|
+
const bounded = AbortSignal.any([signal, timeout]);
|
|
21
|
+
const handle = this.subprocess.spawn({
|
|
22
|
+
argv: [executable, '-c', 'core.quotePath=false', ...args], cwd: this.root,
|
|
23
|
+
stdio: { stdin: 'ignore', stdout: { maxBytes }, stderr: { maxBytes: 4096 } },
|
|
24
|
+
graceMs: 2000, signal: bounded,
|
|
25
|
+
env: { GIT_CONFIG_COUNT: '0', GIT_TERMINAL_PROMPT: '0', GIT_OPTIONAL_LOCKS: '0', LC_ALL: 'C', GIT_EXTERNAL_DIFF: '', GIT_DIFF_OPTS: '' },
|
|
26
|
+
});
|
|
27
|
+
let outcome;
|
|
28
|
+
try {
|
|
29
|
+
outcome = await handle.done;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
if (bounded.aborted)
|
|
33
|
+
throw new DiffReviewError(timeout.aborted ? 'git_timeout' : 'cancelled', timeout.aborted ? 503 : 409);
|
|
34
|
+
throw new DiffReviewError('git_read_failed', 503);
|
|
35
|
+
}
|
|
36
|
+
if (bounded.aborted)
|
|
37
|
+
throw new DiffReviewError(timeout.aborted ? 'git_timeout' : 'cancelled', timeout.aborted ? 503 : 409);
|
|
38
|
+
const output = handle.collected.stdout?.readFrom(0);
|
|
39
|
+
if (output?.lossy)
|
|
40
|
+
throw new DiffReviewError('diff_too_large', 422);
|
|
41
|
+
return { code: outcome.exitCode, output: output?.text ?? '' };
|
|
42
|
+
}
|
|
43
|
+
async required(args, signal, maxBytes) {
|
|
44
|
+
const result = await this.run(args, signal, maxBytes);
|
|
45
|
+
if (result.code !== 0)
|
|
46
|
+
throw new DiffReviewError('git_read_failed', 503);
|
|
47
|
+
return result.output;
|
|
48
|
+
}
|
|
49
|
+
async available(signal) {
|
|
50
|
+
try {
|
|
51
|
+
const result = await this.run(['rev-parse', '--show-toplevel'], signal, 8192);
|
|
52
|
+
if (result.code !== 0)
|
|
53
|
+
return false;
|
|
54
|
+
return (await realpath(result.output.replace(/\n$/u, ''))) === this.root;
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
if (error instanceof DiffReviewError && error.code === 'cancelled')
|
|
58
|
+
throw error;
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async status(signal) {
|
|
63
|
+
const output = await this.required(['status', '--porcelain=v1', '-z', '--untracked-files=normal', '--ignore-submodules=none'], signal, 128 * 1024);
|
|
64
|
+
const fields = output.split('\0');
|
|
65
|
+
const result = [];
|
|
66
|
+
for (let i = 0; i < fields.length; i++) {
|
|
67
|
+
const field = fields[i];
|
|
68
|
+
if (!field)
|
|
69
|
+
continue;
|
|
70
|
+
if (field.length < 4 || field[2] !== ' ')
|
|
71
|
+
throw new DiffReviewError('invalid_git_status', 503);
|
|
72
|
+
const x = field[0], y = field[1], path = field.slice(3);
|
|
73
|
+
if (!safeRelativePath(path))
|
|
74
|
+
throw new DiffReviewError('invalid_git_path', 409);
|
|
75
|
+
let oldPath;
|
|
76
|
+
if ('RC'.includes(x) || 'RC'.includes(y)) {
|
|
77
|
+
oldPath = fields[++i];
|
|
78
|
+
if (!oldPath || !safeRelativePath(oldPath))
|
|
79
|
+
throw new DiffReviewError('invalid_git_path', 409);
|
|
80
|
+
}
|
|
81
|
+
result.push({ x, y, path, ...(oldPath ? { oldPath } : {}) });
|
|
82
|
+
}
|
|
83
|
+
return result;
|
|
84
|
+
}
|
|
85
|
+
async fingerprint(signal) {
|
|
86
|
+
const [status, staged, unstaged, stagedPatch, unstagedPatch, head] = await Promise.all([
|
|
87
|
+
this.required(['status', '--porcelain=v1', '-z', '--untracked-files=normal', '--ignore-submodules=none'], signal, 128 * 1024),
|
|
88
|
+
this.required(['diff', '--cached', '--raw', '-z', '--no-ext-diff', '--no-textconv'], signal, 256 * 1024),
|
|
89
|
+
this.required(['diff', '--raw', '-z', '--no-ext-diff', '--no-textconv'], signal, 256 * 1024),
|
|
90
|
+
this.required(['diff', '--cached', '--root', '--no-ext-diff', '--no-textconv', '--no-color', '--unified=0'], signal),
|
|
91
|
+
this.required(['diff', '--no-ext-diff', '--no-textconv', '--no-color', '--unified=0'], signal),
|
|
92
|
+
this.run(['rev-parse', '--verify', 'HEAD'], signal, 128),
|
|
93
|
+
]);
|
|
94
|
+
return sha256(JSON.stringify([status, staged, unstaged, stagedPatch, unstagedPatch, head.code === 0 ? head.output.trim() : null]));
|
|
95
|
+
}
|
|
96
|
+
async matchesCapturedFiles(files) {
|
|
97
|
+
for (const file of files) {
|
|
98
|
+
if (file.layer !== 'untracked' || !file.newPath || !file.newDigest)
|
|
99
|
+
continue;
|
|
100
|
+
const current = await this.readWorking(file.newPath);
|
|
101
|
+
if (!current || sha256(current) !== file.newDigest)
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
async matchesWorkingDigest(path, digest) {
|
|
107
|
+
if (!safeRelativePath(path))
|
|
108
|
+
return false;
|
|
109
|
+
const current = await this.readWorking(path);
|
|
110
|
+
return current !== undefined && sha256(current) === digest;
|
|
111
|
+
}
|
|
112
|
+
async capture(mode, selectedUntracked, signal) {
|
|
113
|
+
if (!await this.available(signal))
|
|
114
|
+
throw new DiffReviewError('repo_unavailable', 422);
|
|
115
|
+
const before = await this.fingerprint(signal);
|
|
116
|
+
const entries = await this.status(signal);
|
|
117
|
+
const selected = new Set(selectedUntracked);
|
|
118
|
+
if (selected.size !== selectedUntracked.length || [...selected].some(path => !safeRelativePath(path) || !entries.some(e => e.x === '?' && e.path === path))) {
|
|
119
|
+
throw new DiffReviewError('invalid_untracked_selection', 400);
|
|
120
|
+
}
|
|
121
|
+
const candidates = [];
|
|
122
|
+
for (const entry of entries) {
|
|
123
|
+
if (entry.x === '?' && selected.has(entry.path))
|
|
124
|
+
candidates.push({ entry, layer: 'untracked' });
|
|
125
|
+
if (entry.x === 'U' || entry.y === 'U' || entry.x === 'A' && entry.y === 'A' || entry.x === 'D' && entry.y === 'D') {
|
|
126
|
+
if (mode === 'current' || mode === 'staged' && entry.x !== ' ' || mode === 'unstaged' && entry.y !== ' ') {
|
|
127
|
+
candidates.push({ entry, layer: mode === 'unstaged' ? 'unstaged' : 'staged' });
|
|
128
|
+
}
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if ((mode === 'current' || mode === 'staged') && entry.x !== ' ' && entry.x !== '?')
|
|
132
|
+
candidates.push({ entry, layer: 'staged' });
|
|
133
|
+
if ((mode === 'current' || mode === 'unstaged') && entry.y !== ' ' && entry.y !== '?')
|
|
134
|
+
candidates.push({ entry, layer: 'unstaged' });
|
|
135
|
+
}
|
|
136
|
+
const files = [];
|
|
137
|
+
for (const candidate of candidates.slice(0, this.limits.maxFiles)) {
|
|
138
|
+
files.push(await this.captureFile(candidate.entry, candidate.layer, signal));
|
|
139
|
+
if (Buffer.byteLength(JSON.stringify(files)) > this.limits.maxSnapshotBytes)
|
|
140
|
+
throw new DiffReviewError('diff_too_large', 422);
|
|
141
|
+
}
|
|
142
|
+
if (before !== await this.fingerprint(signal))
|
|
143
|
+
throw new DiffReviewError('repository_changed', 409);
|
|
144
|
+
for (const file of files) {
|
|
145
|
+
if ((file.layer !== 'unstaged' && file.layer !== 'untracked') || !file.newPath || !file.newDigest)
|
|
146
|
+
continue;
|
|
147
|
+
const current = await this.readWorking(file.newPath);
|
|
148
|
+
if (!current || sha256(current) !== file.newDigest)
|
|
149
|
+
throw new DiffReviewError('repository_changed', 409);
|
|
150
|
+
}
|
|
151
|
+
const head = await this.run(['rev-parse', '--verify', 'HEAD'], signal, 128);
|
|
152
|
+
return { files, total: candidates.length, ...(head.code === 0 ? { headOid: head.output.trim() } : {}), indexDigest: before };
|
|
153
|
+
}
|
|
154
|
+
async captureFile(entry, layer, signal) {
|
|
155
|
+
const path = entry.path;
|
|
156
|
+
const displayPath = path;
|
|
157
|
+
const base = { fileId: randomUUID(), layer, ...(entry.oldPath ? { oldPath: entry.oldPath } : {}), newPath: path, displayPath, kind: 'text', hunks: [] };
|
|
158
|
+
const secretPath = exclusionReason(path);
|
|
159
|
+
if (secretPath)
|
|
160
|
+
return sanitizeFile({ ...base, kind: 'excluded', reason: secretPath });
|
|
161
|
+
if (entry.x === 'U' || entry.y === 'U' || entry.x === 'A' && entry.y === 'A' || entry.x === 'D' && entry.y === 'D')
|
|
162
|
+
return { ...base, kind: 'conflict', reason: 'unmerged' };
|
|
163
|
+
if (layer === 'untracked') {
|
|
164
|
+
const content = await this.readWorking(path);
|
|
165
|
+
if (content === undefined)
|
|
166
|
+
return { ...base, kind: 'symlink', reason: 'non_regular_file' };
|
|
167
|
+
if (content.length > this.limits.maxFileBytes)
|
|
168
|
+
return { ...base, kind: 'oversized', reason: 'file_limit' };
|
|
169
|
+
if (content.includes(0))
|
|
170
|
+
return { ...base, kind: 'binary', reason: 'binary' };
|
|
171
|
+
let decoded;
|
|
172
|
+
try {
|
|
173
|
+
decoded = new TextDecoder('utf-8', { fatal: true }).decode(content);
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return { ...base, kind: 'binary', reason: 'invalid_text' };
|
|
177
|
+
}
|
|
178
|
+
const lines = decoded.split('\n').map(line => `+${line}`);
|
|
179
|
+
if (lines.at(-1) === '+')
|
|
180
|
+
lines.pop();
|
|
181
|
+
const hunk = { id: sha256(lines.join('\n')).slice(0, 16), oldStart: 0, oldLines: 0, newStart: 1, newLines: lines.length, lines };
|
|
182
|
+
return sanitizeFile({ ...base, newDigest: sha256(content), hunks: [hunk], patch: `@@ -0,0 +1,${lines.length} @@\n${lines.join('\n')}` });
|
|
183
|
+
}
|
|
184
|
+
const args = ['diff', ...(layer === 'staged' ? ['--cached', '--root'] : []), '--no-ext-diff', '--no-textconv', '--no-color', '--unified=3', '--', ...(entry.oldPath ? [entry.oldPath] : []), path];
|
|
185
|
+
let patch;
|
|
186
|
+
try {
|
|
187
|
+
patch = await this.required(args, signal, this.limits.maxFileBytes * 2);
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
if (error instanceof DiffReviewError && error.code === 'diff_too_large')
|
|
191
|
+
return { ...base, kind: 'oversized', reason: 'patch_limit' };
|
|
192
|
+
throw error;
|
|
193
|
+
}
|
|
194
|
+
const index = await this.run(['ls-files', '--stage', '-z', '--', path], signal, 8192);
|
|
195
|
+
const mode = index.code === 0 ? /^([0-7]{6}) /u.exec(index.output)?.[1] : undefined;
|
|
196
|
+
const oldMode = /^old mode ([0-7]{6})/mu.exec(patch)?.[1] ?? /^deleted file mode ([0-7]{6})/mu.exec(patch)?.[1];
|
|
197
|
+
const newMode = /^new mode ([0-7]{6})/mu.exec(patch)?.[1] ?? /^new file mode ([0-7]{6})/mu.exec(patch)?.[1] ?? mode;
|
|
198
|
+
if (layer === 'unstaged') {
|
|
199
|
+
const status = await lstat(join(this.root, path)).catch(() => undefined);
|
|
200
|
+
if (status?.isSymbolicLink())
|
|
201
|
+
return { ...base, kind: 'symlink', reason: 'symlink' };
|
|
202
|
+
}
|
|
203
|
+
if (newMode === '120000')
|
|
204
|
+
return { ...base, kind: 'symlink', reason: 'symlink', newMode };
|
|
205
|
+
if (newMode === '160000')
|
|
206
|
+
return { ...base, kind: 'submodule', reason: 'submodule', newMode };
|
|
207
|
+
if (/^Binary files |^GIT binary patch/mu.test(patch) || patch.includes('\uFFFD'))
|
|
208
|
+
return { ...base, kind: 'binary', reason: 'binary_or_invalid_text' };
|
|
209
|
+
const hunks = parseHunks(patch);
|
|
210
|
+
const kind = hunks.length === 0 ? 'mode' : 'text';
|
|
211
|
+
const newContent = layer === 'staged' ? await this.readIndex(path, signal) : await this.readWorking(path);
|
|
212
|
+
const oldContent = layer === 'staged' ? await this.readHead(entry.oldPath ?? path, signal) : await this.readIndex(entry.oldPath ?? path, signal);
|
|
213
|
+
if ((newContent?.length ?? 0) > this.limits.maxFileBytes || (oldContent?.length ?? 0) > this.limits.maxFileBytes)
|
|
214
|
+
return { ...base, kind: 'oversized', reason: 'file_limit' };
|
|
215
|
+
if (newContent?.includes(0) || oldContent?.includes(0))
|
|
216
|
+
return { ...base, kind: 'binary', reason: 'binary' };
|
|
217
|
+
if (exclusionReason(path, [oldContent?.toString('utf8') ?? '', newContent?.toString('utf8') ?? ''].join('\n'))) {
|
|
218
|
+
return { ...base, kind: 'excluded', reason: 'secret_content', hunks: [] };
|
|
219
|
+
}
|
|
220
|
+
return sanitizeFile({ ...base, kind, ...(oldMode ? { oldMode } : {}), ...(newMode ? { newMode } : {}),
|
|
221
|
+
...(oldContent ? { oldDigest: sha256(oldContent) } : {}), ...(newContent ? { newDigest: sha256(newContent) } : {}), hunks, patch });
|
|
222
|
+
}
|
|
223
|
+
async readWorking(path) {
|
|
224
|
+
const absolute = join(this.root, path);
|
|
225
|
+
const parent = await realpath(dirname(absolute));
|
|
226
|
+
if (parent !== this.root && !parent.startsWith(this.root + sep))
|
|
227
|
+
throw new DiffReviewError('path_outside_repository', 409);
|
|
228
|
+
const handle = await open(absolute, constants.O_RDONLY | constants.O_NOFOLLOW).catch((error) => {
|
|
229
|
+
if (error.code === 'ENOENT' || error.code === 'ELOOP')
|
|
230
|
+
return undefined;
|
|
231
|
+
throw error;
|
|
232
|
+
});
|
|
233
|
+
if (!handle)
|
|
234
|
+
return undefined;
|
|
235
|
+
try {
|
|
236
|
+
const status = await handle.stat();
|
|
237
|
+
if (!status.isFile())
|
|
238
|
+
return undefined;
|
|
239
|
+
if (status.size > this.limits.maxFileBytes)
|
|
240
|
+
return Buffer.alloc(this.limits.maxFileBytes + 1);
|
|
241
|
+
const buffer = Buffer.alloc(this.limits.maxFileBytes + 1);
|
|
242
|
+
let length = 0;
|
|
243
|
+
while (length < buffer.length) {
|
|
244
|
+
const chunk = await handle.read(buffer, length, buffer.length - length, length);
|
|
245
|
+
if (chunk.bytesRead === 0)
|
|
246
|
+
break;
|
|
247
|
+
length += chunk.bytesRead;
|
|
248
|
+
}
|
|
249
|
+
return buffer.subarray(0, length);
|
|
250
|
+
}
|
|
251
|
+
finally {
|
|
252
|
+
await handle.close();
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
async readIndex(path, signal) {
|
|
256
|
+
try {
|
|
257
|
+
const value = await this.run(['show', `:${path}`], signal, this.limits.maxFileBytes + 1);
|
|
258
|
+
return value.code === 0 ? Buffer.from(value.output) : undefined;
|
|
259
|
+
}
|
|
260
|
+
catch (error) {
|
|
261
|
+
if (error instanceof DiffReviewError && error.code === 'diff_too_large')
|
|
262
|
+
return Buffer.alloc(this.limits.maxFileBytes + 1);
|
|
263
|
+
throw error;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
async readHead(path, signal) {
|
|
267
|
+
try {
|
|
268
|
+
const value = await this.run(['show', `HEAD:${path}`], signal, this.limits.maxFileBytes + 1);
|
|
269
|
+
return value.code === 0 ? Buffer.from(value.output) : undefined;
|
|
270
|
+
}
|
|
271
|
+
catch (error) {
|
|
272
|
+
if (error instanceof DiffReviewError && error.code === 'diff_too_large')
|
|
273
|
+
return Buffer.alloc(this.limits.maxFileBytes + 1);
|
|
274
|
+
throw error;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
export function safeRelativePath(path) {
|
|
279
|
+
return path.length > 0 && !isAbsolute(path) && !path.includes('\0') && !path.split(/[\\/]/u).includes('..') && relative('.', path) !== '';
|
|
280
|
+
}
|
|
281
|
+
export function parseHunks(patch) {
|
|
282
|
+
const lines = patch.split('\n');
|
|
283
|
+
const hunks = [];
|
|
284
|
+
let current;
|
|
285
|
+
for (const line of lines) {
|
|
286
|
+
if (line.startsWith('diff --git ')) {
|
|
287
|
+
current = undefined;
|
|
288
|
+
continue;
|
|
289
|
+
}
|
|
290
|
+
const match = /^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/u.exec(line);
|
|
291
|
+
if (match) {
|
|
292
|
+
current = { id: sha256(`${hunks.length}:${line}`).slice(0, 16), oldStart: Number(match[1]), oldLines: Number(match[2] ?? 1), newStart: Number(match[3]), newLines: Number(match[4] ?? 1), lines: [] };
|
|
293
|
+
hunks.push(current);
|
|
294
|
+
}
|
|
295
|
+
else if (current && (line.startsWith(' ') || line.startsWith('+') || line.startsWith('-') || line.startsWith('\\')))
|
|
296
|
+
current.lines.push(line);
|
|
297
|
+
}
|
|
298
|
+
return hunks;
|
|
299
|
+
}
|
|
300
|
+
//# sourceMappingURL=current-git-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"current-git-source.js","sourceRoot":"","sources":["../../src/diff-review/current-git-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/diff-review/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAO7C,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CA+BzD"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
function prose(value) {
|
|
2
|
+
return value.replaceAll('&', '&').replaceAll('<', '<').replaceAll('>', '>')
|
|
3
|
+
.replaceAll('[', '\\[').replaceAll(']', '\\]').replaceAll('\r', '').replaceAll('\n', ' \n');
|
|
4
|
+
}
|
|
5
|
+
export function reviewMarkdown(review) {
|
|
6
|
+
const lines = [`# Diff レビュー`, '', `- 取得時刻: ${review.snapshot.capturedAt}`, `- 比較対象: ${review.snapshot.mode}`, `- 状態: ${review.state}`, `- 鮮度: ${review.freshness}`, `- 文脈: ${review.context.source} / ${review.context.memory}`];
|
|
7
|
+
if (review.model)
|
|
8
|
+
lines.push(`- モデル: ${prose(review.model.provider)}/${prose(review.model.model)}`);
|
|
9
|
+
if (review.context.task)
|
|
10
|
+
lines.push('', '## タスク入力', '', prose(review.context.task));
|
|
11
|
+
if (review.context.reviewInput)
|
|
12
|
+
lines.push('', '## このレビューの目的(利用者入力)', '', prose(review.context.reviewInput));
|
|
13
|
+
if (review.context.constraints)
|
|
14
|
+
lines.push('', '制約: ' + prose(review.context.constraints));
|
|
15
|
+
if (review.context.expected)
|
|
16
|
+
lines.push('期待結果: ' + prose(review.context.expected));
|
|
17
|
+
if (review.context.execution?.length)
|
|
18
|
+
lines.push('', '## 実行記録', '', ...review.context.execution.map(item => `- ${prose(item.command)}: ${item.status}(今回の差分との一致: ${item.snapshotMatch})`));
|
|
19
|
+
lines.push('', '## リポジトリの事実', '');
|
|
20
|
+
for (const file of review.snapshot.files) {
|
|
21
|
+
lines.push(`### ${prose(file.displayPath)} (${file.layer}, ${file.kind})`, '');
|
|
22
|
+
if (file.reason)
|
|
23
|
+
lines.push(`除外・制限: ${file.reason}`, '');
|
|
24
|
+
if (file.patch) {
|
|
25
|
+
const fence = '`'.repeat(Math.max(3, ...[...file.patch.matchAll(/`+/gu)].map(match => match[0].length + 1)));
|
|
26
|
+
lines.push(`${fence}diff`, file.patch, fence, '');
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
lines.push('## AI の解釈', '', prose(review.summary ?? '分析なし'), '');
|
|
30
|
+
if (review.analysis) {
|
|
31
|
+
lines.push(`全体リスク: ${review.analysis.overallRisk}`, '');
|
|
32
|
+
for (const [label, values] of [['影響範囲', review.analysis.impact], ['破壊的変更', review.analysis.breakingChanges],
|
|
33
|
+
['テストの不足', review.analysis.testGaps], ['過去判断との不一致', review.analysis.memoryConflicts], ['仮定', review.analysis.assumptions]]) {
|
|
34
|
+
lines.push(`### ${label}`, '', ...(values.length ? values.map(value => `- ${prose(value)}`) : ['- 記録なし']), '');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
for (const claim of review.claims)
|
|
38
|
+
lines.push(`- ${prose(claim.text)} [根拠: ${claim.evidenceIds.join(', ')}]`);
|
|
39
|
+
lines.push('', '## 未検証・未分析', '');
|
|
40
|
+
for (const id of review.unanalyzedFileIds)
|
|
41
|
+
lines.push(`- 未分析 fileId: ${id}`);
|
|
42
|
+
for (const error of review.errors)
|
|
43
|
+
lines.push(`- ${error}`);
|
|
44
|
+
if (!review.unanalyzedFileIds.length && !review.errors.length)
|
|
45
|
+
lines.push('- 記録なし');
|
|
46
|
+
return lines.join('\n') + '\n';
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/diff-review/markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type DiffFile } from './schema.js';
|
|
2
|
+
export interface NativeChanges {
|
|
3
|
+
summary(sessionId: string, seq: number): {
|
|
4
|
+
cwd: string;
|
|
5
|
+
total: number;
|
|
6
|
+
files: {
|
|
7
|
+
path: string;
|
|
8
|
+
binary?: true;
|
|
9
|
+
oversized?: true;
|
|
10
|
+
}[];
|
|
11
|
+
snapshot?: {
|
|
12
|
+
before: string;
|
|
13
|
+
after: string;
|
|
14
|
+
};
|
|
15
|
+
} | undefined;
|
|
16
|
+
diff(sessionId: string, seq: number, index: number, signal: AbortSignal): Promise<{
|
|
17
|
+
kind: 'text' | 'binary' | 'oversized';
|
|
18
|
+
path: string;
|
|
19
|
+
hunks?: {
|
|
20
|
+
oldStart: number;
|
|
21
|
+
oldLines: number;
|
|
22
|
+
newStart: number;
|
|
23
|
+
newLines: number;
|
|
24
|
+
lines: string[];
|
|
25
|
+
}[];
|
|
26
|
+
} | undefined>;
|
|
27
|
+
}
|
|
28
|
+
export declare function captureNativeTurn(source: NativeChanges | undefined, sessionId: string, seq: number, root: string, limits: {
|
|
29
|
+
maxFiles: number;
|
|
30
|
+
maxFileBytes: number;
|
|
31
|
+
maxSnapshotBytes: number;
|
|
32
|
+
}, signal: AbortSignal): Promise<{
|
|
33
|
+
files: DiffFile[];
|
|
34
|
+
total: number;
|
|
35
|
+
beforeTree?: string;
|
|
36
|
+
afterTree?: string;
|
|
37
|
+
}>;
|
|
38
|
+
//# sourceMappingURL=native-turn-source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-turn-source.d.ts","sourceRoot":"","sources":["../../src/diff-review/native-turn-source.ts"],"names":[],"mappings":"AAGA,OAAO,EAA2B,KAAK,QAAQ,EAAiB,MAAM,aAAa,CAAA;AAInF,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG;QACvC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,IAAI,CAAC;YAAC,SAAS,CAAC,EAAE,IAAI,CAAA;SAAE,EAAE,CAAA;QACtF,QAAQ,CAAC,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAA;KAC7C,GAAG,SAAS,CAAA;IACb,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC;QAChF,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,WAAW,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;QACnD,KAAK,CAAC,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,EAAE,CAAA;SAAE,EAAE,CAAA;KACtG,GAAG,SAAS,CAAC,CAAA;CACf;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,aAAa,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAC/E,MAAM,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,EAAE,WAAW,GAChG,OAAO,CAAC;IAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA+BxF"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { realpath } from 'node:fs/promises';
|
|
3
|
+
import { resolve, sep } from 'node:path';
|
|
4
|
+
import { DiffReviewError, sha256 } from './schema.js';
|
|
5
|
+
import { sanitizeFile } from './redaction.js';
|
|
6
|
+
import { abortable } from '../dsh/http-json.js';
|
|
7
|
+
export async function captureNativeTurn(source, sessionId, seq, root, limits, signal) {
|
|
8
|
+
const summary = source?.summary(sessionId, seq);
|
|
9
|
+
if (!summary)
|
|
10
|
+
throw new DiffReviewError('turn_snapshot_unavailable', 422);
|
|
11
|
+
const cwd = await realpath(summary.cwd).catch(() => { throw new DiffReviewError('session_workspace_mismatch', 409); });
|
|
12
|
+
if (cwd !== root && !cwd.startsWith(root + sep))
|
|
13
|
+
throw new DiffReviewError('session_workspace_mismatch', 409);
|
|
14
|
+
const files = [];
|
|
15
|
+
for (let index = 0; index < Math.min(summary.files.length, limits.maxFiles); index++) {
|
|
16
|
+
const item = summary.files[index];
|
|
17
|
+
const absolute = resolve(cwd, item.path);
|
|
18
|
+
if (absolute !== root && !absolute.startsWith(root + sep)) {
|
|
19
|
+
files.push({ fileId: randomUUID(), layer: 'turn', displayPath: '[outside repository]', kind: 'excluded', reason: 'outside_repository', hunks: [] });
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
const diff = await abortable(source.diff(sessionId, seq, index, signal), signal);
|
|
23
|
+
if (!diff || diff.path !== item.path)
|
|
24
|
+
throw new DiffReviewError('turn_snapshot_unavailable', 422);
|
|
25
|
+
const hunks = diff.kind === 'text' ? (diff.hunks ?? []).map((hunk, i) => ({
|
|
26
|
+
id: sha256(`${index}:${i}:${JSON.stringify(hunk)}`).slice(0, 16),
|
|
27
|
+
oldStart: hunk.oldStart, oldLines: hunk.oldLines, newStart: hunk.newStart, newLines: hunk.newLines, lines: [...hunk.lines],
|
|
28
|
+
})) : [];
|
|
29
|
+
if (Buffer.byteLength(JSON.stringify(hunks)) > limits.maxFileBytes) {
|
|
30
|
+
files.push(sanitizeFile({ fileId: randomUUID(), layer: 'turn', displayPath: item.path, newPath: item.path,
|
|
31
|
+
kind: 'oversized', reason: 'file_limit', hunks: [] }));
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
const file = { fileId: randomUUID(), layer: 'turn', newPath: item.path, displayPath: item.path,
|
|
35
|
+
kind: diff.kind, ...(diff.kind === 'text' ? { patch: hunks.map(hunk => `@@ -${hunk.oldStart},${hunk.oldLines} +${hunk.newStart},${hunk.newLines} @@\n${hunk.lines.join('\n')}`).join('\n') } : {}), hunks };
|
|
36
|
+
files.push(sanitizeFile(file));
|
|
37
|
+
if (Buffer.byteLength(JSON.stringify(files)) > limits.maxSnapshotBytes)
|
|
38
|
+
throw new DiffReviewError('diff_too_large', 422);
|
|
39
|
+
}
|
|
40
|
+
return { files, total: summary.total,
|
|
41
|
+
...(summary.snapshot ? { beforeTree: summary.snapshot.before, afterTree: summary.snapshot.after } : {}) };
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=native-turn-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-turn-source.js","sourceRoot":"","sources":["../../src/diff-review/native-turn-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { DiffFile } from './schema.js';
|
|
2
|
+
export declare function exclusionReason(path: string, content?: string): string | undefined;
|
|
3
|
+
export declare function sanitizeFile(file: DiffFile): DiffFile;
|
|
4
|
+
export declare function safeReviewInput(input: string): string | undefined;
|
|
5
|
+
//# sourceMappingURL=redaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redaction.d.ts","sourceRoot":"","sources":["../../src/diff-review/redaction.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAK3C,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKlF;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAOrD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGjE"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { findSecret } from '../memory/secrets.js';
|
|
2
|
+
const SECRET_PATH = /(?:^|\/)(?:\.env(?:\.|$)|\.npmrc$|\.pypirc$|\.netrc$|\.ssh\/|\.aws\/|\.config\/gcloud\/|\.docker\/config\.json$|auth\.json$|id_(?:rsa|ed25519)|[^/]*\.(?:pem|p12|pfx|key|keystore|kdbx)$|credentials?(?:\.|$)|secrets?(?:\.|$))/iu;
|
|
3
|
+
const GENERATED_PATH = /(?:^|\/)(?:node_modules|dist|build|coverage|\.next)\//u;
|
|
4
|
+
export function exclusionReason(path, content) {
|
|
5
|
+
if (SECRET_PATH.test(path) || findSecret(path))
|
|
6
|
+
return 'secret_path';
|
|
7
|
+
if (GENERATED_PATH.test(path))
|
|
8
|
+
return 'generated_file';
|
|
9
|
+
if (content !== undefined && findSecret(content))
|
|
10
|
+
return 'secret_content';
|
|
11
|
+
return undefined;
|
|
12
|
+
}
|
|
13
|
+
export function sanitizeFile(file) {
|
|
14
|
+
const reason = exclusionReason(file.newPath ?? file.oldPath ?? file.displayPath, file.patch);
|
|
15
|
+
if (reason === undefined)
|
|
16
|
+
return file;
|
|
17
|
+
return {
|
|
18
|
+
fileId: file.fileId, layer: file.layer, displayPath: reason === 'secret_path' ? '[excluded path]' : file.displayPath,
|
|
19
|
+
kind: 'excluded', reason, hunks: [],
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export function safeReviewInput(input) {
|
|
23
|
+
const trimmed = input.trim();
|
|
24
|
+
return trimmed && !findSecret(trimmed) ? trimmed : undefined;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=redaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redaction.js","sourceRoot":"","sources":["../../src/diff-review/redaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAGjD,MAAM,WAAW,GAAG,mOAAmO,CAAA;AACvP,MAAM,cAAc,GAAG,wDAAwD,CAAA;AAE/E,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,OAAgB;IAC5D,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,aAAa,CAAA;IACpE,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,gBAAgB,CAAA;IACtD,IAAI,OAAO,KAAK,SAAS,IAAI,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,gBAAgB,CAAA;IACzE,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAc;IACzC,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;IAC5F,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAA;IACrC,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW;QACpH,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;KACpC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;IAC5B,OAAO,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAA;AAC9D,CAAC"}
|