@grackle-ai/adapter-sdk 0.165.0 → 0.167.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,85 @@
1
+ import type { EnvironmentAdapter, PowerLineConnection, ProvisionEvent } from "./adapter.js";
2
+ /**
3
+ * Lifecycle state for a single environment managed by an adapter.
4
+ *
5
+ * - `idle` — no active infrastructure or connection.
6
+ * - `provisioning` — provision or reconnect in progress (mutex held).
7
+ * - `provisioned` — infrastructure ready, not yet connected.
8
+ * - `connected` — gRPC connection to PowerLine is established.
9
+ */
10
+ export type AdapterLifecycleState = "idle" | "provisioning" | "provisioned" | "connected";
11
+ /**
12
+ * Abstract base class for environment adapters that enforces lifecycle state
13
+ * transitions and prevents concurrent operations on the same environment.
14
+ *
15
+ * Subclasses implement the `do*` template methods; {@link BaseAdapter} wraps
16
+ * each with state guards and a per-environment mutex.
17
+ *
18
+ * The {@link EnvironmentAdapter} interface is unchanged — callers see the
19
+ * same API. `reconnect` is NOT defined here because
20
+ * {@link reconnectOrProvision} checks `adapter.reconnect` to decide whether
21
+ * to attempt fast reconnect. Subclasses that support reconnect should define
22
+ * their own `reconnect` method and use `withProvisionLock` for the
23
+ * same mutex/state semantics as `provision`.
24
+ */
25
+ export declare abstract class BaseAdapter implements EnvironmentAdapter {
26
+ abstract type: string;
27
+ private readonly states;
28
+ private readonly locks;
29
+ /** Return the lifecycle state for an environment (`idle` if unknown). */
30
+ getState(environmentId: string): AdapterLifecycleState;
31
+ /**
32
+ * Provision infrastructure and yield progress events.
33
+ *
34
+ * Acquires a per-environment mutex for the duration of provisioning.
35
+ * On success the state moves to `provisioned`; on error it resets to `idle`.
36
+ */
37
+ provision(environmentId: string, config: Record<string, unknown>, powerlineToken: string): AsyncGenerator<ProvisionEvent>;
38
+ /**
39
+ * Establish a connection to the PowerLine.
40
+ *
41
+ * Allowed from any non-locked state. Docker attach calls this from `idle`
42
+ * after a server restart (re-resolves connectivity on the fly).
43
+ */
44
+ connect(environmentId: string, config: Record<string, unknown>, powerlineToken: string): Promise<PowerLineConnection>;
45
+ /**
46
+ * Release connection resources. Idempotent — safe to call from any
47
+ * non-locked state. Throws if a provision/reconnect is in progress to
48
+ * prevent tearing down resources while they are being set up.
49
+ */
50
+ disconnect(environmentId: string): Promise<void>;
51
+ /**
52
+ * Stop the environment's compute. Idempotent — resets state to `idle`.
53
+ * Throws if a provision/reconnect is in progress.
54
+ */
55
+ stop(environmentId: string, config: Record<string, unknown>): Promise<void>;
56
+ /**
57
+ * Destroy the environment's compute. Idempotent — removes all state.
58
+ * Throws if a provision/reconnect is in progress.
59
+ */
60
+ destroy(environmentId: string, config: Record<string, unknown>): Promise<void>;
61
+ /** Return true if the PowerLine is reachable. Subclasses must implement. */
62
+ abstract healthCheck(connection: PowerLineConnection): Promise<boolean>;
63
+ protected abstract doProvision(environmentId: string, config: Record<string, unknown>, powerlineToken: string): AsyncGenerator<ProvisionEvent>;
64
+ protected abstract doConnect(environmentId: string, config: Record<string, unknown>, powerlineToken: string): Promise<PowerLineConnection>;
65
+ protected abstract doDisconnect(environmentId: string): Promise<void>;
66
+ protected abstract doStop(environmentId: string, config: Record<string, unknown>): Promise<void>;
67
+ protected abstract doDestroy(environmentId: string, config: Record<string, unknown>): Promise<void>;
68
+ /**
69
+ * Wrap an async generator (provision or reconnect) with the lifecycle mutex.
70
+ *
71
+ * Acquires a per-environment lock, sets state to `provisioning`, yields all
72
+ * events from the wrapped generator, then sets state to `provisioned`.
73
+ * On error the state resets to `idle`. Subclasses that support `reconnect`
74
+ * should use this in their own `reconnect` method:
75
+ *
76
+ * ```ts
77
+ * public async *reconnect(envId, config, token) {
78
+ * yield* this.withProvisionLock(envId, this.doReconnect(envId, config, token));
79
+ * }
80
+ * ```
81
+ */
82
+ protected withProvisionLock(environmentId: string, generator: AsyncGenerator<ProvisionEvent>): AsyncGenerator<ProvisionEvent>;
83
+ private assertNotLocked;
84
+ }
85
+ //# sourceMappingURL=base-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-adapter.d.ts","sourceRoot":"","sources":["../src/base-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE5F;;;;;;;GAOG;AACH,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,cAAc,GAAG,aAAa,GAAG,WAAW,CAAC;AAE1F;;;;;;;;;;;;;GAaG;AACH,8BAAsB,WAAY,YAAW,kBAAkB;IAC7D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAGnB;IACJ,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkC;IAExD,yEAAyE;IAClE,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,qBAAqB;IAM7D;;;;;OAKG;IACW,SAAS,CACrB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,cAAc,EAAE,MAAM,GACrB,cAAc,CAAC,cAAc,CAAC;IAOjC;;;;;OAKG;IACU,OAAO,CAClB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,mBAAmB,CAAC;IAO/B;;;;OAIG;IACU,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ7D;;;OAGG;IACU,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAMxF;;;OAGG;IACU,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3F,4EAA4E;aAC5D,WAAW,CAAC,UAAU,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;IAI9E,SAAS,CAAC,QAAQ,CAAC,WAAW,CAC5B,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,cAAc,EAAE,MAAM,GACrB,cAAc,CAAC,cAAc,CAAC;IAEjC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAC1B,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,mBAAmB,CAAC;IAE/B,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAErE,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAEhG,SAAS,CAAC,QAAQ,CAAC,SAAS,CAC1B,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC;IAIhB;;;;;;;;;;;;;OAaG;cACc,iBAAiB,CAChC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,cAAc,CAAC,cAAc,CAAC,GACxC,cAAc,CAAC,cAAc,CAAC;IAiBjC,OAAO,CAAC,eAAe;CAOxB"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Abstract base class for environment adapters that enforces lifecycle state
3
+ * transitions and prevents concurrent operations on the same environment.
4
+ *
5
+ * Subclasses implement the `do*` template methods; {@link BaseAdapter} wraps
6
+ * each with state guards and a per-environment mutex.
7
+ *
8
+ * The {@link EnvironmentAdapter} interface is unchanged — callers see the
9
+ * same API. `reconnect` is NOT defined here because
10
+ * {@link reconnectOrProvision} checks `adapter.reconnect` to decide whether
11
+ * to attempt fast reconnect. Subclasses that support reconnect should define
12
+ * their own `reconnect` method and use `withProvisionLock` for the
13
+ * same mutex/state semantics as `provision`.
14
+ */
15
+ export class BaseAdapter {
16
+ states = new Map();
17
+ locks = new Set();
18
+ /** Return the lifecycle state for an environment (`idle` if unknown). */
19
+ getState(environmentId) {
20
+ return this.states.get(environmentId) ?? "idle";
21
+ }
22
+ // ─── Guarded lifecycle methods ──────────────────────────────
23
+ /**
24
+ * Provision infrastructure and yield progress events.
25
+ *
26
+ * Acquires a per-environment mutex for the duration of provisioning.
27
+ * On success the state moves to `provisioned`; on error it resets to `idle`.
28
+ */
29
+ async *provision(environmentId, config, powerlineToken) {
30
+ yield* this.withProvisionLock(environmentId, this.doProvision(environmentId, config, powerlineToken));
31
+ }
32
+ /**
33
+ * Establish a connection to the PowerLine.
34
+ *
35
+ * Allowed from any non-locked state. Docker attach calls this from `idle`
36
+ * after a server restart (re-resolves connectivity on the fly).
37
+ */
38
+ async connect(environmentId, config, powerlineToken) {
39
+ this.assertNotLocked(environmentId);
40
+ const conn = await this.doConnect(environmentId, config, powerlineToken);
41
+ this.states.set(environmentId, "connected");
42
+ return conn;
43
+ }
44
+ /**
45
+ * Release connection resources. Idempotent — safe to call from any
46
+ * non-locked state. Throws if a provision/reconnect is in progress to
47
+ * prevent tearing down resources while they are being set up.
48
+ */
49
+ async disconnect(environmentId) {
50
+ this.assertNotLocked(environmentId);
51
+ await this.doDisconnect(environmentId);
52
+ if (this.getState(environmentId) === "connected") {
53
+ this.states.set(environmentId, "idle");
54
+ }
55
+ }
56
+ /**
57
+ * Stop the environment's compute. Idempotent — resets state to `idle`.
58
+ * Throws if a provision/reconnect is in progress.
59
+ */
60
+ async stop(environmentId, config) {
61
+ this.assertNotLocked(environmentId);
62
+ await this.doStop(environmentId, config);
63
+ this.states.set(environmentId, "idle");
64
+ }
65
+ /**
66
+ * Destroy the environment's compute. Idempotent — removes all state.
67
+ * Throws if a provision/reconnect is in progress.
68
+ */
69
+ async destroy(environmentId, config) {
70
+ this.assertNotLocked(environmentId);
71
+ await this.doDestroy(environmentId, config);
72
+ this.states.delete(environmentId);
73
+ }
74
+ // ─── Lock helper for subclass reconnect ─────────────────────
75
+ /**
76
+ * Wrap an async generator (provision or reconnect) with the lifecycle mutex.
77
+ *
78
+ * Acquires a per-environment lock, sets state to `provisioning`, yields all
79
+ * events from the wrapped generator, then sets state to `provisioned`.
80
+ * On error the state resets to `idle`. Subclasses that support `reconnect`
81
+ * should use this in their own `reconnect` method:
82
+ *
83
+ * ```ts
84
+ * public async *reconnect(envId, config, token) {
85
+ * yield* this.withProvisionLock(envId, this.doReconnect(envId, config, token));
86
+ * }
87
+ * ```
88
+ */
89
+ async *withProvisionLock(environmentId, generator) {
90
+ this.assertNotLocked(environmentId);
91
+ this.locks.add(environmentId);
92
+ this.states.set(environmentId, "provisioning");
93
+ try {
94
+ yield* generator;
95
+ this.states.set(environmentId, "provisioned");
96
+ }
97
+ catch (err) {
98
+ this.states.set(environmentId, "idle");
99
+ throw err;
100
+ }
101
+ finally {
102
+ this.locks.delete(environmentId);
103
+ }
104
+ }
105
+ // ─── Internals ──────────────────────────────────────────────
106
+ assertNotLocked(environmentId) {
107
+ if (this.locks.has(environmentId)) {
108
+ throw new Error(`Operation already in progress for environment ${environmentId} (state: ${this.getState(environmentId)})`);
109
+ }
110
+ }
111
+ }
112
+ //# sourceMappingURL=base-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-adapter.js","sourceRoot":"","sources":["../src/base-adapter.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -3,6 +3,8 @@ export { FatalAdapterError } from "./fatal-error.js";
3
3
  export { defaultLogger } from "./logger.js";
