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.
Files changed (80) hide show
  1. package/README.md +25 -10
  2. package/agent/backup/resultValidation.ts +1 -1
  3. package/agent/backup/routes.ts +4 -3
  4. package/agent/flow/routes.ts +7 -6
  5. package/agent/index.ts +17 -4
  6. package/agent/managedTarget.ts +41 -2
  7. package/agent/manager/config.ts +1 -1
  8. package/agent/queue/routes.ts +21 -14
  9. package/agent/server/controlRoutes.ts +39 -7
  10. package/agent/server/controlTarget.ts +116 -0
  11. package/agent/server/errors.ts +1 -0
  12. package/agent/server/handler.ts +10 -1
  13. package/agent/server/router.ts +19 -8
  14. package/agent/server/types.ts +7 -0
  15. package/agent/server.ts +10 -0
  16. package/agent/workflow/runtimeRoutes.ts +5 -4
  17. package/agent/workflows.ts +1 -1
  18. package/dist/.vite/manifest.json +207 -207
  19. package/dist/assets/{AddJob-UUa2fSXE.js → AddJob-CC4bfHLH.js} +1 -1
  20. package/dist/assets/{Alerts-7oGYfQMb.js → Alerts-C2bAi-Kj.js} +1 -1
  21. package/dist/assets/{Benchmark-C2NFp_kj.js → Benchmark-ClJmYZoC.js} +1 -1
  22. package/dist/assets/{BulkAddJobs-CL4yBae-.js → BulkAddJobs-BBWqQpP7.js} +1 -1
  23. package/dist/assets/{CopilotPanel-BQ2Cgo9p.js → CopilotPanel-Bhh-uCpN.js} +3 -3
  24. package/dist/assets/{Cron-DfWBhoBf.js → Cron-pJJ5KXFG.js} +1 -1
  25. package/dist/assets/{CronManager-DAK7RSOX.js → CronManager-lNZ4lHh1.js} +1 -1
  26. package/dist/assets/{Database-DqL7giEj.js → Database-DxiXsUl4.js} +1 -1
  27. package/dist/assets/{Diagnostics-D98YwN-6.js → Diagnostics-DLvCT7zI.js} +1 -1
  28. package/dist/assets/{Dlq-BHmA5PTI.js → Dlq-Bx4YXTp5.js} +1 -1
  29. package/dist/assets/{DlqControl-DihxvP-i.js → DlqControl-DJGhuyu3.js} +1 -1
  30. package/dist/assets/{DlqPro-ncgnDtpE.js → DlqPro-BhXIKtrt.js} +1 -1
  31. package/dist/assets/{Flows-B5N5Cil0.js → Flows-Bb9j-YhZ.js} +2 -2
  32. package/dist/assets/{JobInspector-B40nFiGh.js → JobInspector-DfqBq4O5.js} +2 -2
  33. package/dist/assets/{Jobs-Bla3IEef.js → Jobs-Blavwd1H.js} +1 -1
  34. package/dist/assets/{JobsPro-CnczVx7x.js → JobsPro-D8dH9um7.js} +1 -1
  35. package/dist/assets/{Logs-T91Q3cH0.js → Logs-B3dsGSF8.js} +1 -1
  36. package/dist/assets/{LogsPro-CMn6-Wwv.js → LogsPro-BCB7etG2.js} +1 -1
  37. package/dist/assets/{McpServer-BQBabwW-.js → McpServer-Cz1-GwD5.js} +2 -2
  38. package/dist/assets/{Metrics-DxT_RI2B.js → Metrics-Bkuy6Ntb.js} +1 -1
  39. package/dist/assets/{MetricsPro-Cjen-nAP.js → MetricsPro-BbJmy0oO.js} +1 -1
  40. package/dist/assets/{Overview-XN2ej8ph.js → Overview-Ba5odzYe.js} +1 -1
  41. package/dist/assets/{QueueActions-C-Aferd6.js → QueueActions-B6M0ByGt.js} +1 -1
  42. package/dist/assets/{QueueControl-B8Q9NX6t.js → QueueControl-CWHsVfWU.js} +1 -1
  43. package/dist/assets/{QueueDetail-BMhG0jUB.js → QueueDetail-BClRbWC5.js} +1 -1
  44. package/dist/assets/{QueueDetailPro-BKTTyLR4.js → QueueDetailPro-CIimG0pX.js} +1 -1
  45. package/dist/assets/{Queues-COqPMoY9.js → Queues-CGPgEkVm.js} +1 -1
  46. package/dist/assets/{QueuesOverview-pWdrPy8Z.js → QueuesOverview-ChC5Dtqh.js} +1 -1
  47. package/dist/assets/{S3Backup-BmsZ8xtq.js → S3Backup-5OKa8G13.js} +1 -1
  48. package/dist/assets/S3BackupPro-BkwTXdtw.js +3 -0
  49. package/dist/assets/{ServerControl-D3XwHr72.js → ServerControl-DJHKMaf9.js} +3 -3
  50. package/dist/assets/{Settings-BofKZoHn.js → Settings-C1HtCK6h.js} +1 -1
  51. package/dist/assets/{Usage-DAR9E22v.js → Usage-QyZkUhgs.js} +1 -1
  52. package/dist/assets/{UsagePro-Bc30N2Lo.js → UsagePro-DMxrXxur.js} +1 -1
  53. package/dist/assets/{Webhooks-Bg2k1PU4.js → Webhooks-D0JQQf0q.js} +1 -1
  54. package/dist/assets/{Workers-BqUZMJVQ.js → Workers-Cn8Bkgy1.js} +1 -1
  55. package/dist/assets/{WorkersPro-C9aSadUh.js → WorkersPro-BOTuX9EP.js} +1 -1
  56. package/dist/assets/{Workflows-BEFMfHmo.js → Workflows-DqTKWPmT.js} +1 -1
  57. package/dist/assets/{api-CQ5Z7xR7.js → api-V_sVpHDo.js} +1 -1
  58. package/dist/assets/bq-Bmysbg0r.js +1 -0
  59. package/dist/assets/{connectionStore-DbBYqHEY.js → connectionStore-CKFQrxDo.js} +1 -1
  60. package/dist/assets/{controlConnectionEpoch-CFSO6237.js → controlConnectionEpoch-JM4omZ6j.js} +1 -1
  61. package/dist/assets/{flowMutationSafety-CoOp94wS.js → flowMutationSafety-DObp9nJo.js} +1 -1
  62. package/dist/assets/index-Cue53Myw.js +8 -0
  63. package/dist/assets/install-CFiYX86d.js +3 -0
  64. package/dist/assets/{responses-kPO4rSu5.js → responses-CBLyy1Ob.js} +1 -1
  65. package/dist/assets/{toastStore-CS_9Xndn.js → toastStore-B7n0zS0y.js} +1 -1
  66. package/dist/assets/{upstreamPaths-D_LPsv7b.js → upstreamPaths-CDVsu6IM.js} +1 -1
  67. package/dist/assets/{usePolledData-DzlUpBOO.js → usePolledData-g80Z_UB-.js} +1 -1
  68. package/dist/assets/{useServerActionGuard-BlH-Kso1.js → useServerActionGuard-OTv6_fU0.js} +1 -1
  69. package/dist/assets/useThroughputSeries-CrsZYKbT.js +1 -0
  70. package/dist/index.html +7 -7
  71. package/package.json +14 -7
  72. package/scripts/embedded.gen.ts +160 -160
  73. package/scripts/serve.ts +38 -7
  74. package/scripts/serveHandler.ts +27 -7
  75. package/scripts/servePolicy.ts +54 -0
  76. package/dist/assets/S3BackupPro-AtlsPUJL.js +0 -3
  77. package/dist/assets/bq-BeBxa743.js +0 -1
  78. package/dist/assets/index-Cui9IwWy.js +0 -8
  79. package/dist/assets/install-Cd9Is10G.js +0 -3
  80. package/dist/assets/useThroughputSeries-C2pa1Wd_.js +0 -1
