@aexol/spectral 0.9.251 → 0.9.255
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/extensions/dataset-uploader/analyzer.d.ts +103 -0
- package/dist/extensions/dataset-uploader/analyzer.d.ts.map +1 -0
- package/dist/extensions/dataset-uploader/analyzer.js +266 -0
- package/dist/extensions/dataset-uploader/cleaner.d.ts +59 -0
- package/dist/extensions/dataset-uploader/cleaner.d.ts.map +1 -0
- package/dist/extensions/dataset-uploader/cleaner.js +118 -0
- package/dist/extensions/dataset-uploader/exporter.d.ts +147 -0
- package/dist/extensions/dataset-uploader/exporter.d.ts.map +1 -0
- package/dist/extensions/dataset-uploader/exporter.js +313 -0
- package/dist/extensions/dataset-uploader/extra-values.d.ts +17 -0
- package/dist/extensions/dataset-uploader/extra-values.d.ts.map +1 -0
- package/dist/extensions/dataset-uploader/extra-values.js +51 -0
- package/dist/extensions/dataset-uploader/index.d.ts +22 -0
- package/dist/extensions/dataset-uploader/index.d.ts.map +1 -0
- package/dist/extensions/dataset-uploader/index.js +247 -0
- package/dist/extensions/dataset-uploader/scrubber.d.ts +34 -0
- package/dist/extensions/dataset-uploader/scrubber.d.ts.map +1 -0
- package/dist/extensions/dataset-uploader/scrubber.js +91 -0
- package/dist/extensions/dataset-uploader/upload.d.ts +105 -0
- package/dist/extensions/dataset-uploader/upload.d.ts.map +1 -0
- package/dist/extensions/dataset-uploader/upload.js +274 -0
- package/dist/generated/zeus/const.d.ts.map +1 -1
- package/dist/generated/zeus/const.js +80 -6
- package/dist/generated/zeus/index.d.ts +432 -36
- package/dist/generated/zeus/index.d.ts.map +1 -1
- package/dist/mcp/commands.d.ts.map +1 -1
- package/dist/mcp/commands.js +3 -0
- package/dist/mcp/direct-tools.d.ts.map +1 -1
- package/dist/mcp/direct-tools.js +4 -3
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +5 -1
- package/dist/mcp/mcp-auth-flow.d.ts +5 -1
- package/dist/mcp/mcp-auth-flow.d.ts.map +1 -1
- package/dist/mcp/mcp-auth-flow.js +20 -4
- package/dist/mcp/mcp-auth-start.d.ts +64 -0
- package/dist/mcp/mcp-auth-start.d.ts.map +1 -0
- package/dist/mcp/mcp-auth-start.js +136 -0
- package/dist/mcp/proxy-modes.d.ts +7 -0
- package/dist/mcp/proxy-modes.d.ts.map +1 -1
- package/dist/mcp/proxy-modes.js +71 -11
- package/dist/mcp/server-manager.d.ts +2 -1
- package/dist/mcp/server-manager.d.ts.map +1 -1
- package/dist/mcp/server-manager.js +8 -4
- package/dist/memory/commands/status.d.ts.map +1 -1
- package/dist/memory/commands/status.js +2 -1
- package/dist/memory/hooks/compaction-trigger.d.ts +14 -1
- package/dist/memory/hooks/compaction-trigger.d.ts.map +1 -1
- package/dist/memory/hooks/compaction-trigger.js +31 -4
- package/dist/relay/dispatcher.d.ts.map +1 -1
- package/dist/relay/dispatcher.js +4 -47
- package/dist/relay/routing.d.ts +1 -1
- package/dist/relay/routing.d.ts.map +1 -1
- package/dist/relay/routing.js +9 -0
- package/dist/sdk/ai/utils/image-source.d.ts +26 -11
- package/dist/sdk/ai/utils/image-source.d.ts.map +1 -1
- package/dist/sdk/ai/utils/image-source.js +184 -47
- package/dist/sdk/ai/utils/transient-error.d.ts +4 -0
- package/dist/sdk/ai/utils/transient-error.d.ts.map +1 -1
- package/dist/sdk/ai/utils/transient-error.js +15 -0
- package/dist/sdk/coding-agent/core/compaction/policy.d.ts +2 -0
- package/dist/sdk/coding-agent/core/compaction/policy.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/compaction/policy.js +2 -0
- package/dist/sdk/coding-agent/core/extensions/native-extensions.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/extensions/native-extensions.js +10 -0
- package/dist/sdk/coding-agent/core/system-prompt.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/system-prompt.js +4 -0
- package/dist/sdk/coding-agent/core/tools/read.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/tools/read.js +14 -7
- package/dist/sdk/coding-agent/index.d.ts +1 -1
- package/dist/sdk/coding-agent/index.d.ts.map +1 -1
- package/dist/sdk/coding-agent/index.js +1 -1
- package/dist/sdk/coding-agent/utils/image-resize.d.ts +25 -11
- package/dist/sdk/coding-agent/utils/image-resize.d.ts.map +1 -1
- package/dist/sdk/coding-agent/utils/image-resize.js +54 -36
- package/dist/sdk/coding-agent/utils/photon.d.ts.map +1 -1
- package/dist/sdk/coding-agent/utils/photon.js +11 -2
- package/dist/server/agent-bridge.d.ts +32 -0
- package/dist/server/agent-bridge.d.ts.map +1 -1
- package/dist/server/agent-bridge.js +59 -9
- package/dist/server/handlers/mcp-auth.d.ts +28 -0
- package/dist/server/handlers/mcp-auth.d.ts.map +1 -0
- package/dist/server/handlers/mcp-auth.js +41 -0
- package/dist/server/handlers/mcp-status.d.ts +8 -2
- package/dist/server/handlers/mcp-status.d.ts.map +1 -1
- package/dist/server/handlers/mcp-status.js +15 -3
- package/dist/server/preset-chain.d.ts +0 -13
- package/dist/server/preset-chain.d.ts.map +1 -1
- package/dist/server/preset-chain.js +0 -25
- package/dist/server/session-stream/memory.d.ts.map +1 -1
- package/dist/server/session-stream/memory.js +8 -1
- package/dist/server/session-stream.d.ts +15 -56
- package/dist/server/session-stream.d.ts.map +1 -1
- package/dist/server/session-stream.js +41 -271
- package/dist/server/wire.d.ts +18 -32
- package/dist/server/wire.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
/** Built-in fraction of the model context window that triggers compaction/pruning. */
|
|
2
2
|
export declare const CONTEXT_LIMIT_RATIO = 0.8;
|
|
3
|
+
/** Ceiling (fraction of the model context window) for the post-run auto-compaction threshold. */
|
|
4
|
+
export declare const AUTO_COMPACTION_WINDOW_RATIO = 0.92;
|
|
3
5
|
export interface ConversationCompactionPolicy {
|
|
4
6
|
enabled: boolean;
|
|
5
7
|
reserveTokens: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../../../../src/sdk/coding-agent/core/compaction/policy.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,eAAO,MAAM,mBAAmB,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../../../../src/sdk/coding-agent/core/compaction/policy.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,eAAO,MAAM,mBAAmB,MAAM,CAAC;AACvC,iGAAiG;AACjG,eAAO,MAAM,4BAA4B,OAAO,CAAC;AAEjD,MAAM,WAAW,4BAA4B;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,sBAAsB;IACtC,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,gCAAgC;IAChD,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,6EAA6E;IAC7E,eAAe,EAAE,MAAM,CAAC;IACxB,oFAAoF;IACpF,eAAe,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,2BAA2B;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,4BAA4B,EAAE,MAAM,CAAC;IACrC,+BAA+B,EAAE,MAAM,CAAC;IACxC,+BAA+B,EAAE,MAAM,CAAC;IACxC,gCAAgC,EAAE,MAAM,CAAC;CACzC;AAED,MAAM,WAAW,0BAA0B;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,UAAU,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,4BAA4B;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAChC,YAAY,EAAE,4BAA4B,CAAC;IAC3C,MAAM,EAAE,sBAAsB,CAAC;IAC/B,gBAAgB,EAAE,gCAAgC,CAAC;IACnD,WAAW,EAAE,2BAA2B,CAAC;IACzC,oBAAoB,EAAE,0BAA0B,CAAC;IACjD,sBAAsB,EAAE,4BAA4B,CAAC;CACrD;AAED,MAAM,WAAW,wBAAwB;IACxC,qEAAqE;IACrE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kEAAkE;IAClE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+EAA+E;IAC/E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACzC,gBAAgB,CAAC,EAAE,OAAO,CAAC,gCAAgC,CAAC,CAAC;IAC7D,WAAW,CAAC,EAAE,OAAO,CAAC,2BAA2B,CAAC,CAAC;IACnD,oBAAoB,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,CAAC;IAC3D,sBAAsB,CAAC,EAAE,OAAO,CAAC,4BAA4B,CAAC,CAAC;CAC/D;AAED,eAAO,MAAM,yBAAyB,EAAE,gBA2CvC,CAAC;AAyBF,wBAAgB,+BAA+B,CAC9C,KAAK,EAAE,OAAO,EACd,YAAY,GAAE,sBAAyD,GACrE,MAAM,CAOR;AAED,wBAAgB,gDAAgD,CAC/D,KAAK,EAAE,OAAO,EACd,WAAW,GAAE,2BAAmE,GAC9E,MAAM,CAOR;AAED,wBAAgB,yCAAyC,CACxD,MAAM,EAAE,gBAAgB,EACxB,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACtC,MAAM,GAAG,IAAI,CAIf;AAED;;;;;;;GAOG;AACH,wBAAgB,mCAAmC,CAClD,MAAM,EAAE,gBAAgB,EACxB,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACxC,wBAAwB,CAAC,EAAE,MAAM,GAC/B,MAAM,GAAG,SAAS,CAepB;AAED;;;;;GAKG;AACH,wBAAgB,mCAAmC,CAClD,MAAM,EAAE,gBAAgB,EACxB,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACxC,gBAAgB,EAAE,MAAM,GACtB,MAAM,CAMR;AA+ED,wBAAgB,yBAAyB,CAAC,QAAQ,CAAC,EAAE,wBAAwB,GAAG,gBAAgB,CAoC/F"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
/** Built-in fraction of the model context window that triggers compaction/pruning. */
|
|
2
2
|
export const CONTEXT_LIMIT_RATIO = 0.8;
|
|
3
|
+
/** Ceiling (fraction of the model context window) for the post-run auto-compaction threshold. */
|
|
4
|
+
export const AUTO_COMPACTION_WINDOW_RATIO = 0.92;
|
|
3
5
|
export const DEFAULT_COMPACTION_POLICY = {
|
|
4
6
|
conversation: {
|
|
5
7
|
enabled: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native-extensions.d.ts","sourceRoot":"","sources":["../../../../../src/sdk/coding-agent/core/extensions/native-extensions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,sBAAsB,GAAG,KAAK,GAAG,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEhG,MAAM,WAAW,uBAAuB;IACtC,qEAAqE;IACrE,EAAE,EAAE,MAAM,CAAC;IACX,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,aAAa,CAAC;IAChD;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,cAAc,EAAE,OAAO,CAAC;IACxB,mCAAmC;IACnC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,EAAE,uBAAuB,
|
|
1
|
+
{"version":3,"file":"native-extensions.d.ts","sourceRoot":"","sources":["../../../../../src/sdk/coding-agent/core/extensions/native-extensions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,sBAAsB,GAAG,KAAK,GAAG,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEhG,MAAM,WAAW,uBAAuB;IACtC,qEAAqE;IACrE,EAAE,EAAE,MAAM,CAAC;IACX,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,aAAa,CAAC;IAChD;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,cAAc,EAAE,OAAO,CAAC;IACxB,mCAAmC;IACnC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,EAAE,uBAAuB,EAwLtD,CAAC;AAEF;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,uBAAuB,GAAG,SAAS,CAElF;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAI1G;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAI3G;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;IAClG,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC,CAUD"}
|
|
@@ -176,6 +176,16 @@ export const NATIVE_EXTENSIONS = [
|
|
|
176
176
|
defaultEnabled: true,
|
|
177
177
|
tags: ["sessions", "parallel", "fanout", "orchestration"],
|
|
178
178
|
},
|
|
179
|
+
{
|
|
180
|
+
id: "dataset-uploader",
|
|
181
|
+
label: "Dataset Uploader",
|
|
182
|
+
description: "Export, analyze, clean and upload harness sessions to the team dataset vault (training data). " +
|
|
183
|
+
"Use only on explicit user request.",
|
|
184
|
+
category: "integration",
|
|
185
|
+
entryPath: "src/extensions/dataset-uploader/index.ts",
|
|
186
|
+
defaultEnabled: false,
|
|
187
|
+
tags: ["dataset", "sft", "training", "upload"],
|
|
188
|
+
},
|
|
179
189
|
];
|
|
180
190
|
/**
|
|
181
191
|
* Look up a native extension by id. Returns undefined for unknown ids.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../../../src/sdk/coding-agent/core/system-prompt.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAyB,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAEhE,MAAM,WAAW,wBAAwB;IACxC,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,qFAAqF;IACrF,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,uCAAuC;IACvC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,6FAA6F;IAC7F,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,yBAAyB;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,gCAAgC;IAChC,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,yBAAyB;IACzB,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../../../src/sdk/coding-agent/core/system-prompt.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAyB,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAEhE,MAAM,WAAW,wBAAwB;IACxC,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,qFAAqF;IACrF,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,uCAAuC;IACvC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,6FAA6F;IAC7F,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,yBAAyB;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,gCAAgC;IAChC,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,yBAAyB;IACzB,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,MAAM,CAwN3E"}
|
|
@@ -41,6 +41,7 @@ export function buildSystemPrompt(options) {
|
|
|
41
41
|
const hasApplyPatch = tools.includes("apply_patch");
|
|
42
42
|
const hasSubagent = tools.includes("subagent");
|
|
43
43
|
const hasMemoryTools = tools.includes("read_project_observations");
|
|
44
|
+
const hasWebFetch = tools.includes("web_fetch");
|
|
44
45
|
// File exploration guidelines
|
|
45
46
|
if (hasBash && !hasGrep && !hasLs) {
|
|
46
47
|
addGuideline("Use bash for file operations like ls, rg, find");
|
|
@@ -76,6 +77,9 @@ export function buildSystemPrompt(options) {
|
|
|
76
77
|
}
|
|
77
78
|
addGuideline("When creating new files, maintain a tree-like directory structure. Place files in semantically meaningful subdirectories (e.g. `handlers/auth/`, `utils/string/`) rather than dumping them at the project root or in shallow flat folders. Group related files into dedicated folders, prefer `feature/module/file.ts` over `feature-file.ts` at root. Avoid creating files directly in root unless they are truly project-wide (e.g. config, package.json). Keep folder depth reasonable (max 5–6 levels) but prefer nesting over flattening — tree-like structure improves LLM navigability and agentic coding efficiency.");
|
|
78
79
|
addGuideline("When editing code, first inspect nearby files and existing patterns; follow the codebase’s conventions and libraries");
|
|
80
|
+
if (hasWebFetch) {
|
|
81
|
+
addGuideline("When writing code that uses a library, if you are not at least 80% confident about the API usage (function signatures, arguments, version-specific behavior), use web_fetch to pull the library's official documentation and verify the usage before writing the code.");
|
|
82
|
+
}
|
|
79
83
|
// Some models (notably via OpenRouter) emit antml-style XML tool calls in
|
|
80
84
|
// plain text instead of using the native tool-call mechanism. The provider
|
|
81
85
|
// parses those as a fallback, but the native path is strictly better
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../../../../src/sdk/coding-agent/core/tools/read.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAI9D,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAM5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAI7D,OAAO,EAAoD,KAAK,gBAAgB,EAAgB,MAAM,eAAe,CAAC;AAEtH,QAAA,MAAM,UAAU;;;;EAId,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC/B,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC9B;AASD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC9B,qCAAqC;IACrC,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACpD,+CAA+C;IAC/C,MAAM,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,sEAAsE;IACtE,mBAAmB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;CACnF;AAQD,MAAM,WAAW,eAAe;IAC/B,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oEAAoE;IACpE,UAAU,CAAC,EAAE,cAAc,CAAC;CAC5B;AAkID,wBAAgB,wBAAwB,CACvC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,eAAe,GACvB,cAAc,CAAC,OAAO,UAAU,EAAE,eAAe,GAAG,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../../../../src/sdk/coding-agent/core/tools/read.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAI9D,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAM5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAI7D,OAAO,EAAoD,KAAK,gBAAgB,EAAgB,MAAM,eAAe,CAAC;AAEtH,QAAA,MAAM,UAAU;;;;EAId,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC/B,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC9B;AASD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC9B,qCAAqC;IACrC,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACpD,+CAA+C;IAC/C,MAAM,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,sEAAsE;IACtE,mBAAmB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;CACnF;AAQD,MAAM,WAAW,eAAe;IAC/B,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oEAAoE;IACpE,UAAU,CAAC,EAAE,cAAc,CAAC;CAC5B;AAkID,wBAAgB,wBAAwB,CACvC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,eAAe,GACvB,cAAc,CAAC,OAAO,UAAU,EAAE,eAAe,GAAG,SAAS,CAAC,CAsLhE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC,OAAO,UAAU,CAAC,CAEnG"}
|
|
@@ -4,7 +4,7 @@ import { access as fsAccess, readFile as fsReadFile } from "fs/promises";
|
|
|
4
4
|
import { Type } from "typebox";
|
|
5
5
|
import { getReadmePath } from "../../config.js";
|
|
6
6
|
import { getLanguageFromPath, highlightCode } from "../theme.js";
|
|
7
|
-
import { formatDimensionNote,
|
|
7
|
+
import { formatDimensionNote, resizeImageOutcome } from "../../utils/image-resize.js";
|
|
8
8
|
import { detectSupportedImageMimeTypeFromFile } from "../../utils/mime.js";
|
|
9
9
|
import { formatPathRelativeToCwdOrAbsolute } from "../../utils/paths.js";
|
|
10
10
|
import { resolveReadPath } from "./path-utils.js";
|
|
@@ -165,16 +165,23 @@ export function createReadToolDefinition(cwd, options) {
|
|
|
165
165
|
const base64 = buffer.toString("base64");
|
|
166
166
|
if (autoResizeImages) {
|
|
167
167
|
// Resize image if needed before sending it back to the model.
|
|
168
|
-
const
|
|
169
|
-
if (!
|
|
170
|
-
|
|
168
|
+
const outcome = await resizeImageOutcome({ type: "image", data: base64, mimeType });
|
|
169
|
+
if (!outcome.ok) {
|
|
170
|
+
// Distinguish a missing image pipeline (e.g. the photon WASM
|
|
171
|
+
// is not shipped with a standalone binary) from a genuine
|
|
172
|
+
// size failure — blaming the size limit for both hides the
|
|
173
|
+
// actual cause from the model.
|
|
174
|
+
const omittedNote = outcome.reason === "pipeline-unavailable"
|
|
175
|
+
? "[Image omitted: image pipeline unavailable — failed to load photon WASM]"
|
|
176
|
+
: "[Image omitted: could not be resized below the inline image size limit.]";
|
|
177
|
+
let textNote = `Read image file [${mimeType}]\n${omittedNote}`;
|
|
171
178
|
if (nonVisionImageNote)
|
|
172
179
|
textNote += `\n${nonVisionImageNote}`;
|
|
173
180
|
content = [{ type: "text", text: textNote }];
|
|
174
181
|
}
|
|
175
182
|
else {
|
|
176
|
-
const dimensionNote = formatDimensionNote(
|
|
177
|
-
let textNote = `Read image file [${
|
|
183
|
+
const dimensionNote = formatDimensionNote(outcome.image);
|
|
184
|
+
let textNote = `Read image file [${outcome.image.mimeType}]`;
|
|
178
185
|
if (dimensionNote)
|
|
179
186
|
textNote += `\n${dimensionNote}`;
|
|
180
187
|
if (nonVisionImageNote) {
|
|
@@ -184,7 +191,7 @@ export function createReadToolDefinition(cwd, options) {
|
|
|
184
191
|
else {
|
|
185
192
|
content = [
|
|
186
193
|
{ type: "text", text: textNote },
|
|
187
|
-
{ type: "image", data:
|
|
194
|
+
{ type: "image", data: outcome.image.data, mimeType: outcome.image.mimeType },
|
|
188
195
|
];
|
|
189
196
|
}
|
|
190
197
|
}
|
|
@@ -28,6 +28,6 @@ export { runPrintMode } from "./modes/print-mode.js";
|
|
|
28
28
|
export { getLanguageFromPath, highlightCode, loadThemeFromPath, type Theme } from "./core/theme.js";
|
|
29
29
|
export { copyToClipboard } from "./utils/clipboard.js";
|
|
30
30
|
export { parseFrontmatter, stripFrontmatter } from "./utils/frontmatter.js";
|
|
31
|
-
export { formatDimensionNote, type
|
|
31
|
+
export { formatDimensionNote, type ImageResizeFailureReason, type ImageResizeOutcome, resizeImage, resizeImageOutcome, type ResizedImage, } from "./utils/image-resize.js";
|
|
32
32
|
export { getShellConfig } from "./utils/shell.js";
|
|
33
33
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/sdk/coding-agent/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/sdk/coding-agent/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -45,6 +45,6 @@ export { getLanguageFromPath, highlightCode, loadThemeFromPath } from "./core/th
|
|
|
45
45
|
// Clipboard utilities
|
|
46
46
|
export { copyToClipboard } from "./utils/clipboard.js";
|
|
47
47
|
export { parseFrontmatter, stripFrontmatter } from "./utils/frontmatter.js";
|
|
48
|
-
export { formatDimensionNote, resizeImage } from "./utils/image-resize.js";
|
|
48
|
+
export { formatDimensionNote, resizeImage, resizeImageOutcome, } from "./utils/image-resize.js";
|
|
49
49
|
// Shell utilities
|
|
50
50
|
export { getShellConfig } from "./utils/shell.js";
|
|
@@ -14,23 +14,37 @@ export interface ResizedImage {
|
|
|
14
14
|
height: number;
|
|
15
15
|
wasResized: boolean;
|
|
16
16
|
}
|
|
17
|
+
/** Why a resize attempt produced no image. */
|
|
18
|
+
export type ImageResizeFailureReason = "no-data" | "pipeline-unavailable" | "too-large";
|
|
19
|
+
/**
|
|
20
|
+
* Outcome of a resize attempt: either a ready-to-send image, or the reason
|
|
21
|
+
* none was produced. Callers use the reason to emit an accurate omission
|
|
22
|
+
* message instead of blaming the size limit for every failure.
|
|
23
|
+
*/
|
|
24
|
+
export type ImageResizeOutcome = {
|
|
25
|
+
ok: true;
|
|
26
|
+
image: ResizedImage;
|
|
27
|
+
} | {
|
|
28
|
+
ok: false;
|
|
29
|
+
reason: ImageResizeFailureReason;
|
|
30
|
+
};
|
|
17
31
|
/**
|
|
18
32
|
* Resize an image to fit within the specified max dimensions and encoded file size.
|
|
19
|
-
* Returns
|
|
20
|
-
*
|
|
21
|
-
* Uses Photon (Rust/WASM) for image processing. If Photon is not available,
|
|
22
|
-
* returns null.
|
|
23
|
-
*
|
|
24
|
-
* Strategy for staying under maxBytes:
|
|
25
|
-
* 1. First resize to maxWidth/maxHeight
|
|
26
|
-
* 2. Try both PNG and JPEG formats, pick the smaller one
|
|
27
|
-
* 3. If still too large, try JPEG with decreasing quality
|
|
28
|
-
* 4. If still too large, progressively reduce dimensions until 1x1
|
|
33
|
+
* Returns a failure reason when no image can be produced (see ImageResizeOutcome).
|
|
29
34
|
*/
|
|
30
|
-
export declare function
|
|
35
|
+
export declare function resizeImageOutcome(img: ImageContent, options?: ImageResizeOptions): Promise<ImageResizeOutcome>;
|
|
31
36
|
/**
|
|
32
37
|
* Format a dimension note for resized images.
|
|
33
38
|
* This helps the model understand the coordinate mapping.
|
|
34
39
|
*/
|
|
35
40
|
export declare function formatDimensionNote(result: ResizedImage): string | undefined;
|
|
41
|
+
/**
|
|
42
|
+
* Resize an image to fit within the specified max dimensions and encoded file size.
|
|
43
|
+
* Returns null if the image cannot be resized below maxBytes.
|
|
44
|
+
*
|
|
45
|
+
* Backward-compatible wrapper around resizeImageOutcome for callers that only
|
|
46
|
+
* care about the image (or nothing). Prefer resizeImageOutcome when the failure
|
|
47
|
+
* reason must be observable.
|
|
48
|
+
*/
|
|
49
|
+
export declare function resizeImage(img: ImageContent, options?: ImageResizeOptions): Promise<ResizedImage | null>;
|
|
36
50
|
//# sourceMappingURL=image-resize.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-resize.d.ts","sourceRoot":"","sources":["../../../../src/sdk/coding-agent/utils/image-resize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAItD,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;CACpB;
|
|
1
|
+
{"version":3,"file":"image-resize.d.ts","sourceRoot":"","sources":["../../../../src/sdk/coding-agent/utils/image-resize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAItD,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;CACpB;AAED,8CAA8C;AAC9C,MAAM,MAAM,wBAAwB,GACjC,SAAS,GACT,sBAAsB,GACtB,WAAW,CAAC;AAEf;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,wBAAwB,CAAA;CAAE,CAAC;AA2BrH;;;GAGG;AACH,wBAAsB,kBAAkB,CACvC,GAAG,EAAE,YAAY,EACjB,OAAO,CAAC,EAAE,kBAAkB,GAC1B,OAAO,CAAC,kBAAkB,CAAC,CA2H7B;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,CAO5E;AAED;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAG/G"}
|
|
@@ -18,29 +18,40 @@ function encodeCandidate(buffer, mimeType) {
|
|
|
18
18
|
}
|
|
19
19
|
/**
|
|
20
20
|
* Resize an image to fit within the specified max dimensions and encoded file size.
|
|
21
|
-
* Returns
|
|
22
|
-
*
|
|
23
|
-
* Uses Photon (Rust/WASM) for image processing. If Photon is not available,
|
|
24
|
-
* returns null.
|
|
25
|
-
*
|
|
26
|
-
* Strategy for staying under maxBytes:
|
|
27
|
-
* 1. First resize to maxWidth/maxHeight
|
|
28
|
-
* 2. Try both PNG and JPEG formats, pick the smaller one
|
|
29
|
-
* 3. If still too large, try JPEG with decreasing quality
|
|
30
|
-
* 4. If still too large, progressively reduce dimensions until 1x1
|
|
21
|
+
* Returns a failure reason when no image can be produced (see ImageResizeOutcome).
|
|
31
22
|
*/
|
|
32
|
-
export async function
|
|
23
|
+
export async function resizeImageOutcome(img, options) {
|
|
33
24
|
const opts = { ...DEFAULT_OPTIONS, ...options };
|
|
34
25
|
// URL-only images have no local bytes to resize.
|
|
35
26
|
const inputData = img.data;
|
|
36
27
|
if (!inputData)
|
|
37
|
-
return
|
|
38
|
-
const inputBuffer = Buffer.from(inputData, "base64");
|
|
28
|
+
return { ok: false, reason: "no-data" };
|
|
39
29
|
const inputBase64Size = Buffer.byteLength(inputData, "utf-8");
|
|
30
|
+
// Fast path: already below the encoded-size limit — pass the original bytes
|
|
31
|
+
// through untouched. Photon (Rust/WASM) is only needed when a resize might
|
|
32
|
+
// actually be required, so small images keep working in standalone binaries
|
|
33
|
+
// where the WASM is not shipped.
|
|
34
|
+
if (inputBase64Size < opts.maxBytes) {
|
|
35
|
+
return {
|
|
36
|
+
ok: true,
|
|
37
|
+
image: {
|
|
38
|
+
data: inputData,
|
|
39
|
+
mimeType: img.mimeType ?? "image/png",
|
|
40
|
+
originalWidth: 0,
|
|
41
|
+
originalHeight: 0,
|
|
42
|
+
width: 0,
|
|
43
|
+
height: 0,
|
|
44
|
+
wasResized: false,
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
40
48
|
const photon = await loadPhoton();
|
|
41
49
|
if (!photon) {
|
|
42
|
-
return
|
|
50
|
+
return { ok: false, reason: "pipeline-unavailable" };
|
|
43
51
|
}
|
|
52
|
+
// Decode only when a resize might actually be needed: in-limits payloads
|
|
53
|
+
// already returned via the fast path above without paying for this decode.
|
|
54
|
+
const inputBuffer = Buffer.from(inputData, "base64");
|
|
44
55
|
let image;
|
|
45
56
|
try {
|
|
46
57
|
const inputBytes = new Uint8Array(inputBuffer);
|
|
@@ -50,19 +61,8 @@ export async function resizeImage(img, options) {
|
|
|
50
61
|
rawImage.free();
|
|
51
62
|
const originalWidth = image.get_width();
|
|
52
63
|
const originalHeight = image.get_height();
|
|
53
|
-
|
|
54
|
-
//
|
|
55
|
-
if (originalWidth <= opts.maxWidth && originalHeight <= opts.maxHeight && inputBase64Size < opts.maxBytes) {
|
|
56
|
-
return {
|
|
57
|
-
data: inputData,
|
|
58
|
-
mimeType: img.mimeType ?? `image/${format}`,
|
|
59
|
-
originalWidth,
|
|
60
|
-
originalHeight,
|
|
61
|
-
width: originalWidth,
|
|
62
|
-
height: originalHeight,
|
|
63
|
-
wasResized: false,
|
|
64
|
-
};
|
|
65
|
-
}
|
|
64
|
+
// The image is at or above the encoded-size limit (in-limits payloads
|
|
65
|
+
// took the fast path above), so it always needs resizing below maxBytes.
|
|
66
66
|
// Calculate initial dimensions respecting max limits
|
|
67
67
|
let targetWidth = originalWidth;
|
|
68
68
|
let targetHeight = originalHeight;
|
|
@@ -95,13 +95,16 @@ export async function resizeImage(img, options) {
|
|
|
95
95
|
for (const candidate of candidates) {
|
|
96
96
|
if (candidate.encodedSize < opts.maxBytes) {
|
|
97
97
|
return {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
98
|
+
ok: true,
|
|
99
|
+
image: {
|
|
100
|
+
data: candidate.data,
|
|
101
|
+
mimeType: candidate.mimeType,
|
|
102
|
+
originalWidth,
|
|
103
|
+
originalHeight,
|
|
104
|
+
width: currentWidth,
|
|
105
|
+
height: currentHeight,
|
|
106
|
+
wasResized: true,
|
|
107
|
+
},
|
|
105
108
|
};
|
|
106
109
|
}
|
|
107
110
|
}
|
|
@@ -116,10 +119,13 @@ export async function resizeImage(img, options) {
|
|
|
116
119
|
currentWidth = nextWidth;
|
|
117
120
|
currentHeight = nextHeight;
|
|
118
121
|
}
|
|
119
|
-
return
|
|
122
|
+
return { ok: false, reason: "too-large" };
|
|
120
123
|
}
|
|
121
124
|
catch {
|
|
122
|
-
|
|
125
|
+
// Decode/processing error (e.g. a corrupt image): the payload is at or
|
|
126
|
+
// above the size limit and could not be resized, so treat it like a
|
|
127
|
+
// genuine size failure.
|
|
128
|
+
return { ok: false, reason: "too-large" };
|
|
123
129
|
}
|
|
124
130
|
finally {
|
|
125
131
|
if (image) {
|
|
@@ -138,3 +144,15 @@ export function formatDimensionNote(result) {
|
|
|
138
144
|
const scale = result.originalWidth / result.width;
|
|
139
145
|
return `[Image: original ${result.originalWidth}x${result.originalHeight}, displayed at ${result.width}x${result.height}. Multiply coordinates by ${scale.toFixed(2)} to map to original image.]`;
|
|
140
146
|
}
|
|
147
|
+
/**
|
|
148
|
+
* Resize an image to fit within the specified max dimensions and encoded file size.
|
|
149
|
+
* Returns null if the image cannot be resized below maxBytes.
|
|
150
|
+
*
|
|
151
|
+
* Backward-compatible wrapper around resizeImageOutcome for callers that only
|
|
152
|
+
* care about the image (or nothing). Prefer resizeImageOutcome when the failure
|
|
153
|
+
* reason must be observable.
|
|
154
|
+
*/
|
|
155
|
+
export async function resizeImage(img, options) {
|
|
156
|
+
const outcome = await resizeImageOutcome(img, options);
|
|
157
|
+
return outcome.ok ? outcome.image : null;
|
|
158
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"photon.d.ts","sourceRoot":"","sources":["../../../../src/sdk/coding-agent/utils/photon.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,YAAY,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAuFjF;;;GAGG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,cAAc,4BAA4B,CAAC,GAAG,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"photon.d.ts","sourceRoot":"","sources":["../../../../src/sdk/coding-agent/utils/photon.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,YAAY,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAuFjF;;;GAGG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,cAAc,4BAA4B,CAAC,GAAG,IAAI,CAAC,CAmC9F"}
|
|
@@ -100,9 +100,18 @@ export async function loadPhoton() {
|
|
|
100
100
|
photonModule = await import("@silvia-odwyer/photon-node");
|
|
101
101
|
return photonModule;
|
|
102
102
|
}
|
|
103
|
-
catch {
|
|
103
|
+
catch (error) {
|
|
104
|
+
// Never silent: in standalone binaries the WASM is a companion file
|
|
105
|
+
// next to the executable, and a missing photon_rs_bg.wasm surfaces
|
|
106
|
+
// exactly here. Log the cause so agent logs explain why image
|
|
107
|
+
// processing is unavailable instead of failing without a trace.
|
|
108
|
+
console.warn("[spectral] photon image pipeline unavailable:", error instanceof Error ? error.message : error);
|
|
104
109
|
photonModule = null;
|
|
105
|
-
|
|
110
|
+
// Do not cache the failure: the next loadPhoton() call retries, so a
|
|
111
|
+
// WASM that appears later (installed while the process is running) is
|
|
112
|
+
// picked up without a restart.
|
|
113
|
+
loadPromise = null;
|
|
114
|
+
return null;
|
|
106
115
|
}
|
|
107
116
|
finally {
|
|
108
117
|
restoreReadFileSync();
|
|
@@ -48,6 +48,7 @@
|
|
|
48
48
|
* a single spectral session also work normally (the same AgentSession
|
|
49
49
|
* instance is reused across `prompt()` calls).
|
|
50
50
|
*/
|
|
51
|
+
import type { ImageContent } from "../sdk/ai/types.js";
|
|
51
52
|
import { type AgentSessionEvent, type CompactionResult } from "../sdk/coding-agent/index.js";
|
|
52
53
|
import { type AgentSettings } from "./handlers/agent-settings.js";
|
|
53
54
|
import { fetchAllowedModels as defaultFetchAllowedModels } from "../relay/models-fetch.js";
|
|
@@ -160,6 +161,26 @@ export interface AgentBridgeOptions {
|
|
|
160
161
|
*/
|
|
161
162
|
onCloudAgentsAuthRejected?: (reason: string) => void | Promise<void>;
|
|
162
163
|
}
|
|
164
|
+
/** Get model cost from backend credit rates, falling back to hardcoded pricing table. */
|
|
165
|
+
/**
|
|
166
|
+
* Map a wire `ImageAttachment` onto a spectral `ImageContent` block.
|
|
167
|
+
*
|
|
168
|
+
* A hosted attachment (`url`, optionally `imageId`) is passed through as a
|
|
169
|
+
* reference — the provider fetches it, or `resolveImageForProvider` inlines
|
|
170
|
+
* it at send time when the host is local/private. Only legacy attachments
|
|
171
|
+
* carry inline base64. Exported for tests.
|
|
172
|
+
*
|
|
173
|
+
* Legacy S3 presigned urls persisted in history stop working the moment
|
|
174
|
+
* their (typically 3600s) signature expires — every request would fail with
|
|
175
|
+
* "Failed to fetch media from URL ... parameter=image_url". They are
|
|
176
|
+
* rewritten to the stable hosted ref (`/generated-images/<id>`) so every
|
|
177
|
+
* request re-signs a fresh presigned url instead. Other absolute urls are
|
|
178
|
+
* left untouched.
|
|
179
|
+
*
|
|
180
|
+
* Returns `null` when the attachment has neither `data` nor `url` (nothing
|
|
181
|
+
* sendable) so callers can drop it instead of emitting an empty image block.
|
|
182
|
+
*/
|
|
183
|
+
export declare function toImageContent(image: ImageAttachment): ImageContent | null;
|
|
163
184
|
export declare class AgentBridge {
|
|
164
185
|
private session?;
|
|
165
186
|
private suppressNextAgentEndForGeneration;
|
|
@@ -348,6 +369,17 @@ export declare class AgentBridge {
|
|
|
348
369
|
* default when neither the envelope nor SQLite supply a modelId.
|
|
349
370
|
*/
|
|
350
371
|
getFirstAvailableModelId(): string | undefined;
|
|
372
|
+
/**
|
|
373
|
+
* Return the modelId last successfully applied via `setModel()` — after
|
|
374
|
+
* fallback substitution, if one happened (stale requested modelId →
|
|
375
|
+
* backend default/first available). `undefined` when nothing has been
|
|
376
|
+
* applied yet.
|
|
377
|
+
*
|
|
378
|
+
* Used by `SessionStreamManager.prompt()` to persist the sticky model
|
|
379
|
+
* that is actually in effect, so a session whose persisted model went
|
|
380
|
+
* stale doesn't keep re-persisting the stale id.
|
|
381
|
+
*/
|
|
382
|
+
getLastAppliedModelId(): string | undefined;
|
|
351
383
|
/**
|
|
352
384
|
* Return current session context usage from spectral's built-in estimator.
|
|
353
385
|
* Used after compaction and session start to push updated context-window
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-bridge.d.ts","sourceRoot":"","sources":["../../src/server/agent-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;
|
|
1
|
+
{"version":3,"file":"agent-bridge.d.ts","sourceRoot":"","sources":["../../src/server/agent-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -48,6 +48,7 @@
|
|
|
48
48
|
* a single spectral session also work normally (the same AgentSession
|
|
49
49
|
* instance is reused across `prompt()` calls).
|
|
50
50
|
*/
|
|
51
|
+
import { hostedRefFromPresignedUrl, isS3PresignedUrl } from "../sdk/ai/utils/image-source.js";
|
|
51
52
|
import { AuthStorage, createAgentSession, DefaultResourceLoader, ModelRegistry, SessionManager, SettingsManager, } from "../sdk/coding-agent/index.js";
|
|
52
53
|
import { randomUUID } from "node:crypto";
|
|
53
54
|
import { existsSync, statSync, watch } from "node:fs";
|
|
@@ -140,21 +141,34 @@ function extractTextFromContent(content) {
|
|
|
140
141
|
* A hosted attachment (`url`, optionally `imageId`) is passed through as a
|
|
141
142
|
* reference — the provider fetches it, or `resolveImageForProvider` inlines
|
|
142
143
|
* it at send time when the host is local/private. Only legacy attachments
|
|
143
|
-
* carry inline base64.
|
|
144
|
+
* carry inline base64. Exported for tests.
|
|
145
|
+
*
|
|
146
|
+
* Legacy S3 presigned urls persisted in history stop working the moment
|
|
147
|
+
* their (typically 3600s) signature expires — every request would fail with
|
|
148
|
+
* "Failed to fetch media from URL ... parameter=image_url". They are
|
|
149
|
+
* rewritten to the stable hosted ref (`/generated-images/<id>`) so every
|
|
150
|
+
* request re-signs a fresh presigned url instead. Other absolute urls are
|
|
151
|
+
* left untouched.
|
|
144
152
|
*
|
|
145
153
|
* Returns `null` when the attachment has neither `data` nor `url` (nothing
|
|
146
154
|
* sendable) so callers can drop it instead of emitting an empty image block.
|
|
147
155
|
*/
|
|
148
|
-
function toImageContent(image) {
|
|
156
|
+
export function toImageContent(image) {
|
|
149
157
|
if (!image || typeof image.mimeType !== "string")
|
|
150
158
|
return null;
|
|
151
159
|
if (image.data) {
|
|
152
160
|
return { type: "image", data: image.data, mimeType: image.mimeType };
|
|
153
161
|
}
|
|
154
162
|
if (image.url) {
|
|
163
|
+
let url = image.url;
|
|
164
|
+
if (isS3PresignedUrl(url)) {
|
|
165
|
+
const hostedRef = hostedRefFromPresignedUrl(url);
|
|
166
|
+
if (hostedRef)
|
|
167
|
+
url = hostedRef;
|
|
168
|
+
}
|
|
155
169
|
return {
|
|
156
170
|
type: "image",
|
|
157
|
-
url
|
|
171
|
+
url,
|
|
158
172
|
mimeType: image.mimeType,
|
|
159
173
|
...(image.imageId ? { imageId: image.imageId } : {}),
|
|
160
174
|
};
|
|
@@ -921,6 +935,19 @@ export class AgentBridge {
|
|
|
921
935
|
getFirstAvailableModelId() {
|
|
922
936
|
return this.allowedModels?.[0]?.modelId;
|
|
923
937
|
}
|
|
938
|
+
/**
|
|
939
|
+
* Return the modelId last successfully applied via `setModel()` — after
|
|
940
|
+
* fallback substitution, if one happened (stale requested modelId →
|
|
941
|
+
* backend default/first available). `undefined` when nothing has been
|
|
942
|
+
* applied yet.
|
|
943
|
+
*
|
|
944
|
+
* Used by `SessionStreamManager.prompt()` to persist the sticky model
|
|
945
|
+
* that is actually in effect, so a session whose persisted model went
|
|
946
|
+
* stale doesn't keep re-persisting the stale id.
|
|
947
|
+
*/
|
|
948
|
+
getLastAppliedModelId() {
|
|
949
|
+
return this.lastAppliedModelId;
|
|
950
|
+
}
|
|
924
951
|
/**
|
|
925
952
|
* Return current session context usage from spectral's built-in estimator.
|
|
926
953
|
* Used after compaction and session start to push updated context-window
|
|
@@ -1028,16 +1055,39 @@ export class AgentBridge {
|
|
|
1028
1055
|
}
|
|
1029
1056
|
}
|
|
1030
1057
|
if (!model) {
|
|
1058
|
+
// Whitelist miss after the cache-bypassing refresh: the requested
|
|
1059
|
+
// modelId is no longer active in the backend. Substitute an active
|
|
1060
|
+
// fallback — the backend default (`isDefault`) when present, else the
|
|
1061
|
+
// first available entry (same ordering `getFirstAvailableModelId()`
|
|
1062
|
+
// uses) — so the turn proceeds instead of failing. The client is
|
|
1063
|
+
// notified via a `model_fallback` wire event, and the applied (not
|
|
1064
|
+
// requested) modelId is what `getLastAppliedModelId()` reports for
|
|
1065
|
+
// sticky-model persistence.
|
|
1066
|
+
const fallbackAllowed = this.allowedModels?.find((m) => m.isDefault) ??
|
|
1067
|
+
this.allowedModels?.[0];
|
|
1068
|
+
const fallback = fallbackAllowed
|
|
1069
|
+
? this.modelRegistry
|
|
1070
|
+
.getAvailable()
|
|
1071
|
+
.find((m) => m.id === fallbackAllowed.modelId)
|
|
1072
|
+
: undefined;
|
|
1073
|
+
if (!fallbackAllowed || !fallback) {
|
|
1074
|
+
this.opts.emit({
|
|
1075
|
+
type: "error",
|
|
1076
|
+
message: `Unknown modelId "${modelId}" — not found in spectral model registry${refreshError ? ` after refresh: ${refreshError.message}` : ""}`,
|
|
1077
|
+
});
|
|
1078
|
+
return false;
|
|
1079
|
+
}
|
|
1031
1080
|
this.opts.emit({
|
|
1032
|
-
type: "
|
|
1033
|
-
|
|
1081
|
+
type: "model_fallback",
|
|
1082
|
+
requestedModelId: modelId,
|
|
1083
|
+
activeModelId: fallbackAllowed.modelId,
|
|
1034
1084
|
});
|
|
1035
|
-
|
|
1085
|
+
model = fallback;
|
|
1036
1086
|
}
|
|
1037
1087
|
try {
|
|
1038
1088
|
await this.session.setModel(model);
|
|
1039
|
-
this.lastAppliedModelId =
|
|
1040
|
-
const selected = this.allowedModels?.find((m) => m.modelId ===
|
|
1089
|
+
this.lastAppliedModelId = model.id;
|
|
1090
|
+
const selected = this.allowedModels?.find((m) => m.modelId === model.id);
|
|
1041
1091
|
this.activeCreditRates = selected
|
|
1042
1092
|
? {
|
|
1043
1093
|
creditInputPer1M: selected.creditInputPer1M ?? null,
|
|
@@ -1054,7 +1104,7 @@ export class AgentBridge {
|
|
|
1054
1104
|
this.opts.onError?.(e);
|
|
1055
1105
|
this.opts.emit({
|
|
1056
1106
|
type: "error",
|
|
1057
|
-
message: `Failed to switch to modelId "${
|
|
1107
|
+
message: `Failed to switch to modelId "${model.id}": ${humanizeProviderError(e)}`,
|
|
1058
1108
|
});
|
|
1059
1109
|
return false;
|
|
1060
1110
|
}
|