wabachi 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/.codex-plugin/plugin.json +1 -1
  2. package/README.md +5 -0
  3. package/dist/architecture/cli.js +47 -32
  4. package/dist/architecture/cli.js.map +1 -1
  5. package/dist/architecture/documentation/react-flow.d.ts +23 -0
  6. package/dist/architecture/documentation/react-flow.js +436 -0
  7. package/dist/architecture/documentation/react-flow.js.map +1 -0
  8. package/dist/architecture/documentation/site.d.ts +10 -13
  9. package/dist/architecture/documentation/site.js +58 -24
  10. package/dist/architecture/documentation/site.js.map +1 -1
  11. package/dist/architecture/projection/react-flow.d.ts +96 -0
  12. package/dist/architecture/projection/react-flow.js +388 -0
  13. package/dist/architecture/projection/react-flow.js.map +1 -0
  14. package/dist/cli.js +1 -1
  15. package/dist/command-contract.d.ts +3 -2
  16. package/dist/command-contract.js +6 -5
  17. package/dist/command-contract.js.map +1 -1
  18. package/dist/index.d.ts +1 -1
  19. package/dist/index.js +1 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/runtime/repository.d.ts +3 -0
  22. package/dist/runtime/repository.js +140 -16
  23. package/dist/runtime/repository.js.map +1 -1
  24. package/dist/runtime/run.js +3 -1
  25. package/dist/runtime/run.js.map +1 -1
  26. package/dist/working-set/codec.d.ts +7 -0
  27. package/dist/working-set/codec.js +53 -0
  28. package/dist/working-set/codec.js.map +1 -0
  29. package/dist/working-set/conflicts.d.ts +46 -0
  30. package/dist/working-set/conflicts.js +97 -0
  31. package/dist/working-set/conflicts.js.map +1 -0
  32. package/dist/working-set/derive.d.ts +34 -0
  33. package/dist/working-set/derive.js +634 -0
  34. package/dist/working-set/derive.js.map +1 -0
  35. package/dist/working-set/index.d.ts +3 -0
  36. package/dist/working-set/index.js +3 -0
  37. package/dist/working-set/index.js.map +1 -0
  38. package/dist/working-set/model.d.ts +93 -0
  39. package/dist/working-set/model.js +204 -0
  40. package/dist/working-set/model.js.map +1 -0
  41. package/dist/working-set/quality.d.ts +201 -0
  42. package/dist/working-set/quality.js +447 -0
  43. package/dist/working-set/quality.js.map +1 -0
  44. package/dist/working-set/seeds.d.ts +135 -0
  45. package/dist/working-set/seeds.js +433 -0
  46. package/dist/working-set/seeds.js.map +1 -0
  47. package/docs/USAGE.md +30 -22
  48. package/docs/examples/minimal-canon.json +24 -0
  49. package/package.json +10 -3
  50. package/skills/wabachi/SKILL.md +10 -1
@@ -1,13 +1,78 @@
1
- import { execFile } from "node:child_process";
1
+ import { execFile, spawn } from "node:child_process";
2
2
  import { mkdir } from "node:fs/promises";
3
3
  import { promisify } from "node:util";
4
4
  const execFileAsync = promisify(execFile);
