@useorgx/openclaw-plugin 0.7.23 → 0.7.24

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 (123) hide show
  1. package/dashboard/dist/assets/{m2smti3F.js → B6VftyY6.js} +1 -1
  2. package/dashboard/dist/assets/B6VftyY6.js.br +0 -0
  3. package/dashboard/dist/assets/B6VftyY6.js.gz +0 -0
  4. package/dashboard/dist/assets/{D-FuHfT8.js → BANQdlC4.js} +1 -1
  5. package/dashboard/dist/assets/BANQdlC4.js.br +0 -0
  6. package/dashboard/dist/assets/BANQdlC4.js.gz +0 -0
  7. package/dashboard/dist/assets/{DDCPrZRt.js → BPL4CL3c.js} +1 -1
  8. package/dashboard/dist/assets/BPL4CL3c.js.br +0 -0
  9. package/dashboard/dist/assets/BPL4CL3c.js.gz +0 -0
  10. package/dashboard/dist/assets/{D0PN5_vY.js → BZCkOZ20.js} +1 -1
  11. package/dashboard/dist/assets/BZCkOZ20.js.br +0 -0
  12. package/dashboard/dist/assets/BZCkOZ20.js.gz +0 -0
  13. package/dashboard/dist/assets/{DNQ-iFO2.js → B_LdOJUa.js} +1 -1
  14. package/dashboard/dist/assets/B_LdOJUa.js.br +0 -0
  15. package/dashboard/dist/assets/B_LdOJUa.js.gz +0 -0
  16. package/dashboard/dist/assets/Bfp-wdwb.css +1 -0
  17. package/dashboard/dist/assets/Bfp-wdwb.css.br +0 -0
  18. package/dashboard/dist/assets/{C1u2SGin.css.gz → Bfp-wdwb.css.gz} +0 -0
  19. package/dashboard/dist/assets/{CZXS5i_5.js → BvFcH_Iy.js} +1 -1
  20. package/dashboard/dist/assets/BvFcH_Iy.js.br +0 -0
  21. package/dashboard/dist/assets/BvFcH_Iy.js.gz +0 -0
  22. package/dashboard/dist/assets/C0i7ABUU.js +212 -0
  23. package/dashboard/dist/assets/C0i7ABUU.js.br +0 -0
  24. package/dashboard/dist/assets/C0i7ABUU.js.gz +0 -0
  25. package/dashboard/dist/assets/CFB0MM7j.js +1 -0
  26. package/dashboard/dist/assets/CFB0MM7j.js.br +0 -0
  27. package/dashboard/dist/assets/CFB0MM7j.js.gz +0 -0
  28. package/dashboard/dist/assets/{OlLPtzdz.js → CQSRb1yu.js} +1 -1
  29. package/dashboard/dist/assets/CQSRb1yu.js.br +0 -0
  30. package/dashboard/dist/assets/CQSRb1yu.js.gz +0 -0
  31. package/dashboard/dist/assets/{CbVWL74-.js → CUoQoSm-.js} +1 -1
  32. package/dashboard/dist/assets/CUoQoSm-.js.br +0 -0
  33. package/dashboard/dist/assets/CUoQoSm-.js.gz +0 -0
  34. package/dashboard/dist/assets/Ckd1R1iE.js +1 -0
  35. package/dashboard/dist/assets/Ckd1R1iE.js.br +0 -0
  36. package/dashboard/dist/assets/Ckd1R1iE.js.gz +0 -0
  37. package/dashboard/dist/assets/{DhPuHPK7.js → CqRNb2EL.js} +1 -1
  38. package/dashboard/dist/assets/CqRNb2EL.js.br +0 -0
  39. package/dashboard/dist/assets/CqRNb2EL.js.gz +0 -0
  40. package/dashboard/dist/assets/{CGJiHCIx.js → DClUc9rw.js} +1 -1
  41. package/dashboard/dist/assets/DClUc9rw.js.br +0 -0
  42. package/dashboard/dist/assets/DClUc9rw.js.gz +0 -0
  43. package/dashboard/dist/assets/DF2PMTwT.js +1 -0
  44. package/dashboard/dist/assets/DF2PMTwT.js.br +0 -0
  45. package/dashboard/dist/assets/DF2PMTwT.js.gz +0 -0
  46. package/dashboard/dist/assets/{RN4M9u9W.js → DJYl7gyA.js} +1 -1
  47. package/dashboard/dist/assets/DJYl7gyA.js.br +0 -0
  48. package/dashboard/dist/assets/DJYl7gyA.js.gz +0 -0
  49. package/dashboard/dist/assets/{BrMXbzQ-.js → DZtNMX0t.js} +1 -1
  50. package/dashboard/dist/assets/DZtNMX0t.js.br +0 -0
  51. package/dashboard/dist/assets/DZtNMX0t.js.gz +0 -0
  52. package/dashboard/dist/assets/{LOFrVoPD.js → DlEa8PI0.js} +1 -1
  53. package/dashboard/dist/assets/DlEa8PI0.js.br +0 -0
  54. package/dashboard/dist/assets/DlEa8PI0.js.gz +0 -0
  55. package/dashboard/dist/assets/M4QxcXjh.js +1 -0
  56. package/dashboard/dist/assets/M4QxcXjh.js.br +0 -0
  57. package/dashboard/dist/assets/M4QxcXjh.js.gz +0 -0
  58. package/dashboard/dist/assets/{nra1yvJX.js → MrW1ixGx.js} +1 -1
  59. package/dashboard/dist/assets/MrW1ixGx.js.br +0 -0
  60. package/dashboard/dist/assets/MrW1ixGx.js.gz +0 -0
  61. package/dashboard/dist/index.html +2 -2
  62. package/dashboard/dist/index.html.br +0 -0
  63. package/dashboard/dist/index.html.gz +0 -0
  64. package/dist/activity-store.js +68 -8
  65. package/dist/contracts/shared-types.d.ts +28 -0
  66. package/dist/http/helpers/auto-continue-engine.js +235 -32
  67. package/dist/http/helpers/triage-mapper.js +285 -6
  68. package/dist/http/helpers/value-utils.d.ts +1 -0
  69. package/dist/http/helpers/value-utils.js +17 -0
  70. package/dist/http/index.js +89 -3
  71. package/dist/http/routes/live-triage.js +6 -1
  72. package/dist/http/routes/mission-control-actions.d.ts +9 -0
  73. package/dist/http/routes/mission-control-actions.js +157 -7
  74. package/dist/http/routes/mission-control-read.d.ts +9 -0
  75. package/dist/http/routes/mission-control-read.js +33 -0
  76. package/dist/stores/sqlite-state.d.ts +1 -1
  77. package/dist/stores/sqlite-state.js +153 -2
  78. package/package.json +1 -1
  79. package/dashboard/dist/assets/9gFmK3Kr.js +0 -1
  80. package/dashboard/dist/assets/9gFmK3Kr.js.br +0 -0
  81. package/dashboard/dist/assets/9gFmK3Kr.js.gz +0 -0
  82. package/dashboard/dist/assets/BrMXbzQ-.js.br +0 -0
  83. package/dashboard/dist/assets/BrMXbzQ-.js.gz +0 -0
  84. package/dashboard/dist/assets/C1u2SGin.css +0 -1
  85. package/dashboard/dist/assets/C1u2SGin.css.br +0 -0
  86. package/dashboard/dist/assets/CGJiHCIx.js.br +0 -0
  87. package/dashboard/dist/assets/CGJiHCIx.js.gz +0 -0
  88. package/dashboard/dist/assets/CSd4rSuU.js +0 -212
  89. package/dashboard/dist/assets/CSd4rSuU.js.br +0 -0
  90. package/dashboard/dist/assets/CSd4rSuU.js.gz +0 -0
  91. package/dashboard/dist/assets/CZXS5i_5.js.br +0 -0
  92. package/dashboard/dist/assets/CZXS5i_5.js.gz +0 -0
  93. package/dashboard/dist/assets/CbVWL74-.js.br +0 -0
  94. package/dashboard/dist/assets/CbVWL74-.js.gz +0 -0
  95. package/dashboard/dist/assets/D-FuHfT8.js.br +0 -0
  96. package/dashboard/dist/assets/D-FuHfT8.js.gz +0 -0
  97. package/dashboard/dist/assets/D0PN5_vY.js.br +0 -0
  98. package/dashboard/dist/assets/D0PN5_vY.js.gz +0 -0
  99. package/dashboard/dist/assets/DDCPrZRt.js.br +0 -0
  100. package/dashboard/dist/assets/DDCPrZRt.js.gz +0 -0
  101. package/dashboard/dist/assets/DNQ-iFO2.js.br +0 -0
  102. package/dashboard/dist/assets/DNQ-iFO2.js.gz +0 -0
  103. package/dashboard/dist/assets/DhPuHPK7.js.br +0 -0
  104. package/dashboard/dist/assets/DhPuHPK7.js.gz +0 -0
  105. package/dashboard/dist/assets/Dhz7qPtn.js +0 -1
  106. package/dashboard/dist/assets/Dhz7qPtn.js.br +0 -0
  107. package/dashboard/dist/assets/Dhz7qPtn.js.gz +0 -0
  108. package/dashboard/dist/assets/LOFrVoPD.js.br +0 -0
  109. package/dashboard/dist/assets/LOFrVoPD.js.gz +0 -0
  110. package/dashboard/dist/assets/OlLPtzdz.js.br +0 -0
  111. package/dashboard/dist/assets/OlLPtzdz.js.gz +0 -0
  112. package/dashboard/dist/assets/RN4M9u9W.js.br +0 -0
  113. package/dashboard/dist/assets/RN4M9u9W.js.gz +0 -0
  114. package/dashboard/dist/assets/VCHu272d.js +0 -1
  115. package/dashboard/dist/assets/VCHu272d.js.br +0 -0
  116. package/dashboard/dist/assets/VCHu272d.js.gz +0 -0
  117. package/dashboard/dist/assets/m2smti3F.js.br +0 -0
  118. package/dashboard/dist/assets/m2smti3F.js.gz +0 -0
  119. package/dashboard/dist/assets/nra1yvJX.js.br +0 -0
  120. package/dashboard/dist/assets/nra1yvJX.js.gz +0 -0
  121. package/dashboard/dist/assets/qLX6NZ-J.js +0 -1
  122. package/dashboard/dist/assets/qLX6NZ-J.js.br +0 -0
  123. package/dashboard/dist/assets/qLX6NZ-J.js.gz +0 -0
