@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.
Files changed (168) hide show
  1. package/README.md +1 -1
  2. package/dist/constants/database.d.ts +7 -0
  3. package/dist/constants/database.js +11 -0
  4. package/dist/constants/database.js.map +1 -0
  5. package/dist/constants/pages.d.ts +5 -0
  6. package/dist/constants/pages.js +6 -1
  7. package/dist/constants/pages.js.map +1 -1
  8. package/dist/database/catalog.d.ts +4 -0
  9. package/dist/database/catalog.js +25 -0
  10. package/dist/database/catalog.js.map +1 -0
  11. package/dist/frontend-module.d.ts +2 -0
  12. package/dist/frontend-module.js +18 -0
  13. package/dist/frontend-module.js.map +1 -0
  14. package/dist/index.js +2 -12
  15. package/dist/index.js.map +1 -1
  16. package/dist/logging/log-buffer.js +1 -1
  17. package/dist/logging/log-buffer.js.map +1 -1
  18. package/dist/pages/activity/page.d.ts +1 -0
  19. package/dist/pages/activity/page.js +13 -0
  20. package/dist/pages/activity/page.js.map +1 -1
  21. package/dist/pages/meta.d.ts +2 -0
  22. package/dist/pages/meta.js +3 -1
  23. package/dist/pages/meta.js.map +1 -1
  24. package/dist/pages/overview/insights.js +0 -2
  25. package/dist/pages/overview/insights.js.map +1 -1
  26. package/dist/pages/overview/page.d.ts +1 -1
  27. package/dist/pages/overview/page.js +12 -11
  28. package/dist/pages/overview/page.js.map +1 -1
  29. package/dist/pages/settings/page.d.ts +1 -0
  30. package/dist/pages/settings/page.js +1 -0
  31. package/dist/pages/settings/page.js.map +1 -1
  32. package/dist/pages/skills/page.js +7 -0
  33. package/dist/pages/skills/page.js.map +1 -1
  34. package/dist/routes/activity.js +5 -2
  35. package/dist/routes/activity.js.map +1 -1
  36. package/dist/routes/builder.js +8 -0
  37. package/dist/routes/builder.js.map +1 -1
  38. package/dist/routes/codex-account.d.ts +8 -0
  39. package/dist/routes/codex-account.js +162 -0
  40. package/dist/routes/codex-account.js.map +1 -0
  41. package/dist/routes/database.d.ts +21 -0
  42. package/dist/routes/database.js +115 -0
  43. package/dist/routes/database.js.map +1 -0
  44. package/dist/routes/index.d.ts +2 -0
  45. package/dist/routes/index.js +2 -0
  46. package/dist/routes/index.js.map +1 -1
  47. package/dist/routes/list-query.d.ts +1 -0
  48. package/dist/routes/list-query.js +9 -0
  49. package/dist/routes/list-query.js.map +1 -1
  50. package/dist/routes/metric-shapes.js +7 -4
  51. package/dist/routes/metric-shapes.js.map +1 -1
  52. package/dist/routes/metrics.d.ts +2 -2
  53. package/dist/routes/metrics.js +10 -6
  54. package/dist/routes/metrics.js.map +1 -1
  55. package/dist/types/metrics.d.ts +2 -0
  56. package/frontend-vue/app/chat/components/ConversationDrawer.vue +2 -1
  57. package/frontend-vue/app/chat/components/PanelHeader.vue +3 -1
  58. package/frontend-vue/app/chat/utils/markdown.ts +36 -20
  59. package/frontend-vue/app/chat/utils/tool-lexicon.ts +46 -0
  60. package/frontend-vue/app/components/ActivityDetail.vue +2 -5
  61. package/frontend-vue/app/components/ChatPanel.vue +3 -1
  62. package/frontend-vue/app/components/SkillDetail.vue +72 -26
  63. package/frontend-vue/app/views/RowStepper.vue +1 -1
  64. package/frontend-vue/app/views/types.ts +0 -10
  65. package/frontend-vue/i18n/locales/dms-ai-pages-en-GB.json +46 -4
  66. package/frontend-vue/i18n/locales/dms-ai-pages-fr-FR.json +46 -4
  67. package/frontend-vue/i18n/locales/dms-ai-panel-en-GB.json +8 -0
  68. package/frontend-vue/i18n/locales/dms-ai-panel-fr-FR.json +8 -0
  69. package/frontend-vue/i18n/locales/dms-ai-views-en-GB.json +1 -0
  70. package/frontend-vue/i18n/locales/dms-ai-views-fr-FR.json +1 -0
  71. package/frontend-vue/package.json +1 -1
  72. package/frontend-vue/tests/chat/markdown.test.ts +69 -0
  73. package/frontend-vue/tests/i18n-views.test.ts +63 -0
  74. package/frontend-vue/tests/panel-header-height.test.ts +40 -0
  75. package/frontend-vue/tests/panel-states.test.ts +1 -1
  76. package/package.json +7 -5
  77. package/sidecar/dist/agent/permission-preview.js +49 -2
  78. package/sidecar/dist/agent/permission-preview.js.map +1 -1
  79. package/sidecar/dist/agent/tool-kinds.d.ts +1 -0
  80. package/sidecar/dist/agent/tool-kinds.js +2 -1
  81. package/sidecar/dist/agent/tool-kinds.js.map +1 -1
  82. package/sidecar/dist/constants/builder.d.ts +7 -1
  83. package/sidecar/dist/constants/builder.js +10 -0
  84. package/sidecar/dist/constants/builder.js.map +1 -1
  85. package/sidecar/dist/constants/chatgpt.d.ts +39 -0
  86. package/sidecar/dist/constants/chatgpt.js +55 -0
  87. package/sidecar/dist/constants/chatgpt.js.map +1 -0
  88. package/sidecar/dist/constants/codex.d.ts +4 -5
  89. package/sidecar/dist/constants/codex.js +4 -5
  90. package/sidecar/dist/constants/codex.js.map +1 -1
  91. package/sidecar/dist/constants/database.d.ts +11 -0
  92. package/sidecar/dist/constants/database.js +17 -0
  93. package/sidecar/dist/constants/database.js.map +1 -0
  94. package/sidecar/dist/constants/http.d.ts +3 -0
  95. package/sidecar/dist/constants/http.js +3 -0
  96. package/sidecar/dist/constants/http.js.map +1 -1
  97. package/sidecar/dist/constants/mcp.js +2 -0
  98. package/sidecar/dist/constants/mcp.js.map +1 -1
  99. package/sidecar/dist/constants/providers.d.ts +1 -1
  100. package/sidecar/dist/constants/providers.js +1 -1
  101. package/sidecar/dist/constants/providers.js.map +1 -1
  102. package/sidecar/dist/constants/tool-kinds.d.ts +1 -0
  103. package/sidecar/dist/constants/tool-kinds.js +7 -0
  104. package/sidecar/dist/constants/tool-kinds.js.map +1 -1
  105. package/sidecar/dist/database/database-client.d.ts +11 -0
  106. package/sidecar/dist/database/database-client.js +50 -0
  107. package/sidecar/dist/database/database-client.js.map +1 -0
  108. package/sidecar/dist/index.js +6 -0
  109. package/sidecar/dist/index.js.map +1 -1
  110. package/sidecar/dist/mcp/tool-definitions.js +2 -0
  111. package/sidecar/dist/mcp/tool-definitions.js.map +1 -1
  112. package/sidecar/dist/mcp/tools/builder-gate.js +3 -1
  113. package/sidecar/dist/mcp/tools/builder-gate.js.map +1 -1
  114. package/sidecar/dist/mcp/tools/builder-project.d.ts +8 -0
  115. package/sidecar/dist/mcp/tools/builder-project.js +181 -0
  116. package/sidecar/dist/mcp/tools/builder-project.js.map +1 -0
  117. package/sidecar/dist/mcp/tools/builder.d.ts +5 -2
  118. package/sidecar/dist/mcp/tools/builder.js +5 -11
  119. package/sidecar/dist/mcp/tools/builder.js.map +1 -1
  120. package/sidecar/dist/mcp/tools/database.d.ts +6 -0
  121. package/sidecar/dist/mcp/tools/database.js +42 -0
  122. package/sidecar/dist/mcp/tools/database.js.map +1 -0
  123. package/sidecar/dist/mcp/types.d.ts +2 -0
  124. package/sidecar/dist/metrics/aggregate.js +29 -7
  125. package/sidecar/dist/metrics/aggregate.js.map +1 -1
  126. package/sidecar/dist/metrics/types.d.ts +2 -0
  127. package/sidecar/dist/providers/claude/safe-mode.js +11 -1
  128. package/sidecar/dist/providers/claude/safe-mode.js.map +1 -1
  129. package/sidecar/dist/providers/codex/chatgpt/credentials.d.ts +10 -0
  130. package/sidecar/dist/providers/codex/chatgpt/credentials.js +63 -0
  131. package/sidecar/dist/providers/codex/chatgpt/credentials.js.map +1 -0
  132. package/sidecar/dist/providers/codex/chatgpt/http.d.ts +3 -0
  133. package/sidecar/dist/providers/codex/chatgpt/http.js +66 -0
  134. package/sidecar/dist/providers/codex/chatgpt/http.js.map +1 -0
  135. package/sidecar/dist/providers/codex/chatgpt/lock.d.ts +1 -0
  136. package/sidecar/dist/providers/codex/chatgpt/lock.js +58 -0
  137. package/sidecar/dist/providers/codex/chatgpt/lock.js.map +1 -0
  138. package/sidecar/dist/providers/codex/chatgpt/login.d.ts +8 -0
  139. package/sidecar/dist/providers/codex/chatgpt/login.js +138 -0
  140. package/sidecar/dist/providers/codex/chatgpt/login.js.map +1 -0
  141. package/sidecar/dist/providers/codex/chatgpt/oauth.d.ts +38 -0
  142. package/sidecar/dist/providers/codex/chatgpt/oauth.js +167 -0
  143. package/sidecar/dist/providers/codex/chatgpt/oauth.js.map +1 -0
  144. package/sidecar/dist/providers/codex/chatgpt/store.d.ts +21 -0
  145. package/sidecar/dist/providers/codex/chatgpt/store.js +75 -0
  146. package/sidecar/dist/providers/codex/chatgpt/store.js.map +1 -0
  147. package/sidecar/dist/providers/codex/config.d.ts +1 -5
  148. package/sidecar/dist/providers/codex/config.js +27 -4
  149. package/sidecar/dist/providers/codex/config.js.map +1 -1
  150. package/sidecar/dist/providers/codex/module.js +11 -4
  151. package/sidecar/dist/providers/codex/module.js.map +1 -1
  152. package/sidecar/dist/providers/codex/process.d.ts +1 -1
  153. package/sidecar/dist/providers/codex/process.js +7 -3
  154. package/sidecar/dist/providers/codex/process.js.map +1 -1
  155. package/sidecar/dist/providers/codex/provider.d.ts +0 -1
  156. package/sidecar/dist/providers/codex/provider.js +7 -5
  157. package/sidecar/dist/providers/codex/provider.js.map +1 -1
  158. package/sidecar/dist/server/http.js +38 -0
  159. package/sidecar/dist/server/http.js.map +1 -1
  160. package/sidecar/dist/server/permission-events.js +3 -1
  161. package/sidecar/dist/server/permission-events.js.map +1 -1
  162. package/sidecar/dist/server/raw-data.js +1 -1
  163. package/sidecar/dist/server/raw-data.js.map +1 -1
  164. package/sidecar/dist/server/safety-net.js +1 -1
  165. package/sidecar/dist/server/safety-net.js.map +1 -1
  166. package/skills/dms-ai/SKILL.md +2 -1
  167. package/skills/dms-external-database/REFERENCE.md +132 -0
  168. 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
- if (window.compareFromMs === undefined || window.compareToMs === undefined) {
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
- if (window.compareFromMs === undefined || window.compareToMs === undefined) {
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) => ({ id, value: counts.get(id) ?? 0 })),
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":"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"}
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;AAE3D,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,CAAC;AACtD,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"}
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,3 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ export declare const ACCESS_TOKEN_SECRET: string;
3
+ export declare function handleChatGptRequest(req: IncomingMessage, res: ServerResponse): Promise<boolean>;
@@ -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("&", "&amp;")
13
+ .replaceAll("<", "&lt;")
14
+ .replaceAll(">", "&gt;")
15
+ .replaceAll('"', "&quot;");
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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"}