@h-rig/contracts 0.0.6-alpha.155 → 0.0.6-alpha.157
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/dist/index.cjs +407 -91
- package/dist/index.mjs +407 -91
- package/dist/src/browser.d.ts +50 -0
- package/dist/src/browser.js +6 -0
- package/dist/src/config.d.ts +4 -0
- package/dist/src/config.js +6 -14
- package/dist/src/control-plane-types.d.ts +283 -0
- package/dist/src/control-plane-types.js +29 -0
- package/dist/src/doctor.d.ts +27 -0
- package/dist/src/doctor.js +14 -0
- package/dist/src/github.d.ts +103 -0
- package/dist/src/github.js +6 -0
- package/dist/src/help-catalog.js +1 -1
- package/dist/src/index.d.ts +11 -0
- package/dist/src/index.js +407 -91
- package/dist/src/isolation.d.ts +21 -0
- package/dist/src/isolation.js +6 -0
- package/dist/src/kernel.d.ts +3 -35
- package/dist/src/kernel.js +0 -15
- package/dist/src/lifecycle-capabilities.d.ts +29 -0
- package/dist/src/lifecycle-capabilities.js +8 -0
- package/dist/src/managed-repos.d.ts +73 -0
- package/dist/src/managed-repos.js +6 -0
- package/dist/src/memory.d.ts +151 -0
- package/dist/src/memory.js +8 -0
- package/dist/src/panel-protocol.d.ts +17 -0
- package/dist/src/panel-protocol.js +10 -0
- package/dist/src/plugin-hooks.js +6 -14
- package/dist/src/plugin.d.ts +13 -0
- package/dist/src/plugin.js +7 -14
- package/dist/src/provider-instructions.d.ts +19 -0
- package/dist/src/provider-instructions.js +6 -0
- package/dist/src/run-journal.d.ts +1 -1
- package/dist/src/run-record.d.ts +11 -0
- package/dist/src/run-record.js +16 -0
- package/dist/src/supervisor-journal.d.ts +0 -1
- package/dist/src/supervisor-journal.js +0 -74
- package/dist/src/task-graph-primitives.d.ts +68 -0
- package/dist/src/task-graph-primitives.js +319 -0
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -2517,6 +2517,19 @@ function latestTimelineEntriesFromCustomEntries(entries, limit) {
|
|
|
2517
2517
|
timeline.reverse();
|
|
2518
2518
|
return timeline;
|
|
2519
2519
|
}
|
|
2520
|
+
// packages/contracts/src/run-record.ts
|
|
2521
|
+
function latestRunByTaskId(runs) {
|
|
2522
|
+
const byTask = new Map;
|
|
2523
|
+
const stamp = (run) => Date.parse(run.updatedAt ?? run.startedAt ?? "") || 0;
|
|
2524
|
+
for (const run of runs) {
|
|
2525
|
+
if (!run.taskId)
|
|
2526
|
+
continue;
|
|
2527
|
+
const current = byTask.get(run.taskId);
|
|
2528
|
+
if (!current || stamp(run) >= stamp(current))
|
|
2529
|
+
byTask.set(run.taskId, run);
|
|
2530
|
+
}
|
|
2531
|
+
return byTask;
|
|
2532
|
+
}
|
|
2520
2533
|
// packages/contracts/src/run-status.ts
|
|
2521
2534
|
var OPERATOR_INACTIVE_RUN_STATUSES = new Set([
|
|
2522
2535
|
"completed",
|
|
@@ -2622,19 +2635,6 @@ var CapabilityReplacementSpec = Schema10.Union([
|
|
|
2622
2635
|
CapabilityReplacement,
|
|
2623
2636
|
TrimmedNonEmptyString
|
|
2624
2637
|
]);
|
|
2625
|
-
var PluginMeta = Schema10.Struct({
|
|
2626
|
-
id: TrimmedNonEmptyString,
|
|
2627
|
-
version: TrimmedNonEmptyString,
|
|
2628
|
-
provides: Schema10.Array(CapabilityTag),
|
|
2629
|
-
requires: Schema10.optional(Schema10.Array(CapabilityTag)),
|
|
2630
|
-
replaces: Schema10.optional(Schema10.Array(CapabilityReplacementSpec))
|
|
2631
|
-
});
|
|
2632
|
-
var LoadedPluginDescriptor = Schema10.Struct({
|
|
2633
|
-
meta: PluginMeta,
|
|
2634
|
-
provides: Schema10.Array(CapabilityTag),
|
|
2635
|
-
contributes: Schema10.Unknown,
|
|
2636
|
-
runtime: Schema10.Unknown
|
|
2637
|
-
});
|
|
2638
2638
|
var KernelReplacementGrant = Schema10.Struct({
|
|
2639
2639
|
pluginId: TrimmedNonEmptyString,
|
|
2640
2640
|
grantedBy: Schema10.optional(TrimmedNonEmptyString),
|
|
@@ -2800,6 +2800,10 @@ var BlockerClassifierRegistration = Schema11.Struct({
|
|
|
2800
2800
|
description: Schema11.optional(Schema11.String),
|
|
2801
2801
|
priority: Schema11.optional(Schema11.Number)
|
|
2802
2802
|
});
|
|
2803
|
+
var SessionExtensionRegistration = Schema11.Struct({
|
|
2804
|
+
id: Schema11.String,
|
|
2805
|
+
description: Schema11.optional(Schema11.String)
|
|
2806
|
+
});
|
|
2803
2807
|
var PluginContributes = Schema11.Struct({
|
|
2804
2808
|
validators: Schema11.optional(Schema11.Array(ValidatorRegistration)),
|
|
2805
2809
|
hooks: Schema11.optional(Schema11.Array(HookRegistration)),
|
|
@@ -2813,7 +2817,8 @@ var PluginContributes = Schema11.Struct({
|
|
|
2813
2817
|
stageMutations: Schema11.optional(Schema11.Array(StageMutation)),
|
|
2814
2818
|
capabilities: Schema11.optional(Schema11.Array(ProductCapabilityRegistration)),
|
|
2815
2819
|
panels: Schema11.optional(Schema11.Array(PanelRegistration)),
|
|
2816
|
-
blockerClassifiers: Schema11.optional(Schema11.Array(BlockerClassifierRegistration))
|
|
2820
|
+
blockerClassifiers: Schema11.optional(Schema11.Array(BlockerClassifierRegistration)),
|
|
2821
|
+
sessionExtensions: Schema11.optional(Schema11.Array(SessionExtensionRegistration))
|
|
2817
2822
|
});
|
|
2818
2823
|
var RigPlugin = Schema11.Struct({
|
|
2819
2824
|
name: Schema11.String,
|
|
@@ -2961,79 +2966,6 @@ var SupervisorProjection = Schema13.Struct({
|
|
|
2961
2966
|
closures: Schema13.Array(TaskClosureSummary),
|
|
2962
2967
|
anomalies: Schema13.Array(Schema13.String)
|
|
2963
2968
|
});
|
|
2964
|
-
function reduceSupervisorJournal(events) {
|
|
2965
|
-
let processed = 0;
|
|
2966
|
-
let succeeded = 0;
|
|
2967
|
-
let failed = 0;
|
|
2968
|
-
let skipped = 0;
|
|
2969
|
-
let current = null;
|
|
2970
|
-
let idleReason = null;
|
|
2971
|
-
let stopReason = null;
|
|
2972
|
-
let status = "running";
|
|
2973
|
-
let plannedOrder = [];
|
|
2974
|
-
let selectionPolicy = null;
|
|
2975
|
-
const concurrency = null;
|
|
2976
|
-
const closures = [];
|
|
2977
|
-
const anomalies = [];
|
|
2978
|
-
for (const event of events) {
|
|
2979
|
-
switch (event.kind) {
|
|
2980
|
-
case "supervisor.started":
|
|
2981
|
-
status = "running";
|
|
2982
|
-
break;
|
|
2983
|
-
case "supervisor.selection-planned":
|
|
2984
|
-
plannedOrder = [...event.taskIds];
|
|
2985
|
-
selectionPolicy = event.policy;
|
|
2986
|
-
break;
|
|
2987
|
-
case "supervisor.dispatch-started":
|
|
2988
|
-
break;
|
|
2989
|
-
case "supervisor.dispatch-confirmed":
|
|
2990
|
-
current = { taskId: event.taskId, runId: event.runId };
|
|
2991
|
-
break;
|
|
2992
|
-
case "supervisor.dispatch":
|
|
2993
|
-
current = { taskId: event.taskId, runId: event.runId };
|
|
2994
|
-
break;
|
|
2995
|
-
case "supervisor.outcome":
|
|
2996
|
-
processed += 1;
|
|
2997
|
-
if (event.failed) {
|
|
2998
|
-
failed += 1;
|
|
2999
|
-
} else {
|
|
3000
|
-
succeeded += 1;
|
|
3001
|
-
}
|
|
3002
|
-
if (event.closure) {
|
|
3003
|
-
closures.push(event.closure);
|
|
3004
|
-
}
|
|
3005
|
-
if (current?.runId === event.runId) {
|
|
3006
|
-
current = null;
|
|
3007
|
-
} else if (current !== null) {
|
|
3008
|
-
anomalies.push(`outcome for ${event.runId} did not match current ${current.runId}`);
|
|
3009
|
-
}
|
|
3010
|
-
break;
|
|
3011
|
-
case "supervisor.skipped":
|
|
3012
|
-
processed += 1;
|
|
3013
|
-
skipped += 1;
|
|
3014
|
-
break;
|
|
3015
|
-
case "supervisor.idle":
|
|
3016
|
-
status = "idle";
|
|
3017
|
-
idleReason = event.reason;
|
|
3018
|
-
break;
|
|
3019
|
-
case "supervisor.stopped":
|
|
3020
|
-
status = "stopped";
|
|
3021
|
-
stopReason = event.reason;
|
|
3022
|
-
current = null;
|
|
3023
|
-
break;
|
|
3024
|
-
case "supervisor.finished":
|
|
3025
|
-
status = "finished";
|
|
3026
|
-
processed = event.processed;
|
|
3027
|
-
succeeded = event.succeeded;
|
|
3028
|
-
failed = event.failed;
|
|
3029
|
-
skipped = event.skipped ?? skipped;
|
|
3030
|
-
idleReason = event.idleReason;
|
|
3031
|
-
current = null;
|
|
3032
|
-
break;
|
|
3033
|
-
}
|
|
3034
|
-
}
|
|
3035
|
-
return { status, processed, succeeded, failed, skipped, current, plannedOrder, selectionPolicy, concurrency, idleReason, stopReason, closures, anomalies };
|
|
3036
|
-
}
|
|
3037
2969
|
|
|
3038
2970
|
// packages/contracts/src/config.ts
|
|
3039
2971
|
var WorkspaceIsolation = Schema14.Literals([
|
|
@@ -6342,7 +6274,7 @@ var PRIMARY_GROUPS = [
|
|
|
6342
6274
|
name: "graph",
|
|
6343
6275
|
summary: "Workspace dependency graph.",
|
|
6344
6276
|
usage: ["rig graph [--json|--dot]"],
|
|
6345
|
-
commands: [{ command: "[--json|--dot]", description: "Build the dependency graph
|
|
6277
|
+
commands: [{ command: "[--json|--dot]", description: "Build the workspace dependency graph and print summary, JSON, or DOT.", primary: true }],
|
|
6346
6278
|
examples: ["rig graph", "rig graph --json", "rig graph --dot"]
|
|
6347
6279
|
},
|
|
6348
6280
|
{
|
|
@@ -6763,11 +6695,374 @@ var WorkspaceRollups = Schema35.Struct({
|
|
|
6763
6695
|
assignees: Schema35.Array(AssigneeRollup),
|
|
6764
6696
|
generatedAt: IsoDateTime
|
|
6765
6697
|
});
|
|
6698
|
+
// packages/contracts/src/panel-protocol.ts
|
|
6699
|
+
var RIG_RUN_STOP_PANEL_ACTION = "rig-run:stop";
|
|
6700
|
+
var RIG_CAPABILITY_PANEL_SLOT = "capability";
|
|
6701
|
+
var RIG_SUPERVISOR_PANEL_ID = "supervisor";
|
|
6702
|
+
// packages/contracts/src/control-plane-types.ts
|
|
6703
|
+
function strictMergeHeadShaFromGate(result, prUrl, requireGreptile = true) {
|
|
6704
|
+
if (!result.approved) {
|
|
6705
|
+
throw new Error(`Refusing to merge ${prUrl}: strict merge gate is not approved.`);
|
|
6706
|
+
}
|
|
6707
|
+
if (result.evidence.prUrl !== prUrl) {
|
|
6708
|
+
throw new Error(`Refusing to merge ${prUrl}: strict merge gate evidence belongs to ${result.evidence.prUrl}.`);
|
|
6709
|
+
}
|
|
6710
|
+
const headSha = result.evidence.headSha?.trim();
|
|
6711
|
+
if (!headSha) {
|
|
6712
|
+
throw new Error(`Refusing to merge ${prUrl}: strict merge gate did not provide a current head SHA.`);
|
|
6713
|
+
}
|
|
6714
|
+
if (!/^[0-9a-f]{40}$/i.test(headSha)) {
|
|
6715
|
+
throw new Error(`Refusing to merge ${prUrl}: strict merge gate head is not a raw 40-character commit SHA.`);
|
|
6716
|
+
}
|
|
6717
|
+
if (requireGreptile) {
|
|
6718
|
+
if (!result.evidence.greptile.fresh || result.evidence.greptile.currentHeadSha !== headSha) {
|
|
6719
|
+
throw new Error(`Refusing to merge ${prUrl}: strict merge gate approval is not tied to head ${headSha}.`);
|
|
6720
|
+
}
|
|
6721
|
+
if (result.evidence.greptile.mapping !== "score-5-of-5" && result.evidence.greptile.mapping !== "explicit-approved") {
|
|
6722
|
+
throw new Error(`Refusing to merge ${prUrl}: strict merge gate mapping is ${result.evidence.greptile.mapping}.`);
|
|
6723
|
+
}
|
|
6724
|
+
}
|
|
6725
|
+
return headSha;
|
|
6726
|
+
}
|
|
6727
|
+
// packages/contracts/src/lifecycle-capabilities.ts
|
|
6728
|
+
var TASK_VERIFY_CAPABILITY_ID = "default-lifecycle.task-verify";
|
|
6729
|
+
var COMPLETION_VERIFICATION_CAPABILITY_ID = "default-lifecycle.completion-verification";
|
|
6730
|
+
// packages/contracts/src/browser.ts
|
|
6731
|
+
var BROWSER_CONTRACT_SERVICE_CAPABILITY_ID = "browser.contract";
|
|
6732
|
+
// packages/contracts/src/memory.ts
|
|
6733
|
+
var MEMORY_SERVICE_CAPABILITY_ID = "memory.service";
|
|
6734
|
+
var NO_MATCH_RETRIEVAL_CANONICAL_KEY = "__memory_recall__:none";
|
|
6735
|
+
// packages/contracts/src/provider-instructions.ts
|
|
6736
|
+
var RUNTIME_INSTRUCTION_SERVICE_CAPABILITY_ID = "provider.runtime-instructions";
|
|
6737
|
+
// packages/contracts/src/isolation.ts
|
|
6738
|
+
var ISOLATION_BACKEND_CAPABILITY_ID = "isolation.backend";
|
|
6739
|
+
// packages/contracts/src/managed-repos.ts
|
|
6740
|
+
var MANAGED_REPO_SERVICE_CAPABILITY_ID = "managed-repos.service";
|
|
6741
|
+
// packages/contracts/src/task-graph-primitives.ts
|
|
6742
|
+
function isObjectRecord(value) {
|
|
6743
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
6744
|
+
}
|
|
6745
|
+
function readStringList(value) {
|
|
6746
|
+
return Array.isArray(value) ? value.filter((entry) => typeof entry === "string" && entry.length > 0) : [];
|
|
6747
|
+
}
|
|
6748
|
+
function unique(values) {
|
|
6749
|
+
return Array.from(new Set(values));
|
|
6750
|
+
}
|
|
6751
|
+
function readTaskMetadataStringList(task, key) {
|
|
6752
|
+
const taskRecord = task;
|
|
6753
|
+
const topLevel = readStringList(taskRecord[key]);
|
|
6754
|
+
if (topLevel.length > 0)
|
|
6755
|
+
return topLevel;
|
|
6756
|
+
const metadata = isObjectRecord(task.metadata) ? task.metadata : null;
|
|
6757
|
+
const metadataList = readStringList(metadata?.[key]);
|
|
6758
|
+
if (metadataList.length > 0)
|
|
6759
|
+
return metadataList;
|
|
6760
|
+
if (key === "dependencies") {
|
|
6761
|
+
return readStringList(metadata?.deps);
|
|
6762
|
+
}
|
|
6763
|
+
return [];
|
|
6764
|
+
}
|
|
6765
|
+
function readTaskBlockingDependencyRefs(task) {
|
|
6766
|
+
return readTaskMetadataStringList(task, "dependencies");
|
|
6767
|
+
}
|
|
6768
|
+
function readTaskDependencyRefs(task) {
|
|
6769
|
+
return unique([
|
|
6770
|
+
...readTaskMetadataStringList(task, "dependencies"),
|
|
6771
|
+
...readTaskMetadataStringList(task, "parentChildDeps")
|
|
6772
|
+
]);
|
|
6773
|
+
}
|
|
6774
|
+
function readTaskSourceIssueId(task) {
|
|
6775
|
+
if (typeof task.sourceIssueId === "string" && task.sourceIssueId.length > 0) {
|
|
6776
|
+
return task.sourceIssueId;
|
|
6777
|
+
}
|
|
6778
|
+
const metadata = isObjectRecord(task.metadata) ? task.metadata : null;
|
|
6779
|
+
if (typeof metadata?.sourceIssueId === "string" && metadata.sourceIssueId.length > 0) {
|
|
6780
|
+
return metadata.sourceIssueId;
|
|
6781
|
+
}
|
|
6782
|
+
const rigMetadata = isObjectRecord(metadata?._rig) ? metadata._rig : null;
|
|
6783
|
+
return typeof rigMetadata?.sourceIssueId === "string" && rigMetadata.sourceIssueId.length > 0 ? rigMetadata.sourceIssueId : null;
|
|
6784
|
+
}
|
|
6785
|
+
function readTaskScope(task) {
|
|
6786
|
+
const taskRecord = task;
|
|
6787
|
+
const topLevel = readStringList(taskRecord.scope);
|
|
6788
|
+
if (topLevel.length > 0)
|
|
6789
|
+
return unique(topLevel.map((entry) => entry.trim()).filter((entry) => entry.length > 0));
|
|
6790
|
+
const metadata = isObjectRecord(task.metadata) ? task.metadata : null;
|
|
6791
|
+
const metadataScope = readStringList(metadata?.scope);
|
|
6792
|
+
if (metadataScope.length > 0)
|
|
6793
|
+
return unique(metadataScope.map((entry) => entry.trim()).filter((entry) => entry.length > 0));
|
|
6794
|
+
return unique([
|
|
6795
|
+
...readStringList(metadata?.files),
|
|
6796
|
+
...readStringList(metadata?.paths)
|
|
6797
|
+
].map((entry) => entry.trim()).filter((entry) => entry.length > 0));
|
|
6798
|
+
}
|
|
6799
|
+
function isScopeList(input) {
|
|
6800
|
+
return Array.isArray(input);
|
|
6801
|
+
}
|
|
6802
|
+
function normalizeScopeInput(input) {
|
|
6803
|
+
return isScopeList(input) ? unique(input.map((entry) => entry.trim()).filter((entry) => entry.length > 0)) : readTaskScope(input);
|
|
6804
|
+
}
|
|
6805
|
+
function disjointScope(left, right) {
|
|
6806
|
+
const leftScope = new Set(normalizeScopeInput(left));
|
|
6807
|
+
if (leftScope.size === 0)
|
|
6808
|
+
return true;
|
|
6809
|
+
return normalizeScopeInput(right).every((entry) => !leftScope.has(entry));
|
|
6810
|
+
}
|
|
6811
|
+
function resolveTaskReference(ref, tasksById, taskIdByExternalRef, taskIdBySourceIssueId) {
|
|
6812
|
+
if (tasksById.has(ref))
|
|
6813
|
+
return ref;
|
|
6814
|
+
return taskIdBySourceIssueId.get(ref) ?? taskIdByExternalRef.get(ref) ?? null;
|
|
6815
|
+
}
|
|
6816
|
+
function buildTaskReferenceIndex(tasks) {
|
|
6817
|
+
return {
|
|
6818
|
+
tasksById: new Map(tasks.map((task) => [task.id, task])),
|
|
6819
|
+
taskIdByExternalRef: new Map(tasks.flatMap((task) => task.externalId ? [[task.externalId, task.id]] : [])),
|
|
6820
|
+
taskIdBySourceIssueId: new Map(tasks.flatMap((task) => {
|
|
6821
|
+
const sourceIssueId = readTaskSourceIssueId(task);
|
|
6822
|
+
return sourceIssueId ? [[sourceIssueId, task.id]] : [];
|
|
6823
|
+
}))
|
|
6824
|
+
};
|
|
6825
|
+
}
|
|
6826
|
+
function computeTaskBlockingDepths(tasks) {
|
|
6827
|
+
const { tasksById, taskIdByExternalRef, taskIdBySourceIssueId } = buildTaskReferenceIndex(tasks);
|
|
6828
|
+
const memo = new Map;
|
|
6829
|
+
const visit = (taskId, stack) => {
|
|
6830
|
+
const cached = memo.get(taskId);
|
|
6831
|
+
if (cached !== undefined)
|
|
6832
|
+
return cached;
|
|
6833
|
+
if (stack.has(taskId))
|
|
6834
|
+
return 0;
|
|
6835
|
+
const task = tasksById.get(taskId);
|
|
6836
|
+
if (!task)
|
|
6837
|
+
return 0;
|
|
6838
|
+
stack.add(taskId);
|
|
6839
|
+
const blockers = readTaskBlockingDependencyRefs(task).map((ref) => resolveTaskReference(ref, tasksById, taskIdByExternalRef, taskIdBySourceIssueId)).filter((ref) => ref !== null && ref !== taskId);
|
|
6840
|
+
const depth = blockers.length === 0 ? 0 : Math.max(...blockers.map((blockerId) => visit(blockerId, stack) + 1));
|
|
6841
|
+
stack.delete(taskId);
|
|
6842
|
+
memo.set(taskId, depth);
|
|
6843
|
+
return depth;
|
|
6844
|
+
};
|
|
6845
|
+
for (const task of tasks) {
|
|
6846
|
+
visit(task.id, new Set);
|
|
6847
|
+
}
|
|
6848
|
+
return memo;
|
|
6849
|
+
}
|
|
6850
|
+
function isTaskTerminalStatus(status) {
|
|
6851
|
+
switch (status) {
|
|
6852
|
+
case "closed":
|
|
6853
|
+
case "completed":
|
|
6854
|
+
case "done":
|
|
6855
|
+
case "cancelled":
|
|
6856
|
+
case "canceled":
|
|
6857
|
+
return true;
|
|
6858
|
+
default:
|
|
6859
|
+
return false;
|
|
6860
|
+
}
|
|
6861
|
+
}
|
|
6862
|
+
function isTaskBlockedStatus(status) {
|
|
6863
|
+
return status === "blocked";
|
|
6864
|
+
}
|
|
6865
|
+
function isTaskRunnableStatus(status) {
|
|
6866
|
+
if (status === null || status === undefined || status === "")
|
|
6867
|
+
return true;
|
|
6868
|
+
if (isTaskTerminalStatus(status) || isTaskBlockedStatus(status))
|
|
6869
|
+
return false;
|
|
6870
|
+
switch (status) {
|
|
6871
|
+
case "ready":
|
|
6872
|
+
case "open":
|
|
6873
|
+
case "failed":
|
|
6874
|
+
return true;
|
|
6875
|
+
default:
|
|
6876
|
+
return false;
|
|
6877
|
+
}
|
|
6878
|
+
}
|
|
6879
|
+
function computeTaskDependencyBadges(tasks) {
|
|
6880
|
+
const index = buildTaskReferenceIndex(tasks);
|
|
6881
|
+
const blockingDepths = computeTaskBlockingDepths(tasks);
|
|
6882
|
+
const dependencyIdsByTask = new Map;
|
|
6883
|
+
const unresolvedRefsByTask = new Map;
|
|
6884
|
+
const blocksByTask = new Map;
|
|
6885
|
+
for (const task of tasks) {
|
|
6886
|
+
const dependencyIds = [];
|
|
6887
|
+
const unresolvedRefs = [];
|
|
6888
|
+
for (const ref of readTaskBlockingDependencyRefs(task)) {
|
|
6889
|
+
const dependencyId = resolveTaskReference(ref, index.tasksById, index.taskIdByExternalRef, index.taskIdBySourceIssueId);
|
|
6890
|
+
if (dependencyId && dependencyId !== task.id) {
|
|
6891
|
+
dependencyIds.push(dependencyId);
|
|
6892
|
+
const blocks = blocksByTask.get(dependencyId);
|
|
6893
|
+
if (blocks) {
|
|
6894
|
+
blocks.push(task.id);
|
|
6895
|
+
} else {
|
|
6896
|
+
blocksByTask.set(dependencyId, [task.id]);
|
|
6897
|
+
}
|
|
6898
|
+
} else {
|
|
6899
|
+
unresolvedRefs.push(ref);
|
|
6900
|
+
}
|
|
6901
|
+
}
|
|
6902
|
+
dependencyIdsByTask.set(task.id, unique(dependencyIds));
|
|
6903
|
+
unresolvedRefsByTask.set(task.id, unique(unresolvedRefs));
|
|
6904
|
+
}
|
|
6905
|
+
const summaries = new Map;
|
|
6906
|
+
for (const task of tasks) {
|
|
6907
|
+
const dependencyIds = dependencyIdsByTask.get(task.id) ?? [];
|
|
6908
|
+
const unresolvedDependencyRefs = unresolvedRefsByTask.get(task.id) ?? [];
|
|
6909
|
+
const blockedBy = dependencyIds.filter((dependencyId) => {
|
|
6910
|
+
const dependency = index.tasksById.get(dependencyId);
|
|
6911
|
+
return dependency ? !isTaskTerminalStatus(dependency.status) : false;
|
|
6912
|
+
});
|
|
6913
|
+
const blocks = unique(blocksByTask.get(task.id) ?? []);
|
|
6914
|
+
const blocked = isTaskBlockedStatus(task.status) || blockedBy.length > 0;
|
|
6915
|
+
const ready = isTaskRunnableStatus(task.status) && !blocked;
|
|
6916
|
+
const badges = [];
|
|
6917
|
+
if (blocked) {
|
|
6918
|
+
badges.push({
|
|
6919
|
+
kind: "blocked",
|
|
6920
|
+
label: blockedBy.length > 0 ? `blocked \xD7${blockedBy.length}` : "blocked",
|
|
6921
|
+
description: blockedBy.length > 0 ? `Waiting on ${blockedBy.join(", ")}.` : "Task source marks this task blocked.",
|
|
6922
|
+
...blockedBy.length > 0 ? { count: blockedBy.length } : {},
|
|
6923
|
+
taskIds: blockedBy
|
|
6924
|
+
});
|
|
6925
|
+
} else if (ready) {
|
|
6926
|
+
badges.push({
|
|
6927
|
+
kind: "ready",
|
|
6928
|
+
label: "ready",
|
|
6929
|
+
description: "No open dependencies block this task."
|
|
6930
|
+
});
|
|
6931
|
+
}
|
|
6932
|
+
if (dependencyIds.length > 0 || blocks.length > 0 || unresolvedDependencyRefs.length > 0) {
|
|
6933
|
+
badges.push({
|
|
6934
|
+
kind: "dependency",
|
|
6935
|
+
label: `deps ${dependencyIds.length}/${blocks.length}`,
|
|
6936
|
+
description: [
|
|
6937
|
+
dependencyIds.length > 0 ? `Depends on ${dependencyIds.join(", ")}.` : null,
|
|
6938
|
+
blocks.length > 0 ? `Blocks ${blocks.join(", ")}.` : null,
|
|
6939
|
+
unresolvedDependencyRefs.length > 0 ? `Unresolved refs: ${unresolvedDependencyRefs.join(", ")}.` : null
|
|
6940
|
+
].filter((part) => part !== null).join(" "),
|
|
6941
|
+
count: dependencyIds.length + blocks.length,
|
|
6942
|
+
taskIds: unique([...dependencyIds, ...blocks])
|
|
6943
|
+
});
|
|
6944
|
+
}
|
|
6945
|
+
summaries.set(task.id, {
|
|
6946
|
+
taskId: task.id,
|
|
6947
|
+
blockingDepth: blockingDepths.get(task.id) ?? 0,
|
|
6948
|
+
dependencyIds,
|
|
6949
|
+
unresolvedDependencyRefs,
|
|
6950
|
+
blockedBy,
|
|
6951
|
+
blocks,
|
|
6952
|
+
blocked,
|
|
6953
|
+
ready,
|
|
6954
|
+
dependencyCount: dependencyIds.length,
|
|
6955
|
+
dependentCount: blocks.length,
|
|
6956
|
+
badges
|
|
6957
|
+
});
|
|
6958
|
+
}
|
|
6959
|
+
return summaries;
|
|
6960
|
+
}
|
|
6961
|
+
var TASK_STATUSES = new Set([
|
|
6962
|
+
"draft",
|
|
6963
|
+
"open",
|
|
6964
|
+
"ready",
|
|
6965
|
+
"queued",
|
|
6966
|
+
"running",
|
|
6967
|
+
"in_progress",
|
|
6968
|
+
"under_review",
|
|
6969
|
+
"blocked",
|
|
6970
|
+
"unknown",
|
|
6971
|
+
"completed",
|
|
6972
|
+
"failed",
|
|
6973
|
+
"cancelled",
|
|
6974
|
+
"closed"
|
|
6975
|
+
]);
|
|
6976
|
+
function stringValue(value) {
|
|
6977
|
+
return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
|
|
6978
|
+
}
|
|
6979
|
+
function stringArray(value) {
|
|
6980
|
+
return Array.isArray(value) ? value.filter((entry) => typeof entry === "string" && entry.trim().length > 0).map((entry) => entry.trim()) : [];
|
|
6981
|
+
}
|
|
6982
|
+
function numberOrNull(value) {
|
|
6983
|
+
return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : null;
|
|
6984
|
+
}
|
|
6985
|
+
function metadataOf(task) {
|
|
6986
|
+
return isObjectRecord(task.metadata) ? task.metadata : {};
|
|
6987
|
+
}
|
|
6988
|
+
function normalizeTaskStatus(status) {
|
|
6989
|
+
const token = typeof status === "string" ? status.trim().toLowerCase() : "";
|
|
6990
|
+
if (token === "done")
|
|
6991
|
+
return "completed";
|
|
6992
|
+
if (token === "canceled")
|
|
6993
|
+
return "cancelled";
|
|
6994
|
+
return TASK_STATUSES.has(token) ? token : "unknown";
|
|
6995
|
+
}
|
|
6996
|
+
function toTaskDependencyProjection(task) {
|
|
6997
|
+
const metadata = metadataOf(task);
|
|
6998
|
+
return {
|
|
6999
|
+
id: String(task.id),
|
|
7000
|
+
title: stringValue(task.title),
|
|
7001
|
+
status: normalizeTaskStatus(task.status),
|
|
7002
|
+
priority: numberOrNull(task.priority),
|
|
7003
|
+
metadata,
|
|
7004
|
+
externalId: stringValue(task.externalId),
|
|
7005
|
+
sourceIssueId: stringValue(task.sourceIssueId),
|
|
7006
|
+
dependencies: stringArray(task.dependencies),
|
|
7007
|
+
parentChildDeps: stringArray(task.parentChildDeps),
|
|
7008
|
+
createdAt: stringValue(task.createdAt) ?? "",
|
|
7009
|
+
updatedAt: stringValue(task.updatedAt) ?? "",
|
|
7010
|
+
role: stringValue(task.role),
|
|
7011
|
+
scope: stringArray(task.scope),
|
|
7012
|
+
validationKeys: stringArray(task.validationKeys),
|
|
7013
|
+
labels: stringArray(task.labels),
|
|
7014
|
+
assignees: task.assignees,
|
|
7015
|
+
assignedTo: task.assignedTo
|
|
7016
|
+
};
|
|
7017
|
+
}
|
|
7018
|
+
function toTaskSummary(task, defaults = {}) {
|
|
7019
|
+
const projection = toTaskDependencyProjection(task);
|
|
7020
|
+
const metadata = metadataOf(task);
|
|
7021
|
+
const createdAt = stringValue(task.createdAt) ?? "1970-01-01T00:00:00.000Z";
|
|
7022
|
+
const updatedAt = stringValue(task.updatedAt) ?? createdAt;
|
|
7023
|
+
return {
|
|
7024
|
+
id: projection.id,
|
|
7025
|
+
workspaceId: stringValue(task.workspaceId) ?? defaults.workspaceId ?? "workspace",
|
|
7026
|
+
graphId: stringValue(task.graphId) ?? defaults.graphId ?? null,
|
|
7027
|
+
externalId: projection.externalId,
|
|
7028
|
+
title: projection.title ?? projection.id,
|
|
7029
|
+
description: stringValue(task.description) ?? stringValue(task.body) ?? "",
|
|
7030
|
+
status: projection.status,
|
|
7031
|
+
priority: numberOrNull(task.priority),
|
|
7032
|
+
role: projection.role,
|
|
7033
|
+
scope: [...projection.scope ?? []],
|
|
7034
|
+
validationKeys: [...projection.validationKeys ?? []],
|
|
7035
|
+
...projection.sourceIssueId ? { sourceIssueId: projection.sourceIssueId } : {},
|
|
7036
|
+
dependencies: [...projection.dependencies ?? []],
|
|
7037
|
+
parentChildDeps: [...projection.parentChildDeps ?? []],
|
|
7038
|
+
metadata,
|
|
7039
|
+
createdAt,
|
|
7040
|
+
updatedAt
|
|
7041
|
+
};
|
|
7042
|
+
}
|
|
7043
|
+
// packages/contracts/src/github.ts
|
|
7044
|
+
var GITHUB_PROVIDER_CAPABILITY_ID = "github.provider";
|
|
7045
|
+
// packages/contracts/src/doctor.ts
|
|
7046
|
+
var DOCTOR_RUNNER_CAPABILITY_ID = "doctor.runner";
|
|
7047
|
+
function doctorLevelToStatus(level) {
|
|
7048
|
+
return level === "ok" ? "pass" : level;
|
|
7049
|
+
}
|
|
7050
|
+
function countDoctorFailures(checks) {
|
|
7051
|
+
return checks.filter((entry) => (entry.status ?? doctorLevelToStatus(entry.level ?? "warn")) === "fail").length;
|
|
7052
|
+
}
|
|
6766
7053
|
export {
|
|
7054
|
+
toTaskSummary,
|
|
7055
|
+
toTaskDependencyProjection,
|
|
6767
7056
|
timelineEntriesFromCustomEntries,
|
|
7057
|
+
strictMergeHeadShaFromGate,
|
|
6768
7058
|
sessionIdFromSessionFile,
|
|
6769
|
-
|
|
7059
|
+
resolveTaskReference,
|
|
6770
7060
|
reduceRunJournal,
|
|
7061
|
+
readTaskSourceIssueId,
|
|
7062
|
+
readTaskScope,
|
|
7063
|
+
readTaskMetadataStringList,
|
|
7064
|
+
readTaskDependencyRefs,
|
|
7065
|
+
readTaskBlockingDependencyRefs,
|
|
6771
7066
|
projectWorkflowEntries,
|
|
6772
7067
|
projectCollabWorkflowMarker,
|
|
6773
7068
|
parseWorkflowTaskSelected,
|
|
@@ -6781,14 +7076,19 @@ export {
|
|
|
6781
7076
|
parseResumeSentinel,
|
|
6782
7077
|
parsePauseSentinel,
|
|
6783
7078
|
parseInboxResolutionSentinel,
|
|
7079
|
+
normalizeTaskStatus,
|
|
6784
7080
|
normalizeRunStatusToken,
|
|
6785
7081
|
latestTimelineEntriesFromCustomEntries,
|
|
7082
|
+
latestRunByTaskId,
|
|
6786
7083
|
isTerminalRunStatus,
|
|
7084
|
+
isTaskTerminalStatus,
|
|
6787
7085
|
isRunSessionCustomType,
|
|
6788
7086
|
isOperatorActiveRunStatus,
|
|
6789
7087
|
isActiveRunStatus,
|
|
6790
7088
|
helpCatalog,
|
|
6791
7089
|
foldRunSessionEntries,
|
|
7090
|
+
doctorLevelToStatus,
|
|
7091
|
+
disjointScope,
|
|
6792
7092
|
decodeRunJournalEvent,
|
|
6793
7093
|
createWorkflowTaskSelected,
|
|
6794
7094
|
createWorkflowTargetSelected,
|
|
@@ -6797,9 +7097,13 @@ export {
|
|
|
6797
7097
|
createWorkflowOperatorNote,
|
|
6798
7098
|
createWorkflowInboxResolved,
|
|
6799
7099
|
createWorkflowInboxRequested,
|
|
7100
|
+
countDoctorFailures,
|
|
7101
|
+
computeTaskDependencyBadges,
|
|
7102
|
+
computeTaskBlockingDepths,
|
|
6800
7103
|
collectResolvedInboxRequests,
|
|
6801
7104
|
collectPendingInboxRequests,
|
|
6802
7105
|
canTransitionRunStatus,
|
|
7106
|
+
buildTaskReferenceIndex,
|
|
6803
7107
|
buildStopSentinel,
|
|
6804
7108
|
buildResumeSentinel,
|
|
6805
7109
|
buildPauseSentinel,
|
|
@@ -6899,6 +7203,7 @@ export {
|
|
|
6899
7203
|
TYPE_FOR_CUSTOM,
|
|
6900
7204
|
TOP_LEVEL_SECTIONS,
|
|
6901
7205
|
TERMINAL_RUN_STATUSES,
|
|
7206
|
+
TASK_VERIFY_CAPABILITY_ID,
|
|
6902
7207
|
SupervisorStoppedEvent,
|
|
6903
7208
|
SupervisorStopReason,
|
|
6904
7209
|
SupervisorStatus,
|
|
@@ -6928,6 +7233,7 @@ export {
|
|
|
6928
7233
|
StageAllowResult,
|
|
6929
7234
|
Stage,
|
|
6930
7235
|
SkillRegistration,
|
|
7236
|
+
SessionExtensionRegistration,
|
|
6931
7237
|
ServiceFabricWorkspaceInput,
|
|
6932
7238
|
ServiceFabricUpResult,
|
|
6933
7239
|
ServiceFabricUpInput,
|
|
@@ -7128,6 +7434,7 @@ export {
|
|
|
7128
7434
|
RemoteConnectCommand,
|
|
7129
7435
|
RemoteAddIterationsCommand,
|
|
7130
7436
|
RUN_STATUS_TRANSITIONS,
|
|
7437
|
+
RUNTIME_INSTRUCTION_SERVICE_CAPABILITY_ID,
|
|
7131
7438
|
RIG_WS_METHODS,
|
|
7132
7439
|
RIG_WS_CHANNELS,
|
|
7133
7440
|
RIG_WORKFLOW_TASK_SELECTED,
|
|
@@ -7137,9 +7444,11 @@ export {
|
|
|
7137
7444
|
RIG_WORKFLOW_OPERATOR_NOTE,
|
|
7138
7445
|
RIG_WORKFLOW_INBOX_RESOLVED,
|
|
7139
7446
|
RIG_WORKFLOW_INBOX_REQUESTED,
|
|
7447
|
+
RIG_SUPERVISOR_PANEL_ID,
|
|
7140
7448
|
RIG_STOP_SENTINEL_END,
|
|
7141
7449
|
RIG_STOP_SENTINEL,
|
|
7142
7450
|
RIG_RUN_TIMELINE_ENTRY,
|
|
7451
|
+
RIG_RUN_STOP_PANEL_ACTION,
|
|
7143
7452
|
RIG_RUN_STEERING,
|
|
7144
7453
|
RIG_RUN_STATUS_CHANGED,
|
|
7145
7454
|
RIG_RUN_STALL_DETECTED,
|
|
@@ -7158,6 +7467,7 @@ export {
|
|
|
7158
7467
|
RIG_PAUSE_SENTINEL,
|
|
7159
7468
|
RIG_INBOX_RESOLUTION_SENTINEL,
|
|
7160
7469
|
RIG_CONTROL_SENTINEL_END,
|
|
7470
|
+
RIG_CAPABILITY_PANEL_SLOT,
|
|
7161
7471
|
REASONING_EFFORT_OPTIONS_BY_PROVIDER,
|
|
7162
7472
|
QueueEntry,
|
|
7163
7473
|
PullRequestConfig,
|
|
@@ -7209,7 +7519,6 @@ export {
|
|
|
7209
7519
|
PolicyMode,
|
|
7210
7520
|
PolicyDecisionSummary,
|
|
7211
7521
|
PolicyDecision,
|
|
7212
|
-
PluginMeta,
|
|
7213
7522
|
PluginContributes,
|
|
7214
7523
|
PlanningConfig,
|
|
7215
7524
|
PlanTask,
|
|
@@ -7259,16 +7568,18 @@ export {
|
|
|
7259
7568
|
ORCHESTRATION_WS_CHANNELS,
|
|
7260
7569
|
OPERATOR_INACTIVE_RUN_STATUSES,
|
|
7261
7570
|
NonNegativeInt,
|
|
7571
|
+
NO_MATCH_RETRIEVAL_CANONICAL_KEY,
|
|
7262
7572
|
MissingCapability,
|
|
7263
7573
|
MessageId,
|
|
7264
7574
|
MergeConfig,
|
|
7265
7575
|
MODEL_SLUG_ALIASES_BY_PROVIDER,
|
|
7266
7576
|
MODEL_OPTIONS_BY_PROVIDER,
|
|
7577
|
+
MEMORY_SERVICE_CAPABILITY_ID,
|
|
7267
7578
|
MAX_WHEN_EXPRESSION_DEPTH,
|
|
7268
7579
|
MAX_SCRIPT_ID_LENGTH,
|
|
7269
7580
|
MAX_KEYBINDING_VALUE_LENGTH,
|
|
7270
7581
|
MAX_KEYBINDINGS_COUNT,
|
|
7271
|
-
|
|
7582
|
+
MANAGED_REPO_SERVICE_CAPABILITY_ID,
|
|
7272
7583
|
KeybindingsConfig,
|
|
7273
7584
|
KeybindingWhenNode,
|
|
7274
7585
|
KeybindingShortcut,
|
|
@@ -7285,6 +7596,7 @@ export {
|
|
|
7285
7596
|
IsolationMode,
|
|
7286
7597
|
IsoDateTime,
|
|
7287
7598
|
InsertStageMutation,
|
|
7599
|
+
ISOLATION_BACKEND_CAPABILITY_ID,
|
|
7288
7600
|
HookToolInput,
|
|
7289
7601
|
HookResult,
|
|
7290
7602
|
HookRegistration,
|
|
@@ -7315,6 +7627,7 @@ export {
|
|
|
7315
7627
|
GitCreateBranchInput,
|
|
7316
7628
|
GitCheckoutInput,
|
|
7317
7629
|
GitBranch,
|
|
7630
|
+
GITHUB_PROVIDER_CAPABILITY_ID,
|
|
7318
7631
|
FunctionalRequirement,
|
|
7319
7632
|
EventId,
|
|
7320
7633
|
EpicRollup,
|
|
@@ -7351,6 +7664,7 @@ export {
|
|
|
7351
7664
|
DependencyGraphModel,
|
|
7352
7665
|
DependencyEdgeType,
|
|
7353
7666
|
DependencyEdge,
|
|
7667
|
+
DOCTOR_RUNNER_CAPABILITY_ID,
|
|
7354
7668
|
DEFAULT_TERMINAL_ID,
|
|
7355
7669
|
DEFAULT_RUNTIME_MODE,
|
|
7356
7670
|
DEFAULT_REASONING_EFFORT_BY_PROVIDER,
|
|
@@ -7387,6 +7701,7 @@ export {
|
|
|
7387
7701
|
CanonicalRequestType,
|
|
7388
7702
|
CanonicalItemType,
|
|
7389
7703
|
CUSTOM_TYPE_FOR,
|
|
7704
|
+
COMPLETION_VERIFICATION_CAPABILITY_ID,
|
|
7390
7705
|
CODEX_REASONING_EFFORT_OPTIONS,
|
|
7391
7706
|
CLI_OUTPUT_VERSION,
|
|
7392
7707
|
BootResultDescriptor,
|
|
@@ -7394,6 +7709,7 @@ export {
|
|
|
7394
7709
|
BlockerClassifierRegistration,
|
|
7395
7710
|
BlockerClassification,
|
|
7396
7711
|
BlockerClass,
|
|
7712
|
+
BROWSER_CONTRACT_SERVICE_CAPABILITY_ID,
|
|
7397
7713
|
AutomationConfig,
|
|
7398
7714
|
AssistantDeliveryMode,
|
|
7399
7715
|
AssigneeRollup,
|