5
+ const MAX_EXTERNAL_PROCESS_STDERR_LENGTH = 1024;
6
+ function processErrorLike(error) {
7
+ if (error === null || typeof error !== "object")
8
+ return undefined;
9
+ return error;
10
+ }
11
+ export function isExternalProcessError(error) {
12
+ const processError = processErrorLike(error);
13
+ return (processError !== undefined &&
14
+ (processError.stderr !== undefined ||
15
+ processError.cmd !== undefined ||
16
+ processError.signal !== undefined ||
17
+ typeof processError.code === "number"));
18
+ }
19
+ function boundedText(value) {
20
+ const normalized = value.replace(/\s+/gu, " ").trim();
21
+ if (normalized.length <= MAX_EXTERNAL_PROCESS_STDERR_LENGTH)
22
+ return normalized;
23
+ return `${normalized.slice(0, MAX_EXTERNAL_PROCESS_STDERR_LENGTH - 1)}…`;
24
+ }
25
+ function processStatus(processError) {
26
+ if (typeof processError?.code === "number")
27
+ return `exit ${processError.code}`;
28
+ if (processError?.signal)
29
+ return `signal ${processError.signal}`;
30
+ if (processError?.code !== undefined && processError.code !== null)
31
+ return `error ${processError.code}`;
32
+ return "failed to start";
33
+ }
34
+ function processCommand(processError, fallbackCommand) {
35
+ return processError?.cmd ?? fallbackCommand ?? "external process";
36
+ }
37
+ /** Formats process failures for both runtime exceptions and provider records. */
38
+ export function formatExternalProcessError(error, stage, fallbackCommand) {
39
+ const processError = processErrorLike(error);
40
+ const stderr = processError?.stderr === undefined ? "" : String(processError.stderr);
41
+ const detail = boundedText(stderr || (error instanceof Error ? error.message : String(error)));
42
+ const suffix = detail.length === 0 ? "" : ` stderr: ${detail}`;
43
+ return `${stage} failed: ${processCommand(processError, fallbackCommand)} (${processStatus(processError)})${suffix}`;
44
+ }
45
+ function captureStderr(stream) {
46
+ let value = "";
47
+ let truncated = false;
48
+ stream.setEncoding("utf8");
49
+ stream.on("data", (chunk) => {
50
+ if (value.length >= MAX_EXTERNAL_PROCESS_STDERR_LENGTH) {
51
+ truncated = true;
52
+ return;
53
+ }
54
+ const next = `${value}${chunk}`;
55
+ if (next.length > MAX_EXTERNAL_PROCESS_STDERR_LENGTH) {
56
+ value = next.slice(0, MAX_EXTERNAL_PROCESS_STDERR_LENGTH);
57
+ truncated = true;
58
+ }
59
+ else {
60
+ value = next;
61
+ }
62
+ });
63
+ return () => (truncated ? boundedText(`${value}…`) : boundedText(value));
64
+ }
5
65
  function isRemoteUrl(source) {
6
66
  return /^[a-z][a-z0-9+.-]*:\/\//iu.test(source) || /^[^/]+@[^:]+:/u.test(source);
7
67
  }
8
68
  async function git(args, cwd) {
9
- const { stdout } = await execFileAsync("git", args, { cwd });
10
- return stdout.trim();
69
+ try {
70
+ const { stdout } = await execFileAsync("git", args, { cwd });
71
+ return stdout.trim();
72
+ }
73
+ catch (error) {
74
+ throw new Error(formatExternalProcessError(error, "git", ["git", ...args].join(" ")), { cause: error });
75
+ }
11
76
  }
