@namzu/cli 32.0.0 → 33.0.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/CHANGELOG.md +44 -0
- package/dist/browser/commands.js +11 -7
- package/dist/browser/commands.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +21 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/archive.d.ts +4 -0
- package/dist/commands/archive.d.ts.map +1 -0
- package/dist/commands/archive.js +62 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/login.d.ts +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +33 -11
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/mcp-oauth-login.d.ts +19 -0
- package/dist/commands/mcp-oauth-login.d.ts.map +1 -0
- package/dist/commands/mcp-oauth-login.js +213 -0
- package/dist/commands/mcp-oauth-login.js.map +1 -0
- package/dist/commands/mcp.d.ts +3 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +288 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/skills.d.ts.map +1 -1
- package/dist/commands/skills.js +60 -5
- package/dist/commands/skills.js.map +1 -1
- package/dist/commands/types.d.ts +2 -0
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/commands/worktree.d.ts +6 -0
- package/dist/commands/worktree.d.ts.map +1 -0
- package/dist/commands/worktree.js +85 -0
- package/dist/commands/worktree.js.map +1 -0
- package/dist/config/user-config.d.ts +2 -0
- package/dist/config/user-config.d.ts.map +1 -1
- package/dist/config/user-config.js +76 -6
- package/dist/config/user-config.js.map +1 -1
- package/dist/doctor/checks/credentials.d.ts.map +1 -1
- package/dist/doctor/checks/credentials.js +2 -0
- package/dist/doctor/checks/credentials.js.map +1 -1
- package/dist/integrations/mcp/oauth-store.d.ts +40 -0
- package/dist/integrations/mcp/oauth-store.d.ts.map +1 -0
- package/dist/integrations/mcp/oauth-store.js +549 -0
- package/dist/integrations/mcp/oauth-store.js.map +1 -0
- package/dist/integrations/mcp/servers.d.ts.map +1 -1
- package/dist/integrations/mcp/servers.js +155 -2
- package/dist/integrations/mcp/servers.js.map +1 -1
- package/dist/integrations/mcp/user-config.d.ts +25 -0
- package/dist/integrations/mcp/user-config.d.ts.map +1 -0
- package/dist/integrations/mcp/user-config.js +92 -0
- package/dist/integrations/mcp/user-config.js.map +1 -0
- package/dist/integrations/providers/credential-store.d.ts +8 -0
- package/dist/integrations/providers/credential-store.d.ts.map +1 -1
- package/dist/integrations/providers/credential-store.js +111 -22
- package/dist/integrations/providers/credential-store.js.map +1 -1
- package/dist/integrations/providers/discover.d.ts +11 -5
- package/dist/integrations/providers/discover.d.ts.map +1 -1
- package/dist/integrations/providers/discover.js +26 -12
- package/dist/integrations/providers/discover.js.map +1 -1
- package/dist/integrations/providers/index.d.ts +1 -1
- package/dist/integrations/providers/index.d.ts.map +1 -1
- package/dist/integrations/providers/index.js +1 -1
- package/dist/integrations/providers/index.js.map +1 -1
- package/dist/integrations/sessions/store.d.ts +23 -5
- package/dist/integrations/sessions/store.d.ts.map +1 -1
- package/dist/integrations/sessions/store.js +164 -24
- package/dist/integrations/sessions/store.js.map +1 -1
- package/dist/integrations/subagents/runtime.d.ts +4 -2
- package/dist/integrations/subagents/runtime.d.ts.map +1 -1
- package/dist/integrations/subagents/runtime.js +62 -8
- package/dist/integrations/subagents/runtime.js.map +1 -1
- package/dist/integrations/subagents/worktree-driver.d.ts +17 -0
- package/dist/integrations/subagents/worktree-driver.d.ts.map +1 -0
- package/dist/integrations/subagents/worktree-driver.js +72 -0
- package/dist/integrations/subagents/worktree-driver.js.map +1 -0
- package/dist/integrations/worktrees/managed.d.ts +49 -0
- package/dist/integrations/worktrees/managed.d.ts.map +1 -0
- package/dist/integrations/worktrees/managed.js +231 -0
- package/dist/integrations/worktrees/managed.js.map +1 -0
- package/dist/schedule/fire/fire.d.ts.map +1 -1
- package/dist/schedule/fire/fire.js +5 -0
- package/dist/schedule/fire/fire.js.map +1 -1
- package/dist/skills/audit.d.ts +31 -0
- package/dist/skills/audit.d.ts.map +1 -0
- package/dist/skills/audit.js +75 -0
- package/dist/skills/audit.js.map +1 -0
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +245 -46
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/Picker.d.ts.map +1 -1
- package/dist/tui/Picker.js +18 -3
- package/dist/tui/Picker.js.map +1 -1
- package/dist/tui/ResumePicker.d.ts +2 -1
- package/dist/tui/ResumePicker.d.ts.map +1 -1
- package/dist/tui/ResumePicker.js +3 -3
- package/dist/tui/ResumePicker.js.map +1 -1
- package/dist/tui/agent.d.ts.map +1 -1
- package/dist/tui/agent.js +14 -5
- package/dist/tui/agent.js.map +1 -1
- package/dist/tui/browser-notices.d.ts.map +1 -1
- package/dist/tui/browser-notices.js +6 -1
- package/dist/tui/browser-notices.js.map +1 -1
- package/dist/tui/credential-entry.d.ts +4 -29
- package/dist/tui/credential-entry.d.ts.map +1 -1
- package/dist/tui/credential-entry.js +7 -29
- package/dist/tui/credential-entry.js.map +1 -1
- package/dist/tui/login-prompt.d.ts +3 -1
- package/dist/tui/login-prompt.d.ts.map +1 -1
- package/dist/tui/login-prompt.js +11 -0
- package/dist/tui/login-prompt.js.map +1 -1
- package/dist/tui/provider-list.d.ts.map +1 -1
- package/dist/tui/provider-list.js +3 -1
- package/dist/tui/provider-list.js.map +1 -1
- package/dist/tui/slashCommands.d.ts +10 -1
- package/dist/tui/slashCommands.d.ts.map +1 -1
- package/dist/tui/slashCommands.js +16 -3
- package/dist/tui/slashCommands.js.map +1 -1
- package/dist/tui/turn-interruption.d.ts.map +1 -1
- package/dist/tui/turn-interruption.js +4 -0
- package/dist/tui/turn-interruption.js.map +1 -1
- package/package.json +6 -5
package/dist/commands/skills.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { resolveTrustedProjectContext } from '../config/trusted-project-context.js';
|
|
2
2
|
import { EXIT_UNTRUSTED, EXIT_USAGE } from '../exit-codes.js';
|
|
3
3
|
import { decideHeadlessTrust } from '../permissions/headless-trust.js';
|
|
4
|
+
import { auditFileSkills } from '../skills/audit.js';
|
|
4
5
|
import { discoverSkillRoster, skillTierLabel } from '../skills/store.js';
|
|
5
6
|
import { terminalDisplayText } from '../tui/terminal-display.js';
|
|
6
7
|
import { resolveWorkingDirectory } from './exec-flags.js';
|
|
7
8
|
const HELP = [
|
|
8
|
-
'Usage: namzu skills [--cwd <path>] [--trust]',
|
|
9
|
+
'Usage: namzu skills [--cwd <path>] [--trust] [--audit [--context-window <tokens>]]',
|
|
9
10
|
'',
|
|
10
11
|
'List the skills available in a working directory: built-in, ~/.agents/skills,',
|
|
11
12
|
'~/.namzu/skills, ./skills, .agents/skills (checkout root down to the',
|
|
@@ -16,6 +17,8 @@ const HELP = [
|
|
|
16
17
|
'Options:',
|
|
17
18
|
' --cwd <path> Inspect this working directory instead of the current one',
|
|
18
19
|
' --trust Trust this directory for this invocation only',
|
|
20
|
+
' --audit Check which skills the model can load; fail on invalid skills',
|
|
21
|
+
' --context-window <tokens> With --audit, estimate manifest overflow for this model window',
|
|
19
22
|
].join('\n');
|
|
20
23
|
export const skillsCommand = {
|
|
21
24
|
name: 'skills',
|
|
@@ -41,6 +44,21 @@ export const skillsCommand = {
|
|
|
41
44
|
return EXIT_UNTRUSTED;
|
|
42
45
|
}
|
|
43
46
|
const ctx = resolveTrustedProjectContext(bootstrapCtx, trust.cwd);
|
|
47
|
+
if (flags.audit) {
|
|
48
|
+
const audit = await auditFileSkills({
|
|
49
|
+
cwd: trust.cwd,
|
|
50
|
+
...(ctx.config.skills ? { config: ctx.config.skills } : {}),
|
|
51
|
+
...(flags.contextWindowTokens === undefined
|
|
52
|
+
? {}
|
|
53
|
+
: { contextWindowTokens: flags.contextWindowTokens }),
|
|
54
|
+
});
|
|
55
|
+
ctx.formatter.print({
|
|
56
|
+
cwd: trust.cwd,
|
|
57
|
+
...audit,
|
|
58
|
+
text: renderSkillAudit(trust.cwd, audit),
|
|
59
|
+
});
|
|
60
|
+
return audit.invalid > 0 ? 1 : 0;
|
|
61
|
+
}
|
|
44
62
|
const skills = discoverSkillRoster({
|
|
45
63
|
cwd: trust.cwd,
|
|
46
64
|
...(ctx.config.skills ? { config: ctx.config.skills } : {}),
|
|
@@ -57,16 +75,32 @@ export const skillsCommand = {
|
|
|
57
75
|
function parseSkillsFlags(rawArgs) {
|
|
58
76
|
let cwd = null;
|
|
59
77
|
let trust = false;
|
|
78
|
+
let audit = false;
|
|
79
|
+
let contextWindowTokens;
|
|
60
80
|
for (let index = 0; index < rawArgs.length; index++) {
|
|
61
81
|
const arg = rawArgs[index];
|
|
62
82
|
if (arg === '--trust') {
|
|
63
83
|
trust = true;
|
|
64
84
|
continue;
|
|
65
85
|
}
|
|
86
|
+
if (arg === '--audit') {
|
|
87
|
+
audit = true;
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
if (arg === '--context-window') {
|
|
91
|
+
const value = rawArgs[index + 1];
|
|
92
|
+
const parsed = value === undefined ? Number.NaN : Number(value);
|
|
93
|
+
if (!Number.isSafeInteger(parsed) || parsed <= 0) {
|
|
94
|
+
return { cwd, trust, audit, error: '--context-window requires a positive token count' };
|
|
95
|
+
}
|
|
96
|
+
contextWindowTokens = parsed;
|
|
97
|
+
index++;
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
66
100
|
if (arg === '--cwd') {
|
|
67
101
|
const value = rawArgs[index + 1];
|
|
68
102
|
if (value === undefined || value.startsWith('--') || value.trim() === '') {
|
|
69
|
-
return { cwd, trust, error: '--cwd requires a directory path' };
|
|
103
|
+
return { cwd, trust, audit, error: '--cwd requires a directory path' };
|
|
70
104
|
}
|
|
71
105
|
cwd = value.trim();
|
|
72
106
|
index++;
|
|
@@ -75,13 +109,34 @@ function parseSkillsFlags(rawArgs) {
|
|
|
75
109
|
if (arg.startsWith('--cwd=')) {
|
|
76
110
|
const value = arg.slice('--cwd='.length).trim();
|
|
77
111
|
if (!value)
|
|
78
|
-
return { cwd, trust, error: '--cwd requires a directory path' };
|
|
112
|
+
return { cwd, trust, audit, error: '--cwd requires a directory path' };
|
|
79
113
|
cwd = value;
|
|
80
114
|
continue;
|
|
81
115
|
}
|
|
82
|
-
return { cwd, trust, error: `unknown skills option or argument: ${arg}` };
|
|
116
|
+
return { cwd, trust, audit, error: `unknown skills option or argument: ${arg}` };
|
|
117
|
+
}
|
|
118
|
+
if (contextWindowTokens !== undefined && !audit) {
|
|
119
|
+
return { cwd, trust, audit, error: '--context-window requires --audit' };
|
|
120
|
+
}
|
|
121
|
+
return { cwd, trust, audit, contextWindowTokens };
|
|
122
|
+
}
|
|
123
|
+
function renderSkillAudit(cwd, audit) {
|
|
124
|
+
const lines = [`Skill audit for ${oneLine(cwd)}:`];
|
|
125
|
+
for (const finding of audit.findings) {
|
|
126
|
+
const suffix = finding.manifestChars === undefined ? '' : ` · ${finding.manifestChars} chars`;
|
|
127
|
+
lines.push(` ${oneLine(finding.name)}: ${finding.status}${suffix}`);
|
|
128
|
+
if (finding.reason)
|
|
129
|
+
lines.push(` ${oneLine(finding.reason)}`);
|
|
130
|
+
}
|
|
131
|
+
lines.push(` ready: ${audit.ready} operator-only: ${audit.operatorOnly} disabled: ${audit.disabled} invalid: ${audit.invalid}`);
|
|
132
|
+
lines.push(` file-skill manifest: ${audit.manifestChars} potential chars`);
|
|
133
|
+
if (audit.manifestBudgetChars !== undefined) {
|
|
134
|
+
lines.push(` budget for selected window: ${audit.manifestBudgetChars} chars`);
|
|
135
|
+
if (audit.overflow.length > 0)
|
|
136
|
+
lines.push(` overflow: ${audit.overflow.map(oneLine).join(', ')}`);
|
|
83
137
|
}
|
|
84
|
-
|
|
138
|
+
lines.push(' Tool gating and plugin skills depend on the session and are not included.');
|
|
139
|
+
return lines.join('\n');
|
|
85
140
|
}
|
|
86
141
|
function toListItem(skill) {
|
|
87
142
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,sCAAsC,CAAA;AACnF,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAA;AACtE,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAExE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/types.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ import type { Formatter } from '../output/index.js';
|
|
|
4
4
|
export interface CommandContext {
|
|
5
5
|
readonly formatter: Formatter;
|
|
6
6
|
readonly config: NamzuCliConfig;
|
|
7
|
+
/** Parsed global profile for commands that intentionally use a recovery context. */
|
|
8
|
+
readonly selectedProfile?: string;
|
|
7
9
|
/**
|
|
8
10
|
* `--verbose`/`--quiet`/`NAMZU_LOG_LEVEL` and `--log-format`/
|
|
9
11
|
* `NAMZU_LOG_FORMAT`, resolved once in `cli.ts#getContext()` — flag
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/commands/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAEnD,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;IAC7B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;IAC/B;;;;;;;OAOG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,CAAA;CAClC;AAED,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAA;IAC5B,sFAAsF;IACtF,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CACnC;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,kBAAkB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;AAE1E,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,oEAAoE;IACpE,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAA;IAC9B;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAA;CAChC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/commands/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAEnD,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;IAC7B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;IAC/B,oFAAoF;IACpF,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;IACjC;;;;;;;OAOG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,CAAA;CAClC;AAED,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAA;IAC5B,sFAAsF;IACtF,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CACnC;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,kBAAkB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;AAE1E,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,oEAAoE;IACpE,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAA;IAC9B;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAA;CAChC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Operator commands for durable, Namzu-owned Git worktrees. */
|
|
2
|
+
import { type WorktreeResume } from '../integrations/worktrees/managed.js';
|
|
3
|
+
import type { CommandDef } from './types.js';
|
|
4
|
+
/** The launcher is supplied by cli.ts so a resume uses its normal TUI setup. */
|
|
5
|
+
export declare function createWorktreeCommand(launch?: (target: WorktreeResume) => Promise<void>): CommandDef;
|
|
6
|
+
//# sourceMappingURL=worktree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree.d.ts","sourceRoot":"","sources":["../../src/commands/worktree.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAGhE,OAAO,EACN,KAAK,cAAc,EAGnB,MAAM,sCAAsC,CAAA;AAE7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAe5C,gFAAgF;AAChF,wBAAgB,qBAAqB,CACpC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,GAChD,UAAU,CA8EZ"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/** Operator commands for durable, Namzu-owned Git worktrees. */
|
|
2
|
+
import { EXIT_OK, EXIT_USAGE } from '../exit-codes.js';
|
|
3
|
+
import { openManagedWorktrees, worktreeOpenHint, } from '../integrations/worktrees/managed.js';
|
|
4
|
+
import { terminalDisplayText } from '../tui/terminal-display.js';
|
|
5
|
+
const HELP = `namzu worktree — separate checkouts with separate conversation histories
|
|
6
|
+
|
|
7
|
+
Usage:
|
|
8
|
+
namzu worktree list
|
|
9
|
+
namzu worktree create [name]
|
|
10
|
+
namzu worktree fork <conversation-id> [name]
|
|
11
|
+
namzu worktree resume <name> [conversation-id]
|
|
12
|
+
|
|
13
|
+
Names use lowercase letters, digits and hyphens. Creation starts from this
|
|
14
|
+
checkout's committed HEAD. Uncommitted files stay here. "fork" copies the
|
|
15
|
+
settled conversation to the new checkout's project; "resume" opens its latest
|
|
16
|
+
conversation unless an id is given. Worktrees are never deleted automatically.\n`;
|
|
17
|
+
/** The launcher is supplied by cli.ts so a resume uses its normal TUI setup. */
|
|
18
|
+
export function createWorktreeCommand(launch) {
|
|
19
|
+
return {
|
|
20
|
+
name: 'worktree',
|
|
21
|
+
description: 'Create, fork, list and resume managed Git worktrees',
|
|
22
|
+
passThrough: true,
|
|
23
|
+
help: HELP,
|
|
24
|
+
handler: async ({ ctx, rawArgs }) => {
|
|
25
|
+
const [verb = 'list', ...operands] = rawArgs;
|
|
26
|
+
if (!((verb === 'list' && operands.length === 0) ||
|
|
27
|
+
(verb === 'create' && operands.length <= 1) ||
|
|
28
|
+
(verb === 'fork' && operands.length >= 1 && operands.length <= 2) ||
|
|
29
|
+
(verb === 'resume' && operands.length >= 1 && operands.length <= 2))) {
|
|
30
|
+
ctx.formatter.error({ message: HELP });
|
|
31
|
+
return EXIT_USAGE;
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
const manager = await openManagedWorktrees(process.cwd());
|
|
35
|
+
if (verb === 'list') {
|
|
36
|
+
const worktrees = await manager.list();
|
|
37
|
+
const text = worktrees.length === 0
|
|
38
|
+
? 'No managed worktrees in this repository.'
|
|
39
|
+
: worktrees
|
|
40
|
+
.map((item) => `${item.label} ${item.path}${item.dirty ? ' (uncommitted files)' : ''}`)
|
|
41
|
+
.join('\n');
|
|
42
|
+
ctx.formatter.print({
|
|
43
|
+
worktrees,
|
|
44
|
+
text: terminalDisplayText(text),
|
|
45
|
+
});
|
|
46
|
+
return EXIT_OK;
|
|
47
|
+
}
|
|
48
|
+
if (verb === 'create') {
|
|
49
|
+
const created = await manager.create(operands[0]);
|
|
50
|
+
ctx.formatter.print({
|
|
51
|
+
...created,
|
|
52
|
+
text: terminalDisplayText(`Created ${created.branch} at ${created.path}.\nOpen it: ${worktreeOpenHint(created.path)}${created.sourceDirty ? '\nUncommitted files stayed in the source checkout.' : ''}`),
|
|
53
|
+
});
|
|
54
|
+
return EXIT_OK;
|
|
55
|
+
}
|
|
56
|
+
if (verb === 'fork') {
|
|
57
|
+
const forked = await manager.fork(operands[0], operands[1]);
|
|
58
|
+
ctx.formatter.print({
|
|
59
|
+
...forked,
|
|
60
|
+
text: terminalDisplayText(`Forked ${forked.copied} messages into ${forked.title} at ${forked.path}.\nOpen it: ${worktreeOpenHint(forked.path, forked.conversationId)}${forked.sourceDirty ? '\nUncommitted files stayed in the source checkout.' : ''}`),
|
|
61
|
+
});
|
|
62
|
+
return EXIT_OK;
|
|
63
|
+
}
|
|
64
|
+
const target = await manager.resume(operands[0], operands[1]);
|
|
65
|
+
if (launch && process.stdout.isTTY) {
|
|
66
|
+
await launch(target);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
ctx.formatter.print({
|
|
70
|
+
...target,
|
|
71
|
+
text: terminalDisplayText(`Open ${target.worktree.label}: ${worktreeOpenHint(target.worktree.path, target.conversationId)}`),
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return EXIT_OK;
|
|
75
|
+
}
|
|
76
|
+
catch (cause) {
|
|
77
|
+
ctx.formatter.error({
|
|
78
|
+
message: terminalDisplayText(cause instanceof Error ? cause.message : String(cause)),
|
|
79
|
+
});
|
|
80
|
+
return EXIT_USAGE;
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=worktree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree.js","sourceRoot":"","sources":["../../src/commands/worktree.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,4 +20,6 @@ export declare function userConfigPath(opts?: UserConfigWriteOptions): string;
|
|
|
20
20
|
* when it cannot be read as YAML or written.
|
|
21
21
|
*/
|
|
22
22
|
export declare function setUserConfigValue(path: readonly string[], value: unknown, opts?: UserConfigWriteOptions): string;
|
|
23
|
+
/** Remove one user-owned setting while preserving the rest of the YAML document. */
|
|
24
|
+
export declare function deleteUserConfigValue(path: readonly string[], opts?: UserConfigWriteOptions): boolean;
|
|
23
25
|
//# sourceMappingURL=user-config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-config.d.ts","sourceRoot":"","sources":["../../src/config/user-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"user-config.d.ts","sourceRoot":"","sources":["../../src/config/user-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAqBH,MAAM,WAAW,sBAAsB;IACtC,8CAA8C;IAC9C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAChC;AAED,wBAAgB,cAAc,CAAC,IAAI,GAAE,sBAA2B,GAAG,MAAM,CAKxE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CACjC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,KAAK,EAAE,OAAO,EACd,IAAI,GAAE,sBAA2B,GAC/B,MAAM,CAsBR;AAED,oFAAoF;AACpF,wBAAgB,qBAAqB,CACpC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,IAAI,GAAE,sBAA2B,GAC/B,OAAO,CAwBT"}
|
|
@@ -8,9 +8,12 @@
|
|
|
8
8
|
* parse is refused rather than rewritten: rewriting it would drop whatever
|
|
9
9
|
* the operator was in the middle of writing.
|
|
10
10
|
*/
|
|
11
|
-
import {
|
|
11
|
+
import { randomUUID } from 'node:crypto';
|
|
12
|
+
import { closeSync, existsSync, lstatSync, mkdirSync, openSync, readFileSync, renameSync, rmSync, writeFileSync, } from 'node:fs';
|
|
13
|
+
import { platform } from 'node:os';
|
|
12
14
|
import { dirname, join } from 'node:path';
|
|
13
15
|
import { Document, isMap, parseDocument } from 'yaml';
|
|
16
|
+
import { restrictToOwner } from '../integrations/providers/credential-store.js';
|
|
14
17
|
import { resolveNamzuHome } from '../integrations/state/home.js';
|
|
15
18
|
export function userConfigPath(opts = {}) {
|
|
16
19
|
return join(resolveNamzuHome({ ...(opts.home ? { home: opts.home } : {}), env: opts.env ?? process.env }), 'config.yaml');
|
|
@@ -38,11 +41,78 @@ export function setUserConfigValue(path, value, opts = {}) {
|
|
|
38
41
|
}
|
|
39
42
|
}
|
|
40
43
|
doc.setIn(path, value);
|
|
41
|
-
|
|
42
|
-
const temp = `${file}.${process.pid}.tmp`;
|
|
43
|
-
// The file keeps its own permissions; a new one is the owner's alone.
|
|
44
|
-
writeFileSync(temp, doc.toString(), { mode: exists ? statSync(file).mode & 0o777 : 0o600 });
|
|
45
|
-
renameSync(temp, file);
|
|
44
|
+
writePrivateUserConfig(file, doc);
|
|
46
45
|
return file;
|
|
47
46
|
}
|
|
47
|
+
/** Remove one user-owned setting while preserving the rest of the YAML document. */
|
|
48
|
+
export function deleteUserConfigValue(path, opts = {}) {
|
|
49
|
+
const file = userConfigPath(opts);
|
|
50
|
+
if (!existsSync(file))
|
|
51
|
+
return false;
|
|
52
|
+
const text = readFileSync(file, 'utf8');
|
|
53
|
+
const doc = parseDocument(text);
|
|
54
|
+
if (doc.errors.length > 0) {
|
|
55
|
+
throw new Error(`${file} is not valid YAML (${doc.errors[0]?.message ?? 'parse error'}); fix it first`);
|
|
56
|
+
}
|
|
57
|
+
if (doc.contents !== null && !isMap(doc.contents)) {
|
|
58
|
+
throw new Error(`${file} is not a mapping of settings; fix it first`);
|
|
59
|
+
}
|
|
60
|
+
for (let depth = 1; depth < path.length; depth += 1) {
|
|
61
|
+
const parent = doc.getIn(path.slice(0, depth), true);
|
|
62
|
+
if (parent === undefined || parent === null)
|
|
63
|
+
return false;
|
|
64
|
+
if (!isMap(parent)) {
|
|
65
|
+
throw new Error(`${file}: ${path.slice(0, depth).join('.')} is not a mapping; fix it first`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (!doc.hasIn(path))
|
|
69
|
+
return false;
|
|
70
|
+
doc.deleteIn(path);
|
|
71
|
+
writePrivateUserConfig(file, doc);
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
/** Replacing an old config must never carry its broad mode onto a secret-bearing copy. */
|
|
75
|
+
function writePrivateUserConfig(file, doc) {
|
|
76
|
+
const parent = dirname(file);
|
|
77
|
+
mkdirSync(parent, { recursive: true, mode: 0o700 });
|
|
78
|
+
if (platform() === 'win32') {
|
|
79
|
+
const entry = lstatSync(parent);
|
|
80
|
+
if (entry.isSymbolicLink() || !entry.isDirectory()) {
|
|
81
|
+
throw new Error(`User config directory must be a real directory: ${parent}`);
|
|
82
|
+
}
|
|
83
|
+
// POSIX 0600 has no ACL meaning on Windows. Secure the parent before
|
|
84
|
+
// opening a temp file and prove that file private while it is still empty.
|
|
85
|
+
restrictToOwner(parent);
|
|
86
|
+
}
|
|
87
|
+
const temp = `${file}.${process.pid}.${randomUUID()}.tmp`;
|
|
88
|
+
let fd;
|
|
89
|
+
try {
|
|
90
|
+
fd = openSync(temp, 'wx', 0o600);
|
|
91
|
+
restrictToOwner(temp);
|
|
92
|
+
writeFileSync(fd, doc.toString());
|
|
93
|
+
closeSync(fd);
|
|
94
|
+
fd = undefined;
|
|
95
|
+
restrictToOwner(temp);
|
|
96
|
+
renameSync(temp, file);
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
if (fd !== undefined) {
|
|
100
|
+
try {
|
|
101
|
+
closeSync(fd);
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// The file remains private; still try to remove its name.
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
try {
|
|
108
|
+
rmSync(temp, { force: true });
|
|
109
|
+
}
|
|
110
|
+
catch (cleanupError) {
|
|
111
|
+
throw new Error(`Private user-config temporary file could not be removed: ${temp}`, {
|
|
112
|
+
cause: new AggregateError([error, cleanupError]),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
48
118
|
//# sourceMappingURL=user-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-config.js","sourceRoot":"","sources":["../../src/config/user-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"user-config.js","sourceRoot":"","sources":["../../src/config/user-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../../src/doctor/checks/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAqB,MAAM,YAAY,CAAA;AAIhE;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,sBAAsB,EAAE,
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../../src/doctor/checks/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAqB,MAAM,YAAY,CAAA;AAIhE;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,sBAAsB,EAAE,WAwDpC,CAAA"}
|
|
@@ -53,6 +53,8 @@ export const credentialSourcesCheck = {
|
|
|
53
53
|
return `${d.entry.id} (Claude session · ${d.source.path})`;
|
|
54
54
|
case 'gemini-file':
|
|
55
55
|
return `${d.entry.id} (Gemini session · ${d.source.path})`;
|
|
56
|
+
case 'stored-gemini-key':
|
|
57
|
+
return `${d.entry.id} (saved Gemini API key · ${d.source.path})`;
|
|
56
58
|
case 'codex-file':
|
|
57
59
|
return `${d.entry.id} (Codex session · ${d.source.path})`;
|
|
58
60
|
case 'stored':
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../../src/doctor/checks/credentials.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAA;AAE5E;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAgB;IAClD,EAAE,EAAE,uBAAuB;IAC3B,QAAQ,EAAE,WAAW;IACrB,GAAG,EAAE,KAAK,IAAgC,EAAE;QAC3C,IAAI,QAAuD,CAAA;QAC3D,IAAI,CAAC;YACJ,QAAQ,GAAG,MAAM,iBAAiB,EAAE,CAAA;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,oEAAoE;YACpE,sEAAsE;YACtE,OAAO;gBACN,MAAM,EAAE,cAAc;gBACtB,OAAO,EAAE,gCAAgC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;aAC3F,CAAA;QACF,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO;gBACN,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,yBAAyB;gBAClC,WAAW,EACV,kTAAkT;aACnT,CAAA;QACF,CAAC;QAED,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAChC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBACvB,KAAK,KAAK;oBACT,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC,OAAO,GAAG,CAAA;gBACnD,KAAK,QAAQ;oBACZ,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,uDAAuD,CAAA;gBAC5E,KAAK,eAAe;oBACnB,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,wBAAwB,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,CAAA;gBAC7D,KAAK,UAAU;oBACd,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC,CAAC,MAAM,CAAC,OAAO,GAAG,CAAA;gBACxD,KAAK,aAAa;oBACjB,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,sBAAsB,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,CAAA;gBAC3D,KAAK,aAAa;oBACjB,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,sBAAsB,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,CAAA;gBAC3D,KAAK,YAAY;oBAChB,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,qBAAqB,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,CAAA;gBAC1D,KAAK,QAAQ;oBACZ,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,CAAA;gBACtD,KAAK,OAAO;oBACX,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,GAAG,CAAA;gBAC7E,KAAK,SAAS;oBACb,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,4BAA4B,CAAA;YAClD,CAAC;QACF,CAAC,CAAC,CAAA;QACF,OAAO;YACN,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,GAAG,QAAQ,CAAC,MAAM,kCAAkC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SAC/E,CAAA;IACF,CAAC;CACD,CAAA"}
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../../src/doctor/checks/credentials.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAA;AAE5E;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAgB;IAClD,EAAE,EAAE,uBAAuB;IAC3B,QAAQ,EAAE,WAAW;IACrB,GAAG,EAAE,KAAK,IAAgC,EAAE;QAC3C,IAAI,QAAuD,CAAA;QAC3D,IAAI,CAAC;YACJ,QAAQ,GAAG,MAAM,iBAAiB,EAAE,CAAA;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,oEAAoE;YACpE,sEAAsE;YACtE,OAAO;gBACN,MAAM,EAAE,cAAc;gBACtB,OAAO,EAAE,gCAAgC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;aAC3F,CAAA;QACF,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO;gBACN,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,yBAAyB;gBAClC,WAAW,EACV,kTAAkT;aACnT,CAAA;QACF,CAAC;QAED,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAChC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBACvB,KAAK,KAAK;oBACT,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC,OAAO,GAAG,CAAA;gBACnD,KAAK,QAAQ;oBACZ,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,uDAAuD,CAAA;gBAC5E,KAAK,eAAe;oBACnB,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,wBAAwB,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,CAAA;gBAC7D,KAAK,UAAU;oBACd,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC,CAAC,MAAM,CAAC,OAAO,GAAG,CAAA;gBACxD,KAAK,aAAa;oBACjB,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,sBAAsB,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,CAAA;gBAC3D,KAAK,aAAa;oBACjB,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,sBAAsB,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,CAAA;gBAC3D,KAAK,mBAAmB;oBACvB,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,4BAA4B,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,CAAA;gBACjE,KAAK,YAAY;oBAChB,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,qBAAqB,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,CAAA;gBAC1D,KAAK,QAAQ;oBACZ,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,CAAA;gBACtD,KAAK,OAAO;oBACX,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,GAAG,CAAA;gBAC7E,KAAK,SAAS;oBACb,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,4BAA4B,CAAA;YAClD,CAAC;QACF,CAAC,CAAC,CAAA;QACF,OAAO;YACN,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,GAAG,QAAQ,CAAC,MAAM,kCAAkC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SAC/E,CAAA;IACF,CAAC;CACD,CAAA"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Namzu-owned MCP OAuth state. Each complete resource endpoint has its own
|
|
3
|
+
* private file: a token for one path or query must never be sent to another.
|
|
4
|
+
* Discovery and PKCE state share that file so a browser round trip cannot
|
|
5
|
+
* accidentally resume against a different authorization server.
|
|
6
|
+
*/
|
|
7
|
+
import type { OAuthClientProvider } from '@modelcontextprotocol/client';
|
|
8
|
+
export declare class McpOAuthStoreError extends Error {
|
|
9
|
+
readonly name = "McpOAuthStoreError";
|
|
10
|
+
}
|
|
11
|
+
export declare class McpOAuthLoginRequiredError extends Error {
|
|
12
|
+
readonly name = "McpOAuthLoginRequiredError";
|
|
13
|
+
constructor();
|
|
14
|
+
}
|
|
15
|
+
export interface McpOAuthProviderOptions {
|
|
16
|
+
/** The complete configured MCP URL, including its path and query. */
|
|
17
|
+
readonly endpoint: string;
|
|
18
|
+
/** Existing credential-store test seam: the OS home, not NAMZU_HOME. */
|
|
19
|
+
readonly home?: string;
|
|
20
|
+
/** The loopback callback for an interactive login. Omit in a running agent. */
|
|
21
|
+
readonly redirectUrl?: string;
|
|
22
|
+
/** Only an explicit login may open a browser. */
|
|
23
|
+
readonly onRedirect?: (authorizationUrl: URL) => void | Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
/** Shared network policy for interactive sign-in and background token refresh. */
|
|
26
|
+
export declare function isSecureMcpOAuthUrl(url: URL): boolean;
|
|
27
|
+
/** A hash keeps possibly secret URL path and query values out of file names. */
|
|
28
|
+
export declare function mcpOAuthPath(endpoint: string, home?: string): string;
|
|
29
|
+
/** True only for a private, issuer-stamped token belonging to this exact URL. */
|
|
30
|
+
export declare function hasMcpOAuthTokens(endpoint: string, home?: string): boolean;
|
|
31
|
+
/** Validate and consume state before passing callback parameters to `finishAuth`. */
|
|
32
|
+
export declare function consumeMcpOAuthCallbackState(endpoint: string, state: string | null, home?: string): void;
|
|
33
|
+
export declare function clearMcpOAuthPending(endpoint: string, home?: string): void;
|
|
34
|
+
/** Remove only this URL's credentials; another server on the same host survives. */
|
|
35
|
+
export declare function clearMcpOAuthCredentials(endpoint: string, home?: string): boolean;
|
|
36
|
+
/** The official MCP client consumes this provider for login and token refresh. */
|
|
37
|
+
export declare function createMcpOAuthProvider(options: McpOAuthProviderOptions): OAuthClientProvider;
|
|
38
|
+
/** The authorization-server identity captured before the browser opened. */
|
|
39
|
+
export declare function pendingMcpOAuthIssuer(endpoint: string, home?: string): string | null;
|
|
40
|
+
//# sourceMappingURL=oauth-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-store.d.ts","sourceRoot":"","sources":["../../../src/integrations/mcp/oauth-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmBH,OAAO,KAAK,EAGX,mBAAmB,EAInB,MAAM,8BAA8B,CAAA;AASrC,qBAAa,kBAAmB,SAAQ,KAAK;IAC5C,SAAkB,IAAI,wBAAuB;CAC7C;AAED,qBAAa,0BAA2B,SAAQ,KAAK;IACpD,SAAkB,IAAI,gCAA+B;;CAIrD;AAyBD,MAAM,WAAW,uBAAuB;IACvC,qEAAqE;IACrE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,wEAAwE;IACxE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,+EAA+E;IAC/E,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,iDAAiD;IACjD,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,gBAAgB,EAAE,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACrE;AAkBD,kFAAkF;AAClF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAQrD;AAeD,gFAAgF;AAChF,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAIpE;AA0PD,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAG1E;AAED,qFAAqF;AACrF,wBAAgB,4BAA4B,CAC3C,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,IAAI,CAAC,EAAE,MAAM,GACX,IAAI,CAoBN;AAQD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAM1E;AAED,oFAAoF;AACpF,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAmBjF;AAED,kFAAkF;AAClF,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,uBAAuB,GAAG,mBAAmB,CA6L5F;AAED,4EAA4E;AAC5E,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKpF"}
|