@band-app/server 0.48.0 → 0.48.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.
Files changed (71) hide show
  1. package/dist/client/_shell.html +0 -0
  2. package/dist/client/assets/{TerminalPanel-DkQbk-aU.js → TerminalPanel-CfWUo3Nd.js} +1 -1
  3. package/dist/client/assets/{_basePickBy-Dpp3dGrC.js → _basePickBy-De_YMUJc.js} +1 -1
  4. package/dist/client/assets/{_baseUniq-CL7CCXzw.js → _baseUniq-CF2c9fMp.js} +1 -1
  5. package/dist/client/assets/{arc-Dgc_RxlI.js → arc-D-KYih_I.js} +1 -1
  6. package/dist/client/assets/{architectureDiagram-VXUJARFQ-CgG43jHE.js → architectureDiagram-VXUJARFQ-i0rZW9Y9.js} +1 -1
  7. package/dist/client/assets/{blockDiagram-VD42YOAC-Bt7XXELu.js → blockDiagram-VD42YOAC-CI-wLyQa.js} +1 -1
  8. package/dist/client/assets/{c4Diagram-YG6GDRKO-BQwG7Gi0.js → c4Diagram-YG6GDRKO-C1kVgBMI.js} +1 -1
  9. package/dist/client/assets/channel-Hy94D-AA.js +1 -0
  10. package/dist/client/assets/{chunk-4BX2VUAB-BwFghqiW.js → chunk-4BX2VUAB-BZ1Kpo6f.js} +1 -1
  11. package/dist/client/assets/{chunk-55IACEB6-C7yjJLc1.js → chunk-55IACEB6-CiRlX7k-.js} +1 -1
  12. package/dist/client/assets/{chunk-B4BG7PRW-BaJd9PuL.js → chunk-B4BG7PRW-BcgDiAdd.js} +1 -1
  13. package/dist/client/assets/{chunk-DI55MBZ5-CElPgENm.js → chunk-DI55MBZ5-RWxMQGLt.js} +1 -1
  14. package/dist/client/assets/{chunk-FMBD7UC4-D3qe2ywl.js → chunk-FMBD7UC4-BwIR0iJB.js} +1 -1
  15. package/dist/client/assets/{chunk-QN33PNHL-DStfzqTU.js → chunk-QN33PNHL-_ihIB9E1.js} +1 -1
  16. package/dist/client/assets/{chunk-QZHKN3VN-B1rMgEw-.js → chunk-QZHKN3VN-CktWNnxj.js} +1 -1
  17. package/dist/client/assets/{chunk-TZMSLE5B-BEcRDS9V.js → chunk-TZMSLE5B-Br831bNt.js} +1 -1
  18. package/dist/client/assets/classDiagram-2ON5EDUG-Cwx4pAtm.js +1 -0
  19. package/dist/client/assets/classDiagram-v2-WZHVMYZB-Cwx4pAtm.js +1 -0
  20. package/dist/client/assets/clone-BKfvT5A4.js +1 -0
  21. package/dist/client/assets/{cose-bilkent-S5V4N54A-DQnvhn8W.js → cose-bilkent-S5V4N54A-Ca6F1OCk.js} +1 -1
  22. package/dist/client/assets/{dagre-6UL2VRFP-Y6UFkfVj.js → dagre-6UL2VRFP-B0-4g4us.js} +1 -1
  23. package/dist/client/assets/{diagram-PSM6KHXK-Cn_p_oe9.js → diagram-PSM6KHXK-Bio1qnrB.js} +1 -1
  24. package/dist/client/assets/{diagram-QEK2KX5R-CWHFM00-.js → diagram-QEK2KX5R-COoEbw7t.js} +1 -1
  25. package/dist/client/assets/{diagram-S2PKOQOG-C0TgWCYA.js → diagram-S2PKOQOG-D8lVMqVK.js} +1 -1
  26. package/dist/client/assets/{erDiagram-Q2GNP2WA-BP1po3AK.js → erDiagram-Q2GNP2WA-t9P0TS6q.js} +1 -1
  27. package/dist/client/assets/{flowDiagram-NV44I4VS-B5oUkhMT.js → flowDiagram-NV44I4VS-qikZ7jp7.js} +1 -1
  28. package/dist/client/assets/{ganttDiagram-JELNMOA3-C7DXX2RL.js → ganttDiagram-JELNMOA3--M9lMYuY.js} +1 -1
  29. package/dist/client/assets/{gitGraphDiagram-V2S2FVAM-Dn30v3Fe.js → gitGraphDiagram-V2S2FVAM-B0JlDkQD.js} +1 -1
  30. package/dist/client/assets/{graph-E5kkHB_s.js → graph-DSNlIXAB.js} +1 -1
  31. package/dist/client/assets/{highlighted-body-B3W2YXNL-B2bPrtWU.js → highlighted-body-B3W2YXNL-kAw1lMr_.js} +1 -1
  32. package/dist/client/assets/{index-D6MDOO4K.js → index--3ZFGGnZ.js} +1 -1
  33. package/dist/client/assets/{index-DOWIe80D.js → index-5WQX4UIw.js} +1 -1
  34. package/dist/client/assets/{index-BlpyLCQK.js → index-BlF06PC1.js} +1 -1
  35. package/dist/client/assets/{index-DKIwN46L.js → index-CmkiQRLV.js} +1 -1
  36. package/dist/client/assets/{index-A7maATW7.js → index-CySzBB0C.js} +1 -1
  37. package/dist/client/assets/{index-CYUAdSi5.js → index-DFPad7x_.js} +1 -1
  38. package/dist/client/assets/{index-D50A2A_K.js → index-DMYwO0S-.js} +1 -1
  39. package/dist/client/assets/{index-CVOnvTFc.js → index-DYX4kWNp.js} +1 -1
  40. package/dist/client/assets/{index-B2f2Xih0.js → index-Dga5q50h.js} +1 -1
  41. package/dist/client/assets/{index-DzUf0Wwy.js → index-DrK2f7Cq.js} +1 -1
  42. package/dist/client/assets/{index-BScD8646.js → index-VnrkP6Up.js} +1 -1
  43. package/dist/client/assets/{index-B-miY5Sp.js → index-bX18a8nz.js} +1 -1
  44. package/dist/client/assets/{index-BuqiLymH.js → index-k-FABVhS.js} +1 -1
  45. package/dist/client/assets/{infoDiagram-HS3SLOUP-CoxVQgxs.js → infoDiagram-HS3SLOUP-CaK1_LNY.js} +1 -1
  46. package/dist/client/assets/{journeyDiagram-XKPGCS4Q-BUPqESWB.js → journeyDiagram-XKPGCS4Q-ahkgpOr3.js} +1 -1
  47. package/dist/client/assets/{kanban-definition-3W4ZIXB7-DDooJc-Z.js → kanban-definition-3W4ZIXB7-DrsLcNHB.js} +1 -1
  48. package/dist/client/assets/{layout-DQ2tNoC7.js → layout-kBr-ByLR.js} +1 -1
  49. package/dist/client/assets/main-BubyOwBK.css +1 -0
  50. package/dist/client/assets/{main-BbHA32iD.js → main-Tc53m1i8.js} +235 -235
  51. package/dist/client/assets/{mindmap-definition-VGOIOE7T-BBoouni0.js → mindmap-definition-VGOIOE7T-CHMj9x7w.js} +1 -1
  52. package/dist/client/assets/{pieDiagram-ADFJNKIX-DAO1Cf3O.js → pieDiagram-ADFJNKIX-JtGh9CwE.js} +1 -1
  53. package/dist/client/assets/{quadrantDiagram-AYHSOK5B-CjJp6wOV.js → quadrantDiagram-AYHSOK5B-BtkeplJz.js} +1 -1
  54. package/dist/client/assets/{requirementDiagram-UZGBJVZJ-CX3MPDiG.js → requirementDiagram-UZGBJVZJ-DSIYZLch.js} +1 -1
  55. package/dist/client/assets/{sankeyDiagram-TZEHDZUN-Cqnsrnu8.js → sankeyDiagram-TZEHDZUN-DQGg1SzY.js} +1 -1
  56. package/dist/client/assets/{sequenceDiagram-WL72ISMW-CTJ2qJj_.js → sequenceDiagram-WL72ISMW-BLkWIPyC.js} +1 -1
  57. package/dist/client/assets/{stateDiagram-FKZM4ZOC-Cy-jjqJZ.js → stateDiagram-FKZM4ZOC-BuPqxfpf.js} +1 -1
  58. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-DSMlIvqa.js +1 -0
  59. package/dist/client/assets/{timeline-definition-IT6M3QCI-Bbb0ib0X.js → timeline-definition-IT6M3QCI-vh4dIOet.js} +1 -1
  60. package/dist/client/assets/{treemap-GDKQZRPO-DUB2cMCc.js → treemap-GDKQZRPO-C9Mr454A.js} +1 -1
  61. package/dist/client/assets/{worktree._worktreeId-CZWwGpYU.js → worktree._worktreeId-COUtiXXq.js} +1 -1
  62. package/dist/client/assets/{worktree._worktreeId-DSiEfzZW.js → worktree._worktreeId-DYrSBo4e.js} +1 -1
  63. package/dist/client/assets/{xychartDiagram-PRI3JC2R-CI6Pnd76.js → xychartDiagram-PRI3JC2R-DTTZebCh.js} +1 -1
  64. package/dist/start-server.mjs +160 -112
  65. package/package.json +7 -7
  66. package/dist/client/assets/channel-BhaORH-2.js +0 -1
  67. package/dist/client/assets/classDiagram-2ON5EDUG-iB9V-fQK.js +0 -1
  68. package/dist/client/assets/classDiagram-v2-WZHVMYZB-iB9V-fQK.js +0 -1
  69. package/dist/client/assets/clone-UwjnYJkb.js +0 -1
  70. package/dist/client/assets/main-Bump8gDQ.css +0 -1
  71. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-CT80STo9.js +0 -1
