@zixt/host 0.0.21 → 0.0.23

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 (2) hide show
  1. package/dist/index.js +196 -143
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -31,7 +31,7 @@ import { homedir } from "node:os";
31
31
  // package.json
32
32
  var package_default = {
33
33
  name: "@zixt/host",
34
- version: "0.0.21",
34
+ version: "0.0.23",
35
35
  type: "module",
36
36
  exports: {
37
37
  ".": "./src/client.ts",
@@ -16998,7 +16998,7 @@ var GithubOperationGrant = external_exports.discriminatedUnion("operation", [
16998
16998
  provider: external_exports.literal("github"),
16999
16999
  operation: external_exports.literal("repository.clone_created"),
17000
17000
  accessToken: external_exports.string().min(1).max(1e4),
17001
- expiresAt: IsoDate,
17001
+ expiresAt: IsoDate.nullable(),
17002
17002
  installationId: GithubNumericId,
17003
17003
  repositoryId: GithubNumericId,
17004
17004
  repository: GithubRepositoryGrant,
@@ -17013,7 +17013,7 @@ var GithubOperationGrant = external_exports.discriminatedUnion("operation", [
17013
17013
  provider: external_exports.literal("github"),
17014
17014
  operation: external_exports.literal("repository.activate"),
17015
17015
  accessToken: external_exports.string().min(1).max(1e4),
17016
- expiresAt: IsoDate,
17016
+ expiresAt: IsoDate.nullable(),
17017
17017
  installationId: GithubNumericId,
17018
17018
  repositoryId: GithubNumericId,
17019
17019
  repository: GithubRepositoryGrant,
@@ -18994,7 +18994,7 @@ async function generateTaskTitle(instructions, runner) {
18994
18994
  instructions.slice(0, INSTRUCTIONS_BUDGET),
18995
18995
  "</task_request>"
18996
18996
  ].join("\n");
18997
- return new Promise((resolve13) => {
18997
+ return new Promise((resolve14) => {
18998
18998
  const child = spawnCli(
18999
18999
  command,
19000
19000
  [
@@ -19017,7 +19017,7 @@ async function generateTaskTitle(instructions, runner) {
19017
19017
  if (settled) return;
19018
19018
  settled = true;
19019
19019
  clearTimeout(timer);
19020
- resolve13(value);
19020
+ resolve14(value);
19021
19021
  };
19022
19022
  const timer = setTimeout(() => {
19023
19023
  child.kill();
@@ -19543,7 +19543,7 @@ async function waitForOperationGrantRetry(retryAt, signal) {
19543
19543
  const deadline = Date.parse(retryAt);
19544
19544
  if (!Number.isFinite(deadline) || signal.aborted) return false;
19545
19545
  if (deadline <= Date.now()) return true;
19546
- return await new Promise((resolve13) => {
19546
+ return await new Promise((resolve14) => {
19547
19547
  let settled = false;
19548
19548
  let timer;
19549
19549
  const finish = (ready) => {
@@ -19551,7 +19551,7 @@ async function waitForOperationGrantRetry(retryAt, signal) {
19551
19551
  settled = true;
19552
19552
  if (timer) clearTimeout(timer);
19553
19553
  signal.removeEventListener("abort", onAbort);
19554
- resolve13(ready);
19554
+ resolve14(ready);
19555
19555
  };
19556
19556
  const onAbort = () => finish(false);
19557
19557
  const schedule = () => {
@@ -19815,22 +19815,22 @@ var HostClient = class _HostClient {
19815
19815
  const unwindingAssignments = [...this.activeAssignments.values()];
19816
19816
  for (const cancel of this.cancels.values()) cancel(stopReason);
19817
19817
  for (const entry of this.secretGrants.values()) {
19818
- for (const resolve13 of entry.resolvers) resolve13({});
19818
+ for (const resolve14 of entry.resolvers) resolve14({});
19819
19819
  entry.resolvers = [];
19820
19820
  delete entry.value;
19821
19821
  }
19822
19822
  for (const entry of this.connectionGrants.values()) {
19823
- for (const resolve13 of entry.resolvers) resolve13([]);
19823
+ for (const resolve14 of entry.resolvers) resolve14([]);
19824
19824
  entry.resolvers = [];
19825
19825
  delete entry.value;
19826
19826
  }
19827
19827
  for (const entry of this.providerGrants.values()) {
19828
- for (const resolve13 of entry.resolvers) resolve13([]);
19828
+ for (const resolve14 of entry.resolvers) resolve14([]);
19829
19829
  entry.resolvers = [];
19830
19830
  delete entry.value;
19831
19831
  }
19832
19832
  for (const waiters of this.approvalWaiters.values()) {
19833
- for (const resolve13 of waiters.values()) resolve13({ approved: false, guidance: reason });
19833
+ for (const resolve14 of waiters.values()) resolve14({ approved: false, guidance: reason });
19834
19834
  }
19835
19835
  for (const waiters of this.agentOpWaiters.values()) {
19836
19836
  for (const waiter of waiters.values()) {
@@ -19856,9 +19856,9 @@ var HostClient = class _HostClient {
19856
19856
  let drainTimer;
19857
19857
  const drained = await Promise.race([
19858
19858
  Promise.allSettled(runs).then(() => true),
19859
- new Promise((resolve13) => {
19859
+ new Promise((resolve14) => {
19860
19860
  drainTimer = setTimeout(
19861
- () => resolve13(false),
19861
+ () => resolve14(false),
19862
19862
  this.opts.unwindTimeoutMs ?? _HostClient.DEFAULT_UNWIND_TIMEOUT_MS
19863
19863
  );
19864
19864
  drainTimer.unref?.();
@@ -19938,9 +19938,9 @@ var HostClient = class _HostClient {
19938
19938
  let frameDrainTimer;
19939
19939
  const framesDrained = await Promise.race([
19940
19940
  frameTail.then(() => true),
19941
- new Promise((resolve13) => {
19941
+ new Promise((resolve14) => {
19942
19942
  frameDrainTimer = setTimeout(
19943
- () => resolve13(false),
19943
+ () => resolve14(false),
19944
19944
  this.opts.unwindTimeoutMs ?? _HostClient.DEFAULT_UNWIND_TIMEOUT_MS
19945
19945
  );
19946
19946
  frameDrainTimer.unref?.();
@@ -20301,7 +20301,7 @@ var HostClient = class _HostClient {
20301
20301
  }
20302
20302
  const { grant } = frame;
20303
20303
  const repositoryMatches = waiter.request.operation === "repository.create" ? grant.operation === "repository.create" : waiter.request.operation === "repository.clone_created" ? grant.operation === "repository.clone_created" && grant.repositoryId === waiter.request.repositoryId : grant.operation === "repository.activate" && (waiter.request.repositoryId !== void 0 ? grant.repositoryId === waiter.request.repositoryId : grant.repository.fullName === waiter.request.fullName);
20304
- if (grant.provider !== waiter.request.provider || grant.operation !== waiter.request.operation || grant.installationId !== waiter.installationId || !repositoryMatches || Date.parse(grant.expiresAt) <= Date.now()) {
20304
+ if (grant.provider !== waiter.request.provider || grant.operation !== waiter.request.operation || grant.installationId !== waiter.installationId || !repositoryMatches || grant.expiresAt !== null && Date.parse(grant.expiresAt) <= Date.now()) {
20305
20305
  return;
20306
20306
  }
20307
20307
  clearTimeout(waiter.timer);
@@ -20442,7 +20442,7 @@ var HostClient = class _HostClient {
20442
20442
  const entry = this.secretGrants.get(key) ?? { resolvers: [] };
20443
20443
  entry.value = message.secrets;
20444
20444
  entry.expiresAt = expiresAt;
20445
- for (const resolve13 of entry.resolvers) resolve13(message.secrets);
20445
+ for (const resolve14 of entry.resolvers) resolve14(message.secrets);
20446
20446
  entry.resolvers = [];
20447
20447
  this.secretGrants.set(key, entry);
20448
20448
  return;
@@ -20473,13 +20473,13 @@ var HostClient = class _HostClient {
20473
20473
  const entry = this.connectionGrants.get(key) ?? { resolvers: [] };
20474
20474
  entry.value = message.connections;
20475
20475
  entry.expiresAt = expiresAt;
20476
- for (const resolve13 of entry.resolvers) resolve13(message.connections);
20476
+ for (const resolve14 of entry.resolvers) resolve14(message.connections);
20477
20477
  entry.resolvers = [];
20478
20478
  this.connectionGrants.set(key, entry);
20479
20479
  const providerEntry = this.providerGrants.get(key) ?? { resolvers: [] };
20480
20480
  providerEntry.value = providers;
20481
20481
  providerEntry.expiresAt = authorityExpiresAt;
20482
- for (const resolve13 of providerEntry.resolvers) resolve13(providers);
20482
+ for (const resolve14 of providerEntry.resolvers) resolve14(providers);
20483
20483
  providerEntry.resolvers = [];
20484
20484
  this.providerGrants.set(key, providerEntry);
20485
20485
  return;
@@ -20568,8 +20568,8 @@ var HostClient = class _HostClient {
20568
20568
  return redactCredentialText(text, sensitiveSnapshot()).slice(0, maxLength);
20569
20569
  };
20570
20570
  let resolveCancelled;
20571
- const cancelledPromise = new Promise((resolve13) => {
20572
- resolveCancelled = resolve13;
20571
+ const cancelledPromise = new Promise((resolve14) => {
20572
+ resolveCancelled = resolve14;
20573
20573
  });
20574
20574
  const endAuthority = (reason = "cloud_cancel") => {
20575
20575
  if (stopReason) return;
@@ -20578,21 +20578,21 @@ var HostClient = class _HostClient {
20578
20578
  authorityController.abort(reason);
20579
20579
  const secretEntry = this.secretGrants.get(cancelKey);
20580
20580
  if (secretEntry) {
20581
- for (const resolve13 of secretEntry.resolvers) resolve13({});
20581
+ for (const resolve14 of secretEntry.resolvers) resolve14({});
20582
20582
  secretEntry.resolvers = [];
20583
20583
  delete secretEntry.value;
20584
20584
  }
20585
20585
  this.secretGrants.delete(cancelKey);
20586
20586
  const connectionEntry = this.connectionGrants.get(cancelKey);
20587
20587
  if (connectionEntry) {
20588
- for (const resolve13 of connectionEntry.resolvers) resolve13([]);
20588
+ for (const resolve14 of connectionEntry.resolvers) resolve14([]);
20589
20589
  connectionEntry.resolvers = [];
20590
20590
  delete connectionEntry.value;
20591
20591
  }
20592
20592
  this.connectionGrants.delete(cancelKey);
20593
20593
  const providerEntry = this.providerGrants.get(cancelKey);
20594
20594
  if (providerEntry) {
20595
- for (const resolve13 of providerEntry.resolvers) resolve13([]);
20595
+ for (const resolve14 of providerEntry.resolvers) resolve14([]);
20596
20596
  providerEntry.resolvers = [];
20597
20597
  delete providerEntry.value;
20598
20598
  }
@@ -20600,8 +20600,8 @@ var HostClient = class _HostClient {
20600
20600
  this.clearAuthorityExpiry(cancelKey);
20601
20601
  const approvalWaiters = this.approvalWaiters.get(cancelKey);
20602
20602
  if (approvalWaiters) {
20603
- for (const resolve13 of approvalWaiters.values()) {
20604
- resolve13({ approved: false, guidance: "task was cancelled" });
20603
+ for (const resolve14 of approvalWaiters.values()) {
20604
+ resolve14({ approved: false, guidance: "task was cancelled" });
20605
20605
  }
20606
20606
  approvalWaiters.clear();
20607
20607
  }
@@ -20727,9 +20727,9 @@ var HostClient = class _HostClient {
20727
20727
  return value;
20728
20728
  };
20729
20729
  if (entry.value) return Promise.resolve(capture(entry.value));
20730
- return new Promise((resolve13) => {
20731
- entry.resolvers.push((value) => resolve13(capture(value)));
20732
- setTimeout(() => resolve13(capture(entry.value ?? {})), _HostClient.SECRETS_WAIT_MS);
20730
+ return new Promise((resolve14) => {
20731
+ entry.resolvers.push((value) => resolve14(capture(value)));
20732
+ setTimeout(() => resolve14(capture(entry.value ?? {})), _HostClient.SECRETS_WAIT_MS);
20733
20733
  });
20734
20734
  };
20735
20735
  const connections = () => {
@@ -20746,9 +20746,9 @@ var HostClient = class _HostClient {
20746
20746
  return value;
20747
20747
  };
20748
20748
  if (entry.value) return Promise.resolve(capture(entry.value));
20749
- return new Promise((resolve13) => {
20750
- entry.resolvers.push((value) => resolve13(capture(value)));
20751
- setTimeout(() => resolve13(capture(entry.value ?? [])), _HostClient.SECRETS_WAIT_MS);
20749
+ return new Promise((resolve14) => {
20750
+ entry.resolvers.push((value) => resolve14(capture(value)));
20751
+ setTimeout(() => resolve14(capture(entry.value ?? [])), _HostClient.SECRETS_WAIT_MS);
20752
20752
  });
20753
20753
  };
20754
20754
  const providers = () => {
@@ -20765,9 +20765,9 @@ var HostClient = class _HostClient {
20765
20765
  return value;
20766
20766
  };
20767
20767
  if (entry.value !== void 0) return Promise.resolve(capture(entry.value));
20768
- return new Promise((resolve13) => {
20769
- entry.resolvers.push((value) => resolve13(capture(value)));
20770
- setTimeout(() => resolve13(capture(entry.value ?? [])), _HostClient.SECRETS_WAIT_MS);
20768
+ return new Promise((resolve14) => {
20769
+ entry.resolvers.push((value) => resolve14(capture(value)));
20770
+ setTimeout(() => resolve14(capture(entry.value ?? [])), _HostClient.SECRETS_WAIT_MS);
20771
20771
  });
20772
20772
  };
20773
20773
  const linear = async () => {
@@ -20793,13 +20793,13 @@ var HostClient = class _HostClient {
20793
20793
  payload: safe(payload, 5e4),
20794
20794
  ...questionChoices ? { questionChoices: [...questionChoices] } : {}
20795
20795
  });
20796
- return new Promise((resolve13) => {
20796
+ return new Promise((resolve14) => {
20797
20797
  const waiters = this.approvalWaiters.get(cancelKey) ?? /* @__PURE__ */ new Map();
20798
20798
  this.approvalWaiters.set(cancelKey, waiters);
20799
- waiters.set(requestId, resolve13);
20799
+ waiters.set(requestId, resolve14);
20800
20800
  void cancelledPromise.then(() => {
20801
20801
  if (waiters.delete(requestId)) {
20802
- resolve13({ approved: false, guidance: "task was cancelled" });
20802
+ resolve14({ approved: false, guidance: "task was cancelled" });
20803
20803
  }
20804
20804
  });
20805
20805
  });
@@ -20837,11 +20837,11 @@ var HostClient = class _HostClient {
20837
20837
  if (existing) message = existing;
20838
20838
  else terminalMessages.set(requestId, message);
20839
20839
  }
20840
- return new Promise((resolve13) => {
20840
+ return new Promise((resolve14) => {
20841
20841
  const waiters = this.agentOpWaiters.get(cancelKey) ?? /* @__PURE__ */ new Map();
20842
20842
  this.agentOpWaiters.set(cancelKey, waiters);
20843
20843
  if (waiters.has(requestId)) {
20844
- resolve13({ ok: false, error: "provider settlement request is already in flight" });
20844
+ resolve14({ ok: false, error: "provider settlement request is already in flight" });
20845
20845
  return;
20846
20846
  }
20847
20847
  const timer = setTimeout(() => {
@@ -20852,7 +20852,7 @@ var HostClient = class _HostClient {
20852
20852
  (pending) => !(pending.type === "agent.op" && pending.requestId === requestId)
20853
20853
  );
20854
20854
  }
20855
- resolve13({
20855
+ resolve14({
20856
20856
  ok: false,
20857
20857
  error: terminal ? "The provider call completed, but Zixt could not record its outcome. Do not retry; wait for reconciliation." : "the platform did not answer in time; verify with a list_* tool before retrying a mutating call"
20858
20858
  });
@@ -20860,7 +20860,7 @@ var HostClient = class _HostClient {
20860
20860
  }, _HostClient.AGENT_OP_TIMEOUT_MS);
20861
20861
  timer.unref?.();
20862
20862
  waiters.set(requestId, {
20863
- resolve: resolve13,
20863
+ resolve: resolve14,
20864
20864
  timer,
20865
20865
  ...terminal ? { terminalMessage: message } : {}
20866
20866
  });
@@ -20906,12 +20906,12 @@ var HostClient = class _HostClient {
20906
20906
  "No GitHub change was attempted; the authority grant request was invalid."
20907
20907
  );
20908
20908
  }
20909
- const outcome = await new Promise((resolve13) => {
20909
+ const outcome = await new Promise((resolve14) => {
20910
20910
  const timer = setTimeout(() => {
20911
20911
  const waiter = this.operationGrantWaiters.get(requestId);
20912
20912
  if (!waiter) return;
20913
20913
  this.operationGrantWaiters.delete(requestId);
20914
- resolve13({ grant: null, retryable: true, reason: "no_reply_from_zixt" });
20914
+ resolve14({ grant: null, retryable: true, reason: "no_reply_from_zixt" });
20915
20915
  }, this.operationGrantTimeoutMs);
20916
20916
  timer.unref?.();
20917
20917
  this.operationGrantWaiters.set(requestId, {
@@ -20924,9 +20924,9 @@ var HostClient = class _HostClient {
20924
20924
  timer,
20925
20925
  accept: (grant) => {
20926
20926
  addSensitiveValues(providerGrantSensitiveValues(grant));
20927
- resolve13({ grant });
20927
+ resolve14({ grant });
20928
20928
  },
20929
- deny: (retryable, reason, detail, retryAt, retryCode) => resolve13({
20929
+ deny: (retryable, reason, detail, retryAt, retryCode) => resolve14({
20930
20930
  grant: null,
20931
20931
  retryable,
20932
20932
  reason,
@@ -20940,7 +20940,7 @@ var HostClient = class _HostClient {
20940
20940
  } catch {
20941
20941
  clearTimeout(timer);
20942
20942
  this.operationGrantWaiters.delete(requestId);
20943
- resolve13({ grant: null, retryable: false, reason: "connection_unavailable" });
20943
+ resolve14({ grant: null, retryable: false, reason: "connection_unavailable" });
20944
20944
  }
20945
20945
  });
20946
20946
  if (outcome.grant) {
@@ -20996,7 +20996,7 @@ var HostClient = class _HostClient {
20996
20996
  )
20997
20997
  );
20998
20998
  }
20999
- return new Promise((resolve13, reject3) => {
20999
+ return new Promise((resolve14, reject3) => {
21000
21000
  const timer = setTimeout(() => {
21001
21001
  if (this.browserCredentialWaiters.delete(requestId)) {
21002
21002
  reject3(
@@ -21015,7 +21015,7 @@ var HostClient = class _HostClient {
21015
21015
  timer,
21016
21016
  accept: (credential) => {
21017
21017
  addSensitiveValues(webLoginSensitiveValues(credential));
21018
- resolve13(credential);
21018
+ resolve14(credential);
21019
21019
  },
21020
21020
  deny: (reason) => reject3(new Error(reason))
21021
21021
  });
@@ -21313,14 +21313,14 @@ async function observeWindowsGuardianNonce(pid, nonce) {
21313
21313
  "Windows runner identity could not be observed"
21314
21314
  );
21315
21315
  }
21316
- return new Promise((resolve13, reject3) => {
21316
+ return new Promise((resolve14, reject3) => {
21317
21317
  let done = false;
21318
21318
  const finish = (result) => {
21319
21319
  if (done) return;
21320
21320
  done = true;
21321
21321
  clearTimeout(timeout);
21322
21322
  if (result instanceof Error) reject3(result);
21323
- else resolve13(result);
21323
+ else resolve14(result);
21324
21324
  };
21325
21325
  const timeout = setTimeout(
21326
21326
  () => finish(
@@ -21365,7 +21365,7 @@ async function observePosixGuardianNonce(pid, nonce) {
21365
21365
  );
21366
21366
  }
21367
21367
  }
21368
- return new Promise((resolve13, reject3) => {
21368
+ return new Promise((resolve14, reject3) => {
21369
21369
  const observer = spawn2("/bin/ps", ["-ww", "-o", "command=", "-p", String(pid)], {
21370
21370
  stdio: ["ignore", "pipe", "ignore"]
21371
21371
  });
@@ -21376,7 +21376,7 @@ async function observePosixGuardianNonce(pid, nonce) {
21376
21376
  done = true;
21377
21377
  clearTimeout(timeout);
21378
21378
  if (result instanceof Error) reject3(result);
21379
- else resolve13(result);
21379
+ else resolve14(result);
21380
21380
  };
21381
21381
  const timeout = setTimeout(() => {
21382
21382
  observer.kill("SIGKILL");
@@ -21423,7 +21423,7 @@ async function observeGuardianIdentity(pid, identity) {
21423
21423
  return process.platform === "win32" ? observeWindowsGuardianNonce(pid, identity.nonce) : observePosixGuardianNonce(pid, identity.nonce);
21424
21424
  }
21425
21425
  function delay(ms) {
21426
- return new Promise((resolve13) => setTimeout(resolve13, ms));
21426
+ return new Promise((resolve14) => setTimeout(resolve14, ms));
21427
21427
  }
21428
21428
  function posixProcessRecordsFromPs(output) {
21429
21429
  const records = [];
@@ -21456,7 +21456,7 @@ function posixProcessRecordsFromPs(output) {
21456
21456
  return records;
21457
21457
  }
21458
21458
  async function snapshotPosixProcesses() {
21459
- return new Promise((resolve13, reject3) => {
21459
+ return new Promise((resolve14, reject3) => {
21460
21460
  const observer = spawn2("/bin/ps", ["-axo", "uid=,pid=,ppid=,pgid=,stat="], {
21461
21461
  stdio: ["ignore", "pipe", "ignore"]
21462
21462
  });
@@ -21469,7 +21469,7 @@ async function snapshotPosixProcesses() {
21469
21469
  if (error52) reject3(error52);
21470
21470
  else {
21471
21471
  try {
21472
- resolve13(posixProcessRecordsFromPs(output));
21472
+ resolve14(posixProcessRecordsFromPs(output));
21473
21473
  } catch (caught) {
21474
21474
  reject3(caught);
21475
21475
  }
@@ -21804,7 +21804,7 @@ async function snapshotWindowsDescendants(rootPid) {
21804
21804
  "Windows process-tree observation could not start"
21805
21805
  );
21806
21806
  }
21807
- return new Promise((resolve13, reject3) => {
21807
+ return new Promise((resolve14, reject3) => {
21808
21808
  let done = false;
21809
21809
  const timeout = setTimeout(() => {
21810
21810
  if (done) return;
@@ -21831,7 +21831,7 @@ async function snapshotWindowsDescendants(rootPid) {
21831
21831
  return;
21832
21832
  }
21833
21833
  try {
21834
- resolve13(completeWindowsDescendantPids(rootPid, processes));
21834
+ resolve14(completeWindowsDescendantPids(rootPid, processes));
21835
21835
  } catch (caught) {
21836
21836
  reject3(caught);
21837
21837
  }
@@ -21878,7 +21878,7 @@ async function waitForProcessesExit(pids, timeoutMs) {
21878
21878
  }
21879
21879
  async function runTaskkill(pid, command, timeoutMs = TASKKILL_TIMEOUT_MS, independentlyTrackedPids = []) {
21880
21880
  const trustedCommand = command ?? defaultTaskkillCommand();
21881
- const result = await new Promise((resolve13, reject3) => {
21881
+ const result = await new Promise((resolve14, reject3) => {
21882
21882
  const killer = spawn2(trustedCommand, ["/PID", String(pid), "/T", "/F"], {
21883
21883
  stdio: ["ignore", "pipe", "pipe"],
21884
21884
  windowsHide: true
@@ -21913,7 +21913,7 @@ async function runTaskkill(pid, command, timeoutMs = TASKKILL_TIMEOUT_MS, indepe
21913
21913
  done = true;
21914
21914
  clearTimeout(timeout);
21915
21915
  if (error52) reject3(error52);
21916
- else resolve13({ code: killer.exitCode, output, outputTruncated });
21916
+ else resolve14({ code: killer.exitCode, output, outputTruncated });
21917
21917
  };
21918
21918
  killer.once(
21919
21919
  "error",
@@ -22590,12 +22590,12 @@ async function createWindowsJobContainment(pid, options) {
22590
22590
  stderr = `${stderr}${String(chunk)}`.slice(-HELPER_OUTPUT_LIMIT);
22591
22591
  });
22592
22592
  const helperEvents = helper;
22593
- const exited = new Promise((resolve13) => {
22593
+ const exited = new Promise((resolve14) => {
22594
22594
  let completed = false;
22595
22595
  const complete = (code, signal) => {
22596
22596
  if (completed) return;
22597
22597
  completed = true;
22598
- resolve13({ code, signal });
22598
+ resolve14({ code, signal });
22599
22599
  };
22600
22600
  helperEvents.once("error", () => {
22601
22601
  failProtocol(new Error("Windows Job Object helper could not start"));
@@ -22608,7 +22608,7 @@ async function createWindowsJobContainment(pid, options) {
22608
22608
  });
22609
22609
  const nextLine = async (expected) => {
22610
22610
  if (protocolFailure) throw protocolFailure;
22611
- const line = lines.shift() ?? await new Promise((resolve13, reject3) => {
22611
+ const line = lines.shift() ?? await new Promise((resolve14, reject3) => {
22612
22612
  const timer = setTimeout(
22613
22613
  () => reject3(timeoutError("Windows Job Object helper did not answer in time")),
22614
22614
  timeoutMs
@@ -22616,7 +22616,7 @@ async function createWindowsJobContainment(pid, options) {
22616
22616
  timer.unref?.();
22617
22617
  lineWaiters.push((value) => {
22618
22618
  clearTimeout(timer);
22619
- resolve13(value);
22619
+ resolve14(value);
22620
22620
  });
22621
22621
  });
22622
22622
  if (protocolFailure) throw protocolFailure;
@@ -22629,8 +22629,8 @@ async function createWindowsJobContainment(pid, options) {
22629
22629
  }
22630
22630
  const stopped = await Promise.race([
22631
22631
  exited.then(() => true),
22632
- new Promise((resolve13) => {
22633
- const timer = setTimeout(() => resolve13(false), timeoutMs);
22632
+ new Promise((resolve14) => {
22633
+ const timer = setTimeout(() => resolve14(false), timeoutMs);
22634
22634
  timer.unref?.();
22635
22635
  })
22636
22636
  ]);
@@ -22689,7 +22689,7 @@ async function awaitWindowsContainmentGate(env = process.env, input = process.st
22689
22689
  if (nonce === void 0) return true;
22690
22690
  if (!SAFE_NONCE2.test(nonce)) return false;
22691
22691
  const expected = windowsContainmentGate(nonce).trimEnd();
22692
- return new Promise((resolve13) => {
22692
+ return new Promise((resolve14) => {
22693
22693
  let pending = Buffer.alloc(0);
22694
22694
  let settled = false;
22695
22695
  const finish = (result) => {
@@ -22700,7 +22700,7 @@ async function awaitWindowsContainmentGate(env = process.env, input = process.st
22700
22700
  input.off("end", onEnd);
22701
22701
  input.off("error", onEnd);
22702
22702
  if (result) input.pause();
22703
- resolve13(result);
22703
+ resolve14(result);
22704
22704
  };
22705
22705
  const onData = (chunk) => {
22706
22706
  pending = Buffer.concat([pending, chunk]);
@@ -23125,7 +23125,7 @@ async function installRelease(version2, options = {}) {
23125
23125
  installerContainmentSetupError = error52;
23126
23126
  return null;
23127
23127
  }) : Promise.resolve(null);
23128
- const installed = await new Promise((resolve13, reject3) => {
23128
+ const installed = await new Promise((resolve14, reject3) => {
23129
23129
  let finished = false;
23130
23130
  let cleanupStarted = false;
23131
23131
  let exitObserved = false;
@@ -23141,7 +23141,7 @@ async function installRelease(version2, options = {}) {
23141
23141
  finished = true;
23142
23142
  clearTimeout(timer);
23143
23143
  options.signal?.removeEventListener("abort", requestCleanup);
23144
- resolve13(result);
23144
+ resolve14(result);
23145
23145
  };
23146
23146
  const requestCleanup = () => {
23147
23147
  if (cleanupStarted || finished) return;
@@ -23454,11 +23454,11 @@ async function runWorkerCompatibilityProxy(env = process.env, argv = process.arg
23454
23454
  child.stdin?.on("error", () => {
23455
23455
  });
23456
23456
  process.stdin.pipe(child.stdin);
23457
- return new Promise((resolve13) => {
23458
- child.once("error", () => resolve13(1));
23457
+ return new Promise((resolve14) => {
23458
+ child.once("error", () => resolve14(1));
23459
23459
  child.once("exit", (code) => {
23460
23460
  process.stdin.unpipe(child.stdin);
23461
- resolve13(code ?? 1);
23461
+ resolve14(code ?? 1);
23462
23462
  });
23463
23463
  });
23464
23464
  }
@@ -23536,11 +23536,11 @@ async function launchHostSupervisor(options = {}) {
23536
23536
  const waitOrStop = async (ms) => {
23537
23537
  if (stopping) return false;
23538
23538
  if (!customDelay) {
23539
- await new Promise((resolve13) => {
23539
+ await new Promise((resolve14) => {
23540
23540
  const finish = () => {
23541
23541
  clearTimeout(timer);
23542
23542
  stopController.signal.removeEventListener("abort", finish);
23543
- resolve13();
23543
+ resolve14();
23544
23544
  };
23545
23545
  const timer = setTimeout(finish, ms);
23546
23546
  stopController.signal.addEventListener("abort", finish, { once: true });
@@ -23548,8 +23548,8 @@ async function launchHostSupervisor(options = {}) {
23548
23548
  return !stopping;
23549
23549
  }
23550
23550
  let finishStop;
23551
- const stopped = new Promise((resolve13) => {
23552
- finishStop = () => resolve13();
23551
+ const stopped = new Promise((resolve14) => {
23552
+ finishStop = () => resolve14();
23553
23553
  stopController.signal.addEventListener("abort", finishStop, { once: true });
23554
23554
  });
23555
23555
  await Promise.race([customDelay(ms), stopped]);
@@ -23672,19 +23672,19 @@ async function launchHostSupervisor(options = {}) {
23672
23672
  child = spawnSupervisor(entry, version2, ownershipDirectory, containmentGateNonce);
23673
23673
  const launchedSupervisor = child;
23674
23674
  let resolveChildExited;
23675
- const childExited = new Promise((resolve13) => {
23676
- resolveChildExited = resolve13;
23675
+ const childExited = new Promise((resolve14) => {
23676
+ resolveChildExited = resolve14;
23677
23677
  });
23678
23678
  const supervisorContainmentAbort = new AbortController();
23679
23679
  void childExited.then(() => supervisorContainmentAbort.abort());
23680
23680
  const outcomePromise = new Promise(
23681
- (resolve13) => {
23681
+ (resolve14) => {
23682
23682
  let observed = false;
23683
23683
  const finish = (code, signal) => {
23684
23684
  if (observed) return;
23685
23685
  observed = true;
23686
23686
  resolveChildExited();
23687
- resolve13({ code, signal });
23687
+ resolve14({ code, signal });
23688
23688
  };
23689
23689
  child.once("error", () => finish(1, null));
23690
23690
  child.once("exit", finish);
@@ -23705,12 +23705,12 @@ async function launchHostSupervisor(options = {}) {
23705
23705
  if (!supervisorContainment || !launchedSupervisor.stdin) {
23706
23706
  throw new Error("supervisor Job Object gate is unavailable");
23707
23707
  }
23708
- await new Promise((resolve13, reject3) => {
23708
+ await new Promise((resolve14, reject3) => {
23709
23709
  launchedSupervisor.stdin.write(
23710
23710
  windowsContainmentGate(containmentGateNonce),
23711
23711
  (error52) => {
23712
23712
  if (error52) reject3(error52);
23713
- else resolve13();
23713
+ else resolve14();
23714
23714
  }
23715
23715
  );
23716
23716
  });
@@ -23852,18 +23852,18 @@ async function superviseHost(options = {}) {
23852
23852
  }
23853
23853
  }
23854
23854
  let announceShutdown;
23855
- const shutdownAnnounced = new Promise((resolve13) => {
23856
- announceShutdown = resolve13;
23855
+ const shutdownAnnounced = new Promise((resolve14) => {
23856
+ announceShutdown = resolve14;
23857
23857
  });
23858
23858
  const attempted = /* @__PURE__ */ new Set();
23859
23859
  const waitOrShutdown = async (ms) => {
23860
23860
  if (shuttingDown2) return false;
23861
23861
  if (!customDelay) {
23862
- await new Promise((resolve13) => {
23862
+ await new Promise((resolve14) => {
23863
23863
  const finish = () => {
23864
23864
  clearTimeout(timer);
23865
23865
  shutdownController.signal.removeEventListener("abort", finish);
23866
- resolve13();
23866
+ resolve14();
23867
23867
  };
23868
23868
  const timer = setTimeout(finish, ms);
23869
23869
  shutdownController.signal.addEventListener("abort", finish, { once: true });
@@ -24006,19 +24006,19 @@ async function superviseHost(options = {}) {
24006
24006
  child = spawnWorker(command, watchdogLaunch, compatibilityOwnership, containmentGateNonce);
24007
24007
  const watchedChild = child;
24008
24008
  let resolveChildExited;
24009
- const childExited = new Promise((resolve13) => {
24010
- resolveChildExited = resolve13;
24009
+ const childExited = new Promise((resolve14) => {
24010
+ resolveChildExited = resolve14;
24011
24011
  });
24012
24012
  const workerContainmentAbort = new AbortController();
24013
24013
  void childExited.then(() => workerContainmentAbort.abort());
24014
24014
  const outcomePromise = new Promise(
24015
- (resolve13) => {
24015
+ (resolve14) => {
24016
24016
  let observed = false;
24017
24017
  const finish = (result) => {
24018
24018
  if (observed) return;
24019
24019
  observed = true;
24020
24020
  resolveChildExited();
24021
- resolve13(result);
24021
+ resolve14(result);
24022
24022
  };
24023
24023
  watchedChild.once("error", () => finish({ code: 1, signal: null }));
24024
24024
  watchedChild.once(
@@ -24040,10 +24040,10 @@ async function superviseHost(options = {}) {
24040
24040
  if (!workerContainment || !watchedChild.stdin) {
24041
24041
  throw new Error("worker Job Object gate is unavailable");
24042
24042
  }
24043
- await new Promise((resolve13, reject3) => {
24043
+ await new Promise((resolve14, reject3) => {
24044
24044
  watchedChild.stdin.write(windowsContainmentGate(containmentGateNonce), (error52) => {
24045
24045
  if (error52) reject3(error52);
24046
- else resolve13();
24046
+ else resolve14();
24047
24047
  });
24048
24048
  });
24049
24049
  }
@@ -25231,7 +25231,7 @@ import { spawn as spawn8 } from "node:child_process";
25231
25231
  import { randomUUID as randomUUID10 } from "node:crypto";
25232
25232
  import { lstat as lstat9, mkdir as mkdir10, realpath as realpath7 } from "node:fs/promises";
25233
25233
  import { homedir as homedir4 } from "node:os";
25234
- import { dirname as dirname6, join as join14 } from "node:path";
25234
+ import { dirname as dirname6, isAbsolute as isAbsolute13, join as join14, resolve as resolve7 } from "node:path";
25235
25235
 
25236
25236
  // src/tool-packs/browser/tool-definitions.ts
25237
25237
  function definition(name, description, properties, required2 = []) {
@@ -27463,7 +27463,7 @@ function parseArgs(raw) {
27463
27463
  }
27464
27464
  function validateOperationGrant(value, input) {
27465
27465
  const parsed = GithubOperationGrant.parse(value);
27466
- if (parsed.operation !== input.operation || parsed.installationId !== input.installationId || Date.parse(parsed.expiresAt) <= input.now.getTime()) {
27466
+ if (parsed.operation !== input.operation || parsed.installationId !== input.installationId || parsed.expiresAt !== null && Date.parse(parsed.expiresAt) <= input.now.getTime()) {
27467
27467
  throw new GithubInputError("GitHub operation grant does not match this task");
27468
27468
  }
27469
27469
  if (input.operation === "repository.clone_created" && (parsed.operation !== "repository.clone_created" || parsed.repositoryId !== input.repositoryId)) {
@@ -28282,8 +28282,8 @@ async function runGit(input, args, env) {
28282
28282
  let settled = false;
28283
28283
  let stopping = false;
28284
28284
  let resolveExited;
28285
- const exited = new Promise((resolve13) => {
28286
- resolveExited = resolve13;
28285
+ const exited = new Promise((resolve14) => {
28286
+ resolveExited = resolve14;
28287
28287
  });
28288
28288
  child.once("exit", resolveExited);
28289
28289
  const cleanup = () => {
@@ -29546,7 +29546,7 @@ function createGithubToolPackFactory(options = {}) {
29546
29546
  stage = "checking the repository credentials Zixt returned";
29547
29547
  if (operationGrant.operation !== "repository.activate" || operationGrant.installationId !== grant.installationId || operationGrant.operations.some(
29548
29548
  (operation) => !locallySupportedOperations.has(operation)
29549
- ) || Date.parse(operationGrant.expiresAt) <= now().getTime() || selector.repositoryId !== void 0 && operationGrant.repositoryId !== selector.repositoryId || selector.fullName !== void 0 && operationGrant.repository.fullName !== selector.fullName) {
29549
+ ) || operationGrant.expiresAt !== null && Date.parse(operationGrant.expiresAt) <= now().getTime() || selector.repositoryId !== void 0 && operationGrant.repositoryId !== selector.repositoryId || selector.fullName !== void 0 && operationGrant.repository.fullName !== selector.fullName) {
29550
29550
  return { ok: false, error: "GitHub returned invalid repository authority." };
29551
29551
  }
29552
29552
  const [owner] = operationGrant.repository.fullName.split("/");
@@ -30771,8 +30771,8 @@ var linearToolPackFactory = {
30771
30771
  async create(grant, context) {
30772
30772
  let resolveCancelled;
30773
30773
  let closed = false;
30774
- const cancelled = new Promise((resolve13) => {
30775
- resolveCancelled = resolve13;
30774
+ const cancelled = new Promise((resolve14) => {
30775
+ resolveCancelled = resolve14;
30776
30776
  });
30777
30777
  const cancel = () => {
30778
30778
  if (closed) return;
@@ -31386,7 +31386,7 @@ function createAskUserServer() {
31386
31386
  let server;
31387
31387
  let listening;
31388
31388
  function ensureListening() {
31389
- listening ??= new Promise((resolve13, reject3) => {
31389
+ listening ??= new Promise((resolve14, reject3) => {
31390
31390
  server = createServer2((req, res) => {
31391
31391
  res.on("error", () => {
31392
31392
  });
@@ -31402,7 +31402,7 @@ function createAskUserServer() {
31402
31402
  server.on("error", reject3);
31403
31403
  server.listen(0, "127.0.0.1", () => {
31404
31404
  const address = server.address();
31405
- if (address && typeof address === "object") resolve13(address.port);
31405
+ if (address && typeof address === "object") resolve14(address.port);
31406
31406
  else reject3(new Error("ask_user server failed to bind"));
31407
31407
  });
31408
31408
  server.unref();
@@ -32066,6 +32066,7 @@ function credentialFromTaskGrant(grant, allowed) {
32066
32066
  return { accessToken: grant.accessToken, expiresAt };
32067
32067
  }
32068
32068
  function activationCredential(grant, now = Date.now()) {
32069
+ if (grant.expiresAt === null) return { accessToken: grant.accessToken, expiresAt: null };
32069
32070
  const expiresAt = new Date(grant.expiresAt);
32070
32071
  return expiresAt.getTime() <= now ? null : { accessToken: grant.accessToken, expiresAt };
32071
32072
  }
@@ -32170,7 +32171,7 @@ async function createGithubShellAuth(input) {
32170
32171
  const refreshes = /* @__PURE__ */ new Map();
32171
32172
  const liveOperationActivation = (repositoryId2) => {
32172
32173
  const candidates = (input.operationGrants?.() ?? []).filter(
32173
- (grant) => grant.operation === "repository.activate" && grant.installationId === input.initialGrant.installationId && grant.repositoryId === repositoryId2 && Date.parse(grant.expiresAt) > now()
32174
+ (grant) => grant.operation === "repository.activate" && grant.installationId === input.initialGrant.installationId && grant.repositoryId === repositoryId2 && (grant.expiresAt === null || Date.parse(grant.expiresAt) > now())
32174
32175
  );
32175
32176
  return candidates.at(-1) ?? null;
32176
32177
  };
@@ -32714,18 +32715,26 @@ async function repositoryState(directory, git, env, signal) {
32714
32715
  };
32715
32716
  }
32716
32717
  async function collectWorkingContext(input) {
32717
- const directories = [
32718
+ const fixedDirectories = [
32718
32719
  { path: input.workingDirectory, kind: "working" }
32719
32720
  ];
32720
32721
  if (input.preparedWorkspace && input.preparedWorkspace.path !== input.workingDirectory) {
32721
- directories.push({ path: input.preparedWorkspace.path, kind: "repository" });
32722
+ fixedDirectories.push({ path: input.preparedWorkspace.path, kind: "repository" });
32722
32723
  }
32724
+ const candidateDirectories = [
32725
+ .../* @__PURE__ */ new Set([...input.observedDirectories ?? [], ...fixedDirectories.map(({ path }) => path)])
32726
+ ].slice(0, 20);
32723
32727
  const repositories = (await Promise.all(
32724
- directories.map(({ path }) => repositoryState(path, input.git, input.env, input.signal))
32728
+ candidateDirectories.map((path) => repositoryState(path, input.git, input.env, input.signal))
32725
32729
  )).filter((repository) => repository !== null);
32726
32730
  const uniqueRepositories = [
32727
32731
  ...new Map(repositories.map((repository) => [repository.root, repository])).values()
32728
- ];
32732
+ ].slice(0, 20);
32733
+ const fixedPaths = new Set(fixedDirectories.map(({ path }) => path));
32734
+ const directories = [
32735
+ ...fixedDirectories,
32736
+ ...uniqueRepositories.filter(({ root }) => !fixedPaths.has(root)).map(({ root }) => ({ path: root, kind: "repository" }))
32737
+ ].slice(0, 20);
32729
32738
  return TaskWorkingContextObservation.parse({
32730
32739
  workingDirectory: input.workingDirectory,
32731
32740
  directories,
@@ -33769,6 +33778,8 @@ function createCliRunner(adapter, opts = {}) {
33769
33778
  ${attachmentSection}` : prompt;
33770
33779
  let activeWorkingContextReport = null;
33771
33780
  let previousWorkingContext = "";
33781
+ const observedWorkingDirectories = /* @__PURE__ */ new Set();
33782
+ let observedPathRefreshPending = false;
33772
33783
  const workingContextAbort = new AbortController();
33773
33784
  const abortWorkingContext = () => workingContextAbort.abort();
33774
33785
  task.authoritySignal.addEventListener("abort", abortWorkingContext, { once: true });
@@ -33780,6 +33791,7 @@ ${attachmentSection}` : prompt;
33780
33791
  activeWorkingContextReport = collectWorkingContext({
33781
33792
  workingDirectory: cwd,
33782
33793
  preparedWorkspace,
33794
+ observedDirectories: [...observedWorkingDirectories].reverse(),
33783
33795
  git,
33784
33796
  env: workingContextEnvironments.git,
33785
33797
  signal: workingContextAbort.signal
@@ -33800,9 +33812,36 @@ ${attachmentSection}` : prompt;
33800
33812
  if (options.required) throw error52;
33801
33813
  }).finally(() => {
33802
33814
  activeWorkingContextReport = null;
33815
+ if (observedPathRefreshPending && !task.cancelledNow() && !workingContextAbort.signal.aborted) {
33816
+ observedPathRefreshPending = false;
33817
+ void reportWorkingContext({ forceReport: true });
33818
+ }
33803
33819
  });
33804
33820
  return activeWorkingContextReport;
33805
33821
  };
33822
+ const observeLocalPaths = (paths) => {
33823
+ if (!git.available) return;
33824
+ let changed = false;
33825
+ for (const path of paths) {
33826
+ if (!path || path.length > 4096) continue;
33827
+ const absolutePath = isAbsolute13(path) ? path : resolve7(cwd, path);
33828
+ const directory = dirname6(absolutePath);
33829
+ observedWorkingDirectories.delete(directory);
33830
+ observedWorkingDirectories.add(directory);
33831
+ while (observedWorkingDirectories.size > 19) {
33832
+ const oldest = observedWorkingDirectories.values().next().value;
33833
+ if (oldest === void 0) break;
33834
+ observedWorkingDirectories.delete(oldest);
33835
+ }
33836
+ changed = true;
33837
+ }
33838
+ if (!changed) return;
33839
+ if (activeWorkingContextReport) {
33840
+ observedPathRefreshPending = true;
33841
+ return;
33842
+ }
33843
+ void reportWorkingContext({ forceReport: true });
33844
+ };
33806
33845
  await reportWorkingContext({
33807
33846
  forcePullRequest: true,
33808
33847
  forceReport: true,
@@ -33887,7 +33926,18 @@ ${attachmentSection}` : prompt;
33887
33926
  clockPaused: () => pendingAsks > 0,
33888
33927
  cancelled: task.cancelled,
33889
33928
  cancelledNow: task.cancelledNow,
33890
- onStream: (kind, summary, detail) => task.event(kind, summary, detail),
33929
+ onStream: (kind, summary, detail) => {
33930
+ if (detail?.localPaths?.length) observeLocalPaths(detail.localPaths);
33931
+ if (!detail) {
33932
+ task.event(kind, summary);
33933
+ return;
33934
+ }
33935
+ task.event(kind, summary, {
33936
+ ...detail.tool ? { tool: detail.tool } : {},
33937
+ ...detail.parameter ? { parameter: detail.parameter } : {},
33938
+ ...detail.ephemeral === void 0 ? {} : { ephemeral: detail.ephemeral }
33939
+ });
33940
+ },
33891
33941
  createParser: prepared.createParser,
33892
33942
  notFoundMessage: adapter.notFoundMessage,
33893
33943
  cliLabel: adapter.type,
@@ -34196,7 +34246,7 @@ function runCliProcess(options) {
34196
34246
  usage: { inputTokens: 0, outputTokens: 0 }
34197
34247
  });
34198
34248
  }
34199
- return new Promise((resolve13) => {
34249
+ return new Promise((resolve14) => {
34200
34250
  const platform = options.platform ?? process.platform;
34201
34251
  const containmentGateNonce = options.guardian && platform === "win32" ? randomUUID10() : void 0;
34202
34252
  const child = options.guardian ? spawn8(
@@ -34253,7 +34303,7 @@ function runCliProcess(options) {
34253
34303
  if (settled) return;
34254
34304
  settled = true;
34255
34305
  clearInterval(timer);
34256
- resolve13(result);
34306
+ resolve14(result);
34257
34307
  };
34258
34308
  const terminate = (result) => {
34259
34309
  if (settled || forcedResult) return;
@@ -34562,7 +34612,7 @@ async function readCodexSessionRuntime(input) {
34562
34612
  }
34563
34613
  var codexCatalogCache = /* @__PURE__ */ new Map();
34564
34614
  async function loadCodexModelCatalog(command, prefixArgs, env) {
34565
- const output = await new Promise((resolve13) => {
34615
+ const output = await new Promise((resolve14) => {
34566
34616
  const child = spawnCli(command, [...prefixArgs, "debug", "models"], {
34567
34617
  stdio: ["ignore", "pipe", "ignore"],
34568
34618
  windowsHide: true,
@@ -34577,7 +34627,7 @@ async function loadCodexModelCatalog(command, prefixArgs, env) {
34577
34627
  if (settled) return;
34578
34628
  settled = true;
34579
34629
  clearTimeout(timer);
34580
- resolve13(value);
34630
+ resolve14(value);
34581
34631
  };
34582
34632
  const timer = setTimeout(() => {
34583
34633
  child.kill();
@@ -34680,8 +34730,8 @@ function createRuntimeReporter(input, sessionId) {
34680
34730
  var EFFORT_READ_ATTEMPTS = 5;
34681
34731
  var EFFORT_READ_INTERVAL_MS = 3e3;
34682
34732
  function delay2(ms) {
34683
- return new Promise((resolve13) => {
34684
- const timer = setTimeout(resolve13, ms);
34733
+ return new Promise((resolve14) => {
34734
+ const timer = setTimeout(resolve14, ms);
34685
34735
  timer.unref?.();
34686
34736
  });
34687
34737
  }
@@ -34774,10 +34824,12 @@ function createStreamParser(onStream, hooks = {}) {
34774
34824
  const tool = String(block["name"]).slice(0, 200);
34775
34825
  const parameter = String(target).slice(0, 2e3);
34776
34826
  const shortParameter = parameter.slice(0, 100);
34827
+ const localPath = typeof input?.["file_path"] === "string" ? input["file_path"] : null;
34777
34828
  onStream("action", `${tool}${shortParameter ? `: ${shortParameter}` : ""}`, {
34778
34829
  tool,
34779
34830
  ...parameter ? { parameter } : {},
34780
- ephemeral: true
34831
+ ephemeral: true,
34832
+ ...localPath ? { localPaths: [localPath] } : {}
34781
34833
  });
34782
34834
  }
34783
34835
  }
@@ -35006,8 +35058,8 @@ ${prompt2}` : prompt2;
35006
35058
  var RUNTIME_READ_ATTEMPTS = 5;
35007
35059
  var RUNTIME_READ_INTERVAL_MS = 2e3;
35008
35060
  function delay3(ms) {
35009
- return new Promise((resolve13) => {
35010
- const timer = setTimeout(resolve13, ms);
35061
+ return new Promise((resolve14) => {
35062
+ const timer = setTimeout(resolve14, ms);
35011
35063
  timer.unref?.();
35012
35064
  });
35013
35065
  }
@@ -35082,7 +35134,8 @@ function createCodexStreamParser(onStream, hooks = {}) {
35082
35134
  onStream("action", `file_change${parameter ? `: ${parameter.slice(0, 100)}` : ""}`, {
35083
35135
  tool: "file_change",
35084
35136
  ...parameter ? { parameter } : {},
35085
- ephemeral: true
35137
+ ephemeral: true,
35138
+ ...changes.length > 0 ? { localPaths: changes } : {}
35086
35139
  });
35087
35140
  } else if (itemType === "error") {
35088
35141
  if (typeof item["message"] === "string") lastError = item["message"];
@@ -35177,7 +35230,7 @@ function improveCodexErrorMessage(error52) {
35177
35230
  // src/runners/git-preflight.ts
35178
35231
  import { spawn as spawn9 } from "node:child_process";
35179
35232
  import { realpath as realpath9 } from "node:fs/promises";
35180
- import { isAbsolute as isAbsolute13, resolve as resolve7 } from "node:path";
35233
+ import { isAbsolute as isAbsolute14, resolve as resolve8 } from "node:path";
35181
35234
  var OUTPUT_LIMIT = 8192;
35182
35235
  var DEFAULT_TIMEOUT_MS4 = 1e4;
35183
35236
  var VERSION_PATTERN = /^git version [^\r\n]{1,108}$/;
@@ -35193,10 +35246,10 @@ function unavailable(error52, checkedAt, executablePath = null) {
35193
35246
  async function preflightGit(options = {}) {
35194
35247
  const checkedAt = (options.now?.() ?? /* @__PURE__ */ new Date()).toISOString();
35195
35248
  const configured = options.command;
35196
- if (configured !== void 0 && !isAbsolute13(configured)) {
35249
+ if (configured !== void 0 && !isAbsolute14(configured)) {
35197
35250
  return unavailable("configured git command must be an absolute file", checkedAt);
35198
35251
  }
35199
- const trustedCwd = await realpath9(resolve7(options.trustedCwd ?? process.cwd())).catch(() => null);
35252
+ const trustedCwd = await realpath9(resolve8(options.trustedCwd ?? process.cwd())).catch(() => null);
35200
35253
  if (!trustedCwd)
35201
35254
  return unavailable("Host-owned git preflight directory is unavailable", checkedAt);
35202
35255
  const executablePath = await resolveTrustedCliCommand(configured ?? "git", {
@@ -35418,7 +35471,7 @@ function parseAuth(result) {
35418
35471
  return "unknown";
35419
35472
  }
35420
35473
  function run2(command, args) {
35421
- return new Promise((resolve13) => {
35474
+ return new Promise((resolve14) => {
35422
35475
  const child = spawnCli(command, args, {
35423
35476
  stdio: ["ignore", "pipe", "pipe"],
35424
35477
  windowsHide: true
@@ -35434,7 +35487,7 @@ function run2(command, args) {
35434
35487
  if (settled) return;
35435
35488
  settled = true;
35436
35489
  clearTimeout(timeout);
35437
- resolve13(result);
35490
+ resolve14(result);
35438
35491
  };
35439
35492
  const timeout = setTimeout(() => {
35440
35493
  child.kill();
@@ -35450,7 +35503,7 @@ import { spawn as spawn10 } from "node:child_process";
35450
35503
  import { constants as constants2 } from "node:fs";
35451
35504
  import { access as access4, chmod as chmod7, mkdir as mkdir12, open as open6, rename as rename5, rm as rm7 } from "node:fs/promises";
35452
35505
  import { homedir as homedir7, userInfo } from "node:os";
35453
- import { basename as basename3, dirname as dirname7, join as join17, relative as relative8, resolve as resolve8, sep as sep4 } from "node:path";
35506
+ import { basename as basename3, dirname as dirname7, join as join17, relative as relative8, resolve as resolve9, sep as sep4 } from "node:path";
35454
35507
  var SERVICE_NAME = "zixt-host.service";
35455
35508
  var SYSTEM_SERVICE_COMMAND_TIMEOUT_MS = 7e4;
35456
35509
  var SERVICE_STABILITY_DELAY_MS = 2e3;
@@ -35478,7 +35531,7 @@ function boundedAppend(current, chunk) {
35478
35531
  }
35479
35532
  async function defaultRunCommand(command, args) {
35480
35533
  const commandEnvironment3 = systemServiceCommandEnvironment();
35481
- return new Promise((resolve13) => {
35534
+ return new Promise((resolve14) => {
35482
35535
  const child = spawn10(command, [...args], {
35483
35536
  stdio: ["ignore", "pipe", "pipe"],
35484
35537
  env: commandEnvironment3,
@@ -35492,7 +35545,7 @@ async function defaultRunCommand(command, args) {
35492
35545
  if (settled) return;
35493
35546
  settled = true;
35494
35547
  if (timer) clearTimeout(timer);
35495
- resolve13(result);
35548
+ resolve14(result);
35496
35549
  };
35497
35550
  child.stdout?.on("data", (chunk) => {
35498
35551
  stdout = boundedAppend(stdout, chunk);
@@ -35548,8 +35601,8 @@ async function defaultSyncDirectory(path) {
35548
35601
  async function ensureDirectory(path, mode, syncDirectory7) {
35549
35602
  const firstCreated = await mkdir12(path, { recursive: true, mode });
35550
35603
  if (!firstCreated) return;
35551
- const first = resolve8(firstCreated);
35552
- const target = resolve8(path);
35604
+ const first = resolve9(firstCreated);
35605
+ const target = resolve9(path);
35553
35606
  await syncDirectory7(dirname7(first));
35554
35607
  let current = first;
35555
35608
  const descendants = relative8(first, target);
@@ -35623,7 +35676,7 @@ async function installLinuxService(options) {
35623
35676
  const resolveCommand = options.resolveCommand ?? defaultResolveCommand;
35624
35677
  const run3 = options.runCommand ?? defaultRunCommand;
35625
35678
  const syncDirectory7 = options.syncDirectory ?? defaultSyncDirectory;
35626
- const stabilityDelay = options.delay ?? ((ms) => new Promise((resolve13) => setTimeout(resolve13, ms)));
35679
+ const stabilityDelay = options.delay ?? ((ms) => new Promise((resolve14) => setTimeout(resolve14, ms)));
35627
35680
  const [systemctl, loginctl] = await Promise.all([
35628
35681
  resolveCommand("systemctl"),
35629
35682
  resolveCommand("loginctl")
@@ -35738,7 +35791,7 @@ import { spawn as spawn11 } from "node:child_process";
35738
35791
  import { constants as constants3 } from "node:fs";
35739
35792
  import { access as access5, chmod as chmod8, mkdir as mkdir13, open as open7, rename as rename6, rm as rm8 } from "node:fs/promises";
35740
35793
  import { homedir as homedir8, userInfo as userInfo2 } from "node:os";
35741
- import { basename as basename4, dirname as dirname8, join as join18, relative as relative9, resolve as resolve9, sep as sep5 } from "node:path";
35794
+ import { basename as basename4, dirname as dirname8, join as join18, relative as relative9, resolve as resolve10, sep as sep5 } from "node:path";
35742
35795
  var LAUNCH_AGENT_LABEL = "ai.zixt.host";
35743
35796
  var SERVICE_STABILITY_DELAY_MS2 = 2e3;
35744
35797
  var COMMAND_TIMEOUT_MS2 = 7e4;
@@ -35764,8 +35817,8 @@ async function syncDirectory4(path) {
35764
35817
  async function ensureDirectory2(path, sync) {
35765
35818
  const firstCreated = await mkdir13(path, { recursive: true, mode: 448 });
35766
35819
  if (!firstCreated) return;
35767
- const first = resolve9(firstCreated);
35768
- const target = resolve9(path);
35820
+ const first = resolve10(firstCreated);
35821
+ const target = resolve10(path);
35769
35822
  await sync(dirname8(first));
35770
35823
  let current = first;
35771
35824
  for (const part of relative9(first, target).split(sep5).filter(Boolean)) {
@@ -35969,7 +36022,7 @@ import { spawn as spawn12 } from "node:child_process";
35969
36022
  import { constants as constants4 } from "node:fs";
35970
36023
  import { access as access6, mkdir as mkdir14, open as open8, readFile as readFile8, rename as rename7, rm as rm9 } from "node:fs/promises";
35971
36024
  import { homedir as homedir9 } from "node:os";
35972
- import { basename as basename5, dirname as dirname9, isAbsolute as isAbsolute14, join as join19, relative as relative10, resolve as resolve10, sep as sep6 } from "node:path";
36025
+ import { basename as basename5, dirname as dirname9, isAbsolute as isAbsolute15, join as join19, relative as relative10, resolve as resolve11, sep as sep6 } from "node:path";
35973
36026
  var TASK_NAME = "Zixt Host";
35974
36027
  var COMMAND_TIMEOUT_MS3 = 7e4;
35975
36028
  var SERVICE_STABILITY_DELAY_MS3 = 2e3;
@@ -35997,8 +36050,8 @@ async function syncDirectory5(path) {
35997
36050
  async function ensureDirectory3(path, sync) {
35998
36051
  const firstCreated = await mkdir14(path, { recursive: true, mode: 448 });
35999
36052
  if (!firstCreated) return;
36000
- const first = resolve10(firstCreated);
36001
- const target = resolve10(path);
36053
+ const first = resolve11(firstCreated);
36054
+ const target = resolve11(path);
36002
36055
  await sync(dirname9(first));
36003
36056
  let current = first;
36004
36057
  for (const part of relative10(first, target).split(sep6).filter(Boolean)) {
@@ -36063,7 +36116,7 @@ async function runChild(command, args, env, input) {
36063
36116
  }
36064
36117
  async function defaultResolveCommand3(name, env) {
36065
36118
  const root = env.SYSTEMROOT ?? env.WINDIR;
36066
- if (!root || !isAbsolute14(root)) return null;
36119
+ if (!root || !isAbsolute15(root)) return null;
36067
36120
  const candidate = name === "powershell" ? join19(root, "System32", "WindowsPowerShell", "v1.0", "powershell.exe") : join19(root, "System32", `${name}.exe`);
36068
36121
  return access6(candidate, constants4.X_OK).then(
36069
36122
  () => candidate,
@@ -36195,7 +36248,7 @@ async function installWindowsService(options) {
36195
36248
  const env = options.env ?? process.env;
36196
36249
  const home = options.home ?? homedir9();
36197
36250
  const localAppData = options.localAppData ?? env.LOCALAPPDATA;
36198
- if (!localAppData || !isAbsolute14(localAppData)) {
36251
+ if (!localAppData || !isAbsolute15(localAppData)) {
36199
36252
  throw new Error("Windows local application data path is unavailable.");
36200
36253
  }
36201
36254
  const token2 = oneLine3(options.token, "pairing code");
@@ -36308,7 +36361,7 @@ async function installSystemService(options) {
36308
36361
  // src/terminal-outcomes.ts
36309
36362
  import { chmod as chmod9, lstat as lstat10, mkdir as mkdir15, open as open9, readdir as readdir5, readFile as readFile9, rename as rename8, rm as rm10 } from "node:fs/promises";
36310
36363
  import { homedir as homedir10 } from "node:os";
36311
- import { dirname as dirname10, join as join20, relative as relative11, resolve as resolve11, sep as sep7 } from "node:path";
36364
+ import { dirname as dirname10, join as join20, relative as relative11, resolve as resolve12, sep as sep7 } from "node:path";
36312
36365
  var DIRECTORY_MODE5 = 448;
36313
36366
  var FILE_MODE4 = 384;
36314
36367
  var MAX_OUTCOME_BYTES = 4 * 1024 * 1024;
@@ -36336,8 +36389,8 @@ async function syncDirectory6(root) {
36336
36389
  async function requirePrivateRoot(root, sync = syncDirectory6) {
36337
36390
  const firstCreated = await mkdir15(root, { recursive: true, mode: DIRECTORY_MODE5 });
36338
36391
  if (firstCreated) {
36339
- const first = resolve11(firstCreated);
36340
- const target = resolve11(root);
36392
+ const first = resolve12(firstCreated);
36393
+ const target = resolve12(root);
36341
36394
  await sync(dirname10(first));
36342
36395
  let current = first;
36343
36396
  for (const part of relative11(first, target).split(sep7).filter(Boolean)) {
@@ -36588,13 +36641,13 @@ function createHostLogger(options = {}) {
36588
36641
  }
36589
36642
 
36590
36643
  // src/demo-state.ts
36591
- import { isAbsolute as isAbsolute15, join as join21, parse as parse3, resolve as resolve12 } from "node:path";
36644
+ import { isAbsolute as isAbsolute16, join as join21, parse as parse3, resolve as resolve13 } from "node:path";
36592
36645
  var DEMO_STATE_ROOT_ENV = "ZIXT_DEMO_STATE_ROOT";
36593
36646
  function resolveDemoHostStatePaths(env = process.env) {
36594
36647
  const configured = env.ZIXT_RUNNER === "demo" ? env[DEMO_STATE_ROOT_ENV] : void 0;
36595
36648
  if (!configured) return null;
36596
- const root = resolve12(configured);
36597
- if (!isAbsolute15(configured) || root === parse3(root).root) {
36649
+ const root = resolve13(configured);
36650
+ if (!isAbsolute16(configured) || root === parse3(root).root) {
36598
36651
  throw new Error(`${DEMO_STATE_ROOT_ENV} must be a dedicated absolute directory`);
36599
36652
  }
36600
36653
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zixt/host",
3
- "version": "0.0.21",
3
+ "version": "0.0.23",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./src/client.ts",