@sideboard-ai/core 0.1.130 → 0.1.133
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/abletime-DDTV7WO3.js +36 -0
- package/dist/abletime-VTP4JR63.js +37 -0
- package/dist/agents/cursor-runner.js +1 -1
- package/dist/{agents-7BUQY2WX.js → agents-NHS6P25H.js} +8 -6
- package/dist/{agents-X2I3RNCY.js → agents-SOU5GPWI.js} +9 -7
- package/dist/{app-settings-6RPALX4J.js → app-settings-U5RZKUXG.js} +11 -1
- package/dist/{app-settings-E7NEQY7D.js → app-settings-YQ7YX2CC.js} +11 -1
- package/dist/chunk-2XXAAIN3.js +463 -0
- package/dist/{chunk-VE22NWBD.js → chunk-3UVVWNHF.js} +2 -2
- package/dist/{chunk-NV73AO7Q.js → chunk-4YAVXWFR.js} +21 -9
- package/dist/{chunk-RSFCB23A.js → chunk-6CRKPD4C.js} +4 -3
- package/dist/chunk-6GN5WPYZ.js +31 -0
- package/dist/{chunk-ZMUOPTKZ.js → chunk-AK7SWE2U.js} +55 -12
- package/dist/chunk-AT346U23.js +468 -0
- package/dist/{chunk-YMRT2DU6.js → chunk-ED4UPEJX.js} +25 -50
- package/dist/chunk-ELBYOGVA.js +32 -0
- package/dist/{chunk-IUJOI7KK.js → chunk-FSCQXMGI.js} +35 -4
- package/dist/{chunk-HUYEU4GS.js → chunk-GJBHOJCZ.js} +83 -2
- package/dist/{chunk-ZND6XV6J.js → chunk-GKKHXZCT.js} +83 -2
- package/dist/{chunk-HZPO3SSZ.js → chunk-IM36S4HZ.js} +4 -3
- package/dist/{chunk-EKIDHL2T.js → chunk-KBWND62T.js} +32 -55
- package/dist/{chunk-HULESWLI.js → chunk-LTP7GHIF.js} +3 -3
- package/dist/chunk-M267JPEA.js +103 -0
- package/dist/{chunk-HRSBZIXS.js → chunk-Q6XQXCOM.js} +1 -1
- package/dist/chunk-S42XV45P.js +104 -0
- package/dist/{chunk-YALVX3UE.js → chunk-TG7YU2KG.js} +157 -40
- package/dist/{chunk-FMBLOOAO.js → chunk-VSON7EJ6.js} +155 -39
- package/dist/{chunk-UDQI3N47.js → chunk-WEU5M7BW.js} +1 -1
- package/dist/{chunk-SYLTXDRF.js → chunk-Y645NFYN.js} +2 -2
- package/dist/{chunk-MNL4FSKY.js → chunk-YEIH7P7D.js} +3 -3
- package/dist/{connected-teams-ZCOU6KCD.js → connected-teams-4A2AXDNN.js} +3 -1
- package/dist/{connected-teams-O6D4PM7A.js → connected-teams-IJUJQ7R6.js} +3 -1
- package/dist/{coordinator-prompt-SPJSGAQS.js → coordinator-prompt-DXHEDRRN.js} +3 -3
- package/dist/{coordinator-prompt-MEEUOEF2.js → coordinator-prompt-XF7LVOUN.js} +3 -3
- package/dist/{global-workspace-KNESLWKG.js → global-workspace-2LO5ATOH.js} +4 -4
- package/dist/{global-workspace-BMWP7YZC.js → global-workspace-MLQNULOU.js} +4 -4
- package/dist/index.cjs +1410 -425
- package/dist/index.d.cts +224 -16
- package/dist/index.d.ts +224 -16
- package/dist/index.js +461 -292
- package/dist/mcp/run-stdio.cjs +1261 -342
- package/dist/mcp/run-stdio.js +340 -209
- package/dist/oauth-A7XXI2TM.js +11 -0
- package/dist/oauth-YJBAURIJ.js +13 -0
- package/dist/{orchestrator-3ZSFTG72.js → orchestrator-KR5RA5B7.js} +10 -8
- package/dist/{orchestrator-G6DU3AF3.js → orchestrator-P2SYHVLS.js} +11 -9
- package/dist/{workspaces-O4QZOASB.js → workspaces-ARWPZG6F.js} +5 -5
- package/dist/{workspaces-HSYRYJYV.js → workspaces-MINB764G.js} +5 -5
- package/dist/{worktree-ERHC7Q4F.js → worktree-EBZMUUAL.js} +2 -2
- package/dist/{worktree-JVGSLSLJ.js → worktree-S7MKMYAT.js} +2 -2
- package/package.json +1 -1
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
import {
|
|
2
|
+
brightsyAccessTokenNeedsRefresh,
|
|
3
|
+
ensureBrightsyLocalConfigFresh,
|
|
4
|
+
loadBrightsyConfig,
|
|
5
|
+
refreshBrightsyAccessToken,
|
|
6
|
+
saveBrightsyConfig
|
|
7
|
+
} from "./chunk-M267JPEA.js";
|
|
1
8
|
import {
|
|
2
9
|
appDataDir
|
|
3
10
|
} from "./chunk-QZQEXME2.js";
|
|
@@ -6,37 +13,12 @@ import {
|
|
|
6
13
|
} from "./chunk-DVM4ID64.js";
|
|
7
14
|
|
|
8
15
|
// src/brightsy/connected-teams.ts
|
|
9
|
-
import { existsSync
|
|
10
|
-
import { join as join2 } from "path";
|
|
11
|
-
|
|
12
|
-
// src/brightsy/config.ts
|
|
13
|
-
import { existsSync, readFileSync, writeFileSync } from "fs";
|
|
14
|
-
import { homedir } from "os";
|
|
16
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
15
17
|
import { join } from "path";
|
|
16
|
-
function brightsyConfigPath() {
|
|
17
|
-
return join(homedir(), ".brightsy", "config.json");
|
|
18
|
-
}
|
|
19
|
-
function loadBrightsyConfig() {
|
|
20
|
-
const path = brightsyConfigPath();
|
|
21
|
-
if (!existsSync(path)) {
|
|
22
|
-
throw new Error("Brightsy not logged in \u2014 run `brightsy login` first");
|
|
23
|
-
}
|
|
24
|
-
const raw = JSON.parse(readFileSync(path, "utf8"));
|
|
25
|
-
if (!raw.access_token || !raw.account_id) {
|
|
26
|
-
throw new Error("Brightsy config incomplete \u2014 run `brightsy login`");
|
|
27
|
-
}
|
|
28
|
-
return raw;
|
|
29
|
-
}
|
|
30
|
-
function saveBrightsyConfig(cfg) {
|
|
31
|
-
writeFileSync(brightsyConfigPath(), `${JSON.stringify(cfg, null, 2)}
|
|
32
|
-
`, {
|
|
33
|
-
mode: 384
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
18
|
|
|
37
19
|
// src/brightsy/accounts.ts
|
|
38
20
|
async function loadConnectedTeams() {
|
|
39
|
-
const { listConnectedBrightsyTeams: listConnectedBrightsyTeams2 } = await import("./connected-teams-
|
|
21
|
+
const { listConnectedBrightsyTeams: listConnectedBrightsyTeams2 } = await import("./connected-teams-4A2AXDNN.js");
|
|
40
22
|
return listConnectedBrightsyTeams2();
|
|
41
23
|
}
|
|
42
24
|
async function runBrightsyTeamsJson(args) {
|
|
@@ -64,11 +46,15 @@ async function listBrightsyAccounts() {
|
|
|
64
46
|
}
|
|
65
47
|
async function getBrightsySession() {
|
|
66
48
|
try {
|
|
49
|
+
const { ensureBrightsyLocalConfigFresh: ensureBrightsyLocalConfigFresh2 } = await import("./oauth-A7XXI2TM.js");
|
|
50
|
+
const { ensureConnectedBrightsyTeamTokens: ensureConnectedBrightsyTeamTokens2 } = await import("./connected-teams-4A2AXDNN.js");
|
|
51
|
+
await ensureBrightsyLocalConfigFresh2();
|
|
52
|
+
await ensureConnectedBrightsyTeamTokens2();
|
|
67
53
|
loadBrightsyConfig();
|
|
68
54
|
const data = await runBrightsyTeamsJson([]);
|
|
69
55
|
const accounts = Array.isArray(data.teams) ? data.teams : [];
|
|
70
56
|
const active = data.active ?? accounts.find((a) => a.active) ?? null;
|
|
71
|
-
const { ensureCliTeamTracked: ensureCliTeamTracked2 } = await import("./connected-teams-
|
|
57
|
+
const { ensureCliTeamTracked: ensureCliTeamTracked2 } = await import("./connected-teams-4A2AXDNN.js");
|
|
72
58
|
const connectedTeams = ensureCliTeamTracked2(
|
|
73
59
|
active ? { id: active.id, slug: active.slug, name: active.name } : void 0
|
|
74
60
|
);
|
|
@@ -108,20 +94,20 @@ async function performBrightsyAccountSwitch(accountIdOrSlug) {
|
|
|
108
94
|
return { cfg, target: data.active };
|
|
109
95
|
}
|
|
110
96
|
async function switchBrightsyAccount(accountIdOrSlug) {
|
|
111
|
-
const { connectBrightsyTeam: connectBrightsyTeam2 } = await import("./connected-teams-
|
|
97
|
+
const { connectBrightsyTeam: connectBrightsyTeam2 } = await import("./connected-teams-4A2AXDNN.js");
|
|
112
98
|
await connectBrightsyTeam2(accountIdOrSlug);
|
|
113
99
|
return getBrightsySession();
|
|
114
100
|
}
|
|
115
101
|
|
|
116
102
|
// src/brightsy/connected-teams.ts
|
|
117
103
|
function storePath() {
|
|
118
|
-
return
|
|
104
|
+
return join(appDataDir(), "brightsy-teams.json");
|
|
119
105
|
}
|
|
120
106
|
function readStore() {
|
|
121
107
|
const path = storePath();
|
|
122
|
-
if (!
|
|
108
|
+
if (!existsSync(path)) return [];
|
|
123
109
|
try {
|
|
124
|
-
const parsed = JSON.parse(
|
|
110
|
+
const parsed = JSON.parse(readFileSync(path, "utf8"));
|
|
125
111
|
return Array.isArray(parsed.teams) ? parsed.teams : [];
|
|
126
112
|
} catch {
|
|
127
113
|
return [];
|
|
@@ -130,7 +116,7 @@ function readStore() {
|
|
|
130
116
|
function writeStore(teams) {
|
|
131
117
|
mkdirSync(appDataDir(), { recursive: true });
|
|
132
118
|
const path = storePath();
|
|
133
|
-
|
|
119
|
+
writeFileSync(path, `${JSON.stringify({ teams }, null, 2)}
|
|
134
120
|
`, {
|
|
135
121
|
mode: 384
|
|
136
122
|
});
|
|
@@ -166,7 +152,6 @@ function applyConnectedTeamToCli(team) {
|
|
|
166
152
|
}
|
|
167
153
|
async function refreshTeamToken(team) {
|
|
168
154
|
if (!team.refresh_token) return team;
|
|
169
|
-
const endpoint = (team.endpoint || "https://brightsy.ai").replace(/\/$/, "");
|
|
170
155
|
const cfg = (() => {
|
|
171
156
|
try {
|
|
172
157
|
return loadBrightsyConfig();
|
|
@@ -174,39 +159,34 @@ async function refreshTeamToken(team) {
|
|
|
174
159
|
return null;
|
|
175
160
|
}
|
|
176
161
|
})();
|
|
177
|
-
const
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
body: new URLSearchParams({
|
|
182
|
-
grant_type: "refresh_token",
|
|
183
|
-
refresh_token: team.refresh_token,
|
|
184
|
-
client_id: clientId
|
|
185
|
-
})
|
|
162
|
+
const grant = await refreshBrightsyAccessToken({
|
|
163
|
+
endpoint: team.endpoint || "https://brightsy.ai",
|
|
164
|
+
refreshToken: team.refresh_token,
|
|
165
|
+
clientId: cfg?.oauth_client_id
|
|
186
166
|
});
|
|
187
|
-
if (!
|
|
188
|
-
const data = await res.json();
|
|
189
|
-
if (!data.access_token) return team;
|
|
167
|
+
if (!grant) return team;
|
|
190
168
|
return {
|
|
191
169
|
...team,
|
|
192
|
-
access_token:
|
|
193
|
-
refresh_token:
|
|
194
|
-
expires_at:
|
|
170
|
+
access_token: grant.access_token,
|
|
171
|
+
refresh_token: grant.refresh_token || team.refresh_token,
|
|
172
|
+
expires_at: grant.expires_at ?? team.expires_at
|
|
195
173
|
};
|
|
196
174
|
}
|
|
197
175
|
async function ensureConnectedBrightsyTeamTokens() {
|
|
176
|
+
await ensureBrightsyLocalConfigFresh().catch(() => null);
|
|
198
177
|
const teams = readStore();
|
|
199
178
|
if (teams.length === 0) return [];
|
|
200
179
|
const next = [];
|
|
201
180
|
let changed = false;
|
|
202
181
|
for (const team of teams) {
|
|
203
|
-
|
|
204
|
-
if (!expired) {
|
|
182
|
+
if (!team.refresh_token || !brightsyAccessTokenNeedsRefresh(team.expires_at)) {
|
|
205
183
|
next.push(team);
|
|
206
184
|
continue;
|
|
207
185
|
}
|
|
208
186
|
const refreshed = await refreshTeamToken(team);
|
|
209
|
-
if (refreshed.access_token !== team.access_token
|
|
187
|
+
if (refreshed.access_token !== team.access_token || refreshed.refresh_token !== team.refresh_token || refreshed.expires_at !== team.expires_at) {
|
|
188
|
+
changed = true;
|
|
189
|
+
}
|
|
210
190
|
next.push(refreshed);
|
|
211
191
|
}
|
|
212
192
|
if (changed) writeStore(next);
|
|
@@ -294,9 +274,6 @@ function brightsyMcpServerName(slug) {
|
|
|
294
274
|
}
|
|
295
275
|
|
|
296
276
|
export {
|
|
297
|
-
brightsyConfigPath,
|
|
298
|
-
loadBrightsyConfig,
|
|
299
|
-
saveBrightsyConfig,
|
|
300
277
|
listBrightsyAccounts,
|
|
301
278
|
getBrightsySession,
|
|
302
279
|
switchBrightsyAccount,
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ensureGlobalCoordinatorCwd
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-IM36S4HZ.js";
|
|
4
4
|
import {
|
|
5
5
|
allocateTeamName,
|
|
6
6
|
takenSlugsFromThread,
|
|
7
7
|
teamSlugFromName
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-WEU5M7BW.js";
|
|
9
9
|
import {
|
|
10
10
|
resolveNewThreadOptions,
|
|
11
11
|
resolveThreadDefaults
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-GJBHOJCZ.js";
|
|
13
13
|
import {
|
|
14
14
|
createEmptyThread,
|
|
15
15
|
listThreads,
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import {
|
|
2
|
+
formatFetchError
|
|
3
|
+
} from "./chunk-ELBYOGVA.js";
|
|
4
|
+
|
|
5
|
+
// src/brightsy/config.ts
|
|
6
|
+
import { existsSync, readFileSync, writeFileSync } from "fs";
|
|
7
|
+
import { homedir } from "os";
|
|
8
|
+
import { join } from "path";
|
|
9
|
+
function brightsyConfigPath() {
|
|
10
|
+
const override = process.env.BRIGHTSY_CONFIG?.trim();
|
|
11
|
+
if (override) return override;
|
|
12
|
+
return join(homedir(), ".brightsy", "config.json");
|
|
13
|
+
}
|
|
14
|
+
function loadBrightsyConfig() {
|
|
15
|
+
const path = brightsyConfigPath();
|
|
16
|
+
if (!existsSync(path)) {
|
|
17
|
+
throw new Error("Brightsy not logged in \u2014 run `brightsy login` first");
|
|
18
|
+
}
|
|
19
|
+
const raw = JSON.parse(readFileSync(path, "utf8"));
|
|
20
|
+
if (!raw.access_token || !raw.account_id) {
|
|
21
|
+
throw new Error("Brightsy config incomplete \u2014 run `brightsy login`");
|
|
22
|
+
}
|
|
23
|
+
return raw;
|
|
24
|
+
}
|
|
25
|
+
function saveBrightsyConfig(cfg) {
|
|
26
|
+
writeFileSync(brightsyConfigPath(), `${JSON.stringify(cfg, null, 2)}
|
|
27
|
+
`, {
|
|
28
|
+
mode: 384
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// src/brightsy/oauth.ts
|
|
33
|
+
var REFRESH_SKEW_MS = 6e4;
|
|
34
|
+
function brightsyAccessTokenNeedsRefresh(expiresAt, now = Date.now()) {
|
|
35
|
+
if (typeof expiresAt !== "number" || !Number.isFinite(expiresAt) || expiresAt <= 0) {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
return now >= expiresAt - REFRESH_SKEW_MS;
|
|
39
|
+
}
|
|
40
|
+
function applyGrant(current, grant) {
|
|
41
|
+
return {
|
|
42
|
+
access_token: grant.access_token,
|
|
43
|
+
refresh_token: grant.refresh_token || current.refresh_token,
|
|
44
|
+
expires_at: grant.expires_at ?? current.expires_at
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
async function refreshBrightsyAccessToken(opts) {
|
|
48
|
+
const endpoint = (opts.endpoint || "https://brightsy.ai").replace(/\/$/, "");
|
|
49
|
+
const url = `${endpoint}/oauth/token`;
|
|
50
|
+
const fetchImpl = opts.fetchImpl ?? globalThis.fetch.bind(globalThis);
|
|
51
|
+
let res;
|
|
52
|
+
try {
|
|
53
|
+
res = await fetchImpl(url, {
|
|
54
|
+
method: "POST",
|
|
55
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
56
|
+
body: new URLSearchParams({
|
|
57
|
+
grant_type: "refresh_token",
|
|
58
|
+
refresh_token: opts.refreshToken,
|
|
59
|
+
client_id: opts.clientId || "brightsy-cli"
|
|
60
|
+
})
|
|
61
|
+
});
|
|
62
|
+
} catch (err) {
|
|
63
|
+
throw new Error(formatFetchError(err, url));
|
|
64
|
+
}
|
|
65
|
+
if (!res.ok) return null;
|
|
66
|
+
const data = await res.json();
|
|
67
|
+
if (!data.access_token) return null;
|
|
68
|
+
return {
|
|
69
|
+
access_token: data.access_token,
|
|
70
|
+
refresh_token: data.refresh_token,
|
|
71
|
+
expires_at: data.expires_in ? Date.now() + data.expires_in * 1e3 : void 0
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
async function ensureBrightsyLocalConfigFresh(opts) {
|
|
75
|
+
let cfg;
|
|
76
|
+
try {
|
|
77
|
+
cfg = loadBrightsyConfig();
|
|
78
|
+
} catch {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
if (!cfg.refresh_token || !brightsyAccessTokenNeedsRefresh(cfg.expires_at)) {
|
|
82
|
+
return cfg;
|
|
83
|
+
}
|
|
84
|
+
const grant = await refreshBrightsyAccessToken({
|
|
85
|
+
endpoint: cfg.endpoint || "https://brightsy.ai",
|
|
86
|
+
refreshToken: cfg.refresh_token,
|
|
87
|
+
clientId: cfg.oauth_client_id,
|
|
88
|
+
fetchImpl: opts?.fetchImpl
|
|
89
|
+
});
|
|
90
|
+
if (!grant) return cfg;
|
|
91
|
+
const next = { ...cfg, ...applyGrant(cfg, grant) };
|
|
92
|
+
saveBrightsyConfig(next);
|
|
93
|
+
return next;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export {
|
|
97
|
+
brightsyConfigPath,
|
|
98
|
+
loadBrightsyConfig,
|
|
99
|
+
saveBrightsyConfig,
|
|
100
|
+
brightsyAccessTokenNeedsRefresh,
|
|
101
|
+
refreshBrightsyAccessToken,
|
|
102
|
+
ensureBrightsyLocalConfigFresh
|
|
103
|
+
};
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
formatFetchError
|
|
5
|
+
} from "./chunk-6GN5WPYZ.js";
|
|
6
|
+
|
|
7
|
+
// src/brightsy/config.ts
|
|
8
|
+
import { existsSync, readFileSync, writeFileSync } from "fs";
|
|
9
|
+
import { homedir } from "os";
|
|
10
|
+
import { join } from "path";
|
|
11
|
+
function brightsyConfigPath() {
|
|
12
|
+
const override = process.env.BRIGHTSY_CONFIG?.trim();
|
|
13
|
+
if (override) return override;
|
|
14
|
+
return join(homedir(), ".brightsy", "config.json");
|
|
15
|
+
}
|
|
16
|
+
function loadBrightsyConfig() {
|
|
17
|
+
const path = brightsyConfigPath();
|
|
18
|
+
if (!existsSync(path)) {
|
|
19
|
+
throw new Error("Brightsy not logged in \u2014 run `brightsy login` first");
|
|
20
|
+
}
|
|
21
|
+
const raw = JSON.parse(readFileSync(path, "utf8"));
|
|
22
|
+
if (!raw.access_token || !raw.account_id) {
|
|
23
|
+
throw new Error("Brightsy config incomplete \u2014 run `brightsy login`");
|
|
24
|
+
}
|
|
25
|
+
return raw;
|
|
26
|
+
}
|
|
27
|
+
function saveBrightsyConfig(cfg) {
|
|
28
|
+
writeFileSync(brightsyConfigPath(), `${JSON.stringify(cfg, null, 2)}
|
|
29
|
+
`, {
|
|
30
|
+
mode: 384
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// src/brightsy/oauth.ts
|
|
35
|
+
var REFRESH_SKEW_MS = 6e4;
|
|
36
|
+
function brightsyAccessTokenNeedsRefresh(expiresAt, now = Date.now()) {
|
|
37
|
+
if (typeof expiresAt !== "number" || !Number.isFinite(expiresAt) || expiresAt <= 0) {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
return now >= expiresAt - REFRESH_SKEW_MS;
|
|
41
|
+
}
|
|
42
|
+
function applyGrant(current, grant) {
|
|
43
|
+
return {
|
|
44
|
+
access_token: grant.access_token,
|
|
45
|
+
refresh_token: grant.refresh_token || current.refresh_token,
|
|
46
|
+
expires_at: grant.expires_at ?? current.expires_at
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
async function refreshBrightsyAccessToken(opts) {
|
|
50
|
+
const endpoint = (opts.endpoint || "https://brightsy.ai").replace(/\/$/, "");
|
|
51
|
+
const url = `${endpoint}/oauth/token`;
|
|
52
|
+
const fetchImpl = opts.fetchImpl ?? globalThis.fetch.bind(globalThis);
|
|
53
|
+
let res;
|
|
54
|
+
try {
|
|
55
|
+
res = await fetchImpl(url, {
|
|
56
|
+
method: "POST",
|
|
57
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
58
|
+
body: new URLSearchParams({
|
|
59
|
+
grant_type: "refresh_token",
|
|
60
|
+
refresh_token: opts.refreshToken,
|
|
61
|
+
client_id: opts.clientId || "brightsy-cli"
|
|
62
|
+
})
|
|
63
|
+
});
|
|
64
|
+
} catch (err) {
|
|
65
|
+
throw new Error(formatFetchError(err, url));
|
|
66
|
+
}
|
|
67
|
+
if (!res.ok) return null;
|
|
68
|
+
const data = await res.json();
|
|
69
|
+
if (!data.access_token) return null;
|
|
70
|
+
return {
|
|
71
|
+
access_token: data.access_token,
|
|
72
|
+
refresh_token: data.refresh_token,
|
|
73
|
+
expires_at: data.expires_in ? Date.now() + data.expires_in * 1e3 : void 0
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
async function ensureBrightsyLocalConfigFresh(opts) {
|
|
77
|
+
let cfg;
|
|
78
|
+
try {
|
|
79
|
+
cfg = loadBrightsyConfig();
|
|
80
|
+
} catch {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
if (!cfg.refresh_token || !brightsyAccessTokenNeedsRefresh(cfg.expires_at)) {
|
|
84
|
+
return cfg;
|
|
85
|
+
}
|
|
86
|
+
const grant = await refreshBrightsyAccessToken({
|
|
87
|
+
endpoint: cfg.endpoint || "https://brightsy.ai",
|
|
88
|
+
refreshToken: cfg.refresh_token,
|
|
89
|
+
clientId: cfg.oauth_client_id,
|
|
90
|
+
fetchImpl: opts?.fetchImpl
|
|
91
|
+
});
|
|
92
|
+
if (!grant) return cfg;
|
|
93
|
+
const next = { ...cfg, ...applyGrant(cfg, grant) };
|
|
94
|
+
saveBrightsyConfig(next);
|
|
95
|
+
return next;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export {
|
|
99
|
+
loadBrightsyConfig,
|
|
100
|
+
saveBrightsyConfig,
|
|
101
|
+
brightsyAccessTokenNeedsRefresh,
|
|
102
|
+
refreshBrightsyAccessToken,
|
|
103
|
+
ensureBrightsyLocalConfigFresh
|
|
104
|
+
};
|