@antelopejs/dms-ai 0.4.1 → 0.6.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/README.md +1 -1
- package/dist/constants/database.d.ts +7 -0
- package/dist/constants/database.js +11 -0
- package/dist/constants/database.js.map +1 -0
- package/dist/constants/pages.d.ts +5 -0
- package/dist/constants/pages.js +6 -1
- package/dist/constants/pages.js.map +1 -1
- package/dist/database/catalog.d.ts +4 -0
- package/dist/database/catalog.js +25 -0
- package/dist/database/catalog.js.map +1 -0
- package/dist/frontend-module.d.ts +2 -0
- package/dist/frontend-module.js +18 -0
- package/dist/frontend-module.js.map +1 -0
- package/dist/index.js +2 -12
- package/dist/index.js.map +1 -1
- package/dist/logging/log-buffer.js +1 -1
- package/dist/logging/log-buffer.js.map +1 -1
- package/dist/pages/activity/page.d.ts +1 -0
- package/dist/pages/activity/page.js +13 -0
- package/dist/pages/activity/page.js.map +1 -1
- package/dist/pages/meta.d.ts +2 -0
- package/dist/pages/meta.js +3 -1
- package/dist/pages/meta.js.map +1 -1
- package/dist/pages/overview/insights.js +0 -2
- package/dist/pages/overview/insights.js.map +1 -1
- package/dist/pages/overview/page.d.ts +1 -1
- package/dist/pages/overview/page.js +12 -11
- package/dist/pages/overview/page.js.map +1 -1
- package/dist/pages/settings/page.d.ts +1 -0
- package/dist/pages/settings/page.js +1 -0
- package/dist/pages/settings/page.js.map +1 -1
- package/dist/pages/skills/page.js +7 -0
- package/dist/pages/skills/page.js.map +1 -1
- package/dist/routes/activity.js +5 -2
- package/dist/routes/activity.js.map +1 -1
- package/dist/routes/builder.js +8 -0
- package/dist/routes/builder.js.map +1 -1
- package/dist/routes/codex-account.d.ts +8 -0
- package/dist/routes/codex-account.js +162 -0
- package/dist/routes/codex-account.js.map +1 -0
- package/dist/routes/database.d.ts +21 -0
- package/dist/routes/database.js +115 -0
- package/dist/routes/database.js.map +1 -0
- package/dist/routes/index.d.ts +2 -0
- package/dist/routes/index.js +2 -0
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/list-query.d.ts +1 -0
- package/dist/routes/list-query.js +9 -0
- package/dist/routes/list-query.js.map +1 -1
- package/dist/routes/metric-shapes.js +7 -4
- package/dist/routes/metric-shapes.js.map +1 -1
- package/dist/routes/metrics.d.ts +2 -2
- package/dist/routes/metrics.js +10 -6
- package/dist/routes/metrics.js.map +1 -1
- package/dist/types/metrics.d.ts +2 -0
- package/frontend-vue/app/chat/components/ConversationDrawer.vue +2 -1
- package/frontend-vue/app/chat/components/PanelHeader.vue +3 -1
- package/frontend-vue/app/chat/utils/markdown.ts +36 -20
- package/frontend-vue/app/chat/utils/tool-lexicon.ts +46 -0
- package/frontend-vue/app/components/ActivityDetail.vue +2 -5
- package/frontend-vue/app/components/ChatPanel.vue +3 -1
- package/frontend-vue/app/components/SkillDetail.vue +72 -26
- package/frontend-vue/app/views/RowStepper.vue +1 -1
- package/frontend-vue/app/views/types.ts +0 -10
- package/frontend-vue/i18n/locales/dms-ai-pages-en-GB.json +46 -4
- package/frontend-vue/i18n/locales/dms-ai-pages-fr-FR.json +46 -4
- package/frontend-vue/i18n/locales/dms-ai-panel-en-GB.json +8 -0
- package/frontend-vue/i18n/locales/dms-ai-panel-fr-FR.json +8 -0
- package/frontend-vue/i18n/locales/dms-ai-views-en-GB.json +1 -0
- package/frontend-vue/i18n/locales/dms-ai-views-fr-FR.json +1 -0
- package/frontend-vue/package.json +1 -1
- package/frontend-vue/tests/chat/markdown.test.ts +69 -0
- package/frontend-vue/tests/i18n-views.test.ts +63 -0
- package/frontend-vue/tests/panel-header-height.test.ts +40 -0
- package/frontend-vue/tests/panel-states.test.ts +1 -1
- package/package.json +7 -5
- package/sidecar/dist/agent/permission-preview.js +49 -2
- package/sidecar/dist/agent/permission-preview.js.map +1 -1
- package/sidecar/dist/agent/tool-kinds.d.ts +1 -0
- package/sidecar/dist/agent/tool-kinds.js +2 -1
- package/sidecar/dist/agent/tool-kinds.js.map +1 -1
- package/sidecar/dist/constants/builder.d.ts +7 -1
- package/sidecar/dist/constants/builder.js +10 -0
- package/sidecar/dist/constants/builder.js.map +1 -1
- package/sidecar/dist/constants/chatgpt.d.ts +39 -0
- package/sidecar/dist/constants/chatgpt.js +55 -0
- package/sidecar/dist/constants/chatgpt.js.map +1 -0
- package/sidecar/dist/constants/codex.d.ts +4 -5
- package/sidecar/dist/constants/codex.js +4 -5
- package/sidecar/dist/constants/codex.js.map +1 -1
- package/sidecar/dist/constants/database.d.ts +11 -0
- package/sidecar/dist/constants/database.js +17 -0
- package/sidecar/dist/constants/database.js.map +1 -0
- package/sidecar/dist/constants/http.d.ts +3 -0
- package/sidecar/dist/constants/http.js +3 -0
- package/sidecar/dist/constants/http.js.map +1 -1
- package/sidecar/dist/constants/mcp.js +2 -0
- package/sidecar/dist/constants/mcp.js.map +1 -1
- package/sidecar/dist/constants/providers.d.ts +1 -1
- package/sidecar/dist/constants/providers.js +1 -1
- package/sidecar/dist/constants/providers.js.map +1 -1
- package/sidecar/dist/constants/tool-kinds.d.ts +1 -0
- package/sidecar/dist/constants/tool-kinds.js +7 -0
- package/sidecar/dist/constants/tool-kinds.js.map +1 -1
- package/sidecar/dist/database/database-client.d.ts +11 -0
- package/sidecar/dist/database/database-client.js +50 -0
- package/sidecar/dist/database/database-client.js.map +1 -0
- package/sidecar/dist/index.js +6 -0
- package/sidecar/dist/index.js.map +1 -1
- package/sidecar/dist/mcp/tool-definitions.js +2 -0
- package/sidecar/dist/mcp/tool-definitions.js.map +1 -1
- package/sidecar/dist/mcp/tools/builder-gate.js +3 -1
- package/sidecar/dist/mcp/tools/builder-gate.js.map +1 -1
- package/sidecar/dist/mcp/tools/builder-project.d.ts +8 -0
- package/sidecar/dist/mcp/tools/builder-project.js +181 -0
- package/sidecar/dist/mcp/tools/builder-project.js.map +1 -0
- package/sidecar/dist/mcp/tools/builder.d.ts +5 -2
- package/sidecar/dist/mcp/tools/builder.js +5 -11
- package/sidecar/dist/mcp/tools/builder.js.map +1 -1
- package/sidecar/dist/mcp/tools/database.d.ts +6 -0
- package/sidecar/dist/mcp/tools/database.js +42 -0
- package/sidecar/dist/mcp/tools/database.js.map +1 -0
- package/sidecar/dist/mcp/types.d.ts +2 -0
- package/sidecar/dist/metrics/aggregate.js +29 -7
- package/sidecar/dist/metrics/aggregate.js.map +1 -1
- package/sidecar/dist/metrics/types.d.ts +2 -0
- package/sidecar/dist/providers/claude/safe-mode.js +11 -1
- package/sidecar/dist/providers/claude/safe-mode.js.map +1 -1
- package/sidecar/dist/providers/codex/chatgpt/credentials.d.ts +10 -0
- package/sidecar/dist/providers/codex/chatgpt/credentials.js +63 -0
- package/sidecar/dist/providers/codex/chatgpt/credentials.js.map +1 -0
- package/sidecar/dist/providers/codex/chatgpt/http.d.ts +3 -0
- package/sidecar/dist/providers/codex/chatgpt/http.js +66 -0
- package/sidecar/dist/providers/codex/chatgpt/http.js.map +1 -0
- package/sidecar/dist/providers/codex/chatgpt/lock.d.ts +1 -0
- package/sidecar/dist/providers/codex/chatgpt/lock.js +58 -0
- package/sidecar/dist/providers/codex/chatgpt/lock.js.map +1 -0
- package/sidecar/dist/providers/codex/chatgpt/login.d.ts +8 -0
- package/sidecar/dist/providers/codex/chatgpt/login.js +138 -0
- package/sidecar/dist/providers/codex/chatgpt/login.js.map +1 -0
- package/sidecar/dist/providers/codex/chatgpt/oauth.d.ts +38 -0
- package/sidecar/dist/providers/codex/chatgpt/oauth.js +167 -0
- package/sidecar/dist/providers/codex/chatgpt/oauth.js.map +1 -0
- package/sidecar/dist/providers/codex/chatgpt/store.d.ts +21 -0
- package/sidecar/dist/providers/codex/chatgpt/store.js +75 -0
- package/sidecar/dist/providers/codex/chatgpt/store.js.map +1 -0
- package/sidecar/dist/providers/codex/config.d.ts +1 -5
- package/sidecar/dist/providers/codex/config.js +27 -4
- package/sidecar/dist/providers/codex/config.js.map +1 -1
- package/sidecar/dist/providers/codex/module.js +11 -4
- package/sidecar/dist/providers/codex/module.js.map +1 -1
- package/sidecar/dist/providers/codex/process.d.ts +1 -1
- package/sidecar/dist/providers/codex/process.js +7 -3
- package/sidecar/dist/providers/codex/process.js.map +1 -1
- package/sidecar/dist/providers/codex/provider.d.ts +0 -1
- package/sidecar/dist/providers/codex/provider.js +7 -5
- package/sidecar/dist/providers/codex/provider.js.map +1 -1
- package/sidecar/dist/server/http.js +38 -0
- package/sidecar/dist/server/http.js.map +1 -1
- package/sidecar/dist/server/permission-events.js +3 -1
- package/sidecar/dist/server/permission-events.js.map +1 -1
- package/sidecar/dist/server/raw-data.js +1 -1
- package/sidecar/dist/server/raw-data.js.map +1 -1
- package/sidecar/dist/server/safety-net.js +1 -1
- package/sidecar/dist/server/safety-net.js.map +1 -1
- package/skills/dms-ai/SKILL.md +2 -1
- package/skills/dms-external-database/REFERENCE.md +132 -0
- package/skills/dms-external-database/SKILL.md +142 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { DATABASE_CONNECTIONS_PATH, DATABASE_CONNECTIONS_TOOL_NAME, DATABASE_DESCRIBE_PATH, DATABASE_DESCRIBE_TOOL_NAME, DATABASE_PROFILE_PATH, DATABASE_PROFILE_TOOL_NAME, DATABASE_RELATIONS_PATH, DATABASE_RELATIONS_TOOL_NAME, } from "../../constants/database.js";
|
|
3
|
+
import { defineTool, } from "../define-tool.js";
|
|
4
|
+
function isFailed(value) {
|
|
5
|
+
return (value !== null &&
|
|
6
|
+
typeof value === "object" &&
|
|
7
|
+
value.ok === false);
|
|
8
|
+
}
|
|
9
|
+
function answer(value) {
|
|
10
|
+
const text = JSON.stringify(value);
|
|
11
|
+
return isFailed(value)
|
|
12
|
+
? { content: [{ type: "text", text }], isError: true }
|
|
13
|
+
: { content: [{ type: "text", text }] };
|
|
14
|
+
}
|
|
15
|
+
const CONNECTION = z
|
|
16
|
+
.string()
|
|
17
|
+
.describe("A connection id from DatabaseConnections, e.g. `erp`.");
|
|
18
|
+
const RELATION = z
|
|
19
|
+
.string()
|
|
20
|
+
.describe('A relation named `"schema.name"`, e.g. `sales.accounts`.');
|
|
21
|
+
const COLUMN_REFERENCE = z.object({ relation: RELATION, column: z.string() });
|
|
22
|
+
const CONNECTIONS_DESCRIPTION = "Lists the databases the project connects dms-ai to, each with its engine, version, database and role. Configuration declares them; when none is listed, connect one first with BuilderConfigureProject.";
|
|
23
|
+
const RELATIONS_DESCRIPTION = "Lists every relation of a connection (tables, partitioned tables, views, materialized views, foreign tables), with its row estimate and where it came from, its key (the columns `_id` aliases, or null), what the role may write, its comment, and `unmappable` with the reason when it cannot be mapped.";
|
|
24
|
+
const DESCRIBE_DESCRIPTION = "Describes relations in full: every column's native type, nullability, default, generated/identity, enum labels, comment, `accepts` (the declarations registration takes, the one to propose first) and `readOnly`; indexes; foreign keys out (`references`) and in (`referencedBy`). Describe in batches of up to 20.";
|
|
25
|
+
const PROFILE_DESCRIPTION = "Profiles one relation with aggregates only, in a read-only transaction: rows, and per column nulls, distinct, numeric/date/enum ranges, months, categories (values of few-valued columns, each seen at least 5 times) and text lengths, with traits (enum-like, identifier-like, label-candidate, time-axis, measure); children per parent over each foreign key. A measure past its time answers `timeout`. Large relations are sampled. `references` checks columns that look like references without a declared foreign key: containment of their values in the target column, and whether the target is a key.";
|
|
26
|
+
export function buildDatabaseTools(deps) {
|
|
27
|
+
const client = deps.databaseClient;
|
|
28
|
+
return [
|
|
29
|
+
defineTool(DATABASE_CONNECTIONS_TOOL_NAME, CONNECTIONS_DESCRIPTION, {}, async () => answer(await client.get(DATABASE_CONNECTIONS_PATH))),
|
|
30
|
+
defineTool(DATABASE_RELATIONS_TOOL_NAME, RELATIONS_DESCRIPTION, { connection: CONNECTION, schemas: z.array(z.string()).optional() }, async (input) => answer(await client.post(DATABASE_RELATIONS_PATH, input))),
|
|
31
|
+
defineTool(DATABASE_DESCRIBE_TOOL_NAME, DESCRIBE_DESCRIPTION, { connection: CONNECTION, relations: z.array(RELATION).min(1) }, async (input) => answer(await client.post(DATABASE_DESCRIBE_PATH, input))),
|
|
32
|
+
defineTool(DATABASE_PROFILE_TOOL_NAME, PROFILE_DESCRIPTION, {
|
|
33
|
+
connection: CONNECTION,
|
|
34
|
+
relation: RELATION.optional(),
|
|
35
|
+
columns: z.array(z.string()).optional(),
|
|
36
|
+
references: z
|
|
37
|
+
.array(z.object({ from: COLUMN_REFERENCE, to: COLUMN_REFERENCE }))
|
|
38
|
+
.optional(),
|
|
39
|
+
}, async (input) => answer(await client.post(DATABASE_PROFILE_PATH, input))),
|
|
40
|
+
];
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=database.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/mcp/tools/database.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { QuestionAnswers, QuestionRequest } from "../agent/question-bus.js";
|
|
2
2
|
import type { BuilderClient } from "../builder/builder-client.js";
|
|
3
|
+
import type { DatabaseClient } from "../database/database-client.js";
|
|
3
4
|
import type { BuilderGate } from "./tools/builder-gate.js";
|
|
4
5
|
import type { MCP_SERVER_TYPE_SDK } from "../constants/mcp.js";
|
|
5
6
|
import type { LogsClient } from "../logs/logs-client.js";
|
|
@@ -18,6 +19,7 @@ export interface AiMcpServerStaticDeps {
|
|
|
18
19
|
logsClient: LogsClient;
|
|
19
20
|
builderClient: BuilderClient;
|
|
20
21
|
builderEnabled: boolean;
|
|
22
|
+
databaseClient: DatabaseClient;
|
|
21
23
|
navigationCompleter: NavigationCompleter;
|
|
22
24
|
}
|
|
23
25
|
export interface AiMcpServerDeps extends AiMcpServerStaticDeps {
|
|
@@ -72,13 +72,25 @@ function dailyCounts(timestamps, fromMs, toMs) {
|
|
|
72
72
|
return dailySums(timestamps.map((ts) => [ts, 1]), fromMs, toMs);
|
|
73
73
|
}
|
|
74
74
|
function compare(timestamps, value, window) {
|
|
75
|
-
|
|
75
|
+
const previous = comparisonWindow(window);
|
|
76
|
+
if (!previous)
|
|
76
77
|
return {};
|
|
77
|
-
|
|
78
|
-
const previousValue = countIn(timestamps, window.compareFromMs, window.compareToMs);
|
|
78
|
+
const previousValue = countIn(timestamps, previous.fromMs, previous.toMs);
|
|
79
79
|
const delta = deltaPercent(value, previousValue);
|
|
80
80
|
return delta === undefined ? { previousValue } : { previousValue, delta };
|
|
81
81
|
}
|
|
82
|
+
function comparisonWindow(window) {
|
|
83
|
+
if (window.compareFromMs === undefined || window.compareToMs === undefined) {
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
return { fromMs: window.compareFromMs, toMs: window.compareToMs };
|
|
87
|
+
}
|
|
88
|
+
function rowDelta(value, id, previousCounts) {
|
|
89
|
+
if (!previousCounts)
|
|
90
|
+
return {};
|
|
91
|
+
const delta = deltaPercent(value, previousCounts.get(id) ?? 0);
|
|
92
|
+
return delta === undefined ? {} : { delta };
|
|
93
|
+
}
|
|
82
94
|
function approvalBreakdown(sources, window) {
|
|
83
95
|
const asked = calls(sources).filter((r) => r.isAsked && inRange(r.timestampMs, window.fromMs, window.toMs));
|
|
84
96
|
return {
|
|
@@ -116,10 +128,10 @@ export function buildSeries(sources, window) {
|
|
|
116
128
|
...compare(timestamps, value, window),
|
|
117
129
|
series: [seriesFrom("Actions", keys, counts)],
|
|
118
130
|
};
|
|
119
|
-
|
|
131
|
+
const previous = comparisonWindow(window);
|
|
132
|
+
if (!previous)
|
|
120
133
|
return payload;
|
|
121
|
-
|
|
122
|
-
const compareCounts = dailyCounts(timestamps, window.compareFromMs, window.compareToMs);
|
|
134
|
+
const compareCounts = dailyCounts(timestamps, previous.fromMs, previous.toMs);
|
|
123
135
|
return {
|
|
124
136
|
...payload,
|
|
125
137
|
comparisonSeries: [seriesFrom("Comparison", keys, compareCounts)],
|
|
@@ -136,12 +148,20 @@ function countBy(records, key) {
|
|
|
136
148
|
}
|
|
137
149
|
return counts;
|
|
138
150
|
}
|
|
151
|
+
function countsOver(sources, window, key) {
|
|
152
|
+
const previous = comparisonWindow(window);
|
|
153
|
+
return previous ? countBy(inWindow(sources, previous), key) : undefined;
|
|
154
|
+
}
|
|
139
155
|
export function buildAllowed(sources, window) {
|
|
140
156
|
const records = inWindow(sources, window);
|
|
141
157
|
const counts = countBy(records, (r) => r.allowedBy);
|
|
158
|
+
const previousCounts = countsOver(sources, window, (r) => r.allowedBy);
|
|
142
159
|
const deletions = records.filter((r) => r.kind === "destructive");
|
|
143
160
|
return {
|
|
144
|
-
items: ALLOWED_BY_VALUES.map((id) =>
|
|
161
|
+
items: ALLOWED_BY_VALUES.map((id) => {
|
|
162
|
+
const value = counts.get(id) ?? 0;
|
|
163
|
+
return { id, value, ...rowDelta(value, id, previousCounts) };
|
|
164
|
+
}),
|
|
145
165
|
deletionsAsked: deletions.filter((r) => r.isAsked).length,
|
|
146
166
|
deletions: deletions.length,
|
|
147
167
|
};
|
|
@@ -151,10 +171,12 @@ function topCounts(sources, window, limit) {
|
|
|
151
171
|
return [...counts.entries()].sort((a, b) => b[1] - a[1]).slice(0, limit);
|
|
152
172
|
}
|
|
153
173
|
export function buildTopTools(sources, window, limit) {
|
|
174
|
+
const previousCounts = countsOver(sources, window, (r) => r.tool);
|
|
154
175
|
return {
|
|
155
176
|
items: topCounts(sources, window, limit).map(([id, value]) => ({
|
|
156
177
|
id,
|
|
157
178
|
value,
|
|
179
|
+
...rowDelta(value, id, previousCounts),
|
|
158
180
|
source: toolSourceOf(id),
|
|
159
181
|
})),
|
|
160
182
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aggregate.js","sourceRoot":"","sources":["../../src/metrics/aggregate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAe1D,MAAM,UAAU,GAAG,UAAU,CAAC;AAC9B,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB,MAAM,cAAc,GAAG,EAAE,CAAC;AAC1B,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC9B,MAAM,eAAe,GAAG,EAAE,CAAC;AAW3B,MAAM,kBAAkB,GAAsB,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;AAE/E,SAAS,KAAK,CAAC,OAAsB;IACnC,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,YAAY,CACnB,SAA8C;IAE9C,OAAO,CAAC,OAAO,EAAE,EAAE,CACjB,KAAK,CAAC,OAAO,CAAC;SACX,MAAM,CAAC,SAAS,CAAC;SACjB,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,cAAc,CAAC,OAAsB;IAC5C,OAAO,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAC9C,CAAC,SAAS,CAAC,QAAQ,IAAI,EAAE,CAAC;SACvB,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC;SAC7C,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAChC,CAAC;AACJ,CAAC;AAED,MAAM,WAAW,GAAuC;IACtD,OAAO,EAAE,YAAY,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;IACjC,aAAa,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;IACxE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,SAAS,KAAK,UAAU,CAAC;IACtE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC;IACrD,MAAM,EAAE,cAAc;IACtB,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC;IAClD,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;CACzC,CAAC;AAEF,SAAS,OAAO,CAAC,EAAU,EAAE,MAAc,EAAE,IAAY;IACvD,OAAO,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,IAAI,CAAC;AACpC,CAAC;AAED,SAAS,OAAO,CAAC,UAAoB,EAAE,MAAc,EAAE,IAAY;IACjE,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;AACrE,CAAC;AAOD,SAAS,YAAY,CAAC,OAAe,EAAE,QAAgB;IACrD,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACzD,OAAO,CACL,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,GAAG,QAAQ,CAAC,GAAG,QAAQ,CAAC,GAAG,gBAAgB,CAAC;QAChE,eAAe,CAChB,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,EAAU;IACxB,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;AAC7D,CAAC;AAID,SAAS,UAAU,CAAC,MAAc,EAAE,IAAY;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,UAAU,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,IAAI,IAAI,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,IAAI,GAAG,GAAG,QAAQ,EAAE,GAAG,IAAI,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC;QACpD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,SAAS,CAChB,MAAgD,EAChD,MAAc,EACd,IAAY;IAEZ,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAClC,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QAClC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC;YAAE,SAAS;QACzC,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK,SAAS;YAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC;IACzD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,WAAW,CAAC,UAAoB,EAAE,MAAc,EAAE,IAAY;IACrE,OAAO,SAAS,CACd,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAU,CAAC,EACxC,MAAM,EACN,IAAI,CACL,CAAC;AACJ,CAAC;AAQD,SAAS,OAAO,CACd,UAAoB,EACpB,KAAa,EACb,MAAoB;IAEpB,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QAC3E,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,aAAa,GAAG,OAAO,CAC3B,UAAU,EACV,MAAM,CAAC,aAAa,EACpB,MAAM,CAAC,WAAW,CACnB,CAAC;IACF,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IACjD,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;AAC5E,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAsB,EAAE,MAAoB;IACrE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CACjC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CACvE,CAAC;IACF,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,MAAM;QACnB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,MAAM;QAC5D,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,MAAM;KAC/D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CACtB,OAAsB,EACtB,MAAiB,EACjB,MAAoB;IAEpB,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAmB;QAC9B,KAAK;QACL,GAAG,OAAO,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC;QACrC,SAAS,EAAE,WAAW,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC;KAC/D,CAAC;IACF,IAAI,MAAM,KAAK,UAAU;QAAE,OAAO,OAAO,CAAC;IAC1C,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;AAC/D,CAAC;AAED,SAAS,UAAU,CACjB,IAAY,EACZ,IAAc,EACd,MAAgB;IAEhB,MAAM,IAAI,GAAkB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3E,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxB,CAAC;AAED,SAAS,KAAK,CAAC,MAAyB;IACtC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,OAAsB,EACtB,MAAoB;IAEpB,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACnE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5B,MAAM,OAAO,GAAqB;QAChC,KAAK;QACL,GAAG,OAAO,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC;QACrC,MAAM,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;KAC9C,CAAC;IACF,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QAC3E,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,MAAM,aAAa,GAAG,WAAW,CAC/B,UAAU,EACV,MAAM,CAAC,aAAa,EACpB,MAAM,CAAC,WAAW,CACnB,CAAC;IACF,OAAO;QACL,GAAG,OAAO;QACV,gBAAgB,EAAE,CAAC,UAAU,CAAC,YAAY,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;KAClE,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,OAAsB,EAAE,MAAoB;IAC5D,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACjC,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CACnD,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CACd,OAAkC,EAClC,GAAkC;IAElC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAa,CAAC;IACpC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;QACvB,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAGD,MAAM,UAAU,YAAY,CAC1B,OAAsB,EACtB,MAAoB;IAEpB,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC;IAClE,OAAO;QACL,KAAK,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1E,cAAc,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM;QACzD,SAAS,EAAE,SAAS,CAAC,MAAM;KAC5B,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAChB,OAAsB,EACtB,MAAoB,EACpB,KAAa;IAEb,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,OAAsB,EACtB,MAAoB,EACpB,KAAa;IAEb,OAAO;QACL,KAAK,EAAE,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAC7D,EAAE;YACF,KAAK;YACL,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC;SACzB,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAwB,EAAE,MAAoB;IACxE,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,IAAI,EAAE,CAAC;SACvC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;SACjE,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;AAChD,CAAC;AAGD,MAAM,UAAU,UAAU,CACxB,OAAsB,EACtB,MAAoB;IAEpB,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAC/C,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CACrC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,WAAW,CAAU,CAC/C,CACF,CAAC;IACF,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3D,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO;SACpC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACf,cAAc,EAAE,KAAK,CAAC,EAAE;QACxB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,WAAW,EAAE,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC;KAC/C,CAAC,CAAC;SACF,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC;SAChC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC;IACjD,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChE,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC;QACxB,aAAa,EAAE,eAAe,CAAC,MAAM;QACrC,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC;KACxB,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"aggregate.js","sourceRoot":"","sources":["../../src/metrics/aggregate.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,6 +28,7 @@ export type KpiMetric = (typeof KPI_METRICS)[number];
|
|
|
28
28
|
interface AllowedItem {
|
|
29
29
|
id: AllowedBy;
|
|
30
30
|
value: number;
|
|
31
|
+
delta?: number;
|
|
31
32
|
}
|
|
32
33
|
export interface AllowedPayload {
|
|
33
34
|
items: AllowedItem[];
|
|
@@ -37,6 +38,7 @@ export interface AllowedPayload {
|
|
|
37
38
|
interface TopToolItem {
|
|
38
39
|
id: string;
|
|
39
40
|
value: number;
|
|
41
|
+
delta?: number;
|
|
40
42
|
source: ToolSource;
|
|
41
43
|
}
|
|
42
44
|
export interface TopToolsPayload {
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { PRE_TOOL_USE_HOOK_EVENT } from "../../constants/claude.js";
|
|
2
2
|
import { SDK_PERMISSION_BEHAVIOR } from "../../constants/permissions.js";
|
|
3
3
|
import { SAFE_MODE_DENIED_MESSAGE, SAFE_MODE_DISALLOWED_TOOLS, } from "../../constants/settings.js";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
import { isAbsolute, join, relative } from "node:path";
|
|
4
6
|
import { isMutatingTool } from "../../agent/tool-kinds.js";
|
|
5
7
|
const SAFE_MODE_BLOCKED_TOOLS = new Set(SAFE_MODE_DISALLOWED_TOOLS);
|
|
6
8
|
const SAFE_MODE_DENIAL = {
|
|
@@ -11,10 +13,18 @@ const SAFE_MODE_DENIAL = {
|
|
|
11
13
|
},
|
|
12
14
|
};
|
|
13
15
|
const NO_DECISION = { continue: true };
|
|
16
|
+
const PLANS_DIRECTORY = join(homedir(), ".claude", "plans");
|
|
17
|
+
function isPlanFile(input) {
|
|
18
|
+
const filePath = (input.tool_input ?? {}).file_path;
|
|
19
|
+
if (typeof filePath !== "string" || !isAbsolute(filePath))
|
|
20
|
+
return false;
|
|
21
|
+
const inside = relative(PLANS_DIRECTORY, filePath);
|
|
22
|
+
return inside.length > 0 && !inside.startsWith("..") && !isAbsolute(inside);
|
|
23
|
+
}
|
|
14
24
|
function isBlockedTool(input) {
|
|
15
25
|
if (input.hook_event_name !== PRE_TOOL_USE_HOOK_EVENT)
|
|
16
26
|
return false;
|
|
17
|
-
return SAFE_MODE_BLOCKED_TOOLS.has(input.tool_name);
|
|
27
|
+
return SAFE_MODE_BLOCKED_TOOLS.has(input.tool_name) && !isPlanFile(input);
|
|
18
28
|
}
|
|
19
29
|
export function buildSafeModeHooks(deps) {
|
|
20
30
|
const preToolUse = async (input) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safe-mode.js","sourceRoot":"","sources":["../../../src/providers/claude/safe-mode.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EACL,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAM3D,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC,0BAA0B,CAAC,CAAC;AAEpE,MAAM,gBAAgB,GAAuB;IAC3C,kBAAkB,EAAE;QAClB,aAAa,EAAE,uBAAuB;QACtC,kBAAkB,EAAE,uBAAuB,CAAC,IAAI;QAChD,wBAAwB,EAAE,wBAAwB;KACnD;CACF,CAAC;AAEF,MAAM,WAAW,GAAuB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"safe-mode.js","sourceRoot":"","sources":["../../../src/providers/claude/safe-mode.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EACL,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAM3D,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC,0BAA0B,CAAC,CAAC;AAEpE,MAAM,gBAAgB,GAAuB;IAC3C,kBAAkB,EAAE;QAClB,aAAa,EAAE,uBAAuB;QACtC,kBAAkB,EAAE,uBAAuB,CAAC,IAAI;QAChD,wBAAwB,EAAE,wBAAwB;KACnD;CACF,CAAC;AAEF,MAAM,WAAW,GAAuB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAG3D,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AAW5D,SAAS,UAAU,CAAC,KAAgB;IAClC,MAAM,QAAQ,GAAG,CAAE,KAAsB,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,SAAS,CAAC;IACtE,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IACxE,MAAM,MAAM,GAAG,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;IACnD,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,aAAa,CAAC,KAAgB;IACrC,IAAI,KAAK,CAAC,eAAe,KAAK,uBAAuB;QAAE,OAAO,KAAK,CAAC;IACpE,OAAO,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AAC5E,CAAC;AAwBD,MAAM,UAAU,kBAAkB,CAAC,IAAoB;IACrD,MAAM,UAAU,GAAiB,KAAK,EAAE,KAAK,EAAE,EAAE;QAC/C,MAAM,EAAE,SAAS,EAAE,QAAQ,GAAG,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,EAAE,EAAE,GAC1D,KAAwB,CAAC;QAC3B,IAAI,IAAI,CAAC,iBAAiB,EAAE,KAAK,MAAM,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YAChE,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACnC,OAAO,gBAAgB,CAAC;QAC1B,CAAC;QACD,IAAI,cAAc,CAAC,QAAQ,CAAC;YAAE,MAAM,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;QAC5D,OAAO,WAAW,CAAC;IACrB,CAAC,CAAC;IACF,OAAO,EAAE,CAAC,uBAAuB,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;AAClE,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface ChatGptAccountStatus {
|
|
2
|
+
isSignedIn: boolean;
|
|
3
|
+
email?: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function readAccountStatus(): ChatGptAccountStatus;
|
|
6
|
+
export declare function getAccessToken(): Promise<string>;
|
|
7
|
+
export interface SignOutResult {
|
|
8
|
+
isRevoked: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function signOut(): Promise<SignOutResult>;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { CHATGPT_LOG_PREFIX, CHATGPT_NOT_SIGNED_IN_MESSAGE, CHATGPT_REFRESH_MARGIN_MS, CHATGPT_SIGNED_OUT_MESSAGE, } from "../../../constants/chatgpt.js";
|
|
2
|
+
import { withAuthLock } from "./lock.js";
|
|
3
|
+
import { ChatGptOAuthError, refreshTokens, revokeRefreshToken, } from "./oauth.js";
|
|
4
|
+
import { isSignedIn, readAuthRecord, writeAuthRecord, } from "./store.js";
|
|
5
|
+
export function readAccountStatus() {
|
|
6
|
+
const record = readAuthRecord();
|
|
7
|
+
if (!isSignedIn(record))
|
|
8
|
+
return { isSignedIn: false };
|
|
9
|
+
return { isSignedIn: true, email: record?.email };
|
|
10
|
+
}
|
|
11
|
+
function isFresh(tokens) {
|
|
12
|
+
return tokens.expiresAt - Date.now() > CHATGPT_REFRESH_MARGIN_MS;
|
|
13
|
+
}
|
|
14
|
+
function withoutTokens(record) {
|
|
15
|
+
const { tokens: _cleared, ...rest } = record;
|
|
16
|
+
return rest;
|
|
17
|
+
}
|
|
18
|
+
async function refreshLocked() {
|
|
19
|
+
const record = readAuthRecord();
|
|
20
|
+
if (record?.tokens === undefined || record.clientId === undefined) {
|
|
21
|
+
throw new Error(CHATGPT_NOT_SIGNED_IN_MESSAGE);
|
|
22
|
+
}
|
|
23
|
+
if (isFresh(record.tokens))
|
|
24
|
+
return record.tokens.accessToken;
|
|
25
|
+
try {
|
|
26
|
+
const tokens = await refreshTokens(record.clientId, record.tokens);
|
|
27
|
+
await writeAuthRecord({ ...record, tokens });
|
|
28
|
+
return tokens.accessToken;
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
if (!(error instanceof ChatGptOAuthError) || !error.isTerminal)
|
|
32
|
+
throw error;
|
|
33
|
+
console.warn(`${CHATGPT_LOG_PREFIX} sign-in dropped: ${error.message}`);
|
|
34
|
+
await writeAuthRecord(withoutTokens(record));
|
|
35
|
+
throw new Error(CHATGPT_SIGNED_OUT_MESSAGE);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
let refreshing = null;
|
|
39
|
+
export async function getAccessToken() {
|
|
40
|
+
const record = readAuthRecord();
|
|
41
|
+
if (record?.tokens === undefined || !isSignedIn(record)) {
|
|
42
|
+
throw new Error(CHATGPT_NOT_SIGNED_IN_MESSAGE);
|
|
43
|
+
}
|
|
44
|
+
if (isFresh(record.tokens))
|
|
45
|
+
return record.tokens.accessToken;
|
|
46
|
+
refreshing ??= withAuthLock(refreshLocked).finally(() => {
|
|
47
|
+
refreshing = null;
|
|
48
|
+
});
|
|
49
|
+
return refreshing;
|
|
50
|
+
}
|
|
51
|
+
export function signOut() {
|
|
52
|
+
return withAuthLock(async () => {
|
|
53
|
+
const record = readAuthRecord();
|
|
54
|
+
if (record?.tokens === undefined)
|
|
55
|
+
return { isRevoked: true };
|
|
56
|
+
const isRevoked = record.clientId === undefined
|
|
57
|
+
? false
|
|
58
|
+
: await revokeRefreshToken(record.clientId, record.tokens.refreshToken);
|
|
59
|
+
await writeAuthRecord(withoutTokens(record));
|
|
60
|
+
return { isRevoked };
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../../../src/providers/codex/chatgpt/credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { timingSafeEqual } from "node:crypto";
|
|
2
|
+
import { CHATGPT_ACCESS_TOKEN_PATH, CHATGPT_CALLBACK_PATH, } from "../../../constants/chatgpt.js";
|
|
3
|
+
import { CONTENT_TYPE, HTTP_STATUS } from "../../../constants/http.js";
|
|
4
|
+
import { sendResponse } from "../../../server/http-io.js";
|
|
5
|
+
import { getAccessToken } from "./credentials.js";
|
|
6
|
+
import { finishLogin } from "./login.js";
|
|
7
|
+
import { randomUrlSafe } from "./oauth.js";
|
|
8
|
+
const BEARER_PREFIX = "Bearer ";
|
|
9
|
+
export const ACCESS_TOKEN_SECRET = randomUrlSafe();
|
|
10
|
+
function escapeHtml(text) {
|
|
11
|
+
return text
|
|
12
|
+
.replaceAll("&", "&")
|
|
13
|
+
.replaceAll("<", "<")
|
|
14
|
+
.replaceAll(">", ">")
|
|
15
|
+
.replaceAll('"', """);
|
|
16
|
+
}
|
|
17
|
+
function renderPage(title, message) {
|
|
18
|
+
return [
|
|
19
|
+
"<!doctype html>",
|
|
20
|
+
'<html lang="en"><head><meta charset="utf-8">',
|
|
21
|
+
`<title>${escapeHtml(title)}</title>`,
|
|
22
|
+
'<meta name="viewport" content="width=device-width, initial-scale=1">',
|
|
23
|
+
"<style>body{font-family:system-ui,sans-serif;max-width:32rem;margin:15vh auto;padding:0 1.5rem;color:#18181b}h1{font-size:1.25rem}p{line-height:1.5;color:#52525b}</style>",
|
|
24
|
+
`</head><body><h1>${escapeHtml(title)}</h1><p>${escapeHtml(message)}</p></body></html>`,
|
|
25
|
+
].join("");
|
|
26
|
+
}
|
|
27
|
+
function sendLoginPage(res, response) {
|
|
28
|
+
sendResponse(res, response.status, CONTENT_TYPE.HTML, renderPage(response.title, response.message));
|
|
29
|
+
}
|
|
30
|
+
function hasTokenSecret(req) {
|
|
31
|
+
const authorization = req.headers.authorization;
|
|
32
|
+
if (!authorization?.startsWith(BEARER_PREFIX))
|
|
33
|
+
return false;
|
|
34
|
+
const actual = Buffer.from(authorization.slice(BEARER_PREFIX.length));
|
|
35
|
+
const expected = Buffer.from(ACCESS_TOKEN_SECRET);
|
|
36
|
+
return actual.length === expected.length && timingSafeEqual(actual, expected);
|
|
37
|
+
}
|
|
38
|
+
async function sendAccessToken(req, res) {
|
|
39
|
+
if (!hasTokenSecret(req)) {
|
|
40
|
+
sendResponse(res, HTTP_STATUS.UNAUTHORIZED, CONTENT_TYPE.TEXT, "");
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
const token = await getAccessToken();
|
|
45
|
+
sendResponse(res, HTTP_STATUS.OK, CONTENT_TYPE.TEXT, token);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
49
|
+
sendResponse(res, HTTP_STATUS.UNAVAILABLE, CONTENT_TYPE.TEXT, reason);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export async function handleChatGptRequest(req, res) {
|
|
53
|
+
if (req.method !== "GET")
|
|
54
|
+
return false;
|
|
55
|
+
const url = new URL(req.url ?? "/", "http://localhost");
|
|
56
|
+
const routes = {
|
|
57
|
+
[CHATGPT_CALLBACK_PATH]: async () => sendLoginPage(res, await finishLogin(url.searchParams)),
|
|
58
|
+
[CHATGPT_ACCESS_TOKEN_PATH]: () => sendAccessToken(req, res),
|
|
59
|
+
};
|
|
60
|
+
const route = routes[url.pathname];
|
|
61
|
+
if (route === undefined)
|
|
62
|
+
return false;
|
|
63
|
+
await route();
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../../src/providers/codex/chatgpt/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function withAuthLock<T>(task: () => Promise<T>): Promise<T>;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { mkdir, rm, stat } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { CHATGPT_CONFIG_DIR_MODE, CHATGPT_LOCK_DIR_NAME, CHATGPT_LOCK_POLL_MS, CHATGPT_LOCK_STALE_MS, CHATGPT_LOCK_TIMEOUT_MS, } from "../../../constants/chatgpt.js";
|
|
4
|
+
import { chatGptConfigDir } from "./store.js";
|
|
5
|
+
function lockPath() {
|
|
6
|
+
return path.join(chatGptConfigDir(), CHATGPT_LOCK_DIR_NAME);
|
|
7
|
+
}
|
|
8
|
+
function wait(ms) {
|
|
9
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
10
|
+
}
|
|
11
|
+
function errorCode(error) {
|
|
12
|
+
return error?.code;
|
|
13
|
+
}
|
|
14
|
+
async function isStale(lock) {
|
|
15
|
+
try {
|
|
16
|
+
const info = await stat(lock);
|
|
17
|
+
return Date.now() - info.mtimeMs > CHATGPT_LOCK_STALE_MS;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
async function acquire(lock) {
|
|
24
|
+
const deadline = Date.now() + CHATGPT_LOCK_TIMEOUT_MS;
|
|
25
|
+
await mkdir(path.dirname(lock), {
|
|
26
|
+
recursive: true,
|
|
27
|
+
mode: CHATGPT_CONFIG_DIR_MODE,
|
|
28
|
+
});
|
|
29
|
+
for (;;) {
|
|
30
|
+
try {
|
|
31
|
+
await mkdir(lock);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
if (errorCode(error) !== "EEXIST")
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
if (await isStale(lock)) {
|
|
39
|
+
await rm(lock, { recursive: true, force: true });
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if (Date.now() >= deadline) {
|
|
43
|
+
throw new Error(`timed out waiting for ${lock}`);
|
|
44
|
+
}
|
|
45
|
+
await wait(CHATGPT_LOCK_POLL_MS);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export async function withAuthLock(task) {
|
|
49
|
+
const lock = lockPath();
|
|
50
|
+
await acquire(lock);
|
|
51
|
+
try {
|
|
52
|
+
return await task();
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
await rm(lock, { recursive: true, force: true });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../../../../src/providers/codex/chatgpt/lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,SAAS,QAAQ;IACf,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,qBAAqB,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,IAAI,CAAC,EAAU;IACtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAQ,KAA2C,EAAE,IAAI,CAAC;AAC5D,CAAC;AAID,KAAK,UAAU,OAAO,CAAC,IAAY;IACjC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,GAAG,qBAAqB,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,IAAY;IACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,uBAAuB,CAAC;IACtD,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QAC9B,SAAS,EAAE,IAAI;QACf,IAAI,EAAE,uBAAuB;KAC9B,CAAC,CAAC;IACH,SAAS,CAAC;QACR,IAAI,CAAC;YAEH,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO;QACT,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ;gBAAE,MAAM,KAAK,CAAC;QACjD,CAAC;QACD,IAAI,MAAM,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACjD,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAI,IAAsB;IAC1D,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;IACxB,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,MAAM,IAAI,EAAE,CAAC;IACtB,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface LoginResponse {
|
|
2
|
+
status: number;
|
|
3
|
+
title: string;
|
|
4
|
+
message: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function createLoginUrl(port: number): Promise<string>;
|
|
7
|
+
export declare function finishLogin(query: URLSearchParams): Promise<LoginResponse>;
|
|
8
|
+
export declare function finishPastedLogin(pasted: string): Promise<LoginResponse>;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { CHATGPT_CALLBACK_PATH, CHATGPT_DYNAMIC_CLIENT_ID, CHATGPT_LOG_PREFIX, CHATGPT_LOGIN_TTL_MS, CHATGPT_MAX_PENDING_ATTEMPTS, CHATGPT_PLAN_SCOPE, } from "../../../constants/chatgpt.js";
|
|
2
|
+
import { HTTP_STATUS } from "../../../constants/http.js";
|
|
3
|
+
import { LOOPBACK_HOST } from "../../../constants/ports.js";
|
|
4
|
+
import { withAuthLock } from "./lock.js";
|
|
5
|
+
import { buildAuthorizeUrl, exchangeCode, randomUrlSafe, validateIdToken, } from "./oauth.js";
|
|
6
|
+
import { readAuthRecord, readOrCreateAuthRecord, writeAuthRecord, } from "./store.js";
|
|
7
|
+
const attempts = new Map();
|
|
8
|
+
function sweepExpired() {
|
|
9
|
+
const now = Date.now();
|
|
10
|
+
for (const [state, attempt] of attempts) {
|
|
11
|
+
if (attempt.expiresAt <= now)
|
|
12
|
+
attempts.delete(state);
|
|
13
|
+
}
|
|
14
|
+
while (attempts.size > CHATGPT_MAX_PENDING_ATTEMPTS) {
|
|
15
|
+
const oldest = attempts.keys().next();
|
|
16
|
+
if (oldest.done === true)
|
|
17
|
+
return;
|
|
18
|
+
attempts.delete(oldest.value);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function page(status, title, message) {
|
|
22
|
+
return { status, title, message };
|
|
23
|
+
}
|
|
24
|
+
const EXPIRED_LINK = page(HTTP_STATUS.BAD_REQUEST, "This sign-in link has expired", "Go back to Assistant › Settings in the dashboard and press “Sign in with ChatGPT” again.");
|
|
25
|
+
async function ensureRecord() {
|
|
26
|
+
const existing = readAuthRecord();
|
|
27
|
+
if (existing !== undefined)
|
|
28
|
+
return existing;
|
|
29
|
+
const created = readOrCreateAuthRecord();
|
|
30
|
+
await writeAuthRecord(created);
|
|
31
|
+
return created;
|
|
32
|
+
}
|
|
33
|
+
export async function createLoginUrl(port) {
|
|
34
|
+
sweepExpired();
|
|
35
|
+
const record = await withAuthLock(ensureRecord);
|
|
36
|
+
const state = randomUrlSafe();
|
|
37
|
+
const attempt = {
|
|
38
|
+
clientId: record.clientId,
|
|
39
|
+
hostId: record.hostId,
|
|
40
|
+
redirectUri: `http://${LOOPBACK_HOST}:${port}${CHATGPT_CALLBACK_PATH}`,
|
|
41
|
+
nonce: randomUrlSafe(),
|
|
42
|
+
codeVerifier: randomUrlSafe(),
|
|
43
|
+
expiresAt: Date.now() + CHATGPT_LOGIN_TTL_MS,
|
|
44
|
+
};
|
|
45
|
+
attempts.set(state, attempt);
|
|
46
|
+
return buildAuthorizeUrl({
|
|
47
|
+
...attempt,
|
|
48
|
+
state,
|
|
49
|
+
idTokenHint: record.clientId === undefined ? undefined : record.tokens?.idToken,
|
|
50
|
+
loginHint: record.clientId === undefined ? undefined : record.email,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
function resolveClientId(attempt, returned) {
|
|
54
|
+
if (attempt.clientId === undefined) {
|
|
55
|
+
if (returned === null || returned === CHATGPT_DYNAMIC_CLIENT_ID)
|
|
56
|
+
return undefined;
|
|
57
|
+
return returned;
|
|
58
|
+
}
|
|
59
|
+
if (returned !== null && returned !== attempt.clientId)
|
|
60
|
+
return undefined;
|
|
61
|
+
return attempt.clientId;
|
|
62
|
+
}
|
|
63
|
+
async function completeLogin(attempt, clientId, code) {
|
|
64
|
+
const tokens = await exchangeCode({
|
|
65
|
+
clientId,
|
|
66
|
+
code,
|
|
67
|
+
codeVerifier: attempt.codeVerifier,
|
|
68
|
+
redirectUri: attempt.redirectUri,
|
|
69
|
+
});
|
|
70
|
+
if (!tokens.scopes.includes(CHATGPT_PLAN_SCOPE)) {
|
|
71
|
+
return page(HTTP_STATUS.FORBIDDEN, "ChatGPT plan usage was not granted", "Codex runs on your ChatGPT plan. Sign in again and allow plan usage, or check that your plan includes it.");
|
|
72
|
+
}
|
|
73
|
+
const claims = await validateIdToken(tokens.idToken, {
|
|
74
|
+
clientId,
|
|
75
|
+
nonce: attempt.nonce,
|
|
76
|
+
});
|
|
77
|
+
return withAuthLock(async () => {
|
|
78
|
+
const record = readOrCreateAuthRecord();
|
|
79
|
+
const isOtherAccount = record.subject !== undefined &&
|
|
80
|
+
record.clientId === clientId &&
|
|
81
|
+
record.subject !== claims.sub;
|
|
82
|
+
if (isOtherAccount) {
|
|
83
|
+
await writeAuthRecord({ hostId: record.hostId });
|
|
84
|
+
return page(HTTP_STATUS.CONFLICT, "A different ChatGPT account", "This machine was registered with another ChatGPT account. Press “Sign in with ChatGPT” again to register this one.");
|
|
85
|
+
}
|
|
86
|
+
await writeAuthRecord({
|
|
87
|
+
hostId: record.hostId,
|
|
88
|
+
clientId,
|
|
89
|
+
subject: claims.sub,
|
|
90
|
+
email: claims.email,
|
|
91
|
+
tokens,
|
|
92
|
+
});
|
|
93
|
+
const who = claims.email === undefined ? "" : ` as ${claims.email}`;
|
|
94
|
+
return page(HTTP_STATUS.OK, "Signed in with ChatGPT", `Codex now runs on your ChatGPT plan${who}. You can close this tab and go back to the dashboard.`);
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
export async function finishLogin(query) {
|
|
98
|
+
sweepExpired();
|
|
99
|
+
const state = query.get("state");
|
|
100
|
+
const attempt = state === null ? undefined : attempts.get(state);
|
|
101
|
+
if (state === null || attempt === undefined)
|
|
102
|
+
return EXPIRED_LINK;
|
|
103
|
+
attempts.delete(state);
|
|
104
|
+
const error = query.get("error");
|
|
105
|
+
if (error !== null) {
|
|
106
|
+
return page(HTTP_STATUS.BAD_REQUEST, "Sign-in cancelled", error === "access_denied"
|
|
107
|
+
? "Nothing was changed. Codex stays signed out."
|
|
108
|
+
: `OpenAI answered “${error}”. Nothing was changed.`);
|
|
109
|
+
}
|
|
110
|
+
const code = query.get("code");
|
|
111
|
+
const clientId = resolveClientId(attempt, query.get("client_id"));
|
|
112
|
+
if (code === null || clientId === undefined) {
|
|
113
|
+
return page(HTTP_STATUS.BAD_REQUEST, "Sign-in incomplete", "OpenAI did not finish the registration. Try again from Assistant › Settings.");
|
|
114
|
+
}
|
|
115
|
+
try {
|
|
116
|
+
return await completeLogin(attempt, clientId, code);
|
|
117
|
+
}
|
|
118
|
+
catch (failure) {
|
|
119
|
+
const reason = failure instanceof Error ? failure.message : String(failure);
|
|
120
|
+
console.error(`${CHATGPT_LOG_PREFIX} sign-in failed: ${reason}`);
|
|
121
|
+
return page(HTTP_STATUS.BAD_GATEWAY, "Sign-in failed", `${reason}. Try again from Assistant › Settings.`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const NOT_A_CALLBACK = page(HTTP_STATUS.BAD_REQUEST, "Not the sign-in address", "Paste the whole address of the page OpenAI sent you to, starting with http://127.0.0.1.");
|
|
125
|
+
export function finishPastedLogin(pasted) {
|
|
126
|
+
let url;
|
|
127
|
+
try {
|
|
128
|
+
url = new URL(pasted.trim());
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return Promise.resolve(NOT_A_CALLBACK);
|
|
132
|
+
}
|
|
133
|
+
if (url.pathname !== CHATGPT_CALLBACK_PATH) {
|
|
134
|
+
return Promise.resolve(NOT_A_CALLBACK);
|
|
135
|
+
}
|
|
136
|
+
return finishLogin(url.searchParams);
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../../src/providers/codex/chatgpt/login.ts"],"names":[],"mappings":"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"}
|