@tickernelz/paperclip-pro-adapter-claude-local 2026.925.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/LICENSE +22 -0
- package/dist/cli/format-event.d.ts +2 -0
- package/dist/cli/format-event.d.ts.map +1 -0
- package/dist/cli/format-event.js +141 -0
- package/dist/cli/format-event.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/quota-probe.d.ts +3 -0
- package/dist/cli/quota-probe.d.ts.map +1 -0
- package/dist/cli/quota-probe.js +106 -0
- package/dist/cli/quota-probe.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +90 -0
- package/dist/index.js.map +1 -0
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +35 -0
- package/dist/index.test.js.map +1 -0
- package/dist/server/acp.auth.test.d.ts +2 -0
- package/dist/server/acp.auth.test.d.ts.map +1 -0
- package/dist/server/acp.auth.test.js +581 -0
- package/dist/server/acp.auth.test.js.map +1 -0
- package/dist/server/acp.d.ts +68 -0
- package/dist/server/acp.d.ts.map +1 -0
- package/dist/server/acp.js +779 -0
- package/dist/server/acp.js.map +1 -0
- package/dist/server/acp.quota.test.d.ts +2 -0
- package/dist/server/acp.quota.test.d.ts.map +1 -0
- package/dist/server/acp.quota.test.js +114 -0
- package/dist/server/acp.quota.test.js.map +1 -0
- package/dist/server/acp.test.d.ts +2 -0
- package/dist/server/acp.test.d.ts.map +1 -0
- package/dist/server/acp.test.js +1153 -0
- package/dist/server/acp.test.js.map +1 -0
- package/dist/server/auth-check.d.ts +8 -0
- package/dist/server/auth-check.d.ts.map +1 -0
- package/dist/server/auth-check.js +8 -0
- package/dist/server/auth-check.js.map +1 -0
- package/dist/server/claude-config.d.ts +49 -0
- package/dist/server/claude-config.d.ts.map +1 -0
- package/dist/server/claude-config.js +279 -0
- package/dist/server/claude-config.js.map +1 -0
- package/dist/server/claude-config.test.d.ts +2 -0
- package/dist/server/claude-config.test.d.ts.map +1 -0
- package/dist/server/claude-config.test.js +197 -0
- package/dist/server/claude-config.test.js.map +1 -0
- package/dist/server/cli-capabilities.d.ts +26 -0
- package/dist/server/cli-capabilities.d.ts.map +1 -0
- package/dist/server/cli-capabilities.js +115 -0
- package/dist/server/cli-capabilities.js.map +1 -0
- package/dist/server/config-schema.d.ts +3 -0
- package/dist/server/config-schema.d.ts.map +1 -0
- package/dist/server/config-schema.js +67 -0
- package/dist/server/config-schema.js.map +1 -0
- package/dist/server/engine-availability.test.d.ts +2 -0
- package/dist/server/engine-availability.test.d.ts.map +1 -0
- package/dist/server/engine-availability.test.js +41 -0
- package/dist/server/engine-availability.test.js.map +1 -0
- package/dist/server/execute.acp-fallback.test.d.ts +2 -0
- package/dist/server/execute.acp-fallback.test.d.ts.map +1 -0
- package/dist/server/execute.acp-fallback.test.js +104 -0
- package/dist/server/execute.acp-fallback.test.js.map +1 -0
- package/dist/server/execute.d.ts +23 -0
- package/dist/server/execute.d.ts.map +1 -0
- package/dist/server/execute.js +1089 -0
- package/dist/server/execute.js.map +1 -0
- package/dist/server/execute.remote.test.d.ts +2 -0
- package/dist/server/execute.remote.test.d.ts.map +1 -0
- package/dist/server/execute.remote.test.js +484 -0
- package/dist/server/execute.remote.test.js.map +1 -0
- package/dist/server/index.d.ts +16 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +84 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/models.d.ts +13 -0
- package/dist/server/models.d.ts.map +1 -0
- package/dist/server/models.js +153 -0
- package/dist/server/models.js.map +1 -0
- package/dist/server/parse.d.ts +58 -0
- package/dist/server/parse.d.ts.map +1 -0
- package/dist/server/parse.js +459 -0
- package/dist/server/parse.js.map +1 -0
- package/dist/server/parse.test.d.ts +2 -0
- package/dist/server/parse.test.d.ts.map +1 -0
- package/dist/server/parse.test.js +419 -0
- package/dist/server/parse.test.js.map +1 -0
- package/dist/server/permissions.d.ts +14 -0
- package/dist/server/permissions.d.ts.map +1 -0
- package/dist/server/permissions.js +13 -0
- package/dist/server/permissions.js.map +1 -0
- package/dist/server/permissions.test.d.ts +2 -0
- package/dist/server/permissions.test.d.ts.map +1 -0
- package/dist/server/permissions.test.js +22 -0
- package/dist/server/permissions.test.js.map +1 -0
- package/dist/server/probe-diagnostics.d.ts +102 -0
- package/dist/server/probe-diagnostics.d.ts.map +1 -0
- package/dist/server/probe-diagnostics.js +140 -0
- package/dist/server/probe-diagnostics.js.map +1 -0
- package/dist/server/probe-diagnostics.test.d.ts +2 -0
- package/dist/server/probe-diagnostics.test.d.ts.map +1 -0
- package/dist/server/probe-diagnostics.test.js +114 -0
- package/dist/server/probe-diagnostics.test.js.map +1 -0
- package/dist/server/probe-env.d.ts +42 -0
- package/dist/server/probe-env.d.ts.map +1 -0
- package/dist/server/probe-env.js +149 -0
- package/dist/server/probe-env.js.map +1 -0
- package/dist/server/probe-env.test.d.ts +2 -0
- package/dist/server/probe-env.test.d.ts.map +1 -0
- package/dist/server/probe-env.test.js +135 -0
- package/dist/server/probe-env.test.js.map +1 -0
- package/dist/server/probe-redaction.test.d.ts +2 -0
- package/dist/server/probe-redaction.test.d.ts.map +1 -0
- package/dist/server/probe-redaction.test.js +86 -0
- package/dist/server/probe-redaction.test.js.map +1 -0
- package/dist/server/prompt-cache.d.ts +17 -0
- package/dist/server/prompt-cache.d.ts.map +1 -0
- package/dist/server/prompt-cache.js +126 -0
- package/dist/server/prompt-cache.js.map +1 -0
- package/dist/server/quota-keychain.test.d.ts +2 -0
- package/dist/server/quota-keychain.test.d.ts.map +1 -0
- package/dist/server/quota-keychain.test.js +83 -0
- package/dist/server/quota-keychain.test.js.map +1 -0
- package/dist/server/quota.d.ts +30 -0
- package/dist/server/quota.d.ts.map +1 -0
- package/dist/server/quota.js +543 -0
- package/dist/server/quota.js.map +1 -0
- package/dist/server/setup-token-characterization.test.d.ts +2 -0
- package/dist/server/setup-token-characterization.test.d.ts.map +1 -0
- package/dist/server/setup-token-characterization.test.js +123 -0
- package/dist/server/setup-token-characterization.test.js.map +1 -0
- package/dist/server/setup-token-parse.d.ts +47 -0
- package/dist/server/setup-token-parse.d.ts.map +1 -0
- package/dist/server/setup-token-parse.js +506 -0
- package/dist/server/setup-token-parse.js.map +1 -0
- package/dist/server/setup-token-parse.test.d.ts +2 -0
- package/dist/server/setup-token-parse.test.d.ts.map +1 -0
- package/dist/server/setup-token-parse.test.js +587 -0
- package/dist/server/setup-token-parse.test.js.map +1 -0
- package/dist/server/setup-token-runner.d.ts +115 -0
- package/dist/server/setup-token-runner.d.ts.map +1 -0
- package/dist/server/setup-token-runner.js +317 -0
- package/dist/server/setup-token-runner.js.map +1 -0
- package/dist/server/setup-token-runner.test.d.ts +2 -0
- package/dist/server/setup-token-runner.test.d.ts.map +1 -0
- package/dist/server/setup-token-runner.test.js +336 -0
- package/dist/server/setup-token-runner.test.js.map +1 -0
- package/dist/server/skills.d.ts +8 -0
- package/dist/server/skills.d.ts.map +1 -0
- package/dist/server/skills.js +42 -0
- package/dist/server/skills.js.map +1 -0
- package/dist/server/test.d.ts +3 -0
- package/dist/server/test.d.ts.map +1 -0
- package/dist/server/test.js +434 -0
- package/dist/server/test.js.map +1 -0
- package/dist/server/test.probe.test.d.ts +2 -0
- package/dist/server/test.probe.test.d.ts.map +1 -0
- package/dist/server/test.probe.test.js +608 -0
- package/dist/server/test.probe.test.js.map +1 -0
- package/dist/server/test.remote.test.d.ts +2 -0
- package/dist/server/test.remote.test.d.ts.map +1 -0
- package/dist/server/test.remote.test.js +149 -0
- package/dist/server/test.remote.test.js.map +1 -0
- package/dist/ui/build-config.d.ts +3 -0
- package/dist/ui/build-config.d.ts.map +1 -0
- package/dist/ui/build-config.js +76 -0
- package/dist/ui/build-config.js.map +1 -0
- package/dist/ui/build-config.test.d.ts +2 -0
- package/dist/ui/build-config.test.d.ts.map +1 -0
- package/dist/ui/build-config.test.js +68 -0
- package/dist/ui/build-config.test.js.map +1 -0
- package/dist/ui/index.d.ts +3 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +3 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/parse-stdout.d.ts +3 -0
- package/dist/ui/parse-stdout.d.ts.map +1 -0
- package/dist/ui/parse-stdout.js +153 -0
- package/dist/ui/parse-stdout.js.map +1 -0
- package/package.json +63 -0
- package/skills/agentmail/SKILL.md +70 -0
- package/skills/paperclip/SKILL.md +712 -0
- package/skills/paperclip/references/api-reference.md +1675 -0
- package/skills/paperclip/references/artifacts.md +158 -0
- package/skills/paperclip/references/cases.md +295 -0
- package/skills/paperclip/references/company-skills.md +266 -0
- package/skills/paperclip/references/issue-workspaces.md +80 -0
- package/skills/paperclip/references/routines.md +231 -0
- package/skills/paperclip/references/workflows.md +141 -0
- package/skills/paperclip/scripts/paperclip-upload-artifact.sh +592 -0
- package/skills/paperclip-board/SKILL.md +619 -0
- package/skills/paperclip-converting-plans-to-tasks/SKILL.md +60 -0
- package/skills/paperclip-create-agent/SKILL.md +179 -0
- package/skills/paperclip-create-agent/references/agent-instruction-templates.md +123 -0
- package/skills/paperclip-create-agent/references/agents/coder.md +64 -0
- package/skills/paperclip-create-agent/references/agents/qa.md +88 -0
- package/skills/paperclip-create-agent/references/agents/securityengineer.md +135 -0
- package/skills/paperclip-create-agent/references/agents/uxdesigner.md +115 -0
- package/skills/paperclip-create-agent/references/api-reference.md +110 -0
- package/skills/paperclip-create-agent/references/baseline-role-guide.md +168 -0
- package/skills/paperclip-create-agent/references/draft-review-checklist.md +95 -0
- package/skills/para-memory-files/SKILL.md +100 -0
- package/skills/para-memory-files/references/schemas.md +35 -0
- package/skills/slack/SKILL.md +65 -0
|
@@ -0,0 +1,506 @@
|
|
|
1
|
+
// The Claude `setup-token` parsers. They read the interactive login output of
|
|
2
|
+
// Claude Code. `parseSetupTokenPrompt` returns the authorization URL and the
|
|
3
|
+
// browser-code prompt, or null. `parseSetupTokenCredential` returns the minted
|
|
4
|
+
// OAuth token from the success screen, or null.
|
|
5
|
+
//
|
|
6
|
+
// Security (shape validation): the prompt parser accepts an authorization URL
|
|
7
|
+
// only when it matches one of the two observed origin-and-path pairs, carries
|
|
8
|
+
// each required query key one time with a valid decoded value, and pins the
|
|
9
|
+
// `redirect_uri` value to the one observed callback. It rejects a look-alike
|
|
10
|
+
// host, userinfo, an explicit port, a fragment, a duplicate key, an unexpected
|
|
11
|
+
// added key, an invalid value, and an API-key-shaped value in the raw URL or in
|
|
12
|
+
// any decoded query value. Different Claude CLI versions render the URL two ways:
|
|
13
|
+
// a single OSC 8 hyperlink, or plain text with a hard line wrap and no
|
|
14
|
+
// hyperlink. The parser reassembles the wrapped plain-text URL from the physical
|
|
15
|
+
// lines and validates only the final reassembled string, so the login works on
|
|
16
|
+
// every CLI version that keeps this flow shape. It binds the browser-code prompt
|
|
17
|
+
// to the dedicated line after the URL block; a repeated URL line, a code-like
|
|
18
|
+
// value on the wrong line, or an unrelated line cannot form a prompt.
|
|
19
|
+
//
|
|
20
|
+
// The token parser binds the token to the exact success record: it requires the
|
|
21
|
+
// before-anchor line and the after-anchor line, in that order, exactly one time
|
|
22
|
+
// each, and it reads only the lines between them. It de-wraps the token across
|
|
23
|
+
// the physical terminal lines. It fails closed for any other input. Both parsers
|
|
24
|
+
// never log any input byte, and they keep every input byte out of each thrown
|
|
25
|
+
// error. Both parsers are pure functions.
|
|
26
|
+
// The canonical browser-code prompt text. The Claude login UI prints this line
|
|
27
|
+
// to ask the user to paste the code from the browser. The parser returns this
|
|
28
|
+
// exact constant on a match.
|
|
29
|
+
export const SETUP_TOKEN_PROMPT = "Paste code here if prompted";
|
|
30
|
+
// The two accepted authorization URLs, each the exact origin plus path. The
|
|
31
|
+
// parser accepts an origin-and-path pair only when it equals one of these two
|
|
32
|
+
// strings. It does not accept the cross-product of the two hosts and the two
|
|
33
|
+
// paths. `claude` 2.1.19 emits the first URL; `claude` 2.1.205 and 2.1.226 emit
|
|
34
|
+
// the second URL.
|
|
35
|
+
export const SETUP_TOKEN_AUTH_URLS = [
|
|
36
|
+
"https://claude.ai/oauth/authorize",
|
|
37
|
+
"https://claude.com/cai/oauth/authorize",
|
|
38
|
+
];
|
|
39
|
+
// The lowercase host prefix of each accepted authorization URL. The parser
|
|
40
|
+
// requires the raw URL candidate to start with one of these exact lowercase
|
|
41
|
+
// prefixes before it parses the URL. This rejects a mixed-case host spelling, a
|
|
42
|
+
// punycode host, and an explicit default `:443` port, because none of them start
|
|
43
|
+
// with the exact lowercase `https://<host>/` prefix.
|
|
44
|
+
const SETUP_TOKEN_AUTH_URL_PREFIXES = [
|
|
45
|
+
"https://claude.ai/",
|
|
46
|
+
"https://claude.com/",
|
|
47
|
+
];
|
|
48
|
+
// The one accepted `redirect_uri` value. The parser parses the decoded
|
|
49
|
+
// `redirect_uri` value on its own and pins it to this exact callback, with no
|
|
50
|
+
// userinfo, no port, no query, and no fragment. The 2.1.226 live capture grounds
|
|
51
|
+
// this host; the contract keeps a single pin until sanitized 2.1.19 evidence
|
|
52
|
+
// proves another real callback.
|
|
53
|
+
export const SETUP_TOKEN_REDIRECT_URI = "https://platform.claude.com/oauth/code/callback";
|
|
54
|
+
// The required query keys of the authorization URL. The parser requires each key
|
|
55
|
+
// one time with a valid decoded value. It rejects a missing key, a duplicate
|
|
56
|
+
// key, and an invalid value.
|
|
57
|
+
export const SETUP_TOKEN_URL_QUERY_KEYS = [
|
|
58
|
+
"client_id",
|
|
59
|
+
"code",
|
|
60
|
+
"code_challenge",
|
|
61
|
+
"code_challenge_method",
|
|
62
|
+
"redirect_uri",
|
|
63
|
+
"response_type",
|
|
64
|
+
"scope",
|
|
65
|
+
"state",
|
|
66
|
+
];
|
|
67
|
+
// The set form of the required query keys. The parser uses it to sort a key into
|
|
68
|
+
// a required key or an added key.
|
|
69
|
+
const SETUP_TOKEN_CORE_KEY_SET = new Set(SETUP_TOKEN_URL_QUERY_KEYS);
|
|
70
|
+
// The value validators for the required query keys. Each pattern binds the whole
|
|
71
|
+
// decoded value. The parser rejects a value that does not match.
|
|
72
|
+
const CLIENT_ID_RE = /^[A-Za-z0-9._~-]{1,128}$/;
|
|
73
|
+
// The `code` value of the `claude` 2.1.19 authorization request is a short
|
|
74
|
+
// opaque token. A real 2.1.19 capture measured a 4-character value, so the
|
|
75
|
+
// minimum length is one character. The character class and the 1024-character
|
|
76
|
+
// maximum bound the value.
|
|
77
|
+
const CODE_RE = /^[A-Za-z0-9._~-]{1,1024}$/;
|
|
78
|
+
const CODE_CHALLENGE_RE = /^[A-Za-z0-9_-]{43,128}$/;
|
|
79
|
+
const STATE_RE = /^[A-Za-z0-9_-]{16,256}$/;
|
|
80
|
+
// One `scope` token. The `scope` value is one to eight space-separated tokens.
|
|
81
|
+
const SCOPE_TOKEN_RE = /^[A-Za-z0-9:._-]{1,64}$/;
|
|
82
|
+
// The name of an added query key. An added key is any key that is not a required
|
|
83
|
+
// key. The parser accepts at most four added keys, each with a name that matches
|
|
84
|
+
// this pattern.
|
|
85
|
+
const ADDED_KEY_NAME_RE = /^[a-z][a-z0-9_-]{0,63}$/;
|
|
86
|
+
// The decoded value of an added query key. The parser accepts at most 256
|
|
87
|
+
// printable ASCII characters.
|
|
88
|
+
const ADDED_VALUE_RE = /^[\x20-\x7E]{0,256}$/;
|
|
89
|
+
// An API-key prefix. The Claude setup token and API key start with `sk-ant-`.
|
|
90
|
+
// The parser rejects the raw URL candidate and any decoded query value that
|
|
91
|
+
// holds this prefix, so a secret cannot ride inside the authorization URL.
|
|
92
|
+
const API_KEY_RE = /sk-ant-/i;
|
|
93
|
+
// The maximum number of added query keys. The parser accepts at most four added
|
|
94
|
+
// keys, so the URL holds at most twelve keys in total.
|
|
95
|
+
const MAX_ADDED_KEYS = 4;
|
|
96
|
+
// The maximum number of `scope` tokens.
|
|
97
|
+
const MAX_SCOPE_TOKENS = 8;
|
|
98
|
+
// The maximum length of the whole `scope` value.
|
|
99
|
+
const MAX_SCOPE_LENGTH = 512;
|
|
100
|
+
// The maximum length of the reassembled authorization URL. The parser rejects a
|
|
101
|
+
// candidate longer than this cap.
|
|
102
|
+
const MAX_URL_LENGTH = 2048;
|
|
103
|
+
// The characters that a URL can hold. A physical line that reassembles into the
|
|
104
|
+
// wrapped URL holds only these characters after a trim.
|
|
105
|
+
const URL_CHARS_ONLY_RE = /^[A-Za-z0-9\-._~:/?#[\]@!$&'()*+,;=%]+$/;
|
|
106
|
+
// An ANSI Control Sequence Introducer (CSI): the ESC control byte, a `[`, zero
|
|
107
|
+
// or more parameter bytes (0x30-0x3F), zero or more intermediate bytes
|
|
108
|
+
// (0x20-0x2F), and one final byte (0x40-0x7E). The Claude terminal wraps the
|
|
109
|
+
// output in CSI color sequences. The parser removes every CSI sequence first, so
|
|
110
|
+
// a colored prompt reads the same as a plain one.
|
|
111
|
+
// eslint-disable-next-line no-control-regex
|
|
112
|
+
const ANSI_CSI_RE = /\x1b\[[0-?]*[ -/]*[@-~]/g;
|
|
113
|
+
// A horizontal-move CSI sequence: Cursor Horizontal Absolute (final byte `G`)
|
|
114
|
+
// and Cursor Forward (final byte `C`). The Claude login UI lays out each word at
|
|
115
|
+
// an absolute column with one of these sequences, so it emits no literal space
|
|
116
|
+
// between two words. The parser replaces each horizontal-move sequence with one
|
|
117
|
+
// space, so a word gap reads as a space. Without this step the later CSI removal
|
|
118
|
+
// deletes the sequence and glues the two words, and the URL preamble line, the
|
|
119
|
+
// browser-code prompt line, and the success anchor lines never match. The
|
|
120
|
+
// vertical and color sequences carry no horizontal text gap; the CSI removal
|
|
121
|
+
// below drops them.
|
|
122
|
+
// eslint-disable-next-line no-control-regex
|
|
123
|
+
const CSI_HORIZONTAL_MOVE_RE = /\x1b\[[0-9;]*[GC]/g;
|
|
124
|
+
// An OSC 8 hyperlink. The terminal emits the URL through an OSC 8 hyperlink plus
|
|
125
|
+
// wrapped display text. The hyperlink carries the true, unwrapped URL in its URI
|
|
126
|
+
// field, while the display text may wrap across lines. The parser replaces the
|
|
127
|
+
// whole hyperlink (open sequence, display text, close sequence) with the URI, so
|
|
128
|
+
// it reads the unwrapped URL and drops the wrapped display text. The URI field
|
|
129
|
+
// is the first capture group. The terminator of each OSC sequence is the String
|
|
130
|
+
// Terminator (ESC `\`) or the BEL byte.
|
|
131
|
+
// eslint-disable-next-line no-control-regex
|
|
132
|
+
const OSC8_HYPERLINK_RE = /\x1b\]8;[^;\x1b\x07]*;([^\x1b\x07]*)(?:\x1b\\|\x07)[\s\S]*?\x1b\]8;[^;\x1b\x07]*;(?:\x1b\\|\x07)/g;
|
|
133
|
+
// Any remaining OSC sequence. A partial output chunk can hold an OSC 8 open
|
|
134
|
+
// sequence without its close sequence. The parser removes each leftover OSC
|
|
135
|
+
// sequence after it replaces the complete hyperlinks.
|
|
136
|
+
// eslint-disable-next-line no-control-regex
|
|
137
|
+
const OSC_ANY_RE = /\x1b\][^\x1b\x07]*(?:\x1b\\|\x07)/g;
|
|
138
|
+
// Trailing punctuation that prose commonly puts right after a URL. The parser
|
|
139
|
+
// strips only these characters when it compares a line to a repeated URL. It
|
|
140
|
+
// never strips these from the candidate before validation, because the validator
|
|
141
|
+
// rejects any trailing punctuation on its own.
|
|
142
|
+
const TRAILING_PUNCTUATION_RE = /[)\].,;:!]+$/;
|
|
143
|
+
// The line that introduces the URL. The Claude login UI prints this phrase right
|
|
144
|
+
// before the URL. The parser anchors the URL search on this phrase, so a URL far
|
|
145
|
+
// from the login context cannot bind.
|
|
146
|
+
const URL_PREAMBLE_RE = /the url below to sign in/i;
|
|
147
|
+
// The browser-code prompt on a dedicated line. The line starts with the exact
|
|
148
|
+
// prompt phrase. The line can end with the input caret `>` and masked echo `*`
|
|
149
|
+
// characters and spaces. The pattern rejects the phrase when other prose shares
|
|
150
|
+
// the line.
|
|
151
|
+
const PROMPT_LINE_RE = /^Paste code here if prompted\b[\s>*]*$/;
|
|
152
|
+
// The maximum number of characters between the end of the URL preamble line and
|
|
153
|
+
// the start of the URL. The Claude UI prints the URL right after the preamble.
|
|
154
|
+
// The parser accepts a URL start only inside this window, so a URL far from the
|
|
155
|
+
// preamble cannot bind.
|
|
156
|
+
const MAX_PREAMBLE_TO_URL_GAP = 512;
|
|
157
|
+
// The maximum number of consecutive physical lines that the parser joins to
|
|
158
|
+
// reassemble a wrapped plain-text URL. The `claude` 2.1.19 CLI wraps the URL at
|
|
159
|
+
// the terminal width with no space at the wrap, so the parser joins a bounded
|
|
160
|
+
// run of URL-character-only lines.
|
|
161
|
+
const MAX_URL_LINES = 16;
|
|
162
|
+
/**
|
|
163
|
+
* Removes the terminal control sequences from `text`. Replaces each OSC 8
|
|
164
|
+
* hyperlink with its true URI, so the parser reads the unwrapped URL and drops
|
|
165
|
+
* the wrapped display text. Removes each leftover OSC sequence. Replaces each
|
|
166
|
+
* horizontal-move CSI sequence with one space, so a word that the login UI lays
|
|
167
|
+
* out at an absolute column reads as a space-separated word. Removes each
|
|
168
|
+
* remaining ANSI CSI sequence. Returns plain text. The function only normalizes
|
|
169
|
+
* the input; the URL and the prompt still pass the shape validation below.
|
|
170
|
+
*/
|
|
171
|
+
function stripTerminalControls(text) {
|
|
172
|
+
return text
|
|
173
|
+
.replace(OSC8_HYPERLINK_RE, "$1")
|
|
174
|
+
.replace(OSC_ANY_RE, "")
|
|
175
|
+
.replace(CSI_HORIZONTAL_MOVE_RE, " ")
|
|
176
|
+
.replace(ANSI_CSI_RE, "");
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Returns true when `value` is a valid `scope` value: one to eight
|
|
180
|
+
* space-separated tokens, a total length of at most {@link MAX_SCOPE_LENGTH},
|
|
181
|
+
* and each token a match of {@link SCOPE_TOKEN_RE}. A double space forms an empty
|
|
182
|
+
* token, which fails the token pattern, so a malformed value fails closed.
|
|
183
|
+
*/
|
|
184
|
+
function isValidScope(value) {
|
|
185
|
+
if (value.length < 1 || value.length > MAX_SCOPE_LENGTH)
|
|
186
|
+
return false;
|
|
187
|
+
const tokens = value.split(" ");
|
|
188
|
+
if (tokens.length < 1 || tokens.length > MAX_SCOPE_TOKENS)
|
|
189
|
+
return false;
|
|
190
|
+
return tokens.every((token) => SCOPE_TOKEN_RE.test(token));
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Returns true when `value` is the one accepted `redirect_uri`. The function
|
|
194
|
+
* parses the decoded value on its own and pins it to {@link
|
|
195
|
+
* SETUP_TOKEN_REDIRECT_URI}, with the `https:` protocol, no userinfo, no port,
|
|
196
|
+
* no query, and no fragment. It never broadens to an arbitrary HTTPS URL.
|
|
197
|
+
*/
|
|
198
|
+
function isValidRedirectUri(value) {
|
|
199
|
+
let parsed;
|
|
200
|
+
try {
|
|
201
|
+
parsed = new URL(value);
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
if (parsed.protocol !== "https:")
|
|
207
|
+
return false;
|
|
208
|
+
if (parsed.username !== "" || parsed.password !== "")
|
|
209
|
+
return false;
|
|
210
|
+
if (parsed.port !== "")
|
|
211
|
+
return false;
|
|
212
|
+
if (parsed.search !== "" || parsed.hash !== "")
|
|
213
|
+
return false;
|
|
214
|
+
return `${parsed.origin}${parsed.pathname}` === SETUP_TOKEN_REDIRECT_URI;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Returns true when the query of `parsed` matches the contract. It requires each
|
|
218
|
+
* required key one time with a valid decoded value. It rejects a duplicate for
|
|
219
|
+
* any key. It accepts at most {@link MAX_ADDED_KEYS} added keys, each with a
|
|
220
|
+
* valid name, one value, and a decoded value of at most 256 printable ASCII
|
|
221
|
+
* characters. It rejects an API-key prefix in any decoded value.
|
|
222
|
+
*/
|
|
223
|
+
function hasValidQuery(parsed) {
|
|
224
|
+
// Collect the values of each key, so the parser can reject a duplicate key and
|
|
225
|
+
// read the one decoded value of each key.
|
|
226
|
+
const byKey = new Map();
|
|
227
|
+
for (const [key, value] of parsed.searchParams) {
|
|
228
|
+
const values = byKey.get(key);
|
|
229
|
+
if (values)
|
|
230
|
+
values.push(value);
|
|
231
|
+
else
|
|
232
|
+
byKey.set(key, [value]);
|
|
233
|
+
}
|
|
234
|
+
// Reject a duplicate for any key. After this test each key holds one value.
|
|
235
|
+
for (const values of byKey.values()) {
|
|
236
|
+
if (values.length !== 1)
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
// Reject an API-key prefix in any decoded key and any decoded value. The
|
|
240
|
+
// `URLSearchParams` decoder turns a percent-encoded name into its literal
|
|
241
|
+
// form, so a secret-shaped value can hide in a query name (for example,
|
|
242
|
+
// `sk%2Dant%2Dredacted` decodes to `sk-ant-redacted`). The parser rejects the
|
|
243
|
+
// prefix in the name and in the value, before it classifies an added key. The
|
|
244
|
+
// raw-candidate check stays in place as defense in depth.
|
|
245
|
+
for (const [key, values] of byKey) {
|
|
246
|
+
if (API_KEY_RE.test(key))
|
|
247
|
+
return false;
|
|
248
|
+
if (API_KEY_RE.test(values[0]))
|
|
249
|
+
return false;
|
|
250
|
+
}
|
|
251
|
+
// Require each required key.
|
|
252
|
+
for (const key of SETUP_TOKEN_URL_QUERY_KEYS) {
|
|
253
|
+
if (!byKey.has(key))
|
|
254
|
+
return false;
|
|
255
|
+
}
|
|
256
|
+
// Bound the added keys and validate each one.
|
|
257
|
+
const addedKeys = [...byKey.keys()].filter((key) => !SETUP_TOKEN_CORE_KEY_SET.has(key));
|
|
258
|
+
if (addedKeys.length > MAX_ADDED_KEYS)
|
|
259
|
+
return false;
|
|
260
|
+
for (const key of addedKeys) {
|
|
261
|
+
if (!ADDED_KEY_NAME_RE.test(key))
|
|
262
|
+
return false;
|
|
263
|
+
if (!ADDED_VALUE_RE.test(byKey.get(key)[0]))
|
|
264
|
+
return false;
|
|
265
|
+
}
|
|
266
|
+
// Validate each required value.
|
|
267
|
+
if (!CLIENT_ID_RE.test(byKey.get("client_id")[0]))
|
|
268
|
+
return false;
|
|
269
|
+
if (!CODE_RE.test(byKey.get("code")[0]))
|
|
270
|
+
return false;
|
|
271
|
+
if (!CODE_CHALLENGE_RE.test(byKey.get("code_challenge")[0]))
|
|
272
|
+
return false;
|
|
273
|
+
if (byKey.get("code_challenge_method")[0] !== "S256")
|
|
274
|
+
return false;
|
|
275
|
+
if (byKey.get("response_type")[0] !== "code")
|
|
276
|
+
return false;
|
|
277
|
+
if (!STATE_RE.test(byKey.get("state")[0]))
|
|
278
|
+
return false;
|
|
279
|
+
if (!isValidScope(byKey.get("scope")[0]))
|
|
280
|
+
return false;
|
|
281
|
+
if (!isValidRedirectUri(byKey.get("redirect_uri")[0]))
|
|
282
|
+
return false;
|
|
283
|
+
return true;
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Returns `candidate` when it is a valid authorization URL, or null. The final
|
|
287
|
+
* validator applies to every candidate, from an OSC 8 URI or from a plain-text
|
|
288
|
+
* reassembly. It requires the length cap {@link MAX_URL_LENGTH}, an exact
|
|
289
|
+
* lowercase host prefix, no API-key prefix in the raw candidate, the `https:`
|
|
290
|
+
* protocol, empty userinfo, empty port, no fragment, one of the two accepted
|
|
291
|
+
* origin-and-path pairs, and a valid query.
|
|
292
|
+
*/
|
|
293
|
+
function validateAuthUrl(candidate) {
|
|
294
|
+
if (candidate.length > MAX_URL_LENGTH)
|
|
295
|
+
return null;
|
|
296
|
+
if (!SETUP_TOKEN_AUTH_URL_PREFIXES.some((prefix) => candidate.startsWith(prefix)))
|
|
297
|
+
return null;
|
|
298
|
+
if (API_KEY_RE.test(candidate))
|
|
299
|
+
return null;
|
|
300
|
+
let parsed;
|
|
301
|
+
try {
|
|
302
|
+
parsed = new URL(candidate);
|
|
303
|
+
}
|
|
304
|
+
catch {
|
|
305
|
+
return null;
|
|
306
|
+
}
|
|
307
|
+
if (parsed.protocol !== "https:")
|
|
308
|
+
return null;
|
|
309
|
+
if (parsed.username !== "" || parsed.password !== "")
|
|
310
|
+
return null;
|
|
311
|
+
if (parsed.port !== "" || parsed.hash !== "")
|
|
312
|
+
return null;
|
|
313
|
+
const pair = `${parsed.origin}${parsed.pathname}`;
|
|
314
|
+
if (!SETUP_TOKEN_AUTH_URLS.includes(pair))
|
|
315
|
+
return null;
|
|
316
|
+
if (!hasValidQuery(parsed))
|
|
317
|
+
return null;
|
|
318
|
+
return candidate;
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Reassembles a wrapped plain-text URL from the physical lines and validates it.
|
|
322
|
+
* The parser starts at `startLine`, then joins at most {@link MAX_URL_LINES}
|
|
323
|
+
* consecutive URL-character-only physical lines into at most {@link
|
|
324
|
+
* MAX_URL_LENGTH} characters. It validates the joined string after each join and
|
|
325
|
+
* returns the first joined string that passes {@link validateAuthUrl}. A CLI that
|
|
326
|
+
* emits the whole URL on one line passes on the first join. A CLI that wraps the
|
|
327
|
+
* URL passes once the parser joins the last fragment. Returns null when no bounded
|
|
328
|
+
* join validates.
|
|
329
|
+
*/
|
|
330
|
+
function reassembleUrl(lines, startLine) {
|
|
331
|
+
let joined = "";
|
|
332
|
+
for (let offset = 0; offset < MAX_URL_LINES && startLine + offset < lines.length; offset += 1) {
|
|
333
|
+
const trimmed = lines[startLine + offset].trim();
|
|
334
|
+
if (trimmed.length === 0 || !URL_CHARS_ONLY_RE.test(trimmed))
|
|
335
|
+
break;
|
|
336
|
+
joined += trimmed;
|
|
337
|
+
if (joined.length > MAX_URL_LENGTH)
|
|
338
|
+
break;
|
|
339
|
+
const url = validateAuthUrl(joined);
|
|
340
|
+
if (url)
|
|
341
|
+
return { url, endLine: startLine + offset };
|
|
342
|
+
}
|
|
343
|
+
return null;
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Returns the canonical browser-code prompt when `lines` holds it on a dedicated
|
|
347
|
+
* line after the URL block. The parser reads the non-blank lines after the URL
|
|
348
|
+
* end line. The Claude UI can emit one full URL line per wrapped display row, so
|
|
349
|
+
* it repeats the same full authorization URL on a few consecutive lines. The
|
|
350
|
+
* parser skips a line that repeats `url`, then binds the prompt on the first
|
|
351
|
+
* non-blank, non-repeat line. That line must match the exact prompt shape.
|
|
352
|
+
* Returns null when the first non-blank, non-repeat line is not the prompt.
|
|
353
|
+
*/
|
|
354
|
+
function findBrowserCodePrompt(lines, endLine, url) {
|
|
355
|
+
for (let i = endLine + 1; i < lines.length; i += 1) {
|
|
356
|
+
const trimmed = lines[i].trim();
|
|
357
|
+
if (trimmed.length === 0)
|
|
358
|
+
continue;
|
|
359
|
+
// Skip a line that repeats the full URL. Strip the trailing prose
|
|
360
|
+
// punctuation first, the same way the repeated-URL comparison needs, so a
|
|
361
|
+
// repeated URL with a trailing punctuation mark still matches.
|
|
362
|
+
if (trimmed.replace(TRAILING_PUNCTUATION_RE, "") === url)
|
|
363
|
+
continue;
|
|
364
|
+
return PROMPT_LINE_RE.test(trimmed) ? SETUP_TOKEN_PROMPT : null;
|
|
365
|
+
}
|
|
366
|
+
return null;
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Parses Claude `setup-token` login output. Removes the terminal control
|
|
370
|
+
* sequences first, so colored and hyperlinked output reads the same as plain
|
|
371
|
+
* output. The parser finds the URL preamble, then a physical line that starts the
|
|
372
|
+
* authorization URL within {@link MAX_PREAMBLE_TO_URL_GAP} characters of the
|
|
373
|
+
* preamble, then reassembles the wrapped URL and validates the final string, then
|
|
374
|
+
* binds the browser-code prompt on the dedicated line after the URL block. So the
|
|
375
|
+
* URL binds to the login context and the prompt binds to the URL. Returns the
|
|
376
|
+
* authorization URL and the browser-code prompt when both are present and valid.
|
|
377
|
+
* Returns null for any other input, including a non-string input, an absent
|
|
378
|
+
* preamble, a URL with a wrong host, path, query, or fragment, an API-key-shaped
|
|
379
|
+
* URL, and a missing or misplaced prompt. Never throws on input, and never puts
|
|
380
|
+
* any input byte into a log or an error. This phase returns no token.
|
|
381
|
+
*/
|
|
382
|
+
export function parseSetupTokenPrompt(text) {
|
|
383
|
+
if (typeof text !== "string" || text.length === 0)
|
|
384
|
+
return null;
|
|
385
|
+
const clean = stripTerminalControls(text);
|
|
386
|
+
const preamble = URL_PREAMBLE_RE.exec(clean);
|
|
387
|
+
if (!preamble)
|
|
388
|
+
return null;
|
|
389
|
+
const afterPreamble = preamble.index + preamble[0].length;
|
|
390
|
+
// The region after the preamble. The URL must start inside the start window.
|
|
391
|
+
const region = clean.slice(afterPreamble);
|
|
392
|
+
const lines = region.split("\n");
|
|
393
|
+
// Walk the physical lines and track the character offset of each line start.
|
|
394
|
+
// The URL must start within MAX_PREAMBLE_TO_URL_GAP characters of the preamble.
|
|
395
|
+
let offset = 0;
|
|
396
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
397
|
+
const lineStart = offset;
|
|
398
|
+
offset += lines[i].length + 1;
|
|
399
|
+
if (lineStart > MAX_PREAMBLE_TO_URL_GAP)
|
|
400
|
+
break;
|
|
401
|
+
const trimmed = lines[i].trim();
|
|
402
|
+
if (!SETUP_TOKEN_AUTH_URL_PREFIXES.some((prefix) => trimmed.startsWith(prefix)))
|
|
403
|
+
continue;
|
|
404
|
+
const match = reassembleUrl(lines, i);
|
|
405
|
+
if (!match)
|
|
406
|
+
continue;
|
|
407
|
+
const prompt = findBrowserCodePrompt(lines, match.endLine, match.url);
|
|
408
|
+
if (prompt)
|
|
409
|
+
return { url: match.url, prompt };
|
|
410
|
+
}
|
|
411
|
+
return null;
|
|
412
|
+
}
|
|
413
|
+
// --- The success token parser ------------------------------------------------
|
|
414
|
+
// The literal prefix of the Claude setup-token OAuth token. The success screen
|
|
415
|
+
// prints a token that starts with this exact prefix. The opaque tail follows.
|
|
416
|
+
export const SETUP_TOKEN_PREFIX = "sk-ant-oat01-";
|
|
417
|
+
// The line that introduces the token. The success screen prints this exact line
|
|
418
|
+
// right before the token block. The token parser binds the token to this anchor.
|
|
419
|
+
export const SETUP_TOKEN_BEFORE_ANCHOR = "Your OAuth token (valid for 1 year):";
|
|
420
|
+
// The line that follows the token. The success screen prints this exact line
|
|
421
|
+
// right after the token block. The token parser binds the token to this anchor.
|
|
422
|
+
export const SETUP_TOKEN_AFTER_ANCHOR = "Store this token securely. You won't be able to see it again.";
|
|
423
|
+
// One physical line of the token. The terminal wraps the token at the
|
|
424
|
+
// pseudo-terminal width, so one physical line holds one fragment of the token
|
|
425
|
+
// character class. The token character class is `[A-Za-z0-9_-]`; the opaque tail
|
|
426
|
+
// can contain `-`, so a line fragment can contain `-`.
|
|
427
|
+
const TOKEN_FRAGMENT_RE = /^[A-Za-z0-9_-]+$/;
|
|
428
|
+
// The full token shape after the parser joins the wrapped fragments. The token
|
|
429
|
+
// starts with the exact prefix and continues over the token character class. The
|
|
430
|
+
// minimum tail length rejects a bare prefix and a short, noisy candidate. A real
|
|
431
|
+
// opaque tail is far longer than this floor.
|
|
432
|
+
const FULL_TOKEN_RE = /^sk-ant-oat01-[A-Za-z0-9_-]{20,}$/;
|
|
433
|
+
/**
|
|
434
|
+
* Returns the index of the one line that equals `anchor` after a trim. Returns
|
|
435
|
+
* null when no line matches. Returns null when more than one line matches, so a
|
|
436
|
+
* duplicate success block fails closed.
|
|
437
|
+
*/
|
|
438
|
+
function singleAnchorIndex(lines, anchor) {
|
|
439
|
+
let found = null;
|
|
440
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
441
|
+
if (lines[i].trim() !== anchor)
|
|
442
|
+
continue;
|
|
443
|
+
if (found !== null)
|
|
444
|
+
return null;
|
|
445
|
+
found = i;
|
|
446
|
+
}
|
|
447
|
+
return found;
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* Parses the Claude `setup-token` success screen and returns the minted OAuth
|
|
451
|
+
* token, or null. The parser removes the terminal control sequences first, then
|
|
452
|
+
* binds the token to the exact success record. It requires the before-anchor
|
|
453
|
+
* line {@link SETUP_TOKEN_BEFORE_ANCHOR} and the after-anchor line
|
|
454
|
+
* {@link SETUP_TOKEN_AFTER_ANCHOR}, in that order, exactly one time each. It
|
|
455
|
+
* reads only the lines between the two anchors. It de-wraps the token: it joins
|
|
456
|
+
* the fragment lines with no separator, the same way the terminal split one
|
|
457
|
+
* token across the physical lines. It validates the joined value against the
|
|
458
|
+
* token shape.
|
|
459
|
+
*
|
|
460
|
+
* The parser fails closed for any other input. It returns null for a
|
|
461
|
+
* token-shaped value outside the two anchors (before submit, in retry or error
|
|
462
|
+
* text, or after a cancellation), a duplicate success block, an anchor out of
|
|
463
|
+
* order, a missing anchor, extra text on a token line, a stray prose line
|
|
464
|
+
* between the anchors, a wrong prefix, and a value that does not match the token
|
|
465
|
+
* shape. It never logs any input byte and never puts any input byte into a
|
|
466
|
+
* thrown error. The parser is a pure function.
|
|
467
|
+
*/
|
|
468
|
+
export function parseSetupTokenCredential(text) {
|
|
469
|
+
if (typeof text !== "string" || text.length === 0)
|
|
470
|
+
return null;
|
|
471
|
+
const clean = stripTerminalControls(text);
|
|
472
|
+
// Canonicalize the record delimiter. The real terminal redraw joins the
|
|
473
|
+
// before-anchor line, the token, and the after-anchor line with a bare
|
|
474
|
+
// carriage return, or a CRLF pair, instead of a line feed. Map each CRLF and
|
|
475
|
+
// each bare carriage return to one line feed, so each anchor line and each
|
|
476
|
+
// token fragment lands on its own line. This step changes the record
|
|
477
|
+
// delimiter only. It cannot add a token byte, and the interval validation
|
|
478
|
+
// below still rejects partial, extra, or prose data.
|
|
479
|
+
const normalized = clean.replace(/\r\n|\r/g, "\n");
|
|
480
|
+
const lines = normalized.split("\n");
|
|
481
|
+
const beforeIndex = singleAnchorIndex(lines, SETUP_TOKEN_BEFORE_ANCHOR);
|
|
482
|
+
const afterIndex = singleAnchorIndex(lines, SETUP_TOKEN_AFTER_ANCHOR);
|
|
483
|
+
if (beforeIndex === null || afterIndex === null)
|
|
484
|
+
return null;
|
|
485
|
+
if (afterIndex <= beforeIndex)
|
|
486
|
+
return null;
|
|
487
|
+
// Read only the non-blank lines strictly between the two anchors. Each line
|
|
488
|
+
// must be one token fragment. A stray prose line, or extra text on a token
|
|
489
|
+
// line, fails the fragment test and the parser returns null.
|
|
490
|
+
const fragments = [];
|
|
491
|
+
for (let i = beforeIndex + 1; i < afterIndex; i += 1) {
|
|
492
|
+
const trimmed = lines[i].trim();
|
|
493
|
+
if (trimmed.length === 0)
|
|
494
|
+
continue;
|
|
495
|
+
if (!TOKEN_FRAGMENT_RE.test(trimmed))
|
|
496
|
+
return null;
|
|
497
|
+
fragments.push(trimmed);
|
|
498
|
+
}
|
|
499
|
+
if (fragments.length === 0)
|
|
500
|
+
return null;
|
|
501
|
+
const token = fragments.join("");
|
|
502
|
+
if (!FULL_TOKEN_RE.test(token))
|
|
503
|
+
return null;
|
|
504
|
+
return token;
|
|
505
|
+
}
|
|
506
|
+
//# sourceMappingURL=setup-token-parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-token-parse.js","sourceRoot":"","sources":["../../src/server/setup-token-parse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-token-parse.test.d.ts","sourceRoot":"","sources":["../../src/server/setup-token-parse.test.ts"],"names":[],"mappings":""}
|