@aexol/spectral 0.8.5 → 0.8.7
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/dist/agent/index.d.ts +1 -1
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +11 -11
- package/dist/cli.js +1 -1
- package/dist/commands/serve.d.ts +3 -3
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +5 -2
- package/dist/config.d.ts +1 -1
- package/dist/config.js +1 -1
- package/dist/designer/index.d.ts +3 -3
- package/dist/designer/index.d.ts.map +1 -1
- package/dist/designer/index.js +9 -9
- package/dist/extensions/aexol-mcp.d.ts +6 -6
- package/dist/extensions/aexol-mcp.d.ts.map +1 -1
- package/dist/extensions/aexol-mcp.js +12 -12
- package/dist/extensions/kanban-bridge.d.ts +2 -2
- package/dist/extensions/kanban-bridge.d.ts.map +1 -1
- package/dist/extensions/kanban-bridge.js +3 -3
- package/dist/extensions/openrouter-attribution.d.ts +1 -1
- package/dist/extensions/openrouter-attribution.d.ts.map +1 -1
- package/dist/extensions/openrouter-attribution.js +2 -2
- package/dist/extensions/spectral-vision-fallback.d.ts +1 -1
- package/dist/extensions/spectral-vision-fallback.d.ts.map +1 -1
- package/dist/extensions/spectral-vision-fallback.js +3 -3
- package/dist/index.d.ts +4 -4
- package/dist/index.js +4 -4
- package/dist/mcp/commands.d.ts +1 -1
- package/dist/mcp/commands.d.ts.map +1 -1
- package/dist/mcp/commands.js +1 -1
- package/dist/mcp/config.d.ts +5 -5
- package/dist/mcp/config.d.ts.map +1 -1
- package/dist/mcp/config.js +15 -15
- package/dist/mcp/host-html-template.js +3 -3
- package/dist/mcp/index.d.ts +1 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +15 -13
- package/dist/mcp/init.d.ts +1 -1
- package/dist/mcp/init.d.ts.map +1 -1
- package/dist/mcp/init.js +4 -4
- package/dist/mcp/mcp-oauth-provider.js +1 -1
- package/dist/mcp/proxy-modes.d.ts +1 -1
- package/dist/mcp/proxy-modes.d.ts.map +1 -1
- package/dist/mcp/proxy-modes.js +2 -2
- package/dist/mcp/server-manager.js +2 -2
- package/dist/mcp/state-getter.d.ts +14 -0
- package/dist/mcp/state-getter.d.ts.map +1 -0
- package/dist/mcp/state-getter.js +21 -0
- package/dist/mcp/tool-registrar.js +1 -1
- package/dist/mcp/ui-server.js +1 -1
- package/dist/mcp/ui-stream-types.d.ts +11 -11
- package/dist/mcp/ui-stream-types.d.ts.map +1 -1
- package/dist/mcp/ui-stream-types.js +5 -5
- package/dist/mcp/utils.d.ts +2 -2
- package/dist/mcp/utils.d.ts.map +1 -1
- package/dist/mcp/utils.js +10 -10
- package/dist/mcp-client.d.ts +1 -1
- package/dist/mcp-client.js +1 -1
- package/dist/memory/commands/status.d.ts +1 -1
- package/dist/memory/commands/status.d.ts.map +1 -1
- package/dist/memory/commands/status.js +2 -2
- package/dist/memory/commands/view.d.ts +1 -1
- package/dist/memory/commands/view.d.ts.map +1 -1
- package/dist/memory/commands/view.js +2 -2
- package/dist/memory/hooks/compaction-hook.d.ts +1 -1
- package/dist/memory/hooks/compaction-hook.d.ts.map +1 -1
- package/dist/memory/hooks/compaction-hook.js +5 -5
- package/dist/memory/hooks/compaction-trigger.d.ts +1 -1
- package/dist/memory/hooks/compaction-trigger.d.ts.map +1 -1
- package/dist/memory/hooks/compaction-trigger.js +3 -3
- package/dist/memory/hooks/observer-trigger.d.ts +1 -1
- package/dist/memory/hooks/observer-trigger.d.ts.map +1 -1
- package/dist/memory/hooks/observer-trigger.js +4 -4
- package/dist/memory/index.d.ts +1 -1
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +9 -9
- package/dist/memory/tools/read-project-observations.d.ts +1 -1
- package/dist/memory/tools/read-project-observations.d.ts.map +1 -1
- package/dist/memory/tools/read-project-observations.js +2 -2
- package/dist/memory/tools/recall-observation.d.ts +1 -1
- package/dist/memory/tools/recall-observation.d.ts.map +1 -1
- package/dist/memory/tools/recall-observation.js +2 -2
- package/dist/memory/tools/write-project-observation.d.ts +1 -1
- package/dist/memory/tools/write-project-observation.d.ts.map +1 -1
- package/dist/memory/tools/write-project-observation.js +2 -2
- package/dist/preflight.d.ts +1 -1
- package/dist/preflight.js +1 -1
- package/dist/relay/auto-research.d.ts +2 -2
- package/dist/relay/auto-research.js +34 -34
- package/dist/relay/dispatcher.d.ts +15 -6
- package/dist/relay/dispatcher.d.ts.map +1 -1
- package/dist/relay/dispatcher.js +33 -6
- package/dist/relay/models-fetch.d.ts +1 -1
- package/dist/relay/models-fetch.js +4 -4
- package/dist/sdk/ai/types.d.ts +1 -1
- package/dist/sdk/ai/utils/oauth/openai-codex.d.ts +1 -1
- package/dist/sdk/ai/utils/oauth/openai-codex.js +2 -2
- package/dist/sdk/coding-agent/core/agent-session.d.ts +2 -2
- package/dist/sdk/coding-agent/core/agent-session.js +3 -3
- package/dist/sdk/coding-agent/core/auth-storage.d.ts +2 -2
- package/dist/sdk/coding-agent/core/auth-storage.js +2 -2
- package/dist/sdk/coding-agent/core/bash-executor.js +1 -1
- package/dist/sdk/coding-agent/core/compaction/branch-summarization.js +1 -1
- package/dist/sdk/coding-agent/core/compaction/compaction.js +1 -1
- package/dist/sdk/coding-agent/core/extensions/loader.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/extensions/loader.js +18 -22
- package/dist/sdk/coding-agent/core/extensions/runner.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/extensions/runner.js +1 -1
- package/dist/sdk/coding-agent/core/extensions/types.d.ts +9 -9
- package/dist/sdk/coding-agent/core/extensions/types.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/package-manager.d.ts +1 -1
- package/dist/sdk/coding-agent/core/package-manager.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/package-manager.js +14 -14
- package/dist/sdk/coding-agent/core/sdk.d.ts +1 -1
- package/dist/sdk/coding-agent/core/sdk.js +2 -2
- package/dist/sdk/coding-agent/core/session-manager.d.ts +2 -2
- package/dist/sdk/coding-agent/core/session-manager.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/system-prompt.js +7 -7
- package/dist/sdk/coding-agent/core/tools/bash.d.ts +2 -2
- package/dist/sdk/coding-agent/core/tools/bash.js +3 -3
- package/dist/sdk/coding-agent/core/tools/output-accumulator.js +1 -1
- package/dist/sdk/coding-agent/migrations.d.ts +1 -1
- package/dist/sdk/coding-agent/migrations.js +4 -4
- package/dist/sdk/coding-agent/modes/print-mode.d.ts +2 -2
- package/dist/sdk/coding-agent/modes/print-mode.js +2 -2
- package/dist/sdk/coding-agent/utils/clipboard-image.js +1 -1
- package/dist/sdk/coding-agent/utils/spectral-user-agent.d.ts +2 -0
- package/dist/sdk/coding-agent/utils/spectral-user-agent.d.ts.map +1 -0
- package/dist/sdk/coding-agent/utils/spectral-user-agent.js +3 -0
- package/dist/sdk/coding-agent/utils/version-check.d.ts +5 -5
- package/dist/sdk/coding-agent/utils/version-check.d.ts.map +1 -1
- package/dist/sdk/coding-agent/utils/version-check.js +7 -7
- package/dist/sdk/coding-agent/utils/windows-self-update.js +1 -1
- package/dist/server/agent-bridge.d.ts +35 -35
- package/dist/server/agent-bridge.d.ts.map +1 -1
- package/dist/server/agent-bridge.js +59 -59
- package/dist/server/handlers/mcp-status.d.ts +21 -0
- package/dist/server/handlers/mcp-status.d.ts.map +1 -0
- package/dist/server/handlers/mcp-status.js +52 -0
- package/dist/server/handlers/sessions.d.ts +1 -1
- package/dist/server/handlers/sessions.js +1 -1
- package/dist/server/handlers/settings.d.ts +30 -0
- package/dist/server/handlers/settings.d.ts.map +1 -0
- package/dist/server/handlers/settings.js +123 -0
- package/dist/server/paths.d.ts +2 -2
- package/dist/server/paths.js +2 -2
- package/dist/server/session-stream.d.ts +25 -25
- package/dist/server/session-stream.d.ts.map +1 -1
- package/dist/server/session-stream.js +66 -38
- package/dist/server/shutdown.d.ts +3 -3
- package/dist/server/shutdown.d.ts.map +1 -1
- package/dist/server/shutdown.js +3 -3
- package/dist/server/storage.d.ts +4 -4
- package/dist/server/storage.js +6 -6
- package/dist/server/wire.d.ts +8 -8
- package/dist/server/wire.d.ts.map +1 -1
- package/dist/server/wire.js +1 -1
- package/package.json +1 -1
- package/dist/sdk/coding-agent/utils/pi-user-agent.d.ts +0 -2
- package/dist/sdk/coding-agent/utils/pi-user-agent.d.ts.map +0 -1
- package/dist/sdk/coding-agent/utils/pi-user-agent.js +0 -3
|
@@ -39,6 +39,7 @@
|
|
|
39
39
|
* transparent to this layer — we just respond when we can.
|
|
40
40
|
*/
|
|
41
41
|
import type { AutoResearchFrame, CancelTurnFrame, ClientMessageFrame, MetaEvent, RestRequestFrame, RestResponseFrame, SubscribeFrame } from "@aexol/relay-protocol";
|
|
42
|
+
import type { McpExtensionState } from "../mcp/state.js";
|
|
42
43
|
import type { SessionStreamManager, Subscriber } from "../server/session-stream.js";
|
|
43
44
|
import type { SessionStore } from "../server/storage.js";
|
|
44
45
|
import type { RelayClient } from "./client.js";
|
|
@@ -47,7 +48,7 @@ import type { RelayClient } from "./client.js";
|
|
|
47
48
|
* `id` is populated when the route had an `:id` placeholder.
|
|
48
49
|
*/
|
|
49
50
|
interface RouteMatch {
|
|
50
|
-
route: "list_projects" | "create_project" | "update_project" | "delete_project" | "bind_studio" | "list_project_sessions" | "create_session" | "get_session" | "update_session" | "delete_session" | "get_session_memory" | "get_session_memory_details" | "compact_session" | "remember_and_delete_session" | "fork_session" | "list_path_autocomplete" | "enqueue_prompt" | "get_prompt_queue" | "remove_prompt" | "clear_prompt_queue";
|
|
51
|
+
route: "list_projects" | "create_project" | "update_project" | "delete_project" | "bind_studio" | "list_project_sessions" | "create_session" | "get_session" | "update_session" | "delete_session" | "get_session_memory" | "get_session_memory_details" | "compact_session" | "remember_and_delete_session" | "fork_session" | "list_path_autocomplete" | "enqueue_prompt" | "get_prompt_queue" | "remove_prompt" | "clear_prompt_queue" | "list_mcp_status" | "get_settings" | "put_settings";
|
|
51
52
|
id?: string;
|
|
52
53
|
/** Parsed query params, if the path carried a `?...` suffix. */
|
|
53
54
|
query?: URLSearchParams;
|
|
@@ -59,7 +60,7 @@ interface RouteMatch {
|
|
|
59
60
|
* don't recognise; the caller turns that into a `404 Unknown route`.
|
|
60
61
|
*
|
|
61
62
|
* Intentionally literal — a regex table would be marginally fancier but
|
|
62
|
-
* also marginally slower and harder to read for ~
|
|
63
|
+
* also marginally slower and harder to read for ~11 routes.
|
|
63
64
|
*/
|
|
64
65
|
export declare function matchRoute(method: string, path: string): RouteMatch | null;
|
|
65
66
|
/**
|
|
@@ -76,10 +77,18 @@ export type PublishMetaEvent = (event: MetaEvent) => void;
|
|
|
76
77
|
export interface RestRequestDeps {
|
|
77
78
|
store: SessionStore;
|
|
78
79
|
manager: SessionStreamManager;
|
|
80
|
+
/** Working directory for this machine. Used by settings persistence. Defaults to homedir. */
|
|
81
|
+
cwd?: string;
|
|
79
82
|
/** Optional logger for unexpected errors. Defaults to console.error. */
|
|
80
83
|
logger?: {
|
|
81
84
|
error: (...args: unknown[]) => void;
|
|
82
85
|
};
|
|
86
|
+
/**
|
|
87
|
+
* Optional MCP extension state. Passed through by `serve.ts` from the
|
|
88
|
+
* `AgentBridge`. When set, `GET /api/mcp-status` returns the current
|
|
89
|
+
* machine-local MCP snapshot.
|
|
90
|
+
*/
|
|
91
|
+
mcpState?: McpExtensionState;
|
|
83
92
|
/**
|
|
84
93
|
* Optional meta-event publisher. Invoked AFTER each successful mutation
|
|
85
94
|
* (create/update/delete project, create/update/delete session) so all
|
|
@@ -156,7 +165,7 @@ export declare function handleClientMessage(frame: ClientMessageFrame, deps: Cli
|
|
|
156
165
|
*/
|
|
157
166
|
export declare function handleSubscribe(frame: SubscribeFrame, deps: ClientMessageDeps): void;
|
|
158
167
|
/**
|
|
159
|
-
* Dispatch a `cancel_turn` frame. Disposes the session's
|
|
168
|
+
* Dispatch a `cancel_turn` frame. Disposes the session's agent bridge and
|
|
160
169
|
* removes the stream so the next user message creates a fresh one. The
|
|
161
170
|
* bridge dispose triggers `agent_end` broadcast to all subscribers.
|
|
162
171
|
*
|
|
@@ -170,10 +179,10 @@ export declare function handleCancelTurn(frame: CancelTurnFrame, deps: {
|
|
|
170
179
|
}): void;
|
|
171
180
|
/**
|
|
172
181
|
* Detach every subscriber the dispatcher has attached. Called by
|
|
173
|
-
* `serve.ts` on relay disconnect / shutdown so the underlying
|
|
182
|
+
* `serve.ts` on relay disconnect / shutdown so the underlying spectral
|
|
174
183
|
* processes don't keep an unreachable subscriber pinned.
|
|
175
184
|
*
|
|
176
|
-
* NOTE: this does NOT dispose the streams themselves —
|
|
185
|
+
* NOTE: this does NOT dispose the streams themselves — spectral keeps running
|
|
177
186
|
* so a future browser reconnect can resume mid-turn. Use
|
|
178
187
|
* `manager.dispose()` at full shutdown.
|
|
179
188
|
*/
|
|
@@ -193,7 +202,7 @@ export interface AutoResearchDeps {
|
|
|
193
202
|
}
|
|
194
203
|
/**
|
|
195
204
|
* Dispatch an `auto_research` frame. Sends the auto-research task through
|
|
196
|
-
* the existing AgentBridge (backend proxy) instead of spawning a separate
|
|
205
|
+
* the existing AgentBridge (backend proxy) instead of spawning a separate spectral
|
|
197
206
|
* subprocess. This ensures auto-research uses the same model and API keys
|
|
198
207
|
* as the active session.
|
|
199
208
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../src/relay/dispatcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;
|
|
1
|
+
{"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../src/relay/dispatcher.ts"],"names":[],"mappings":"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"}
|
package/dist/relay/dispatcher.js
CHANGED
|
@@ -38,11 +38,14 @@
|
|
|
38
38
|
* or `code:"machine_offline"` (CLI socket dropped). Both are
|
|
39
39
|
* transparent to this layer — we just respond when we can.
|
|
40
40
|
*/
|
|
41
|
+
import { homedir } from "node:os";
|
|
41
42
|
import { BadRequestError, NotFoundError } from "../server/handlers/errors.js";
|
|
43
|
+
import { handleListMcpStatus } from "../server/handlers/mcp-status.js";
|
|
42
44
|
import { handlePathAutocomplete } from "../server/handlers/paths-autocomplete.js";
|
|
43
45
|
import { handleBindStudioProject, handleCreateProject, handleDeleteProject, handleListProjects, handleListSessionsByProject, handleUpdateProject, } from "../server/handlers/projects.js";
|
|
44
46
|
import { handleCompactSession, handleCreateSession, handleDeleteSession, handleForkSession, handleRememberAndDeleteSession, handleGetSessionDetail, handleGetSessionMemoryDetails, handleGetSessionMemoryStatus, handleUpdateSession, } from "../server/handlers/sessions.js";
|
|
45
47
|
import { handleClearPromptQueue, handleEnqueuePrompt, handleGetPromptQueue, handleRemovePrompt, } from "../server/handlers/queue.js";
|
|
48
|
+
import { handleGetSettings, handlePutSettings, } from "../server/handlers/settings.js";
|
|
46
49
|
import { shutdownState } from "../server/shutdown.js";
|
|
47
50
|
import { handleAutoResearch } from "./auto-research.js";
|
|
48
51
|
/**
|
|
@@ -50,13 +53,27 @@ import { handleAutoResearch } from "./auto-research.js";
|
|
|
50
53
|
* don't recognise; the caller turns that into a `404 Unknown route`.
|
|
51
54
|
*
|
|
52
55
|
* Intentionally literal — a regex table would be marginally fancier but
|
|
53
|
-
* also marginally slower and harder to read for ~
|
|
56
|
+
* also marginally slower and harder to read for ~11 routes.
|
|
54
57
|
*/
|
|
55
58
|
export function matchRoute(method, path) {
|
|
56
59
|
// Strip query string for path matching but keep it for the handler.
|
|
57
60
|
const qIdx = path.indexOf("?");
|
|
58
61
|
const cleanPath = qIdx === -1 ? path : path.slice(0, qIdx);
|
|
59
62
|
const query = qIdx >= 0 ? new URLSearchParams(path.slice(qIdx + 1)) : undefined;
|
|
63
|
+
// /api/mcp-status
|
|
64
|
+
if (cleanPath === "/api/mcp-status") {
|
|
65
|
+
if (method === "GET")
|
|
66
|
+
return { route: "list_mcp_status" };
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
// /api/settings
|
|
70
|
+
if (cleanPath === "/api/settings") {
|
|
71
|
+
if (method === "GET")
|
|
72
|
+
return { route: "get_settings" };
|
|
73
|
+
if (method === "PUT")
|
|
74
|
+
return { route: "put_settings" };
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
60
77
|
// /api/paths/autocomplete
|
|
61
78
|
if (cleanPath === "/api/paths/autocomplete") {
|
|
62
79
|
if (method === "GET")
|
|
@@ -390,6 +407,16 @@ async function dispatchRoute(match, body, deps) {
|
|
|
390
407
|
case "clear_prompt_queue":
|
|
391
408
|
handleClearPromptQueue(store, manager, id);
|
|
392
409
|
return { ok: true };
|
|
410
|
+
case "list_mcp_status": {
|
|
411
|
+
if (!deps.mcpState) {
|
|
412
|
+
return [];
|
|
413
|
+
}
|
|
414
|
+
return handleListMcpStatus(deps.mcpState);
|
|
415
|
+
}
|
|
416
|
+
case "get_settings":
|
|
417
|
+
return handleGetSettings(deps.cwd ?? homedir());
|
|
418
|
+
case "put_settings":
|
|
419
|
+
return handlePutSettings(deps.cwd ?? homedir(), asObject(body));
|
|
393
420
|
}
|
|
394
421
|
}
|
|
395
422
|
/**
|
|
@@ -604,7 +631,7 @@ export function handleClientMessage(frame, deps) {
|
|
|
604
631
|
// converted to `error` events by the manager itself, so we just log.
|
|
605
632
|
// `modelId` (Phase 3 — Available Models whitelist) is forwarded as
|
|
606
633
|
// sticky next-prompt selection. The backend has already validated it
|
|
607
|
-
// against the team-scoped whitelist; the CLI resolves it via
|
|
634
|
+
// against the team-scoped whitelist; the CLI resolves it via spectral's
|
|
608
635
|
// own model registry inside the manager → bridge.
|
|
609
636
|
//
|
|
610
637
|
// When `loop: true`, loop state is set before prompting; the normal
|
|
@@ -677,7 +704,7 @@ export function handleSubscribe(frame, deps) {
|
|
|
677
704
|
}
|
|
678
705
|
}
|
|
679
706
|
/**
|
|
680
|
-
* Dispatch a `cancel_turn` frame. Disposes the session's
|
|
707
|
+
* Dispatch a `cancel_turn` frame. Disposes the session's agent bridge and
|
|
681
708
|
* removes the stream so the next user message creates a fresh one. The
|
|
682
709
|
* bridge dispose triggers `agent_end` broadcast to all subscribers.
|
|
683
710
|
*
|
|
@@ -688,10 +715,10 @@ export function handleCancelTurn(frame, deps) {
|
|
|
688
715
|
}
|
|
689
716
|
/**
|
|
690
717
|
* Detach every subscriber the dispatcher has attached. Called by
|
|
691
|
-
* `serve.ts` on relay disconnect / shutdown so the underlying
|
|
718
|
+
* `serve.ts` on relay disconnect / shutdown so the underlying spectral
|
|
692
719
|
* processes don't keep an unreachable subscriber pinned.
|
|
693
720
|
*
|
|
694
|
-
* NOTE: this does NOT dispose the streams themselves —
|
|
721
|
+
* NOTE: this does NOT dispose the streams themselves — spectral keeps running
|
|
695
722
|
* so a future browser reconnect can resume mid-turn. Use
|
|
696
723
|
* `manager.dispose()` at full shutdown.
|
|
697
724
|
*/
|
|
@@ -708,7 +735,7 @@ export function detachAllSubscribers(manager, subscribers) {
|
|
|
708
735
|
}
|
|
709
736
|
/**
|
|
710
737
|
* Dispatch an `auto_research` frame. Sends the auto-research task through
|
|
711
|
-
* the existing AgentBridge (backend proxy) instead of spawning a separate
|
|
738
|
+
* the existing AgentBridge (backend proxy) instead of spawning a separate spectral
|
|
712
739
|
* subprocess. This ensures auto-research uses the same model and API keys
|
|
713
740
|
* as the active session.
|
|
714
741
|
*
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* using its own (centralized) API keys.
|
|
10
10
|
*
|
|
11
11
|
* Why GraphQL (not REST):
|
|
12
|
-
* - The backend already exposes the whitelist via `
|
|
12
|
+
* - The backend already exposes the whitelist via `availableAgentModels`
|
|
13
13
|
* in its public GraphQL schema (`schema.graphql`); there is no
|
|
14
14
|
* equivalent REST endpoint and we don't want to add one just for the
|
|
15
15
|
* CLI.
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* using its own (centralized) API keys.
|
|
10
10
|
*
|
|
11
11
|
* Why GraphQL (not REST):
|
|
12
|
-
* - The backend already exposes the whitelist via `
|
|
12
|
+
* - The backend already exposes the whitelist via `availableAgentModels`
|
|
13
13
|
* in its public GraphQL schema (`schema.graphql`); there is no
|
|
14
14
|
* equivalent REST endpoint and we don't want to add one just for the
|
|
15
15
|
* CLI.
|
|
@@ -28,7 +28,7 @@ const cache = new Map();
|
|
|
28
28
|
export function clearAllowedModelsCache() {
|
|
29
29
|
cache.clear();
|
|
30
30
|
}
|
|
31
|
-
const QUERY = `query
|
|
31
|
+
const QUERY = `query AvailableAgentModels { availableAgentModels { name provider userModelId agentEnabled creditInputPer1M creditOutputPer1M creditCachedInputPer1M creditCacheReadPer1M creditCacheWritePer1M contextWindow supportsImages supportsReasoning isDefault isVisionDefault } }`;
|
|
32
32
|
/**
|
|
33
33
|
* Fetch the whitelist of allowed base models. Throws on any failure with a
|
|
34
34
|
* message tailored for an operator running `spectral serve` — the caller
|
|
@@ -87,9 +87,9 @@ export async function fetchAllowedModels(opts) {
|
|
|
87
87
|
.join("; ");
|
|
88
88
|
throw new Error(`Failed to fetch allowed models: GraphQL errors: ${msg}`);
|
|
89
89
|
}
|
|
90
|
-
const rows = payload.data?.
|
|
90
|
+
const rows = payload.data?.availableAgentModels;
|
|
91
91
|
if (!Array.isArray(rows)) {
|
|
92
|
-
throw new Error(`Failed to fetch allowed models: response missing
|
|
92
|
+
throw new Error(`Failed to fetch allowed models: response missing availableAgentModels array`);
|
|
93
93
|
}
|
|
94
94
|
const models = [];
|
|
95
95
|
for (const row of rows) {
|
package/dist/sdk/ai/types.d.ts
CHANGED
|
@@ -463,7 +463,7 @@ export interface Model<TApi extends Api> {
|
|
|
463
463
|
baseUrl: string;
|
|
464
464
|
reasoning: boolean;
|
|
465
465
|
/**
|
|
466
|
-
* Maps
|
|
466
|
+
* Maps spectral thinking levels to provider/model-specific values.
|
|
467
467
|
* Missing keys use provider defaults. null marks a level as unsupported.
|
|
468
468
|
*/
|
|
469
469
|
thinkingLevelMap?: ThinkingLevelMap;
|
|
@@ -14,7 +14,7 @@ import type { OAuthCredentials, OAuthPrompt, OAuthProviderInterface } from "./ty
|
|
|
14
14
|
* @param options.onManualCodeInput - Optional promise that resolves with user-pasted code.
|
|
15
15
|
* Races with browser callback - whichever completes first wins.
|
|
16
16
|
* Useful for showing paste input immediately alongside browser flow.
|
|
17
|
-
* @param options.originator - OAuth originator parameter (defaults to "
|
|
17
|
+
* @param options.originator - OAuth originator parameter (defaults to "spectral")
|
|
18
18
|
*/
|
|
19
19
|
export declare function loginOpenAICodex(options: {
|
|
20
20
|
onAuth: (info: {
|
|
@@ -144,7 +144,7 @@ async function refreshAccessToken(refreshToken) {
|
|
|
144
144
|
};
|
|
145
145
|
}
|
|
146
146
|
}
|
|
147
|
-
async function createAuthorizationFlow(originator = "
|
|
147
|
+
async function createAuthorizationFlow(originator = "spectral") {
|
|
148
148
|
const { verifier, challenge } = await generatePKCE();
|
|
149
149
|
const state = createState();
|
|
150
150
|
const url = new URL(AUTHORIZE_URL);
|
|
@@ -250,7 +250,7 @@ function getAccountId(accessToken) {
|
|
|
250
250
|
* @param options.onManualCodeInput - Optional promise that resolves with user-pasted code.
|
|
251
251
|
* Races with browser callback - whichever completes first wins.
|
|
252
252
|
* Useful for showing paste input immediately alongside browser flow.
|
|
253
|
-
* @param options.originator - OAuth originator parameter (defaults to "
|
|
253
|
+
* @param options.originator - OAuth originator parameter (defaults to "spectral")
|
|
254
254
|
*/
|
|
255
255
|
export async function loginOpenAICodex(options) {
|
|
256
256
|
const { verifier, state, url } = await createAuthorizationFlow(options.originator);
|
|
@@ -89,7 +89,7 @@ export interface AgentSessionConfig {
|
|
|
89
89
|
}>;
|
|
90
90
|
/** Resource loader for skills, prompts, themes, context files, system prompt */
|
|
91
91
|
resourceLoader: ResourceLoader;
|
|
92
|
-
/**
|
|
92
|
+
/** sdk custom tools registered outside extensions */
|
|
93
93
|
customTools?: ToolDefinition[];
|
|
94
94
|
/** Model registry for API key resolution and model discovery */
|
|
95
95
|
modelRegistry: ModelRegistry;
|
|
@@ -314,7 +314,7 @@ export declare class AgentSession {
|
|
|
314
314
|
private _handlePostAgentRun;
|
|
315
315
|
/**
|
|
316
316
|
* Send a prompt to the agent.
|
|
317
|
-
* - Handles extension commands (registered via
|
|
317
|
+
* - Handles extension commands (registered via spectral.registerCommand) immediately, even during streaming
|
|
318
318
|
* - Expands file-based prompt templates by default
|
|
319
319
|
* - During streaming, queues via steer() or followUp() based on streamingBehavior option
|
|
320
320
|
* - Validates model and API key before sending (when not streaming)
|
|
@@ -464,7 +464,7 @@ export class AgentSession {
|
|
|
464
464
|
* Call this when completely done with the session.
|
|
465
465
|
*/
|
|
466
466
|
dispose() {
|
|
467
|
-
this._extensionRunner.invalidate("This extension ctx is stale after session replacement or reload. Do not use a captured
|
|
467
|
+
this._extensionRunner.invalidate("This extension ctx is stale after session replacement or reload. Do not use a captured agent or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload().");
|
|
468
468
|
this.abortRetry();
|
|
469
469
|
this.agent.abort();
|
|
470
470
|
this._disconnectFromAgent();
|
|
@@ -671,7 +671,7 @@ export class AgentSession {
|
|
|
671
671
|
}
|
|
672
672
|
/**
|
|
673
673
|
* Send a prompt to the agent.
|
|
674
|
-
* - Handles extension commands (registered via
|
|
674
|
+
* - Handles extension commands (registered via spectral.registerCommand) immediately, even during streaming
|
|
675
675
|
* - Expands file-based prompt templates by default
|
|
676
676
|
* - During streaming, queues via steer() or followUp() based on streamingBehavior option
|
|
677
677
|
* - Validates model and API key before sending (when not streaming)
|
|
@@ -684,7 +684,7 @@ export class AgentSession {
|
|
|
684
684
|
let messages;
|
|
685
685
|
try {
|
|
686
686
|
// Handle extension commands first (execute immediately, even during streaming)
|
|
687
|
-
// Extension commands manage their own LLM interaction via
|
|
687
|
+
// Extension commands manage their own LLM interaction via spectral.sendMessage()
|
|
688
688
|
if (expandPromptTemplates && text.startsWith("/")) {
|
|
689
689
|
const handled = await this._tryExecuteExtensionCommand(text);
|
|
690
690
|
if (handled) {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Credential storage for API keys and OAuth tokens.
|
|
3
3
|
* Handles loading, saving, and refreshing credentials from auth.json.
|
|
4
4
|
*
|
|
5
|
-
* Uses file locking to prevent race conditions when multiple
|
|
5
|
+
* Uses file locking to prevent race conditions when multiple spectral instances
|
|
6
6
|
* try to refresh tokens simultaneously.
|
|
7
7
|
*/
|
|
8
8
|
import { type OAuthCredentials, type OAuthLoginCallbacks, type OAuthProviderId } from "../../ai/index.js";
|
|
@@ -121,7 +121,7 @@ export declare class AuthStorage {
|
|
|
121
121
|
logout(provider: string): void;
|
|
122
122
|
/**
|
|
123
123
|
* Refresh OAuth token with backend locking to prevent race conditions.
|
|
124
|
-
* Multiple
|
|
124
|
+
* Multiple spectral instances may try to refresh simultaneously when tokens expire.
|
|
125
125
|
*/
|
|
126
126
|
private refreshOAuthTokenWithLock;
|
|
127
127
|
/**
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Credential storage for API keys and OAuth tokens.
|
|
3
3
|
* Handles loading, saving, and refreshing credentials from auth.json.
|
|
4
4
|
*
|
|
5
|
-
* Uses file locking to prevent race conditions when multiple
|
|
5
|
+
* Uses file locking to prevent race conditions when multiple spectral instances
|
|
6
6
|
* try to refresh tokens simultaneously.
|
|
7
7
|
*/
|
|
8
8
|
import { findEnvKeys, getEnvApiKey, } from "../../ai/index.js";
|
|
@@ -330,7 +330,7 @@ export class AuthStorage {
|
|
|
330
330
|
}
|
|
331
331
|
/**
|
|
332
332
|
* Refresh OAuth token with backend locking to prevent race conditions.
|
|
333
|
-
* Multiple
|
|
333
|
+
* Multiple spectral instances may try to refresh simultaneously when tokens expire.
|
|
334
334
|
*/
|
|
335
335
|
async refreshOAuthTokenWithLock(providerId) {
|
|
336
336
|
const provider = getOAuthProvider(providerId);
|
|
@@ -31,7 +31,7 @@ export async function executeBashWithOperations(command, cwd, operations, option
|
|
|
31
31
|
return;
|
|
32
32
|
}
|
|
33
33
|
const id = randomBytes(8).toString("hex");
|
|
34
|
-
tempFilePath = join(tmpdir(), `
|
|
34
|
+
tempFilePath = join(tmpdir(), `spectral-bash-${id}.log`);
|
|
35
35
|
tempFileStream = createWriteStream(tempFilePath);
|
|
36
36
|
for (const chunk of outputChunks) {
|
|
37
37
|
tempFileStream.write(chunk);
|
|
@@ -101,7 +101,7 @@ export function prepareBranchEntries(entries, tokenBudget = 0) {
|
|
|
101
101
|
let totalTokens = 0;
|
|
102
102
|
// First pass: collect file ops from ALL entries (even if they don't fit in token budget)
|
|
103
103
|
// This ensures we capture cumulative file tracking from nested branch summaries
|
|
104
|
-
// Only extract from
|
|
104
|
+
// Only extract from spectral-generated summaries (fromHook !== true), not extension-generated ones
|
|
105
105
|
for (const entry of entries) {
|
|
106
106
|
if (entry.type === "branch_summary" && !entry.fromHook && entry.details) {
|
|
107
107
|
const details = entry.details;
|
|
@@ -13,7 +13,7 @@ import { computeFileLists, createFileOps, extractFileOpsFromMessage, formatFileO
|
|
|
13
13
|
*/
|
|
14
14
|
function extractFileOperations(messages, entries, prevCompactionIndex) {
|
|
15
15
|
const fileOps = createFileOps();
|
|
16
|
-
// Collect from previous compaction's details (if
|
|
16
|
+
// Collect from previous compaction's details (if spectral-generated)
|
|
17
17
|
if (prevCompactionIndex >= 0) {
|
|
18
18
|
const prevCompaction = entries[prevCompactionIndex];
|
|
19
19
|
if (!prevCompaction.fromHook && prevCompaction.details) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../../../src/sdk/coding-agent/core/extensions/loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAIhE,OAAO,KAAK,EACX,SAAS,EAET,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EAKpB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../../../src/sdk/coding-agent/core/extensions/loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAIhE,OAAO,KAAK,EACX,SAAS,EAET,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EAKpB,MAAM,YAAY,CAAC;AAoDpB;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CA+CzD;AAiOD;;GAEG;AACH,wBAAsB,wBAAwB,CAC7C,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,gBAAgB,EACzB,aAAa,SAAa,GACxB,OAAO,CAAC,SAAS,CAAC,CAMpB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAyBrH;AA+GD;;GAEG;AACH,wBAAsB,yBAAyB,CAC9C,eAAe,EAAE,MAAM,EAAE,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,MAAsB,EAChC,QAAQ,CAAC,EAAE,QAAQ,GACjB,OAAO,CAAC,oBAAoB,CAAC,CA2C/B"}
|
|
@@ -33,20 +33,16 @@ function getAliases() {
|
|
|
33
33
|
}
|
|
34
34
|
return fileURLToPath(import.meta.resolve(specifier));
|
|
35
35
|
};
|
|
36
|
-
const
|
|
37
|
-
const
|
|
38
|
-
const
|
|
39
|
-
const
|
|
36
|
+
const spectralCodingAgentEntry = packageIndex;
|
|
37
|
+
const spectralAgentCoreEntry = resolveWorkspaceOrImport("agent/dist/index.js", "../../../agent-core/index.ts");
|
|
38
|
+
const spectralAiEntry = resolveWorkspaceOrImport("ai/dist/index.js", "../../../ai/index.ts");
|
|
39
|
+
const spectralAiOauthEntry = resolveWorkspaceOrImport("ai/dist/oauth.js", "../../../ai/oauth.ts");
|
|
40
40
|
_aliases = {
|
|
41
|
-
"../../index.ts":
|
|
42
|
-
"../../../agent-core/index.ts":
|
|
43
|
-
"../../../ai/index.ts":
|
|
44
|
-
"../../../ai/oauth.ts":
|
|
45
|
-
"@
|
|
46
|
-
"@mariozechner/pi-agent": piAgentCoreEntry,
|
|
47
|
-
"@mariozechner/pi-ai": piAiEntry,
|
|
48
|
-
"@mariozechner/pi-ai/oauth": piAiOauthEntry,
|
|
49
|
-
"@aexol/spectral": piCodingAgentEntry,
|
|
41
|
+
"../../index.ts": spectralCodingAgentEntry,
|
|
42
|
+
"../../../agent-core/index.ts": spectralAgentCoreEntry,
|
|
43
|
+
"../../../ai/index.ts": spectralAiEntry,
|
|
44
|
+
"../../../ai/oauth.ts": spectralAiOauthEntry,
|
|
45
|
+
"@aexol/spectral": spectralCodingAgentEntry,
|
|
50
46
|
typebox: typeboxEntry,
|
|
51
47
|
"typebox/compile": typeboxCompileEntry,
|
|
52
48
|
"typebox/value": typeboxValueEntry,
|
|
@@ -93,7 +89,7 @@ export function createExtensionRuntime() {
|
|
|
93
89
|
invalidate: (message) => {
|
|
94
90
|
state.staleMessage ??=
|
|
95
91
|
message ??
|
|
96
|
-
"This extension ctx is stale after session replacement or reload. Do not use a captured
|
|
92
|
+
"This extension ctx is stale after session replacement or reload. Do not use a captured agent or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload().";
|
|
97
93
|
},
|
|
98
94
|
// Pre-bind: queue registrations so bindCore() can flush them once the
|
|
99
95
|
// model registry is available. bindCore() replaces both with direct calls.
|
|
@@ -312,12 +308,12 @@ export async function loadExtensions(paths, cwd, eventBus) {
|
|
|
312
308
|
runtime,
|
|
313
309
|
};
|
|
314
310
|
}
|
|
315
|
-
function
|
|
311
|
+
function readSpectralManifest(packageJsonPath) {
|
|
316
312
|
try {
|
|
317
313
|
const content = fs.readFileSync(packageJsonPath, "utf-8");
|
|
318
314
|
const pkg = JSON.parse(content);
|
|
319
|
-
if (pkg.
|
|
320
|
-
return pkg.
|
|
315
|
+
if (pkg.spectral && typeof pkg.spectral === "object") {
|
|
316
|
+
return pkg.spectral;
|
|
321
317
|
}
|
|
322
318
|
return null;
|
|
323
319
|
}
|
|
@@ -332,16 +328,16 @@ function isExtensionFile(name) {
|
|
|
332
328
|
* Resolve extension entry points from a directory.
|
|
333
329
|
*
|
|
334
330
|
* Checks for:
|
|
335
|
-
* 1. package.json with "
|
|
331
|
+
* 1. package.json with "spectral.extensions" field -> returns declared paths
|
|
336
332
|
* 2. index.ts or index.js -> returns the index file
|
|
337
333
|
*
|
|
338
334
|
* Returns resolved paths or null if no entry points found.
|
|
339
335
|
*/
|
|
340
336
|
function resolveExtensionEntries(dir) {
|
|
341
|
-
// Check for package.json with "
|
|
337
|
+
// Check for package.json with "spectral" field first
|
|
342
338
|
const packageJsonPath = path.join(dir, "package.json");
|
|
343
339
|
if (fs.existsSync(packageJsonPath)) {
|
|
344
|
-
const manifest =
|
|
340
|
+
const manifest = readSpectralManifest(packageJsonPath);
|
|
345
341
|
if (manifest?.extensions?.length) {
|
|
346
342
|
const entries = [];
|
|
347
343
|
for (const extPath of manifest.extensions) {
|
|
@@ -372,7 +368,7 @@ function resolveExtensionEntries(dir) {
|
|
|
372
368
|
* Discovery rules:
|
|
373
369
|
* 1. Direct files: `extensions/*.ts` or `*.js` → load
|
|
374
370
|
* 2. Subdirectory with index: `extensions/* /index.ts` or `index.js` → load
|
|
375
|
-
* 3. Subdirectory with package.json: `extensions/* /package.json` with "
|
|
371
|
+
* 3. Subdirectory with package.json: `extensions/* /package.json` with "spectral" field → load what it declares
|
|
376
372
|
*
|
|
377
373
|
* No recursion beyond one level. Complex packages must use package.json manifest.
|
|
378
374
|
*/
|
|
@@ -431,7 +427,7 @@ export async function discoverAndLoadExtensions(configuredPaths, cwd, agentDir =
|
|
|
431
427
|
for (const p of configuredPaths) {
|
|
432
428
|
const resolved = resolvePath(p, resolvedCwd, { normalizeUnicodeSpaces: true });
|
|
433
429
|
if (fs.existsSync(resolved) && fs.statSync(resolved).isDirectory()) {
|
|
434
|
-
// Check for package.json with
|
|
430
|
+
// Check for package.json with spectral manifest or index.ts
|
|
435
431
|
const entries = resolveExtensionEntries(resolved);
|
|
436
432
|
if (entries) {
|
|
437
433
|
addPaths(entries);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../../../src/sdk/coding-agent/core/extensions/runner.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../../../src/sdk/coding-agent/core/extensions/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -288,7 +288,7 @@ export class ExtensionRunner {
|
|
|
288
288
|
getShortcutDiagnostics() {
|
|
289
289
|
return this.shortcutDiagnostics;
|
|
290
290
|
}
|
|
291
|
-
invalidate(message = "This extension ctx is stale after session replacement or reload. Do not use a captured
|
|
291
|
+
invalidate(message = "This extension ctx is stale after session replacement or reload. Do not use a captured agent or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload().") {
|
|
292
292
|
if (!this.staleMessage) {
|
|
293
293
|
this.staleMessage = message;
|
|
294
294
|
this.runtime.invalidate(message);
|
|
@@ -270,7 +270,7 @@ export interface ExtensionContext {
|
|
|
270
270
|
abort(): void;
|
|
271
271
|
/** Whether there are queued messages waiting */
|
|
272
272
|
hasPendingMessages(): boolean;
|
|
273
|
-
/** Gracefully shutdown
|
|
273
|
+
/** Gracefully shutdown spectral and exit. Available in all contexts. */
|
|
274
274
|
shutdown(): void;
|
|
275
275
|
/** Get current context usage for the active model. */
|
|
276
276
|
getContextUsage(): ContextUsage | undefined;
|
|
@@ -887,7 +887,7 @@ export interface ExtensionAPI {
|
|
|
887
887
|
*
|
|
888
888
|
* @example
|
|
889
889
|
* // Register a new provider with custom models
|
|
890
|
-
*
|
|
890
|
+
* spectral.registerProvider("my-proxy", {
|
|
891
891
|
* baseUrl: "https://proxy.example.com",
|
|
892
892
|
* apiKey: "PROXY_API_KEY",
|
|
893
893
|
* api: "anthropic-messages",
|
|
@@ -906,13 +906,13 @@ export interface ExtensionAPI {
|
|
|
906
906
|
*
|
|
907
907
|
* @example
|
|
908
908
|
* // Override baseUrl for an existing provider
|
|
909
|
-
*
|
|
909
|
+
* spectral.registerProvider("anthropic", {
|
|
910
910
|
* baseUrl: "https://proxy.example.com"
|
|
911
911
|
* });
|
|
912
912
|
*
|
|
913
913
|
* @example
|
|
914
914
|
* // Register provider with OAuth support
|
|
915
|
-
*
|
|
915
|
+
* spectral.registerProvider("corporate-ai", {
|
|
916
916
|
* baseUrl: "https://ai.corp.com",
|
|
917
917
|
* api: "openai-responses",
|
|
918
918
|
* models: [...],
|
|
@@ -936,13 +936,13 @@ export interface ExtensionAPI {
|
|
|
936
936
|
* the initial load phase.
|
|
937
937
|
*
|
|
938
938
|
* @example
|
|
939
|
-
*
|
|
939
|
+
* spectral.unregisterProvider("my-proxy");
|
|
940
940
|
*/
|
|
941
941
|
unregisterProvider(name: string): void;
|
|
942
942
|
/** Shared event bus for extension communication. */
|
|
943
943
|
events: EventBus;
|
|
944
944
|
}
|
|
945
|
-
/** Configuration for registering a provider via
|
|
945
|
+
/** Configuration for registering a provider via spectral.registerProvider(). */
|
|
946
946
|
export interface ProviderConfig {
|
|
947
947
|
/** Display name for the provider in UI. */
|
|
948
948
|
name?: string;
|
|
@@ -986,7 +986,7 @@ export interface ProviderModelConfig {
|
|
|
986
986
|
baseUrl?: string;
|
|
987
987
|
/** Whether the model supports extended thinking. */
|
|
988
988
|
reasoning: boolean;
|
|
989
|
-
/** Maps
|
|
989
|
+
/** Maps spectral thinking levels to provider/model-specific values; null marks a level unsupported. */
|
|
990
990
|
thinkingLevelMap?: Model<Api>["thinkingLevelMap"];
|
|
991
991
|
/** Supported input types. */
|
|
992
992
|
input: ("text" | "image")[];
|
|
@@ -1007,7 +1007,7 @@ export interface ProviderModelConfig {
|
|
|
1007
1007
|
compat?: Model<Api>["compat"];
|
|
1008
1008
|
}
|
|
1009
1009
|
/** Extension factory function type. Supports both sync and async initialization. */
|
|
1010
|
-
export type ExtensionFactory = (
|
|
1010
|
+
export type ExtensionFactory = (ext: ExtensionAPI) => void | Promise<void>;
|
|
1011
1011
|
export interface RegisteredTool {
|
|
1012
1012
|
definition: ToolDefinition;
|
|
1013
1013
|
sourceInfo: SourceInfo;
|
|
@@ -1075,7 +1075,7 @@ export interface ExtensionRuntimeState {
|
|
|
1075
1075
|
unregisterProvider: (name: string, extensionPath?: string) => void;
|
|
1076
1076
|
}
|
|
1077
1077
|
/**
|
|
1078
|
-
* Action implementations for
|
|
1078
|
+
* Action implementations for spectral.* API methods.
|
|
1079
1079
|
* Provided to runner.initialize(), copied into the shared runtime.
|
|
1080
1080
|
*/
|
|
1081
1081
|
export interface ExtensionActions {
|