@auvira.ai/sdk 0.3.1 → 0.5.0
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/README.md +77 -0
- package/dist/agent/RunEventBus.d.ts.map +1 -1
- package/dist/agent/RunEventBus.js +9 -0
- package/dist/agent/RunEventBus.js.map +1 -1
- package/dist/agent/editCompletion.d.ts +2 -1
- package/dist/agent/editCompletion.d.ts.map +1 -1
- package/dist/agent/editCompletion.js +30 -0
- package/dist/agent/editCompletion.js.map +1 -1
- package/dist/agent/emitAgentThinking.d.ts +19 -0
- package/dist/agent/emitAgentThinking.d.ts.map +1 -0
- package/dist/agent/emitAgentThinking.js +89 -0
- package/dist/agent/emitAgentThinking.js.map +1 -0
- package/dist/agent/evaluateTaskCompletion.d.ts +2 -0
- package/dist/agent/evaluateTaskCompletion.d.ts.map +1 -1
- package/dist/agent/evaluateTaskCompletion.js +4 -1
- package/dist/agent/evaluateTaskCompletion.js.map +1 -1
- package/dist/agent/events.d.ts +20 -3
- package/dist/agent/events.d.ts.map +1 -1
- package/dist/agent/events.js +2 -0
- package/dist/agent/events.js.map +1 -1
- package/dist/agent/tools/assetPathValidation.d.ts +19 -0
- package/dist/agent/tools/assetPathValidation.d.ts.map +1 -0
- package/dist/agent/tools/assetPathValidation.js +124 -0
- package/dist/agent/tools/assetPathValidation.js.map +1 -0
- package/dist/agent/tools/executeTool.d.ts +1 -1
- package/dist/agent/tools/executeTool.d.ts.map +1 -1
- package/dist/agent/tools/executeTool.js +16 -0
- package/dist/agent/tools/executeTool.js.map +1 -1
- package/dist/agent/tools/generateImage.d.ts +11 -0
- package/dist/agent/tools/generateImage.d.ts.map +1 -0
- package/dist/agent/tools/generateImage.js +98 -0
- package/dist/agent/tools/generateImage.js.map +1 -0
- package/dist/agent/tools/publishReferenceImage.d.ts +9 -0
- package/dist/agent/tools/publishReferenceImage.d.ts.map +1 -0
- package/dist/agent/tools/publishReferenceImage.js +61 -0
- package/dist/agent/tools/publishReferenceImage.js.map +1 -0
- package/dist/agent/tools/saveAsset.d.ts +11 -0
- package/dist/agent/tools/saveAsset.d.ts.map +1 -0
- package/dist/agent/tools/saveAsset.js +30 -0
- package/dist/agent/tools/saveAsset.js.map +1 -0
- package/dist/agent/tools/types.d.ts +4 -0
- package/dist/agent/tools/types.d.ts.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/providers/agentic/AgenticCustomProvider.d.ts.map +1 -1
- package/dist/providers/agentic/AgenticCustomProvider.js +5 -0
- package/dist/providers/agentic/AgenticCustomProvider.js.map +1 -1
- package/dist/providers/agentic/agentLoop.d.ts.map +1 -1
- package/dist/providers/agentic/agentLoop.js +32 -4
- package/dist/providers/agentic/agentLoop.js.map +1 -1
- package/dist/providers/agentic/toolSchemas.d.ts +124 -0
- package/dist/providers/agentic/toolSchemas.d.ts.map +1 -1
- package/dist/providers/agentic/toolSchemas.js +55 -0
- package/dist/providers/agentic/toolSchemas.js.map +1 -1
- package/dist/runner/aggregateStepStates.d.ts +20 -0
- package/dist/runner/aggregateStepStates.d.ts.map +1 -0
- package/dist/runner/aggregateStepStates.js +45 -0
- package/dist/runner/aggregateStepStates.js.map +1 -0
- package/dist/runner/index.d.ts +3 -0
- package/dist/runner/index.d.ts.map +1 -1
- package/dist/runner/index.js +2 -0
- package/dist/runner/index.js.map +1 -1
- package/dist/runner/jobTypes.d.ts +10 -1
- package/dist/runner/jobTypes.d.ts.map +1 -1
- package/dist/runner/mapStreamEvents.d.ts.map +1 -1
- package/dist/runner/mapStreamEvents.js +49 -0
- package/dist/runner/mapStreamEvents.js.map +1 -1
- package/dist/runner/sandboxStepTools.d.ts +12 -0
- package/dist/runner/sandboxStepTools.d.ts.map +1 -0
- package/dist/runner/sandboxStepTools.js +28 -0
- package/dist/runner/sandboxStepTools.js.map +1 -0
- package/dist/util/minimaxImageClient.d.ts +25 -0
- package/dist/util/minimaxImageClient.d.ts.map +1 -0
- package/dist/util/minimaxImageClient.js +114 -0
- package/dist/util/minimaxImageClient.js.map +1 -0
- package/dist/workspace/referenceImages.d.ts +14 -0
- package/dist/workspace/referenceImages.d.ts.map +1 -0
- package/dist/workspace/referenceImages.js +60 -0
- package/dist/workspace/referenceImages.js.map +1 -0
- package/dist/workspace/workspaceCheckpoint.d.ts.map +1 -1
- package/dist/workspace/workspaceCheckpoint.js +148 -16
- package/dist/workspace/workspaceCheckpoint.js.map +1 -1
- package/dist/workspace/writeScreenshot.d.ts.map +1 -1
- package/dist/workspace/writeScreenshot.js +15 -7
- package/dist/workspace/writeScreenshot.js.map +1 -1
- package/docs/sandbox-runner.md +78 -1
- package/package.json +5 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { getAssistantEventText } from "../agent/assistantEvent.js";
|
|
2
2
|
import { updateJobResultContext } from "./buildJobResult.js";
|
|
3
|
+
import { getSandboxNonStepToolTrace, isSandboxStepTool, } from "./sandboxStepTools.js";
|
|
3
4
|
export function createMapStreamContext(sessionResumed) {
|
|
4
5
|
return {
|
|
5
6
|
toolSeq: 0,
|
|
@@ -50,6 +51,18 @@ export function mapAuviraStreamEventToProgress(event, ctx) {
|
|
|
50
51
|
];
|
|
51
52
|
}
|
|
52
53
|
case "tool.start": {
|
|
54
|
+
if (!isSandboxStepTool(event.name)) {
|
|
55
|
+
const trace = getSandboxNonStepToolTrace(event.name, "start");
|
|
56
|
+
return [
|
|
57
|
+
{
|
|
58
|
+
type: "activity_trace",
|
|
59
|
+
entry: {
|
|
60
|
+
...trace,
|
|
61
|
+
detail: `${trace.detail} ${JSON.stringify(event.input).slice(0, 200)}`.trim(),
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
];
|
|
65
|
+
}
|
|
53
66
|
ctx.toolSeq += 1;
|
|
54
67
|
const stepId = `tool_${ctx.toolSeq}`;
|
|
55
68
|
const queue = ctx.openToolsByName.get(event.name) ?? [];
|
|
@@ -76,6 +89,18 @@ export function mapAuviraStreamEventToProgress(event, ctx) {
|
|
|
76
89
|
];
|
|
77
90
|
}
|
|
78
91
|
case "tool.end": {
|
|
92
|
+
if (!isSandboxStepTool(event.name)) {
|
|
93
|
+
const trace = getSandboxNonStepToolTrace(event.name, "end");
|
|
94
|
+
return [
|
|
95
|
+
{
|
|
96
|
+
type: "activity_trace",
|
|
97
|
+
entry: {
|
|
98
|
+
...trace,
|
|
99
|
+
detail: event.ok ? trace.detail : `${trace.detail} (failed)`,
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
];
|
|
103
|
+
}
|
|
79
104
|
const queue = ctx.openToolsByName.get(event.name) ?? [];
|
|
80
105
|
const stepId = queue.shift();
|
|
81
106
|
if (!stepId) {
|
|
@@ -198,6 +223,30 @@ export function mapAuviraStreamEventToProgress(event, ctx) {
|
|
|
198
223
|
},
|
|
199
224
|
];
|
|
200
225
|
}
|
|
226
|
+
case "agent.thinking":
|
|
227
|
+
return [
|
|
228
|
+
{
|
|
229
|
+
type: "thinking",
|
|
230
|
+
turn: event.turn,
|
|
231
|
+
phase: event.phase,
|
|
232
|
+
summary: event.summary,
|
|
233
|
+
nextTools: event.nextTools,
|
|
234
|
+
reason: event.reason,
|
|
235
|
+
confidence: event.confidence,
|
|
236
|
+
},
|
|
237
|
+
];
|
|
238
|
+
case "agent.raw_model_trace":
|
|
239
|
+
return [
|
|
240
|
+
{
|
|
241
|
+
type: "activity_trace",
|
|
242
|
+
entry: {
|
|
243
|
+
kind: "raw_trace",
|
|
244
|
+
label: `Raw model trace (${event.provider})`,
|
|
245
|
+
detail: event.reasoningDetails,
|
|
246
|
+
truncated: event.capped,
|
|
247
|
+
},
|
|
248
|
+
},
|
|
249
|
+
];
|
|
201
250
|
default:
|
|
202
251
|
return [];
|
|
203
252
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapStreamEvents.js","sourceRoot":"","sources":["../../src/runner/mapStreamEvents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"mapStreamEvents.js","sourceRoot":"","sources":["../../src/runner/mapStreamEvents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Tools that should not create tool_N step rows in sandbox NDJSON. */
|
|
2
|
+
export declare const SANDBOX_NON_STEP_TOOLS: Set<string>;
|
|
3
|
+
/** Returns true when a tool should appear in the host step list (tool_N rows). */
|
|
4
|
+
export declare function isSandboxStepTool(toolName: string): boolean;
|
|
5
|
+
/** Human-friendly activity trace for infrastructure tools hidden from the step list. */
|
|
6
|
+
export declare function getSandboxNonStepToolTrace(toolName: string, phase: "start" | "end"): {
|
|
7
|
+
kind: "info";
|
|
8
|
+
label: string;
|
|
9
|
+
detail: string;
|
|
10
|
+
toolName: string;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=sandboxStepTools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandboxStepTools.d.ts","sourceRoot":"","sources":["../../src/runner/sandboxStepTools.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,eAAO,MAAM,sBAAsB,aAEjC,CAAC;AAEH,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED,wFAAwF;AACxF,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,GAAG,KAAK,GACrB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAmBnE"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** Tools that should not create tool_N step rows in sandbox NDJSON. */
|
|
2
|
+
export const SANDBOX_NON_STEP_TOOLS = new Set([
|
|
3
|
+
"model_completion",
|
|
4
|
+
]);
|
|
5
|
+
/** Returns true when a tool should appear in the host step list (tool_N rows). */
|
|
6
|
+
export function isSandboxStepTool(toolName) {
|
|
7
|
+
return !SANDBOX_NON_STEP_TOOLS.has(toolName);
|
|
8
|
+
}
|
|
9
|
+
/** Human-friendly activity trace for infrastructure tools hidden from the step list. */
|
|
10
|
+
export function getSandboxNonStepToolTrace(toolName, phase) {
|
|
11
|
+
if (toolName === "model_completion") {
|
|
12
|
+
return {
|
|
13
|
+
kind: "info",
|
|
14
|
+
label: "Planning",
|
|
15
|
+
detail: phase === "start"
|
|
16
|
+
? "Agent is deciding what to do next..."
|
|
17
|
+
: "Planning step finished",
|
|
18
|
+
toolName,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
kind: "info",
|
|
23
|
+
label: toolName,
|
|
24
|
+
detail: phase === "start" ? "Started" : "Finished",
|
|
25
|
+
toolName,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=sandboxStepTools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandboxStepTools.js","sourceRoot":"","sources":["../../src/runner/sandboxStepTools.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;IAC5C,kBAAkB;CACnB,CAAC,CAAC;AAEH,kFAAkF;AAClF,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,OAAO,CAAC,sBAAsB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC/C,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,0BAA0B,CACxC,QAAgB,EAChB,KAAsB;IAEtB,IAAI,QAAQ,KAAK,kBAAkB,EAAE,CAAC;QACpC,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,UAAU;YACjB,MAAM,EACJ,KAAK,KAAK,OAAO;gBACf,CAAC,CAAC,sCAAsC;gBACxC,CAAC,CAAC,wBAAwB;YAC9B,QAAQ;SACT,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU;QAClD,QAAQ;KACT,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface MiniMaxImageResult {
|
|
2
|
+
buffer: Buffer;
|
|
3
|
+
mimeType: string;
|
|
4
|
+
}
|
|
5
|
+
export interface GenerateImageApiInput {
|
|
6
|
+
apiKey: string;
|
|
7
|
+
prompt: string;
|
|
8
|
+
aspectRatio?: string;
|
|
9
|
+
referencePath?: string;
|
|
10
|
+
signal?: AbortSignal;
|
|
11
|
+
timeoutMs?: number;
|
|
12
|
+
}
|
|
13
|
+
/** Returns true when image generation is enabled (`AUVIRA_IMAGE_GEN_ENABLED=true`). */
|
|
14
|
+
export declare function isImageGenEnabled(): boolean;
|
|
15
|
+
/** Max image generations per agent run. */
|
|
16
|
+
export declare function getImageGenMaxPerRun(): number;
|
|
17
|
+
/** Resolves MiniMax image API base URL (never chat/OpenRouter URL). */
|
|
18
|
+
export declare function resolveImageApiBaseUrl(): string;
|
|
19
|
+
/** Calls MiniMax image-01 text-to-image API. */
|
|
20
|
+
export declare function generateTextToImage(input: GenerateImageApiInput): Promise<MiniMaxImageResult>;
|
|
21
|
+
/** Calls MiniMax image-01 image-to-image API with subject reference. */
|
|
22
|
+
export declare function generateImageToImage(input: GenerateImageApiInput & {
|
|
23
|
+
referencePath: string;
|
|
24
|
+
}): Promise<MiniMaxImageResult>;
|
|
25
|
+
//# sourceMappingURL=minimaxImageClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minimaxImageClient.d.ts","sourceRoot":"","sources":["../../src/util/minimaxImageClient.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,uFAAuF;AACvF,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED,2CAA2C;AAC3C,wBAAgB,oBAAoB,IAAI,MAAM,CAI7C;AAMD,uEAAuE;AACvE,wBAAgB,sBAAsB,IAAI,MAAM,CAY/C;AAqBD,gDAAgD;AAChD,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CAK7B;AAED,wEAAwE;AACxE,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,qBAAqB,GAAG;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,GACvD,OAAO,CAAC,kBAAkB,CAAC,CAM7B"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { sniffImageMime } from "../agent/tools/assetPathValidation.js";
|
|
3
|
+
import { postJsonWithRetry } from "./modelApiClient.js";
|
|
4
|
+
const GLOBAL_IMAGE_BASE = "https://api.minimax.io/v1";
|
|
5
|
+
const CN_IMAGE_BASE = "https://api.minimaxi.com/v1";
|
|
6
|
+
/** Returns true when image generation is enabled (`AUVIRA_IMAGE_GEN_ENABLED=true`). */
|
|
7
|
+
export function isImageGenEnabled() {
|
|
8
|
+
return process.env.AUVIRA_IMAGE_GEN_ENABLED?.trim() === "true";
|
|
9
|
+
}
|
|
10
|
+
/** Max image generations per agent run. */
|
|
11
|
+
export function getImageGenMaxPerRun() {
|
|
12
|
+
const raw = process.env.AUVIRA_IMAGE_GEN_MAX_PER_RUN?.trim();
|
|
13
|
+
const parsed = raw ? Number.parseInt(raw, 10) : 2;
|
|
14
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : 2;
|
|
15
|
+
}
|
|
16
|
+
function getImageModelId() {
|
|
17
|
+
return process.env.AUVIRA_IMAGE_MODEL?.trim() || "image-01";
|
|
18
|
+
}
|
|
19
|
+
/** Resolves MiniMax image API base URL (never chat/OpenRouter URL). */
|
|
20
|
+
export function resolveImageApiBaseUrl() {
|
|
21
|
+
const explicit = process.env.AUVIRA_IMAGE_BASE_URL?.trim();
|
|
22
|
+
if (explicit) {
|
|
23
|
+
return explicit.replace(/\/+$/, "");
|
|
24
|
+
}
|
|
25
|
+
const chatBase = process.env.CUSTOM_MODEL_BASE_URL?.trim() ?? "";
|
|
26
|
+
if (chatBase.includes("minimaxi.com")) {
|
|
27
|
+
return CN_IMAGE_BASE;
|
|
28
|
+
}
|
|
29
|
+
return GLOBAL_IMAGE_BASE;
|
|
30
|
+
}
|
|
31
|
+
function mapProviderError(statusCode, message) {
|
|
32
|
+
if (statusCode === 1002) {
|
|
33
|
+
return `MiniMax image rate limit: ${message}`;
|
|
34
|
+
}
|
|
35
|
+
if (statusCode === 1008) {
|
|
36
|
+
return `MiniMax image insufficient balance: ${message}`;
|
|
37
|
+
}
|
|
38
|
+
if (statusCode === 1026) {
|
|
39
|
+
return `MiniMax image sensitive content: ${message}`;
|
|
40
|
+
}
|
|
41
|
+
return `MiniMax image error (${statusCode}): ${message}`;
|
|
42
|
+
}
|
|
43
|
+
async function referenceToDataUrl(referencePath) {
|
|
44
|
+
const buffer = await readFile(referencePath);
|
|
45
|
+
const mime = sniffImageMime(buffer) ?? "image/png";
|
|
46
|
+
return `data:${mime};base64,${buffer.toString("base64")}`;
|
|
47
|
+
}
|
|
48
|
+
/** Calls MiniMax image-01 text-to-image API. */
|
|
49
|
+
export async function generateTextToImage(input) {
|
|
50
|
+
return callImageGeneration({
|
|
51
|
+
...input,
|
|
52
|
+
subjectReference: undefined,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/** Calls MiniMax image-01 image-to-image API with subject reference. */
|
|
56
|
+
export async function generateImageToImage(input) {
|
|
57
|
+
const imageFile = await referenceToDataUrl(input.referencePath);
|
|
58
|
+
return callImageGeneration({
|
|
59
|
+
...input,
|
|
60
|
+
subjectReference: [{ type: "character", image_file: imageFile }],
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
async function callImageGeneration(input) {
|
|
64
|
+
const baseUrl = resolveImageApiBaseUrl();
|
|
65
|
+
const body = {
|
|
66
|
+
model: getImageModelId(),
|
|
67
|
+
prompt: input.prompt.slice(0, 1500),
|
|
68
|
+
aspect_ratio: input.aspectRatio ?? "16:9",
|
|
69
|
+
response_format: "base64",
|
|
70
|
+
n: 1,
|
|
71
|
+
prompt_optimizer: false,
|
|
72
|
+
};
|
|
73
|
+
if (input.subjectReference?.length) {
|
|
74
|
+
body.subject_reference = input.subjectReference;
|
|
75
|
+
}
|
|
76
|
+
const result = await postJsonWithRetry({
|
|
77
|
+
url: `${baseUrl}/image_generation`,
|
|
78
|
+
headers: {
|
|
79
|
+
Authorization: `Bearer ${input.apiKey}`,
|
|
80
|
+
"Content-Type": "application/json",
|
|
81
|
+
},
|
|
82
|
+
body,
|
|
83
|
+
timeoutMs: input.timeoutMs ?? 120_000,
|
|
84
|
+
signal: input.signal,
|
|
85
|
+
}, 0);
|
|
86
|
+
if (!result.ok || !result.data) {
|
|
87
|
+
const rateLimit = result.rateLimit;
|
|
88
|
+
throw new Error(rateLimit?.message ?? result.errorMessage ?? "Image generation request failed");
|
|
89
|
+
}
|
|
90
|
+
const statusCode = result.data.base_resp?.status_code ?? 0;
|
|
91
|
+
const statusMsg = result.data.base_resp?.status_msg ?? "unknown";
|
|
92
|
+
if (statusCode !== 0) {
|
|
93
|
+
if (statusCode === 1002) {
|
|
94
|
+
const info = {
|
|
95
|
+
isRateLimited: true,
|
|
96
|
+
providerStatusCode: statusCode,
|
|
97
|
+
message: statusMsg,
|
|
98
|
+
headers: {},
|
|
99
|
+
};
|
|
100
|
+
throw Object.assign(new Error(mapProviderError(statusCode, statusMsg)), {
|
|
101
|
+
rateLimit: info,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
throw new Error(mapProviderError(statusCode, statusMsg));
|
|
105
|
+
}
|
|
106
|
+
const b64 = result.data.data?.image_base64?.[0];
|
|
107
|
+
if (!b64) {
|
|
108
|
+
throw new Error("Image generation returned no image_base64 data");
|
|
109
|
+
}
|
|
110
|
+
const buffer = Buffer.from(b64, "base64");
|
|
111
|
+
const mimeType = sniffImageMime(buffer) ?? "image/png";
|
|
112
|
+
return { buffer, mimeType };
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=minimaxImageClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minimaxImageClient.js","sourceRoot":"","sources":["../../src/util/minimaxImageClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const AUVIRA_DIR = ".auvira";
|
|
2
|
+
export declare const LEGACY_SCREENSHOT_RELATIVE = ".auvira/input-screenshot.png";
|
|
3
|
+
export type ReferenceImageSource = "primary" | `index:${number}`;
|
|
4
|
+
/** Parses tool source param into a reference index (primary = 0). */
|
|
5
|
+
export declare function parseReferenceImageSource(source: string): number;
|
|
6
|
+
/** Returns expected relative path for a reference image index (without resolving ext). */
|
|
7
|
+
export declare function referenceImageBaseName(index: number): string;
|
|
8
|
+
/** Resolves a reference source to an existing file under .auvira in the workspace. */
|
|
9
|
+
export declare function resolveReferenceImagePath(workspacePath: string, source: string): Promise<{
|
|
10
|
+
absolutePath: string;
|
|
11
|
+
relativePath: string;
|
|
12
|
+
mimeType: string;
|
|
13
|
+
}>;
|
|
14
|
+
//# sourceMappingURL=referenceImages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"referenceImages.d.ts","sourceRoot":"","sources":["../../src/workspace/referenceImages.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,UAAU,YAAY,CAAC;AACpC,eAAO,MAAM,0BAA0B,iCAAuC,CAAC;AAE/E,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,SAAS,MAAM,EAAE,CAAC;AAEjE,qEAAqE;AACrE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAYhE;AAMD,0FAA0F;AAC1F,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,sFAAsF;AACtF,wBAAsB,yBAAyB,CAC7C,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAuC3E"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { mimeFromPath, sniffImageMime, } from "../agent/tools/assetPathValidation.js";
|
|
4
|
+
export const AUVIRA_DIR = ".auvira";
|
|
5
|
+
export const LEGACY_SCREENSHOT_RELATIVE = `${AUVIRA_DIR}/input-screenshot.png`;
|
|
6
|
+
/** Parses tool source param into a reference index (primary = 0). */
|
|
7
|
+
export function parseReferenceImageSource(source) {
|
|
8
|
+
const trimmed = source.trim();
|
|
9
|
+
if (trimmed === "primary") {
|
|
10
|
+
return 0;
|
|
11
|
+
}
|
|
12
|
+
const match = /^index:(\d+)$/.exec(trimmed);
|
|
13
|
+
if (!match) {
|
|
14
|
+
throw new Error(`Invalid reference source "${source}"; use "primary" or "index:N"`);
|
|
15
|
+
}
|
|
16
|
+
return Number.parseInt(match[1], 10);
|
|
17
|
+
}
|
|
18
|
+
function referenceFilePrefix(index) {
|
|
19
|
+
return `input-image-${index}`;
|
|
20
|
+
}
|
|
21
|
+
/** Returns expected relative path for a reference image index (without resolving ext). */
|
|
22
|
+
export function referenceImageBaseName(index) {
|
|
23
|
+
return `${AUVIRA_DIR}/${referenceFilePrefix(index)}`;
|
|
24
|
+
}
|
|
25
|
+
/** Resolves a reference source to an existing file under .auvira in the workspace. */
|
|
26
|
+
export async function resolveReferenceImagePath(workspacePath, source) {
|
|
27
|
+
const index = parseReferenceImageSource(source);
|
|
28
|
+
const auviraDir = join(workspacePath, AUVIRA_DIR);
|
|
29
|
+
const prefix = referenceFilePrefix(index);
|
|
30
|
+
let entries;
|
|
31
|
+
try {
|
|
32
|
+
entries = await fs.readdir(auviraDir);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
throw new Error(`No reference images found in ${AUVIRA_DIR} for ${source}`);
|
|
36
|
+
}
|
|
37
|
+
const matches = entries
|
|
38
|
+
.filter((name) => name === `${prefix}.png` || name.startsWith(`${prefix}.`))
|
|
39
|
+
.sort();
|
|
40
|
+
if (matches.length === 0 && index === 0) {
|
|
41
|
+
const legacy = entries.find((name) => name === "input-screenshot.png");
|
|
42
|
+
if (legacy) {
|
|
43
|
+
const relativePath = `${AUVIRA_DIR}/${legacy}`;
|
|
44
|
+
const absolutePath = join(auviraDir, legacy);
|
|
45
|
+
const buffer = await fs.readFile(absolutePath);
|
|
46
|
+
const mimeType = sniffImageMime(buffer) ?? mimeFromPath(relativePath) ?? "image/png";
|
|
47
|
+
return { absolutePath, relativePath, mimeType };
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (matches.length === 0) {
|
|
51
|
+
throw new Error(`Reference image not found for ${source}`);
|
|
52
|
+
}
|
|
53
|
+
const fileName = matches[0];
|
|
54
|
+
const relativePath = `${AUVIRA_DIR}/${fileName}`;
|
|
55
|
+
const absolutePath = join(auviraDir, fileName);
|
|
56
|
+
const buffer = await fs.readFile(absolutePath);
|
|
57
|
+
const mimeType = sniffImageMime(buffer) ?? mimeFromPath(relativePath) ?? "image/png";
|
|
58
|
+
return { absolutePath, relativePath, mimeType };
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=referenceImages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"referenceImages.js","sourceRoot":"","sources":["../../src/workspace/referenceImages.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspaceCheckpoint.d.ts","sourceRoot":"","sources":["../../src/workspace/workspaceCheckpoint.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"workspaceCheckpoint.d.ts","sourceRoot":"","sources":["../../src/workspace/workspaceCheckpoint.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;CACd;AAiBD,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,eAAe,CAAC,IAAI,IAAI,CAAC;CAC1B;AAicD,uEAAuE;AACvE,wBAAgB,kCAAkC,CAChD,UAAU,CAAC,EAAE,mBAAmB,GAC/B,IAAI,CAEN;AAED,oEAAoE;AACpE,wBAAsB,yBAAyB,CAAC,KAAK,EAAE;IACrD,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA+C/B"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { randomUUID } from "node:crypto";
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
2
|
import { promises as fs } from "node:fs";
|
|
3
3
|
import { join, resolve } from "node:path";
|
|
4
4
|
import { buildUnifiedPatch, capPatch, getDiffMaxChars, } from "../agent/patchUtils.js";
|
|
5
|
+
import { isBinaryAssetPath, mimeFromPath, sniffImageMime, } from "../agent/tools/assetPathValidation.js";
|
|
5
6
|
import { toRepoRelativePath } from "../agent/tools/pathGuard.js";
|
|
6
7
|
import { fileExists } from "../tools/fileExists.js";
|
|
7
8
|
import { matchesPathGlobFilters } from "../util/globMatch.js";
|
|
@@ -45,6 +46,83 @@ function isEditableFile(relPath) {
|
|
|
45
46
|
}
|
|
46
47
|
return EDITABLE_EXTENSIONS.has(lower.slice(dot));
|
|
47
48
|
}
|
|
49
|
+
function formatBytes(size) {
|
|
50
|
+
if (size < 1024) {
|
|
51
|
+
return `${size} B`;
|
|
52
|
+
}
|
|
53
|
+
const kb = size / 1024;
|
|
54
|
+
if (kb < 1024) {
|
|
55
|
+
return `${kb.toFixed(1)} KB`;
|
|
56
|
+
}
|
|
57
|
+
return `${(kb / 1024).toFixed(1)} MB`;
|
|
58
|
+
}
|
|
59
|
+
async function readBinarySnapshotEntry(repoPath, relPath) {
|
|
60
|
+
const absolute = join(repoPath, relPath);
|
|
61
|
+
if (!(await fileExists(absolute))) {
|
|
62
|
+
return {
|
|
63
|
+
kind: "binary",
|
|
64
|
+
sha256: null,
|
|
65
|
+
byteSize: 0,
|
|
66
|
+
mimeType: "application/octet-stream",
|
|
67
|
+
buffer: null,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const stat = await fs.stat(absolute);
|
|
71
|
+
if (!stat.isFile()) {
|
|
72
|
+
return {
|
|
73
|
+
kind: "binary",
|
|
74
|
+
sha256: null,
|
|
75
|
+
byteSize: 0,
|
|
76
|
+
mimeType: "application/octet-stream",
|
|
77
|
+
buffer: null,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
const buffer = await fs.readFile(absolute);
|
|
81
|
+
const mimeType = sniffImageMime(buffer) ?? mimeFromPath(relPath) ?? "application/octet-stream";
|
|
82
|
+
return {
|
|
83
|
+
kind: "binary",
|
|
84
|
+
sha256: createHash("sha256").update(buffer).digest("hex"),
|
|
85
|
+
byteSize: buffer.byteLength,
|
|
86
|
+
mimeType,
|
|
87
|
+
buffer,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function buildBinaryDiffLine(relPath, before, after) {
|
|
91
|
+
if (before.sha256 === null && after.sha256 !== null) {
|
|
92
|
+
return `Binary asset added: ${relPath} (${after.mimeType}, ${formatBytes(after.byteSize)})`;
|
|
93
|
+
}
|
|
94
|
+
if (before.sha256 !== null && after.sha256 === null) {
|
|
95
|
+
return `Binary asset deleted: ${relPath}`;
|
|
96
|
+
}
|
|
97
|
+
if (before.sha256 !== after.sha256) {
|
|
98
|
+
return `Binary asset changed: ${relPath} (sha256 ${before.sha256?.slice(0, 12)}… → ${after.sha256?.slice(0, 12)}…)`;
|
|
99
|
+
}
|
|
100
|
+
return "";
|
|
101
|
+
}
|
|
102
|
+
function isBinaryAssetFile(relPath) {
|
|
103
|
+
return isBinaryAssetPath(relPath);
|
|
104
|
+
}
|
|
105
|
+
function entriesEqual(before, after) {
|
|
106
|
+
if (before.kind !== after.kind) {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
if (before.kind === "text" && after.kind === "text") {
|
|
110
|
+
return before.content === after.content;
|
|
111
|
+
}
|
|
112
|
+
if (before.kind === "binary" && after.kind === "binary") {
|
|
113
|
+
return before.sha256 === after.sha256;
|
|
114
|
+
}
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
function buildEntryDiffLine(relPath, before, after) {
|
|
118
|
+
if (before.kind === "binary" && after.kind === "binary") {
|
|
119
|
+
return buildBinaryDiffLine(relPath, before, after);
|
|
120
|
+
}
|
|
121
|
+
if (before.kind === "text" && after.kind === "text") {
|
|
122
|
+
return buildCheckpointHunk(relPath, before.content, after.content);
|
|
123
|
+
}
|
|
124
|
+
return `Asset changed: ${relPath}`;
|
|
125
|
+
}
|
|
48
126
|
function buildCheckpointHunk(relPath, oldContent, newContent) {
|
|
49
127
|
if (oldContent === null && newContent === null) {
|
|
50
128
|
return "";
|
|
@@ -66,21 +144,32 @@ function buildCheckpointHunk(relPath, oldContent, newContent) {
|
|
|
66
144
|
return buildUnifiedPatch(relPath, oldContent ?? "", newContent ?? "");
|
|
67
145
|
}
|
|
68
146
|
async function readSnapshotEntry(repoPath, relPath) {
|
|
147
|
+
if (isBinaryAssetFile(relPath)) {
|
|
148
|
+
return readBinarySnapshotEntry(repoPath, relPath);
|
|
149
|
+
}
|
|
69
150
|
const absolute = join(repoPath, relPath);
|
|
70
151
|
if (!(await fileExists(absolute))) {
|
|
71
|
-
return { content: null };
|
|
152
|
+
return { kind: "text", content: null };
|
|
72
153
|
}
|
|
73
154
|
const stat = await fs.stat(absolute);
|
|
74
155
|
if (!stat.isFile()) {
|
|
75
|
-
return { content: null };
|
|
156
|
+
return { kind: "text", content: null };
|
|
76
157
|
}
|
|
77
|
-
return { content: await fs.readFile(absolute, "utf8") };
|
|
158
|
+
return { kind: "text", content: await fs.readFile(absolute, "utf8") };
|
|
78
159
|
}
|
|
79
160
|
async function snapshotAllowedPaths(repoPath, allowedWritePaths) {
|
|
80
161
|
const snapshot = new Map();
|
|
81
162
|
for (const rawPath of allowedWritePaths) {
|
|
82
163
|
const relPath = normalizeRelPath(rawPath);
|
|
83
|
-
if (!relPath
|
|
164
|
+
if (!relPath) {
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
if (relPath.endsWith("/")) {
|
|
168
|
+
const absoluteDir = join(repoPath, relPath);
|
|
169
|
+
if (!(await fileExists(absoluteDir))) {
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
await walkSnapshot(absoluteDir, repoPath, snapshot);
|
|
84
173
|
continue;
|
|
85
174
|
}
|
|
86
175
|
snapshot.set(relPath, await readSnapshotEntry(repoPath, relPath));
|
|
@@ -99,14 +188,19 @@ async function walkSnapshot(dir, repoPath, snapshot, globFilters) {
|
|
|
99
188
|
await walkSnapshot(fullPath, repoPath, snapshot, globFilters);
|
|
100
189
|
continue;
|
|
101
190
|
}
|
|
102
|
-
if (!entry.isFile() || !isEditableFile(relPath)) {
|
|
191
|
+
if (!entry.isFile() || (!isEditableFile(relPath) && !isBinaryAssetFile(relPath))) {
|
|
103
192
|
continue;
|
|
104
193
|
}
|
|
105
194
|
if (globFilters &&
|
|
106
195
|
!matchesPathGlobFilters(relPath, globFilters.includeGlobs, globFilters.excludeGlobs)) {
|
|
107
196
|
continue;
|
|
108
197
|
}
|
|
198
|
+
if (isBinaryAssetFile(relPath)) {
|
|
199
|
+
snapshot.set(relPath, await readBinarySnapshotEntry(repoPath, relPath));
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
109
202
|
snapshot.set(relPath, {
|
|
203
|
+
kind: "text",
|
|
110
204
|
content: await fs.readFile(fullPath, "utf8"),
|
|
111
205
|
});
|
|
112
206
|
}
|
|
@@ -127,25 +221,35 @@ async function diffSnapshotAsync(repoPath, snapshot, allowedWritePaths, globFilt
|
|
|
127
221
|
const hunks = [];
|
|
128
222
|
const seen = new Set();
|
|
129
223
|
for (const relPath of snapshot.keys()) {
|
|
130
|
-
const before = snapshot.get(relPath) ?? { content: null };
|
|
224
|
+
const before = snapshot.get(relPath) ?? { kind: "text", content: null };
|
|
131
225
|
const after = await readCurrentEntry(repoPath, relPath);
|
|
132
|
-
|
|
133
|
-
const afterContent = after.content;
|
|
134
|
-
if (beforeContent === afterContent) {
|
|
226
|
+
if (entriesEqual(before, after)) {
|
|
135
227
|
continue;
|
|
136
228
|
}
|
|
137
229
|
seen.add(relPath);
|
|
138
230
|
changedFiles.push(relPath);
|
|
139
|
-
hunks.push(
|
|
231
|
+
hunks.push(buildEntryDiffLine(relPath, before, after));
|
|
140
232
|
}
|
|
141
233
|
for (const relPath of await discoverNewFiles(repoPath, snapshot, allowedWritePaths, globFilters)) {
|
|
142
234
|
if (seen.has(relPath)) {
|
|
143
235
|
continue;
|
|
144
236
|
}
|
|
145
237
|
const after = await readCurrentEntry(repoPath, relPath);
|
|
146
|
-
|
|
238
|
+
const emptyBefore = after.kind === "binary"
|
|
239
|
+
? {
|
|
240
|
+
kind: "binary",
|
|
241
|
+
sha256: null,
|
|
242
|
+
byteSize: 0,
|
|
243
|
+
mimeType: "application/octet-stream",
|
|
244
|
+
buffer: null,
|
|
245
|
+
}
|
|
246
|
+
: { kind: "text", content: null };
|
|
247
|
+
const hasContent = after.kind === "text"
|
|
248
|
+
? after.content !== null
|
|
249
|
+
: after.sha256 !== null;
|
|
250
|
+
if (hasContent) {
|
|
147
251
|
changedFiles.push(relPath);
|
|
148
|
-
hunks.push(
|
|
252
|
+
hunks.push(buildEntryDiffLine(relPath, emptyBefore, after));
|
|
149
253
|
}
|
|
150
254
|
}
|
|
151
255
|
changedFiles.sort();
|
|
@@ -161,7 +265,24 @@ async function discoverNewFiles(repoPath, snapshot, allowedWritePaths, globFilte
|
|
|
161
265
|
const added = [];
|
|
162
266
|
for (const rawPath of allowedWritePaths) {
|
|
163
267
|
const relPath = normalizeRelPath(rawPath);
|
|
164
|
-
if (!relPath
|
|
268
|
+
if (!relPath) {
|
|
269
|
+
continue;
|
|
270
|
+
}
|
|
271
|
+
if (relPath.endsWith("/")) {
|
|
272
|
+
const absoluteDir = join(repoPath, relPath);
|
|
273
|
+
if (!(await fileExists(absoluteDir))) {
|
|
274
|
+
continue;
|
|
275
|
+
}
|
|
276
|
+
const discovered = new Map();
|
|
277
|
+
await walkSnapshot(absoluteDir, repoPath, discovered, globFilters);
|
|
278
|
+
for (const discoveredPath of discovered.keys()) {
|
|
279
|
+
if (!snapshot.has(discoveredPath)) {
|
|
280
|
+
added.push(discoveredPath);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
if (snapshot.has(relPath)) {
|
|
165
286
|
continue;
|
|
166
287
|
}
|
|
167
288
|
const absolute = join(repoPath, relPath);
|
|
@@ -186,14 +307,25 @@ async function restoreSnapshot(repoPath, snapshot, globFilters) {
|
|
|
186
307
|
await walkSnapshot(resolve(repoPath), repoPath, current, globFilters);
|
|
187
308
|
for (const [relPath, entry] of snapshot.entries()) {
|
|
188
309
|
const absolute = join(repoPath, relPath);
|
|
189
|
-
if (entry.
|
|
310
|
+
if (entry.kind === "text") {
|
|
311
|
+
if (entry.content === null) {
|
|
312
|
+
if (await fileExists(absolute)) {
|
|
313
|
+
await fs.unlink(absolute);
|
|
314
|
+
}
|
|
315
|
+
continue;
|
|
316
|
+
}
|
|
317
|
+
await fs.mkdir(join(absolute, ".."), { recursive: true });
|
|
318
|
+
await fs.writeFile(absolute, entry.content, "utf8");
|
|
319
|
+
continue;
|
|
320
|
+
}
|
|
321
|
+
if (entry.buffer === null) {
|
|
190
322
|
if (await fileExists(absolute)) {
|
|
191
323
|
await fs.unlink(absolute);
|
|
192
324
|
}
|
|
193
325
|
continue;
|
|
194
326
|
}
|
|
195
327
|
await fs.mkdir(join(absolute, ".."), { recursive: true });
|
|
196
|
-
await fs.writeFile(absolute, entry.
|
|
328
|
+
await fs.writeFile(absolute, entry.buffer);
|
|
197
329
|
}
|
|
198
330
|
for (const relPath of current.keys()) {
|
|
199
331
|
if (!snapshot.has(relPath)) {
|