@sourcegraph/amp 0.0.1748338101-g3716f1 → 0.0.1748344183-gce2b68

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 (43) hide show
  1. package/dist/amp.js +3 -3
  2. package/dist/{client-Cz8QljuN.js → client-CGgxVuSC.js} +7 -7
  3. package/dist/{client-Cz8QljuN.js.map → client-CGgxVuSC.js.map} +1 -1
  4. package/dist/{color-DH4c3nvN.js → color-BHYGC4Ar.js} +135 -124
  5. package/dist/color-BHYGC4Ar.js.map +1 -0
  6. package/dist/{create_file.node-D6Df0Urb.js → create_file.node-D3fcWUKp.js} +2 -2
  7. package/dist/{create_file.node-D6Df0Urb.js.map → create_file.node-D3fcWUKp.js.map} +1 -1
  8. package/dist/{edit_file.node-C7Ni9Xjb.js → edit_file.node-DFDvUKmK.js} +5 -5
  9. package/dist/{edit_file.node-C7Ni9Xjb.js.map → edit_file.node-DFDvUKmK.js.map} +1 -1
  10. package/dist/{executable-BJNIVWlu.js → executable-CBhkfVUL.js} +2 -2
  11. package/dist/{executable-BJNIVWlu.js.map → executable-CBhkfVUL.js.map} +1 -1
  12. package/dist/{files-DZUDelFg.js → files-BqepJuwv.js} +2 -2
  13. package/dist/{files-DZUDelFg.js.map → files-BqepJuwv.js.map} +1 -1
  14. package/dist/{glob.node-C9lKzgi-.js → glob.node-BINRiQjJ.js} +26 -26
  15. package/dist/{glob.node-C9lKzgi-.js.map → glob.node-BINRiQjJ.js.map} +1 -1
  16. package/dist/{list_directory.node-DrWI9xPT.js → list_directory.node-DPu4RhvA.js} +2 -2
  17. package/dist/{list_directory.node-DrWI9xPT.js.map → list_directory.node-DPu4RhvA.js.map} +1 -1
  18. package/dist/{load-profile-noOyWkOF.js → load-profile-DC97etcT.js} +2 -2
  19. package/dist/{load-profile-noOyWkOF.js.map → load-profile-DC97etcT.js.map} +1 -1
  20. package/dist/{main-XzserkUB.js → main-C22ZCKsZ.js} +5559 -5497
  21. package/dist/main-C22ZCKsZ.js.map +1 -0
  22. package/dist/{node-TK8n7MXb.js → node-BOqn899s.js} +5 -5
  23. package/dist/{node-TK8n7MXb.js.map → node-BOqn899s.js.map} +1 -1
  24. package/dist/{node-CiK6YqQn.js → node-CK2AzzJP.js} +3 -3
  25. package/dist/{node-CiK6YqQn.js.map → node-CK2AzzJP.js.map} +1 -1
  26. package/dist/{node-DtF9_How.js → node-CieDu4sj.js} +2 -2
  27. package/dist/{node-DtF9_How.js.map → node-CieDu4sj.js.map} +1 -1
  28. package/dist/{node-5s3BwyMp.js → node-Coo1Y37e.js} +3 -3
  29. package/dist/{node-5s3BwyMp.js.map → node-Coo1Y37e.js.map} +1 -1
  30. package/dist/{node-BoNPZ-4l.js → node-DW21A6nN.js} +2 -2
  31. package/dist/{node-BoNPZ-4l.js.map → node-DW21A6nN.js.map} +1 -1
  32. package/dist/{node-CGa3o78d.js → node-DX52svHT.js} +20 -20
  33. package/dist/{node-CGa3o78d.js.map → node-DX52svHT.js.map} +1 -1
  34. package/dist/{read_file.node-DugoUCiQ.js → read_file.node-M7X04JIh.js} +2 -2
  35. package/dist/{read_file.node-DugoUCiQ.js.map → read_file.node-M7X04JIh.js.map} +1 -1
  36. package/dist/{stdio-L9eSubEK.js → stdio-BIlnCjMe.js} +9 -9
  37. package/dist/{stdio-L9eSubEK.js.map → stdio-BIlnCjMe.js.map} +1 -1
  38. package/dist/storybook.js +1 -1
  39. package/dist/{undo_edit.node-C8KyPFqz.js → undo_edit.node-CP3LxQtf.js} +10 -10
  40. package/dist/{undo_edit.node-C8KyPFqz.js.map → undo_edit.node-CP3LxQtf.js.map} +1 -1
  41. package/package.json +1 -1
  42. package/dist/color-DH4c3nvN.js.map +0 -1
  43. package/dist/main-XzserkUB.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { f as a } from "./client-Cz8QljuN.js";