@@ -3,7 +3,9 @@ import type { ProcessManager } from '../manager';
3
3
  import { QueueOperationsRuntime } from '../queue/runtime';
4
4
  import type { QueueOperationsPort } from '../queue/types';
5
5
  import { WorkflowRuntime, type WorkflowRuntimePort } from '../workflow/runtime';
6
+ import { resolveManagedTargetPolicy } from '../managedTarget';
6
7
  import { errorMessage, errorStatus } from './errors';
8
+ import { MANAGED_CONTROL_TARGET } from './controlTarget';
7
9
  import { AgentLifecycleGate, type AgentLifecyclePort } from './lifecycle';
8
10
  import { corsHeaders, isHostAllowed, isOriginAllowed, tokenOk } from './policy';
9
11
  import { routeAgentRequest } from './router';
@@ -39,7 +41,12 @@ export function createFetchHandler(
39
41
  allowedHosts,
40
42
  token,
41
43
  requireTokenForAll = false,
44
+ controlTarget = MANAGED_CONTROL_TARGET,
42
45
  } = options;
46
+ const managedTargetPolicy = resolveManagedTargetPolicy(
47
+ options.managedProxyPath,
48
+ options.managedProxyUrl
49
+ );
43
50
  const json = (body: unknown, status: number, origin: string | null) =>
