@overdeck/contracts 0.41.0 → 0.42.0

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 CHANGED
@@ -401,6 +401,7 @@ const DashboardSnapshot = effect.Schema.Struct({
401
401
  specialists: effect.Schema.Array(effect.Schema.Unknown),
402
402
  reviewStatuses: effect.Schema.Array(ReviewStatusSnapshot),
403
403
  issues: effect.Schema.Array(effect.Schema.Unknown),
404
+ recentActivity: effect.Schema.optional(effect.Schema.Array(effect.Schema.Unknown)),
404
405
  resources: effect.Schema.optional(effect.Schema.Unknown),
405
406
  memory: effect.Schema.optional(effect.Schema.Unknown),
406
407
  agentRuntimeById: effect.Schema.optional(effect.Schema.Record(effect.Schema.String, AgentRuntimeSnapshot)),
@@ -499,6 +500,11 @@ const SessionNode = effect.Schema.Struct({
499
500
  paused: effect.Schema.optional(effect.Schema.Boolean),
500
501
  pausedReason: effect.Schema.optional(effect.Schema.String),
501
502
  pausedAt: effect.Schema.optional(effect.Schema.String),
503
+ troubled: effect.Schema.optional(effect.Schema.Boolean),
504
+ troubledAt: effect.Schema.optional(effect.Schema.String),
505
+ troubledReason: effect.Schema.optional(effect.Schema.String),
506
+ consecutiveFailures: effect.Schema.optional(effect.Schema.Number),
507
+ queuedMailCount: effect.Schema.optional(effect.Schema.Number),
502
508
  modelOrigin: effect.Schema.optional(ModelOrigin)
503
509
  });
504
510
  const FeatureNode = effect.Schema.Struct({
@@ -514,6 +520,7 @@ const ProjectSessionTree = effect.Schema.Struct({
514
520
  const DiscoveredSessionSnapshot = effect.Schema.Struct({
515
521
  id: effect.Schema.Number,
516
522
  jsonlPath: effect.Schema.String,
523
+ harness: effect.Schema.optional(effect.Schema.String),
517
524
  sessionId: effect.Schema.optional(effect.Schema.String),
518
525
  workspacePath: effect.Schema.optional(effect.Schema.String),
519
526
  workspaceHash: effect.Schema.optional(effect.Schema.String),
@@ -530,6 +537,9 @@ const DiscoveredSessionSnapshot = effect.Schema.Struct({
530
537
  tags: effect.Schema.Array(effect.Schema.String),
531
538
  summary: effect.Schema.optional(effect.Schema.String),
532
539
  summaryDetailed: effect.Schema.optional(effect.Schema.String),
540
+ conversationId: effect.Schema.optional(effect.Schema.String),
541
+ conversationName: effect.Schema.optional(effect.Schema.String),
542
+ conversationTitle: effect.Schema.optional(effect.Schema.String),
533
543
  enrichmentLevel: effect.Schema.Number,
534
544
  enrichmentModel: effect.Schema.optional(effect.Schema.String),
535
545
  enrichedAt: effect.Schema.optional(effect.Schema.String),
@@ -539,8 +549,73 @@ const DiscoveredSessionSnapshot = effect.Schema.Struct({
539
549
  panAgentId: effect.Schema.optional(effect.Schema.String),
540
550
  scannedAt: effect.Schema.String
541
551
  });
552
+ const SessionsFeedSource = effect.Schema.Literals(["discovered", "managed-archived"]);
553
+ const SessionsFeedRowSnapshot = effect.Schema.Struct({
554
+ id: effect.Schema.Number,
555
+ source: SessionsFeedSource,
556
+ discoveredId: effect.Schema.optional(effect.Schema.Number),
557
+ jsonlPath: effect.Schema.optional(effect.Schema.String),
558
+ sessionId: effect.Schema.optional(effect.Schema.String),
559
+ workspacePath: effect.Schema.optional(effect.Schema.String),
560
+ messageCount: effect.Schema.Number,
561
+ firstTs: effect.Schema.optional(effect.Schema.String),
562
+ lastTs: effect.Schema.optional(effect.Schema.String),
563
+ primaryModel: effect.Schema.optional(effect.Schema.String),
564
+ tokenInput: effect.Schema.Number,
565
+ tokenOutput: effect.Schema.Number,
566
+ estimatedCost: effect.Schema.Number,
567
+ tags: effect.Schema.Array(effect.Schema.String),
568
+ summary: effect.Schema.optional(effect.Schema.String),
569
+ enrichmentLevel: effect.Schema.Number,
570
+ enrichmentFailed: effect.Schema.Boolean,
571
+ overdeckManaged: effect.Schema.Boolean,
572
+ panIssueId: effect.Schema.optional(effect.Schema.String),
573
+ archivedAt: effect.Schema.optional(effect.Schema.String),
574
+ conversationId: effect.Schema.optional(effect.Schema.String),
575
+ conversationName: effect.Schema.optional(effect.Schema.String),
576
+ conversationTitle: effect.Schema.optional(effect.Schema.String),
577
+ harness: effect.Schema.optional(effect.Schema.String)
578
+ });
579
+ const SessionsFeedFacetBucketString = effect.Schema.Struct({
580
+ value: effect.Schema.String,
581
+ count: effect.Schema.Number
582
+ });
583
+ const SessionsFeedFacetBucketNumber = effect.Schema.Struct({
584
+ value: effect.Schema.Number,
585
+ count: effect.Schema.Number
586
+ });
587
+ const SessionsFeedFacetsSnapshot = effect.Schema.Struct({
588
+ primaryModels: effect.Schema.Array(SessionsFeedFacetBucketString),
589
+ tags: effect.Schema.Array(SessionsFeedFacetBucketString),
590
+ tools: effect.Schema.Array(SessionsFeedFacetBucketString),
591
+ files: effect.Schema.Array(SessionsFeedFacetBucketString),
592
+ enrichmentLevels: effect.Schema.Array(SessionsFeedFacetBucketNumber),
593
+ timeBuckets: effect.Schema.Array(effect.Schema.Struct({
594
+ value: effect.Schema.Literals([
595
+ "24h",
596
+ "7d",
597
+ "30d",
598
+ "older"
599
+ ]),
600
+ count: effect.Schema.Number
601
+ })),
602
+ costBuckets: effect.Schema.Array(effect.Schema.Struct({
603
+ value: effect.Schema.Literals([
604
+ "<$0.10",
605
+ "$0.10-1",
606
+ "$1-10",
607
+ ">$10"
608
+ ]),
609
+ count: effect.Schema.Number
610
+ })),
611
+ sources: effect.Schema.Array(effect.Schema.Struct({
612
+ value: SessionsFeedSource,
613
+ count: effect.Schema.Number
614
+ }))
615
+ });
542
616
  /** Filter parameters for conversation search */
543
617
  const ConversationFilter = effect.Schema.Struct({
618
+ harness: effect.Schema.optional(effect.Schema.String),
544
619
  workspacePath: effect.Schema.optional(effect.Schema.String),
545
620
  primaryModel: effect.Schema.optional(effect.Schema.String),
546
621
  managed: effect.Schema.optional(effect.Schema.Boolean),
@@ -2123,6 +2198,8 @@ const WS_METHODS = {
2123
2198
  scanConversations: "pan.scanConversations",
2124
2199
  searchConversations: "pan.searchConversations",
2125
2200
  listDiscoveredSessions: "pan.listDiscoveredSessions",
2201
+ listSessionsFeed: "pan.listSessionsFeed",
2202
+ getSessionsFeedFacets: "pan.getSessionsFeedFacets",
2126
2203
  getDiscoveredSession: "pan.getDiscoveredSession",
2127
2204
  enrichSessions: "pan.enrichSessions",
2128
2205
  embedSessions: "pan.embedSessions",
@@ -2475,6 +2552,37 @@ const DiscoveredSessionListResult = effect.Schema.Struct({
2475
2552
  count: effect.Schema.Number,
2476
2553
  total: effect.Schema.Number
2477
2554
  });
2555
+ const SessionsFeedPayload = effect.Schema.Struct({
2556
+ harness: effect.Schema.optional(effect.Schema.String),
2557
+ workspacePath: effect.Schema.optional(effect.Schema.String),
2558
+ primaryModel: effect.Schema.optional(effect.Schema.String),
2559
+ managed: effect.Schema.optional(effect.Schema.Boolean),
2560
+ unmanaged: effect.Schema.optional(effect.Schema.Boolean),
2561
+ since: effect.Schema.optional(effect.Schema.String),
2562
+ before: effect.Schema.optional(effect.Schema.String),
2563
+ after: effect.Schema.optional(effect.Schema.String),
2564
+ minCost: effect.Schema.optional(effect.Schema.Number),
2565
+ maxCost: effect.Schema.optional(effect.Schema.Number),
2566
+ minMessages: effect.Schema.optional(effect.Schema.Number),
2567
+ tags: effect.Schema.optional(effect.Schema.Array(effect.Schema.String)),
2568
+ tools: effect.Schema.optional(effect.Schema.Array(effect.Schema.String)),
2569
+ files: effect.Schema.optional(effect.Schema.Array(effect.Schema.String)),
2570
+ issueId: effect.Schema.optional(effect.Schema.String),
2571
+ enrichmentLevel: effect.Schema.optional(effect.Schema.Number),
2572
+ enriched: effect.Schema.optional(effect.Schema.Boolean),
2573
+ notEnriched: effect.Schema.optional(effect.Schema.Boolean),
2574
+ query: effect.Schema.optional(effect.Schema.String),
2575
+ semantic: effect.Schema.optional(effect.Schema.Boolean),
2576
+ similarTo: effect.Schema.optional(effect.Schema.Number),
2577
+ limit: effect.Schema.optional(effect.Schema.Number),
2578
+ offset: effect.Schema.optional(effect.Schema.Number),
2579
+ cursor: effect.Schema.optional(effect.Schema.String),
2580
+ source: effect.Schema.optional(effect.Schema.Literals(["discovered", "managed-archived"]))
2581
+ });
2582
+ const SessionsFeedListResult = effect.Schema.Struct({
2583
+ rows: effect.Schema.Array(SessionsFeedRowSnapshot),
2584
+ nextCursor: effect.Schema.NullOr(effect.Schema.String)
2585
+ });
2478
2586
  const DiscoveredSessionSearchResult = effect.Schema.Struct({
2479
2587
  sessions: effect.Schema.Array(DiscoveredSessionSnapshot),
2480
2588
  total: effect.Schema.Number,
@@ -2524,6 +2632,18 @@ const ListDiscoveredSessionsRpc = effect_unstable_rpc_Rpc.make(WS_METHODS.listDi
2524
2632
  success: DiscoveredSessionListResult,
2525
2633
  error: PanRpcError
2526
2634
  });
2635
+ /** List the unified discovered + managed archived sessions feed */
2636
+ const ListSessionsFeedRpc = effect_unstable_rpc_Rpc.make(WS_METHODS.listSessionsFeed, {
2637
+ payload: SessionsFeedPayload,
2638
+ success: SessionsFeedListResult,
2639
+ error: PanRpcError
2640
+ });
2641
+ /** Get facet buckets for the unified sessions feed */
2642
+ const GetSessionsFeedFacetsRpc = effect_unstable_rpc_Rpc.make(WS_METHODS.getSessionsFeedFacets, {
2643
+ payload: SessionsFeedPayload,
2644
+ success: SessionsFeedFacetsSnapshot,
2645
+ error: PanRpcError
2646
+ });
2527
2647
  /** Get a single discovered session by ID */
2528
2648
  const GetDiscoveredSessionRpc = effect_unstable_rpc_Rpc.make(WS_METHODS.getDiscoveredSession, {
2529
2649
  payload: effect.Schema.Struct({ id: effect.Schema.Number }),
@@ -2587,7 +2707,7 @@ const GetConversationStatsRpc = effect_unstable_rpc_Rpc.make(WS_METHODS.getConve
2587
2707
  error: PanRpcError
2588
2708
  });
2589
2709
  /** All Overdeck WebSocket RPC methods */
2590
- const PanRpcGroup = effect_unstable_rpc_RpcGroup.make(SubscribeDomainEventsRpc, SubscribeIssueEventsRpc, SubscribeTerminalRpc, SubscribeAgentOutputRpc, GetSnapshotRpc, ReplayEventsRpc, GetWorkspaceDetailRpc, ReadWorkspaceFileRpc, ResolveFilePathExistsRpc, TerminalOpenRpc, TerminalWriteRpc, TerminalResizeRpc, TerminalCloseRpc, StartPlanningRpc, StartAgentRpc, DeepWipeRpc, SendTerminalInputRpc, ResizeTerminalRpc, SubscribeConversationMessagesRpc, SubscribeProjectSessionTreeRpc, SubscribeFlywheelStatusRpc, ShellOpenInEditorRpc, GetAvailableEditorsRpc, ScanConversationsRpc, SearchConversationsRpc, ListDiscoveredSessionsRpc, GetDiscoveredSessionRpc, EnrichSessionsRpc, EmbedSessionsRpc, GetConversationCostRpc, GetConversationCostByWorkspaceRpc, GetConversationStatsRpc);
2710
+ const PanRpcGroup = effect_unstable_rpc_RpcGroup.make(SubscribeDomainEventsRpc, SubscribeIssueEventsRpc, SubscribeTerminalRpc, SubscribeAgentOutputRpc, GetSnapshotRpc, ReplayEventsRpc, GetWorkspaceDetailRpc, ReadWorkspaceFileRpc, ResolveFilePathExistsRpc, TerminalOpenRpc, TerminalWriteRpc, TerminalResizeRpc, TerminalCloseRpc, StartPlanningRpc, StartAgentRpc, DeepWipeRpc, SendTerminalInputRpc, ResizeTerminalRpc, SubscribeConversationMessagesRpc, SubscribeProjectSessionTreeRpc, SubscribeFlywheelStatusRpc, ShellOpenInEditorRpc, GetAvailableEditorsRpc, ScanConversationsRpc, SearchConversationsRpc, ListDiscoveredSessionsRpc, ListSessionsFeedRpc, GetSessionsFeedFacetsRpc, GetDiscoveredSessionRpc, EnrichSessionsRpc, EmbedSessionsRpc, GetConversationCostRpc, GetConversationCostByWorkspaceRpc, GetConversationStatsRpc);
2591
2711
  //#endregion
2592
2712
  //#region src/event-reducers.ts
2593
2713
  const INITIAL_READ_MODEL_STATE = {
@@ -2734,6 +2854,7 @@ function syncSnapshot(state, snapshot) {
2734
2854
  resolvedChannelPermissionDecisionIdsByAgentId: {},
2735
2855
  resources: snapshot.resources ?? null,
2736
2856
  issuesRaw: snapshot.issues ?? state.issuesRaw,
2857
+ recentActivity: snapshot.recentActivity ? [...snapshot.recentActivity] : state.recentActivity,
2737
2858
  observationsByIssueId: memory?.observationsByIssueId ?? state.observationsByIssueId,
2738
2859
  statusByIssueId: memory?.statusByIssueId ?? state.statusByIssueId,
2739
2860
  rollupsByIssueId: memory?.rollupsByIssueId ?? state.rollupsByIssueId,
@@ -2852,7 +2973,13 @@ function applyEvent(state, event) {
2852
2973
  };
2853
2974
  }
2854
2975
  case "agent.status_changed": {
2855
- const agent = state.agentsById[event.payload.agentId];
2976
+ const agent = state.agentsById[event.payload.agentId] ?? (event.payload.role === "strike" && event.payload.issueId ? {
2977
+ id: event.payload.agentId,
2978
+ issueId: event.payload.issueId,
2979
+ status: event.payload.status,
2980
+ role: "strike",
2981
+ startedAt: event.timestamp
2982
+ } : void 0);
2856
2983
  if (!agent) return {
2857
2984
  ...state,
2858
2985
  sequence: Math.max(state.sequence, event.sequence)
@@ -2926,7 +3053,11 @@ function applyEvent(state, event) {
2926
3053
  ...state.agentsById,
2927
3054
  [event.payload.agentId]: nextAgent
2928
3055
  },
2929
- turnDiffSummariesByAgentId: nextTurnDiffSummariesByAgentId
3056
+ turnDiffSummariesByAgentId: nextTurnDiffSummariesByAgentId,
3057
+ agentIdBySessionId: event.payload.sessionId ? {
3058
+ ...state.agentIdBySessionId,
3059
+ [event.payload.sessionId]: event.payload.agentId
3060
+ } : state.agentIdBySessionId
2930
3061
  };
2931
3062
  }
2932
3063
  case "agent.heartbeat_dead": {
@@ -4238,6 +4369,84 @@ const FeatureRegistryEntry = effect.Schema.Struct({
4238
4369
  tags: effect.Schema.Array(effect.Schema.String)
4239
4370
  });
4240
4371
  //#endregion
4372
+ //#region src/harness-behavior.ts
4373
+ const CLAUDE_CODE_BEHAVIOR = {
4374
+ displayName: "Claude Code",
4375
+ executableName: "claude",
4376
+ processNames: ["claude"],
4377
+ launchCommandKind: "claude-code",
4378
+ deliveryKind: "pty-supervisor",
4379
+ readinessKind: "claude-session-signal",
4380
+ transcriptKind: "claude-jsonl",
4381
+ sessionIdSource: "launcher-session-id",
4382
+ contextLayerKind: "claude",
4383
+ feedKind: "claude_code",
4384
+ supportsPtySupervisor: true,
4385
+ supportsChannelsBridge: true,
4386
+ supportsConversationStreaming: false,
4387
+ supportsPatchProjection: true,
4388
+ usesRpcFifo: false,
4389
+ usesCodexHome: false,
4390
+ injectsPromptTimeMemory: false,
4391
+ workAgentMode: "claude-code",
4392
+ readyTimeoutSeconds: 30
4393
+ };
4394
+ const OHMYPI_BEHAVIOR = {
4395
+ displayName: "Pi",
4396
+ executableName: "omp",
4397
+ processNames: ["omp"],
4398
+ launchCommandKind: "ohmypi-rpc",
4399
+ deliveryKind: "rpc-fifo",
4400
+ readinessKind: "ohmypi-ready-file",
4401
+ transcriptKind: "ohmypi-jsonl",
4402
+ sessionIdSource: "transcript-jsonl",
4403
+ contextLayerKind: "pi",
4404
+ feedKind: "pi",
4405
+ supportsPtySupervisor: false,
4406
+ supportsChannelsBridge: false,
4407
+ supportsConversationStreaming: true,
4408
+ supportsPatchProjection: false,
4409
+ usesRpcFifo: true,
4410
+ usesCodexHome: false,
4411
+ injectsPromptTimeMemory: true,
4412
+ workAgentMode: "ohmypi-rpc",
4413
+ readyTimeoutSeconds: 120
4414
+ };
4415
+ const CODEX_BEHAVIOR = {
4416
+ displayName: "Codex",
4417
+ executableName: "codex",
4418
+ processNames: ["codex"],
4419
+ launchCommandKind: "codex-work-tui",
4420
+ deliveryKind: "codex-exec-resume",
4421
+ readinessKind: "codex-tui-prompt",
4422
+ transcriptKind: "codex-rollout-jsonl",
4423
+ sessionIdSource: "codex-thread-id",
4424
+ contextLayerKind: "codex",
4425
+ feedKind: "codex",
4426
+ supportsPtySupervisor: true,
4427
+ supportsChannelsBridge: false,
4428
+ supportsConversationStreaming: true,
4429
+ supportsPatchProjection: true,
4430
+ usesRpcFifo: false,
4431
+ usesCodexHome: true,
4432
+ injectsPromptTimeMemory: false,
4433
+ workAgentMode: "codex-work-tui",
4434
+ readyTimeoutSeconds: 30
4435
+ };
4436
+ const BEHAVIORS = {
4437
+ "claude-code": CLAUDE_CODE_BEHAVIOR,
4438
+ ohmypi: OHMYPI_BEHAVIOR,
4439
+ codex: CODEX_BEHAVIOR
4440
+ };
4441
+ function getHarnessBehavior(harness) {
4442
+ if (harness === "ohmypi" || harness === "pi") return OHMYPI_BEHAVIOR;
4443
+ if (harness === "codex") return CODEX_BEHAVIOR;
4444
+ return CLAUDE_CODE_BEHAVIOR;
4445
+ }
4446
+ function getRuntimeBehavior(runtime) {
4447
+ return BEHAVIORS[runtime];
4448
+ }
4449
+ //#endregion
4241
4450
  exports.Activity = Activity;
4242
4451
  exports.ActivityDetailedEvent = ActivityDetailedEvent;
4243
4452
  exports.ActivityEntryEvent = ActivityEntryEvent;
@@ -4292,6 +4501,8 @@ exports.ArtifactValidationCode = ArtifactValidationCode;
4292
4501
  exports.ArtifactValidationFinding = ArtifactValidationFinding;
4293
4502
  exports.ArtifactValidationResult = ArtifactValidationResult;
4294
4503
  exports.CHANNEL_REPLY_KIND_VALUES = CHANNEL_REPLY_KIND_VALUES;
4504
+ exports.CLAUDE_CODE_BEHAVIOR = CLAUDE_CODE_BEHAVIOR;
4505
+ exports.CODEX_BEHAVIOR = CODEX_BEHAVIOR;
4295
4506
  exports.CONTEXT_LAYER_KINDS = CONTEXT_LAYER_KINDS;
4296
4507
  exports.CONTEXT_PREVIEW_HARNESSES = CONTEXT_PREVIEW_HARNESSES;
4297
4508
  exports.ChannelPermissionRequestSnapshot = ChannelPermissionRequestSnapshot;
@@ -4380,6 +4591,7 @@ exports.GetConversationCostByWorkspaceRpc = GetConversationCostByWorkspaceRpc;
4380
4591
  exports.GetConversationCostRpc = GetConversationCostRpc;
4381
4592
  exports.GetConversationStatsRpc = GetConversationStatsRpc;
4382
4593
  exports.GetDiscoveredSessionRpc = GetDiscoveredSessionRpc;
4594
+ exports.GetSessionsFeedFacetsRpc = GetSessionsFeedFacetsRpc;
4383
4595
  exports.GetSnapshotRpc = GetSnapshotRpc;
4384
4596
  exports.GetWorkspaceDetailRpc = GetWorkspaceDetailRpc;
4385
4597
  exports.GlobalContextLayerRecord = GlobalContextLayerRecord;
@@ -4390,6 +4602,7 @@ exports.IssueStatusChangedEvent = IssueStatusChangedEvent;
4390
4602
  exports.IssuesSnapshotEvent = IssuesSnapshotEvent;
4391
4603
  exports.IssuesUpdatedEvent = IssuesUpdatedEvent;
4392
4604
  exports.ListDiscoveredSessionsRpc = ListDiscoveredSessionsRpc;
4605
+ exports.ListSessionsFeedRpc = ListSessionsFeedRpc;
4393
4606
  exports.MAX_CHANNEL_REPLY_ARTIFACT_LABEL_LENGTH = MAX_CHANNEL_REPLY_ARTIFACT_LABEL_LENGTH;
4394
4607
  exports.MAX_CHANNEL_REPLY_ARTIFACT_REFS = MAX_CHANNEL_REPLY_ARTIFACT_REFS;
4395
4608
  exports.MAX_CHANNEL_REPLY_ARTIFACT_URI_LENGTH = MAX_CHANNEL_REPLY_ARTIFACT_URI_LENGTH;
@@ -4408,6 +4621,7 @@ exports.MergeReadyEvent = MergeReadyEvent;
4408
4621
  exports.MergeStatusValue = MergeStatusValue;
4409
4622
  exports.ModelOrigin = ModelOrigin;
4410
4623
  exports.ModelOriginEntry = ModelOriginEntry;
4624
+ exports.OHMYPI_BEHAVIOR = OHMYPI_BEHAVIOR;
4411
4625
  exports.OpenInEditorInput = OpenInEditorInput;
4412
4626
  exports.OperatorInterventionEvent = OperatorInterventionEvent;
4413
4627
  exports.PanRpcError = PanRpcError;
@@ -4467,6 +4681,9 @@ exports.SessionNode = SessionNode;
4467
4681
  exports.SessionNodePresence = SessionNodePresence;
4468
4682
  exports.SessionNodeType = SessionNodeType;
4469
4683
  exports.SessionTreeDelta = SessionTreeDelta;
4684
+ exports.SessionsFeedFacetsSnapshot = SessionsFeedFacetsSnapshot;
4685
+ exports.SessionsFeedRowSnapshot = SessionsFeedRowSnapshot;
4686
+ exports.SessionsFeedSource = SessionsFeedSource;
4470
4687
  exports.ShadowInferenceUpdateEvent = ShadowInferenceUpdateEvent;
4471
4688
  exports.ShellOpenInEditorRpc = ShellOpenInEditorRpc;
4472
4689
  exports.SpecialistCompletedEvent = SpecialistCompletedEvent;
@@ -4515,8 +4732,10 @@ exports.applyEvents = applyEvents;
4515
4732
  exports.decodeFlywheelStats = decodeFlywheelStats;
4516
4733
  exports.encodeFlywheelStats = encodeFlywheelStats;
4517
4734
  exports.getHarness = getHarness;
4735
+ exports.getHarnessBehavior = getHarnessBehavior;
4518
4736
  exports.getMaxMemoryObservationsPerIssue = getMaxMemoryObservationsPerIssue;
4519
4737
  exports.getMaxTurnDiffSummariesPerAgent = getMaxTurnDiffSummariesPerAgent;
4738
+ exports.getRuntimeBehavior = getRuntimeBehavior;
4520
4739
  exports.isChannelReplyKind = isChannelReplyKind;
4521
4740
  exports.isTerminalTurnDiffSummaryStatus = isTerminalTurnDiffSummaryStatus;
4522
4741
  exports.normalizeChannelReplyPayload = normalizeChannelReplyPayload;