@swmansion/argent 0.15.1-next.0 → 0.15.1-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli-cmds.mjs CHANGED
@@ -6469,6 +6469,10 @@ var FAILURE_SPAWN_CODE = oneOf(FAILURE_SPAWN_CODES);
6469
6469
  var NETWORK_FAILURE = oneOf(NETWORK_FAILURES);
6470
6470
  var AI_CLIENT = oneOf(AI_CLIENTS);
6471
6471
  var INSTALL_MODE = oneOf(["global", "local"]);
6472
+ var ERROR_NAME = matches(/^[A-Za-z][A-Za-z0-9_]{0,63}$/, 64);
6473
+ var ERROR_SYSCALL = matches(/^E[A-Z0-9_]{1,31}$/, 32);
6474
+ var CRASH_FINGERPRINT = matches(/^[0-9a-f]{16}$/, 16);
6475
+ var CRASH_PHASE = oneOf(["startup", "serving"]);
6472
6476
  var AI_TELEMETRY = {
6473
6477
  ai_client: AI_CLIENT
6474
6478
  };
@@ -6599,7 +6603,11 @@ var ALLOWED = {
6599
6603
  reason: oneOf(["idle", "signal", "crash"]),
6600
6604
  uptime_ms: DURATION_MS,
6601
6605
  total_tool_calls: COUNT,
6602
- ...FAILURE_SIGNAL
6606
+ ...FAILURE_SIGNAL,
6607
+ error_name: ERROR_NAME,
6608
+ error_syscall: ERROR_SYSCALL,
6609
+ crash_fingerprint: CRASH_FINGERPRINT,
6610
+ crash_phase: CRASH_PHASE
6603
6611
  },
