@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.
- package/dist/client/_shell.html +0 -0
- package/dist/client/assets/{TerminalPanel-DkQbk-aU.js → TerminalPanel-CfWUo3Nd.js} +1 -1
- package/dist/client/assets/{_basePickBy-Dpp3dGrC.js → _basePickBy-De_YMUJc.js} +1 -1
- package/dist/client/assets/{_baseUniq-CL7CCXzw.js → _baseUniq-CF2c9fMp.js} +1 -1
- package/dist/client/assets/{arc-Dgc_RxlI.js → arc-D-KYih_I.js} +1 -1
- package/dist/client/assets/{architectureDiagram-VXUJARFQ-CgG43jHE.js → architectureDiagram-VXUJARFQ-i0rZW9Y9.js} +1 -1
- package/dist/client/assets/{blockDiagram-VD42YOAC-Bt7XXELu.js → blockDiagram-VD42YOAC-CI-wLyQa.js} +1 -1
- package/dist/client/assets/{c4Diagram-YG6GDRKO-BQwG7Gi0.js → c4Diagram-YG6GDRKO-C1kVgBMI.js} +1 -1
- package/dist/client/assets/channel-Hy94D-AA.js +1 -0
- package/dist/client/assets/{chunk-4BX2VUAB-BwFghqiW.js → chunk-4BX2VUAB-BZ1Kpo6f.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-C7yjJLc1.js → chunk-55IACEB6-CiRlX7k-.js} +1 -1
- package/dist/client/assets/{chunk-B4BG7PRW-BaJd9PuL.js → chunk-B4BG7PRW-BcgDiAdd.js} +1 -1
- package/dist/client/assets/{chunk-DI55MBZ5-CElPgENm.js → chunk-DI55MBZ5-RWxMQGLt.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-D3qe2ywl.js → chunk-FMBD7UC4-BwIR0iJB.js} +1 -1
- package/dist/client/assets/{chunk-QN33PNHL-DStfzqTU.js → chunk-QN33PNHL-_ihIB9E1.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-B1rMgEw-.js → chunk-QZHKN3VN-CktWNnxj.js} +1 -1
- package/dist/client/assets/{chunk-TZMSLE5B-BEcRDS9V.js → chunk-TZMSLE5B-Br831bNt.js} +1 -1
- package/dist/client/assets/classDiagram-2ON5EDUG-Cwx4pAtm.js +1 -0
- package/dist/client/assets/classDiagram-v2-WZHVMYZB-Cwx4pAtm.js +1 -0
- package/dist/client/assets/clone-BKfvT5A4.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-DQnvhn8W.js → cose-bilkent-S5V4N54A-Ca6F1OCk.js} +1 -1
- package/dist/client/assets/{dagre-6UL2VRFP-Y6UFkfVj.js → dagre-6UL2VRFP-B0-4g4us.js} +1 -1
- package/dist/client/assets/{diagram-PSM6KHXK-Cn_p_oe9.js → diagram-PSM6KHXK-Bio1qnrB.js} +1 -1
- package/dist/client/assets/{diagram-QEK2KX5R-CWHFM00-.js → diagram-QEK2KX5R-COoEbw7t.js} +1 -1
- package/dist/client/assets/{diagram-S2PKOQOG-C0TgWCYA.js → diagram-S2PKOQOG-D8lVMqVK.js} +1 -1
- package/dist/client/assets/{erDiagram-Q2GNP2WA-BP1po3AK.js → erDiagram-Q2GNP2WA-t9P0TS6q.js} +1 -1
- package/dist/client/assets/{flowDiagram-NV44I4VS-B5oUkhMT.js → flowDiagram-NV44I4VS-qikZ7jp7.js} +1 -1
- package/dist/client/assets/{ganttDiagram-JELNMOA3-C7DXX2RL.js → ganttDiagram-JELNMOA3--M9lMYuY.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-V2S2FVAM-Dn30v3Fe.js → gitGraphDiagram-V2S2FVAM-B0JlDkQD.js} +1 -1
- package/dist/client/assets/{graph-E5kkHB_s.js → graph-DSNlIXAB.js} +1 -1
- package/dist/client/assets/{highlighted-body-B3W2YXNL-B2bPrtWU.js → highlighted-body-B3W2YXNL-kAw1lMr_.js} +1 -1
- package/dist/client/assets/{index-D6MDOO4K.js → index--3ZFGGnZ.js} +1 -1
- package/dist/client/assets/{index-DOWIe80D.js → index-5WQX4UIw.js} +1 -1
- package/dist/client/assets/{index-BlpyLCQK.js → index-BlF06PC1.js} +1 -1
- package/dist/client/assets/{index-DKIwN46L.js → index-CmkiQRLV.js} +1 -1
- package/dist/client/assets/{index-A7maATW7.js → index-CySzBB0C.js} +1 -1
- package/dist/client/assets/{index-CYUAdSi5.js → index-DFPad7x_.js} +1 -1
- package/dist/client/assets/{index-D50A2A_K.js → index-DMYwO0S-.js} +1 -1
- package/dist/client/assets/{index-CVOnvTFc.js → index-DYX4kWNp.js} +1 -1
- package/dist/client/assets/{index-B2f2Xih0.js → index-Dga5q50h.js} +1 -1
- package/dist/client/assets/{index-DzUf0Wwy.js → index-DrK2f7Cq.js} +1 -1
- package/dist/client/assets/{index-BScD8646.js → index-VnrkP6Up.js} +1 -1
- package/dist/client/assets/{index-B-miY5Sp.js → index-bX18a8nz.js} +1 -1
- package/dist/client/assets/{index-BuqiLymH.js → index-k-FABVhS.js} +1 -1
- package/dist/client/assets/{infoDiagram-HS3SLOUP-CoxVQgxs.js → infoDiagram-HS3SLOUP-CaK1_LNY.js} +1 -1
- package/dist/client/assets/{journeyDiagram-XKPGCS4Q-BUPqESWB.js → journeyDiagram-XKPGCS4Q-ahkgpOr3.js} +1 -1
- package/dist/client/assets/{kanban-definition-3W4ZIXB7-DDooJc-Z.js → kanban-definition-3W4ZIXB7-DrsLcNHB.js} +1 -1
- package/dist/client/assets/{layout-DQ2tNoC7.js → layout-kBr-ByLR.js} +1 -1
- package/dist/client/assets/main-BubyOwBK.css +1 -0
- package/dist/client/assets/{main-BbHA32iD.js → main-Tc53m1i8.js} +235 -235
- package/dist/client/assets/{mindmap-definition-VGOIOE7T-BBoouni0.js → mindmap-definition-VGOIOE7T-CHMj9x7w.js} +1 -1
- package/dist/client/assets/{pieDiagram-ADFJNKIX-DAO1Cf3O.js → pieDiagram-ADFJNKIX-JtGh9CwE.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-AYHSOK5B-CjJp6wOV.js → quadrantDiagram-AYHSOK5B-BtkeplJz.js} +1 -1
- package/dist/client/assets/{requirementDiagram-UZGBJVZJ-CX3MPDiG.js → requirementDiagram-UZGBJVZJ-DSIYZLch.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-TZEHDZUN-Cqnsrnu8.js → sankeyDiagram-TZEHDZUN-DQGg1SzY.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-WL72ISMW-CTJ2qJj_.js → sequenceDiagram-WL72ISMW-BLkWIPyC.js} +1 -1
- package/dist/client/assets/{stateDiagram-FKZM4ZOC-Cy-jjqJZ.js → stateDiagram-FKZM4ZOC-BuPqxfpf.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-4FDKWEC3-DSMlIvqa.js +1 -0
- package/dist/client/assets/{timeline-definition-IT6M3QCI-Bbb0ib0X.js → timeline-definition-IT6M3QCI-vh4dIOet.js} +1 -1
- package/dist/client/assets/{treemap-GDKQZRPO-DUB2cMCc.js → treemap-GDKQZRPO-C9Mr454A.js} +1 -1
- package/dist/client/assets/{worktree._worktreeId-CZWwGpYU.js → worktree._worktreeId-COUtiXXq.js} +1 -1
- package/dist/client/assets/{worktree._worktreeId-DSiEfzZW.js → worktree._worktreeId-DYrSBo4e.js} +1 -1
- package/dist/client/assets/{xychartDiagram-PRI3JC2R-CI6Pnd76.js → xychartDiagram-PRI3JC2R-DTTZebCh.js} +1 -1
- package/dist/start-server.mjs +160 -112
- package/package.json +7 -7
- package/dist/client/assets/channel-BhaORH-2.js +0 -1
- package/dist/client/assets/classDiagram-2ON5EDUG-iB9V-fQK.js +0 -1
- package/dist/client/assets/classDiagram-v2-WZHVMYZB-iB9V-fQK.js +0 -1
- package/dist/client/assets/clone-UwjnYJkb.js +0 -1
- package/dist/client/assets/main-Bump8gDQ.css +0 -1
- package/dist/client/assets/stateDiagram-v2-4FDKWEC3-CT80STo9.js +0 -1
package/dist/start-server.mjs
CHANGED
|
@@ -2987,11 +2987,11 @@ var require_tools = __commonJS({
|
|
|
2987
2987
|
}
|
|
2988
2988
|
}
|
|
2989
2989
|
}
|
|
2990
|
-
function buildFormatters(level, bindings,
|
|
2990
|
+
function buildFormatters(level, bindings, log78) {
|
|
2991
2991
|
return {
|
|
2992
2992
|
level,
|
|
2993
2993
|
bindings,
|
|
2994
|
-
log:
|
|
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:
|
|
3377
|
+
const { level, bindings: chindings, log: log78 } = options.formatters;
|
|
3378
3378
|
instance[formattersSym] = buildFormatters(
|
|
3379
3379
|
level || formatters.level,
|
|
3380
3380
|
chindings || resetChildingsFormatter,
|
|
3381
|
-
|
|
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
|
|
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
|
|
41282
|
-
*
|
|
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
|
-
|
|
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,
|
|
57902
|
-
getDb().update(environmentBuilds).set({ log:
|
|
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
|
|
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
|
-
|
|
58276
|
-
|
|
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,
|
|
58279
|
-
const toolchain = await this.buildToolchain(plan, tmp,
|
|
58280
|
-
const layered = await this.addWorkerLayer(plan, tmp, toolchain,
|
|
58281
|
-
await this.install(plan, tmp, layered, container,
|
|
58282
|
-
if (plan.registry) await this.push(plan,
|
|
58283
|
-
|
|
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
|
-
|
|
58308
|
+
log78.add(`FAILED: ${failure2}`);
|
|
58287
58309
|
}
|
|
58288
|
-
await this.exec(plan.host, "docker", ["rm", "--force", container],
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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,
|
|
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)
|
|
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())
|
|
58331
|
-
if (out.stderr.trim())
|
|
58332
|
-
|
|
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
|
-
|
|
58338
|
-
|
|
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,
|
|
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],
|
|
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}/`],
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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],
|
|
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,
|
|
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],
|
|
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,
|
|
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],
|
|
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
|
-
|
|
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
|
-
|
|
58445
|
+
log78
|
|
58424
58446
|
);
|
|
58425
|
-
await this.exec(plan.host, "docker", ["start", "--attach", container],
|
|
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
|
-
|
|
58452
|
+
log78
|
|
58431
58453
|
);
|
|
58432
58454
|
}
|
|
58433
|
-
async push(plan,
|
|
58434
|
-
await this.exec(plan.host, "docker", ["push", plan.tag],
|
|
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
|
-
|
|
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,
|
|
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[
|
|
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
|
-
|
|
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.
|
|
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
|
|
102584
|
-
if (
|
|
102585
|
-
for (const warning of result.warnings)
|
|
102586
|
-
for (const path2 of result.written)
|
|
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
|
-
|
|
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
|
-
|
|
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/
|
|
102598
|
-
|
|
102619
|
+
// src/server/services/coding-agent-seed.ts
|
|
102620
|
+
init_src();
|
|
102599
102621
|
init_state();
|
|
102600
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
102737
|
+
log74.warn("CLI not auto-installed (status: %s)", cliStatus);
|
|
102695
102738
|
return;
|
|
102696
102739
|
}
|
|
102697
|
-
|
|
102740
|
+
log74.info("Installing band CLI...");
|
|
102698
102741
|
try {
|
|
102699
102742
|
await installCli();
|
|
102700
|
-
|
|
102743
|
+
log74.info("CLI installed to %s", SYMLINK_PATH);
|
|
102701
102744
|
} catch (err) {
|
|
102702
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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"))
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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);
|