44
51
  responseOf({ body, status }, origin, allowedOrigins);
45
52
 
@@ -74,7 +81,9 @@ export function createFetchHandler(
74
81
  queueRuntime,
75
82
  lifecycle,
76
83
  origin,
77
- allowedOrigins
84
+ allowedOrigins,
85
+ controlTarget,
86
+ managedTargetPolicy
78
87
  );
79
88
  return responseOf(result, origin, allowedOrigins);
80
89
  } catch (error) {
@@ -1,12 +1,14 @@
1
1
  import { routeBackupRequest } from '../backup/routes';
2
2
  import type { BackupRunnerPort } from '../backup/runner';
3
3
  import { routeFlowRequest } from '../flow/routes';
4
+ import type { ManagedTargetPolicy } from '../managedTarget';
4
5
  import type { ProcessManager } from '../manager';
5
6
  import { routeQueueOperationsRequest } from '../queue/routes';
6
7
  import type { QueueOperationsPort } from '../queue/types';
7
8
  import type { WorkflowRuntimePort } from '../workflow/runtime';
8
9
  import { routeWorkflowRuntimeRequest } from '../workflow/runtimeRoutes';
9
- import { routeControlRequest } from './controlRoutes';
10
+ import { assertManagedControl, routeControlRequest } from './controlRoutes';
11
+ import type { ServerControlTarget } from './controlTarget';
10
12
  import { routeDatabaseRequest } from './databaseRoutes';
11
13
  import type { AgentLifecyclePort } from './lifecycle';
12
14
  import { managedRuntimeAdmission } from './managedRuntime';
@@ -23,7 +25,9 @@ export async function routeAgentRequest(
23
25
  queueRuntime: QueueOperationsPort,
24
26
  lifecycle: AgentLifecyclePort,
25
27
  origin: string | null,
26
- allowedOrigins: string[]
28
+ allowedOrigins: string[],
29
+ controlTarget: ServerControlTarget,
30
+ managedTargetPolicy?: ManagedTargetPolicy
27
31
  ): Promise<RouteResponse | Response | null> {
28
32
  if (pathname.startsWith('/control/')) {
29
33
  const control = await routeControlRequest(
@@ -32,7 +36,8 @@ export async function routeAgentRequest(
32
36
  method,
33
37
  manager,
34
38
  runtime,
35
- lifecycle
39
+ lifecycle,
40
+ controlTarget
36
41
  );
37
42
  if (control) return control;
38
43
  }
@@ -47,7 +52,7 @@ export async function routeAgentRequest(
47
52
  method,
48
53
  managedConfig,
49
54
  snapshot.status === 'running',
50
- { admission }
55
+ { admission, targetPolicy: managedTargetPolicy }
51
56
  );
52
57
  if (flow) return flow;
53
58
  }
@@ -62,7 +67,8 @@ export async function routeAgentRequest(
62
67
  managedConfig,
63
68
  runtime,
64
69
  snapshot.status === 'running',
65
- admission
70
+ admission,
71
+ managedTargetPolicy
66
72
  );
67
73
  if (workflowRuntime) return workflowRuntime;
68
74
  }
@@ -84,13 +90,15 @@ export async function routeAgentRequest(
84
90
  managedConfig,
85
91
  queueRuntime,
86
92
  snapshot.status === 'running',
87
- admission
93
+ admission,
94
+ managedTargetPolicy
88
95
  );
89
96
  if (queueOperation) return queueOperation;
90
97
  }
91
98
 
