@dataworks-technology/cli 1.1.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/plugins/marketplace.json +20 -0
- package/.claude-plugin/marketplace.json +16 -0
- package/README.md +174 -12
- package/bin/mcp.js +9 -0
- package/bin/postinstall.js +23 -0
- package/dist/commands/agents/install.d.ts +17 -0
- package/dist/commands/agents/install.d.ts.map +1 -0
- package/dist/commands/agents/install.js +57 -0
- package/dist/commands/agents/install.js.map +1 -0
- package/dist/commands/agents/reminder.d.ts +16 -0
- package/dist/commands/agents/reminder.d.ts.map +1 -0
- package/dist/commands/agents/reminder.js +45 -0
- package/dist/commands/agents/reminder.js.map +1 -0
- package/dist/commands/auth/login.d.ts.map +1 -1
- package/dist/commands/auth/login.js +1 -1
- package/dist/commands/auth/login.js.map +1 -1
- package/dist/commands/commands.d.ts.map +1 -1
- package/dist/commands/commands.js +4 -0
- package/dist/commands/commands.js.map +1 -1
- package/dist/commands/events/subscribe.d.ts +7 -1
- package/dist/commands/events/subscribe.d.ts.map +1 -1
- package/dist/commands/events/subscribe.js +56 -3
- package/dist/commands/events/subscribe.js.map +1 -1
- package/dist/commands/ingest.d.ts +31 -3
- package/dist/commands/ingest.d.ts.map +1 -1
- package/dist/commands/ingest.js +69 -9
- package/dist/commands/ingest.js.map +1 -1
- package/dist/commands/tenant/list.d.ts +13 -0
- package/dist/commands/tenant/list.d.ts.map +1 -0
- package/dist/commands/tenant/list.js +45 -0
- package/dist/commands/tenant/list.js.map +1 -0
- package/dist/commands/tenant/select.d.ts.map +1 -1
- package/dist/commands/tenant/select.js +12 -5
- package/dist/commands/tenant/select.js.map +1 -1
- package/dist/generated/operations.d.ts +46 -4
- package/dist/generated/operations.d.ts.map +1 -1
- package/dist/generated/operations.js +39 -11
- package/dist/generated/operations.js.map +1 -1
- package/dist/help.js +4 -4
- package/dist/help.js.map +1 -1
- package/dist/lib/agent-install.d.ts +24 -0
- package/dist/lib/agent-install.d.ts.map +1 -0
- package/dist/lib/agent-install.js +196 -0
- package/dist/lib/agent-install.js.map +1 -0
- package/dist/lib/agent-reminder.d.ts +17 -0
- package/dist/lib/agent-reminder.d.ts.map +1 -0
- package/dist/lib/agent-reminder.js +81 -0
- package/dist/lib/agent-reminder.js.map +1 -0
- package/dist/lib/browser-auth.d.ts +1 -0
- package/dist/lib/browser-auth.d.ts.map +1 -1
- package/dist/lib/browser-auth.js +58 -4
- package/dist/lib/browser-auth.js.map +1 -1
- package/dist/lib/cognito.d.ts +2 -0
- package/dist/lib/cognito.d.ts.map +1 -1
- package/dist/lib/cognito.js +38 -9
- package/dist/lib/cognito.js.map +1 -1
- package/dist/lib/command.d.ts +1 -0
- package/dist/lib/command.d.ts.map +1 -1
- package/dist/lib/command.js +5 -0
- package/dist/lib/command.js.map +1 -1
- package/dist/lib/http-transport.d.ts.map +1 -1
- package/dist/lib/http-transport.js +31 -8
- package/dist/lib/http-transport.js.map +1 -1
- package/dist/lib/operation-command.d.ts.map +1 -1
- package/dist/lib/operation-command.js +15 -3
- package/dist/lib/operation-command.js.map +1 -1
- package/dist/lib/operation-types.d.ts +4 -0
- package/dist/lib/operation-types.d.ts.map +1 -1
- package/dist/lib/output.d.ts.map +1 -1
- package/dist/lib/output.js +47 -6
- package/dist/lib/output.js.map +1 -1
- package/dist/lib/query-metrics.d.ts +72 -0
- package/dist/lib/query-metrics.d.ts.map +1 -0
- package/dist/lib/query-metrics.js +383 -0
- package/dist/lib/query-metrics.js.map +1 -0
- package/dist/lib/raw-graphql-command.d.ts.map +1 -1
- package/dist/lib/raw-graphql-command.js +4 -2
- package/dist/lib/raw-graphql-command.js.map +1 -1
- package/dist/lib/tenants.d.ts +1 -1
- package/dist/lib/tenants.d.ts.map +1 -1
- package/dist/lib/tenants.js +5 -1
- package/dist/lib/tenants.js.map +1 -1
- package/dist/mcp/main.d.ts +2 -0
- package/dist/mcp/main.d.ts.map +1 -0
- package/dist/mcp/main.js +7 -0
- package/dist/mcp/main.js.map +1 -0
- package/dist/mcp/server.d.ts +85 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +235 -0
- package/dist/mcp/server.js.map +1 -0
- package/oclif.manifest.json +1026 -831
- package/package.json +24 -4
- package/plugins/dataworks/.claude-plugin/plugin.json +17 -0
- package/plugins/dataworks/.codex-plugin/plugin.json +37 -0
- package/plugins/dataworks/.mcp.json +8 -0
- package/plugins/dataworks/skills/query-dataworks-metrics/SKILL.md +48 -0
- package/plugins/dataworks/skills/query-dataworks-metrics/agents/openai.yaml +13 -0
- package/schema/operation-overrides.json +49 -0
- package/skills/dataworks-cli/SKILL.md +129 -15
- package/skills/dataworks-cli/agents/openai.yaml +4 -0
package/dist/help.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.js","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export type AgentClient = "codex" | "claude-code";
|
|
2
|
+
export type AgentInstallStatus = "installed" | "updated" | "unavailable" | "failed";
|
|
3
|
+
export interface AgentInstallResult {
|
|
4
|
+
client: AgentClient;
|
|
5
|
+
status: AgentInstallStatus;
|
|
6
|
+
message: string;
|
|
7
|
+
nextStep: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ProcessResult {
|
|
10
|
+
status: number | null;
|
|
11
|
+
stdout: string;
|
|
12
|
+
stderr: string;
|
|
13
|
+
error?: Error;
|
|
14
|
+
}
|
|
15
|
+
export type ProcessRunner = (command: string, args: readonly string[]) => ProcessResult;
|
|
16
|
+
export interface AgentInstallOptions {
|
|
17
|
+
force?: boolean;
|
|
18
|
+
packageRoot?: string;
|
|
19
|
+
run?: ProcessRunner;
|
|
20
|
+
}
|
|
21
|
+
export declare const supportedAgentClients: readonly AgentClient[];
|
|
22
|
+
export declare function dataworksPackageRoot(): string;
|
|
23
|
+
export declare function installAgentIntegration(client: AgentClient, options?: AgentInstallOptions): AgentInstallResult;
|
|
24
|
+
//# sourceMappingURL=agent-install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-install.d.ts","sourceRoot":"","sources":["../../src/lib/agent-install.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,aAAa,CAAC;AAClD,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,SAAS,GAAG,aAAa,GAAG,QAAQ,CAAC;AAEpF,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK,aAAa,CAAC;AAExF,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,aAAa,CAAC;CACrB;AAKD,eAAO,MAAM,qBAAqB,EAAE,SAAS,WAAW,EAA6B,CAAC;AAEtF,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AA0PD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,mBAAwB,GAChC,kBAAkB,CAUpB"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
const marketplaceName = "dataworks-cli";
|
|
5
|
+
const pluginId = `dataworks@${marketplaceName}`;
|
|
6
|
+
export const supportedAgentClients = ["codex", "claude-code"];
|
|
7
|
+
export function dataworksPackageRoot() {
|
|
8
|
+
return fileURLToPath(new URL("../../", import.meta.url));
|
|
9
|
+
}
|
|
10
|
+
function defaultRunner(command, args) {
|
|
11
|
+
const result = spawnSync(command, [...args], {
|
|
12
|
+
encoding: "utf8",
|
|
13
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
14
|
+
});
|
|
15
|
+
return {
|
|
16
|
+
status: result.status,
|
|
17
|
+
stdout: result.stdout ?? "",
|
|
18
|
+
stderr: result.stderr ?? "",
|
|
19
|
+
error: result.error,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function executable(client) {
|
|
23
|
+
return client === "codex" ? "codex" : "claude";
|
|
24
|
+
}
|
|
25
|
+
function failureMessage(result) {
|
|
26
|
+
return (result.stderr.trim() ||
|
|
27
|
+
result.stdout.trim() ||
|
|
28
|
+
result.error?.message ||
|
|
29
|
+
"The client command failed without an error message.");
|
|
30
|
+
}
|
|
31
|
+
function parseJson(value) {
|
|
32
|
+
try {
|
|
33
|
+
return JSON.parse(value);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function codexMarketplaceRoot(payload) {
|
|
40
|
+
if (!payload || typeof payload !== "object")
|
|
41
|
+
return undefined;
|
|
42
|
+
const marketplaces = payload.marketplaces;
|
|
43
|
+
if (!Array.isArray(marketplaces))
|
|
44
|
+
return undefined;
|
|
45
|
+
const entry = marketplaces.find((candidate) => !!candidate &&
|
|
46
|
+
typeof candidate === "object" &&
|
|
47
|
+
candidate.name === marketplaceName);
|
|
48
|
+
return entry?.root;
|
|
49
|
+
}
|
|
50
|
+
function claudeMarketplace(payload) {
|
|
51
|
+
if (!Array.isArray(payload))
|
|
52
|
+
return { exists: false };
|
|
53
|
+
const entry = payload.find((candidate) => !!candidate &&
|
|
54
|
+
typeof candidate === "object" &&
|
|
55
|
+
candidate.name === marketplaceName);
|
|
56
|
+
return {
|
|
57
|
+
exists: !!entry,
|
|
58
|
+
root: entry?.path ?? entry?.installLocation,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function pluginIsInstalled(client, payload) {
|
|
62
|
+
const entries = client === "codex" && payload && typeof payload === "object"
|
|
63
|
+
? payload.installed
|
|
64
|
+
: payload;
|
|
65
|
+
if (!Array.isArray(entries))
|
|
66
|
+
return false;
|
|
67
|
+
return entries.some((entry) => {
|
|
68
|
+
if (!entry || typeof entry !== "object")
|
|
69
|
+
return false;
|
|
70
|
+
const item = entry;
|
|
71
|
+
return (item.id === pluginId ||
|
|
72
|
+
item.pluginId === pluginId ||
|
|
73
|
+
(item.name === "dataworks" &&
|
|
74
|
+
(item.marketplace === marketplaceName ||
|
|
75
|
+
item.marketplaceName === marketplaceName)));
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
function unavailable(client) {
|
|
79
|
+
const binary = executable(client);
|
|
80
|
+
return {
|
|
81
|
+
client,
|
|
82
|
+
status: "unavailable",
|
|
83
|
+
message: `${binary} is not installed or is not available on PATH.`,
|
|
84
|
+
nextStep: `Install ${client === "codex" ? "Codex" : "Claude Code"}, then run \`dw agents install ${client}\` again.`,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
function failed(client, result, nextStep) {
|
|
88
|
+
return {
|
|
89
|
+
client,
|
|
90
|
+
status: "failed",
|
|
91
|
+
message: failureMessage(result),
|
|
92
|
+
nextStep,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
function installCodex(options) {
|
|
96
|
+
const { run, packageRoot, force } = options;
|
|
97
|
+
const list = run("codex", ["plugin", "marketplace", "list", "--json"]);
|
|
98
|
+
if (list.status !== 0) {
|
|
99
|
+
return failed("codex", list, "Run `codex plugin marketplace list` to inspect the Codex plugin configuration, then retry.");
|
|
100
|
+
}
|
|
101
|
+
const listedRoot = codexMarketplaceRoot(parseJson(list.stdout));
|
|
102
|
+
const currentRoot = listedRoot ? resolve(listedRoot) : undefined;
|
|
103
|
+
if (currentRoot && currentRoot !== packageRoot) {
|
|
104
|
+
if (!force) {
|
|
105
|
+
return {
|
|
106
|
+
client: "codex",
|
|
107
|
+
status: "failed",
|
|
108
|
+
message: `The ${marketplaceName} marketplace already points to ${currentRoot}.`,
|
|
109
|
+
nextStep: "Run `dw agents install codex --force` to replace the stale marketplace registration.",
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
const remove = run("codex", ["plugin", "marketplace", "remove", marketplaceName]);
|
|
113
|
+
if (remove.status !== 0) {
|
|
114
|
+
return failed("codex", remove, "Run `codex plugin marketplace list` to inspect the conflicting registration.");
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (!currentRoot || currentRoot !== packageRoot) {
|
|
118
|
+
const addMarketplace = run("codex", [
|
|
119
|
+
"plugin",
|
|
120
|
+
"marketplace",
|
|
121
|
+
"add",
|
|
122
|
+
packageRoot,
|
|
123
|
+
"--json",
|
|
124
|
+
]);
|
|
125
|
+
if (addMarketplace.status !== 0) {
|
|
126
|
+
return failed("codex", addMarketplace, `Run \`codex plugin marketplace add ${packageRoot}\`, then retry.`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
const before = run("codex", ["plugin", "list", "--json"]);
|
|
130
|
+
const alreadyInstalled = before.status === 0 && pluginIsInstalled("codex", parseJson(before.stdout));
|
|
131
|
+
const install = run("codex", ["plugin", "add", pluginId, "--json"]);
|
|
132
|
+
if (install.status !== 0) {
|
|
133
|
+
return failed("codex", install, `Run \`codex plugin add ${pluginId}\`, then retry.`);
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
client: "codex",
|
|
137
|
+
status: alreadyInstalled ? "updated" : "installed",
|
|
138
|
+
message: "The Dataworks skill and query_metrics MCP server are enabled.",
|
|
139
|
+
nextStep: "Start a new Codex thread before asking a Dataworks metrics question.",
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
function installClaudeCode(options) {
|
|
143
|
+
const { run, packageRoot, force } = options;
|
|
144
|
+
const list = run("claude", ["plugin", "marketplace", "list", "--json"]);
|
|
145
|
+
if (list.status !== 0) {
|
|
146
|
+
return failed("claude-code", list, "Run `claude plugin marketplace list --json` to inspect the Claude Code plugin configuration, then retry.");
|
|
147
|
+
}
|
|
148
|
+
const marketplace = claudeMarketplace(parseJson(list.stdout));
|
|
149
|
+
const currentRoot = marketplace.root ? resolve(marketplace.root) : undefined;
|
|
150
|
+
if (marketplace.exists && currentRoot && currentRoot !== packageRoot && !force) {
|
|
151
|
+
return {
|
|
152
|
+
client: "claude-code",
|
|
153
|
+
status: "failed",
|
|
154
|
+
message: `The ${marketplaceName} marketplace already points to ${currentRoot}.`,
|
|
155
|
+
nextStep: "Run `dw agents install claude-code --force` to replace the stale marketplace registration.",
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
if (marketplace.exists && force) {
|
|
159
|
+
const remove = run("claude", ["plugin", "marketplace", "remove", marketplaceName]);
|
|
160
|
+
if (remove.status !== 0) {
|
|
161
|
+
return failed("claude-code", remove, "Run `claude plugin marketplace list --json` to inspect the conflicting registration.");
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (!marketplace.exists || force) {
|
|
165
|
+
const addMarketplace = run("claude", ["plugin", "marketplace", "add", packageRoot]);
|
|
166
|
+
if (addMarketplace.status !== 0) {
|
|
167
|
+
return failed("claude-code", addMarketplace, `Run \`claude plugin marketplace add ${packageRoot}\`, then retry.`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
const before = run("claude", ["plugin", "list", "--json"]);
|
|
171
|
+
const alreadyInstalled = before.status === 0 && pluginIsInstalled("claude-code", parseJson(before.stdout));
|
|
172
|
+
const action = alreadyInstalled ? "update" : "install";
|
|
173
|
+
const install = run("claude", ["plugin", action, pluginId, "--scope", "user"]);
|
|
174
|
+
if (install.status !== 0) {
|
|
175
|
+
return failed("claude-code", install, `Run \`claude plugin ${action} ${pluginId} --scope user\`, then retry.`);
|
|
176
|
+
}
|
|
177
|
+
return {
|
|
178
|
+
client: "claude-code",
|
|
179
|
+
status: alreadyInstalled ? "updated" : "installed",
|
|
180
|
+
message: "The Dataworks skill and query_metrics MCP server are enabled.",
|
|
181
|
+
nextStep: "Run `/reload-plugins` in Claude Code, or start a new session.",
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
export function installAgentIntegration(client, options = {}) {
|
|
185
|
+
const resolved = {
|
|
186
|
+
force: options.force ?? false,
|
|
187
|
+
packageRoot: resolve(options.packageRoot ?? dataworksPackageRoot()),
|
|
188
|
+
run: options.run ?? defaultRunner,
|
|
189
|
+
};
|
|
190
|
+
const binary = executable(client);
|
|
191
|
+
const detected = resolved.run(binary, ["--version"]);
|
|
192
|
+
if (detected.status !== 0 || detected.error)
|
|
193
|
+
return unavailable(client);
|
|
194
|
+
return client === "codex" ? installCodex(resolved) : installClaudeCode(resolved);
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=agent-install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-install.js","sourceRoot":"","sources":["../../src/lib/agent-install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface AgentReminderPreferences {
|
|
2
|
+
disabled: boolean;
|
|
3
|
+
configured: boolean;
|
|
4
|
+
lastShownAt?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface AgentReminderContext {
|
|
7
|
+
argv: readonly string[];
|
|
8
|
+
isTTY: boolean;
|
|
9
|
+
now?: Date;
|
|
10
|
+
disabledByEnvironment?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function agentReminderPath(): string;
|
|
13
|
+
export declare function readAgentReminderPreferences(): Promise<AgentReminderPreferences>;
|
|
14
|
+
export declare function shouldShowAgentReminder(preferences: AgentReminderPreferences, context: AgentReminderContext): boolean;
|
|
15
|
+
export declare function maybeShowAgentReminder(argv: readonly string[]): Promise<void>;
|
|
16
|
+
export declare function configureAgentReminder(action: "disable" | "enable" | "configured"): Promise<AgentReminderPreferences>;
|
|
17
|
+
//# sourceMappingURL=agent-reminder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-reminder.d.ts","sourceRoot":"","sources":["../../src/lib/agent-reminder.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAOD,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAsB,4BAA4B,IAAI,OAAO,CAAC,wBAAwB,CAAC,CAetF;AAYD,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,wBAAwB,EACrC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAUT;AAED,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBnF;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,YAAY,GAC1C,OAAO,CAAC,wBAAwB,CAAC,CAUnC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { configPath } from "./config-store.js";
|
|
4
|
+
const reminderIntervalMs = 24 * 60 * 60 * 1000;
|
|
5
|
+
const defaultPreferences = {
|
|
6
|
+
disabled: false,
|
|
7
|
+
configured: false,
|
|
8
|
+
};
|
|
9
|
+
export function agentReminderPath() {
|
|
10
|
+
return join(dirname(configPath()), "agent-reminder.json");
|
|
11
|
+
}
|
|
12
|
+
export async function readAgentReminderPreferences() {
|
|
13
|
+
try {
|
|
14
|
+
const stored = JSON.parse(await readFile(agentReminderPath(), "utf8"));
|
|
15
|
+
return {
|
|
16
|
+
disabled: stored.disabled === true,
|
|
17
|
+
configured: stored.configured === true,
|
|
18
|
+
lastShownAt: typeof stored.lastShownAt === "string" ? stored.lastShownAt : undefined,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
if (error?.code === "ENOENT")
|
|
23
|
+
return { ...defaultPreferences };
|
|
24
|
+
throw error;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async function writeAgentReminderPreferences(preferences) {
|
|
28
|
+
const path = agentReminderPath();
|
|
29
|
+
await mkdir(dirname(path), { recursive: true, mode: 0o700 });
|
|
30
|
+
await writeFile(path, `${JSON.stringify(preferences, null, 2)}\n`, {
|
|
31
|
+
mode: 0o600,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
export function shouldShowAgentReminder(preferences, context) {
|
|
35
|
+
if (!context.isTTY || context.disabledByEnvironment)
|
|
36
|
+
return false;
|
|
37
|
+
if (preferences.disabled || preferences.configured)
|
|
38
|
+
return false;
|
|
39
|
+
if (context.argv.includes("--json"))
|
|
40
|
+
return false;
|
|
41
|
+
if (context.argv[0] === "agents")
|
|
42
|
+
return false;
|
|
43
|
+
if (!preferences.lastShownAt)
|
|
44
|
+
return true;
|
|
45
|
+
const lastShown = Date.parse(preferences.lastShownAt);
|
|
46
|
+
if (!Number.isFinite(lastShown))
|
|
47
|
+
return true;
|
|
48
|
+
return (context.now ?? new Date()).getTime() - lastShown >= reminderIntervalMs;
|
|
49
|
+
}
|
|
50
|
+
export async function maybeShowAgentReminder(argv) {
|
|
51
|
+
try {
|
|
52
|
+
const preferences = await readAgentReminderPreferences();
|
|
53
|
+
if (!shouldShowAgentReminder(preferences, {
|
|
54
|
+
argv,
|
|
55
|
+
isTTY: process.stderr.isTTY === true,
|
|
56
|
+
disabledByEnvironment: process.env.DW_NO_AGENT_REMINDER === "1",
|
|
57
|
+
})) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
process.stderr.write("Tip: enable Dataworks in Codex or Claude Code with `dw agents install`.\n" +
|
|
61
|
+
"Hide this reminder with `dw agents reminder disable`.\n");
|
|
62
|
+
await writeAgentReminderPreferences({
|
|
63
|
+
...preferences,
|
|
64
|
+
lastShownAt: new Date().toISOString(),
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// A reminder must never block or fail the requested CLI command.
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
export async function configureAgentReminder(action) {
|
|
72
|
+
const current = await readAgentReminderPreferences();
|
|
73
|
+
const preferences = action === "disable"
|
|
74
|
+
? { ...current, disabled: true }
|
|
75
|
+
: action === "configured"
|
|
76
|
+
? { ...current, configured: true }
|
|
77
|
+
: { disabled: false, configured: false };
|
|
78
|
+
await writeAgentReminderPreferences(preferences);
|
|
79
|
+
return preferences;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=agent-reminder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-reminder.js","sourceRoot":"","sources":["../../src/lib/agent-reminder.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,7 @@ interface BrowserLoginOptions {
|
|
|
11
11
|
onAuthorizationUrl?: (url: string, browserRequested: boolean) => void;
|
|
12
12
|
timeoutMs?: number;
|
|
13
13
|
}
|
|
14
|
+
export declare function browserLoginPage(success: boolean): string;
|
|
14
15
|
export declare function createAuthorizationRequest(): AuthorizationRequest;
|
|
15
16
|
export declare function authorizationUrl(config: EnvironmentConfig, redirectUri: string, request: Pick<AuthorizationRequest, "codeChallenge" | "nonce" | "state">): string;
|
|
16
17
|
export declare function loginWithBrowser(config: EnvironmentConfig, options?: BrowserLoginOptions): Promise<AuthSession>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-auth.d.ts","sourceRoot":"","sources":["../../src/lib/browser-auth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"browser-auth.d.ts","sourceRoot":"","sources":["../../src/lib/browser-auth.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAA6B,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAY3E,UAAU,oBAAoB;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,mBAAmB;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,KAAK,IAAI,CAAC;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CA0CzD;AAMD,wBAAgB,0BAA0B,IAAI,oBAAoB,CAQjE;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,iBAAiB,EACzB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,IAAI,CAAC,oBAAoB,EAAE,eAAe,GAAG,OAAO,GAAG,OAAO,CAAC,GACvE,MAAM,CAaR;AA4FD,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,iBAAiB,EACzB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,WAAW,CAAC,CAkCtB"}
|
package/dist/lib/browser-auth.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createHash, randomBytes } from "node:crypto";
|
|
2
2
|
import { spawn } from "node:child_process";
|
|
3
|
+
import { readFileSync } from "node:fs";
|
|
3
4
|
import { createServer } from "node:http";
|
|
4
5
|
import { exchangeAuthorizationCode } from "./cognito.js";
|
|
5
6
|
import { CliError } from "./errors.js";
|
|
@@ -7,6 +8,49 @@ const callbackHost = "localhost";
|
|
|
7
8
|
const callbackPort = 53682;
|
|
8
9
|
const callbackPath = "/callback";
|
|
9
10
|
const callbackTimeoutMs = 5 * 60 * 1000;
|
|
11
|
+
const dataworksLogo = readFileSync(new URL("../../.github/.assets/dataworks-light.svg", import.meta.url), "utf8").replace(/^<\?xml[^>]*>\s*/u, "");
|
|
12
|
+
export function browserLoginPage(success) {
|
|
13
|
+
const title = success ? "Login complete" : "Login failed";
|
|
14
|
+
const message = success
|
|
15
|
+
? "You are signed in to the Dataworks CLI. You can close this window and return to your terminal."
|
|
16
|
+
: "Dataworks could not complete the CLI login. Return to your terminal for details and try again.";
|
|
17
|
+
const icon = success ? "✓" : "!";
|
|
18
|
+
const statusClass = success ? "success" : "failure";
|
|
19
|
+
return `<!doctype html>
|
|
20
|
+
<html lang="en">
|
|
21
|
+
<head>
|
|
22
|
+
<meta charset="utf-8">
|
|
23
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
24
|
+
<title>Dataworks CLI — ${title}</title>
|
|
25
|
+
<style>
|
|
26
|
+
:root { color-scheme: dark; font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; }
|
|
27
|
+
* { box-sizing: border-box; }
|
|
28
|
+
body { min-height: 100vh; margin: 0; display: grid; place-items: center; overflow: hidden; color: #f7f8fb; background: #080b13; }
|
|
29
|
+
body::before { content: ""; position: fixed; inset: -40%; background: radial-gradient(circle at 35% 45%, rgba(51, 174, 255, .22), transparent 25%), radial-gradient(circle at 67% 48%, rgba(255, 33, 189, .16), transparent 23%), radial-gradient(circle at 52% 68%, rgba(203, 255, 0, .11), transparent 20%); filter: blur(18px); }
|
|
30
|
+
main { position: relative; width: min(92vw, 590px); padding: 46px 44px 42px; text-align: center; border: 1px solid rgba(255, 255, 255, .1); border-radius: 24px; background: rgba(16, 20, 32, .9); box-shadow: 0 30px 90px rgba(0, 0, 0, .45); backdrop-filter: blur(20px); }
|
|
31
|
+
.logo { margin-bottom: 36px; }
|
|
32
|
+
.logo svg { display: block; width: min(270px, 70%); height: auto; margin: 0 auto; }
|
|
33
|
+
.status { width: 62px; height: 62px; margin: 0 auto 22px; display: grid; place-items: center; border-radius: 50%; font-size: 32px; font-weight: 750; }
|
|
34
|
+
.success { color: #10140b; background: linear-gradient(135deg, #28eb00, #cbff00); box-shadow: 0 0 38px rgba(145, 255, 0, .25); }
|
|
35
|
+
.failure { color: #fff; background: linear-gradient(135deg, #ff3b55, #ff21bd); box-shadow: 0 0 38px rgba(255, 33, 189, .22); }
|
|
36
|
+
h1 { margin: 0 0 12px; font-size: clamp(28px, 6vw, 40px); line-height: 1.1; letter-spacing: -.035em; }
|
|
37
|
+
p { max-width: 430px; margin: 0 auto; color: #b8bfce; font-size: 17px; line-height: 1.6; }
|
|
38
|
+
.terminal { display: inline-flex; align-items: center; gap: 9px; margin-top: 28px; padding: 9px 14px; border-radius: 999px; color: #dfe4ee; background: rgba(255, 255, 255, .06); font: 13px ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
|
|
39
|
+
.terminal::before { content: ""; width: 7px; height: 7px; border-radius: 50%; background: #cbff00; box-shadow: 0 0 10px rgba(203, 255, 0, .65); }
|
|
40
|
+
@media (max-width: 480px) { main { padding: 36px 24px 32px; border-radius: 20px; } }
|
|
41
|
+
</style>
|
|
42
|
+
</head>
|
|
43
|
+
<body>
|
|
44
|
+
<main>
|
|
45
|
+
<div class="logo" aria-label="Dataworks">${dataworksLogo}</div>
|
|
46
|
+
<div class="status ${statusClass}" aria-hidden="true">${icon}</div>
|
|
47
|
+
<h1>${title}</h1>
|
|
48
|
+
<p>${message}</p>
|
|
49
|
+
<div class="terminal">Return to dw</div>
|
|
50
|
+
</main>
|
|
51
|
+
</body>
|
|
52
|
+
</html>`;
|
|
53
|
+
}
|
|
10
54
|
function randomValue() {
|
|
11
55
|
return randomBytes(32).toString("base64url");
|
|
12
56
|
}
|
|
@@ -81,15 +125,25 @@ function authorizationCode(server, redirectUri, expectedState, timeoutMs) {
|
|
|
81
125
|
return void response.writeHead(404).end("Not found");
|
|
82
126
|
if (error || !code || state !== expectedState) {
|
|
83
127
|
response
|
|
84
|
-
.writeHead(400, {
|
|
85
|
-
|
|
128
|
+
.writeHead(400, {
|
|
129
|
+
"cache-control": "no-store",
|
|
130
|
+
"content-security-policy": "default-src 'none'; style-src 'unsafe-inline'; base-uri 'none'; form-action 'none'",
|
|
131
|
+
"content-type": "text/html; charset=utf-8",
|
|
132
|
+
"x-content-type-options": "nosniff",
|
|
133
|
+
})
|
|
134
|
+
.end(browserLoginPage(false));
|
|
86
135
|
clearTimeout(timeout);
|
|
87
136
|
reject(new CliError(error ? "Cognito login was not completed" : "OAuth state validation failed", "AUTH_FAILED", 3));
|
|
88
137
|
return;
|
|
89
138
|
}
|
|
90
139
|
response
|
|
91
|
-
.writeHead(200, {
|
|
92
|
-
|
|
140
|
+
.writeHead(200, {
|
|
141
|
+
"cache-control": "no-store",
|
|
142
|
+
"content-security-policy": "default-src 'none'; style-src 'unsafe-inline'; base-uri 'none'; form-action 'none'",
|
|
143
|
+
"content-type": "text/html; charset=utf-8",
|
|
144
|
+
"x-content-type-options": "nosniff",
|
|
145
|
+
})
|
|
146
|
+
.end(browserLoginPage(true));
|
|
93
147
|
clearTimeout(timeout);
|
|
94
148
|
resolve(code);
|
|
95
149
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-auth.js","sourceRoot":"","sources":["../../src/lib/browser-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAe,MAAM,WAAW,CAAC;AAGtD,OAAO,EAAE,yBAAyB,EAAoB,MAAM,cAAc,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,YAAY,GAAG,WAAW,CAAC;AACjC,MAAM,YAAY,GAAG,KAAK,CAAC;AAC3B,MAAM,YAAY,GAAG,WAAW,CAAC;AACjC,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"browser-auth.js","sourceRoot":"","sources":["../../src/lib/browser-auth.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/cognito.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { EnvironmentConfig } from "./environment.js";
|
|
2
2
|
export interface AuthSession {
|
|
3
3
|
accessToken: string;
|
|
4
|
+
authorizedTenants?: string[];
|
|
4
5
|
idToken: string;
|
|
5
6
|
refreshToken: string;
|
|
6
7
|
tenant: string | null;
|
|
@@ -17,6 +18,7 @@ export type JwtClaims = Record<string, unknown> & {
|
|
|
17
18
|
token_use?: string;
|
|
18
19
|
};
|
|
19
20
|
export declare function verifyIdToken(token: string, clientId: string, expectedNonce?: string): Promise<JwtClaims>;
|
|
21
|
+
export declare function tenantIdsFromClaims(claims: JwtClaims): string[];
|
|
20
22
|
export declare function exchangeAuthorizationCode(config: EnvironmentConfig, code: string, codeVerifier: string, redirectUri: string, nonce: string): Promise<AuthSession>;
|
|
21
23
|
export declare function refresh(config: EnvironmentConfig, session: AuthSession): Promise<AuthSession>;
|
|
22
24
|
//# sourceMappingURL=cognito.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cognito.d.ts","sourceRoot":"","sources":["../../src/lib/cognito.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAG1D,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,KAAK,GAAG,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAcD,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAChD,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAyCF,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,SAAS,CAAC,CA0CpB;
|
|
1
|
+
{"version":3,"file":"cognito.d.ts","sourceRoot":"","sources":["../../src/lib/cognito.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAG1D,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,KAAK,GAAG,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAcD,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAChD,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAyCF,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,SAAS,CAAC,CA0CpB;AAsBD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,EAAE,CAQ/D;AAqCD,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,iBAAiB,EACzB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,WAAW,CAAC,CA2BtB;AAED,wBAAsB,OAAO,CAC3B,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,WAAW,CAAC,CAgCtB"}
|
package/dist/lib/cognito.js
CHANGED
|
@@ -69,16 +69,39 @@ export async function verifyIdToken(token, clientId, expectedNonce) {
|
|
|
69
69
|
}
|
|
70
70
|
return claims;
|
|
71
71
|
}
|
|
72
|
-
function
|
|
73
|
-
const value = claims["custom:tenants"] ??
|
|
74
|
-
claims["custom:tenant"] ??
|
|
75
|
-
claims.tenant ??
|
|
76
|
-
(Array.isArray(claims["cognito:groups"]) ? claims["cognito:groups"][0] : null);
|
|
72
|
+
function tenantClaimValues(value) {
|
|
77
73
|
if (Array.isArray(value)) {
|
|
78
|
-
|
|
79
|
-
return typeof first === "string" && first ? first : null;
|
|
74
|
+
return value.flatMap(tenantClaimValues);
|
|
80
75
|
}
|
|
81
|
-
|
|
76
|
+
if (typeof value !== "string")
|
|
77
|
+
return [];
|
|
78
|
+
const trimmed = value.trim();
|
|
79
|
+
if (!trimmed)
|
|
80
|
+
return [];
|
|
81
|
+
if (trimmed.startsWith("[")) {
|
|
82
|
+
try {
|
|
83
|
+
return tenantClaimValues(JSON.parse(trimmed));
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// Fall back to treating a malformed JSON-looking claim as one ID.
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return trimmed
|
|
90
|
+
.split(",")
|
|
91
|
+
.map((tenant) => tenant.trim())
|
|
92
|
+
.filter(Boolean);
|
|
93
|
+
}
|
|
94
|
+
export function tenantIdsFromClaims(claims) {
|
|
95
|
+
const values = [
|
|
96
|
+
claims["custom:tenants"],
|
|
97
|
+
claims["custom:tenant"],
|
|
98
|
+
claims.tenants,
|
|
99
|
+
claims.tenant,
|
|
100
|
+
].flatMap(tenantClaimValues);
|
|
101
|
+
return [...new Set(values)];
|
|
102
|
+
}
|
|
103
|
+
function tenantFromClaims(claims) {
|
|
104
|
+
return tenantIdsFromClaims(claims)[0] ?? null;
|
|
82
105
|
}
|
|
83
106
|
function usernameFromClaims(claims) {
|
|
84
107
|
for (const key of ["email", "cognito:username", "username", "sub"]) {
|
|
@@ -116,8 +139,10 @@ export async function exchangeAuthorizationCode(config, code, codeVerifier, redi
|
|
|
116
139
|
throw new CliError("Cognito returned an incomplete session", "AUTH_FAILED", 3);
|
|
117
140
|
}
|
|
118
141
|
const claims = await verifyIdToken(result.id_token, config.clientId, nonce);
|
|
142
|
+
const authorizedTenants = tenantIdsFromClaims(claims);
|
|
119
143
|
return {
|
|
120
144
|
accessToken: result.access_token,
|
|
145
|
+
authorizedTenants,
|
|
121
146
|
idToken: result.id_token,
|
|
122
147
|
refreshToken: result.refresh_token,
|
|
123
148
|
tenant: tenantFromClaims(claims),
|
|
@@ -143,12 +168,16 @@ export async function refresh(config, session) {
|
|
|
143
168
|
const claims = result.id_token
|
|
144
169
|
? await verifyIdToken(result.id_token, config.clientId)
|
|
145
170
|
: undefined;
|
|
171
|
+
const authorizedTenants = claims
|
|
172
|
+
? tenantIdsFromClaims(claims)
|
|
173
|
+
: session.authorizedTenants;
|
|
146
174
|
return {
|
|
147
175
|
...session,
|
|
148
176
|
accessToken: result.access_token,
|
|
177
|
+
authorizedTenants,
|
|
149
178
|
idToken,
|
|
150
179
|
refreshToken: result.refresh_token ?? session.refreshToken,
|
|
151
|
-
tenant: claims ? (
|
|
180
|
+
tenant: claims ? (authorizedTenants?.[0] ?? session.tenant) : session.tenant,
|
|
152
181
|
username: claims ? usernameFromClaims(claims) : session.username,
|
|
153
182
|
expiresAt: Date.now() + (result.expires_in ?? 3600) * 1000,
|
|
154
183
|
};
|