claude-triggers 0.1.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.
@@ -0,0 +1,279 @@
1
+ /**
2
+ * Claude Code credential management.
3
+ *
4
+ * Reads OAuth tokens from:
5
+ * 1. macOS Keychain ("Claude Code-credentials")
6
+ * 2. ~/.claude/.credentials.json
7
+ *
8
+ * Refreshes tokens via:
9
+ * 1. Direct OAuth refresh_token grant (same as Claude Code)
10
+ * 2. Fallback: shell out to `claude` CLI
11
+ *
12
+ * Token storage after refresh writes back to the same credential store
13
+ * so other tools (Claude Code, opencode, etc.) pick up the new token.
14
+ */
15
+ import { execSync } from "node:child_process";
16
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
17
+ import { join, dirname } from "node:path";
18
+ import { homedir } from "node:os";
19
+ // ─── Constants (from Claude Code v2.1.81) ───
20
+ const KEYCHAIN_SERVICE = "Claude Code-credentials";
21
+ const CREDENTIALS_PATH = join(homedir(), ".claude", ".credentials.json");
22
+ const TOKEN_URL = "https://platform.claude.com/v1/oauth/token";
23
+ const CLIENT_ID = "9d1c250a-e61b-44d9-88ed-5944d1962f5e";
24
+ const DEFAULT_SCOPES = [
25
+ "user:profile",
26
+ "user:inference",
27
+ "user:sessions:claude_code",
28
+ "user:mcp_servers",
29
+ "user:file_upload",
30
+ ];
31
+ const CACHE_TTL_MS = 30_000;
32
+ const REFRESH_BUFFER_MS = 60_000; // Refresh if expires within 60s
33
+ // ─── Cache ───
34
+ let cached = null;
35
+ let cachedAt = 0;
36
+ /**
37
+ * Clear the in-memory credential cache. Call after external token refresh.
38
+ */
39
+ export function clearCredentialCache() {
40
+ cached = null;
41
+ cachedAt = 0;
42
+ }
43
+ // ─── Keychain (macOS) ───
44
+ function readKeychain() {
45
+ if (process.platform !== "darwin")
46
+ return null;
47
+ let raw;
48
+ try {
49
+ raw = execSync(`security find-generic-password -s "${KEYCHAIN_SERVICE}" -w`, {
50
+ timeout: 3000,
51
+ encoding: "utf-8",
52
+ stdio: ["pipe", "pipe", "pipe"],
53
+ }).trim();
54
+ }
55
+ catch {
56
+ return null;
57
+ }
58
+ return parseCredentialJson(raw);
59
+ }
60
+ function writeKeychain(creds) {
61
+ if (process.platform !== "darwin")
62
+ return false;
63
+ const payload = JSON.stringify({
64
+ claudeAiOauth: {
65
+ accessToken: creds.accessToken,
66
+ refreshToken: creds.refreshToken,
67
+ expiresAt: creds.expiresAt,
68
+ scopes: creds.scopes ?? DEFAULT_SCOPES,
69
+ },
70
+ });
71
+ try {
72
+ // Delete existing first (security won't overwrite)
73
+ try {
74
+ execSync(`security delete-generic-password -s "${KEYCHAIN_SERVICE}"`, {
75
+ stdio: "pipe",
76
+ timeout: 3000,
77
+ });
78
+ }
79
+ catch {
80
+ // May not exist
81
+ }
82
+ execSync(`security add-generic-password -s "${KEYCHAIN_SERVICE}" -a "claude-code" -w "${payload.replace(/"/g, '\\"')}"`, { stdio: "pipe", timeout: 3000 });
83
+ return true;
84
+ }
85
+ catch {
86
+ return false;
87
+ }
88
+ }
89
+ // ─── Credentials File ───
90
+ function readCredentialsFile() {
91
+ try {
92
+ const raw = readFileSync(CREDENTIALS_PATH, "utf-8");
93
+ return parseCredentialJson(raw);
94
+ }
95
+ catch {
96
+ return null;
97
+ }
98
+ }
99
+ function writeCredentialsFile(creds) {
100
+ try {
101
+ let existing = {};
102
+ try {
103
+ existing = JSON.parse(readFileSync(CREDENTIALS_PATH, "utf-8"));
104
+ }
105
+ catch {
106
+ // Fresh file
107
+ }
108
+ existing.claudeAiOauth = {
109
+ accessToken: creds.accessToken,
110
+ refreshToken: creds.refreshToken,
111
+ expiresAt: creds.expiresAt,
112
+ scopes: creds.scopes ?? DEFAULT_SCOPES,
113
+ };
114
+ const dir = dirname(CREDENTIALS_PATH);
115
+ if (!existsSync(dir))
116
+ mkdirSync(dir, { recursive: true });
117
+ writeFileSync(CREDENTIALS_PATH, JSON.stringify(existing, null, 2), "utf-8");
118
+ return true;
119
+ }
120
+ catch {
121
+ return false;
122
+ }
123
+ }
124
+ // ─── Parsing ───
125
+ function parseCredentialJson(raw) {
126
+ try {
127
+ const parsed = JSON.parse(raw);
128
+ const data = (parsed.claudeAiOauth ?? parsed);
129
+ if (typeof data.accessToken !== "string" ||
130
+ typeof data.refreshToken !== "string" ||
131
+ typeof data.expiresAt !== "number") {
132
+ return null;
133
+ }
134
+ return {
135
+ accessToken: data.accessToken,
136
+ refreshToken: data.refreshToken,
137
+ expiresAt: data.expiresAt,
138
+ scopes: Array.isArray(data.scopes) ? data.scopes : undefined,
139
+ };
140
+ }
141
+ catch {
142
+ return null;
143
+ }
144
+ }
145
+ // ─── Token Refresh ───
146
+ /**
147
+ * Refresh OAuth token directly via Anthropic's token endpoint.
148
+ * This is the same flow Claude Code uses internally (mB6/refreshOAuthToken).
149
+ */
150
+ async function refreshTokenDirect(refreshToken) {
151
+ const body = {
152
+ grant_type: "refresh_token",
153
+ refresh_token: refreshToken,
154
+ client_id: CLIENT_ID,
155
+ scope: DEFAULT_SCOPES.join(" "),
156
+ };
157
+ try {
158
+ const resp = await fetch(TOKEN_URL, {
159
+ method: "POST",
160
+ headers: { "Content-Type": "application/json" },
161
+ body: JSON.stringify(body),
162
+ signal: AbortSignal.timeout(15_000),
163
+ });
164
+ if (!resp.ok)
165
+ return null;
166
+ const data = (await resp.json());
167
+ return {
168
+ accessToken: data.access_token,
169
+ refreshToken: data.refresh_token ?? refreshToken,
170
+ expiresAt: Date.now() + data.expires_in * 1000,
171
+ scopes: data.scope?.split(" ").filter(Boolean),
172
+ };
173
+ }
174
+ catch {
175
+ return null;
176
+ }
177
+ }
178
+ /**
179
+ * Fallback: refresh via Claude CLI invocation.
180
+ */
181
+ function refreshViaCli() {
182
+ try {
183
+ execSync("claude -p . --model haiku", {
184
+ timeout: 60_000,
185
+ encoding: "utf-8",
186
+ env: { ...process.env, TERM: "dumb" },
187
+ stdio: "ignore",
188
+ });
189
+ return true;
190
+ }
191
+ catch {
192
+ return false;
193
+ }
194
+ }
195
+ // ─── Store refreshed tokens ───
196
+ function storeCredentials(creds) {
197
+ // Write to both keychain and file for cross-tool compat
198
+ if (process.platform === "darwin") {
199
+ writeKeychain(creds);
200
+ }
201
+ writeCredentialsFile(creds);
202
+ cached = creds;
203
+ cachedAt = Date.now();
204
+ }
205
+ // ─── Public API ───
206
+ /**
207
+ * Read credentials from the Claude Code credential store (keychain or file).
208
+ * Does NOT refresh — returns whatever is stored.
209
+ */
210
+ export function readCredentials() {
211
+ return readKeychain() ?? readCredentialsFile();
212
+ }
213
+ /**
214
+ * Get valid credentials, refreshing if needed.
215
+ *
216
+ * 1. Check in-memory cache
217
+ * 2. Read from store
218
+ * 3. If expired/near-expiry: refresh via direct OAuth grant
219
+ * 4. Fallback: refresh via Claude CLI
220
+ * 5. Store refreshed tokens back
221
+ */
222
+ export async function getCredentials(forceRefresh = false) {
223
+ const now = Date.now();
224
+ // Cache hit
225
+ if (!forceRefresh &&
226
+ cached &&
227
+ now - cachedAt < CACHE_TTL_MS &&
228
+ cached.expiresAt > now + REFRESH_BUFFER_MS) {
229
+ return cached;
230
+ }
231
+ // Read from store
232
+ let creds = readCredentials();
233
+ // Valid and not near expiry
234
+ if (creds && !forceRefresh && creds.expiresAt > now + REFRESH_BUFFER_MS) {
235
+ cached = creds;
236
+ cachedAt = now;
237
+ return creds;
238
+ }
239
+ // Need refresh
240
+ if (creds?.refreshToken) {
241
+ // Try direct OAuth refresh first
242
+ const refreshed = await refreshTokenDirect(creds.refreshToken);
243
+ if (refreshed && refreshed.expiresAt > Date.now() + REFRESH_BUFFER_MS) {
244
+ storeCredentials(refreshed);
245
+ return refreshed;
246
+ }
247
+ }
248
+ // Fallback: CLI refresh
249
+ if (refreshViaCli()) {
250
+ creds = readCredentials();
251
+ if (creds && creds.expiresAt > Date.now() + REFRESH_BUFFER_MS) {
252
+ cached = creds;
253
+ cachedAt = Date.now();
254
+ return creds;
255
+ }
256
+ }
257
+ // Return whatever we have, even if expired (caller decides)
258
+ if (creds) {
259
+ cached = creds;
260
+ cachedAt = now;
261
+ }
262
+ return creds;
263
+ }
264
+ /**
265
+ * Get credentials synchronously (no refresh). For quick checks.
266
+ */
267
+ export function getCredentialsSync() {
268
+ const now = Date.now();
269
+ if (cached && now - cachedAt < CACHE_TTL_MS && cached.expiresAt > now + REFRESH_BUFFER_MS) {
270
+ return cached;
271
+ }
272
+ const creds = readCredentials();
273
+ if (creds) {
274
+ cached = creds;
275
+ cachedAt = now;
276
+ }
277
+ return creds;
278
+ }
279
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAIlC,+CAA+C;AAE/C,MAAM,gBAAgB,GAAG,yBAAyB,CAAC;AACnD,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC;AACzE,MAAM,SAAS,GAAG,4CAA4C,CAAC;AAC/D,MAAM,SAAS,GAAG,sCAAsC,CAAC;AACzD,MAAM,cAAc,GAAG;IACrB,cAAc;IACd,gBAAgB;IAChB,2BAA2B;IAC3B,kBAAkB;IAClB,kBAAkB;CACnB,CAAC;AAEF,MAAM,YAAY,GAAG,MAAM,CAAC;AAC5B,MAAM,iBAAiB,GAAG,MAAM,CAAC,CAAC,gCAAgC;AAElE,gBAAgB;AAEhB,IAAI,MAAM,GAA6B,IAAI,CAAC;AAC5C,IAAI,QAAQ,GAAG,CAAC,CAAC;AAEjB;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,GAAG,IAAI,CAAC;IACd,QAAQ,GAAG,CAAC,CAAC;AACf,CAAC;AAED,2BAA2B;AAE3B,SAAS,YAAY;IACnB,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE/C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,QAAQ,CAAC,sCAAsC,gBAAgB,MAAM,EAAE;YAC3E,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,aAAa,CAAC,KAAwB;IAC7C,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAEhD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;QAC7B,aAAa,EAAE;YACb,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,cAAc;SACvC;KACF,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,mDAAmD;QACnD,IAAI,CAAC;YACH,QAAQ,CAAC,wCAAwC,gBAAgB,GAAG,EAAE;gBACpE,KAAK,EAAE,MAAM;gBACb,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB;QAClB,CAAC;QAED,QAAQ,CACN,qCAAqC,gBAAgB,0BAA0B,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,EAC9G,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CACjC,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,2BAA2B;AAE3B,SAAS,mBAAmB;IAC1B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QACpD,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAwB;IACpD,IAAI,CAAC;QACH,IAAI,QAAQ,GAA4B,EAAE,CAAC;QAC3C,IAAI,CAAC;YACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC;QACjE,CAAC;QAAC,MAAM,CAAC;YACP,aAAa;QACf,CAAC;QAED,QAAQ,CAAC,aAAa,GAAG;YACvB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,cAAc;SACvC,CAAC;QAEF,MAAM,GAAG,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACtC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC5E,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,kBAAkB;AAElB,SAAS,mBAAmB,CAAC,GAAW;IACtC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;QAC1D,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,MAAM,CAA4B,CAAC;QAEzE,IACE,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ;YACpC,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ;YACrC,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,EAClC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAkB,CAAC,CAAC,CAAC,SAAS;SACzE,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,wBAAwB;AAExB;;;GAGG;AACH,KAAK,UAAU,kBAAkB,CAAC,YAAoB;IACpD,MAAM,IAAI,GAAG;QACX,UAAU,EAAE,eAAe;QAC3B,aAAa,EAAE,YAAY;QAC3B,SAAS,EAAE,SAAS;QACpB,KAAK,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;KAChC,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,IAAI,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,IAAI,CAAC;YAC1B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAE1B,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAuB,CAAC;QACvD,OAAO;YACL,WAAW,EAAE,IAAI,CAAC,YAAY;YAC9B,YAAY,EAAE,IAAI,CAAC,aAAa,IAAI,YAAY;YAChD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI;YAC9C,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;SAC/C,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,aAAa;IACpB,IAAI,CAAC;QACH,QAAQ,CAAC,2BAA2B,EAAE;YACpC,OAAO,EAAE,MAAM;YACf,QAAQ,EAAE,OAAO;YACjB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE;YACrC,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,iCAAiC;AAEjC,SAAS,gBAAgB,CAAC,KAAwB;IAChD,wDAAwD;IACxD,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,aAAa,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAM,GAAG,KAAK,CAAC;IACf,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AACxB,CAAC;AAED,qBAAqB;AAErB;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,YAAY,EAAE,IAAI,mBAAmB,EAAE,CAAC;AACjD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,YAAY,GAAG,KAAK;IACvD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,YAAY;IACZ,IACE,CAAC,YAAY;QACb,MAAM;QACN,GAAG,GAAG,QAAQ,GAAG,YAAY;QAC7B,MAAM,CAAC,SAAS,GAAG,GAAG,GAAG,iBAAiB,EAC1C,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,kBAAkB;IAClB,IAAI,KAAK,GAAG,eAAe,EAAE,CAAC;IAE9B,4BAA4B;IAC5B,IAAI,KAAK,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,SAAS,GAAG,GAAG,GAAG,iBAAiB,EAAE,CAAC;QACxE,MAAM,GAAG,KAAK,CAAC;QACf,QAAQ,GAAG,GAAG,CAAC;QACf,OAAO,KAAK,CAAC;IACf,CAAC;IAED,eAAe;IACf,IAAI,KAAK,EAAE,YAAY,EAAE,CAAC;QACxB,iCAAiC;QACjC,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC/D,IAAI,SAAS,IAAI,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,iBAAiB,EAAE,CAAC;YACtE,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAC5B,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,IAAI,aAAa,EAAE,EAAE,CAAC;QACpB,KAAK,GAAG,eAAe,EAAE,CAAC;QAC1B,IAAI,KAAK,IAAI,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,iBAAiB,EAAE,CAAC;YAC9D,MAAM,GAAG,KAAK,CAAC;YACf,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACtB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,4DAA4D;IAC5D,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,GAAG,KAAK,CAAC;QACf,QAAQ,GAAG,GAAG,CAAC;IACjB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,IAAI,MAAM,IAAI,GAAG,GAAG,QAAQ,GAAG,YAAY,IAAI,MAAM,CAAC,SAAS,GAAG,GAAG,GAAG,iBAAiB,EAAE,CAAC;QAC1F,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,GAAG,KAAK,CAAC;QACf,QAAQ,GAAG,GAAG,CAAC;IACjB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
package/dist/cron.d.ts ADDED
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Cron expression parser and utilities.
3
+ * Extracted from Claude Code v2.1.81 Kairos scheduler.
4
+ *
5
+ * Supports standard 5-field cron: minute hour day-of-month month day-of-week
6
+ */
7
+ interface CronFields {
8
+ minute: number[];
9
+ hour: number[];
10
+ dayOfMonth: number[];
11
+ month: number[];
12
+ dayOfWeek: number[];
13
+ }
14
+ /**
15
+ * Parse a 5-field cron expression. Returns null if invalid.
16
+ */
17
+ export declare function parseCron(expression: string): CronFields | null;
18
+ /**
19
+ * Get the next matching date after `after`.
20
+ * Scans minute-by-minute up to ~1 year (527040 minutes).
21
+ */
22
+ export declare function nextCronDate(fields: CronFields, after: Date): Date | null;
23
+ /**
24
+ * Validate a cron expression. Returns error message or null if valid.
25
+ */
26
+ export declare function validateCron(expression: string): string | null;
27
+ /**
28
+ * Convert a cron expression to a human-readable description.
29
+ */
30
+ export declare function describeCron(expression: string, options?: {
31
+ utc?: boolean;
32
+ }): string;
33
+ /**
34
+ * Parse an interval shorthand (5m, 2h, 1d) into a cron expression.
35
+ * Used by /loop-style commands.
36
+ */
37
+ export declare function intervalToCron(interval: string): string | null;
38
+ export {};
39
+ //# sourceMappingURL=cron.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron.d.ts","sourceRoot":"","sources":["../src/cron.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAcH,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AA6CD;;GAEG;AACH,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAkB/D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAqDzE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiB9D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CA8CpF;AA8BD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAyB9D"}
package/dist/cron.js ADDED
@@ -0,0 +1,257 @@
1
+ /**
2
+ * Cron expression parser and utilities.
3
+ * Extracted from Claude Code v2.1.81 Kairos scheduler.
4
+ *
5
+ * Supports standard 5-field cron: minute hour day-of-month month day-of-week
6
+ */
7
+ // ─── Cron field ranges ───
8
+ const FIELD_RANGES = [
9
+ { min: 0, max: 59 }, // minute
10
+ { min: 0, max: 23 }, // hour
11
+ { min: 1, max: 31 }, // day of month
12
+ { min: 1, max: 12 }, // month
13
+ { min: 0, max: 6 }, // day of week (0=Sunday)
14
+ ];
15
+ function parseField(field, range) {
16
+ const values = new Set();
17
+ for (const part of field.split(",")) {
18
+ const stepMatch = part.match(/^(.+)\/(\d+)$/);
19
+ let base = stepMatch ? stepMatch[1] : part;
20
+ const step = stepMatch ? parseInt(stepMatch[2], 10) : 1;
21
+ if (step < 1)
22
+ return null;
23
+ let start;
24
+ let end;
25
+ if (base === "*") {
26
+ start = range.min;
27
+ end = range.max;
28
+ }
29
+ else {
30
+ const rangeMatch = base.match(/^(\d+)-(\d+)$/);
31
+ if (rangeMatch) {
32
+ start = parseInt(rangeMatch[1], 10);
33
+ end = parseInt(rangeMatch[2], 10);
34
+ }
35
+ else {
36
+ const num = parseInt(base, 10);
37
+ if (isNaN(num) || num < range.min || num > range.max)
38
+ return null;
39
+ if (stepMatch) {
40
+ start = num;
41
+ end = range.max;
42
+ }
43
+ else {
44
+ values.add(num);
45
+ continue;
46
+ }
47
+ }
48
+ }
49
+ if (start < range.min || end > range.max || start > end)
50
+ return null;
51
+ for (let i = start; i <= end; i += step) {
52
+ values.add(i);
53
+ }
54
+ }
55
+ return values.size > 0 ? [...values].sort((a, b) => a - b) : null;
56
+ }
57
+ /**
58
+ * Parse a 5-field cron expression. Returns null if invalid.
59
+ */
60
+ export function parseCron(expression) {
61
+ const parts = expression.trim().split(/\s+/);
62
+ if (parts.length !== 5)
63
+ return null;
64
+ const fields = [];
65
+ for (let i = 0; i < 5; i++) {
66
+ const parsed = parseField(parts[i], FIELD_RANGES[i]);
67
+ if (!parsed)
68
+ return null;
69
+ fields.push(parsed);
70
+ }
71
+ return {
72
+ minute: fields[0],
73
+ hour: fields[1],
74
+ dayOfMonth: fields[2],
75
+ month: fields[3],
76
+ dayOfWeek: fields[4],
77
+ };
78
+ }
79
+ /**
80
+ * Get the next matching date after `after`.
81
+ * Scans minute-by-minute up to ~1 year (527040 minutes).
82
+ */
83
+ export function nextCronDate(fields, after) {
84
+ const minute = new Set(fields.minute);
85
+ const hour = new Set(fields.hour);
86
+ const dom = new Set(fields.dayOfMonth);
87
+ const month = new Set(fields.month);
88
+ const dow = new Set(fields.dayOfWeek);
89
+ const allDom = fields.dayOfMonth.length === 31;
90
+ const allDow = fields.dayOfWeek.length === 7;
91
+ const cursor = new Date(after.getTime());
92
+ cursor.setSeconds(0, 0);
93
+ cursor.setMinutes(cursor.getMinutes() + 1);
94
+ const MAX_ITERATIONS = 527040; // ~1 year of minutes
95
+ for (let i = 0; i < MAX_ITERATIONS; i++) {
96
+ const m = cursor.getMonth() + 1;
97
+ if (!month.has(m)) {
98
+ cursor.setMonth(cursor.getMonth() + 1, 1);
99
+ cursor.setHours(0, 0, 0, 0);
100
+ continue;
101
+ }
102
+ const d = cursor.getDate();
103
+ const w = cursor.getDay();
104
+ const dayMatch = allDom && allDow
105
+ ? true
106
+ : allDom
107
+ ? dow.has(w)
108
+ : allDow
109
+ ? dom.has(d)
110
+ : dom.has(d) || dow.has(w);
111
+ if (!dayMatch) {
112
+ cursor.setDate(cursor.getDate() + 1);
113
+ cursor.setHours(0, 0, 0, 0);
114
+ continue;
115
+ }
116
+ if (!hour.has(cursor.getHours())) {
117
+ cursor.setHours(cursor.getHours() + 1, 0, 0, 0);
118
+ continue;
119
+ }
120
+ if (!minute.has(cursor.getMinutes())) {
121
+ cursor.setMinutes(cursor.getMinutes() + 1);
122
+ continue;
123
+ }
124
+ return cursor;
125
+ }
126
+ return null;
127
+ }
128
+ /**
129
+ * Validate a cron expression. Returns error message or null if valid.
130
+ */
131
+ export function validateCron(expression) {
132
+ const fields = parseCron(expression);
133
+ if (!fields)
134
+ return `Invalid cron expression '${expression}'. Expected 5 fields: M H DoM Mon DoW.`;
135
+ const next = nextCronDate(fields, new Date());
136
+ if (!next)
137
+ return `Cron expression '${expression}' does not match any date in the next year.`;
138
+ // Check minimum 1-hour interval (trigger API constraint)
139
+ const second = nextCronDate(fields, next);
140
+ if (second) {
141
+ const intervalMs = second.getTime() - next.getTime();
142
+ if (intervalMs < 3600_000) {
143
+ return `Minimum trigger interval is 1 hour. '${expression}' fires every ${Math.round(intervalMs / 60_000)} minutes.`;
144
+ }
145
+ }
146
+ return null;
147
+ }
148
+ /**
149
+ * Convert a cron expression to a human-readable description.
150
+ */
151
+ export function describeCron(expression, options) {
152
+ const utc = options?.utc ?? false;
153
+ const parts = expression.trim().split(/\s+/);
154
+ if (parts.length !== 5)
155
+ return expression;
156
+ const [min, hr, dom, mon, dow] = parts;
157
+ // Every N minutes
158
+ const everyMin = min.match(/^\*\/(\d+)$/);
159
+ if (everyMin && hr === "*" && dom === "*" && mon === "*" && dow === "*") {
160
+ const n = parseInt(everyMin[1], 10);
161
+ return n === 1 ? "Every minute" : `Every ${n} minutes`;
162
+ }
163
+ // Every N hours at minute M
164
+ if (min.match(/^\d+$/) && hr === "*" && dom === "*" && mon === "*" && dow === "*") {
165
+ const m = parseInt(min, 10);
166
+ if (m === 0)
167
+ return "Every hour, on the hour";
168
+ return `Every hour at :${m.toString().padStart(2, "0")}`;
169
+ }
170
+ const everyHr = hr.match(/^\*\/(\d+)$/);
171
+ if (min.match(/^\d+$/) && everyHr && dom === "*" && mon === "*" && dow === "*") {
172
+ const n = parseInt(everyHr[1], 10);
173
+ const m = parseInt(min, 10);
174
+ return `Every ${n} hours at :${m.toString().padStart(2, "0")}`;
175
+ }
176
+ // Specific time daily
177
+ if (min.match(/^\d+$/) && hr.match(/^\d+$/) && dom === "*" && mon === "*") {
178
+ const h = parseInt(hr, 10);
179
+ const m = parseInt(min, 10);
180
+ const time = formatTime(h, m, utc);
181
+ if (dow === "*")
182
+ return `Daily at ${time}`;
183
+ return `${describeDow(dow)} at ${time}`;
184
+ }
185
+ // Monthly
186
+ if (min.match(/^\d+$/) && hr.match(/^\d+$/) && dom.match(/^\d+$/) && mon === "*" && dow === "*") {
187
+ const h = parseInt(hr, 10);
188
+ const m = parseInt(min, 10);
189
+ const d = parseInt(dom, 10);
190
+ return `Monthly on the ${ordinal(d)} at ${formatTime(h, m, utc)}`;
191
+ }
192
+ return expression;
193
+ }
194
+ function formatTime(h, m, utc) {
195
+ const suffix = utc ? " UTC" : "";
196
+ if (h === 0)
197
+ return `12:${m.toString().padStart(2, "0")}am${suffix}`;
198
+ if (h < 12)
199
+ return `${h}:${m.toString().padStart(2, "0")}am${suffix}`;
200
+ if (h === 12)
201
+ return `12:${m.toString().padStart(2, "0")}pm${suffix}`;
202
+ return `${h - 12}:${m.toString().padStart(2, "0")}pm${suffix}`;
203
+ }
204
+ function describeDow(dow) {
205
+ const days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
206
+ if (dow === "1-5")
207
+ return "Weekdays";
208
+ if (dow === "0,6")
209
+ return "Weekends";
210
+ return dow
211
+ .split(",")
212
+ .map((d) => days[parseInt(d, 10)] ?? d)
213
+ .join(", ");
214
+ }
215
+ function ordinal(n) {
216
+ if (n > 3 && n < 21)
217
+ return `${n}th`;
218
+ switch (n % 10) {
219
+ case 1: return `${n}st`;
220
+ case 2: return `${n}nd`;
221
+ case 3: return `${n}rd`;
222
+ default: return `${n}th`;
223
+ }
224
+ }
225
+ /**
226
+ * Parse an interval shorthand (5m, 2h, 1d) into a cron expression.
227
+ * Used by /loop-style commands.
228
+ */
229
+ export function intervalToCron(interval) {
230
+ const match = interval.match(/^(\d+)([smhd])$/);
231
+ if (!match)
232
+ return null;
233
+ let n = parseInt(match[1], 10);
234
+ const unit = match[2];
235
+ switch (unit) {
236
+ case "s":
237
+ n = Math.max(1, Math.ceil(n / 60));
238
+ // fallthrough to minutes
239
+ case "m":
240
+ if (n <= 59)
241
+ return `*/${n} * * * *`;
242
+ // Round to hours
243
+ const hours = Math.round(n / 60);
244
+ if (hours > 0 && 24 % hours === 0)
245
+ return `0 */${hours} * * *`;
246
+ return `0 */${hours} * * *`;
247
+ case "h":
248
+ if (n <= 23)
249
+ return `0 */${n} * * *`;
250
+ return `0 0 */${Math.round(n / 24)} * *`;
251
+ case "d":
252
+ return `0 0 */${n} * *`;
253
+ default:
254
+ return null;
255
+ }
256
+ }
257
+ //# sourceMappingURL=cron.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron.js","sourceRoot":"","sources":["../src/cron.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { ClaudeTriggersClient, buildTriggerBody } from "./client.js";
2
+ export { getCredentials, getCredentialsSync, readCredentials, clearCredentialCache, } from "./credentials.js";
3
+ export { parseCron, nextCronDate, validateCron, describeCron, intervalToCron, } from "./cron.js";
4
+ export type { ClaudeCredentials, OAuthTokenResponse, OrgProfile, Environment, CreateEnvironmentConfig, Trigger, TriggerListResponse, TriggerResponse, TriggerRunResponse, CreateTriggerBody, UpdateTriggerBody, TriggerEvent, TriggerJobConfig, SessionContext, McpConnection, Session, SessionListResponse, ApiResponse, ClientOptions, } from "./types.js";
5
+ export { TriggerApiError, AuthError } from "./types.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAErE,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,cAAc,GACf,MAAM,WAAW,CAAC;AAEnB,YAAY,EACV,iBAAiB,EACjB,kBAAkB,EAClB,UAAU,EACV,WAAW,EACX,uBAAuB,EACvB,OAAO,EACP,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,OAAO,EACP,mBAAmB,EACnB,WAAW,EACX,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export { ClaudeTriggersClient, buildTriggerBody } from "./client.js";
2
+ export { getCredentials, getCredentialsSync, readCredentials, clearCredentialCache, } from "./credentials.js";
3
+ export { parseCron, nextCronDate, validateCron, describeCron, intervalToCron, } from "./cron.js";
4
+ export { TriggerApiError, AuthError } from "./types.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAErE,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,cAAc,GACf,MAAM,WAAW,CAAC;AAwBnB,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC"}