@aexol/spectral 0.9.229 → 0.9.231

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 (189) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/dist/auth-helper.d.ts.map +1 -1
  3. package/dist/auth-helper.js +14 -8
  4. package/dist/commands/login.d.ts +12 -4
  5. package/dist/commands/login.d.ts.map +1 -1
  6. package/dist/commands/login.js +36 -15
  7. package/dist/commands/serve.d.ts.map +1 -1
  8. package/dist/commands/serve.js +3 -0
  9. package/dist/config.d.ts +15 -0
  10. package/dist/config.d.ts.map +1 -1
  11. package/dist/config.js +10 -1
  12. package/dist/designer/data/skills/blog-post.d.ts +3 -0
  13. package/dist/designer/data/skills/blog-post.d.ts.map +1 -0
  14. package/dist/designer/data/skills/blog-post.js +84 -0
  15. package/dist/designer/data/skills/blog-post.ts +87 -0
  16. package/dist/designer/data/skills/critique.d.ts +3 -0
  17. package/dist/designer/data/skills/critique.d.ts.map +1 -0
  18. package/dist/designer/data/skills/critique.js +109 -0
  19. package/dist/designer/data/skills/critique.ts +112 -0
  20. package/dist/designer/data/skills/dashboard.d.ts +3 -0
  21. package/dist/designer/data/skills/dashboard.d.ts.map +1 -0
  22. package/dist/designer/data/skills/dashboard.js +165 -0
  23. package/dist/designer/data/skills/dashboard.ts +168 -0
  24. package/dist/designer/data/skills/design-brief.d.ts +3 -0
  25. package/dist/designer/data/skills/design-brief.d.ts.map +1 -0
  26. package/dist/designer/data/skills/design-brief.js +141 -0
  27. package/dist/designer/data/skills/design-brief.ts +144 -0
  28. package/dist/designer/data/skills/design-skill.d.ts +10 -0
  29. package/dist/designer/data/skills/design-skill.d.ts.map +1 -0
  30. package/dist/designer/data/skills/design-skill.js +1 -0
  31. package/dist/designer/data/skills/design-skill.ts +9 -0
  32. package/dist/designer/data/skills/docs-page.d.ts +3 -0
  33. package/dist/designer/data/skills/docs-page.d.ts.map +1 -0
  34. package/dist/designer/data/skills/docs-page.js +68 -0
  35. package/dist/designer/data/skills/docs-page.ts +71 -0
  36. package/dist/designer/data/skills/index.d.ts +3 -0
  37. package/dist/designer/data/skills/index.d.ts.map +1 -0
  38. package/dist/designer/data/skills/index.js +28 -0
  39. package/dist/designer/data/skills/index.ts +30 -0
  40. package/dist/designer/data/skills/magazine-poster.d.ts +3 -0
  41. package/dist/designer/data/skills/magazine-poster.d.ts.map +1 -0
  42. package/dist/designer/data/skills/magazine-poster.js +70 -0
  43. package/dist/designer/data/skills/magazine-poster.ts +73 -0
  44. package/dist/designer/data/skills/mobile-app.d.ts +3 -0
  45. package/dist/designer/data/skills/mobile-app.d.ts.map +1 -0
  46. package/dist/designer/data/skills/mobile-app.js +229 -0
  47. package/dist/designer/data/skills/mobile-app.ts +232 -0
  48. package/dist/designer/data/skills/motion-frames.d.ts +3 -0
  49. package/dist/designer/data/skills/motion-frames.d.ts.map +1 -0
  50. package/dist/designer/data/skills/motion-frames.js +121 -0
  51. package/dist/designer/data/skills/motion-frames.ts +124 -0
  52. package/dist/designer/data/skills/pricing-page.d.ts +3 -0
  53. package/dist/designer/data/skills/pricing-page.d.ts.map +1 -0
  54. package/dist/designer/data/skills/pricing-page.js +76 -0
  55. package/dist/designer/data/skills/pricing-page.ts +79 -0
  56. package/dist/designer/data/skills/saas-landing.d.ts +3 -0
  57. package/dist/designer/data/skills/saas-landing.d.ts.map +1 -0
  58. package/dist/designer/data/skills/saas-landing.js +71 -0
  59. package/dist/designer/data/skills/saas-landing.ts +74 -0
  60. package/dist/designer/data/skills/slide-deck.d.ts +3 -0
  61. package/dist/designer/data/skills/slide-deck.d.ts.map +1 -0
  62. package/dist/designer/data/skills/slide-deck.js +213 -0
  63. package/dist/designer/data/skills/slide-deck.ts +216 -0
  64. package/dist/designer/data/skills/social-carousel.d.ts +3 -0
  65. package/dist/designer/data/skills/social-carousel.d.ts.map +1 -0
  66. package/dist/designer/data/skills/social-carousel.js +135 -0
  67. package/dist/designer/data/skills/social-carousel.ts +138 -0
  68. package/dist/designer/data/skills/web-prototype.d.ts +3 -0
  69. package/dist/designer/data/skills/web-prototype.d.ts.map +1 -0
  70. package/dist/designer/data/skills/web-prototype.js +159 -0
  71. package/dist/designer/data/skills/web-prototype.ts +162 -0
  72. package/dist/designer/skills.d.ts +4 -10
  73. package/dist/designer/skills.d.ts.map +1 -1
  74. package/dist/designer/skills.js +2 -1643
  75. package/dist/extensions/wizard/index.js +9 -1
  76. package/dist/generated/parser/ast/nodes.d.ts +115 -0
  77. package/dist/generated/parser/ast/nodes.d.ts.map +1 -0
  78. package/dist/generated/parser/ast/nodes.js +8 -0
  79. package/dist/generated/parser/lexer/lexer.d.ts +28 -0
  80. package/dist/generated/parser/lexer/lexer.d.ts.map +1 -0
  81. package/dist/generated/parser/{lexer.js → lexer/lexer.js} +1 -180
  82. package/dist/generated/parser/{lexer.d.ts → lexer/tokens.d.ts} +5 -24
  83. package/dist/generated/parser/lexer/tokens.d.ts.map +1 -0
  84. package/dist/generated/parser/lexer/tokens.js +187 -0
  85. package/dist/generated/parser/mod.d.ts +5 -7
  86. package/dist/generated/parser/mod.d.ts.map +1 -1
  87. package/dist/generated/parser/mod.js +2 -1
  88. package/dist/generated/parser/parser/cursor.d.ts +47 -0
  89. package/dist/generated/parser/parser/cursor.d.ts.map +1 -0
  90. package/dist/generated/parser/parser/cursor.js +12 -0
  91. package/dist/generated/parser/parser/definitions.d.ts +16 -0
  92. package/dist/generated/parser/parser/definitions.d.ts.map +1 -0
  93. package/dist/generated/parser/parser/definitions.js +353 -0
  94. package/dist/generated/parser/parser/expressions.d.ts +17 -0
  95. package/dist/generated/parser/parser/expressions.d.ts.map +1 -0
  96. package/dist/generated/parser/parser/expressions.js +165 -0
  97. package/dist/generated/parser/parser.d.ts +18 -133
  98. package/dist/generated/parser/parser.d.ts.map +1 -1
  99. package/dist/generated/parser/parser.js +9 -505
  100. package/dist/generated/parser/tokenizer.d.ts +1 -2
  101. package/dist/generated/parser/tokenizer.d.ts.map +1 -1
  102. package/dist/generated/parser/tokenizer.js +2 -1
  103. package/dist/generated/parser/validator.d.ts +1 -1
  104. package/dist/generated/parser/validator.d.ts.map +1 -1
  105. package/dist/generated/zeus/const.d.ts.map +1 -1
  106. package/dist/generated/zeus/const.js +21 -0
  107. package/dist/generated/zeus/index.d.ts +98 -0
  108. package/dist/generated/zeus/index.d.ts.map +1 -1
  109. package/dist/mcp/glimpse-ui.js +9 -1
  110. package/dist/relay/dispatcher.d.ts +11 -104
  111. package/dist/relay/dispatcher.d.ts.map +1 -1
  112. package/dist/relay/dispatcher.js +10 -1130
  113. package/dist/relay/registration.d.ts +10 -2
  114. package/dist/relay/registration.d.ts.map +1 -1
  115. package/dist/relay/registration.js +32 -3
  116. package/dist/relay/rest.d.ts +31 -0
  117. package/dist/relay/rest.d.ts.map +1 -0
  118. package/dist/relay/rest.js +85 -0
  119. package/dist/relay/routing.d.ts +109 -0
  120. package/dist/relay/routing.d.ts.map +1 -0
  121. package/dist/relay/routing.js +669 -0
  122. package/dist/relay/wizard-login.d.ts +17 -0
  123. package/dist/relay/wizard-login.d.ts.map +1 -0
  124. package/dist/relay/wizard-login.js +419 -0
  125. package/dist/sdk/agent-core/agent-loop.d.ts +2 -9
  126. package/dist/sdk/agent-core/agent-loop.d.ts.map +1 -1
  127. package/dist/sdk/agent-core/agent-loop.js +4 -288
  128. package/dist/sdk/agent-core/tool-execution.d.ts +33 -0
  129. package/dist/sdk/agent-core/tool-execution.d.ts.map +1 -0
  130. package/dist/sdk/agent-core/tool-execution.js +300 -0
  131. package/dist/sdk/ai/env-api-keys.js +9 -1
  132. package/dist/sdk/ai/providers/openai/reasoning-replay.d.ts +48 -0
  133. package/dist/sdk/ai/providers/openai/reasoning-replay.d.ts.map +1 -0
  134. package/dist/sdk/ai/providers/openai/reasoning-replay.js +209 -0
  135. package/dist/sdk/ai/providers/openai-completions.d.ts.map +1 -1
  136. package/dist/sdk/ai/providers/openai-completions.js +1 -203
  137. package/dist/sdk/coding-agent/core/compaction/compaction.d.ts +6 -118
  138. package/dist/sdk/coding-agent/core/compaction/compaction.d.ts.map +1 -1
  139. package/dist/sdk/coding-agent/core/compaction/compaction.js +11 -733
  140. package/dist/sdk/coding-agent/core/compaction/cut-points.d.ts +58 -0
  141. package/dist/sdk/coding-agent/core/compaction/cut-points.d.ts.map +1 -0
  142. package/dist/sdk/coding-agent/core/compaction/cut-points.js +191 -0
  143. package/dist/sdk/coding-agent/core/compaction/dedupe.d.ts +28 -0
  144. package/dist/sdk/coding-agent/core/compaction/dedupe.d.ts.map +1 -0
  145. package/dist/sdk/coding-agent/core/compaction/dedupe.js +156 -0
  146. package/dist/sdk/coding-agent/core/compaction/summarize.d.ts +21 -0
  147. package/dist/sdk/coding-agent/core/compaction/summarize.d.ts.map +1 -0
  148. package/dist/sdk/coding-agent/core/compaction/summarize.js +181 -0
  149. package/dist/sdk/coding-agent/core/compaction/tokens.d.ts +47 -0
  150. package/dist/sdk/coding-agent/core/compaction/tokens.d.ts.map +1 -0
  151. package/dist/sdk/coding-agent/core/compaction/tokens.js +224 -0
  152. package/dist/sdk/coding-agent/core/extensions/session-events.d.ts +157 -0
  153. package/dist/sdk/coding-agent/core/extensions/session-events.d.ts.map +1 -0
  154. package/dist/sdk/coding-agent/core/extensions/session-events.js +13 -0
  155. package/dist/sdk/coding-agent/core/extensions/types.d.ts +6 -365
  156. package/dist/sdk/coding-agent/core/extensions/types.d.ts.map +1 -1
  157. package/dist/sdk/coding-agent/core/extensions/types.js +2 -10
  158. package/dist/sdk/coding-agent/core/extensions/ui-types.d.ts +219 -0
  159. package/dist/sdk/coding-agent/core/extensions/ui-types.d.ts.map +1 -0
  160. package/dist/sdk/coding-agent/core/extensions/ui-types.js +4 -0
  161. package/dist/sdk/coding-agent/core/package/default-package-manager.d.ts +115 -0
  162. package/dist/sdk/coding-agent/core/package/default-package-manager.d.ts.map +1 -0
  163. package/dist/sdk/coding-agent/core/package/default-package-manager.js +1184 -0
  164. package/dist/sdk/coding-agent/core/package/discovery.d.ts +20 -0
  165. package/dist/sdk/coding-agent/core/package/discovery.d.ts.map +1 -0
  166. package/dist/sdk/coding-agent/core/package/discovery.js +283 -0
  167. package/dist/sdk/coding-agent/core/package/ignore.d.ts +29 -0
  168. package/dist/sdk/coding-agent/core/package/ignore.d.ts.map +1 -0
  169. package/dist/sdk/coding-agent/core/package/ignore.js +235 -0
  170. package/dist/sdk/coding-agent/core/package/types.d.ts +128 -0
  171. package/dist/sdk/coding-agent/core/package/types.d.ts.map +1 -0
  172. package/dist/sdk/coding-agent/core/package/types.js +18 -0
  173. package/dist/sdk/coding-agent/core/package/update-check.d.ts +43 -0
  174. package/dist/sdk/coding-agent/core/package/update-check.d.ts.map +1 -0
  175. package/dist/sdk/coding-agent/core/package/update-check.js +253 -0
  176. package/dist/sdk/coding-agent/core/package-manager.d.ts +2 -188
  177. package/dist/sdk/coding-agent/core/package-manager.d.ts.map +1 -1
  178. package/dist/sdk/coding-agent/core/package-manager.js +1 -1940
  179. package/dist/sdk/coding-agent/core/session/migrate.d.ts +18 -0
  180. package/dist/sdk/coding-agent/core/session/migrate.d.ts.map +1 -0
  181. package/dist/sdk/coding-agent/core/session/migrate.js +78 -0
  182. package/dist/sdk/coding-agent/core/session/types.d.ts +165 -0
  183. package/dist/sdk/coding-agent/core/session/types.d.ts.map +1 -0
  184. package/dist/sdk/coding-agent/core/session/types.js +4 -0
  185. package/dist/sdk/coding-agent/core/session-manager.d.ts +3 -161
  186. package/dist/sdk/coding-agent/core/session-manager.d.ts.map +1 -1
  187. package/dist/sdk/coding-agent/core/session-manager.js +4 -72
  188. package/package.json +2 -2
  189. package/dist/generated/parser/lexer.d.ts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wizard-login.d.ts","sourceRoot":"","sources":["../../src/relay/wizard-login.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EACF,YAAY,GACZ,oBAAoB,GACpB,SAAS,GACT,WAAW,GACX,iBAAiB,GACjB,qBAAqB,GACrB,cAAc,GACd,QAAQ,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAuUD,wBAAsB,gBAAgB,CAAC,SAAS,SAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAuBxF"}
