@farazirfan/costar-server-executor 1.7.65 → 1.7.66

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.
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/agent/pi-embedded-runner/tools.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAe,KAAK,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAI7F;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,GAAG,EAAE,CAuC9D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,CAAC,EAAE,YAAY,EACvB,OAAO,CAAC,EAAE;IAAE,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,gBAAgB,CAAA;CAAE,GAC1E,GAAG,EAAE,CAMP"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/agent/pi-embedded-runner/tools.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAe,KAAK,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAS7F;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,GAAG,EAAE,CAoD9D;AAgDD;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,CAAC,EAAE,YAAY,EACvB,OAAO,CAAC,EAAE;IAAE,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,gBAAgB,CAAA;CAAE,GAC1E,GAAG,EAAE,CAMP"}
@@ -6,12 +6,18 @@
6
6
  * Both executors (client + server) read/write the same files — no sync layer needed.
7
7
  */
8
8
  import { getAllTools } from "../../tools/index.js";
9
+ import { detectNewFiles, buildFileSection, constructS3Url } from "../../utils/file-tracker.js";
10
+ import { getS3FileWatcher } from "../../services/s3-file-watcher.js";
11
+ /** Tools that can create/modify files in /home/user/task/ */
12
+ const FILE_TOOLS = new Set(["exec", "write"]);
9
13
  // ---------- Tool definitions ----------
10
14
  /**
11
15
  * Convert CoStar tools to ToolDefinition format (same as OpenClaw's toToolDefinitions)
12
16
  * Note: Using 'any' for type compatibility between different pi-* module versions
13
17
  */