@@ -330,10 +330,7 @@ export function createAutoContinueEngine(deps) {
330
330
  event: "question_timeout_started",
331
331
  action_type: normalizeActivityActionType("question_timeout_started"),
332
332
  action_phase: normalizeActivityActionPhase("review"),
333
- initiative_id: pending.initiativeId,
334
- workstream_id: pending.workstreamId,
335
- source_run_id: pending.sourceRunId,
336
- source_client: pending.sourceClient,
333
+ ...(pending.eventMetadata ?? {}),
337
334
  decision_ids: pending.decisionIds,
338
335
  decision_count: pending.decisionIds.length,
339
336
  decision_action: pending.action,
@@ -378,6 +375,166 @@ export function createAutoContinueEngine(deps) {
378
375
  }, delaySeconds * 1_000);
379
376
  pending.timer.unref?.();
380
377
  };
378
+ const pickMetadataString = (record, keys) => {
379
+ if (!record)
380
+ return null;
381
+ for (const key of keys) {
382
+ const value = record[key];
383
+ if (typeof value !== "string")
384
+ continue;
385
+ const trimmed = value.trim();
386
+ if (trimmed.length > 0)
387
+ return trimmed;
388
+ }
389
+ return null;
390
+ };
391
+ const pickMetadataStringArray = (record, keys) => {
392
+ if (!record)
393
+ return [];
394
+ for (const key of keys) {
395
+ const raw = record[key];
396
+ if (!Array.isArray(raw))
397
+ continue;
398
+ const values = raw
399
+ .filter((entry) => typeof entry === "string")
400
+ .map((entry) => entry.trim())
401
+ .filter(Boolean);
402
+ if (values.length > 0)
403
+ return values;
404
+ }
405
+ return [];
406
+ };
407
+ const normalizeQueuedDecisionOptions = (value, recommendedAction) => {
408
+ if (!Array.isArray(value))
409
+ return [];
410
+ const normalized = [];
411
+ const seen = new Set();
412
+ const recommendedLower = recommendedAction?.trim().toLowerCase() ?? null;
413
+ for (const rawOption of value) {
414
+ if (typeof rawOption === "string") {
415
+ const label = rawOption.trim();
416
+ if (!label)
417
+ continue;
418
+ const key = label.toLowerCase();
419
+ if (seen.has(key))
420
+ continue;
421
+ seen.add(key);
422
+ normalized.push({
423
+ label,
424
+ recommended: recommendedLower !== null && label.toLowerCase() === recommendedLower,
425
+ });
426
+ continue;
427
+ }
428
+ if (!rawOption || typeof rawOption !== "object" || Array.isArray(rawOption))
429
+ continue;
430
+ const optionRecord = rawOption;
431
+ const label = pickMetadataString(optionRecord, ["label", "title", "name"]) ??
432
+ pickMetadataString(optionRecord, ["action", "action_type", "actionType"]);
433
+ if (!label)
434
+ continue;
435
+ const id = pickMetadataString(optionRecord, ["id", "option_id", "optionId"]);
436
+ const description = pickMetadataString(optionRecord, ["description", "summary"]);
437
+ const consequences = pickMetadataString(optionRecord, ["consequences", "impact"]);
438
+ const actionType = pickMetadataString(optionRecord, ["action_type", "actionType", "action"]);
439
+ const impliedStatus = pickMetadataString(optionRecord, ["implied_status", "impliedStatus", "status"]);
440
+ const requiresNote = optionRecord.requires_note === true ||
441
+ optionRecord.requiresNote === true ||
442
+ optionRecord.note_required === true;
443
+ const recommended = optionRecord.recommended === true ||
444
+ optionRecord.is_recommended === true ||
445
+ optionRecord.isRecommended === true ||
446
+ (recommendedLower !== null && label.toLowerCase() === recommendedLower);
447
+ const key = `${(id ?? "").toLowerCase()}|${label.toLowerCase()}`;
448
+ if (seen.has(key))
449
+ continue;
450
+ seen.add(key);
451
+ normalized.push({
452
+ ...(id ? { id } : {}),
453
+ label,
454
+ ...(description ? { description } : {}),
455
+ ...(consequences ? { consequences } : {}),
456
+ ...(actionType ? { action_type: actionType } : {}),
457
+ ...(impliedStatus ? { implied_status: impliedStatus } : {}),
458
+ ...(requiresNote ? { requires_note: true } : {}),
459
+ ...(recommended ? { recommended: true } : {}),
460
+ });
461
+ }
462
+ return normalized.slice(0, 8);
463
+ };
464
+ const normalizeQueuedDecisionEvidence = (value) => {
465
+ if (!Array.isArray(value))
466
+ return [];
467
+ const normalized = [];
468
+ const seen = new Set();
469
+ for (const rawEvidence of value) {
470
+ if (!rawEvidence || typeof rawEvidence !== "object" || Array.isArray(rawEvidence))
471
+ continue;
472
+ const record = rawEvidence;
473
+ const title = pickMetadataString(record, ["title", "label", "name"]) ??
474
+ pickMetadataString(record, ["source_pointer", "sourcePointer", "source_url", "sourceUrl"]) ??
475
+ "Evidence";
476
+ const summary = pickMetadataString(record, ["summary", "description"]);
477
+ const sourceUrl = pickMetadataString(record, ["source_url", "sourceUrl", "url"]);
478
+ const sourcePointer = pickMetadataString(record, ["source_pointer", "sourcePointer", "path"]);
479
+ const evidenceType = pickMetadataString(record, ["evidence_type", "evidenceType", "type"]);
480
+ const confidenceRaw = record.confidence ?? record.confidence_score;
481
+ const confidence = typeof confidenceRaw === "number" && Number.isFinite(confidenceRaw)
482
+ ? Math.max(0, Math.min(1, confidenceRaw))
483
+ : null;
484
+ const key = `${title.toLowerCase()}|${sourceUrl ?? ""}|${sourcePointer ?? ""}`;
485
+ if (seen.has(key))
486
+ continue;
487
+ seen.add(key);
488
+ normalized.push({
489
+ title,
490
+ ...(summary ? { summary } : {}),
491
+ ...(sourceUrl ? { source_url: sourceUrl } : {}),
492
+ ...(sourcePointer ? { source_pointer: sourcePointer } : {}),
493
+ ...(evidenceType ? { evidence_type: evidenceType } : {}),
494
+ ...(confidence !== null ? { confidence } : {}),
495
+ });
496
+ }
497
+ return normalized.slice(0, 8);
498
+ };
499
+ const buildQuestionEventMetadata = (input) => {
500
+ const metadata = {
501
+ initiative_id: input.initiativeId,
502
+ workstream_id: input.workstreamId,
503
+ source_run_id: input.sourceRunId,
504
+ source_client: input.sourceClient,
505
+ decision_ids: input.decisionIds,
506
+ decision_count: input.decisionIds.length,
507
+ blocking: input.blocking,
508
+ decision_title: input.title,
509
+ decision_prompt: input.title,
510
+ question: input.title,
511
+ required_action: input.recommendedAction,
512
+ recommended_action: input.recommendedAction,
513
+ current_run_state: input.currentRunState,
514
+ impact_if_delayed: input.impactIfDelayed,
515
+ reason: input.reason,
516
+ decision_type: input.decisionType,
517
+ };
518
+ if (input.summary)
519
+ metadata.decision_summary = input.summary;
520
+ if (input.options.length > 0) {
521
+ metadata.decision_options = input.options;
522
+ metadata.decision_option_labels = input.options.map((option) => option.label);
523
+ }
524
+ if (input.evidenceRefs.length > 0)
525
+ metadata.evidence_refs = input.evidenceRefs;
526
+ if (input.scopeHierarchy.length > 0)
527
+ metadata.scope_hierarchy = input.scopeHierarchy;
528
+ if (input.initiativeTitle)
529
+ metadata.initiative_title = input.initiativeTitle;
530
+ if (input.workstreamTitle)
531
+ metadata.workstream_title = input.workstreamTitle;
532
+ if (input.taskTitle)
533
+ metadata.task_title = input.taskTitle;
534
+ if (input.nextActions.length > 0)
535
+ metadata.next_actions = input.nextActions;
536
+ return metadata;
537
+ };
381
538
  const scheduleQuestionAutoAnswer = async (input) => {
382
539
  const decisionIds = dedupeStrings(input.decisionIds
383
540
  .map((entry) => (entry ?? "").trim())
@@ -385,6 +542,28 @@ export function createAutoContinueEngine(deps) {
385
542
  if (decisionIds.length === 0)
386
543
  return;
387
544
  const policy = resolveQuestionPolicy(input.initiativeId, input.workstreamId);
545
+ const questionMetadata = buildQuestionEventMetadata({
546
+ initiativeId: input.initiativeId,
547
+ workstreamId: input.workstreamId,
548
+ sourceRunId: input.sourceRunId,
549
+ sourceClient: input.sourceClient,
550
+ decisionIds,
551
+ blocking: input.blocking,
552
+ title: input.title,
553
+ summary: input.summary,
554
+ decisionType: input.decisionType,
555
+ options: input.options,
556
+ recommendedAction: input.recommendedAction,
557
+ evidenceRefs: input.evidenceRefs,
558
+ scopeHierarchy: input.scopeHierarchy,
559
+ initiativeTitle: input.initiativeTitle,
560
+ workstreamTitle: input.workstreamTitle,
561
+ taskTitle: input.taskTitle,
562
+ nextActions: input.nextActions,
563
+ currentRunState: input.currentRunState,
564
+ impactIfDelayed: input.impactIfDelayed,
565
+ reason: input.reason,
566
+ });
388
567
  await emitActivitySafe({
389
568
  initiativeId: input.initiativeId,
390
569
  runId: input.sourceRunId,
@@ -402,13 +581,7 @@ export function createAutoContinueEngine(deps) {
402
581
  event: "question_asked",
403
582
  action_type: normalizeActivityActionType("question_asked"),
404
583
  action_phase: normalizeActivityActionPhase("review"),
405
- initiative_id: input.initiativeId,
406
- workstream_id: input.workstreamId,
407
- source_run_id: input.sourceRunId,
408
- source_client: input.sourceClient,
409
- decision_ids: decisionIds,
410
- decision_count: decisionIds.length,
411
- blocking: input.blocking,
584
+ ...questionMetadata,
412
585
  question_policy_mode: policy.mode,
413
586
  question_policy_version: policy.policyVersion,
414
587
  timeout_seconds_applied: policy.timeoutSeconds,
@@ -434,12 +607,7 @@ export function createAutoContinueEngine(deps) {
434
607
  event: "review_item_created",
435
608
  action_type: normalizeActivityActionType("review_item_created"),
436
609
  action_phase: normalizeActivityActionPhase("blocked"),
437
- initiative_id: input.initiativeId,
438
- workstream_id: input.workstreamId,
439
- source_run_id: input.sourceRunId,
440
- source_client: input.sourceClient,
441
- decision_ids: decisionIds,
442
- decision_count: decisionIds.length,
610
+ ...questionMetadata,
443
611
  blocking: true,
444
612
  reason: "blocking_question_requires_human",
445
613
  question_policy_mode: policy.mode,
@@ -463,11 +631,7 @@ export function createAutoContinueEngine(deps) {
463
631
  event: "review_item_created",
464
632
  action_type: normalizeActivityActionType("review_item_created"),
465
633
  action_phase: normalizeActivityActionPhase("review"),
466
- initiative_id: input.initiativeId,
467
- workstream_id: input.workstreamId,
468
- source_run_id: input.sourceRunId,
469
- source_client: input.sourceClient,
470
- decision_ids: decisionIds,
634
+ ...questionMetadata,
471
635
  reason: "policy_disabled",
472
636
  question_policy_mode: policy.mode,
473
637
  question_policy_version: policy.policyVersion,
@@ -487,6 +651,7 @@ export function createAutoContinueEngine(deps) {
487
651
  existing.policyVersion = policy.policyVersion;
488
652
  existing.timeoutSeconds = policy.timeoutSeconds;
489
653
  existing.dueAt = new Date(dueAtEpoch).toISOString();
654
+ existing.eventMetadata = questionMetadata;
490
655
  armQuestionAutoAnswerTimer(key, existing, policy.timeoutSeconds);
491
656
  await emitActivitySafe({
492
657
  initiativeId: input.initiativeId,
@@ -501,10 +666,7 @@ export function createAutoContinueEngine(deps) {
501
666
  event: "question_timeout_started",
502
667
  action_type: normalizeActivityActionType("question_timeout_started"),
503
668
  action_phase: normalizeActivityActionPhase("review"),
504
- initiative_id: input.initiativeId,
505
- workstream_id: input.workstreamId,
506
- source_run_id: input.sourceRunId,
507
- source_client: input.sourceClient,
669
+ ...questionMetadata,
508
670
  decision_ids: existing.decisionIds,
509
671
  decision_count: existing.decisionIds.length,
510
672
  decision_action: existing.action,
@@ -530,6 +692,7 @@ export function createAutoContinueEngine(deps) {
530
692
  dueAt: new Date(dueAtEpoch).toISOString(),
531
693
  timer: null,
532
694
  decisionIds,
695
+ eventMetadata: questionMetadata,
533
696
  };
534
697
  armQuestionAutoAnswerTimer(key, pending, policy.timeoutSeconds);
535
698
  pendingQuestionAutoAnswerByScope.set(key, pending);
@@ -546,12 +709,7 @@ export function createAutoContinueEngine(deps) {
546
709
  event: "question_timeout_started",
547
710
  action_type: normalizeActivityActionType("question_timeout_started"),
548
711
  action_phase: normalizeActivityActionPhase("review"),
549
- initiative_id: input.initiativeId,
550
- workstream_id: input.workstreamId,
551
- source_run_id: input.sourceRunId,
552
- source_client: input.sourceClient,
553
- decision_ids: decisionIds,
554
- decision_count: decisionIds.length,
712
+ ...questionMetadata,
555
713
  decision_action: policy.action,
556
714
  timeout_seconds_applied: policy.timeoutSeconds,
557
715
  question_policy_mode: policy.mode,
@@ -703,6 +861,34 @@ export function createAutoContinueEngine(deps) {
703
861
  inferredStreamId ??
704
862
  linkedSlice?.workstreamId ??
705
863
  null);
864
+ const initiativeTitle = pickMetadataString(metadataBase, ["initiative_title", "initiativeTitle"]) ??
865
+ pickMetadataString(sourceRefBase, ["initiative_title", "initiativeTitle"]) ??
866
+ null;
867
+ const workstreamTitle = pickMetadataString(metadataBase, ["workstream_title", "workstreamTitle"]) ??
868
+ pickMetadataString(sourceRefBase, ["workstream_title", "workstreamTitle"]) ??
869
+ linkedSlice?.workstreamTitle ??
870
+ null;
871
+ const taskTitle = pickMetadataString(metadataBase, ["task_title", "taskTitle", "dispatch_task_title"]) ??
872
+ null;
873
+ const recommendedAction = typeof normalizedInput.recommendedAction === "string" && normalizedInput.recommendedAction.trim().length > 0
874
+ ? normalizedInput.recommendedAction.trim()
875
+ : pickMetadataString(metadataBase, ["recommended_action", "recommendedAction"]);
876
+ const decisionOptions = normalizeQueuedDecisionOptions(normalizedInput.options ?? [], recommendedAction);
877
+ const decisionEvidenceRefs = normalizeQueuedDecisionEvidence(normalizedInput.evidenceRefs ?? []);
878
+ const scopeHierarchy = [
879
+ ...pickMetadataStringArray(metadataBase, ["scope_hierarchy", "scopeHierarchy"]),
880
+ ...pickMetadataStringArray(sourceRefBase, ["scope_hierarchy", "scopeHierarchy"]),
881
+ ...[initiativeTitle, workstreamTitle, taskTitle].filter((entry) => typeof entry === "string" && entry.trim().length > 0),
882
+ ].filter((entry, index, source) => source.indexOf(entry) === index);
883
+ const nextActions = [
884
+ ...pickMetadataStringArray(metadataBase, ["next_actions", "nextActions"]),
885
+ ...(recommendedAction ? [recommendedAction] : []),
886
+ ].filter((entry, index, source) => source.indexOf(entry) === index);
887
+ const currentRunState = pickMetadataString(metadataBase, ["current_run_state", "currentRunState", "runtime_state", "runtimeState", "parsed_status", "parsedStatus"]) ??
888
+ linkedSlice?.status ??
889
+ null;
890
+ const impactIfDelayed = pickMetadataString(metadataBase, ["impact_if_delayed", "impactIfDelayed"]) ??
891
+ null;
706
892
  const result = await requestDecisionSafe(normalizedInput);
707
893
  if (typeof result === "boolean") {
708
894
  return { queued: result, decisionIds: [] };
@@ -730,6 +916,23 @@ export function createAutoContinueEngine(deps) {
730
916
  sourceClient,
731
917
  decisionIds,
732
918
  blocking: Boolean(normalizedInput.blocking),
919
+ title: normalizedInput.title,
920
+ summary: typeof normalizedInput.summary === "string" && normalizedInput.summary.trim().length > 0
921
+ ? normalizedInput.summary.trim()
922
+ : null,
923
+ decisionType: typeof normalizedInput.decisionType === "string" && normalizedInput.decisionType.trim().length > 0
924
+ ? normalizedInput.decisionType.trim()
925
+ : null,
926
+ options: decisionOptions,
927
+ recommendedAction,
928
+ evidenceRefs: decisionEvidenceRefs,
929
+ scopeHierarchy,
930
+ initiativeTitle,
931
+ workstreamTitle,
932
+ taskTitle,
933
+ nextActions,
934
+ currentRunState,
935
+ impactIfDelayed,
733
936
  reason: typeof normalizedInput.conflictSource === "string"
734
937
  ? normalizedInput.conflictSource
735
938
  : null,