@mnemonik/shared 7.97.1 → 7.98.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 (130) hide show
  1. package/dist/ambientPointer.d.ts.map +1 -1
  2. package/dist/ambientPointer.js +2 -1
  3. package/dist/ambientPointer.js.map +1 -1
  4. package/dist/apiOrigin.d.ts +3 -0
  5. package/dist/apiOrigin.d.ts.map +1 -0
  6. package/dist/apiOrigin.js +5 -0
  7. package/dist/apiOrigin.js.map +1 -0
  8. package/dist/ast/astChunker.d.ts +12 -12
  9. package/dist/ast/astChunker.js +32 -32
  10. package/dist/ast/grammars.d.ts +9 -9
  11. package/dist/ast/grammars.js +15 -15
  12. package/dist/codeScanner.d.ts +56 -43
  13. package/dist/codeScanner.d.ts.map +1 -1
  14. package/dist/codeScanner.js +262 -143
  15. package/dist/codeScanner.js.map +1 -1
  16. package/dist/contextBudget.js +2 -2
  17. package/dist/contextBudget.js.map +1 -1
  18. package/dist/gitEditDetector.d.ts +6 -6
  19. package/dist/gitEditDetector.js +7 -7
  20. package/dist/hookRuntime.d.ts +35 -2
  21. package/dist/hookRuntime.d.ts.map +1 -1
  22. package/dist/hookRuntime.js +127 -33
  23. package/dist/hookRuntime.js.map +1 -1
  24. package/dist/hookTimeouts.d.ts +6 -6
  25. package/dist/hookTimeouts.js +6 -6
  26. package/dist/hostAdapter.d.ts +135 -0
  27. package/dist/hostAdapter.d.ts.map +1 -0
  28. package/dist/hostAdapter.js +323 -0
  29. package/dist/hostAdapter.js.map +1 -0
  30. package/dist/hostBinary.d.ts +29 -0
  31. package/dist/hostBinary.d.ts.map +1 -0
  32. package/dist/hostBinary.js +179 -0
  33. package/dist/hostBinary.js.map +1 -0
  34. package/dist/index.d.ts +11 -1
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +10 -1
  37. package/dist/index.js.map +1 -1
  38. package/dist/instructions.d.ts +26 -26
  39. package/dist/instructions.js +26 -26
  40. package/dist/jitDeliveryAck.d.ts.map +1 -1
  41. package/dist/jitDeliveryAck.js +2 -0
  42. package/dist/jitDeliveryAck.js.map +1 -1
  43. package/dist/projectIdentityFile.d.ts +25 -0
  44. package/dist/projectIdentityFile.d.ts.map +1 -0
  45. package/dist/projectIdentityFile.js +87 -0
  46. package/dist/projectIdentityFile.js.map +1 -0
  47. package/dist/projectSetupHandoff.d.ts +24 -0
  48. package/dist/projectSetupHandoff.d.ts.map +1 -0
  49. package/dist/projectSetupHandoff.js +249 -0
  50. package/dist/projectSetupHandoff.js.map +1 -0
  51. package/dist/protectedPaths.d.ts +9 -0
  52. package/dist/protectedPaths.d.ts.map +1 -0
  53. package/dist/protectedPaths.js +66 -0
  54. package/dist/protectedPaths.js.map +1 -0
  55. package/dist/readiness.d.ts +143 -0
  56. package/dist/readiness.d.ts.map +1 -0
  57. package/dist/readiness.js +304 -0
  58. package/dist/readiness.js.map +1 -0
  59. package/dist/repositoryFingerprint.d.ts +50 -0
  60. package/dist/repositoryFingerprint.d.ts.map +1 -0
  61. package/dist/repositoryFingerprint.js +160 -0
  62. package/dist/repositoryFingerprint.js.map +1 -0
  63. package/dist/repositoryRoot.d.ts +56 -0
  64. package/dist/repositoryRoot.d.ts.map +1 -0
  65. package/dist/repositoryRoot.js +226 -0
  66. package/dist/repositoryRoot.js.map +1 -0
  67. package/dist/runtimeReader.d.ts +102 -0
  68. package/dist/runtimeReader.d.ts.map +1 -0
  69. package/dist/runtimeReader.js +408 -0
  70. package/dist/runtimeReader.js.map +1 -0
  71. package/dist/runtimeSigners.d.ts +37 -0
  72. package/dist/runtimeSigners.d.ts.map +1 -0
  73. package/dist/runtimeSigners.js +507 -0
  74. package/dist/runtimeSigners.js.map +1 -0
  75. package/dist/scannerSupervisor.d.ts +35 -0
  76. package/dist/scannerSupervisor.d.ts.map +1 -0
  77. package/dist/scannerSupervisor.js +2 -0
  78. package/dist/scannerSupervisor.js.map +1 -0
  79. package/dist/secretPatterns.d.ts +9 -9
  80. package/dist/secretPatterns.d.ts.map +1 -1
  81. package/dist/secretPatterns.js +27 -25
  82. package/dist/secretPatterns.js.map +1 -1
  83. package/dist/testing/hostAdapterConformance.d.ts +17 -0
  84. package/dist/testing/hostAdapterConformance.d.ts.map +1 -0
  85. package/dist/testing/hostAdapterConformance.js +477 -0
  86. package/dist/testing/hostAdapterConformance.js.map +1 -0
  87. package/dist/usageGuide.d.ts +1 -1
  88. package/dist/usageGuide.d.ts.map +1 -1
  89. package/dist/usageGuide.js +4 -4
  90. package/package.json +7 -2
  91. package/queries/bash.tags.scm +1 -1
  92. package/queries/groovy.tags.scm +1 -1
  93. package/scripts/vendor-grammars.ts +13 -13
  94. package/src/ambientPointer.ts +2 -1
  95. package/src/apiOrigin.ts +4 -0
  96. package/src/ast/astChunker.ts +39 -39
  97. package/src/ast/grammars.ts +16 -16
  98. package/src/codeScanner.ts +274 -149
  99. package/src/contextBudget.ts +2 -2
  100. package/src/gitEditDetector.ts +7 -7
  101. package/src/hookRuntime.ts +162 -34
  102. package/src/hookTimeouts.ts +6 -6
  103. package/src/hostAdapter.ts +468 -0
  104. package/src/hostBinary.ts +205 -0
  105. package/src/index.ts +20 -0
  106. package/src/instructions.ts +26 -26
  107. package/src/jitDeliveryAck.ts +2 -0
  108. package/src/projectIdentityFile.ts +100 -0
  109. package/src/projectSetupHandoff.ts +275 -0
  110. package/src/protectedPaths.ts +88 -0
  111. package/src/readiness.ts +516 -0
  112. package/src/repositoryFingerprint.ts +199 -0
  113. package/src/repositoryRoot.ts +261 -0
  114. package/src/runtimeReader.ts +495 -0
  115. package/src/runtimeSigners.ts +577 -0
  116. package/src/scannerSupervisor.ts +26 -0
  117. package/src/secretPatterns.ts +27 -25
  118. package/src/testing/hostAdapterConformance.ts +538 -0
  119. package/src/usageGuide.ts +4 -4
  120. package/test-fixtures/identity/runner.d.mts +12 -0
  121. package/test-fixtures/identity/runner.mjs +282 -0
  122. package/tests/fixtures/repository-fingerprint-v1.golden.json +834 -0
  123. package/tests/projectIdentity.test.ts +56 -0
  124. package/tests/readiness.test.ts +158 -0
  125. package/tests/repositoryFingerprint.test.ts +26 -0
  126. package/tsconfig.test.json +9 -0
  127. package/wasm/bash.tags.scm +1 -1
  128. package/wasm/groovy.tags.scm +1 -1
  129. package/wasm/javascript.tags.scm +2 -2
  130. package/wasm/solidity.tags.scm +1 -1
