agent-relay 6.0.16 → 6.0.18
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 +111 -32
- 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
|
@@ -1364,6 +1364,9 @@ var require_sender = __commonJS({
|
|
|
1364
1364
|
"use strict";
|
|
1365
1365
|
var { Duplex } = require("stream");
|
|
1366
1366
|
var { randomFillSync } = require("crypto");
|
|
1367
|
+
var {
|
|
1368
|
+
types: { isUint8Array }
|
|
1369
|
+
} = require("util");
|
|
1367
1370
|
var PerMessageDeflate2 = require_permessage_deflate();
|
|
1368
1371
|
var { EMPTY_BUFFER, kWebSocket, NOOP } = require_constants();
|
|
1369
1372
|
var { isBlob, isValidStatusCode } = require_validation();
|
|
@@ -1517,8 +1520,10 @@ var require_sender = __commonJS({
|
|
|
1517
1520
|
buf.writeUInt16BE(code, 0);
|
|
1518
1521
|
if (typeof data === "string") {
|
|
1519
1522
|
buf.write(data, 2);
|
|
1520
|
-
} else {
|
|
1523
|
+
} else if (isUint8Array(data)) {
|
|
1521
1524
|
buf.set(data, 2);
|
|
1525
|
+
} else {
|
|
1526
|
+
throw new TypeError("Second argument must be a string or a Uint8Array");
|
|
1522
1527
|
}
|
|
1523
1528
|
}
|
|
1524
1529
|
const options = {
|
|
@@ -42505,17 +42510,72 @@ function estimateTokens(text) {
|
|
|
42505
42510
|
return Math.ceil(length / 3.5);
|
|
42506
42511
|
}
|
|
42507
42512
|
const sampleSize = Math.min(1e3, length);
|
|
42508
|
-
const sample = text.substring(0, sampleSize);
|
|
42509
42513
|
let codeChars = 0;
|
|
42510
42514
|
let whitespaceChars = 0;
|
|
42511
|
-
let
|
|
42512
|
-
|
|
42513
|
-
|
|
42514
|
-
if (/\s/.test(char)) {
|
|
42515
|
+
for (let i = 0; i < sampleSize; i++) {
|
|
42516
|
+
const code = text.charCodeAt(i);
|
|
42517
|
+
if (code <= 32 || code === 127) {
|
|
42515
42518
|
whitespaceChars++;
|
|
42516
|
-
|
|
42517
|
-
|
|
42518
|
-
|
|
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;
|
|
42519
42579
|
}
|
|
42520
42580
|
}
|
|
42521
42581
|
const codeRatio = codeChars / sampleSize;
|
|
@@ -42654,15 +42714,17 @@ function benchmarkTokenEstimation(iterations = 1e4) {
|
|
|
42654
42714
|
"A".repeat(1e4)
|
|
42655
42715
|
// 10k chars
|
|
42656
42716
|
];
|
|
42717
|
+
for (const text of testTexts) {
|
|
42718
|
+
estimateTokens(text);
|
|
42719
|
+
}
|
|
42657
42720
|
let maxNs = 0;
|
|
42658
42721
|
let totalTokens = 0;
|
|
42659
42722
|
const start = process.hrtime.bigint();
|
|
42660
42723
|
for (let i = 0; i < iterations; i++) {
|
|
42661
42724
|
for (const text of testTexts) {
|
|
42662
|
-
const
|
|
42663
|
-
|
|
42664
|
-
|
|
42665
|
-
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);
|
|
42666
42728
|
if (elapsed > maxNs)
|
|
42667
42729
|
maxNs = elapsed;
|
|
42668
42730
|
}
|
|
@@ -42740,12 +42802,15 @@ var init_context_compaction = __esm({
|
|
|
42740
42802
|
importanceMap.set(result[i].id, calculateImportance(result[i], i, result.length));
|
|
42741
42803
|
}
|
|
42742
42804
|
if (this.config.enableDeduplication) {
|
|
42805
|
+
const protectedRecentIds = new Set(this.config.keepRecentCount > 0 ? result.slice(-this.config.keepRecentCount).map((m2) => m2.id) : []);
|
|
42743
42806
|
const duplicates = findDuplicates(result, this.config.deduplicationThreshold);
|
|
42744
42807
|
if (duplicates.size > 0) {
|
|
42745
42808
|
const toRemove = /* @__PURE__ */ new Set();
|
|
42746
42809
|
for (const [, dups] of duplicates) {
|
|
42747
42810
|
for (const id of dups) {
|
|
42748
|
-
|
|
42811
|
+
if (!protectedRecentIds.has(id)) {
|
|
42812
|
+
toRemove.add(id);
|
|
42813
|
+
}
|
|
42749
42814
|
}
|
|
42750
42815
|
}
|
|
42751
42816
|
result = result.filter((m2) => !toRemove.has(m2.id));
|
|
@@ -42789,10 +42854,7 @@ var init_context_compaction = __esm({
|
|
|
42789
42854
|
if (messagesToSummarize.length >= 3) {
|
|
42790
42855
|
const summary = createSummary(messagesToSummarize);
|
|
42791
42856
|
const summaryIds = new Set(messagesToSummarize.map((m2) => m2.id));
|
|
42792
|
-
result = [
|
|
42793
|
-
summary,
|
|
42794
|
-
...result.filter((m2) => !summaryIds.has(m2.id))
|
|
42795
|
-
];
|
|
42857
|
+
result = [summary, ...result.filter((m2) => !summaryIds.has(m2.id))];
|
|
42796
42858
|
strategy = "summarize";
|
|
42797
42859
|
return {
|
|
42798
42860
|
messages: result,
|
|
@@ -91144,6 +91206,14 @@ function replaceOrphanedCsiPrefix(match) {
|
|
|
91144
91206
|
return replacement;
|
|
91145
91207
|
}
|
|
91146
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
|
+
}
|
|
91147
91217
|
CURSOR_FORWARD_CSI_COMPILED.lastIndex = 0;
|
|
91148
91218
|
ORPHANED_CURSOR_FORWARD_CSI_COMPILED.lastIndex = 0;
|
|
91149
91219
|
ANSI_PATTERN_COMPILED.lastIndex = 0;
|
|
@@ -91241,14 +91311,17 @@ function benchmarkPatterns(iterations = 1e4) {
|
|
|
91241
91311
|
const results = {};
|
|
91242
91312
|
{
|
|
91243
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
|
+
}
|
|
91244
91321
|
const start = process.hrtime.bigint();
|
|
91245
91322
|
for (let i = 0; i < iterations; i++) {
|
|
91246
91323
|
for (const str of testStrings) {
|
|
91247
|
-
const s3 = process.hrtime.bigint();
|
|
91248
91324
|
isInstructionalTextFast(str);
|
|
91249
|
-
const elapsed = Number(process.hrtime.bigint() - s3);
|
|
91250
|
-
if (elapsed > maxNs)
|
|
91251
|
-
maxNs = elapsed;
|
|
91252
91325
|
}
|
|
91253
91326
|
}
|
|
91254
91327
|
const totalNs = Number(process.hrtime.bigint() - start);
|
|
@@ -91259,14 +91332,17 @@ function benchmarkPatterns(iterations = 1e4) {
|
|
|
91259
91332
|
}
|
|
91260
91333
|
{
|
|
91261
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
|
+
}
|
|
91262
91342
|
const start = process.hrtime.bigint();
|
|
91263
91343
|
for (let i = 0; i < iterations; i++) {
|
|
91264
91344
|
for (const str of testStrings) {
|
|
91265
|
-
const s3 = process.hrtime.bigint();
|
|
91266
91345
|
stripAnsiFast(str);
|
|
91267
|
-
const elapsed = Number(process.hrtime.bigint() - s3);
|
|
91268
|
-
if (elapsed > maxNs)
|
|
91269
|
-
maxNs = elapsed;
|
|
91270
91346
|
}
|
|
91271
91347
|
}
|
|
91272
91348
|
const totalNs = Number(process.hrtime.bigint() - start);
|
|
@@ -91278,14 +91354,17 @@ function benchmarkPatterns(iterations = 1e4) {
|
|
|
91278
91354
|
{
|
|
91279
91355
|
const targets = ["AgentName", "Lead", "Worker", "target", "Developer"];
|
|
91280
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
|
+
}
|
|
91281
91364
|
const start = process.hrtime.bigint();
|
|
91282
91365
|
for (let i = 0; i < iterations; i++) {
|
|
91283
|
-
for (const
|
|
91284
|
-
|
|
91285
|
-
isPlaceholderTargetFast(t);
|
|
91286
|
-
const elapsed = Number(process.hrtime.bigint() - s3);
|
|
91287
|
-
if (elapsed > maxNs)
|
|
91288
|
-
maxNs = elapsed;
|
|
91366
|
+
for (const target of targets) {
|
|
91367
|
+
isPlaceholderTargetFast(target);
|
|
91289
91368
|
}
|
|
91290
91369
|
}
|
|
91291
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"}
|