3
- import { p as u, H as c } from "./color-DH4c3nvN.js";
2
+ import { f as a } from "./client-CGgxVuSC.js";
3
+ import { p as u, H as c } from "./color-BHYGC4Ar.js";
4
4
  const l = ({ args: o }, { threadID: t }) => u(async (s) => {
5
5
  try {
6
6
  const r = `/api/web-search?query=${encodeURIComponent(o.query)}&numResults=${o.num_results || 5}`, e = await a(r, {
@@ -23,4 +23,4 @@ const l = ({ args: o }, { threadID: t }) => u(async (s) => {
23
23
  export {
24
24
  l as nodeWebSearchTool
25
25
  };
26
- //# sourceMappingURL=node-5s3BwyMp.js.map
26
+ //# sourceMappingURL=node-Coo1Y37e.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"node-5s3BwyMp.js","sources":["../../core/src/tools/builtin/web_search/node.ts"],"sourcesContent":["import { promiseFactoryToObservable } from '@sourcegraph/observable'\nimport { fetchFromAmpServer } from '../../../server-api/client'\nimport { HEADER_KEY_THREAD_ID } from '../../../server-api/headers'\nimport type { webSearchToolReg } from './common'\n\nexport const nodeWebSearchTool: NonNullable<(typeof webSearchToolReg)['fn']> = (\n\t{ args },\n\t{ threadID },\n) => {\n\treturn promiseFactoryToObservable(async (signal) => {\n\t\ttry {\n\t\t\t// Call the server endpoint using the fetchFromAmpServer helper\n\t\t\tconst url = `/api/web-search?query=${encodeURIComponent(args.query)}&numResults=${args.num_results || 5}`\n\t\t\tconst response = await fetchFromAmpServer(url, {\n\t\t\t\tmethod: 'GET',\n\t\t\t\tsignal,\n\t\t\t\theaders: threadID ? { [HEADER_KEY_THREAD_ID]: threadID } : undefined,\n\t\t\t})\n\n\t\t\tif (!response.ok) {\n\t\t\t\tconst errorText = await response.text()\n\t\t\t\tthrow new Error(`Server returned ${response.status}: ${errorText}`)\n\t\t\t}\n\n\t\t\tconst results = await response.json()\n\t\t\treturn {\n\t\t\t\tstatus: 'done' as const,\n\t\t\t\tresult: results,\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthrow new Error(`Failed to perform web search: ${(error as Error).message}`)\n\t\t}\n\t})\n}\n"],"names":["nodeWebSearchTool","args","threadID","promiseFactoryToObservable","signal","url","response","fetchFromAmpServer","HEADER_KEY_THREAD_ID","errorText","error"],"mappings":";;;AAKO,MAAMA,IAAkE,CAC9E,EAAE,MAAAC,KACF,EAAE,UAAAC,QAEKC,EAA2B,OAAOC,MAAW;AAC/C,MAAA;AAEG,UAAAC,IAAM,yBAAyB,mBAAmBJ,EAAK,KAAK,CAAC,eAAeA,EAAK,eAAe,CAAC,IACjGK,IAAW,MAAMC,EAAmBF,GAAK;AAAA,MAC9C,QAAQ;AAAA,MACR,QAAAD;AAAA,MACA,SAASF,IAAW,EAAE,CAACM,CAAoB,GAAGN,EAAa,IAAA;AAAA,IAAA,CAC3D;AAEG,QAAA,CAACI,EAAS,IAAI;AACX,YAAAG,IAAY,MAAMH,EAAS,KAAK;AACtC,YAAM,IAAI,MAAM,mBAAmBA,EAAS,MAAM,KAAKG,CAAS,EAAE;AAAA,IAAA;AAI5D,WAAA;AAAA,MACN,QAAQ;AAAA,MACR,QAHe,MAAMH,EAAS,KAAK;AAAA,IAIpC;AAAA,WACQI,GAAO;AACf,UAAM,IAAI,MAAM,iCAAkCA,EAAgB,OAAO,EAAE;AAAA,EAAA;AAC5E,CACA;"}
1
+ {"version":3,"file":"node-Coo1Y37e.js","sources":["../../core/src/tools/builtin/web_search/node.ts"],"sourcesContent":["import { promiseFactoryToObservable } from '@sourcegraph/observable'\nimport { fetchFromAmpServer } from '../../../server-api/client'\nimport { HEADER_KEY_THREAD_ID } from '../../../server-api/headers'\nimport type { webSearchToolReg } from './common'\n\nexport const nodeWebSearchTool: NonNullable<(typeof webSearchToolReg)['fn']> = (\n\t{ args },\n\t{ threadID },\n) => {\n\treturn promiseFactoryToObservable(async (signal) => {\n\t\ttry {\n\t\t\t// Call the server endpoint using the fetchFromAmpServer helper\n\t\t\tconst url = `/api/web-search?query=${encodeURIComponent(args.query)}&numResults=${args.num_results || 5}`\n\t\t\tconst response = await fetchFromAmpServer(url, {\n\t\t\t\tmethod: 'GET',\n\t\t\t\tsignal,\n\t\t\t\theaders: threadID ? { [HEADER_KEY_THREAD_ID]: threadID } : undefined,\n\t\t\t})\n\n\t\t\tif (!response.ok) {\n\t\t\t\tconst errorText = await response.text()\n\t\t\t\tthrow new Error(`Server returned ${response.status}: ${errorText}`)\n\t\t\t}\n\n\t\t\tconst results = await response.json()\n\t\t\treturn {\n\t\t\t\tstatus: 'done' as const,\n\t\t\t\tresult: results,\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthrow new Error(`Failed to perform web search: ${(error as Error).message}`)\n\t\t}\n\t})\n}\n"],"names":["nodeWebSearchTool","args","threadID","promiseFactoryToObservable","signal","url","response","fetchFromAmpServer","HEADER_KEY_THREAD_ID","errorText","error"],"mappings":";;;AAKO,MAAMA,IAAkE,CAC9E,EAAE,MAAAC,KACF,EAAE,UAAAC,QAEKC,EAA2B,OAAOC,MAAW;AAC/C,MAAA;AAEG,UAAAC,IAAM,yBAAyB,mBAAmBJ,EAAK,KAAK,CAAC,eAAeA,EAAK,eAAe,CAAC,IACjGK,IAAW,MAAMC,EAAmBF,GAAK;AAAA,MAC9C,QAAQ;AAAA,MACR,QAAAD;AAAA,MACA,SAASF,IAAW,EAAE,CAACM,CAAoB,GAAGN,EAAa,IAAA;AAAA,IAAA,CAC3D;AAEG,QAAA,CAACI,EAAS,IAAI;AACX,YAAAG,IAAY,MAAMH,EAAS,KAAK;AACtC,YAAM,IAAI,MAAM,mBAAmBA,EAAS,MAAM,KAAKG,CAAS,EAAE;AAAA,IAAA;AAI5D,WAAA;AAAA,MACN,QAAQ;AAAA,MACR,QAHe,MAAMH,EAAS,KAAK;AAAA,IAIpC;AAAA,WACQI,GAAO;AACf,UAAM,IAAI,MAAM,iCAAkCA,EAAgB,OAAO,EAAE;AAAA,EAAA;AAC5E,CACA;"}
@@ -4,7 +4,7 @@ import * as i from "node:fs";
4
4
  import * as o from "node:path";
5
5
  import { join as f } from "node:path";
6
6
  import { promisify as p } from "node:util";
7
- import { k as l, aM as n } from "./color-DH4c3nvN.js";
7
+ import { k as l, aP as n } from "./color-BHYGC4Ar.js";
8
8
  import { homedir as w } from "node:os";
9
9
  const d = f(w(), ".amp", "file-changes"), u = p(m);
10
10
  function E(a) {
@@ -110,4 +110,4 @@ export {
110
110
  y as listFilesGit,
111
111
  E as nodeFileSystem
112
112
  };
113
- //# sourceMappingURL=node-BoNPZ-4l.js.map
113
+ //# sourceMappingURL=node-DW21A6nN.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"node-BoNPZ-4l.js","sources":["../../core/src/platform/fs/backups.node.ts","../../core/src/platform/fs/node.ts"],"sourcesContent":["import { homedir } from 'node:os'\nimport { join } from 'node:path'\n\nexport const BACKUP_DIR = join(homedir(), '.amp', 'file-changes')\n","import { execFile } from 'node:child_process'\nimport * as fs from 'node:fs'\nimport * as path from 'node:path'\nimport { promisify } from 'node:util'\nimport logger from '../../common/logger'\nimport { type FileChangeRecord } from '../../threads/file-tracking/common'\nimport type { ThreadID } from '../../threads/thread'\nimport { BACKUP_DIR } from './backups.node'\nimport { FileNotExistError, type FileSystem } from './fs'\n\nconst execFileAsync = promisify(execFile)\n\nexport function nodeFileSystem(threadID: ThreadID): FileSystem {\n\tconst backupDir = path.join(BACKUP_DIR, threadID)\n\treturn {\n\t\trelativePath: (a: string, b: string) => path.relative(a, b),\n\t\tjoinPath: (...paths: string[]) => path.join(...paths),\n\n\t\treadFile: async (path: string, signal?: AbortSignal) => {\n\t\t\ttry {\n\t\t\t\treturn await fs.promises.readFile(path, { encoding: 'utf8', signal })\n\t\t\t} catch (error) {\n\t\t\t\tif (isNodeFSNotExistError(error)) {\n\t\t\t\t\tthrow new FileNotExistError(path)\n\t\t\t\t}\n\t\t\t\tthrow error\n\t\t\t}\n\t\t},\n\t\treadBinaryFile: async (path: string, signal?: AbortSignal) => {\n\t\t\ttry {\n\t\t\t\t// Read as Buffer without encoding\n\t\t\t\treturn await fs.promises.readFile(path, { signal })\n\t\t\t} catch (error) {\n\t\t\t\tif (isNodeFSNotExistError(error)) {\n\t\t\t\t\tthrow new FileNotExistError(path)\n\t\t\t\t}\n\t\t\t\tthrow error\n\t\t\t}\n\t\t},\n\t\tgetMtime: async (path: string, signal?: AbortSignal) => {\n\t\t\ttry {\n\t\t\t\t// Node.js stat doesn't support AbortSignal directly\n\t\t\t\tconst stats = await fs.promises.stat(path)\n\t\t\t\treturn stats.mtimeMs\n\t\t\t} catch (error) {\n\t\t\t\tif (isNodeFSNotExistError(error)) {\n\t\t\t\t\tthrow new FileNotExistError(path)\n\t\t\t\t}\n\t\t\t\tthrow error\n\t\t\t}\n\t\t},\n\t\tstat: async (path: string) => {\n\t\t\ttry {\n\t\t\t\tconst stats = await fs.promises.stat(path)\n\t\t\t\treturn {\n\t\t\t\t\tsize: stats.size,\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (isNodeFSNotExistError(error)) {\n\t\t\t\t\tthrow new FileNotExistError(path)\n\t\t\t\t}\n\t\t\t\tthrow error\n\t\t\t}\n\t\t},\n\t\twriteFile: async (path, content, signal) => {\n\t\t\tawait fs.promises.writeFile(path, content, { encoding: 'utf-8', signal })\n\t\t},\n\t\tdeleteFile: async (path, signal?: AbortSignal) => {\n\t\t\ttry {\n\t\t\t\tawait fs.promises.unlink(path)\n\t\t\t} catch (error) {\n\t\t\t\tif (isNodeFSNotExistError(error)) {\n\t\t\t\t\tthrow new FileNotExistError(path)\n\t\t\t\t}\n\t\t\t\tthrow error\n\t\t\t}\n\t\t},\n\t\tmkdirp: async (path) => {\n\t\t\tawait fs.promises.mkdir(path, { recursive: true })\n\t\t},\n\t\tstoreFileChange: async (backupFileName: string, fileChange: FileChangeRecord) => {\n\t\t\tconst backupPath = path.join(backupDir, backupFileName)\n\t\t\tawait fs.promises.writeFile(backupPath, JSON.stringify(fileChange, null, 2), 'utf8')\n\t\t},\n\t\tlistBackupFiles: async () => {\n\t\t\ttry {\n\t\t\t\t// Ensure backup directory exists\n\t\t\t\tif (\n\t\t\t\t\t!(await fs.promises\n\t\t\t\t\t\t.stat(backupDir)\n\t\t\t\t\t\t.then((s) => s.isDirectory())\n\t\t\t\t\t\t.catch(() => false))\n\t\t\t\t) {\n\t\t\t\t\tawait fs.promises.mkdir(backupDir, { recursive: true })\n\t\t\t\t\treturn []\n\t\t\t\t}\n\t\t\t\treturn await fs.promises.readdir(backupDir)\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error('Error listing backup files:', error)\n\t\t\t\treturn []\n\t\t\t}\n\t\t},\n\t\tloadFileChange: async (backupFileName: string) => {\n\t\t\ttry {\n\t\t\t\tconst backupPath = path.join(backupDir, backupFileName)\n\t\t\t\tconst content = await fs.promises.readFile(backupPath, 'utf8')\n\t\t\t\treturn JSON.parse(content) as FileChangeRecord\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(`Error loading backup file ${backupFileName}:`, error)\n\t\t\t\treturn null\n\t\t\t}\n\t\t},\n\t\tcleanupBackupFiles: async () => {\n\t\t\ttry {\n\t\t\t\tif (\n\t\t\t\t\tawait fs.promises\n\t\t\t\t\t\t.stat(backupDir)\n\t\t\t\t\t\t.then((s) => s.isDirectory())\n\t\t\t\t\t\t.catch(() => false)\n\t\t\t\t) {\n\t\t\t\t\tawait fs.promises.rm(backupDir, { recursive: true, force: true })\n\t\t\t\t\tlogger.debug(`Cleaned up backup directory: ${backupDir}`)\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(`Error cleaning up backup files in ${backupDir}:`, error)\n\t\t\t}\n\t\t},\n\t\tlistFiles: async (dir: string) => listFilesGit(dir),\n\t\texclusiveWriter: false,\n\t}\n}\n\nfunction isNodeFSNotExistError(error: unknown): boolean {\n\treturn (\n\t\terror !== null &&\n\t\ttypeof error === 'object' &&\n\t\t'code' in error &&\n\t\t(error as { code: string }).code === 'ENOENT'\n\t)\n}\n\n/**\n * Lists files in a directory using git ls-files.\n * Exported for reuse by other filesystem implementations.\n */\nexport async function listFilesGit(dir: string): Promise<string[]> {\n\ttry {\n\t\tconst { stdout: trackedFiles } = await execFileAsync('git', ['ls-files'], {\n\t\t\tcwd: dir,\n\t\t})\n\n\t\tconst { stdout: untrackedFiles } = await execFileAsync(\n\t\t\t'git',\n\t\t\t['ls-files', '--others', '--exclude-standard'],\n\t\t\t{\n\t\t\t\tcwd: dir,\n\t\t\t},\n\t\t)\n\n\t\treturn [...trackedFiles.split('\\n'), ...untrackedFiles.split('\\n')].filter(Boolean)\n\t} catch {\n\t\treturn []\n\t}\n}\n"],"names":["BACKUP_DIR","join","homedir","execFileAsync","promisify","execFile","nodeFileSystem","threadID","backupDir","path","a","b","paths","signal","fs","error","isNodeFSNotExistError","FileNotExistError","content","backupFileName","fileChange","backupPath","s","logger","dir","listFilesGit","trackedFiles","untrackedFiles"],"mappings":"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"}
1
+ {"version":3,"file":"node-DW21A6nN.js","sources":["../../core/src/platform/fs/backups.node.ts","../../core/src/platform/fs/node.ts"],"sourcesContent":["import { homedir } from 'node:os'\nimport { join } from 'node:path'\n\nexport const BACKUP_DIR = join(homedir(), '.amp', 'file-changes')\n","import { execFile } from 'node:child_process'\nimport * as fs from 'node:fs'\nimport * as path from 'node:path'\nimport { promisify } from 'node:util'\nimport logger from '../../common/logger'\nimport { type FileChangeRecord } from '../../threads/file-tracking/common'\nimport type { ThreadID } from '../../threads/thread'\nimport { BACKUP_DIR } from './backups.node'\nimport { FileNotExistError, type FileSystem } from './fs'\n\nconst execFileAsync = promisify(execFile)\n\nexport function nodeFileSystem(threadID: ThreadID): FileSystem {\n\tconst backupDir = path.join(BACKUP_DIR, threadID)\n\treturn {\n\t\trelativePath: (a: string, b: string) => path.relative(a, b),\n\t\tjoinPath: (...paths: string[]) => path.join(...paths),\n\n\t\treadFile: async (path: string, signal?: AbortSignal) => {\n\t\t\ttry {\n\t\t\t\treturn await fs.promises.readFile(path, { encoding: 'utf8', signal })\n\t\t\t} catch (error) {\n\t\t\t\tif (isNodeFSNotExistError(error)) {\n\t\t\t\t\tthrow new FileNotExistError(path)\n\t\t\t\t}\n\t\t\t\tthrow error\n\t\t\t}\n\t\t},\n\t\treadBinaryFile: async (path: string, signal?: AbortSignal) => {\n\t\t\ttry {\n\t\t\t\t// Read as Buffer without encoding\n\t\t\t\treturn await fs.promises.readFile(path, { signal })\n\t\t\t} catch (error) {\n\t\t\t\tif (isNodeFSNotExistError(error)) {\n\t\t\t\t\tthrow new FileNotExistError(path)\n\t\t\t\t}\n\t\t\t\tthrow error\n\t\t\t}\n\t\t},\n\t\tgetMtime: async (path: string, signal?: AbortSignal) => {\n\t\t\ttry {\n\t\t\t\t// Node.js stat doesn't support AbortSignal directly\n\t\t\t\tconst stats = await fs.promises.stat(path)\n\t\t\t\treturn stats.mtimeMs\n\t\t\t} catch (error) {\n\t\t\t\tif (isNodeFSNotExistError(error)) {\n\t\t\t\t\tthrow new FileNotExistError(path)\n\t\t\t\t}\n\t\t\t\tthrow error\n\t\t\t}\n\t\t},\n\t\tstat: async (path: string) => {\n\t\t\ttry {\n\t\t\t\tconst stats = await fs.promises.stat(path)\n\t\t\t\treturn {\n\t\t\t\t\tsize: stats.size,\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (isNodeFSNotExistError(error)) {\n\t\t\t\t\tthrow new FileNotExistError(path)\n\t\t\t\t}\n\t\t\t\tthrow error\n\t\t\t}\n\t\t},\n\t\twriteFile: async (path, content, signal) => {\n\t\t\tawait fs.promises.writeFile(path, content, { encoding: 'utf-8', signal })\n\t\t},\n\t\tdeleteFile: async (path, signal?: AbortSignal) => {\n\t\t\ttry {\n\t\t\t\tawait fs.promises.unlink(path)\n\t\t\t} catch (error) {\n\t\t\t\tif (isNodeFSNotExistError(error)) {\n\t\t\t\t\tthrow new FileNotExistError(path)\n\t\t\t\t}\n\t\t\t\tthrow error\n\t\t\t}\n\t\t},\n\t\tmkdirp: async (path) => {\n\t\t\tawait fs.promises.mkdir(path, { recursive: true })\n\t\t},\n\t\tstoreFileChange: async (backupFileName: string, fileChange: FileChangeRecord) => {\n\t\t\tconst backupPath = path.join(backupDir, backupFileName)\n\t\t\tawait fs.promises.writeFile(backupPath, JSON.stringify(fileChange, null, 2), 'utf8')\n\t\t},\n\t\tlistBackupFiles: async () => {\n\t\t\ttry {\n\t\t\t\t// Ensure backup directory exists\n\t\t\t\tif (\n\t\t\t\t\t!(await fs.promises\n\t\t\t\t\t\t.stat(backupDir)\n\t\t\t\t\t\t.then((s) => s.isDirectory())\n\t\t\t\t\t\t.catch(() => false))\n\t\t\t\t) {\n\t\t\t\t\tawait fs.promises.mkdir(backupDir, { recursive: true })\n\t\t\t\t\treturn []\n\t\t\t\t}\n\t\t\t\treturn await fs.promises.readdir(backupDir)\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error('Error listing backup files:', error)\n\t\t\t\treturn []\n\t\t\t}\n\t\t},\n\t\tloadFileChange: async (backupFileName: string) => {\n\t\t\ttry {\n\t\t\t\tconst backupPath = path.join(backupDir, backupFileName)\n\t\t\t\tconst content = await fs.promises.readFile(backupPath, 'utf8')\n\t\t\t\treturn JSON.parse(content) as FileChangeRecord\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(`Error loading backup file ${backupFileName}:`, error)\n\t\t\t\treturn null\n\t\t\t}\n\t\t},\n\t\tcleanupBackupFiles: async () => {\n\t\t\ttry {\n\t\t\t\tif (\n\t\t\t\t\tawait fs.promises\n\t\t\t\t\t\t.stat(backupDir)\n\t\t\t\t\t\t.then((s) => s.isDirectory())\n\t\t\t\t\t\t.catch(() => false)\n\t\t\t\t) {\n\t\t\t\t\tawait fs.promises.rm(backupDir, { recursive: true, force: true })\n\t\t\t\t\tlogger.debug(`Cleaned up backup directory: ${backupDir}`)\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(`Error cleaning up backup files in ${backupDir}:`, error)\n\t\t\t}\n\t\t},\n\t\tlistFiles: async (dir: string) => listFilesGit(dir),\n\t\texclusiveWriter: false,\n\t}\n}\n\nfunction isNodeFSNotExistError(error: unknown): boolean {\n\treturn (\n\t\terror !== null &&\n\t\ttypeof error === 'object' &&\n\t\t'code' in error &&\n\t\t(error as { code: string }).code === 'ENOENT'\n\t)\n}\n\n/**\n * Lists files in a directory using git ls-files.\n * Exported for reuse by other filesystem implementations.\n */\nexport async function listFilesGit(dir: string): Promise<string[]> {\n\ttry {\n\t\tconst { stdout: trackedFiles } = await execFileAsync('git', ['ls-files'], {\n\t\t\tcwd: dir,\n\t\t})\n\n\t\tconst { stdout: untrackedFiles } = await execFileAsync(\n\t\t\t'git',\n\t\t\t['ls-files', '--others', '--exclude-standard'],\n\t\t\t{\n\t\t\t\tcwd: dir,\n\t\t\t},\n\t\t)\n\n\t\treturn [...trackedFiles.split('\\n'), ...untrackedFiles.split('\\n')].filter(Boolean)\n\t} catch {\n\t\treturn []\n\t}\n}\n"],"names":["BACKUP_DIR","join","homedir","execFileAsync","promisify","execFile","nodeFileSystem","threadID","backupDir","path","a","b","paths","signal","fs","error","isNodeFSNotExistError","FileNotExistError","content","backupFileName","fileChange","backupPath","s","logger","dir","listFilesGit","trackedFiles","untrackedFiles"],"mappings":"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"}
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env node
2
- import { Y as j, a3 as I, _ as k, au as L, $ as C, aE as D, f as B, a2 as J, b8 as V, A as W, O as z, W as M, aj as Z, at as q, k as G } from "./color-DH4c3nvN.js";
3
- import { a as x, o as A, s as g, d as H, b as K, l as h, r as _, u as Q, e as X, c as F, p as ee, Z as te, f as se, g as N } from "./main-XzserkUB.js";
2
+ import { Z as Y, a4 as k, $ as I, av as C, a0 as L, aH as D, f as j, a3 as J, bb as V, C as Z, O as z, X as M, ak as W, au as H, k as X } from "./color-BHYGC4Ar.js";
3
+ import { a as x, o as A, s as g, d as q, b as G, l as h, r as _, u as K, e as Q, c as F, p as ee, Z as te, f as se, g as N } from "./main-C22ZCKsZ.js";
4
4
  const S = A({
5
- context: X(["continue", "none"]).optional().default("continue"),
6
- tools: Q([h("all"), x(g())]).optional(),
5
+ context: Q(["continue", "none"]).optional().default("continue"),
6
+ tools: K([h("all"), x(g())]).optional(),
7
7
  prompt: g(),
8
8
  verify: _(F()).optional()
9
9
  }), oe = S.extend({
10
10
  type: h("agent"),
11
11
  model: g().optional(),
12
12
  // Default could be set in implementation
13
- interactive_confirmation: K().optional()
13
+ interactive_confirmation: G().optional()
14
14
  }), re = S.extend({
15
15
  type: h("llm"),
16
16
  model: g().optional()
@@ -29,7 +29,7 @@ const S = A({
29
29
  }), le = A({
30
30
  type: h("bash"),
31
31
  command: g()
32
- }), pe = H("type", [
32
+ }), pe = q("type", [
33
33
  oe,
34
34
  re,
35
35
  ne,
@@ -107,7 +107,7 @@ async function ge(r, e, t, s, o, a) {
107
107
  status: "in-progress",
108
108
  progress: { type: "message", speaker: "user", message: c }
109
109
  });
110
- const u = (await B(l.tools, a)).map((p) => p.spec), T = k;
110
+ const u = (await j(l.tools, a)).map((p) => p.spec), T = I;
111
111
  let f = 0;
112
112
  const d = 100;
113
113
  for (; f < d; ) {
@@ -125,8 +125,8 @@ async function ge(r, e, t, s, o, a) {
125
125
  a.throwIfAborted();
126
126
  let b;
127
127
  try {
128
- const n = I.fromNativeThread(i);
129
- b = await L(
128
+ const n = k.fromNativeThread(i);
129
+ b = await C(
130
130
  n,
131
131
  u,
132
132
  U,
@@ -140,7 +140,7 @@ async function ge(r, e, t, s, o, a) {
140
140
  throw new Error("Unexpected response format from Anthropic");
141
141
  if (b.message.content.length === 0)
142
142
  break;
143
- const v = C(b.message);
143
+ const v = L(b.message);
144
144
  m(v);
145
145
  const E = b.message.content.filter((n) => n.type === "text").map((n) => "text" in n ? n.text : "").join(" ").trim();
146
146
  if (E && s.update({
@@ -148,11 +148,11 @@ async function ge(r, e, t, s, o, a) {
148
148
  progress: { type: "message", speaker: "assistant", message: E }
149
149
  }), v.type !== "assistant:message")
150
150
  break;
151
- const Y = ye(
151
+ const B = ye(
152
152
  i,
153
153
  v.message
154
154
  );
155
- for (const n of Y) {
155
+ for (const n of B) {
156
156
  s.update({
157
157
  status: "in-progress",
158
158
  progress: {
@@ -226,7 +226,7 @@ async function fe(r, e, t, s, o) {
226
226
  status: "in-progress",
227
227
  progress: { type: "message", speaker: "user", message: a }
228
228
  });
229
- const i = I.fromNativeThread(l), m = r.model || k, u = await L(
229
+ const i = k.fromNativeThread(l), m = r.model || I, u = await C(
230
230
  i,
231
231
  [],
232
232
  // No tools for LLM-only step
@@ -237,7 +237,7 @@ async function fe(r, e, t, s, o) {
237
237
  );
238
238
  if (!u.message)
239
239
  throw new Error("Failed to get response from Anthropic");
240
- const T = C(u.message);
240
+ const T = L(u.message);
241
241
  c(T);
242
242
  const f = u.message.content.filter((d) => d.type === "text").map((d) => d.type === "text" ? d.text : "").join(" ").trim();
243
243
  return t.update({
@@ -246,7 +246,7 @@ async function fe(r, e, t, s, o) {
246
246
  }), l;
247
247
  }
248
248
  function ye(r, e) {
249
- const t = W(r);
249
+ const t = Z(r);
250
250
  return e.content.filter((s) => s.type === "tool_use").filter((s) => !s.inputPartialJSON).filter(
251
251
  (s) => (
252
252
  // Only include tools that haven't been invoked yet.
@@ -259,7 +259,7 @@ async function R(r, e, t, s, o = new AbortController().signal, a) {
259
259
  let i = !1;
260
260
  const m = r.invokeTool(e, { args: t, userInput: a }, s).subscribe({
261
261
  next: (u) => {
262
- j(u) && (m.unsubscribe(), i || (i = !0, l(u)));
262
+ Y(u) && (m.unsubscribe(), i || (i = !0, l(u)));
263
263
  },
264
264
  error: (u) => {
265
265
  i || (i = !0, c(u));
@@ -291,7 +291,7 @@ async function he(r, e, t, s) {
291
291
  progress: { type: "meta", message: `Loading routine: ${o} from ${l}` }
292
292
  });
293
293
  const c = D();
294
- c.registerTool(Z);
294
+ c.registerTool(W);
295
295
  const i = await R(
296
296
  c,
297
297
  "read_file",
@@ -311,7 +311,7 @@ async function he(r, e, t, s) {
311
311
  if (!f)
312
312
  throw new Error(`Routine with id "${o}" not found in ${l}`);
313
313
  let d = {
314
- id: q(),
314
+ id: H(),
315
315
  created: Date.now(),
316
316
  v: 0,
317
317
  messages: []
@@ -357,7 +357,7 @@ async function he(r, e, t, s) {
357
357
  type: "meta",
358
358
  message: "Operation cancelled"
359
359
  }
360
- }), t.complete()) : (G.error("Error in run_routine", {
360
+ }), t.complete()) : (X.error("Error in run_routine", {
361
361
  error: o,
362
362
  stack: o instanceof Error ? o.stack : ""
363
363
  }), t.error(o));
@@ -366,4 +366,4 @@ async function he(r, e, t, s) {
366
366
  export {
367
367
  Te as runRoutine
368
368
  };
369
- //# sourceMappingURL=node-CGa3o78d.js.map
369
+ //# sourceMappingURL=node-DX52svHT.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"node-CGa3o78d.js","sources":["../../core/src/tools/builtin/run_routine/types.ts","../../core/src/tools/builtin/run_routine/serialization.ts","../../core/src/tools/builtin/run_routine/util.ts","../../core/src/tools/builtin/run_routine/step.ts","../../core/src/tools/builtin/run_routine/node.ts"],"sourcesContent":["import { z } from 'zod'\n\n// Base Step interface\nconst BaseStep = z.object({\n\tcontext: z.enum(['continue', 'none']).optional().default('continue'),\n\ttools: z.union([z.literal('all'), z.array(z.string())]).optional(),\n\tprompt: z.string(),\n\tverify: z.record(z.any()).optional(),\n}) satisfies z.ZodType<{\n\tcontext?: 'continue' | 'none'\n\ttools?: 'all' | string[]\n\tprompt: string\n\tverify?: Record<string, any>\n}>\n\n// Agent Step\nconst AgentStep = BaseStep.extend({\n\ttype: z.literal('agent'),\n\tmodel: z.string().optional(), // Default could be set in implementation\n\tinteractive_confirmation: z.boolean().optional(),\n})\n\n// LLM Step\nconst LLMStep = BaseStep.extend({\n\ttype: z.literal('llm'),\n\tmodel: z.string().optional(),\n})\n\n// Loop Agent Step\nconst LoopAgentStep = BaseStep.extend({\n\ttype: z.literal('loop_agent'),\n\tmodel: z.string().optional(),\n\tinput_file: z.string(),\n})\n\n// Loop LLM Step\nconst LoopLLMStep = BaseStep.extend({\n\ttype: z.literal('loop_llm'),\n\tmodel: z.string().optional(),\n\tinput_file: z.string(),\n})\n\n// Tool Call Step\nconst ToolCallStep = z.object({\n\ttype: z.literal('tool_call'),\n\ttool: z.string(),\n\tparameters: z.record(z.any()).optional(),\n})\n\n// Bash Step\nconst BashStep = z.object({\n\ttype: z.literal('bash'),\n\tcommand: z.string(),\n})\n\n// Union of all step types\nconst Step = z.discriminatedUnion('type', [\n\tAgentStep,\n\tLLMStep,\n\tLoopAgentStep,\n\tLoopLLMStep,\n\tToolCallStep,\n\tBashStep,\n])\n\n// Routine Block\nconst RoutineBlock = z.object({\n\tid: z.string(),\n\tsteps: z.array(Step),\n})\n\n// Routine (array of RoutineBlocks)\nconst Routine = z.array(RoutineBlock)\n\nconst Routines = z.array(Routine)\n\nexport type RoutineSchema = z.infer<typeof Routine>\nexport type RoutinesSchema = z.infer<typeof Routines>\nexport type RoutineBlockSchema = z.infer<typeof RoutineBlock>\nexport type StepSchema = z.infer<typeof Step>\nexport type AgentStepSchema = z.infer<typeof AgentStep>\nexport type LLMStepSchema = z.infer<typeof LLMStep>\nexport type LoopAgentStepSchema = z.infer<typeof LoopAgentStep>\nexport type LoopLLMStepSchema = z.infer<typeof LoopLLMStep>\nexport type ToolCallStepSchema = z.infer<typeof ToolCallStep>\nexport type BashStepSchema = z.infer<typeof BashStep>\n\nexport { Routine, RoutineBlock, Routines, Step }\n","import { parse } from 'yaml'\nimport { z } from 'zod'\nimport type { RoutineSchema } from './types'\nimport { Routine } from './types'\n\n/**\n * Deserialize a YAML string into a Routine\n * @param yamlString The YAML string representation of a Routine\n * @returns The parsed and validated Routine\n * @throws Error if the YAML is invalid or doesn't match the Routine schema\n */\nexport function deserializeRoutineFromYAML(yamlString: string): RoutineSchema {\n\ttry {\n\t\t// Parse the YAML string to a JavaScript object\n\t\tconst parsedYaml = parse(yamlString)\n\n\t\t// Validate and transform the parsed YAML against the Routine schema\n\t\tconst validatedRoutine = Routine.parse(parsedYaml)\n\n\t\treturn validatedRoutine\n\t} catch (error) {\n\t\tif (error instanceof z.ZodError) {\n\t\t\t// Enhance Zod validation errors with better context\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid routine format: ${error.errors\n\t\t\t\t\t.map((err) => `${err.path.join('.')} - ${err.message}`)\n\t\t\t\t\t.join(', ')}`,\n\t\t\t)\n\t\t} else if (error instanceof Error) {\n\t\t\t// Handle YAML parsing errors\n\t\t\tthrow new Error(`Failed to parse YAML: ${error.message}`)\n\t\t} else {\n\t\t\tthrow new Error(`Unknown error during routine deserialization: ${String(error)}`)\n\t\t}\n\t}\n}\n","import type { SubscriptionObserver } from '@sourcegraph/observable'\nimport type { ToolRun } from '../../tool-service'\nimport type { RunRoutineProgressMessage, RunRoutineToolDef } from './common'\n\n/**\n * Class that maintains state for status messages in run_routine implementation.\n * Keeps track of all status messages and reports them through the observer.\n */\nexport class ProgressReporter {\n\tprivate progressMessages: RunRoutineProgressMessage[] = []\n\n\tconstructor(\n\t\tprivate observer: SubscriptionObserver<ToolRun<RunRoutineToolDef>>,\n\t\tprivate signal: AbortSignal,\n\t) {}\n\n\t/**\n\t * Adds the latest message to the list of all status updates and then invokes the observer\n\t * with the updated 'in-progress' status.\n\t */\n\tupdate(update: ToolRun<RunRoutineToolDef>): void {\n\t\tthis.signal.throwIfAborted()\n\t\tif ('progress' in update && update.progress) {\n\t\t\tif (Array.isArray(update.progress)) {\n\t\t\t\tthis.progressMessages.push(...update.progress)\n\t\t\t} else {\n\t\t\t\tthis.progressMessages.push(update.progress)\n\t\t\t}\n\t\t\tthis.observer.next({\n\t\t\t\t...update,\n\t\t\t\tprogress: this.progressMessages,\n\t\t\t})\n\t\t} else {\n\t\t\tthis.observer.next(update)\n\t\t}\n\t}\n\n\terror(error: unknown): void {\n\t\tthis.observer.error(error)\n\t}\n\n\tcomplete(): void {\n\t\tthis.observer.complete()\n\t}\n}\n\n/**\n * Apply variable substitutions to a prompt string\n */\nexport function substitutePromptVars(prompt: string, vars: { userInput?: string }): string {\n\tlet result = prompt\n\n\t// Replace {{userInput}} with the actual user input if provided\n\tif (vars.userInput) {\n\t\tresult = result.replace(/\\{\\{\\s*userInput\\s*\\}\\}/g, vars.userInput)\n\t\tresult = result.replace(/\\{\\{\\s*user_input\\s*\\}\\}/g, vars.userInput)\n\t}\n\n\treturn result\n}\n","import { firstValueFrom } from '@sourcegraph/observable'\nimport {\n\tACTIVE_MODEL,\n\tAnthropicConverters,\n\tfromAnthropicResultToThreadDelta,\n\trunAnthropicSync,\n} from '../../../inference/backends/anthropic'\nimport { buildSystemPrompt, DefaultSystemPromptService } from '../../../threads/system-prompt'\nimport type { ToolUseBlock } from '../../../threads/thread'\nimport {\n\ttoolResultBlocks,\n\ttype Thread,\n\ttype ThreadAssistantMessage,\n\ttype ToolRunUserInput,\n} from '../../../threads/thread'\nimport type { ThreadDelta } from '../../../threads/thread-delta'\nimport { applyThreadDelta } from '../../../threads/thread-delta'\nimport type {\n\tToolDefinition,\n\tToolRun,\n\tToolRunEnvironment,\n\tToolService,\n} from '../../../tools/tool-service'\nimport { createToolService, isToolRunTerminalState } from '../../../tools/tool-service'\nimport { registerBuiltinToolsToToolService } from '../../tools'\nimport type { AgentStepSchema, LLMStepSchema, StepSchema } from './types'\nimport { substitutePromptVars, type ProgressReporter } from './util'\n\n/**\n * Run a step with the given conversation\n */\nexport function runStep(\n\tstep: StepSchema,\n\tconversation: Thread,\n\tenv: ToolRunEnvironment,\n\tprogressReporter: ProgressReporter,\n\tvars: { userInput?: string },\n\tsignal: AbortSignal = new AbortController().signal,\n): Promise<Thread> {\n\tswitch (step.type) {\n\t\tcase 'agent':\n\t\t\treturn runStepAgent(step, conversation, env, progressReporter, vars, signal)\n\t\t\tbreak\n\t\tcase 'llm':\n\t\t\treturn runStepLLM(step, conversation, progressReporter, vars, signal)\n\t\t\tbreak\n\t\tdefault:\n\t\t\tthrow new Error(`Unknown step type: ${(step as any).type}`)\n\t}\n}\n\n/**\n * Run an agent step that implements a full agentic loop\n * Follows the pattern: inference -> tool calls -> tool results -> inference\n * until there are no more tool calls or the process is complete\n */\nasync function runStepAgent(\n\tstep: AgentStepSchema,\n\torigConversation: Thread,\n\tenv: ToolRunEnvironment,\n\tprogressReporter: ProgressReporter,\n\tvars: { userInput?: string },\n\tsignal: AbortSignal,\n): Promise<Thread> {\n\tconst toolService = createToolService()\n\tawait registerBuiltinToolsToToolService(toolService)\n\n\t// Process prompt template with variables if provided\n\tconst promptText = substitutePromptVars(step.prompt, vars)\n\n\t// Clone convo\n\tlet conversation = origConversation\n\tconst recordThreadDelta = (delta: ThreadDelta) => {\n\t\tconversation = applyThreadDelta(conversation, delta)\n\t}\n\n\trecordThreadDelta({\n\t\ttype: 'user:message',\n\t\tmessage: {\n\t\t\tcontent: [{ type: 'text', text: promptText }],\n\t\t\tmeta: {\n\t\t\t\tsentAt: Date.now(),\n\t\t\t},\n\t\t},\n\t})\n\n\t// Update progress with user message added\n\tprogressReporter.update({\n\t\tstatus: 'in-progress',\n\t\tprogress: { type: 'message', speaker: 'user', message: promptText },\n\t})\n\n\t// Get enabled tools from toolService (all tools for now)\n\tconst enabledToolSpecs = (await firstValueFrom(toolService.tools, signal)).map((t) => t.spec)\n\n\t// Set up parameters for the initial API call\n\tconst model = ACTIVE_MODEL\n\n\t// The agent loop will continue until there are no more tool calls needed\n\tlet loopCount = 0\n\tconst maxLoops = 100 // Prevent infinite loops\n\n\twhile (loopCount < maxLoops) {\n\t\tsignal.throwIfAborted()\n\t\tloopCount++\n\n\t\t// Get system prompt blocks from the main system prompt builder\n\t\tconst systemPromptService = new DefaultSystemPromptService()\n\t\t// Get the main system prompt blocks\n\t\tconst systemPromptBlocks = await buildSystemPrompt(\n\t\t\tsystemPromptService,\n\t\t\tenv.threadEnvironment,\n\t\t\tfalse,\n\t\t)\n\n\t\t// Add the subagent-specific instruction as the final block\n\t\tsystemPromptBlocks.push({\n\t\t\ttype: 'text' as const,\n\t\t\ttext: 'You are a helpful AI assistant running as a subagent within a larger system. Your task is to handle this specific step in a routine. You can use tools to complete your task. When you are completely done, do not ask to use more tools.',\n\t\t})\n\n\t\t// Use the combined system prompt\n\t\tconst systemPrompt = systemPromptBlocks\n\n\t\tsignal.throwIfAborted()\n\n\t\t// Use runAnthropicSync to get a response\n\t\tlet result\n\t\ttry {\n\t\t\tconst anthropicMessages = AnthropicConverters.fromNativeThread(conversation)\n\t\t\tresult = await runAnthropicSync(\n\t\t\t\tanthropicMessages,\n\t\t\t\tenabledToolSpecs,\n\t\t\t\tsystemPrompt,\n\t\t\t\tmodel,\n\t\t\t\tsignal,\n\t\t\t)\n\t\t} catch (error) {\n\t\t\tthrow new Error(`Anthropic API error: ${error}`)\n\t\t}\n\n\t\tif (!result.message || !('content' in result.message)) {\n\t\t\tthrow new Error('Unexpected response format from Anthropic')\n\t\t}\n\t\tif (result.message.content.length === 0) {\n\t\t\tbreak\n\t\t}\n\n\t\tconst assistantResponseDelta = fromAnthropicResultToThreadDelta(result.message)\n\t\trecordThreadDelta(assistantResponseDelta)\n\n\t\t// Extract text for progress reporting\n\t\tconst assistantText = result.message.content\n\t\t\t.filter((item) => item.type === 'text')\n\t\t\t.map((item) => ('text' in item ? item.text : ''))\n\t\t\t.join(' ')\n\t\t\t.trim()\n\t\tif (assistantText) {\n\t\t\t// Show assistant message\n\t\t\tprogressReporter.update({\n\t\t\t\tstatus: 'in-progress',\n\t\t\t\tprogress: { type: 'message', speaker: 'assistant', message: assistantText },\n\t\t\t})\n\t\t}\n\n\t\tif (assistantResponseDelta.type !== 'assistant:message') {\n\t\t\t// No tool calls\n\t\t\tbreak\n\t\t}\n\n\t\tconst toolCalls = findToolUsesNeedingInvocation(\n\t\t\tconversation,\n\t\t\tassistantResponseDelta.message,\n\t\t)\n\t\tfor (const toolCall of toolCalls) {\n\t\t\tprogressReporter.update({\n\t\t\t\tstatus: 'in-progress',\n\t\t\t\tprogress: {\n\t\t\t\t\tid: toolCall.id,\n\t\t\t\t\ttype: 'toolCall',\n\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\targs: JSON.stringify(toolCall.input),\n\t\t\t\t},\n\t\t\t})\n\n\t\t\tlet toolResult\n\t\t\ttry {\n\t\t\t\ttoolResult = await invokeToolAndWaitForResult(\n\t\t\t\t\ttoolService,\n\t\t\t\t\ttoolCall.name,\n\t\t\t\t\ttoolCall.input,\n\t\t\t\t\tenv,\n\t\t\t\t\tsignal,\n\t\t\t\t)\n\t\t\t\tsignal.throwIfAborted()\n\t\t\t\tif (toolResult.status !== 'done') {\n\t\t\t\t\tthrow new Error(JSON.stringify(toolResult))\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\trecordThreadDelta({\n\t\t\t\t\ttype: 'tool:data',\n\t\t\t\t\ttoolUse: toolCall.id,\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tstatus: 'error',\n\t\t\t\t\t\terror: { message: `Tool call error: ${error}` },\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\tprogressReporter.update({\n\t\t\t\t\tstatus: 'in-progress',\n\t\t\t\t\tprogress: {\n\t\t\t\t\t\tid: toolCall.id,\n\t\t\t\t\t\ttype: 'toolResult',\n\t\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\t\tresult: `Tool call error: ${error}`,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\trecordThreadDelta({\n\t\t\t\ttype: 'tool:data',\n\t\t\t\ttoolUse: toolCall.id,\n\t\t\t\tdata: toolResult,\n\t\t\t})\n\t\t\tprogressReporter.update({\n\t\t\t\tstatus: 'in-progress',\n\t\t\t\tprogress: {\n\t\t\t\t\tid: toolCall.id,\n\t\t\t\t\ttype: 'toolResult',\n\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\tresult:\n\t\t\t\t\t\ttypeof toolResult.result === 'string'\n\t\t\t\t\t\t\t? toolResult.result\n\t\t\t\t\t\t\t: JSON.stringify(toolResult.result),\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t}\n\treturn conversation\n}\n\n/**\n * Mock implementation of tool execution for the subagent\n * In a real implementation, this would connect to the actual tool execution system\n */\n// Removed mock implementation in favor of actual toolService\n\n/**\n * Run an LLM step\n */\nasync function runStepLLM(\n\tstep: LLMStepSchema,\n\torigConversation: Thread,\n\tprogressReporter: ProgressReporter,\n\tvars: { userInput?: string },\n\tsignal: AbortSignal,\n): Promise<Thread> {\n\t// Process prompt template with variables if provided\n\tconst promptText = substitutePromptVars(step.prompt, vars)\n\n\t// Create a copy of the conversation to avoid mutating the original\n\tlet conversation = origConversation\n\tconst recordThreadDelta = (delta: ThreadDelta) => {\n\t\tconversation = applyThreadDelta(conversation, delta)\n\t}\n\n\trecordThreadDelta({\n\t\ttype: 'user:message',\n\t\tmessage: {\n\t\t\tcontent: [{ type: 'text', text: promptText }],\n\t\t\tmeta: {\n\t\t\t\tsentAt: Date.now(),\n\t\t\t},\n\t\t},\n\t})\n\n\t// Update progress with user message added\n\tprogressReporter.update({\n\t\tstatus: 'in-progress',\n\t\tprogress: { type: 'message', speaker: 'user', message: promptText },\n\t})\n\n\t// Use runAnthropicSync to get a response\n\tconst anthropicMessages = AnthropicConverters.fromNativeThread(conversation)\n\tconst model = step.model || ACTIVE_MODEL\n\tconst result = await runAnthropicSync(\n\t\tanthropicMessages,\n\t\t[], // No tools for LLM-only step\n\t\t[], // No system prompt\n\t\tmodel,\n\t\tsignal,\n\t)\n\n\tif (!result.message) {\n\t\tthrow new Error('Failed to get response from Anthropic')\n\t}\n\n\tconst assistantResponseDelta = fromAnthropicResultToThreadDelta(result.message)\n\trecordThreadDelta(assistantResponseDelta)\n\n\t// Display message\n\tconst assistantText = result.message.content\n\t\t.filter((item) => item.type === 'text')\n\t\t.map((item) => (item.type === 'text' ? item.text : ''))\n\t\t.join(' ')\n\t\t.trim()\n\tprogressReporter.update({\n\t\tstatus: 'in-progress',\n\t\tprogress: { type: 'message', speaker: 'assistant', message: assistantText },\n\t})\n\treturn conversation\n}\n\nfunction findToolUsesNeedingInvocation(\n\tthread: Thread,\n\tmessage: ThreadAssistantMessage,\n): ToolUseBlock[] {\n\tconst toolResults = toolResultBlocks(thread)\n\treturn message.content\n\t\t.filter((block): block is ToolUseBlock => block.type === 'tool_use')\n\t\t.filter((block) => !block.inputPartialJSON)\n\t\t.filter(\n\t\t\t(block) =>\n\t\t\t\t// Only include tools that haven't been invoked yet.\n\t\t\t\t!toolResults.has(block.id),\n\t\t)\n}\n\n/**\n * Helper function that invokes a tool and returns a Promise with the final result\n */\nexport async function invokeToolAndWaitForResult<T extends ToolDefinition>(\n\ttoolService: ToolService,\n\ttoolName: string,\n\tinput: unknown,\n\tenv: ToolRunEnvironment,\n\tsignal: AbortSignal = new AbortController().signal,\n\tuserInput?: ToolRunUserInput,\n): Promise<ToolRun<T>> {\n\treturn new Promise((resolve, reject) => {\n\t\tlet settled = false\n\t\tconst sub = toolService\n\t\t\t.invokeTool(toolName, { args: input as any, userInput }, env)\n\t\t\t.subscribe({\n\t\t\t\tnext: (run: ToolRun) => {\n\t\t\t\t\tif (isToolRunTerminalState(run)) {\n\t\t\t\t\t\tsub.unsubscribe()\n\t\t\t\t\t\tif (!settled) {\n\t\t\t\t\t\t\tsettled = true\n\t\t\t\t\t\t\tresolve(run)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\terror: (error) => {\n\t\t\t\t\tif (!settled) {\n\t\t\t\t\t\tsettled = true\n\t\t\t\t\t\treject(error)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tcomplete: () => {},\n\t\t\t})\n\n\t\t// Handle abort signal\n\t\tsignal.addEventListener('abort', () => {\n\t\t\tsub.unsubscribe()\n\t\t\tif (!settled) {\n\t\t\t\tsettled = true\n\t\t\t\treject(new Error('Tool execution was aborted'))\n\t\t\t}\n\t\t})\n\t})\n}\n","import { Observable } from '@sourcegraph/observable'\nimport { isAbortError } from '../../../common/abort'\nimport logger from '../../../common/logger'\nimport type { Thread } from '../../../threads/thread'\nimport { newThreadID } from '../../../threads/thread'\nimport type { ToolRunEnvironment } from '../../tool-service'\nimport { createToolService } from '../../tool-service'\nimport type { ReadFileToolDef } from '../filesystem/read_file.common'\nimport { readFileToolReg } from '../filesystem/read_file.common'\nimport type { runRoutineToolReg } from './common'\nimport { deserializeRoutineFromYAML } from './serialization'\nimport { invokeToolAndWaitForResult, runStep } from './step'\nimport { ProgressReporter } from './util'\n\nexport const runRoutine: NonNullable<(typeof runRoutineToolReg)['fn']> = ({ args }, env) => {\n\treturn new Observable((observer) => {\n\t\tconst abortController = new AbortController()\n\t\tconst progressReporter = new ProgressReporter(observer, abortController.signal)\n\n\t\trunRoutineImpl(args, env, progressReporter, abortController.signal).catch((error) => {\n\t\t\t// Don't report AbortError as an error - it's expected when cancelling\n\t\t\tif (!isAbortError(error)) {\n\t\t\t\tprogressReporter.error(error)\n\t\t\t} else {\n\t\t\t\tprogressReporter.update({\n\t\t\t\t\tstatus: 'cancelled' as const,\n\t\t\t\t\tprogress: { type: 'meta', message: 'Operation cancelled' },\n\t\t\t\t})\n\t\t\t\tprogressReporter.complete()\n\t\t\t}\n\t\t})\n\n\t\treturn () => {\n\t\t\tabortController.abort()\n\t\t}\n\t})\n}\n\nasync function runRoutineImpl(\n\targs: { id: string; file?: string; userInput?: string },\n\tenv: ToolRunEnvironment,\n\tprogressReporter: ProgressReporter,\n\tsignal: AbortSignal,\n) {\n\ttry {\n\t\tconst { id, file } = args\n\t\tconst routineFile = file || 'routines.amp.yaml'\n\n\t\t// Report initial progress\n\t\tprogressReporter.update({\n\t\t\tstatus: 'in-progress',\n\t\t\tprogress: { type: 'meta', message: `Loading routine: ${id} from ${routineFile}` },\n\t\t})\n\n\t\t// Create a tool service and register the read_file tool\n\t\tconst toolService = createToolService()\n\t\ttoolService.registerTool(readFileToolReg)\n\n\t\t// Read the routine file using the tool service\n\t\tconst readFileResult = await invokeToolAndWaitForResult<ReadFileToolDef>(\n\t\t\ttoolService,\n\t\t\t'read_file',\n\t\t\t{ path: routineFile },\n\t\t\tenv,\n\t\t\tsignal,\n\t\t)\n\n\t\t// Process the file content by removing line numbers that read_file adds\n\t\tif (readFileResult.status !== 'done') {\n\t\t\tthrow new Error(`Failed to read routine file: ${routineFile}`)\n\t\t}\n\t\t// At this point TypeScript knows readFileResult has a 'result' property\n\t\tconst fileContents =\n\t\t\ttypeof readFileResult.result === 'string'\n\t\t\t\t? readFileResult.result\n\t\t\t\t: readFileResult.result.content\n\t\tconst routineContent = String(fileContents)\n\t\t\t.split('\\n')\n\t\t\t.map((line: string) => line.replace(/^\\d+:\\s/, ''))\n\t\t\t.join('\\n')\n\n\t\tsignal.throwIfAborted()\n\n\t\t// Parse the routines\n\t\tconst routines = deserializeRoutineFromYAML(routineContent)\n\t\tsignal.throwIfAborted()\n\n\t\t// Find the requested routine\n\t\tconst routine = routines.find((routine) => routine.id === id)\n\t\tif (!routine) {\n\t\t\tthrow new Error(`Routine with id \"${id}\" not found in ${routineFile}`)\n\t\t}\n\n\t\t// Initialize a Thread for the conversation\n\t\tlet conversation: Thread = {\n\t\t\tid: newThreadID(),\n\t\t\tcreated: Date.now(),\n\t\t\tv: 0,\n\t\t\tmessages: [],\n\t\t}\n\n\t\t// Report progress before executing steps\n\t\tprogressReporter.update({\n\t\t\tstatus: 'in-progress',\n\t\t\tprogress: [\n\t\t\t\t{\n\t\t\t\t\ttype: 'meta',\n\t\t\t\t\tmessage: `Executing routine ${id}`,\n\t\t\t\t},\n\t\t\t],\n\t\t})\n\n\t\t// Execute each step in the routine\n\t\tfor (let i = 0; i < routine.steps.length; i++) {\n\t\t\tconst step = routine.steps[i]\n\t\t\tif (!step) continue // Skip undefined steps\n\n\t\t\tprogressReporter.update({\n\t\t\t\tstatus: 'in-progress',\n\t\t\t\tprogress: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: 'meta',\n\t\t\t\t\t\tmessage: `Executing step ${i + 1}/${routine.steps.length}: ${step.type}`,\n\t\t\t\t\t\tvariant: 'header',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t})\n\n\t\t\tsignal.throwIfAborted()\n\n\t\t\t// Execute the step and update the conversation\n\t\t\tconversation = await runStep(step, conversation, env, progressReporter, {\n\t\t\t\tuserInput: args.userInput,\n\t\t\t})\n\t\t}\n\n\t\tprogressReporter.update({\n\t\t\tstatus: 'done' as const,\n\t\t\tprogress: {\n\t\t\t\ttype: 'meta',\n\t\t\t\tmessage: `Finished executing all ${routine.steps.length} steps of routine: ${id}.`,\n\t\t\t\tvariant: 'header',\n\t\t\t},\n\t\t\tresult: '', // No output for now\n\t\t})\n\n\t\tprogressReporter.complete()\n\t} catch (error) {\n\t\tif (isAbortError(error)) {\n\t\t\tprogressReporter.update({\n\t\t\t\tstatus: 'cancelled' as const,\n\t\t\t\tprogress: {\n\t\t\t\t\ttype: 'meta',\n\t\t\t\t\tmessage: 'Operation cancelled',\n\t\t\t\t},\n\t\t\t})\n\t\t\tprogressReporter.complete()\n\t\t} else {\n\t\t\tlogger.error('Error in run_routine', {\n\t\t\t\terror,\n\t\t\t\tstack: error instanceof Error ? error.stack : '',\n\t\t\t})\n\t\t\tprogressReporter.error(error)\n\t\t}\n\t}\n}\n"],"names":["BaseStep","z.object","z.enum","z.union","z.literal","z.array","z.string","z.record","z.any","AgentStep","z.boolean","LLMStep","LoopAgentStep","LoopLLMStep","ToolCallStep","BashStep","Step","z.discriminatedUnion","RoutineBlock","Routine","deserializeRoutineFromYAML","yamlString","parsedYaml","parse","error","z.ZodError","err","ProgressReporter","observer","signal","update","substitutePromptVars","prompt","vars","result","runStep","step","conversation","env","progressReporter","runStepAgent","runStepLLM","origConversation","toolService","createToolService","registerBuiltinToolsToToolService","promptText","recordThreadDelta","delta","applyThreadDelta","enabledToolSpecs","firstValueFrom","t","model","ACTIVE_MODEL","loopCount","maxLoops","systemPromptService","DefaultSystemPromptService","systemPromptBlocks","buildSystemPrompt","systemPrompt","anthropicMessages","AnthropicConverters","runAnthropicSync","assistantResponseDelta","fromAnthropicResultToThreadDelta","assistantText","item","toolCalls","findToolUsesNeedingInvocation","toolCall","toolResult","invokeToolAndWaitForResult","thread","message","toolResults","toolResultBlocks","block","toolName","input","userInput","resolve","reject","settled","sub","run","isToolRunTerminalState","runRoutine","args","Observable","abortController","runRoutineImpl","isAbortError","id","file","routineFile","readFileToolReg","readFileResult","fileContents","routineContent","line","routines","routine","newThreadID","i","logger"],"mappings":"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"}
1
+ {"version":3,"file":"node-DX52svHT.js","sources":["../../core/src/tools/builtin/run_routine/types.ts","../../core/src/tools/builtin/run_routine/serialization.ts","../../core/src/tools/builtin/run_routine/util.ts","../../core/src/tools/builtin/run_routine/step.ts","../../core/src/tools/builtin/run_routine/node.ts"],"sourcesContent":["import { z } from 'zod'\n\n// Base Step interface\nconst BaseStep = z.object({\n\tcontext: z.enum(['continue', 'none']).optional().default('continue'),\n\ttools: z.union([z.literal('all'), z.array(z.string())]).optional(),\n\tprompt: z.string(),\n\tverify: z.record(z.any()).optional(),\n}) satisfies z.ZodType<{\n\tcontext?: 'continue' | 'none'\n\ttools?: 'all' | string[]\n\tprompt: string\n\tverify?: Record<string, any>\n}>\n\n// Agent Step\nconst AgentStep = BaseStep.extend({\n\ttype: z.literal('agent'),\n\tmodel: z.string().optional(), // Default could be set in implementation\n\tinteractive_confirmation: z.boolean().optional(),\n})\n\n// LLM Step\nconst LLMStep = BaseStep.extend({\n\ttype: z.literal('llm'),\n\tmodel: z.string().optional(),\n})\n\n// Loop Agent Step\nconst LoopAgentStep = BaseStep.extend({\n\ttype: z.literal('loop_agent'),\n\tmodel: z.string().optional(),\n\tinput_file: z.string(),\n})\n\n// Loop LLM Step\nconst LoopLLMStep = BaseStep.extend({\n\ttype: z.literal('loop_llm'),\n\tmodel: z.string().optional(),\n\tinput_file: z.string(),\n})\n\n// Tool Call Step\nconst ToolCallStep = z.object({\n\ttype: z.literal('tool_call'),\n\ttool: z.string(),\n\tparameters: z.record(z.any()).optional(),\n})\n\n// Bash Step\nconst BashStep = z.object({\n\ttype: z.literal('bash'),\n\tcommand: z.string(),\n})\n\n// Union of all step types\nconst Step = z.discriminatedUnion('type', [\n\tAgentStep,\n\tLLMStep,\n\tLoopAgentStep,\n\tLoopLLMStep,\n\tToolCallStep,\n\tBashStep,\n])\n\n// Routine Block\nconst RoutineBlock = z.object({\n\tid: z.string(),\n\tsteps: z.array(Step),\n})\n\n// Routine (array of RoutineBlocks)\nconst Routine = z.array(RoutineBlock)\n\nconst Routines = z.array(Routine)\n\nexport type RoutineSchema = z.infer<typeof Routine>\nexport type RoutinesSchema = z.infer<typeof Routines>\nexport type RoutineBlockSchema = z.infer<typeof RoutineBlock>\nexport type StepSchema = z.infer<typeof Step>\nexport type AgentStepSchema = z.infer<typeof AgentStep>\nexport type LLMStepSchema = z.infer<typeof LLMStep>\nexport type LoopAgentStepSchema = z.infer<typeof LoopAgentStep>\nexport type LoopLLMStepSchema = z.infer<typeof LoopLLMStep>\nexport type ToolCallStepSchema = z.infer<typeof ToolCallStep>\nexport type BashStepSchema = z.infer<typeof BashStep>\n\nexport { Routine, RoutineBlock, Routines, Step }\n","import { parse } from 'yaml'\nimport { z } from 'zod'\nimport type { RoutineSchema } from './types'\nimport { Routine } from './types'\n\n/**\n * Deserialize a YAML string into a Routine\n * @param yamlString The YAML string representation of a Routine\n * @returns The parsed and validated Routine\n * @throws Error if the YAML is invalid or doesn't match the Routine schema\n */\nexport function deserializeRoutineFromYAML(yamlString: string): RoutineSchema {\n\ttry {\n\t\t// Parse the YAML string to a JavaScript object\n\t\tconst parsedYaml = parse(yamlString)\n\n\t\t// Validate and transform the parsed YAML against the Routine schema\n\t\tconst validatedRoutine = Routine.parse(parsedYaml)\n\n\t\treturn validatedRoutine\n\t} catch (error) {\n\t\tif (error instanceof z.ZodError) {\n\t\t\t// Enhance Zod validation errors with better context\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid routine format: ${error.errors\n\t\t\t\t\t.map((err) => `${err.path.join('.')} - ${err.message}`)\n\t\t\t\t\t.join(', ')}`,\n\t\t\t)\n\t\t} else if (error instanceof Error) {\n\t\t\t// Handle YAML parsing errors\n\t\t\tthrow new Error(`Failed to parse YAML: ${error.message}`)\n\t\t} else {\n\t\t\tthrow new Error(`Unknown error during routine deserialization: ${String(error)}`)\n\t\t}\n\t}\n}\n","import type { SubscriptionObserver } from '@sourcegraph/observable'\nimport type { ToolRun } from '../../tool-service'\nimport type { RunRoutineProgressMessage, RunRoutineToolDef } from './common'\n\n/**\n * Class that maintains state for status messages in run_routine implementation.\n * Keeps track of all status messages and reports them through the observer.\n */\nexport class ProgressReporter {\n\tprivate progressMessages: RunRoutineProgressMessage[] = []\n\n\tconstructor(\n\t\tprivate observer: SubscriptionObserver<ToolRun<RunRoutineToolDef>>,\n\t\tprivate signal: AbortSignal,\n\t) {}\n\n\t/**\n\t * Adds the latest message to the list of all status updates and then invokes the observer\n\t * with the updated 'in-progress' status.\n\t */\n\tupdate(update: ToolRun<RunRoutineToolDef>): void {\n\t\tthis.signal.throwIfAborted()\n\t\tif ('progress' in update && update.progress) {\n\t\t\tif (Array.isArray(update.progress)) {\n\t\t\t\tthis.progressMessages.push(...update.progress)\n\t\t\t} else {\n\t\t\t\tthis.progressMessages.push(update.progress)\n\t\t\t}\n\t\t\tthis.observer.next({\n\t\t\t\t...update,\n\t\t\t\tprogress: this.progressMessages,\n\t\t\t})\n\t\t} else {\n\t\t\tthis.observer.next(update)\n\t\t}\n\t}\n\n\terror(error: unknown): void {\n\t\tthis.observer.error(error)\n\t}\n\n\tcomplete(): void {\n\t\tthis.observer.complete()\n\t}\n}\n\n/**\n * Apply variable substitutions to a prompt string\n */\nexport function substitutePromptVars(prompt: string, vars: { userInput?: string }): string {\n\tlet result = prompt\n\n\t// Replace {{userInput}} with the actual user input if provided\n\tif (vars.userInput) {\n\t\tresult = result.replace(/\\{\\{\\s*userInput\\s*\\}\\}/g, vars.userInput)\n\t\tresult = result.replace(/\\{\\{\\s*user_input\\s*\\}\\}/g, vars.userInput)\n\t}\n\n\treturn result\n}\n","import { firstValueFrom } from '@sourcegraph/observable'\nimport {\n\tACTIVE_MODEL,\n\tAnthropicConverters,\n\tfromAnthropicResultToThreadDelta,\n\trunAnthropicSync,\n} from '../../../inference/backends/anthropic'\nimport { buildSystemPrompt, DefaultSystemPromptService } from '../../../threads/system-prompt'\nimport type { ToolUseBlock } from '../../../threads/thread'\nimport {\n\ttoolResultBlocks,\n\ttype Thread,\n\ttype ThreadAssistantMessage,\n\ttype ToolRunUserInput,\n} from '../../../threads/thread'\nimport type { ThreadDelta } from '../../../threads/thread-delta'\nimport { applyThreadDelta } from '../../../threads/thread-delta'\nimport type {\n\tToolDefinition,\n\tToolRun,\n\tToolRunEnvironment,\n\tToolService,\n} from '../../../tools/tool-service'\nimport { createToolService, isToolRunTerminalState } from '../../../tools/tool-service'\nimport { registerBuiltinToolsToToolService } from '../../tools'\nimport type { AgentStepSchema, LLMStepSchema, StepSchema } from './types'\nimport { substitutePromptVars, type ProgressReporter } from './util'\n\n/**\n * Run a step with the given conversation\n */\nexport function runStep(\n\tstep: StepSchema,\n\tconversation: Thread,\n\tenv: ToolRunEnvironment,\n\tprogressReporter: ProgressReporter,\n\tvars: { userInput?: string },\n\tsignal: AbortSignal = new AbortController().signal,\n): Promise<Thread> {\n\tswitch (step.type) {\n\t\tcase 'agent':\n\t\t\treturn runStepAgent(step, conversation, env, progressReporter, vars, signal)\n\t\t\tbreak\n\t\tcase 'llm':\n\t\t\treturn runStepLLM(step, conversation, progressReporter, vars, signal)\n\t\t\tbreak\n\t\tdefault:\n\t\t\tthrow new Error(`Unknown step type: ${(step as any).type}`)\n\t}\n}\n\n/**\n * Run an agent step that implements a full agentic loop\n * Follows the pattern: inference -> tool calls -> tool results -> inference\n * until there are no more tool calls or the process is complete\n */\nasync function runStepAgent(\n\tstep: AgentStepSchema,\n\torigConversation: Thread,\n\tenv: ToolRunEnvironment,\n\tprogressReporter: ProgressReporter,\n\tvars: { userInput?: string },\n\tsignal: AbortSignal,\n): Promise<Thread> {\n\tconst toolService = createToolService()\n\tawait registerBuiltinToolsToToolService(toolService)\n\n\t// Process prompt template with variables if provided\n\tconst promptText = substitutePromptVars(step.prompt, vars)\n\n\t// Clone convo\n\tlet conversation = origConversation\n\tconst recordThreadDelta = (delta: ThreadDelta) => {\n\t\tconversation = applyThreadDelta(conversation, delta)\n\t}\n\n\trecordThreadDelta({\n\t\ttype: 'user:message',\n\t\tmessage: {\n\t\t\tcontent: [{ type: 'text', text: promptText }],\n\t\t\tmeta: {\n\t\t\t\tsentAt: Date.now(),\n\t\t\t},\n\t\t},\n\t})\n\n\t// Update progress with user message added\n\tprogressReporter.update({\n\t\tstatus: 'in-progress',\n\t\tprogress: { type: 'message', speaker: 'user', message: promptText },\n\t})\n\n\t// Get enabled tools from toolService (all tools for now)\n\tconst enabledToolSpecs = (await firstValueFrom(toolService.tools, signal)).map((t) => t.spec)\n\n\t// Set up parameters for the initial API call\n\tconst model = ACTIVE_MODEL\n\n\t// The agent loop will continue until there are no more tool calls needed\n\tlet loopCount = 0\n\tconst maxLoops = 100 // Prevent infinite loops\n\n\twhile (loopCount < maxLoops) {\n\t\tsignal.throwIfAborted()\n\t\tloopCount++\n\n\t\t// Get system prompt blocks from the main system prompt builder\n\t\tconst systemPromptService = new DefaultSystemPromptService()\n\t\t// Get the main system prompt blocks\n\t\tconst systemPromptBlocks = await buildSystemPrompt(\n\t\t\tsystemPromptService,\n\t\t\tenv.threadEnvironment,\n\t\t\tfalse,\n\t\t)\n\n\t\t// Add the subagent-specific instruction as the final block\n\t\tsystemPromptBlocks.push({\n\t\t\ttype: 'text' as const,\n\t\t\ttext: 'You are a helpful AI assistant running as a subagent within a larger system. Your task is to handle this specific step in a routine. You can use tools to complete your task. When you are completely done, do not ask to use more tools.',\n\t\t})\n\n\t\t// Use the combined system prompt\n\t\tconst systemPrompt = systemPromptBlocks\n\n\t\tsignal.throwIfAborted()\n\n\t\t// Use runAnthropicSync to get a response\n\t\tlet result\n\t\ttry {\n\t\t\tconst anthropicMessages = AnthropicConverters.fromNativeThread(conversation)\n\t\t\tresult = await runAnthropicSync(\n\t\t\t\tanthropicMessages,\n\t\t\t\tenabledToolSpecs,\n\t\t\t\tsystemPrompt,\n\t\t\t\tmodel,\n\t\t\t\tsignal,\n\t\t\t)\n\t\t} catch (error) {\n\t\t\tthrow new Error(`Anthropic API error: ${error}`)\n\t\t}\n\n\t\tif (!result.message || !('content' in result.message)) {\n\t\t\tthrow new Error('Unexpected response format from Anthropic')\n\t\t}\n\t\tif (result.message.content.length === 0) {\n\t\t\tbreak\n\t\t}\n\n\t\tconst assistantResponseDelta = fromAnthropicResultToThreadDelta(result.message)\n\t\trecordThreadDelta(assistantResponseDelta)\n\n\t\t// Extract text for progress reporting\n\t\tconst assistantText = result.message.content\n\t\t\t.filter((item) => item.type === 'text')\n\t\t\t.map((item) => ('text' in item ? item.text : ''))\n\t\t\t.join(' ')\n\t\t\t.trim()\n\t\tif (assistantText) {\n\t\t\t// Show assistant message\n\t\t\tprogressReporter.update({\n\t\t\t\tstatus: 'in-progress',\n\t\t\t\tprogress: { type: 'message', speaker: 'assistant', message: assistantText },\n\t\t\t})\n\t\t}\n\n\t\tif (assistantResponseDelta.type !== 'assistant:message') {\n\t\t\t// No tool calls\n\t\t\tbreak\n\t\t}\n\n\t\tconst toolCalls = findToolUsesNeedingInvocation(\n\t\t\tconversation,\n\t\t\tassistantResponseDelta.message,\n\t\t)\n\t\tfor (const toolCall of toolCalls) {\n\t\t\tprogressReporter.update({\n\t\t\t\tstatus: 'in-progress',\n\t\t\t\tprogress: {\n\t\t\t\t\tid: toolCall.id,\n\t\t\t\t\ttype: 'toolCall',\n\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\targs: JSON.stringify(toolCall.input),\n\t\t\t\t},\n\t\t\t})\n\n\t\t\tlet toolResult\n\t\t\ttry {\n\t\t\t\ttoolResult = await invokeToolAndWaitForResult(\n\t\t\t\t\ttoolService,\n\t\t\t\t\ttoolCall.name,\n\t\t\t\t\ttoolCall.input,\n\t\t\t\t\tenv,\n\t\t\t\t\tsignal,\n\t\t\t\t)\n\t\t\t\tsignal.throwIfAborted()\n\t\t\t\tif (toolResult.status !== 'done') {\n\t\t\t\t\tthrow new Error(JSON.stringify(toolResult))\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\trecordThreadDelta({\n\t\t\t\t\ttype: 'tool:data',\n\t\t\t\t\ttoolUse: toolCall.id,\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tstatus: 'error',\n\t\t\t\t\t\terror: { message: `Tool call error: ${error}` },\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\tprogressReporter.update({\n\t\t\t\t\tstatus: 'in-progress',\n\t\t\t\t\tprogress: {\n\t\t\t\t\t\tid: toolCall.id,\n\t\t\t\t\t\ttype: 'toolResult',\n\t\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\t\tresult: `Tool call error: ${error}`,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\trecordThreadDelta({\n\t\t\t\ttype: 'tool:data',\n\t\t\t\ttoolUse: toolCall.id,\n\t\t\t\tdata: toolResult,\n\t\t\t})\n\t\t\tprogressReporter.update({\n\t\t\t\tstatus: 'in-progress',\n\t\t\t\tprogress: {\n\t\t\t\t\tid: toolCall.id,\n\t\t\t\t\ttype: 'toolResult',\n\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\tresult:\n\t\t\t\t\t\ttypeof toolResult.result === 'string'\n\t\t\t\t\t\t\t? toolResult.result\n\t\t\t\t\t\t\t: JSON.stringify(toolResult.result),\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t}\n\treturn conversation\n}\n\n/**\n * Mock implementation of tool execution for the subagent\n * In a real implementation, this would connect to the actual tool execution system\n */\n// Removed mock implementation in favor of actual toolService\n\n/**\n * Run an LLM step\n */\nasync function runStepLLM(\n\tstep: LLMStepSchema,\n\torigConversation: Thread,\n\tprogressReporter: ProgressReporter,\n\tvars: { userInput?: string },\n\tsignal: AbortSignal,\n): Promise<Thread> {\n\t// Process prompt template with variables if provided\n\tconst promptText = substitutePromptVars(step.prompt, vars)\n\n\t// Create a copy of the conversation to avoid mutating the original\n\tlet conversation = origConversation\n\tconst recordThreadDelta = (delta: ThreadDelta) => {\n\t\tconversation = applyThreadDelta(conversation, delta)\n\t}\n\n\trecordThreadDelta({\n\t\ttype: 'user:message',\n\t\tmessage: {\n\t\t\tcontent: [{ type: 'text', text: promptText }],\n\t\t\tmeta: {\n\t\t\t\tsentAt: Date.now(),\n\t\t\t},\n\t\t},\n\t})\n\n\t// Update progress with user message added\n\tprogressReporter.update({\n\t\tstatus: 'in-progress',\n\t\tprogress: { type: 'message', speaker: 'user', message: promptText },\n\t})\n\n\t// Use runAnthropicSync to get a response\n\tconst anthropicMessages = AnthropicConverters.fromNativeThread(conversation)\n\tconst model = step.model || ACTIVE_MODEL\n\tconst result = await runAnthropicSync(\n\t\tanthropicMessages,\n\t\t[], // No tools for LLM-only step\n\t\t[], // No system prompt\n\t\tmodel,\n\t\tsignal,\n\t)\n\n\tif (!result.message) {\n\t\tthrow new Error('Failed to get response from Anthropic')\n\t}\n\n\tconst assistantResponseDelta = fromAnthropicResultToThreadDelta(result.message)\n\trecordThreadDelta(assistantResponseDelta)\n\n\t// Display message\n\tconst assistantText = result.message.content\n\t\t.filter((item) => item.type === 'text')\n\t\t.map((item) => (item.type === 'text' ? item.text : ''))\n\t\t.join(' ')\n\t\t.trim()\n\tprogressReporter.update({\n\t\tstatus: 'in-progress',\n\t\tprogress: { type: 'message', speaker: 'assistant', message: assistantText },\n\t})\n\treturn conversation\n}\n\nfunction findToolUsesNeedingInvocation(\n\tthread: Thread,\n\tmessage: ThreadAssistantMessage,\n): ToolUseBlock[] {\n\tconst toolResults = toolResultBlocks(thread)\n\treturn message.content\n\t\t.filter((block): block is ToolUseBlock => block.type === 'tool_use')\n\t\t.filter((block) => !block.inputPartialJSON)\n\t\t.filter(\n\t\t\t(block) =>\n\t\t\t\t// Only include tools that haven't been invoked yet.\n\t\t\t\t!toolResults.has(block.id),\n\t\t)\n}\n\n/**\n * Helper function that invokes a tool and returns a Promise with the final result\n */\nexport async function invokeToolAndWaitForResult<T extends ToolDefinition>(\n\ttoolService: ToolService,\n\ttoolName: string,\n\tinput: unknown,\n\tenv: ToolRunEnvironment,\n\tsignal: AbortSignal = new AbortController().signal,\n\tuserInput?: ToolRunUserInput,\n): Promise<ToolRun<T>> {\n\treturn new Promise((resolve, reject) => {\n\t\tlet settled = false\n\t\tconst sub = toolService\n\t\t\t.invokeTool(toolName, { args: input as any, userInput }, env)\n\t\t\t.subscribe({\n\t\t\t\tnext: (run: ToolRun) => {\n\t\t\t\t\tif (isToolRunTerminalState(run)) {\n\t\t\t\t\t\tsub.unsubscribe()\n\t\t\t\t\t\tif (!settled) {\n\t\t\t\t\t\t\tsettled = true\n\t\t\t\t\t\t\tresolve(run)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\terror: (error) => {\n\t\t\t\t\tif (!settled) {\n\t\t\t\t\t\tsettled = true\n\t\t\t\t\t\treject(error)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tcomplete: () => {},\n\t\t\t})\n\n\t\t// Handle abort signal\n\t\tsignal.addEventListener('abort', () => {\n\t\t\tsub.unsubscribe()\n\t\t\tif (!settled) {\n\t\t\t\tsettled = true\n\t\t\t\treject(new Error('Tool execution was aborted'))\n\t\t\t}\n\t\t})\n\t})\n}\n","import { Observable } from '@sourcegraph/observable'\nimport { isAbortError } from '../../../common/abort'\nimport logger from '../../../common/logger'\nimport type { Thread } from '../../../threads/thread'\nimport { newThreadID } from '../../../threads/thread'\nimport type { ToolRunEnvironment } from '../../tool-service'\nimport { createToolService } from '../../tool-service'\nimport type { ReadFileToolDef } from '../filesystem/read_file.common'\nimport { readFileToolReg } from '../filesystem/read_file.common'\nimport type { runRoutineToolReg } from './common'\nimport { deserializeRoutineFromYAML } from './serialization'\nimport { invokeToolAndWaitForResult, runStep } from './step'\nimport { ProgressReporter } from './util'\n\nexport const runRoutine: NonNullable<(typeof runRoutineToolReg)['fn']> = ({ args }, env) => {\n\treturn new Observable((observer) => {\n\t\tconst abortController = new AbortController()\n\t\tconst progressReporter = new ProgressReporter(observer, abortController.signal)\n\n\t\trunRoutineImpl(args, env, progressReporter, abortController.signal).catch((error) => {\n\t\t\t// Don't report AbortError as an error - it's expected when cancelling\n\t\t\tif (!isAbortError(error)) {\n\t\t\t\tprogressReporter.error(error)\n\t\t\t} else {\n\t\t\t\tprogressReporter.update({\n\t\t\t\t\tstatus: 'cancelled' as const,\n\t\t\t\t\tprogress: { type: 'meta', message: 'Operation cancelled' },\n\t\t\t\t})\n\t\t\t\tprogressReporter.complete()\n\t\t\t}\n\t\t})\n\n\t\treturn () => {\n\t\t\tabortController.abort()\n\t\t}\n\t})\n}\n\nasync function runRoutineImpl(\n\targs: { id: string; file?: string; userInput?: string },\n\tenv: ToolRunEnvironment,\n\tprogressReporter: ProgressReporter,\n\tsignal: AbortSignal,\n) {\n\ttry {\n\t\tconst { id, file } = args\n\t\tconst routineFile = file || 'routines.amp.yaml'\n\n\t\t// Report initial progress\n\t\tprogressReporter.update({\n\t\t\tstatus: 'in-progress',\n\t\t\tprogress: { type: 'meta', message: `Loading routine: ${id} from ${routineFile}` },\n\t\t})\n\n\t\t// Create a tool service and register the read_file tool\n\t\tconst toolService = createToolService()\n\t\ttoolService.registerTool(readFileToolReg)\n\n\t\t// Read the routine file using the tool service\n\t\tconst readFileResult = await invokeToolAndWaitForResult<ReadFileToolDef>(\n\t\t\ttoolService,\n\t\t\t'read_file',\n\t\t\t{ path: routineFile },\n\t\t\tenv,\n\t\t\tsignal,\n\t\t)\n\n\t\t// Process the file content by removing line numbers that read_file adds\n\t\tif (readFileResult.status !== 'done') {\n\t\t\tthrow new Error(`Failed to read routine file: ${routineFile}`)\n\t\t}\n\t\t// At this point TypeScript knows readFileResult has a 'result' property\n\t\tconst fileContents =\n\t\t\ttypeof readFileResult.result === 'string'\n\t\t\t\t? readFileResult.result\n\t\t\t\t: readFileResult.result.content\n\t\tconst routineContent = String(fileContents)\n\t\t\t.split('\\n')\n\t\t\t.map((line: string) => line.replace(/^\\d+:\\s/, ''))\n\t\t\t.join('\\n')\n\n\t\tsignal.throwIfAborted()\n\n\t\t// Parse the routines\n\t\tconst routines = deserializeRoutineFromYAML(routineContent)\n\t\tsignal.throwIfAborted()\n\n\t\t// Find the requested routine\n\t\tconst routine = routines.find((routine) => routine.id === id)\n\t\tif (!routine) {\n\t\t\tthrow new Error(`Routine with id \"${id}\" not found in ${routineFile}`)\n\t\t}\n\n\t\t// Initialize a Thread for the conversation\n\t\tlet conversation: Thread = {\n\t\t\tid: newThreadID(),\n\t\t\tcreated: Date.now(),\n\t\t\tv: 0,\n\t\t\tmessages: [],\n\t\t}\n\n\t\t// Report progress before executing steps\n\t\tprogressReporter.update({\n\t\t\tstatus: 'in-progress',\n\t\t\tprogress: [\n\t\t\t\t{\n\t\t\t\t\ttype: 'meta',\n\t\t\t\t\tmessage: `Executing routine ${id}`,\n\t\t\t\t},\n\t\t\t],\n\t\t})\n\n\t\t// Execute each step in the routine\n\t\tfor (let i = 0; i < routine.steps.length; i++) {\n\t\t\tconst step = routine.steps[i]\n\t\t\tif (!step) continue // Skip undefined steps\n\n\t\t\tprogressReporter.update({\n\t\t\t\tstatus: 'in-progress',\n\t\t\t\tprogress: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: 'meta',\n\t\t\t\t\t\tmessage: `Executing step ${i + 1}/${routine.steps.length}: ${step.type}`,\n\t\t\t\t\t\tvariant: 'header',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t})\n\n\t\t\tsignal.throwIfAborted()\n\n\t\t\t// Execute the step and update the conversation\n\t\t\tconversation = await runStep(step, conversation, env, progressReporter, {\n\t\t\t\tuserInput: args.userInput,\n\t\t\t})\n\t\t}\n\n\t\tprogressReporter.update({\n\t\t\tstatus: 'done' as const,\n\t\t\tprogress: {\n\t\t\t\ttype: 'meta',\n\t\t\t\tmessage: `Finished executing all ${routine.steps.length} steps of routine: ${id}.`,\n\t\t\t\tvariant: 'header',\n\t\t\t},\n\t\t\tresult: '', // No output for now\n\t\t})\n\n\t\tprogressReporter.complete()\n\t} catch (error) {\n\t\tif (isAbortError(error)) {\n\t\t\tprogressReporter.update({\n\t\t\t\tstatus: 'cancelled' as const,\n\t\t\t\tprogress: {\n\t\t\t\t\ttype: 'meta',\n\t\t\t\t\tmessage: 'Operation cancelled',\n\t\t\t\t},\n\t\t\t})\n\t\t\tprogressReporter.complete()\n\t\t} else {\n\t\t\tlogger.error('Error in run_routine', {\n\t\t\t\terror,\n\t\t\t\tstack: error instanceof Error ? error.stack : '',\n\t\t\t})\n\t\t\tprogressReporter.error(error)\n\t\t}\n\t}\n}\n"],"names":["BaseStep","z.object","z.enum","z.union","z.literal","z.array","z.string","z.record","z.any","AgentStep","z.boolean","LLMStep","LoopAgentStep","LoopLLMStep","ToolCallStep","BashStep","Step","z.discriminatedUnion","RoutineBlock","Routine","deserializeRoutineFromYAML","yamlString","parsedYaml","parse","error","z.ZodError","err","ProgressReporter","observer","signal","update","substitutePromptVars","prompt","vars","result","runStep","step","conversation","env","progressReporter","runStepAgent","runStepLLM","origConversation","toolService","createToolService","registerBuiltinToolsToToolService","promptText","recordThreadDelta","delta","applyThreadDelta","enabledToolSpecs","firstValueFrom","t","model","ACTIVE_MODEL","loopCount","maxLoops","systemPromptService","DefaultSystemPromptService","systemPromptBlocks","buildSystemPrompt","systemPrompt","anthropicMessages","AnthropicConverters","runAnthropicSync","assistantResponseDelta","fromAnthropicResultToThreadDelta","assistantText","item","toolCalls","findToolUsesNeedingInvocation","toolCall","toolResult","invokeToolAndWaitForResult","thread","message","toolResults","toolResultBlocks","block","toolName","input","userInput","resolve","reject","settled","sub","run","isToolRunTerminalState","runRoutine","args","Observable","abortController","runRoutineImpl","isAbortError","id","file","routineFile","readFileToolReg","readFileResult","fileContents","routineContent","line","routines","routine","newThreadID","i","logger"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { aZ as F, p as d } from "./color-DH4c3nvN.js";
2
+ import { b0 as F, p as d } from "./color-BHYGC4Ar.js";
3
3
  const s = ({ args: n }, { dir: o, dirs: r, threadID: a, filesystem: e }) => {
4
4
  const t = F({ readFileFn: e.readFile });
5
5
  return d(
@@ -9,4 +9,4 @@ const s = ({ args: n }, { dir: o, dirs: r, threadID: a, filesystem: e }) => {
9
9
  export {
10
10
  s as nodeReadFileTool
11
11
  };
12
- //# sourceMappingURL=read_file.node-DugoUCiQ.js.map
12
+ //# sourceMappingURL=read_file.node-M7X04JIh.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"read_file.node-DugoUCiQ.js","sources":["../../core/src/tools/builtin/filesystem/read_file.node.ts"],"sourcesContent":["import { promiseFactoryToObservable } from '@sourcegraph/observable'\nimport { type readFileToolReg } from './read_file.common'\nimport { readFileContentWith } from './read_file.util'\n\nexport const nodeReadFileTool: NonNullable<typeof readFileToolReg.fn> = (\n\t{ args },\n\t{ dir, dirs, threadID, filesystem },\n) => {\n\tconst readFileContentFn = readFileContentWith({ readFileFn: filesystem.readFile })\n\treturn promiseFactoryToObservable(async (signal) =>\n\t\treadFileContentFn({ args }, { dir, dirs, threadID, filesystem }, signal),\n\t)\n}\n"],"names":["nodeReadFileTool","args","dir","dirs","threadID","filesystem","readFileContentFn","readFileContentWith","promiseFactoryToObservable","signal"],"mappings":";;AAIa,MAAAA,IAA2D,CACvE,EAAE,MAAAC,KACF,EAAE,KAAAC,GAAK,MAAAC,GAAM,UAAAC,GAAU,YAAAC,QACnB;AACJ,QAAMC,IAAoBC,EAAoB,EAAE,YAAYF,EAAW,UAAU;AAC1E,SAAAG;AAAA,IAA2B,OAAOC,MACxCH,EAAkB,EAAE,MAAAL,EAAK,GAAG,EAAE,KAAAC,GAAK,MAAAC,GAAM,UAAAC,GAAU,YAAAC,EAAW,GAAGI,CAAM;AAAA,EACxE;AACD;"}
1
+ {"version":3,"file":"read_file.node-M7X04JIh.js","sources":["../../core/src/tools/builtin/filesystem/read_file.node.ts"],"sourcesContent":["import { promiseFactoryToObservable } from '@sourcegraph/observable'\nimport { type readFileToolReg } from './read_file.common'\nimport { readFileContentWith } from './read_file.util'\n\nexport const nodeReadFileTool: NonNullable<typeof readFileToolReg.fn> = (\n\t{ args },\n\t{ dir, dirs, threadID, filesystem },\n) => {\n\tconst readFileContentFn = readFileContentWith({ readFileFn: filesystem.readFile })\n\treturn promiseFactoryToObservable(async (signal) =>\n\t\treadFileContentFn({ args }, { dir, dirs, threadID, filesystem }, signal),\n\t)\n}\n"],"names":["nodeReadFileTool","args","dir","dirs","threadID","filesystem","readFileContentFn","readFileContentWith","promiseFactoryToObservable","signal"],"mappings":";;AAIa,MAAAA,IAA2D,CACvE,EAAE,MAAAC,KACF,EAAE,KAAAC,GAAK,MAAAC,GAAM,UAAAC,GAAU,YAAAC,QACnB;AACJ,QAAMC,IAAoBC,EAAoB,EAAE,YAAYF,EAAW,UAAU;AAC1E,SAAAG;AAAA,IAA2B,OAAOC,MACxCH,EAAkB,EAAE,MAAAL,EAAK,GAAG,EAAE,KAAAC,GAAK,MAAAC,GAAM,UAAAC,GAAU,YAAAC,EAAW,GAAGI,CAAM;AAAA,EACxE;AACD;"}
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
- import { y as ee, as as re } from "./color-DH4c3nvN.js";
2
+ import { z as ee, at as re } from "./color-BHYGC4Ar.js";
3
3
  import ne from "node:child_process";
4
4
  import D from "node:path";
5
5
  import L from "node:fs";
6
6
  import R from "node:process";
7
7
  import { PassThrough as te } from "node:stream";
8
- import { J as se } from "./main-XzserkUB.js";
8
+ import { J as se } from "./main-C22ZCKsZ.js";
9
9
  var S = { exports: {} }, T, k;
10
10
  function oe() {
11
11
  if (k) return T;
@@ -150,20 +150,20 @@ function ae() {
150
150
  };
151
151
  return q = o, o.sync = f, q;
152
152
  }
153
- var b = { exports: {} }, U;
153
+ var b = { exports: {} }, z;
154
154
  function ue() {
155
- if (U) return b.exports;
156
- U = 1;
155
+ if (z) return b.exports;
156
+ z = 1;
157
157
  const c = (t = {}) => {
158
158
  const a = t.env || process.env;
159
159
  return (t.platform || process.platform) !== "win32" ? "PATH" : Object.keys(a).reverse().find((u) => u.toUpperCase() === "PATH") || "Path";
160
160
  };
161
161
  return b.exports = c, b.exports.default = c, b.exports;
162
162
  }
163
- var N, z;
163
+ var N, U;
164
164
  function fe() {
165
- if (z) return N;
166
- z = 1;
165
+ if (U) return N;
166
+ U = 1;
167
167
  const c = D, t = ae(), a = ue();
168
168
  function n(e, o) {
169
169
  const f = e.options.env || process.env, i = process.cwd(), s = e.options.cwd != null, r = s && process.chdir !== void 0 && !process.chdir.disabled;
@@ -464,4 +464,4 @@ export {
464
464
  $e as StdioClientTransport,
465
465
  be as getDefaultEnvironment
466
466
  };
467
- //# sourceMappingURL=stdio-L9eSubEK.js.map
467
+ //# sourceMappingURL=stdio-BIlnCjMe.js.map