agent-relay 6.0.17 → 6.0.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +105 -31
- package/dist/packages/cloud/src/api-client.d.ts +33 -0
- package/dist/packages/cloud/src/api-client.d.ts.map +1 -0
- package/dist/packages/cloud/src/api-client.js +123 -0
- package/dist/packages/cloud/src/api-client.js.map +1 -0
- package/dist/packages/cloud/src/auth.d.ts +13 -0
- package/dist/packages/cloud/src/auth.d.ts.map +1 -0
- package/dist/packages/cloud/src/auth.js +299 -0
- package/dist/packages/cloud/src/auth.js.map +1 -0
- package/dist/packages/cloud/src/connect.d.ts +45 -0
- package/dist/packages/cloud/src/connect.d.ts.map +1 -0
- package/dist/packages/cloud/src/connect.js +166 -0
- package/dist/packages/cloud/src/connect.js.map +1 -0
- package/dist/packages/cloud/src/index.d.ts +10 -0
- package/dist/packages/cloud/src/index.d.ts.map +1 -0
- package/dist/packages/cloud/src/index.js +10 -0
- package/dist/packages/cloud/src/index.js.map +1 -0
- package/dist/packages/cloud/src/lib/ssh-interactive.d.ts +70 -0
- package/dist/packages/cloud/src/lib/ssh-interactive.d.ts.map +1 -0
- package/dist/packages/cloud/src/lib/ssh-interactive.js +440 -0
- package/dist/packages/cloud/src/lib/ssh-interactive.js.map +1 -0
- package/dist/packages/cloud/src/lib/ssh-runtime.d.ts +35 -0
- package/dist/packages/cloud/src/lib/ssh-runtime.d.ts.map +1 -0
- package/dist/packages/cloud/src/lib/ssh-runtime.js +52 -0
- package/dist/packages/cloud/src/lib/ssh-runtime.js.map +1 -0
- package/dist/packages/cloud/src/proactive-runtime.d.ts +24 -0
- package/dist/packages/cloud/src/proactive-runtime.d.ts.map +1 -0
- package/dist/packages/cloud/src/proactive-runtime.js +315 -0
- package/dist/packages/cloud/src/proactive-runtime.js.map +1 -0
- package/dist/packages/cloud/src/types.d.ts +200 -0
- package/dist/packages/cloud/src/types.d.ts.map +1 -0
- package/dist/packages/cloud/src/types.js +12 -0
- package/dist/packages/cloud/src/types.js.map +1 -0
- package/dist/packages/cloud/src/workflows.d.ts +65 -0
- package/dist/packages/cloud/src/workflows.d.ts.map +1 -0
- package/dist/packages/cloud/src/workflows.js +892 -0
- package/dist/packages/cloud/src/workflows.js.map +1 -0
- package/dist/packages/cloud/src/workspaces.d.ts +11 -0
- package/dist/packages/cloud/src/workspaces.d.ts.map +1 -0
- package/dist/packages/cloud/src/workspaces.js +146 -0
- package/dist/packages/cloud/src/workspaces.js.map +1 -0
- package/dist/src/cli/bootstrap.d.ts +3 -1
- package/dist/src/cli/bootstrap.d.ts.map +1 -1
- package/dist/src/cli/bootstrap.js +17 -3
- package/dist/src/cli/bootstrap.js.map +1 -1
- package/dist/src/cli/commands/cloud.js +1 -1
- package/dist/src/cli/commands/cloud.js.map +1 -1
- package/dist/src/cli/commands/dlq.d.ts +20 -0
- package/dist/src/cli/commands/dlq.d.ts.map +1 -0
- package/dist/src/cli/commands/dlq.js +456 -0
- package/dist/src/cli/commands/dlq.js.map +1 -0
- package/dist/src/cli/commands/proactive-bootstrap.d.ts +10 -0
- package/dist/src/cli/commands/proactive-bootstrap.d.ts.map +1 -0
- package/dist/src/cli/commands/proactive-bootstrap.js +133 -0
- package/dist/src/cli/commands/proactive-bootstrap.js.map +1 -0
- package/dist/src/cli/commands/relay-runtime.d.ts +58 -0
- package/dist/src/cli/commands/relay-runtime.d.ts.map +1 -0
- package/dist/src/cli/commands/relay-runtime.js +484 -0
- package/dist/src/cli/commands/relay-runtime.js.map +1 -0
- package/dist/src/cli/commands/setup.d.ts.map +1 -1
- package/dist/src/cli/commands/setup.js +11 -9
- package/dist/src/cli/commands/setup.js.map +1 -1
- package/package.json +11 -10
package/dist/index.cjs
CHANGED
|
@@ -42510,17 +42510,72 @@ function estimateTokens(text) {
|
|
|
42510
42510
|
return Math.ceil(length / 3.5);
|
|
42511
42511
|
}
|
|
42512
42512
|
const sampleSize = Math.min(1e3, length);
|
|
42513
|
-
const sample = text.substring(0, sampleSize);
|
|
42514
42513
|
let codeChars = 0;
|
|
42515
42514
|
let whitespaceChars = 0;
|
|
42516
|
-
let
|
|
42517
|
-
|
|
42518
|
-
|
|
42519
|
-
if (/\s/.test(char)) {
|
|
42515
|
+
for (let i = 0; i < sampleSize; i++) {
|
|
42516
|
+
const code = text.charCodeAt(i);
|
|
42517
|
+
if (code <= 32 || code === 127) {
|
|
42520
42518
|
whitespaceChars++;
|
|
42521
|
-
|
|
42522
|
-
|
|
42523
|
-
|
|
42519
|
+
continue;
|
|
42520
|
+
}
|
|
42521
|
+
switch (code) {
|
|
42522
|
+
case 33:
|
|
42523
|
+
// !
|
|
42524
|
+
case 35:
|
|
42525
|
+
// #
|
|
42526
|
+
case 36:
|
|
42527
|
+
// $
|
|
42528
|
+
case 37:
|
|
42529
|
+
// %
|
|
42530
|
+
case 38:
|
|
42531
|
+
// &
|
|
42532
|
+
case 40:
|
|
42533
|
+
// (
|
|
42534
|
+
case 41:
|
|
42535
|
+
// )
|
|
42536
|
+
case 42:
|
|
42537
|
+
// *
|
|
42538
|
+
case 43:
|
|
42539
|
+
// +
|
|
42540
|
+
case 44:
|
|
42541
|
+
// ,
|
|
42542
|
+
case 45:
|
|
42543
|
+
// -
|
|
42544
|
+
case 46:
|
|
42545
|
+
// .
|
|
42546
|
+
case 47:
|
|
42547
|
+
// /
|
|
42548
|
+
case 58:
|
|
42549
|
+
// :
|
|
42550
|
+
case 59:
|
|
42551
|
+
// ;
|
|
42552
|
+
case 60:
|
|
42553
|
+
// <
|
|
42554
|
+
case 61:
|
|
42555
|
+
// =
|
|
42556
|
+
case 62:
|
|
42557
|
+
// >
|
|
42558
|
+
case 64:
|
|
42559
|
+
// @
|
|
42560
|
+
case 91:
|
|
42561
|
+
// [
|
|
42562
|
+
case 93:
|
|
42563
|
+
// ]
|
|
42564
|
+
case 94:
|
|
42565
|
+
// ^
|
|
42566
|
+
case 96:
|
|
42567
|
+
// `
|
|
42568
|
+
case 123:
|
|
42569
|
+
// {
|
|
42570
|
+
case 124:
|
|
42571
|
+
// |
|
|
42572
|
+
case 125:
|
|
42573
|
+
// }
|
|
42574
|
+
case 126:
|
|
42575
|
+
codeChars++;
|
|
42576
|
+
break;
|
|
42577
|
+
default:
|
|
42578
|
+
break;
|
|
42524
42579
|
}
|
|
42525
42580
|
}
|
|
42526
42581
|
const codeRatio = codeChars / sampleSize;
|
|
@@ -42659,15 +42714,17 @@ function benchmarkTokenEstimation(iterations = 1e4) {
|
|
|
42659
42714
|
"A".repeat(1e4)
|
|
42660
42715
|
// 10k chars
|
|
42661
42716
|
];
|
|
42717
|
+
for (const text of testTexts) {
|
|
42718
|
+
estimateTokens(text);
|
|
42719
|
+
}
|
|
42662
42720
|
let maxNs = 0;
|
|
42663
42721
|
let totalTokens = 0;
|
|
42664
42722
|
const start = process.hrtime.bigint();
|
|
42665
42723
|
for (let i = 0; i < iterations; i++) {
|
|
42666
42724
|
for (const text of testTexts) {
|
|
42667
|
-
const
|
|
42668
|
-
|
|
42669
|
-
|
|
42670
|
-
const elapsed = Number(process.hrtime.bigint() - s3);
|
|
42725
|
+
const sampleStart = process.hrtime.bigint();
|
|
42726
|
+
totalTokens += estimateTokens(text);
|
|
42727
|
+
const elapsed = Number(process.hrtime.bigint() - sampleStart);
|
|
42671
42728
|
if (elapsed > maxNs)
|
|
42672
42729
|
maxNs = elapsed;
|
|
42673
42730
|
}
|
|
@@ -42745,12 +42802,15 @@ var init_context_compaction = __esm({
|
|
|
42745
42802
|
importanceMap.set(result[i].id, calculateImportance(result[i], i, result.length));
|
|
42746
42803
|
}
|
|
42747
42804
|
if (this.config.enableDeduplication) {
|
|
42805
|
+
const protectedRecentIds = new Set(this.config.keepRecentCount > 0 ? result.slice(-this.config.keepRecentCount).map((m2) => m2.id) : []);
|
|
42748
42806
|
const duplicates = findDuplicates(result, this.config.deduplicationThreshold);
|
|
42749
42807
|
if (duplicates.size > 0) {
|
|
42750
42808
|
const toRemove = /* @__PURE__ */ new Set();
|
|
42751
42809
|
for (const [, dups] of duplicates) {
|
|
42752
42810
|
for (const id of dups) {
|
|
42753
|
-
|
|
42811
|
+
if (!protectedRecentIds.has(id)) {
|
|
42812
|
+
toRemove.add(id);
|
|
42813
|
+
}
|
|
42754
42814
|
}
|
|
42755
42815
|
}
|
|
42756
42816
|
result = result.filter((m2) => !toRemove.has(m2.id));
|
|
@@ -42794,10 +42854,7 @@ var init_context_compaction = __esm({
|
|
|
42794
42854
|
if (messagesToSummarize.length >= 3) {
|
|
42795
42855
|
const summary = createSummary(messagesToSummarize);
|
|
42796
42856
|
const summaryIds = new Set(messagesToSummarize.map((m2) => m2.id));
|
|
42797
|
-
result = [
|
|
42798
|
-
summary,
|
|
42799
|
-
...result.filter((m2) => !summaryIds.has(m2.id))
|
|
42800
|
-
];
|
|
42857
|
+
result = [summary, ...result.filter((m2) => !summaryIds.has(m2.id))];
|
|
42801
42858
|
strategy = "summarize";
|
|
42802
42859
|
return {
|
|
42803
42860
|
messages: result,
|
|
@@ -91149,6 +91206,14 @@ function replaceOrphanedCsiPrefix(match) {
|
|
|
91149
91206
|
return replacement;
|
|
91150
91207
|
}
|
|
91151
91208
|
function stripAnsiFast(str) {
|
|
91209
|
+
if (str.length === 0) {
|
|
91210
|
+
return str;
|
|
91211
|
+
}
|
|
91212
|
+
const hasEscape = str.indexOf("\x1B") !== -1;
|
|
91213
|
+
const hasCarriageReturn = str.indexOf("\r") !== -1;
|
|
91214
|
+
if (!hasEscape && !hasCarriageReturn && str.indexOf("[") === -1) {
|
|
91215
|
+
return str;
|
|
91216
|
+
}
|
|
91152
91217
|
CURSOR_FORWARD_CSI_COMPILED.lastIndex = 0;
|
|
91153
91218
|
ORPHANED_CURSOR_FORWARD_CSI_COMPILED.lastIndex = 0;
|
|
91154
91219
|
ANSI_PATTERN_COMPILED.lastIndex = 0;
|
|
@@ -91246,14 +91311,17 @@ function benchmarkPatterns(iterations = 1e4) {
|
|
|
91246
91311
|
const results = {};
|
|
91247
91312
|
{
|
|
91248
91313
|
let maxNs = 0;
|
|
91314
|
+
for (const str of testStrings) {
|
|
91315
|
+
const sampleStart = process.hrtime.bigint();
|
|
91316
|
+
isInstructionalTextFast(str);
|
|
91317
|
+
const elapsed = Number(process.hrtime.bigint() - sampleStart);
|
|
91318
|
+
if (elapsed > maxNs)
|
|
91319
|
+
maxNs = elapsed;
|
|
91320
|
+
}
|
|
91249
91321
|
const start = process.hrtime.bigint();
|
|
91250
91322
|
for (let i = 0; i < iterations; i++) {
|
|
91251
91323
|
for (const str of testStrings) {
|
|
91252
|
-
const s3 = process.hrtime.bigint();
|
|
91253
91324
|
isInstructionalTextFast(str);
|
|
91254
|
-
const elapsed = Number(process.hrtime.bigint() - s3);
|
|
91255
|
-
if (elapsed > maxNs)
|
|
91256
|
-
maxNs = elapsed;
|
|
91257
91325
|
}
|
|
91258
91326
|
}
|
|
91259
91327
|
const totalNs = Number(process.hrtime.bigint() - start);
|
|
@@ -91264,14 +91332,17 @@ function benchmarkPatterns(iterations = 1e4) {
|
|
|
91264
91332
|
}
|
|
91265
91333
|
{
|
|
91266
91334
|
let maxNs = 0;
|
|
91335
|
+
for (const str of testStrings) {
|
|
91336
|
+
const sampleStart = process.hrtime.bigint();
|
|
91337
|
+
stripAnsiFast(str);
|
|
91338
|
+
const elapsed = Number(process.hrtime.bigint() - sampleStart);
|
|
91339
|
+
if (elapsed > maxNs)
|
|
91340
|
+
maxNs = elapsed;
|
|
91341
|
+
}
|
|
91267
91342
|
const start = process.hrtime.bigint();
|
|
91268
91343
|
for (let i = 0; i < iterations; i++) {
|
|
91269
91344
|
for (const str of testStrings) {
|
|
91270
|
-
const s3 = process.hrtime.bigint();
|
|
91271
91345
|
stripAnsiFast(str);
|
|
91272
|
-
const elapsed = Number(process.hrtime.bigint() - s3);
|
|
91273
|
-
if (elapsed > maxNs)
|
|
91274
|
-
maxNs = elapsed;
|
|
91275
91346
|
}
|
|
91276
91347
|
}
|
|
91277
91348
|
const totalNs = Number(process.hrtime.bigint() - start);
|
|
@@ -91283,14 +91354,17 @@ function benchmarkPatterns(iterations = 1e4) {
|
|
|
91283
91354
|
{
|
|
91284
91355
|
const targets = ["AgentName", "Lead", "Worker", "target", "Developer"];
|
|
91285
91356
|
let maxNs = 0;
|
|
91357
|
+
for (const target of targets) {
|
|
91358
|
+
const sampleStart = process.hrtime.bigint();
|
|
91359
|
+
isPlaceholderTargetFast(target);
|
|
91360
|
+
const elapsed = Number(process.hrtime.bigint() - sampleStart);
|
|
91361
|
+
if (elapsed > maxNs)
|
|
91362
|
+
maxNs = elapsed;
|
|
91363
|
+
}
|
|
91286
91364
|
const start = process.hrtime.bigint();
|
|
91287
91365
|
for (let i = 0; i < iterations; i++) {
|
|
91288
|
-
for (const
|
|
91289
|
-
|
|
91290
|
-
isPlaceholderTargetFast(t);
|
|
91291
|
-
const elapsed = Number(process.hrtime.bigint() - s3);
|
|
91292
|
-
if (elapsed > maxNs)
|
|
91293
|
-
maxNs = elapsed;
|
|
91366
|
+
for (const target of targets) {
|
|
91367
|
+
isPlaceholderTargetFast(target);
|
|
91294
91368
|
}
|
|
91295
91369
|
}
|
|
91296
91370
|
const totalNs = Number(process.hrtime.bigint() - start);
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type CloudApiClientOptions = {
|
|
2
|
+
apiUrl: string;
|
|
3
|
+
accessToken: string;
|
|
4
|
+
refreshToken: string;
|
|
5
|
+
accessTokenExpiresAt: string;
|
|
6
|
+
refreshTokenExpiresAt?: string;
|
|
7
|
+
};
|
|
8
|
+
export type CloudApiClientSnapshot = {
|
|
9
|
+
apiUrl: string;
|
|
10
|
+
accessToken: string;
|
|
11
|
+
refreshToken: string;
|
|
12
|
+
accessTokenExpiresAt: string;
|
|
13
|
+
refreshTokenExpiresAt?: string;
|
|
14
|
+
};
|
|
15
|
+
export declare function buildApiUrl(apiUrl: string, p: string): URL;
|
|
16
|
+
export declare class CloudApiClient {
|
|
17
|
+
private readonly options;
|
|
18
|
+
private accessToken;
|
|
19
|
+
private refreshToken;
|
|
20
|
+
private accessTokenExpiresAt;
|
|
21
|
+
private refreshTokenExpiresAt?;
|
|
22
|
+
private refreshPromise;
|
|
23
|
+
constructor(options: CloudApiClientOptions);
|
|
24
|
+
static fromEnv(env: NodeJS.ProcessEnv): CloudApiClient | null;
|
|
25
|
+
snapshot(): CloudApiClientSnapshot;
|
|
26
|
+
fetch(p: string, init?: RequestInit): Promise<Response>;
|
|
27
|
+
revoke(): Promise<void>;
|
|
28
|
+
private refresh;
|
|
29
|
+
private doRefresh;
|
|
30
|
+
private buildHeaders;
|
|
31
|
+
private shouldRefresh;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=api-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../../../packages/cloud/src/api-client.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC,CAAC;AAYF,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,GAAG,CAE1D;AAED,qBAAa,cAAc;IAOb,OAAO,CAAC,QAAQ,CAAC,OAAO;IANpC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,qBAAqB,CAAC,CAAS;IACvC,OAAO,CAAC,cAAc,CAA8B;gBAEvB,OAAO,EAAE,qBAAqB;IAO3D,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,cAAc,GAAG,IAAI;IAoB7D,QAAQ,IAAI,sBAAsB;IAU5B,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAoB3D,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;YAcf,OAAO;YAgBP,SAAS;IA8BvB,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,aAAa;CAQtB"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { REFRESH_WINDOW_MS } from './types.js';
|
|
2
|
+
function trimLeadingSlash(p) {
|
|
3
|
+
return p.replace(/^\/+/, '');
|
|
4
|
+
}
|
|
5
|
+
function withTrailingSlash(p) {
|
|
6
|
+
return p.endsWith('/') ? p : `${p}/`;
|
|
7
|
+
}
|
|
8
|
+
export function buildApiUrl(apiUrl, p) {
|
|
9
|
+
return new URL(trimLeadingSlash(p), withTrailingSlash(apiUrl));
|
|
10
|
+
}
|
|
11
|
+
export class CloudApiClient {
|
|
12
|
+
options;
|
|
13
|
+
accessToken;
|
|
14
|
+
refreshToken;
|
|
15
|
+
accessTokenExpiresAt;
|
|
16
|
+
refreshTokenExpiresAt;
|
|
17
|
+
refreshPromise = null;
|
|
18
|
+
constructor(options) {
|
|
19
|
+
this.options = options;
|
|
20
|
+
this.accessToken = options.accessToken;
|
|
21
|
+
this.refreshToken = options.refreshToken;
|
|
22
|
+
this.accessTokenExpiresAt = options.accessTokenExpiresAt;
|
|
23
|
+
this.refreshTokenExpiresAt = options.refreshTokenExpiresAt;
|
|
24
|
+
}
|
|
25
|
+
static fromEnv(env) {
|
|
26
|
+
const apiUrl = env.CLOUD_API_URL?.trim();
|
|
27
|
+
const accessToken = env.CLOUD_API_ACCESS_TOKEN?.trim();
|
|
28
|
+
const refreshToken = env.CLOUD_API_REFRESH_TOKEN?.trim();
|
|
29
|
+
const accessTokenExpiresAt = env.CLOUD_API_ACCESS_TOKEN_EXPIRES_AT?.trim();
|
|
30
|
+
const refreshTokenExpiresAt = env.CLOUD_API_REFRESH_TOKEN_EXPIRES_AT?.trim();
|
|
31
|
+
if (!apiUrl || !accessToken || !refreshToken || !accessTokenExpiresAt) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
return new CloudApiClient({
|
|
35
|
+
apiUrl,
|
|
36
|
+
accessToken,
|
|
37
|
+
refreshToken,
|
|
38
|
+
accessTokenExpiresAt,
|
|
39
|
+
refreshTokenExpiresAt,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
snapshot() {
|
|
43
|
+
return {
|
|
44
|
+
apiUrl: this.options.apiUrl,
|
|
45
|
+
accessToken: this.accessToken,
|
|
46
|
+
refreshToken: this.refreshToken,
|
|
47
|
+
accessTokenExpiresAt: this.accessTokenExpiresAt,
|
|
48
|
+
...(this.refreshTokenExpiresAt ? { refreshTokenExpiresAt: this.refreshTokenExpiresAt } : {}),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
async fetch(p, init = {}) {
|
|
52
|
+
await this.refresh();
|
|
53
|
+
const response = await fetch(buildApiUrl(this.options.apiUrl, p), {
|
|
54
|
+
...init,
|
|
55
|
+
headers: this.buildHeaders(init.headers),
|
|
56
|
+
});
|
|
57
|
+
if (response.status !== 401) {
|
|
58
|
+
return response;
|
|
59
|
+
}
|
|
60
|
+
await this.refresh(true);
|
|
61
|
+
return fetch(buildApiUrl(this.options.apiUrl, p), {
|
|
62
|
+
...init,
|
|
63
|
+
headers: this.buildHeaders(init.headers),
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
async revoke() {
|
|
67
|
+
const response = await fetch(buildApiUrl(this.options.apiUrl, '/api/v1/auth/token/revoke'), {
|
|
68
|
+
method: 'POST',
|
|
69
|
+
headers: {
|
|
70
|
+
'Content-Type': 'application/json',
|
|
71
|
+
},
|
|
72
|
+
body: JSON.stringify({ token: this.refreshToken }),
|
|
73
|
+
});
|
|
74
|
+
if (!response.ok && response.status !== 404) {
|
|
75
|
+
throw new Error(`Failed to revoke API token: ${response.status} ${response.statusText}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async refresh(force = false) {
|
|
79
|
+
if (this.refreshPromise) {
|
|
80
|
+
return this.refreshPromise;
|
|
81
|
+
}
|
|
82
|
+
if (!force && !this.shouldRefresh()) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
this.refreshPromise = this.doRefresh().finally(() => {
|
|
86
|
+
this.refreshPromise = null;
|
|
87
|
+
});
|
|
88
|
+
return this.refreshPromise;
|
|
89
|
+
}
|
|
90
|
+
async doRefresh() {
|
|
91
|
+
const response = await fetch(buildApiUrl(this.options.apiUrl, '/api/v1/auth/token/refresh'), {
|
|
92
|
+
method: 'POST',
|
|
93
|
+
headers: {
|
|
94
|
+
'Content-Type': 'application/json',
|
|
95
|
+
},
|
|
96
|
+
body: JSON.stringify({ refreshToken: this.refreshToken }),
|
|
97
|
+
});
|
|
98
|
+
if (!response.ok) {
|
|
99
|
+
throw new Error(`Failed to refresh API token: ${response.status} ${response.statusText}`);
|
|
100
|
+
}
|
|
101
|
+
const payload = (await response.json());
|
|
102
|
+
if (!payload.accessToken || !payload.accessTokenExpiresAt || !payload.refreshToken) {
|
|
103
|
+
throw new Error('Refresh response missing token fields');
|
|
104
|
+
}
|
|
105
|
+
this.accessToken = payload.accessToken;
|
|
106
|
+
this.accessTokenExpiresAt = payload.accessTokenExpiresAt;
|
|
107
|
+
this.refreshToken = payload.refreshToken;
|
|
108
|
+
this.refreshTokenExpiresAt = payload.refreshTokenExpiresAt;
|
|
109
|
+
}
|
|
110
|
+
buildHeaders(headers) {
|
|
111
|
+
const merged = new Headers(headers);
|
|
112
|
+
merged.set('Authorization', `Bearer ${this.accessToken}`);
|
|
113
|
+
return merged;
|
|
114
|
+
}
|
|
115
|
+
shouldRefresh() {
|
|
116
|
+
const expiresAt = Date.parse(this.accessTokenExpiresAt);
|
|
117
|
+
if (Number.isNaN(expiresAt)) {
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
return expiresAt - Date.now() <= REFRESH_WINDOW_MS;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=api-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../../../packages/cloud/src/api-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type StoredAuth } from './types.js';
|
|
2
|
+
export declare function readStoredAuth(env?: NodeJS.ProcessEnv): Promise<StoredAuth | null>;
|
|
3
|
+
export declare function writeStoredAuth(auth: StoredAuth): Promise<void>;
|
|
4
|
+
export declare function clearStoredAuth(): Promise<void>;
|
|
5
|
+
export declare function refreshStoredAuth(auth: StoredAuth): Promise<StoredAuth>;
|
|
6
|
+
export declare function ensureAuthenticated(apiUrl: string, options?: {
|
|
7
|
+
force?: boolean;
|
|
8
|
+
}): Promise<StoredAuth>;
|
|
9
|
+
export declare function authorizedApiFetch(auth: StoredAuth, requestPath: string, init: RequestInit): Promise<{
|
|
10
|
+
response: Response;
|
|
11
|
+
auth: StoredAuth;
|
|
12
|
+
}>;
|
|
13
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../packages/cloud/src/auth.ts"],"names":[],"mappings":"AAOA,OAAO,EAAqC,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAgEhF,wBAAsB,cAAc,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAarG;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CASrE;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAErD;AAyKD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAgC7E;AASD,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5B,OAAO,CAAC,UAAU,CAAC,CA0BrB;AAkBD,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,UAAU,EAChB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,WAAW,GAChB,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC,CAoBnD"}
|