@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.
- package/dashboard/dist/assets/{m2smti3F.js → B6VftyY6.js} +1 -1
- package/dashboard/dist/assets/B6VftyY6.js.br +0 -0
- package/dashboard/dist/assets/B6VftyY6.js.gz +0 -0
- package/dashboard/dist/assets/{D-FuHfT8.js → BANQdlC4.js} +1 -1
- package/dashboard/dist/assets/BANQdlC4.js.br +0 -0
- package/dashboard/dist/assets/BANQdlC4.js.gz +0 -0
- package/dashboard/dist/assets/{DDCPrZRt.js → BPL4CL3c.js} +1 -1
- package/dashboard/dist/assets/BPL4CL3c.js.br +0 -0
- package/dashboard/dist/assets/BPL4CL3c.js.gz +0 -0
- package/dashboard/dist/assets/{D0PN5_vY.js → BZCkOZ20.js} +1 -1
- package/dashboard/dist/assets/BZCkOZ20.js.br +0 -0
- package/dashboard/dist/assets/BZCkOZ20.js.gz +0 -0
- package/dashboard/dist/assets/{DNQ-iFO2.js → B_LdOJUa.js} +1 -1
- package/dashboard/dist/assets/B_LdOJUa.js.br +0 -0
- package/dashboard/dist/assets/B_LdOJUa.js.gz +0 -0
- package/dashboard/dist/assets/Bfp-wdwb.css +1 -0
- package/dashboard/dist/assets/Bfp-wdwb.css.br +0 -0
- package/dashboard/dist/assets/{C1u2SGin.css.gz → Bfp-wdwb.css.gz} +0 -0
- package/dashboard/dist/assets/{CZXS5i_5.js → BvFcH_Iy.js} +1 -1
- package/dashboard/dist/assets/BvFcH_Iy.js.br +0 -0
- package/dashboard/dist/assets/BvFcH_Iy.js.gz +0 -0
- package/dashboard/dist/assets/C0i7ABUU.js +212 -0
- package/dashboard/dist/assets/C0i7ABUU.js.br +0 -0
- package/dashboard/dist/assets/C0i7ABUU.js.gz +0 -0
- package/dashboard/dist/assets/CFB0MM7j.js +1 -0
- package/dashboard/dist/assets/CFB0MM7j.js.br +0 -0
- package/dashboard/dist/assets/CFB0MM7j.js.gz +0 -0
- package/dashboard/dist/assets/{OlLPtzdz.js → CQSRb1yu.js} +1 -1
- package/dashboard/dist/assets/CQSRb1yu.js.br +0 -0
- package/dashboard/dist/assets/CQSRb1yu.js.gz +0 -0
- package/dashboard/dist/assets/{CbVWL74-.js → CUoQoSm-.js} +1 -1
- package/dashboard/dist/assets/CUoQoSm-.js.br +0 -0
- package/dashboard/dist/assets/CUoQoSm-.js.gz +0 -0
- package/dashboard/dist/assets/Ckd1R1iE.js +1 -0
- package/dashboard/dist/assets/Ckd1R1iE.js.br +0 -0
- package/dashboard/dist/assets/Ckd1R1iE.js.gz +0 -0
- package/dashboard/dist/assets/{DhPuHPK7.js → CqRNb2EL.js} +1 -1
- package/dashboard/dist/assets/CqRNb2EL.js.br +0 -0
- package/dashboard/dist/assets/CqRNb2EL.js.gz +0 -0
- package/dashboard/dist/assets/{CGJiHCIx.js → DClUc9rw.js} +1 -1
- package/dashboard/dist/assets/DClUc9rw.js.br +0 -0
- package/dashboard/dist/assets/DClUc9rw.js.gz +0 -0
- package/dashboard/dist/assets/DF2PMTwT.js +1 -0
- package/dashboard/dist/assets/DF2PMTwT.js.br +0 -0
- package/dashboard/dist/assets/DF2PMTwT.js.gz +0 -0
- package/dashboard/dist/assets/{RN4M9u9W.js → DJYl7gyA.js} +1 -1
- package/dashboard/dist/assets/DJYl7gyA.js.br +0 -0
- package/dashboard/dist/assets/DJYl7gyA.js.gz +0 -0
- package/dashboard/dist/assets/{BrMXbzQ-.js → DZtNMX0t.js} +1 -1
- package/dashboard/dist/assets/DZtNMX0t.js.br +0 -0
- package/dashboard/dist/assets/DZtNMX0t.js.gz +0 -0
- package/dashboard/dist/assets/{LOFrVoPD.js → DlEa8PI0.js} +1 -1
- package/dashboard/dist/assets/DlEa8PI0.js.br +0 -0
- package/dashboard/dist/assets/DlEa8PI0.js.gz +0 -0
- package/dashboard/dist/assets/M4QxcXjh.js +1 -0
- package/dashboard/dist/assets/M4QxcXjh.js.br +0 -0
- package/dashboard/dist/assets/M4QxcXjh.js.gz +0 -0
- package/dashboard/dist/assets/{nra1yvJX.js → MrW1ixGx.js} +1 -1
- package/dashboard/dist/assets/MrW1ixGx.js.br +0 -0
- package/dashboard/dist/assets/MrW1ixGx.js.gz +0 -0
- package/dashboard/dist/index.html +2 -2
- package/dashboard/dist/index.html.br +0 -0
- package/dashboard/dist/index.html.gz +0 -0
- package/dist/activity-store.js +68 -8
- package/dist/contracts/shared-types.d.ts +28 -0
- package/dist/http/helpers/auto-continue-engine.js +235 -32
- package/dist/http/helpers/triage-mapper.js +285 -6
- package/dist/http/helpers/value-utils.d.ts +1 -0
- package/dist/http/helpers/value-utils.js +17 -0
- package/dist/http/index.js +89 -3
- package/dist/http/routes/live-triage.js +6 -1
- package/dist/http/routes/mission-control-actions.d.ts +9 -0
- package/dist/http/routes/mission-control-actions.js +157 -7
- package/dist/http/routes/mission-control-read.d.ts +9 -0
- package/dist/http/routes/mission-control-read.js +33 -0
- package/dist/stores/sqlite-state.d.ts +1 -1
- package/dist/stores/sqlite-state.js +153 -2
- package/package.json +1 -1
- package/dashboard/dist/assets/9gFmK3Kr.js +0 -1
- package/dashboard/dist/assets/9gFmK3Kr.js.br +0 -0
- package/dashboard/dist/assets/9gFmK3Kr.js.gz +0 -0
- package/dashboard/dist/assets/BrMXbzQ-.js.br +0 -0
- package/dashboard/dist/assets/BrMXbzQ-.js.gz +0 -0
- package/dashboard/dist/assets/C1u2SGin.css +0 -1
- package/dashboard/dist/assets/C1u2SGin.css.br +0 -0
- package/dashboard/dist/assets/CGJiHCIx.js.br +0 -0
- package/dashboard/dist/assets/CGJiHCIx.js.gz +0 -0
- package/dashboard/dist/assets/CSd4rSuU.js +0 -212
- package/dashboard/dist/assets/CSd4rSuU.js.br +0 -0
- package/dashboard/dist/assets/CSd4rSuU.js.gz +0 -0
- package/dashboard/dist/assets/CZXS5i_5.js.br +0 -0
- package/dashboard/dist/assets/CZXS5i_5.js.gz +0 -0
- package/dashboard/dist/assets/CbVWL74-.js.br +0 -0
- package/dashboard/dist/assets/CbVWL74-.js.gz +0 -0
- package/dashboard/dist/assets/D-FuHfT8.js.br +0 -0
- package/dashboard/dist/assets/D-FuHfT8.js.gz +0 -0
- package/dashboard/dist/assets/D0PN5_vY.js.br +0 -0
- package/dashboard/dist/assets/D0PN5_vY.js.gz +0 -0
- package/dashboard/dist/assets/DDCPrZRt.js.br +0 -0
- package/dashboard/dist/assets/DDCPrZRt.js.gz +0 -0
- package/dashboard/dist/assets/DNQ-iFO2.js.br +0 -0
- package/dashboard/dist/assets/DNQ-iFO2.js.gz +0 -0
- package/dashboard/dist/assets/DhPuHPK7.js.br +0 -0
- package/dashboard/dist/assets/DhPuHPK7.js.gz +0 -0
- package/dashboard/dist/assets/Dhz7qPtn.js +0 -1
- package/dashboard/dist/assets/Dhz7qPtn.js.br +0 -0
- package/dashboard/dist/assets/Dhz7qPtn.js.gz +0 -0
- package/dashboard/dist/assets/LOFrVoPD.js.br +0 -0
- package/dashboard/dist/assets/LOFrVoPD.js.gz +0 -0
- package/dashboard/dist/assets/OlLPtzdz.js.br +0 -0
- package/dashboard/dist/assets/OlLPtzdz.js.gz +0 -0
- package/dashboard/dist/assets/RN4M9u9W.js.br +0 -0
- package/dashboard/dist/assets/RN4M9u9W.js.gz +0 -0
- package/dashboard/dist/assets/VCHu272d.js +0 -1
- package/dashboard/dist/assets/VCHu272d.js.br +0 -0
- package/dashboard/dist/assets/VCHu272d.js.gz +0 -0
- package/dashboard/dist/assets/m2smti3F.js.br +0 -0
- package/dashboard/dist/assets/m2smti3F.js.gz +0 -0
- package/dashboard/dist/assets/nra1yvJX.js.br +0 -0
- package/dashboard/dist/assets/nra1yvJX.js.gz +0 -0
- package/dashboard/dist/assets/qLX6NZ-J.js +0 -1
- package/dashboard/dist/assets/qLX6NZ-J.js.br +0 -0
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|