14
18
  export function toToolDefinitions(tools) {
19
+ // Quick check: is S3 file tracking possible?
20
+ const s3Ready = !!(process.env.AWS_BUCKET_NAME && (process.env.SANDBOX_ID || process.env.COSTAR_SANDBOX_ID));
15
21
  return tools.map((tool) => {
16
22
  const name = tool.name || "tool";
17
23
  return {
@@ -21,9 +27,17 @@ export function toToolDefinitions(tools) {
21
27
  // biome-ignore lint/suspicious/noExplicitAny: TypeBox schema type differences
22
28
  parameters: tool.parameters,
23
29
  execute: async (toolCallId, params, _onUpdate, _ctx, signal) => {
30
+ const startTime = s3Ready && FILE_TOOLS.has(name) ? Date.now() : 0;
24
31
  // Execute the CoStar tool (simplified adapter)
25
32
  try {
26
33
  const result = await tool.execute(toolCallId, params);
34
+ // Enrich file-creating tools with S3 URLs (fast, non-blocking)
35
+ if (startTime > 0) {
36
+ try {
37
+ appendFileUrls(name, params, result, startTime);
38
+ }
39
+ catch { /* never break tool execution */ }
40
+ }
27
41
  return result;
28
42
  }
29
43
  catch (err) {
@@ -45,6 +59,46 @@ export function toToolDefinitions(tools) {
45
59
  };
46
60
  });
47
61
  }
62
+ /**
63
+ * Append S3 URLs to tool result for newly created files.
64
+ * - write: constructs URL from known path (instant)
65
+ * - exec: mtime scan of /home/user/task/ depth 2 (<10ms typical)
66
+ * Fire-and-forget S3 upload — doesn't block the tool result.
67
+ */
68
+ function appendFileUrls(toolName, params, result, startTime) {
69
+ const textBlock = result?.content?.[0];
70
+ if (!textBlock || textBlock.type !== "text")
71
+ return;
72
+ if (toolName === "write") {
73
+ const filePath = params.path;
74
+ if (!filePath)
75
+ return;
76
+ const s3Url = constructS3Url(filePath);
77
+ if (!s3Url)
78
+ return; // not under /home/user/task/
79
+ // Fire-and-forget upload
80
+ const watcher = getS3FileWatcher();
81
+ if (watcher)
82
+ void watcher.uploadImmediate([filePath]);
83
+ const name = filePath.split("/").pop();
84
+ textBlock.text += `\n\n[File URL]\n- ${name} → ${s3Url}`;
85
+ return;
86
+ }
87
+ if (toolName === "exec") {
88
+ // Skip background/running/failed commands
89
+ if (result?.details?.status !== "completed")
90
+ return;
91
+ // Fast mtime scan (depth 2, skips node_modules etc.)
92
+ const newFiles = detectNewFiles(startTime, 2);
93
+ if (newFiles.length === 0)
94
+ return;
95
+ // Fire-and-forget upload
96
+ const watcher = getS3FileWatcher();
97
+ if (watcher)
98
+ void watcher.uploadImmediate(newFiles.map((f) => f.localPath));
99
+ textBlock.text += buildFileSection(newFiles);
100
+ }
101
+ }
48
102
  /**
49
103
  * Get all CoStar tools converted to ToolDefinition format.
50
104
  * Following OpenClaw's pattern: tools are created inside the runner with full context.
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/agent/pi-embedded-runner/tools.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,WAAW,EAA4C,MAAM,sBAAsB,CAAC;AAE7F,yCAAyC;AAEzC;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAqB;IACrD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC;QACjC,OAAO;YACL,IAAI;YACJ,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;YACnC,8EAA8E;YAC9E,UAAU,EAAE,IAAI,CAAC,UAAiB;YAClC,OAAO,EAAE,KAAK,EACZ,UAAkB,EAClB,MAAe,EACf,SAAe,EACf,IAAU,EACV,MAAoB,EACN,EAAE;gBAChB,+CAA+C;gBAC/C,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,MAAiC,CAAC,CAAC;oBACjF,OAAO,MAAM,CAAC;gBAChB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,gBAAgB;oBAChB,IAAI,MAAM,EAAE,OAAO;wBAAE,MAAM,GAAG,CAAC;oBAC/B,MAAM,OAAO,GACX,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,IAAI,GAAG;wBAC7C,CAAC,CAAC,MAAM,CAAE,GAA0B,CAAC,IAAI,CAAC;wBAC1C,CAAC,CAAC,EAAE,CAAC;oBACT,IAAI,OAAO,KAAK,YAAY;wBAAE,MAAM,GAAG,CAAC;oBAExC,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBACjE,OAAO,CAAC,KAAK,CAAC,WAAW,IAAI,YAAY,OAAO,EAAE,CAAC,CAAC;oBAEpD,OAAO;wBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;qBAC5G,CAAC;gBACJ,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAuB,EACvB,OAA2E;IAE3E,IAAI,WAAW,GAAG,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IAC/D,IAAI,OAAO,EAAE,kBAAkB,EAAE,CAAC;QAChC,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,iBAAiB,CAAC,WAAW,CAAC,CAAC;AACxC,CAAC"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/agent/pi-embedded-runner/tools.ts"],"names":[],"mappings":"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"}
@@ -24,11 +24,8 @@ export type UploadRecord = {
24
24
  s3Url: string;
25
25
  uploadedAt: number;
26
26
  };
27
- /**
28
- * S3 File Watcher watches a directory and uploads changed files to S3.
29
- *
30
- * Uses dynamic import for chokidar (ESM-only since v4).
31
- */
27
+ /** Get the global S3FileWatcher instance (null if not initialized) */
28
+ export declare function getS3FileWatcher(): S3FileWatcher | null;
32
29
  export declare class S3FileWatcher {
33
30
  private config;
34
31
  private watcher;
@@ -59,6 +56,12 @@ export declare class S3FileWatcher {
59
56
  * Upload a single file to S3 via aws cli.
60
57
  */
61
58
  private uploadFile;
59
+ /**
60
+ * Trigger immediate upload for specific files (bypasses debounce).
61
+ * Used by tool result enrichment to ensure files are on S3 ASAP
62
+ * after a command creates them.
63
+ */
64
+ uploadImmediate(filePaths: string[]): Promise<void>;
62
65
  /**
63
66
  * Get recent uploads since a timestamp.
64
67
  * Used by sandbox-ops to report changed_files in execute response.
@@ -1 +1 @@
1
- {"version":3,"file":"s3-file-watcher.d.ts","sourceRoot":"","sources":["../../src/services/s3-file-watcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,MAAM,mBAAmB,GAAG;IAChC,qDAAqD;IACrD,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAoBF;;;;GAIG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAgC;IAE9C,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,gBAAgB,CAAO;IAC/B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAIX;gBAEU,MAAM,EAAE,mBAAmB;IAOvC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAqC5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAc3B;;OAEG;IACH,OAAO,CAAC,WAAW;IAanB;;OAEG;YACW,YAAY;IAoB1B;;OAEG;IACH,OAAO,CAAC,UAAU;IAwClB;;;OAGG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,EAAE;IAI/C;;OAEG;IACH,SAAS,IAAI;QACX,QAAQ,EAAE,OAAO,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;KACtB;CAUF"}
1
+ {"version":3,"file":"s3-file-watcher.d.ts","sourceRoot":"","sources":["../../src/services/s3-file-watcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,MAAM,mBAAmB,GAAG;IAChC,qDAAqD;IACrD,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AA8CF,sEAAsE;AACtE,wBAAgB,gBAAgB,IAAI,aAAa,GAAG,IAAI,CAEvD;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAgC;IAE9C,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,gBAAgB,CAAO;IAC/B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAIX;gBAEU,MAAM,EAAE,mBAAmB;IASvC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAqC5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAc3B;;OAEG;IACH,OAAO,CAAC,WAAW;IAanB;;OAEG;YACW,YAAY;IAoB1B;;OAEG;IACH,OAAO,CAAC,UAAU;IAwClB;;;;OAIG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IASzD;;;OAGG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,EAAE;IAI/C;;OAEG;IACH,SAAS,IAAI;QACX,QAAQ,EAAE,OAAO,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;KACtB;CAUF"}
@@ -10,28 +10,53 @@
10
10
  import { exec } from "node:child_process";
11
11
  import path from "node:path";
12
12
  import fs from "node:fs";
13
- /** Ignore patterns directories/files to skip */
14
- const IGNORE_PATTERNS = [
15
- "**/node_modules/**",
16
- "**/.bin/**",
17
- "**/.git/**",
18
- "**/__pycache__/**",
19
- "**/dist/**",
20
- "**/.next/**",
21
- "**/.cache/**",
22
- "**/.venv/**",
23
- "**/venv/**",
24
- "**/*.pyc",
25
- "**/.DS_Store",
26
- "**/package-lock.json",
27
- "**/yarn.lock",
28
- "**/pnpm-lock.yaml",
29
- ];
13
+ /** Directory names to ignore (matched against every path segment) */
14
+ const IGNORE_DIRS = new Set([
15
+ "node_modules",
16
+ ".bin",
17
+ ".git",
18
+ "__pycache__",
19
+ "dist",
20
+ ".next",
21
+ ".cache",
22
+ ".venv",
23
+ "venv",
24
+ ]);
25
+ /** File names to ignore */
26
+ const IGNORE_FILES = new Set([
27
+ "package-lock.json",
28
+ "yarn.lock",
29
+ "pnpm-lock.yaml",
30
+ ".DS_Store",
31
+ ]);
32
+ /**
33
+ * Function-based ignore for chokidar — more reliable than glob patterns
34
+ * which can miss nested paths in chokidar v4.
35
+ */
36
+ function shouldIgnore(filePath) {
37
+ const segments = filePath.split("/");
38
+ for (const seg of segments) {
39
+ if (IGNORE_DIRS.has(seg))
40
+ return true;
41
+ }
42
+ const name = segments[segments.length - 1];
43
+ if (IGNORE_FILES.has(name))
44
+ return true;
45
+ if (name.endsWith(".pyc"))
46
+ return true;
47
+ return false;
48
+ }
30
49
  /**
31
50
  * S3 File Watcher — watches a directory and uploads changed files to S3.
32
51
  *
33
52
  * Uses dynamic import for chokidar (ESM-only since v4).
34
53
  */
54
+ // Module-level singleton for access from tools
55
+ let _instance = null;
56
+ /** Get the global S3FileWatcher instance (null if not initialized) */
57
+ export function getS3FileWatcher() {
58
+ return _instance;
59
+ }
35
60
  export class S3FileWatcher {
36
61
  config;
37
62
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -51,6 +76,8 @@ export class S3FileWatcher {
51
76
  ...config,
52
77
  debounceMs: config.debounceMs ?? 5000,
53
78
  };
79
+ // Register as singleton
80
+ _instance = this;
54
81
  }
55
82
  /**
56
83
  * Start watching for file changes.
@@ -65,7 +92,7 @@ export class S3FileWatcher {
65
92
  // Dynamic import for chokidar (ESM)
66
93
  const { watch } = await import("chokidar");
67
94
  this.watcher = watch(watchDir, {
68
- ignored: IGNORE_PATTERNS,
95
+ ignored: shouldIgnore,
69
96
  persistent: true,
70
97
  ignoreInitial: true, // Don't upload everything on startup
71
98
  followSymlinks: false,
@@ -168,6 +195,19 @@ export class S3FileWatcher {
168
195
  });
169
196
  });
170
197
  }
198
+ /**
199
+ * Trigger immediate upload for specific files (bypasses debounce).
200
+ * Used by tool result enrichment to ensure files are on S3 ASAP
201
+ * after a command creates them.
202
+ */
203
+ async uploadImmediate(filePaths) {
204
+ const uploadPromises = filePaths.map((fp) => {
205
+ // Remove from pending queue (avoid double upload)
206
+ this.pendingUploads.delete(fp);
207
+ return this.uploadFile(fp);
208
+ });
209
+ await Promise.allSettled(uploadPromises);
210
+ }
171
211
  /**
172
212
  * Get recent uploads since a timestamp.
173
213
  * Used by sandbox-ops to report changed_files in execute response.
@@ -1 +1 @@
1
- {"version":3,"file":"s3-file-watcher.js","sourceRoot":"","sources":["../../src/services/s3-file-watcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"s3-file-watcher.js","sourceRoot":"","sources":["../../src/services/s3-file-watcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * File Tracker — Detect new/modified files and construct S3 URLs
3
+ *
4
+ * Used by tool result enrichment to automatically include S3 URLs
5
+ * when tools create files in /home/user/task/.
6
+ * This ensures the LLM always has correct S3 URLs available,
7
+ * rather than guessing local paths or sandbox:/ prefixes.
8
+ */
9
+ export type TrackedFile = {
10
+ localPath: string;
11
+ relativePath: string;
12
+ s3Url: string;
13
+ size: number;
14
+ };
15
+ /**
16
+ * Construct an S3 URL from a local file path.
17
+ * Returns null if the file is not under TASK_DIR or env vars are missing.
18
+ */
19
+ export declare function constructS3Url(localPath: string): string | null;
20
+ /**
21
+ * Detect files in /home/user/task/ that were created or modified after `sinceMs`.
22
+ * Scans up to `maxDepth` levels deep (default 3) to limit cost.
23
+ * Returns files with S3 URLs.
24
+ */
25
+ export declare function detectNewFiles(sinceMs: number, maxDepth?: number): TrackedFile[];
26
+ /**
27
+ * Build the [Created Files] section to append to tool results.
28
+ * Returns empty string if no new files were found.
29
+ */
30
+ export declare function buildFileSection(files: TrackedFile[]): string;
31
+ //# sourceMappingURL=file-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-tracker.d.ts","sourceRoot":"","sources":["../../src/utils/file-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA2BH,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAU/D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,WAAW,EAAE,CAkD3E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CAc7D"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * File Tracker — Detect new/modified files and construct S3 URLs
3
+ *
4
+ * Used by tool result enrichment to automatically include S3 URLs
5
+ * when tools create files in /home/user/task/.
6
+ * This ensures the LLM always has correct S3 URLs available,
7
+ * rather than guessing local paths or sandbox:/ prefixes.
8
+ */
9
+ import fs from "node:fs";
10
+ import path from "node:path";
11
+ const TASK_DIR = "/home/user/task";
12
+ /** Ignore patterns for file scanning */
13
+ const IGNORE_DIRS = new Set([
14
+ "node_modules",
15
+ ".git",
16
+ "__pycache__",
17
+ "dist",
18
+ ".next",
19
+ ".cache",
20
+ ".venv",
21
+ "venv",
22
+ ".bin",
23
+ ]);
24
+ const IGNORE_FILES = new Set([
25
+ "package-lock.json",
26
+ "yarn.lock",
27
+ "pnpm-lock.yaml",
28
+ ".DS_Store",
29
+ ]);
30
+ /**
31
+ * Construct an S3 URL from a local file path.
32
+ * Returns null if the file is not under TASK_DIR or env vars are missing.
33
+ */
34
+ export function constructS3Url(localPath) {
35
+ const bucket = process.env.AWS_BUCKET_NAME;
36
+ const region = process.env.AWS_REGION || "us-east-2";
37
+ const sandboxId = process.env.SANDBOX_ID || process.env.COSTAR_SANDBOX_ID;
38
+ if (!bucket || !sandboxId)
39
+ return null;
40
+ if (!localPath.startsWith(TASK_DIR))
41
+ return null;
42
+ const relativePath = path.relative(TASK_DIR, localPath);
43
+ return `https://${bucket}.s3.${region}.amazonaws.com/${sandboxId}/${relativePath}`;
44
+ }
45
+ /**
46
+ * Detect files in /home/user/task/ that were created or modified after `sinceMs`.
47
+ * Scans up to `maxDepth` levels deep (default 3) to limit cost.
48
+ * Returns files with S3 URLs.
49
+ */
50
+ export function detectNewFiles(sinceMs, maxDepth = 3) {
51
+ const bucket = process.env.AWS_BUCKET_NAME;
52
+ const region = process.env.AWS_REGION || "us-east-2";
53
+ const sandboxId = process.env.SANDBOX_ID || process.env.COSTAR_SANDBOX_ID;
54
+ if (!bucket || !sandboxId)
55
+ return [];
56
+ if (!fs.existsSync(TASK_DIR))
57
+ return [];
58
+ const results = [];
59
+ function scan(dir, depth) {
60
+ if (depth > maxDepth)
61
+ return;
62
+ let entries;
63
+ try {
64
+ entries = fs.readdirSync(dir, { withFileTypes: true });
65
+ }
66
+ catch {
67
+ return;
68
+ }
69
+ for (const entry of entries) {
70
+ if (entry.isDirectory()) {
71
+ if (IGNORE_DIRS.has(entry.name))
72
+ continue;
73
+ scan(path.join(dir, entry.name), depth + 1);
74
+ }
75
+ else if (entry.isFile()) {
76
+ if (IGNORE_FILES.has(entry.name))
77
+ continue;
78
+ const fullPath = path.join(dir, entry.name);
79
+ try {
80
+ const stat = fs.statSync(fullPath);
81
+ // Check if modified after sinceMs (use max of mtime and birthtime)
82
+ const fileTime = Math.max(stat.mtimeMs, stat.birthtimeMs);
83
+ if (fileTime >= sinceMs) {
84
+ const relativePath = path.relative(TASK_DIR, fullPath);
85
+ results.push({
86
+ localPath: fullPath,
87
+ relativePath,
88
+ s3Url: `https://${bucket}.s3.${region}.amazonaws.com/${sandboxId}/${relativePath}`,
89
+ size: stat.size,
90
+ });
91
+ }
92
+ }
93
+ catch {
94
+ // Skip files we can't stat
95
+ }
96
+ }
97
+ }
98
+ }
99
+ scan(TASK_DIR, 0);
100
+ return results;
101
+ }
102
+ /**
103
+ * Build the [Created Files] section to append to tool results.
104
+ * Returns empty string if no new files were found.
105
+ */
106
+ export function buildFileSection(files) {
107
+ if (files.length === 0)
108
+ return "";
109
+ const lines = ["\n\n[Created/Modified Files]"];
110
+ for (const f of files) {
111
+ const sizeKb = Math.round(f.size / 1024);
112
+ lines.push(`- ${f.relativePath} (${sizeKb}KB) → ${f.s3Url}`);
113
+ }
114
+ lines.push("", "Use these S3 URLs when sharing files with the user (in messages or complete_task content blocks).", 'Example content block: {"type": "file", "data": {"url": "<S3_URL>", "name": "<filename>"}}');
115
+ return lines.join("\n");
116
+ }
117
+ //# sourceMappingURL=file-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-tracker.js","sourceRoot":"","sources":["../../src/utils/file-tracker.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@farazirfan/costar-server-executor",
3
- "version": "1.7.65",
3
+ "version": "1.7.66",
4
4
  "description": "CoStar Server Executor - 24/7 autonomous agent in TypeScript (cloned from OpenClaw)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",