@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.
Files changed (143) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +129 -0
  3. package/dist/client-quick-join.d.ts +38 -0
  4. package/dist/client-quick-join.d.ts.map +1 -0
  5. package/dist/client-quick-join.js +141 -0
  6. package/dist/client-quick-join.js.map +1 -0
  7. package/dist/client.d.ts +134 -0
  8. package/dist/client.d.ts.map +1 -0
  9. package/dist/client.js +190 -0
  10. package/dist/client.js.map +1 -0
  11. package/dist/errors.d.ts +126 -0
  12. package/dist/errors.d.ts.map +1 -0
  13. package/dist/errors.js +330 -0
  14. package/dist/errors.js.map +1 -0
  15. package/dist/index.d.ts +47 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +47 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/modules/a2a.d.ts +42 -0
  20. package/dist/modules/a2a.d.ts.map +1 -0
  21. package/dist/modules/a2a.js +47 -0
  22. package/dist/modules/a2a.js.map +1 -0
  23. package/dist/modules/agents.d.ts +100 -0
  24. package/dist/modules/agents.d.ts.map +1 -0
  25. package/dist/modules/agents.js +85 -0
  26. package/dist/modules/agents.js.map +1 -0
  27. package/dist/modules/auth.d.ts +49 -0
  28. package/dist/modules/auth.d.ts.map +1 -0
  29. package/dist/modules/auth.js +69 -0
  30. package/dist/modules/auth.js.map +1 -0
  31. package/dist/modules/billing.d.ts +254 -0
  32. package/dist/modules/billing.d.ts.map +1 -0
  33. package/dist/modules/billing.js +203 -0
  34. package/dist/modules/billing.js.map +1 -0
  35. package/dist/modules/clans.d.ts +73 -0
  36. package/dist/modules/clans.d.ts.map +1 -0
  37. package/dist/modules/clans.js +94 -0
  38. package/dist/modules/clans.js.map +1 -0
  39. package/dist/modules/compliance.d.ts +97 -0
  40. package/dist/modules/compliance.d.ts.map +1 -0
  41. package/dist/modules/compliance.js +227 -0
  42. package/dist/modules/compliance.js.map +1 -0
  43. package/dist/modules/cross-plane.d.ts +164 -0
  44. package/dist/modules/cross-plane.d.ts.map +1 -0
  45. package/dist/modules/cross-plane.js +195 -0
  46. package/dist/modules/cross-plane.js.map +1 -0
  47. package/dist/modules/dashboard.d.ts +130 -0
  48. package/dist/modules/dashboard.d.ts.map +1 -0
  49. package/dist/modules/dashboard.js +120 -0
  50. package/dist/modules/dashboard.js.map +1 -0
  51. package/dist/modules/degradation.d.ts +120 -0
  52. package/dist/modules/degradation.d.ts.map +1 -0
  53. package/dist/modules/degradation.js +205 -0
  54. package/dist/modules/degradation.js.map +1 -0
  55. package/dist/modules/diagnostics-checks.d.ts +32 -0
  56. package/dist/modules/diagnostics-checks.d.ts.map +1 -0
  57. package/dist/modules/diagnostics-checks.js +231 -0
  58. package/dist/modules/diagnostics-checks.js.map +1 -0
  59. package/dist/modules/diagnostics-types.d.ts +118 -0
  60. package/dist/modules/diagnostics-types.d.ts.map +1 -0
  61. package/dist/modules/diagnostics-types.js +16 -0
  62. package/dist/modules/diagnostics-types.js.map +1 -0
  63. package/dist/modules/diagnostics.d.ts +64 -0
  64. package/dist/modules/diagnostics.d.ts.map +1 -0
  65. package/dist/modules/diagnostics.js +206 -0
  66. package/dist/modules/diagnostics.js.map +1 -0
  67. package/dist/modules/discovery.d.ts +152 -0
  68. package/dist/modules/discovery.d.ts.map +1 -0
  69. package/dist/modules/discovery.js +100 -0
  70. package/dist/modules/discovery.js.map +1 -0
  71. package/dist/modules/fleets.d.ts +82 -0
  72. package/dist/modules/fleets.d.ts.map +1 -0
  73. package/dist/modules/fleets.js +33 -0
  74. package/dist/modules/fleets.js.map +1 -0
  75. package/dist/modules/lease-manager.d.ts +119 -0
  76. package/dist/modules/lease-manager.d.ts.map +1 -0
  77. package/dist/modules/lease-manager.js +242 -0
  78. package/dist/modules/lease-manager.js.map +1 -0
  79. package/dist/modules/leases.d.ts +70 -0
  80. package/dist/modules/leases.d.ts.map +1 -0
  81. package/dist/modules/leases.js +51 -0
  82. package/dist/modules/leases.js.map +1 -0
  83. package/dist/modules/operators.d.ts +176 -0
  84. package/dist/modules/operators.d.ts.map +1 -0
  85. package/dist/modules/operators.js +133 -0
  86. package/dist/modules/operators.js.map +1 -0
  87. package/dist/modules/providers.d.ts +141 -0
  88. package/dist/modules/providers.d.ts.map +1 -0
  89. package/dist/modules/providers.js +118 -0
  90. package/dist/modules/providers.js.map +1 -0
  91. package/dist/modules/quota.d.ts +102 -0
  92. package/dist/modules/quota.d.ts.map +1 -0
  93. package/dist/modules/quota.js +135 -0
  94. package/dist/modules/quota.js.map +1 -0
  95. package/dist/modules/reactions.d.ts +141 -0
  96. package/dist/modules/reactions.d.ts.map +1 -0
  97. package/dist/modules/reactions.js +122 -0
  98. package/dist/modules/reactions.js.map +1 -0
  99. package/dist/modules/register.d.ts +159 -0
  100. package/dist/modules/register.d.ts.map +1 -0
  101. package/dist/modules/register.js +239 -0
  102. package/dist/modules/register.js.map +1 -0
  103. package/dist/modules/sandbox.d.ts +106 -0
  104. package/dist/modules/sandbox.d.ts.map +1 -0
  105. package/dist/modules/sandbox.js +224 -0
  106. package/dist/modules/sandbox.js.map +1 -0
  107. package/dist/modules/streams.d.ts +81 -0
  108. package/dist/modules/streams.d.ts.map +1 -0
  109. package/dist/modules/streams.js +292 -0
  110. package/dist/modules/streams.js.map +1 -0
  111. package/dist/modules/tasks.d.ts +145 -0
  112. package/dist/modules/tasks.d.ts.map +1 -0
  113. package/dist/modules/tasks.js +165 -0
  114. package/dist/modules/tasks.js.map +1 -0
  115. package/dist/modules/telemetry.d.ts +137 -0
  116. package/dist/modules/telemetry.d.ts.map +1 -0
  117. package/dist/modules/telemetry.js +203 -0
  118. package/dist/modules/telemetry.js.map +1 -0
  119. package/dist/modules/workspace.d.ts +180 -0
  120. package/dist/modules/workspace.d.ts.map +1 -0
  121. package/dist/modules/workspace.js +157 -0
  122. package/dist/modules/workspace.js.map +1 -0
  123. package/dist/quickstart-join.d.ts +56 -0
  124. package/dist/quickstart-join.d.ts.map +1 -0
  125. package/dist/quickstart-join.js +116 -0
  126. package/dist/quickstart-join.js.map +1 -0
  127. package/dist/quickstart.d.ts +137 -0
  128. package/dist/quickstart.d.ts.map +1 -0
  129. package/dist/quickstart.js +292 -0
  130. package/dist/quickstart.js.map +1 -0
  131. package/dist/retry.d.ts +88 -0
  132. package/dist/retry.d.ts.map +1 -0
  133. package/dist/retry.js +152 -0
  134. package/dist/retry.js.map +1 -0
  135. package/dist/types.d.ts +447 -0
  136. package/dist/types.d.ts.map +1 -0
  137. package/dist/types.js +10 -0
  138. package/dist/types.js.map +1 -0
  139. package/dist/utils.d.ts +88 -0
  140. package/dist/utils.d.ts.map +1 -0
  141. package/dist/utils.js +199 -0
  142. package/dist/utils.js.map +1 -0
  143. 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"}