@@ -0,0 +1,419 @@
1
+ /**
2
+ * Wizard login flow (CLI side).
3
+ *
4
+ * Starts the `@aexol/wizard-spectral` login subprocess on behalf of
5
+ * `POST /api/wizard/login` (routed by `relay/routing.ts`). Extracted from
6
+ * `relay/dispatcher.ts` — the dispatcher re-exports `startWizardLogin` and
7
+ * `WizardLoginResult` so existing imports keep working.
8
+ */
9
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
10
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
11
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
12
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
13
+ });
14
+ }
15
+ return path;
16
+ };
17
+ import { spawn } from "node:child_process";
18
+ import { existsSync, readFileSync } from "node:fs";
19
+ import { createRequire } from "node:module";
20
+ import { homedir } from "node:os";
21
+ import { dirname, isAbsolute, join } from "node:path";
22
+ const WIZARD_PACKAGE_NAME = "@aexol/wizard-spectral";
23
+ const WIZARD_CLI_BIN_NAME = "spectral-wizard";
24
+ const WIZARD_LOGIN_STARTUP_TIMEOUT_MS = 5_000;
25
+ const requireForWizard = createRequire(import.meta.url);
26
+ let activeWizardLoginRun = null;
27
+ let activeWizardLoginStartPromise = null;
28
+ function getActiveWizardLoginRun() {
29
+ const run = activeWizardLoginRun;
30
+ if (!run)
31
+ return null;
32
+ if (run.child.exitCode !== null || run.child.killed) {
33
+ activeWizardLoginRun = null;
34
+ return null;
35
+ }
36
+ return run;
37
+ }
38
+ function toSafeErrorMessage(error) {
39
+ if (error instanceof Error)
40
+ return error.message;
41
+ if (typeof error === "string")
42
+ return error;
43
+ return "Unknown error";
44
+ }
45
+ function asRecord(value) {
46
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
47
+ return null;
48
+ }
49
+ return value;
50
+ }
51
+ function findWizardPackageJsonFromEntry(entryPath) {
52
+ let current = dirname(entryPath);
53
+ for (let depth = 0; depth < 8; depth += 1) {
54
+ const candidate = join(current, "package.json");
55
+ if (existsSync(candidate)) {
56
+ try {
57
+ const packageJson = JSON.parse(readFileSync(candidate, "utf8"));
58
+ if (asRecord(packageJson)?.name === WIZARD_PACKAGE_NAME)
59
+ return candidate;
60
+ }
61
+ catch {
62
+ // Keep walking upward; malformed metadata is handled by the final reader.
63
+ }
64
+ }
65
+ const parent = dirname(current);
66
+ if (parent === current)
67
+ break;
68
+ current = parent;
69
+ }
70
+ return undefined;
71
+ }
72
+ function resolveWizardPackageJsonPath() {
73
+ try {
74
+ return { ok: true, path: requireForWizard.resolve(`${WIZARD_PACKAGE_NAME}/package.json`) };
75
+ }
76
+ catch (error) {
77
+ try {
78
+ const entryPath = requireForWizard.resolve(WIZARD_PACKAGE_NAME);
79
+ const packageJsonPath = findWizardPackageJsonFromEntry(entryPath);
80
+ if (packageJsonPath)
81
+ return { ok: true, path: packageJsonPath };
82
+ }
83
+ catch {
84
+ // Fall through to the original package-unavailable message.
85
+ }
86
+ return {
87
+ ok: false,
88
+ message: `${WIZARD_PACKAGE_NAME} is not available on this machine: ${toSafeErrorMessage(error)}`,
89
+ };
90
+ }
91
+ }
92
+ function readWizardPackageJson(packageJsonPath) {
93
+ try {
94
+ return { ok: true, json: JSON.parse(readFileSync(packageJsonPath, "utf8")) };
95
+ }
96
+ catch (error) {
97
+ return {
98
+ ok: false,
99
+ message: `Could not read ${WIZARD_PACKAGE_NAME} package metadata: ${toSafeErrorMessage(error)}`,
100
+ };
101
+ }
102
+ }
103
+ function getWizardBinRelativePath(packageJson) {
104
+ const pkg = asRecord(packageJson);
105
+ const bin = pkg?.bin;
106
+ if (typeof bin === "string" && bin.trim())
107
+ return bin;
108
+ const binRecord = asRecord(bin);
109
+ const namedBin = binRecord?.[WIZARD_CLI_BIN_NAME];
110
+ return typeof namedBin === "string" && namedBin.trim() ? namedBin : undefined;
111
+ }
112
+ function findWindowsBinShim(packageRoot) {
113
+ let current = packageRoot;
114
+ for (let depth = 0; depth < 8; depth += 1) {
115
+ const candidate = join(current, "node_modules", ".bin", `${WIZARD_CLI_BIN_NAME}.cmd`);
116
+ if (existsSync(candidate))
117
+ return candidate;
118
+ const parent = dirname(current);
119
+ if (parent === current)
120
+ break;
121
+ current = parent;
122
+ }
123
+ return undefined;
124
+ }
125
+ function resolveWizardBinCommand() {
126
+ const packageJsonPath = resolveWizardPackageJsonPath();
127
+ if (!packageJsonPath.ok)
128
+ return packageJsonPath;
129
+ const packageJson = readWizardPackageJson(packageJsonPath.path);
130
+ if (!packageJson.ok)
131
+ return packageJson;
132
+ const binRelativePath = getWizardBinRelativePath(packageJson.json);
133
+ if (!binRelativePath) {
134
+ return {
135
+ ok: false,
136
+ message: `${WIZARD_PACKAGE_NAME} is installed but does not expose a ${WIZARD_CLI_BIN_NAME} bin.`,
137
+ };
138
+ }
139
+ const packageRoot = dirname(packageJsonPath.path);
140
+ const packageBinPath = isAbsolute(binRelativePath)
141
+ ? binRelativePath
142
+ : join(packageRoot, binRelativePath);
143
+ if (process.platform === "win32") {
144
+ const cmdShim = findWindowsBinShim(packageRoot);
145
+ if (cmdShim) {
146
+ return {
147
+ ok: true,
148
+ bin: { command: cmdShim, argsPrefix: [] },
149
+ };
150
+ }
151
+ }
152
+ return {
153
+ ok: true,
154
+ bin: { command: packageBinPath, argsPrefix: [] },
155
+ };
156
+ }
157
+ function collectWizardTools(value) {
158
+ if (Array.isArray(value))
159
+ return value;
160
+ const record = asRecord(value);
161
+ const tools = record?.tools;
162
+ return Array.isArray(tools) ? tools : [];
163
+ }
164
+ function findWizardStatusTool(tools) {
165
+ for (const tool of tools) {
166
+ const record = asRecord(tool);
167
+ if (record?.name !== "wizard_status" || typeof record.execute !== "function") {
168
+ continue;
169
+ }
170
+ return {
171
+ execute: record.execute,
172
+ };
173
+ }
174
+ return null;
175
+ }
176
+ function normalizeWizardAuthStatus(value) {
177
+ const normalized = value.trim().toLowerCase().replace(/[\s-]+/g, "_");
178
+ if (normalized === "configured" ||
179
+ normalized === "authenticated" ||
180
+ normalized === "ready" ||
181
+ normalized === "ok" ||
182
+ normalized === "connected") {
183
+ return "configured";
184
+ }
185
+ if (normalized === "missing_auth" ||
186
+ normalized === "auth_missing" ||
187
+ normalized === "needs_auth" ||
188
+ normalized === "not_authenticated" ||
189
+ normalized === "unauthenticated" ||
190
+ normalized === "not_configured") {
191
+ return "missing_auth";
192
+ }
193
+ return "unknown";
194
+ }
195
+ function parseWizardAuthStatusFromObject(record) {
196
+ for (const key of ["status", "authStatus", "state"]) {
197
+ const raw = record[key];
198
+ if (typeof raw !== "string")
199
+ continue;
200
+ const status = normalizeWizardAuthStatus(raw);
201
+ if (status !== "unknown")
202
+ return status;
203
+ }
204
+ for (const key of ["configured", "authenticated", "isAuthenticated", "hasAuth"]) {
205
+ const raw = record[key];
206
+ if (typeof raw === "boolean")
207
+ return raw ? "configured" : "missing_auth";
208
+ }
209
+ return "unknown";
210
+ }
211
+ function parseWizardAuthStatus(statusOutput) {
212
+ const candidates = [statusOutput];
213
+ const outputRecord = asRecord(statusOutput);
214
+ if (outputRecord) {
215
+ candidates.push(outputRecord.details, outputRecord.data, outputRecord.result);
216
+ }
217
+ for (const candidate of candidates) {
218
+ const record = asRecord(candidate);
219
+ if (!record)
220
+ continue;
221
+ const status = parseWizardAuthStatusFromObject(record);
222
+ if (status !== "unknown")
223
+ return status;
224
+ }
225
+ return "unknown";
226
+ }
227
+ async function checkWizardAuthStatus(directory) {
228
+ let importedModule;
229
+ try {
230
+ importedModule = await import(__rewriteRelativeImportExtension(WIZARD_PACKAGE_NAME));
231
+ }
232
+ catch (error) {
233
+ return {
234
+ status: "package_unavailable",
235
+ message: `${WIZARD_PACKAGE_NAME} is not available on this machine: ${toSafeErrorMessage(error)}`,
236
+ };
237
+ }
238
+ const buildSpectralTools = asRecord(importedModule)?.buildSpectralTools;
239
+ if (typeof buildSpectralTools !== "function") {
240
+ return {
241
+ status: "unknown",
242
+ message: "Wizard status API is unavailable; starting login.",
243
+ };
244
+ }
245
+ try {
246
+ const tools = collectWizardTools(await buildSpectralTools());
247
+ const statusTool = findWizardStatusTool(tools);
248
+ if (!statusTool) {
249
+ return {
250
+ status: "unknown",
251
+ message: "Wizard status tool is unavailable; starting login.",
252
+ };
253
+ }
254
+ const status = parseWizardAuthStatus(await statusTool.execute("wizard-ui-login-status", { directory }));
255
+ return {
256
+ status,
257
+ message: status === "configured"
258
+ ? "Wizard is already authenticated."
259
+ : "Wizard authentication is missing; starting login.",
260
+ };
261
+ }
262
+ catch (error) {
263
+ return {
264
+ status: "unknown",
265
+ message: `Could not check Wizard auth status; starting login: ${toSafeErrorMessage(error)}`,
266
+ };
267
+ }
268
+ }
269
+ function wizardLoginResult(status, message, run) {
270
+ return {
271
+ status,
272
+ packageName: WIZARD_PACKAGE_NAME,
273
+ message,
274
+ loginUrl: run?.loginUrl,
275
+ startedAt: run?.startedAt,
276
+ };
277
+ }
278
+ function extractLoginUrl(text) {
279
+ const matches = text.match(/https?:\/\/[^\s"'<>]+/g) ?? [];
280
+ for (const raw of matches) {
281
+ const candidate = raw.replace(/[),.;]+$/, "");
282
+ if (isSafeLoginUrl(candidate))
283
+ return candidate;
284
+ }
285
+ return undefined;
286
+ }
287
+ function isSafeLoginUrl(value) {
288
+ try {
289
+ const url = new URL(value);
290
+ if (url.protocol !== "https:" && url.protocol !== "http:")
291
+ return false;
292
+ const forbiddenQueryKeys = new Set([
293
+ "access_token",
294
+ "id_token",
295
+ "refresh_token",
296
+ "token",
297
+ "jwt",
298
+ "code",
299
+ ]);
300
+ for (const key of url.searchParams.keys()) {
301
+ if (forbiddenQueryKeys.has(key.toLowerCase()))
302
+ return false;
303
+ }
304
+ if (/(^|[#&])(access_token|id_token|refresh_token|token|jwt|code)=/i.test(url.hash)) {
305
+ return false;
306
+ }
307
+ return true;
308
+ }
309
+ catch {
310
+ return false;
311
+ }
312
+ }
313
+ export async function startWizardLogin(directory = homedir()) {
314
+ const existing = getActiveWizardLoginRun();
315
+ if (existing) {
316
+ return wizardLoginResult("already_running", existing.loginUrl
317
+ ? "Wizard login is already running. Complete the browser flow."
318
+ : "Wizard login is already running. Complete the browser flow if it has opened.", existing);
319
+ }
320
+ if (activeWizardLoginStartPromise)
321
+ return await activeWizardLoginStartPromise;
322
+ const startPromise = startWizardLoginInternal(directory);
323
+ activeWizardLoginStartPromise = startPromise;
324
+ try {
325
+ return await startPromise;
326
+ }
327
+ finally {
328
+ if (activeWizardLoginStartPromise === startPromise) {
329
+ activeWizardLoginStartPromise = null;
330
+ }
331
+ }
332
+ }
333
+ async function startWizardLoginInternal(directory) {
334
+ const authStatus = await checkWizardAuthStatus(directory);
335
+ if (authStatus.status === "configured") {
336
+ return {
337
+ status: "configured",
338
+ packageName: WIZARD_PACKAGE_NAME,
339
+ message: "Wizard is already authenticated; no login needed.",
340
+ };
341
+ }
342
+ if (authStatus.status === "package_unavailable") {
343
+ return {
344
+ status: "package_unavailable",
345
+ packageName: WIZARD_PACKAGE_NAME,
346
+ message: authStatus.message,
347
+ };
348
+ }
349
+ const existing = getActiveWizardLoginRun();
350
+ if (existing) {
351
+ return wizardLoginResult("already_running", existing.loginUrl
352
+ ? "Wizard login is already running. Complete the browser flow."
353
+ : "Wizard login is already running. Complete the browser flow if it has opened.", existing);
354
+ }
355
+ const bin = resolveWizardBinCommand();
356
+ if (!bin.ok) {
357
+ return {
358
+ status: "package_unavailable",
359
+ packageName: WIZARD_PACKAGE_NAME,
360
+ message: bin.message,
361
+ };
362
+ }
363
+ const child = spawn(bin.bin.command, [...bin.bin.argsPrefix, "login"], {
364
+ stdio: ["ignore", "pipe", "pipe"],
365
+ env: process.env,
366
+ cwd: directory,
367
+ });
368
+ const run = { child, startedAt: Date.now() };
369
+ activeWizardLoginRun = run;
370
+ return await new Promise((resolve) => {
371
+ let settled = false;
372
+ let timeout;
373
+ const finish = (result) => {
374
+ if (settled)
375
+ return;
376
+ settled = true;
377
+ clearTimeout(timeout);
378
+ resolve(result);
379
+ };
380
+ const onData = (chunk) => {
381
+ if (run.loginUrl)
382
+ return;
383
+ const loginUrl = extractLoginUrl(chunk.toString("utf8"));
384
+ if (!loginUrl)
385
+ return;
386
+ run.loginUrl = loginUrl;
387
+ finish(wizardLoginResult("login_url_observed", "Wizard login started. Complete the browser flow to finish authentication.", run));
388
+ };
389
+ const onError = (error) => {
390
+ if (activeWizardLoginRun === run)
391
+ activeWizardLoginRun = null;
392
+ child.stdout?.off("data", onData);
393
+ child.stderr?.off("data", onData);
394
+ finish({
395
+ status: "spawn_failed",
396
+ packageName: WIZARD_PACKAGE_NAME,
397
+ message: `Could not start Wizard login: ${toSafeErrorMessage(error)}`,
398
+ });
399
+ };
400
+ const onExit = (code, signal) => {
401
+ if (activeWizardLoginRun === run)
402
+ activeWizardLoginRun = null;
403
+ child.stdout?.off("data", onData);
404
+ child.stderr?.off("data", onData);
405
+ const exitLabel = signal ? `signal ${signal}` : `code ${code ?? "unknown"}`;
406
+ const completed = code === 0 && signal === null;
407
+ finish(wizardLoginResult(completed ? "completed" : "exited", completed
408
+ ? "Wizard login completed."
409
+ : `Wizard login exited before emitting a login URL (${exitLabel}).`, run));
410
+ };
411
+ timeout = setTimeout(() => {
412
+ finish(wizardLoginResult("started", "Wizard login started. Complete the browser flow if it has opened.", run));
413
+ }, WIZARD_LOGIN_STARTUP_TIMEOUT_MS);
414
+ child.stdout?.on("data", onData);
415
+ child.stderr?.on("data", onData);
416
+ child.once("error", onError);
417
+ child.once("exit", onExit);
418
+ });
419
+ }
@@ -3,7 +3,8 @@
3
3
  * Transforms to Message[] only at the LLM call boundary.
4
4
  */
5
5
  import { EventStream } from "../ai/index.js";
6
- import type { AgentContext, AgentEvent, AgentLoopConfig, AgentMessage, AgentTool, AgentToolCall, StreamFn } from "./types.js";
6
+ import type { AgentContext, AgentEvent, AgentLoopConfig, AgentMessage, StreamFn } from "./types.js";
7
+ export { hasMissingRequiredArguments } from "./tool-execution.js";
7
8
  export type AgentEventSink = (event: AgentEvent) => Promise<void> | void;
8
9
  /**
9
10
  * Start an agent loop with a new prompt message.
@@ -21,12 +22,4 @@ export declare function agentLoop(prompts: AgentMessage[], context: AgentContext
21
22
  export declare function agentLoopContinue(context: AgentContext, config: AgentLoopConfig, signal?: AbortSignal, streamFn?: StreamFn): EventStream<AgentEvent, AgentMessage[]>;
22
23
  export declare function runAgentLoop(prompts: AgentMessage[], context: AgentContext, config: AgentLoopConfig, emit: AgentEventSink, signal?: AbortSignal, streamFn?: StreamFn): Promise<AgentMessage[]>;
23
24
  export declare function runAgentLoopContinue(context: AgentContext, config: AgentLoopConfig, emit: AgentEventSink, signal?: AbortSignal, streamFn?: StreamFn): Promise<AgentMessage[]>;
24
- /**
25
- * Detects whether a tool call is missing any required parameter, indicating the
26
- * provider truncated the response before the tool arguments were fully emitted.
27
- * Used together with `stopReason === "length"` to short-circuit tool validation
28
- * when a streamed tool call is incomplete (which would otherwise throw
29
- * `Validation failed ... You provided: {}`).
30
- */
31
- export declare function hasMissingRequiredArguments(tool: AgentTool<any>, toolCall: AgentToolCall): boolean;
32
25
  //# sourceMappingURL=agent-loop.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-loop.d.ts","sourceRoot":"","sources":["../../../src/sdk/agent-core/agent-loop.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAGL,WAAW,EAWZ,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EACV,eAAe,EACf,YAAY,EACZ,SAAS,EACT,aAAa,EAEb,QAAQ,EACT,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAiCzE;;;GAGG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,QAAQ,GAClB,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CA2BzC;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,QAAQ,GAClB,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CAkCzC;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,cAAc,EACpB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,QAAQ,GAClB,OAAO,CAAC,YAAY,EAAE,CAAC,CAgBzB;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,cAAc,EACpB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,QAAQ,GAClB,OAAO,CAAC,YAAY,EAAE,CAAC,CAiBzB;AAkyBD;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO,CAYlG"}
1
+ {"version":3,"file":"agent-loop.d.ts","sourceRoot":"","sources":["../../../src/sdk/agent-core/agent-loop.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAGL,WAAW,EAUZ,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EACV,eAAe,EACf,YAAY,EACZ,QAAQ,EACT,MAAM,YAAY,CAAC;AAKpB,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAElE,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAkCzE;;;GAGG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,QAAQ,GAClB,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CA2BzC;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,QAAQ,GAClB,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CAkCzC;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,cAAc,EACpB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,QAAQ,GAClB,OAAO,CAAC,YAAY,EAAE,CAAC,CAgBzB;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,cAAc,EACpB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,QAAQ,GAClB,OAAO,CAAC,YAAY,EAAE,CAAC,CAiBzB"}