@band-app/server 0.37.0 → 0.38.0
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/assets/{TerminalPanel-B6hpsMbz.js → TerminalPanel-CddLlPAX.js} +1 -1
- package/dist/client/assets/{_basePickBy-DCmd5ciV.js → _basePickBy-Mr2ui_ok.js} +1 -1
- package/dist/client/assets/{_baseUniq-D9VK2Z8h.js → _baseUniq-BbCun8O9.js} +1 -1
- package/dist/client/assets/{arc-CUv7R2hs.js → arc-D72GLVnK.js} +1 -1
- package/dist/client/assets/{architectureDiagram-VXUJARFQ-p6VpjWC_.js → architectureDiagram-VXUJARFQ-CtL_pV38.js} +1 -1
- package/dist/client/assets/{blockDiagram-VD42YOAC-BqO2dZTh.js → blockDiagram-VD42YOAC-DqyIIG7r.js} +1 -1
- package/dist/client/assets/{c4Diagram-YG6GDRKO-Dj3Q1dN_.js → c4Diagram-YG6GDRKO-nrzjw8-Z.js} +1 -1
- package/dist/client/assets/channel-CLpfxzfv.js +1 -0
- package/dist/client/assets/{chunk-4BX2VUAB-ZCRzpI76.js → chunk-4BX2VUAB-CxMLZjJR.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-N8w7W4nW.js → chunk-55IACEB6-mmYFV3uk.js} +1 -1
- package/dist/client/assets/{chunk-B4BG7PRW-Bd2C6K3g.js → chunk-B4BG7PRW-D5v9xl9X.js} +1 -1
- package/dist/client/assets/{chunk-DI55MBZ5-CSmsIkhT.js → chunk-DI55MBZ5-D265fj7U.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-CSFx-rdE.js → chunk-FMBD7UC4-Dup-9g-C.js} +1 -1
- package/dist/client/assets/{chunk-QN33PNHL-OZhPV9ZW.js → chunk-QN33PNHL-C-rWtyk3.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-CmQTIqBs.js → chunk-QZHKN3VN-DFPCO41y.js} +1 -1
- package/dist/client/assets/{chunk-TZMSLE5B-CZXFZkbf.js → chunk-TZMSLE5B-DsmBPBDj.js} +1 -1
- package/dist/client/assets/classDiagram-2ON5EDUG-CHqpXULX.js +1 -0
- package/dist/client/assets/classDiagram-v2-WZHVMYZB-CHqpXULX.js +1 -0
- package/dist/client/assets/clone-kZf8-x5k.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-D2ZJ7fd6.js → cose-bilkent-S5V4N54A-CCWn4YDT.js} +1 -1
- package/dist/client/assets/{dagre-6UL2VRFP-DWWSarQ5.js → dagre-6UL2VRFP-CnSoXX5n.js} +1 -1
- package/dist/client/assets/{diagram-PSM6KHXK-Brpmw2Hy.js → diagram-PSM6KHXK-D9Zqn5kT.js} +1 -1
- package/dist/client/assets/{diagram-QEK2KX5R-ChxL1lOj.js → diagram-QEK2KX5R-B22XMhhn.js} +1 -1
- package/dist/client/assets/{diagram-S2PKOQOG-CWk5ucVa.js → diagram-S2PKOQOG-CtPm91f8.js} +1 -1
- package/dist/client/assets/{erDiagram-Q2GNP2WA-TKtLKYBO.js → erDiagram-Q2GNP2WA-Ctgsmx_B.js} +1 -1
- package/dist/client/assets/{flowDiagram-NV44I4VS-CNkvODlq.js → flowDiagram-NV44I4VS-BCt5r11U.js} +1 -1
- package/dist/client/assets/{ganttDiagram-JELNMOA3-GpiTT-6g.js → ganttDiagram-JELNMOA3-P1o9TA7p.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-V2S2FVAM-Dka5-Ebv.js → gitGraphDiagram-V2S2FVAM-CxVbFEsr.js} +1 -1
- package/dist/client/assets/{graph-BJfBQ-lk.js → graph-HCBV9xMB.js} +1 -1
- package/dist/client/assets/{highlighted-body-B3W2YXNL-Dcw7_8Mg.js → highlighted-body-B3W2YXNL-Gaqu4_Bi.js} +1 -1
- package/dist/client/assets/{index-Bf0KQTWS.js → index-B8S7APPC.js} +1 -1
- package/dist/client/assets/{index-D4kWf9j1.js → index-B9QUYOAR.js} +1 -1
- package/dist/client/assets/{index-BVmOFLZL.js → index-BQlNjJ1Y.js} +1 -1
- package/dist/client/assets/{index-BBjfnWP1.js → index-BR7y3Gjm.js} +1 -1
- package/dist/client/assets/{index-B55cfwG2.js → index-Bl-ZW84y.js} +1 -1
- package/dist/client/assets/{index-GWun5iKj.js → index-BsNWuo_5.js} +1 -1
- package/dist/client/assets/{index-C04T_A2n.js → index-C6aNqpcf.js} +1 -1
- package/dist/client/assets/{index-BqB0fXhh.js → index-CfHnPAjk.js} +1 -1
- package/dist/client/assets/{index-D7ptzMHA.js → index-CnoZP7Fs.js} +1 -1
- package/dist/client/assets/{index-Bw0gx-LL.js → index-D05HI19D.js} +1 -1
- package/dist/client/assets/{index-B8-bfanc.js → index-D854qjw6.js} +1 -1
- package/dist/client/assets/{index-D6AQfoh3.js → index-DIJ2_F70.js} +1 -1
- package/dist/client/assets/{index-DNCwYJJi.js → index-Gh5XAQRT.js} +1 -1
- package/dist/client/assets/{infoDiagram-HS3SLOUP-yepsEzeD.js → infoDiagram-HS3SLOUP-CmsTlZB8.js} +1 -1
- package/dist/client/assets/{journeyDiagram-XKPGCS4Q-Ah-IVMRC.js → journeyDiagram-XKPGCS4Q-D-GI9JIi.js} +1 -1
- package/dist/client/assets/{kanban-definition-3W4ZIXB7-4lmmn3Kf.js → kanban-definition-3W4ZIXB7-55Qs5mRI.js} +1 -1
- package/dist/client/assets/{layout-WnM58jJN.js → layout-B2VqN6hx.js} +1 -1
- package/dist/client/assets/{main-D7maoxCk.js → main-BYGBqn5C.js} +175 -175
- package/dist/client/assets/main-uTpkFvkD.css +1 -0
- package/dist/client/assets/{mindmap-definition-VGOIOE7T-CW03vZML.js → mindmap-definition-VGOIOE7T-5E-mnLiw.js} +1 -1
- package/dist/client/assets/{pieDiagram-ADFJNKIX-b38HzvV9.js → pieDiagram-ADFJNKIX--iuEHqnb.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-AYHSOK5B-D7COvUcB.js → quadrantDiagram-AYHSOK5B-DuZPB3Et.js} +1 -1
- package/dist/client/assets/{requirementDiagram-UZGBJVZJ-Dbo91lMQ.js → requirementDiagram-UZGBJVZJ-CZiE6M78.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-TZEHDZUN-DPpuI6f6.js → sankeyDiagram-TZEHDZUN-Dp81iX-I.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-WL72ISMW-osyniVrm.js → sequenceDiagram-WL72ISMW-BHT8ZcM2.js} +1 -1
- package/dist/client/assets/{stateDiagram-FKZM4ZOC-CEtXxDG2.js → stateDiagram-FKZM4ZOC-15v8J55n.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-4FDKWEC3-DKjPuiuj.js +1 -0
- package/dist/client/assets/{timeline-definition-IT6M3QCI-Bbim-hJj.js → timeline-definition-IT6M3QCI-C4Y7a-dk.js} +1 -1
- package/dist/client/assets/{treemap-GDKQZRPO-Bo5jz1c4.js → treemap-GDKQZRPO-1nZ3vFhH.js} +1 -1
- package/dist/client/assets/{workspace._workspaceId-Dx3IQ0uo.js → workspace._workspaceId-BflC9g6E.js} +1 -1
- package/dist/client/assets/{workspace._workspaceId-BAa7JD1w.js → workspace._workspaceId-FEoumKx5.js} +1 -1
- package/dist/client/assets/{xychartDiagram-PRI3JC2R-CwV1AnKv.js → xychartDiagram-PRI3JC2R-Cdm6l1QL.js} +1 -1
- package/dist/openapi.json +117 -36
- package/dist/server/assets/{TerminalPanel-oz5y-mkP.js → TerminalPanel-DFfLVpnD.js} +1 -1
- package/dist/server/assets/{_basePickBy-DEzTaMUa.js → _basePickBy-BJp7LAxW.js} +2 -2
- package/dist/server/assets/{_baseUniq-CnsXScTA.js → _baseUniq-C6AsZ3Xv.js} +1 -1
- package/dist/server/assets/_tanstack-start-manifest_v-CY2brxDW.js +4 -0
- package/dist/server/assets/{arc-DFOFayWx.js → arc-CdG8tMD4.js} +1 -1
- package/dist/server/assets/{architecture-7HQA4BMR-n9VmbCuR.js → architecture-7HQA4BMR-DAiqr3_e.js} +6 -6
- package/dist/server/assets/{architectureDiagram-VXUJARFQ-IeNkR88v.js → architectureDiagram-VXUJARFQ-B5KfJFud.js} +6 -6
- package/dist/server/assets/{blockDiagram-VD42YOAC-CWXr6KW7.js → blockDiagram-VD42YOAC-DHqCP2b4.js} +6 -6
- package/dist/server/assets/{c4Diagram-YG6GDRKO-DIRimETA.js → c4Diagram-YG6GDRKO-BxUADYG0.js} +2 -2
- package/dist/server/assets/{channel-Cdqq5j16.js → channel-AccynRMn.js} +1 -1
- package/dist/server/assets/{chunk-4BX2VUAB-Cozm9hqk.js → chunk-4BX2VUAB-Dr1erjpr.js} +1 -1
- package/dist/server/assets/{chunk-55IACEB6-DRjrJM1L.js → chunk-55IACEB6-Bp9fy_-K.js} +1 -1
- package/dist/server/assets/{chunk-B4BG7PRW-BwiA7gAZ.js → chunk-B4BG7PRW-DIekCOU0.js} +4 -4
- package/dist/server/assets/{chunk-DI55MBZ5-DYx-lIkt.js → chunk-DI55MBZ5-DdsSqZAU.js} +3 -3
- package/dist/server/assets/{chunk-FMBD7UC4-Bd38Wnw9.js → chunk-FMBD7UC4-yK1qgpi7.js} +1 -1
- package/dist/server/assets/{chunk-QN33PNHL-ONbSMsSY.js → chunk-QN33PNHL-BbG6vBLZ.js} +1 -1
- package/dist/server/assets/{chunk-QZHKN3VN-fU_vVgPJ.js → chunk-QZHKN3VN-x8T6uBe6.js} +1 -1
- package/dist/server/assets/{chunk-TZMSLE5B-BBpSfNKJ.js → chunk-TZMSLE5B-DLaeAZ2i.js} +1 -1
- package/dist/server/assets/{classDiagram-v2-WZHVMYZB-BLteCxZe.js → classDiagram-2ON5EDUG-Dm_cGVOP.js} +5 -5
- package/dist/server/assets/{classDiagram-2ON5EDUG-BLteCxZe.js → classDiagram-v2-WZHVMYZB-Dm_cGVOP.js} +5 -5
- package/dist/server/assets/{clone-DHWXuNGD.js → clone-CORmWwEs.js} +1 -1
- package/dist/server/assets/{cose-bilkent-S5V4N54A-Dqv8g3XR.js → cose-bilkent-S5V4N54A-BfBG7OY2.js} +1 -1
- package/dist/server/assets/{dagre-6UL2VRFP-DvvoFaVJ.js → dagre-6UL2VRFP-LXGdLIDl.js} +6 -6
- package/dist/server/assets/{diagram-PSM6KHXK-CbKKlJvK.js → diagram-PSM6KHXK-Dq-nGhg0.js} +7 -7
- package/dist/server/assets/{diagram-QEK2KX5R-GLrYhnWw.js → diagram-QEK2KX5R-rd29zHZp.js} +6 -6
- package/dist/server/assets/{diagram-S2PKOQOG-uaww8JQd.js → diagram-S2PKOQOG-pULTY82u.js} +6 -6
- package/dist/server/assets/{erDiagram-Q2GNP2WA-CBpgZJNk.js → erDiagram-Q2GNP2WA-BB0T0Xnn.js} +4 -4
- package/dist/server/assets/{flowDiagram-NV44I4VS-DwqeGUt2.js → flowDiagram-NV44I4VS-DpODroRz.js} +5 -5
- package/dist/server/assets/{ganttDiagram-JELNMOA3-CSDzrG3u.js → ganttDiagram-JELNMOA3-Cv3UNeb8.js} +1 -1
- package/dist/server/assets/{gitGraph-G5XIXVHT-CI6QTqC-.js → gitGraph-G5XIXVHT-Gi_FOXtP.js} +6 -6
- package/dist/server/assets/{gitGraphDiagram-V2S2FVAM-4Hraf1YX.js → gitGraphDiagram-V2S2FVAM-BJPLdwXn.js} +7 -7
- package/dist/server/assets/{graph-BKeol0ik.js → graph-DZvAvEGU.js} +2 -2
- package/dist/server/assets/{highlighted-body-B3W2YXNL-C_Th2vxh.js → highlighted-body-B3W2YXNL-BpysDJ-x.js} +1 -1
- package/dist/server/assets/{index-BQEmg9fY.js → index-1E-3f8Qq.js} +1 -1
- package/dist/server/assets/{index-CoOBJObR.js → index-BERXawHP.js} +1 -1
- package/dist/server/assets/{index-B-VeeFTd.js → index-BN_8r_Ld.js} +1 -1
- package/dist/server/assets/{index-DOtn1sP2.js → index-C3lgs4G4.js} +1 -1
- package/dist/server/assets/{index-dS3n7bt3.js → index-CKDVINR-.js} +1 -1
- package/dist/server/assets/{index-KTMc95HN.js → index-CSCKMAKA.js} +1 -1
- package/dist/server/assets/{index-BtAQWAP4.js → index-ChLbrNFl.js} +1 -1
- package/dist/server/assets/{index-CklLNUhb.js → index-ChPBr3vZ.js} +1 -1
- package/dist/server/assets/{index-SeV-ZdZi.js → index-CzlCSrfR.js} +1 -1
- package/dist/server/assets/{index-CXm0C-yc.js → index-D1exxtRP.js} +1 -1
- package/dist/server/assets/{index-BVY32Ndh.js → index-U-1MZOIQ.js} +1 -1
- package/dist/server/assets/{index-BmH5PL3t.js → index-Y0CJ6FO8.js} +1 -1
- package/dist/server/assets/{index-WYUrghvu.js → index-iqainN_h.js} +1 -1
- package/dist/server/assets/{info-VBDWY6EO-qXtU7fls.js → info-VBDWY6EO-Ba8HLWBX.js} +6 -6
- package/dist/server/assets/{infoDiagram-HS3SLOUP-Bnhyc8dm.js → infoDiagram-HS3SLOUP-BYfrlW-j.js} +5 -5
- package/dist/server/assets/{journeyDiagram-XKPGCS4Q-DCeht2II.js → journeyDiagram-XKPGCS4Q-VV4qbZDl.js} +4 -4
- package/dist/server/assets/{kanban-definition-3W4ZIXB7-D2wyptyQ.js → kanban-definition-3W4ZIXB7-TtjjtFt_.js} +2 -2
- package/dist/server/assets/{layout-D8oV2IEs.js → layout-CxNf3z_2.js} +4 -4
- package/dist/server/assets/{mermaid-3ZIDBTTL-BLpPLDqd.js → mermaid-3ZIDBTTL-ChndXjXw.js} +1 -1
- package/dist/server/assets/{mermaid-parser.core-BbOvn3Uv.js → mermaid-parser.core-nvqu-aiP.js} +11 -11
- package/dist/server/assets/{mindmap-definition-VGOIOE7T-CKJkiH58.js → mindmap-definition-VGOIOE7T-DME5Y_pR.js} +3 -3
- package/dist/server/assets/{packet-DYOGHKS2-CnxepCEW.js → packet-DYOGHKS2-Bt1WHvgh.js} +6 -6
- package/dist/server/assets/{pie-VRWISCQL-KXauGON3.js → pie-VRWISCQL-WTXmin9S.js} +6 -6
- package/dist/server/assets/{pieDiagram-ADFJNKIX-B8juLdbl.js → pieDiagram-ADFJNKIX-CUbwYVab.js} +7 -7
- package/dist/server/assets/{quadrantDiagram-AYHSOK5B-CLY3QLCC.js → quadrantDiagram-AYHSOK5B-BB6u0IN3.js} +1 -1
- package/dist/server/assets/{radar-ZZBFDIW7-CIRaA_9T.js → radar-ZZBFDIW7-BWKvWMhz.js} +6 -6
- package/dist/server/assets/{requirementDiagram-UZGBJVZJ-CgDmK30l.js → requirementDiagram-UZGBJVZJ-BLRtjxGN.js} +3 -3
- package/dist/server/assets/{router-G1mE-O-Q.js → router-BjXwm096.js} +187 -129
- package/dist/server/assets/{sankeyDiagram-TZEHDZUN-B9355ZLW.js → sankeyDiagram-TZEHDZUN-BF1Ts-tv.js} +1 -1
- package/dist/server/assets/{sequenceDiagram-WL72ISMW-SyLdlVhU.js → sequenceDiagram-WL72ISMW-DB8euEl-.js} +3 -3
- package/dist/server/assets/{stateDiagram-FKZM4ZOC-B8krws9Z.js → stateDiagram-FKZM4ZOC-CgrYrlDa.js} +8 -8
- package/dist/server/assets/{stateDiagram-v2-4FDKWEC3-CqkUhCge.js → stateDiagram-v2-4FDKWEC3-Ch28pf2n.js} +4 -4
- package/dist/server/assets/{timeline-definition-IT6M3QCI-eG_EzXZg.js → timeline-definition-IT6M3QCI-jW-suedf.js} +2 -2
- package/dist/server/assets/{treemap-GDKQZRPO-DS3w9TMX.js → treemap-GDKQZRPO-ClNoljcd.js} +6 -6
- package/dist/server/assets/{workspace._workspaceId-DMYkHS43.js → workspace._workspaceId-CBpMR_kd.js} +1 -1
- package/dist/server/assets/{workspace._workspaceId-Bd4v7PwG.js → workspace._workspaceId-CD0MjjsK.js} +1 -1
- package/dist/server/assets/{xychartDiagram-PRI3JC2R-DAi7zkg3.js → xychartDiagram-PRI3JC2R-BKGpeSar.js} +1 -1
- package/dist/server/server.js +2 -2
- package/dist/start-server.mjs +279 -58
- package/package.json +4 -4
- package/dist/client/assets/channel-30zU4uX-.js +0 -1
- package/dist/client/assets/classDiagram-2ON5EDUG-xMXNI9Qc.js +0 -1
- package/dist/client/assets/classDiagram-v2-WZHVMYZB-xMXNI9Qc.js +0 -1
- package/dist/client/assets/clone-D1RDOFVG.js +0 -1
- package/dist/client/assets/main-C-PIkr2h.css +0 -1
- package/dist/client/assets/stateDiagram-v2-4FDKWEC3-DtnGHNEG.js +0 -1
- package/dist/server/assets/_tanstack-start-manifest_v-CGO9e_6B.js +0 -4
package/dist/start-server.mjs
CHANGED
|
@@ -92313,11 +92313,17 @@ function notify(chatId) {
|
|
|
92313
92313
|
}
|
|
92314
92314
|
function cloneMessage(msg) {
|
|
92315
92315
|
return {
|
|
92316
|
-
|
|
92317
|
-
text: msg.text,
|
|
92316
|
+
...msg,
|
|
92318
92317
|
files: msg.files ? msg.files.map((f2) => ({ ...f2 })) : void 0
|
|
92319
92318
|
};
|
|
92320
92319
|
}
|
|
92320
|
+
function turnOptions(input) {
|
|
92321
|
+
return {
|
|
92322
|
+
...input.mode !== void 0 && { mode: input.mode },
|
|
92323
|
+
...input.model !== void 0 && { model: input.model },
|
|
92324
|
+
...input.codingAgentId !== void 0 && { codingAgentId: input.codingAgentId }
|
|
92325
|
+
};
|
|
92326
|
+
}
|
|
92321
92327
|
function subscribeQueue(listener) {
|
|
92322
92328
|
queueListeners.add(listener);
|
|
92323
92329
|
return () => {
|
|
@@ -92328,7 +92334,8 @@ function pushQueuedMessage(chatId, input) {
|
|
|
92328
92334
|
const message = {
|
|
92329
92335
|
id: randomUUID(),
|
|
92330
92336
|
text: input.text,
|
|
92331
|
-
files: input.files && input.files.length > 0 ? input.files.map((f2) => ({ ...f2 })) : void 0
|
|
92337
|
+
files: input.files && input.files.length > 0 ? input.files.map((f2) => ({ ...f2 })) : void 0,
|
|
92338
|
+
...turnOptions(input)
|
|
92332
92339
|
};
|
|
92333
92340
|
const msgs = store.get(chatId);
|
|
92334
92341
|
if (msgs) {
|
|
@@ -92343,11 +92350,17 @@ function setQueuedMessages(chatId, messages) {
|
|
|
92343
92350
|
if (messages.length === 0) {
|
|
92344
92351
|
store.delete(chatId);
|
|
92345
92352
|
} else {
|
|
92346
|
-
const
|
|
92347
|
-
|
|
92348
|
-
|
|
92349
|
-
|
|
92350
|
-
|
|
92353
|
+
const previous = new Map((store.get(chatId) ?? []).map((m3) => [m3.id, m3]));
|
|
92354
|
+
const stored = messages.map((m3) => {
|
|
92355
|
+
const kept = m3.id !== void 0 ? previous.get(m3.id) : void 0;
|
|
92356
|
+
return {
|
|
92357
|
+
id: m3.id ?? randomUUID(),
|
|
92358
|
+
text: m3.text,
|
|
92359
|
+
files: m3.files && m3.files.length > 0 ? m3.files.map((f2) => ({ ...f2 })) : void 0,
|
|
92360
|
+
...kept && turnOptions(kept),
|
|
92361
|
+
...turnOptions(m3)
|
|
92362
|
+
};
|
|
92363
|
+
});
|
|
92351
92364
|
store.set(chatId, stored);
|
|
92352
92365
|
}
|
|
92353
92366
|
notify(chatId);
|
|
@@ -92355,6 +92368,13 @@ function setQueuedMessages(chatId, messages) {
|
|
|
92355
92368
|
function getQueuedMessages(chatId) {
|
|
92356
92369
|
return (store.get(chatId) ?? []).map(cloneMessage);
|
|
92357
92370
|
}
|
|
92371
|
+
function hasQueuedMessages(chatId) {
|
|
92372
|
+
return (store.get(chatId)?.length ?? 0) > 0;
|
|
92373
|
+
}
|
|
92374
|
+
function peekQueuedMessage(chatId) {
|
|
92375
|
+
const first = store.get(chatId)?.[0];
|
|
92376
|
+
return first ? cloneMessage(first) : null;
|
|
92377
|
+
}
|
|
92358
92378
|
function shiftQueuedMessage(chatId) {
|
|
92359
92379
|
const msgs = store.get(chatId);
|
|
92360
92380
|
if (!msgs || msgs.length === 0) return null;
|
|
@@ -107359,8 +107379,42 @@ var CLIENT_CAPABILITIES = {
|
|
|
107359
107379
|
// Claude Code's AskUserQuestion arrives as a form elicitation, and is
|
|
107360
107380
|
// disabled when the client can't render one.
|
|
107361
107381
|
elicitation: { form: {} },
|
|
107362
|
-
session: { notices: {} }
|
|
107363
|
-
|
|
107382
|
+
session: { notices: {} },
|
|
107383
|
+
// JetBrains AIR extension: the Claude adapter reports background work
|
|
107384
|
+
// (background Bash, Monitor, workflows) as `async_task_*` updates only to
|
|
107385
|
+
// a client that lists `asyncTasks`. Band uses them to keep the process
|
|
107386
|
+
// alive while that work runs.
|
|
107387
|
+
_meta: { jetbrains: { air: { version: 1, capabilities: ["asyncTasks"] } } }
|
|
107388
|
+
};
|
|
107389
|
+
function asAsyncTaskNotification(message) {
|
|
107390
|
+
if (!message || typeof message !== "object") return null;
|
|
107391
|
+
const m3 = message;
|
|
107392
|
+
if (m3.method !== methods.client.session.update) return null;
|
|
107393
|
+
const params = m3.params;
|
|
107394
|
+
const update = params?.update;
|
|
107395
|
+
if (typeof params?.sessionId !== "string" || typeof update?.sessionUpdate !== "string" || !update.sessionUpdate.startsWith("async_task_") || typeof update.asyncTaskId !== "string") {
|
|
107396
|
+
return null;
|
|
107397
|
+
}
|
|
107398
|
+
return params;
|
|
107399
|
+
}
|
|
107400
|
+
function splitAsyncTasks(readable, onAsyncTask) {
|
|
107401
|
+
return readable.pipeThrough(
|
|
107402
|
+
new TransformStream({
|
|
107403
|
+
transform(message, controller) {
|
|
107404
|
+
const task = asAsyncTaskNotification(message);
|
|
107405
|
+
if (!task) {
|
|
107406
|
+
controller.enqueue(message);
|
|
107407
|
+
return;
|
|
107408
|
+
}
|
|
107409
|
+
try {
|
|
107410
|
+
onAsyncTask(task);
|
|
107411
|
+
} catch (err) {
|
|
107412
|
+
log.warn({ err }, "async task handler threw");
|
|
107413
|
+
}
|
|
107414
|
+
}
|
|
107415
|
+
})
|
|
107416
|
+
);
|
|
107417
|
+
}
|
|
107364
107418
|
function stderrTail() {
|
|
107365
107419
|
let buf = "";
|
|
107366
107420
|
return {
|
|
@@ -107426,10 +107480,14 @@ var AcpAgentProcess = class _AcpAgentProcess {
|
|
|
107426
107480
|
} catch (err) {
|
|
107427
107481
|
throw new Error(`Could not start ${label}: ${err.message}`);
|
|
107428
107482
|
}
|
|
107429
|
-
const
|
|
107483
|
+
const wire = ndJsonStream2(
|
|
107430
107484
|
Writable.toWeb(child.stdin),
|
|
107431
107485
|
Readable.toWeb(child.stdout)
|
|
107432
107486
|
);
|
|
107487
|
+
const stream = {
|
|
107488
|
+
writable: wire.writable,
|
|
107489
|
+
readable: splitAsyncTasks(wire.readable, (n) => handlers3.onAsyncTask?.(n))
|
|
107490
|
+
};
|
|
107433
107491
|
const connection = client({ name: "band" }).onNotification(methods.client.session.update, (ctx) => {
|
|
107434
107492
|
handlers3.onUpdate(ctx.params);
|
|
107435
107493
|
}).onRequest(methods.client.session.requestPermission, async (ctx) => ({
|
|
@@ -107801,11 +107859,11 @@ function resumeCliInvocation(agentType, sessionId, opts) {
|
|
|
107801
107859
|
var CLAUDE_CODE_INTERACTIVE_TOOLS = /* @__PURE__ */ new Set(["AskUserQuestion", "ExitPlanMode"]);
|
|
107802
107860
|
function mapClaudeCodeHookStatus(payload) {
|
|
107803
107861
|
const hookEvent = typeof payload.hook_event_name === "string" ? payload.hook_event_name : "";
|
|
107804
|
-
const
|
|
107862
|
+
const toolName2 = typeof payload.tool_name === "string" ? payload.tool_name : "";
|
|
107805
107863
|
if (hookEvent === "Stop") {
|
|
107806
107864
|
return "needs_attention";
|
|
107807
107865
|
}
|
|
107808
|
-
if ((hookEvent === "PreToolUse" || hookEvent === "PermissionRequest") && CLAUDE_CODE_INTERACTIVE_TOOLS.has(
|
|
107866
|
+
if ((hookEvent === "PreToolUse" || hookEvent === "PermissionRequest") && CLAUDE_CODE_INTERACTIVE_TOOLS.has(toolName2)) {
|
|
107809
107867
|
return "needs_attention";
|
|
107810
107868
|
}
|
|
107811
107869
|
return "working";
|
|
@@ -116936,6 +116994,101 @@ var ChatEventQueries = class {
|
|
|
116936
116994
|
}
|
|
116937
116995
|
};
|
|
116938
116996
|
|
|
116997
|
+
// src/server/services/_utils/agent-pending-work.ts
|
|
116998
|
+
var MAX_HOLD_MS = 8 * 60 * 6e4;
|
|
116999
|
+
var MONITOR_DEFAULT_TIMEOUT_MS = 5 * 6e4;
|
|
117000
|
+
function toolName(update) {
|
|
117001
|
+
const meta2 = update._meta;
|
|
117002
|
+
const name3 = meta2?.claudeCode?.toolName ?? update.name;
|
|
117003
|
+
return typeof name3 === "string" ? name3 : void 0;
|
|
117004
|
+
}
|
|
117005
|
+
function finiteNumber(value) {
|
|
117006
|
+
return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : void 0;
|
|
117007
|
+
}
|
|
117008
|
+
var PendingWork = class {
|
|
117009
|
+
holds = /* @__PURE__ */ new Map();
|
|
117010
|
+
/** Tool calls an async task was announced for. */
|
|
117011
|
+
taskToolCalls = /* @__PURE__ */ new Set();
|
|
117012
|
+
/** Notes what a `session/update` starts or ends. `inTurn` is whether a
|
|
117013
|
+
* Band-started turn is running. */
|
|
117014
|
+
observeUpdate(update, inTurn, now = Date.now()) {
|
|
117015
|
+
if (update.sessionUpdate !== "tool_call" && update.sessionUpdate !== "tool_call_update") return;
|
|
117016
|
+
const key2 = `tool:${update.toolCallId}`;
|
|
117017
|
+
if (this.taskToolCalls.has(update.toolCallId)) return;
|
|
117018
|
+
if (update.status === "failed") {
|
|
117019
|
+
this.holds.delete(key2);
|
|
117020
|
+
return;
|
|
117021
|
+
}
|
|
117022
|
+
const held = this.holds.get(key2);
|
|
117023
|
+
if (update.status === "completed") {
|
|
117024
|
+
if (held?.untilCompleted) this.holds.delete(key2);
|
|
117025
|
+
return;
|
|
117026
|
+
}
|
|
117027
|
+
if (held) return;
|
|
117028
|
+
const hold = this.toolHold(update, now);
|
|
117029
|
+
if (hold) {
|
|
117030
|
+
this.set(key2, hold, now);
|
|
117031
|
+
return;
|
|
117032
|
+
}
|
|
117033
|
+
if (!inTurn && update.sessionUpdate === "tool_call") {
|
|
117034
|
+
this.set(key2, { reason: "tool call", until: now + MAX_HOLD_MS, untilCompleted: true }, now);
|
|
117035
|
+
}
|
|
117036
|
+
}
|
|
117037
|
+
/** Notes an AIR async task starting or ending. */
|
|
117038
|
+
observeAsyncTask(update, now = Date.now()) {
|
|
117039
|
+
const key2 = `task:${update.asyncTaskId}`;
|
|
117040
|
+
if (update.sessionUpdate === "async_task_spawned") {
|
|
117041
|
+
if (update.toolCallId) {
|
|
117042
|
+
this.taskToolCalls.add(update.toolCallId);
|
|
117043
|
+
this.holds.delete(`tool:${update.toolCallId}`);
|
|
117044
|
+
}
|
|
117045
|
+
this.set(
|
|
117046
|
+
key2,
|
|
117047
|
+
{ reason: `${update.taskType ?? "background"} task`, until: now + MAX_HOLD_MS },
|
|
117048
|
+
now
|
|
117049
|
+
);
|
|
117050
|
+
} else if (update.sessionUpdate === "async_task_state_update" && (update.state === "completed" || update.state === "failed" || update.state === "stopped")) {
|
|
117051
|
+
this.holds.delete(key2);
|
|
117052
|
+
if (update.toolCallId) this.holds.delete(`tool:${update.toolCallId}`);
|
|
117053
|
+
}
|
|
117054
|
+
}
|
|
117055
|
+
/** The holds still in force, dropping the ones that lapsed. */
|
|
117056
|
+
outstanding(now = Date.now()) {
|
|
117057
|
+
for (const [key2, hold] of this.holds) {
|
|
117058
|
+
if (hold.until <= now) this.holds.delete(key2);
|
|
117059
|
+
}
|
|
117060
|
+
return [...this.holds.values()];
|
|
117061
|
+
}
|
|
117062
|
+
clear() {
|
|
117063
|
+
this.holds.clear();
|
|
117064
|
+
this.taskToolCalls.clear();
|
|
117065
|
+
}
|
|
117066
|
+
toolHold(update, now) {
|
|
117067
|
+
const input = update.rawInput;
|
|
117068
|
+
if (!input || typeof input !== "object") return null;
|
|
117069
|
+
switch (toolName(update)) {
|
|
117070
|
+
case "ScheduleWakeup": {
|
|
117071
|
+
const delaySeconds = finiteNumber(input.delaySeconds);
|
|
117072
|
+
return delaySeconds === void 0 ? null : { reason: "scheduled wakeup", until: now + delaySeconds * 1e3 };
|
|
117073
|
+
}
|
|
117074
|
+
case "CronCreate":
|
|
117075
|
+
return { reason: "cron job", until: now + MAX_HOLD_MS };
|
|
117076
|
+
case "Monitor": {
|
|
117077
|
+
const timeout = finiteNumber(input.timeout_ms) ?? MONITOR_DEFAULT_TIMEOUT_MS;
|
|
117078
|
+
return { reason: "monitor", until: now + timeout };
|
|
117079
|
+
}
|
|
117080
|
+
case "Bash":
|
|
117081
|
+
case "PowerShell":
|
|
117082
|
+
return input.run_in_background === true ? { reason: "background command", until: now + MAX_HOLD_MS, untilCompleted: true } : null;
|
|
117083
|
+
default:
|
|
117084
|
+
return null;
|
|
117085
|
+
}
|
|
117086
|
+
}
|
|
117087
|
+
set(key2, hold, now) {
|
|
117088
|
+
this.holds.set(key2, { ...hold, until: Math.min(hold.until, now + MAX_HOLD_MS) });
|
|
117089
|
+
}
|
|
117090
|
+
};
|
|
117091
|
+
|
|
116939
117092
|
// src/server/services/_utils/chat-log-replay.ts
|
|
116940
117093
|
function textChunk(row) {
|
|
116941
117094
|
const event = row.event;
|
|
@@ -145503,6 +145656,25 @@ function submitTask(options2) {
|
|
|
145503
145656
|
});
|
|
145504
145657
|
return toTaskInfo(task);
|
|
145505
145658
|
}
|
|
145659
|
+
function submitOrQueueTask(options2) {
|
|
145660
|
+
const { workspaceId: workspaceId2, chatId } = options2;
|
|
145661
|
+
if (!workspaceService.resolve(workspaceId2)) {
|
|
145662
|
+
throw new WorkspaceNotFoundError(workspaceId2);
|
|
145663
|
+
}
|
|
145664
|
+
const running = tasks2.get(chatId)?.status === "running";
|
|
145665
|
+
if (!running && !hasQueuedMessages(chatId)) {
|
|
145666
|
+
return { queued: false, task: submitTask(options2) };
|
|
145667
|
+
}
|
|
145668
|
+
const queued = pushQueuedMessage(chatId, {
|
|
145669
|
+
text: options2.prompt,
|
|
145670
|
+
files: options2.attachments,
|
|
145671
|
+
mode: options2.mode,
|
|
145672
|
+
model: options2.model,
|
|
145673
|
+
codingAgentId: options2.codingAgentId
|
|
145674
|
+
});
|
|
145675
|
+
if (!running) drainQueue(workspaceId2, chatId);
|
|
145676
|
+
return { queued: true, queuedMessageId: queued.id };
|
|
145677
|
+
}
|
|
145506
145678
|
async function runTask(task) {
|
|
145507
145679
|
const { chatId } = task;
|
|
145508
145680
|
chatService.updateStatus(chatId, "running");
|
|
@@ -145632,7 +145804,7 @@ function finishTask(task, outcome) {
|
|
|
145632
145804
|
task.completedAt = Date.now();
|
|
145633
145805
|
persistTask(task);
|
|
145634
145806
|
if (tasks2.get(task.chatId) === task) tasks2.delete(task.chatId);
|
|
145635
|
-
if (status === "completed" && drainQueue(task)) return;
|
|
145807
|
+
if (status === "completed" && drainQueue(task.workspaceId, task.chatId)) return;
|
|
145636
145808
|
chatService.updateStatus(task.chatId, status === "completed" ? "idle" : "error");
|
|
145637
145809
|
const stopped = outcome === "cancelled" || task.cancelRequested === true;
|
|
145638
145810
|
const updated = setWorkspaceSourceStatus(task.workspaceId, chatStatusSource(task.chatId), {
|
|
@@ -145640,20 +145812,24 @@ function finishTask(task, outcome) {
|
|
|
145640
145812
|
});
|
|
145641
145813
|
emit({ kind: "update", status: updated });
|
|
145642
145814
|
}
|
|
145643
|
-
function drainQueue(
|
|
145644
|
-
const queued =
|
|
145815
|
+
function drainQueue(workspaceId2, chatId) {
|
|
145816
|
+
const queued = peekQueuedMessage(chatId);
|
|
145645
145817
|
if (!queued) return false;
|
|
145646
145818
|
try {
|
|
145647
145819
|
const attachments = (queued.files ?? []).filter((f2) => f2.path).map((f2) => ({ path: f2.path, mediaType: f2.mediaType, url: f2.url, filename: f2.filename }));
|
|
145648
145820
|
submitTask({
|
|
145649
|
-
workspaceId:
|
|
145650
|
-
chatId
|
|
145821
|
+
workspaceId: workspaceId2,
|
|
145822
|
+
chatId,
|
|
145651
145823
|
prompt: queued.text,
|
|
145652
|
-
attachments
|
|
145824
|
+
attachments,
|
|
145825
|
+
mode: queued.mode,
|
|
145826
|
+
model: queued.model,
|
|
145827
|
+
codingAgentId: queued.codingAgentId
|
|
145653
145828
|
});
|
|
145829
|
+
removeQueuedMessage(chatId, queued.id);
|
|
145654
145830
|
return true;
|
|
145655
145831
|
} catch (err) {
|
|
145656
|
-
log19.warn({ chatId
|
|
145832
|
+
log19.warn({ chatId, err }, "failed to auto-start queued task");
|
|
145657
145833
|
return false;
|
|
145658
145834
|
}
|
|
145659
145835
|
}
|
|
@@ -145700,6 +145876,9 @@ var TaskService = class {
|
|
|
145700
145876
|
submitTask(options2) {
|
|
145701
145877
|
return submitTask(options2);
|
|
145702
145878
|
}
|
|
145879
|
+
submitOrQueueTask(options2) {
|
|
145880
|
+
return submitOrQueueTask(options2);
|
|
145881
|
+
}
|
|
145703
145882
|
abortTask(chatId) {
|
|
145704
145883
|
return abortTask(chatId);
|
|
145705
145884
|
}
|
|
@@ -149584,6 +149763,7 @@ var chatService = new ChatService();
|
|
|
149584
149763
|
var log31 = createLogger("agent-sessions");
|
|
149585
149764
|
var IDLE_TIMEOUT_MS = 15 * 6e4;
|
|
149586
149765
|
var CANCEL_GRACE_MS = 15e3;
|
|
149766
|
+
var MAX_TIMER_MS = 2 ** 31 - 1;
|
|
149587
149767
|
var PROBE_SETTLE_MS = 1500;
|
|
149588
149768
|
var events = new ChatEventQueries();
|
|
149589
149769
|
var settings = new SettingsQueries();
|
|
@@ -149662,6 +149842,7 @@ function runtimeFor(chat, def2) {
|
|
|
149662
149842
|
turnSeq: 0,
|
|
149663
149843
|
live: emptyLive(),
|
|
149664
149844
|
pending: /* @__PURE__ */ new Map(),
|
|
149845
|
+
work: new PendingWork(),
|
|
149665
149846
|
idleTimer: null,
|
|
149666
149847
|
claudeCli: null
|
|
149667
149848
|
};
|
|
@@ -149677,19 +149858,41 @@ function stopRuntime(rt) {
|
|
|
149677
149858
|
rt.sessionId = null;
|
|
149678
149859
|
runtimes.delete(rt.chatId);
|
|
149679
149860
|
}
|
|
149680
|
-
function
|
|
149861
|
+
function idleTimeoutMs() {
|
|
149862
|
+
const override = Number(process.env.BAND_AGENT_IDLE_TIMEOUT_MS);
|
|
149863
|
+
return Number.isFinite(override) && override > 0 ? override : IDLE_TIMEOUT_MS;
|
|
149864
|
+
}
|
|
149865
|
+
function scheduleIdle(rt, delayMs = idleTimeoutMs()) {
|
|
149681
149866
|
if (rt.idleTimer) clearTimeout(rt.idleTimer);
|
|
149867
|
+
const delay2 = Math.min(delayMs, MAX_TIMER_MS);
|
|
149682
149868
|
rt.idleTimer = setTimeout(() => {
|
|
149683
149869
|
rt.idleTimer = null;
|
|
149684
149870
|
if (rt.inTurn || rt.pending.size > 0 || rt.attaching) return;
|
|
149871
|
+
const now = Date.now();
|
|
149872
|
+
const holds = rt.work.outstanding(now);
|
|
149873
|
+
if (holds.length > 0) {
|
|
149874
|
+
const until = Math.max(...holds.map((h) => h.until));
|
|
149875
|
+
log31.info(
|
|
149876
|
+
{
|
|
149877
|
+
chatId: rt.chatId,
|
|
149878
|
+
work: holds.map((h) => ({ reason: h.reason, until: new Date(h.until).toISOString() }))
|
|
149879
|
+
},
|
|
149880
|
+
"idle agent has pending work; not stopping it"
|
|
149881
|
+
);
|
|
149882
|
+
scheduleIdle(rt, until - now + idleTimeoutMs());
|
|
149883
|
+
return;
|
|
149884
|
+
}
|
|
149685
149885
|
log31.info({ chatId: rt.chatId }, "stopping idle agent");
|
|
149686
149886
|
rt.process?.close();
|
|
149687
149887
|
rt.process = null;
|
|
149688
149888
|
rt.sessionId = null;
|
|
149689
149889
|
if (runtimes.get(rt.chatId) === rt) runtimes.delete(rt.chatId);
|
|
149690
|
-
},
|
|
149890
|
+
}, delay2);
|
|
149691
149891
|
rt.idleTimer.unref?.();
|
|
149692
149892
|
}
|
|
149893
|
+
function agentActive(rt) {
|
|
149894
|
+
if (!rt.inTurn && !rt.attaching && rt.process) scheduleIdle(rt);
|
|
149895
|
+
}
|
|
149693
149896
|
function record2(rt, event, turnStart = false) {
|
|
149694
149897
|
if (!rt.sessionId) {
|
|
149695
149898
|
broadcastTransient(rt.chatId, event);
|
|
@@ -149805,6 +150008,10 @@ function routeUpdate(rt, notification) {
|
|
|
149805
150008
|
}
|
|
149806
150009
|
const update = notification.update;
|
|
149807
150010
|
applyLive(rt, update);
|
|
150011
|
+
if (!rt.attaching) {
|
|
150012
|
+
rt.work.observeUpdate(update, rt.inTurn);
|
|
150013
|
+
agentActive(rt);
|
|
150014
|
+
}
|
|
149808
150015
|
if (rt.routing === "drop") return;
|
|
149809
150016
|
if (update.sessionUpdate === "user_message_chunk") {
|
|
149810
150017
|
if (rt.inTurn) return;
|
|
@@ -149875,6 +150082,11 @@ function requestElicitation(rt, request, signal) {
|
|
|
149875
150082
|
function handlersFor(rt, generation) {
|
|
149876
150083
|
return {
|
|
149877
150084
|
onUpdate: (n) => routeUpdate(rt, n),
|
|
150085
|
+
onAsyncTask: (n) => {
|
|
150086
|
+
if (n.sessionId !== rt.sessionId || rt.attaching) return;
|
|
150087
|
+
rt.work.observeAsyncTask(n.update);
|
|
150088
|
+
agentActive(rt);
|
|
150089
|
+
},
|
|
149878
150090
|
onPermission: (req, signal) => requestPermission(rt, req, signal),
|
|
149879
150091
|
onElicitation: (req, signal) => requestElicitation(rt, req, signal),
|
|
149880
150092
|
onExit: (code, stderr) => {
|
|
@@ -149882,6 +150094,7 @@ function handlersFor(rt, generation) {
|
|
|
149882
150094
|
log31.info({ chatId: rt.chatId, code }, "agent exited");
|
|
149883
150095
|
log31.debug({ chatId: rt.chatId, stderr: stderr.slice(-500) }, "agent stderr");
|
|
149884
150096
|
for (const p3 of [...rt.pending.values()]) p3.cancel();
|
|
150097
|
+
rt.work.clear();
|
|
149885
150098
|
rt.process = null;
|
|
149886
150099
|
rt.starting = null;
|
|
149887
150100
|
}
|
|
@@ -150844,7 +151057,7 @@ async function handleChatSubmit(req, res, chatId) {
|
|
|
150844
151057
|
}));
|
|
150845
151058
|
}
|
|
150846
151059
|
try {
|
|
150847
|
-
taskService.
|
|
151060
|
+
const result = taskService.submitOrQueueTask({
|
|
150848
151061
|
workspaceId: workspaceId2,
|
|
150849
151062
|
chatId,
|
|
150850
151063
|
prompt: text3,
|
|
@@ -150854,18 +151067,12 @@ async function handleChatSubmit(req, res, chatId) {
|
|
|
150854
151067
|
model,
|
|
150855
151068
|
codingAgentId
|
|
150856
151069
|
});
|
|
150857
|
-
log33.info(
|
|
150858
|
-
|
|
151070
|
+
log33.info(
|
|
151071
|
+
{ chatId, workspaceId: workspaceId2 },
|
|
151072
|
+
result.queued ? "chat-submit: chat busy, message queued" : "chat-submit: task started"
|
|
151073
|
+
);
|
|
151074
|
+
sendJson2(res, 200, { ok: true, queued: result.queued });
|
|
150859
151075
|
} catch (err) {
|
|
150860
|
-
if (err instanceof TaskConflictError) {
|
|
150861
|
-
pushQueuedMessage(chatId, {
|
|
150862
|
-
text: text3,
|
|
150863
|
-
...attachments.length > 0 && { files: attachments }
|
|
150864
|
-
});
|
|
150865
|
-
log33.info({ chatId, workspaceId: workspaceId2 }, "chat-submit: task busy, message queued");
|
|
150866
|
-
sendJson2(res, 200, { ok: true, queued: true });
|
|
150867
|
-
return;
|
|
150868
|
-
}
|
|
150869
151076
|
if (err instanceof WorkspaceNotFoundError) {
|
|
150870
151077
|
sendJson2(res, 404, { error: err.message });
|
|
150871
151078
|
return;
|
|
@@ -155807,7 +156014,7 @@ var McpServer = class {
|
|
|
155807
156014
|
/**
|
|
155808
156015
|
* Validates tool input arguments against the tool's input schema.
|
|
155809
156016
|
*/
|
|
155810
|
-
async validateToolInput(tool, args,
|
|
156017
|
+
async validateToolInput(tool, args, toolName2) {
|
|
155811
156018
|
if (!tool.inputSchema) {
|
|
155812
156019
|
return void 0;
|
|
155813
156020
|
}
|
|
@@ -155817,14 +156024,14 @@ var McpServer = class {
|
|
|
155817
156024
|
if (!parseResult.success) {
|
|
155818
156025
|
const error40 = "error" in parseResult ? parseResult.error : "Unknown error";
|
|
155819
156026
|
const errorMessage = getParseErrorMessage(error40);
|
|
155820
|
-
throw new McpError(ErrorCode.InvalidParams, `Input validation error: Invalid arguments for tool ${
|
|
156027
|
+
throw new McpError(ErrorCode.InvalidParams, `Input validation error: Invalid arguments for tool ${toolName2}: ${errorMessage}`);
|
|
155821
156028
|
}
|
|
155822
156029
|
return parseResult.data;
|
|
155823
156030
|
}
|
|
155824
156031
|
/**
|
|
155825
156032
|
* Validates tool output against the tool's output schema.
|
|
155826
156033
|
*/
|
|
155827
|
-
async validateToolOutput(tool, result,
|
|
156034
|
+
async validateToolOutput(tool, result, toolName2) {
|
|
155828
156035
|
if (!tool.outputSchema) {
|
|
155829
156036
|
return;
|
|
155830
156037
|
}
|
|
@@ -155835,14 +156042,14 @@ var McpServer = class {
|
|
|
155835
156042
|
return;
|
|
155836
156043
|
}
|
|
155837
156044
|
if (!result.structuredContent) {
|
|
155838
|
-
throw new McpError(ErrorCode.InvalidParams, `Output validation error: Tool ${
|
|
156045
|
+
throw new McpError(ErrorCode.InvalidParams, `Output validation error: Tool ${toolName2} has an output schema but no structured content was provided`);
|
|
155839
156046
|
}
|
|
155840
156047
|
const outputObj = normalizeObjectSchema(tool.outputSchema);
|
|
155841
156048
|
const parseResult = await safeParseAsync3(outputObj, result.structuredContent);
|
|
155842
156049
|
if (!parseResult.success) {
|
|
155843
156050
|
const error40 = "error" in parseResult ? parseResult.error : "Unknown error";
|
|
155844
156051
|
const errorMessage = getParseErrorMessage(error40);
|
|
155845
|
-
throw new McpError(ErrorCode.InvalidParams, `Output validation error: Invalid structured content for tool ${
|
|
156052
|
+
throw new McpError(ErrorCode.InvalidParams, `Output validation error: Invalid structured content for tool ${toolName2}: ${errorMessage}`);
|
|
155846
156053
|
}
|
|
155847
156054
|
}
|
|
155848
156055
|
/**
|
|
@@ -158627,23 +158834,25 @@ var chatsRouter = t3.router({
|
|
|
158627
158834
|
if (!chat) {
|
|
158628
158835
|
chat = chatService.create(input.workspaceId, { id: input.chatId, name: "Chat" });
|
|
158629
158836
|
}
|
|
158630
|
-
|
|
158631
|
-
|
|
158632
|
-
|
|
158633
|
-
|
|
158634
|
-
|
|
158635
|
-
|
|
158636
|
-
|
|
158637
|
-
return {
|
|
158638
|
-
|
|
158639
|
-
|
|
158640
|
-
|
|
158641
|
-
|
|
158642
|
-
|
|
158643
|
-
});
|
|
158644
|
-
}
|
|
158645
|
-
throw err;
|
|
158837
|
+
const result = taskService.submitOrQueueTask({
|
|
158838
|
+
workspaceId: chat.workspaceId,
|
|
158839
|
+
chatId: chat.id,
|
|
158840
|
+
prompt: input.message,
|
|
158841
|
+
sessionId: input.sessionId
|
|
158842
|
+
});
|
|
158843
|
+
if (result.queued) {
|
|
158844
|
+
return {
|
|
158845
|
+
queued: true,
|
|
158846
|
+
queuedMessageId: result.queuedMessageId,
|
|
158847
|
+
taskId: null,
|
|
158848
|
+
sessionId: null
|
|
158849
|
+
};
|
|
158646
158850
|
}
|
|
158851
|
+
return {
|
|
158852
|
+
queued: false,
|
|
158853
|
+
taskId: result.task.id,
|
|
158854
|
+
sessionId: result.task.sessionId
|
|
158855
|
+
};
|
|
158647
158856
|
}),
|
|
158648
158857
|
stop: publicProcedure.input(external_exports2.object({ chatId: external_exports2.string() })).mutation(({ input }) => {
|
|
158649
158858
|
taskService.abortTask(input.chatId);
|
|
@@ -162148,7 +162357,7 @@ var tasksRouter = t3.router({
|
|
|
162148
162357
|
}));
|
|
162149
162358
|
}
|
|
162150
162359
|
try {
|
|
162151
|
-
const
|
|
162360
|
+
const result = taskService.submitOrQueueTask({
|
|
162152
162361
|
workspaceId: input.workspaceId,
|
|
162153
162362
|
chatId,
|
|
162154
162363
|
prompt: input.prompt,
|
|
@@ -162158,7 +162367,19 @@ var tasksRouter = t3.router({
|
|
|
162158
162367
|
model: input.model,
|
|
162159
162368
|
codingAgentId: input.codingAgentId
|
|
162160
162369
|
});
|
|
162370
|
+
if (result.queued) {
|
|
162371
|
+
return {
|
|
162372
|
+
queued: true,
|
|
162373
|
+
id: null,
|
|
162374
|
+
queuedMessageId: result.queuedMessageId,
|
|
162375
|
+
workspaceId: input.workspaceId,
|
|
162376
|
+
chatId,
|
|
162377
|
+
sessionId: null
|
|
162378
|
+
};
|
|
162379
|
+
}
|
|
162380
|
+
const { task } = result;
|
|
162161
162381
|
return {
|
|
162382
|
+
queued: false,
|
|
162162
162383
|
id: task.id,
|
|
162163
162384
|
workspaceId: task.workspaceId,
|
|
162164
162385
|
chatId: task.chatId,
|
|
@@ -164993,10 +165214,10 @@ function discoverProcedures() {
|
|
|
164993
165214
|
for (const [path, procedure] of Object.entries(procRecord)) {
|
|
164994
165215
|
const type = procedure._def.type;
|
|
164995
165216
|
if (type === "subscription") continue;
|
|
164996
|
-
const
|
|
165217
|
+
const toolName2 = `band_${path.replace(/\./g, "_")}`;
|
|
164997
165218
|
const inputs = procedure._def.inputs;
|
|
164998
165219
|
const inputSchema = inputs.length > 0 ? inputs[0] : void 0;
|
|
164999
|
-
procedures.push({ path, toolName, type, inputSchema });
|
|
165220
|
+
procedures.push({ path, toolName: toolName2, type, inputSchema });
|
|
165000
165221
|
}
|
|
165001
165222
|
return procedures;
|
|
165002
165223
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@band-app/server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.38.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"band-server": "./bin/band-server.mjs"
|
|
@@ -127,11 +127,11 @@
|
|
|
127
127
|
"ws": "^8.18.0",
|
|
128
128
|
"zod": "^3.25.67",
|
|
129
129
|
"zustand": "^5.0.0",
|
|
130
|
-
"@band-app/coding-agent": "^0.
|
|
131
|
-
"@band-app/logger": "^0.
|
|
130
|
+
"@band-app/coding-agent": "^0.38.0",
|
|
131
|
+
"@band-app/logger": "^0.38.0",
|
|
132
132
|
"@band-app/plugin-api": "^0.1.0",
|
|
133
133
|
"@band-app/plugin-github": "^0.1.0",
|
|
134
|
-
"@band-app/ui": "^0.
|
|
134
|
+
"@band-app/ui": "^0.38.0"
|
|
135
135
|
},
|
|
136
136
|
"scripts": {
|
|
137
137
|
"dev": "NODE_ENV=development tsx watch start-server.ts",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Y as a,Z as n}from"./main-D7maoxCk.js";const t=(r,o)=>a.lang.round(n.parse(r)[o]);export{t as c};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as a,c as s,a as e,C as t}from"./chunk-B4BG7PRW-Bd2C6K3g.js";import{_ as i}from"./main-D7maoxCk.js";import"./chunk-FMBD7UC4-CSFx-rdE.js";import"./chunk-55IACEB6-N8w7W4nW.js";import"./chunk-QN33PNHL-OZhPV9ZW.js";var p={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{p as diagram};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as a,c as s,a as e,C as t}from"./chunk-B4BG7PRW-Bd2C6K3g.js";import{_ as i}from"./main-D7maoxCk.js";import"./chunk-FMBD7UC4-CSFx-rdE.js";import"./chunk-55IACEB6-N8w7W4nW.js";import"./chunk-QN33PNHL-OZhPV9ZW.js";var p={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{p as diagram};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{b as r}from"./_baseUniq-D9VK2Z8h.js";var e=4;function a(o){return r(o,e)}export{a as c};
|