@aexol/spectral 0.9.221 → 0.9.223
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 +20 -3
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +286 -80
- package/dist/extensions/aexol-backend-client.d.ts +85 -0
- package/dist/extensions/aexol-backend-client.d.ts.map +1 -0
- package/dist/extensions/aexol-backend-client.js +159 -0
- package/dist/extensions/aexol-mcp.d.ts +10 -6
- package/dist/extensions/aexol-mcp.d.ts.map +1 -1
- package/dist/extensions/aexol-mcp.js +21 -106
- package/dist/extensions/logic-trace-backend-draft.d.ts +68 -0
- package/dist/extensions/logic-trace-backend-draft.d.ts.map +1 -0
- package/dist/extensions/logic-trace-backend-draft.js +171 -0
- package/dist/extensions/logic-trace-validate.d.ts +33 -0
- package/dist/extensions/logic-trace-validate.d.ts.map +1 -0
- package/dist/extensions/logic-trace-validate.js +73 -0
- package/dist/extensions/logic-trace.d.ts +213 -0
- package/dist/extensions/logic-trace.d.ts.map +1 -0
- package/dist/extensions/logic-trace.js +1098 -0
- package/dist/generated/parser/lexer.d.ts +148 -0
- package/dist/generated/parser/lexer.d.ts.map +1 -0
- package/dist/generated/parser/lexer.js +877 -0
- package/dist/generated/parser/mod.d.ts +26 -0
- package/dist/generated/parser/mod.d.ts.map +1 -0
- package/dist/generated/parser/mod.js +30 -0
- package/dist/generated/parser/parser.d.ts +161 -0
- package/dist/generated/parser/parser.d.ts.map +1 -0
- package/dist/generated/parser/parser.js +754 -0
- package/dist/generated/parser/tokenizer.d.ts +107 -0
- package/dist/generated/parser/tokenizer.d.ts.map +1 -0
- package/dist/generated/parser/tokenizer.js +202 -0
- package/dist/generated/parser/validator.d.ts +45 -0
- package/dist/generated/parser/validator.d.ts.map +1 -0
- package/dist/generated/parser/validator.js +202 -0
- package/dist/generated/zeus/const.d.ts.map +1 -1
- package/dist/generated/zeus/const.js +4 -170
- package/dist/generated/zeus/index.d.ts +8 -873
- package/dist/generated/zeus/index.d.ts.map +1 -1
- package/dist/generated/zeus/index.js +0 -7
- package/dist/mcp/ui-stream-types.d.ts +2 -2
- package/dist/memory/tools/share-project-observation.js +1 -1
- package/dist/memory/tools/write-project-observation.d.ts.map +1 -1
- package/dist/memory/tools/write-project-observation.js +4 -3
- package/dist/sdk/agent-core/agent-loop.d.ts.map +1 -1
- package/dist/sdk/agent-core/agent-loop.js +2 -4
- package/dist/sdk/agent-core/harness/types.d.ts +0 -1
- package/dist/sdk/agent-core/harness/types.d.ts.map +1 -1
- package/dist/sdk/agent-core/index.d.ts +0 -8
- package/dist/sdk/agent-core/index.d.ts.map +1 -1
- package/dist/sdk/agent-core/index.js +0 -9
- package/dist/sdk/ai/index.d.ts +1 -0
- package/dist/sdk/ai/index.d.ts.map +1 -1
- package/dist/sdk/ai/index.js +1 -0
- package/dist/sdk/ai/utils/transient-error.d.ts +28 -0
- package/dist/sdk/ai/utils/transient-error.d.ts.map +1 -0
- package/dist/sdk/ai/utils/transient-error.js +55 -0
- package/dist/sdk/coding-agent/core/agent-session.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/agent-session.js +7 -3
- package/dist/sdk/coding-agent/core/extensions/index.d.ts +1 -1
- package/dist/sdk/coding-agent/core/extensions/index.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/extensions/native-extensions.js +2 -2
- package/dist/sdk/coding-agent/core/extensions/types.d.ts +20 -1
- package/dist/sdk/coding-agent/core/extensions/types.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/tools/tool-definition-wrapper.d.ts +9 -4
- package/dist/sdk/coding-agent/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/tools/tool-definition-wrapper.js +15 -2
- package/dist/sdk/coding-agent/index.d.ts +1 -1
- package/dist/sdk/coding-agent/index.d.ts.map +1 -1
- package/dist/server/agent-bridge/headless-ui.d.ts +20 -0
- package/dist/server/agent-bridge/headless-ui.d.ts.map +1 -0
- package/dist/server/agent-bridge/headless-ui.js +85 -0
- package/dist/server/agent-bridge/pricing.d.ts +54 -0
- package/dist/server/agent-bridge/pricing.d.ts.map +1 -0
- package/dist/server/agent-bridge/pricing.js +226 -0
- package/dist/server/agent-bridge/rehydrate.d.ts +35 -0
- package/dist/server/agent-bridge/rehydrate.d.ts.map +1 -0
- package/dist/server/agent-bridge/rehydrate.js +122 -0
- package/dist/server/agent-bridge/synthetic-model.d.ts +27 -0
- package/dist/server/agent-bridge/synthetic-model.d.ts.map +1 -0
- package/dist/server/agent-bridge/synthetic-model.js +92 -0
- package/dist/server/agent-bridge.d.ts +17 -1
- package/dist/server/agent-bridge.d.ts.map +1 -1
- package/dist/server/agent-bridge.js +81 -496
- package/dist/server/error-humanizer.d.ts +11 -3
- package/dist/server/error-humanizer.d.ts.map +1 -1
- package/dist/server/error-humanizer.js +11 -3
- package/dist/server/session-stream/compaction-events.d.ts +13 -0
- package/dist/server/session-stream/compaction-events.d.ts.map +1 -0
- package/dist/server/session-stream/compaction-events.js +32 -0
- package/dist/server/session-stream/history-prune.d.ts +35 -0
- package/dist/server/session-stream/history-prune.d.ts.map +1 -0
- package/dist/server/session-stream/history-prune.js +182 -0
- package/dist/server/session-stream/memory.d.ts +48 -0
- package/dist/server/session-stream/memory.d.ts.map +1 -0
- package/dist/server/session-stream/memory.js +136 -0
- package/dist/server/session-stream/replay-tail.d.ts +4 -0
- package/dist/server/session-stream/replay-tail.d.ts.map +1 -0
- package/dist/server/session-stream/replay-tail.js +39 -0
- package/dist/server/session-stream/turn-events.d.ts +33 -0
- package/dist/server/session-stream/turn-events.d.ts.map +1 -0
- package/dist/server/session-stream/turn-events.js +65 -0
- package/dist/server/session-stream/turn-silence.d.ts +8 -0
- package/dist/server/session-stream/turn-silence.d.ts.map +1 -0
- package/dist/server/session-stream/turn-silence.js +72 -0
- package/dist/server/session-stream.d.ts +137 -36
- package/dist/server/session-stream.d.ts.map +1 -1
- package/dist/server/session-stream.js +18 -509
- package/dist/server/storage/observation-ranking.d.ts +14 -0
- package/dist/server/storage/observation-ranking.d.ts.map +1 -0
- package/dist/server/storage/observation-ranking.js +37 -0
- package/dist/server/storage/preflight.d.ts +20 -0
- package/dist/server/storage/preflight.d.ts.map +1 -0
- package/dist/server/storage/preflight.js +22 -0
- package/dist/server/storage/project-binding.d.ts +5 -0
- package/dist/server/storage/project-binding.d.ts.map +1 -0
- package/dist/server/storage/project-binding.js +32 -0
- package/dist/server/storage/rows.d.ts +104 -0
- package/dist/server/storage/rows.d.ts.map +1 -0
- package/dist/server/storage/rows.js +2 -0
- package/dist/server/storage/schema.d.ts +20 -0
- package/dist/server/storage/schema.d.ts.map +1 -0
- package/dist/server/storage/schema.js +134 -0
- package/dist/server/storage/types.d.ts +66 -0
- package/dist/server/storage/types.d.ts.map +1 -0
- package/dist/server/storage/types.js +1 -0
- package/dist/server/storage.d.ts +7 -94
- package/dist/server/storage.d.ts.map +1 -1
- package/dist/server/storage.js +6 -224
- package/dist/server/wire.d.ts +19 -0
- package/dist/server/wire.d.ts.map +1 -1
- package/package.json +2 -1
- package/dist/sdk/agent-core/harness/agent-harness.d.ts +0 -92
- package/dist/sdk/agent-core/harness/agent-harness.d.ts.map +0 -1
- package/dist/sdk/agent-core/harness/agent-harness.js +0 -899
- package/dist/sdk/agent-core/harness/env/nodejs.d.ts +0 -51
- package/dist/sdk/agent-core/harness/env/nodejs.d.ts.map +0 -1
- package/dist/sdk/agent-core/harness/env/nodejs.js +0 -485
- package/dist/sdk/agent-core/harness/prompt-templates.d.ts +0 -48
- package/dist/sdk/agent-core/harness/prompt-templates.d.ts.map +0 -1
- package/dist/sdk/agent-core/harness/prompt-templates.js +0 -229
- package/dist/sdk/agent-core/harness/session/jsonl-repo.d.ts +0 -26
- package/dist/sdk/agent-core/harness/session/jsonl-repo.d.ts.map +0 -1
- package/dist/sdk/agent-core/harness/session/jsonl-repo.js +0 -100
- package/dist/sdk/agent-core/harness/session/jsonl-storage.d.ts +0 -33
- package/dist/sdk/agent-core/harness/session/jsonl-storage.d.ts.map +0 -1
- package/dist/sdk/agent-core/harness/session/jsonl-storage.js +0 -230
- package/dist/sdk/agent-core/harness/session/memory-repo.d.ts +0 -18
- package/dist/sdk/agent-core/harness/session/memory-repo.d.ts.map +0 -1
- package/dist/sdk/agent-core/harness/session/memory-repo.js +0 -41
- package/dist/sdk/agent-core/harness/session/memory-storage.d.ts +0 -25
- package/dist/sdk/agent-core/harness/session/memory-storage.d.ts.map +0 -1
- package/dist/sdk/agent-core/harness/session/memory-storage.js +0 -113
- package/dist/sdk/agent-core/harness/session/repo-utils.d.ts +0 -11
- package/dist/sdk/agent-core/harness/session/repo-utils.d.ts.map +0 -1
- package/dist/sdk/agent-core/harness/session/repo-utils.js +0 -38
- package/dist/sdk/agent-core/harness/skills.d.ts +0 -44
- package/dist/sdk/agent-core/harness/skills.d.ts.map +0 -1
- package/dist/sdk/agent-core/harness/skills.js +0 -310
- package/dist/sdk/agent-core/harness/utils/shell-output.d.ts +0 -14
- package/dist/sdk/agent-core/harness/utils/shell-output.d.ts.map +0 -1
- package/dist/sdk/agent-core/harness/utils/shell-output.js +0 -125
- package/dist/sdk/agent-core/node.d.ts +0 -3
- package/dist/sdk/agent-core/node.d.ts.map +0 -1
- package/dist/sdk/agent-core/node.js +0 -2
- package/dist/sdk/agent-core/proxy.d.ts +0 -69
- package/dist/sdk/agent-core/proxy.d.ts.map +0 -1
- package/dist/sdk/agent-core/proxy.js +0 -297
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wire-event parsing and content sanitization for session history
|
|
3
|
+
* rehydration. Extracted verbatim from `agent-bridge.ts`. Pure helpers —
|
|
4
|
+
* no bridge state.
|
|
5
|
+
*/
|
|
6
|
+
import type { ImageContent, TextContent } from "../../sdk/ai/types.js";
|
|
7
|
+
import type { RestoredMemorySnapshot } from "../../memory/types.js";
|
|
8
|
+
import type { SessionMemorySnapshot } from "../storage.js";
|
|
9
|
+
interface ParsedWireToolEvents {
|
|
10
|
+
toolCalls: Array<{
|
|
11
|
+
id: string;
|
|
12
|
+
name: string;
|
|
13
|
+
arguments: Record<string, unknown> | undefined;
|
|
14
|
+
}>;
|
|
15
|
+
toolResults: Array<{
|
|
16
|
+
id: string;
|
|
17
|
+
result: unknown;
|
|
18
|
+
isError: boolean;
|
|
19
|
+
}>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Parse the newline-delimited JSON of wire events persisted alongside an
|
|
23
|
+
* assistant message and extract all tool_call / tool_result events.
|
|
24
|
+
*
|
|
25
|
+
* These are used during session rehydration to reconstruct the full tool
|
|
26
|
+
* interaction history (call → result) so the LLM context is complete —
|
|
27
|
+
* without this, reconnected sessions would see only the assistant text
|
|
28
|
+
* and never the tool results, causing the model to get confused about
|
|
29
|
+
* the conversation state.
|
|
30
|
+
*/
|
|
31
|
+
export declare function parseWireToolEvents(eventsJsonl: string): ParsedWireToolEvents;
|
|
32
|
+
export declare function sanitizeRehydratedBlock(block: TextContent | ImageContent): TextContent | ImageContent;
|
|
33
|
+
export declare function toRestoredMemorySnapshot(snapshot: SessionMemorySnapshot): RestoredMemorySnapshot;
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=rehydrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rehydrate.d.ts","sourceRoot":"","sources":["../../../src/server/agent-bridge/rehydrate.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,KAAK,EACV,sBAAsB,EAEvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAE3D,UAAU,oBAAoB;IAC5B,SAAS,EAAE,KAAK,CAAC;QACf,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;KAChD,CAAC,CAAC;IACH,WAAW,EAAE,KAAK,CAAC;QACjB,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,OAAO,CAAC;QAChB,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC,CAAC;CACJ;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,oBAAoB,CA8B7E;AAmBD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,WAAW,GAAG,YAAY,GAChC,WAAW,GAAG,YAAY,CA2C5B;AAcD,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,qBAAqB,GAC9B,sBAAsB,CAQxB"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Wire event parsing for history rehydration
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
/**
|
|
5
|
+
* Parse the newline-delimited JSON of wire events persisted alongside an
|
|
6
|
+
* assistant message and extract all tool_call / tool_result events.
|
|
7
|
+
*
|
|
8
|
+
* These are used during session rehydration to reconstruct the full tool
|
|
9
|
+
* interaction history (call → result) so the LLM context is complete —
|
|
10
|
+
* without this, reconnected sessions would see only the assistant text
|
|
11
|
+
* and never the tool results, causing the model to get confused about
|
|
12
|
+
* the conversation state.
|
|
13
|
+
*/
|
|
14
|
+
export function parseWireToolEvents(eventsJsonl) {
|
|
15
|
+
const toolCalls = [];
|
|
16
|
+
const toolResults = [];
|
|
17
|
+
if (!eventsJsonl)
|
|
18
|
+
return { toolCalls, toolResults };
|
|
19
|
+
for (const line of eventsJsonl.split("\n")) {
|
|
20
|
+
const trimmed = line.trim();
|
|
21
|
+
if (!trimmed)
|
|
22
|
+
continue;
|
|
23
|
+
try {
|
|
24
|
+
const ev = JSON.parse(trimmed);
|
|
25
|
+
if (ev.type === "tool_call") {
|
|
26
|
+
toolCalls.push({
|
|
27
|
+
id: ev.id,
|
|
28
|
+
name: ev.name,
|
|
29
|
+
arguments: ev.args,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
else if (ev.type === "tool_result") {
|
|
33
|
+
toolResults.push({
|
|
34
|
+
id: ev.id,
|
|
35
|
+
result: ev.result,
|
|
36
|
+
isError: ev.isError ?? false,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// Skip malformed JSON lines — they won't be meaningful for
|
|
42
|
+
// rehydration and we'd rather keep the session alive than fail.
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return { toolCalls, toolResults };
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Safety clean-up for content blocks rehydrated from persisted wire events.
|
|
49
|
+
*
|
|
50
|
+
* Rehydrated tool-result content is bounded for the model-facing context,
|
|
51
|
+
* while the original wire event remains available to the UI for rendering
|
|
52
|
+
* images and other rich results.
|
|
53
|
+
*/
|
|
54
|
+
const MAX_REHYDRATED_TEXT = 100_000;
|
|
55
|
+
/**
|
|
56
|
+
* Ceiling for blocks that already carry an offload footer (`Full output:`).
|
|
57
|
+
* These blocks are a bounded preview + a re-readable path, so cutting them
|
|
58
|
+
* with the generic limit would destroy the footer. Keep them whole up to
|
|
59
|
+
* this size; larger ones lose their middle but keep head + footer.
|
|
60
|
+
*/
|
|
61
|
+
const MAX_REHYDRATED_OFFLOAD_TEXT = 200_000;
|
|
62
|
+
export function sanitizeRehydratedBlock(block) {
|
|
63
|
+
// Tool-result image blocks are not accepted by every provider; the raw
|
|
64
|
+
// result remains in events_jsonl for the UI, while the model gets a compact reference.
|
|
65
|
+
if (block.type === "image") {
|
|
66
|
+
// Hosted images carry a url instead of inline bytes — print that rather
|
|
67
|
+
// than a meaningless "0 bytes base64".
|
|
68
|
+
const hostedUrl = typeof block.url === "string" && block.url ? block.url : undefined;
|
|
69
|
+
const descriptor = hostedUrl
|
|
70
|
+
? `[Image: ${block.mimeType ?? "image/png"}, url: ${hostedUrl}]`
|
|
71
|
+
: `[Image: ${block.mimeType ?? "image/png"}, ${(typeof block.data === "string" ? block.data.length : 0).toLocaleString()} bytes base64]`;
|
|
72
|
+
return {
|
|
73
|
+
type: "text",
|
|
74
|
+
text: descriptor +
|
|
75
|
+
`\n(Image data is available in the raw MCP result.)`,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
// Truncate oversized text blocks to prevent context overflow.
|
|
79
|
+
if (block.type !== "text")
|
|
80
|
+
return block;
|
|
81
|
+
if (block.text.includes("Full output:")) {
|
|
82
|
+
if (block.text.length <= MAX_REHYDRATED_OFFLOAD_TEXT)
|
|
83
|
+
return block;
|
|
84
|
+
// Keep the head (preview) and the tail (offload footer), drop the middle.
|
|
85
|
+
const keepHead = Math.floor(MAX_REHYDRATED_OFFLOAD_TEXT * 0.7);
|
|
86
|
+
const keepTail = MAX_REHYDRATED_OFFLOAD_TEXT - keepHead;
|
|
87
|
+
const omitted = block.text.length - keepHead - keepTail;
|
|
88
|
+
return {
|
|
89
|
+
...block,
|
|
90
|
+
text: block.text.slice(0, keepHead) +
|
|
91
|
+
`\n\n[... ${omitted.toLocaleString()} bytes omitted from rehydrated offload preview ...]\n\n` +
|
|
92
|
+
block.text.slice(block.text.length - keepTail),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
if (block.text.length <= MAX_REHYDRATED_TEXT)
|
|
96
|
+
return block;
|
|
97
|
+
const omitted = block.text.length - MAX_REHYDRATED_TEXT;
|
|
98
|
+
return {
|
|
99
|
+
...block,
|
|
100
|
+
text: block.text.slice(0, MAX_REHYDRATED_TEXT) +
|
|
101
|
+
`\n\n[truncated — ${omitted.toLocaleString()} bytes omitted]`,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function normalizeSnapshotDetails(details) {
|
|
105
|
+
if (details.version === 4)
|
|
106
|
+
return details;
|
|
107
|
+
return {
|
|
108
|
+
type: "observational-memory",
|
|
109
|
+
version: 4,
|
|
110
|
+
observations: details.observations,
|
|
111
|
+
reflections: details.reflections,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
export function toRestoredMemorySnapshot(snapshot) {
|
|
115
|
+
return {
|
|
116
|
+
type: "observational-memory-snapshot",
|
|
117
|
+
version: 1,
|
|
118
|
+
coveredSourceCount: snapshot.coveredSourceCount,
|
|
119
|
+
summary: snapshot.summary,
|
|
120
|
+
details: normalizeSnapshotDetails(snapshot.details),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Synthetic (backend-proxied) model capability inference for the agent bridge.
|
|
3
|
+
*
|
|
4
|
+
* Extracted verbatim from `agent-bridge.ts`: given a backend `AllowedModel`,
|
|
5
|
+
* infer the spectral `Model` fields (context window, thinking-level map,
|
|
6
|
+
* OpenAI-completions compat flags) used when registering the synthetic proxy
|
|
7
|
+
* providers with spectral's `ModelRegistry`. Pure functions — no bridge state.
|
|
8
|
+
*/
|
|
9
|
+
import type { Api, Model } from "../../sdk/ai/types.js";
|
|
10
|
+
import type { AllowedModel } from "../../relay/models-fetch.js";
|
|
11
|
+
/**
|
|
12
|
+
* Synthetic provider names registered with spectral's `ModelRegistry`. They route
|
|
13
|
+
* 100% of inference traffic through the backend (`${backendUrl}/v1`), which
|
|
14
|
+
* authenticates with the machine JWT and forwards to the upstream provider
|
|
15
|
+
* with centrally-managed API keys.
|
|
16
|
+
*
|
|
17
|
+
* Two providers (rather than one): `spectral-proxy-openai` for upstream catalog
|
|
18
|
+
* models (OpenRouter, DeepSeek, OpenAI, etc.), and
|
|
19
|
+
* `spectral-proxy-user-model` for team-registered built-in UserModel entries.
|
|
20
|
+
* Both use the OpenAI-compatible `/chat/completions` request shape.
|
|
21
|
+
*/
|
|
22
|
+
export declare const SPECTRAL_PROXY_OPENAI = "spectral-proxy-openai";
|
|
23
|
+
export declare const SPECTRAL_PROXY_USER_MODEL = "spectral-proxy-user-model";
|
|
24
|
+
export declare function inferSyntheticContextWindow(model: AllowedModel): number;
|
|
25
|
+
export declare function inferSyntheticThinkingLevelMap(model: AllowedModel): Model<Api>["thinkingLevelMap"] | undefined;
|
|
26
|
+
export declare function inferSyntheticOpenAICompat(model: AllowedModel): Model<"openai-completions">["compat"] | undefined;
|
|
27
|
+
//# sourceMappingURL=synthetic-model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synthetic-model.d.ts","sourceRoot":"","sources":["../../../src/server/agent-bridge/synthetic-model.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAGhE;;;;;;;;;;GAUG;AACH,eAAO,MAAM,qBAAqB,0BAA0B,CAAC;AAC7D,eAAO,MAAM,yBAAyB,8BAA8B,CAAC;AAGrE,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAmBvE;AAED,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,YAAY,GAClB,KAAK,CAAC,GAAG,CAAC,CAAC,kBAAkB,CAAC,GAAG,SAAS,CAkB5C;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,YAAY,GAClB,KAAK,CAAC,oBAAoB,CAAC,CAAC,QAAQ,CAAC,GAAG,SAAS,CA0CnD"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Synthetic (backend-proxied) model capability inference for the agent bridge.
|
|
3
|
+
*
|
|
4
|
+
* Extracted verbatim from `agent-bridge.ts`: given a backend `AllowedModel`,
|
|
5
|
+
* infer the spectral `Model` fields (context window, thinking-level map,
|
|
6
|
+
* OpenAI-completions compat flags) used when registering the synthetic proxy
|
|
7
|
+
* providers with spectral's `ModelRegistry`. Pure functions — no bridge state.
|
|
8
|
+
*/
|
|
9
|
+
import { bareModelId } from "./pricing.js";
|
|
10
|
+
/**
|
|
11
|
+
* Synthetic provider names registered with spectral's `ModelRegistry`. They route
|
|
12
|
+
* 100% of inference traffic through the backend (`${backendUrl}/v1`), which
|
|
13
|
+
* authenticates with the machine JWT and forwards to the upstream provider
|
|
14
|
+
* with centrally-managed API keys.
|
|
15
|
+
*
|
|
16
|
+
* Two providers (rather than one): `spectral-proxy-openai` for upstream catalog
|
|
17
|
+
* models (OpenRouter, DeepSeek, OpenAI, etc.), and
|
|
18
|
+
* `spectral-proxy-user-model` for team-registered built-in UserModel entries.
|
|
19
|
+
* Both use the OpenAI-compatible `/chat/completions` request shape.
|
|
20
|
+
*/
|
|
21
|
+
export const SPECTRAL_PROXY_OPENAI = "spectral-proxy-openai";
|
|
22
|
+
export const SPECTRAL_PROXY_USER_MODEL = "spectral-proxy-user-model";
|
|
23
|
+
const KIMI_K2_7_CODE_CONTEXT_WINDOW = 262_144;
|
|
24
|
+
export function inferSyntheticContextWindow(model) {
|
|
25
|
+
if (typeof model.contextWindow === "number" &&
|
|
26
|
+
Number.isFinite(model.contextWindow)) {
|
|
27
|
+
return model.contextWindow;
|
|
28
|
+
}
|
|
29
|
+
const modelId = model.modelId.toLowerCase();
|
|
30
|
+
const bare = bareModelId(modelId);
|
|
31
|
+
if (modelId === "moonshotai/kimi-k2.7-code" ||
|
|
32
|
+
bare === "kimi-k2.7-code" ||
|
|
33
|
+
bare === "local-openrouter-kimi") {
|
|
34
|
+
return KIMI_K2_7_CODE_CONTEXT_WINDOW;
|
|
35
|
+
}
|
|
36
|
+
return 0;
|
|
37
|
+
}
|
|
38
|
+
export function inferSyntheticThinkingLevelMap(model) {
|
|
39
|
+
if (!model.supportsReasoning)
|
|
40
|
+
return undefined;
|
|
41
|
+
const modelId = model.modelId.toLowerCase();
|
|
42
|
+
const bare = bareModelId(modelId);
|
|
43
|
+
if (model.provider === "built-in" &&
|
|
44
|
+
(modelId.includes("gpt-5") || bare.includes("gpt-5"))) {
|
|
45
|
+
return {
|
|
46
|
+
off: "none",
|
|
47
|
+
minimal: "minimal",
|
|
48
|
+
low: "low",
|
|
49
|
+
medium: "medium",
|
|
50
|
+
high: "high",
|
|
51
|
+
xhigh: "xhigh",
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
export function inferSyntheticOpenAICompat(model) {
|
|
57
|
+
const bare = bareModelId(model.modelId);
|
|
58
|
+
const isDeepSeek = model.provider === "deepseek" ||
|
|
59
|
+
model.modelId.startsWith("deepseek/") ||
|
|
60
|
+
bare.startsWith("deepseek");
|
|
61
|
+
if (isDeepSeek) {
|
|
62
|
+
return {
|
|
63
|
+
thinkingFormat: "deepseek",
|
|
64
|
+
requiresReasoningContentOnAssistantMessages: true,
|
|
65
|
+
supportsDeveloperRole: false,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
if (model.provider === "built-in") {
|
|
69
|
+
const compat = {
|
|
70
|
+
// Built-in models are proxied through the backend, which forwards a
|
|
71
|
+
// session-affinity key to OpenRouter for prompt-cache sticky routing.
|
|
72
|
+
// Sending the real per-session id from the CLI lets the backend use it
|
|
73
|
+
// instead of a coarser machine/team fallback, maximizing cache hits on
|
|
74
|
+
// large multi-turn agentic prompts.
|
|
75
|
+
sendSessionAffinityHeaders: true,
|
|
76
|
+
};
|
|
77
|
+
if (model.modelId.toLowerCase().includes("gpt-5") ||
|
|
78
|
+
bare.toLowerCase().includes("gpt-5")) {
|
|
79
|
+
compat.thinkingFormat = "openai";
|
|
80
|
+
compat.supportsReasoningEffort = true;
|
|
81
|
+
compat.supportsStore = false;
|
|
82
|
+
}
|
|
83
|
+
return compat;
|
|
84
|
+
}
|
|
85
|
+
if (model.provider === "openrouter") {
|
|
86
|
+
const compat = {
|
|
87
|
+
thinkingFormat: "openrouter",
|
|
88
|
+
};
|
|
89
|
+
return compat;
|
|
90
|
+
}
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
@@ -54,6 +54,10 @@ import { fetchAllowedModels as defaultFetchAllowedModels } from "../relay/models
|
|
|
54
54
|
import type { SessionMemorySnapshot } from "./storage.js";
|
|
55
55
|
import type { ImageAttachment, ServerEvent, WireMessage } from "./wire.js";
|
|
56
56
|
import type { DevProcessRegistry } from "./dev-process-registry.js";
|
|
57
|
+
export { bareModelId, calculateCredits, getModelCost, lookupPricing, } from "./agent-bridge/pricing.js";
|
|
58
|
+
export { SPECTRAL_PROXY_OPENAI, SPECTRAL_PROXY_USER_MODEL, inferSyntheticContextWindow, inferSyntheticOpenAICompat, inferSyntheticThinkingLevelMap, } from "./agent-bridge/synthetic-model.js";
|
|
59
|
+
export { parseWireToolEvents, sanitizeRehydratedBlock, toRestoredMemorySnapshot, } from "./agent-bridge/rehydrate.js";
|
|
60
|
+
export { createHeadlessUIContext } from "./agent-bridge/headless-ui.js";
|
|
57
61
|
interface AgentBridgeCompactionOptions {
|
|
58
62
|
customInstructions?: string;
|
|
59
63
|
phaseBoundary?: boolean;
|
|
@@ -218,7 +222,20 @@ export declare class AgentBridge {
|
|
|
218
222
|
* timer flushes it once the minimum interval has elapsed.
|
|
219
223
|
*/
|
|
220
224
|
private subagentProgressThrottle;
|
|
225
|
+
/**
|
|
226
|
+
* toolCallId → startedAt captured at `tool_execution_start` so the
|
|
227
|
+
* terminal `tool_result` can carry the real start time (durations
|
|
228
|
+
* end-to-end). Entries with no end event are bounded: more than 2000
|
|
229
|
+
* orphans means ids are never resolving, so the oldest are cleared.
|
|
230
|
+
*/
|
|
231
|
+
private toolStartedAt;
|
|
221
232
|
constructor(opts: AgentBridgeOptions);
|
|
233
|
+
/**
|
|
234
|
+
* Resolve credit rates for a subagent result. Subagents may run a
|
|
235
|
+
* different model than the parent — see pricing.resolveCreditRatesForModel
|
|
236
|
+
* for the model-matching rule.
|
|
237
|
+
*/
|
|
238
|
+
private resolveSubagentCreditRates;
|
|
222
239
|
/**
|
|
223
240
|
* Create the spectral session, wire up subscription, and return.
|
|
224
241
|
* Throws on creation failure (caller should surface to client).
|
|
@@ -501,5 +518,4 @@ export declare class AgentBridge {
|
|
|
501
518
|
*/
|
|
502
519
|
handleEvent(ev: AgentSessionEvent): void;
|
|
503
520
|
}
|
|
504
|
-
export {};
|
|
505
521
|
//# sourceMappingURL=agent-bridge.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-bridge.d.ts","sourceRoot":"","sources":["../../src/server/agent-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AAaH,OAAO,EAQL,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,
|
|
1
|
+
{"version":3,"file":"agent-bridge.d.ts","sourceRoot":"","sources":["../../src/server/agent-bridge.ts"],"names":[],"mappings":"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"}
|