@mnemonik/shared 7.97.2 → 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,25 @@
1
+ import type { RepositoryFingerprint } from './repositoryFingerprint.js';
2
+ export declare const isCanonicalUuid: (value: unknown) => value is string;
3
+ export interface ProjectIdentityFile {
4
+ schemaVersion: 1;
5
+ projectId: string;
6
+ projectName?: string;
7
+ repositoryFingerprint?: RepositoryFingerprint;
8
+ }
9
+ export type IdentityFileResult = {
10
+ kind: 'ok';
11
+ identity: ProjectIdentityFile;
12
+ } | {
13
+ kind: 'unknown_version';
14
+ version: unknown;
15
+ } | {
16
+ kind: 'malformed';
17
+ detail: string;
18
+ } | {
19
+ kind: 'absent';
20
+ };
21
+ export declare function parseIdentityFile(text: string): Exclude<IdentityFileResult, {
22
+ kind: 'absent';
23
+ }>;
24
+ export declare function readIdentityFile(dir: string): Promise<IdentityFileResult>;
25
+ //# sourceMappingURL=projectIdentityFile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectIdentityFile.d.ts","sourceRoot":"","sources":["../src/projectIdentityFile.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAGxE,eAAO,MAAM,eAAe,UAAW,OAAO,KAAG,KAAK,IAAI,MACD,CAAC;AAS1D,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,CAAC,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;CAC/C;AAED,MAAM,MAAM,kBAAkB,GAC1B;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,mBAAmB,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEvB,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,CA0D/F;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAW/E"}
@@ -0,0 +1,87 @@
1
+ import { lstat, readFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ const CANONICAL_UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;
4
+ export const isCanonicalUuid = (value) => typeof value === 'string' && CANONICAL_UUID.test(value);
5
+ const IDENTITY_KEYS = new Set([
6
+ 'schemaVersion',
7
+ 'projectId',
8
+ 'projectName',
9
+ 'repositoryFingerprint',
10
+ ]);
11
+ const FINGERPRINT_KEYS = new Set(['algorithmVersion', 'hash']);
12
+ export function parseIdentityFile(text) {
13
+ let value;
14
+ try {
15
+ value = JSON.parse(text);
16
+ }
17
+ catch (error) {
18
+ return { kind: 'malformed', detail: `unparseable JSON: ${error.message}` };
19
+ }
20
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
21
+ return { kind: 'malformed', detail: 'identity file must contain a JSON object' };
22
+ }
23
+ const record = value;
24
+ if (record.schemaVersion !== 1) {
25
+ return { kind: 'unknown_version', version: record.schemaVersion };
26
+ }
27
+ const unknownKey = Object.keys(record).find((key) => !IDENTITY_KEYS.has(key));
28
+ if (unknownKey)
29
+ return { kind: 'malformed', detail: `unknown key "${unknownKey}"` };
30
+ if (!isCanonicalUuid(record.projectId)) {
31
+ return { kind: 'malformed', detail: '"projectId" must be a canonical RFC 4122 UUID string' };
32
+ }
33
+ if ('projectName' in record && typeof record.projectName !== 'string') {
34
+ return { kind: 'malformed', detail: '"projectName" must be a string when present' };
35
+ }
36
+ if ('repositoryFingerprint' in record &&
37
+ (!record.repositoryFingerprint ||
38
+ typeof record.repositoryFingerprint !== 'object' ||
39
+ Array.isArray(record.repositoryFingerprint))) {
40
+ return { kind: 'malformed', detail: '"repositoryFingerprint" must be an object when present' };
41
+ }
42
+ const fingerprint = record.repositoryFingerprint;
43
+ const unknownFingerprintKey = fingerprint
44
+ ? Object.keys(fingerprint).find((key) => !FINGERPRINT_KEYS.has(key))
45
+ : undefined;
46
+ if (unknownFingerprintKey) {
47
+ return {
48
+ kind: 'malformed',
49
+ detail: `unknown repositoryFingerprint key "${unknownFingerprintKey}"`,
50
+ };
51
+ }
52
+ if (fingerprint && (fingerprint.algorithmVersion !== 1 || typeof fingerprint.hash !== 'string')) {
53
+ return {
54
+ kind: 'malformed',
55
+ detail: '"repositoryFingerprint" must contain algorithmVersion 1 and a string hash',
56
+ };
57
+ }
58
+ const repositoryFingerprint = fingerprint
59
+ ? { algorithmVersion: 1, hash: fingerprint.hash }
60
+ : undefined;
61
+ return {
62
+ kind: 'ok',
63
+ identity: {
64
+ schemaVersion: 1,
65
+ projectId: record.projectId,
66
+ ...(record.projectName === undefined ? {} : { projectName: record.projectName }),
67
+ ...(repositoryFingerprint ? { repositoryFingerprint } : {}),
68
+ },
69
+ };
70
+ }
71
+ export async function readIdentityFile(dir) {
72
+ const path = join(dir, '.mnemonik.json');
73
+ try {
74
+ const stat = await lstat(path);
75
+ if (stat.isSymbolicLink())
76
+ return { kind: 'malformed', detail: 'symlink' };
77
+ if (!stat.isFile())
78
+ return { kind: 'malformed', detail: 'identity path is not a regular file' };
79
+ return parseIdentityFile(await readFile(path, 'utf8'));
80
+ }
81
+ catch (error) {
82
+ if (error.code === 'ENOENT')
83
+ return { kind: 'absent' };
84
+ return { kind: 'malformed', detail: `cannot read identity file: ${error.message}` };
85
+ }
86
+ }
87
+ //# sourceMappingURL=projectIdentityFile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectIdentityFile.js","sourceRoot":"","sources":["../src/projectIdentityFile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export declare const PROJECT_SETUP_MANUAL = "Mnemonik project setup needs attention; ask the person to run `mnemonik project init` in this folder.";
2
+ export declare function projectSetupActions(value: unknown): string;
3
+ export interface ProjectSetupDiagnostic {
4
+ requestId?: string;
5
+ outcome: 'done' | 'ACTION_REQUIRED' | 'failed';
6
+ time: string;
7
+ rootHash: string | null;
8
+ action: string;
9
+ reason?: string;
10
+ }
11
+ /** Parse the native tool response, never tool arguments or agent-authored command fields. */
12
+ export declare function setupResponse(value: unknown): Record<string, unknown> | undefined;
13
+ export declare function handoffProjectSetup(input: {
14
+ response: unknown;
15
+ cwd: string | undefined;
16
+ host: 'claude_code' | 'cursor' | 'grok';
17
+ hostSessionId: string;
18
+ stateFile: string;
19
+ stateDir: string;
20
+ familyId: string | undefined;
21
+ }): Promise<string | undefined>;
22
+ /** Both doctor and status consume private per-session outcomes, scoped by root hash. */
23
+ export declare function pendingProjectSetup(root: string): Promise<ProjectSetupDiagnostic[]>;
24
+ //# sourceMappingURL=projectSetupHandoff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectSetupHandoff.d.ts","sourceRoot":"","sources":["../src/projectSetupHandoff.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,oBAAoB,0GACwE,CAAC;AAK1G,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE1D;AACD,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,iBAAiB,GAAG,QAAQ,CAAC;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAGD,6FAA6F;AAC7F,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAkCjF;AA8CD,wBAAsB,mBAAmB,CAAC,KAAK,EAAE;IAC/C,QAAQ,EAAE,OAAO,CAAC;IAClB,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,IAAI,EAAE,aAAa,GAAG,QAAQ,GAAG,MAAM,CAAC;IACxC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAuH9B;AAED,wFAAwF;AACxF,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAmCzF"}
@@ -0,0 +1,249 @@
1
+ import { protectWindowsDirectory } from './runtimeSigners.js';
2
+ import { execFile } from 'node:child_process';
3
+ import { constants } from 'node:fs';
4
+ import { lstat, mkdir, open, readdir, realpath, rename, rm } from 'node:fs/promises';
5
+ import { tmpdir } from 'node:os';
6
+ import { dirname, join, relative } from 'node:path';
7
+ import { randomUUID } from 'node:crypto';
8
+ import { RuntimeReader, hash } from './runtimeReader.js';
9
+ export const PROJECT_SETUP_MANUAL = 'Mnemonik project setup needs attention; ask the person to run `mnemonik project init` in this folder.';
10
+ const words = (value) => typeof value === 'string' && /^[a-z][a-z0-9_]{0,79}$/.test(value)
11
+ ? value.replaceAll('_', ' ')
12
+ : 'needs attention';
13
+ export function projectSetupActions(value) {
14
+ return Array.isArray(value) ? value.slice(0, 20).map(words).join(', ') : 'retry, cancel';
15
+ }
16
+ const record = (value) => !!value && typeof value === 'object' && !Array.isArray(value);
17
+ /** Parse the native tool response, never tool arguments or agent-authored command fields. */
18
+ export function setupResponse(value) {
19
+ if (typeof value === 'string') {
20
+ if (value.length > 64 * 1024)
21
+ return;
22
+ try {
23
+ value = JSON.parse(value);
24
+ }
25
+ catch {
26
+ return;
27
+ }
28
+ }
29
+ if (!record(value))
30
+ return;
31
+ if (record(value.structuredContent))
32
+ value = value.structuredContent;
33
+ else {
34
+ // Claude supplies the server's tool_response directly, not model-authored text.
35
+ // Accept only the server envelope; no command/path extensions cross this boundary.
36
+ const keys = ['status', 'state', 'allowedActions', 'requestId', 'expiresAt'];
37
+ const envelope = value;
38
+ if (!keys.every((key) => Object.hasOwn(envelope, key)) ||
39
+ Object.keys(value).some((key) => ![...keys, 'manualAction'].includes(key)) ||
40
+ typeof value.state !== 'string' ||
41
+ !Array.isArray(value.allowedActions) ||
42
+ !value.allowedActions.every((action) => typeof action === 'string') ||
43
+ typeof value.requestId !== 'string' ||
44
+ !/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value.requestId) ||
45
+ typeof value.expiresAt !== 'string' ||
46
+ !Number.isFinite(Date.parse(value.expiresAt)) ||
47
+ (Object.hasOwn(value, 'manualAction') && typeof value.manualAction !== 'string'))
48
+ return;
49
+ }
50
+ if (record(value) && value.status === 'project_setup_required')
51
+ return value;
52
+ return;
53
+ }
54
+ async function privateDirectory(path, session) {
55
+ const created = await mkdir(path, { recursive: true, mode: 0o700 });
56
+ const st = await lstat(path);
57
+ if (!st.isDirectory() ||
58
+ st.isSymbolicLink() ||
59
+ (process.getuid && (st.uid !== process.getuid() || st.mode & 0o077)))
60
+ throw new Error('diagnostic_unavailable');
61
+ if (process.platform === 'win32') {
62
+ await protectWindowsDirectory(path, created !== undefined, undefined, session);
63
+ }
64
+ }
65
+ async function readPrivate(path) {
66
+ const file = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);
67
+ try {
68
+ const st = await file.stat();
69
+ if (!st.isFile() ||
70
+ st.size > 64 * 1024 ||
71
+ (process.getuid && (st.uid !== process.getuid() || st.mode & 0o077)))
72
+ throw new Error('diagnostic_unavailable');
73
+ return await file.readFile('utf8');
74
+ }
75
+ finally {
76
+ await file.close();
77
+ }
78
+ }
79
+ async function writeDiagnostic(path, value) {
80
+ await privateDirectory(dirname(dirname(path)), dirname(path));
81
+ await privateDirectory(dirname(path), dirname(path));
82
+ const temp = `${path}.${randomUUID()}`;
83
+ try {
84
+ const file = await open(temp, 'wx', 0o600);
85
+ try {
86
+ await file.writeFile(JSON.stringify(value) + '\n');
87
+ }
88
+ finally {
89
+ await file.close();
90
+ }
91
+ await rename(temp, path);
92
+ }
93
+ finally {
94
+ await rm(temp, { force: true });
95
+ }
96
+ }
97
+ export async function handoffProjectSetup(input) {
98
+ const response = setupResponse(input.response);
99
+ if (!response)
100
+ return;
101
+ let root;
102
+ let action = PROJECT_SETUP_MANUAL;
103
+ let outcome = 'failed';
104
+ let reason = 'manual_setup_required';
105
+ const requestId = typeof response.requestId === 'string' && response.requestId.length <= 4096
106
+ ? response.requestId
107
+ : undefined;
108
+ try {
109
+ if (!input.cwd)
110
+ throw new Error('safe_cwd_unavailable');
111
+ // The binding receipt is private local state. No path from the response is read.
112
+ const cache = JSON.parse(await readPrivate(join(dirname(input.stateFile), 'bound-context.json')));
113
+ const [, family, body] = JSON.parse(cache.key);
114
+ if (!input.familyId ||
115
+ family !== input.familyId ||
116
+ body.host !== input.host ||
117
+ body.hostSessionId !== input.hostSessionId ||
118
+ cache.expiresAt <= Date.now() ||
119
+ !cache.canonicalRoot)
120
+ throw new Error('bound_context_unavailable');
121
+ root = await realpath(cache.canonicalRoot);
122
+ const { findProjectIdentityDetailed } = await import('./hookRuntime.js');
123
+ const identity = await findProjectIdentityDetailed(await realpath(input.cwd));
124
+ if (identity.kind === 'git_unavailable' || root !== (await realpath(identity.root)))
125
+ throw new Error('bound_root_changed');
126
+ if (!requestId)
127
+ throw new Error('manual_setup_required');
128
+ const runtime = await new RuntimeReader(input.stateDir).verifyRuntime('cli').catch(() => {
129
+ throw new Error('verified_cli_runtime_unavailable');
130
+ });
131
+ const bin = join(dirname(runtime.entry), 'bin.js');
132
+ if (!runtime.manifest.files[relative(runtime.directory, bin).replaceAll('\\', '/')])
133
+ throw new Error('verified_cli_bin_missing');
134
+ const result = await new Promise((resolve, reject) => {
135
+ const child = execFile(process.execPath, [bin, 'project', 'ensure', '--agent', '--json'], {
136
+ cwd: root,
137
+ shell: false,
138
+ timeout: 30_000,
139
+ killSignal: 'SIGKILL',
140
+ maxBuffer: 64 * 1024,
141
+ // Runtime injection variables and repository/PATH executables are not inherited.
142
+ env: Object.fromEntries([
143
+ 'HOME',
144
+ 'USERPROFILE',
145
+ 'LOCALAPPDATA',
146
+ 'XDG_STATE_HOME',
147
+ 'MNEMONIK_STATE_DIR',
148
+ 'MNEMONIK_SERVER',
149
+ 'MNEMONIK_API_RESOURCE',
150
+ 'MNEMONIK_OAUTH_ISSUER',
151
+ 'SYSTEMROOT',
152
+ 'TEMP',
153
+ 'TMP',
154
+ 'TMPDIR',
155
+ ].flatMap((key) => (process.env[key] === undefined ? [] : [[key, process.env[key]]]))),
156
+ }, (error, stdout) => {
157
+ if (error && (error.killed || error.code !== 3))
158
+ return reject(new Error('helper_failed'));
159
+ try {
160
+ resolve(JSON.parse(stdout));
161
+ }
162
+ catch {
163
+ reject(new Error('helper_invalid_json'));
164
+ }
165
+ });
166
+ child.stdin?.on('error', () => { });
167
+ child.stdin?.end(JSON.stringify({ requestId }));
168
+ });
169
+ if (!record(result))
170
+ throw new Error('helper_invalid_json');
171
+ if (result.status === 'done') {
172
+ outcome = 'done';
173
+ reason = 'complete';
174
+ action = 'Mnemonik project setup is complete; call session_bootstrap again.';
175
+ }
176
+ else if (['ACTION_REQUIRED', 'action_required', 'project_setup_required'].includes(String(result.status))) {
177
+ outcome = 'ACTION_REQUIRED';
178
+ reason = 'choice_required';
179
+ action =
180
+ result.action === 'mnemonik auth renew' ||
181
+ (Array.isArray(result.allowedActions) &&
182
+ result.allowedActions.includes('mnemonik auth renew'))
183
+ ? 'mnemonik auth renew'
184
+ : result.allowedActions
185
+ ? `Mnemonik project setup needs attention; allowed actions: ${projectSetupActions(result.allowedActions)}.`
186
+ : PROJECT_SETUP_MANUAL;
187
+ }
188
+ else
189
+ throw new Error('helper_invalid_json');
190
+ }
191
+ catch (error) {
192
+ const code = error instanceof Error ? error.message : '';
193
+ reason = /^[a-z_]+$/.test(code) ? code : 'helper_unavailable';
194
+ process.stderr.write(`mnemonik-hook: project setup ${reason}; manual action required\n`);
195
+ }
196
+ try {
197
+ await writeDiagnostic(input.stateFile, {
198
+ requestId,
199
+ outcome,
200
+ time: new Date().toISOString(),
201
+ rootHash: root ? hash(root) : input.cwd ? hash(await realpath(input.cwd)) : null,
202
+ action,
203
+ reason,
204
+ });
205
+ }
206
+ catch {
207
+ process.stderr.write('mnemonik-hook: project setup diagnostic unavailable\n');
208
+ }
209
+ return action;
210
+ }
211
+ /** Both doctor and status consume private per-session outcomes, scoped by root hash. */
212
+ export async function pendingProjectSetup(root) {
213
+ const rootHash = hash(await realpath(root));
214
+ const results = [];
215
+ const uid = process.getuid?.() ?? 'user';
216
+ for (const host of ['credit', 'cursor', 'grok']) {
217
+ const directory = join(tmpdir(), `mnemonik-${host}-${uid}`);
218
+ try {
219
+ const stat = await lstat(directory);
220
+ if (stat.isSymbolicLink() || !stat.isDirectory())
221
+ continue;
222
+ for (const name of await readdir(directory)) {
223
+ if (!/^[a-f0-9]{64}$/.test(name))
224
+ continue;
225
+ try {
226
+ if ((await lstat(join(directory, name))).isSymbolicLink())
227
+ continue;
228
+ const diagnostic = JSON.parse(await readPrivate(join(directory, name, 'project-setup.json')));
229
+ if ((diagnostic.rootHash === rootHash || diagnostic.rootHash === null) &&
230
+ ['done', 'ACTION_REQUIRED', 'failed'].includes(diagnostic.outcome) &&
231
+ typeof diagnostic.action === 'string' &&
232
+ diagnostic.action.length < 2000 &&
233
+ Date.now() - Date.parse(diagnostic.time) < 24 * 60 * 60 * 1000)
234
+ results.push(diagnostic);
235
+ }
236
+ catch {
237
+ /* An incomplete or removed session is not a pending action. */
238
+ }
239
+ }
240
+ }
241
+ catch {
242
+ /* Host has no local sessions. */
243
+ }
244
+ }
245
+ // A later completion supersedes stale actions from another session in this root.
246
+ results.sort((a, b) => Date.parse(b.time) - Date.parse(a.time));
247
+ return results[0]?.outcome === 'done' ? [] : results.slice(0, 1);
248
+ }
249
+ //# sourceMappingURL=projectSetupHandoff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectSetupHandoff.js","sourceRoot":"","sources":["../src/projectSetupHandoff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ type Platform = NodeJS.Platform;
2
+ /** Local state and credential locations that Mnemonik must never scan. */
3
+ export declare function protectedLocalPaths(platform?: Platform, env?: NodeJS.ProcessEnv, home?: string): string[];
4
+ /** True when candidate is the protected path itself or lies below it. */
5
+ export declare function isProtectedLocalPath(candidate: string, protectedPaths?: readonly string[], platform?: Platform): boolean;
6
+ /** Protected paths equal to or below root, for consent auto-exclusions. */
7
+ export declare function protectedPathsWithinRoot(root: string, protectedPaths?: readonly string[], platform?: Platform): string[];
8
+ export {};
9
+ //# sourceMappingURL=protectedPaths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protectedPaths.d.ts","sourceRoot":"","sources":["../src/protectedPaths.ts"],"names":[],"mappings":"AAGA,KAAK,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAMhC,0EAA0E;AAC1E,wBAAgB,mBAAmB,CACjC,QAAQ,GAAE,QAA2B,EACrC,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,IAAI,GAAE,MAAkB,GACvB,MAAM,EAAE,CAwCV;AAQD,yEAAyE;AACzE,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,cAAc,GAAE,SAAS,MAAM,EAA0B,EACzD,QAAQ,GAAE,QAA2B,GACpC,OAAO,CAWT;AAED,2EAA2E;AAC3E,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,EACZ,cAAc,GAAE,SAAS,MAAM,EAA0B,EACzD,QAAQ,GAAE,QAA2B,GACpC,MAAM,EAAE,CAEV"}
@@ -0,0 +1,66 @@
1
+ import { homedir } from 'node:os';
2
+ import { posix, win32 } from 'node:path';
3
+ function pathsFor(platform) {
4
+ return platform === 'win32' ? win32 : posix;
5
+ }
6
+ /** Local state and credential locations that Mnemonik must never scan. */
7
+ export function protectedLocalPaths(platform = process.platform, env = process.env, home = homedir()) {
8
+ const path = pathsFor(platform);
9
+ const localAppData = env.LOCALAPPDATA || win32.join(home, 'AppData', 'Local');
10
+ const appData = env.APPDATA || win32.join(home, 'AppData', 'Roaming');
11
+ const state = env.MNEMONIK_STATE_DIR ||
12
+ (platform === 'win32'
13
+ ? win32.join(localAppData, 'Mnemonik')
14
+ : platform === 'darwin'
15
+ ? posix.join(home, 'Library', 'Application Support', 'Mnemonik')
16
+ : posix.join(env.XDG_STATE_HOME || posix.join(home, '.local', 'state'), 'mnemonik'));
17
+ const common = [
18
+ state,
19
+ path.join(home, '.mnemonik'),
20
+ path.join(home, '.claude', '.credentials.json'),
21
+ path.join(home, '.codex', 'auth.json'),
22
+ path.join(home, '.cursor', 'mcp.json'),
23
+ path.join(home, '.grok', 'mcp_credentials.json'),
24
+ ];
25
+ const osPaths = platform === 'darwin'
26
+ ? [path.join(home, 'Library', 'Keychains')]
27
+ : platform === 'win32'
28
+ ? [
29
+ win32.join(appData, 'Microsoft', 'Credentials'),
30
+ win32.join(localAppData, 'Microsoft', 'Credentials'),
31
+ win32.join(appData, 'Microsoft', 'Protect'),
32
+ ]
33
+ : [
34
+ path.join(home, '.local', 'share', 'keyrings'),
35
+ path.join(home, '.gnupg'),
36
+ path.join(home, '.ssh'),
37
+ path.join(home, '.aws'),
38
+ path.join(home, '.config', 'gcloud'),
39
+ path.join(home, '.docker', 'config.json'),
40
+ path.join(home, '.npmrc'),
41
+ path.join(home, '.netrc'),
42
+ path.join(home, '.pypirc'),
43
+ ];
44
+ return [...new Set([...common, ...osPaths])];
45
+ }
46
+ function comparable(value, platform) {
47
+ const path = pathsFor(platform);
48
+ const normalized = path.resolve(value);
49
+ return platform === 'win32' || platform === 'darwin' ? normalized.toLowerCase() : normalized;
50
+ }
51
+ /** True when candidate is the protected path itself or lies below it. */
52
+ export function isProtectedLocalPath(candidate, protectedPaths = protectedLocalPaths(), platform = process.platform) {
53
+ const path = pathsFor(platform);
54
+ const target = comparable(candidate, platform);
55
+ return protectedPaths.some((protectedPath) => {
56
+ const parent = comparable(protectedPath, platform);
57
+ const relative = path.relative(parent, target);
58
+ return (relative === '' ||
59
+ (!relative.startsWith(`..${path.sep}`) && relative !== '..' && !path.isAbsolute(relative)));
60
+ });
61
+ }
62
+ /** Protected paths equal to or below root, for consent auto-exclusions. */
63
+ export function protectedPathsWithinRoot(root, protectedPaths = protectedLocalPaths(), platform = process.platform) {
64
+ return protectedPaths.filter((candidate) => isProtectedLocalPath(candidate, [root], platform));
65
+ }
66
+ //# sourceMappingURL=protectedPaths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protectedPaths.js","sourceRoot":"","sources":["../src/protectedPaths.ts"],"names":[],"mappings":"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"}