6604
6612
  "lens:preview_opened": {
6605
6613
  round: COUNT,
@@ -7857,6 +7865,9 @@ var FIRST_RUN_NOTICE = [
7857
7865
  `Details: ${TELEMETRY_DETAILS_URL}`
7858
7866
  ].join("\n");
7859
7867
 
7868
+ // ../telemetry/src/crash-diagnostics.ts
7869
+ import { createHash as createHash4 } from "node:crypto";
7870
+
7860
7871
  // ../telemetry/src/index.ts
7861
7872
  var SHORT_FLUSH_TIMEOUT_MS = 1500;
7862
7873
  var state = null;
@@ -16376,6 +16376,10 @@ var FAILURE_SPAWN_CODE = oneOf(FAILURE_SPAWN_CODES);
16376
16376
  var NETWORK_FAILURE = oneOf(NETWORK_FAILURES);
16377
16377
  var AI_CLIENT = oneOf(AI_CLIENTS);
16378
16378
  var INSTALL_MODE = oneOf(["global", "local"]);
16379
+ var ERROR_NAME = matches(/^[A-Za-z][A-Za-z0-9_]{0,63}$/, 64);
16380
+ var ERROR_SYSCALL = matches(/^E[A-Z0-9_]{1,31}$/, 32);
16381
+ var CRASH_FINGERPRINT = matches(/^[0-9a-f]{16}$/, 16);
16382
+ var CRASH_PHASE = oneOf(["startup", "serving"]);
16379
16383
  var AI_TELEMETRY = {
16380
16384
  ai_client: AI_CLIENT
16381
16385
  };
@@ -16506,7 +16510,11 @@ var ALLOWED = {
16506
16510
  reason: oneOf(["idle", "signal", "crash"]),
16507
16511
  uptime_ms: DURATION_MS,
16508
16512
  total_tool_calls: COUNT,
16509
- ...FAILURE_SIGNAL
16513
+ ...FAILURE_SIGNAL,
16514
+ error_name: ERROR_NAME,
16515
+ error_syscall: ERROR_SYSCALL,
16516
+ crash_fingerprint: CRASH_FINGERPRINT,
16517
+ crash_phase: CRASH_PHASE
16510
16518
  },
16511
16519
  "lens:preview_opened": {
16512
16520
  round: COUNT,
@@ -17700,6 +17708,9 @@ async function resetLocalTelemetryState() {
17700
17708
  return { localIdRemoved, noticeReset };
17701
17709
  }
17702
17710
 
17711
+ // ../telemetry/src/crash-diagnostics.ts
17712
+ import { createHash } from "node:crypto";
17713
+
17703
17714
  // ../telemetry/src/index.ts
17704
17715
  var SHORT_FLUSH_TIMEOUT_MS = 1500;
17705
17716
  var state = null;
@@ -23062,7 +23073,7 @@ import * as path14 from "node:path";
23062
23073
  import * as readline from "node:readline";
23063
23074
  import { homedir as homedir5 } from "node:os";
23064
23075
  import { spawn as spawn4, execFileSync as execFileSync5 } from "node:child_process";
23065
- import { createHash, randomBytes } from "node:crypto";
23076
+ import { createHash as createHash2, randomBytes } from "node:crypto";
23066
23077
  import { mkdir, writeFile, readFile, readdir, unlink, rename, chmod } from "node:fs/promises";
23067
23078
  var STATE_DIR = path14.join(homedir5(), ".argent");
23068
23079
  var STATE_FILE = path14.join(STATE_DIR, "tool-server.json");
@@ -23077,7 +23088,7 @@ function isProcessAlive(pid) {
23077
23088
  }
23078
23089
  }
23079
23090
  function stateFileForBundle(bundlePath) {
23080
- const key = createHash("sha256").update(bundlePath).digest("hex").slice(0, 12);
23091
+ const key = createHash2("sha256").update(bundlePath).digest("hex").slice(0, 12);
23081
23092
  return path14.join(STATE_DIR, `tool-server-${key}.json`);
23082
23093
  }
23083
23094
  async function readStateFile(file) {
@@ -23222,7 +23233,7 @@ var LINK_DIR = path15.join(homedir6(), ".argent");
23222
23233
  var LINK_FILE = path15.join(LINK_DIR, "link.json");
23223
23234
 
23224
23235
  // ../argent-tools-client/src/file-inputs.ts
23225
- import { createHash as createHash2, randomUUID as randomUUID6 } from "node:crypto";
23236
+ import { createHash as createHash3, randomUUID as randomUUID6 } from "node:crypto";
23226
23237
  import { createReadStream as createReadStream2 } from "node:fs";
23227
23238
  import { mkdir as mkdir3, readFile as readFile3, rm as rm2, stat as stat2, writeFile as writeFile3 } from "node:fs/promises";
23228
23239
  import { tmpdir } from "node:os";
@@ -23242,7 +23253,7 @@ var MAX_CONTENT_BYTES = 32 * 1024 * 1024;
23242
23253
  import { mkdir as mkdir4, readFile as readFile4, rm as rm3, stat as stat3, writeFile as writeFile4 } from "node:fs/promises";
23243
23254
  import { tmpdir as tmpdir2 } from "node:os";
23244
23255
  import { basename as basename4, join as join19 } from "node:path";
23245
- import { createHash as createHash3 } from "node:crypto";
23256
+ import { createHash as createHash4 } from "node:crypto";
23246
23257
 
23247
23258
  // ../argent-installer/src/update.ts
23248
23259
  function getRequestedVersion(args) {
@@ -17916,6 +17916,10 @@ var FAILURE_SPAWN_CODE = oneOf(FAILURE_SPAWN_CODES);
17916
17916
  var NETWORK_FAILURE = oneOf(NETWORK_FAILURES);
17917
17917
  var AI_CLIENT = oneOf(AI_CLIENTS);
17918
17918
  var INSTALL_MODE = oneOf(["global", "local"]);
17919
+ var ERROR_NAME = matches(/^[A-Za-z][A-Za-z0-9_]{0,63}$/, 64);
17920
+ var ERROR_SYSCALL = matches(/^E[A-Z0-9_]{1,31}$/, 32);
17921
+ var CRASH_FINGERPRINT = matches(/^[0-9a-f]{16}$/, 16);
17922
+ var CRASH_PHASE = oneOf(["startup", "serving"]);
17919
17923
  var AI_TELEMETRY = {
17920
17924
  ai_client: AI_CLIENT
17921
17925
  };
@@ -18046,7 +18050,11 @@ var ALLOWED = {
18046
18050
  reason: oneOf(["idle", "signal", "crash"]),
18047
18051
  uptime_ms: DURATION_MS,
18048
18052
  total_tool_calls: COUNT,
18049
- ...FAILURE_SIGNAL
18053
+ ...FAILURE_SIGNAL,
18054
+ error_name: ERROR_NAME,
18055
+ error_syscall: ERROR_SYSCALL,
18056
+ crash_fingerprint: CRASH_FINGERPRINT,
18057
+ crash_phase: CRASH_PHASE
18050
18058
  },
18051
18059
  "lens:preview_opened": {
18052
18060
  round: COUNT,
@@ -18751,6 +18759,9 @@ function shouldShowFirstRunNotice() {
18751
18759
  return isEnabled() && !hasShownFirstRunNotice();
18752
18760
  }
18753
18761
 
18762
+ // ../telemetry/src/crash-diagnostics.ts
18763
+ import { createHash as createHash4 } from "node:crypto";
18764
+
18754
18765
  // ../argent-mcp/src/content.ts
18755
18766
  import { readFile as readFile5 } from "node:fs/promises";
18756
18767
  var PNG_SIGNATURE = Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]);
@@ -68630,14 +68630,14 @@ var require_re = __commonJS({
68630
68630
  return value;
68631
68631
  };
68632
68632
  var createToken = (name, value, isGlobal) => {
68633
- const safe = makeSafeRegex(value);
68633
+ const safe2 = makeSafeRegex(value);
68634
68634
  const index = R++;
68635
68635
  debug(name, index, value);
68636
68636
  t[name] = index;
68637
68637
  src[index] = value;
68638
- safeSrc[index] = safe;
68638
+ safeSrc[index] = safe2;
68639
68639
  re[index] = new RegExp(value, isGlobal ? "g" : void 0);
68640
- safeRe[index] = new RegExp(safe, isGlobal ? "g" : void 0);
68640
+ safeRe[index] = new RegExp(safe2, isGlobal ? "g" : void 0);
68641
68641
  };
68642
68642
  createToken("NUMERICIDENTIFIER", "0|[1-9]\\d*");
68643
68643
  createToken("NUMERICIDENTIFIERLOOSE", "\\d+");
@@ -81109,7 +81109,7 @@ var require_websocket = __commonJS({
81109
81109
  var http3 = require("http");
81110
81110
  var net6 = require("net");
81111
81111
  var tls = require("tls");
81112
- var { randomBytes, createHash: createHash2 } = require("crypto");
81112
+ var { randomBytes, createHash: createHash3 } = require("crypto");
81113
81113
  var { Duplex, Readable } = require("stream");
81114
81114
  var { URL: URL2 } = require("url");
81115
81115
  var PerMessageDeflate2 = require_permessage_deflate();
@@ -81777,7 +81777,7 @@ var require_websocket = __commonJS({
81777
81777
  abortHandshake(websocket, socket, "Invalid Upgrade header");
81778
81778
  return;
81779
81779
  }
81780
- const digest = createHash2("sha1").update(key + GUID).digest("base64");
81780
+ const digest = createHash3("sha1").update(key + GUID).digest("base64");
81781
81781
  if (res.headers["sec-websocket-accept"] !== digest) {
81782
81782
  abortHandshake(websocket, socket, "Invalid Sec-WebSocket-Accept header");
81783
81783
  return;
@@ -82146,7 +82146,7 @@ var require_websocket_server = __commonJS({
82146
82146
  var EventEmitter2 = require("events");
82147
82147
  var http3 = require("http");
82148
82148
  var { Duplex } = require("stream");
82149
- var { createHash: createHash2 } = require("crypto");
82149
+ var { createHash: createHash3 } = require("crypto");
82150
82150
  var extension2 = require_extension();
82151
82151
  var PerMessageDeflate2 = require_permessage_deflate();
82152
82152
  var subprotocol2 = require_subprotocol();
@@ -82453,7 +82453,7 @@ var require_websocket_server = __commonJS({
82453
82453
  );
82454
82454
  }
82455
82455
  if (this._state > RUNNING) return abortHandshake(socket, 503);
82456
- const digest = createHash2("sha1").update(key + GUID).digest("base64");
82456
+ const digest = createHash3("sha1").update(key + GUID).digest("base64");
82457
82457
  const headers = [
82458
82458
  "HTTP/1.1 101 Switching Protocols",
82459
82459
  "Upgrade: websocket",
@@ -82588,8 +82588,8 @@ var require_ini = __commonJS({
82588
82588
  const keys = opt.sort ? Object.keys(obj).sort() : Object.keys(obj);
82589
82589
  let padToChars = 0;
82590
82590
  if (opt.align) {
82591
- padToChars = safe(
82592
- keys.filter((k) => obj[k] === null || Array.isArray(obj[k]) || typeof obj[k] !== "object").map((k) => Array.isArray(obj[k]) ? `${k}[]` : k).concat([""]).reduce((a, b) => safe(a).length >= safe(b).length ? a : b)
82591
+ padToChars = safe2(
82592
+ keys.filter((k) => obj[k] === null || Array.isArray(obj[k]) || typeof obj[k] !== "object").map((k) => Array.isArray(obj[k]) ? `${k}[]` : k).concat([""]).reduce((a, b) => safe2(a).length >= safe2(b).length ? a : b)
82593
82593
  ).length;
82594
82594
  }
82595
82595
  let out = "";
@@ -82598,16 +82598,16 @@ var require_ini = __commonJS({
82598
82598
  const val = obj[k];
82599
82599
  if (val && Array.isArray(val)) {
82600
82600
  for (const item of val) {
82601
- out += safe(`${k}${arraySuffix}`).padEnd(padToChars, " ") + separator + safe(item) + eol;
82601
+ out += safe2(`${k}${arraySuffix}`).padEnd(padToChars, " ") + separator + safe2(item) + eol;
82602
82602
  }
82603
82603
  } else if (val && typeof val === "object") {
82604
82604
  children.push(k);
82605
82605
  } else {
82606
- out += safe(k).padEnd(padToChars, " ") + separator + safe(val) + eol;
82606
+ out += safe2(k).padEnd(padToChars, " ") + separator + safe2(val) + eol;
82607
82607
  }
82608
82608
  }
82609
82609
  if (opt.section && out.length) {
82610
- out = "[" + safe(opt.section) + "]" + (opt.newline ? eol + eol : eol) + out;
82610
+ out = "[" + safe2(opt.section) + "]" + (opt.newline ? eol + eol : eol) + out;
82611
82611
  }
82612
82612
  for (const k of children) {
82613
82613
  const nk = splitSections(k, ".").join("\\.");
@@ -82726,7 +82726,7 @@ var require_ini = __commonJS({
82726
82726
  var isQuoted = (val) => {
82727
82727
  return val.startsWith('"') && val.endsWith('"') || val.startsWith("'") && val.endsWith("'");
82728
82728
  };
82729
- var safe = (val) => {
82729
+ var safe2 = (val) => {
82730
82730
  if (typeof val !== "string" || val.match(/[=\r\n]/) || val.match(/^\[/) || val.length > 1 && isQuoted(val) || val !== val.trim()) {
82731
82731
  return JSON.stringify(val);
82732
82732
  }
@@ -82774,7 +82774,7 @@ var require_ini = __commonJS({
82774
82774
  decode: decode8,
82775
82775
  stringify: encode9,
82776
82776
  encode: encode9,
82777
- safe,
82777
+ safe: safe2,
82778
82778
  unsafe
82779
82779
  };
82780
82780
  }
@@ -103747,6 +103747,10 @@ var FAILURE_SPAWN_CODE = oneOf(FAILURE_SPAWN_CODES);
103747
103747
  var NETWORK_FAILURE = oneOf(NETWORK_FAILURES);
103748
103748
  var AI_CLIENT = oneOf(AI_CLIENTS);
103749
103749
  var INSTALL_MODE = oneOf(["global", "local"]);
103750
+ var ERROR_NAME = matches(/^[A-Za-z][A-Za-z0-9_]{0,63}$/, 64);
103751
+ var ERROR_SYSCALL = matches(/^E[A-Z0-9_]{1,31}$/, 32);
103752
+ var CRASH_FINGERPRINT = matches(/^[0-9a-f]{16}$/, 16);
103753
+ var CRASH_PHASE = oneOf(["startup", "serving"]);
103750
103754
  var AI_TELEMETRY = {
103751
103755
  ai_client: AI_CLIENT
103752
103756
  };
@@ -103877,7 +103881,11 @@ var ALLOWED = {
103877
103881
  reason: oneOf(["idle", "signal", "crash"]),
103878
103882
  uptime_ms: DURATION_MS,
103879
103883
  total_tool_calls: COUNT,
103880
- ...FAILURE_SIGNAL2
103884
+ ...FAILURE_SIGNAL2,
103885
+ error_name: ERROR_NAME,
103886
+ error_syscall: ERROR_SYSCALL,
103887
+ crash_fingerprint: CRASH_FINGERPRINT,
103888
+ crash_phase: CRASH_PHASE
103881
103889
  },
103882
103890
  "lens:preview_opened": {
103883
103891
  round: COUNT,
@@ -105043,6 +105051,79 @@ function attachRegistryTelemetry(registry2) {
105043
105051
  };
105044
105052
  }
105045
105053
 
105054
+ // ../telemetry/src/crash-diagnostics.ts
105055
+ var import_node_crypto4 = require("node:crypto");
105056
+ var MAX_FRAMES = 8;
105057
+ var FRAME_RE = /^\s*at\s+(?:(.*?)\s+\()?(.+?):(\d+):(\d+)\)?\s*$/;
105058
+ function deidentifyPath(file2) {
105059
+ const unified = file2.replace(/\\/g, "/");
105060
+ if (unified.startsWith("node:")) return unified;
105061
+ const marker = "node_modules/";
105062
+ const idx = unified.lastIndexOf(marker);
105063
+ if (idx !== -1) return unified.slice(idx + marker.length);
105064
+ const slash = unified.lastIndexOf("/");
105065
+ return slash === -1 ? unified : unified.slice(slash + 1);
105066
+ }
105067
+ function normalizeFrame(line) {
105068
+ const m = FRAME_RE.exec(line);
105069
+ if (!m) return null;
105070
+ const fn = (m[1] ?? "").trim() || "?";
105071
+ const file2 = deidentifyPath(m[2]);
105072
+ return `${fn}@${file2}:${m[3]}`;
105073
+ }
105074
+ function stackOf(err) {
105075
+ if (err instanceof Error && typeof err.stack === "string") return err.stack;
105076
+ if (err && typeof err === "object") {
105077
+ const stack = err.stack;
105078
+ if (typeof stack === "string") return stack;
105079
+ }
105080
+ return void 0;
105081
+ }
105082
+ function fingerprintStack(err) {
105083
+ const stack = stackOf(err);
105084
+ if (!stack) return void 0;
105085
+ const frames = [];
105086
+ for (const line of stack.split("\n")) {
105087
+ const norm = normalizeFrame(line);
105088
+ if (norm) frames.push(norm);
105089
+ if (frames.length >= MAX_FRAMES) break;
105090
+ }
105091
+ if (frames.length === 0) return void 0;
105092
+ return (0, import_node_crypto4.createHash)("sha256").update(frames.join("\n")).digest("hex").slice(0, 16);
105093
+ }
105094
+ function safe(fn) {
105095
+ try {
105096
+ return fn();
105097
+ } catch {
105098
+ return void 0;
105099
+ }
105100
+ }
105101
+ function errorName(err) {
105102
+ if (err instanceof Error && typeof err.name === "string" && err.name) return err.name;
105103
+ if (err && typeof err === "object") {
105104
+ const ctor = err.constructor;
105105
+ if (ctor && typeof ctor.name === "string" && ctor.name) return ctor.name;
105106
+ }
105107
+ return void 0;
105108
+ }
105109
+ function syscallCode(err) {
105110
+ if (err && typeof err === "object") {
105111
+ const code = err.code;
105112
+ if (typeof code === "string" && code) return code;
105113
+ }
105114
+ return void 0;
105115
+ }
105116
+ function describeCrash(err, phase) {
105117
+ const diagnostics = { crash_phase: phase };
105118
+ const name = safe(() => errorName(err));
105119
+ if (name !== void 0) diagnostics.error_name = name;
105120
+ const syscall = safe(() => syscallCode(err));
105121
+ if (syscall !== void 0) diagnostics.error_syscall = syscall;
105122
+ const fingerprint = safe(() => fingerprintStack(err));
105123
+ if (fingerprint !== void 0) diagnostics.crash_fingerprint = fingerprint;
105124
+ return diagnostics;
105125
+ }
105126
+
105046
105127
  // ../telemetry/src/index.ts
105047
105128
  var SHORT_FLUSH_TIMEOUT_MS = 1500;
105048
105129
  var state = null;
@@ -105133,7 +105214,7 @@ var import_node_fs10 = require("node:fs");
105133
105214
  var import_promises9 = require("node:fs/promises");
105134
105215
  var import_node_os8 = require("node:os");
105135
105216
  var import_node_path9 = require("node:path");
105136
- var import_node_crypto5 = require("node:crypto");
105217
+ var import_node_crypto6 = require("node:crypto");
105137
105218
  init_src();
105138
105219
  init_src();
105139
105220
 
@@ -113753,7 +113834,7 @@ function settleWithin(p, ms, signal) {
113753
113834
  var fs9 = __toESM(require("node:fs/promises"));
113754
113835
  var path9 = __toESM(require("node:path"));
113755
113836
  var os4 = __toESM(require("node:os"));
113756
- var import_node_crypto4 = require("node:crypto");
113837
+ var import_node_crypto5 = require("node:crypto");
113757
113838
  var import_node_url = require("node:url");
113758
113839
  var DEFAULT_SCREENSHOT_SCALE = 0.3;
113759
113840
  var NO_IMAGE_ERROR = /no image to export/i;
@@ -113914,7 +113995,7 @@ function createMoqTransport(moq, options) {
113914
113995
  const screenshotDir = path9.join(os4.tmpdir(), "argent-remote-screenshots");
113915
113996
  const writeScreenshotToDisk = async (bytes) => {
113916
113997
  await fs9.mkdir(screenshotDir, { recursive: true });
113917
- const file2 = path9.join(screenshotDir, `${(0, import_node_crypto4.randomUUID)()}.png`);
113998
+ const file2 = path9.join(screenshotDir, `${(0, import_node_crypto5.randomUUID)()}.png`);
113918
113999
  await fs9.writeFile(file2, bytes);
113919
114000
  return { url: (0, import_node_url.pathToFileURL)(file2).toString(), path: file2 };
113920
114001
  };
@@ -119827,7 +119908,7 @@ function createHttpApp(registry2, options) {
119827
119908
  });
119828
119909
  return;
119829
119910
  }
119830
- const id = (0, import_node_crypto5.randomUUID)();
119911
+ const id = (0, import_node_crypto6.randomUUID)();
119831
119912
  const tarPath = (0, import_node_path9.join)((0, import_node_os8.tmpdir)(), `argent-upload-${id}.tar.gz`);
119832
119913
  const ws = (0, import_node_fs10.createWriteStream)(tarPath);
119833
119914
  let received = 0;
@@ -119844,7 +119925,7 @@ function createHttpApp(registry2, options) {
119844
119925
  });
119845
119926
  if (!res.headersSent) res.status(status).json({ error: message });
119846
119927
  };
119847
- const digest = (0, import_node_crypto5.createHash)("sha256");
119928
+ const digest = (0, import_node_crypto6.createHash)("sha256");
119848
119929
  req.on("data", (chunk) => {
119849
119930
  if (released) return;
119850
119931
  received += chunk.length;
@@ -120034,7 +120115,7 @@ function createHttpApp(registry2, options) {
120034
120115
  });
120035
120116
  const keepAlive = def.longRunning && options?.idleTimeoutMs && options.idleTimeoutMs > 0 ? setInterval(() => idleTimer.touch(), Math.max(1e3, IDLE_CHECK_INTERVAL_MS / 2)) : null;
120036
120117
  if (keepAlive) keepAlive.unref?.();
120037
- const toolInvocationId = (0, import_node_crypto5.randomUUID)();
120118
+ const toolInvocationId = (0, import_node_crypto6.randomUUID)();
120038
120119
  let releaseInvocationMeta;
120039
120120
  let recordChildInvocation;
120040
120121
  const recordInvocation = options?.recordInvocation;
@@ -126938,14 +127019,14 @@ Returns { pressed, count }.`,
126938
127019
  init_zod();
126939
127020
 
126940
127021
  // ../tool-server/src/utils/sub-invoke.ts
126941
- var import_node_crypto6 = require("node:crypto");
127022
+ var import_node_crypto7 = require("node:crypto");
126942
127023
  async function invokeSubTool(registry2, ctx, toolId, args) {
126943
127024
  const signal = ctx?.signal;
126944
127025
  const recordChildInvocation = ctx?.recordChildInvocation;
126945
127026
  if (!recordChildInvocation) {
126946
127027
  return signal ? registry2.invokeTool(toolId, args, { signal }) : registry2.invokeTool(toolId, args);
126947
127028
  }
126948
- const toolInvocationId = (0, import_node_crypto6.randomUUID)();
127029
+ const toolInvocationId = (0, import_node_crypto7.randomUUID)();
126949
127030
  const release = recordChildInvocation(toolInvocationId, args);
126950
127031
  try {
126951
127032
  return await registry2.invokeTool(toolId, args, {
@@ -132620,7 +132701,7 @@ function ownText(node) {
132620
132701
  function isMeaningful(node, ownTextValue) {
132621
132702
  return Boolean(node.attrs.role) || isInteractive2(node.attrs) || ownTextValue.length > 0 || hasAuthoredTestId(node.attrs);
132622
132703
  }
132623
- function normalizeFrame(attrs, screenW, screenH) {
132704
+ function normalizeFrame2(attrs, screenW, screenH) {
132624
132705
  const x = num(attrs, "x") ?? 0;
132625
132706
  const y = num(attrs, "y") ?? 0;
132626
132707
  const w = num(attrs, "width") ?? 0;
@@ -132658,7 +132739,7 @@ function convert(node, screenW, screenH) {
132658
132739
  const keptChildren = label && childrenReconstructLabel(childNodes2, label) ? [] : childNodes2;
132659
132740
  const out = {
132660
132741
  role: attrs.role || "view",
132661
- frame: normalizeFrame(attrs, screenW, screenH),
132742
+ frame: normalizeFrame2(attrs, screenW, screenH),
132662
132743
  children: keptChildren
132663
132744
  };
132664
132745
  if (label) out.label = label;
@@ -144837,7 +144918,7 @@ function roleFromClassName(cn) {
144837
144918
  if (/(ScrollView|TableView|CollectionView)/i.test(cn)) return "AXScrollArea";
144838
144919
  return "AXGroup";
144839
144920
  }
144840
- function normalizeFrame2(rect, screenW, screenH) {
144921
+ function normalizeFrame3(rect, screenW, screenH) {
144841
144922
  if (screenW <= 0 || screenH <= 0) return null;
144842
144923
  const x1 = clamp013(rect.x / screenW);
144843
144924
  const y1 = clamp013(rect.y / screenH);
@@ -144862,7 +144943,7 @@ function projectIosNode(node, screenW, screenH) {
144862
144943
  let frame = null;
144863
144944
  if (!skip2 && (node.identifier || node.label || role !== "AXGroup" || node.firstResponder)) {
144864
144945
  const leafRect = node.windowFrame ?? node.frame;
144865
- frame = leafRect ? normalizeFrame2(leafRect, screenW, screenH) : null;
144946
+ frame = leafRect ? normalizeFrame3(leafRect, screenW, screenH) : null;
144866
144947
  if (frame) {
144867
144948
  leaf = {
144868
144949
  role,
@@ -148960,7 +149041,7 @@ var dismissUpdateTool = {
148960
149041
  };
148961
149042
 
148962
149043
  // ../tool-server/src/tools/screenshot-diff/index.ts
148963
- var import_node_crypto7 = __toESM(require("node:crypto"));
149044
+ var import_node_crypto8 = __toESM(require("node:crypto"));
148964
149045
  var import_promises13 = __toESM(require("fs/promises"));
148965
149046
  var import_node_os11 = __toESM(require("node:os"));
148966
149047
  var import_path9 = __toESM(require("path"));
@@ -149046,7 +149127,7 @@ async function resolveOutputDir(params, options) {
149046
149127
  const dir = import_path9.default.join(
149047
149128
  import_node_os11.default.tmpdir(),
149048
149129
  "argent-screenshot-diff",
149049
- import_node_crypto7.default.randomBytes(6).toString("hex")
149130
+ import_node_crypto8.default.randomBytes(6).toString("hex")
149050
149131
  );
149051
149132
  await import_promises13.default.mkdir(dir, { recursive: true });
149052
149133
  return dir;
@@ -149123,7 +149204,7 @@ async function captureLiveInput(params) {
149123
149204
  } catch {
149124
149205
  capture = await params.captureScreenshot(params.api, params.rotation, params.signal);
149125
149206
  }
149126
- const suffix = import_node_crypto7.default.randomBytes(4).toString("hex");
149207
+ const suffix = import_node_crypto8.default.randomBytes(4).toString("hex");
149127
149208
  const destination = import_path9.default.join(params.outputDir, `${params.name}-${suffix}.live.png`);
149128
149209
  await import_promises13.default.mkdir(params.outputDir, { recursive: true });
149129
149210
  await import_promises13.default.copyFile(capture.path, destination);
@@ -149956,8 +150037,10 @@ function start() {
149956
150037
  let finalExitCode = 0;
149957
150038
  let shutdownReason = "signal";
149958
150039
  let shutdownFailureSignal = null;
150040
+ let shutdownCrashDiagnostics = null;
150041
+ let listening = false;
149959
150042
  let shutdown2 = null;
149960
- function crashShutdown(label, detail, signal) {
150043
+ function crashShutdown(label, detail, signal, err) {
149961
150044
  process.stderr.write(`[tool-server] ${label}: ${detail}
149962
150045
  `);
149963
150046
  if (crashing) return;
@@ -149965,6 +150048,11 @@ function start() {
149965
150048
  shutdownReason = "crash";
149966
150049
  finalExitCode = 1;
149967
150050
  shutdownFailureSignal = signal;
150051
+ try {
150052
+ shutdownCrashDiagnostics = describeCrash(err, listening ? "serving" : "startup");
150053
+ } catch {
150054
+ shutdownCrashDiagnostics = { crash_phase: listening ? "serving" : "startup" };
150055
+ }
149968
150056
  setTimeout(() => process.exit(1), PROCESS_TIMEOUT_MS);
149969
150057
  if (shutdown2) {
149970
150058
  shutdown2(1).catch(() => process.exit(1));
@@ -149973,12 +150061,17 @@ function start() {
149973
150061
  }
149974
150062
  }
149975
150063
  process.on("uncaughtException", (err) => {
149976
- crashShutdown("Uncaught exception", String(err.stack ?? err), {
149977
- error_code: FAILURE_CODES.TOOLSERVER_UNCAUGHT_EXCEPTION,
149978
- failure_stage: "toolserver_uncaught_exception",
149979
- failure_area: "tool_server",
149980
- error_kind: "crash"
149981
- });
150064
+ crashShutdown(
150065
+ "Uncaught exception",
150066
+ String(err.stack ?? err),
150067
+ {
150068
+ error_code: FAILURE_CODES.TOOLSERVER_UNCAUGHT_EXCEPTION,
150069
+ failure_stage: "toolserver_uncaught_exception",
150070
+ failure_area: "tool_server",
150071
+ error_kind: "crash"
150072
+ },
150073
+ err
150074
+ );
149982
150075
  });
149983
150076
  process.on("unhandledRejection", (reason) => {
149984
150077
  crashShutdown(
@@ -149989,7 +150082,8 @@ function start() {
149989
150082
  failure_stage: "toolserver_unhandled_rejection",
149990
150083
  failure_area: "tool_server",
149991
150084
  error_kind: "crash"
149992
- }
150085
+ },
150086
+ reason
149993
150087
  );
149994
150088
  });
149995
150089
  const PORT = parseInt(process.env.ARGENT_PORT ?? DEFAULT_PORT, 10);
@@ -150133,7 +150227,8 @@ function start() {
150133
150227
  reason: shutdownReason,
150134
150228
  uptime_ms: Date.now() - serverStartedAt,
150135
150229
  total_tool_calls: telemetryHandle.getTotalToolCalls(),
150136
- ...shutdownFailureSignal ?? {}
150230
+ ...shutdownFailureSignal ?? {},
150231
+ ...shutdownCrashDiagnostics ?? {}
150137
150232
  });
150138
150233
  telemetryHandle.detach();
150139
150234
  await shutdown(1500);
@@ -150173,6 +150268,7 @@ function start() {
150173
150268
  });
150174
150269
  Promise.all([watcherReady, identityWarm]).then(() => {
150175
150270
  server = httpHandle.app.listen(PORT, HOST, () => {
150271
+ listening = true;
150176
150272
  const addr = server.address();
150177
150273
  const boundPort = typeof addr === "object" && addr ? addr.port : PORT;
150178
150274
  const origin = formatOrigin(HOST, boundPort);
@@ -150198,12 +150294,7 @@ function start() {
150198
150294
  } catch {
150199
150295
  }
150200
150296
  });
150201
- server.on("error", async (err) => {
150202
- const code = err.code ? `${err.code}: ` : "";
150203
- process.stderr.write(
150204
- `[tool-server] Failed to bind ${HOST}:${PORT} \u2014 ${code}${err.message}
150205
- `
150206
- );
150297
+ server.on("error", (err) => {
150207
150298
  eventLog?.error({
150208
150299
  type: "tool_server.bind_failed",
150209
150300
  msg: `Tool server failed to bind ${HOST}:${PORT}.`,
@@ -150213,16 +150304,21 @@ function start() {
150213
150304
  error_code: FAILURE_CODES.ARGENT_UNCLASSIFIED_FAILURE,
150214
150305
  failure_stage: "toolserver_bind",
150215
150306
  failure_area: "tool_server",
150216
- error_kind: "unknown"
150307
+ error_kind: "crash"
150217
150308
  }
150218
150309
  });
150219
- try {
150220
- await eventLog?.dispose();
150221
- } catch (err2) {
150222
- process.stderr.write(`[tool-server] event log dispose failed: ${String(err2)}
150223
- `);
150224
- }
150225
- process.exit(1);
150310
+ const code = err.code ? `${err.code}: ` : "";
150311
+ crashShutdown(
150312
+ `Failed to bind ${HOST}:${PORT}`,
150313
+ `${code}${err.message}`,
150314
+ {
150315
+ error_code: FAILURE_CODES.ARGENT_UNCLASSIFIED_FAILURE,
150316
+ failure_stage: "toolserver_bind",
150317
+ failure_area: "tool_server",
150318
+ error_kind: "crash"
150319
+ },
150320
+ err
150321
+ );
150226
150322
  });
150227
150323
  httpHandle.attachChromiumWebsockets(server);
150228
150324
  }).catch((err) => {
@@ -150242,6 +150338,11 @@ function start() {
150242
150338
  }
150243
150339
  });
150244
150340
  shutdownReason = "crash";
150341
+ try {
150342
+ shutdownCrashDiagnostics = describeCrash(err, "startup");
150343
+ } catch {
150344
+ shutdownCrashDiagnostics = { crash_phase: "startup" };
150345
+ }
150245
150346
  await shutdown2?.(1);
150246
150347
  })();
150247
150348
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@swmansion/argent",
3
- "version": "0.15.1-next.0",
3
+ "version": "0.15.1-next.1",
4
4
  "description": "MCP server for iOS Simulator and Android Emulator control",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {