@lobu/core 9.4.0 → 10.0.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,7 @@
1
+ /**
2
+ * Tests for the shared credential-store primitives (credentials.ts). These back
3
+ * BOTH the CLI's `lobu login` store and the embedded server's managed-connector
4
+ * resolver, so the v2 file format + refresh semantics must stay exact.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=credentials.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/credentials.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,216 @@
1
+ "use strict";
2
+ /**
3
+ * Tests for the shared credential-store primitives (credentials.ts). These back
4
+ * BOTH the CLI's `lobu login` store and the embedded server's managed-connector
5
+ * resolver, so the v2 file format + refresh semantics must stay exact.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ const bun_test_1 = require("bun:test");
42
+ const promises_1 = require("node:fs/promises");
43
+ const node_os_1 = require("node:os");
44
+ const node_path_1 = require("node:path");
45
+ const credentials_1 = require("../credentials");
46
+ const DEFAULT = "lobu";
47
+ let dir;
48
+ let file;
49
+ (0, bun_test_1.beforeEach)(async () => {
50
+ dir = await (0, promises_1.mkdtemp)((0, node_path_1.join)((0, node_os_1.tmpdir)(), "lobu-cred-"));
51
+ file = (0, node_path_1.join)(dir, "credentials.json");
52
+ });
53
+ (0, bun_test_1.afterEach)(async () => {
54
+ await (0, promises_1.rm)(dir, { recursive: true, force: true });
55
+ });
56
+ (0, bun_test_1.describe)("credential store I/O", () => {
57
+ (0, bun_test_1.test)("write → read round-trips and preserves extra (non-base) fields", async () => {
58
+ await (0, credentials_1.writeContextCredential)(file, "lobu", DEFAULT, {
59
+ accessToken: "at",
60
+ refreshToken: "rt",
61
+ expiresAt: 123,
62
+ email: "a@b.com",
63
+ localWorkerToken: "wt",
64
+ });
65
+ const read = await (0, credentials_1.readContextCredential)(file, "lobu", DEFAULT);
66
+ (0, bun_test_1.expect)(read).toEqual({
67
+ accessToken: "at",
68
+ refreshToken: "rt",
69
+ expiresAt: 123,
70
+ email: "a@b.com",
71
+ localWorkerToken: "wt",
72
+ });
73
+ });
74
+ (0, bun_test_1.test)("writes are 0600 and a second context does not clobber the first", async () => {
75
+ await (0, credentials_1.writeContextCredential)(file, "lobu", DEFAULT, { accessToken: "a" });
76
+ await (0, credentials_1.writeContextCredential)(file, "work", DEFAULT, { accessToken: "b" });
77
+ const store = await (0, credentials_1.readCredentialStore)(file, DEFAULT);
78
+ (0, bun_test_1.expect)(store.contexts.lobu?.accessToken).toBe("a");
79
+ (0, bun_test_1.expect)(store.contexts.work?.accessToken).toBe("b");
80
+ const { stat } = await Promise.resolve().then(() => __importStar(require("node:fs/promises")));
81
+ const mode = (await stat(file)).mode & 0o777;
82
+ (0, bun_test_1.expect)(mode).toBe(0o600);
83
+ });
84
+ (0, bun_test_1.test)("a legacy single-context file migrates under the default context", async () => {
85
+ const { writeFile } = await Promise.resolve().then(() => __importStar(require("node:fs/promises")));
86
+ await writeFile(file, JSON.stringify({ accessToken: "legacy", refreshToken: "r" }));
87
+ const read = await (0, credentials_1.readContextCredential)(file, DEFAULT, DEFAULT);
88
+ (0, bun_test_1.expect)(read?.accessToken).toBe("legacy");
89
+ // A non-default context is absent in a legacy file.
90
+ (0, bun_test_1.expect)(await (0, credentials_1.readContextCredential)(file, "work", DEFAULT)).toBeNull();
91
+ });
92
+ (0, bun_test_1.test)("a missing or corrupt file reads as an empty store", async () => {
93
+ (0, bun_test_1.expect)((await (0, credentials_1.readCredentialStore)(file, DEFAULT)).contexts).toEqual({});
94
+ const { writeFile } = await Promise.resolve().then(() => __importStar(require("node:fs/promises")));
95
+ await writeFile(file, "{not json");
96
+ (0, bun_test_1.expect)((await (0, credentials_1.readCredentialStore)(file, DEFAULT)).contexts).toEqual({});
97
+ });
98
+ (0, bun_test_1.test)("entries without an accessToken (or an EMPTY-string one) are dropped on read", async () => {
99
+ const { writeFile } = await Promise.resolve().then(() => __importStar(require("node:fs/promises")));
100
+ await writeFile(file, JSON.stringify({
101
+ version: 2,
102
+ contexts: {
103
+ lobu: { accessToken: "ok" },
104
+ bad: { refreshToken: "x" },
105
+ // An empty-string accessToken is invalid — `lobu login` is the
106
+ // load-bearing primitive and must treat "" as no credential.
107
+ empty: { accessToken: "" },
108
+ },
109
+ }));
110
+ const store = await (0, credentials_1.readCredentialStore)(file, DEFAULT);
111
+ (0, bun_test_1.expect)(store.contexts.lobu?.accessToken).toBe("ok");
112
+ (0, bun_test_1.expect)(store.contexts.bad).toBeUndefined();
113
+ (0, bun_test_1.expect)(store.contexts.empty).toBeUndefined();
114
+ });
115
+ (0, bun_test_1.test)("concurrent writes never corrupt the store and leave no temp files", async () => {
116
+ // The server's refresh write-back and the CLI can write the store at the
117
+ // same time. The atomic temp-file + rename write guarantees a reader always
118
+ // sees ONE writer's COMPLETE file (never a half-written/interleaved one) and
119
+ // no `.tmp-*` turds are left behind. (It is last-writer-wins on the rename —
120
+ // we don't merge concurrent read-modify-writes — so not every context is
121
+ // guaranteed to survive; the invariant being proven here is no CORRUPTION,
122
+ // not no-lost-update.)
123
+ const { readdir } = await Promise.resolve().then(() => __importStar(require("node:fs/promises")));
124
+ await Promise.all(Array.from({ length: 25 }, (_, i) => (0, credentials_1.writeContextCredential)(file, `ctx-${i % 5}`, DEFAULT, {
125
+ accessToken: `token-${i}`,
126
+ })));
127
+ // The file parses cleanly (no interleaved/truncated JSON) — every surviving
128
+ // entry is a valid credential.
129
+ const store = await (0, credentials_1.readCredentialStore)(file, DEFAULT);
130
+ (0, bun_test_1.expect)(Object.keys(store.contexts).length).toBeGreaterThan(0);
131
+ for (const cred of Object.values(store.contexts)) {
132
+ (0, bun_test_1.expect)(typeof cred.accessToken).toBe("string");
133
+ (0, bun_test_1.expect)(cred.accessToken.length).toBeGreaterThan(0);
134
+ }
135
+ // Perms survive concurrent overwrites.
136
+ const { stat } = await Promise.resolve().then(() => __importStar(require("node:fs/promises")));
137
+ (0, bun_test_1.expect)((await stat(file)).mode & 0o777).toBe(0o600);
138
+ // No leftover temp files in the dir.
139
+ const entries = await readdir(dir);
140
+ (0, bun_test_1.expect)(entries.filter((n) => n.includes(".tmp-"))).toEqual([]);
141
+ (0, bun_test_1.expect)(entries).toContain("credentials.json");
142
+ });
143
+ (0, bun_test_1.test)("delete removes one context; deletes the file when none remain", async () => {
144
+ await (0, credentials_1.writeContextCredential)(file, "lobu", DEFAULT, { accessToken: "a" });
145
+ await (0, credentials_1.writeContextCredential)(file, "work", DEFAULT, { accessToken: "b" });
146
+ await (0, credentials_1.deleteContextCredential)(file, "lobu", DEFAULT);
147
+ (0, bun_test_1.expect)(await (0, credentials_1.readContextCredential)(file, "lobu", DEFAULT)).toBeNull();
148
+ (0, bun_test_1.expect)((await (0, credentials_1.readContextCredential)(file, "work", DEFAULT))?.accessToken).toBe("b");
149
+ await (0, credentials_1.deleteContextCredential)(file, "work", DEFAULT);
150
+ await (0, bun_test_1.expect)((0, promises_1.readFile)(file, "utf-8")).rejects.toThrow();
151
+ });
152
+ });
153
+ (0, bun_test_1.describe)("refresh predicates", () => {
154
+ (0, bun_test_1.test)("credentialNeedsRefresh respects the expiry buffer", () => {
155
+ (0, bun_test_1.expect)((0, credentials_1.credentialNeedsRefresh)({ accessToken: "a" })).toBe(false); // no expiry
156
+ (0, bun_test_1.expect)((0, credentials_1.credentialNeedsRefresh)({
157
+ accessToken: "a",
158
+ expiresAt: Date.now() + 600000,
159
+ })).toBe(false);
160
+ (0, bun_test_1.expect)((0, credentials_1.credentialNeedsRefresh)({
161
+ accessToken: "a",
162
+ expiresAt: Date.now() + 1000,
163
+ })).toBe(true);
164
+ (0, bun_test_1.expect)((0, credentials_1.credentialNeedsRefresh)({ accessToken: "a", expiresAt: Date.now() - 1 })).toBe(true);
165
+ });
166
+ (0, bun_test_1.test)("credentialCanRefresh requires a refresh token, client id, and token endpoint", () => {
167
+ (0, bun_test_1.expect)((0, credentials_1.credentialCanRefresh)({ accessToken: "a" })).toBe(false);
168
+ (0, bun_test_1.expect)((0, credentials_1.credentialCanRefresh)({ accessToken: "a", refreshToken: "r" })).toBe(false);
169
+ (0, bun_test_1.expect)((0, credentials_1.credentialCanRefresh)({
170
+ accessToken: "a",
171
+ refreshToken: "r",
172
+ oauth: { clientId: "c", tokenEndpoint: "https://x/token" },
173
+ })).toBe(true);
174
+ });
175
+ });
176
+ (0, bun_test_1.describe)("refreshOAuthToken", () => {
177
+ const realFetch = globalThis.fetch;
178
+ (0, bun_test_1.afterEach)(() => {
179
+ globalThis.fetch = realFetch;
180
+ });
181
+ (0, bun_test_1.test)("returns rotated tokens on success", async () => {
182
+ globalThis.fetch = (0, bun_test_1.mock)(async () => new Response(JSON.stringify({
183
+ access_token: "new-at",
184
+ refresh_token: "new-rt",
185
+ expires_in: 3600,
186
+ }), { status: 200 }));
187
+ const result = await (0, credentials_1.refreshOAuthToken)("https://x/token", { clientId: "c" }, "old-rt");
188
+ (0, bun_test_1.expect)(result).toEqual({
189
+ accessToken: "new-at",
190
+ refreshToken: "new-rt",
191
+ expiresIn: 3600,
192
+ });
193
+ });
194
+ (0, bun_test_1.test)("omits refreshToken/expiresIn when the issuer does not return them", async () => {
195
+ globalThis.fetch = (0, bun_test_1.mock)(async () => new Response(JSON.stringify({ access_token: "only-at" }), {
196
+ status: 200,
197
+ }));
198
+ const result = await (0, credentials_1.refreshOAuthToken)("https://x/token", { clientId: "c" }, "rt");
199
+ (0, bun_test_1.expect)(result).toEqual({
200
+ accessToken: "only-at",
201
+ refreshToken: undefined,
202
+ expiresIn: undefined,
203
+ });
204
+ });
205
+ (0, bun_test_1.test)("returns null on non-2xx, a missing access_token, or a network error", async () => {
206
+ globalThis.fetch = (0, bun_test_1.mock)(async () => new Response("nope", { status: 401 }));
207
+ (0, bun_test_1.expect)(await (0, credentials_1.refreshOAuthToken)("https://x/token", { clientId: "c" }, "rt")).toBeNull();
208
+ globalThis.fetch = (0, bun_test_1.mock)(async () => new Response(JSON.stringify({ token_type: "bearer" }), { status: 200 }));
209
+ (0, bun_test_1.expect)(await (0, credentials_1.refreshOAuthToken)("https://x/token", { clientId: "c" }, "rt")).toBeNull();
210
+ globalThis.fetch = (0, bun_test_1.mock)(async () => {
211
+ throw new Error("offline");
212
+ });
213
+ (0, bun_test_1.expect)(await (0, credentials_1.refreshOAuthToken)("https://x/token", { clientId: "c" }, "rt")).toBeNull();
214
+ });
215
+ });
216
+ //# sourceMappingURL=credentials.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.test.js","sourceRoot":"","sources":["../../src/__tests__/credentials.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Shared primitives for the `~/.config/lobu/credentials.json` store — the
3
+ * v2, context-keyed credential file written by `lobu login`.
4
+ *
5
+ * Two consumers read/refresh/write this store: the CLI
6
+ * (`packages/cli/src/internal/credentials.ts`) and the embedded server's
7
+ * managed-connector resolver (`packages/server/src/connect/cloud-credential.ts`).
8
+ * This module is the single implementation of the file format + refresh grant so
9
+ * the two can't drift. It is pure file I/O + a plain refresh_token POST — the
10
+ * CLI layers its own concerns (per-process caching, in-flight refresh dedup,
11
+ * local-init, context resolution) on top.
12
+ */
13
+ export interface OAuthClientInfo {
14
+ clientId: string;
15
+ clientSecret?: string;
16
+ /** Cached so refresh/logout don't have to re-discover. */
17
+ tokenEndpoint?: string;
18
+ revocationEndpoint?: string;
19
+ userinfoEndpoint?: string;
20
+ }
21
+ /**
22
+ * The auth-relevant fields every stored credential carries. Consumers may store
23
+ * extra fields alongside these (e.g. the CLI's `email` / `userId` /
24
+ * `localWorkerToken`); the `C` type parameter preserves them through read/write.
25
+ */
26
+ export interface BaseCredential {
27
+ accessToken: string;
28
+ refreshToken?: string;
29
+ /** Epoch ms when the access token expires. */
30
+ expiresAt?: number;
31
+ /** Registered OAuth client + endpoints used to mint/refresh these tokens. */
32
+ oauth?: OAuthClientInfo;
33
+ }
34
+ export interface CredentialStore<C extends BaseCredential = BaseCredential> {
35
+ version: 2;
36
+ contexts: Record<string, C>;
37
+ }
38
+ /** Refresh the access token when it expires within this window. */
39
+ export declare const CREDENTIAL_REFRESH_BUFFER_MS = 60000;
40
+ export declare function normalizeCredential<C extends BaseCredential = BaseCredential>(value: Partial<C> | null | undefined): C | null;
41
+ /**
42
+ * Read + normalize the whole store. A legacy single-context file (pre-v2: the
43
+ * bare credential object at the top level) is migrated under `defaultContextName`.
44
+ * Missing or corrupt files yield an empty store rather than throwing.
45
+ */
46
+ export declare function readCredentialStore<C extends BaseCredential = BaseCredential>(file: string, defaultContextName: string): Promise<CredentialStore<C>>;
47
+ /** Read one context's credential (null when absent/corrupt). */
48
+ export declare function readContextCredential<C extends BaseCredential = BaseCredential>(file: string, contextName: string, defaultContextName: string): Promise<C | null>;
49
+ /**
50
+ * Write one context's credential into the store, preserving other contexts.
51
+ * The write is atomic (temp-file + `rename`) so a concurrent writer (e.g. the
52
+ * server's refresh write-back) can never observe a half-written store. 0600
53
+ * perms are set on the temp file before the rename, so the published file is
54
+ * never world-readable even momentarily.
55
+ */
56
+ export declare function writeContextCredential<C extends BaseCredential = BaseCredential>(file: string, contextName: string, defaultContextName: string, credential: C): Promise<void>;
57
+ /** Remove one context. Deletes the file entirely when no contexts remain. */
58
+ export declare function deleteContextCredential<C extends BaseCredential = BaseCredential>(file: string, contextName: string, defaultContextName: string): Promise<void>;
59
+ export declare function credentialNeedsRefresh(cred: BaseCredential, bufferMs?: number): boolean;
60
+ export declare function credentialCanRefresh<C extends BaseCredential = BaseCredential>(cred: C): cred is C & {
61
+ refreshToken: string;
62
+ oauth: OAuthClientInfo & {
63
+ tokenEndpoint: string;
64
+ };
65
+ };
66
+ export interface RefreshedToken {
67
+ accessToken: string;
68
+ refreshToken?: string;
69
+ /** Seconds until expiry, when the issuer returns `expires_in`. */
70
+ expiresIn?: number;
71
+ }
72
+ /**
73
+ * Plain RFC 6749 refresh_token grant against the issuer token endpoint (JSON
74
+ * body). Returns null on any network / non-2xx / parse failure. The issuer may
75
+ * rotate the refresh token, so callers MUST persist the returned `refreshToken`
76
+ * when present.
77
+ */
78
+ export declare function refreshOAuthToken(tokenEndpoint: string, client: {
79
+ clientId: string;
80
+ clientSecret?: string;
81
+ }, refreshToken: string): Promise<RefreshedToken | null>;
82
+ //# sourceMappingURL=credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAaH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc;IACxE,OAAO,EAAE,CAAC,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;CAC7B;AAED,mEAAmE;AACnE,eAAO,MAAM,4BAA4B,QAAS,CAAC;AAEnD,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAC3E,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,GACnC,CAAC,GAAG,IAAI,CAUV;AAYD;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,CAAC,SAAS,cAAc,GAAG,cAAc,EACzC,IAAI,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAoBvE;AAED,gEAAgE;AAChE,wBAAsB,qBAAqB,CACzC,CAAC,SAAS,cAAc,GAAG,cAAc,EAEzC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,kBAAkB,EAAE,MAAM,GACzB,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAGnB;AA6BD;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAC1C,CAAC,SAAS,cAAc,GAAG,cAAc,EAEzC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,kBAAkB,EAAE,MAAM,EAC1B,UAAU,EAAE,CAAC,GACZ,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,6EAA6E;AAC7E,wBAAsB,uBAAuB,CAC3C,CAAC,SAAS,cAAc,GAAG,cAAc,EAEzC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,kBAAkB,EAAE,MAAM,GACzB,OAAO,CAAC,IAAI,CAAC,CAQf;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,cAAc,EACpB,QAAQ,SAA+B,GACtC,OAAO,CAKT;AAED,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAC5E,IAAI,EAAE,CAAC,GACN,IAAI,IAAI,CAAC,GAAG;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,eAAe,GAAG;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;CACpD,CAIA;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,EACnD,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAmChC"}
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+ /**
3
+ * Shared primitives for the `~/.config/lobu/credentials.json` store — the
4
+ * v2, context-keyed credential file written by `lobu login`.
5
+ *
6
+ * Two consumers read/refresh/write this store: the CLI
7
+ * (`packages/cli/src/internal/credentials.ts`) and the embedded server's
8
+ * managed-connector resolver (`packages/server/src/connect/cloud-credential.ts`).
9
+ * This module is the single implementation of the file format + refresh grant so
10
+ * the two can't drift. It is pure file I/O + a plain refresh_token POST — the
11
+ * CLI layers its own concerns (per-process caching, in-flight refresh dedup,
12
+ * local-init, context resolution) on top.
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.CREDENTIAL_REFRESH_BUFFER_MS = void 0;
16
+ exports.normalizeCredential = normalizeCredential;
17
+ exports.readCredentialStore = readCredentialStore;
18
+ exports.readContextCredential = readContextCredential;
19
+ exports.writeContextCredential = writeContextCredential;
20
+ exports.deleteContextCredential = deleteContextCredential;
21
+ exports.credentialNeedsRefresh = credentialNeedsRefresh;
22
+ exports.credentialCanRefresh = credentialCanRefresh;
23
+ exports.refreshOAuthToken = refreshOAuthToken;
24
+ const node_crypto_1 = require("node:crypto");
25
+ const promises_1 = require("node:fs/promises");
26
+ const node_path_1 = require("node:path");
27
+ /** Refresh the access token when it expires within this window. */
28
+ exports.CREDENTIAL_REFRESH_BUFFER_MS = 60000;
29
+ function normalizeCredential(value) {
30
+ if (!value ||
31
+ typeof value !== "object" ||
32
+ typeof value.accessToken !== "string" ||
33
+ value.accessToken === "") {
34
+ return null;
35
+ }
36
+ return { ...value, accessToken: value.accessToken };
37
+ }
38
+ function isCredentialStore(value) {
39
+ return (!!value &&
40
+ typeof value === "object" &&
41
+ "contexts" in value &&
42
+ !!value.contexts &&
43
+ typeof value.contexts === "object");
44
+ }
45
+ /**
46
+ * Read + normalize the whole store. A legacy single-context file (pre-v2: the
47
+ * bare credential object at the top level) is migrated under `defaultContextName`.
48
+ * Missing or corrupt files yield an empty store rather than throwing.
49
+ */
50
+ async function readCredentialStore(file, defaultContextName) {
51
+ try {
52
+ const raw = await (0, promises_1.readFile)(file, "utf-8");
53
+ const parsed = JSON.parse(raw);
54
+ if (isCredentialStore(parsed)) {
55
+ const contexts = {};
56
+ for (const [name, value] of Object.entries(parsed.contexts)) {
57
+ const norm = normalizeCredential(value);
58
+ if (norm)
59
+ contexts[name] = norm;
60
+ }
61
+ return { version: 2, contexts };
62
+ }
63
+ const legacy = normalizeCredential(parsed);
64
+ return {
65
+ version: 2,
66
+ contexts: legacy ? { [defaultContextName]: legacy } : {},
67
+ };
68
+ }
69
+ catch {
70
+ return { version: 2, contexts: {} };
71
+ }
72
+ }
73
+ /** Read one context's credential (null when absent/corrupt). */
74
+ async function readContextCredential(file, contextName, defaultContextName) {
75
+ const store = await readCredentialStore(file, defaultContextName);
76
+ return store.contexts[contextName] ?? null;
77
+ }
78
+ /**
79
+ * Atomically write `data` to `file` with 0600 perms. Writes to a sibling temp
80
+ * file (same dir, so `rename` is on the same filesystem and therefore atomic on
81
+ * POSIX), chmods the temp BEFORE the rename so the published file never has a
82
+ * window of looser perms, then renames over the target. This makes concurrent
83
+ * writers (CLI `lobu login` + the server's token-refresh write-back) safe: each
84
+ * writer commits its whole-file image in a single atomic `rename`, so a reader
85
+ * always sees one writer's complete file — never a half-written / interleaved
86
+ * one. (Last-writer-wins on the rename; we don't merge, but neither writer can
87
+ * corrupt the store.)
88
+ */
89
+ async function atomicWriteFile(file, data) {
90
+ await (0, promises_1.mkdir)((0, node_path_1.dirname)(file), { recursive: true });
91
+ const tmp = (0, node_path_1.join)((0, node_path_1.dirname)(file), `${".tmp-"}${process.pid}.${(0, node_crypto_1.randomBytes)(6).toString("hex")}`);
92
+ try {
93
+ await (0, promises_1.writeFile)(tmp, data, { mode: 0o600 });
94
+ await (0, promises_1.chmod)(tmp, 0o600).catch(() => undefined);
95
+ await (0, promises_1.rename)(tmp, file);
96
+ }
97
+ catch (error) {
98
+ await (0, promises_1.rm)(tmp).catch(() => undefined);
99
+ throw error;
100
+ }
101
+ }
102
+ /**
103
+ * Write one context's credential into the store, preserving other contexts.
104
+ * The write is atomic (temp-file + `rename`) so a concurrent writer (e.g. the
105
+ * server's refresh write-back) can never observe a half-written store. 0600
106
+ * perms are set on the temp file before the rename, so the published file is
107
+ * never world-readable even momentarily.
108
+ */
109
+ async function writeContextCredential(file, contextName, defaultContextName, credential) {
110
+ const store = await readCredentialStore(file, defaultContextName);
111
+ store.contexts[contextName] = credential;
112
+ await atomicWriteFile(file, JSON.stringify(store, null, 2));
113
+ }
114
+ /** Remove one context. Deletes the file entirely when no contexts remain. */
115
+ async function deleteContextCredential(file, contextName, defaultContextName) {
116
+ const store = await readCredentialStore(file, defaultContextName);
117
+ delete store.contexts[contextName];
118
+ if (Object.keys(store.contexts).length === 0) {
119
+ await (0, promises_1.rm)(file).catch(() => undefined);
120
+ return;
121
+ }
122
+ await atomicWriteFile(file, JSON.stringify(store, null, 2));
123
+ }
124
+ function credentialNeedsRefresh(cred, bufferMs = exports.CREDENTIAL_REFRESH_BUFFER_MS) {
125
+ return (typeof cred.expiresAt === "number" &&
126
+ cred.expiresAt - bufferMs <= Date.now());
127
+ }
128
+ function credentialCanRefresh(cred) {
129
+ return Boolean(cred.refreshToken && cred.oauth?.tokenEndpoint && cred.oauth.clientId);
130
+ }
131
+ /**
132
+ * Plain RFC 6749 refresh_token grant against the issuer token endpoint (JSON
133
+ * body). Returns null on any network / non-2xx / parse failure. The issuer may
134
+ * rotate the refresh token, so callers MUST persist the returned `refreshToken`
135
+ * when present.
136
+ */
137
+ async function refreshOAuthToken(tokenEndpoint, client, refreshToken) {
138
+ const body = {
139
+ grant_type: "refresh_token",
140
+ refresh_token: refreshToken,
141
+ client_id: client.clientId,
142
+ };
143
+ if (client.clientSecret)
144
+ body.client_secret = client.clientSecret;
145
+ let response;
146
+ try {
147
+ response = await fetch(tokenEndpoint, {
148
+ method: "POST",
149
+ headers: {
150
+ "Content-Type": "application/json",
151
+ Accept: "application/json",
152
+ },
153
+ body: JSON.stringify(body),
154
+ });
155
+ }
156
+ catch {
157
+ return null;
158
+ }
159
+ if (!response.ok)
160
+ return null;
161
+ const data = (await response.json().catch(() => null));
162
+ if (!data || typeof data.access_token !== "string")
163
+ return null;
164
+ return {
165
+ accessToken: data.access_token,
166
+ refreshToken: typeof data.refresh_token === "string" ? data.refresh_token : undefined,
167
+ expiresIn: typeof data.expires_in === "number" ? data.expires_in : undefined,
168
+ };
169
+ }
170
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env bun
2
2
  export * from "./agent-policy";
3
+ export * from "./credentials";
3
4
  export type { AgentAccessStore, AgentConfigStore, AgentConnectionStore, AgentMetadata, AgentSettings, AgentStore, ChannelBinding, ConnectionSettings, Grant, GrantKind, StoredConnection, } from "./agent-store";
4
5
  export { inferGrantKind } from "./agent-store";
5
6
  export type { AgentConfigResponse, AgentInfo, CatalogProvider, Connection, McpConfig, ModelOption, PermissionGrant, PrefillMcp, PrefillSkill, ProviderInfo, ProviderState, ProviderStatus, SettingsSnapshot, Skill, SkillMcpServerInfo, } from "./api-types";
@@ -27,7 +28,6 @@ export type { BaseMessage } from "./types/message";
27
28
  export * from "./utils/encryption";
28
29
  export * from "./utils/env";
29
30
  export * from "./utils/json";
30
- export * from "./utils/lock";
31
31
  export type { McpStatus, McpToolDef } from "./utils/mcp-tool-instructions";
32
32
  export * from "./utils/network-domains";
33
33
  export * from "./utils/retry";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -18,6 +18,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
18
18
  Object.defineProperty(exports, "__esModule", { value: true });
19
19
  exports.parseSessionEntries = exports.entryToMessage = exports.hasCredentialSource = exports.generateTraceId = exports.extractTraceId = exports.initSentry = exports.getSentry = exports.withSpan = exports.withChildSpan = exports.shutdownTracing = exports.SpanStatusCode = exports.SpanKind = exports.runInSpanContext = exports.initTracing = exports.getTracer = exports.getTraceparent = exports.getCurrentSpan = exports.flushTracing = exports.createSpan = exports.createRootSpan = exports.createChildSpan = exports.renderSkillMemorySection = exports.renderFallbackSystemContext = exports.BaseInstructionProvider = exports.CommandRegistry = exports.inferGrantKind = void 0;