4
4
  export type { PowerLineConnection, ProvisionEvent, BaseEnvironmentConfig, EnvironmentAdapter, } from "./adapter.js";
5
5
  export { reconnectOrProvision } from "./adapter.js";
6
+ export type { AdapterLifecycleState } from "./base-adapter.js";
7
+ export { BaseAdapter } from "./base-adapter.js";
6
8
  export type { RemoteExecutor } from "./remote-executor.js";
7
9
  export type { RemoteTunnel, TunnelProcessFactory, TunnelPortProbe } from "./tunnel.js";
8
10
  export { ProcessTunnel } from "./tunnel.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGpD,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D,YAAY,EAAE,YAAY,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG/F,YAAY,EAAE,UAAU,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,GAChB,MAAM,cAAc,CAAC;AAGtB,YAAY,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AACpF,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAGtF,YAAY,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAGnF,OAAO,EACL,KAAK,EACL,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,SAAS,EACT,iBAAiB,EACjB,WAAW,EACX,0BAA0B,EAC1B,2BAA2B,EAC3B,8BAA8B,GAC/B,MAAM,YAAY,CAAC;AAMpB,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,YAAY,EACV,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAKpF,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC9F,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,iBAAiB,GAClB,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGpD,YAAY,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D,YAAY,EAAE,YAAY,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG/F,YAAY,EAAE,UAAU,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,GAChB,MAAM,cAAc,CAAC;AAGtB,YAAY,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AACpF,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAGtF,YAAY,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAGnF,OAAO,EACL,KAAK,EACL,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,SAAS,EACT,iBAAiB,EACjB,WAAW,EACX,0BAA0B,EAC1B,2BAA2B,EAC3B,8BAA8B,GAC/B,MAAM,YAAY,CAAC;AAMpB,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,YAAY,EACV,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAKpF,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC9F,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,iBAAiB,GAClB,MAAM,iBAAiB,CAAC"}
