@namzu/cli 0.2.3 → 0.4.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/cli.d.ts.map +1 -1
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/cli.test.js +1 -1
- package/dist/commands/__tests__/eval.test.d.ts +2 -0
- package/dist/commands/__tests__/eval.test.d.ts.map +1 -0
- package/dist/commands/__tests__/eval.test.js +165 -0
- package/dist/commands/__tests__/eval.test.js.map +1 -0
- package/dist/commands/__tests__/passthrough-help.test.d.ts +2 -0
- package/dist/commands/__tests__/passthrough-help.test.d.ts.map +1 -0
- package/dist/commands/__tests__/passthrough-help.test.js +96 -0
- package/dist/commands/__tests__/passthrough-help.test.js.map +1 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +5 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/doctor.test.js +4 -4
- package/dist/commands/doctor.test.js.map +1 -1
- package/dist/commands/eval.d.ts +54 -0
- package/dist/commands/eval.d.ts.map +1 -0
- package/dist/commands/eval.js +237 -0
- package/dist/commands/eval.js.map +1 -0
- package/dist/commands/registry.d.ts.map +1 -1
- package/dist/commands/registry.js +14 -4
- package/dist/commands/registry.js.map +1 -1
- package/dist/commands/run-stream.d.ts.map +1 -1
- package/dist/commands/run-stream.js +20 -0
- package/dist/commands/run-stream.js.map +1 -1
- package/dist/commands/run.d.ts +1 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +14 -1
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/tools.js +1 -1
- package/dist/commands/tools.js.map +1 -1
- package/dist/commands/types.d.ts +13 -0
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/doctor/checks/sandbox.d.ts +11 -1
- package/dist/doctor/checks/sandbox.d.ts.map +1 -1
- package/dist/doctor/checks/sandbox.js +68 -34
- package/dist/doctor/checks/sandbox.js.map +1 -1
- package/dist/doctor/checks/sandbox.test.d.ts +2 -0
- package/dist/doctor/checks/sandbox.test.d.ts.map +1 -0
- package/dist/doctor/checks/sandbox.test.js +59 -0
- package/dist/doctor/checks/sandbox.test.js.map +1 -0
- package/dist/exit-codes.d.ts +7 -1
- package/dist/exit-codes.d.ts.map +1 -1
- package/dist/exit-codes.js +6 -0
- package/dist/exit-codes.js.map +1 -1
- package/dist/integrations/clawtool/binary.test.js +9 -1
- package/dist/integrations/clawtool/binary.test.js.map +1 -1
- package/dist/integrations/clawtool/dispatch.d.ts +2 -2
- package/dist/integrations/clawtool/dispatch.js +4 -4
- package/dist/integrations/clawtool/dispatch.js.map +1 -1
- package/dist/integrations/clawtool/mcp.d.ts.map +1 -1
- package/dist/integrations/clawtool/mcp.js +20 -2
- package/dist/integrations/clawtool/mcp.js.map +1 -1
- package/dist/integrations/clawtool/tooling.d.ts +8 -6
- package/dist/integrations/clawtool/tooling.d.ts.map +1 -1
- package/dist/integrations/clawtool/tooling.js +8 -6
- package/dist/integrations/clawtool/tooling.js.map +1 -1
- package/dist/integrations/clipboard/image.d.ts +0 -1
- package/dist/integrations/clipboard/image.d.ts.map +1 -1
- package/dist/integrations/clipboard/image.js +0 -1
- package/dist/integrations/clipboard/image.js.map +1 -1
- package/dist/integrations/providers/discover.d.ts +1 -1
- package/dist/integrations/providers/discover.js +9 -9
- package/dist/integrations/providers/discover.js.map +1 -1
- package/dist/integrations/providers/index.d.ts +2 -2
- package/dist/integrations/providers/index.d.ts.map +1 -1
- package/dist/integrations/providers/index.js +2 -2
- package/dist/integrations/providers/index.js.map +1 -1
- package/dist/integrations/providers/keychain.d.ts +17 -16
- package/dist/integrations/providers/keychain.d.ts.map +1 -1
- package/dist/integrations/providers/keychain.js +19 -19
- package/dist/integrations/providers/keychain.js.map +1 -1
- package/dist/integrations/providers/oauth.d.ts +7 -8
- package/dist/integrations/providers/oauth.d.ts.map +1 -1
- package/dist/integrations/providers/oauth.js +13 -11
- package/dist/integrations/providers/oauth.js.map +1 -1
- package/dist/integrations/providers/oauth.test.js +8 -8
- package/dist/integrations/providers/oauth.test.js.map +1 -1
- package/dist/integrations/providers/preferences.test.js +9 -1
- package/dist/integrations/providers/preferences.test.js.map +1 -1
- package/dist/integrations/providers/registry.d.ts +2 -3
- package/dist/integrations/providers/registry.d.ts.map +1 -1
- package/dist/integrations/providers/registry.js +3 -4
- package/dist/integrations/providers/registry.js.map +1 -1
- package/dist/integrations/providers/store.d.ts +1 -1
- package/dist/integrations/providers/store.js +1 -1
- package/dist/integrations/providers/store.test.js +9 -1
- package/dist/integrations/providers/store.test.js.map +1 -1
- package/dist/integrations/trust/store.d.ts +2 -2
- package/dist/integrations/trust/store.js +2 -2
- package/dist/memory/store.d.ts +1 -1
- package/dist/memory/store.js +1 -1
- package/dist/output/rendered-payload.test.d.ts +2 -0
- package/dist/output/rendered-payload.test.d.ts.map +1 -0
- package/dist/output/rendered-payload.test.js +61 -0
- package/dist/output/rendered-payload.test.js.map +1 -0
- package/dist/output/text.js +14 -0
- package/dist/output/text.js.map +1 -1
- package/dist/tui/App.js +4 -2
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/Markdown.d.ts +2 -1
- package/dist/tui/Markdown.d.ts.map +1 -1
- package/dist/tui/Markdown.js +2 -1
- package/dist/tui/Markdown.js.map +1 -1
- package/dist/tui/Transcript.js +3 -2
- package/dist/tui/Transcript.js.map +1 -1
- package/dist/tui/TrustPrompt.d.ts +1 -1
- package/dist/tui/TrustPrompt.js +1 -1
- package/dist/tui/agent.d.ts +1 -1
- package/dist/tui/agent.d.ts.map +1 -1
- package/dist/tui/agent.js +46 -17
- package/dist/tui/agent.js.map +1 -1
- package/dist/tui/index.js +1 -1
- package/dist/tui/index.js.map +1 -1
- package/dist/tui/mentions.d.ts +2 -2
- package/dist/tui/mentions.js +2 -2
- package/dist/tui/theme.d.ts +4 -3
- package/dist/tui/theme.d.ts.map +1 -1
- package/dist/tui/theme.js +4 -3
- package/dist/tui/theme.js.map +1 -1
- package/package.json +7 -7
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { type DetectedProvider, type DetectionSource, type DiscoverOptions, discoverProviders, findDetected, } from './discover.js';
|
|
2
|
-
export { type
|
|
2
|
+
export { type AgentOAuthCredential, isAnthropicOAuthToken, readAgentKeychainCredential, } from './keychain.js';
|
|
3
3
|
export { maskSecret } from './mask.js';
|
|
4
|
-
export { ensureFreshAnthropicToken, type OAuthMetadata,
|
|
4
|
+
export { ensureFreshAnthropicToken, type OAuthMetadata, refreshAgentOAuthToken, } from './oauth.js';
|
|
5
5
|
export { type Preferences, PREFERENCES_FILE_VERSION, PreferencesError, preferencesPath, type ReadResult, readPreferences, writePreferences, } from './preferences.js';
|
|
6
6
|
export { ALL_PROVIDER_IDS, PROVIDER_REGISTRY, type ProviderId, type ProviderRegistryEntry, type SdkProviderType, } from './registry.js';
|
|
7
7
|
export { clawtoolSecretsPath, readClawtoolSecrets, type SecretCandidate } from './secrets.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,iBAAiB,EACjB,YAAY,GACZ,MAAM,eAAe,CAAA;AACtB,OAAO,EACN,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,iBAAiB,EACjB,YAAY,GACZ,MAAM,eAAe,CAAA;AACtB,OAAO,EACN,KAAK,oBAAoB,EACzB,qBAAqB,EACrB,2BAA2B,GAC3B,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,EACN,yBAAyB,EACzB,KAAK,aAAa,EAClB,sBAAsB,GACtB,MAAM,YAAY,CAAA;AACnB,OAAO,EACN,KAAK,WAAW,EAChB,wBAAwB,EACxB,gBAAgB,EAChB,eAAe,EACf,KAAK,UAAU,EACf,eAAe,EACf,gBAAgB,GAChB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACN,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,UAAU,EACf,KAAK,qBAAqB,EAC1B,KAAK,eAAe,GACpB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAA;AAG7F,OAAO,EACN,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,cAAc,EACd,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,sBAAsB,EACtB,sBAAsB,EACtB,iBAAiB,EACjB,cAAc,EACd,eAAe,GACf,MAAM,aAAa,CAAA;AACpB,OAAO,EACN,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,YAAY,EACZ,aAAa,EACb,aAAa,GACb,MAAM,YAAY,CAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { discoverProviders, findDetected, } from './discover.js';
|
|
2
|
-
export { isAnthropicOAuthToken,
|
|
2
|
+
export { isAnthropicOAuthToken, readAgentKeychainCredential, } from './keychain.js';
|
|
3
3
|
export { maskSecret } from './mask.js';
|
|
4
|
-
export { ensureFreshAnthropicToken,
|
|
4
|
+
export { ensureFreshAnthropicToken, refreshAgentOAuthToken, } from './oauth.js';
|
|
5
5
|
export { PREFERENCES_FILE_VERSION, PreferencesError, preferencesPath, readPreferences, writePreferences, } from './preferences.js';
|
|
6
6
|
export { ALL_PROVIDER_IDS, PROVIDER_REGISTRY, } from './registry.js';
|
|
7
7
|
export { clawtoolSecretsPath, readClawtoolSecrets } from './secrets.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/integrations/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAIN,iBAAiB,EACjB,YAAY,GACZ,MAAM,eAAe,CAAA;AACtB,OAAO,EAEN,qBAAqB,EACrB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/integrations/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAIN,iBAAiB,EACjB,YAAY,GACZ,MAAM,eAAe,CAAA;AACtB,OAAO,EAEN,qBAAqB,EACrB,2BAA2B,GAC3B,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,EACN,yBAAyB,EAEzB,sBAAsB,GACtB,MAAM,YAAY,CAAA;AACnB,OAAO,EAEN,wBAAwB,EACxB,gBAAgB,EAChB,eAAe,EAEf,eAAe,EACf,gBAAgB,GAChB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACN,gBAAgB,EAChB,iBAAiB,GAIjB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAwB,MAAM,cAAc,CAAA;AAC7F,uEAAuE;AACvE,uEAAuE;AACvE,OAAO,EASN,cAAc,EAId,sBAAsB,EACtB,sBAAsB,EACtB,iBAAiB,EACjB,cAAc,EACd,eAAe,GACf,MAAM,aAAa,CAAA;AACpB,OAAO,EACN,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,YAAY,EACZ,aAAa,EACb,aAAa,GACb,MAAM,YAAY,CAAA"}
|
|
@@ -1,31 +1,33 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* macOS Keychain reader for
|
|
2
|
+
* macOS Keychain reader for a co-installed agent CLI's OAuth credentials.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* under the generic-password service
|
|
6
|
-
*
|
|
4
|
+
* That CLI keeps its credentials in the macOS login Keychain rather than a
|
|
5
|
+
* flat file, under the generic-password service in {@link KEYCHAIN_SERVICE}
|
|
6
|
+
* below — the exact name is there, in one place, because it is the address
|
|
7
|
+
* of the data and an auditor has to be able to read it. The password value
|
|
8
|
+
* is a JSON envelope:
|
|
7
9
|
*
|
|
8
10
|
* { "claudeAiOauth": { "accessToken": "...", "refreshToken": "...",
|
|
9
11
|
* "expiresAt": ..., "scopes": [...] } }
|
|
10
12
|
*
|
|
11
|
-
*
|
|
12
|
-
* (`agent/anthropic_adapter.py:_read_claude_code_credentials_from_keychain`).
|
|
13
|
-
* Non-throwing — every failure (not-darwin, security not installed,
|
|
13
|
+
* * Non-throwing — every failure (not-darwin, security not installed,
|
|
14
14
|
* entry missing, payload malformed) returns `null` so discovery treats
|
|
15
15
|
* the source as "not available" rather than crashing.
|
|
16
16
|
*/
|
|
17
|
-
|
|
17
|
+
/** The generic-password service this reads. The address, verbatim. */
|
|
18
|
+
export declare const KEYCHAIN_SERVICE = "Claude Code-credentials";
|
|
19
|
+
export interface AgentOAuthCredential {
|
|
18
20
|
readonly accessToken: string;
|
|
19
21
|
readonly refreshToken?: string;
|
|
20
22
|
readonly expiresAt?: number;
|
|
21
23
|
readonly scopes?: readonly string[];
|
|
22
24
|
}
|
|
23
|
-
export declare function
|
|
25
|
+
export declare function readAgentKeychainCredential(): AgentOAuthCredential | null;
|
|
24
26
|
/**
|
|
25
27
|
* Persist a refreshed OAuth credential back into the same Keychain entry so
|
|
26
|
-
* the new access token survives across launches and
|
|
27
|
-
*
|
|
28
|
-
* change) so any extra keys
|
|
28
|
+
* the new access token survives across launches and the other CLI stays in
|
|
29
|
+
* sync. The full envelope is re-read and merged (only the OAuth sub-fields
|
|
30
|
+
* change) so any extra keys it stores are preserved. Non-throwing:
|
|
29
31
|
* returns `false` (not-darwin, no entry, missing account, write denied) and
|
|
30
32
|
* the caller falls back to using the refreshed token only in memory.
|
|
31
33
|
*
|
|
@@ -33,12 +35,11 @@ export declare function readClaudeCodeKeychainCredential(): ClaudeCodeOAuthCrede
|
|
|
33
35
|
* visible to `ps` — acceptable for a local dev CLI updating a credential that
|
|
34
36
|
* already lives on this machine.
|
|
35
37
|
*/
|
|
36
|
-
export declare function
|
|
38
|
+
export declare function writeAgentKeychainCredential(cred: AgentOAuthCredential): boolean;
|
|
37
39
|
/**
|
|
38
|
-
* Detect whether a credential value is an
|
|
40
|
+
* Detect whether a credential value is an OAuth-style token
|
|
39
41
|
* (must be sent via `Authorization: Bearer`) vs a console API key (sent
|
|
40
|
-
* via `x-api-key`).
|
|
41
|
-
* positively identifies by prefix; defaults to API-key when unsure.
|
|
42
|
+
* via `x-api-key`). Positively identifies by prefix; defaults to API-key when unsure.
|
|
42
43
|
*/
|
|
43
44
|
export declare function isAnthropicOAuthToken(value: string): boolean;
|
|
44
45
|
//# sourceMappingURL=keychain.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keychain.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/keychain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;
|
|
1
|
+
{"version":3,"file":"keychain.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/keychain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,sEAAsE;AACtE,eAAO,MAAM,gBAAgB,4BAA4B,CAAA;AAEzD,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACnC;AAED,wBAAgB,2BAA2B,IAAI,oBAAoB,GAAG,IAAI,CAmCzE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAiDhF;AAiBD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAM5D"}
|
|
@@ -1,23 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* macOS Keychain reader for
|
|
2
|
+
* macOS Keychain reader for a co-installed agent CLI's OAuth credentials.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* under the generic-password service
|
|
6
|
-
*
|
|
4
|
+
* That CLI keeps its credentials in the macOS login Keychain rather than a
|
|
5
|
+
* flat file, under the generic-password service in {@link KEYCHAIN_SERVICE}
|
|
6
|
+
* below — the exact name is there, in one place, because it is the address
|
|
7
|
+
* of the data and an auditor has to be able to read it. The password value
|
|
8
|
+
* is a JSON envelope:
|
|
7
9
|
*
|
|
8
10
|
* { "claudeAiOauth": { "accessToken": "...", "refreshToken": "...",
|
|
9
11
|
* "expiresAt": ..., "scopes": [...] } }
|
|
10
12
|
*
|
|
11
|
-
*
|
|
12
|
-
* (`agent/anthropic_adapter.py:_read_claude_code_credentials_from_keychain`).
|
|
13
|
-
* Non-throwing — every failure (not-darwin, security not installed,
|
|
13
|
+
* * Non-throwing — every failure (not-darwin, security not installed,
|
|
14
14
|
* entry missing, payload malformed) returns `null` so discovery treats
|
|
15
15
|
* the source as "not available" rather than crashing.
|
|
16
16
|
*/
|
|
17
17
|
import { execFileSync } from 'node:child_process';
|
|
18
18
|
import { platform } from 'node:os';
|
|
19
|
-
|
|
20
|
-
export
|
|
19
|
+
/** The generic-password service this reads. The address, verbatim. */
|
|
20
|
+
export const KEYCHAIN_SERVICE = 'Claude Code-credentials';
|
|
21
|
+
export function readAgentKeychainCredential() {
|
|
21
22
|
if (platform() !== 'darwin')
|
|
22
23
|
return null;
|
|
23
24
|
let raw;
|
|
@@ -60,9 +61,9 @@ export function readClaudeCodeKeychainCredential() {
|
|
|
60
61
|
}
|
|
61
62
|
/**
|
|
62
63
|
* Persist a refreshed OAuth credential back into the same Keychain entry so
|
|
63
|
-
* the new access token survives across launches and
|
|
64
|
-
*
|
|
65
|
-
* change) so any extra keys
|
|
64
|
+
* the new access token survives across launches and the other CLI stays in
|
|
65
|
+
* sync. The full envelope is re-read and merged (only the OAuth sub-fields
|
|
66
|
+
* change) so any extra keys it stores are preserved. Non-throwing:
|
|
66
67
|
* returns `false` (not-darwin, no entry, missing account, write denied) and
|
|
67
68
|
* the caller falls back to using the refreshed token only in memory.
|
|
68
69
|
*
|
|
@@ -70,7 +71,7 @@ export function readClaudeCodeKeychainCredential() {
|
|
|
70
71
|
* visible to `ps` — acceptable for a local dev CLI updating a credential that
|
|
71
72
|
* already lives on this machine.
|
|
72
73
|
*/
|
|
73
|
-
export function
|
|
74
|
+
export function writeAgentKeychainCredential(cred) {
|
|
74
75
|
if (platform() !== 'darwin')
|
|
75
76
|
return false;
|
|
76
77
|
// `add-generic-password -U` matches an existing item by service + account,
|
|
@@ -119,7 +120,7 @@ export function writeClaudeCodeKeychainCredential(cred) {
|
|
|
119
120
|
return false;
|
|
120
121
|
}
|
|
121
122
|
}
|
|
122
|
-
/** Read the account (`acct`) of the
|
|
123
|
+
/** Read the account (`acct`) of the Keychain entry, for updates. */
|
|
123
124
|
function readKeychainAccount() {
|
|
124
125
|
try {
|
|
125
126
|
const out = execFileSync('security', ['find-generic-password', '-s', KEYCHAIN_SERVICE], {
|
|
@@ -135,20 +136,19 @@ function readKeychainAccount() {
|
|
|
135
136
|
}
|
|
136
137
|
}
|
|
137
138
|
/**
|
|
138
|
-
* Detect whether a credential value is an
|
|
139
|
+
* Detect whether a credential value is an OAuth-style token
|
|
139
140
|
* (must be sent via `Authorization: Bearer`) vs a console API key (sent
|
|
140
|
-
* via `x-api-key`).
|
|
141
|
-
* positively identifies by prefix; defaults to API-key when unsure.
|
|
141
|
+
* via `x-api-key`). Positively identifies by prefix; defaults to API-key when unsure.
|
|
142
142
|
*/
|
|
143
143
|
export function isAnthropicOAuthToken(value) {
|
|
144
144
|
if (value.startsWith('sk-ant-api'))
|
|
145
145
|
return false; // console API key
|
|
146
146
|
if (value.startsWith('sk-ant-oat'))
|
|
147
|
-
return true; //
|
|
147
|
+
return true; // OAuth setup token
|
|
148
148
|
if (value.startsWith('eyJ'))
|
|
149
149
|
return true; // JWT
|
|
150
150
|
if (value.startsWith('cc-'))
|
|
151
|
-
return true; //
|
|
151
|
+
return true; // OAuth access token from the Keychain source
|
|
152
152
|
return false;
|
|
153
153
|
}
|
|
154
154
|
//# sourceMappingURL=keychain.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keychain.js","sourceRoot":"","sources":["../../../src/integrations/providers/keychain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAElC,MAAM,gBAAgB,GAAG,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"keychain.js","sourceRoot":"","sources":["../../../src/integrations/providers/keychain.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* OAuth token refresh for a discovered subscription credential.
|
|
3
3
|
*
|
|
4
4
|
* The access token discovered from the macOS Keychain (or a clawtool secret)
|
|
5
|
-
* is short-lived (~8h). When it lapses
|
|
6
|
-
* stream dies.
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* surfacing as an authentication error.
|
|
5
|
+
* is short-lived (~8h). When it lapses the provider answers 401 and the
|
|
6
|
+
* agent stream dies. Refreshing proactively against the public OAuth token
|
|
7
|
+
* endpoint, using the long-lived refresh token, renews a stale token before
|
|
8
|
+
* the session starts instead of surfacing it as an authentication error.
|
|
10
9
|
*
|
|
11
10
|
* Non-throwing: any failure (no refresh token, network down, endpoint error)
|
|
12
11
|
* returns the existing token unchanged — at worst the caller hits the same
|
|
13
12
|
* 401 it would have hit anyway, never a crash.
|
|
14
13
|
*/
|
|
15
|
-
import { type
|
|
14
|
+
import { type AgentOAuthCredential } from './keychain.js';
|
|
16
15
|
export interface OAuthMetadata {
|
|
17
16
|
readonly refreshToken?: string;
|
|
18
17
|
readonly expiresAt?: number;
|
|
@@ -24,5 +23,5 @@ export interface OAuthMetadata {
|
|
|
24
23
|
*/
|
|
25
24
|
export declare function ensureFreshAnthropicToken(accessToken: string, oauth: OAuthMetadata): Promise<string>;
|
|
26
25
|
/** Exchange a refresh token for a new credential, or `null` on any failure. */
|
|
27
|
-
export declare function
|
|
26
|
+
export declare function refreshAgentOAuthToken(refreshToken: string): Promise<AgentOAuthCredential | null>;
|
|
28
27
|
//# sourceMappingURL=oauth.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/oauth.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/oauth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,KAAK,oBAAoB,EAAgC,MAAM,eAAe,CAAA;AAYvF,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED;;;;GAIG;AACH,wBAAsB,yBAAyB,CAC9C,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,aAAa,GAClB,OAAO,CAAC,MAAM,CAAC,CASjB;AAED,+EAA+E;AAC/E,wBAAsB,sBAAsB,CAC3C,YAAY,EAAE,MAAM,GAClB,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CA2BtC"}
|
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* OAuth token refresh for a discovered subscription credential.
|
|
3
3
|
*
|
|
4
4
|
* The access token discovered from the macOS Keychain (or a clawtool secret)
|
|
5
|
-
* is short-lived (~8h). When it lapses
|
|
6
|
-
* stream dies.
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* surfacing as an authentication error.
|
|
5
|
+
* is short-lived (~8h). When it lapses the provider answers 401 and the
|
|
6
|
+
* agent stream dies. Refreshing proactively against the public OAuth token
|
|
7
|
+
* endpoint, using the long-lived refresh token, renews a stale token before
|
|
8
|
+
* the session starts instead of surfacing it as an authentication error.
|
|
10
9
|
*
|
|
11
10
|
* Non-throwing: any failure (no refresh token, network down, endpoint error)
|
|
12
11
|
* returns the existing token unchanged — at worst the caller hits the same
|
|
13
12
|
* 401 it would have hit anyway, never a crash.
|
|
14
13
|
*/
|
|
15
|
-
import {
|
|
16
|
-
/**
|
|
14
|
+
import { writeAgentKeychainCredential } from './keychain.js';
|
|
15
|
+
/**
|
|
16
|
+
* The public OAuth client id and token endpoint this credential was issued
|
|
17
|
+
* against. Addresses, verbatim — the refresh only succeeds against these.
|
|
18
|
+
*/
|
|
17
19
|
const CLIENT_ID = '9d1c250a-e61b-44d9-88ed-5944d1962f5e';
|
|
18
20
|
const TOKEN_URL = 'https://console.anthropic.com/v1/oauth/token';
|
|
19
21
|
/** Refresh a few seconds early so an about-to-expire token isn't used. */
|
|
@@ -29,14 +31,14 @@ export async function ensureFreshAnthropicToken(accessToken, oauth) {
|
|
|
29
31
|
return accessToken;
|
|
30
32
|
if (!oauth.refreshToken)
|
|
31
33
|
return accessToken;
|
|
32
|
-
const refreshed = await
|
|
34
|
+
const refreshed = await refreshAgentOAuthToken(oauth.refreshToken);
|
|
33
35
|
if (!refreshed)
|
|
34
36
|
return accessToken;
|
|
35
|
-
|
|
37
|
+
writeAgentKeychainCredential(refreshed);
|
|
36
38
|
return refreshed.accessToken;
|
|
37
39
|
}
|
|
38
40
|
/** Exchange a refresh token for a new credential, or `null` on any failure. */
|
|
39
|
-
export async function
|
|
41
|
+
export async function refreshAgentOAuthToken(refreshToken) {
|
|
40
42
|
try {
|
|
41
43
|
const res = await fetch(TOKEN_URL, {
|
|
42
44
|
method: 'POST',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../../src/integrations/providers/oauth.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../../src/integrations/providers/oauth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAA6B,4BAA4B,EAAE,MAAM,eAAe,CAAA;AAEvF;;;GAGG;AACH,MAAM,SAAS,GAAG,sCAAsC,CAAA;AACxD,MAAM,SAAS,GAAG,8CAA8C,CAAA;AAEhE,0EAA0E;AAC1E,MAAM,cAAc,GAAG,MAAM,CAAA;AAO7B;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC9C,WAAmB,EACnB,KAAoB;IAEpB,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,CAAA;IAC5F,IAAI,KAAK;QAAE,OAAO,WAAW,CAAA;IAC7B,IAAI,CAAC,KAAK,CAAC,YAAY;QAAE,OAAO,WAAW,CAAA;IAE3C,MAAM,SAAS,GAAG,MAAM,sBAAsB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;IAClE,IAAI,CAAC,SAAS;QAAE,OAAO,WAAW,CAAA;IAClC,4BAA4B,CAAC,SAAS,CAAC,CAAA;IACvC,OAAO,SAAS,CAAC,WAAW,CAAA;AAC7B,CAAC;AAED,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC3C,YAAoB;IAEpB,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;YAClC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACpB,UAAU,EAAE,eAAe;gBAC3B,aAAa,EAAE,YAAY;gBAC3B,SAAS,EAAE,SAAS;aACpB,CAAC;SACF,CAAC,CAAA;QACF,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,IAAI,CAAA;QACxB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAI7B,CAAA;QACD,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QACxF,OAAO;YACN,WAAW,EAAE,IAAI,CAAC,YAAY;YAC9B,YAAY,EAAE,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY;YACxF,SAAS,EACR,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS;SACvF,CAAA;IACF,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAA;IACZ,CAAC;AACF,CAAC"}
|
|
@@ -3,16 +3,16 @@ import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
|
3
3
|
// the real macOS Keychain (this suite can run on the developer's own machine).
|
|
4
4
|
vi.mock('./keychain.js', async (importOriginal) => {
|
|
5
5
|
const actual = await importOriginal();
|
|
6
|
-
return { ...actual,
|
|
6
|
+
return { ...actual, writeAgentKeychainCredential: vi.fn(() => false) };
|
|
7
7
|
});
|
|
8
|
-
import { ensureFreshAnthropicToken,
|
|
8
|
+
import { ensureFreshAnthropicToken, refreshAgentOAuthToken } from './oauth.js';
|
|
9
9
|
function mockFetch(impl) {
|
|
10
10
|
vi.stubGlobal('fetch', impl);
|
|
11
11
|
}
|
|
12
12
|
afterEach(() => {
|
|
13
13
|
vi.unstubAllGlobals();
|
|
14
14
|
});
|
|
15
|
-
describe('
|
|
15
|
+
describe('refreshAgentOAuthToken', () => {
|
|
16
16
|
it('exchanges the refresh token and maps the response', async () => {
|
|
17
17
|
mockFetch((async () => new Response(JSON.stringify({
|
|
18
18
|
access_token: 'cc-new-access',
|
|
@@ -20,30 +20,30 @@ describe('refreshClaudeCodeToken', () => {
|
|
|
20
20
|
expires_in: 3600,
|
|
21
21
|
}), { status: 200 })));
|
|
22
22
|
const before = Date.now();
|
|
23
|
-
const cred = await
|
|
23
|
+
const cred = await refreshAgentOAuthToken('rt-old');
|
|
24
24
|
expect(cred?.accessToken).toBe('cc-new-access');
|
|
25
25
|
expect(cred?.refreshToken).toBe('rt-new');
|
|
26
26
|
expect(cred?.expiresAt).toBeGreaterThanOrEqual(before + 3600 * 1000);
|
|
27
27
|
});
|
|
28
28
|
it('keeps the old refresh token when the response omits one', async () => {
|
|
29
29
|
mockFetch((async () => new Response(JSON.stringify({ access_token: 'cc-new' }), { status: 200 })));
|
|
30
|
-
const cred = await
|
|
30
|
+
const cred = await refreshAgentOAuthToken('rt-old');
|
|
31
31
|
expect(cred?.accessToken).toBe('cc-new');
|
|
32
32
|
expect(cred?.refreshToken).toBe('rt-old');
|
|
33
33
|
});
|
|
34
34
|
it('returns null on a non-2xx response', async () => {
|
|
35
35
|
mockFetch((async () => new Response('nope', { status: 401 })));
|
|
36
|
-
expect(await
|
|
36
|
+
expect(await refreshAgentOAuthToken('rt')).toBeNull();
|
|
37
37
|
});
|
|
38
38
|
it('returns null when fetch throws', async () => {
|
|
39
39
|
mockFetch((async () => {
|
|
40
40
|
throw new Error('network down');
|
|
41
41
|
}));
|
|
42
|
-
expect(await
|
|
42
|
+
expect(await refreshAgentOAuthToken('rt')).toBeNull();
|
|
43
43
|
});
|
|
44
44
|
it('returns null when the payload lacks an access token', async () => {
|
|
45
45
|
mockFetch((async () => new Response(JSON.stringify({ foo: 'bar' }), { status: 200 })));
|
|
46
|
-
expect(await
|
|
46
|
+
expect(await refreshAgentOAuthToken('rt')).toBeNull();
|
|
47
47
|
});
|
|
48
48
|
});
|
|
49
49
|
describe('ensureFreshAnthropicToken', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.test.js","sourceRoot":"","sources":["../../../src/integrations/providers/oauth.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE5D,+EAA+E;AAC/E,+EAA+E;AAC/E,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;IACjD,MAAM,MAAM,GAAG,MAAM,cAAc,EAAkC,CAAA;IACrE,OAAO,EAAE,GAAG,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"oauth.test.js","sourceRoot":"","sources":["../../../src/integrations/providers/oauth.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,14 @@ import { tmpdir } from 'node:os';
|
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
import { describe, expect, it } from 'vitest';
|
|
5
5
|
import { PreferencesError, preferencesPath, readPreferences, writePreferences, } from './preferences.js';
|
|
6
|
+
/**
|
|
7
|
+
* POSIX file modes do not exist on Windows: `chmod` is a no-op there and
|
|
8
|
+
* `fs.stat().mode` reports a fixed value, so these cases assert a
|
|
9
|
+
* permission the platform cannot enforce. Skipping keeps the suite
|
|
10
|
+
* meaningful on Windows instead of permanently red — the behavior itself
|
|
11
|
+
* is still covered on Linux and macOS, where it actually matters.
|
|
12
|
+
*/
|
|
13
|
+
const IS_WINDOWS = process.platform === 'win32';
|
|
6
14
|
function tmpHome() {
|
|
7
15
|
return mkdtempSync(join(tmpdir(), 'namzu-prefs-v2-'));
|
|
8
16
|
}
|
|
@@ -38,7 +46,7 @@ describe('readPreferences', () => {
|
|
|
38
46
|
});
|
|
39
47
|
});
|
|
40
48
|
describe('writePreferences', () => {
|
|
41
|
-
it('enforces mode 0600 on file and 0700 on dir', () => {
|
|
49
|
+
it.skipIf(IS_WINDOWS)('enforces mode 0600 on file and 0700 on dir', () => {
|
|
42
50
|
const home = tmpHome();
|
|
43
51
|
writePreferences({ version: 2, provider: 'openai' }, home);
|
|
44
52
|
const fileMode = statSync(preferencesPath(home)).mode & 0o777;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preferences.test.js","sourceRoot":"","sources":["../../../src/integrations/providers/preferences.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"preferences.test.js","sourceRoot":"","sources":["../../../src/integrations/providers/preferences.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,9 +2,8 @@
|
|
|
2
2
|
* Declarative LLM provider registry — the single source of truth that
|
|
3
3
|
* discovery, picker labeling, and runtime construction all derive from.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* here; nothing else in this layer needs to change.
|
|
5
|
+
* Adding a provider means adding one entry here; nothing else in this
|
|
6
|
+
* layer needs to change.
|
|
8
7
|
*/
|
|
9
8
|
export type ProviderId = 'anthropic' | 'openai' | 'openrouter' | 'ollama' | 'lmstudio' | 'bedrock' | 'http';
|
|
10
9
|
/** SDK type passed to `ProviderRegistry.create({type, ...})`. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/registry.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,UAAU,GACnB,WAAW,GACX,QAAQ,GACR,YAAY,GACZ,QAAQ,GACR,UAAU,GACV,SAAS,GACT,MAAM,CAAA;AAET,iEAAiE;AACjE,MAAM,MAAM,eAAe,GAAG,UAAU,CAAA;AAExC,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,uEAAuE;IACvE,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC,mEAAmE;IACnE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,mEAAmE;IACnE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,sEAAsE;IACtE,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;CAChC;AAED,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,qBAAqB,CAAC,CA8DjF,CAAA;AAED,eAAO,MAAM,gBAAgB,EAAE,SAAS,UAAU,EAQvC,CAAA"}
|
|
@@ -2,15 +2,14 @@
|
|
|
2
2
|
* Declarative LLM provider registry — the single source of truth that
|
|
3
3
|
* discovery, picker labeling, and runtime construction all derive from.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* here; nothing else in this layer needs to change.
|
|
5
|
+
* Adding a provider means adding one entry here; nothing else in this
|
|
6
|
+
* layer needs to change.
|
|
8
7
|
*/
|
|
9
8
|
export const PROVIDER_REGISTRY = Object.freeze({
|
|
10
9
|
anthropic: {
|
|
11
10
|
id: 'anthropic',
|
|
12
11
|
label: 'Anthropic (Claude)',
|
|
13
|
-
// Order
|
|
12
|
+
// Order: explicit anthropic key, then anthropic-token
|
|
14
13
|
// variant, then claude-code's OAuth env (often present when the user
|
|
15
14
|
// has claude-code installed).
|
|
16
15
|
envVars: ['ANTHROPIC_API_KEY', 'ANTHROPIC_TOKEN', 'CLAUDE_CODE_OAUTH_TOKEN'],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/integrations/providers/registry.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/integrations/providers/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgCH,MAAM,CAAC,MAAM,iBAAiB,GAAwD,MAAM,CAAC,MAAM,CAClG;IACC,SAAS,EAAE;QACV,EAAE,EAAE,WAAW;QACf,KAAK,EAAE,oBAAoB;QAC3B,sDAAsD;QACtD,qEAAqE;QACrE,8BAA8B;QAC9B,OAAO,EAAE,CAAC,mBAAmB,EAAE,iBAAiB,EAAE,yBAAyB,CAAC;QAC5E,YAAY,EAAE,iBAAiB;QAC/B,cAAc,EAAE,IAAI;KACpB;IACD,MAAM,EAAE;QACP,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,CAAC,gBAAgB,CAAC;QAC3B,YAAY,EAAE,QAAQ;QACtB,cAAc,EAAE,IAAI;KACpB;IACD,UAAU,EAAE;QACX,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,YAAY;QACnB,OAAO,EAAE,CAAC,oBAAoB,CAAC;QAC/B,cAAc,EAAE,8BAA8B;QAC9C,YAAY,EAAE,2BAA2B;QACzC,cAAc,EAAE,IAAI;KACpB;IACD,MAAM,EAAE;QACP,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,gBAAgB;QACvB,OAAO,EAAE,EAAE;QACX,cAAc,EAAE,wBAAwB;QACxC,QAAQ,EAAE,iCAAiC;QAC3C,YAAY,EAAE,UAAU;QACxB,cAAc,EAAE,KAAK;KACrB;IACD,QAAQ,EAAE;QACT,EAAE,EAAE,UAAU;QACd,KAAK,EAAE,mBAAmB;QAC1B,OAAO,EAAE,EAAE;QACX,cAAc,EAAE,0BAA0B;QAC1C,QAAQ,EAAE,iCAAiC;QAC3C,YAAY,EAAE,MAAM;QACpB,cAAc,EAAE,KAAK;KACrB;IACD,OAAO,EAAE;QACR,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,aAAa;QACpB,OAAO,EAAE,CAAC,mBAAmB,CAAC,EAAE,wCAAwC;QACxE,YAAY,EAAE,gCAAgC;QAC9C,cAAc,EAAE,IAAI;KACpB;IACD,IAAI,EAAE;QACL,EAAE,EAAE,MAAM;QACV,KAAK,EAAE,iCAAiC;QACxC,oEAAoE;QACpE,kDAAkD;QAClD,OAAO,EAAE,EAAE;QACX,YAAY,EAAE,QAAQ;QACtB,cAAc,EAAE,IAAI;KACpB;CACD,CACD,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAA0B,MAAM,CAAC,MAAM,CAAC;IACpE,WAAW;IACX,QAAQ;IACR,YAAY;IACZ,QAAQ;IACR,UAAU;IACV,SAAS;IACT,MAAM;CACG,CAAC,CAAA"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* - Writes are atomic: temp file + rename. Mode 0600 enforced on every write.
|
|
6
6
|
* - `resolveApiKey(profile, env)` cascades `NAMZU_<NAME>_API_KEY` (per-
|
|
7
7
|
* profile override) → per-type vendor default (`OPENAI_API_KEY` etc.)
|
|
8
|
-
* → profile.apiKey on-disk → null.
|
|
8
|
+
* → profile.apiKey on-disk → null.
|
|
9
9
|
* - Uniqueness invariants enforced on write: no duplicate `name`; at most
|
|
10
10
|
* one profile with `default: true`.
|
|
11
11
|
*/
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* - Writes are atomic: temp file + rename. Mode 0600 enforced on every write.
|
|
6
6
|
* - `resolveApiKey(profile, env)` cascades `NAMZU_<NAME>_API_KEY` (per-
|
|
7
7
|
* profile override) → per-type vendor default (`OPENAI_API_KEY` etc.)
|
|
8
|
-
* → profile.apiKey on-disk → null.
|
|
8
|
+
* → profile.apiKey on-disk → null.
|
|
9
9
|
* - Uniqueness invariants enforced on write: no duplicate `name`; at most
|
|
10
10
|
* one profile with `default: true`.
|
|
11
11
|
*/
|
|
@@ -3,6 +3,14 @@ import { tmpdir } from 'node:os';
|
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
import { describe, expect, it } from 'vitest';
|
|
5
5
|
import { ProvidersStoreError, assertInvariants, findDefault, providersPath, readProfiles, resolveApiKey, writeProfiles, } from './store.js';
|
|
6
|
+
/**
|
|
7
|
+
* POSIX file modes do not exist on Windows: `chmod` is a no-op there and
|
|
8
|
+
* `fs.stat().mode` reports a fixed value, so these cases assert a
|
|
9
|
+
* permission the platform cannot enforce. Skipping keeps the suite
|
|
10
|
+
* meaningful on Windows instead of permanently red — the behavior itself
|
|
11
|
+
* is still covered on Linux and macOS, where it actually matters.
|
|
12
|
+
*/
|
|
13
|
+
const IS_WINDOWS = process.platform === 'win32';
|
|
6
14
|
function tmpHome() {
|
|
7
15
|
return mkdtempSync(join(tmpdir(), 'namzu-providers-'));
|
|
8
16
|
}
|
|
@@ -41,7 +49,7 @@ describe('writeProfiles', () => {
|
|
|
41
49
|
writeProfiles([anthropic()], home);
|
|
42
50
|
expect(readProfiles(home)).toEqual([anthropic()]);
|
|
43
51
|
});
|
|
44
|
-
it('enforces mode 0600 on the file and 0700 on the directory', () => {
|
|
52
|
+
it.skipIf(IS_WINDOWS)('enforces mode 0600 on the file and 0700 on the directory', () => {
|
|
45
53
|
const home = tmpHome();
|
|
46
54
|
writeProfiles([anthropic()], home);
|
|
47
55
|
const fileStat = statSync(providersPath(home));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.test.js","sourceRoot":"","sources":["../../../src/integrations/providers/store.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACvF,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAG7C,OAAO,EACN,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,YAAY,EACZ,aAAa,EACb,aAAa,GACb,MAAM,YAAY,CAAA;AAEnB,SAAS,OAAO;IACf,OAAO,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAA;AACvD,CAAC;AAED,MAAM,SAAS,GAAG,CAAC,OAAkC,EAAE,EAAoB,EAAE,CAAC,CAAC;IAC9E,IAAI,EAAE,GAAG;IACT,IAAI,EAAE,WAAW;IACjB,MAAM,EAAE,iBAAiB;IACzB,GAAG,IAAI;CACP,CAAC,CAAA;AAEF,MAAM,MAAM,GAAG,CAAC,OAA+B,EAAE,EAAiB,EAAE,CAAC,CAAC;IACrE,IAAI,EAAE,GAAG;IACT,IAAI,EAAE,QAAQ;IACd,MAAM,EAAE,oBAAoB;IAC5B,GAAG,IAAI;CACP,CAAC,CAAA;AAEF,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACvD,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;QACtB,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;QAC/B,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,gBAAgB,CAAC,EAAE,YAAY,CAAC,CAAA;QACnE,MAAM,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAA;IAC9D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QAClC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;QACtB,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;QAC/B,aAAa,CACZ,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,gBAAgB,CAAC,EACtC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAC7C,CAAA;QACD,MAAM,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,qBAAqB,CAAC,CAAA;IACrE,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC7C,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;QACtB,aAAa,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;QAClC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;
|
|
1
|
+
{"version":3,"file":"store.test.js","sourceRoot":"","sources":["../../../src/integrations/providers/store.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACvF,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAG7C,OAAO,EACN,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,YAAY,EACZ,aAAa,EACb,aAAa,GACb,MAAM,YAAY,CAAA;AAEnB;;;;;;GAMG;AACH,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAA;AAE/C,SAAS,OAAO;IACf,OAAO,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAA;AACvD,CAAC;AAED,MAAM,SAAS,GAAG,CAAC,OAAkC,EAAE,EAAoB,EAAE,CAAC,CAAC;IAC9E,IAAI,EAAE,GAAG;IACT,IAAI,EAAE,WAAW;IACjB,MAAM,EAAE,iBAAiB;IACzB,GAAG,IAAI;CACP,CAAC,CAAA;AAEF,MAAM,MAAM,GAAG,CAAC,OAA+B,EAAE,EAAiB,EAAE,CAAC,CAAC;IACrE,IAAI,EAAE,GAAG;IACT,IAAI,EAAE,QAAQ;IACd,MAAM,EAAE,oBAAoB;IAC5B,GAAG,IAAI;CACP,CAAC,CAAA;AAEF,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACvD,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;QACtB,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;QAC/B,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,gBAAgB,CAAC,EAAE,YAAY,CAAC,CAAA;QACnE,MAAM,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAA;IAC9D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QAClC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;QACtB,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;QAC/B,aAAa,CACZ,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,gBAAgB,CAAC,EACtC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAC7C,CAAA;QACD,MAAM,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,qBAAqB,CAAC,CAAA;IACrE,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC7C,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;QACtB,aAAa,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;QAClC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,0DAA0D,EAAE,GAAG,EAAE;QACtF,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;QACtB,aAAa,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;QAClC,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAA;QAC9C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;QAC9C,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACzC,MAAM,CAAC,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC7D,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;QACtB,aAAa,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;QAClC,MAAM,GAAG,GAAG,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAA;QACzD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC9B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,YAAY,CAC9E,wBAAwB,CACxB,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,GAAG,EAAE,CACX,aAAa,CACZ,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EACpE,OAAO,EAAE,CACT,CACD,CAAC,YAAY,CAAC,aAAa,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACrF,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;QACtB,oEAAoE;QACpE,gEAAgE;QAChE,gEAAgE;QAChE,iEAAiE;QACjE,wCAAwC;QACxC,MAAM,CAAC,GAAG,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QACpC,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QACjC,MAAM,OAAO,CAAC,GAAG,CAAC;YACjB,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACtD,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;SACtD,CAAC,CAAA;QACF,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;QAChC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC5B,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;IAC7E,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,GAAqB,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,CAAA;QAC5D,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;IAC/D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,EAAE,EAAE,iBAAiB,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACrF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACpE,MAAM,CACL,aAAa,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE;YAC1C,iBAAiB,EAAE,UAAU;YAC7B,kBAAkB,EAAE,aAAa;SACjC,CAAC,CACF,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IACtB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACxE,MAAM,CACL,aAAa,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,oBAAoB,EAAE,YAAY,EAAE,CAAC,CACpF,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACrB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC3E,MAAM,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IACxE,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAChD,MAAM,IAAI,GAAG,CAAC,SAAS,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QACrD,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,WAAW,CAAC,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IACxD,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Trusted-folder store — `~/.namzu/trust.json`.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Trust gate: before namzu reads, runs commands in, or edits files in a
|
|
5
|
+
* directory, the user must trust it. Trusted directories
|
|
6
6
|
* are remembered here so the prompt only appears once per folder. A folder
|
|
7
7
|
* counts as trusted if it — or any ancestor — has been trusted, so
|
|
8
8
|
* trusting a repo root covers its subfolders.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Trusted-folder store — `~/.namzu/trust.json`.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Trust gate: before namzu reads, runs commands in, or edits files in a
|
|
5
|
+
* directory, the user must trust it. Trusted directories
|
|
6
6
|
* are remembered here so the prompt only appears once per folder. A folder
|
|
7
7
|
* counts as trusted if it — or any ancestor — has been trusted, so
|
|
8
8
|
* trusting a repo root covers its subfolders.
|
package/dist/memory/store.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Persistent memory under `~/.namzu/`
|
|
2
|
+
* Persistent memory under `~/.namzu/` as flat markdown.
|
|
3
3
|
*
|
|
4
4
|
* - `USER.md` — durable facts about the user (role, preferences).
|
|
5
5
|
* - `MEMORY.md` — durable facts/decisions the agent should carry across
|