20
20
  __exportStar(require("./agent-policy"), exports);
21
+ // Shared credential-store primitives (CLI + embedded server share one impl)
22
+ __exportStar(require("./credentials"), exports);
21
23
  var agent_store_1 = require("./agent-store");
22
24
  Object.defineProperty(exports, "inferGrantKind", { enumerable: true, get: function () { return agent_store_1.inferGrantKind; } });
23
25
  __exportStar(require("./capabilities"), exports);
@@ -72,7 +74,6 @@ Object.defineProperty(exports, "hasCredentialSource", { enumerable: true, get: f
72
74
  __exportStar(require("./utils/encryption"), exports);
73
75
  __exportStar(require("./utils/env"), exports);
74
76
  __exportStar(require("./utils/json"), exports);
75
- __exportStar(require("./utils/lock"), exports);
76
77
  __exportStar(require("./utils/network-domains"), exports);
77
78
  __exportStar(require("./utils/retry"), exports);
78
79
  __exportStar(require("./utils/sanitize"), exports);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAEA,4EAA4E;;;;;;;;;;;;;;;;;AAE5E,iDAA+B;AAe/B,6CAA+C;AAAtC,6GAAA,cAAc,OAAA;AAmBvB,iDAA+B;AAE/B,mBAAmB;AACnB,uDAAqD;AAA5C,mHAAA,eAAe,OAAA;AACxB,8CAA4B;AAC5B,mBAAmB;AACnB,2CAAyB;AACzB,0EAA0E;AAC1E,+CAA6B;AAC7B,wEAAwE;AACxE,+DAAiE;AAAxD,+HAAA,uBAAuB,OAAA;AAMhC,4EAA4E;AAC5E,gFAAgF;AAChF,8EAA8E;AAC9E,2EAA2E;AAC3E,iDAGyB;AAFvB,4HAAA,2BAA2B,OAAA;AAC3B,yHAAA,wBAAwB,OAAA;AAE1B,2CAAyB;AACzB,gBAAgB;AAChB,4CAA0B;AAE1B,wBAAwB;AACxB,+BAegB;AAdd,uGAAA,eAAe,OAAA;AACf,sGAAA,cAAc,OAAA;AACd,kGAAA,UAAU,OAAA;AACV,oGAAA,YAAY,OAAA;AACZ,sGAAA,cAAc,OAAA;AACd,sGAAA,cAAc,OAAA;AACd,iGAAA,SAAS,OAAA;AACT,mGAAA,WAAW,OAAA;AACX,wGAAA,gBAAgB,OAAA;AAChB,gGAAA,QAAQ,OAAA;AACR,sGAAA,cAAc,OAAA;AACd,uGAAA,eAAe,OAAA;AACf,qGAAA,aAAa,OAAA;AACb,gGAAA,QAAQ,OAAA;AAeV,gDAA8B;AAC9B,gBAAgB;AAChB,mCAAiD;AAAxC,mGAAA,SAAS,OAAA;AAAE,oGAAA,UAAU,OAAA;AAC9B,iCAA0D;AAAjD,uGAAA,cAAc,OAAA;AAAE,wGAAA,eAAe,OAAA;AAmCxC,iCAA8C;AAArC,4GAAA,mBAAmB,OAAA;AAI5B,YAAY;AACZ,qDAAmC;AACnC,8CAA4B;AAC5B,+CAA6B;AAC7B,+CAA6B;AAE7B,0DAAwC;AACxC,gDAA8B;AAC9B,mDAAiC;AACjC,2DAA2D;AAC3D,qDAK8B;AAJ5B,8GAAA,cAAc,OAAA;AAEd,mHAAA,mBAAmB,OAAA;AAGrB,+CAA6B;AAC7B,gDAA8B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAEA,4EAA4E;;;;;;;;;;;;;;;;;AAE5E,iDAA+B;AAC/B,4EAA4E;AAC5E,gDAA8B;AAe9B,6CAA+C;AAAtC,6GAAA,cAAc,OAAA;AAmBvB,iDAA+B;AAE/B,mBAAmB;AACnB,uDAAqD;AAA5C,mHAAA,eAAe,OAAA;AACxB,8CAA4B;AAC5B,mBAAmB;AACnB,2CAAyB;AACzB,0EAA0E;AAC1E,+CAA6B;AAC7B,wEAAwE;AACxE,+DAAiE;AAAxD,+HAAA,uBAAuB,OAAA;AAMhC,4EAA4E;AAC5E,gFAAgF;AAChF,8EAA8E;AAC9E,2EAA2E;AAC3E,iDAGyB;AAFvB,4HAAA,2BAA2B,OAAA;AAC3B,yHAAA,wBAAwB,OAAA;AAE1B,2CAAyB;AACzB,gBAAgB;AAChB,4CAA0B;AAE1B,wBAAwB;AACxB,+BAegB;AAdd,uGAAA,eAAe,OAAA;AACf,sGAAA,cAAc,OAAA;AACd,kGAAA,UAAU,OAAA;AACV,oGAAA,YAAY,OAAA;AACZ,sGAAA,cAAc,OAAA;AACd,sGAAA,cAAc,OAAA;AACd,iGAAA,SAAS,OAAA;AACT,mGAAA,WAAW,OAAA;AACX,wGAAA,gBAAgB,OAAA;AAChB,gGAAA,QAAQ,OAAA;AACR,sGAAA,cAAc,OAAA;AACd,uGAAA,eAAe,OAAA;AACf,qGAAA,aAAa,OAAA;AACb,gGAAA,QAAQ,OAAA;AAeV,gDAA8B;AAC9B,gBAAgB;AAChB,mCAAiD;AAAxC,mGAAA,SAAS,OAAA;AAAE,oGAAA,UAAU,OAAA;AAC9B,iCAA0D;AAAjD,uGAAA,cAAc,OAAA;AAAE,wGAAA,eAAe,OAAA;AAmCxC,iCAA8C;AAArC,4GAAA,mBAAmB,OAAA;AAI5B,YAAY;AACZ,qDAAmC;AACnC,8CAA4B;AAC5B,+CAA6B;AAE7B,0DAAwC;AACxC,gDAA8B;AAC9B,mDAAiC;AACjC,2DAA2D;AAC3D,qDAK8B;AAJ5B,8GAAA,cAAc,OAAA;AAEd,mHAAA,mBAAmB,OAAA;AAGrB,+CAA6B;AAC7B,gDAA8B"}
package/dist/types.d.ts CHANGED
@@ -458,6 +458,14 @@ export interface ThreadResponsePayload {
458
458
  delta?: string;
459
459
  isFullReplacement?: boolean;
460
460
  processedMessageIds?: string[];
461
+ /**
462
+ * Full final assistant text, set on the TERMINAL completion row by the
463
+ * worker. Lets a renderer deliver the reply without the per-pod streaming
464
+ * buffer (which only exists on the pod that consumed the delta rows) — so a
465
+ * post-once platform (Slack) renders correctly even when the completion is
466
+ * drained by a different replica than the one that buffered the deltas.
467
+ */
468
+ finalText?: string;
461
469
  error?: string;
462
470
  errorCode?: string;
463
471
  timestamp: number;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lobu/core",
3
- "version": "9.4.0",
3
+ "version": "10.0.0",
4
4
  "license": "Apache-2.0",
5
5
  "description": "Core types and utilities for Lobu agent platform",
6
6
  "repository": {
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=utils-lock.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils-lock.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/utils-lock.test.ts"],"names":[],"mappings":""}
@@ -1,82 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const bun_test_1 = require("bun:test");
4
- const lock_1 = require("../utils/lock");
5
- const wait = (ms) => new Promise((r) => setTimeout(r, ms));
6
- (0, bun_test_1.describe)("AsyncLock", () => {
7
- (0, bun_test_1.test)("returns the value from the wrapped function", async () => {
8
- const lock = new lock_1.AsyncLock("test");
9
- const result = await lock.acquire(async () => 42);
10
- (0, bun_test_1.expect)(result).toBe(42);
11
- });
12
- (0, bun_test_1.test)("serializes concurrent operations (FIFO ordering)", async () => {
13
- const lock = new lock_1.AsyncLock("serial");
14
- const events = [];
15
- const op = (label, ms) => lock.acquire(async () => {
16
- events.push(`start:${label}`);
17
- await wait(ms);
18
- events.push(`end:${label}`);
19
- return label;
20
- });
21
- const [a, b, c] = await Promise.all([op("a", 30), op("b", 10), op("c", 5)]);
22
- (0, bun_test_1.expect)([a, b, c]).toEqual(["a", "b", "c"]);
23
- // Each operation must end before the next one starts
24
- (0, bun_test_1.expect)(events).toEqual([
25
- "start:a",
26
- "end:a",
27
- "start:b",
28
- "end:b",
29
- "start:c",
30
- "end:c",
31
- ]);
32
- });
33
- (0, bun_test_1.test)("releases lock even when wrapped function throws", async () => {
34
- const lock = new lock_1.AsyncLock("error-path");
35
- await (0, bun_test_1.expect)(lock.acquire(async () => {
36
- throw new Error("boom");
37
- })).rejects.toThrow("boom");
38
- // Subsequent acquire should succeed (lock was released)
39
- const result = await lock.acquire(async () => "after-error");
40
- (0, bun_test_1.expect)(result).toBe("after-error");
41
- });
42
- (0, bun_test_1.test)("times out when previous holder runs longer than timeoutMs", async () => {
43
- const lock = new lock_1.AsyncLock("timeout-ctx");
44
- // First operation holds the lock for 200ms
45
- const slow = lock.acquire(async () => {
46
- await wait(200);
47
- return "slow";
48
- });
49
- // Second operation should time out after 20ms waiting
50
- await (0, bun_test_1.expect)(lock.acquire(async () => "fast", 20)).rejects.toThrow(/Lock acquisition timeout after 20ms.*timeout-ctx/);
51
- // Wait for the slow op to finish so the test cleans up
52
- await slow;
53
- });
54
- (0, bun_test_1.test)("default context appears in timeout message", async () => {
55
- const lock = new lock_1.AsyncLock();
56
- const slow = lock.acquire(async () => {
57
- await wait(100);
58
- });
59
- await (0, bun_test_1.expect)(lock.acquire(async () => "x", 10)).rejects.toThrow(/possible deadlock in unknown/);
60
- await slow;
61
- });
62
- (0, bun_test_1.test)("timeout error from previous slow holder doesn't poison subsequent acquires", async () => {
63
- const lock = new lock_1.AsyncLock("recovery");
64
- const slow = lock.acquire(async () => {
65
- await wait(80);
66
- return "slow-done";
67
- });
68
- await (0, bun_test_1.expect)(lock.acquire(async () => "skipped", 5)).rejects.toThrow();
69
- // After slow finishes, lock should be usable again
70
- (0, bun_test_1.expect)(await slow).toBe("slow-done");
71
- (0, bun_test_1.expect)(await lock.acquire(async () => "ok")).toBe("ok");
72
- });
73
- (0, bun_test_1.test)("propagates non-Error throws", async () => {
74
- const lock = new lock_1.AsyncLock();
75
- await (0, bun_test_1.expect)(lock.acquire(async () => {
76
- throw "string-error";
77
- })).rejects.toBe("string-error");
78
- // Lock still works after non-Error throw
79
- (0, bun_test_1.expect)(await lock.acquire(async () => "recovered")).toBe("recovered");
80
- });
81
- });
82
- //# sourceMappingURL=utils-lock.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils-lock.test.js","sourceRoot":"","sources":["../../src/__tests__/utils-lock.test.ts"],"names":[],"mappings":";;AAAA,uCAAkD;AAClD,wCAA0C;AAE1C,MAAM,IAAI,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAEnE,IAAA,mBAAQ,EAAC,WAAW,EAAE,GAAG,EAAE;IACzB,IAAA,eAAI,EAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,IAAI,GAAG,IAAI,gBAAS,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAClD,IAAA,iBAAM,EAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,IAAA,eAAI,EAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,IAAI,GAAG,IAAI,gBAAS,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,MAAM,EAAE,GAAG,CAAC,KAAa,EAAE,EAAU,EAAE,EAAE,CACvC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;YACtB,MAAM,CAAC,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC;YAC9B,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC;YAC5B,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;QAEL,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAE5E,IAAA,iBAAM,EAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QAC3C,qDAAqD;QACrD,IAAA,iBAAM,EAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,SAAS;YACT,OAAO;YACP,SAAS;YACT,OAAO;YACP,SAAS;YACT,OAAO;SACR,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,eAAI,EAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,IAAI,GAAG,IAAI,gBAAS,CAAC,YAAY,CAAC,CAAC;QAEzC,MAAM,IAAA,iBAAM,EACV,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;YACtB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC,CAAC,CACH,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAE1B,wDAAwD;QACxD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,aAAa,CAAC,CAAC;QAC7D,IAAA,iBAAM,EAAC,MAAM,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,IAAA,eAAI,EAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,IAAI,GAAG,IAAI,gBAAS,CAAC,aAAa,CAAC,CAAC;QAE1C,2CAA2C;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;YACnC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,sDAAsD;QACtD,MAAM,IAAA,iBAAM,EAAC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAChE,kDAAkD,CACnD,CAAC;QAEF,uDAAuD;QACvD,MAAM,IAAI,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,IAAA,eAAI,EAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,IAAI,GAAG,IAAI,gBAAS,EAAE,CAAC;QAE7B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;YACnC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,MAAM,IAAA,iBAAM,EAAC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC7D,8BAA8B,CAC/B,CAAC;QAEF,MAAM,IAAI,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,IAAA,eAAI,EAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;QAC5F,MAAM,IAAI,GAAG,IAAI,gBAAS,CAAC,UAAU,CAAC,CAAC;QAEvC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;YACnC,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,OAAO,WAAW,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,MAAM,IAAA,iBAAM,EAAC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAEvE,mDAAmD;QACnD,IAAA,iBAAM,EAAC,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACrC,IAAA,iBAAM,EAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,IAAA,eAAI,EAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,IAAI,GAAG,IAAI,gBAAS,EAAE,CAAC;QAC7B,MAAM,IAAA,iBAAM,EACV,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;YACtB,MAAM,cAAc,CAAC;QACvB,CAAC,CAAC,CACH,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAE/B,yCAAyC;QACzC,IAAA,iBAAM,EAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,34 +0,0 @@
1
- /**
2
- * Async lock for serializing concurrent operations
3
- * Prevents race conditions in async code by ensuring only one operation runs at a time
4
- *
5
- * @example
6
- * ```typescript
7
- * class StreamSession {
8
- * private streamLock = new AsyncLock();
9
- *
10
- * async appendDelta(delta: string) {
11
- * return this.streamLock.acquire(() => this.appendDeltaUnsafe(delta));
12
- * }
13
- *
14
- * private async appendDeltaUnsafe(delta: string) {
15
- * // Critical section - only one execution at a time
16
- * }
17
- * }
18
- * ```
19
- */
20
- export declare class AsyncLock {
21
- private lock;
22
- private lockContext;
23
- constructor(context?: string);
24
- /**
25
- * Acquire lock and execute function exclusively
26
- *
27
- * @param fn - The async function to execute with exclusive access
28
- * @param timeoutMs - Maximum time to wait for lock acquisition (default: 30s)
29
- * @returns The result of the function
30
- * @throws Error if lock acquisition times out
31
- */
32
- acquire<T>(fn: () => Promise<T>, timeoutMs?: number): Promise<T>;
33
- }
34
- //# sourceMappingURL=lock.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../src/utils/lock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,IAAI,CAAoC;IAChD,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,GAAE,MAAkB;IAIvC;;;;;;;OAOG;IACG,OAAO,CAAC,CAAC,EACb,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,SAAS,GAAE,MAAc,GACxB,OAAO,CAAC,CAAC,CAAC;CAoCd"}
@@ -1,66 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AsyncLock = void 0;
4
- /**
5
- * Async lock for serializing concurrent operations
6
- * Prevents race conditions in async code by ensuring only one operation runs at a time
7
- *
8
- * @example
9
- * ```typescript
10
- * class StreamSession {
11
- * private streamLock = new AsyncLock();
12
- *
13
- * async appendDelta(delta: string) {
14
- * return this.streamLock.acquire(() => this.appendDeltaUnsafe(delta));
15
- * }
16
- *
17
- * private async appendDeltaUnsafe(delta: string) {
18
- * // Critical section - only one execution at a time
19
- * }
20
- * }
21
- * ```
22
- */
23
- class AsyncLock {
24
- constructor(context = "unknown") {
25
- this.lock = Promise.resolve();
26
- this.lockContext = context;
27
- }
28
- /**
29
- * Acquire lock and execute function exclusively
30
- *
31
- * @param fn - The async function to execute with exclusive access
32
- * @param timeoutMs - Maximum time to wait for lock acquisition (default: 30s)
33
- * @returns The result of the function
34
- * @throws Error if lock acquisition times out
35
- */
36
- async acquire(fn, timeoutMs = 30000) {
37
- const currentLock = this.lock;
38
- let releaseLock;
39
- // Create new lock that will be released when fn completes
40
- this.lock = new Promise((resolve) => {
41
- releaseLock = resolve;
42
- });
43
- let timeoutId;
44
- try {
45
- // Wait for previous operation with timeout to prevent deadlock
46
- const lockTimeout = new Promise((_, reject) => {
47
- timeoutId = setTimeout(() => {
48
- reject(new Error(`Lock acquisition timeout after ${timeoutMs}ms - possible deadlock in ${this.lockContext}`));
49
- }, timeoutMs);
50
- });
51
- await Promise.race([currentLock, lockTimeout]);
52
- // Execute function with exclusive access
53
- return await fn();
54
- }
55
- finally {
56
- // Clear the timeout to prevent leak
57
- if (timeoutId !== undefined) {
58
- clearTimeout(timeoutId);
59
- }
60
- // Always release lock, even on error
61
- releaseLock?.();
62
- }
63
- }
64
- }
65
- exports.AsyncLock = AsyncLock;
66
- //# sourceMappingURL=lock.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lock.js","sourceRoot":"","sources":["../../src/utils/lock.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAa,SAAS;IAIpB,YAAY,UAAkB,SAAS;QAH/B,SAAI,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;QAI9C,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;IAC7B,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,OAAO,CACX,EAAoB,EACpB,YAAoB,KAAK;QAEzB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC;QAC9B,IAAI,WAAqC,CAAC;QAE1C,0DAA0D;QAC1D,IAAI,CAAC,IAAI,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACxC,WAAW,GAAG,OAAO,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,IAAI,SAAoD,CAAC;QAEzD,IAAI,CAAC;YACH,+DAA+D;YAC/D,MAAM,WAAW,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;gBACnD,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC1B,MAAM,CACJ,IAAI,KAAK,CACP,kCAAkC,SAAS,6BAA6B,IAAI,CAAC,WAAW,EAAE,CAC3F,CACF,CAAC;gBACJ,CAAC,EAAE,SAAS,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;YAE/C,yCAAyC;YACzC,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;gBAAS,CAAC;YACT,oCAAoC;YACpC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC5B,YAAY,CAAC,SAAS,CAAC,CAAC;YAC1B,CAAC;YACD,qCAAqC;YACrC,WAAW,EAAE,EAAE,CAAC;QAClB,CAAC;IACH,CAAC;CACF;AAvDD,8BAuDC"}