@shardlink/agent-sdk 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.
- package/LICENSE +202 -0
- package/README.md +129 -0
- package/dist/client-quick-join.d.ts +38 -0
- package/dist/client-quick-join.d.ts.map +1 -0
- package/dist/client-quick-join.js +141 -0
- package/dist/client-quick-join.js.map +1 -0
- package/dist/client.d.ts +134 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +190 -0
- package/dist/client.js.map +1 -0
- package/dist/errors.d.ts +126 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +330 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/modules/a2a.d.ts +42 -0
- package/dist/modules/a2a.d.ts.map +1 -0
- package/dist/modules/a2a.js +47 -0
- package/dist/modules/a2a.js.map +1 -0
- package/dist/modules/agents.d.ts +100 -0
- package/dist/modules/agents.d.ts.map +1 -0
- package/dist/modules/agents.js +85 -0
- package/dist/modules/agents.js.map +1 -0
- package/dist/modules/auth.d.ts +49 -0
- package/dist/modules/auth.d.ts.map +1 -0
- package/dist/modules/auth.js +69 -0
- package/dist/modules/auth.js.map +1 -0
- package/dist/modules/billing.d.ts +254 -0
- package/dist/modules/billing.d.ts.map +1 -0
- package/dist/modules/billing.js +203 -0
- package/dist/modules/billing.js.map +1 -0
- package/dist/modules/clans.d.ts +73 -0
- package/dist/modules/clans.d.ts.map +1 -0
- package/dist/modules/clans.js +94 -0
- package/dist/modules/clans.js.map +1 -0
- package/dist/modules/compliance.d.ts +97 -0
- package/dist/modules/compliance.d.ts.map +1 -0
- package/dist/modules/compliance.js +227 -0
- package/dist/modules/compliance.js.map +1 -0
- package/dist/modules/cross-plane.d.ts +164 -0
- package/dist/modules/cross-plane.d.ts.map +1 -0
- package/dist/modules/cross-plane.js +195 -0
- package/dist/modules/cross-plane.js.map +1 -0
- package/dist/modules/dashboard.d.ts +130 -0
- package/dist/modules/dashboard.d.ts.map +1 -0
- package/dist/modules/dashboard.js +120 -0
- package/dist/modules/dashboard.js.map +1 -0
- package/dist/modules/degradation.d.ts +120 -0
- package/dist/modules/degradation.d.ts.map +1 -0
- package/dist/modules/degradation.js +205 -0
- package/dist/modules/degradation.js.map +1 -0
- package/dist/modules/diagnostics-checks.d.ts +32 -0
- package/dist/modules/diagnostics-checks.d.ts.map +1 -0
- package/dist/modules/diagnostics-checks.js +231 -0
- package/dist/modules/diagnostics-checks.js.map +1 -0
- package/dist/modules/diagnostics-types.d.ts +118 -0
- package/dist/modules/diagnostics-types.d.ts.map +1 -0
- package/dist/modules/diagnostics-types.js +16 -0
- package/dist/modules/diagnostics-types.js.map +1 -0
- package/dist/modules/diagnostics.d.ts +64 -0
- package/dist/modules/diagnostics.d.ts.map +1 -0
- package/dist/modules/diagnostics.js +206 -0
- package/dist/modules/diagnostics.js.map +1 -0
- package/dist/modules/discovery.d.ts +152 -0
- package/dist/modules/discovery.d.ts.map +1 -0
- package/dist/modules/discovery.js +100 -0
- package/dist/modules/discovery.js.map +1 -0
- package/dist/modules/fleets.d.ts +82 -0
- package/dist/modules/fleets.d.ts.map +1 -0
- package/dist/modules/fleets.js +33 -0
- package/dist/modules/fleets.js.map +1 -0
- package/dist/modules/lease-manager.d.ts +119 -0
- package/dist/modules/lease-manager.d.ts.map +1 -0
- package/dist/modules/lease-manager.js +242 -0
- package/dist/modules/lease-manager.js.map +1 -0
- package/dist/modules/leases.d.ts +70 -0
- package/dist/modules/leases.d.ts.map +1 -0
- package/dist/modules/leases.js +51 -0
- package/dist/modules/leases.js.map +1 -0
- package/dist/modules/operators.d.ts +176 -0
- package/dist/modules/operators.d.ts.map +1 -0
- package/dist/modules/operators.js +133 -0
- package/dist/modules/operators.js.map +1 -0
- package/dist/modules/providers.d.ts +141 -0
- package/dist/modules/providers.d.ts.map +1 -0
- package/dist/modules/providers.js +118 -0
- package/dist/modules/providers.js.map +1 -0
- package/dist/modules/quota.d.ts +102 -0
- package/dist/modules/quota.d.ts.map +1 -0
- package/dist/modules/quota.js +135 -0
- package/dist/modules/quota.js.map +1 -0
- package/dist/modules/reactions.d.ts +141 -0
- package/dist/modules/reactions.d.ts.map +1 -0
- package/dist/modules/reactions.js +122 -0
- package/dist/modules/reactions.js.map +1 -0
- package/dist/modules/register.d.ts +159 -0
- package/dist/modules/register.d.ts.map +1 -0
- package/dist/modules/register.js +239 -0
- package/dist/modules/register.js.map +1 -0
- package/dist/modules/sandbox.d.ts +106 -0
- package/dist/modules/sandbox.d.ts.map +1 -0
- package/dist/modules/sandbox.js +224 -0
- package/dist/modules/sandbox.js.map +1 -0
- package/dist/modules/streams.d.ts +81 -0
- package/dist/modules/streams.d.ts.map +1 -0
- package/dist/modules/streams.js +292 -0
- package/dist/modules/streams.js.map +1 -0
- package/dist/modules/tasks.d.ts +145 -0
- package/dist/modules/tasks.d.ts.map +1 -0
- package/dist/modules/tasks.js +165 -0
- package/dist/modules/tasks.js.map +1 -0
- package/dist/modules/telemetry.d.ts +137 -0
- package/dist/modules/telemetry.d.ts.map +1 -0
- package/dist/modules/telemetry.js +203 -0
- package/dist/modules/telemetry.js.map +1 -0
- package/dist/modules/workspace.d.ts +180 -0
- package/dist/modules/workspace.d.ts.map +1 -0
- package/dist/modules/workspace.js +157 -0
- package/dist/modules/workspace.js.map +1 -0
- package/dist/quickstart-join.d.ts +56 -0
- package/dist/quickstart-join.d.ts.map +1 -0
- package/dist/quickstart-join.js +116 -0
- package/dist/quickstart-join.js.map +1 -0
- package/dist/quickstart.d.ts +137 -0
- package/dist/quickstart.d.ts.map +1 -0
- package/dist/quickstart.js +292 -0
- package/dist/quickstart.js.map +1 -0
- package/dist/retry.d.ts +88 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +152 -0
- package/dist/retry.js.map +1 -0
- package/dist/types.d.ts +447 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +88 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +199 -0
- package/dist/utils.js.map +1 -0
- package/package.json +215 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lease auto-management.
|
|
3
|
+
*
|
|
4
|
+
* Agents shouldn't have to think about leases. A {@link LeaseManager}
|
|
5
|
+
* observes the workspace event stream, caches the last known lease state,
|
|
6
|
+
* and invokes re-request / threshold callbacks on the agent's behalf.
|
|
7
|
+
*
|
|
8
|
+
* Design notes:
|
|
9
|
+
* - The control-plane does not currently expose a dedicated
|
|
10
|
+
* `/v1/workspaces/:slug/leases/state` endpoint. Instead, the manager
|
|
11
|
+
* keeps an in-memory snapshot seeded from the `lease-request` response
|
|
12
|
+
* and continuously updated by stream events (`lease_approved`,
|
|
13
|
+
* `lease_revoked`, `lease_expiring`, `spend_envelope_depleting`).
|
|
14
|
+
* - `enableAutoRenew()` registers a stream handler that re-calls
|
|
15
|
+
* `LeaseClient.request` when `lease_expiring` fires.
|
|
16
|
+
* - `onBudgetThreshold()` fires when the spend-envelope event indicates
|
|
17
|
+
* usage has crossed the given percentage.
|
|
18
|
+
*
|
|
19
|
+
* @packageDocumentation
|
|
20
|
+
*/
|
|
21
|
+
import type { StreamClient } from "./streams.js";
|
|
22
|
+
import type { LeaseClient } from "./leases.js";
|
|
23
|
+
/** Snapshot of the lease state the manager tracks locally. */
|
|
24
|
+
export interface LeaseSnapshot {
|
|
25
|
+
/** Workspace this snapshot is scoped to. */
|
|
26
|
+
workspaceSlug: string;
|
|
27
|
+
/** Identity the lease is bound to. */
|
|
28
|
+
identity?: string;
|
|
29
|
+
/** Lease tier (sandbox/standard/verified/…). */
|
|
30
|
+
tier?: string;
|
|
31
|
+
/** Cap in action units. */
|
|
32
|
+
rateLimit?: number;
|
|
33
|
+
/** Actions already consumed. */
|
|
34
|
+
actionCount?: number;
|
|
35
|
+
/** Spend cap (workspace units, not USD cents). */
|
|
36
|
+
spendCap?: number;
|
|
37
|
+
/** Spend already consumed. */
|
|
38
|
+
spendUsed?: number;
|
|
39
|
+
/** Pricing version bound to the lease. */
|
|
40
|
+
pricingVersion?: string;
|
|
41
|
+
/** ISO timestamp or epoch-ms when the lease expires. */
|
|
42
|
+
expiresAt?: number | string;
|
|
43
|
+
/** Lease lifecycle status. */
|
|
44
|
+
status?: "pending" | "active" | "expired" | "revoked";
|
|
45
|
+
/** When this snapshot was last updated (ms since epoch). */
|
|
46
|
+
updatedAt: number;
|
|
47
|
+
}
|
|
48
|
+
export interface AutoRenewConfig {
|
|
49
|
+
/** Lease tier to request on renewal (defaults to the current tier). */
|
|
50
|
+
tier?: string;
|
|
51
|
+
/** Optional pricing quote id to bind to the renewal. */
|
|
52
|
+
quoteId?: string;
|
|
53
|
+
/** Optional spend envelope id. */
|
|
54
|
+
envelopeId?: string;
|
|
55
|
+
/** Callback fired when auto-renewal succeeds. */
|
|
56
|
+
onRenewed?: (snapshot: LeaseSnapshot) => void;
|
|
57
|
+
/** Callback fired when auto-renewal fails. */
|
|
58
|
+
onFailed?: (error: unknown) => void;
|
|
59
|
+
}
|
|
60
|
+
export interface LeaseManagerOptions {
|
|
61
|
+
workspaceSlug: string;
|
|
62
|
+
actorSessionToken: string;
|
|
63
|
+
leaseClient: LeaseClient;
|
|
64
|
+
stream: StreamClient;
|
|
65
|
+
/** Optional seed — useful when you have the initial lease response in hand. */
|
|
66
|
+
initial?: Partial<LeaseSnapshot>;
|
|
67
|
+
}
|
|
68
|
+
type ThresholdHandler = () => void;
|
|
69
|
+
/**
|
|
70
|
+
* Observes lease state via the workspace event stream and exposes helpers
|
|
71
|
+
* for auto-renewal + budget thresholds.
|
|
72
|
+
*/
|
|
73
|
+
export declare class LeaseManager {
|
|
74
|
+
private snapshot;
|
|
75
|
+
private readonly options;
|
|
76
|
+
private readonly thresholdHandlers;
|
|
77
|
+
private readonly firedThresholds;
|
|
78
|
+
private autoRenewConfig;
|
|
79
|
+
private readonly unsubscribes;
|
|
80
|
+
private renewing;
|
|
81
|
+
constructor(options: LeaseManagerOptions);
|
|
82
|
+
/** Current lease snapshot — safe to call without awaiting. */
|
|
83
|
+
status(): LeaseSnapshot;
|
|
84
|
+
/** Remaining spend budget in the lease's native units. */
|
|
85
|
+
remainingBudget(): number;
|
|
86
|
+
/** Milliseconds remaining until expiry. `Infinity` when unknown. */
|
|
87
|
+
expiresIn(): number;
|
|
88
|
+
/**
|
|
89
|
+
* Update the local snapshot. Useful when you get the fresh lease state
|
|
90
|
+
* from a `leases/request` response outside the manager.
|
|
91
|
+
*/
|
|
92
|
+
ingest(partial: Partial<LeaseSnapshot>): void;
|
|
93
|
+
/**
|
|
94
|
+
* Enable automatic lease renewal. The manager will call
|
|
95
|
+
* `leaseClient.request` when a `lease_expiring` event arrives.
|
|
96
|
+
*
|
|
97
|
+
* @example
|
|
98
|
+
* ```ts
|
|
99
|
+
* lease.enableAutoRenew({ tier: "sandbox" });
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
enableAutoRenew(config?: AutoRenewConfig): void;
|
|
103
|
+
/** Disable auto-renewal. */
|
|
104
|
+
disableAutoRenew(): void;
|
|
105
|
+
/**
|
|
106
|
+
* Register a callback that fires when spend usage crosses `percent`.
|
|
107
|
+
* Each percent threshold fires at most once per lease period — the
|
|
108
|
+
* tracking resets when `ingest()` or `lease_approved` lowers the usage.
|
|
109
|
+
*/
|
|
110
|
+
onBudgetThreshold(percent: number, handler: ThresholdHandler): () => void;
|
|
111
|
+
/** Detach all stream listeners and reset local state. */
|
|
112
|
+
dispose(): void;
|
|
113
|
+
private onLeaseEvent;
|
|
114
|
+
private onLeaseExpiring;
|
|
115
|
+
private onSpendDepleting;
|
|
116
|
+
private checkThresholds;
|
|
117
|
+
}
|
|
118
|
+
export {};
|
|
119
|
+
//# sourceMappingURL=lease-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lease-manager.d.ts","sourceRoot":"","sources":["../../src/modules/lease-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,8DAA8D;AAC9D,MAAM,WAAW,aAAa;IAC5B,4CAA4C;IAC5C,aAAa,EAAE,MAAM,CAAC;IACtB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,8BAA8B;IAC9B,MAAM,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IACtD,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,IAAI,CAAC;IAC9C,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,YAAY,CAAC;IACrB,+EAA+E;IAC/E,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;CAClC;AAED,KAAK,gBAAgB,GAAG,MAAM,IAAI,CAAC;AAiDnC;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA4C;IAC9E,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqB;IACrD,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAyB;IACtD,OAAO,CAAC,QAAQ,CAAS;gBAEb,OAAO,EAAE,mBAAmB;IAqBxC,8DAA8D;IAC9D,MAAM,IAAI,aAAa;IAIvB,0DAA0D;IAC1D,eAAe,IAAI,MAAM;IAIzB,oEAAoE;IACpE,SAAS,IAAI,MAAM;IAInB;;;OAGG;IACH,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI;IAK7C;;;;;;;;OAQG;IACH,eAAe,CAAC,MAAM,GAAE,eAAoB,GAAG,IAAI;IAInD,4BAA4B;IAC5B,gBAAgB,IAAI,IAAI;IAIxB;;;;OAIG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,MAAM,IAAI;IAezE,yDAAyD;IACzD,OAAO,IAAI,IAAI;IAaf,OAAO,CAAC,YAAY;YAWN,eAAe;IA8C7B,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,eAAe;CAsBxB"}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lease auto-management.
|
|
3
|
+
*
|
|
4
|
+
* Agents shouldn't have to think about leases. A {@link LeaseManager}
|
|
5
|
+
* observes the workspace event stream, caches the last known lease state,
|
|
6
|
+
* and invokes re-request / threshold callbacks on the agent's behalf.
|
|
7
|
+
*
|
|
8
|
+
* Design notes:
|
|
9
|
+
* - The control-plane does not currently expose a dedicated
|
|
10
|
+
* `/v1/workspaces/:slug/leases/state` endpoint. Instead, the manager
|
|
11
|
+
* keeps an in-memory snapshot seeded from the `lease-request` response
|
|
12
|
+
* and continuously updated by stream events (`lease_approved`,
|
|
13
|
+
* `lease_revoked`, `lease_expiring`, `spend_envelope_depleting`).
|
|
14
|
+
* - `enableAutoRenew()` registers a stream handler that re-calls
|
|
15
|
+
* `LeaseClient.request` when `lease_expiring` fires.
|
|
16
|
+
* - `onBudgetThreshold()` fires when the spend-envelope event indicates
|
|
17
|
+
* usage has crossed the given percentage.
|
|
18
|
+
*
|
|
19
|
+
* @packageDocumentation
|
|
20
|
+
*/
|
|
21
|
+
import { LeaseError } from "../errors.js";
|
|
22
|
+
/** Compute remaining budget in the lease's native units (0 if unknown). */
|
|
23
|
+
function remainingUnits(snapshot) {
|
|
24
|
+
if (typeof snapshot.spendCap === "number" && typeof snapshot.spendUsed === "number") {
|
|
25
|
+
return Math.max(0, snapshot.spendCap - snapshot.spendUsed);
|
|
26
|
+
}
|
|
27
|
+
return 0;
|
|
28
|
+
}
|
|
29
|
+
/** Compute time-to-expiry in ms (Infinity if not known). */
|
|
30
|
+
function msUntilExpiry(snapshot) {
|
|
31
|
+
if (!snapshot.expiresAt) {
|
|
32
|
+
return Number.POSITIVE_INFINITY;
|
|
33
|
+
}
|
|
34
|
+
const asNumber = typeof snapshot.expiresAt === "number" ? snapshot.expiresAt : Date.parse(snapshot.expiresAt);
|
|
35
|
+
if (Number.isNaN(asNumber)) {
|
|
36
|
+
return Number.POSITIVE_INFINITY;
|
|
37
|
+
}
|
|
38
|
+
return asNumber - Date.now();
|
|
39
|
+
}
|
|
40
|
+
/** Merge a stream-event payload into the lease snapshot. */
|
|
41
|
+
function mergeEventIntoSnapshot(base, payload) {
|
|
42
|
+
const next = { ...base, updatedAt: Date.now() };
|
|
43
|
+
if (typeof payload.tier === "string")
|
|
44
|
+
next.tier = payload.tier;
|
|
45
|
+
if (typeof payload.rateLimit === "number")
|
|
46
|
+
next.rateLimit = payload.rateLimit;
|
|
47
|
+
if (typeof payload.actionCount === "number")
|
|
48
|
+
next.actionCount = payload.actionCount;
|
|
49
|
+
if (typeof payload.spendCap === "number")
|
|
50
|
+
next.spendCap = payload.spendCap;
|
|
51
|
+
if (typeof payload.spendUsed === "number")
|
|
52
|
+
next.spendUsed = payload.spendUsed;
|
|
53
|
+
if (typeof payload.pricingVersion === "string")
|
|
54
|
+
next.pricingVersion = payload.pricingVersion;
|
|
55
|
+
if (typeof payload.expiresAt === "number" || typeof payload.expiresAt === "string") {
|
|
56
|
+
next.expiresAt = payload.expiresAt;
|
|
57
|
+
}
|
|
58
|
+
if (payload.status === "pending" ||
|
|
59
|
+
payload.status === "active" ||
|
|
60
|
+
payload.status === "expired" ||
|
|
61
|
+
payload.status === "revoked") {
|
|
62
|
+
next.status = payload.status;
|
|
63
|
+
}
|
|
64
|
+
return next;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Observes lease state via the workspace event stream and exposes helpers
|
|
68
|
+
* for auto-renewal + budget thresholds.
|
|
69
|
+
*/
|
|
70
|
+
export class LeaseManager {
|
|
71
|
+
snapshot;
|
|
72
|
+
options;
|
|
73
|
+
thresholdHandlers = new Map();
|
|
74
|
+
firedThresholds = new Set();
|
|
75
|
+
autoRenewConfig = null;
|
|
76
|
+
unsubscribes = [];
|
|
77
|
+
renewing = false;
|
|
78
|
+
constructor(options) {
|
|
79
|
+
this.options = options;
|
|
80
|
+
this.snapshot = {
|
|
81
|
+
workspaceSlug: options.workspaceSlug,
|
|
82
|
+
updatedAt: Date.now(),
|
|
83
|
+
...options.initial
|
|
84
|
+
};
|
|
85
|
+
this.unsubscribes.push(options.stream.on("lease_approved", (event) => this.onLeaseEvent(event.payload, "active")));
|
|
86
|
+
this.unsubscribes.push(options.stream.on("lease_revoked", (event) => this.onLeaseEvent(event.payload, "revoked")));
|
|
87
|
+
this.unsubscribes.push(options.stream.on("lease_expiring", (event) => this.onLeaseExpiring(event.payload)));
|
|
88
|
+
this.unsubscribes.push(options.stream.on("spend_envelope_depleting", (event) => this.onSpendDepleting(event.payload)));
|
|
89
|
+
}
|
|
90
|
+
/** Current lease snapshot — safe to call without awaiting. */
|
|
91
|
+
status() {
|
|
92
|
+
return { ...this.snapshot };
|
|
93
|
+
}
|
|
94
|
+
/** Remaining spend budget in the lease's native units. */
|
|
95
|
+
remainingBudget() {
|
|
96
|
+
return remainingUnits(this.snapshot);
|
|
97
|
+
}
|
|
98
|
+
/** Milliseconds remaining until expiry. `Infinity` when unknown. */
|
|
99
|
+
expiresIn() {
|
|
100
|
+
return msUntilExpiry(this.snapshot);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Update the local snapshot. Useful when you get the fresh lease state
|
|
104
|
+
* from a `leases/request` response outside the manager.
|
|
105
|
+
*/
|
|
106
|
+
ingest(partial) {
|
|
107
|
+
this.snapshot = { ...this.snapshot, ...partial, updatedAt: Date.now() };
|
|
108
|
+
this.checkThresholds();
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Enable automatic lease renewal. The manager will call
|
|
112
|
+
* `leaseClient.request` when a `lease_expiring` event arrives.
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* ```ts
|
|
116
|
+
* lease.enableAutoRenew({ tier: "sandbox" });
|
|
117
|
+
* ```
|
|
118
|
+
*/
|
|
119
|
+
enableAutoRenew(config = {}) {
|
|
120
|
+
this.autoRenewConfig = config;
|
|
121
|
+
}
|
|
122
|
+
/** Disable auto-renewal. */
|
|
123
|
+
disableAutoRenew() {
|
|
124
|
+
this.autoRenewConfig = null;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Register a callback that fires when spend usage crosses `percent`.
|
|
128
|
+
* Each percent threshold fires at most once per lease period — the
|
|
129
|
+
* tracking resets when `ingest()` or `lease_approved` lowers the usage.
|
|
130
|
+
*/
|
|
131
|
+
onBudgetThreshold(percent, handler) {
|
|
132
|
+
if (percent <= 0 || percent > 100) {
|
|
133
|
+
throw new Error(`[LeaseManager] threshold percent must be in (0, 100]; got ${percent}.`);
|
|
134
|
+
}
|
|
135
|
+
let bucket = this.thresholdHandlers.get(percent);
|
|
136
|
+
if (!bucket) {
|
|
137
|
+
bucket = new Set();
|
|
138
|
+
this.thresholdHandlers.set(percent, bucket);
|
|
139
|
+
}
|
|
140
|
+
bucket.add(handler);
|
|
141
|
+
return () => {
|
|
142
|
+
bucket?.delete(handler);
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/** Detach all stream listeners and reset local state. */
|
|
146
|
+
dispose() {
|
|
147
|
+
for (const unsub of this.unsubscribes) {
|
|
148
|
+
try {
|
|
149
|
+
unsub();
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
// ignore
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
this.thresholdHandlers.clear();
|
|
156
|
+
this.firedThresholds.clear();
|
|
157
|
+
this.autoRenewConfig = null;
|
|
158
|
+
}
|
|
159
|
+
onLeaseEvent(payload, status) {
|
|
160
|
+
if (!isRecord(payload))
|
|
161
|
+
return;
|
|
162
|
+
const leasePayload = isRecord(payload.lease) ? payload.lease : payload;
|
|
163
|
+
this.snapshot = mergeEventIntoSnapshot({ ...this.snapshot, status }, leasePayload);
|
|
164
|
+
this.firedThresholds.clear();
|
|
165
|
+
this.checkThresholds();
|
|
166
|
+
}
|
|
167
|
+
async onLeaseExpiring(payload) {
|
|
168
|
+
if (isRecord(payload)) {
|
|
169
|
+
const leasePayload = isRecord(payload.lease) ? payload.lease : payload;
|
|
170
|
+
this.snapshot = mergeEventIntoSnapshot(this.snapshot, leasePayload);
|
|
171
|
+
}
|
|
172
|
+
if (!this.autoRenewConfig || this.renewing)
|
|
173
|
+
return;
|
|
174
|
+
this.renewing = true;
|
|
175
|
+
try {
|
|
176
|
+
const result = await this.options.leaseClient.request({
|
|
177
|
+
workspaceSlug: this.options.workspaceSlug,
|
|
178
|
+
actorSessionToken: this.options.actorSessionToken,
|
|
179
|
+
idempotencyKey: `lease-auto-renew:${this.options.workspaceSlug}:${Date.now()}`,
|
|
180
|
+
...((this.autoRenewConfig.tier ?? this.snapshot.tier)
|
|
181
|
+
? { tier: (this.autoRenewConfig.tier ?? this.snapshot.tier) }
|
|
182
|
+
: {}),
|
|
183
|
+
...(this.autoRenewConfig.quoteId ? { quoteId: this.autoRenewConfig.quoteId } : {}),
|
|
184
|
+
...(this.autoRenewConfig.envelopeId ? { envelopeId: this.autoRenewConfig.envelopeId } : {})
|
|
185
|
+
});
|
|
186
|
+
const merged = isRecord(result) && isRecord(result.lease) ? result.lease : result;
|
|
187
|
+
if (isRecord(merged)) {
|
|
188
|
+
this.snapshot = mergeEventIntoSnapshot({ ...this.snapshot, status: "active" }, merged);
|
|
189
|
+
}
|
|
190
|
+
this.firedThresholds.clear();
|
|
191
|
+
this.autoRenewConfig.onRenewed?.(this.status());
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
const err = error instanceof Error
|
|
195
|
+
? error
|
|
196
|
+
: new LeaseError({
|
|
197
|
+
message: "Lease auto-renew failed.",
|
|
198
|
+
code: "lease_renew_failed",
|
|
199
|
+
status: 0,
|
|
200
|
+
retryable: true
|
|
201
|
+
});
|
|
202
|
+
this.autoRenewConfig.onFailed?.(err);
|
|
203
|
+
}
|
|
204
|
+
finally {
|
|
205
|
+
this.renewing = false;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
onSpendDepleting(payload) {
|
|
209
|
+
if (!isRecord(payload))
|
|
210
|
+
return;
|
|
211
|
+
this.snapshot = mergeEventIntoSnapshot(this.snapshot, payload);
|
|
212
|
+
this.checkThresholds();
|
|
213
|
+
}
|
|
214
|
+
checkThresholds() {
|
|
215
|
+
if (this.snapshot.spendCap === undefined || this.snapshot.spendUsed === undefined) {
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
if (this.snapshot.spendCap <= 0)
|
|
219
|
+
return;
|
|
220
|
+
const usagePercent = (this.snapshot.spendUsed / this.snapshot.spendCap) * 100;
|
|
221
|
+
for (const [threshold, handlers] of this.thresholdHandlers.entries()) {
|
|
222
|
+
if (usagePercent >= threshold && !this.firedThresholds.has(threshold)) {
|
|
223
|
+
this.firedThresholds.add(threshold);
|
|
224
|
+
for (const handler of handlers) {
|
|
225
|
+
try {
|
|
226
|
+
handler();
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
// ignore handler errors
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
if (usagePercent < threshold && this.firedThresholds.has(threshold)) {
|
|
234
|
+
this.firedThresholds.delete(threshold);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
function isRecord(value) {
|
|
240
|
+
return typeof value === "object" && value !== null;
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=lease-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lease-manager.js","sourceRoot":"","sources":["../../src/modules/lease-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lease client — request and inspect workspace leases.
|
|
3
|
+
*
|
|
4
|
+
* Approve/revoke are governor-only and live on the workspace routes; this
|
|
5
|
+
* module covers the agent-facing `request` and local state helpers.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
import type { HttpContext } from "../utils.js";
|
|
10
|
+
/** A payment intent created or referenced by a lease request. */
|
|
11
|
+
export interface LeasePaymentIntent {
|
|
12
|
+
id: string;
|
|
13
|
+
workspaceId: string;
|
|
14
|
+
agentIdentity: string;
|
|
15
|
+
tier: "sandbox" | "standard";
|
|
16
|
+
amount: number;
|
|
17
|
+
currency: "USD";
|
|
18
|
+
status: string;
|
|
19
|
+
proofLevel: "P0" | "P1" | "P2";
|
|
20
|
+
pricingVersion?: string;
|
|
21
|
+
quotedCreditUnits?: number;
|
|
22
|
+
txRef?: string;
|
|
23
|
+
createdAt: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Result of {@link LeaseClient.request}. `intentId` is always present; the
|
|
27
|
+
* pricing/quote fields appear when the request resolved a payment intent or
|
|
28
|
+
* was backed by an accepted pricing quote.
|
|
29
|
+
*/
|
|
30
|
+
export interface LeaseRequestResult {
|
|
31
|
+
intentId: string;
|
|
32
|
+
/** Resolved payment intent, when the runtime returned one. */
|
|
33
|
+
intent?: LeasePaymentIntent;
|
|
34
|
+
pricingVersion?: string;
|
|
35
|
+
amountUsdCents?: number;
|
|
36
|
+
creditUnits?: number;
|
|
37
|
+
quoteId?: string;
|
|
38
|
+
/** ISO timestamp the backing quote expires. */
|
|
39
|
+
quoteExpiresAt?: string;
|
|
40
|
+
}
|
|
41
|
+
/** Agent-facing lease helper. */
|
|
42
|
+
export declare class LeaseClient {
|
|
43
|
+
private readonly http;
|
|
44
|
+
constructor(http: HttpContext);
|
|
45
|
+
/**
|
|
46
|
+
* Request a lease on a workspace. Requires a workspace actor session token.
|
|
47
|
+
*
|
|
48
|
+
* Attach the pricing quote + envelope ids when the funding flow produced them
|
|
49
|
+
* so the control-plane can bind the lease to those artefacts.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```ts
|
|
53
|
+
* await leases.request({
|
|
54
|
+
* workspaceSlug: "ws_1",
|
|
55
|
+
* actorSessionToken,
|
|
56
|
+
* tier: "sandbox",
|
|
57
|
+
* idempotencyKey: "lease:ws_1:agent_42"
|
|
58
|
+
* });
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
request(input: {
|
|
62
|
+
workspaceSlug: string;
|
|
63
|
+
actorSessionToken: string;
|
|
64
|
+
tier?: string;
|
|
65
|
+
quoteId?: string;
|
|
66
|
+
envelopeId?: string;
|
|
67
|
+
idempotencyKey: string;
|
|
68
|
+
}): Promise<LeaseRequestResult>;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=leases.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leases.d.ts","sourceRoot":"","sources":["../../src/modules/leases.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAM/C,iEAAiE;AACjE,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,SAAS,GAAG,UAAU,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,KAAK,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,iCAAiC;AACjC,qBAAa,WAAW;IACV,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,WAAW;IAE9C;;;;;;;;;;;;;;;OAeG;IACG,OAAO,CAAC,KAAK,EAAE;QACnB,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;KACxB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAgBhC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lease client — request and inspect workspace leases.
|
|
3
|
+
*
|
|
4
|
+
* Approve/revoke are governor-only and live on the workspace routes; this
|
|
5
|
+
* module covers the agent-facing `request` and local state helpers.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
function idempotencyHeader(key) {
|
|
10
|
+
return { "idempotency-key": key };
|
|
11
|
+
}
|
|
12
|
+
/** Agent-facing lease helper. */
|
|
13
|
+
export class LeaseClient {
|
|
14
|
+
http;
|
|
15
|
+
constructor(http) {
|
|
16
|
+
this.http = http;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Request a lease on a workspace. Requires a workspace actor session token.
|
|
20
|
+
*
|
|
21
|
+
* Attach the pricing quote + envelope ids when the funding flow produced them
|
|
22
|
+
* so the control-plane can bind the lease to those artefacts.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* await leases.request({
|
|
27
|
+
* workspaceSlug: "ws_1",
|
|
28
|
+
* actorSessionToken,
|
|
29
|
+
* tier: "sandbox",
|
|
30
|
+
* idempotencyKey: "lease:ws_1:agent_42"
|
|
31
|
+
* });
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
async request(input) {
|
|
35
|
+
const body = {};
|
|
36
|
+
if (input.tier)
|
|
37
|
+
body.tier = input.tier;
|
|
38
|
+
if (input.quoteId)
|
|
39
|
+
body.quoteId = input.quoteId;
|
|
40
|
+
if (input.envelopeId)
|
|
41
|
+
body.envelopeId = input.envelopeId;
|
|
42
|
+
return this.http.request({
|
|
43
|
+
path: `/v1/workspaces/${encodeURIComponent(input.workspaceSlug)}/leases/request`,
|
|
44
|
+
method: "POST",
|
|
45
|
+
operation: "lease-request",
|
|
46
|
+
headers: this.http.bearerHeaders(input.actorSessionToken, idempotencyHeader(input.idempotencyKey)),
|
|
47
|
+
body
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=leases.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leases.js","sourceRoot":"","sources":["../../src/modules/leases.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,SAAS,iBAAiB,CAAC,GAAW;IACpC,OAAO,EAAE,iBAAiB,EAAE,GAAG,EAAE,CAAC;AACpC,CAAC;AAmCD,iCAAiC;AACjC,MAAM,OAAO,WAAW;IACO;IAA7B,YAA6B,IAAiB;QAAjB,SAAI,GAAJ,IAAI,CAAa;IAAG,CAAC;IAElD;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,OAAO,CAAC,KAOb;QACC,MAAM,IAAI,GAA4B,EAAE,CAAC;QACzC,IAAI,KAAK,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACvC,IAAI,KAAK,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAChD,IAAI,KAAK,CAAC,UAAU;YAAE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;QACzD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAqB;YAC3C,IAAI,EAAE,kBAAkB,kBAAkB,CAAC,KAAK,CAAC,aAAa,CAAC,iBAAiB;YAChF,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,eAAe;YAC1B,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,CAC9B,KAAK,CAAC,iBAAiB,EACvB,iBAAiB,CAAC,KAAK,CAAC,cAAc,CAAC,CACxC;YACD,IAAI;SACL,CAAC,CAAC;IACL,CAAC;CACF"}
|