ghagga-core 2.9.1 → 3.0.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/LICENSE +21 -0
- package/dist/agents/consensus.d.ts.map +1 -1
- package/dist/agents/consensus.js +7 -2
- package/dist/agents/consensus.js.map +1 -1
- package/dist/agents/diagnostic.d.ts.map +1 -1
- package/dist/agents/diagnostic.js +7 -2
- package/dist/agents/diagnostic.js.map +1 -1
- package/dist/agents/fan-out-lenses.d.ts.map +1 -1
- package/dist/agents/fan-out-lenses.js +7 -2
- package/dist/agents/fan-out-lenses.js.map +1 -1
- package/dist/agents/prompts.d.ts +49 -1
- package/dist/agents/prompts.d.ts.map +1 -1
- package/dist/agents/prompts.js +133 -5
- package/dist/agents/prompts.js.map +1 -1
- package/dist/agents/simple.d.ts +1 -1
- package/dist/agents/simple.d.ts.map +1 -1
- package/dist/agents/simple.js +6 -4
- package/dist/agents/simple.js.map +1 -1
- package/dist/agents/workflow.d.ts.map +1 -1
- package/dist/agents/workflow.js +13 -4
- package/dist/agents/workflow.js.map +1 -1
- package/dist/critique/critique.d.ts.map +1 -1
- package/dist/critique/critique.js +14 -6
- package/dist/critique/critique.js.map +1 -1
- package/dist/diff/index.d.ts +12 -0
- package/dist/diff/index.d.ts.map +1 -0
- package/dist/diff/index.js +11 -0
- package/dist/diff/index.js.map +1 -0
- package/dist/diff/parse.d.ts +41 -0
- package/dist/diff/parse.d.ts.map +1 -0
- package/dist/diff/parse.js +303 -0
- package/dist/diff/parse.js.map +1 -0
- package/dist/diff/types.d.ts +106 -0
- package/dist/diff/types.d.ts.map +1 -0
- package/dist/diff/types.js +23 -0
- package/dist/diff/types.js.map +1 -0
- package/dist/embed.d.ts +5 -2
- package/dist/embed.d.ts.map +1 -1
- package/dist/embed.js +7 -3
- package/dist/embed.js.map +1 -1
- package/dist/enhance/prompt.d.ts +5 -1
- package/dist/enhance/prompt.d.ts.map +1 -1
- package/dist/enhance/prompt.js +9 -2
- package/dist/enhance/prompt.js.map +1 -1
- package/dist/format.d.ts +31 -0
- package/dist/format.d.ts.map +1 -1
- package/dist/format.js +256 -15
- package/dist/format.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/memory/pageindex/index.d.ts +2 -2
- package/dist/memory/pageindex/index.d.ts.map +1 -1
- package/dist/memory/pageindex/index.js.map +1 -1
- package/dist/memory/pageindex/service.d.ts +10 -1
- package/dist/memory/pageindex/service.d.ts.map +1 -1
- package/dist/memory/pageindex/service.js +2 -2
- package/dist/memory/pageindex/service.js.map +1 -1
- package/dist/memory/persist.d.ts.map +1 -1
- package/dist/memory/persist.js +10 -3
- package/dist/memory/persist.js.map +1 -1
- package/dist/memory/privacy.d.ts.map +1 -1
- package/dist/memory/privacy.js +45 -6
- package/dist/memory/privacy.js.map +1 -1
- package/dist/memory/sqlite.d.ts +1 -13
- package/dist/memory/sqlite.d.ts.map +1 -1
- package/dist/memory/sqlite.js +45 -27
- package/dist/memory/sqlite.js.map +1 -1
- package/dist/memory/taxonomy.d.ts.map +1 -1
- package/dist/memory/taxonomy.js +6 -1
- package/dist/memory/taxonomy.js.map +1 -1
- package/dist/pipeline/degrade.d.ts +61 -0
- package/dist/pipeline/degrade.d.ts.map +1 -0
- package/dist/pipeline/degrade.js +58 -0
- package/dist/pipeline/degrade.js.map +1 -0
- package/dist/pipeline/enrich.d.ts +29 -0
- package/dist/pipeline/enrich.d.ts.map +1 -0
- package/dist/pipeline/enrich.js +271 -0
- package/dist/pipeline/enrich.js.map +1 -0
- package/dist/pipeline/execute.d.ts +22 -0
- package/dist/pipeline/execute.d.ts.map +1 -0
- package/dist/pipeline/execute.js +250 -0
- package/dist/pipeline/execute.js.map +1 -0
- package/dist/pipeline/finalize.d.ts +26 -0
- package/dist/pipeline/finalize.d.ts.map +1 -0
- package/dist/pipeline/finalize.js +52 -0
- package/dist/pipeline/finalize.js.map +1 -0
- package/dist/pipeline/gather-context.d.ts +25 -0
- package/dist/pipeline/gather-context.d.ts.map +1 -0
- package/dist/pipeline/gather-context.js +169 -0
- package/dist/pipeline/gather-context.js.map +1 -0
- package/dist/pipeline/gather-safe.d.ts +39 -0
- package/dist/pipeline/gather-safe.d.ts.map +1 -0
- package/dist/pipeline/gather-safe.js +127 -0
- package/dist/pipeline/gather-safe.js.map +1 -0
- package/dist/pipeline/prepare-graph.d.ts +54 -0
- package/dist/pipeline/prepare-graph.d.ts.map +1 -0
- package/dist/pipeline/prepare-graph.js +174 -0
- package/dist/pipeline/prepare-graph.js.map +1 -0
- package/dist/pipeline/prepare.d.ts +40 -0
- package/dist/pipeline/prepare.d.ts.map +1 -0
- package/dist/pipeline/prepare.js +233 -0
- package/dist/pipeline/prepare.js.map +1 -0
- package/dist/pipeline/providers.d.ts +54 -0
- package/dist/pipeline/providers.d.ts.map +1 -0
- package/dist/pipeline/providers.js +163 -0
- package/dist/pipeline/providers.js.map +1 -0
- package/dist/pipeline/results.d.ts +35 -0
- package/dist/pipeline/results.d.ts.map +1 -0
- package/dist/pipeline/results.js +122 -0
- package/dist/pipeline/results.js.map +1 -0
- package/dist/pipeline/state.d.ts +92 -0
- package/dist/pipeline/state.d.ts.map +1 -0
- package/dist/pipeline/state.js +13 -0
- package/dist/pipeline/state.js.map +1 -0
- package/dist/pipeline.d.ts +10 -9
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +36 -1213
- package/dist/pipeline.js.map +1 -1
- package/dist/providers/gateway.d.ts.map +1 -1
- package/dist/providers/gateway.js +8 -0
- package/dist/providers/gateway.js.map +1 -1
- package/dist/recursive/index.d.ts +1 -0
- package/dist/recursive/index.d.ts.map +1 -1
- package/dist/recursive/index.js +7 -3
- package/dist/recursive/index.js.map +1 -1
- package/dist/recursive/patch-extractor.d.ts +58 -6
- package/dist/recursive/patch-extractor.d.ts.map +1 -1
- package/dist/recursive/patch-extractor.js +207 -26
- package/dist/recursive/patch-extractor.js.map +1 -1
- package/dist/sanitize.d.ts +51 -0
- package/dist/sanitize.d.ts.map +1 -0
- package/dist/sanitize.js +90 -0
- package/dist/sanitize.js.map +1 -0
- package/dist/scope/diff-mapper.d.ts +12 -0
- package/dist/scope/diff-mapper.d.ts.map +1 -1
- package/dist/scope/diff-mapper.js +25 -18
- package/dist/scope/diff-mapper.js.map +1 -1
- package/dist/scope/entity-diff.d.ts +21 -4
- package/dist/scope/entity-diff.d.ts.map +1 -1
- package/dist/scope/entity-diff.js +132 -34
- package/dist/scope/entity-diff.js.map +1 -1
- package/dist/scope/types.d.ts +10 -0
- package/dist/scope/types.d.ts.map +1 -1
- package/dist/semantic-diff/index.d.ts +25 -2
- package/dist/semantic-diff/index.d.ts.map +1 -1
- package/dist/semantic-diff/index.js +147 -53
- package/dist/semantic-diff/index.js.map +1 -1
- package/dist/tools/gitleaks-config.toml +35 -0
- package/dist/tools/plugins/gitleaks.d.ts +10 -0
- package/dist/tools/plugins/gitleaks.d.ts.map +1 -1
- package/dist/tools/plugins/gitleaks.js +29 -2
- package/dist/tools/plugins/gitleaks.js.map +1 -1
- package/dist/tools/plugins/semgrep.d.ts +11 -0
- package/dist/tools/plugins/semgrep.d.ts.map +1 -1
- package/dist/tools/plugins/semgrep.js +30 -1
- package/dist/tools/plugins/semgrep.js.map +1 -1
- package/dist/tools/semgrep-rules.yml +305 -0
- package/dist/types.d.ts +51 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/diff.d.ts +22 -2
- package/dist/utils/diff.d.ts.map +1 -1
- package/dist/utils/diff.js +36 -40
- package/dist/utils/diff.js.map +1 -1
- package/package.json +21 -22
- package/dist/providers/fallback.d.ts +0 -54
- package/dist/providers/fallback.d.ts.map +0 -1
- package/dist/providers/fallback.js +0 -102
- package/dist/providers/fallback.js.map +0 -1
- package/dist/providers/index.d.ts +0 -49
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/index.js +0 -146
- package/dist/providers/index.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/agents/workflow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EACV,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,WAAW,EACX,YAAY,EAEb,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/agents/workflow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EACV,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,WAAW,EACX,YAAY,EAEb,MAAM,aAAa,CAAC;AAwBrB,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,WAAW,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAE9B;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAErC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAE/B,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAyCD;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,CAAC,CA6NzF"}
|
package/dist/agents/workflow.js
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
*/
|
|
18
18
|
import { runWithConcurrency } from '../utils/concurrency.js';
|
|
19
19
|
import { calculateRateSchedule } from '../utils/token-budget.js';
|
|
20
|
-
import { buildMemoryContext, buildReviewLevelInstruction, COMPACT_CALIBRATION, REVIEW_CALIBRATION, UNTRUSTED_CONTENT_POLICY, WORKFLOW_ERRORS_SYSTEM, WORKFLOW_PERFORMANCE_SYSTEM, WORKFLOW_SCOPE_SYSTEM, WORKFLOW_SECURITY_SYSTEM, WORKFLOW_STANDARDS_SYSTEM, WORKFLOW_SYNTHESIS_SYSTEM, wrapUntrustedDiff, } from './prompts.js';
|
|
20
|
+
import { buildMemoryContext, buildReviewLevelInstruction, COMPACT_CALIBRATION, REVIEW_CALIBRATION, SPECIALIST_OUTPUT_UNTRUSTED_LABEL, STATIC_ANALYSIS_UNTRUSTED_LABEL, UNTRUSTED_CONTENT_POLICY, WORKFLOW_ERRORS_SYSTEM, WORKFLOW_PERFORMANCE_SYSTEM, WORKFLOW_SCOPE_SYSTEM, WORKFLOW_SECURITY_SYSTEM, WORKFLOW_STANDARDS_SYSTEM, WORKFLOW_SYNTHESIS_SYSTEM, wrapUntrusted, wrapUntrustedDiff, } from './prompts.js';
|
|
21
21
|
import { parseReviewResponse } from './simple.js';
|
|
22
22
|
const SPECIALIST_CONTEXT_MAP = {
|
|
23
23
|
'security-audit': ['staticContext'],
|
|
@@ -75,9 +75,13 @@ export async function runWorkflowReview(input) {
|
|
|
75
75
|
});
|
|
76
76
|
// Build the user prompt (same for all specialists, wrapped in untrusted-content delimiters)
|
|
77
77
|
const userPrompt = `Review the following code changes:\n\n${wrapUntrustedDiff(diff)}`;
|
|
78
|
-
// Context sources keyed for lookup by the specialist context map
|
|
78
|
+
// Context sources keyed for lookup by the specialist context map.
|
|
79
|
+
// staticContext is attacker-influenceable tool/data → fence as untrusted.
|
|
80
|
+
// memoryContext is fenced inside buildMemoryContext(). stackHints is trusted (static).
|
|
79
81
|
const contextSources = {
|
|
80
|
-
staticContext
|
|
82
|
+
staticContext: staticContext
|
|
83
|
+
? wrapUntrusted(STATIC_ANALYSIS_UNTRUSTED_LABEL, staticContext)
|
|
84
|
+
: '',
|
|
81
85
|
memoryContext: buildMemoryContext(memoryContext),
|
|
82
86
|
stackHints,
|
|
83
87
|
};
|
|
@@ -167,13 +171,18 @@ export async function runWorkflowReview(input) {
|
|
|
167
171
|
const primaryEntry = chain
|
|
168
172
|
? chain[0]
|
|
169
173
|
: { provider: provider, model, apiKey };
|
|
174
|
+
// Each specialist output is model-generated text derived from the (untrusted)
|
|
175
|
+
// diff — a malicious diff can induce a specialist to emit injected instructions.
|
|
176
|
+
// Fence every block as untrusted DATA before feeding it into the synthesis call.
|
|
177
|
+
const wrappedSpecialistOutputs = specialistOutputs.map((output) => wrapUntrusted(SPECIALIST_OUTPUT_UNTRUSTED_LABEL, output));
|
|
170
178
|
const synthesisPrompt = [
|
|
171
179
|
'Below are the findings from 5 specialist reviewers. Synthesize them into a final review.\n',
|
|
172
|
-
...
|
|
180
|
+
...wrappedSpecialistOutputs,
|
|
173
181
|
'\n\n---\n\nNow provide the unified review in the required format.',
|
|
174
182
|
].join('\n\n');
|
|
175
183
|
const synthesisSystem = [
|
|
176
184
|
WORKFLOW_SYNTHESIS_SYSTEM,
|
|
185
|
+
UNTRUSTED_CONTENT_POLICY,
|
|
177
186
|
buildReviewLevelInstruction(reviewLevel),
|
|
178
187
|
REVIEW_CALIBRATION,
|
|
179
188
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/agents/workflow.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/agents/workflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"critique.d.ts","sourceRoot":"","sources":["../../src/critique/critique.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"critique.d.ts","sourceRoot":"","sources":["../../src/critique/critique.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAmB,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAElG,OAAO,KAAK,EACV,cAAc,EAGd,iBAAiB,EACjB,kBAAkB,EAEnB,MAAM,YAAY,CAAC;AAiBpB;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAwClE;AAoBD;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,aAAa,EAAE,EACzB,QAAQ,EAAE,cAAc,GACvB;IACD,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB,CA4CA;AAID;;;;;;;;;;;GAWG;AACH,wBAAsB,eAAe,CACnC,aAAa,EAAE,YAAY,EAC3B,KAAK,EAAE,iBAAiB,EACxB,UAAU,EAAE,cAAc,EAC1B,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,kBAAkB,CAAC,CA6F7B"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* The self-critique step catches overreactions, false positives, and
|
|
6
6
|
* vague findings, producing a higher-quality final review.
|
|
7
7
|
*/
|
|
8
|
+
import { SPECIALIST_OUTPUT_UNTRUSTED_LABEL, UNTRUSTED_CONTENT_POLICY, wrapUntrusted, wrapUntrustedDiff, } from '../agents/prompts.js';
|
|
8
9
|
import { REFINED_REVIEW_SYSTEM, SELF_CRITIQUE_SYSTEM } from './prompts.js';
|
|
9
10
|
import { DEFAULT_DUAL_CRITIQUE_CONFIG } from './types.js';
|
|
10
11
|
// ─── Constants ─────────────────────────────────────────────────
|
|
@@ -102,8 +103,7 @@ export function applyCritique(findings, critique) {
|
|
|
102
103
|
refined.push(finding);
|
|
103
104
|
}
|
|
104
105
|
break;
|
|
105
|
-
|
|
106
|
-
case 'valid':
|
|
106
|
+
// 'vague' and 'valid' fall through here: the finding is kept as-is.
|
|
107
107
|
default:
|
|
108
108
|
refined.push(finding);
|
|
109
109
|
break;
|
|
@@ -148,8 +148,12 @@ export async function runDualCritique(initialReview, input, generateFn, onProgre
|
|
|
148
148
|
step: 'dual-critique',
|
|
149
149
|
message: `Running self-critique on ${initialFindings.length} AI finding(s)...`,
|
|
150
150
|
});
|
|
151
|
-
|
|
152
|
-
|
|
151
|
+
// The diff is untrusted user input; the serialized findings are model-generated
|
|
152
|
+
// text derived from that diff. Fence both as untrusted DATA so an injected
|
|
153
|
+
// "finding message" or diff line cannot redirect the critique agent.
|
|
154
|
+
const critiquePrompt = `Here is the code diff:\n\n${wrapUntrustedDiff(input.diff)}\n\nHere is the initial review with ${initialFindings.length} findings:\n\n${wrapUntrusted(SPECIALIST_OUTPUT_UNTRUSTED_LABEL, serializeFindingsForCritique(initialFindings))}\n\nPlease critique each finding.`;
|
|
155
|
+
const critiqueSystem = `${SELF_CRITIQUE_SYSTEM}\n${UNTRUSTED_CONTENT_POLICY}`;
|
|
156
|
+
const critiqueResponse = await generateFn(critiqueSystem, critiquePrompt);
|
|
153
157
|
const critiqueResult = parseCritiqueResponse(critiqueResponse.text);
|
|
154
158
|
emit({
|
|
155
159
|
step: 'dual-critique',
|
|
@@ -167,8 +171,12 @@ export async function runDualCritique(initialReview, input, generateFn, onProgre
|
|
|
167
171
|
});
|
|
168
172
|
// ── Step 3: Refined Summary ──────────────────────────────────
|
|
169
173
|
// Ask the LLM to produce a refined summary based on the surviving findings
|
|
170
|
-
|
|
171
|
-
|
|
174
|
+
// initialReview.summary and critiqueResult.overallAssessment are model-generated
|
|
175
|
+
// text derived from the untrusted diff → fence them as untrusted DATA too, so an
|
|
176
|
+
// injected summary/assessment cannot redirect the refined-review agent.
|
|
177
|
+
const refinedPrompt = `Here is the code diff:\n\n${wrapUntrustedDiff(input.diff)}\n\nInitial review summary:\n${wrapUntrusted(SPECIALIST_OUTPUT_UNTRUSTED_LABEL, initialReview.summary)}\n\nSelf-critique assessment:\n${wrapUntrusted(SPECIALIST_OUTPUT_UNTRUSTED_LABEL, critiqueResult.overallAssessment)}\n\nRemaining findings after critique (${refined.length}):\n${wrapUntrusted(SPECIALIST_OUTPUT_UNTRUSTED_LABEL, serializeFindingsForCritique(refined))}\n\nPlease produce the refined review.`;
|
|
178
|
+
const refinedSystem = `${REFINED_REVIEW_SYSTEM}\n${UNTRUSTED_CONTENT_POLICY}`;
|
|
179
|
+
const refinedResponse = await generateFn(refinedSystem, refinedPrompt);
|
|
172
180
|
// Extract refined status and summary from response
|
|
173
181
|
const statusMatch = /STATUS:\s*(PASSED|FAILED|NEEDS_HUMAN_REVIEW|SKIPPED)/i.exec(refinedResponse.text);
|
|
174
182
|
const refinedStatus = statusMatch?.[1]?.toUpperCase() ?? initialReview.status;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"critique.js","sourceRoot":"","sources":["../../src/critique/critique.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"critique.js","sourceRoot":"","sources":["../../src/critique/critique.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,iCAAiC,EACjC,wBAAwB,EACxB,aAAa,EACb,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAS3E,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAE1D,kEAAkE;AAElE,MAAM,cAAc,GAAG,IAAI,GAAG,CAAkB;IAC9C,OAAO;IACP,gBAAgB;IAChB,cAAc;IACd,OAAO;IACP,WAAW;CACZ,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AAEjG,kEAAkE;AAElE;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,6BAA6B;IAC7B,MAAM,eAAe,GAAG,oDAAoD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxF,MAAM,iBAAiB,GAAG,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,iCAAiC,CAAC;IAE5F,+BAA+B;IAC/B,MAAM,SAAS,GAAsB,EAAE,CAAC;IAExC,MAAM,eAAe,GACnB,kJAAkJ,CAAC;IAErJ,IAAI,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,OAAO,KAAK,KAAK,IAAI,EAAE,CAAC;QACtB,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAqB,CAAC;QAC9D,MAAM,OAAO,GAAoB,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;QACvF,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAEzC,MAAM,QAAQ,GAAoB,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;QAEvE,IAAI,OAAO,KAAK,cAAc,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3C,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAqB,CAAC;YAC9D,IAAI,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;gBACtC,QAAQ,CAAC,iBAAiB,GAAG,WAAW,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,kBAAkB,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,gBAAgB,CAAC,CAAC,MAAM,CAAC;IAC1F,MAAM,iBAAiB,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,cAAc,CAAC,CAAC,MAAM,CAAC;IAEvF,OAAO;QACL,SAAS;QACT,iBAAiB;QACjB,kBAAkB;QAClB,iBAAiB;KAClB,CAAC;AACJ,CAAC;AAED,kEAAkE;AAElE;;GAEG;AACH,SAAS,4BAA4B,CAAC,QAAyB;IAC7D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,eAAe,CAAC;IAElD,OAAO,QAAQ;SACZ,GAAG,CACF,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAClK;SACA,IAAI,CAAC,MAAM,CAAC,CAAC;AAClB,CAAC;AAED,kEAAkE;AAElE;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,QAAyB,EACzB,QAAwB;IAMxB,2CAA2C;IAC3C,MAAM,WAAW,GAAG,IAAI,GAAG,EAA2B,CAAC;IACvD,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;QACnC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAEhC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,4CAA4C;YAC5C,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtB,SAAS;QACX,CAAC;QAED,QAAQ,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,KAAK,gBAAgB,CAAC;YACtB,KAAK,WAAW;gBACd,YAAY,EAAE,CAAC;gBACf,MAAM;YAER,KAAK,cAAc;gBACjB,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBAC3B,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC;oBAC/D,aAAa,EAAE,CAAC;gBAClB,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACxB,CAAC;gBACD,MAAM;YAER,oEAAoE;YACpE;gBACE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACtB,MAAM;QACV,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;AAClD,CAAC;AAED,kEAAkE;AAElE;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,aAA2B,EAC3B,KAAwB,EACxB,UAA0B,EAC1B,UAA6B;IAE7B,MAAM,IAAI,GAAG,UAAU,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACtC,MAAM,MAAM,GAAuB;QACjC,GAAG,4BAA4B;QAC/B,GAAG,KAAK,CAAC,MAAM;KAChB,CAAC;IAEF,MAAM,eAAe,GAAG,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;IAEhF,yDAAyD;IACzD,IAAI,eAAe,CAAC,MAAM,GAAG,MAAM,CAAC,sBAAsB,EAAE,CAAC;QAC3D,IAAI,CAAC;YACH,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,4BAA4B,eAAe,CAAC,MAAM,wBAAwB,MAAM,CAAC,sBAAsB,GAAG;SACpH,CAAC,CAAC;QACH,OAAO;YACL,MAAM,EAAE,aAAa,CAAC,MAAM;YAC5B,OAAO,EAAE,aAAa,CAAC,OAAO;YAC9B,QAAQ,EAAE,aAAa,CAAC,QAAQ;SACjC,CAAC;IACJ,CAAC;IAED,gEAAgE;IAChE,IAAI,CAAC;QACH,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,4BAA4B,eAAe,CAAC,MAAM,mBAAmB;KAC/E,CAAC,CAAC;IAEH,gFAAgF;IAChF,2EAA2E;IAC3E,qEAAqE;IACrE,MAAM,cAAc,GAAG,6BAA6B,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,uCAAuC,eAAe,CAAC,MAAM,iBAAiB,aAAa,CAAC,iCAAiC,EAAE,4BAA4B,CAAC,eAAe,CAAC,CAAC,mCAAmC,CAAC;IAElS,MAAM,cAAc,GAAG,GAAG,oBAAoB,KAAK,wBAAwB,EAAE,CAAC;IAC9E,MAAM,gBAAgB,GAAG,MAAM,UAAU,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;IAC1E,MAAM,cAAc,GAAG,qBAAqB,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAEpE,IAAI,CAAC;QACH,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,sBAAsB,cAAc,CAAC,kBAAkB,uBAAuB,cAAc,CAAC,iBAAiB,kBAAkB;KAC1I,CAAC,CAAC;IAEH,gEAAgE;IAChE,wDAAwD;IACxD,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,aAAa,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;IAEhG,yDAAyD;IACzD,MAAM,aAAa,GAAG,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;IAC9E,MAAM,kBAAkB,GAAG,CAAC,GAAG,OAAO,EAAE,GAAG,aAAa,CAAC,CAAC;IAE1D,IAAI,CAAC;QACH,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,YAAY,YAAY,aAAa,aAAa,cAAc,OAAO,CAAC,MAAM,OAAO;KAC/F,CAAC,CAAC;IAEH,gEAAgE;IAChE,2EAA2E;IAC3E,iFAAiF;IACjF,iFAAiF;IACjF,wEAAwE;IACxE,MAAM,aAAa,GAAG,6BAA6B,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,gCAAgC,aAAa,CAAC,iCAAiC,EAAE,aAAa,CAAC,OAAO,CAAC,kCAAkC,aAAa,CAAC,iCAAiC,EAAE,cAAc,CAAC,iBAAiB,CAAC,0CAA0C,OAAO,CAAC,MAAM,OAAO,aAAa,CAAC,iCAAiC,EAAE,4BAA4B,CAAC,OAAO,CAAC,CAAC,wCAAwC,CAAC;IAE1e,MAAM,aAAa,GAAG,GAAG,qBAAqB,KAAK,wBAAwB,EAAE,CAAC;IAC9E,MAAM,eAAe,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IAEvE,mDAAmD;IACnD,MAAM,WAAW,GAAG,uDAAuD,CAAC,IAAI,CAC9E,eAAe,CAAC,IAAI,CACrB,CAAC;IACF,MAAM,aAAa,GAChB,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAA6B,IAAI,aAAa,CAAC,MAAM,CAAC;IAEtF,MAAM,YAAY,GAAG,yCAAyC,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAC1F,MAAM,cAAc,GAAG,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,aAAa,CAAC,OAAO,CAAC;IAE1E,eAAe;IACf,MAAM,MAAM,GAAuB;QACjC,MAAM,EAAE,aAAa;QACrB,OAAO,EAAE,cAAc;QACvB,QAAQ,EAAE,kBAAkB;KAC7B,CAAC;IAEF,IAAI,MAAM,CAAC,uBAAuB,EAAE,CAAC;QACnC,MAAM,CAAC,gBAAgB,GAAG;YACxB,mBAAmB,EAAE,eAAe,CAAC,MAAM;YAC3C,iBAAiB,EAAE,OAAO,CAAC,MAAM;YACjC,sBAAsB,EAAE,YAAY;YACpC,gBAAgB,EAAE,aAAa;YAC/B,cAAc;SACf,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified diff parser — barrel.
|
|
3
|
+
*
|
|
4
|
+
* Wired consumers (adapters, migrated phase by phase under golden-corpus
|
|
5
|
+
* parity gates): utils/diff.ts (Phase 3), recursive/patch-extractor.ts
|
|
6
|
+
* (Phase 4), scope/diff-mapper.ts, scope/entity-diff.ts and
|
|
7
|
+
* semantic-diff/index.ts (Phases 5–7). Not re-exported from core's
|
|
8
|
+
* top-level index: consumers keep their historical public signatures.
|
|
9
|
+
*/
|
|
10
|
+
export { matchHunkHeader, parseUnifiedDiff } from './parse.js';
|
|
11
|
+
export type { DiffHunk, HunkLine, ParsedDiff, ParsedFileDiff } from './types.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/diff/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC/D,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified diff parser — barrel.
|
|
3
|
+
*
|
|
4
|
+
* Wired consumers (adapters, migrated phase by phase under golden-corpus
|
|
5
|
+
* parity gates): utils/diff.ts (Phase 3), recursive/patch-extractor.ts
|
|
6
|
+
* (Phase 4), scope/diff-mapper.ts, scope/entity-diff.ts and
|
|
7
|
+
* semantic-diff/index.ts (Phases 5–7). Not re-exported from core's
|
|
8
|
+
* top-level index: consumers keep their historical public signatures.
|
|
9
|
+
*/
|
|
10
|
+
export { matchHunkHeader, parseUnifiedDiff } from './parse.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/diff/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified diff parser — the single line-based parser for packages/core.
|
|
3
|
+
*
|
|
4
|
+
* Replaces (via thin adapters, see migration plan sdd/unify-diff-parsers) the
|
|
5
|
+
* five historical parsers: utils/diff.ts, recursive/patch-extractor.ts,
|
|
6
|
+
* scope/diff-mapper.ts, scope/entity-diff.ts and the local parseHunks of
|
|
7
|
+
* semantic-diff/index.ts.
|
|
8
|
+
*
|
|
9
|
+
* Invariants:
|
|
10
|
+
* - NEVER throws, for any input string (spec R1).
|
|
11
|
+
* - Byte-exact reconstruction (spec R2): every input line lands in exactly
|
|
12
|
+
* one bucket — `preamble` or one file's `rawLines` — so
|
|
13
|
+
* `[...preamble, ...files.flatMap((f) => f.rawLines)].join('\n') === raw`.
|
|
14
|
+
* - Quoted paths (`core.quotepath` octal/C-style escapes) are parsed and
|
|
15
|
+
* unescaped (CORE-M6 fix) instead of being dropped.
|
|
16
|
+
*
|
|
17
|
+
* Known retained limitation (documented, out of scope): in the unquoted
|
|
18
|
+
* `diff --git a/x b/y` header, a path containing a literal ` b/` is ambiguous;
|
|
19
|
+
* like the historical regex, the LAST ` b/` occurrence wins.
|
|
20
|
+
*/
|
|
21
|
+
import type { ParsedDiff } from './types.js';
|
|
22
|
+
/**
|
|
23
|
+
* Match a hunk header line with THE single strict hunk-header regex (spec
|
|
24
|
+
* R8). Returns the 4 captures (omitted counts default to 1) or `null`.
|
|
25
|
+
*
|
|
26
|
+
* Exported for adapters that must scan raw lines themselves — e.g. bare hunk
|
|
27
|
+
* fragments without any `diff --git` header, which `parseUnifiedDiff` keeps
|
|
28
|
+
* in `preamble` and therefore never turn into model hunks.
|
|
29
|
+
*/
|
|
30
|
+
export declare function matchHunkHeader(line: string): {
|
|
31
|
+
oldStart: number;
|
|
32
|
+
oldCount: number;
|
|
33
|
+
newStart: number;
|
|
34
|
+
newCount: number;
|
|
35
|
+
} | null;
|
|
36
|
+
/**
|
|
37
|
+
* Parse a unified diff. Defensive: never throws — non-diff input yields
|
|
38
|
+
* `{ preamble: [...lines], files: [] }` (spec R1, C13/C14).
|
|
39
|
+
*/
|
|
40
|
+
export declare function parseUnifiedDiff(raw: string): ParsedDiff;
|
|
41
|
+
//# sourceMappingURL=parse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/diff/parse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAsB,UAAU,EAAkB,MAAM,YAAY,CAAC;AA0BjF;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,GACX;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CASnF;AAuJD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CA8HxD"}
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified diff parser — the single line-based parser for packages/core.
|
|
3
|
+
*
|
|
4
|
+
* Replaces (via thin adapters, see migration plan sdd/unify-diff-parsers) the
|
|
5
|
+
* five historical parsers: utils/diff.ts, recursive/patch-extractor.ts,
|
|
6
|
+
* scope/diff-mapper.ts, scope/entity-diff.ts and the local parseHunks of
|
|
7
|
+
* semantic-diff/index.ts.
|
|
8
|
+
*
|
|
9
|
+
* Invariants:
|
|
10
|
+
* - NEVER throws, for any input string (spec R1).
|
|
11
|
+
* - Byte-exact reconstruction (spec R2): every input line lands in exactly
|
|
12
|
+
* one bucket — `preamble` or one file's `rawLines` — so
|
|
13
|
+
* `[...preamble, ...files.flatMap((f) => f.rawLines)].join('\n') === raw`.
|
|
14
|
+
* - Quoted paths (`core.quotepath` octal/C-style escapes) are parsed and
|
|
15
|
+
* unescaped (CORE-M6 fix) instead of being dropped.
|
|
16
|
+
*
|
|
17
|
+
* Known retained limitation (documented, out of scope): in the unquoted
|
|
18
|
+
* `diff --git a/x b/y` header, a path containing a literal ` b/` is ambiguous;
|
|
19
|
+
* like the historical regex, the LAST ` b/` occurrence wins.
|
|
20
|
+
*/
|
|
21
|
+
// ─── Header regexes ─────────────────────────────────────────────
|
|
22
|
+
/**
|
|
23
|
+
* Unquoted form. Greedy `.+` + backtracking makes the b-side capture start at
|
|
24
|
+
* the LAST ` b/` — identical boundary to the historical
|
|
25
|
+
* `/^diff --git a\/.+ b\/(.+)$/` (utils/diff.ts), so unquoted paths with
|
|
26
|
+
* spaces keep parsing exactly as before (C2 parity).
|
|
27
|
+
*/
|
|
28
|
+
const HEADER_PLAIN_RE = /^diff --git a\/(.+) b\/(.+)$/;
|
|
29
|
+
/** Both sides quoted (core.quotepath): `diff --git "a/x" "b/y"`. */
|
|
30
|
+
const HEADER_QUOTED_RE = /^diff --git "a\/((?:[^"\\]|\\.)*)" "b\/((?:[^"\\]|\\.)*)"$/;
|
|
31
|
+
/** Mixed quoting (one side needs quoting, e.g. rename ascii → non-ascii). */
|
|
32
|
+
const HEADER_QUOTED_OLD_RE = /^diff --git "a\/((?:[^"\\]|\\.)*)" b\/(.+)$/;
|
|
33
|
+
const HEADER_QUOTED_NEW_RE = /^diff --git a\/(.+) "b\/((?:[^"\\]|\\.)*)"$/;
|
|
34
|
+
/**
|
|
35
|
+
* Strict hunk header with the 4 captures (design decision: based on
|
|
36
|
+
* scope/diff-mapper.ts, single-space form as emitted by git; omitted counts
|
|
37
|
+
* default to 1). THE single hunk-header regex of packages/core (spec R8).
|
|
38
|
+
*/
|
|
39
|
+
const HUNK_HEADER_RE = /^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/;
|
|
40
|
+
/**
|
|
41
|
+
* Match a hunk header line with THE single strict hunk-header regex (spec
|
|
42
|
+
* R8). Returns the 4 captures (omitted counts default to 1) or `null`.
|
|
43
|
+
*
|
|
44
|
+
* Exported for adapters that must scan raw lines themselves — e.g. bare hunk
|
|
45
|
+
* fragments without any `diff --git` header, which `parseUnifiedDiff` keeps
|
|
46
|
+
* in `preamble` and therefore never turn into model hunks.
|
|
47
|
+
*/
|
|
48
|
+
export function matchHunkHeader(line) {
|
|
49
|
+
const m = HUNK_HEADER_RE.exec(line);
|
|
50
|
+
if (!m)
|
|
51
|
+
return null;
|
|
52
|
+
return {
|
|
53
|
+
oldStart: Number.parseInt(m[1] ?? '0', 10),
|
|
54
|
+
oldCount: m[2] !== undefined ? Number.parseInt(m[2], 10) : 1,
|
|
55
|
+
newStart: Number.parseInt(m[3] ?? '0', 10),
|
|
56
|
+
newCount: m[4] !== undefined ? Number.parseInt(m[4], 10) : 1,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* `---`/`+++` lines: quoted, unquoted or /dev/null. Git appends a trailing
|
|
61
|
+
* TAB after unquoted paths containing spaces (GNU patch disambiguation) — it
|
|
62
|
+
* is not part of the path, so it is matched outside the capture.
|
|
63
|
+
*/
|
|
64
|
+
const OLD_FILE_RE = /^--- (?:"a\/((?:[^"\\]|\\.)*)"|a\/(.*?)|(\/dev\/null))\t?$/;
|
|
65
|
+
const NEW_FILE_RE = /^\+\+\+ (?:"b\/((?:[^"\\]|\\.)*)"|b\/(.*?)|(\/dev\/null))\t?$/;
|
|
66
|
+
// ─── Quoted-path unescaping (CORE-M6) ───────────────────────────
|
|
67
|
+
const ESCAPE_MAP = {
|
|
68
|
+
a: 0x07,
|
|
69
|
+
b: 0x08,
|
|
70
|
+
f: 0x0c,
|
|
71
|
+
n: 0x0a,
|
|
72
|
+
r: 0x0d,
|
|
73
|
+
t: 0x09,
|
|
74
|
+
v: 0x0b,
|
|
75
|
+
'"': 0x22,
|
|
76
|
+
'\\': 0x5c,
|
|
77
|
+
};
|
|
78
|
+
const encoder = new TextEncoder();
|
|
79
|
+
const decoder = new TextDecoder();
|
|
80
|
+
/**
|
|
81
|
+
* Unescape the inner content of a git-quoted path: C-style escapes plus
|
|
82
|
+
* octal byte sequences (`caf\303\251` → `café`). Octal escapes are raw UTF-8
|
|
83
|
+
* bytes, so the whole result is assembled as bytes and decoded once.
|
|
84
|
+
*/
|
|
85
|
+
function unescapeQuotedPath(inner) {
|
|
86
|
+
const bytes = [];
|
|
87
|
+
for (let i = 0; i < inner.length; i++) {
|
|
88
|
+
const ch = inner[i];
|
|
89
|
+
if (ch === '\\' && i + 1 < inner.length) {
|
|
90
|
+
const next = inner[i + 1];
|
|
91
|
+
if (next >= '0' && next <= '7') {
|
|
92
|
+
let oct = '';
|
|
93
|
+
let j = i + 1;
|
|
94
|
+
while (j < inner.length && oct.length < 3) {
|
|
95
|
+
const d = inner[j];
|
|
96
|
+
if (d < '0' || d > '7')
|
|
97
|
+
break;
|
|
98
|
+
oct += d;
|
|
99
|
+
j++;
|
|
100
|
+
}
|
|
101
|
+
bytes.push(Number.parseInt(oct, 8));
|
|
102
|
+
i = j - 1;
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
const mapped = ESCAPE_MAP[next];
|
|
106
|
+
if (mapped !== undefined) {
|
|
107
|
+
bytes.push(mapped);
|
|
108
|
+
i++;
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
// Unknown escape — keep the backslash literally (defensive).
|
|
112
|
+
bytes.push(0x5c);
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
for (const b of encoder.encode(ch))
|
|
116
|
+
bytes.push(b);
|
|
117
|
+
}
|
|
118
|
+
return decoder.decode(Uint8Array.from(bytes));
|
|
119
|
+
}
|
|
120
|
+
/** Try the 4 header forms; returns unescaped a/b paths (+ quoting) on match. */
|
|
121
|
+
function matchFileHeader(line) {
|
|
122
|
+
let m = HEADER_QUOTED_RE.exec(line);
|
|
123
|
+
if (m)
|
|
124
|
+
return {
|
|
125
|
+
oldPath: unescapeQuotedPath(m[1] ?? ''),
|
|
126
|
+
newPath: unescapeQuotedPath(m[2] ?? ''),
|
|
127
|
+
quoted: true,
|
|
128
|
+
};
|
|
129
|
+
m = HEADER_QUOTED_OLD_RE.exec(line);
|
|
130
|
+
if (m)
|
|
131
|
+
return { oldPath: unescapeQuotedPath(m[1] ?? ''), newPath: m[2] ?? '', quoted: true };
|
|
132
|
+
m = HEADER_QUOTED_NEW_RE.exec(line);
|
|
133
|
+
if (m)
|
|
134
|
+
return { oldPath: m[1] ?? '', newPath: unescapeQuotedPath(m[2] ?? ''), quoted: true };
|
|
135
|
+
m = HEADER_PLAIN_RE.exec(line);
|
|
136
|
+
if (m)
|
|
137
|
+
return { oldPath: m[1] ?? '', newPath: m[2] ?? '', quoted: false };
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
/** Parse a `--- `/`+++ ` line. Returns the path, or null for /dev/null. */
|
|
141
|
+
function matchFileLine(re, line) {
|
|
142
|
+
const m = re.exec(line);
|
|
143
|
+
if (!m)
|
|
144
|
+
return undefined;
|
|
145
|
+
if (m[3] !== undefined)
|
|
146
|
+
return { path: null }; // /dev/null
|
|
147
|
+
if (m[1] !== undefined)
|
|
148
|
+
return { path: unescapeQuotedPath(m[1]) };
|
|
149
|
+
return { path: m[2] ?? '' };
|
|
150
|
+
}
|
|
151
|
+
function finalizeFile(state) {
|
|
152
|
+
// Resolved oldPath: explicit `--- ` line wins (including /dev/null → null),
|
|
153
|
+
// then `rename from`, then the header a-side.
|
|
154
|
+
const oldPath = state.oldPathSeen ? state.oldPath : (state.renameFrom ?? state.headerOldPath);
|
|
155
|
+
const newPath = state.newPathSeen ? state.newPath : (state.renameTo ?? state.headerNewPath);
|
|
156
|
+
// Display-path authority (design): `+++ b/` → `rename to` → header b-side → old.
|
|
157
|
+
const path = (state.newPathSeen ? state.newPath : null) ??
|
|
158
|
+
state.renameTo ??
|
|
159
|
+
state.headerNewPath ??
|
|
160
|
+
oldPath ??
|
|
161
|
+
'';
|
|
162
|
+
const file = {
|
|
163
|
+
oldPath,
|
|
164
|
+
newPath,
|
|
165
|
+
path,
|
|
166
|
+
headerNewPath: state.headerNewPath ?? '',
|
|
167
|
+
headerQuoted: state.headerQuoted,
|
|
168
|
+
isNew: state.isNew,
|
|
169
|
+
isDeleted: state.isDeleted,
|
|
170
|
+
isRename: state.isRename,
|
|
171
|
+
isBinary: state.isBinary,
|
|
172
|
+
hunks: state.hunks,
|
|
173
|
+
rawLines: state.rawLines,
|
|
174
|
+
};
|
|
175
|
+
if (state.oldMode !== undefined)
|
|
176
|
+
file.oldMode = state.oldMode;
|
|
177
|
+
if (state.newMode !== undefined)
|
|
178
|
+
file.newMode = state.newMode;
|
|
179
|
+
return file;
|
|
180
|
+
}
|
|
181
|
+
// ─── Parser ─────────────────────────────────────────────────────
|
|
182
|
+
/**
|
|
183
|
+
* Parse a unified diff. Defensive: never throws — non-diff input yields
|
|
184
|
+
* `{ preamble: [...lines], files: [] }` (spec R1, C13/C14).
|
|
185
|
+
*/
|
|
186
|
+
export function parseUnifiedDiff(raw) {
|
|
187
|
+
const lines = raw.split('\n');
|
|
188
|
+
const preamble = [];
|
|
189
|
+
const files = [];
|
|
190
|
+
let state = null;
|
|
191
|
+
let currentHunk = null;
|
|
192
|
+
const flush = () => {
|
|
193
|
+
if (state)
|
|
194
|
+
files.push(finalizeFile(state));
|
|
195
|
+
state = null;
|
|
196
|
+
currentHunk = null;
|
|
197
|
+
};
|
|
198
|
+
for (const line of lines) {
|
|
199
|
+
// 1) Hunk body lines bind tighter than anything else while a hunk is open
|
|
200
|
+
// (a deleted line `--- x` inside a hunk is content, not metadata).
|
|
201
|
+
if (currentHunk && line.length > 0) {
|
|
202
|
+
const prefix = line[0];
|
|
203
|
+
if (prefix === '+' || prefix === '-' || prefix === ' ' || prefix === '\\') {
|
|
204
|
+
const hunkLine = {
|
|
205
|
+
prefix: prefix,
|
|
206
|
+
content: line.slice(1),
|
|
207
|
+
raw: line,
|
|
208
|
+
};
|
|
209
|
+
currentHunk.lines.push(hunkLine);
|
|
210
|
+
state?.rawLines.push(line);
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
// 2) File boundary?
|
|
215
|
+
const header = matchFileHeader(line);
|
|
216
|
+
if (header) {
|
|
217
|
+
flush();
|
|
218
|
+
state = {
|
|
219
|
+
headerOldPath: header.oldPath,
|
|
220
|
+
headerNewPath: header.newPath,
|
|
221
|
+
headerQuoted: header.quoted,
|
|
222
|
+
oldPath: null,
|
|
223
|
+
oldPathSeen: false,
|
|
224
|
+
newPath: null,
|
|
225
|
+
newPathSeen: false,
|
|
226
|
+
renameFrom: null,
|
|
227
|
+
renameTo: null,
|
|
228
|
+
isNew: false,
|
|
229
|
+
isDeleted: false,
|
|
230
|
+
isRename: false,
|
|
231
|
+
isBinary: false,
|
|
232
|
+
hunks: [],
|
|
233
|
+
rawLines: [line],
|
|
234
|
+
};
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
// 3) Before the first header everything is preamble.
|
|
238
|
+
if (!state) {
|
|
239
|
+
preamble.push(line);
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
state.rawLines.push(line);
|
|
243
|
+
// 4) New hunk?
|
|
244
|
+
const hm = matchHunkHeader(line);
|
|
245
|
+
if (hm) {
|
|
246
|
+
currentHunk = { ...hm, header: line, lines: [] };
|
|
247
|
+
state.hunks.push(currentHunk);
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
// 5) Any other line closes an open hunk and is inspected as metadata.
|
|
251
|
+
currentHunk = null;
|
|
252
|
+
if (line.startsWith('new file mode ')) {
|
|
253
|
+
state.isNew = true;
|
|
254
|
+
state.newMode = line.slice('new file mode '.length);
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
if (line.startsWith('deleted file mode ')) {
|
|
258
|
+
state.isDeleted = true;
|
|
259
|
+
state.oldMode = line.slice('deleted file mode '.length);
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
if (line.startsWith('old mode ')) {
|
|
263
|
+
state.oldMode = line.slice('old mode '.length);
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
if (line.startsWith('new mode ')) {
|
|
267
|
+
state.newMode = line.slice('new mode '.length);
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
if (line.startsWith('rename from ')) {
|
|
271
|
+
state.isRename = true;
|
|
272
|
+
const value = line.slice('rename from '.length);
|
|
273
|
+
state.renameFrom = value.startsWith('"') ? unescapeQuotedPath(value.slice(1, -1)) : value;
|
|
274
|
+
continue;
|
|
275
|
+
}
|
|
276
|
+
if (line.startsWith('rename to ')) {
|
|
277
|
+
state.isRename = true;
|
|
278
|
+
const value = line.slice('rename to '.length);
|
|
279
|
+
state.renameTo = value.startsWith('"') ? unescapeQuotedPath(value.slice(1, -1)) : value;
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
282
|
+
if (line.startsWith('Binary files ') || line === 'GIT binary patch') {
|
|
283
|
+
state.isBinary = true;
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
286
|
+
const oldLine = matchFileLine(OLD_FILE_RE, line);
|
|
287
|
+
if (oldLine !== undefined && !state.oldPathSeen) {
|
|
288
|
+
state.oldPath = oldLine.path;
|
|
289
|
+
state.oldPathSeen = true;
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
const newLine = matchFileLine(NEW_FILE_RE, line);
|
|
293
|
+
if (newLine !== undefined && !state.newPathSeen) {
|
|
294
|
+
state.newPath = newLine.path;
|
|
295
|
+
state.newPathSeen = true;
|
|
296
|
+
}
|
|
297
|
+
// Anything else (index lines, similarity, binary payload, truncation
|
|
298
|
+
// markers, garbage) stays in rawLines only.
|
|
299
|
+
}
|
|
300
|
+
flush();
|
|
301
|
+
return { preamble, files };
|
|
302
|
+
}
|
|
303
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/diff/parse.ts"],"names":[],"mappings":"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"}
|