12
77
  /**
13
78
  * Resolves a local repository path or a Git URL, plus an optional revision,
@@ -19,7 +84,7 @@ async function git(args, cwd) {
19
84
  export async function resolveRepository(source, revision, bareRepoDir) {
20
85
  if (isRemoteUrl(source)) {
21
86
  await mkdir(bareRepoDir, { recursive: true });
22
- await execFileAsync("git", ["init", "--bare", "-q", bareRepoDir]);
87
+ await git(["init", "--bare", "-q", bareRepoDir], bareRepoDir);
23
88
  await git(["fetch", "-q", "--depth", "1", source, revision ?? "HEAD"], bareRepoDir);
24
89
  const commitSha = await git(["rev-parse", "FETCH_HEAD"], bareRepoDir);
25
90
  return { resolved: { source, commitSha }, archiveDir: bareRepoDir };
@@ -35,20 +100,79 @@ export async function resolveRepository(source, revision, bareRepoDir) {
35
100
  export async function createIsolatedWorkspace(resolution, workspaceRoot) {
36
101
  await mkdir(workspaceRoot, { recursive: true });
37
102
  await new Promise((resolve, reject) => {
38
- const gitArchive = execFile("git", ["archive", resolution.resolved.commitSha], { cwd: resolution.archiveDir, maxBuffer: 1024 * 1024 * 1024 }, (error) => {
39
- if (error)
40
- reject(error);
103
+ const gitCommand = ["git", "archive", resolution.resolved.commitSha];
104
+ const tarCommand = ["tar", "-x", "-C", workspaceRoot];
105
+ const gitArchive = spawn(gitCommand[0], gitCommand.slice(1), {
106
+ cwd: resolution.archiveDir,
41
107
  });
42
- const tar = execFile("tar", ["-x", "-C", workspaceRoot], (error) => {
43
- if (error)
44
- reject(error);
45
- else
46
- resolve();
108
+ const tar = spawn(tarCommand[0], tarCommand.slice(1));
109
+ const gitArchiveStderr = captureStderr(gitArchive.stderr);
110
+ const tarStderr = captureStderr(tar.stderr);
111
+ let gitArchiveExit;
112
+ let tarExit;
113
+ let pipeError;
114
+ let settled = false;
115
+ const stopOtherProcess = (process) => {
116
+ if (!process.killed)
117
+ process.kill();
118
+ };
119
+ const rejectWithProcessError = (error, stage, command, sibling) => {
120
+ if (settled)
121
+ return;
122
+ settled = true;
123
+ stopOtherProcess(sibling);
124
+ reject(new Error(formatExternalProcessError(error, stage, command.join(" ")), { cause: error }));
125
+ };
126
+ const finish = () => {
127
+ if (settled || gitArchiveExit === undefined || tarExit === undefined)
128
+ return;
129
+ // A malformed/empty stream caused by git archive failing should retain
130
+ // git's actionable stderr instead of replacing it with tar's secondary
131
+ // "not an archive" diagnostic. A tar failure takes precedence when the
132
+ // archive side was terminated by the pipe closing (SIGPIPE).
133
+ if (gitArchiveExit.code !== null && gitArchiveExit.code !== 0) {
134
+ settled = true;
135
+ reject(new Error(formatExternalProcessError({ code: gitArchiveExit.code, signal: gitArchiveExit.signal, stderr: gitArchiveStderr() }, "git archive", gitCommand.join(" "))));
136
+ return;
137
+ }
138
+ if (tarExit.code !== 0 || tarExit.signal !== null) {
139
+ settled = true;
140
+ reject(new Error(formatExternalProcessError({ code: tarExit.code, signal: tarExit.signal, stderr: tarStderr() }, "tar extraction", tarCommand.join(" "))));
141
+ return;
142
+ }
143
+ if (gitArchiveExit.signal !== null) {
144
+ settled = true;
145
+ reject(new Error(formatExternalProcessError({ code: gitArchiveExit.code, signal: gitArchiveExit.signal, stderr: gitArchiveStderr() }, "git archive", gitCommand.join(" "))));
146
+ return;
147
+ }
148
+ if (pipeError !== undefined) {
149
+ settled = true;
150
+ reject(new Error(`archive pipe failed: ${boundedText(String(pipeError))}`, { cause: pipeError }));
151
+ return;
152
+ }
153
+ settled = true;
154
+ resolve();
155
+ };
156
+ gitArchive.once("error", (error) => {
157
+ rejectWithProcessError(error, "git archive", gitCommand, tar);
158
+ });
159
+ tar.once("error", (error) => {
160
+ rejectWithProcessError(error, "tar extraction", tarCommand, gitArchive);
161
+ });
162
+ gitArchive.once("close", (code, signal) => {
163
+ gitArchiveExit = { code, signal };
164
+ finish();
165
+ });
166
+ tar.once("close", (code, signal) => {
167
+ tarExit = { code, signal };
168
+ finish();
169
+ });
170
+ gitArchive.stdout.once("error", (error) => {
171
+ pipeError ??= error;
172
+ });
173
+ tar.stdin.once("error", (error) => {
174
+ pipeError ??= error;
47
175
  });
48
- if (!gitArchive.stdout || !tar.stdin) {
49
- reject(new Error("failed to pipe git archive into tar"));
50
- return;
51
- }
52
176
  gitArchive.stdout.pipe(tar.stdin);
53
177
  });
54
178
  }
@@ -1 +1 @@
1
- {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/runtime/repository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/runtime/repository.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import { randomUUID } from "node:crypto";
2
2
  import { mkdir } from "node:fs/promises";
3
3
  import path from "node:path";
4
4
  import { collectToolchainVersions, writeManifest } from "./manifest.js";
5
- import { createIsolatedWorkspace, resolveRepository } from "./repository.js";
5
+ import { createIsolatedWorkspace, formatExternalProcessError, isExternalProcessError, resolveRepository, } from "./repository.js";
6
6
  /**
7
7
  * Resolves the input repository to an immutable commit, materializes it
8
8
  * into an isolated workspace, executes each provider through the common
@@ -75,6 +75,8 @@ async function executeProvider(provider, context) {
75
75
  }
76
76
  }
77
77
  function toErrorMessage(error) {
78
+ if (isExternalProcessError(error))
79
+ return formatExternalProcessError(error, "provider process");
78
80
  return error instanceof Error ? error.message : String(error);
79
81
  }
80
82
  //# sourceMappingURL=run.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/runtime/run.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/runtime/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type CandidateWorkingSet, type CandidateWorkingSetInput } from "./model.js";
2
+ /** Deterministic JSON serialization of the canonical artifact shape. */
3
+ export declare function serializeCandidateWorkingSet(input: CandidateWorkingSetInput | CandidateWorkingSet): string;
4
+ /** Parses JSON and rejects malformed or unsupported artifacts before semantic use. */
5
+ export declare function parseCandidateWorkingSet(serialized: string): CandidateWorkingSet;
6
+ /** Alias for callers that need validation without parsing a JSON string. */
7
+ export declare const decodeCandidateWorkingSet: typeof parseCandidateWorkingSet;
@@ -0,0 +1,53 @@
1
+ import { CANDIDATE_WORKING_SET_KIND, createCandidateWorkingSet, validateCandidateWorkingSet, } from "./model.js";
2
+ function canonicalDocument(workingSet) {
3
+ return {
4
+ kind: CANDIDATE_WORKING_SET_KIND,
5
+ schemaVersion: workingSet.schemaVersion,
6
+ workingSetId: workingSet.workingSetId,
7
+ repository: {
8
+ repositoryHost: workingSet.repository.repositoryHost,
9
+ repositoryId: workingSet.repository.repositoryId,
10
+ repository: workingSet.repository.repository,
11
+ },
12
+ revision: workingSet.revision,
13
+ entries: workingSet.entries.map((entry) => ({
14
+ state: entry.state,
15
+ target: {
16
+ kind: entry.target.kind,
17
+ locator: entry.target.locator,
18
+ },
19
+ reason: {
20
+ id: entry.reason.id,
21
+ summary: entry.reason.summary,
22
+ },
23
+ evidence: entry.evidence.map((reference) => ({
24
+ artifact: reference.artifact,
25
+ reference: reference.reference,
26
+ })),
27
+ })),
28
+ };
29
+ }
30
+ /** Deterministic JSON serialization of the canonical artifact shape. */
31
+ export function serializeCandidateWorkingSet(input) {
32
+ const workingSet = validateCandidateWorkingSet({
33
+ ...createCandidateWorkingSet(input),
34
+ schemaVersion: 1,
35
+ });
36
+ return JSON.stringify(canonicalDocument(workingSet));
37
+ }
38
+ /** Parses JSON and rejects malformed or unsupported artifacts before semantic use. */
39
+ export function parseCandidateWorkingSet(serialized) {
40
+ if (typeof serialized !== "string")
41
+ throw new TypeError("candidate working set serialization must be a string");
42
+ let parsed;
43
+ try {
44
+ parsed = JSON.parse(serialized);
45
+ }
46
+ catch {
47
+ throw new TypeError("candidate working set serialization is malformed");
48
+ }
49
+ return validateCandidateWorkingSet(parsed);
50
+ }
51
+ /** Alias for callers that need validation without parsing a JSON string. */
52
+ export const decodeCandidateWorkingSet = parseCandidateWorkingSet;
53
+ //# sourceMappingURL=codec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec.js","sourceRoot":"","sources":["../../src/working-set/codec.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,EACzB,2BAA2B,GAG5B,MAAM,YAAY,CAAC;AAEpB,SAAS,iBAAiB,CAAC,UAA+B;IACxD,OAAO;QACL,IAAI,EAAE,0BAA0B;QAChC,aAAa,EAAE,UAAU,CAAC,aAAa;QACvC,YAAY,EAAE,UAAU,CAAC,YAAY;QACrC,UAAU,EAAE;YACV,cAAc,EAAE,UAAU,CAAC,UAAU,CAAC,cAAc;YACpD,YAAY,EAAE,UAAU,CAAC,UAAU,CAAC,YAAY;YAChD,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,UAAU;SAC7C;QACD,QAAQ,EAAE,UAAU,CAAC,QAAQ;QAC7B,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC1C,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM,EAAE;gBACN,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI;gBACvB,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO;aAC9B;YACD,MAAM,EAAE;gBACN,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE;gBACnB,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO;aAC9B;YACD,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;gBAC3C,QAAQ,EAAE,SAAS,CAAC,QAAQ;gBAC5B,SAAS,EAAE,SAAS,CAAC,SAAS;aAC/B,CAAC,CAAC;SACJ,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,4BAA4B,CAAC,KAAqD;IAChG,MAAM,UAAU,GAAG,2BAA2B,CAAC;QAC7C,GAAG,yBAAyB,CAAC,KAAK,CAAC;QACnC,aAAa,EAAE,CAAC;KACjB,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,wBAAwB,CAAC,UAAkB;IACzD,IAAI,OAAO,UAAU,KAAK,QAAQ;QAAE,MAAM,IAAI,SAAS,CAAC,sDAAsD,CAAC,CAAC;IAChH,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,SAAS,CAAC,kDAAkD,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,2BAA2B,CAAC,MAAM,CAAC,CAAC;AAC7C,CAAC;AAED,4EAA4E;AAC5E,MAAM,CAAC,MAAM,yBAAyB,GAAG,wBAAwB,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { type CandidateWorkingSetEntry, type RepositoryIdentity, type WorkingSetEvidenceReference, type WorkingSetTarget } from "./model.js";
2
+ /** V1 diagnostics that must remain visible instead of being resolved implicitly. */
3
+ export declare const WORKING_SET_CONFLICT_KINDS: readonly ["ambiguity", "disagreement", "stale-evidence", "mapping-gap", "required-but-unauthorized", "insufficient-evidence"];
4
+ export type WorkingSetConflictKind = (typeof WORKING_SET_CONFLICT_KINDS)[number];
5
+ export interface WorkingSetConflict {
6
+ readonly kind: WorkingSetConflictKind;
7
+ /** Unresolved target used to preserve the conflict in the Candidate Working Set artifact. */
8
+ readonly target: WorkingSetTarget;
9
+ readonly reason: {
10
+ readonly id: string;
11
+ readonly summary: string;
12
+ };
13
+ readonly evidence: readonly WorkingSetEvidenceReference[];
14
+ }
15
+ export interface WorkingSetAuthorizationEntry {
16
+ readonly target: WorkingSetTarget;
17
+ readonly evidence?: readonly WorkingSetEvidenceReference[];
18
+ }
19
+ /**
20
+ * External authorization is intentionally only an input to comparison. It is
21
+ * never copied into the Candidate Working Set as authority and never widened
22
+ * by Wabachi.
23
+ */
24
+ export interface WorkingSetAuthorizationInput {
25
+ readonly repository?: RepositoryIdentity;
26
+ readonly revision?: string;
27
+ readonly targets?: readonly (WorkingSetTarget | WorkingSetAuthorizationEntry)[];
28
+ readonly entries?: readonly WorkingSetAuthorizationEntry[];
29
+ readonly authorizedTargets?: readonly (WorkingSetTarget | WorkingSetAuthorizationEntry)[];
30
+ }
31
+ export interface WorkingSetConflictInput {
32
+ readonly kind: WorkingSetConflictKind;
33
+ /** Stable conflict-local locator, not provider payload. */
34
+ readonly locator: string;
35
+ readonly evidence?: readonly WorkingSetEvidenceReference[];
36
+ }
37
+ /** Creates one deterministic, unresolved conflict record from bounded evidence. */
38
+ export declare function createWorkingSetConflict(input: WorkingSetConflictInput): WorkingSetConflict;
39
+ /** Converts the semantic conflict record into the existing artifact entry shape. */
40
+ export declare function conflictToWorkingSetEntry(conflict: WorkingSetConflict): CandidateWorkingSetEntry;
41
+ /** Returns the machine-readable conflict class carried by an unresolved entry. */
42
+ export declare function getWorkingSetConflictKind(entry: CandidateWorkingSetEntry): WorkingSetConflictKind | undefined;
43
+ /** Canonicalizes the supported authorization comparison shapes without issuing authority. */
44
+ export declare function authorizationEntries(input: WorkingSetAuthorizationInput): readonly WorkingSetAuthorizationEntry[];
45
+ export declare function workingSetTargetKey(target: WorkingSetTarget): string;
46
+ export declare function conflictSummary(kind: WorkingSetConflictKind): string;
@@ -0,0 +1,97 @@
1
+ import { CANDIDATE_WORKING_SET_LIMITS, } from "./model.js";
2
+ /** V1 diagnostics that must remain visible instead of being resolved implicitly. */
3
+ export const WORKING_SET_CONFLICT_KINDS = [
4
+ "ambiguity",
5
+ "disagreement",
6
+ "stale-evidence",
7
+ "mapping-gap",
8
+ "required-but-unauthorized",
9
+ "insufficient-evidence",
10
+ ];
11
+ const CONFLICT_SUMMARIES = Object.freeze({
12
+ ambiguity: "candidate evidence has multiple possible interpretations",
13
+ disagreement: "provider evidence disagrees about the candidate context",
14
+ "stale-evidence": "evidence is not pinned to the current repository revision",
15
+ "mapping-gap": "required evidence has no unique Canon repository mapping",
16
+ "required-but-unauthorized": "required context is outside the supplied authorization comparison",
17
+ "insufficient-evidence": "available evidence is insufficient for a current derivation",
18
+ });
19
+ function compareText(left, right) {
20
+ if (left < right)
21
+ return -1;
22
+ if (left > right)
23
+ return 1;
24
+ return 0;
25
+ }
26
+ function evidenceKey(reference) {
27
+ return `${reference.artifact}\u0000${reference.reference}`;
28
+ }
29
+ function boundedEvidence(references) {
30
+ const unique = new Map();
31
+ for (const reference of references)
32
+ unique.set(evidenceKey(reference), reference);
33
+ return [...unique.values()]
34
+ .sort((left, right) => compareText(left.artifact, right.artifact) || compareText(left.reference, right.reference))
35
+ .slice(0, CANDIDATE_WORKING_SET_LIMITS.maxEvidenceReferencesPerEntry);
36
+ }
37
+ function boundedLocator(value) {
38
+ const normalized = value.normalize("NFC");
39
+ return normalized.length === 0 ? "unknown" : normalized.slice(0, CANDIDATE_WORKING_SET_LIMITS.maxTargetLocatorLength);
40
+ }
41
+ /** Creates one deterministic, unresolved conflict record from bounded evidence. */
42
+ export function createWorkingSetConflict(input) {
43
+ const locator = boundedLocator(input.locator);
44
+ const kind = input.kind;
45
+ return Object.freeze({
46
+ kind,
47
+ target: Object.freeze({ kind: "unresolved", locator: boundedLocator(`conflict:${kind}:${locator}`) }),
48
+ reason: Object.freeze({ id: `conflict:${kind}`, summary: CONFLICT_SUMMARIES[kind] }),
49
+ evidence: Object.freeze(boundedEvidence(input.evidence ?? [])),
50
+ });
51
+ }
52
+ /** Converts the semantic conflict record into the existing artifact entry shape. */
53
+ export function conflictToWorkingSetEntry(conflict) {
54
+ return {
55
+ state: "unresolved",
56
+ target: conflict.target,
57
+ reason: conflict.reason,
58
+ evidence: conflict.evidence,
59
+ };
60
+ }
61
+ /** Returns the machine-readable conflict class carried by an unresolved entry. */
62
+ export function getWorkingSetConflictKind(entry) {
63
+ if (entry.state !== "unresolved" || entry.target.kind !== "unresolved")
64
+ return undefined;
65
+ const kind = entry.reason.id.startsWith("conflict:") ? entry.reason.id.slice("conflict:".length) : undefined;
66
+ return WORKING_SET_CONFLICT_KINDS.includes(kind)
67
+ ? kind
68
+ : undefined;
69
+ }
70
+ function isAuthorizationEntry(value) {
71
+ return "target" in value;
72
+ }
73
+ /** Canonicalizes the supported authorization comparison shapes without issuing authority. */
74
+ export function authorizationEntries(input) {
75
+ const values = [...(input.targets ?? []), ...(input.entries ?? []), ...(input.authorizedTargets ?? [])].map((value) => (isAuthorizationEntry(value) ? value : { target: value }));
76
+ const unique = new Map();
77
+ for (const value of values) {
78
+ const key = `${value.target.kind}\u0000${value.target.locator}`;
79
+ const existing = unique.get(key);
80
+ if (existing === undefined) {
81
+ unique.set(key, value);
82
+ continue;
83
+ }
84
+ unique.set(key, {
85
+ target: existing.target,
86
+ evidence: boundedEvidence([...(existing.evidence ?? []), ...(value.evidence ?? [])]),
87
+ });
88
+ }
89
+ return [...unique.values()].sort((left, right) => compareText(left.target.kind, right.target.kind) || compareText(left.target.locator, right.target.locator));
90
+ }
91
+ export function workingSetTargetKey(target) {
92
+ return `${target.kind}\u0000${target.locator}`;
93
+ }
94
+ export function conflictSummary(kind) {
95
+ return CONFLICT_SUMMARIES[kind];
96
+ }
97
+ //# sourceMappingURL=conflicts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflicts.js","sourceRoot":"","sources":["../../src/working-set/conflicts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { type FactNormalizationResult } from "../runtime/facts.js";
2
+ import type { ArchitectureDocumentV1 } from "../architecture/canon/document.js";
3
+ import { type CandidateWorkingSet } from "./model.js";
4
+ import { type WorkingSetAuthorizationInput } from "./conflicts.js";
5
+ import type { WorkingSetSeedResolutionResult } from "./seeds.js";
6
+ /** Canon relationship classes admitted by the V1 derivation boundary. */
7
+ export declare const CANON_V1_RELATIONSHIP_CLASSES: readonly ["depends-on", "calls", "uses", "data", "control"];
8
+ export type CanonV1RelationshipClass = (typeof CANON_V1_RELATIONSHIP_CLASSES)[number];
9
+ /** Provider predicates admitted by the V1 derivation boundary. */
10
+ export declare const PROVIDER_V1_RELATIONSHIP_CLASSES: readonly ["depends-on", "imports", "calls", "references"];
11
+ export type ProviderV1RelationshipClass = (typeof PROVIDER_V1_RELATIONSHIP_CLASSES)[number];
12
+ export interface CandidateWorkingSetDerivationInput {
13
+ /** Seed resolutions are already bound to the task repository and revision. */
14
+ readonly seeds: WorkingSetSeedResolutionResult;
15
+ /** Existing normalized provider evidence and its correlation projection. */
16
+ readonly providerEvidence: FactNormalizationResult;
17
+ /** Existing read-only Architecture Canon. */
18
+ readonly canon: ArchitectureDocumentV1;
19
+ /** Optional artifact identity; the task identity is used when omitted. */
20
+ readonly workingSetId?: string;
21
+ /** Optional external authorization boundary used only as comparison evidence. */
22
+ readonly authorization?: WorkingSetAuthorizationInput;
23
+ }
24
+ /**
25
+ * Derives one authorization-neutral Candidate Working Set from bounded seed
26
+ * resolutions, normalized provider evidence, and the read-only Canon.
27
+ *
28
+ * The algorithm has two deliberate traversal boundaries: Canon `depends-on`
29
+ * may recurse only while the source and target retain the same non-empty
30
+ * boundary membership, and provider relationships are consumed only as a
31
+ * single evidence hop. Other admitted relationship classes add context but
32
+ * never create a transitive provider/repository graph.
33
+ */
34
+ export declare function deriveCandidateWorkingSet(input: CandidateWorkingSetDerivationInput): CandidateWorkingSet;