@aexol/spectral 0.9.230 → 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.
- package/CHANGELOG.md +2 -0
- package/dist/designer/data/skills/blog-post.d.ts +3 -0
- package/dist/designer/data/skills/blog-post.d.ts.map +1 -0
- package/dist/designer/data/skills/blog-post.js +84 -0
- package/dist/designer/data/skills/blog-post.ts +87 -0
- package/dist/designer/data/skills/critique.d.ts +3 -0
- package/dist/designer/data/skills/critique.d.ts.map +1 -0
- package/dist/designer/data/skills/critique.js +109 -0
- package/dist/designer/data/skills/critique.ts +112 -0
- package/dist/designer/data/skills/dashboard.d.ts +3 -0
- package/dist/designer/data/skills/dashboard.d.ts.map +1 -0
- package/dist/designer/data/skills/dashboard.js +165 -0
- package/dist/designer/data/skills/dashboard.ts +168 -0
- package/dist/designer/data/skills/design-brief.d.ts +3 -0
- package/dist/designer/data/skills/design-brief.d.ts.map +1 -0
- package/dist/designer/data/skills/design-brief.js +141 -0
- package/dist/designer/data/skills/design-brief.ts +144 -0
- package/dist/designer/data/skills/design-skill.d.ts +10 -0
- package/dist/designer/data/skills/design-skill.d.ts.map +1 -0
- package/dist/designer/data/skills/design-skill.js +1 -0
- package/dist/designer/data/skills/design-skill.ts +9 -0
- package/dist/designer/data/skills/docs-page.d.ts +3 -0
- package/dist/designer/data/skills/docs-page.d.ts.map +1 -0
- package/dist/designer/data/skills/docs-page.js +68 -0
- package/dist/designer/data/skills/docs-page.ts +71 -0
- package/dist/designer/data/skills/index.d.ts +3 -0
- package/dist/designer/data/skills/index.d.ts.map +1 -0
- package/dist/designer/data/skills/index.js +28 -0
- package/dist/designer/data/skills/index.ts +30 -0
- package/dist/designer/data/skills/magazine-poster.d.ts +3 -0
- package/dist/designer/data/skills/magazine-poster.d.ts.map +1 -0
- package/dist/designer/data/skills/magazine-poster.js +70 -0
- package/dist/designer/data/skills/magazine-poster.ts +73 -0
- package/dist/designer/data/skills/mobile-app.d.ts +3 -0
- package/dist/designer/data/skills/mobile-app.d.ts.map +1 -0
- package/dist/designer/data/skills/mobile-app.js +229 -0
- package/dist/designer/data/skills/mobile-app.ts +232 -0
- package/dist/designer/data/skills/motion-frames.d.ts +3 -0
- package/dist/designer/data/skills/motion-frames.d.ts.map +1 -0
- package/dist/designer/data/skills/motion-frames.js +121 -0
- package/dist/designer/data/skills/motion-frames.ts +124 -0
- package/dist/designer/data/skills/pricing-page.d.ts +3 -0
- package/dist/designer/data/skills/pricing-page.d.ts.map +1 -0
- package/dist/designer/data/skills/pricing-page.js +76 -0
- package/dist/designer/data/skills/pricing-page.ts +79 -0
- package/dist/designer/data/skills/saas-landing.d.ts +3 -0
- package/dist/designer/data/skills/saas-landing.d.ts.map +1 -0
- package/dist/designer/data/skills/saas-landing.js +71 -0
- package/dist/designer/data/skills/saas-landing.ts +74 -0
- package/dist/designer/data/skills/slide-deck.d.ts +3 -0
- package/dist/designer/data/skills/slide-deck.d.ts.map +1 -0
- package/dist/designer/data/skills/slide-deck.js +213 -0
- package/dist/designer/data/skills/slide-deck.ts +216 -0
- package/dist/designer/data/skills/social-carousel.d.ts +3 -0
- package/dist/designer/data/skills/social-carousel.d.ts.map +1 -0
- package/dist/designer/data/skills/social-carousel.js +135 -0
- package/dist/designer/data/skills/social-carousel.ts +138 -0
- package/dist/designer/data/skills/web-prototype.d.ts +3 -0
- package/dist/designer/data/skills/web-prototype.d.ts.map +1 -0
- package/dist/designer/data/skills/web-prototype.js +159 -0
- package/dist/designer/data/skills/web-prototype.ts +162 -0
- package/dist/designer/skills.d.ts +4 -10
- package/dist/designer/skills.d.ts.map +1 -1
- package/dist/designer/skills.js +2 -1643
- package/dist/extensions/wizard/index.js +9 -1
- package/dist/generated/parser/ast/nodes.d.ts +115 -0
- package/dist/generated/parser/ast/nodes.d.ts.map +1 -0
- package/dist/generated/parser/ast/nodes.js +8 -0
- package/dist/generated/parser/lexer/lexer.d.ts +28 -0
- package/dist/generated/parser/lexer/lexer.d.ts.map +1 -0
- package/dist/generated/parser/{lexer.js → lexer/lexer.js} +1 -180
- package/dist/generated/parser/{lexer.d.ts → lexer/tokens.d.ts} +5 -24
- package/dist/generated/parser/lexer/tokens.d.ts.map +1 -0
- package/dist/generated/parser/lexer/tokens.js +187 -0
- package/dist/generated/parser/mod.d.ts +5 -7
- package/dist/generated/parser/mod.d.ts.map +1 -1
- package/dist/generated/parser/mod.js +2 -1
- package/dist/generated/parser/parser/cursor.d.ts +47 -0
- package/dist/generated/parser/parser/cursor.d.ts.map +1 -0
- package/dist/generated/parser/parser/cursor.js +12 -0
- package/dist/generated/parser/parser/definitions.d.ts +16 -0
- package/dist/generated/parser/parser/definitions.d.ts.map +1 -0
- package/dist/generated/parser/parser/definitions.js +353 -0
- package/dist/generated/parser/parser/expressions.d.ts +17 -0
- package/dist/generated/parser/parser/expressions.d.ts.map +1 -0
- package/dist/generated/parser/parser/expressions.js +165 -0
- package/dist/generated/parser/parser.d.ts +18 -133
- package/dist/generated/parser/parser.d.ts.map +1 -1
- package/dist/generated/parser/parser.js +9 -505
- package/dist/generated/parser/tokenizer.d.ts +1 -2
- package/dist/generated/parser/tokenizer.d.ts.map +1 -1
- package/dist/generated/parser/tokenizer.js +2 -1
- package/dist/generated/parser/validator.d.ts +1 -1
- package/dist/generated/parser/validator.d.ts.map +1 -1
- package/dist/mcp/glimpse-ui.js +9 -1
- package/dist/relay/dispatcher.d.ts +11 -104
- package/dist/relay/dispatcher.d.ts.map +1 -1
- package/dist/relay/dispatcher.js +10 -1130
- package/dist/relay/rest.d.ts +31 -0
- package/dist/relay/rest.d.ts.map +1 -0
- package/dist/relay/rest.js +85 -0
- package/dist/relay/routing.d.ts +109 -0
- package/dist/relay/routing.d.ts.map +1 -0
- package/dist/relay/routing.js +669 -0
- package/dist/relay/wizard-login.d.ts +17 -0
- package/dist/relay/wizard-login.d.ts.map +1 -0
- package/dist/relay/wizard-login.js +419 -0
- package/dist/sdk/agent-core/agent-loop.d.ts +2 -9
- package/dist/sdk/agent-core/agent-loop.d.ts.map +1 -1
- package/dist/sdk/agent-core/agent-loop.js +4 -288
- package/dist/sdk/agent-core/tool-execution.d.ts +33 -0
- package/dist/sdk/agent-core/tool-execution.d.ts.map +1 -0
- package/dist/sdk/agent-core/tool-execution.js +300 -0
- package/dist/sdk/ai/env-api-keys.js +9 -1
- package/dist/sdk/ai/providers/openai/reasoning-replay.d.ts +48 -0
- package/dist/sdk/ai/providers/openai/reasoning-replay.d.ts.map +1 -0
- package/dist/sdk/ai/providers/openai/reasoning-replay.js +209 -0
- package/dist/sdk/ai/providers/openai-completions.d.ts.map +1 -1
- package/dist/sdk/ai/providers/openai-completions.js +1 -203
- package/dist/sdk/coding-agent/core/compaction/compaction.d.ts +6 -118
- package/dist/sdk/coding-agent/core/compaction/compaction.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/compaction/compaction.js +11 -733
- package/dist/sdk/coding-agent/core/compaction/cut-points.d.ts +58 -0
- package/dist/sdk/coding-agent/core/compaction/cut-points.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/compaction/cut-points.js +191 -0
- package/dist/sdk/coding-agent/core/compaction/dedupe.d.ts +28 -0
- package/dist/sdk/coding-agent/core/compaction/dedupe.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/compaction/dedupe.js +156 -0
- package/dist/sdk/coding-agent/core/compaction/summarize.d.ts +21 -0
- package/dist/sdk/coding-agent/core/compaction/summarize.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/compaction/summarize.js +181 -0
- package/dist/sdk/coding-agent/core/compaction/tokens.d.ts +47 -0
- package/dist/sdk/coding-agent/core/compaction/tokens.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/compaction/tokens.js +224 -0
- package/dist/sdk/coding-agent/core/extensions/session-events.d.ts +157 -0
- package/dist/sdk/coding-agent/core/extensions/session-events.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/extensions/session-events.js +13 -0
- package/dist/sdk/coding-agent/core/extensions/types.d.ts +6 -365
- package/dist/sdk/coding-agent/core/extensions/types.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/extensions/types.js +2 -10
- package/dist/sdk/coding-agent/core/extensions/ui-types.d.ts +219 -0
- package/dist/sdk/coding-agent/core/extensions/ui-types.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/extensions/ui-types.js +4 -0
- package/dist/sdk/coding-agent/core/package/default-package-manager.d.ts +115 -0
- package/dist/sdk/coding-agent/core/package/default-package-manager.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/package/default-package-manager.js +1184 -0
- package/dist/sdk/coding-agent/core/package/discovery.d.ts +20 -0
- package/dist/sdk/coding-agent/core/package/discovery.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/package/discovery.js +283 -0
- package/dist/sdk/coding-agent/core/package/ignore.d.ts +29 -0
- package/dist/sdk/coding-agent/core/package/ignore.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/package/ignore.js +235 -0
- package/dist/sdk/coding-agent/core/package/types.d.ts +128 -0
- package/dist/sdk/coding-agent/core/package/types.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/package/types.js +18 -0
- package/dist/sdk/coding-agent/core/package/update-check.d.ts +43 -0
- package/dist/sdk/coding-agent/core/package/update-check.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/package/update-check.js +253 -0
- package/dist/sdk/coding-agent/core/package-manager.d.ts +2 -188
- package/dist/sdk/coding-agent/core/package-manager.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/package-manager.js +1 -1940
- package/dist/sdk/coding-agent/core/session/migrate.d.ts +18 -0
- package/dist/sdk/coding-agent/core/session/migrate.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/session/migrate.js +78 -0
- package/dist/sdk/coding-agent/core/session/types.d.ts +165 -0
- package/dist/sdk/coding-agent/core/session/types.d.ts.map +1 -0
- package/dist/sdk/coding-agent/core/session/types.js +4 -0
- package/dist/sdk/coding-agent/core/session-manager.d.ts +3 -161
- package/dist/sdk/coding-agent/core/session-manager.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/session-manager.js +4 -72
- package/package.json +2 -2
- 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,
|
|
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,
|
|
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"}
|