92
99
  if (pathname.startsWith('/backup/')) {
93
100
  if (pathname === '/backup/restore' && method === 'POST') {
101
+ assertManagedControl(controlTarget);
94
102
  return manager.withStoppedMaintenance('restoring a backup', async () => {
95
103
  const stoppedSnapshot = manager.getStatus();
96
104
  const restoreDesired = manager.getConfig();
@@ -105,7 +113,9 @@ export async function routeAgentRequest(
105
113
  restoreConfig,
106
114
  stoppedSnapshot.status === 'running',
107
115
  await manager.dbStats(),
108
- backupRunner
116
+ backupRunner,
117
+ undefined,
118
+ managedTargetPolicy
109
119
  );
110
120
  });
111
121
  }
@@ -119,7 +129,8 @@ export async function routeAgentRequest(
119
129
  snapshot.status === 'running',
120
130
  database,
121
131
  backupRunner,
122
- (extraEnv) => manager.setConfig({ extraEnv })
132
+ (extraEnv) => manager.setConfig({ extraEnv }),
133
+ managedTargetPolicy
123
134
  );
124
135
  if (backup) return backup;
125
136
  }
@@ -1,4 +1,5 @@
1
1
  import type { WorkflowRuntimePort } from '../workflow/runtime';
2
+ import type { ServerControlTarget } from './controlTarget';
2
3
 
3
4
  export interface AgentOptions {
4
5
  allowedOrigins: string[];
@@ -8,6 +9,12 @@ export interface AgentOptions {
8
9
  token?: string;
9
10
  /** Network exposure: require token on every non-OPTIONS request. */
10
11
  requireTokenForAll?: boolean;
12
+ /** Managed child by default; external mode makes lifecycle routes attach-only. */
13
+ controlTarget?: ServerControlTarget;
14
+ /** Exact browser-visible `/api` alias accepted by target-pinned agent routes. */
15
+ managedProxyPath?: string;
16
+ /** Upstream URL the alias must resolve to; it still passes the local-target gate. */
17
+ managedProxyUrl?: string;
11
18
  }
12
19
 
13
20
  export interface AgentFetchHandler {
package/agent/server.ts CHANGED
@@ -6,6 +6,16 @@
6
6
  * agent/server/; this file preserves the existing public import path.
7
7
  */
8
8
  export { createFetchHandler } from './server/handler';
9
+ export {
10
+ MANAGED_CONTROL_TARGET,
11
+ probeExternalHealth,
12
+ resolveServerControlTarget,
13
+ } from './server/controlTarget';
14
+ export type {
15
+ ExternalHealthProbe,
16
+ ServerControlTarget,
17
+ ServerManagementMode,
18
+ } from './server/controlTarget';
9
19
  export { AgentLifecycleGate } from './server/lifecycle';
10
20
  export type { AgentLifecyclePort } from './server/lifecycle';
11
21
  export {
@@ -1,5 +1,5 @@
1
1
  import type { ExecutionState } from 'bunqueue/workflow';
2
- import { assertManagedTarget } from '../managedTarget';
2
+ import { assertManagedTarget, type ManagedTargetPolicy } from '../managedTarget';
3
3
  import type { ServerConfig } from '../manager';
4
4
  import { readLimitedJsonBody } from '../server/jsonBody';
5
5
  import type {
@@ -24,17 +24,18 @@ export async function routeWorkflowRuntimeRequest(
24
24
  config: ServerConfig,
25
25
  runtime: WorkflowRuntimePort,
26
26
  serverRunning: boolean,
27
- admission?: ManagedRuntimeAdmission
27
+ admission?: ManagedRuntimeAdmission,
28
+ targetPolicy?: ManagedTargetPolicy
28
29
  ): Promise<WorkflowRuntimeRouteResponse | null> {
29
30
  if (!isRuntimePath(pathname, method)) return null;
30
31
  const query = exactTargetQuery(request.url);
31
- assertManagedTarget(query, config);
32
+ assertManagedTarget(query, config, targetPolicy);
32
33
  const admitted = <T>(
33
34
  requiresRunning: boolean,
34
35
  operation: (snapshot: ManagedRuntimeSnapshot) => Promise<T>
35
36
  ): Promise<T> => {
36
37
  const execute = async (snapshot: ManagedRuntimeSnapshot) => {
37
- assertManagedTarget(query, snapshot.config);
38
+ assertManagedTarget(query, snapshot.config, targetPolicy);
38
39
  if (requiresRunning && !snapshot.running) {
39
40
  throw new Error('Start the managed Bunqueue server before workflow control.');
40
41
  }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Read-only facade for Bunqueue 2.8.57 Workflow Engine observability.
2
+ * Read-only facade for Bunqueue 2.8.59 Workflow Engine observability.
3
3
  * Persistence, decoding and validation live behind this stable public module.
4
4
  */
5
5
  export { workflowExecution } from './workflow/detail';