bunqueue-dashboard 0.0.36 → 0.0.38
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/README.md +25 -10
- package/agent/backup/resultValidation.ts +1 -1
- package/agent/backup/routes.ts +4 -3
- package/agent/flow/routes.ts +7 -6
- package/agent/index.ts +17 -4
- package/agent/managedTarget.ts +41 -2
- package/agent/manager/config.ts +1 -1
- package/agent/queue/routes.ts +21 -14
- package/agent/server/controlRoutes.ts +39 -7
- package/agent/server/controlTarget.ts +116 -0
- package/agent/server/errors.ts +1 -0
- package/agent/server/handler.ts +10 -1
- package/agent/server/router.ts +19 -8
- package/agent/server/types.ts +7 -0
- package/agent/server.ts +10 -0
- package/agent/workflow/runtimeRoutes.ts +5 -4
- package/agent/workflows.ts +1 -1
- package/dist/.vite/manifest.json +207 -207
- package/dist/assets/{AddJob-UUa2fSXE.js → AddJob-CC4bfHLH.js} +1 -1
- package/dist/assets/{Alerts-7oGYfQMb.js → Alerts-C2bAi-Kj.js} +1 -1
- package/dist/assets/{Benchmark-C2NFp_kj.js → Benchmark-ClJmYZoC.js} +1 -1
- package/dist/assets/{BulkAddJobs-CL4yBae-.js → BulkAddJobs-BBWqQpP7.js} +1 -1
- package/dist/assets/{CopilotPanel-BQ2Cgo9p.js → CopilotPanel-Bhh-uCpN.js} +3 -3
- package/dist/assets/{Cron-DfWBhoBf.js → Cron-pJJ5KXFG.js} +1 -1
- package/dist/assets/{CronManager-DAK7RSOX.js → CronManager-lNZ4lHh1.js} +1 -1
- package/dist/assets/{Database-DqL7giEj.js → Database-DxiXsUl4.js} +1 -1
- package/dist/assets/{Diagnostics-D98YwN-6.js → Diagnostics-DLvCT7zI.js} +1 -1
- package/dist/assets/{Dlq-BHmA5PTI.js → Dlq-Bx4YXTp5.js} +1 -1
- package/dist/assets/{DlqControl-DihxvP-i.js → DlqControl-DJGhuyu3.js} +1 -1
- package/dist/assets/{DlqPro-ncgnDtpE.js → DlqPro-BhXIKtrt.js} +1 -1
- package/dist/assets/{Flows-B5N5Cil0.js → Flows-Bb9j-YhZ.js} +2 -2
- package/dist/assets/{JobInspector-B40nFiGh.js → JobInspector-DfqBq4O5.js} +2 -2
- package/dist/assets/{Jobs-Bla3IEef.js → Jobs-Blavwd1H.js} +1 -1
- package/dist/assets/{JobsPro-CnczVx7x.js → JobsPro-D8dH9um7.js} +1 -1
- package/dist/assets/{Logs-T91Q3cH0.js → Logs-B3dsGSF8.js} +1 -1
- package/dist/assets/{LogsPro-CMn6-Wwv.js → LogsPro-BCB7etG2.js} +1 -1
- package/dist/assets/{McpServer-BQBabwW-.js → McpServer-Cz1-GwD5.js} +2 -2
- package/dist/assets/{Metrics-DxT_RI2B.js → Metrics-Bkuy6Ntb.js} +1 -1
- package/dist/assets/{MetricsPro-Cjen-nAP.js → MetricsPro-BbJmy0oO.js} +1 -1
- package/dist/assets/{Overview-XN2ej8ph.js → Overview-Ba5odzYe.js} +1 -1
- package/dist/assets/{QueueActions-C-Aferd6.js → QueueActions-B6M0ByGt.js} +1 -1
- package/dist/assets/{QueueControl-B8Q9NX6t.js → QueueControl-CWHsVfWU.js} +1 -1
- package/dist/assets/{QueueDetail-BMhG0jUB.js → QueueDetail-BClRbWC5.js} +1 -1
- package/dist/assets/{QueueDetailPro-BKTTyLR4.js → QueueDetailPro-CIimG0pX.js} +1 -1
- package/dist/assets/{Queues-COqPMoY9.js → Queues-CGPgEkVm.js} +1 -1
- package/dist/assets/{QueuesOverview-pWdrPy8Z.js → QueuesOverview-ChC5Dtqh.js} +1 -1
- package/dist/assets/{S3Backup-BmsZ8xtq.js → S3Backup-5OKa8G13.js} +1 -1
- package/dist/assets/S3BackupPro-BkwTXdtw.js +3 -0
- package/dist/assets/{ServerControl-D3XwHr72.js → ServerControl-DJHKMaf9.js} +3 -3
- package/dist/assets/{Settings-BofKZoHn.js → Settings-C1HtCK6h.js} +1 -1
- package/dist/assets/{Usage-DAR9E22v.js → Usage-QyZkUhgs.js} +1 -1
- package/dist/assets/{UsagePro-Bc30N2Lo.js → UsagePro-DMxrXxur.js} +1 -1
- package/dist/assets/{Webhooks-Bg2k1PU4.js → Webhooks-D0JQQf0q.js} +1 -1
- package/dist/assets/{Workers-BqUZMJVQ.js → Workers-Cn8Bkgy1.js} +1 -1
- package/dist/assets/{WorkersPro-C9aSadUh.js → WorkersPro-BOTuX9EP.js} +1 -1
- package/dist/assets/{Workflows-BEFMfHmo.js → Workflows-DqTKWPmT.js} +1 -1
- package/dist/assets/{api-CQ5Z7xR7.js → api-V_sVpHDo.js} +1 -1
- package/dist/assets/bq-Bmysbg0r.js +1 -0
- package/dist/assets/{connectionStore-DbBYqHEY.js → connectionStore-CKFQrxDo.js} +1 -1
- package/dist/assets/{controlConnectionEpoch-CFSO6237.js → controlConnectionEpoch-JM4omZ6j.js} +1 -1
- package/dist/assets/{flowMutationSafety-CoOp94wS.js → flowMutationSafety-DObp9nJo.js} +1 -1
- package/dist/assets/index-Cue53Myw.js +8 -0
- package/dist/assets/install-CFiYX86d.js +3 -0
- package/dist/assets/{responses-kPO4rSu5.js → responses-CBLyy1Ob.js} +1 -1
- package/dist/assets/{toastStore-CS_9Xndn.js → toastStore-B7n0zS0y.js} +1 -1
- package/dist/assets/{upstreamPaths-D_LPsv7b.js → upstreamPaths-CDVsu6IM.js} +1 -1
- package/dist/assets/{usePolledData-DzlUpBOO.js → usePolledData-g80Z_UB-.js} +1 -1
- package/dist/assets/{useServerActionGuard-BlH-Kso1.js → useServerActionGuard-OTv6_fU0.js} +1 -1
- package/dist/assets/useThroughputSeries-CrsZYKbT.js +1 -0
- package/dist/index.html +7 -7
- package/package.json +14 -7
- package/scripts/embedded.gen.ts +160 -160
- package/scripts/serve.ts +38 -7
- package/scripts/serveHandler.ts +27 -7
- package/scripts/servePolicy.ts +54 -0
- package/dist/assets/S3BackupPro-AtlsPUJL.js +0 -3
- package/dist/assets/bq-BeBxa743.js +0 -1
- package/dist/assets/index-Cui9IwWy.js +0 -8
- package/dist/assets/install-Cd9Is10G.js +0 -3
- package/dist/assets/useThroughputSeries-C2pa1Wd_.js +0 -1
package/scripts/embedded.gen.ts
CHANGED
|
@@ -1,165 +1,165 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
2
|
// AUTO-GENERATED by scripts/gen-embed.ts — do not edit, not committed.
|
|
3
|
-
import f0 from "../dist/
|
|
4
|
-
import f1 from "../dist
|
|
5
|
-
import f2 from "../dist/
|
|
6
|
-
import f3 from "../dist/
|
|
7
|
-
import f4 from "../dist/assets/
|
|
8
|
-
import f5 from "../dist/assets/
|
|
9
|
-
import f6 from "../dist/assets/
|
|
10
|
-
import f7 from "../dist/assets/
|
|
11
|
-
import f8 from "../dist/assets/
|
|
12
|
-
import f9 from "../dist/assets/
|
|
13
|
-
import f10 from "../dist/assets/
|
|
14
|
-
import f11 from "../dist/assets/
|
|
15
|
-
import f12 from "../dist/assets/
|
|
16
|
-
import f13 from "../dist/assets/
|
|
17
|
-
import f14 from "../dist/assets/
|
|
18
|
-
import f15 from "../dist/assets/
|
|
19
|
-
import f16 from "../dist/assets/
|
|
20
|
-
import f17 from "../dist/assets/
|
|
21
|
-
import f18 from "../dist/assets/
|
|
22
|
-
import f19 from "../dist/assets/
|
|
23
|
-
import f20 from "../dist/assets/
|
|
24
|
-
import f21 from "../dist/assets/
|
|
25
|
-
import f22 from "../dist/assets/
|
|
26
|
-
import f23 from "../dist/assets/
|
|
27
|
-
import f24 from "../dist/assets/
|
|
28
|
-
import f25 from "../dist/assets/
|
|
29
|
-
import f26 from "../dist/assets/
|
|
30
|
-
import f27 from "../dist/assets/
|
|
31
|
-
import f28 from "../dist/assets/
|
|
32
|
-
import f29 from "../dist/assets/
|
|
33
|
-
import f30 from "../dist/assets/
|
|
34
|
-
import f31 from "../dist/assets/
|
|
35
|
-
import f32 from "../dist/assets/
|
|
36
|
-
import f33 from "../dist/assets/
|
|
37
|
-
import f34 from "../dist/assets/
|
|
38
|
-
import f35 from "../dist/assets/
|
|
39
|
-
import f36 from "../dist/assets/
|
|
40
|
-
import f37 from "../dist/assets/
|
|
41
|
-
import f38 from "../dist/assets/
|
|
42
|
-
import f39 from "../dist/assets/
|
|
43
|
-
import f40 from "../dist/assets/
|
|
44
|
-
import f41 from "../dist/assets/
|
|
45
|
-
import f42 from "../dist/assets/
|
|
46
|
-
import f43 from "../dist/assets/
|
|
47
|
-
import f44 from "../dist/assets/
|
|
48
|
-
import f45 from "../dist/assets/
|
|
49
|
-
import f46 from "../dist/assets/
|
|
50
|
-
import f47 from "../dist/assets/
|
|
51
|
-
import f48 from "../dist/assets/
|
|
52
|
-
import f49 from "../dist/assets/
|
|
53
|
-
import f50 from "../dist/assets/
|
|
54
|
-
import f51 from "../dist/assets/
|
|
55
|
-
import f52 from "../dist/assets/
|
|
56
|
-
import f53 from "../dist/assets/Workers-
|
|
57
|
-
import f54 from "../dist/assets/
|
|
58
|
-
import f55 from "../dist/assets/
|
|
59
|
-
import f56 from "../dist/assets/
|
|
60
|
-
import f57 from "../dist/assets/
|
|
61
|
-
import f58 from "../dist/assets/
|
|
62
|
-
import f59 from "../dist/assets/
|
|
63
|
-
import f60 from "../dist/assets/
|
|
64
|
-
import f61 from "../dist/assets/
|
|
65
|
-
import f62 from "../dist/assets/
|
|
66
|
-
import f63 from "../dist/assets/CopilotPanel-
|
|
67
|
-
import f64 from "../dist/assets/
|
|
68
|
-
import f65 from "../dist/assets/
|
|
69
|
-
import f66 from "../dist/assets/
|
|
70
|
-
import f67 from "../dist/assets/
|
|
71
|
-
import f68 from "../dist/assets/
|
|
72
|
-
import f69 from "../dist/assets/dist-
|
|
73
|
-
import f70 from "../dist/assets/
|
|
74
|
-
import f71 from "../dist/assets/
|
|
75
|
-
import f72 from "../dist/assets/
|
|
76
|
-
import f73 from "../dist/assets/
|
|
77
|
-
import f74 from "../dist/assets/
|
|
78
|
-
import f75 from "../dist/assets/
|
|
79
|
-
import f76 from "../dist/assets/
|
|
80
|
-
import f77 from "../dist/assets/
|
|
81
|
-
import f78 from "../dist/assets/
|
|
82
|
-
import f79 from "../dist/
|
|
3
|
+
import f0 from "../dist/index.html" with { type: 'file' };
|
|
4
|
+
import f1 from "../dist/favicon.svg" with { type: 'file' };
|
|
5
|
+
import f2 from "../dist/og.png" with { type: 'file' };
|
|
6
|
+
import f3 from "../dist/assets/Benchmark-ClJmYZoC.js" with { type: 'file' };
|
|
7
|
+
import f4 from "../dist/assets/bq-Bmysbg0r.js" with { type: 'file' };
|
|
8
|
+
import f5 from "../dist/assets/JobInspector-DfqBq4O5.js" with { type: 'file' };
|
|
9
|
+
import f6 from "../dist/assets/QueueActions-B6M0ByGt.js" with { type: 'file' };
|
|
10
|
+
import f7 from "../dist/assets/UsagePro-DMxrXxur.js" with { type: 'file' };
|
|
11
|
+
import f8 from "../dist/assets/index-Cue53Myw.js" with { type: 'file' };
|
|
12
|
+
import f9 from "../dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2" with { type: 'file' };
|
|
13
|
+
import f10 from "../dist/assets/CronManager-lNZ4lHh1.js" with { type: 'file' };
|
|
14
|
+
import f11 from "../dist/assets/BulkAddJobs-BBWqQpP7.js" with { type: 'file' };
|
|
15
|
+
import f12 from "../dist/assets/DlqControl-DJGhuyu3.js" with { type: 'file' };
|
|
16
|
+
import f13 from "../dist/assets/LogsPro-BCB7etG2.js" with { type: 'file' };
|
|
17
|
+
import f14 from "../dist/assets/exportFile-C7xhE8Yh.js" with { type: 'file' };
|
|
18
|
+
import f15 from "../dist/assets/Usage-QyZkUhgs.js" with { type: 'file' };
|
|
19
|
+
import f16 from "../dist/assets/connectionStore-CKFQrxDo.js" with { type: 'file' };
|
|
20
|
+
import f17 from "../dist/assets/AreaChart-w0ruozXH.js" with { type: 'file' };
|
|
21
|
+
import f18 from "../dist/assets/dist-DjvZiKhB.js" with { type: 'file' };
|
|
22
|
+
import f19 from "../dist/assets/flowMutationSafety-DObp9nJo.js" with { type: 'file' };
|
|
23
|
+
import f20 from "../dist/assets/api-V_sVpHDo.js" with { type: 'file' };
|
|
24
|
+
import f21 from "../dist/assets/Logs-B3dsGSF8.js" with { type: 'file' };
|
|
25
|
+
import f22 from "../dist/assets/install-CFiYX86d.js" with { type: 'file' };
|
|
26
|
+
import f23 from "../dist/assets/controlConnectionEpoch-JM4omZ6j.js" with { type: 'file' };
|
|
27
|
+
import f24 from "../dist/assets/responses-CBLyy1Ob.js" with { type: 'file' };
|
|
28
|
+
import f25 from "../dist/assets/Overview-Ba5odzYe.js" with { type: 'file' };
|
|
29
|
+
import f26 from "../dist/assets/Cron-pJJ5KXFG.js" with { type: 'file' };
|
|
30
|
+
import f27 from "../dist/assets/DlqPro-BhXIKtrt.js" with { type: 'file' };
|
|
31
|
+
import f28 from "../dist/assets/S3BackupPro-BkwTXdtw.js" with { type: 'file' };
|
|
32
|
+
import f29 from "../dist/assets/useServerActionGuard-OTv6_fU0.js" with { type: 'file' };
|
|
33
|
+
import f30 from "../dist/assets/Flows-Bb9j-YhZ.js" with { type: 'file' };
|
|
34
|
+
import f31 from "../dist/assets/JobsPro-D8dH9um7.js" with { type: 'file' };
|
|
35
|
+
import f32 from "../dist/assets/Card-C7NMhqUt.js" with { type: 'file' };
|
|
36
|
+
import f33 from "../dist/assets/Diagnostics-DLvCT7zI.js" with { type: 'file' };
|
|
37
|
+
import f34 from "../dist/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2" with { type: 'file' };
|
|
38
|
+
import f35 from "../dist/assets/form-tC20r4Ma.js" with { type: 'file' };
|
|
39
|
+
import f36 from "../dist/assets/ServerControl-DJHKMaf9.js" with { type: 'file' };
|
|
40
|
+
import f37 from "../dist/assets/Dlq-Bx4YXTp5.js" with { type: 'file' };
|
|
41
|
+
import f38 from "../dist/assets/McpServer-Cz1-GwD5.js" with { type: 'file' };
|
|
42
|
+
import f39 from "../dist/assets/dist-DpZcbP9W.js" with { type: 'file' };
|
|
43
|
+
import f40 from "../dist/assets/icons-CIvFfU2b.js" with { type: 'file' };
|
|
44
|
+
import f41 from "../dist/assets/Database-DxiXsUl4.js" with { type: 'file' };
|
|
45
|
+
import f42 from "../dist/assets/upstreamPaths-CDVsu6IM.js" with { type: 'file' };
|
|
46
|
+
import f43 from "../dist/assets/PageHeader-BXlZSBcc.js" with { type: 'file' };
|
|
47
|
+
import f44 from "../dist/assets/cn-zFEt5SO8.js" with { type: 'file' };
|
|
48
|
+
import f45 from "../dist/assets/Workflows-DqTKWPmT.js" with { type: 'file' };
|
|
49
|
+
import f46 from "../dist/assets/Metrics-Bkuy6Ntb.js" with { type: 'file' };
|
|
50
|
+
import f47 from "../dist/assets/Pagination-Q-vf4hsX.js" with { type: 'file' };
|
|
51
|
+
import f48 from "../dist/assets/useThroughputSeries-CrsZYKbT.js" with { type: 'file' };
|
|
52
|
+
import f49 from "../dist/assets/QueuesOverview-ChC5Dtqh.js" with { type: 'file' };
|
|
53
|
+
import f50 from "../dist/assets/MetricsPro-BbJmy0oO.js" with { type: 'file' };
|
|
54
|
+
import f51 from "../dist/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2" with { type: 'file' };
|
|
55
|
+
import f52 from "../dist/assets/format-Cg7VCIZW.js" with { type: 'file' };
|
|
56
|
+
import f53 from "../dist/assets/Workers-Cn8Bkgy1.js" with { type: 'file' };
|
|
57
|
+
import f54 from "../dist/assets/S3Backup-5OKa8G13.js" with { type: 'file' };
|
|
58
|
+
import f55 from "../dist/assets/react-vendor-CyjgmGTq.js" with { type: 'file' };
|
|
59
|
+
import f56 from "../dist/assets/dist-1f1fMHVO.js" with { type: 'file' };
|
|
60
|
+
import f57 from "../dist/assets/feedback-BnGE2oW2.js" with { type: 'file' };
|
|
61
|
+
import f58 from "../dist/assets/Webhooks-D0JQQf0q.js" with { type: 'file' };
|
|
62
|
+
import f59 from "../dist/assets/index-DOze4TKg.css" with { type: 'file' };
|
|
63
|
+
import f60 from "../dist/assets/toastStore-B7n0zS0y.js" with { type: 'file' };
|
|
64
|
+
import f61 from "../dist/assets/promisePool-BVfQ9n9Q.js" with { type: 'file' };
|
|
65
|
+
import f62 from "../dist/assets/WorkersPro-BOTuX9EP.js" with { type: 'file' };
|
|
66
|
+
import f63 from "../dist/assets/CopilotPanel-Bhh-uCpN.js" with { type: 'file' };
|
|
67
|
+
import f64 from "../dist/assets/QueueDetailPro-CIimG0pX.js" with { type: 'file' };
|
|
68
|
+
import f65 from "../dist/assets/Settings-C1HtCK6h.js" with { type: 'file' };
|
|
69
|
+
import f66 from "../dist/assets/AddJob-CC4bfHLH.js" with { type: 'file' };
|
|
70
|
+
import f67 from "../dist/assets/Alerts-C2bAi-Kj.js" with { type: 'file' };
|
|
71
|
+
import f68 from "../dist/assets/Button-BPqpRZJD.js" with { type: 'file' };
|
|
72
|
+
import f69 from "../dist/assets/dist-BlWBaCN6.js" with { type: 'file' };
|
|
73
|
+
import f70 from "../dist/assets/StatusBadge-B0I7hNBX.js" with { type: 'file' };
|
|
74
|
+
import f71 from "../dist/assets/Queues-CGPgEkVm.js" with { type: 'file' };
|
|
75
|
+
import f72 from "../dist/assets/Jobs-Blavwd1H.js" with { type: 'file' };
|
|
76
|
+
import f73 from "../dist/assets/QueueDetail-BClRbWC5.js" with { type: 'file' };
|
|
77
|
+
import f74 from "../dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2" with { type: 'file' };
|
|
78
|
+
import f75 from "../dist/assets/QueueControl-CWHsVfWU.js" with { type: 'file' };
|
|
79
|
+
import f76 from "../dist/assets/usePolledData-g80Z_UB-.js" with { type: 'file' };
|
|
80
|
+
import f77 from "../dist/assets/jobActions-LQD4KfCc.js" with { type: 'file' };
|
|
81
|
+
import f78 from "../dist/assets/dist-DZL8soAh.js" with { type: 'file' };
|
|
82
|
+
import f79 from "../dist/.vite/manifest.json" with { type: 'file' };
|
|
83
83
|
|
|
84
84
|
export const ASSETS: Record<string, string> = {
|
|
85
|
-
"/
|
|
86
|
-
"
|
|
87
|
-
"/
|
|
88
|
-
"/
|
|
89
|
-
"/assets/
|
|
90
|
-
"/assets/
|
|
91
|
-
"/assets/
|
|
92
|
-
"/assets/
|
|
93
|
-
"/assets/
|
|
94
|
-
"/assets/
|
|
95
|
-
"/assets/
|
|
96
|
-
"/assets/
|
|
97
|
-
"/assets/
|
|
98
|
-
"/assets/
|
|
99
|
-
"/assets/
|
|
100
|
-
"/assets/
|
|
101
|
-
"/assets/
|
|
102
|
-
"/assets/
|
|
103
|
-
"/assets/
|
|
104
|
-
"/assets/
|
|
105
|
-
"/assets/
|
|
106
|
-
"/assets/
|
|
107
|
-
"/assets/
|
|
108
|
-
"/assets/
|
|
109
|
-
"/assets/
|
|
110
|
-
"/assets/
|
|
111
|
-
"/assets/
|
|
112
|
-
"/assets/
|
|
113
|
-
"/assets/
|
|
114
|
-
"/assets/
|
|
115
|
-
"/assets/
|
|
116
|
-
"/assets/
|
|
117
|
-
"/assets/
|
|
118
|
-
"/assets/
|
|
119
|
-
"/assets/
|
|
120
|
-
"/assets/
|
|
121
|
-
"/assets/
|
|
122
|
-
"/assets/
|
|
123
|
-
"/assets/
|
|
124
|
-
"/assets/
|
|
125
|
-
"/assets/
|
|
126
|
-
"/assets/
|
|
127
|
-
"/assets/
|
|
128
|
-
"/assets/
|
|
129
|
-
"/assets/
|
|
130
|
-
"/assets/
|
|
131
|
-
"/assets/
|
|
132
|
-
"/assets/
|
|
133
|
-
"/assets/
|
|
134
|
-
"/assets/
|
|
135
|
-
"/assets/
|
|
136
|
-
"/assets/
|
|
137
|
-
"/assets/
|
|
138
|
-
"/assets/Workers-
|
|
139
|
-
"/assets/
|
|
140
|
-
"/assets/
|
|
141
|
-
"/assets/
|
|
142
|
-
"/assets/
|
|
143
|
-
"/assets/
|
|
144
|
-
"/assets/
|
|
145
|
-
"/assets/
|
|
146
|
-
"/assets/
|
|
147
|
-
"/assets/
|
|
148
|
-
"/assets/CopilotPanel-
|
|
149
|
-
"/assets/
|
|
150
|
-
"/assets/
|
|
151
|
-
"/assets/
|
|
152
|
-
"/assets/
|
|
153
|
-
"/assets/
|
|
154
|
-
"/assets/dist-
|
|
155
|
-
"/assets/
|
|
156
|
-
"/assets/
|
|
157
|
-
"/assets/
|
|
158
|
-
"/assets/
|
|
159
|
-
"/assets/
|
|
160
|
-
"/assets/
|
|
161
|
-
"/assets/
|
|
162
|
-
"/assets/
|
|
163
|
-
"/assets/
|
|
164
|
-
"/
|
|
85
|
+
"/index.html": f0,
|
|
86
|
+
"/favicon.svg": f1,
|
|
87
|
+
"/og.png": f2,
|
|
88
|
+
"/assets/Benchmark-ClJmYZoC.js": f3,
|
|
89
|
+
"/assets/bq-Bmysbg0r.js": f4,
|
|
90
|
+
"/assets/JobInspector-DfqBq4O5.js": f5,
|
|
91
|
+
"/assets/QueueActions-B6M0ByGt.js": f6,
|
|
92
|
+
"/assets/UsagePro-DMxrXxur.js": f7,
|
|
93
|
+
"/assets/index-Cue53Myw.js": f8,
|
|
94
|
+
"/assets/inter-latin-wght-normal-Dx4kXJAl.woff2": f9,
|
|
95
|
+
"/assets/CronManager-lNZ4lHh1.js": f10,
|
|
96
|
+
"/assets/BulkAddJobs-BBWqQpP7.js": f11,
|
|
97
|
+
"/assets/DlqControl-DJGhuyu3.js": f12,
|
|
98
|
+
"/assets/LogsPro-BCB7etG2.js": f13,
|
|
99
|
+
"/assets/exportFile-C7xhE8Yh.js": f14,
|
|
100
|
+
"/assets/Usage-QyZkUhgs.js": f15,
|
|
101
|
+
"/assets/connectionStore-CKFQrxDo.js": f16,
|
|
102
|
+
"/assets/AreaChart-w0ruozXH.js": f17,
|
|
103
|
+
"/assets/dist-DjvZiKhB.js": f18,
|
|
104
|
+
"/assets/flowMutationSafety-DObp9nJo.js": f19,
|
|
105
|
+
"/assets/api-V_sVpHDo.js": f20,
|
|
106
|
+
"/assets/Logs-B3dsGSF8.js": f21,
|
|
107
|
+
"/assets/install-CFiYX86d.js": f22,
|
|
108
|
+
"/assets/controlConnectionEpoch-JM4omZ6j.js": f23,
|
|
109
|
+
"/assets/responses-CBLyy1Ob.js": f24,
|
|
110
|
+
"/assets/Overview-Ba5odzYe.js": f25,
|
|
111
|
+
"/assets/Cron-pJJ5KXFG.js": f26,
|
|
112
|
+
"/assets/DlqPro-BhXIKtrt.js": f27,
|
|
113
|
+
"/assets/S3BackupPro-BkwTXdtw.js": f28,
|
|
114
|
+
"/assets/useServerActionGuard-OTv6_fU0.js": f29,
|
|
115
|
+
"/assets/Flows-Bb9j-YhZ.js": f30,
|
|
116
|
+
"/assets/JobsPro-D8dH9um7.js": f31,
|
|
117
|
+
"/assets/Card-C7NMhqUt.js": f32,
|
|
118
|
+
"/assets/Diagnostics-DLvCT7zI.js": f33,
|
|
119
|
+
"/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2": f34,
|
|
120
|
+
"/assets/form-tC20r4Ma.js": f35,
|
|
121
|
+
"/assets/ServerControl-DJHKMaf9.js": f36,
|
|
122
|
+
"/assets/Dlq-Bx4YXTp5.js": f37,
|
|
123
|
+
"/assets/McpServer-Cz1-GwD5.js": f38,
|
|
124
|
+
"/assets/dist-DpZcbP9W.js": f39,
|
|
125
|
+
"/assets/icons-CIvFfU2b.js": f40,
|
|
126
|
+
"/assets/Database-DxiXsUl4.js": f41,
|
|
127
|
+
"/assets/upstreamPaths-CDVsu6IM.js": f42,
|
|
128
|
+
"/assets/PageHeader-BXlZSBcc.js": f43,
|
|
129
|
+
"/assets/cn-zFEt5SO8.js": f44,
|
|
130
|
+
"/assets/Workflows-DqTKWPmT.js": f45,
|
|
131
|
+
"/assets/Metrics-Bkuy6Ntb.js": f46,
|
|
132
|
+
"/assets/Pagination-Q-vf4hsX.js": f47,
|
|
133
|
+
"/assets/useThroughputSeries-CrsZYKbT.js": f48,
|
|
134
|
+
"/assets/QueuesOverview-ChC5Dtqh.js": f49,
|
|
135
|
+
"/assets/MetricsPro-BbJmy0oO.js": f50,
|
|
136
|
+
"/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2": f51,
|
|
137
|
+
"/assets/format-Cg7VCIZW.js": f52,
|
|
138
|
+
"/assets/Workers-Cn8Bkgy1.js": f53,
|
|
139
|
+
"/assets/S3Backup-5OKa8G13.js": f54,
|
|
140
|
+
"/assets/react-vendor-CyjgmGTq.js": f55,
|
|
141
|
+
"/assets/dist-1f1fMHVO.js": f56,
|
|
142
|
+
"/assets/feedback-BnGE2oW2.js": f57,
|
|
143
|
+
"/assets/Webhooks-D0JQQf0q.js": f58,
|
|
144
|
+
"/assets/index-DOze4TKg.css": f59,
|
|
145
|
+
"/assets/toastStore-B7n0zS0y.js": f60,
|
|
146
|
+
"/assets/promisePool-BVfQ9n9Q.js": f61,
|
|
147
|
+
"/assets/WorkersPro-BOTuX9EP.js": f62,
|
|
148
|
+
"/assets/CopilotPanel-Bhh-uCpN.js": f63,
|
|
149
|
+
"/assets/QueueDetailPro-CIimG0pX.js": f64,
|
|
150
|
+
"/assets/Settings-C1HtCK6h.js": f65,
|
|
151
|
+
"/assets/AddJob-CC4bfHLH.js": f66,
|
|
152
|
+
"/assets/Alerts-C2bAi-Kj.js": f67,
|
|
153
|
+
"/assets/Button-BPqpRZJD.js": f68,
|
|
154
|
+
"/assets/dist-BlWBaCN6.js": f69,
|
|
155
|
+
"/assets/StatusBadge-B0I7hNBX.js": f70,
|
|
156
|
+
"/assets/Queues-CGPgEkVm.js": f71,
|
|
157
|
+
"/assets/Jobs-Blavwd1H.js": f72,
|
|
158
|
+
"/assets/QueueDetail-BClRbWC5.js": f73,
|
|
159
|
+
"/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2": f74,
|
|
160
|
+
"/assets/QueueControl-CWHsVfWU.js": f75,
|
|
161
|
+
"/assets/usePolledData-g80Z_UB-.js": f76,
|
|
162
|
+
"/assets/jobActions-LQD4KfCc.js": f77,
|
|
163
|
+
"/assets/dist-DZL8soAh.js": f78,
|
|
164
|
+
"/.vite/manifest.json": f79,
|
|
165
165
|
};
|
package/scripts/serve.ts
CHANGED
|
@@ -8,14 +8,21 @@ import { BunqueueBackupRunner } from '../agent/backup/runner';
|
|
|
8
8
|
import { setBackupWorkerUrl } from '../agent/backup/workerFactory';
|
|
9
9
|
import { setQueryWorkerUrl } from '../agent/db';
|
|
10
10
|
import { QueueOperationsRuntime } from '../agent/queue/runtime';
|
|
11
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
AgentLifecycleGate,
|
|
13
|
+
createFetchHandler,
|
|
14
|
+
resolveAllowedOrigins,
|
|
15
|
+
resolveServerControlTarget,
|
|
16
|
+
} from '../agent/server';
|
|
12
17
|
import { installAgentShutdown } from '../agent/shutdown';
|
|
13
18
|
import { WorkflowRuntime } from '../agent/workflow/runtime';
|
|
14
19
|
import { createServeHandler } from './serveHandler';
|
|
15
20
|
import {
|
|
16
21
|
isLoopbackBind,
|
|
22
|
+
prepareRuntimeIndexHtml,
|
|
17
23
|
remoteBridgeRequiresToken,
|
|
18
24
|
remoteControlEnabled,
|
|
25
|
+
resolveBasePath,
|
|
19
26
|
resolveServeAllowedHosts,
|
|
20
27
|
withSecurityHeaders,
|
|
21
28
|
} from './servePolicy';
|
|
@@ -27,10 +34,14 @@ export {
|
|
|
27
34
|
isLoopbackBind,
|
|
28
35
|
isLoopbackHost,
|
|
29
36
|
isRemoteBridgeRequest,
|
|
37
|
+
prefixCssAssetUrls,
|
|
38
|
+
prepareRuntimeIndexHtml,
|
|
30
39
|
RESPONSE_SECURITY_HEADERS,
|
|
31
40
|
remoteBridgeRequiresToken,
|
|
32
41
|
remoteControlEnabled,
|
|
42
|
+
resolveBasePath,
|
|
33
43
|
resolveServeAllowedHosts,
|
|
44
|
+
stripBasePath,
|
|
34
45
|
type ServeHandlerOptions,
|
|
35
46
|
withSecurityHeaders,
|
|
36
47
|
} from './servePolicy';
|
|
@@ -52,6 +63,9 @@ async function main(): Promise<void> {
|
|
|
52
63
|
const port = Number(process.env.PORT) || 8080;
|
|
53
64
|
const host = process.env.BIND_ADDR || '127.0.0.1';
|
|
54
65
|
const api = (process.env.BUNQUEUE_URL || 'http://localhost:6790').replace(/\/$/, '');
|
|
66
|
+
const basePath = resolveBasePath(process.env.BASE_PATH);
|
|
67
|
+
const managedProxyPath = `${basePath}/api`;
|
|
68
|
+
const controlTarget = resolveServerControlTarget(process.env);
|
|
55
69
|
const agentPort = Number(process.env.AGENT_PORT) || 6800;
|
|
56
70
|
const allowedOrigins = Array.from(
|
|
57
71
|
new Set([
|
|
@@ -85,9 +99,9 @@ async function main(): Promise<void> {
|
|
|
85
99
|
|
|
86
100
|
// Complete every awaited startup step before installing handlers/listeners.
|
|
87
101
|
const { ASSETS } = await import('./embedded.gen');
|
|
88
|
-
const indexHtml = (
|
|
89
|
-
'
|
|
90
|
-
|
|
102
|
+
const indexHtml = prepareRuntimeIndexHtml(
|
|
103
|
+
await Bun.file(ASSETS['/index.html']).text(),
|
|
104
|
+
basePath
|
|
91
105
|
);
|
|
92
106
|
|
|
93
107
|
// Keep ProcessManager out of policy-only test imports.
|
|
@@ -99,7 +113,14 @@ async function main(): Promise<void> {
|
|
|
99
113
|
const lifecycle = new AgentLifecycleGate();
|
|
100
114
|
const localAgentHandle = createFetchHandler(
|
|
101
115
|
mgr,
|
|
102
|
-
{
|
|
116
|
+
{
|
|
117
|
+
allowedOrigins,
|
|
118
|
+
allowedHosts,
|
|
119
|
+
token,
|
|
120
|
+
controlTarget,
|
|
121
|
+
managedProxyPath,
|
|
122
|
+
managedProxyUrl: api,
|
|
123
|
+
},
|
|
103
124
|
workflowRuntime,
|
|
104
125
|
backupRunner,
|
|
105
126
|
queueRuntime,
|
|
@@ -107,7 +128,15 @@ async function main(): Promise<void> {
|
|
|
107
128
|
);
|
|
108
129
|
const remoteAgentHandle = createFetchHandler(
|
|
109
130
|
mgr,
|
|
110
|
-
{
|
|
131
|
+
{
|
|
132
|
+
allowedOrigins,
|
|
133
|
+
allowedHosts,
|
|
134
|
+
token,
|
|
135
|
+
requireTokenForAll: true,
|
|
136
|
+
controlTarget,
|
|
137
|
+
managedProxyPath,
|
|
138
|
+
managedProxyUrl: api,
|
|
139
|
+
},
|
|
111
140
|
workflowRuntime,
|
|
112
141
|
backupRunner,
|
|
113
142
|
queueRuntime,
|
|
@@ -146,6 +175,7 @@ async function main(): Promise<void> {
|
|
|
146
175
|
apiShutdownSignal: proxyShutdown.signal,
|
|
147
176
|
remoteBridgePolicy,
|
|
148
177
|
trustProxy: process.env.TRUST_PROXY === '1',
|
|
178
|
+
basePath,
|
|
149
179
|
}),
|
|
150
180
|
error: onError,
|
|
151
181
|
});
|
|
@@ -153,12 +183,13 @@ async function main(): Promise<void> {
|
|
|
153
183
|
|
|
154
184
|
logger.info(
|
|
155
185
|
{
|
|
156
|
-
dashboard: `http://${host}:${port}`,
|
|
186
|
+
dashboard: `http://${host}:${port}${basePath || '/'}`,
|
|
157
187
|
apiProxy: api,
|
|
158
188
|
agent: `http://127.0.0.1:${agentPort}/control`,
|
|
159
189
|
agentBridge,
|
|
160
190
|
remoteBridgePolicy,
|
|
161
191
|
allowedHosts,
|
|
192
|
+
serverManagement: controlTarget.mode,
|
|
162
193
|
},
|
|
163
194
|
'bunqueue dashboard (standalone) ready'
|
|
164
195
|
);
|
package/scripts/serveHandler.ts
CHANGED
|
@@ -4,6 +4,8 @@ import {
|
|
|
4
4
|
agentSubUrl,
|
|
5
5
|
apiTokenOk,
|
|
6
6
|
isRemoteBridgeRequest,
|
|
7
|
+
prefixCssAssetUrls,
|
|
8
|
+
stripBasePath,
|
|
7
9
|
type ServeHandlerOptions,
|
|
8
10
|
withSecurityHeaders,
|
|
9
11
|
} from './servePolicy';
|
|
@@ -24,8 +26,10 @@ export function createServeHandler(opts: ServeHandlerOptions) {
|
|
|
24
26
|
apiShutdownSignal,
|
|
25
27
|
remoteBridgePolicy = false,
|
|
26
28
|
trustProxy = false,
|
|
29
|
+
basePath = '',
|
|
27
30
|
} = opts;
|
|
28
31
|
const secure = withSecurityHeaders;
|
|
32
|
+
const rewrittenCss = new Map<string, Promise<string>>();
|
|
29
33
|
const indexResponse = () =>
|
|
30
34
|
new Response(indexHtml, { headers: { 'content-type': 'text/html; charset=utf-8' } });
|
|
31
35
|
|
|
@@ -34,6 +38,8 @@ export function createServeHandler(opts: ServeHandlerOptions) {
|
|
|
34
38
|
if (!isHostAllowed(req.headers.get('host'), allowedHosts)) {
|
|
35
39
|
return secure(new Response('Host not allowed', { status: 403 }));
|
|
36
40
|
}
|
|
41
|
+
const pathname = stripBasePath(url.pathname, basePath);
|
|
42
|
+
if (pathname === null) return secure(new Response('Not found', { status: 404 }));
|
|
37
43
|
|
|
38
44
|
const origin = req.headers.get('origin');
|
|
39
45
|
let originHost = '';
|
|
@@ -49,7 +55,7 @@ export function createServeHandler(opts: ServeHandlerOptions) {
|
|
|
49
55
|
originHost !== '' &&
|
|
50
56
|
(originHost === url.host.toLowerCase() || originHost === forwardedHost);
|
|
51
57
|
|
|
52
|
-
if (
|
|
58
|
+
if (pathname === '/agent' || pathname.startsWith('/agent/')) {
|
|
53
59
|
const remoteRequest = isRemoteBridgeRequest(req, remoteBridgePolicy);
|
|
54
60
|
if (!agentBridge || (remoteRequest && !agentTokenConfigured)) {
|
|
55
61
|
return secure(
|
|
@@ -63,7 +69,7 @@ export function createServeHandler(opts: ServeHandlerOptions) {
|
|
|
63
69
|
)
|
|
64
70
|
);
|
|
65
71
|
}
|
|
66
|
-
const sub = agentSubUrl(
|
|
72
|
+
const sub = agentSubUrl(pathname, url.search);
|
|
67
73
|
const headers = new Headers(req.headers);
|
|
68
74
|
if (sameOrigin && origin && !isOriginAllowed(origin, allowedOrigins)) headers.delete('origin');
|
|
69
75
|
const handleAgent = remoteRequest ? remoteAgentHandle : agentHandle;
|
|
@@ -79,7 +85,7 @@ export function createServeHandler(opts: ServeHandlerOptions) {
|
|
|
79
85
|
);
|
|
80
86
|
}
|
|
81
87
|
|
|
82
|
-
if (
|
|
88
|
+
if (pathname === '/api' || pathname.startsWith('/api/')) {
|
|
83
89
|
if (!sameOrigin && !isOriginAllowed(origin, allowedOrigins)) {
|
|
84
90
|
return secure(
|
|
85
91
|
Response.json({ ok: false, error: 'Origin not allowed' }, { status: 403 })
|
|
@@ -107,7 +113,7 @@ export function createServeHandler(opts: ServeHandlerOptions) {
|
|
|
107
113
|
);
|
|
108
114
|
}
|
|
109
115
|
}
|
|
110
|
-
const target = api + (
|
|
116
|
+
const target = api + (pathname.slice(4) || '/') + url.search;
|
|
111
117
|
let res: Response;
|
|
112
118
|
const signal = apiShutdownSignal
|
|
113
119
|
? AbortSignal.any([req.signal, apiShutdownSignal])
|
|
@@ -142,11 +148,25 @@ export function createServeHandler(opts: ServeHandlerOptions) {
|
|
|
142
148
|
);
|
|
143
149
|
}
|
|
144
150
|
|
|
145
|
-
const key =
|
|
151
|
+
const key = pathname === '/' ? '/index.html' : pathname;
|
|
146
152
|
if (key === '/index.html') return secure(indexResponse());
|
|
147
153
|
const asset = assets[key];
|
|
148
|
-
if (asset)
|
|
149
|
-
|
|
154
|
+
if (asset) {
|
|
155
|
+
if (basePath && key.endsWith('.css')) {
|
|
156
|
+
let css = rewrittenCss.get(asset);
|
|
157
|
+
if (!css) {
|
|
158
|
+
css = Bun.file(asset)
|
|
159
|
+
.text()
|
|
160
|
+
.then((contents) => prefixCssAssetUrls(contents, basePath));
|
|
161
|
+
rewrittenCss.set(asset, css);
|
|
162
|
+
}
|
|
163
|
+
return secure(
|
|
164
|
+
new Response(await css, { headers: { 'content-type': 'text/css; charset=utf-8' } })
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
return secure(new Response(Bun.file(asset)));
|
|
168
|
+
}
|
|
169
|
+
if (pathname.startsWith('/assets/')) {
|
|
150
170
|
return secure(new Response('Not found', { status: 404 }));
|
|
151
171
|
}
|
|
152
172
|
return secure(indexResponse());
|
package/scripts/servePolicy.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { timingSafeEqual } from 'node:crypto';
|
|
2
2
|
import { hostnameOf, resolveAllowedHosts } from '../agent/server';
|
|
3
3
|
|
|
4
|
+
const BASE_PATH_PATTERN = /^\/(?:[A-Za-z0-9._~-]+(?:\/[A-Za-z0-9._~-]+)*)?\/?$/;
|
|
5
|
+
|
|
4
6
|
export const RESPONSE_SECURITY_HEADERS = {
|
|
5
7
|
'Content-Security-Policy': "frame-ancestors 'none'; object-src 'none'; base-uri 'self'",
|
|
6
8
|
'X-Frame-Options': 'DENY',
|
|
@@ -107,6 +109,56 @@ export function remoteControlEnabled(
|
|
|
107
109
|
return Boolean(env.AGENT_TOKEN?.trim());
|
|
108
110
|
}
|
|
109
111
|
|
|
112
|
+
/** Normalize the runtime mount point to either an empty root prefix or `/a/b`. */
|
|
113
|
+
export function resolveBasePath(value: unknown): string {
|
|
114
|
+
if (value === undefined || value === null || value === '' || value === '/') return '';
|
|
115
|
+
if (typeof value !== 'string') throw new Error('BASE_PATH must be a URL path');
|
|
116
|
+
const candidate = value.trim();
|
|
117
|
+
if (!BASE_PATH_PATTERN.test(candidate)) {
|
|
118
|
+
throw new Error(
|
|
119
|
+
'BASE_PATH must start with one slash and contain only URL-safe path segments'
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
if (candidate.split('/').some((segment) => segment === '.' || segment === '..')) {
|
|
123
|
+
throw new Error('BASE_PATH cannot contain dot path segments');
|
|
124
|
+
}
|
|
125
|
+
return candidate.replace(/\/+$/, '');
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** Return the path as seen by the mounted app, or null when it is outside the mount. */
|
|
129
|
+
export function stripBasePath(pathname: string, basePath: string): string | null {
|
|
130
|
+
if (!basePath) return pathname;
|
|
131
|
+
if (pathname === basePath) return '/';
|
|
132
|
+
if (!pathname.startsWith(`${basePath}/`)) return null;
|
|
133
|
+
return pathname.slice(basePath.length) || '/';
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** Prefix root-relative Vite URLs and inject the standalone runtime endpoints. */
|
|
137
|
+
export function prepareRuntimeIndexHtml(indexHtml: string, basePath: string): string {
|
|
138
|
+
const mount = basePath || '/';
|
|
139
|
+
const agentUrl = `${basePath}/agent`;
|
|
140
|
+
const apiUrl = `${basePath}/api`;
|
|
141
|
+
const prefixed = basePath
|
|
142
|
+
? indexHtml.replace(/\b(href|src)=(['"])\/(?!\/)/g, `$1=$2${basePath}/`)
|
|
143
|
+
: indexHtml;
|
|
144
|
+
const runtimeConfig =
|
|
145
|
+
'<script>' +
|
|
146
|
+
`window.__BUNQUEUE_BASE_PATH__=${JSON.stringify(mount)};` +
|
|
147
|
+
`window.__BUNQUEUE_AGENT_URL__=${JSON.stringify(agentUrl)};` +
|
|
148
|
+
`window.__BUNQUEUE_API_URL__=${JSON.stringify(apiUrl)}` +
|
|
149
|
+
'</script>';
|
|
150
|
+
if (!prefixed.includes('</head>')) {
|
|
151
|
+
throw new Error('Embedded index.html is missing </head>');
|
|
152
|
+
}
|
|
153
|
+
return prefixed.replace('</head>', `${runtimeConfig}</head>`);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/** Vite emits root-relative font URLs in CSS when its build base is `/`. */
|
|
157
|
+
export function prefixCssAssetUrls(css: string, basePath: string): string {
|
|
158
|
+
if (!basePath) return css;
|
|
159
|
+
return css.replace(/url\((['"]?)\/assets\//g, `url($1${basePath}/assets/`);
|
|
160
|
+
}
|
|
161
|
+
|
|
110
162
|
export function agentSubUrl(pathname: string, search: string): URL {
|
|
111
163
|
const rest = pathname.slice('/agent'.length) || '/';
|
|
112
164
|
const sub = new URL('http://agent.internal');
|
|
@@ -130,4 +182,6 @@ export interface ServeHandlerOptions {
|
|
|
130
182
|
apiShutdownSignal?: AbortSignal;
|
|
131
183
|
remoteBridgePolicy?: boolean;
|
|
132
184
|
trustProxy?: boolean;
|
|
185
|
+
/** Normalized mount prefix (`''` for root, otherwise no trailing slash). */
|
|
186
|
+
basePath?: string;
|
|
133
187
|
}
|