@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.
- package/dist/ambientPointer.d.ts.map +1 -1
- package/dist/ambientPointer.js +2 -1
- package/dist/ambientPointer.js.map +1 -1
- package/dist/apiOrigin.d.ts +3 -0
- package/dist/apiOrigin.d.ts.map +1 -0
- package/dist/apiOrigin.js +5 -0
- package/dist/apiOrigin.js.map +1 -0
- package/dist/ast/astChunker.d.ts +12 -12
- package/dist/ast/astChunker.js +32 -32
- package/dist/ast/grammars.d.ts +9 -9
- package/dist/ast/grammars.js +15 -15
- package/dist/codeScanner.d.ts +56 -43
- package/dist/codeScanner.d.ts.map +1 -1
- package/dist/codeScanner.js +262 -143
- package/dist/codeScanner.js.map +1 -1
- package/dist/contextBudget.js +2 -2
- package/dist/contextBudget.js.map +1 -1
- package/dist/gitEditDetector.d.ts +6 -6
- package/dist/gitEditDetector.js +7 -7
- package/dist/hookRuntime.d.ts +35 -2
- package/dist/hookRuntime.d.ts.map +1 -1
- package/dist/hookRuntime.js +127 -33
- package/dist/hookRuntime.js.map +1 -1
- package/dist/hookTimeouts.d.ts +6 -6
- package/dist/hookTimeouts.js +6 -6
- package/dist/hostAdapter.d.ts +135 -0
- package/dist/hostAdapter.d.ts.map +1 -0
- package/dist/hostAdapter.js +323 -0
- package/dist/hostAdapter.js.map +1 -0
- package/dist/hostBinary.d.ts +29 -0
- package/dist/hostBinary.d.ts.map +1 -0
- package/dist/hostBinary.js +179 -0
- package/dist/hostBinary.js.map +1 -0
- package/dist/index.d.ts +11 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/instructions.d.ts +26 -26
- package/dist/instructions.js +26 -26
- package/dist/jitDeliveryAck.d.ts.map +1 -1
- package/dist/jitDeliveryAck.js +2 -0
- package/dist/jitDeliveryAck.js.map +1 -1
- package/dist/projectIdentityFile.d.ts +25 -0
- package/dist/projectIdentityFile.d.ts.map +1 -0
- package/dist/projectIdentityFile.js +87 -0
- package/dist/projectIdentityFile.js.map +1 -0
- package/dist/projectSetupHandoff.d.ts +24 -0
- package/dist/projectSetupHandoff.d.ts.map +1 -0
- package/dist/projectSetupHandoff.js +249 -0
- package/dist/projectSetupHandoff.js.map +1 -0
- package/dist/protectedPaths.d.ts +9 -0
- package/dist/protectedPaths.d.ts.map +1 -0
- package/dist/protectedPaths.js +66 -0
- package/dist/protectedPaths.js.map +1 -0
- package/dist/readiness.d.ts +143 -0
- package/dist/readiness.d.ts.map +1 -0
- package/dist/readiness.js +304 -0
- package/dist/readiness.js.map +1 -0
- package/dist/repositoryFingerprint.d.ts +50 -0
- package/dist/repositoryFingerprint.d.ts.map +1 -0
- package/dist/repositoryFingerprint.js +160 -0
- package/dist/repositoryFingerprint.js.map +1 -0
- package/dist/repositoryRoot.d.ts +56 -0
- package/dist/repositoryRoot.d.ts.map +1 -0
- package/dist/repositoryRoot.js +226 -0
- package/dist/repositoryRoot.js.map +1 -0
- package/dist/runtimeReader.d.ts +102 -0
- package/dist/runtimeReader.d.ts.map +1 -0
- package/dist/runtimeReader.js +408 -0
- package/dist/runtimeReader.js.map +1 -0
- package/dist/runtimeSigners.d.ts +37 -0
- package/dist/runtimeSigners.d.ts.map +1 -0
- package/dist/runtimeSigners.js +507 -0
- package/dist/runtimeSigners.js.map +1 -0
- package/dist/scannerSupervisor.d.ts +35 -0
- package/dist/scannerSupervisor.d.ts.map +1 -0
- package/dist/scannerSupervisor.js +2 -0
- package/dist/scannerSupervisor.js.map +1 -0
- package/dist/secretPatterns.d.ts +9 -9
- package/dist/secretPatterns.d.ts.map +1 -1
- package/dist/secretPatterns.js +27 -25
- package/dist/secretPatterns.js.map +1 -1
- package/dist/testing/hostAdapterConformance.d.ts +17 -0
- package/dist/testing/hostAdapterConformance.d.ts.map +1 -0
- package/dist/testing/hostAdapterConformance.js +477 -0
- package/dist/testing/hostAdapterConformance.js.map +1 -0
- package/dist/usageGuide.d.ts +1 -1
- package/dist/usageGuide.d.ts.map +1 -1
- package/dist/usageGuide.js +4 -4
- package/package.json +7 -2
- package/queries/bash.tags.scm +1 -1
- package/queries/groovy.tags.scm +1 -1
- package/scripts/vendor-grammars.ts +13 -13
- package/src/ambientPointer.ts +2 -1
- package/src/apiOrigin.ts +4 -0
- package/src/ast/astChunker.ts +39 -39
- package/src/ast/grammars.ts +16 -16
- package/src/codeScanner.ts +274 -149
- package/src/contextBudget.ts +2 -2
- package/src/gitEditDetector.ts +7 -7
- package/src/hookRuntime.ts +162 -34
- package/src/hookTimeouts.ts +6 -6
- package/src/hostAdapter.ts +468 -0
- package/src/hostBinary.ts +205 -0
- package/src/index.ts +20 -0
- package/src/instructions.ts +26 -26
- package/src/jitDeliveryAck.ts +2 -0
- package/src/projectIdentityFile.ts +100 -0
- package/src/projectSetupHandoff.ts +275 -0
- package/src/protectedPaths.ts +88 -0
- package/src/readiness.ts +516 -0
- package/src/repositoryFingerprint.ts +199 -0
- package/src/repositoryRoot.ts +261 -0
- package/src/runtimeReader.ts +495 -0
- package/src/runtimeSigners.ts +577 -0
- package/src/scannerSupervisor.ts +26 -0
- package/src/secretPatterns.ts +27 -25
- package/src/testing/hostAdapterConformance.ts +538 -0
- package/src/usageGuide.ts +4 -4
- package/test-fixtures/identity/runner.d.mts +12 -0
- package/test-fixtures/identity/runner.mjs +282 -0
- package/tests/fixtures/repository-fingerprint-v1.golden.json +834 -0
- package/tests/projectIdentity.test.ts +56 -0
- package/tests/readiness.test.ts +158 -0
- package/tests/repositoryFingerprint.test.ts +26 -0
- package/tsconfig.test.json +9 -0
- package/wasm/bash.tags.scm +1 -1
- package/wasm/groovy.tags.scm +1 -1
- package/wasm/javascript.tags.scm +2 -2
- package/wasm/solidity.tags.scm +1 -1
package/dist/hookRuntime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hookRuntime.js","sourceRoot":"","sources":["../src/hookRuntime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"hookRuntime.js","sourceRoot":"","sources":["../src/hookRuntime.ts"],"names":[],"mappings":"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"}
|
package/dist/hookTimeouts.d.ts
CHANGED
|
@@ -6,11 +6,11 @@
|
|
|
6
6
|
* `@mnemonik/codex-hooks`, `@mnemonik/cursor-hooks`). Before the
|
|
7
7
|
* 2026-05-16 audit Finding #7 cross-cutting cleanup, each package
|
|
8
8
|
* declared its own copy of these constants and a near-identical
|
|
9
|
-
* `withTimeout` helper
|
|
9
|
+
* `withTimeout` helper - coordinating a budget change required three
|
|
10
10
|
* synchronised edits with no enforcement that the values matched.
|
|
11
11
|
*
|
|
12
12
|
* Surface is intentionally minimal: small constants + a single helper
|
|
13
|
-
* function. No fetch wrappers here
|
|
13
|
+
* function. No fetch wrappers here - request shaping stays per-package
|
|
14
14
|
* because each host expresses its hook payloads differently.
|
|
15
15
|
*/
|
|
16
16
|
/**
|
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
* The bootstrap digest is delivered over `injections`, so it rides this 2s
|
|
20
20
|
* budget. That is intentional and sufficient: on a warm cache
|
|
21
21
|
* (HooksDispatcher.buildBootstrapDigestPayload) delivery is a Redis GET plus
|
|
22
|
-
* render; on a cold cache the delivery path awaits buildColdFloorDigest
|
|
23
|
-
* parallel Promise.all of cheap DB reads raced under a 1500ms sub-budget
|
|
22
|
+
* render; on a cold cache the delivery path awaits buildColdFloorDigest - a
|
|
23
|
+
* parallel Promise.all of cheap DB reads raced under a 1500ms sub-budget -
|
|
24
24
|
* and may return an enriched floor digest. The static `session_bootstrap`
|
|
25
25
|
* directive is the fallback only when the floor is entirely empty (or the
|
|
26
26
|
* floor fetch times out). A full synthesis build is fired in the background
|
|
@@ -36,7 +36,7 @@ export declare const TELEMETRY_TIMEOUT_MS = 500;
|
|
|
36
36
|
export declare const POST_TOOL_TIMEOUT_MS = 1500;
|
|
37
37
|
/**
|
|
38
38
|
* beforeMCPExecution gate budget. This is the ONLY synchronous, user-facing
|
|
39
|
-
* gate
|
|
39
|
+
* gate - the user waits on it before every MCP tool call - so it fails open
|
|
40
40
|
* faster than the background critical fetch (FETCH_TIMEOUT_MS = 2000). A
|
|
41
41
|
* precheck slower than 1s is not worth blocking the tool call for; on a
|
|
42
42
|
* degraded server we drop the gate rather than stall the user.
|
|
@@ -45,7 +45,7 @@ export declare const MCP_PRECHECK_TIMEOUT_MS = 1000;
|
|
|
45
45
|
/**
|
|
46
46
|
* Spawn an `AbortController` tied to a timeout. Returns the signal plus a
|
|
47
47
|
* `cleanup` function the caller MUST invoke (in `finally`) to clear the
|
|
48
|
-
* timer when the request finishes naturally
|
|
48
|
+
* timer when the request finishes naturally - otherwise the timer leaks
|
|
49
49
|
* for the timeout duration.
|
|
50
50
|
*
|
|
51
51
|
* Identical signature to the inlined `withTimeout` that each hook package
|
package/dist/hookTimeouts.js
CHANGED
|
@@ -6,11 +6,11 @@
|
|
|
6
6
|
* `@mnemonik/codex-hooks`, `@mnemonik/cursor-hooks`). Before the
|
|
7
7
|
* 2026-05-16 audit Finding #7 cross-cutting cleanup, each package
|
|
8
8
|
* declared its own copy of these constants and a near-identical
|
|
9
|
-
* `withTimeout` helper
|
|
9
|
+
* `withTimeout` helper - coordinating a budget change required three
|
|
10
10
|
* synchronised edits with no enforcement that the values matched.
|
|
11
11
|
*
|
|
12
12
|
* Surface is intentionally minimal: small constants + a single helper
|
|
13
|
-
* function. No fetch wrappers here
|
|
13
|
+
* function. No fetch wrappers here - request shaping stays per-package
|
|
14
14
|
* because each host expresses its hook payloads differently.
|
|
15
15
|
*/
|
|
16
16
|
/**
|
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
* The bootstrap digest is delivered over `injections`, so it rides this 2s
|
|
20
20
|
* budget. That is intentional and sufficient: on a warm cache
|
|
21
21
|
* (HooksDispatcher.buildBootstrapDigestPayload) delivery is a Redis GET plus
|
|
22
|
-
* render; on a cold cache the delivery path awaits buildColdFloorDigest
|
|
23
|
-
* parallel Promise.all of cheap DB reads raced under a 1500ms sub-budget
|
|
22
|
+
* render; on a cold cache the delivery path awaits buildColdFloorDigest - a
|
|
23
|
+
* parallel Promise.all of cheap DB reads raced under a 1500ms sub-budget -
|
|
24
24
|
* and may return an enriched floor digest. The static `session_bootstrap`
|
|
25
25
|
* directive is the fallback only when the floor is entirely empty (or the
|
|
26
26
|
* floor fetch times out). A full synthesis build is fired in the background
|
|
@@ -36,7 +36,7 @@ export const TELEMETRY_TIMEOUT_MS = 500;
|
|
|
36
36
|
export const POST_TOOL_TIMEOUT_MS = 1500;
|
|
37
37
|
/**
|
|
38
38
|
* beforeMCPExecution gate budget. This is the ONLY synchronous, user-facing
|
|
39
|
-
* gate
|
|
39
|
+
* gate - the user waits on it before every MCP tool call - so it fails open
|
|
40
40
|
* faster than the background critical fetch (FETCH_TIMEOUT_MS = 2000). A
|
|
41
41
|
* precheck slower than 1s is not worth blocking the tool call for; on a
|
|
42
42
|
* degraded server we drop the gate rather than stall the user.
|
|
@@ -45,7 +45,7 @@ export const MCP_PRECHECK_TIMEOUT_MS = 1000;
|
|
|
45
45
|
/**
|
|
46
46
|
* Spawn an `AbortController` tied to a timeout. Returns the signal plus a
|
|
47
47
|
* `cleanup` function the caller MUST invoke (in `finally`) to clear the
|
|
48
|
-
* timer when the request finishes naturally
|
|
48
|
+
* timer when the request finishes naturally - otherwise the timer leaks
|
|
49
49
|
* for the timeout duration.
|
|
50
50
|
*
|
|
51
51
|
* Identical signature to the inlined `withTimeout` that each hook package
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { type WindowsBinary } from './hostBinary.js';
|
|
2
|
+
export type HostName = 'claude-code' | 'codex' | 'cursor' | 'grok' | 'vscode-copilot';
|
|
3
|
+
export interface Target {
|
|
4
|
+
component: 'hooks' | 'mcp';
|
|
5
|
+
scope: 'user' | 'project';
|
|
6
|
+
projectRoot?: string;
|
|
7
|
+
/** Absolute dispatcher path, already verified by the CLI runtime store. */
|
|
8
|
+
runtimeEntry: string;
|
|
9
|
+
/** CLI artifact directory containing current and versioned manifests. */
|
|
10
|
+
runtimeRoot: string;
|
|
11
|
+
/** Non-secret hook component family recorded by the CLI installer. */
|
|
12
|
+
credentialFamily: string;
|
|
13
|
+
/** Config paths known to have been absent before Mnemonik first wrote them. */
|
|
14
|
+
createdFiles?: string[];
|
|
15
|
+
/** Verified first-install config backups supplied by the ownership journal. */
|
|
16
|
+
originalFiles?: Record<string, Buffer | null>;
|
|
17
|
+
}
|
|
18
|
+
export interface FileChange {
|
|
19
|
+
path: string;
|
|
20
|
+
content: Buffer;
|
|
21
|
+
mode?: number;
|
|
22
|
+
remove?: true;
|
|
23
|
+
}
|
|
24
|
+
export interface AdapterWriter {
|
|
25
|
+
stage(change: FileChange): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
export interface Grant {
|
|
28
|
+
installationId?: string;
|
|
29
|
+
id: string;
|
|
30
|
+
account: string;
|
|
31
|
+
scopes: string[];
|
|
32
|
+
}
|
|
33
|
+
export interface Inspection {
|
|
34
|
+
resolvedPath?: string;
|
|
35
|
+
declarationPath?: string;
|
|
36
|
+
authenticatedTools: boolean;
|
|
37
|
+
grant?: Grant;
|
|
38
|
+
declarationPresent: boolean;
|
|
39
|
+
enableRequired?: boolean;
|
|
40
|
+
trustPending?: boolean;
|
|
41
|
+
trustDeclined?: boolean;
|
|
42
|
+
otherScopes?: {
|
|
43
|
+
scope: Target['scope'];
|
|
44
|
+
path: string;
|
|
45
|
+
}[];
|
|
46
|
+
}
|
|
47
|
+
export interface HostPlan {
|
|
48
|
+
changes: FileChange[];
|
|
49
|
+
staging: 'inactive' | 'additive';
|
|
50
|
+
requestedScope: string;
|
|
51
|
+
effectiveScope: string;
|
|
52
|
+
version: string;
|
|
53
|
+
artifactDigest: string;
|
|
54
|
+
}
|
|
55
|
+
export interface HostAdapter {
|
|
56
|
+
name: HostName;
|
|
57
|
+
detect(): Promise<{
|
|
58
|
+
supported: boolean;
|
|
59
|
+
version: string;
|
|
60
|
+
reason?: string;
|
|
61
|
+
resolvedPath?: string;
|
|
62
|
+
searchedLocations?: string[];
|
|
63
|
+
}>;
|
|
64
|
+
capabilities(): {
|
|
65
|
+
scopes: string[];
|
|
66
|
+
revoke: boolean;
|
|
67
|
+
components: Target['component'][];
|
|
68
|
+
nativeConnect: boolean;
|
|
69
|
+
nativeListing?: boolean;
|
|
70
|
+
};
|
|
71
|
+
inspect(target?: Target): Promise<Inspection>;
|
|
72
|
+
plan(target?: Target): Promise<HostPlan>;
|
|
73
|
+
install(writer: AdapterWriter, target: Target): Promise<void>;
|
|
74
|
+
update(writer: AdapterWriter, target: Target): Promise<void>;
|
|
75
|
+
repair(writer: AdapterWriter, target: Target): Promise<void>;
|
|
76
|
+
/** Always return the recovery instruction, including after a native action. */
|
|
77
|
+
launch(input?: {
|
|
78
|
+
signedIn: boolean;
|
|
79
|
+
}): Promise<string>;
|
|
80
|
+
/** Run the host's native MCP enable action once and return its recovery instruction. */
|
|
81
|
+
enable?(): Promise<string>;
|
|
82
|
+
verify(target?: Target): Promise<Inspection>;
|
|
83
|
+
uninstall(writer: AdapterWriter, target: Target): Promise<void>;
|
|
84
|
+
revoke?(grant: Grant): Promise<boolean>;
|
|
85
|
+
revokeAction: string;
|
|
86
|
+
}
|
|
87
|
+
export interface AdapterDependencies {
|
|
88
|
+
platform?: NodeJS.Platform;
|
|
89
|
+
binaryExists?: (file: string) => Promise<boolean>;
|
|
90
|
+
target?: Target;
|
|
91
|
+
env?: NodeJS.ProcessEnv;
|
|
92
|
+
/** Verified package provenance supplied by the CLI, never inferred from config. */
|
|
93
|
+
version?: string;
|
|
94
|
+
artifactDigest?: string;
|
|
95
|
+
execFile?: (file: string, args: string[], options: {
|
|
96
|
+
env: NodeJS.ProcessEnv;
|
|
97
|
+
cwd?: string;
|
|
98
|
+
timeout: number;
|
|
99
|
+
maxBuffer: number;
|
|
100
|
+
windowsHide: boolean;
|
|
101
|
+
windowsVerbatimArguments?: boolean;
|
|
102
|
+
}) => Promise<{
|
|
103
|
+
stdout: string;
|
|
104
|
+
stderr: string;
|
|
105
|
+
}>;
|
|
106
|
+
}
|
|
107
|
+
/** Common read/propose/stage lifecycle; the host's installer still owns its bytes. */
|
|
108
|
+
export declare function createFileHostAdapter(deps: AdapterDependencies, host: {
|
|
109
|
+
name: HostName;
|
|
110
|
+
binary: string;
|
|
111
|
+
windowsBinary: WindowsBinary;
|
|
112
|
+
vendorMatch: RegExp;
|
|
113
|
+
instruction: string;
|
|
114
|
+
signedInInstruction?: string;
|
|
115
|
+
mcp?: {
|
|
116
|
+
path(target: Target): string;
|
|
117
|
+
format: 'json' | 'toml';
|
|
118
|
+
type?: 'http';
|
|
119
|
+
};
|
|
120
|
+
nativeConnect?: boolean;
|
|
121
|
+
nativeListing?: boolean;
|
|
122
|
+
desktopPaths?: string[];
|
|
123
|
+
nativeEnable?: string[];
|
|
124
|
+
nativeLogout?: boolean;
|
|
125
|
+
revokeAction?: string;
|
|
126
|
+
path(target: Target): string;
|
|
127
|
+
present(target: Target): Promise<boolean>;
|
|
128
|
+
changes(target: Target, install: boolean): Promise<FileChange[]>;
|
|
129
|
+
classifyVersion?: (output: string) => {
|
|
130
|
+
supported: boolean;
|
|
131
|
+
version: string;
|
|
132
|
+
reason?: string;
|
|
133
|
+
};
|
|
134
|
+
}): HostAdapter;
|
|
135
|
+
//# sourceMappingURL=hostAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hostAdapter.d.ts","sourceRoot":"","sources":["../src/hostAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
import { createHostBinary, HostBinaryNotFoundError, quoteHostArgument, } from './hostBinary.js';
|
|
2
|
+
import { apiOrigin } from './apiOrigin.js';
|
|
3
|
+
import { execFile } from 'node:child_process';
|
|
4
|
+
import { readFile } from 'node:fs/promises';
|
|
5
|
+
import { isAbsolute } from 'node:path';
|
|
6
|
+
import { isDeepStrictEqual, promisify, stripVTControlCharacters } from 'node:util';
|
|
7
|
+
/** Common read/propose/stage lifecycle; the host's installer still owns its bytes. */
|
|
8
|
+
export function createFileHostAdapter(deps, host) {
|
|
9
|
+
const emptyConfiguration = (content) => {
|
|
10
|
+
if (!content.toString().trim())
|
|
11
|
+
return true;
|
|
12
|
+
try {
|
|
13
|
+
const config = JSON.parse(content.toString());
|
|
14
|
+
return Object.entries(config).every(([key, value]) => (['hooks', 'mcpServers'].includes(key) &&
|
|
15
|
+
!!value &&
|
|
16
|
+
typeof value === 'object' &&
|
|
17
|
+
!Array.isArray(value) &&
|
|
18
|
+
Object.keys(value).length === 0) ||
|
|
19
|
+
(key === 'version' && value === 1));
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
const run = deps.execFile ?? promisify(execFile);
|
|
26
|
+
const ownedTarget = deps.env?.MNEMONIK_CLI_OWNED_TARGET === '1';
|
|
27
|
+
const targetFor = (target = deps.target) => {
|
|
28
|
+
if (!target ||
|
|
29
|
+
!['hooks', 'mcp'].includes(target.component) ||
|
|
30
|
+
!['user', 'project'].includes(target.scope) ||
|
|
31
|
+
(target.component === 'hooks' && !isAbsolute(target.runtimeEntry)) ||
|
|
32
|
+
(target.component === 'hooks' && host.name === 'codex' && !isAbsolute(target.runtimeRoot)) ||
|
|
33
|
+
(target.scope === 'project' && (!target.projectRoot || !isAbsolute(target.projectRoot))))
|
|
34
|
+
throw new Error('invalid_target');
|
|
35
|
+
return target;
|
|
36
|
+
};
|
|
37
|
+
// Validate host configuration before any native command can run.
|
|
38
|
+
const nativeEnable = host.nativeEnable;
|
|
39
|
+
for (const argument of nativeEnable ?? [])
|
|
40
|
+
quoteHostArgument(argument);
|
|
41
|
+
const binary = createHostBinary(deps, host.binary, host.windowsBinary, run, host.desktopPaths);
|
|
42
|
+
let resolvedPath;
|
|
43
|
+
let detection;
|
|
44
|
+
const detect = () => (detection ??= (async () => {
|
|
45
|
+
try {
|
|
46
|
+
resolvedPath = await binary.resolve();
|
|
47
|
+
const result = await binary.execute(['--version']);
|
|
48
|
+
resolvedPath = await binary.resolve();
|
|
49
|
+
const output = stripVTControlCharacters(`${result.stdout}\n${result.stderr}`).trim();
|
|
50
|
+
const version = output.match(/\b\d+\.\d+\.\d+(?:-[\w.-]+)?\b/)?.[0] ?? '';
|
|
51
|
+
if (output && !host.vendorMatch.test(output))
|
|
52
|
+
return { supported: false, version, reason: 'wrong_vendor', resolvedPath };
|
|
53
|
+
if (host.classifyVersion)
|
|
54
|
+
return { ...host.classifyVersion(output), resolvedPath };
|
|
55
|
+
if (version)
|
|
56
|
+
return { supported: true, version, resolvedPath };
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
if (error instanceof HostBinaryNotFoundError) {
|
|
60
|
+
resolvedPath = undefined;
|
|
61
|
+
detection = undefined;
|
|
62
|
+
return {
|
|
63
|
+
supported: false,
|
|
64
|
+
version: '',
|
|
65
|
+
reason: 'not_found',
|
|
66
|
+
searchedLocations: error.searchedLocations,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/* Detection is read-only and otherwise fails closed. */
|
|
70
|
+
}
|
|
71
|
+
// Not cached: an absent or unreadable binary may be installed later in
|
|
72
|
+
// this process, and the next detect() must look again.
|
|
73
|
+
detection = undefined;
|
|
74
|
+
return {
|
|
75
|
+
supported: false,
|
|
76
|
+
version: '',
|
|
77
|
+
reason: 'unverified_version',
|
|
78
|
+
...(resolvedPath ? { resolvedPath } : {}),
|
|
79
|
+
};
|
|
80
|
+
})());
|
|
81
|
+
const execute = async (args, target) => {
|
|
82
|
+
const check = await detect();
|
|
83
|
+
if (!check.supported)
|
|
84
|
+
throw new Error(`${check.reason}: ${check.resolvedPath ?? host.binary}`);
|
|
85
|
+
return binary.execute(args, target?.projectRoot);
|
|
86
|
+
};
|
|
87
|
+
const path = (target) => target.component === 'mcp' && host.mcp ? host.mcp.path(target) : host.path(target);
|
|
88
|
+
const mcp = async (target, install) => {
|
|
89
|
+
if (!host.mcp)
|
|
90
|
+
throw new Error('unsupported_component');
|
|
91
|
+
const file = path(target);
|
|
92
|
+
const raw = await readFile(file, 'utf8').catch((error) => {
|
|
93
|
+
if (error.code === 'ENOENT')
|
|
94
|
+
return '';
|
|
95
|
+
throw error;
|
|
96
|
+
});
|
|
97
|
+
const url = `${apiOrigin(deps.env)}/mcp`;
|
|
98
|
+
let content;
|
|
99
|
+
if (host.mcp.format === 'json') {
|
|
100
|
+
const config = JSON.parse(raw || '{}');
|
|
101
|
+
if (!config ||
|
|
102
|
+
typeof config !== 'object' ||
|
|
103
|
+
Array.isArray(config) ||
|
|
104
|
+
(config.mcpServers !== undefined &&
|
|
105
|
+
(!config.mcpServers ||
|
|
106
|
+
typeof config.mcpServers !== 'object' ||
|
|
107
|
+
Array.isArray(config.mcpServers))))
|
|
108
|
+
throw new Error('invalid_mcp_config');
|
|
109
|
+
const servers = config.mcpServers ?? {};
|
|
110
|
+
const expected = { ...(host.mcp.type ? { type: host.mcp.type } : {}), url };
|
|
111
|
+
const current = servers.mnemonik;
|
|
112
|
+
const exact = !!current &&
|
|
113
|
+
typeof current === 'object' &&
|
|
114
|
+
!Array.isArray(current) &&
|
|
115
|
+
Object.keys(current).length === Object.keys(expected).length &&
|
|
116
|
+
Object.entries(expected).every(([key, value]) => current[key] === value);
|
|
117
|
+
if (install === undefined)
|
|
118
|
+
return exact ? [{ path: file, content: Buffer.from(raw) }] : [];
|
|
119
|
+
if (!install && !Object.hasOwn(servers, 'mnemonik'))
|
|
120
|
+
return [];
|
|
121
|
+
if (Object.hasOwn(servers, 'mnemonik') && !exact && !ownedTarget)
|
|
122
|
+
throw new Error('mcp_name_conflict');
|
|
123
|
+
if (install)
|
|
124
|
+
servers.mnemonik = expected;
|
|
125
|
+
else
|
|
126
|
+
delete servers.mnemonik;
|
|
127
|
+
config.mcpServers = servers;
|
|
128
|
+
content = JSON.stringify(config, null, 2) + '\n';
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
// Preserve unrelated TOML bytes. Refuse layouts whose table boundaries are ambiguous.
|
|
132
|
+
if (/'''|"""/.test(raw) ||
|
|
133
|
+
/^\s*(?:mcp_servers\s*=|mcp_servers\s*\.)/m.test(raw) ||
|
|
134
|
+
/=\s*\[[^\]\n]*$/m.test(raw))
|
|
135
|
+
throw new Error('unsupported_mcp_toml_layout');
|
|
136
|
+
if (/^\s*\[\s*["']?mcp_servers["']?\s*\]/m.test(raw) ||
|
|
137
|
+
/^\s*\[\[\s*["']?mcp_servers/m.test(raw))
|
|
138
|
+
throw new Error('unsupported_mcp_toml_layout');
|
|
139
|
+
const table = /^\s*\[\s*(?:mcp_servers|"mcp_servers"|'mcp_servers')\s*\.\s*(?:mnemonik|"mnemonik"|'mnemonik')(?:\s*\.[^\]]+)?\s*\]\s*(?:#.*)?$/;
|
|
140
|
+
let owned = false;
|
|
141
|
+
let found = false;
|
|
142
|
+
let connected = false;
|
|
143
|
+
const kept = [];
|
|
144
|
+
for (const line of raw.match(/[^\n]*\n|[^\n]+$/g) ?? []) {
|
|
145
|
+
const text = line.trimEnd();
|
|
146
|
+
if (/^\s*\[/.test(text))
|
|
147
|
+
owned = table.test(text);
|
|
148
|
+
if (owned) {
|
|
149
|
+
found = true;
|
|
150
|
+
connected ||= text.match(/^\s*url\s*=\s*["']([^"']+)["']\s*(?:#.*)?$/)?.[1] === url;
|
|
151
|
+
}
|
|
152
|
+
else
|
|
153
|
+
kept.push(line);
|
|
154
|
+
}
|
|
155
|
+
if (install === undefined)
|
|
156
|
+
return connected ? [{ path: file, content: Buffer.from(raw) }] : [];
|
|
157
|
+
if (!install && !found)
|
|
158
|
+
return [];
|
|
159
|
+
if (found && !connected && !ownedTarget)
|
|
160
|
+
throw new Error('mcp_name_conflict');
|
|
161
|
+
content = kept.join('');
|
|
162
|
+
if (install)
|
|
163
|
+
content += `${content && !content.endsWith('\n') ? '\n' : ''}[mcp_servers.mnemonik]\nurl = "${url}"\n`;
|
|
164
|
+
}
|
|
165
|
+
return [{ path: file, content: Buffer.from(content) }];
|
|
166
|
+
};
|
|
167
|
+
const present = async (target) => target.component === 'mcp' ? (await mcp(target)).length > 0 : host.present(target);
|
|
168
|
+
const changes = (target, install) => target.component === 'mcp' ? mcp(target, install) : host.changes(target, install);
|
|
169
|
+
const inspect = async (input) => {
|
|
170
|
+
const target = targetFor(input);
|
|
171
|
+
const other = { ...target, scope: target.scope === 'user' ? 'project' : 'user' };
|
|
172
|
+
const otherScopes = [];
|
|
173
|
+
if ((other.scope === 'user' || other.projectRoot) &&
|
|
174
|
+
path(other) !== path(target) &&
|
|
175
|
+
(await present(other)))
|
|
176
|
+
otherScopes.push({ scope: other.scope, path: path(other) });
|
|
177
|
+
let authenticatedTools = false;
|
|
178
|
+
if (target.component === 'mcp' && host.nativeListing !== false) {
|
|
179
|
+
try {
|
|
180
|
+
const { stdout } = await execute(['mcp', 'list'], target);
|
|
181
|
+
// Native listing corroborates authentication; the CLI separately proves the live account grant.
|
|
182
|
+
// No qualified listing currently prints a server grant/account: do not invent one.
|
|
183
|
+
const origin = apiOrigin(deps.env).replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
184
|
+
const connected = new RegExp(String.raw `^\s*mnemonik(?:\s*:|\s+)\s*(?:${origin}/mcp(?:\s+\(HTTP\))?\s*-\s*)?[✓✔√]?\s*Connected\s*$`, 'i');
|
|
185
|
+
const lines = stripVTControlCharacters(stdout).split(/\r?\n/);
|
|
186
|
+
authenticatedTools = lines.some((line) => connected.test(line));
|
|
187
|
+
if (host.name === 'codex') {
|
|
188
|
+
const oauth = new RegExp(String.raw `^\s*mnemonik\s+${origin}/mcp\s+-\s+enabled\s+OAuth\s*$`);
|
|
189
|
+
authenticatedTools ||= stripVTControlCharacters(stdout)
|
|
190
|
+
.split(/\r?\n/)
|
|
191
|
+
.some((line) => oauth.test(line));
|
|
192
|
+
}
|
|
193
|
+
if (host.name === 'grok' && !authenticatedTools) {
|
|
194
|
+
const { stdout: doctor } = await execute(['mcp', 'doctor', '--json'], target);
|
|
195
|
+
const result = JSON.parse(doctor);
|
|
196
|
+
authenticatedTools =
|
|
197
|
+
Array.isArray(result.servers) &&
|
|
198
|
+
result.servers.some((server) => server.name === 'mnemonik' &&
|
|
199
|
+
server.transport === 'http' &&
|
|
200
|
+
server.target === `${apiOrigin(deps.env)}/mcp` &&
|
|
201
|
+
server.healthy === true &&
|
|
202
|
+
Array.isArray(server.checks) &&
|
|
203
|
+
server.checks.some((check) => check.label === 'handshake OK' && check.passed === true));
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
/* Missing CLI, timeout or unqualified output leaves authentication unproven. */
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return {
|
|
211
|
+
resolvedPath: await binary.resolve().catch(() => undefined),
|
|
212
|
+
...(host.nativeListing === false ? { declarationPath: path(target) } : {}),
|
|
213
|
+
declarationPresent: await present(target),
|
|
214
|
+
authenticatedTools,
|
|
215
|
+
otherScopes,
|
|
216
|
+
};
|
|
217
|
+
};
|
|
218
|
+
const plan = async (input) => {
|
|
219
|
+
const target = targetFor(input);
|
|
220
|
+
return {
|
|
221
|
+
changes: await changes(target, true),
|
|
222
|
+
staging: 'inactive',
|
|
223
|
+
requestedScope: target.scope,
|
|
224
|
+
effectiveScope: target.scope,
|
|
225
|
+
version: deps.version ?? '',
|
|
226
|
+
artifactDigest: deps.artifactDigest ?? '',
|
|
227
|
+
};
|
|
228
|
+
};
|
|
229
|
+
const install = async (writer, target) => {
|
|
230
|
+
for (const change of (await plan(target)).changes)
|
|
231
|
+
await writer.stage(change);
|
|
232
|
+
};
|
|
233
|
+
const signedInInstruction = host.signedInInstruction ?? `${host.name} is already signed in to Mnemonik.`;
|
|
234
|
+
return {
|
|
235
|
+
name: host.name,
|
|
236
|
+
detect,
|
|
237
|
+
capabilities: () => ({
|
|
238
|
+
scopes: ['user', 'project'],
|
|
239
|
+
revoke: !!host.nativeLogout,
|
|
240
|
+
components: host.mcp ? ['hooks', 'mcp'] : ['hooks'],
|
|
241
|
+
nativeConnect: !!host.nativeConnect,
|
|
242
|
+
...(host.nativeListing === false ? { nativeListing: false } : {}),
|
|
243
|
+
}),
|
|
244
|
+
inspect,
|
|
245
|
+
plan,
|
|
246
|
+
install,
|
|
247
|
+
// Updating and repairing both replace owned entries through plan + install.
|
|
248
|
+
update: install,
|
|
249
|
+
repair: install,
|
|
250
|
+
launch: async ({ signedIn = false } = {}) => {
|
|
251
|
+
if (host.nativeConnect && !signedIn) {
|
|
252
|
+
try {
|
|
253
|
+
await execute(['mcp', 'login', 'mnemonik'], deps.target);
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
/* The recovery instruction remains usable when native login is unavailable. */
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return signedIn ? signedInInstruction : host.instruction;
|
|
260
|
+
},
|
|
261
|
+
...(nativeEnable
|
|
262
|
+
? {
|
|
263
|
+
enable: async () => {
|
|
264
|
+
try {
|
|
265
|
+
await execute(nativeEnable, deps.target);
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
/* The post-enable listing supplies the actionable result. */
|
|
269
|
+
}
|
|
270
|
+
return signedInInstruction;
|
|
271
|
+
},
|
|
272
|
+
}
|
|
273
|
+
: {}),
|
|
274
|
+
verify: inspect,
|
|
275
|
+
async uninstall(writer, target) {
|
|
276
|
+
const owned = targetFor(target);
|
|
277
|
+
for (const change of await changes(owned, false)) {
|
|
278
|
+
if (owned.originalFiles && Object.hasOwn(owned.originalFiles, change.path)) {
|
|
279
|
+
const original = owned.originalFiles[change.path];
|
|
280
|
+
if (change.path.endsWith('.json')) {
|
|
281
|
+
const before = JSON.parse(original
|
|
282
|
+
?.toString()
|
|
283
|
+
.replace(/^\uFEFF/, '')
|
|
284
|
+
.trim() || '{}');
|
|
285
|
+
const after = JSON.parse(change.content.toString());
|
|
286
|
+
for (const key of ['hooks', 'mcpServers'])
|
|
287
|
+
if (!Object.hasOwn(before, key) && after[key] && Object.keys(after[key]).length === 0)
|
|
288
|
+
delete after[key];
|
|
289
|
+
change.content =
|
|
290
|
+
original && isDeepStrictEqual(before, after)
|
|
291
|
+
? original
|
|
292
|
+
: Buffer.from(JSON.stringify(after, null, 2) + '\n');
|
|
293
|
+
}
|
|
294
|
+
else if (original &&
|
|
295
|
+
change.content.toString().trimEnd() === original.toString().trimEnd())
|
|
296
|
+
change.content = original;
|
|
297
|
+
}
|
|
298
|
+
await writer.stage({
|
|
299
|
+
...change,
|
|
300
|
+
...(owned.createdFiles?.includes(change.path) && emptyConfiguration(change.content)
|
|
301
|
+
? { remove: true }
|
|
302
|
+
: {}),
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
},
|
|
306
|
+
...(host.nativeLogout
|
|
307
|
+
? {
|
|
308
|
+
revoke: async () => {
|
|
309
|
+
try {
|
|
310
|
+
await execute(['mcp', 'logout', 'mnemonik'], deps.target);
|
|
311
|
+
return true;
|
|
312
|
+
}
|
|
313
|
+
catch {
|
|
314
|
+
return false;
|
|
315
|
+
}
|
|
316
|
+
},
|
|
317
|
+
}
|
|
318
|
+
: {}),
|
|
319
|
+
revokeAction: host.revokeAction ??
|
|
320
|
+
`Open ${host.name} connection settings and revoke the Mnemonik connection.`,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
//# sourceMappingURL=hostAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hostAdapter.js","sourceRoot":"","sources":["../src/hostAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { AdapterDependencies } from './hostAdapter.js';
|
|
2
|
+
export interface WindowsBinary {
|
|
3
|
+
locations: [environmentVariable: string, relativePath: string][];
|
|
4
|
+
extensions: string[];
|
|
5
|
+
productVersion?: boolean;
|
|
6
|
+
}
|
|
7
|
+
/** Native locations shared by preflight discovery and verified host adapters. */
|
|
8
|
+
export declare function hostBinaryDescriptor(host: 'claude-code' | 'codex' | 'cursor', deps?: Pick<AdapterDependencies, 'env' | 'platform'>): {
|
|
9
|
+
binary: string;
|
|
10
|
+
windowsBinary: WindowsBinary;
|
|
11
|
+
desktopPaths?: string[];
|
|
12
|
+
};
|
|
13
|
+
export declare class HostBinaryNotFoundError extends Error {
|
|
14
|
+
readonly searchedLocations: string[];
|
|
15
|
+
constructor(searchedLocations: string[]);
|
|
16
|
+
}
|
|
17
|
+
/** cmd parses shell syntax even with execFile's shell:false. Only fixed, safe arguments.
|
|
18
|
+
* Parentheses are ordinary inside a quoted token, and a profile path may carry
|
|
19
|
+
* them (`C:\\Users\\Jane (Admin)\\...`). */
|
|
20
|
+
export declare function quoteHostArgument(value: string): string;
|
|
21
|
+
export declare function createHostBinary(deps: AdapterDependencies, name: string, windows: WindowsBinary, run: NonNullable<AdapterDependencies['execFile']>, desktopPaths?: string[]): {
|
|
22
|
+
resolve: () => Promise<string>;
|
|
23
|
+
findOnDisk(): Promise<string | undefined>;
|
|
24
|
+
execute(args: string[], cwd?: string): Promise<{
|
|
25
|
+
stdout: string;
|
|
26
|
+
stderr: string;
|
|
27
|
+
}>;
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=hostBinary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hostBinary.d.ts","sourceRoot":"","sources":["../src/hostBinary.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,CAAC,mBAAmB,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,CAAC;IACjE,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,iFAAiF;AACjF,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,aAAa,GAAG,OAAO,GAAG,QAAQ,EACxC,IAAI,GAAE,IAAI,CAAC,mBAAmB,EAAE,KAAK,GAAG,UAAU,CAAM,GACvD;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,aAAa,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAgD3E;AAED,qBAAa,uBAAwB,SAAQ,KAAK;IACpC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,EAAE;IAAhD,YAAqB,iBAAiB,EAAE,MAAM,EAAE,EAE/C;CACF;AAED;;4CAE4C;AAC5C,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,mBAAmB,EACzB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,aAAa,EACtB,GAAG,EAAE,WAAW,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,EACjD,YAAY,GAAE,MAAM,EAAO;;kBAqDL,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;kBAuB3B,MAAM,EAAE,QAAQ,MAAM;;;;EA4C7C"}
|