@@ -0,0 +1,160 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { domainToASCII } from 'node:url';
3
+ /** Registry changes require review and golden cases; changed v1 outputs require v2. */
4
+ export const REPOSITORY_PROVIDER_RULES = Object.freeze([
5
+ Object.freeze({ name: 'github', host: 'github.com', sshUser: 'git', removeTerminalDotGit: true }),
6
+ ]);
7
+ const controls = /\p{Cc}/u;
8
+ const reject = (reason) => ({ status: 'rejected', reason });
9
+ const encodeSegment = (segment) => encodeURIComponent(segment).replace(/[!'()*]/g, (char) => `%${char.charCodeAt(0).toString(16).toUpperCase()}`);
10
+ /** Parse the raw path ourselves: WHATWG URL would silently resolve dot segments. */
11
+ export function canonicalizeRemote(url, { providerRules = REPOSITORY_PROVIDER_RULES, } = {}) {
12
+ if (controls.test(url))
13
+ return reject('control_character');
14
+ if (url.includes('\\'))
15
+ return reject('backslash');
16
+ if (/^file:/i.test(url))
17
+ return reject('local_remote');
18
+ const input = url.split(/[?#]/, 1)[0] ?? '';
19
+ const scheme = /^([a-z][a-z0-9+.-]*):\/\//i.exec(input);
20
+ let transport;
21
+ let authority;
22
+ let path;
23
+ if (scheme) {
24
+ const protocol = (scheme[1] ?? '').toLowerCase();
25
+ if (protocol !== 'https' && protocol !== 'ssh')
26
+ return reject('unsupported_transport');
27
+ transport = protocol;
28
+ const parts = /^([^/]*)(?:\/(.*))?$/.exec(input.slice(scheme[0].length));
29
+ if (!parts)
30
+ return reject('invalid_remote');
31
+ authority = parts[1] ?? '';
32
+ path = parts[2] ?? '';
33
+ }
34
+ else {
35
+ const scp = /^((?:[^@/:]+@)?(?:\[[^\]]+\]|[^/:]+)):(.*)$/.exec(input);
36
+ if (!scp)
37
+ return reject('invalid_remote');
38
+ transport = 'ssh';
39
+ authority = scp[1] ?? '';
40
+ path = scp[2] ?? '';
41
+ }
42
+ const at = authority.lastIndexOf('@');
43
+ let user = '';
44
+ if (at >= 0) {
45
+ if (transport === 'https')
46
+ return reject('https_userinfo');
47
+ user = authority.slice(0, at);
48
+ if (user.includes(':'))
49
+ return reject('ssh_password');
50
+ if (!/^[A-Za-z0-9._~!$&'()*+,;=-]+$/.test(user))
51
+ return reject('invalid_ssh_user');
52
+ authority = authority.slice(at + 1);
53
+ }
54
+ if (transport === 'ssh' && !user)
55
+ return reject('ssh_user_required');
56
+ const hostPort = /^(\[[^\]]+\]|[^:[\]]+)(?::([0-9]+))?$/.exec(authority);
57
+ if (!hostPort)
58
+ return reject(authority.includes(':') ? 'invalid_port' : 'invalid_host');
59
+ let host = hostPort[1] ?? '';
60
+ let port = hostPort[2] ?? '';
61
+ if (port && (Number(port) < 1 || Number(port) > 65535))
62
+ return reject('invalid_port');
63
+ if (port)
64
+ port = String(Number(port));
65
+ if (port === (transport === 'https' ? '443' : '22'))
66
+ port = '';
67
+ if (/[\s%/@?#]/u.test(host))
68
+ return reject('invalid_host');
69
+ try {
70
+ // Node's WHATWG host parser supplies UTS 46 ToASCII and IPv6 zero compression.
71
+ host = host.startsWith('[')
72
+ ? new URL(`https://${host}/`).hostname
73
+ : domainToASCII(host).toLowerCase();
74
+ if (!host)
75
+ return reject('invalid_host');
76
+ }
77
+ catch {
78
+ return reject('invalid_host');
79
+ }
80
+ const rule = providerRules.find((rule) => rule.host === host && !port && (transport === 'https' || user === rule.sshUser));
81
+ // Generic scp paths are home-relative; ssh:// paths are absolute. Only a
82
+ // reviewed provider rule can establish that both name the same repository.
83
+ if (!scheme && !rule)
84
+ return reject('scp_unreviewed_remote');
85
+ if (!scheme && path.startsWith('/'))
86
+ path = path.slice(1);
87
+ if (path.endsWith('/'))
88
+ path = path.slice(0, -1);
89
+ const segments = [];
90
+ for (const raw of path.split('/')) {
91
+ if (/%(?:2f|5c)/i.test(raw))
92
+ return reject('escaped_separator');
93
+ let segment;
94
+ try {
95
+ segment = decodeURIComponent(raw).normalize('NFC');
96
+ }
97
+ catch {
98
+ return reject('invalid_encoding');
99
+ }
100
+ if (controls.test(segment))
101
+ return reject('control_character');
102
+ if (segment.includes('\\'))
103
+ return reject('backslash');
104
+ if (!segment)
105
+ return reject('empty_segment');
106
+ if (segment === '.' || segment === '..')
107
+ return reject('dot_segment');
108
+ try {
109
+ segments.push(encodeSegment(segment));
110
+ }
111
+ catch {
112
+ return reject('invalid_encoding');
113
+ }
114
+ }
115
+ const parsed = { transport, host, user, port, path: segments.join('/') };
116
+ if (rule?.removeTerminalDotGit) {
117
+ parsed.path = parsed.path.replace(/\.git$/, '');
118
+ const last = parsed.path.split('/').at(-1);
119
+ if (!last)
120
+ return reject('empty_segment');
121
+ if (last === '.' || last === '..')
122
+ return reject('dot_segment');
123
+ }
124
+ const prefix = rule
125
+ ? `${rule.name}:${host}`
126
+ : `${transport}:${transport === 'ssh' ? `${user}@` : ''}${host}${port ? `:${port}` : ''}`;
127
+ const canonical = `repo-v1:${prefix}/${parsed.path}`;
128
+ return {
129
+ canonical,
130
+ hash: createHash('sha256').update(canonical, 'utf8').digest('hex'),
131
+ algorithmVersion: 1,
132
+ };
133
+ }
134
+ /** Choice results carry names, never credential-bearing URLs. No URL is guessed. */
135
+ export function selectRemote(remotes) {
136
+ if (!remotes.length)
137
+ return { status: 'none', reason: 'no_remote' };
138
+ const origins = remotes.filter((remote) => remote.name === 'origin');
139
+ const selected = origins.length === 1 ? origins[0] : remotes.length === 1 ? remotes[0] : undefined;
140
+ if (!selected)
141
+ return {
142
+ status: 'choice_required',
143
+ reason: 'multiple_remotes',
144
+ remotes: remotes.map((r) => r.name),
145
+ };
146
+ if (!selected.fetchUrls.length)
147
+ return { status: 'none', reason: 'no_fetch_url' };
148
+ const results = [...selected.fetchUrls, ...(selected.pushUrls ?? [])].map((url) => canonicalizeRemote(url));
149
+ const first = results[0];
150
+ if (!first)
151
+ return { status: 'none', reason: 'no_fetch_url' };
152
+ if (results.length === 1 && 'reason' in first)
153
+ return { status: 'rejected', remote: selected.name, reason: first.reason };
154
+ if ('reason' in first ||
155
+ results.some((result) => 'reason' in result || result.canonical !== first.canonical)) {
156
+ return { status: 'choice_required', reason: 'different_urls', remotes: [selected.name] };
157
+ }
158
+ return { status: 'fingerprint', remote: selected.name, fingerprint: first };
159
+ }
160
+ //# sourceMappingURL=repositoryFingerprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repositoryFingerprint.js","sourceRoot":"","sources":["../src/repositoryFingerprint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { type ProjectIdentityFile } from './projectIdentityFile.js';
2
+ export interface RepositoryBoundary {
3
+ path: string;
4
+ kind: 'directory' | 'file';
5
+ }
6
+ export type RepositoryRootResult = {
7
+ kind: 'git';
8
+ root: string;
9
+ commonDir: string;
10
+ isLinkedWorktree: boolean;
11
+ nested: RepositoryBoundary[];
12
+ } | {
13
+ kind: 'plain';
14
+ root: string;
15
+ } | {
16
+ kind: 'git_unavailable';
17
+ detail: string;
18
+ };
19
+ type ResolvedRepository = Exclude<RepositoryRootResult, {
20
+ kind: 'git_unavailable';
21
+ }>;
22
+ type ResolvedBase = {
23
+ root: string;
24
+ repository: ResolvedRepository;
25
+ nested: RepositoryBoundary[];
26
+ };
27
+ export type ProjectIdentityResolution = (ResolvedBase & {
28
+ kind: 'ok';
29
+ identity: ProjectIdentityFile;
30
+ }) | (ResolvedBase & {
31
+ kind: 'absent';
32
+ }) | (ResolvedBase & {
33
+ kind: 'unknown_version';
34
+ version: unknown;
35
+ path: string;
36
+ }) | (ResolvedBase & {
37
+ kind: 'malformed';
38
+ detail: string;
39
+ path: string;
40
+ }) | (ResolvedBase & {
41
+ kind: 'nested';
42
+ parentIdentity?: ProjectIdentityFile;
43
+ }) | (ResolvedBase & {
44
+ kind: 'conflict';
45
+ rootIdentity: ProjectIdentityFile;
46
+ nestedIdentity: ProjectIdentityFile;
47
+ }) | {
48
+ kind: 'git_unavailable';
49
+ detail: string;
50
+ };
51
+ export declare function resolveRepositoryRoot(cwd: string): Promise<RepositoryRootResult>;
52
+ export declare function resolveProjectIdentity(cwd: string, options?: {
53
+ allowNestedInherit?: boolean;
54
+ }): Promise<ProjectIdentityResolution>;
55
+ export {};
56
+ //# sourceMappingURL=repositoryRoot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repositoryRoot.d.ts","sourceRoot":"","sources":["../src/repositoryRoot.ts"],"names":[],"mappings":"AAIA,OAAO,EAAoB,KAAK,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEtF,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,GAAG,MAAM,CAAC;CAC5B;AAED,MAAM,MAAM,oBAAoB,GAC5B;IACE,IAAI,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,MAAM,EAAE,kBAAkB,EAAE,CAAC;CAC9B,GACD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhD,KAAK,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,EAAE;IAAE,IAAI,EAAE,iBAAiB,CAAA;CAAE,CAAC,CAAC;AAErF,KAAK,YAAY,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,kBAAkB,CAAC;IAC/B,MAAM,EAAE,kBAAkB,EAAE,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,yBAAyB,GACjC,CAAC,YAAY,GAAG;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,mBAAmB,CAAA;CAAE,CAAC,GAC9D,CAAC,YAAY,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,GACnC,CAAC,YAAY,GAAG;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAC5E,CAAC,YAAY,GAAG;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GACpE,CAAC,YAAY,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,cAAc,CAAC,EAAE,mBAAmB,CAAA;CAAE,CAAC,GACzE,CAAC,YAAY,GAAG;IACd,IAAI,EAAE,UAAU,CAAC;IACjB,YAAY,EAAE,mBAAmB,CAAC;IAClC,cAAc,EAAE,mBAAmB,CAAC;CACrC,CAAC,GACF;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAoGhD,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAkCtF;AA2BD,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC7C,OAAO,CAAC,yBAAyB,CAAC,CAuDpC"}
@@ -0,0 +1,226 @@
1
+ import { lstat, readFile } from 'node:fs/promises';
2
+ import { execFile } from 'node:child_process';
3
+ import { homedir } from 'node:os';
4
+ import { dirname, join, resolve } from 'node:path';
5
+ import { readIdentityFile } from './projectIdentityFile.js';
6
+ const GIT_TIMEOUT_MS = 2_000;
7
+ const GIT_ENV_KEYS = [
8
+ 'PATH',
9
+ 'HOME',
10
+ 'LANG',
11
+ 'LC_ALL',
12
+ 'SYSTEMROOT',
13
+ 'TEMP',
14
+ 'TMP',
15
+ 'USERPROFILE',
16
+ ];
17
+ function gitEnvironment() {
18
+ const env = {};
19
+ for (const key of GIT_ENV_KEYS) {
20
+ if (process.env[key] !== undefined)
21
+ env[key] = process.env[key];
22
+ }
23
+ env.LC_ALL = 'C';
24
+ return env;
25
+ }
26
+ function runGit(cwd, args) {
27
+ return new Promise((resolvePromise, reject) => {
28
+ execFile('git', args, { cwd, timeout: GIT_TIMEOUT_MS, encoding: 'utf8', env: gitEnvironment() }, (error, stdout, stderr) => {
29
+ if (error)
30
+ reject(Object.assign(error, { stdout, stderr }));
31
+ else
32
+ resolvePromise({ stdout, stderr });
33
+ });
34
+ });
35
+ }
36
+ async function boundaryAt(path) {
37
+ try {
38
+ const stat = await lstat(join(path, '.git'));
39
+ if (stat.isDirectory())
40
+ return { path, kind: 'directory' };
41
+ if (stat.isFile())
42
+ return { path, kind: 'file' };
43
+ }
44
+ catch (error) {
45
+ const code = error.code;
46
+ if (code !== 'ENOENT' && code !== 'ENOTDIR')
47
+ throw error;
48
+ }
49
+ return undefined;
50
+ }
51
+ async function confirmedBoundaryAt(path) {
52
+ const boundary = await boundaryAt(path);
53
+ if (!boundary)
54
+ return undefined;
55
+ try {
56
+ const { stdout } = await runGit(path, ['rev-parse', '--git-dir']);
57
+ return stdout.trim() ? boundary : undefined;
58
+ }
59
+ catch {
60
+ return undefined;
61
+ }
62
+ }
63
+ async function boundariesBetween(cwd, root) {
64
+ const boundaries = [];
65
+ let directory = cwd;
66
+ while (directory !== root) {
67
+ const boundary = await confirmedBoundaryAt(directory);
68
+ if (boundary)
69
+ boundaries.push(boundary);
70
+ const parent = dirname(directory);
71
+ if (parent === directory)
72
+ break;
73
+ directory = parent;
74
+ }
75
+ return boundaries;
76
+ }
77
+ async function containingRepository(root) {
78
+ let directory = dirname(root);
79
+ while (true) {
80
+ const boundary = await confirmedBoundaryAt(directory);
81
+ if (boundary)
82
+ return boundary;
83
+ const parent = dirname(directory);
84
+ if (parent === directory)
85
+ return undefined;
86
+ directory = parent;
87
+ }
88
+ }
89
+ async function canonicalBoundaryRoot(boundary) {
90
+ if (boundary.kind === 'directory')
91
+ return boundary.path;
92
+ const pointer = /^gitdir:\s*(.+)\s*$/im.exec(await readFile(join(boundary.path, '.git'), 'utf8'))?.[1];
93
+ if (!pointer)
94
+ return boundary.path;
95
+ const gitDir = resolve(boundary.path, pointer);
96
+ try {
97
+ const commonDir = resolve(gitDir, (await readFile(join(gitDir, 'commondir'), 'utf8')).trim());
98
+ return dirname(commonDir);
99
+ }
100
+ catch (error) {
101
+ if (error.code === 'ENOENT')
102
+ return boundary.path;
103
+ throw error;
104
+ }
105
+ }
106
+ export async function resolveRepositoryRoot(cwd) {
107
+ const absoluteCwd = resolve(cwd);
108
+ try {
109
+ const { stdout } = await runGit(absoluteCwd, [
110
+ 'rev-parse',
111
+ '--show-toplevel',
112
+ '--git-common-dir',
113
+ ]);
114
+ const [rootLine, commonLine, ...extra] = stdout.trim().split(/\r?\n/);
115
+ if (!rootLine || !commonLine || extra.length) {
116
+ return { kind: 'git_unavailable', detail: 'git rev-parse returned an unexpected response' };
117
+ }
118
+ const root = resolve(rootLine);
119
+ const commonDir = resolve(root, commonLine);
120
+ const isLinkedWorktree = commonDir !== join(root, '.git');
121
+ const nested = await boundariesBetween(absoluteCwd, root);
122
+ if (!isLinkedWorktree && (await containingRepository(root))) {
123
+ const boundary = await boundaryAt(root);
124
+ if (boundary)
125
+ nested.push(boundary);
126
+ }
127
+ return {
128
+ kind: 'git',
129
+ root,
130
+ commonDir,
131
+ isLinkedWorktree,
132
+ nested,
133
+ };
134
+ }
135
+ catch (error) {
136
+ const failure = error;
137
+ if (failure.code === 128 && /not a git repository/i.test(failure.stderr ?? failure.message)) {
138
+ return { kind: 'plain', root: absoluteCwd };
139
+ }
140
+ return { kind: 'git_unavailable', detail: failure.message };
141
+ }
142
+ }
143
+ async function readPlainIdentity(start) {
144
+ const home = resolve(homedir());
145
+ let directory = start;
146
+ while (true) {
147
+ const result = await readIdentityFile(directory);
148
+ if (result.kind !== 'absent')
149
+ return { root: directory, result };
150
+ if (directory === home)
151
+ break;
152
+ const parent = dirname(directory);
153
+ if (parent === directory)
154
+ break;
155
+ directory = parent;
156
+ }
157
+ return { root: start, result: { kind: 'absent' } };
158
+ }
159
+ function withBase(repository, root, nested) {
160
+ return { root, repository, nested };
161
+ }
162
+ export async function resolveProjectIdentity(cwd, options = {}) {
163
+ const repository = await resolveRepositoryRoot(cwd);
164
+ if (repository.kind === 'git_unavailable')
165
+ return repository;
166
+ if (repository.kind === 'plain') {
167
+ const { root, result } = await readPlainIdentity(repository.root);
168
+ const base = withBase(repository, root, []);
169
+ if (result.kind === 'ok')
170
+ return { ...base, ...result };
171
+ if (result.kind === 'unknown_version')
172
+ return { ...base, ...result, path: root };
173
+ if (result.kind === 'malformed')
174
+ return { ...base, ...result, path: root };
175
+ return { ...base, kind: 'absent' };
176
+ }
177
+ const ownRoot = repository.isLinkedWorktree ? dirname(repository.commonDir) : repository.root;
178
+ const outer = repository.isLinkedWorktree
179
+ ? undefined
180
+ : await containingRepository(repository.root);
181
+ const own = await readIdentityFile(ownRoot);
182
+ if (!outer) {
183
+ const base = withBase(repository, ownRoot, repository.nested);
184
+ if (own.kind === 'ok')
185
+ return { ...base, ...own };
186
+ if (own.kind === 'unknown_version')
187
+ return { ...base, ...own, path: ownRoot };
188
+ if (own.kind === 'malformed')
189
+ return { ...base, ...own, path: ownRoot };
190
+ return { ...base, kind: 'absent' };
191
+ }
192
+ const nested = repository.nested;
193
+ const parentRoot = await canonicalBoundaryRoot(outer);
194
+ const parent = await readIdentityFile(parentRoot);
195
+ const base = withBase(repository, parentRoot, nested);
196
+ if (own.kind === 'unknown_version')
197
+ return { ...base, ...own, path: ownRoot };
198
+ if (own.kind === 'malformed')
199
+ return { ...base, ...own, path: ownRoot };
200
+ if (parent.kind === 'unknown_version')
201
+ return { ...base, ...parent, path: parentRoot };
202
+ if (parent.kind === 'malformed')
203
+ return { ...base, ...parent, path: parentRoot };
204
+ if (own.kind === 'ok' && parent.kind === 'ok') {
205
+ return {
206
+ ...base,
207
+ kind: 'conflict',
208
+ rootIdentity: parent.identity,
209
+ nestedIdentity: own.identity,
210
+ };
211
+ }
212
+ if (own.kind === 'ok') {
213
+ return { ...withBase(repository, ownRoot, nested), kind: 'ok', identity: own.identity };
214
+ }
215
+ if (!options.allowNestedInherit) {
216
+ return {
217
+ ...base,
218
+ kind: 'nested',
219
+ ...(parent.kind === 'ok' ? { parentIdentity: parent.identity } : {}),
220
+ };
221
+ }
222
+ if (parent.kind === 'ok')
223
+ return { ...base, kind: 'ok', identity: parent.identity };
224
+ return { ...base, kind: 'absent' };
225
+ }
226
+ //# sourceMappingURL=repositoryRoot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repositoryRoot.js","sourceRoot":"","sources":["../src/repositoryRoot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,102 @@
1
+ import { type Execute, type Signer } from './runtimeSigners.js';
2
+ export type HostArtifact = 'claude-code' | 'codex' | 'cursor' | 'grok';
3
+ export type Artifact = 'cli' | 'scanner' | HostArtifact;
4
+ export type Reason = 'digest_mismatch' | 'manifest_missing' | 'unsigned' | 'permission' | 'acl_unavailable' | 'lock_held';
5
+ export declare class RuntimeError extends Error {
6
+ readonly reason: Reason;
7
+ constructor(reason: Reason);
8
+ }
9
+ export declare const hash: (bytes: Buffer | string) => string;
10
+ export declare function safePath(path: string): string;
11
+ export interface NpmReceipt {
12
+ name: string;
13
+ version: string;
14
+ integrity: string;
15
+ tarball: string;
16
+ tarballSha256: string;
17
+ }
18
+ export interface Manifest {
19
+ schemaVersion: 1;
20
+ artifact: Artifact;
21
+ version: string;
22
+ entry: string;
23
+ files: Record<string, {
24
+ sha256: string;
25
+ size: number;
26
+ executable: boolean;
27
+ }>;
28
+ totalSize: number;
29
+ source: {
30
+ kind: 'npm';
31
+ packages: NpmReceipt[];
32
+ launchedFrom: string;
33
+ } | {
34
+ kind: 'release';
35
+ url: string;
36
+ };
37
+ signer?: Signer;
38
+ signingStatus?: 'unsigned' | 'signed';
39
+ disclosureVersion?: string;
40
+ }
41
+ export interface RuntimeSource {
42
+ manifest: Manifest;
43
+ files: Record<string, Buffer>;
44
+ }
45
+ export interface Reference {
46
+ version: string;
47
+ manifestSha256: string;
48
+ }
49
+ interface Pointer {
50
+ current: Reference;
51
+ previous?: Reference;
52
+ }
53
+ export interface Verified {
54
+ directory: string;
55
+ manifest: Manifest;
56
+ entry: string;
57
+ reference: Reference;
58
+ }
59
+ export declare const missing: (e: unknown) => boolean;
60
+ export declare const versionName: (v: string) => string;
61
+ /** Only stdlib and the accepted bootstrap's signer adapter may load before verifyRuntime returns. */
62
+ export declare class RuntimeReader {
63
+ readonly run?: Execute | undefined;
64
+ readonly options: {
65
+ allowUnsigned?: boolean;
66
+ cacheDirectories?: boolean;
67
+ };
68
+ private readonly now;
69
+ readonly state: string;
70
+ private static readonly windowsSignatures;
71
+ private readonly windowsAudit;
72
+ private readonly windowsStats;
73
+ private readonly windowsDirectories;
74
+ private audits;
75
+ private readonly auditsInFlight;
76
+ private activeOperation;
77
+ private operations;
78
+ constructor(state: string, run?: Execute | undefined, options?: {
79
+ allowUnsigned?: boolean;
80
+ cacheDirectories?: boolean;
81
+ }, now?: () => number);
82
+ pointerPath(artifact: Artifact): string;
83
+ private guardedPath;
84
+ private auditRoot;
85
+ private traceAudit;
86
+ private invalidateAudit;
87
+ private audit;
88
+ private auditPending;
89
+ inspect(path: string, directory?: boolean, allowMissing?: boolean, replacing?: boolean): Promise<void>;
90
+ /** Call only after an owned atomic replacement: its parent ctime is our own write. */
91
+ recordReplacement(path: string): Promise<void>;
92
+ bytes(path: string): Promise<Buffer>;
93
+ /** An owned inheritable ACL update can change every cached descendant's ctime. */
94
+ protected recordAclWrite(path: string): Promise<void>;
95
+ protected pointer(artifact: Artifact): Promise<Pointer | undefined>;
96
+ private operation;
97
+ protected verifyAt(artifact: Artifact, ref: Reference, directory: string): Promise<Verified>;
98
+ private verifyOpen;
99
+ verifyRuntime(artifact: Artifact): Promise<Verified>;
100
+ }
101
+ export * from './runtimeSigners.js';
102
+ //# sourceMappingURL=runtimeReader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtimeReader.d.ts","sourceRoot":"","sources":["../src/runtimeReader.ts"],"names":[],"mappings":"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"}