@@ -2987,11 +2987,11 @@ var require_tools = __commonJS({
2987
2987
  }
2988
2988
  }
2989
2989
  }
2990
- function buildFormatters(level, bindings, log77) {
2990
+ function buildFormatters(level, bindings, log78) {
2991
2991
  return {
2992
2992
  level,
2993
2993
  bindings,
2994
- log: log77
2994
+ log: log78
2995
2995
  };
2996
2996
  }
2997
2997
  function normalizeDestFileDescriptor(destination) {
@@ -3374,11 +3374,11 @@ var require_proto = __commonJS({
3374
3374
  }
3375
3375
  } else instance[serializersSym] = serializers;
3376
3376
  if (options.hasOwnProperty("formatters")) {
3377
- const { level, bindings: chindings, log: log77 } = options.formatters;
3377
+ const { level, bindings: chindings, log: log78 } = options.formatters;
3378
3378
  instance[formattersSym] = buildFormatters(
3379
3379
  level || formatters.level,
3380
3380
  chindings || resetChildingsFormatter,
3381
- log77 || formatters.log
3381
+ log78 || formatters.log
3382
3382
  );
3383
3383
  } else {
3384
3384
  instance[formattersSym] = buildFormatters(
@@ -15900,6 +15900,15 @@ var init_wrapper = __esm({
15900
15900
  }
15901
15901
  });
15902
15902
 
15903
+ // ../../packages/shared/src/chat-events.ts
15904
+ var HISTORY_PAGE_SIZE, HISTORY_PAGE_MAX_ROWS;
15905
+ var init_chat_events = __esm({
15906
+ "../../packages/shared/src/chat-events.ts"() {
15907
+ HISTORY_PAGE_SIZE = 20;
15908
+ HISTORY_PAGE_MAX_ROWS = 300;
15909
+ }
15910
+ });
15911
+
15903
15912
  // src/server/services/_utils/queued-message-store.ts
15904
15913
  import { randomUUID as randomUUID3 } from "node:crypto";
15905
15914
  function toWireQueuedMessages(messages) {
@@ -41240,9 +41249,10 @@ function indexFields(event) {
41240
41249
  };
41241
41250
  }
41242
41251
  var ChatEventQueries;
41243
- var init_chat_events = __esm({
41252
+ var init_chat_events2 = __esm({
41244
41253
  "src/server/infra/db/queries/chat-events.ts"() {
41245
41254
  "use strict";
41255
+ init_chat_events();
41246
41256
  init_drizzle_orm();
41247
41257
  init_connection();
41248
41258
  init_schema2();
@@ -41278,8 +41288,9 @@ var init_chat_events = __esm({
41278
41288
  }
41279
41289
  /**
41280
41290
  * The last `turns` turns before `beforeId` (the whole revision when
41281
- * `beforeId` is undefined), oldest first. `hasOlder` says whether rows
41282
- * exist before the returned window.
41291
+ * `beforeId` is undefined), oldest first, shortened to the newest whole
41292
+ * turns that fit `HISTORY_PAGE_MAX_ROWS` (the newest turn is always kept).
41293
+ * `hasOlder` says whether rows exist before the returned window.
41283
41294
  */
41284
41295
  readTurns(sessionId, revision, turns, beforeId) {
41285
41296
  const db = getDb();
@@ -41289,7 +41300,18 @@ var init_chat_events = __esm({
41289
41300
  beforeId === void 0 ? void 0 : lt(chatEvents.id, beforeId)
41290
41301
  );
41291
41302
  const starts = db.select({ id: chatEvents.id }).from(chatEvents).where(and(scope3, eq(chatEvents.turnStart, true))).orderBy(desc(chatEvents.id)).limit(turns).all();
41292
- const from = starts.length < turns ? void 0 : starts[starts.length - 1].id;
41303
+ let kept = starts.length;
41304
+ if (starts.length > 1) {
41305
+ const ids = db.select({ id: chatEvents.id }).from(chatEvents).where(and(scope3, sql`${chatEvents.id} >= ${starts[starts.length - 1].id}`)).orderBy(desc(chatEvents.id)).limit(HISTORY_PAGE_MAX_ROWS + 1).all().map((r) => r.id);
41306
+ for (let i = 1; i < starts.length; i++) {
41307
+ const count2 = ids.findIndex((id) => id < starts[i].id);
41308
+ if ((count2 === -1 ? ids.length : count2) > HISTORY_PAGE_MAX_ROWS) {
41309
+ kept = i;
41310
+ break;
41311
+ }
41312
+ }
41313
+ }
41314
+ const from = kept === starts.length && starts.length < turns ? void 0 : starts[kept - 1]?.id;
41293
41315
  const rows = db.select().from(chatEvents).where(and(scope3, from === void 0 ? void 0 : sql`${chatEvents.id} >= ${from}`)).orderBy(chatEvents.id).all().map(toRow);
41294
41316
  if (from === void 0) return { rows, hasOlder: false };
41295
41317
  const older = db.select({ id: chatEvents.id }).from(chatEvents).where(
@@ -57898,8 +57920,8 @@ var init_environment_builds = __esm({
57898
57920
  get(id) {
57899
57921
  return getDb().select().from(environmentBuilds).where(eq(environmentBuilds.id, id)).get();
57900
57922
  }
57901
- setLog(id, log77) {
57902
- getDb().update(environmentBuilds).set({ log: log77 }).where(eq(environmentBuilds.id, id)).run();
57923
+ setLog(id, log78) {
57924
+ getDb().update(environmentBuilds).set({ log: log78 }).where(eq(environmentBuilds.id, id)).run();
57903
57925
  }
57904
57926
  finish(id, result) {
57905
57927
  getDb().update(environmentBuilds).set({
@@ -58267,32 +58289,32 @@ ${this.text.slice(-MAX_LOG_BYTES)}`;
58267
58289
  }
58268
58290
  // ---- running ---------------------------------------------------------------
58269
58291
  async run(row, plan) {
58270
- const log77 = new BuildLog(row.id, (id, text3) => this.queries.setLog(id, text3));
58292
+ const log78 = new BuildLog(row.id, (id, text3) => this.queries.setLog(id, text3));
58271
58293
  let tmp = null;
58272
58294
  const container = `band-env-${row.id.slice(0, 12)}`;
58273
58295
  let failure2 = null;
58274
58296
  try {
58275
- log77.add(`Building ${plan.tag} for ${plan.repo} at ${plan.ref} (${plan.commit.slice(0, 12)})`);
58276
- log77.flush();
58297
+ log78.add(`Building ${plan.tag} for ${plan.repo} at ${plan.ref} (${plan.commit.slice(0, 12)})`);
58298
+ log78.flush();
58277
58299
  tmp = await plan.host.fs.mkdtemp("band-env-");
58278
- await this.exportCheckout(plan, tmp, log77);
58279
- const toolchain = await this.buildToolchain(plan, tmp, log77);
58280
- const layered = await this.addWorkerLayer(plan, tmp, toolchain, log77);
58281
- await this.install(plan, tmp, layered, container, log77);
58282
- if (plan.registry) await this.push(plan, log77);
58283
- log77.add(`Done: ${plan.tag}`);
58300
+ await this.exportCheckout(plan, tmp, log78);
58301
+ const toolchain = await this.buildToolchain(plan, tmp, log78);
58302
+ const layered = await this.addWorkerLayer(plan, tmp, toolchain, log78);
58303
+ await this.install(plan, tmp, layered, container, log78);
58304
+ if (plan.registry) await this.push(plan, log78);
58305
+ log78.add(`Done: ${plan.tag}`);
58284
58306
  } catch (err) {
58285
58307
  failure2 = err.message;
58286
- log77.add(`FAILED: ${failure2}`);
58308
+ log78.add(`FAILED: ${failure2}`);
58287
58309
  }
58288
- await this.exec(plan.host, "docker", ["rm", "--force", container], log77, { quiet: true }).catch(
58310
+ await this.exec(plan.host, "docker", ["rm", "--force", container], log78, { quiet: true }).catch(
58289
58311
  () => void 0
58290
58312
  );
58291
58313
  await this.exec(
58292
58314
  plan.host,
58293
58315
  "docker",
58294
58316
  ["rmi", toolchainTag(plan.repo, plan.key), layeredTag(plan.repo, plan.key)],
58295
- log77,
58317
+ log78,
58296
58318
  { quiet: true }
58297
58319
  ).catch(() => void 0);
58298
58320
  if (tmp) await plan.host.fs.rm(tmp, { recursive: true, force: true }).catch(() => void 0);
@@ -58301,14 +58323,14 @@ ${this.text.slice(-MAX_LOG_BYTES)}`;
58301
58323
  this.queries.finish(row.id, {
58302
58324
  status: "ready",
58303
58325
  image: plan.tag,
58304
- log: log77.toString(),
58326
+ log: log78.toString(),
58305
58327
  at: Date.now()
58306
58328
  });
58307
58329
  } else {
58308
58330
  this.queries.finish(row.id, {
58309
58331
  status: "failed",
58310
58332
  error: failure2.slice(0, 2e3),
58311
- log: log77.toString(),
58333
+ log: log78.toString(),
58312
58334
  at: Date.now()
58313
58335
  });
58314
58336
  }
@@ -58317,9 +58339,9 @@ ${this.text.slice(-MAX_LOG_BYTES)}`;
58317
58339
  }
58318
58340
  }
58319
58341
  /** Runs a command on the builder host, adding it and its output to the log. */
58320
- async exec(host, tool, args, log77, options = {}) {
58342
+ async exec(host, tool, args, log78, options = {}) {
58321
58343
  const bin = tool === "docker" ? this.dockerBin(host) : tool === "devcontainer" ? this.devcontainerBin(host) : "git";
58322
- if (!options.quiet) log77.add(`$ ${tool} ${args.join(" ")}`);
58344
+ if (!options.quiet) log78.add(`$ ${tool} ${args.join(" ")}`);
58323
58345
  try {
58324
58346
  const out = await host.exec(bin, args, {
58325
58347
  cwd: options.cwd,
@@ -58327,35 +58349,35 @@ ${this.text.slice(-MAX_LOG_BYTES)}`;
58327
58349
  timeoutMs: envNumber("BAND_ENVIRONMENT_BUILD_TIMEOUT_MS", DEFAULT_STEP_TIMEOUT_MS)
58328
58350
  });
58329
58351
  if (!options.quiet) {
58330
- if (out.stdout.trim()) log77.add(out.stdout.trimEnd());
58331
- if (out.stderr.trim()) log77.add(out.stderr.trimEnd());
58332
- log77.flush();
58352
+ if (out.stdout.trim()) log78.add(out.stdout.trimEnd());
58353
+ if (out.stderr.trim()) log78.add(out.stderr.trimEnd());
58354
+ log78.flush();
58333
58355
  }
58334
58356
  return out.stdout;
58335
58357
  } catch (err) {
58336
58358
  if (!options.quiet) {
58337
- log77.add(err.message);
58338
- log77.flush();
58359
+ log78.add(err.message);
58360
+ log78.flush();
58339
58361
  }
58340
58362
  throw new Error(`${tool} ${args[0] ?? ""} failed: ${firstLine(err.message)}`);
58341
58363
  }
58342
58364
  }
58343
58365
  /** Writes the default branch's files, with no `.git`, to `<tmp>/src`. */
58344
- async exportCheckout(plan, tmp, log77) {
58366
+ async exportCheckout(plan, tmp, log78) {
58345
58367
  const src = posix4.join(tmp, "src");
58346
58368
  await plan.host.fs.mkdir(src);
58347
58369
  const index2 = posix4.join(tmp, "index");
58348
- await this.exec(plan.host, "git", ["read-tree", plan.ref], log77, {
58370
+ await this.exec(plan.host, "git", ["read-tree", plan.ref], log78, {
58349
58371
  cwd: plan.repoPath,
58350
58372
  env: { GIT_INDEX_FILE: index2 }
58351
58373
  });
58352
- await this.exec(plan.host, "git", ["checkout-index", "--all", `--prefix=${src}/`], log77, {
58374
+ await this.exec(plan.host, "git", ["checkout-index", "--all", `--prefix=${src}/`], log78, {
58353
58375
  cwd: plan.repoPath,
58354
58376
  env: { GIT_INDEX_FILE: index2 }
58355
58377
  });
58356
58378
  }
58357
58379
  /** Layer 2: returns the tag of an image holding the repo's toolchain. */
58358
- async buildToolchain(plan, tmp, log77) {
58380
+ async buildToolchain(plan, tmp, log78) {
58359
58381
  const build = plan.environment.build;
58360
58382
  const src = posix4.join(tmp, "src");
58361
58383
  const tag = toolchainTag(plan.repo, plan.key);
@@ -58364,7 +58386,7 @@ ${this.text.slice(-MAX_LOG_BYTES)}`;
58364
58386
  plan.host,
58365
58387
  "docker",
58366
58388
  dockerBuildArgs({ checkout: src, dockerfile: build.dockerfile, tag }),
58367
- log77
58389
+ log78
58368
58390
  );
58369
58391
  return tag;
58370
58392
  }
@@ -58374,7 +58396,7 @@ ${this.text.slice(-MAX_LOG_BYTES)}`;
58374
58396
  plan.host,
58375
58397
  "devcontainer",
58376
58398
  devcontainerBuildArgs({ checkout: src, config: build.devcontainer, tag }),
58377
- log77
58399
+ log78
58378
58400
  );
58379
58401
  } catch (err) {
58380
58402
  throw new Error(
@@ -58384,11 +58406,11 @@ ${this.text.slice(-MAX_LOG_BYTES)}`;
58384
58406
  return tag;
58385
58407
  }
58386
58408
  const image = build?.image;
58387
- await this.exec(plan.host, "docker", ["pull", image], log77);
58409
+ await this.exec(plan.host, "docker", ["pull", image], log78);
58388
58410
  return image;
58389
58411
  }
58390
58412
  /** Layer 1 on top of layer 2: copies the worker from the worker base image. */
58391
- async addWorkerLayer(plan, tmp, toolchain, log77) {
58413
+ async addWorkerLayer(plan, tmp, toolchain, log78) {
58392
58414
  const dir = posix4.join(tmp, "layer");
58393
58415
  await plan.host.fs.mkdir(dir);
58394
58416
  await plan.host.fs.writeFile(
@@ -58400,38 +58422,38 @@ ${this.text.slice(-MAX_LOG_BYTES)}`;
58400
58422
  });
58401
58423
  await plan.host.fs.mkdir(posix4.join(dir, "root", "work"), { recursive: true });
58402
58424
  const tag = layeredTag(plan.repo, plan.key);
58403
- await this.exec(plan.host, "docker", ["build", "--tag", tag, dir], log77);
58425
+ await this.exec(plan.host, "docker", ["build", "--tag", tag, dir], log78);
58404
58426
  return tag;
58405
58427
  }
58406
58428
  /** Runs `install` at the default branch inside the image and commits the result as the final tag. */
58407
- async install(plan, tmp, layered, container, log77) {
58429
+ async install(plan, tmp, layered, container, log78) {
58408
58430
  const install = plan.environment.install;
58409
58431
  if (install === void 0) {
58410
- await this.exec(plan.host, "docker", ["tag", layered, plan.tag], log77);
58432
+ await this.exec(plan.host, "docker", ["tag", layered, plan.tag], log78);
58411
58433
  return;
58412
58434
  }
58413
58435
  await this.exec(
58414
58436
  plan.host,
58415
58437
  "docker",
58416
58438
  installCreateArgs({ name: container, image: layered, install }),
58417
- log77
58439
+ log78
58418
58440
  );
58419
58441
  await this.exec(
58420
58442
  plan.host,
58421
58443
  "docker",
58422
58444
  ["cp", `${posix4.join(tmp, "src")}/.`, `${container}:${IMAGE_WORKDIR}`],
58423
- log77
58445
+ log78
58424
58446
  );
58425
- await this.exec(plan.host, "docker", ["start", "--attach", container], log77);
58447
+ await this.exec(plan.host, "docker", ["start", "--attach", container], log78);
58426
58448
  await this.exec(
58427
58449
  plan.host,
58428
58450
  "docker",
58429
58451
  commitArgs({ container, tag: plan.tag, key: plan.key, commit: plan.commit }),
58430
- log77
58452
+ log78
58431
58453
  );
58432
58454
  }
58433
- async push(plan, log77) {
58434
- await this.exec(plan.host, "docker", ["push", plan.tag], log77);
58455
+ async push(plan, log78) {
58456
+ await this.exec(plan.host, "docker", ["push", plan.tag], log78);
58435
58457
  }
58436
58458
  // ---- auto trigger ----------------------------------------------------------
58437
58459
  /**
@@ -62412,7 +62434,7 @@ async function reconcileOneRepo(repo) {
62412
62434
  repo.worktrees.filter((wt) => !isRemote(wt)).map((wt) => [wt.path, wt])
62413
62435
  );
62414
62436
  diskWorktrees = gitWorktrees.filter(
62415
- (wt) => !wt.isBare && !remotePaths.has(wt.path) && (!removingWorktrees.has(wt.path) || existingByPath.has(wt.path) && !removedWorktrees.has(wt.path))
62437
+ (wt) => !wt.isBare && (!remotePaths.has(wt.path) || existingByPath.has(wt.path)) && (!removingWorktrees.has(wt.path) || existingByPath.has(wt.path) && !removedWorktrees.has(wt.path))
62416
62438
  ).map((wt) => {
62417
62439
  const existing = existingByPath.get(wt.path);
62418
62440
  return {
@@ -69221,7 +69243,7 @@ var init_agent_session_service = __esm({
69221
69243
  init_src2();
69222
69244
  init_src();
69223
69245
  init_acp_agent_process();
69224
- init_chat_events();
69246
+ init_chat_events2();
69225
69247
  init_settings();
69226
69248
  init_registry();
69227
69249
  init_agent_pending_work();
@@ -74074,11 +74096,11 @@ var require_core = __commonJS({
74074
74096
  Ajv2.ValidationError = validation_error_1.default;
74075
74097
  Ajv2.MissingRefError = ref_error_1.default;
74076
74098
  exports.default = Ajv2;
74077
- function checkOptions(checkOpts, options, msg, log77 = "error") {
74099
+ function checkOptions(checkOpts, options, msg, log78 = "error") {
74078
74100
  for (const key2 in checkOpts) {
74079
74101
  const opt = key2;
74080
74102
  if (opt in options)
74081
- this.logger[log77](`${msg}: option ${key2}. ${checkOpts[opt]}`);
74103
+ this.logger[log78](`${msg}: option ${key2}. ${checkOpts[opt]}`);
74082
74104
  }
74083
74105
  }
74084
74106
  function getSchEnv(keyRef) {
@@ -79721,11 +79743,7 @@ function createCorsMiddleware(getAllowedOrigins) {
79721
79743
 
79722
79744
  // src/api/chat-events.ts
79723
79745
  init_src();
79724
-
79725
- // ../../packages/shared/src/chat-events.ts
79726
- var HISTORY_PAGE_SIZE = 20;
79727
-
79728
- // src/api/chat-events.ts
79746
+ init_chat_events();
79729
79747
  init_queued_message_store();
79730
79748
 
79731
79749
  // src/server/services/_utils/sse-writer.ts
@@ -79940,6 +79958,7 @@ async function handleChatEvents(req, res, chatId) {
79940
79958
  }
79941
79959
 
79942
79960
  // src/api/chat-history.ts
79961
+ init_chat_events();
79943
79962
  init_agent_session_service();
79944
79963
  init_chat_service();
79945
79964
  var MAX_CHAT_ID_LENGTH = 200;
@@ -95909,7 +95928,7 @@ var UsageScannerService = class {
95909
95928
  async scanPair(ws, a) {
95910
95929
  let reader;
95911
95930
  try {
95912
- reader = await this.getUsageReader(a);
95931
+ reader = await this.getUsageReader(a, ws.hostId);
95913
95932
  } catch (err) {
95914
95933
  log58.debug({ err, agentId: a.agentId }, "failed to resolve usage reader for scan");
95915
95934
  return 0;
@@ -95940,6 +95959,7 @@ var UsageScannerService = class {
95940
95959
  { err, sessionId: s2.sessionId, agentType: a.agentType },
95941
95960
  "getSessionUsage failed"
95942
95961
  );
95962
+ if (err instanceof Error && err.name === "HostOfflineError") break;
95943
95963
  maxObserved = Math.max(maxObserved, s2.lastModified);
95944
95964
  continue;
95945
95965
  }
@@ -95995,7 +96015,8 @@ function defaultListWorktrees() {
95995
96015
  out.push({
95996
96016
  worktreeId: toWorktreeId(repo.name, worktree.name, worktree.hostId),
95997
96017
  repo: repo.name,
95998
- worktreePath: worktree.path
96018
+ worktreePath: worktree.path,
96019
+ hostId: worktree.hostId
95999
96020
  });
96000
96021
  }
96001
96022
  }
@@ -96010,8 +96031,9 @@ function defaultListAgents() {
96010
96031
  command: def.command
96011
96032
  }));
96012
96033
  }
96013
- function defaultGetUsageReader(agent) {
96014
- return hostRegistry.local.agentEnv.usageReader(agent);
96034
+ function defaultGetUsageReader(agent, hostId2) {
96035
+ const host = hostId2 ? hostRegistry.hostById(hostId2) : hostRegistry.local;
96036
+ return host.agentEnv.usageReader(agent);
96015
96037
  }
96016
96038
  function defaultIsPollingEnabled() {
96017
96039
  try {
@@ -97232,7 +97254,7 @@ init_zod();
97232
97254
  // package.json
97233
97255
  var package_default = {
97234
97256
  name: "@band-app/server",
97235
- version: "0.48.0",
97257
+ version: "0.48.1",
97236
97258
  type: "module",
97237
97259
  types: "src/index.ts",
97238
97260
  exports: {
@@ -102580,31 +102602,52 @@ init_src();
102580
102602
  init_registry();
102581
102603
  async function installSkills2(opts = {}) {
102582
102604
  const result = await hostRegistry.local.agentEnv.installSkills({ home: opts.home });
102583
- const log77 = opts.log;
102584
- if (log77) {
102585
- for (const warning of result.warnings) log77.warn(warning);
102586
- for (const path2 of result.written) log77.info("Installed skill at %s", path2);
102605
+ const log78 = opts.log;
102606
+ if (log78) {
102607
+ for (const warning of result.warnings) log78.warn(warning);
102608
+ for (const path2 of result.written) log78.info("Installed skill at %s", path2);
102587
102609
  for (const path2 of result.updated) {
102588
- log77.info("Updated skill at %s (content differed \u2014 shipped version reinstalled)", path2);
102610
+ log78.info("Updated skill at %s (content differed \u2014 shipped version reinstalled)", path2);
102589
102611
  }
102590
102612
  for (const conflict of result.conflicts) {
102591
- log77.warn("Skill symlink conflict \u2014 %s (left as-is; remove it manually to re-link)", conflict);
102613
+ log78.warn("Skill symlink conflict \u2014 %s (left as-is; remove it manually to re-link)", conflict);
102592
102614
  }
102593
102615
  }
102594
102616
  return result;
102595
102617
  }
102596
102618
 
102597
- // src/server/services/setup-service.ts
102598
- init_settings_service();
102619
+ // src/server/services/coding-agent-seed.ts
102620
+ init_src();
102599
102621
  init_state();
102600
- init_sync_service();
102601
- init_worktree_service();
102602
- var log73 = createLogger("setup");
102622
+ var log73 = createLogger("coding-agent-seed");
102603
102623
  var AGENT_CHECKS = [
102604
102624
  { id: "claude-code", type: "claude-code", label: "Claude Code", binary: "claude" },
102605
102625
  { id: "codex", type: "codex", label: "Codex", binary: "codex" },
102606
102626
  { id: "opencode", type: "opencode", label: "OpenCode", binary: "opencode" }
102607
102627
  ];
102628
+ function seedCodingAgentsFromTypes(types) {
102629
+ const settings3 = loadSettings();
102630
+ if (Array.isArray(settings3.codingAgents) && settings3.codingAgents.length > 0) return;
102631
+ const seeded = AGENT_CHECKS.filter((c) => types.includes(c.type)).map(
102632
+ ({ id, type, label: label2 }) => ({ id, type, label: label2 })
102633
+ );
102634
+ if (seeded.length === 0) return;
102635
+ settings3.codingAgents = seeded;
102636
+ if (!settings3.defaultCodingAgent) settings3.defaultCodingAgent = seeded[0].id;
102637
+ saveSettings(settings3);
102638
+ log73.info(
102639
+ "Enabled %d coding agent(s) from a worker; default = %s",
102640
+ seeded.length,
102641
+ settings3.defaultCodingAgent
102642
+ );
102643
+ }
102644
+
102645
+ // src/server/services/setup-service.ts
102646
+ init_settings_service();
102647
+ init_state();
102648
+ init_sync_service();
102649
+ init_worktree_service();
102650
+ var log74 = createLogger("setup");
102608
102651
  async function runFirstTimeSetup() {
102609
102652
  forgetLocalWorktrees();
102610
102653
  const repoSync = ensureRepoStateInSync().then(() => ensureRepoRemotes());
@@ -102616,7 +102659,7 @@ async function runFirstTimeSetup() {
102616
102659
  ]);
102617
102660
  for (const r of results) {
102618
102661
  if (r.status === "rejected") {
102619
- log73.warn(
102662
+ log74.warn(
102620
102663
  "Setup step failed: %s",
102621
102664
  r.reason instanceof Error ? r.reason.message : String(r.reason)
102622
102665
  );
@@ -102630,7 +102673,7 @@ async function refreshAgentModelsInBackground() {
102630
102673
  const ok = results.filter((r) => !r.error).length;
102631
102674
  const failed = results.length - ok;
102632
102675
  if (results.length > 0) {
102633
- log73.info(
102676
+ log74.info(
102634
102677
  "Background model refresh: %d/%d agents updated (%d failed)",
102635
102678
  ok,
102636
102679
  results.length,
@@ -102638,7 +102681,7 @@ async function refreshAgentModelsInBackground() {
102638
102681
  );
102639
102682
  }
102640
102683
  } catch (err) {
102641
- log73.warn(
102684
+ log74.warn(
102642
102685
  "Background model refresh failed: %s",
102643
102686
  err instanceof Error ? err.message : String(err)
102644
102687
  );
@@ -102653,7 +102696,7 @@ async function ensureRepoRemotes() {
102653
102696
  try {
102654
102697
  await repoService.backfillRemotes();
102655
102698
  } catch (err) {
102656
- log73.warn(
102699
+ log74.warn(
102657
102700
  "Failed to record repo remotes at boot: %s",
102658
102701
  err instanceof Error ? err.message : String(err)
102659
102702
  );
@@ -102663,7 +102706,7 @@ function forgetLocalWorktrees() {
102663
102706
  try {
102664
102707
  worktreeService.forgetLocalWorktrees();
102665
102708
  } catch (err) {
102666
- log73.warn(
102709
+ log74.warn(
102667
102710
  "Failed to forget local worktrees at boot: %s",
102668
102711
  err instanceof Error ? err.message : String(err)
102669
102712
  );
@@ -102673,7 +102716,7 @@ async function ensureRepoStateInSync() {
102673
102716
  try {
102674
102717
  await syncService.syncWorktrees();
102675
102718
  } catch (err) {
102676
- log73.warn(
102719
+ log74.warn(
102677
102720
  "Failed to sync repo state at boot: %s",
102678
102721
  err instanceof Error ? err.message : String(err)
102679
102722
  );
@@ -102684,22 +102727,22 @@ async function ensureCliInstalled() {
102684
102727
  try {
102685
102728
  cliStatus = await checkCli();
102686
102729
  } catch (err) {
102687
- log73.warn("Could not check CLI status: %s", err instanceof Error ? err.message : String(err));
102730
+ log74.warn("Could not check CLI status: %s", err instanceof Error ? err.message : String(err));
102688
102731
  return;
102689
102732
  }
102690
102733
  if (cliStatus === "Installed") {
102691
102734
  return;
102692
102735
  }
102693
102736
  if (cliStatus !== "NotInstalled") {
102694
- log73.warn("CLI not auto-installed (status: %s)", cliStatus);
102737
+ log74.warn("CLI not auto-installed (status: %s)", cliStatus);
102695
102738
  return;
102696
102739
  }
102697
- log73.info("Installing band CLI...");
102740
+ log74.info("Installing band CLI...");
102698
102741
  try {
102699
102742
  await installCli();
102700
- log73.info("CLI installed to %s", SYMLINK_PATH);
102743
+ log74.info("CLI installed to %s", SYMLINK_PATH);
102701
102744
  } catch (err) {
102702
- log73.warn("CLI installation failed: %s", err instanceof Error ? err.message : String(err));
102745
+ log74.warn("CLI installation failed: %s", err instanceof Error ? err.message : String(err));
102703
102746
  }
102704
102747
  }
102705
102748
  async function ensureDefaultCodingAgents() {
@@ -102708,17 +102751,17 @@ async function ensureDefaultCodingAgents() {
102708
102751
  if (Array.isArray(existing) && existing.length > 0) {
102709
102752
  return;
102710
102753
  }
102711
- log73.info("Detecting installed coding agents...");
102754
+ log74.info("Detecting installed coding agents...");
102712
102755
  const detected = [];
102713
102756
  for (const check2 of AGENT_CHECKS) {
102714
102757
  const path2 = await systemService.whichBinary(check2.binary);
102715
102758
  if (path2) {
102716
- log73.info("Detected coding agent: %s (%s)", check2.id, path2);
102759
+ log74.info("Detected coding agent: %s (%s)", check2.id, path2);
102717
102760
  detected.push({ id: check2.id, type: check2.type, label: check2.label });
102718
102761
  }
102719
102762
  }
102720
102763
  if (detected.length === 0) {
102721
- log73.info("No coding agent CLIs detected on PATH");
102764
+ log74.info("No coding agent CLIs detected on PATH");
102722
102765
  return;
102723
102766
  }
102724
102767
  const current3 = loadSettings();
@@ -102727,7 +102770,7 @@ async function ensureDefaultCodingAgents() {
102727
102770
  current3.defaultCodingAgent = detected[0].id;
102728
102771
  }
102729
102772
  saveSettings(current3);
102730
- log73.info("Enabled %d coding agent(s); default = %s", detected.length, current3.defaultCodingAgent);
102773
+ log74.info("Enabled %d coding agent(s); default = %s", detected.length, current3.defaultCodingAgent);
102731
102774
  }
102732
102775
  function ensureNotificationDefaults() {
102733
102776
  const settings3 = loadSettings();
@@ -102739,7 +102782,7 @@ function ensureNotificationDefaults() {
102739
102782
  ...settings3,
102740
102783
  notifications: { ...notifications, soundOnNeedsAttention: true }
102741
102784
  });
102742
- log73.info("Set default notifications.soundOnNeedsAttention = true");
102785
+ log74.info("Set default notifications.soundOnNeedsAttention = true");
102743
102786
  }
102744
102787
  function migrateAgentDefaultMode() {
102745
102788
  const settings3 = loadSettings();
@@ -102747,15 +102790,15 @@ function migrateAgentDefaultMode() {
102747
102790
  const mode = agentModeFromVia(settings3.cli?.defaultVia);
102748
102791
  if (!mode) return;
102749
102792
  saveSettings({ ...settings3, agents: { ...settings3.agents, defaultMode: mode } });
102750
- log73.info("Migrated cli.defaultVia to agents.defaultMode = %s", mode);
102793
+ log74.info("Migrated cli.defaultVia to agents.defaultMode = %s", mode);
102751
102794
  }
102752
102795
  async function ensureSkillsInstalled() {
102753
102796
  try {
102754
- const result = await installSkills2({ log: log73 });
102797
+ const result = await installSkills2({ log: log74 });
102755
102798
  const wrote = result.written.length + result.updated.length;
102756
102799
  const linkChange = result.linked.length;
102757
102800
  if (wrote > 0 || linkChange > 0 || result.conflicts.length > 0) {
102758
- log73.info(
102801
+ log74.info(
102759
102802
  "Synced CLI skills (shared: %d written, %d updated, %d unchanged; symlinks: %d created, %d already-linked, %d conflicts, %d skipped)",
102760
102803
  result.written.length,
102761
102804
  result.updated.length,
@@ -102767,7 +102810,7 @@ async function ensureSkillsInstalled() {
102767
102810
  );
102768
102811
  }
102769
102812
  } catch (err) {
102770
- log73.warn("Failed to sync CLI skills: %s", err instanceof Error ? err.message : String(err));
102813
+ log74.warn("Failed to sync CLI skills: %s", err instanceof Error ? err.message : String(err));
102771
102814
  }
102772
102815
  }
102773
102816
  var SetupService = class {
@@ -102806,7 +102849,7 @@ init_src();
102806
102849
  import { createHash as createHash12 } from "node:crypto";
102807
102850
  import { readFile as readFile9 } from "node:fs/promises";
102808
102851
  import { join as join54 } from "node:path";
102809
- var log74 = createLogger("worker-cli");
102852
+ var log75 = createLogger("worker-cli");
102810
102853
  var RPC_INVALID_PARAMS2 = -32602;
102811
102854
  var PLATFORM_NAME = /^[a-z0-9_]{1,16}$/;
102812
102855
  function candidatesFor(platform3, arch) {
@@ -102842,7 +102885,7 @@ var WorkerCliService = class {
102842
102885
  }
102843
102886
  const sha2562 = createHash12("sha256").update(data).digest("hex");
102844
102887
  if (have === sha2562) return { available: true, sha256: sha2562, size: data.length };
102845
- log74.info(
102888
+ log75.info(
102846
102889
  `sending the band CLI (${platform3}-${arch}, ${data.length} bytes) to ${session.workerId}`
102847
102890
  );
102848
102891
  const ch = session.openChannel("cli.body", { platform: platform3, arch });
@@ -102884,7 +102927,7 @@ init_chat_service();
102884
102927
  init_state();
102885
102928
  init_subscription_service();
102886
102929
  init_terminal_service();
102887
- var log75 = createLogger("worker-relay");
102930
+ var log76 = createLogger("worker-relay");
102888
102931
  var REPLY_HEADERS2 = ["content-type", "cache-control", "mcp-session-id"];
102889
102932
  var FORWARDED_HEADERS = [
102890
102933
  "content-type",
@@ -102924,7 +102967,7 @@ var WorkerRelayService = class {
102924
102967
  let request = parseRequest(params);
102925
102968
  const verdict = checkRelayRequest(request, session.workerId, this.lookups);
102926
102969
  if (!verdict.ok) {
102927
- log75.warn(
102970
+ log76.warn(
102928
102971
  `refused ${request.method} ${request.path.split("?")[0]} from ${session.workerId}: ${verdict.reason}`
102929
102972
  );
102930
102973
  return this.answer(session, verdict.status, refusalBody(request, verdict));
@@ -102959,7 +103002,7 @@ var WorkerRelayService = class {
102959
103002
  redirect: "manual"
102960
103003
  });
102961
103004
  } catch (err) {
102962
- log75.warn(`relay call failed: ${err instanceof Error ? err.message : err}`);
103005
+ log76.warn(`relay call failed: ${err instanceof Error ? err.message : err}`);
102963
103006
  return this.answer(session, 502, { error: "The hub could not answer" });
102964
103007
  }
102965
103008
  const replyHeaders = {};
@@ -102977,7 +103020,7 @@ var WorkerRelayService = class {
102977
103020
  const filtered = filterReposReply(await upstream.json(), session.workerId);
102978
103021
  return this.answer(session, upstream.status, filtered);
102979
103022
  } catch (err) {
102980
- log75.warn(`relay call failed: ${err instanceof Error ? err.message : err}`);
103023
+ log76.warn(`relay call failed: ${err instanceof Error ? err.message : err}`);
102981
103024
  return this.answer(session, 502, { error: "The hub could not answer" });
102982
103025
  }
102983
103026
  }
@@ -102985,7 +103028,7 @@ var WorkerRelayService = class {
102985
103028
  try {
102986
103029
  return this.answer(session, upstream.status, redactHostsReply(await upstream.json()));
102987
103030
  } catch (err) {
102988
- log75.warn(`relay call failed: ${err instanceof Error ? err.message : err}`);
103031
+ log76.warn(`relay call failed: ${err instanceof Error ? err.message : err}`);
102989
103032
  return this.answer(session, 502, { error: "The hub could not answer" });
102990
103033
  }
102991
103034
  }
@@ -103038,7 +103081,7 @@ var workerRelayService = new WorkerRelayService();
103038
103081
 
103039
103082
  // src/server/services/worker-link-service.ts
103040
103083
  init_worktree_service();
103041
- var log76 = createLogger("worker-link");
103084
+ var log77 = createLogger("worker-link");
103042
103085
  var repoQueries5 = new RepoQueries();
103043
103086
  var LOCAL_HOST_ID11 = "local";
103044
103087
  var CAPABILITY_REFRESH_MS = 3 * 6e4;
@@ -103098,7 +103141,7 @@ var WorkerLinkService = class {
103098
103141
  this.refreshTimer.unref();
103099
103142
  this.unsubscribeRevoke = this.tokens.onRevoked((row) => {
103100
103143
  if (row.kind === "worker_session" && row.hostId) {
103101
- if (this.server.drop(row.hostId, "token revoked")) log76.info(`cut link of ${row.hostId}`);
103144
+ if (this.server.drop(row.hostId, "token revoked")) log77.info(`cut link of ${row.hostId}`);
103102
103145
  }
103103
103146
  });
103104
103147
  }
@@ -103128,7 +103171,7 @@ var WorkerLinkService = class {
103128
103171
  this.queries.setHostInfo(row.id, stored);
103129
103172
  if (changed) this.publish(row.id, "online");
103130
103173
  } catch (err) {
103131
- log76.debug(
103174
+ log77.debug(
103132
103175
  `could not refresh the report of ${row.id}: ${err instanceof Error ? err.message : err}`
103133
103176
  );
103134
103177
  }
@@ -103170,7 +103213,7 @@ var WorkerLinkService = class {
103170
103213
  try {
103171
103214
  info = await this.remoteHost(workerId).info();
103172
103215
  } catch (err) {
103173
- log76.warn(
103216
+ log77.warn(
103174
103217
  `could not read host info from ${workerId}: ${err instanceof Error ? err.message : err}`
103175
103218
  );
103176
103219
  }
@@ -103187,27 +103230,32 @@ var WorkerLinkService = class {
103187
103230
  mode: hello.mode
103188
103231
  };
103189
103232
  this.queries.markHostOnline(workerId, at, { info: stored, version: hello.buildId });
103190
- log76.info(`worker ${workerId} is online`);
103233
+ log77.info(`worker ${workerId} is online`);
103234
+ try {
103235
+ seedCodingAgentsFromTypes(hello.agents);
103236
+ } catch (err) {
103237
+ log77.warn(`could not seed coding agents: ${err instanceof Error ? err.message : err}`);
103238
+ }
103191
103239
  this.publish(workerId, "online");
103192
103240
  void ephemeralLifecycleService.onConnected(session);
103193
103241
  void followService.onHostReturned(workerId).catch((err) => {
103194
- log76.warn(`follow check on ${workerId}: ${err instanceof Error ? err.message : err}`);
103242
+ log77.warn(`follow check on ${workerId}: ${err instanceof Error ? err.message : err}`);
103195
103243
  });
103196
103244
  placementService.onHostOnline(workerId);
103197
103245
  void worktreeService.finishPendingRemovals(workerId).catch((err) => {
103198
- log76.warn(`pending removals on ${workerId}: ${err instanceof Error ? err.message : err}`);
103246
+ log77.warn(`pending removals on ${workerId}: ${err instanceof Error ? err.message : err}`);
103199
103247
  });
103200
103248
  }
103201
103249
  setStatus(workerId, status, lastSeenAt) {
103202
103250
  try {
103203
103251
  this.queries.setHostStatus(workerId, status, lastSeenAt);
103204
103252
  } catch (err) {
103205
- log76.warn(
103253
+ log77.warn(
103206
103254
  `could not record ${workerId} as ${status}: ${err instanceof Error ? err.message : err}`
103207
103255
  );
103208
103256
  return;
103209
103257
  }
103210
- log76.info(`worker ${workerId} is ${status}`);
103258
+ log77.info(`worker ${workerId} is ${status}`);
103211
103259
  this.publish(workerId, status);
103212
103260
  }
103213
103261
  publish(hostId2, hostStatus) {
@@ -103252,7 +103300,7 @@ var WorkerLinkService = class {
103252
103300
  send2(200, out);
103253
103301
  } catch (err) {
103254
103302
  if (!(err instanceof TokenExchangeError)) throw err;
103255
- log76.warn(`bootstrap exchange refused: ${err.reason}`);
103303
+ log77.warn(`bootstrap exchange refused: ${err.reason}`);
103256
103304
  send2(401, { error: "invalid or expired token" });
103257
103305
  }
103258
103306
  }
@@ -103757,7 +103805,7 @@ async function main() {
103757
103805
  }
103758
103806
  if (handleAuth(req, res)) return;
103759
103807
  if (req.url?.startsWith("/api/uploads/")) {
103760
- const rest = req.url.slice("/api/uploads/".length);
103808
+ const rest = req.url.slice("/api/uploads/".length).split("?")[0];
103761
103809
  const slashIdx = rest.indexOf("/");
103762
103810
  if (slashIdx !== -1) {
103763
103811
  let wId;
@@ -103804,7 +103852,7 @@ async function main() {
103804
103852
  return;
103805
103853
  }
103806
103854
  if (req.url?.startsWith("/api/shared/")) {
103807
- const rest = req.url.slice("/api/shared/".length);
103855
+ const rest = req.url.slice("/api/shared/".length).split("?")[0];
103808
103856
  const slashIdx = rest.indexOf("/");
103809
103857
  if (slashIdx === -1) {
103810
103858
  res.writeHead(400);