package/dist/index.js CHANGED
@@ -2,6 +2,7 @@
2
2
  export { FatalAdapterError } from "./fatal-error.js";
3
3
  export { defaultLogger } from "./logger.js";
4
4
  export { reconnectOrProvision } from "./adapter.js";
5
+ export { BaseAdapter } from "./base-adapter.js";
5
6
  export { ProcessTunnel } from "./tunnel.js";
6
7
  export { registerTunnel, getTunnel, closeTunnel, closeAllTunnels } from "./tunnel-registry.js";
7
8
  export { createAhpHostTransport, connectThroughTunnel, waitForLocalPort, TCP_PORT_PROBER, } from "./connect.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,gEAAgE;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAS5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAOpD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAI/F,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,GAChB,MAAM,cAAc,CAAC;AAItB,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AAExB,8DAA8D;AAC9D,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAItF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAKjC,+DAA+D;AAC/D,OAAO,EACL,KAAK,EACL,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,SAAS,EACT,iBAAiB,EACjB,WAAW,EACX,0BAA0B,EAC1B,2BAA2B,EAC3B,8BAA8B,GAC/B,MAAM,YAAY,CAAC;AAoBpB,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAMpF,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,iBAAiB,GAClB,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,gEAAgE;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAS5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAIpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAOhD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAI/F,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,GAChB,MAAM,cAAc,CAAC;AAItB,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AAExB,8DAA8D;AAC9D,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAItF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAKjC,+DAA+D;AAC/D,OAAO,EACL,KAAK,EACL,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,SAAS,EACT,iBAAiB,EACjB,WAAW,EACX,0BAA0B,EAC1B,2BAA2B,EAC3B,8BAA8B,GAC/B,MAAM,YAAY,CAAC;AAoBpB,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAMpF,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,iBAAiB,GAClB,MAAM,iBAAiB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@grackle-ai/adapter-sdk",
3
- "version": "0.165.0",
3
+ "version": "0.167.0",
4
4
  "description": "SDK for building Grackle environment adapters",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -28,15 +28,16 @@
28
28
  "dist/"
29
29
  ],
30
30
  "dependencies": {
31
- "@grackle-ai/ahp": "0.165.0",
32
- "@grackle-ai/ahp-transport": "0.165.0",
33
- "@grackle-ai/common": "0.165.0"
31
+ "@grackle-ai/common": "0.167.0",
32
+ "@grackle-ai/ahp-transport": "0.167.0",
33
+ "@grackle-ai/ahp": "0.167.0"
34
34
  },
35
35
  "devDependencies": {
36
36
  "@rushstack/heft": "1.2.7",
37
37
  "@types/node": "^22.0.0",
38
- "@vitest/coverage-v8": "^3.1.1",
39
- "vitest": "^3.1.1",
38
+ "@vitest/coverage-v8": "^4.1.0",
39
+ "vitest": "^4.1.0",
40
+ "@vitest/spy": "^4.1.0",
40
41
  "@grackle-ai/heft-rig": "0.0.1"
41
42
  },
42
43
  "scripts": {