@useorgx/openclaw-plugin 0.7.18 → 0.7.20
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/dashboard/dist/assets/{sdoPH_Z1.js → B014hrCe.js} +1 -1
- package/dashboard/dist/assets/B014hrCe.js.br +0 -0
- package/dashboard/dist/assets/B014hrCe.js.gz +0 -0
- package/dashboard/dist/assets/{PVi0vr9a.js → BGY6oI8h.js} +1 -1
- package/dashboard/dist/assets/BGY6oI8h.js.br +0 -0
- package/dashboard/dist/assets/BGY6oI8h.js.gz +0 -0
- package/dashboard/dist/assets/BJI1Iy5v.css +1 -0
- package/dashboard/dist/assets/BJI1Iy5v.css.br +0 -0
- package/dashboard/dist/assets/BJI1Iy5v.css.gz +0 -0
- package/dashboard/dist/assets/BUvcp_7V.js +1 -0
- package/dashboard/dist/assets/BUvcp_7V.js.br +0 -0
- package/dashboard/dist/assets/BUvcp_7V.js.gz +0 -0
- package/dashboard/dist/assets/BV2Tf8S2.js +212 -0
- package/dashboard/dist/assets/BV2Tf8S2.js.br +0 -0
- package/dashboard/dist/assets/BV2Tf8S2.js.gz +0 -0
- package/dashboard/dist/assets/{B71dt9yu.js → BYb6DARX.js} +1 -1
- package/dashboard/dist/assets/BYb6DARX.js.br +0 -0
- package/dashboard/dist/assets/BYb6DARX.js.gz +0 -0
- package/dashboard/dist/assets/{DS79hzMu.js → BoDhb8_y.js} +1 -1
- package/dashboard/dist/assets/BoDhb8_y.js.br +0 -0
- package/dashboard/dist/assets/BoDhb8_y.js.gz +0 -0
- package/dashboard/dist/assets/Bqk_l0k6.js +1 -0
- package/dashboard/dist/assets/Bqk_l0k6.js.br +0 -0
- package/dashboard/dist/assets/Bqk_l0k6.js.gz +0 -0
- package/dashboard/dist/assets/{C3_j_W9V.js → CV0sWMbv.js} +1 -1
- package/dashboard/dist/assets/CV0sWMbv.js.br +0 -0
- package/dashboard/dist/assets/CV0sWMbv.js.gz +0 -0
- package/dashboard/dist/assets/CaAkScfa.js +1 -0
- package/dashboard/dist/assets/CaAkScfa.js.br +0 -0
- package/dashboard/dist/assets/CaAkScfa.js.gz +0 -0
- package/dashboard/dist/assets/{CfMS9yIf.js → Ck5KlsPN.js} +1 -1
- package/dashboard/dist/assets/Ck5KlsPN.js.br +0 -0
- package/dashboard/dist/assets/Ck5KlsPN.js.gz +0 -0
- package/dashboard/dist/assets/{CReugbyT.js → D2G51wQm.js} +1 -1
- package/dashboard/dist/assets/D2G51wQm.js.br +0 -0
- package/dashboard/dist/assets/D2G51wQm.js.gz +0 -0
- package/dashboard/dist/assets/{467jKHFJ.js → DAr4MfFk.js} +1 -1
- package/dashboard/dist/assets/DAr4MfFk.js.br +0 -0
- package/dashboard/dist/assets/DAr4MfFk.js.gz +0 -0
- package/dashboard/dist/assets/{BcJmNILk.js → DXVs61e1.js} +1 -1
- package/dashboard/dist/assets/DXVs61e1.js.br +0 -0
- package/dashboard/dist/assets/DXVs61e1.js.gz +0 -0
- package/dashboard/dist/assets/{5Ihga-4X.js → DibzNd0I.js} +1 -1
- package/dashboard/dist/assets/DibzNd0I.js.br +0 -0
- package/dashboard/dist/assets/DibzNd0I.js.gz +0 -0
- package/dashboard/dist/assets/{qDJ6rqcs.js → Dm0CfDGr.js} +1 -1
- package/dashboard/dist/assets/Dm0CfDGr.js.br +0 -0
- package/dashboard/dist/assets/Dm0CfDGr.js.gz +0 -0
- package/dashboard/dist/assets/_zpQCpjm.js +1 -0
- package/dashboard/dist/assets/_zpQCpjm.js.br +0 -0
- package/dashboard/dist/assets/_zpQCpjm.js.gz +0 -0
- package/dashboard/dist/assets/{C-XuWXGi.js → uNGpYMSH.js} +1 -1
- package/dashboard/dist/assets/uNGpYMSH.js.br +0 -0
- package/dashboard/dist/assets/uNGpYMSH.js.gz +0 -0
- package/dashboard/dist/assets/{a6qcPiWt.js → wa4jJQK9.js} +1 -1
- package/dashboard/dist/assets/wa4jJQK9.js.br +0 -0
- package/dashboard/dist/assets/wa4jJQK9.js.gz +0 -0
- package/dashboard/dist/index.html +2 -2
- package/dashboard/dist/index.html.br +0 -0
- package/dashboard/dist/index.html.gz +0 -0
- package/dist/http/helpers/auto-continue-engine.d.ts +39 -0
- package/dist/http/helpers/auto-continue-engine.js +96 -0
- package/dist/http/index.js +2 -1
- package/dist/http/routes/mission-control-read.d.ts +14 -0
- package/dist/http/routes/mission-control-read.js +69 -5
- package/dist/outbox.js +9 -2
- package/package.json +2 -1
- package/dashboard/dist/assets/467jKHFJ.js.br +0 -0
- package/dashboard/dist/assets/467jKHFJ.js.gz +0 -0
- package/dashboard/dist/assets/5Ihga-4X.js.br +0 -0
- package/dashboard/dist/assets/5Ihga-4X.js.gz +0 -0
- package/dashboard/dist/assets/B71dt9yu.js.br +0 -0
- package/dashboard/dist/assets/B71dt9yu.js.gz +0 -0
- package/dashboard/dist/assets/BEnI6kNR.js +0 -1
- package/dashboard/dist/assets/BEnI6kNR.js.br +0 -0
- package/dashboard/dist/assets/BEnI6kNR.js.gz +0 -0
- package/dashboard/dist/assets/BcJmNILk.js.br +0 -0
- package/dashboard/dist/assets/BcJmNILk.js.gz +0 -0
- package/dashboard/dist/assets/C-XuWXGi.js.br +0 -0
- package/dashboard/dist/assets/C-XuWXGi.js.gz +0 -0
- package/dashboard/dist/assets/C3_j_W9V.js.br +0 -0
- package/dashboard/dist/assets/C3_j_W9V.js.gz +0 -0
- package/dashboard/dist/assets/C9-UYhBb.js +0 -1
- package/dashboard/dist/assets/C9-UYhBb.js.br +0 -0
- package/dashboard/dist/assets/C9-UYhBb.js.gz +0 -0
- package/dashboard/dist/assets/C9yV06GS.js +0 -1
- package/dashboard/dist/assets/C9yV06GS.js.br +0 -0
- package/dashboard/dist/assets/C9yV06GS.js.gz +0 -0
- package/dashboard/dist/assets/CReugbyT.js.br +0 -0
- package/dashboard/dist/assets/CReugbyT.js.gz +0 -0
- package/dashboard/dist/assets/CSDhTbKy.js +0 -1
- package/dashboard/dist/assets/CSDhTbKy.js.br +0 -0
- package/dashboard/dist/assets/CSDhTbKy.js.gz +0 -0
- package/dashboard/dist/assets/CfMS9yIf.js.br +0 -0
- package/dashboard/dist/assets/CfMS9yIf.js.gz +0 -0
- package/dashboard/dist/assets/D2Kqcmv9.js +0 -212
- package/dashboard/dist/assets/D2Kqcmv9.js.br +0 -0
- package/dashboard/dist/assets/D2Kqcmv9.js.gz +0 -0
- package/dashboard/dist/assets/DS79hzMu.js.br +0 -0
- package/dashboard/dist/assets/DS79hzMu.js.gz +0 -0
- package/dashboard/dist/assets/PVi0vr9a.js.br +0 -0
- package/dashboard/dist/assets/PVi0vr9a.js.gz +0 -0
- package/dashboard/dist/assets/RZkbqlJk.css +0 -1
- package/dashboard/dist/assets/RZkbqlJk.css.br +0 -0
- package/dashboard/dist/assets/RZkbqlJk.css.gz +0 -0
- package/dashboard/dist/assets/a6qcPiWt.js.br +0 -0
- package/dashboard/dist/assets/a6qcPiWt.js.gz +0 -0
- package/dashboard/dist/assets/qDJ6rqcs.js.br +0 -0
- package/dashboard/dist/assets/qDJ6rqcs.js.gz +0 -0
- package/dashboard/dist/assets/sdoPH_Z1.js.br +0 -0
- package/dashboard/dist/assets/sdoPH_Z1.js.gz +0 -0
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
<meta name="googlebot" content="noindex, nofollow, noarchive, nosnippet, noimageindex" />
|
|
11
11
|
<meta name="copyright" content="OrgX. All rights reserved." />
|
|
12
12
|
<title>OrgX Live Dashboard</title>
|
|
13
|
-
<script type="module" crossorigin src="/orgx/live/assets/
|
|
13
|
+
<script type="module" crossorigin src="/orgx/live/assets/BV2Tf8S2.js"></script>
|
|
14
14
|
<link rel="modulepreload" crossorigin href="/orgx/live/assets/Dj2k1r16.js">
|
|
15
15
|
<link rel="modulepreload" crossorigin href="/orgx/live/assets/DMKyYAtD.js">
|
|
16
16
|
<link rel="modulepreload" crossorigin href="/orgx/live/assets/eeHXe_OQ.js">
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
<link rel="modulepreload" crossorigin href="/orgx/live/assets/BjK42gtU.js">
|
|
19
19
|
<link rel="modulepreload" crossorigin href="/orgx/live/assets/BV0BcV1u.js">
|
|
20
20
|
<link rel="stylesheet" crossorigin href="/orgx/live/assets/qm8xLgv-.css">
|
|
21
|
-
<link rel="stylesheet" crossorigin href="/orgx/live/assets/
|
|
21
|
+
<link rel="stylesheet" crossorigin href="/orgx/live/assets/BJI1Iy5v.css">
|
|
22
22
|
</head>
|
|
23
23
|
<body class="bg-[#080808] text-white antialiased">
|
|
24
24
|
<div id="root"></div>
|
|
Binary file
|
|
Binary file
|
|
@@ -485,6 +485,45 @@ export declare function createAutoContinueEngine(deps: CreateAutoContinueEngineD
|
|
|
485
485
|
activeRunId: string | null;
|
|
486
486
|
activeTaskTokenEstimate: number | null;
|
|
487
487
|
}>;
|
|
488
|
+
restoreAutoContinueRun: (initiativeId: string) => Promise<{
|
|
489
|
+
initiativeId: string;
|
|
490
|
+
agentId: string;
|
|
491
|
+
agentName: string | null;
|
|
492
|
+
includeVerification: boolean;
|
|
493
|
+
allowedWorkstreamIds: string[] | null;
|
|
494
|
+
stopAfterSlice: boolean;
|
|
495
|
+
ignoreSpawnGuardRateLimit: boolean;
|
|
496
|
+
maxParallelSlices: number;
|
|
497
|
+
parallelMode: "iwmt";
|
|
498
|
+
scope: SliceScope;
|
|
499
|
+
tokenBudget: number | null;
|
|
500
|
+
tokensUsed: number;
|
|
501
|
+
status: "stopped" | "running" | "stopping";
|
|
502
|
+
stopReason: ("error" | "blocked" | "completed" | "stopped" | "budget_exhausted") | null;
|
|
503
|
+
stopRequested: boolean;
|
|
504
|
+
startedAt: string;
|
|
505
|
+
stoppedAt: string | null;
|
|
506
|
+
updatedAt: string;
|
|
507
|
+
lastError: string | null;
|
|
508
|
+
lastTaskId: string | null;
|
|
509
|
+
lastRunId: string | null;
|
|
510
|
+
activeSliceRunIds: string[];
|
|
511
|
+
activeTaskIds: string[];
|
|
512
|
+
laneByWorkstreamId: Record<string, {
|
|
513
|
+
workstreamId: string;
|
|
514
|
+
state: "idle" | "blocked" | "completed" | "running" | "rate_limited" | "waiting_dependency";
|
|
515
|
+
activeRunId: string | null;
|
|
516
|
+
activeTaskIds: string[];
|
|
517
|
+
blockedReason: string | null;
|
|
518
|
+
waitingOnWorkstreamIds: string[];
|
|
519
|
+
retryAt: string | null;
|
|
520
|
+
updatedAt: string;
|
|
521
|
+
}>;
|
|
522
|
+
blockedWorkstreamIds: string[];
|
|
523
|
+
activeTaskId: string | null;
|
|
524
|
+
activeRunId: string | null;
|
|
525
|
+
activeTaskTokenEstimate: number | null;
|
|
526
|
+
} | null>;
|
|
488
527
|
skipCurrentWorkstream: (initiativeId: string, workstreamId: string, reason?: string) => Promise<{
|
|
489
528
|
ok: boolean;
|
|
490
529
|
skippedWorkstreamId: string;
|
|
@@ -733,6 +733,101 @@ export function createAutoContinueEngine(deps) {
|
|
|
733
733
|
};
|
|
734
734
|
const __filename = deps.filename;
|
|
735
735
|
const autoContinueRuns = new Map();
|
|
736
|
+
/**
|
|
737
|
+
* Rehydrate an AutoContinueRun from persisted initiative metadata.
|
|
738
|
+
* Called when the in-memory Map is empty (e.g. after server restart) to
|
|
739
|
+
* restore the last-known autopilot state so the dashboard toggle stays
|
|
740
|
+
* accurate.
|
|
741
|
+
*/
|
|
742
|
+
async function restoreAutoContinueRun(initiativeId) {
|
|
743
|
+
// Already in memory — nothing to restore.
|
|
744
|
+
if (autoContinueRuns.has(initiativeId)) {
|
|
745
|
+
return autoContinueRuns.get(initiativeId) ?? null;
|
|
746
|
+
}
|
|
747
|
+
try {
|
|
748
|
+
const entity = await fetchInitiativeEntity(initiativeId);
|
|
749
|
+
if (!entity)
|
|
750
|
+
return null;
|
|
751
|
+
const meta = entity && typeof entity === "object"
|
|
752
|
+
? entity.metadata ?? {}
|
|
753
|
+
: {};
|
|
754
|
+
const enabled = meta.auto_continue_enabled;
|
|
755
|
+
const status = meta.auto_continue_status;
|
|
756
|
+
if (!enabled || !status)
|
|
757
|
+
return null;
|
|
758
|
+
// Reconstruct lane objects from persisted array.
|
|
759
|
+
const rawLanes = Array.isArray(meta.auto_continue_lane_states)
|
|
760
|
+
? meta.auto_continue_lane_states
|
|
761
|
+
: [];
|
|
762
|
+
const laneByWorkstreamId = {};
|
|
763
|
+
for (const raw of rawLanes) {
|
|
764
|
+
const wsId = String(raw.workstream_id ?? "").trim();
|
|
765
|
+
if (!wsId)
|
|
766
|
+
continue;
|
|
767
|
+
laneByWorkstreamId[wsId] = {
|
|
768
|
+
workstreamId: wsId,
|
|
769
|
+
state: raw.state ?? LaneState.IDLE,
|
|
770
|
+
activeRunId: raw.active_run_id ?? null,
|
|
771
|
+
activeTaskIds: Array.isArray(raw.active_task_ids) ? raw.active_task_ids : [],
|
|
772
|
+
blockedReason: raw.blocked_reason ?? null,
|
|
773
|
+
waitingOnWorkstreamIds: Array.isArray(raw.waiting_on_workstream_ids)
|
|
774
|
+
? raw.waiting_on_workstream_ids
|
|
775
|
+
: [],
|
|
776
|
+
retryAt: raw.retry_at ?? null,
|
|
777
|
+
updatedAt: raw.updated_at ?? new Date().toISOString(),
|
|
778
|
+
};
|
|
779
|
+
}
|
|
780
|
+
const now = new Date().toISOString();
|
|
781
|
+
const run = {
|
|
782
|
+
initiativeId,
|
|
783
|
+
agentId: "",
|
|
784
|
+
agentName: null,
|
|
785
|
+
includeVerification: Boolean(meta.auto_continue_include_verification),
|
|
786
|
+
allowedWorkstreamIds: Array.isArray(meta.auto_continue_workstream_filter)
|
|
787
|
+
? meta.auto_continue_workstream_filter
|
|
788
|
+
: null,
|
|
789
|
+
stopAfterSlice: false,
|
|
790
|
+
ignoreSpawnGuardRateLimit: Boolean(meta.auto_continue_ignore_spawn_guard_rate_limit),
|
|
791
|
+
maxParallelSlices: normalizeMaxParallelSlices(meta.auto_continue_max_parallel, AUTO_CONTINUE_MAX_PARALLEL_DEFAULT),
|
|
792
|
+
parallelMode: normalizeParallelMode(meta.auto_continue_parallel_mode),
|
|
793
|
+
scope: "task",
|
|
794
|
+
tokenBudget: normalizeTokenBudget(meta.auto_continue_token_budget, defaultAutoContinueTokenBudget()),
|
|
795
|
+
tokensUsed: typeof meta.auto_continue_tokens_used === "number" ? meta.auto_continue_tokens_used : 0,
|
|
796
|
+
status: status,
|
|
797
|
+
stopReason: meta.auto_continue_stop_reason ?? null,
|
|
798
|
+
stopRequested: false,
|
|
799
|
+
startedAt: meta.auto_continue_started_at ?? now,
|
|
800
|
+
stoppedAt: meta.auto_continue_stopped_at ?? null,
|
|
801
|
+
updatedAt: meta.auto_continue_updated_at ?? now,
|
|
802
|
+
lastError: meta.auto_continue_last_error ?? null,
|
|
803
|
+
lastTaskId: meta.auto_continue_last_task_id ?? null,
|
|
804
|
+
lastRunId: meta.auto_continue_last_run_id ?? null,
|
|
805
|
+
activeSliceRunIds: Array.isArray(meta.auto_continue_active_run_ids)
|
|
806
|
+
? meta.auto_continue_active_run_ids
|
|
807
|
+
: [],
|
|
808
|
+
activeTaskIds: Array.isArray(meta.auto_continue_active_task_ids)
|
|
809
|
+
? meta.auto_continue_active_task_ids
|
|
810
|
+
: [],
|
|
811
|
+
laneByWorkstreamId,
|
|
812
|
+
blockedWorkstreamIds: Array.isArray(meta.auto_continue_blocked_workstream_ids)
|
|
813
|
+
? meta.auto_continue_blocked_workstream_ids
|
|
814
|
+
: [],
|
|
815
|
+
activeTaskId: meta.auto_continue_active_task_id ?? null,
|
|
816
|
+
activeRunId: meta.auto_continue_active_run_id ?? null,
|
|
817
|
+
activeTaskTokenEstimate: typeof meta.auto_continue_active_task_token_estimate === "number"
|
|
818
|
+
? meta.auto_continue_active_task_token_estimate
|
|
819
|
+
: null,
|
|
820
|
+
};
|
|
821
|
+
ensureRunInternals(run);
|
|
822
|
+
syncLegacyRunPointers(run);
|
|
823
|
+
// Insert into in-memory map so subsequent lookups are fast.
|
|
824
|
+
autoContinueRuns.set(initiativeId, run);
|
|
825
|
+
return run;
|
|
826
|
+
}
|
|
827
|
+
catch {
|
|
828
|
+
return null;
|
|
829
|
+
}
|
|
830
|
+
}
|
|
736
831
|
const localInitiativeStatusOverrides = new Map();
|
|
737
832
|
const localTaskStatusOverrides = new Map();
|
|
738
833
|
const localMilestoneStatusOverrides = new Map();
|
|
@@ -4470,6 +4565,7 @@ export function createAutoContinueEngine(deps) {
|
|
|
4470
4565
|
getAutoContinueLaneForWorkstream,
|
|
4471
4566
|
scheduleAutoFixForWorkstream,
|
|
4472
4567
|
startAutoContinueRun,
|
|
4568
|
+
restoreAutoContinueRun,
|
|
4473
4569
|
skipCurrentWorkstream,
|
|
4474
4570
|
getCanonicalAutopilotState,
|
|
4475
4571
|
// Session store (for resume support)
|
package/dist/http/index.js
CHANGED
|
@@ -1846,7 +1846,7 @@ export function createHttpHandler(config, client, getSnapshot, onboarding, diagn
|
|
|
1846
1846
|
};
|
|
1847
1847
|
const codexBinResolver = createCodexBinResolver();
|
|
1848
1848
|
const resolveCodexBinInfo = () => codexBinResolver.resolveCodexBinInfo();
|
|
1849
|
-
const { autoContinueRuns, autoContinueSliceRuns, localInitiativeStatusOverrides, writeRuntimeEvent, autoContinueTickMs: AUTO_CONTINUE_TICK_MS, defaultAutoContinueTokenBudget, defaultAutoContinueMaxParallelSlices, setLocalInitiativeStatusOverride, clearLocalInitiativeStatusOverride, applyLocalInitiativeOverrides, applyLocalInitiativeOverrideToGraph, updateInitiativeAutoContinueState, stopAutoContinueRun, tickAutoContinueRun, tickAllAutoContinue, isInitiativeActiveStatus, runningAutoContinueForWorkstream, getAutoContinueLaneForWorkstream, scheduleAutoFixForWorkstream, startAutoContinueRun, skipCurrentWorkstream, getCanonicalAutopilotState, } = createAutoContinueEngine({
|
|
1849
|
+
const { autoContinueRuns, autoContinueSliceRuns, localInitiativeStatusOverrides, writeRuntimeEvent, autoContinueTickMs: AUTO_CONTINUE_TICK_MS, defaultAutoContinueTokenBudget, defaultAutoContinueMaxParallelSlices, setLocalInitiativeStatusOverride, clearLocalInitiativeStatusOverride, applyLocalInitiativeOverrides, applyLocalInitiativeOverrideToGraph, updateInitiativeAutoContinueState, stopAutoContinueRun, tickAutoContinueRun, tickAllAutoContinue, isInitiativeActiveStatus, runningAutoContinueForWorkstream, getAutoContinueLaneForWorkstream, scheduleAutoFixForWorkstream, startAutoContinueRun, restoreAutoContinueRun, skipCurrentWorkstream, getCanonicalAutopilotState, } = createAutoContinueEngine({
|
|
1850
1850
|
client,
|
|
1851
1851
|
filename: __filename,
|
|
1852
1852
|
safeErrorMessage,
|
|
@@ -3042,6 +3042,7 @@ export function createHttpHandler(config, client, getSnapshot, onboarding, diagn
|
|
|
3042
3042
|
});
|
|
3043
3043
|
registerMissionControlReadRoutes(apiRouter, {
|
|
3044
3044
|
autoContinueRuns,
|
|
3045
|
+
restoreAutoContinueRun,
|
|
3045
3046
|
defaultAutoContinueTokenBudget,
|
|
3046
3047
|
defaultAutoContinueMaxParallelSlices,
|
|
3047
3048
|
autoContinueTickMs: AUTO_CONTINUE_TICK_MS,
|
|
@@ -38,6 +38,7 @@ type NextUpQueueItem = {
|
|
|
38
38
|
sliceTaskIds?: string[];
|
|
39
39
|
sliceTaskCount?: number | null;
|
|
40
40
|
sliceMilestoneId?: string | null;
|
|
41
|
+
milestoneBreakdown?: MilestoneBreakdownEntry[];
|
|
41
42
|
isPinned?: boolean;
|
|
42
43
|
pinnedRank?: number | null;
|
|
43
44
|
compositeScore?: number;
|
|
@@ -56,8 +57,21 @@ type NextUpQueue = {
|
|
|
56
57
|
items: NextUpQueueItem[];
|
|
57
58
|
degraded: string[];
|
|
58
59
|
};
|
|
60
|
+
type MilestoneBreakdownTask = {
|
|
61
|
+
id: string;
|
|
62
|
+
title: string;
|
|
63
|
+
status: string;
|
|
64
|
+
};
|
|
65
|
+
type MilestoneBreakdownEntry = {
|
|
66
|
+
id: string;
|
|
67
|
+
title: string;
|
|
68
|
+
tasks: MilestoneBreakdownTask[];
|
|
69
|
+
totalTasks: number;
|
|
70
|
+
doneTasks: number;
|
|
71
|
+
};
|
|
59
72
|
type RegisterMissionControlReadRoutesDeps<TRes> = {
|
|
60
73
|
autoContinueRuns: Map<string, AutoContinueRunRecord>;
|
|
74
|
+
restoreAutoContinueRun?: (initiativeId: string) => Promise<AutoContinueRunRecord | null>;
|
|
61
75
|
defaultAutoContinueTokenBudget: () => number | null;
|
|
62
76
|
defaultAutoContinueMaxParallelSlices?: () => number;
|
|
63
77
|
autoContinueTickMs: number;
|
|
@@ -619,6 +619,11 @@ function mapCanonicalSlicesToQueueItems(input) {
|
|
|
619
619
|
const record = asRecord(entry);
|
|
620
620
|
if (!record)
|
|
621
621
|
continue;
|
|
622
|
+
const sliceKind = (asString(record.sliceKind) ?? asString(record.slice_kind) ?? "")
|
|
623
|
+
.trim()
|
|
624
|
+
.toLowerCase();
|
|
625
|
+
if (sliceKind && sliceKind !== "work_slice")
|
|
626
|
+
continue;
|
|
622
627
|
const initiativeId = asString(record.initiativeId) ?? asString(record.initiative_id);
|
|
623
628
|
const workstreamId = asString(record.workstreamId) ?? asString(record.workstream_id);
|
|
624
629
|
if (!initiativeId || !workstreamId)
|
|
@@ -742,6 +747,7 @@ async function loadInitiativeGraphIndex(deps, initiativeId) {
|
|
|
742
747
|
const nodes = Array.isArray(graph?.nodes) ? graph.nodes : [];
|
|
743
748
|
const tasksById = new Map();
|
|
744
749
|
const milestoneTitleById = new Map();
|
|
750
|
+
const milestoneWorkstream = new Map();
|
|
745
751
|
for (const nodeEntry of nodes) {
|
|
746
752
|
const node = asRecord(nodeEntry);
|
|
747
753
|
if (!node)
|
|
@@ -752,6 +758,9 @@ async function loadInitiativeGraphIndex(deps, initiativeId) {
|
|
|
752
758
|
continue;
|
|
753
759
|
if (type === "milestone") {
|
|
754
760
|
milestoneTitleById.set(id, asString(node.title) ?? id);
|
|
761
|
+
const wsId = asString(node.workstreamId) ?? asString(node.parentId);
|
|
762
|
+
if (wsId)
|
|
763
|
+
milestoneWorkstream.set(id, wsId);
|
|
755
764
|
continue;
|
|
756
765
|
}
|
|
757
766
|
if (type !== "task")
|
|
@@ -767,11 +776,63 @@ async function loadInitiativeGraphIndex(deps, initiativeId) {
|
|
|
767
776
|
updatedAt: asString(node.updatedAt),
|
|
768
777
|
});
|
|
769
778
|
}
|
|
779
|
+
// Build milestonesByWorkstream from milestones + their child tasks
|
|
780
|
+
const milestonesByWorkstream = new Map();
|
|
781
|
+
for (const [msId, wsId] of milestoneWorkstream) {
|
|
782
|
+
const taskIds = [];
|
|
783
|
+
for (const task of tasksById.values()) {
|
|
784
|
+
if (task.milestoneId === msId)
|
|
785
|
+
taskIds.push(task.id);
|
|
786
|
+
}
|
|
787
|
+
const entry = { id: msId, title: milestoneTitleById.get(msId) ?? msId, taskIds };
|
|
788
|
+
const existing = milestonesByWorkstream.get(wsId) ?? [];
|
|
789
|
+
existing.push(entry);
|
|
790
|
+
milestonesByWorkstream.set(wsId, existing);
|
|
791
|
+
}
|
|
770
792
|
return {
|
|
771
793
|
tasksById,
|
|
772
794
|
milestoneTitleById,
|
|
795
|
+
milestonesByWorkstream,
|
|
773
796
|
};
|
|
774
797
|
}
|
|
798
|
+
async function enrichWithMilestoneBreakdown(items, deps) {
|
|
799
|
+
if (items.length === 0)
|
|
800
|
+
return items;
|
|
801
|
+
const graphByInitiative = new Map();
|
|
802
|
+
const uniqueInitiatives = dedupeStrings(items.map((i) => i.initiativeId));
|
|
803
|
+
for (const id of uniqueInitiatives) {
|
|
804
|
+
try {
|
|
805
|
+
graphByInitiative.set(id, await loadInitiativeGraphIndex(deps, id));
|
|
806
|
+
}
|
|
807
|
+
catch {
|
|
808
|
+
// graph unavailable — skip enrichment for this initiative
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
if (graphByInitiative.size === 0)
|
|
812
|
+
return items;
|
|
813
|
+
for (const item of items) {
|
|
814
|
+
const graph = graphByInitiative.get(item.initiativeId);
|
|
815
|
+
if (!graph)
|
|
816
|
+
continue;
|
|
817
|
+
const milestones = graph.milestonesByWorkstream.get(item.workstreamId) ?? [];
|
|
818
|
+
if (milestones.length === 0)
|
|
819
|
+
continue;
|
|
820
|
+
item.milestoneBreakdown = milestones.map((ms) => {
|
|
821
|
+
const tasks = ms.taskIds.map((tid) => {
|
|
822
|
+
const task = graph.tasksById.get(tid);
|
|
823
|
+
return { id: tid, title: task?.title ?? "Untitled", status: task?.status ?? "pending" };
|
|
824
|
+
});
|
|
825
|
+
return {
|
|
826
|
+
id: ms.id,
|
|
827
|
+
title: ms.title,
|
|
828
|
+
tasks,
|
|
829
|
+
totalTasks: tasks.length,
|
|
830
|
+
doneTasks: tasks.filter((t) => t.status === "done" || t.status === "completed").length,
|
|
831
|
+
};
|
|
832
|
+
});
|
|
833
|
+
}
|
|
834
|
+
return items;
|
|
835
|
+
}
|
|
775
836
|
export function registerMissionControlReadRoutes(router, deps) {
|
|
776
837
|
// Handler registrations are process-local. Reset route caches so each newly
|
|
777
838
|
// constructed handler starts from a clean canonical cache/bypass state.
|
|
@@ -803,7 +864,10 @@ export function registerMissionControlReadRoutes(router, deps) {
|
|
|
803
864
|
sendRouteError(res, 400, "mission-control.read.auto-continue.status.validation", "initiativeId is required");
|
|
804
865
|
return;
|
|
805
866
|
}
|
|
806
|
-
|
|
867
|
+
let run = deps.autoContinueRuns.get(id) ?? null;
|
|
868
|
+
if (!run && deps.restoreAutoContinueRun) {
|
|
869
|
+
run = await deps.restoreAutoContinueRun(id) ?? null;
|
|
870
|
+
}
|
|
807
871
|
deps.sendJson(res, 200, {
|
|
808
872
|
ok: true,
|
|
809
873
|
initiativeId: id,
|
|
@@ -953,7 +1017,7 @@ export function registerMissionControlReadRoutes(router, deps) {
|
|
|
953
1017
|
if (isCanonicalAllScopeMismatch(canonicalRecord, useAllScope)) {
|
|
954
1018
|
throw new Error("canonical next-up all-workspaces scope mismatch");
|
|
955
1019
|
}
|
|
956
|
-
const canonicalItems = applyQueueNoiseControls(normalizeQueueItems(canonicalRecord.items).filter((item) => includeCompleted ? true : item.queueState !== "completed"), { noiseThreshold, dedupWindowMs });
|
|
1020
|
+
const canonicalItems = await enrichWithMilestoneBreakdown(applyQueueNoiseControls(normalizeQueueItems(canonicalRecord.items).filter((item) => includeCompleted ? true : item.queueState !== "completed"), { noiseThreshold, dedupWindowMs }), deps);
|
|
957
1021
|
const canonicalTotal = Math.max(canonicalItems.length, Math.floor(asNumber(canonicalRecord.total) ?? canonicalItems.length)) ?? canonicalItems.length;
|
|
958
1022
|
const canonicalPagination = parsePaginationEnvelope(canonicalRecord.pagination, {
|
|
959
1023
|
offset,
|
|
@@ -1081,7 +1145,7 @@ export function registerMissionControlReadRoutes(router, deps) {
|
|
|
1081
1145
|
if (isCanonicalAllScopeMismatch(canonicalSlicesRecord, useAllScope)) {
|
|
1082
1146
|
throw new Error("canonical slices all-workspaces scope mismatch");
|
|
1083
1147
|
}
|
|
1084
|
-
const bridgedItems = applyQueueNoiseControls(mapCanonicalSlicesToQueueItems(canonicalSlicesRecord.items).filter((item) => includeCompleted ? true : item.queueState !== "completed"), { noiseThreshold, dedupWindowMs });
|
|
1148
|
+
const bridgedItems = await enrichWithMilestoneBreakdown(applyQueueNoiseControls(mapCanonicalSlicesToQueueItems(canonicalSlicesRecord.items).filter((item) => includeCompleted ? true : item.queueState !== "completed"), { noiseThreshold, dedupWindowMs }), deps);
|
|
1085
1149
|
if (bridgedItems.length > 0) {
|
|
1086
1150
|
const paged = applySliceSearchAndPagination({
|
|
1087
1151
|
items: bridgedItems,
|
|
@@ -1124,7 +1188,7 @@ export function registerMissionControlReadRoutes(router, deps) {
|
|
|
1124
1188
|
initiativeId,
|
|
1125
1189
|
projectId,
|
|
1126
1190
|
});
|
|
1127
|
-
const items = applyQueueNoiseControls(normalizeQueueItems(queue.items ?? []).filter((item) => includeCompleted ? true : item.queueState !== "completed"), { noiseThreshold, dedupWindowMs });
|
|
1191
|
+
const items = await enrichWithMilestoneBreakdown(applyQueueNoiseControls(normalizeQueueItems(queue.items ?? []).filter((item) => includeCompleted ? true : item.queueState !== "completed"), { noiseThreshold, dedupWindowMs }), deps);
|
|
1128
1192
|
const paged = applySliceSearchAndPagination({
|
|
1129
1193
|
items,
|
|
1130
1194
|
searchTerm: "",
|
|
@@ -1157,7 +1221,7 @@ export function registerMissionControlReadRoutes(router, deps) {
|
|
|
1157
1221
|
initiativeId,
|
|
1158
1222
|
projectId,
|
|
1159
1223
|
});
|
|
1160
|
-
const items = applyQueueNoiseControls(normalizeQueueItems(queue.items ?? []).filter((item) => includeCompleted ? true : item.queueState !== "completed"), { noiseThreshold, dedupWindowMs });
|
|
1224
|
+
const items = await enrichWithMilestoneBreakdown(applyQueueNoiseControls(normalizeQueueItems(queue.items ?? []).filter((item) => includeCompleted ? true : item.queueState !== "completed"), { noiseThreshold, dedupWindowMs }), deps);
|
|
1161
1225
|
const paged = applySliceSearchAndPagination({
|
|
1162
1226
|
items,
|
|
1163
1227
|
searchTerm: "",
|
package/dist/outbox.js
CHANGED
|
@@ -114,10 +114,17 @@ async function appendOutboxDeadLetterRecord(sessionId, record) {
|
|
|
114
114
|
await hardenPath(targetPath, 0o600);
|
|
115
115
|
}
|
|
116
116
|
export async function appendOutboxDeadLetter(sessionId, event, reason, error) {
|
|
117
|
+
let normalizedSessionId;
|
|
118
|
+
try {
|
|
119
|
+
normalizedSessionId = normalizeSessionId(sessionId);
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
117
124
|
const droppedAt = new Date().toISOString();
|
|
118
|
-
await appendOutboxDeadLetterRecord(
|
|
125
|
+
await appendOutboxDeadLetterRecord(normalizedSessionId, {
|
|
119
126
|
droppedAt,
|
|
120
|
-
queueId:
|
|
127
|
+
queueId: normalizedSessionId,
|
|
121
128
|
reason,
|
|
122
129
|
error: error ?? null,
|
|
123
130
|
event,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@useorgx/openclaw-plugin",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.20",
|
|
4
4
|
"description": "OrgX plugin for OpenClaw — agent orchestration, quality gates, model routing, and live dashboard",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -54,6 +54,7 @@
|
|
|
54
54
|
"verify:conduit-mcp": "node ./scripts/verify-conduit-mcp.mjs",
|
|
55
55
|
"verify:repo-hygiene": "node ./scripts/verify-repo-hygiene.mjs",
|
|
56
56
|
"dev:main": "node ./scripts/dev-main-sync.mjs",
|
|
57
|
+
"dev:live": "node ./scripts/live-dev-serve.mjs",
|
|
57
58
|
"e2e:auto-continue": "node ./scripts/e2e-auto-continue.mjs",
|
|
58
59
|
"e2e:agent-suite": "npm run build:core && node ./scripts/e2e-agent-suite-kickoff-3x.mjs",
|
|
59
60
|
"demo:record": "node ./scripts/record-demo.mjs",
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as l,j as e}from"./Dj2k1r16.js";import{G as Jt,u as Xt,K as b,P as Yt,B as ie,H as ft,T as Ot,C as I,v as Nt,A as kt,E as je,e as bt,h as Ye,D as gt,F as es,U as ts}from"./D2Kqcmv9.js";import{S as A}from"./BcJmNILk.js";import{A as ke,m as z,u as jt,R as ss,b as ns,a as is}from"./eeHXe_OQ.js";import{Q as m,d as rs,q as Ue,a as wt,b as yt,c as St,e as Ze}from"./a6qcPiWt.js";async function Ct(s,a){var f;const o=await(await fetch(s,a)).json().catch(()=>null),p=((f=o==null?void 0:o.data)==null?void 0:f.url)??(o==null?void 0:o.url)??null;if(typeof p=="string"&&p.trim())return p.trim();throw new Error((o==null?void 0:o.error)??"Billing link unavailable")}async function as(s){var p;const a=((p=s==null?void 0:s.actions)==null?void 0:p.checkout)??"/orgx/api/billing/checkout",c=((s==null?void 0:s.requiredPlan)??"starter").trim().toLowerCase()||"starter",o=await Ct(a,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({planId:c})});window.open(o,"_blank","noopener,noreferrer")}async function os(s){var o;const a=((o=s==null?void 0:s.actions)==null?void 0:o.portal)??"/orgx/api/billing/portal",c=await Ct(a,{method:"POST"});window.open(c,"_blank","noopener,noreferrer")}function ls(s){return s==="success"?"border-emerald-400/30 bg-[#0A1210]/95 text-emerald-100":s==="warning"?"border-amber-300/30 bg-[#12100A]/95 text-amber-100":s==="error"?"border-red-400/32 bg-[#120A0A]/95 text-red-100":s==="info"?"border-cyan-300/28 bg-[#0A1012]/95 text-cyan-100":"border-strong bg-[#0B0F16]/95 text-primary"}function cs({open:s,tone:a="neutral",title:c,message:o=null,className:p,primaryAction:f=null,secondaryAction:k=null,onDismiss:S=null,autoDismissMs:q=null}){return l.useEffect(()=>{if(!s||!S||!q)return;const K=window.setTimeout(()=>S(),q);return()=>window.clearTimeout(K)},[q,S,s,c,o]),e.jsx(ke,{initial:!1,children:s?e.jsx(z.div,{initial:{opacity:0,y:-8,scale:.985},animate:{opacity:1,y:0,scale:1},exit:{opacity:0,y:-8,scale:.985},transition:{duration:.2,ease:[.22,1,.36,1]},className:`pointer-events-none ${p??""}`,children:e.jsxs("div",{className:`pointer-events-none min-w-[220px] max-w-[420px] rounded-xl border px-3 py-2 shadow-[0_16px_36px_rgba(0,0,0,0.42)] backdrop-blur ${ls(a)}`,children:[e.jsxs("div",{className:"flex items-start gap-2.5",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("p",{className:"text-caption font-semibold",children:c}),o?e.jsx("p",{className:"mt-0.5 text-caption opacity-85",children:o}):null]}),S?e.jsx("button",{type:"button",onClick:S,className:"pointer-events-auto inline-flex h-6 w-6 items-center justify-center rounded-md text-current/70 transition-colors hover:bg-white/[0.08] hover:text-current","aria-label":"Dismiss toast",title:"Dismiss",children:e.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("path",{d:"M18 6 6 18"}),e.jsx("path",{d:"m6 6 12 12"})]})}):null]}),f||k?e.jsxs("div",{className:"mt-2 flex items-center gap-1.5",children:[k?e.jsx("button",{type:"button",onClick:k.onClick,className:"pointer-events-auto h-7 rounded-md border border-strong bg-white/[0.06] px-2.5 text-micro font-semibold text-current transition-colors hover:bg-white/[0.12]",children:k.label}):null,f?e.jsx("button",{type:"button",onClick:f.onClick,className:"pointer-events-auto h-7 rounded-md border border-white/25 bg-white/[0.14] px-2.5 text-micro font-semibold text-current transition-colors hover:bg-white/[0.2]",children:f.label}):null]}):null]})}):null})}function It({className:s=""}){return e.jsx("svg",{viewBox:"0 0 20 20",fill:"none","aria-hidden":!0,className:s,children:e.jsx("path",{d:"M7 5.4v9.2c0 .7.75 1.15 1.38.83l7.6-4.6a.95.95 0 0 0 0-1.62l-7.6-4.64A.95.95 0 0 0 7 5.4Z",fill:"currentColor"})})}function ds({className:s=""}){return e.jsxs("svg",{viewBox:"0 0 20 20",fill:"none","aria-hidden":!0,className:s,children:[e.jsx("path",{d:"M6.2 9.4V6.7c0-.7.5-1.2 1.1-1.2s1.1.5 1.1 1.2v2.2",stroke:"currentColor",strokeWidth:"1.4",strokeLinecap:"round"}),e.jsx("path",{d:"M8.4 8.9V5.8c0-.7.5-1.3 1.1-1.3s1.1.6 1.1 1.3v3",stroke:"currentColor",strokeWidth:"1.4",strokeLinecap:"round"}),e.jsx("path",{d:"M10.6 8.9V6.2c0-.7.5-1.3 1.1-1.3s1.1.6 1.1 1.3v3.2",stroke:"currentColor",strokeWidth:"1.4",strokeLinecap:"round"}),e.jsx("path",{d:"M12.8 9.6V7.2c0-.7.5-1.2 1.1-1.2s1.1.5 1.1 1.2v4.2c0 2.7-1.9 4.6-4.6 4.6H9.2c-2.1 0-3.7-1-4.6-2.8l-.9-1.7c-.3-.6 0-1.4.6-1.7.6-.3 1.3 0 1.6.6l.7 1.4",stroke:"currentColor",strokeWidth:"1.4",strokeLinecap:"round",strokeLinejoin:"round"})]})}function us({className:s=""}){return e.jsxs("svg",{viewBox:"0 0 20 20",fill:"none","aria-hidden":!0,className:s,children:[e.jsx("path",{d:"M6.4 9.2V7.4c0-.7.5-1.2 1.1-1.2s1.1.5 1.1 1.2v1.3",stroke:"currentColor",strokeWidth:"1.4",strokeLinecap:"round"}),e.jsx("path",{d:"M8.6 8.9V7c0-.7.5-1.2 1.1-1.2s1.1.5 1.1 1.2v2",stroke:"currentColor",strokeWidth:"1.4",strokeLinecap:"round"}),e.jsx("path",{d:"M10.8 9.2V7.3c0-.7.5-1.2 1.1-1.2s1.1.5 1.1 1.2v2.6",stroke:"currentColor",strokeWidth:"1.4",strokeLinecap:"round"}),e.jsx("path",{d:"M13 9.8V8.2c0-.7.5-1.2 1.1-1.2s1.1.5 1.1 1.2v3.6c0 2.4-1.7 4-4.1 4H9.7c-2 0-3.4-.9-4.2-2.5l-.8-1.4c-.3-.6 0-1.3.5-1.6.6-.3 1.2-.1 1.6.5l.6 1",stroke:"currentColor",strokeWidth:"1.4",strokeLinecap:"round",strokeLinejoin:"round"})]})}function Je(s){const a=typeof s.sliceTaskCount=="number"&&Number.isFinite(s.sliceTaskCount)?Math.max(0,Math.floor(s.sliceTaskCount)):null,c=s.sliceScope==="task"?"task":s.sliceScope==="milestone"?"milestone slice":"workstream slice",o=a&&a>0?`${a} ${a===1?"task":"tasks"}`:null;return s.queueState===m.RUNNING?o?`Executing ${o} in ${c}.`:"Execution in progress. Task detail will appear as the scheduler advances.":s.queueState===m.BLOCKED?s.blockReason?"Blocked while waiting for dependency resolution.":"Blocked. Waiting for dependency or review.":s.queueState===m.QUEUED?o?`Queued with ${o} in ${c}.`:"Queued at workstream scope. Task detail will populate after dispatch.":s.queueState===m.COMPLETED?"Completed. No queued tasks remain.":"Idle. Ready to dispatch when started."}function qt(s){const a=typeof s.initiativePriority=="string"?s.initiativePriority.trim().toLowerCase():"",c=typeof s.initiativePriorityNum=="number"&&Number.isFinite(s.initiativePriorityNum)?Math.max(1,Math.min(100,Math.round(s.initiativePriorityNum))):null,o=a==="urgent"||a==="high"||a==="medium"||a==="low"?a:c!==null?c<=12?"urgent":c<=30?"high":c<=60?"medium":"low":null;if(!o)return null;const p=o==="urgent"?"P1":o==="high"?"P2":o==="medium"?"P3":"P4",f=o==="urgent"?"Urgent":o==="high"?"High":o==="medium"?"Medium":"Low",k=o==="urgent"?"border-red-300/35 bg-red-500/[0.14] text-red-100":o==="high"?"border-amber-300/35 bg-amber-500/[0.14] text-amber-100":o==="medium"?"border-[#BFFF00]/35 bg-[#BFFF00]/14 text-[#E1FFB2]":"border-white/[0.2] bg-white/[0.08] text-white/70";return{shortLabel:`${p} ${f}`,longLabel:`Initiative priority ${f} (${p})`,toneClass:k}}function ms(s){const a=s.trim().toLowerCase();if(a.includes("timed out")||a.includes("timeout")||a.includes("request cancelled")||a.includes("signal is aborted"))return"Next Up is still syncing. Keep this panel open and it will repopulate automatically.";if(a.includes("unauthorized")||a.includes("forbidden")||a.includes("api key")||a.includes("auth"))return"Next Up is unavailable until OrgX authentication is reconnected in Settings.";if(a.includes("unknown api endpoint")||a.includes("route is unavailable"))return"This runtime is missing queue routes. Restart and update the plugin build.";const c=s.split("|").map(o=>o.trim()).filter(Boolean).map(o=>o.replace(/^[^:]+:\s*/,"").trim()).filter(Boolean).slice(0,2).join(" ");return Ye(c||s)||"Next Up is temporarily unavailable."}function xs(s){const a=s.trim().toLowerCase();return a.includes("circular")||a.includes("timeline estimate")||a.includes("adjusted accordingly")?null:a.includes("timed out")||a.includes("timeout")||a.includes("request cancelled")||a.includes("signal is aborted")?"Signal is delayed right now. Queue data will appear as soon as sync catches up.":a.includes("fallback")?"Showing fallback queue data while full signal refreshes.":a.includes("unknown api endpoint")||a.includes("route is unavailable")?"Some queue controls are unavailable in this plugin build. Update and restart to restore full controls.":Ye(s.trim())}function Se(s,a,c){const o=typeof s=="string"?s.trim():"";if(o&&!gt(o))return I(o);const p=typeof a=="string"?a.trim():"";return p?gt(p)?`${c} ${es(p)}`:I(p):c}function $t(s){const a=typeof s.runnerAgentName=="string"?s.runnerAgentName.trim():"";if(!a)return"Unassigned";const c=a.toLowerCase();return c==="undefined"||c==="null"||c==="main"&&(s.runnerAgentId==="unassigned"||s.runnerSource==="fallback")?"Unassigned":a}function Tt(s){return s.runnerSource==="inferred"?"inferred":null}function Mt(s,a){const c=s.runnerSource==="assigned"?"assigned":s.runnerSource==="inferred"?"inferred":"fallback";return a==="Unassigned"?`Runner ${c}`:`${a} · ${c}`}function pe(s,a){return!s||s.trim().length===0?a:Ye(s.trim())||a}function vt(s){return!s||typeof s!="object"||Array.isArray(s)?null:s}function Xe(s,a){const c=I(s.workstreamTitle),o=vt(a),p=o&&typeof o.dispatchMode=="string"?o.dispatchMode:null,f=vt(o==null?void 0:o.run);return(f&&typeof f.stopReason=="string"?f.stopReason:f&&typeof f.stop_reason=="string"?f.stop_reason:null)==="budget_exhausted"?`Dispatch acknowledged for ${c}, but autopilot stopped: budget exhausted.`:p==="pending"?`Dispatching ${c}; waiting for slice start…`:p==="fallback"?`Dispatched ${c} using fallback runner.`:`Dispatched ${c}.`}function Rt({className:s=""}){return e.jsxs("svg",{viewBox:"0 0 20 20",fill:"none","aria-hidden":!0,className:s,children:[e.jsx("circle",{cx:"4.5",cy:"10",r:"1.4",fill:"currentColor"}),e.jsx("circle",{cx:"10",cy:"10",r:"1.4",fill:"currentColor"}),e.jsx("circle",{cx:"15.5",cy:"10",r:"1.4",fill:"currentColor"})]})}function ps({compact:s}){const a=s?3:6;return e.jsxs("div",{className:"space-y-2.5",children:[e.jsxs("div",{className:"flex items-center gap-2 px-1 pt-1 text-micro uppercase tracking-[0.12em] text-muted",children:[e.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-[#BFFF00]/70 status-breathe"}),e.jsx("span",{children:"Calibrating queue"})]}),Array.from({length:a}).map((c,o)=>e.jsxs("div",{className:"nextup-skeleton-card rounded-2xl border border-white/[0.08] bg-white/[0.02] px-3 py-3",children:[e.jsxs("div",{className:"flex items-start justify-between gap-2.5",children:[e.jsxs("div",{className:"flex min-w-0 flex-1 items-start gap-2.5",children:[e.jsx(A,{className:"h-8 w-8 rounded-full"}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx(A,{className:"h-3 w-40 rounded-md"}),e.jsx(A,{className:"mt-2 h-4 w-56 rounded-md"})]})]}),e.jsx(A,{className:"h-5 w-16 rounded-full"})]}),e.jsxs("div",{className:"mt-3 rounded-lg border border-white/[0.07] bg-black/[0.18] px-2.5 py-2",children:[e.jsx(A,{className:"h-3 w-14 rounded"}),e.jsx(A,{className:"mt-2 h-3 w-full rounded"}),e.jsx(A,{className:"mt-2 h-3 w-3/5 rounded"})]}),e.jsxs("div",{className:"mt-2.5 flex flex-wrap gap-1.5",children:[e.jsx(A,{className:"h-8 w-24 rounded-full"}),e.jsx(A,{className:"h-8 w-20 rounded-full"}),e.jsx(A,{className:"h-8 w-24 rounded-full"})]})]},`nextup-skeleton-${o}`))]})}function hs({initiativeId:s=null,projectId:a=null,authToken:c=null,embedMode:o=!1,title:p="Next Up",showHeader:f=!0,compact:k=!1,className:S,disableEnterAnimation:q=!1,allowCompactToggle:K=!1,onToggleCompact:he,onOpenInitiative:$,onOpenSettings:L,onUpgradeGate:D,onOpenSliceDetail:_,selectionEnabled:Q=!0,panelStyle:Ce="card",showQueueSettings:Ie=!0,queueModel:qe,queueActions:Ae,onPlayWorkstream:W,snapshotVersion:$e=null,excludeRunning:T=!1}){var ht;const[re,fe]=l.useState(k);l.useEffect(()=>fe(k),[k]);const d=K&&!he?re:k,ae=t=>{he?he(t):fe(t)},[B,y]=l.useState(null),[w,J]=l.useState("workstream"),oe="bottom",[j,le]=l.useState(null),[F,X]=l.useState(null),[x,Y]=l.useState(null),[V,ce]=l.useState(new Set),[Te,de]=l.useState(null),[be,ge]=l.useState(!1),[Et,Me]=l.useState(!1),G=jt(),Oe=l.useRef(null),et=l.useRef(null),tt=l.useRef(null),Lt=Jt({initiativeId:s,projectId:a,limit:40,authToken:c,embedMode:o,enabled:!qe,snapshotVersion:$e,zoomLevel:w}),Bt=qe??Lt,{items:ue,degraded:O,isLoading:M,isFetching:st,isFetchingNextPage:Re,hasNextPage:ze,error:Ee,refetch:Ft,fetchNextPage:nt,playWorkstream:Pt,startWorkstreamAutoContinue:it,initiativeGroups:De,milestoneGroups:_e}=Bt,Ut=Xt({authToken:c,embedMode:o}),H=Ae??Ut,P=t=>`${t.initiativeId}:${t.workstreamId}`,ee=w==="workstream",Ge=l.useMemo(()=>G?{duration:.01}:b.surfaceSwitch,[G]),U=l.useMemo(()=>{if(T)return ue.filter(i=>i.queueState!==m.RUNNING);const t=ue.filter(i=>i.queueState!==m.RUNNING);return t.length>0?t:ue},[T,ue]),rt=l.useMemo(()=>U.length===0?"empty":U.some(t=>t.queueState!==m.RUNNING&&t.queueState!==m.BLOCKED)?m.QUEUED:U.some(t=>t.queueState===m.BLOCKED)?m.BLOCKED:U.some(t=>t.queueState===m.RUNNING)?m.RUNNING:m.QUEUED,[U]),at=l.useMemo(()=>{if(!T)return De;const t=[];for(const i of De){const r=i.items.filter(n=>n.queueState!==m.RUNNING);r.length!==0&&t.push({...i,items:r,queueState:rs(r)})}return t},[T,De]),we=l.useMemo(()=>[...at].sort((t,i)=>{const r=Ue(t.queueState)-Ue(i.queueState);return r!==0?r:t.initiativeTitle.localeCompare(i.initiativeTitle)}),[at]),ot=l.useMemo(()=>T?_e.filter(t=>t.item.queueState!==m.RUNNING):_e,[T,_e]),ye=l.useMemo(()=>[...ot].sort((t,i)=>{const r=Ue(t.queueState)-Ue(i.queueState);if(r!==0)return r;const n=t.initiativeTitle.localeCompare(i.initiativeTitle);if(n!==0)return n;const u=t.workstreamTitle.localeCompare(i.workstreamTitle);return u!==0?u:t.milestoneTitle.localeCompare(i.milestoneTitle)}),[ot]),Ke=l.useMemo(()=>d?we.slice(0,5):we,[d,we]),Qe=l.useMemo(()=>d?ye.slice(0,5):ye,[d,ye]),lt=l.useMemo(()=>w==="initiative"?we.length:w==="milestone"?ye.length:U.length,[U.length,we.length,ye.length,w]),At=[{value:"initiative",label:"Initiative"},{value:"workstream",label:"Workstream"},{value:"milestone",label:"Milestone"}],C=l.useMemo(()=>ee?d?U.slice(0,5):U:[],[d,ee,U]),zt=l.useMemo(()=>C.filter(t=>V.has(P(t))),[V,C]),[me,ct]=l.useState([]),We=l.useRef([]),dt=l.useMemo(()=>{const t=new Map;for(const i of C)t.set(P(i),i);return t},[C]),R=l.useMemo(()=>C.map(P),[C]),Dt=l.useMemo(()=>R.join("|"),[R]);l.useEffect(()=>{ct(t=>{if(d)return[];const i=[],r=new Set(R);for(const n of t)r.has(n)&&i.push(n);for(const n of R)i.includes(n)||i.push(n);return i})},[d,Dt]),l.useEffect(()=>{We.current=me},[me]),l.useEffect(()=>{Te&&(R.includes(Te)||de(null))},[Te,R]),l.useEffect(()=>{ce(t=>{if(t.size===0)return t;const i=new Set(C.map(P)),r=new Set;for(const n of t)i.has(n)&&r.add(n);return r.size===t.size?t:r})},[C]),l.useEffect(()=>{if(!x)return;C.some(i=>P(i)===x)||Y(null)},[x,C]),l.useEffect(()=>{if(O.length===0){Me(!1);return}Me(!1)},[O]),l.useEffect(()=>{Q&&!d&&V.size>0&&ge(!1)},[d,V.size,Q]),l.useEffect(()=>{if(!be)return;const t=r=>{var u;const n=r.target;n&&((u=Oe.current)!=null&&u.contains(n)||ge(!1))},i=r=>{r.key==="Escape"&&ge(!1)};return document.addEventListener("mousedown",t),document.addEventListener("touchstart",t),document.addEventListener("keydown",i),()=>{document.removeEventListener("mousedown",t),document.removeEventListener("touchstart",t),document.removeEventListener("keydown",i)}},[be]),l.useEffect(()=>{if(!ze)return;const t=et.current,i=tt.current;if(!t||!i)return;const r=new IntersectionObserver(n=>{n.some(u=>u.isIntersecting)&&(M||Re||nt().catch(()=>null))},{root:t,rootMargin:"220px 0px 220px 0px",threshold:0});return r.observe(i),()=>r.disconnect()},[nt,ze,Re,M]);const ut=async t=>{const i=P(t),r=I(t.workstreamTitle);try{await H.remove({initiativeId:t.initiativeId,workstreamId:t.workstreamId}),ce(n=>{if(!n.has(i))return n;const u=new Set(n);return u.delete(i),u}),de(n=>n===i?null:n),y(`Removed ${r} from queue.`)}catch(n){const u=n instanceof Error?n.message:"";y(pe(u,"Failed to remove from queue"))}},_t=(t,i,r)=>{const n=d?R:me.length>0?me:R;ce(u=>{const h=new Set(u),E=Te;if(r&&E&&n.includes(E)){const g=n.indexOf(t),Z=n.indexOf(E);if(g>=0&&Z>=0){const[Fe,Pe]=g<Z?[g,Z]:[Z,g];for(const Ne of n.slice(Fe,Pe+1))i?h.add(Ne):h.delete(Ne)}else i?h.add(t):h.delete(t)}else i?h.add(t):h.delete(t);return h}),de(t)},Gt=()=>{ce(new Set(R)),de(R.length>0?R[R.length-1]:null)},Kt=()=>{ce(new Set),de(null)},Ve=async t=>{if(V.size===0){y("Select one or more queue items first.");return}const i=C.map(r=>({key:P(r),item:r})).filter(r=>V.has(r.key));if(i.length===0){y("Selected queue items are no longer visible.");return}X(`bulk:${t}`),y(null);try{const r=i.map(({item:g})=>({initiativeId:g.initiativeId,workstreamId:g.workstreamId})),n=await H.bulk({action:t,items:r}),u=typeof(n==null?void 0:n.updated)=="number"?n.updated??0:0,h=typeof(n==null?void 0:n.failed)=="number"?n.failed??0:0,E=Array.isArray(n==null?void 0:n.errors)?n.errors.filter(g=>typeof g=="string").map(g=>g.trim()).filter(Boolean):[],v=t==="remove"?"removed":t==="move_top"?"moved to top":"moved to bottom";u===0&&h>0&&E.length>0?y(pe(E[0],`${h} queue action${h===1?"":"s"} failed.`)):y(h>0?`${u} item${u===1?"":"s"} ${v}; ${h} failed.`:`${u} item${u===1?"":"s"} ${v}.`),ce(new Set),de(null)}catch(r){const n=r instanceof Error?r.message:"";y(pe(n,"Bulk queue action failed"))}finally{X(null)}},Qt=async()=>{const t=We.current.map(i=>dt.get(i)).filter(Boolean).map(i=>({initiativeId:i.initiativeId,workstreamId:i.workstreamId}));t.length!==0&&await H.reorder({order:t})},te=async(t,i,r)=>{y(null),le(null),D==null||D(null),X(t);try{const n=await i();y(typeof r=="function"?r(n):r)}catch(n){if(n instanceof ts)le(n),D==null||D(n);else{const u=n instanceof Error?n.message:"";y(pe(u,"Action failed"))}}finally{X(null)}},Le=async t=>W?await W(t):await Pt({initiativeId:t.initiativeId,workstreamId:t.workstreamId,agentId:t.runnerAgentId}),Be=j?"upgrade":Ee?"error":B?"notice":null,mt=Ee?ms(Ee):null,ve=O.length>0?xs(O[0]):null,Wt=Be!==null,Vt=O.length>0&&ve!==null&&!Et&&x===null&&!be,se=zt.length,Ht=l.useMemo(()=>w==="initiative"?Ke.length>0:w==="milestone"?Qe.length>0:C.length>0,[Ke.length,C.length,Qe.length,w]),xt=Q&&ee&&!d&&se>0,He=l.useMemo(()=>{if(!T)return 0;let t=0;for(const i of ue)i.queueState===m.RUNNING&&t++;return t},[T,ue]),Zt=w==="initiative"?"No initiatives in the queue right now.":w==="milestone"?"No milestone slices in the queue right now.":He>0?`All queued work is in progress (${He} running).`:O.length>0&&ve?"Queue signal is delayed right now.":"No queued workstreams right now.",pt=e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",onClick:Gt,className:"control-pill h-8 px-2.5 text-caption font-semibold",children:"Select all"}),e.jsx("button",{type:"button",onClick:Kt,disabled:V.size===0,className:"control-pill h-8 px-2.5 text-caption font-semibold disabled:opacity-45",children:"Clear"}),e.jsx("button",{type:"button",disabled:se===0||F==="bulk:move_top",onClick:()=>void Ve("move_top"),className:"control-pill h-8 px-2.5 text-caption font-semibold disabled:opacity-45",children:"Move top"}),e.jsx("button",{type:"button",disabled:se===0||F==="bulk:move_bottom",onClick:()=>void Ve("move_bottom"),className:"control-pill h-8 px-2.5 text-caption font-semibold disabled:opacity-45",children:"Move bottom"}),e.jsx("button",{type:"button",disabled:se===0||F==="bulk:remove",onClick:()=>void Ve("remove"),className:"control-pill h-8 px-2.5 text-caption font-semibold disabled:opacity-45",children:"Remove"})]});return e.jsxs(Yt,{surface:Ce==="card",className:`flex h-full min-h-0 flex-col overflow-hidden ${q?"":"card-enter"} ${Ce==="flat"?"!rounded-none !border-none !bg-transparent !shadow-none":""} ${S??""}`,children:[f?e.jsxs("div",{className:"flex items-center justify-between gap-2 border-b border-subtle px-4 py-3",children:[e.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[e.jsx("h2",{className:"truncate text-heading font-semibold text-white",children:p}),e.jsx("span",{className:"chip inline-flex min-w-[52px] justify-center text-micro tabular-nums",children:M?e.jsx("span",{"aria-hidden":!0,className:"h-2.5 w-5 rounded bg-white/15 animate-pulse"}):lt}),e.jsx("span",{className:ie("inline-flex min-w-[92px] justify-end text-micro text-muted transition-opacity",st&&!M?"opacity-100":"opacity-0"),"aria-live":"polite",children:"refreshing…"})]}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("div",{className:"inline-flex items-center rounded-xl border border-white/[0.1] bg-white/[0.03] p-1",role:"tablist","aria-label":"Next Up scope",children:At.map(t=>{const i=w===t.value;return e.jsxs(z.button,{type:"button",role:"tab","aria-selected":i,onClick:()=>J(t.value),...b.segmentedTap,className:ie("relative h-7 rounded-lg px-2.5 text-caption font-semibold transition-colors",i?"text-[#E8FFD0]":"text-secondary hover:text-white"),title:`Show ${t.label.toLowerCase()} queue`,children:[i?e.jsx(z.span,{layoutId:"next-up-scope-indicator",transition:G?{duration:.01}:b.railMorphSpring,className:"pointer-events-none absolute inset-0 rounded-lg border border-[#BFFF00]/35 bg-[#BFFF00]/16","aria-hidden":!0}):null,e.jsx("span",{className:"relative z-[1]",children:t.label})]},t.value)})}),K?e.jsx("button",{type:"button",onClick:()=>ae(!d),className:"control-pill h-8 flex-shrink-0 whitespace-nowrap px-3 text-caption font-semibold",title:d?"Switch to expanded cards":"Switch to compact list","aria-label":d?"Expand Next Up queue":"Compact Next Up queue",children:d?"Expand":"Compact"}):null]})]}):null,Wt&&e.jsx("div",{className:"px-3 pt-2",children:e.jsx(ke,{initial:!1,mode:"wait",children:Be==="upgrade"&&j?e.jsx(z.div,{initial:{opacity:0,y:-4,scale:.99},animate:{opacity:1,y:0,scale:1},exit:{opacity:0,y:-4,scale:.99},transition:Ge,className:"rounded-xl border border-amber-200/25 bg-amber-200/10 px-3 py-2 text-caption text-amber-100",children:e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"rounded-full border border-amber-200/25 bg-amber-200/10 px-2 py-0.5 text-micro font-semibold uppercase tracking-[0.08em] text-amber-100/90",children:"Upgrade required"}),e.jsxs("span",{className:"truncate text-micro text-secondary",children:[ft(j.currentPlan)," →"," ",ft(j.requiredPlan)]})]}),e.jsx("div",{className:"mt-1 line-clamp-2 text-caption leading-snug text-amber-50/90",title:j.message,children:j.message}),B?e.jsx("div",{className:"mt-1 text-micro text-rose-50/85",children:B}):null]}),e.jsxs("div",{className:"flex flex-shrink-0 flex-col items-end gap-1",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("button",{type:"button",onClick:()=>void as({actions:j.actions,requiredPlan:j.requiredPlan}).catch(t=>y(pe(t instanceof Error?t.message:"","Checkout failed"))),className:"h-7 rounded-full border border-amber-200/25 bg-amber-200/15 px-3 text-micro font-semibold text-amber-50 transition-colors hover:bg-amber-200/20",children:"Upgrade"}),e.jsx("button",{type:"button",onClick:()=>void os({actions:j.actions}).catch(t=>y(pe(t instanceof Error?t.message:"","Portal failed"))),className:"h-7 rounded-full border border-strong bg-white/[0.04] px-3 text-micro font-semibold text-primary transition-colors hover:bg-white/[0.08]",children:"Billing"}),L&&e.jsx("button",{type:"button",onClick:L,className:"h-7 rounded-full border border-strong bg-white/[0.04] px-2.5 text-micro font-semibold text-primary transition-colors hover:bg-white/[0.08]",children:"Settings"})]}),(ht=j.actions)!=null&&ht.pricing?e.jsx("a",{href:j.actions.pricing,target:"_blank",rel:"noopener noreferrer",className:"text-micro text-secondary underline decoration-white/20 hover:text-primary",children:"View pricing"}):null]})]})},"upgrade"):Be==="error"&&mt?e.jsx(z.div,{initial:{opacity:0,y:-4},animate:{opacity:1,y:0},exit:{opacity:0,y:-4},transition:Ge,className:"rounded-xl border border-red-400/25 bg-red-500/[0.08] px-3 py-2 text-caption text-red-100",children:mt},"error"):Be==="notice"&&B?e.jsx(z.div,{initial:{opacity:0,y:-4},animate:{opacity:1,y:0},exit:{opacity:0,y:-4},transition:Ge,className:"rounded-xl border border-white/[0.1] bg-white/[0.03] px-3 py-2 text-caption text-primary",children:B},"notice"):null})}),e.jsxs("div",{ref:et,className:`flex-1 space-y-2.5 overflow-y-auto overscroll-y-contain scroll-smooth px-3 pb-3 ${f?"pt-1":"pt-2.5"}`,children:[!M&<>0?e.jsxs("div",{className:"flex flex-col gap-2.5 px-0.5 sm:flex-row sm:items-start sm:justify-between",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("p",{className:"truncate text-micro uppercase tracking-[0.08em] text-muted",children:w==="initiative"?"Initiatives":w==="milestone"?"Milestone slices":rt===m.BLOCKED?"Needs attention":rt===m.RUNNING?"Running now":"Queue"}),e.jsxs("div",{className:"mt-1 flex flex-wrap items-center gap-1.5",children:[se>0?e.jsxs("span",{className:"chip text-micro",children:[se," selected"]}):null,e.jsx("span",{className:ie("inline-flex min-w-[92px] text-micro text-muted transition-opacity",st&&!M?"opacity-100":"opacity-0"),"aria-live":"polite",children:"refreshing…"}),Q&&ee&&!d&&se===0?e.jsx("span",{className:"text-micro text-muted",children:"Shift+select to pick ranges."}):null]})]}),e.jsxs("div",{className:"flex min-w-0 flex-wrap items-center gap-1.5 sm:justify-end",children:[K?e.jsx("button",{type:"button",onClick:()=>ae(!d),className:"control-pill h-8 px-2.5 text-caption font-semibold",title:d?"Switch to expanded cards":"Switch to compact list","aria-label":d?"Expand Next Up queue":"Compact Next Up queue",children:d?"Expand":"Compact"}):null,xt?e.jsx("div",{className:"flex flex-wrap justify-end gap-1.5",children:pt}):null,!xt&&Ie&&ee?e.jsxs("div",{ref:Oe,className:"relative",children:[e.jsxs("button",{type:"button",onClick:()=>ge(t=>!t),className:"control-pill h-8 px-2.5 text-caption font-semibold","aria-haspopup":"menu","aria-expanded":be,title:"Queue settings",children:[e.jsxs("svg",{width:"13",height:"13",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:"opacity-85","aria-hidden":!0,children:[e.jsx("path",{d:"M4 6h16"}),e.jsx("path",{d:"M7 12h10"}),e.jsx("path",{d:"M10 18h4"})]}),e.jsx("span",{children:"Queue"})]}),be?e.jsx("div",{className:"surface-tier-2 absolute right-0 top-[calc(100%+8px)] z-[280] w-[320px] max-w-[86vw] rounded-xl p-3 shadow-[0_18px_42px_rgba(0,0,0,0.46)] backdrop-blur-xl",children:e.jsxs("div",{className:"space-y-2.5",children:[Q&&!d?e.jsxs("div",{children:[e.jsx("p",{className:"section-kicker",children:"Bulk actions"}),e.jsx("div",{className:"mt-1.5 flex flex-wrap items-center gap-1.5",children:pt})]}):null,L?e.jsx("button",{type:"button",onClick:()=>{ge(!1),L()},className:"control-pill h-7 px-2.5 text-micro font-semibold",children:"Open settings"}):null]})}):null]}):null]})]}):null,M?e.jsx(ps,{compact:d}):null,!M&&!Ht&&!Ee&&e.jsx(Ot,{icon:"queue",headline:Zt,description:He>0?"Check the In Progress tab to see active work.":ve??"Create an initiative or add workstreams to populate the queue.",primaryAction:O.length>0&&ve?{label:"Retry now",onClick:()=>{Me(!1),Ft()}}:void 0}),!M&&w==="initiative"?e.jsx(ke,{initial:!1,children:Ke.map((t,i)=>{const r=t.items.find(v=>v.queueState!==m.RUNNING&&v.queueState!=="completed")??t.items[0]??null,n=Se(t.initiativeTitle,t.initiativeId,"Initiative"),u=wt(t.queueState),h=yt(t.queueState),E=t.items.reduce((v,g)=>v+(g.sliceTaskCount??0),0);return e.jsxs(z.article,{layout:!0,initial:{opacity:0,y:8,scale:.99},animate:{opacity:1,y:0,scale:1},exit:{opacity:0,y:-4,scale:.99},transition:{duration:G?.01:b.surfaceSwitch.duration,delay:G?0:Math.min(i,b.listStaggerMaxItems)*b.listStaggerStep,ease:b.surfaceSwitch.ease},className:"rounded-2xl border border-white/[0.08] bg-white/[0.02] px-3 py-3",children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("p",{className:"text-micro uppercase tracking-[0.08em] text-muted",children:"Initiative"}),e.jsx("p",{className:"mt-0.5 truncate text-body font-semibold text-white",title:n,children:n})]}),e.jsx("span",{className:ie("inline-flex items-center rounded-full border px-2 py-0.5 text-[10px] font-semibold uppercase tracking-[0.08em]",h),children:u})]}),e.jsxs("p",{className:"mt-1 text-micro text-secondary",children:[t.workstreamCount," workstreams · ",E," tasks"]}),e.jsx("div",{className:"mt-2 space-y-1",children:t.items.slice(0,3).map((v,g)=>e.jsxs("div",{className:"flex items-center justify-between gap-2 rounded-lg border border-white/[0.06] bg-black/[0.18] px-2.5 py-1.5 text-caption",children:[e.jsx("span",{className:"truncate text-white/84",children:I(v.workstreamTitle)}),e.jsxs("span",{className:"text-micro text-secondary",children:[v.sliceTaskCount??0," tasks"]})]},`${v.workstreamId}:${g}`))}),e.jsxs("div",{className:"mt-2.5 flex items-center gap-1.5",children:[e.jsx("button",{type:"button",onClick:()=>$==null?void 0:$(t.initiativeId,t.initiativeTitle),className:"control-pill h-7 px-2.5 text-micro font-semibold",children:"Open"}),e.jsx("button",{type:"button",disabled:!r||F===`initiative:${t.initiativeId}`,onClick:()=>{r&&te(`initiative:${t.initiativeId}`,()=>Le(r),`Dispatched ${I(r.workstreamTitle)}.`)},className:"control-pill h-7 px-2.5 text-micro font-semibold disabled:opacity-45",children:"Dispatch"})]})]},`initiative-group:${t.initiativeId}`)})}):null,!M&&w==="milestone"?e.jsx(ke,{initial:!1,children:Qe.map((t,i)=>{const r=t.item,n=`milestone:${t.workstreamId}:${t.milestoneId??"none"}`;return e.jsxs(z.article,{layout:!0,initial:{opacity:0,y:8,scale:.99},animate:{opacity:1,y:0,scale:1},exit:{opacity:0,y:-4,scale:.99},transition:{duration:G?.01:b.surfaceSwitch.duration,delay:G?0:Math.min(i,b.listStaggerMaxItems)*b.listStaggerStep,ease:b.surfaceSwitch.ease},className:"rounded-2xl border border-white/[0.08] bg-white/[0.02] px-3 py-3",children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsxs("p",{className:"text-micro uppercase tracking-[0.08em] text-muted",children:[I(t.initiativeTitle)," · ",I(t.workstreamTitle)]}),e.jsx("p",{className:"mt-0.5 truncate text-body font-semibold text-white",title:t.milestoneTitle,children:I(t.milestoneTitle)})]}),e.jsx("span",{className:ie("inline-flex items-center rounded-full border px-2 py-0.5 text-[10px] font-semibold uppercase tracking-[0.08em]",yt(t.queueState)),children:wt(t.queueState)})]}),e.jsxs("p",{className:"mt-1 text-micro text-secondary",children:[t.taskCount," tasks in slice"]}),e.jsxs("div",{className:"mt-2.5 flex items-center gap-1.5",children:[e.jsx("button",{type:"button",onClick:()=>$==null?void 0:$(t.initiativeId,t.initiativeTitle),className:"control-pill h-7 px-2.5 text-micro font-semibold",children:"Open"}),e.jsx("button",{type:"button",disabled:F===n||t.queueState===m.RUNNING,onClick:()=>void te(n,()=>Le(r),u=>Xe(r,u)),className:"control-pill h-7 px-2.5 text-micro font-semibold disabled:opacity-45",children:t.queueState===m.RUNNING?"Running":"Start"})]})]},`${t.initiativeId}:${t.workstreamId}:${t.milestoneId??"none"}`)})}):null,!M&&ee&&d?e.jsx(ke,{initial:!1,children:C.map((t,i)=>{const r=P(t),n=F===r,u=t.queueState===m.RUNNING,h=t.nextTaskDueAt?Nt(t.nextTaskDueAt):null,E=Se(t.initiativeTitle,t.initiativeId,"Initiative"),v=Se(t.workstreamTitle,t.workstreamId,"Workstream"),g=qt(t),Z=t.nextTaskTitle?I(t.nextTaskTitle):null,Fe=t.blockReason?I(t.blockReason):null,Pe=$t(t),Ne=Tt(t);return e.jsxs(z.article,{layout:!0,initial:{opacity:0,y:6,scale:.99},animate:{opacity:1,y:0,scale:1},exit:{opacity:0,y:-4,scale:.99},transition:{duration:G?.01:b.surfaceSwitch.duration,delay:G?0:Math.min(i,b.listStaggerMaxItems)*b.listStaggerStep,ease:b.surfaceSwitch.ease},className:"group relative overflow-visible rounded-2xl border border-white/[0.08] bg-white/[0.02] px-2.5 py-2 cursor-pointer transition-colors hover:border-white/[0.14]",onClick:()=>_==null?void 0:_(t),role:"button",tabIndex:0,onKeyDown:N=>{(N.key==="Enter"||N.key===" ")&&(N.preventDefault(),_==null||_(t))},children:[e.jsx("div",{className:`pointer-events-none absolute inset-x-2.5 top-0 h-px bg-gradient-to-r ${St(t.queueState)}`,"aria-hidden":!0}),e.jsxs("div",{className:"flex min-w-0 items-center gap-2.5",children:[e.jsx(kt,{name:Pe,hint:Mt(t,Pe),size:"xs"}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex min-w-0 items-center gap-1.5",children:[e.jsx(je,{type:"initiative",size:11,className:"flex-shrink-0 opacity-85"}),e.jsx("button",{type:"button",onClick:()=>$==null?void 0:$(t.initiativeId,t.initiativeTitle),className:"block min-w-0 flex-1 truncate text-left text-micro uppercase tracking-[0.08em] text-muted transition-colors hover:text-white/72",title:E,children:E}),g?e.jsx("span",{className:ie("inline-flex flex-shrink-0 items-center rounded-full border px-2 py-0.5 text-[9px] font-semibold uppercase tracking-[0.08em]",g.toneClass),title:g.longLabel,children:g.shortLabel}):null]}),e.jsxs("p",{className:"mt-0.5 flex min-w-0 items-center gap-1.5 text-caption font-semibold leading-snug text-white",title:v,children:[e.jsx(je,{type:"workstream",size:12,className:"flex-shrink-0 opacity-95"}),e.jsx("span",{className:"line-clamp-2",children:v})]}),Z?e.jsxs("p",{className:"mt-0.5 line-clamp-2 text-micro leading-snug text-secondary",title:`${Ze(t.queueState)}: ${Z}${h?` · ${h}`:""}`,children:[Ze(t.queueState),": ",Z,h?` · ${h}`:""]}):e.jsx("p",{className:"mt-0.5 line-clamp-2 text-micro leading-snug text-secondary",title:Je(t),children:Je(t)}),Ne?e.jsxs("p",{className:"mt-0.5 text-micro text-muted",children:["Runner ",Ne]}):null,e.jsxs("div",{className:"mt-1 flex flex-wrap items-center gap-1.5",children:[(()=>{const N=t.objectiveScore??t.compositeScore??null;if(N==null)return null;const xe=N>=80?"S":N>=60?"A":"B",ne=xe==="S"?"border-[#BFFF00]/30 bg-[#BFFF00]/[0.12] text-[#d8ffa1]":xe==="A"?"border-[#14B8A6]/30 bg-[#14B8A6]/[0.12] text-[#87FFE9]":"border-white/[0.12] bg-white/[0.05] text-white/60";return e.jsxs("span",{className:`chip text-[9px] font-semibold ${ne}`,children:[xe,"-tier"]})})(),(()=>{const N=t.expectedValueUsd,xe=t.sliceTaskCount??0,ne=[];return xe>0&&ne.push(`${xe} tasks`),typeof N=="number"&&N>0&&ne.push(`$${N.toFixed(2)}`),h&&ne.push(h),ne.length===0?null:e.jsx("span",{className:"text-micro text-muted",children:ne.join(" · ")})})()]})]})]}),(t.sliceTaskCount??0)>0&&e.jsx("div",{className:"pointer-events-none absolute inset-x-0 bottom-0 h-[2px] rounded-b-2xl overflow-hidden",children:e.jsx("div",{className:"h-full rounded-full",style:{width:`${Math.max(t.queueState===m.COMPLETED?100:t.queueState===m.RUNNING?50:15,4)}%`,background:`linear-gradient(90deg, ${bt.lime}, ${bt.teal})`,opacity:.6}})}),Fe&&e.jsxs("div",{className:"mt-1.5 rounded-lg border border-red-400/24 bg-red-500/[0.08] px-2.5 py-1 text-micro text-red-100/85",children:["Blocked: ",Fe]}),e.jsxs("div",{className:"mt-1.5 flex items-center gap-1.5",onClick:N=>N.stopPropagation(),children:[e.jsx("button",{type:"button",disabled:n||u,onClick:()=>void te(r,()=>Le(t),N=>Xe(t,N)),className:"control-pill flex h-7 items-center justify-center px-2.5 text-micro font-semibold disabled:opacity-40",title:u?"Already running":"Start now",children:e.jsxs("span",{className:"inline-flex items-center gap-1",children:[e.jsx(It,{className:"h-3 w-3 opacity-85"}),e.jsx("span",{children:u?"Running":"Start"})]})}),e.jsxs("div",{className:"relative ml-auto",children:[e.jsx("button",{type:"button",disabled:n,onClick:()=>Y(N=>N===r?null:r),className:"control-pill flex h-7 items-center justify-center px-2.5 text-micro font-semibold disabled:opacity-40",title:"Queue actions",children:e.jsxs("span",{className:"inline-flex items-center gap-1",children:[e.jsx(Rt,{className:"h-3 w-3 opacity-85"}),e.jsx("span",{children:"More"})]})}),x===r&&e.jsxs("div",{className:"absolute right-0 top-[calc(100%+6px)] z-[320] min-w-[178px] rounded-xl border border-white/[0.1] bg-[#080d14]/95 p-1.5 shadow-[0_16px_36px_rgba(0,0,0,0.42)] backdrop-blur",children:[e.jsx("button",{type:"button",onClick:()=>{Y(null),te(`${r}:top`,()=>H.move({initiativeId:t.initiativeId,workstreamId:t.workstreamId,placement:"top"}),`Moved ${v} to top of queue.`)},className:"flex h-8 w-full items-center rounded-md px-2.5 text-left text-caption text-primary transition-colors hover:bg-white/[0.08]",children:"Move to top"}),e.jsx("button",{type:"button",onClick:()=>{Y(null),te(`${r}:bottom`,()=>H.move({initiativeId:t.initiativeId,workstreamId:t.workstreamId,placement:"bottom"}),`Moved ${v} to bottom of queue.`)},className:"flex h-8 w-full items-center rounded-md px-2.5 text-left text-caption text-primary transition-colors hover:bg-white/[0.08]",children:"Move to bottom"}),e.jsx("button",{type:"button",onClick:()=>{Y(null),te(`${r}:auto`,()=>it({initiativeId:t.initiativeId,workstreamId:t.workstreamId,agentId:t.runnerAgentId,scope:"initiative"}),`Auto enabled for ${E}.`)},className:"flex h-8 w-full items-center rounded-md px-2.5 text-left text-caption text-primary transition-colors hover:bg-white/[0.08]",children:"Auto on"}),e.jsx("button",{type:"button",disabled:H.isRemoving,onClick:()=>{Y(null),ut(t)},className:"mt-1 flex h-8 w-full items-center rounded-md px-2.5 text-left text-caption text-red-100 transition-colors hover:bg-red-500/[0.12] disabled:opacity-45",children:"Remove from queue"})]})]})]})]},r)})}):!M&&ee?e.jsx(ss,{axis:"y",values:me,onReorder:t=>{We.current=t,ct(t)},className:"space-y-2.5",children:me.map(t=>dt.get(t)).filter(Boolean).map((t,i)=>e.jsx(fs,{item:t,index:i,actionKey:F,setNotice:y,setUpgradeGate:le,onUpgradeGate:D,onOpenInitiative:$,onOpenSliceDetail:_,selected:V.has(P(t)),selectionEnabled:Q,onToggleSelection:_t,menuKey:x,setMenuKey:Y,onPlayWorkstream:Le,startWorkstreamAutoContinue:it,triagePlacement:oe,onPauseWorkstream:(r,n)=>H.stopTriage({initiativeId:r.initiativeId,workstreamId:r.workstreamId,placement:n,resetToTodo:!1}),onMoveWorkstream:(r,n)=>H.move({initiativeId:r.initiativeId,workstreamId:r.workstreamId,placement:n}),onCommitReorder:()=>void Qt().catch(()=>null),onDismiss:ut,runAction:te},P(t)))}):null,(ze||Re)&&e.jsx("div",{ref:tt,className:"flex h-10 items-center justify-center",children:e.jsx("span",{className:"text-micro text-muted",children:Re?"Loading more queue items…":"Scroll for more"})})]}),e.jsx("div",{className:"pointer-events-none absolute bottom-3 right-3 z-[250]",children:e.jsx(cs,{open:Vt,tone:"warning",title:"Limited signal",message:ve,autoDismissMs:6e3,onDismiss:()=>Me(!0)})})]})}function fs({item:s,index:a,actionKey:c,setNotice:o,setUpgradeGate:p,onUpgradeGate:f,onOpenInitiative:k,onOpenSliceDetail:S,selected:q,selectionEnabled:K,onToggleSelection:he,menuKey:$,setMenuKey:L,onPlayWorkstream:D,startWorkstreamAutoContinue:_,triagePlacement:Q,onPauseWorkstream:Ce,onMoveWorkstream:Ie,onCommitReorder:qe,onDismiss:Ae,runAction:W}){const $e=ns(),T=jt(),[re,fe]=l.useState(!1),d=`${s.initiativeId}:${s.workstreamId}`,ae=c===d,B=s.queueState===m.RUNNING,y=s.nextTaskDueAt?Nt(s.nextTaskDueAt):null,w=Se(s.initiativeTitle,s.initiativeId,"Initiative"),J=Se(s.workstreamTitle,s.workstreamId,"Workstream"),oe=qt(s),j=s.nextTaskTitle?I(s.nextTaskTitle):null,le=s.blockReason?I(s.blockReason):null,F=$t(s),X=Tt(s);return e.jsx(is,{value:d,id:d,dragListener:!1,dragControls:$e,onDragStart:()=>fe(!0),onDragEnd:()=>{fe(!1),qe()},whileDrag:{scale:1.02,boxShadow:"0 20px 48px rgba(0,0,0,0.5), 0 0 0 1px rgba(191,255,0,0.15)",zIndex:50,cursor:"grabbing"},className:"relative",children:e.jsxs(z.article,{layout:!0,initial:{opacity:0,y:12,scale:.97},animate:{opacity:1,y:0,scale:1},exit:{opacity:0,y:-8,scale:.98},transition:{duration:T?.01:b.surfaceSwitch.duration,ease:b.surfaceSwitch.ease,delay:T?0:Math.min(a,b.listStaggerMaxItems)*b.listStaggerStep,opacity:{duration:T?.01:b.surfaceSwitch.duration,ease:b.surfaceSwitch.ease}},className:"group relative overflow-visible rounded-2xl border border-white/[0.08] bg-white/[0.02] px-3 py-3 cursor-pointer transition-colors hover:border-white/[0.14]",onClick:()=>S==null?void 0:S(s),role:"button",tabIndex:0,onKeyDown:x=>{(x.key==="Enter"||x.key===" ")&&(x.preventDefault(),S==null||S(s))},children:[e.jsx("div",{className:`pointer-events-none absolute inset-x-3 top-0 h-px bg-gradient-to-r ${St(s.queueState)}`,"aria-hidden":!0}),e.jsx("div",{className:"flex items-start justify-between gap-2.5",children:e.jsxs("div",{className:"min-w-0 flex flex-1 items-start gap-2.5",children:[e.jsxs("div",{className:"relative h-8 w-8 flex-shrink-0",children:[e.jsx("div",{className:`absolute inset-0 transition-[opacity,transform] duration-200 ease-out ${K?q?"opacity-0 scale-90":"opacity-100 scale-100 group-hover:opacity-0 group-hover:scale-90 group-focus-within:opacity-0 group-focus-within:scale-90":"opacity-100 scale-100"}`,children:e.jsx(kt,{name:F,hint:Mt(s,F),size:"sm"})}),K?e.jsx("button",{type:"button",role:"checkbox","aria-checked":q,"aria-label":"Select queue row",title:q?"Selected (Shift+click for range)":"Select (Shift+click for range)",onClick:x=>{x.stopPropagation(),he(d,!q,x.shiftKey)},onMouseDown:x=>x.stopPropagation(),onKeyDown:x=>x.stopPropagation(),className:`absolute inset-0 flex items-center justify-center rounded-full border transition-[opacity,transform,background-color,border-color,color] duration-200 ease-out ${q?"opacity-100 scale-100 border-[#BFFF00]/40 bg-[#BFFF00]/18 text-[#E1FFB2]":"opacity-0 scale-90 border-white/[0.24] bg-black/55 text-white/78 group-hover:opacity-100 group-hover:scale-100 group-focus-within:opacity-100 group-focus-within:scale-100 hover:bg-black/62"}`,children:e.jsx("span",{className:"inline-flex h-4 w-4 items-center justify-center rounded-full border border-current/45 bg-black/30",children:q?e.jsx("svg",{viewBox:"0 0 16 16",className:"h-2.5 w-2.5",fill:"none","aria-hidden":!0,children:e.jsx("path",{d:"M3.2 8.3 6.2 11l6.6-6.1",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})}):null})}):null]}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex min-w-0 items-center gap-1.5",children:[e.jsx(je,{type:"initiative",size:11,className:"flex-shrink-0 opacity-85"}),e.jsx("button",{type:"button",onClick:()=>k==null?void 0:k(s.initiativeId,s.initiativeTitle),className:"block min-w-0 flex-1 truncate text-left text-micro uppercase tracking-[0.08em] text-muted transition-colors hover:text-white/72",title:w,children:w}),oe?e.jsx("span",{className:ie("inline-flex flex-shrink-0 items-center rounded-full border px-2 py-0.5 text-[9px] font-semibold uppercase tracking-[0.08em]",oe.toneClass),title:oe.longLabel,children:oe.shortLabel}):null]}),e.jsxs("div",{className:"mt-0.5 flex min-w-0 items-start gap-1.5",children:[e.jsx(je,{type:"workstream",size:12,className:"mt-[3px] flex-shrink-0 opacity-95"}),e.jsx("p",{className:"min-w-0 line-clamp-2 text-body font-semibold leading-snug text-white",title:J,children:J})]}),e.jsxs("div",{className:"mt-1.5 flex items-center gap-2 text-micro text-secondary",children:[e.jsx("span",{className:"rounded-full border border-strong bg-white/[0.03] px-2 py-0.5 text-micro uppercase tracking-[0.08em] text-secondary",children:"Runner"}),e.jsxs("span",{className:"truncate text-white/68",children:[F,X?` · ${X}`:""]})]})]})]})}),e.jsx("div",{className:"mt-2 rounded-lg border border-white/[0.07] bg-black/[0.18] px-2.5 py-2 text-caption text-white/68",children:j?e.jsxs("div",{className:"space-y-1",children:[e.jsxs("div",{className:"flex min-w-0 items-center gap-1 text-micro uppercase tracking-[0.08em] text-white/44",children:[e.jsx(je,{type:"task",size:10,className:"flex-shrink-0 opacity-80"}),e.jsx("span",{children:Ze(s.queueState)}),y?e.jsxs("span",{className:"truncate text-micro normal-case tracking-normal text-muted",children:["· ",y]}):null]}),e.jsx("p",{className:"line-clamp-2 break-words text-caption leading-snug text-white/84",title:j,children:j})]}):e.jsx("span",{className:"text-secondary",children:Je(s)})}),le&&e.jsxs("div",{className:"mt-1.5 rounded-lg border border-red-400/24 bg-red-500/[0.08] px-2.5 py-1 text-micro text-red-100/85",children:["Blocked: ",le]}),e.jsxs("div",{className:"mt-2 flex items-center gap-1.5",onClick:x=>x.stopPropagation(),children:[e.jsx("button",{type:"button",disabled:ae||B,onClick:()=>void W(d,()=>D(s),x=>Xe(s,x)),className:"control-pill flex h-7 items-center justify-center px-2.5 text-micro font-semibold disabled:opacity-40",title:B?"Already running":"Start this workstream now",children:e.jsxs("span",{className:"inline-flex items-center gap-1",children:[e.jsx(It,{className:"h-3 w-3 opacity-85"}),e.jsx("span",{children:B?"Running":"Start"})]})}),e.jsxs("button",{type:"button",onPointerDown:x=>$e.start(x),"aria-label":"Drag to reorder",title:re?"Reordering":"Drag to reorder",className:`control-pill flex h-7 items-center justify-center gap-1 px-2 text-micro font-semibold transition-colors ${re?"border-[#BFFF00]/35 bg-[#BFFF00]/14 text-[#E1FFB2] cursor-grabbing":"cursor-grab hover:bg-white/[0.08] hover:text-bright"}`,children:[re?e.jsx(us,{className:"h-3.5 w-3.5 opacity-90"}):e.jsx(ds,{className:"h-3.5 w-3.5 opacity-90"}),e.jsx("span",{children:re?"Reordering":"Drag"})]}),e.jsxs("div",{className:"relative ml-auto",children:[e.jsx("button",{type:"button",disabled:ae,onClick:()=>L(x=>x===d?null:d),className:"control-pill flex h-7 items-center justify-center px-2.5 text-micro font-semibold disabled:opacity-40",title:"Queue actions",children:e.jsxs("span",{className:"inline-flex items-center gap-1",children:[e.jsx(Rt,{className:"h-3 w-3 opacity-85"}),e.jsx("span",{children:"More"})]})}),$===d&&e.jsxs("div",{className:"absolute right-0 top-[calc(100%+6px)] z-[320] min-w-[198px] rounded-xl border border-white/[0.1] bg-[#080d14]/95 p-1.5 shadow-[0_16px_36px_rgba(0,0,0,0.42)] backdrop-blur",children:[e.jsx("button",{type:"button",onClick:()=>{L(null),W(`${d}:top`,()=>Ie(s,"top"),`Moved ${J} to top of queue.`)},className:"flex h-8 w-full items-center rounded-md px-2.5 text-left text-caption text-primary transition-colors hover:bg-white/[0.08]",children:"Move to top"}),e.jsx("button",{type:"button",onClick:()=>{L(null),W(`${d}:bottom`,()=>Ie(s,"bottom"),`Moved ${J} to bottom of queue.`)},className:"flex h-8 w-full items-center rounded-md px-2.5 text-left text-caption text-primary transition-colors hover:bg-white/[0.08]",children:"Move to bottom"}),e.jsx("button",{type:"button",onClick:()=>{L(null),W(`${d}:auto`,()=>_({initiativeId:s.initiativeId,workstreamId:s.workstreamId,agentId:s.runnerAgentId,scope:"initiative"}),`Auto enabled for ${w}.`)},className:"flex h-8 w-full items-center rounded-md px-2.5 text-left text-caption text-primary transition-colors hover:bg-white/[0.08]",children:"Auto on"}),B?e.jsx("button",{type:"button",onClick:()=>{L(null),W(`${d}:pause`,()=>Ce(s,Q),`Paused ${J}.`)},className:"mt-1 flex h-8 w-full items-center rounded-md px-2.5 text-left text-caption text-primary transition-colors hover:bg-white/[0.08]",children:"Pause run"}):null,e.jsx("button",{type:"button",disabled:ae||B,onClick:()=>{L(null),Ae(s)},className:"mt-1 flex h-8 w-full items-center rounded-md px-2.5 text-left text-caption text-red-100 transition-colors hover:bg-red-500/[0.12] disabled:opacity-45",children:"Remove from queue"})]})]})]})]})})}const Ns=Object.freeze(Object.defineProperty({__proto__:null,NextUpPanel:hs},Symbol.toStringTag,{value:"Module"}));export{cs as I,hs as N,Ns as a,as as o};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as a,j as e}from"./Dj2k1r16.js";import{e as l,y as p,E as h,$ as u}from"./D2Kqcmv9.js";import{DecisionQueue as b}from"./CReugbyT.js";import"./DMKyYAtD.js";import"./eeHXe_OQ.js";import"./cX2e-TLi.js";import"./BjK42gtU.js";import"./BV0BcV1u.js";import"./PVi0vr9a.js";import"./467jKHFJ.js";function D({open:n,onClose:o,decisions:t,onApproveDecision:i,onRejectDecision:m,onApproveAll:d,onBulkDecisionAction:x}){const r=a.useMemo(()=>t.length>0?Math.max(0,...t.map(c=>c.waitingMinutes)):0,[t]),s=a.useMemo(()=>t.length>=20||r>=15?l.red:t.length>0?l.amber:l.textMuted,[t.length,r]);return e.jsx(p,{open:n,onClose:o,maxWidth:"max-w-3xl",children:e.jsxs("div",{className:"flex h-full w-full flex-col",children:[e.jsx("div",{className:"border-b border-subtle px-5 pt-5 pb-4",children:e.jsxs("div",{className:"flex items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsxs("h3",{className:"inline-flex items-center gap-2 text-heading font-semibold text-white",children:[e.jsx(h,{type:"decision",size:14}),e.jsx("span",{className:"truncate",children:"Decisions"}),e.jsx("span",{className:"rounded-full border px-2 py-0.5 text-caption font-semibold",style:{borderColor:`${s}30`,backgroundColor:`${s}14`,color:s},children:t.length})]}),e.jsx("p",{className:"mt-1 text-body leading-relaxed text-secondary",children:"Bulk review and resolve pending decisions."}),t.length>0&&e.jsxs("p",{className:"mt-2 text-caption text-secondary",children:["Oldest: ",e.jsxs("span",{className:"font-semibold text-white",children:[u(r)," ago"]})]})]}),e.jsx("button",{type:"button",onClick:o,className:"rounded-md border border-strong bg-white/[0.03] px-2.5 py-1.5 text-caption text-primary transition-colors hover:bg-white/[0.08]","aria-label":"Close decisions modal",children:"Close"})]})}),e.jsx("div",{className:"min-h-0 flex-1 overflow-hidden p-4",children:e.jsx(b,{decisions:t,onApproveDecision:i,onRejectDecision:m,onApproveAll:d,onBulkDecisionAction:x})})]})})}export{D as BulkDecisionsModal};
|
|
Binary file
|
|
Binary file
|