@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.
Files changed (40) hide show
  1. package/dist/index.cjs +407 -91
  2. package/dist/index.mjs +407 -91
  3. package/dist/src/browser.d.ts +50 -0
  4. package/dist/src/browser.js +6 -0
  5. package/dist/src/config.d.ts +4 -0
  6. package/dist/src/config.js +6 -14
  7. package/dist/src/control-plane-types.d.ts +283 -0
  8. package/dist/src/control-plane-types.js +29 -0
  9. package/dist/src/doctor.d.ts +27 -0
  10. package/dist/src/doctor.js +14 -0
  11. package/dist/src/github.d.ts +103 -0
  12. package/dist/src/github.js +6 -0
  13. package/dist/src/help-catalog.js +1 -1
  14. package/dist/src/index.d.ts +11 -0
  15. package/dist/src/index.js +407 -91
  16. package/dist/src/isolation.d.ts +21 -0
  17. package/dist/src/isolation.js +6 -0
  18. package/dist/src/kernel.d.ts +3 -35
  19. package/dist/src/kernel.js +0 -15
  20. package/dist/src/lifecycle-capabilities.d.ts +29 -0
  21. package/dist/src/lifecycle-capabilities.js +8 -0
  22. package/dist/src/managed-repos.d.ts +73 -0
  23. package/dist/src/managed-repos.js +6 -0
  24. package/dist/src/memory.d.ts +151 -0
  25. package/dist/src/memory.js +8 -0
  26. package/dist/src/panel-protocol.d.ts +17 -0
  27. package/dist/src/panel-protocol.js +10 -0
  28. package/dist/src/plugin-hooks.js +6 -14
  29. package/dist/src/plugin.d.ts +13 -0
  30. package/dist/src/plugin.js +7 -14
  31. package/dist/src/provider-instructions.d.ts +19 -0
  32. package/dist/src/provider-instructions.js +6 -0
  33. package/dist/src/run-journal.d.ts +1 -1
  34. package/dist/src/run-record.d.ts +11 -0
  35. package/dist/src/run-record.js +16 -0
  36. package/dist/src/supervisor-journal.d.ts +0 -1
  37. package/dist/src/supervisor-journal.js +0 -74
  38. package/dist/src/task-graph-primitives.d.ts +68 -0
  39. package/dist/src/task-graph-primitives.js +319 -0
  40. 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 through @rig/client and print summary, JSON, or DOT.", primary: true }],
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
- reduceSupervisorJournal,
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
- LoadedPluginDescriptor,
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,