@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.
Files changed (111) hide show
  1. package/dashboard/dist/assets/{sdoPH_Z1.js → B014hrCe.js} +1 -1
  2. package/dashboard/dist/assets/B014hrCe.js.br +0 -0
  3. package/dashboard/dist/assets/B014hrCe.js.gz +0 -0
  4. package/dashboard/dist/assets/{PVi0vr9a.js → BGY6oI8h.js} +1 -1
  5. package/dashboard/dist/assets/BGY6oI8h.js.br +0 -0
  6. package/dashboard/dist/assets/BGY6oI8h.js.gz +0 -0
  7. package/dashboard/dist/assets/BJI1Iy5v.css +1 -0
  8. package/dashboard/dist/assets/BJI1Iy5v.css.br +0 -0
  9. package/dashboard/dist/assets/BJI1Iy5v.css.gz +0 -0
  10. package/dashboard/dist/assets/BUvcp_7V.js +1 -0
  11. package/dashboard/dist/assets/BUvcp_7V.js.br +0 -0
  12. package/dashboard/dist/assets/BUvcp_7V.js.gz +0 -0
  13. package/dashboard/dist/assets/BV2Tf8S2.js +212 -0
  14. package/dashboard/dist/assets/BV2Tf8S2.js.br +0 -0
  15. package/dashboard/dist/assets/BV2Tf8S2.js.gz +0 -0
  16. package/dashboard/dist/assets/{B71dt9yu.js → BYb6DARX.js} +1 -1
  17. package/dashboard/dist/assets/BYb6DARX.js.br +0 -0
  18. package/dashboard/dist/assets/BYb6DARX.js.gz +0 -0
  19. package/dashboard/dist/assets/{DS79hzMu.js → BoDhb8_y.js} +1 -1
  20. package/dashboard/dist/assets/BoDhb8_y.js.br +0 -0
  21. package/dashboard/dist/assets/BoDhb8_y.js.gz +0 -0
  22. package/dashboard/dist/assets/Bqk_l0k6.js +1 -0
  23. package/dashboard/dist/assets/Bqk_l0k6.js.br +0 -0
  24. package/dashboard/dist/assets/Bqk_l0k6.js.gz +0 -0
  25. package/dashboard/dist/assets/{C3_j_W9V.js → CV0sWMbv.js} +1 -1
  26. package/dashboard/dist/assets/CV0sWMbv.js.br +0 -0
  27. package/dashboard/dist/assets/CV0sWMbv.js.gz +0 -0
  28. package/dashboard/dist/assets/CaAkScfa.js +1 -0
  29. package/dashboard/dist/assets/CaAkScfa.js.br +0 -0
  30. package/dashboard/dist/assets/CaAkScfa.js.gz +0 -0
  31. package/dashboard/dist/assets/{CfMS9yIf.js → Ck5KlsPN.js} +1 -1
  32. package/dashboard/dist/assets/Ck5KlsPN.js.br +0 -0
  33. package/dashboard/dist/assets/Ck5KlsPN.js.gz +0 -0
  34. package/dashboard/dist/assets/{CReugbyT.js → D2G51wQm.js} +1 -1
  35. package/dashboard/dist/assets/D2G51wQm.js.br +0 -0
  36. package/dashboard/dist/assets/D2G51wQm.js.gz +0 -0
  37. package/dashboard/dist/assets/{467jKHFJ.js → DAr4MfFk.js} +1 -1
  38. package/dashboard/dist/assets/DAr4MfFk.js.br +0 -0
  39. package/dashboard/dist/assets/DAr4MfFk.js.gz +0 -0
  40. package/dashboard/dist/assets/{BcJmNILk.js → DXVs61e1.js} +1 -1
  41. package/dashboard/dist/assets/DXVs61e1.js.br +0 -0
  42. package/dashboard/dist/assets/DXVs61e1.js.gz +0 -0
  43. package/dashboard/dist/assets/{5Ihga-4X.js → DibzNd0I.js} +1 -1
  44. package/dashboard/dist/assets/DibzNd0I.js.br +0 -0
  45. package/dashboard/dist/assets/DibzNd0I.js.gz +0 -0
  46. package/dashboard/dist/assets/{qDJ6rqcs.js → Dm0CfDGr.js} +1 -1
  47. package/dashboard/dist/assets/Dm0CfDGr.js.br +0 -0
  48. package/dashboard/dist/assets/Dm0CfDGr.js.gz +0 -0
  49. package/dashboard/dist/assets/_zpQCpjm.js +1 -0
  50. package/dashboard/dist/assets/_zpQCpjm.js.br +0 -0
  51. package/dashboard/dist/assets/_zpQCpjm.js.gz +0 -0
  52. package/dashboard/dist/assets/{C-XuWXGi.js → uNGpYMSH.js} +1 -1
  53. package/dashboard/dist/assets/uNGpYMSH.js.br +0 -0
  54. package/dashboard/dist/assets/uNGpYMSH.js.gz +0 -0
  55. package/dashboard/dist/assets/{a6qcPiWt.js → wa4jJQK9.js} +1 -1
  56. package/dashboard/dist/assets/wa4jJQK9.js.br +0 -0
  57. package/dashboard/dist/assets/wa4jJQK9.js.gz +0 -0
  58. package/dashboard/dist/index.html +2 -2
  59. package/dashboard/dist/index.html.br +0 -0
  60. package/dashboard/dist/index.html.gz +0 -0
  61. package/dist/http/helpers/auto-continue-engine.d.ts +39 -0
  62. package/dist/http/helpers/auto-continue-engine.js +96 -0
  63. package/dist/http/index.js +2 -1
  64. package/dist/http/routes/mission-control-read.d.ts +14 -0
  65. package/dist/http/routes/mission-control-read.js +69 -5
  66. package/dist/outbox.js +9 -2
  67. package/package.json +2 -1
  68. package/dashboard/dist/assets/467jKHFJ.js.br +0 -0
  69. package/dashboard/dist/assets/467jKHFJ.js.gz +0 -0
  70. package/dashboard/dist/assets/5Ihga-4X.js.br +0 -0
  71. package/dashboard/dist/assets/5Ihga-4X.js.gz +0 -0
  72. package/dashboard/dist/assets/B71dt9yu.js.br +0 -0
  73. package/dashboard/dist/assets/B71dt9yu.js.gz +0 -0
  74. package/dashboard/dist/assets/BEnI6kNR.js +0 -1
  75. package/dashboard/dist/assets/BEnI6kNR.js.br +0 -0
  76. package/dashboard/dist/assets/BEnI6kNR.js.gz +0 -0
  77. package/dashboard/dist/assets/BcJmNILk.js.br +0 -0
  78. package/dashboard/dist/assets/BcJmNILk.js.gz +0 -0
  79. package/dashboard/dist/assets/C-XuWXGi.js.br +0 -0
  80. package/dashboard/dist/assets/C-XuWXGi.js.gz +0 -0
  81. package/dashboard/dist/assets/C3_j_W9V.js.br +0 -0
  82. package/dashboard/dist/assets/C3_j_W9V.js.gz +0 -0
  83. package/dashboard/dist/assets/C9-UYhBb.js +0 -1
  84. package/dashboard/dist/assets/C9-UYhBb.js.br +0 -0
  85. package/dashboard/dist/assets/C9-UYhBb.js.gz +0 -0
  86. package/dashboard/dist/assets/C9yV06GS.js +0 -1
  87. package/dashboard/dist/assets/C9yV06GS.js.br +0 -0
  88. package/dashboard/dist/assets/C9yV06GS.js.gz +0 -0
  89. package/dashboard/dist/assets/CReugbyT.js.br +0 -0
  90. package/dashboard/dist/assets/CReugbyT.js.gz +0 -0
  91. package/dashboard/dist/assets/CSDhTbKy.js +0 -1
  92. package/dashboard/dist/assets/CSDhTbKy.js.br +0 -0
  93. package/dashboard/dist/assets/CSDhTbKy.js.gz +0 -0
  94. package/dashboard/dist/assets/CfMS9yIf.js.br +0 -0
  95. package/dashboard/dist/assets/CfMS9yIf.js.gz +0 -0
  96. package/dashboard/dist/assets/D2Kqcmv9.js +0 -212
  97. package/dashboard/dist/assets/D2Kqcmv9.js.br +0 -0
  98. package/dashboard/dist/assets/D2Kqcmv9.js.gz +0 -0
  99. package/dashboard/dist/assets/DS79hzMu.js.br +0 -0
  100. package/dashboard/dist/assets/DS79hzMu.js.gz +0 -0
  101. package/dashboard/dist/assets/PVi0vr9a.js.br +0 -0
  102. package/dashboard/dist/assets/PVi0vr9a.js.gz +0 -0
  103. package/dashboard/dist/assets/RZkbqlJk.css +0 -1
  104. package/dashboard/dist/assets/RZkbqlJk.css.br +0 -0
  105. package/dashboard/dist/assets/RZkbqlJk.css.gz +0 -0
  106. package/dashboard/dist/assets/a6qcPiWt.js.br +0 -0
  107. package/dashboard/dist/assets/a6qcPiWt.js.gz +0 -0
  108. package/dashboard/dist/assets/qDJ6rqcs.js.br +0 -0
  109. package/dashboard/dist/assets/qDJ6rqcs.js.gz +0 -0
  110. package/dashboard/dist/assets/sdoPH_Z1.js.br +0 -0
  111. 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/D2Kqcmv9.js"></script>
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/RZkbqlJk.css">
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)
@@ -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
- const run = deps.autoContinueRuns.get(id) ?? null;
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(sessionId, {
125
+ await appendOutboxDeadLetterRecord(normalizedSessionId, {
119
126
  droppedAt,
120
- queueId: normalizeSessionId(sessionId),
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.18",
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",
@@ -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&&lt>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};
@@ -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};