@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.
Files changed (89) hide show
  1. package/README.md +77 -0
  2. package/dist/agent/RunEventBus.d.ts.map +1 -1
  3. package/dist/agent/RunEventBus.js +9 -0
  4. package/dist/agent/RunEventBus.js.map +1 -1
  5. package/dist/agent/editCompletion.d.ts +2 -1
  6. package/dist/agent/editCompletion.d.ts.map +1 -1
  7. package/dist/agent/editCompletion.js +30 -0
  8. package/dist/agent/editCompletion.js.map +1 -1
  9. package/dist/agent/emitAgentThinking.d.ts +19 -0
  10. package/dist/agent/emitAgentThinking.d.ts.map +1 -0
  11. package/dist/agent/emitAgentThinking.js +89 -0
  12. package/dist/agent/emitAgentThinking.js.map +1 -0
  13. package/dist/agent/evaluateTaskCompletion.d.ts +2 -0
  14. package/dist/agent/evaluateTaskCompletion.d.ts.map +1 -1
  15. package/dist/agent/evaluateTaskCompletion.js +4 -1
  16. package/dist/agent/evaluateTaskCompletion.js.map +1 -1
  17. package/dist/agent/events.d.ts +20 -3
  18. package/dist/agent/events.d.ts.map +1 -1
  19. package/dist/agent/events.js +2 -0
  20. package/dist/agent/events.js.map +1 -1
  21. package/dist/agent/tools/assetPathValidation.d.ts +19 -0
  22. package/dist/agent/tools/assetPathValidation.d.ts.map +1 -0
  23. package/dist/agent/tools/assetPathValidation.js +124 -0
  24. package/dist/agent/tools/assetPathValidation.js.map +1 -0
  25. package/dist/agent/tools/executeTool.d.ts +1 -1
  26. package/dist/agent/tools/executeTool.d.ts.map +1 -1
  27. package/dist/agent/tools/executeTool.js +16 -0
  28. package/dist/agent/tools/executeTool.js.map +1 -1
  29. package/dist/agent/tools/generateImage.d.ts +11 -0
  30. package/dist/agent/tools/generateImage.d.ts.map +1 -0
  31. package/dist/agent/tools/generateImage.js +98 -0
  32. package/dist/agent/tools/generateImage.js.map +1 -0
  33. package/dist/agent/tools/publishReferenceImage.d.ts +9 -0
  34. package/dist/agent/tools/publishReferenceImage.d.ts.map +1 -0
  35. package/dist/agent/tools/publishReferenceImage.js +61 -0
  36. package/dist/agent/tools/publishReferenceImage.js.map +1 -0
  37. package/dist/agent/tools/saveAsset.d.ts +11 -0
  38. package/dist/agent/tools/saveAsset.d.ts.map +1 -0
  39. package/dist/agent/tools/saveAsset.js +30 -0
  40. package/dist/agent/tools/saveAsset.js.map +1 -0
  41. package/dist/agent/tools/types.d.ts +4 -0
  42. package/dist/agent/tools/types.d.ts.map +1 -1
  43. package/dist/index.d.ts +4 -3
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +2 -1
  46. package/dist/index.js.map +1 -1
  47. package/dist/providers/agentic/AgenticCustomProvider.d.ts.map +1 -1
  48. package/dist/providers/agentic/AgenticCustomProvider.js +5 -0
  49. package/dist/providers/agentic/AgenticCustomProvider.js.map +1 -1
  50. package/dist/providers/agentic/agentLoop.d.ts.map +1 -1
  51. package/dist/providers/agentic/agentLoop.js +32 -4
  52. package/dist/providers/agentic/agentLoop.js.map +1 -1
  53. package/dist/providers/agentic/toolSchemas.d.ts +124 -0
  54. package/dist/providers/agentic/toolSchemas.d.ts.map +1 -1
  55. package/dist/providers/agentic/toolSchemas.js +55 -0
  56. package/dist/providers/agentic/toolSchemas.js.map +1 -1
  57. package/dist/runner/aggregateStepStates.d.ts +20 -0
  58. package/dist/runner/aggregateStepStates.d.ts.map +1 -0
  59. package/dist/runner/aggregateStepStates.js +45 -0
  60. package/dist/runner/aggregateStepStates.js.map +1 -0
  61. package/dist/runner/index.d.ts +3 -0
  62. package/dist/runner/index.d.ts.map +1 -1
  63. package/dist/runner/index.js +2 -0
  64. package/dist/runner/index.js.map +1 -1
  65. package/dist/runner/jobTypes.d.ts +10 -1
  66. package/dist/runner/jobTypes.d.ts.map +1 -1
  67. package/dist/runner/mapStreamEvents.d.ts.map +1 -1
  68. package/dist/runner/mapStreamEvents.js +49 -0
  69. package/dist/runner/mapStreamEvents.js.map +1 -1
  70. package/dist/runner/sandboxStepTools.d.ts +12 -0
  71. package/dist/runner/sandboxStepTools.d.ts.map +1 -0
  72. package/dist/runner/sandboxStepTools.js +28 -0
  73. package/dist/runner/sandboxStepTools.js.map +1 -0
  74. package/dist/util/minimaxImageClient.d.ts +25 -0
  75. package/dist/util/minimaxImageClient.d.ts.map +1 -0
  76. package/dist/util/minimaxImageClient.js +114 -0
  77. package/dist/util/minimaxImageClient.js.map +1 -0
  78. package/dist/workspace/referenceImages.d.ts +14 -0
  79. package/dist/workspace/referenceImages.d.ts.map +1 -0
  80. package/dist/workspace/referenceImages.js +60 -0
  81. package/dist/workspace/referenceImages.js.map +1 -0
  82. package/dist/workspace/workspaceCheckpoint.d.ts.map +1 -1
  83. package/dist/workspace/workspaceCheckpoint.js +148 -16
  84. package/dist/workspace/workspaceCheckpoint.js.map +1 -1
  85. package/dist/workspace/writeScreenshot.d.ts.map +1 -1
  86. package/dist/workspace/writeScreenshot.js +15 -7
  87. package/dist/workspace/writeScreenshot.js.map +1 -1
  88. package/docs/sandbox-runner.md +78 -1
  89. 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":"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"}
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;AAG7D,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAa/B,MAAM,UAAU,sBAAsB,CACpC,cAAuB;IAEvB,OAAO;QACL,OAAO,EAAE,CAAC;QACV,eAAe,EAAE,IAAI,GAAG,EAAE;QAC1B,mBAAmB,EAAE,KAAK;QAC1B,SAAS,EAAE,EAAE,cAAc,EAAE;KAC9B,CAAC;AACJ,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,mBAAmB,CACjC,GAAqB,EACrB,MAAmD;IAEnD,MAAM,MAAM,GAA2B,EAAE,CAAC;IAE1C,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,eAAe,CAAC,OAAO,EAAE,EAAE,CAAC;QAC9D,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,MAAM;gBACZ,EAAE,EAAE,MAAM;gBACV,KAAK,EAAE,QAAQ;gBACf,MAAM;gBACN,QAAQ;aACT,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,GAAG,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;IAC5B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,8BAA8B,CAC5C,KAAoB,EACpB,GAAqB;IAErB,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QACrE,sBAAsB,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QACvE,sBAAsB,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;IAED,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,oBAAoB,CAAC,CAAC,CAAC;YAC1B,IAAI,GAAG,CAAC,mBAAmB,EAAE,CAAC;gBAC5B,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,GAAG,CAAC,mBAAmB,GAAG,IAAI,CAAC;YAC/B,OAAO;gBACL;oBACE,IAAI,EAAE,MAAM;oBACZ,EAAE,EAAE,gBAAgB;oBACpB,KAAK,EAAE,oBAAoB;oBAC3B,MAAM,EAAE,WAAW;iBACpB;aACF,CAAC;QACJ,CAAC;QACD,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,MAAM,KAAK,GAAG,0BAA0B,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAC9D,OAAO;oBACL;wBACE,IAAI,EAAE,gBAAgB;wBACtB,KAAK,EAAE;4BACL,GAAG,KAAK;4BACR,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE;yBAC9E;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;YACjB,MAAM,MAAM,GAAG,QAAQ,GAAG,CAAC,OAAO,EAAE,CAAC;YAErC,MAAM,KAAK,GAAG,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACxD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACnB,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAE3C,OAAO;gBACL;oBACE,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE;wBACL,IAAI,EAAE,YAAY;wBAClB,QAAQ,EAAE,KAAK,CAAC,IAAI;wBACpB,KAAK,EAAE,KAAK,CAAC,IAAI;wBACjB,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;wBACjD,MAAM;qBACP;iBACF;gBACD;oBACE,IAAI,EAAE,MAAM;oBACZ,EAAE,EAAE,MAAM;oBACV,KAAK,EAAE,KAAK,CAAC,IAAI;oBACjB,MAAM,EAAE,QAAQ;oBAChB,QAAQ,EAAE,KAAK,CAAC,IAAI;iBACrB;aACF,CAAC;QACJ,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,MAAM,KAAK,GAAG,0BAA0B,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAC5D,OAAO;oBACL;wBACE,IAAI,EAAE,gBAAgB;wBACtB,KAAK,EAAE;4BACL,GAAG,KAAK;4BACR,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,WAAW;yBAC7D;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,MAAM,KAAK,GAAG,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACxD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;YAE7B,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,CAAC,IAAI,CAAC,yCAAyC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBACpE,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC7C,CAAC;YAED,OAAO;gBACL;oBACE,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE;wBACL,IAAI,EAAE,UAAU;wBAChB,QAAQ,EAAE,KAAK,CAAC,IAAI;wBACpB,KAAK,EAAE,KAAK,CAAC,IAAI;wBACjB,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ;wBACzC,MAAM;qBACP;iBACF;gBACD;oBACE,IAAI,EAAE,MAAM;oBACZ,EAAE,EAAE,MAAM;oBACV,KAAK,EAAE,KAAK,CAAC,IAAI;oBACjB,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ;oBACzC,QAAQ,EAAE,KAAK,CAAC,IAAI;iBACrB;aACF,CAAC;QACJ,CAAC;QACD,KAAK,WAAW;YACd,OAAO;gBACL;oBACE,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE;wBACL,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;wBAChB,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB,SAAS,EAAE,KAAK,CAAC,SAAS;wBAC1B,KAAK,EAAE,KAAK,CAAC,IAAI;qBAClB;iBACF;aACF,CAAC;QACJ,KAAK,UAAU;YACb,OAAO;gBACL;oBACE,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE;wBACL,IAAI,EAAE,MAAM;wBACZ,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB,SAAS,EAAE,KAAK,CAAC,SAAS;wBAC1B,KAAK,EAAE,aAAa;wBACpB,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;qBACtC;iBACF;aACF,CAAC;QACJ,KAAK,cAAc;YACjB,OAAO;gBACL;oBACE,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE;wBACL,IAAI,EAAE,MAAM;wBACZ,KAAK,EAAE,iBAAiB;wBACxB,MAAM,EACJ,KAAK,CAAC,MAAM,KAAK,uBAAuB;4BACtC,CAAC,CAAC,uDAAuD;4BACzD,CAAC,CAAC,qBAAqB,KAAK,CAAC,MAAM,EAAE;qBAC1C;iBACF;aACF,CAAC;QACJ,KAAK,kBAAkB;YACrB,OAAO;gBACL,GAAG,mBAAmB,CAAC,GAAG,EAAE,WAAW,CAAC;gBACxC;oBACE,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE;wBACL,IAAI,EAAE,MAAM;wBACZ,KAAK,EAAE,cAAc;wBACrB,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;qBAC5D;iBACF;aACF,CAAC;QACJ,KAAK,YAAY;YACf,OAAO;gBACL,GAAG,mBAAmB,CAAC,GAAG,EAAE,QAAQ,CAAC;gBACrC;oBACE,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE;wBACL,IAAI,EAAE,MAAM;wBACZ,KAAK,EAAE,YAAY;wBACnB,MAAM,EAAE,KAAK,CAAC,OAAO;qBACtB;iBACF;aACF,CAAC;QACJ,KAAK,eAAe;YAClB,OAAO;gBACL;oBACE,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE;wBACL,IAAI,EAAE,MAAM;wBACZ,KAAK,EAAE,YAAY;wBACnB,MAAM,EAAE,cAAc,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,WAAW,EAAE;qBAC3D;iBACF;aACF,CAAC;QACJ,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,IAAI,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;YAC1C,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBACjB,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,OAAO;gBACL;oBACE,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE;wBACL,IAAI,EAAE,MAAM;wBACZ,KAAK,EAAE,sBAAsB;wBAC7B,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;qBAC3B;iBACF;aACF,CAAC;QACJ,CAAC;QACD,KAAK,gBAAgB;YACnB,OAAO;gBACL;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,UAAU,EAAE,KAAK,CAAC,UAAU;iBAC7B;aACF,CAAC;QACJ,KAAK,uBAAuB;YAC1B,OAAO;gBACL;oBACE,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE;wBACL,IAAI,EAAE,WAAW;wBACjB,KAAK,EAAE,oBAAoB,KAAK,CAAC,QAAQ,GAAG;wBAC5C,MAAM,EAAE,KAAK,CAAC,gBAAgB;wBAC9B,SAAS,EAAE,KAAK,CAAC,MAAM;qBACxB;iBACF;aACF,CAAC;QACJ;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,4BAA4B,CAC1C,IAAY;IAEZ,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAY,CAAC;QAC9C,IACE,OAAO,MAAM,KAAK,QAAQ;YAC1B,MAAM,KAAK,IAAI;YACf,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,EACnB,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,IAAI,GAAI,MAA2B,CAAC,IAAI,CAAC;QAC/C,IAAI,IAAI,KAAK,UAAU,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;YAC7C,OAAO,MAAkC,CAAC;QAC5C,CAAC;QACD,IAAI,IAAI,KAAK,QAAQ,IAAI,QAAQ,IAAI,MAAM,EAAE,CAAC;YAC5C,OAAO,MAAkC,CAAC;QAC5C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -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":"AAYA,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;CACd;AAMD,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;AA8RD,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
+ {"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 || relPath.endsWith("/")) {
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
- const beforeContent = before.content;
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(buildCheckpointHunk(relPath, beforeContent, afterContent));
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
- if (after.content !== null) {
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(buildCheckpointHunk(relPath, null, after.content));
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 || relPath.endsWith("/") || snapshot.has(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.content === null) {
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.content, "utf8");
328
+ await fs.writeFile(absolute, entry.buffer);
197
329
  }
198
330
  for (const relPath of current.keys()) {
199
331
  if (!snapshot.has(relPath)) {