@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.cjs CHANGED
@@ -40,10 +40,18 @@ var __export = (target, all) => {
40
40
  // packages/contracts/src/index.ts
41
41
  var exports_src = {};
42
42
  __export(exports_src, {
43
+ toTaskSummary: () => toTaskSummary,
44
+ toTaskDependencyProjection: () => toTaskDependencyProjection,
43
45
  timelineEntriesFromCustomEntries: () => timelineEntriesFromCustomEntries,
46
+ strictMergeHeadShaFromGate: () => strictMergeHeadShaFromGate,
44
47
  sessionIdFromSessionFile: () => sessionIdFromSessionFile,
45
- reduceSupervisorJournal: () => reduceSupervisorJournal,
48
+ resolveTaskReference: () => resolveTaskReference,
46
49
  reduceRunJournal: () => reduceRunJournal,
50
+ readTaskSourceIssueId: () => readTaskSourceIssueId,
51
+ readTaskScope: () => readTaskScope,
52
+ readTaskMetadataStringList: () => readTaskMetadataStringList,
53
+ readTaskDependencyRefs: () => readTaskDependencyRefs,
54
+ readTaskBlockingDependencyRefs: () => readTaskBlockingDependencyRefs,
47
55
  projectWorkflowEntries: () => projectWorkflowEntries,
48
56
  projectCollabWorkflowMarker: () => projectCollabWorkflowMarker,
49
57
  parseWorkflowTaskSelected: () => parseWorkflowTaskSelected,
@@ -57,14 +65,19 @@ __export(exports_src, {
57
65
  parseResumeSentinel: () => parseResumeSentinel,
58
66
  parsePauseSentinel: () => parsePauseSentinel,
59
67
  parseInboxResolutionSentinel: () => parseInboxResolutionSentinel,
68
+ normalizeTaskStatus: () => normalizeTaskStatus,
60
69
  normalizeRunStatusToken: () => normalizeRunStatusToken,
61
70
  latestTimelineEntriesFromCustomEntries: () => latestTimelineEntriesFromCustomEntries,
71
+ latestRunByTaskId: () => latestRunByTaskId,
62
72
  isTerminalRunStatus: () => isTerminalRunStatus,
73
+ isTaskTerminalStatus: () => isTaskTerminalStatus,
63
74
  isRunSessionCustomType: () => isRunSessionCustomType,
64
75
  isOperatorActiveRunStatus: () => isOperatorActiveRunStatus,
65
76
  isActiveRunStatus: () => isActiveRunStatus,
66
77
  helpCatalog: () => helpCatalog,
67
78
  foldRunSessionEntries: () => foldRunSessionEntries,
79
+ doctorLevelToStatus: () => doctorLevelToStatus,
80
+ disjointScope: () => disjointScope,
68
81
  decodeRunJournalEvent: () => decodeRunJournalEvent,
69
82
  createWorkflowTaskSelected: () => createWorkflowTaskSelected,
70
83
  createWorkflowTargetSelected: () => createWorkflowTargetSelected,
@@ -73,9 +86,13 @@ __export(exports_src, {
73
86
  createWorkflowOperatorNote: () => createWorkflowOperatorNote,
74
87
  createWorkflowInboxResolved: () => createWorkflowInboxResolved,
75
88
  createWorkflowInboxRequested: () => createWorkflowInboxRequested,
89
+ countDoctorFailures: () => countDoctorFailures,
90
+ computeTaskDependencyBadges: () => computeTaskDependencyBadges,
91
+ computeTaskBlockingDepths: () => computeTaskBlockingDepths,
76
92
  collectResolvedInboxRequests: () => collectResolvedInboxRequests,
77
93
  collectPendingInboxRequests: () => collectPendingInboxRequests,
78
94
  canTransitionRunStatus: () => canTransitionRunStatus,
95
+ buildTaskReferenceIndex: () => buildTaskReferenceIndex,
79
96
  buildStopSentinel: () => buildStopSentinel,
80
97
  buildResumeSentinel: () => buildResumeSentinel,
81
98
  buildPauseSentinel: () => buildPauseSentinel,
@@ -175,6 +192,7 @@ __export(exports_src, {
175
192
  TYPE_FOR_CUSTOM: () => TYPE_FOR_CUSTOM,
176
193
  TOP_LEVEL_SECTIONS: () => TOP_LEVEL_SECTIONS,
177
194
  TERMINAL_RUN_STATUSES: () => TERMINAL_RUN_STATUSES,
195
+ TASK_VERIFY_CAPABILITY_ID: () => TASK_VERIFY_CAPABILITY_ID,
178
196
  SupervisorStoppedEvent: () => SupervisorStoppedEvent,
179
197
  SupervisorStopReason: () => SupervisorStopReason,
180
198
  SupervisorStatus: () => SupervisorStatus,
@@ -204,6 +222,7 @@ __export(exports_src, {
204
222
  StageAllowResult: () => StageAllowResult,
205
223
  Stage: () => Stage,
206
224
  SkillRegistration: () => SkillRegistration,
225
+ SessionExtensionRegistration: () => SessionExtensionRegistration,
207
226
  ServiceFabricWorkspaceInput: () => ServiceFabricWorkspaceInput,
208
227
  ServiceFabricUpResult: () => ServiceFabricUpResult,
209
228
  ServiceFabricUpInput: () => ServiceFabricUpInput,
@@ -404,6 +423,7 @@ __export(exports_src, {
404
423
  RemoteConnectCommand: () => RemoteConnectCommand,
405
424
  RemoteAddIterationsCommand: () => RemoteAddIterationsCommand,
406
425
  RUN_STATUS_TRANSITIONS: () => RUN_STATUS_TRANSITIONS,
426
+ RUNTIME_INSTRUCTION_SERVICE_CAPABILITY_ID: () => RUNTIME_INSTRUCTION_SERVICE_CAPABILITY_ID,
407
427
  RIG_WS_METHODS: () => RIG_WS_METHODS,
408
428
  RIG_WS_CHANNELS: () => RIG_WS_CHANNELS,
409
429
  RIG_WORKFLOW_TASK_SELECTED: () => RIG_WORKFLOW_TASK_SELECTED,
@@ -413,9 +433,11 @@ __export(exports_src, {
413
433
  RIG_WORKFLOW_OPERATOR_NOTE: () => RIG_WORKFLOW_OPERATOR_NOTE,
414
434
  RIG_WORKFLOW_INBOX_RESOLVED: () => RIG_WORKFLOW_INBOX_RESOLVED,
415
435
  RIG_WORKFLOW_INBOX_REQUESTED: () => RIG_WORKFLOW_INBOX_REQUESTED,
436
+ RIG_SUPERVISOR_PANEL_ID: () => RIG_SUPERVISOR_PANEL_ID,
416
437
  RIG_STOP_SENTINEL_END: () => RIG_STOP_SENTINEL_END,
417
438
  RIG_STOP_SENTINEL: () => RIG_STOP_SENTINEL,
418
439
  RIG_RUN_TIMELINE_ENTRY: () => RIG_RUN_TIMELINE_ENTRY,
440
+ RIG_RUN_STOP_PANEL_ACTION: () => RIG_RUN_STOP_PANEL_ACTION,
419
441
  RIG_RUN_STEERING: () => RIG_RUN_STEERING,
420
442
  RIG_RUN_STATUS_CHANGED: () => RIG_RUN_STATUS_CHANGED,
421
443
  RIG_RUN_STALL_DETECTED: () => RIG_RUN_STALL_DETECTED,
@@ -434,6 +456,7 @@ __export(exports_src, {
434
456
  RIG_PAUSE_SENTINEL: () => RIG_PAUSE_SENTINEL,
435
457
  RIG_INBOX_RESOLUTION_SENTINEL: () => RIG_INBOX_RESOLUTION_SENTINEL,
436
458
  RIG_CONTROL_SENTINEL_END: () => RIG_CONTROL_SENTINEL_END,
459
+ RIG_CAPABILITY_PANEL_SLOT: () => RIG_CAPABILITY_PANEL_SLOT,
437
460
  REASONING_EFFORT_OPTIONS_BY_PROVIDER: () => REASONING_EFFORT_OPTIONS_BY_PROVIDER,
438
461
  QueueEntry: () => QueueEntry,
439
462
  PullRequestConfig: () => PullRequestConfig,
@@ -485,7 +508,6 @@ __export(exports_src, {
485
508
  PolicyMode: () => PolicyMode,
486
509
  PolicyDecisionSummary: () => PolicyDecisionSummary,
487
510
  PolicyDecision: () => PolicyDecision,
488
- PluginMeta: () => PluginMeta,
489
511
  PluginContributes: () => PluginContributes,
490
512
  PlanningConfig: () => PlanningConfig,
491
513
  PlanTask: () => PlanTask,
@@ -535,16 +557,18 @@ __export(exports_src, {
535
557
  ORCHESTRATION_WS_CHANNELS: () => ORCHESTRATION_WS_CHANNELS,
536
558
  OPERATOR_INACTIVE_RUN_STATUSES: () => OPERATOR_INACTIVE_RUN_STATUSES,
537
559
  NonNegativeInt: () => NonNegativeInt,
560
+ NO_MATCH_RETRIEVAL_CANONICAL_KEY: () => NO_MATCH_RETRIEVAL_CANONICAL_KEY,
538
561
  MissingCapability: () => MissingCapability,
539
562
  MessageId: () => MessageId,
540
563
  MergeConfig: () => MergeConfig,
541
564
  MODEL_SLUG_ALIASES_BY_PROVIDER: () => MODEL_SLUG_ALIASES_BY_PROVIDER,
542
565
  MODEL_OPTIONS_BY_PROVIDER: () => MODEL_OPTIONS_BY_PROVIDER,
566
+ MEMORY_SERVICE_CAPABILITY_ID: () => MEMORY_SERVICE_CAPABILITY_ID,
543
567
  MAX_WHEN_EXPRESSION_DEPTH: () => MAX_WHEN_EXPRESSION_DEPTH,
544
568
  MAX_SCRIPT_ID_LENGTH: () => MAX_SCRIPT_ID_LENGTH,
545
569
  MAX_KEYBINDING_VALUE_LENGTH: () => MAX_KEYBINDING_VALUE_LENGTH,
546
570
  MAX_KEYBINDINGS_COUNT: () => MAX_KEYBINDINGS_COUNT,
547
- LoadedPluginDescriptor: () => LoadedPluginDescriptor,
571
+ MANAGED_REPO_SERVICE_CAPABILITY_ID: () => MANAGED_REPO_SERVICE_CAPABILITY_ID,
548
572
  KeybindingsConfig: () => KeybindingsConfig,
549
573
  KeybindingWhenNode: () => KeybindingWhenNode,
550
574
  KeybindingShortcut: () => KeybindingShortcut,
@@ -561,6 +585,7 @@ __export(exports_src, {
561
585
  IsolationMode: () => IsolationMode,
562
586
  IsoDateTime: () => IsoDateTime,
563
587
  InsertStageMutation: () => InsertStageMutation,
588
+ ISOLATION_BACKEND_CAPABILITY_ID: () => ISOLATION_BACKEND_CAPABILITY_ID,
564
589
  HookToolInput: () => HookToolInput,
565
590
  HookResult: () => HookResult,
566
591
  HookRegistration: () => HookRegistration,
@@ -591,6 +616,7 @@ __export(exports_src, {
591
616
  GitCreateBranchInput: () => GitCreateBranchInput,
592
617
  GitCheckoutInput: () => GitCheckoutInput,
593
618
  GitBranch: () => GitBranch,
619
+ GITHUB_PROVIDER_CAPABILITY_ID: () => GITHUB_PROVIDER_CAPABILITY_ID,
594
620
  FunctionalRequirement: () => FunctionalRequirement,
595
621
  EventId: () => EventId,
596
622
  EpicRollup: () => EpicRollup,
@@ -627,6 +653,7 @@ __export(exports_src, {
627
653
  DependencyGraphModel: () => DependencyGraphModel,
628
654
  DependencyEdgeType: () => DependencyEdgeType,
629
655
  DependencyEdge: () => DependencyEdge,
656
+ DOCTOR_RUNNER_CAPABILITY_ID: () => DOCTOR_RUNNER_CAPABILITY_ID,
630
657
  DEFAULT_TERMINAL_ID: () => DEFAULT_TERMINAL_ID,
631
658
  DEFAULT_RUNTIME_MODE: () => DEFAULT_RUNTIME_MODE,
632
659
  DEFAULT_REASONING_EFFORT_BY_PROVIDER: () => DEFAULT_REASONING_EFFORT_BY_PROVIDER,
@@ -663,6 +690,7 @@ __export(exports_src, {
663
690
  CanonicalRequestType: () => CanonicalRequestType,
664
691
  CanonicalItemType: () => CanonicalItemType,
665
692
  CUSTOM_TYPE_FOR: () => CUSTOM_TYPE_FOR,
693
+ COMPLETION_VERIFICATION_CAPABILITY_ID: () => COMPLETION_VERIFICATION_CAPABILITY_ID,
666
694
  CODEX_REASONING_EFFORT_OPTIONS: () => CODEX_REASONING_EFFORT_OPTIONS,
667
695
  CLI_OUTPUT_VERSION: () => CLI_OUTPUT_VERSION,
668
696
  BootResultDescriptor: () => BootResultDescriptor,
@@ -670,6 +698,7 @@ __export(exports_src, {
670
698
  BlockerClassifierRegistration: () => BlockerClassifierRegistration,
671
699
  BlockerClassification: () => BlockerClassification,
672
700
  BlockerClass: () => BlockerClass,
701
+ BROWSER_CONTRACT_SERVICE_CAPABILITY_ID: () => BROWSER_CONTRACT_SERVICE_CAPABILITY_ID,
673
702
  AutomationConfig: () => AutomationConfig,
674
703
  AssistantDeliveryMode: () => AssistantDeliveryMode,
675
704
  AssigneeRollup: () => AssigneeRollup,
@@ -3207,6 +3236,19 @@ function latestTimelineEntriesFromCustomEntries(entries, limit) {
3207
3236
  timeline.reverse();
3208
3237
  return timeline;
3209
3238
  }
3239
+ // packages/contracts/src/run-record.ts
3240
+ function latestRunByTaskId(runs) {
3241
+ const byTask = new Map;
3242
+ const stamp = (run) => Date.parse(run.updatedAt ?? run.startedAt ?? "") || 0;
3243
+ for (const run of runs) {
3244
+ if (!run.taskId)
3245
+ continue;
3246
+ const current = byTask.get(run.taskId);
3247
+ if (!current || stamp(run) >= stamp(current))
3248
+ byTask.set(run.taskId, run);
3249
+ }
3250
+ return byTask;
3251
+ }
3210
3252
  // packages/contracts/src/run-status.ts
3211
3253
  var OPERATOR_INACTIVE_RUN_STATUSES = new Set([
3212
3254
  "completed",
@@ -3312,19 +3354,6 @@ var CapabilityReplacementSpec = import_effect10.Schema.Union([
3312
3354
  CapabilityReplacement,
3313
3355
  TrimmedNonEmptyString
3314
3356
  ]);
3315
- var PluginMeta = import_effect10.Schema.Struct({
3316
- id: TrimmedNonEmptyString,
3317
- version: TrimmedNonEmptyString,
3318
- provides: import_effect10.Schema.Array(CapabilityTag),
3319
- requires: import_effect10.Schema.optional(import_effect10.Schema.Array(CapabilityTag)),
3320
- replaces: import_effect10.Schema.optional(import_effect10.Schema.Array(CapabilityReplacementSpec))
3321
- });
3322
- var LoadedPluginDescriptor = import_effect10.Schema.Struct({
3323
- meta: PluginMeta,
3324
- provides: import_effect10.Schema.Array(CapabilityTag),
3325
- contributes: import_effect10.Schema.Unknown,
3326
- runtime: import_effect10.Schema.Unknown
3327
- });
3328
3357
  var KernelReplacementGrant = import_effect10.Schema.Struct({
3329
3358
  pluginId: TrimmedNonEmptyString,
3330
3359
  grantedBy: import_effect10.Schema.optional(TrimmedNonEmptyString),
@@ -3490,6 +3519,10 @@ var BlockerClassifierRegistration = import_effect11.Schema.Struct({
3490
3519
  description: import_effect11.Schema.optional(import_effect11.Schema.String),
3491
3520
  priority: import_effect11.Schema.optional(import_effect11.Schema.Number)
3492
3521
  });
3522
+ var SessionExtensionRegistration = import_effect11.Schema.Struct({
3523
+ id: import_effect11.Schema.String,
3524
+ description: import_effect11.Schema.optional(import_effect11.Schema.String)
3525
+ });
3493
3526
  var PluginContributes = import_effect11.Schema.Struct({
3494
3527
  validators: import_effect11.Schema.optional(import_effect11.Schema.Array(ValidatorRegistration)),
3495
3528
  hooks: import_effect11.Schema.optional(import_effect11.Schema.Array(HookRegistration)),
@@ -3503,7 +3536,8 @@ var PluginContributes = import_effect11.Schema.Struct({
3503
3536
  stageMutations: import_effect11.Schema.optional(import_effect11.Schema.Array(StageMutation)),
3504
3537
  capabilities: import_effect11.Schema.optional(import_effect11.Schema.Array(ProductCapabilityRegistration)),
3505
3538
  panels: import_effect11.Schema.optional(import_effect11.Schema.Array(PanelRegistration)),
3506
- blockerClassifiers: import_effect11.Schema.optional(import_effect11.Schema.Array(BlockerClassifierRegistration))
3539
+ blockerClassifiers: import_effect11.Schema.optional(import_effect11.Schema.Array(BlockerClassifierRegistration)),
3540
+ sessionExtensions: import_effect11.Schema.optional(import_effect11.Schema.Array(SessionExtensionRegistration))
3507
3541
  });
3508
3542
  var RigPlugin = import_effect11.Schema.Struct({
3509
3543
  name: import_effect11.Schema.String,
@@ -3651,79 +3685,6 @@ var SupervisorProjection = import_effect13.Schema.Struct({
3651
3685
  closures: import_effect13.Schema.Array(TaskClosureSummary),
3652
3686
  anomalies: import_effect13.Schema.Array(import_effect13.Schema.String)
3653
3687
  });
3654
- function reduceSupervisorJournal(events) {
3655
- let processed = 0;
3656
- let succeeded = 0;
3657
- let failed = 0;
3658
- let skipped = 0;
3659
- let current = null;
3660
- let idleReason = null;
3661
- let stopReason = null;
3662
- let status = "running";
3663
- let plannedOrder = [];
3664
- let selectionPolicy = null;
3665
- const concurrency = null;
3666
- const closures = [];
3667
- const anomalies = [];
3668
- for (const event of events) {
3669
- switch (event.kind) {
3670
- case "supervisor.started":
3671
- status = "running";
3672
- break;
3673
- case "supervisor.selection-planned":
3674
- plannedOrder = [...event.taskIds];
3675
- selectionPolicy = event.policy;
3676
- break;
3677
- case "supervisor.dispatch-started":
3678
- break;
3679
- case "supervisor.dispatch-confirmed":
3680
- current = { taskId: event.taskId, runId: event.runId };
3681
- break;
3682
- case "supervisor.dispatch":
3683
- current = { taskId: event.taskId, runId: event.runId };
3684
- break;
3685
- case "supervisor.outcome":
3686
- processed += 1;
3687
- if (event.failed) {
3688
- failed += 1;
3689
- } else {
3690
- succeeded += 1;
3691
- }
3692
- if (event.closure) {
3693
- closures.push(event.closure);
3694
- }
3695
- if (current?.runId === event.runId) {
3696
- current = null;
3697
- } else if (current !== null) {
3698
- anomalies.push(`outcome for ${event.runId} did not match current ${current.runId}`);
3699
- }
3700
- break;
3701
- case "supervisor.skipped":
3702
- processed += 1;
3703
- skipped += 1;
3704
- break;
3705
- case "supervisor.idle":
3706
- status = "idle";
3707
- idleReason = event.reason;
3708
- break;
3709
- case "supervisor.stopped":
3710
- status = "stopped";
3711
- stopReason = event.reason;
3712
- current = null;
3713
- break;
3714
- case "supervisor.finished":
3715
- status = "finished";
3716
- processed = event.processed;
3717
- succeeded = event.succeeded;
3718
- failed = event.failed;
3719
- skipped = event.skipped ?? skipped;
3720
- idleReason = event.idleReason;
3721
- current = null;
3722
- break;
3723
- }
3724
- }
3725
- return { status, processed, succeeded, failed, skipped, current, plannedOrder, selectionPolicy, concurrency, idleReason, stopReason, closures, anomalies };
3726
- }
3727
3688
 
3728
3689
  // packages/contracts/src/config.ts
3729
3690
  var WorkspaceIsolation = import_effect14.Schema.Literals([
@@ -7032,7 +6993,7 @@ var PRIMARY_GROUPS = [
7032
6993
  name: "graph",
7033
6994
  summary: "Workspace dependency graph.",
7034
6995
  usage: ["rig graph [--json|--dot]"],
7035
- commands: [{ command: "[--json|--dot]", description: "Build the dependency graph through @rig/client and print summary, JSON, or DOT.", primary: true }],
6996
+ commands: [{ command: "[--json|--dot]", description: "Build the workspace dependency graph and print summary, JSON, or DOT.", primary: true }],
7036
6997
  examples: ["rig graph", "rig graph --json", "rig graph --dot"]
7037
6998
  },
7038
6999
  {
@@ -7453,4 +7414,359 @@ var WorkspaceRollups = import_effect35.Schema.Struct({
7453
7414
  assignees: import_effect35.Schema.Array(AssigneeRollup),
7454
7415
  generatedAt: IsoDateTime
7455
7416
  });
7417
+ // packages/contracts/src/panel-protocol.ts
7418
+ var RIG_RUN_STOP_PANEL_ACTION = "rig-run:stop";
7419
+ var RIG_CAPABILITY_PANEL_SLOT = "capability";
7420
+ var RIG_SUPERVISOR_PANEL_ID = "supervisor";
7421
+ // packages/contracts/src/control-plane-types.ts
7422
+ function strictMergeHeadShaFromGate(result, prUrl, requireGreptile = true) {
7423
+ if (!result.approved) {
7424
+ throw new Error(`Refusing to merge ${prUrl}: strict merge gate is not approved.`);
7425
+ }
7426
+ if (result.evidence.prUrl !== prUrl) {
7427
+ throw new Error(`Refusing to merge ${prUrl}: strict merge gate evidence belongs to ${result.evidence.prUrl}.`);
7428
+ }
7429
+ const headSha = result.evidence.headSha?.trim();
7430
+ if (!headSha) {
7431
+ throw new Error(`Refusing to merge ${prUrl}: strict merge gate did not provide a current head SHA.`);
7432
+ }
7433
+ if (!/^[0-9a-f]{40}$/i.test(headSha)) {
7434
+ throw new Error(`Refusing to merge ${prUrl}: strict merge gate head is not a raw 40-character commit SHA.`);
7435
+ }
7436
+ if (requireGreptile) {
7437
+ if (!result.evidence.greptile.fresh || result.evidence.greptile.currentHeadSha !== headSha) {
7438
+ throw new Error(`Refusing to merge ${prUrl}: strict merge gate approval is not tied to head ${headSha}.`);
7439
+ }
7440
+ if (result.evidence.greptile.mapping !== "score-5-of-5" && result.evidence.greptile.mapping !== "explicit-approved") {
7441
+ throw new Error(`Refusing to merge ${prUrl}: strict merge gate mapping is ${result.evidence.greptile.mapping}.`);
7442
+ }
7443
+ }
7444
+ return headSha;
7445
+ }
7446
+ // packages/contracts/src/lifecycle-capabilities.ts
7447
+ var TASK_VERIFY_CAPABILITY_ID = "default-lifecycle.task-verify";
7448
+ var COMPLETION_VERIFICATION_CAPABILITY_ID = "default-lifecycle.completion-verification";
7449
+ // packages/contracts/src/browser.ts
7450
+ var BROWSER_CONTRACT_SERVICE_CAPABILITY_ID = "browser.contract";
7451
+ // packages/contracts/src/memory.ts
7452
+ var MEMORY_SERVICE_CAPABILITY_ID = "memory.service";
7453
+ var NO_MATCH_RETRIEVAL_CANONICAL_KEY = "__memory_recall__:none";
7454
+ // packages/contracts/src/provider-instructions.ts
7455
+ var RUNTIME_INSTRUCTION_SERVICE_CAPABILITY_ID = "provider.runtime-instructions";
7456
+ // packages/contracts/src/isolation.ts
7457
+ var ISOLATION_BACKEND_CAPABILITY_ID = "isolation.backend";
7458
+ // packages/contracts/src/managed-repos.ts
7459
+ var MANAGED_REPO_SERVICE_CAPABILITY_ID = "managed-repos.service";
7460
+ // packages/contracts/src/task-graph-primitives.ts
7461
+ function isObjectRecord(value) {
7462
+ return typeof value === "object" && value !== null && !Array.isArray(value);
7463
+ }
7464
+ function readStringList(value) {
7465
+ return Array.isArray(value) ? value.filter((entry) => typeof entry === "string" && entry.length > 0) : [];
7466
+ }
7467
+ function unique(values) {
7468
+ return Array.from(new Set(values));
7469
+ }
7470
+ function readTaskMetadataStringList(task, key) {
7471
+ const taskRecord = task;
7472
+ const topLevel = readStringList(taskRecord[key]);
7473
+ if (topLevel.length > 0)
7474
+ return topLevel;
7475
+ const metadata = isObjectRecord(task.metadata) ? task.metadata : null;
7476
+ const metadataList = readStringList(metadata?.[key]);
7477
+ if (metadataList.length > 0)
7478
+ return metadataList;
7479
+ if (key === "dependencies") {
7480
+ return readStringList(metadata?.deps);
7481
+ }
7482
+ return [];
7483
+ }
7484
+ function readTaskBlockingDependencyRefs(task) {
7485
+ return readTaskMetadataStringList(task, "dependencies");
7486
+ }
7487
+ function readTaskDependencyRefs(task) {
7488
+ return unique([
7489
+ ...readTaskMetadataStringList(task, "dependencies"),
7490
+ ...readTaskMetadataStringList(task, "parentChildDeps")
7491
+ ]);
7492
+ }
7493
+ function readTaskSourceIssueId(task) {
7494
+ if (typeof task.sourceIssueId === "string" && task.sourceIssueId.length > 0) {
7495
+ return task.sourceIssueId;
7496
+ }
7497
+ const metadata = isObjectRecord(task.metadata) ? task.metadata : null;
7498
+ if (typeof metadata?.sourceIssueId === "string" && metadata.sourceIssueId.length > 0) {
7499
+ return metadata.sourceIssueId;
7500
+ }
7501
+ const rigMetadata = isObjectRecord(metadata?._rig) ? metadata._rig : null;
7502
+ return typeof rigMetadata?.sourceIssueId === "string" && rigMetadata.sourceIssueId.length > 0 ? rigMetadata.sourceIssueId : null;
7503
+ }
7504
+ function readTaskScope(task) {
7505
+ const taskRecord = task;
7506
+ const topLevel = readStringList(taskRecord.scope);
7507
+ if (topLevel.length > 0)
7508
+ return unique(topLevel.map((entry) => entry.trim()).filter((entry) => entry.length > 0));
7509
+ const metadata = isObjectRecord(task.metadata) ? task.metadata : null;
7510
+ const metadataScope = readStringList(metadata?.scope);
7511
+ if (metadataScope.length > 0)
7512
+ return unique(metadataScope.map((entry) => entry.trim()).filter((entry) => entry.length > 0));
7513
+ return unique([
7514
+ ...readStringList(metadata?.files),
7515
+ ...readStringList(metadata?.paths)
7516
+ ].map((entry) => entry.trim()).filter((entry) => entry.length > 0));
7517
+ }
7518
+ function isScopeList(input) {
7519
+ return Array.isArray(input);
7520
+ }
7521
+ function normalizeScopeInput(input) {
7522
+ return isScopeList(input) ? unique(input.map((entry) => entry.trim()).filter((entry) => entry.length > 0)) : readTaskScope(input);
7523
+ }
7524
+ function disjointScope(left, right) {
7525
+ const leftScope = new Set(normalizeScopeInput(left));
7526
+ if (leftScope.size === 0)
7527
+ return true;
7528
+ return normalizeScopeInput(right).every((entry) => !leftScope.has(entry));
7529
+ }
7530
+ function resolveTaskReference(ref, tasksById, taskIdByExternalRef, taskIdBySourceIssueId) {
7531
+ if (tasksById.has(ref))
7532
+ return ref;
7533
+ return taskIdBySourceIssueId.get(ref) ?? taskIdByExternalRef.get(ref) ?? null;
7534
+ }
7535
+ function buildTaskReferenceIndex(tasks) {
7536
+ return {
7537
+ tasksById: new Map(tasks.map((task) => [task.id, task])),
7538
+ taskIdByExternalRef: new Map(tasks.flatMap((task) => task.externalId ? [[task.externalId, task.id]] : [])),
7539
+ taskIdBySourceIssueId: new Map(tasks.flatMap((task) => {
7540
+ const sourceIssueId = readTaskSourceIssueId(task);
7541
+ return sourceIssueId ? [[sourceIssueId, task.id]] : [];
7542
+ }))
7543
+ };
7544
+ }
7545
+ function computeTaskBlockingDepths(tasks) {
7546
+ const { tasksById, taskIdByExternalRef, taskIdBySourceIssueId } = buildTaskReferenceIndex(tasks);
7547
+ const memo = new Map;
7548
+ const visit = (taskId, stack) => {
7549
+ const cached = memo.get(taskId);
7550
+ if (cached !== undefined)
7551
+ return cached;
7552
+ if (stack.has(taskId))
7553
+ return 0;
7554
+ const task = tasksById.get(taskId);
7555
+ if (!task)
7556
+ return 0;
7557
+ stack.add(taskId);
7558
+ const blockers = readTaskBlockingDependencyRefs(task).map((ref) => resolveTaskReference(ref, tasksById, taskIdByExternalRef, taskIdBySourceIssueId)).filter((ref) => ref !== null && ref !== taskId);
7559
+ const depth = blockers.length === 0 ? 0 : Math.max(...blockers.map((blockerId) => visit(blockerId, stack) + 1));
7560
+ stack.delete(taskId);
7561
+ memo.set(taskId, depth);
7562
+ return depth;
7563
+ };
7564
+ for (const task of tasks) {
7565
+ visit(task.id, new Set);
7566
+ }
7567
+ return memo;
7568
+ }
7569
+ function isTaskTerminalStatus(status) {
7570
+ switch (status) {
7571
+ case "closed":
7572
+ case "completed":
7573
+ case "done":
7574
+ case "cancelled":
7575
+ case "canceled":
7576
+ return true;
7577
+ default:
7578
+ return false;
7579
+ }
7580
+ }
7581
+ function isTaskBlockedStatus(status) {
7582
+ return status === "blocked";
7583
+ }
7584
+ function isTaskRunnableStatus(status) {
7585
+ if (status === null || status === undefined || status === "")
7586
+ return true;
7587
+ if (isTaskTerminalStatus(status) || isTaskBlockedStatus(status))
7588
+ return false;
7589
+ switch (status) {
7590
+ case "ready":
7591
+ case "open":
7592
+ case "failed":
7593
+ return true;
7594
+ default:
7595
+ return false;
7596
+ }
7597
+ }
7598
+ function computeTaskDependencyBadges(tasks) {
7599
+ const index = buildTaskReferenceIndex(tasks);
7600
+ const blockingDepths = computeTaskBlockingDepths(tasks);
7601
+ const dependencyIdsByTask = new Map;
7602
+ const unresolvedRefsByTask = new Map;
7603
+ const blocksByTask = new Map;
7604
+ for (const task of tasks) {
7605
+ const dependencyIds = [];
7606
+ const unresolvedRefs = [];
7607
+ for (const ref of readTaskBlockingDependencyRefs(task)) {
7608
+ const dependencyId = resolveTaskReference(ref, index.tasksById, index.taskIdByExternalRef, index.taskIdBySourceIssueId);
7609
+ if (dependencyId && dependencyId !== task.id) {
7610
+ dependencyIds.push(dependencyId);
7611
+ const blocks = blocksByTask.get(dependencyId);
7612
+ if (blocks) {
7613
+ blocks.push(task.id);
7614
+ } else {
7615
+ blocksByTask.set(dependencyId, [task.id]);
7616
+ }
7617
+ } else {
7618
+ unresolvedRefs.push(ref);
7619
+ }
7620
+ }
7621
+ dependencyIdsByTask.set(task.id, unique(dependencyIds));
7622
+ unresolvedRefsByTask.set(task.id, unique(unresolvedRefs));
7623
+ }
7624
+ const summaries = new Map;
7625
+ for (const task of tasks) {
7626
+ const dependencyIds = dependencyIdsByTask.get(task.id) ?? [];
7627
+ const unresolvedDependencyRefs = unresolvedRefsByTask.get(task.id) ?? [];
7628
+ const blockedBy = dependencyIds.filter((dependencyId) => {
7629
+ const dependency = index.tasksById.get(dependencyId);
7630
+ return dependency ? !isTaskTerminalStatus(dependency.status) : false;
7631
+ });
7632
+ const blocks = unique(blocksByTask.get(task.id) ?? []);
7633
+ const blocked = isTaskBlockedStatus(task.status) || blockedBy.length > 0;
7634
+ const ready = isTaskRunnableStatus(task.status) && !blocked;
7635
+ const badges = [];
7636
+ if (blocked) {
7637
+ badges.push({
7638
+ kind: "blocked",
7639
+ label: blockedBy.length > 0 ? `blocked \xD7${blockedBy.length}` : "blocked",
7640
+ description: blockedBy.length > 0 ? `Waiting on ${blockedBy.join(", ")}.` : "Task source marks this task blocked.",
7641
+ ...blockedBy.length > 0 ? { count: blockedBy.length } : {},
7642
+ taskIds: blockedBy
7643
+ });
7644
+ } else if (ready) {
7645
+ badges.push({
7646
+ kind: "ready",
7647
+ label: "ready",
7648
+ description: "No open dependencies block this task."
7649
+ });
7650
+ }
7651
+ if (dependencyIds.length > 0 || blocks.length > 0 || unresolvedDependencyRefs.length > 0) {
7652
+ badges.push({
7653
+ kind: "dependency",
7654
+ label: `deps ${dependencyIds.length}/${blocks.length}`,
7655
+ description: [
7656
+ dependencyIds.length > 0 ? `Depends on ${dependencyIds.join(", ")}.` : null,
7657
+ blocks.length > 0 ? `Blocks ${blocks.join(", ")}.` : null,
7658
+ unresolvedDependencyRefs.length > 0 ? `Unresolved refs: ${unresolvedDependencyRefs.join(", ")}.` : null
7659
+ ].filter((part) => part !== null).join(" "),
7660
+ count: dependencyIds.length + blocks.length,
7661
+ taskIds: unique([...dependencyIds, ...blocks])
7662
+ });
7663
+ }
7664
+ summaries.set(task.id, {
7665
+ taskId: task.id,
7666
+ blockingDepth: blockingDepths.get(task.id) ?? 0,
7667
+ dependencyIds,
7668
+ unresolvedDependencyRefs,
7669
+ blockedBy,
7670
+ blocks,
7671
+ blocked,
7672
+ ready,
7673
+ dependencyCount: dependencyIds.length,
7674
+ dependentCount: blocks.length,
7675
+ badges
7676
+ });
7677
+ }
7678
+ return summaries;
7679
+ }
7680
+ var TASK_STATUSES = new Set([
7681
+ "draft",
7682
+ "open",
7683
+ "ready",
7684
+ "queued",
7685
+ "running",
7686
+ "in_progress",
7687
+ "under_review",
7688
+ "blocked",
7689
+ "unknown",
7690
+ "completed",
7691
+ "failed",
7692
+ "cancelled",
7693
+ "closed"
7694
+ ]);
7695
+ function stringValue(value) {
7696
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
7697
+ }
7698
+ function stringArray(value) {
7699
+ return Array.isArray(value) ? value.filter((entry) => typeof entry === "string" && entry.trim().length > 0).map((entry) => entry.trim()) : [];
7700
+ }
7701
+ function numberOrNull(value) {
7702
+ return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : null;
7703
+ }
7704
+ function metadataOf(task) {
7705
+ return isObjectRecord(task.metadata) ? task.metadata : {};
7706
+ }
7707
+ function normalizeTaskStatus(status) {
7708
+ const token = typeof status === "string" ? status.trim().toLowerCase() : "";
7709
+ if (token === "done")
7710
+ return "completed";
7711
+ if (token === "canceled")
7712
+ return "cancelled";
7713
+ return TASK_STATUSES.has(token) ? token : "unknown";
7714
+ }
7715
+ function toTaskDependencyProjection(task) {
7716
+ const metadata = metadataOf(task);
7717
+ return {
7718
+ id: String(task.id),
7719
+ title: stringValue(task.title),
7720
+ status: normalizeTaskStatus(task.status),
7721
+ priority: numberOrNull(task.priority),
7722
+ metadata,
7723
+ externalId: stringValue(task.externalId),
7724
+ sourceIssueId: stringValue(task.sourceIssueId),
7725
+ dependencies: stringArray(task.dependencies),
7726
+ parentChildDeps: stringArray(task.parentChildDeps),
7727
+ createdAt: stringValue(task.createdAt) ?? "",
7728
+ updatedAt: stringValue(task.updatedAt) ?? "",
7729
+ role: stringValue(task.role),
7730
+ scope: stringArray(task.scope),
7731
+ validationKeys: stringArray(task.validationKeys),
7732
+ labels: stringArray(task.labels),
7733
+ assignees: task.assignees,
7734
+ assignedTo: task.assignedTo
7735
+ };
7736
+ }
7737
+ function toTaskSummary(task, defaults = {}) {
7738
+ const projection = toTaskDependencyProjection(task);
7739
+ const metadata = metadataOf(task);
7740
+ const createdAt = stringValue(task.createdAt) ?? "1970-01-01T00:00:00.000Z";
7741
+ const updatedAt = stringValue(task.updatedAt) ?? createdAt;
7742
+ return {
7743
+ id: projection.id,
7744
+ workspaceId: stringValue(task.workspaceId) ?? defaults.workspaceId ?? "workspace",
7745
+ graphId: stringValue(task.graphId) ?? defaults.graphId ?? null,
7746
+ externalId: projection.externalId,
7747
+ title: projection.title ?? projection.id,
7748
+ description: stringValue(task.description) ?? stringValue(task.body) ?? "",
7749
+ status: projection.status,
7750
+ priority: numberOrNull(task.priority),
7751
+ role: projection.role,
7752
+ scope: [...projection.scope ?? []],
7753
+ validationKeys: [...projection.validationKeys ?? []],
7754
+ ...projection.sourceIssueId ? { sourceIssueId: projection.sourceIssueId } : {},
7755
+ dependencies: [...projection.dependencies ?? []],
7756
+ parentChildDeps: [...projection.parentChildDeps ?? []],
7757
+ metadata,
7758
+ createdAt,
7759
+ updatedAt
7760
+ };
7761
+ }
7762
+ // packages/contracts/src/github.ts
7763
+ var GITHUB_PROVIDER_CAPABILITY_ID = "github.provider";
7764
+ // packages/contracts/src/doctor.ts
7765
+ var DOCTOR_RUNNER_CAPABILITY_ID = "doctor.runner";
7766
+ function doctorLevelToStatus(level) {
7767
+ return level === "ok" ? "pass" : level;
7768
+ }
7769
+ function countDoctorFailures(checks) {
7770
+ return checks.filter((entry) => (entry.status ?? doctorLevelToStatus(entry.level ?? "warn")) === "fail").length;
7771
+ }
7456
7772
  })