@overdeck/contracts 0.72.0 → 0.73.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.mjs CHANGED
@@ -539,6 +539,7 @@ const AgentSnapshot = Schema.Struct({
539
539
  askedAt: Schema.String,
540
540
  questions: Schema.Array(Schema.Struct({
541
541
  question: Schema.String,
542
+ context: Schema.optional(Schema.String),
542
543
  header: Schema.optional(Schema.String),
543
544
  multiSelect: Schema.optional(Schema.Boolean),
544
545
  options: Schema.Array(Schema.Struct({
@@ -1799,6 +1800,7 @@ const AgentEnrichmentChangedEvent = Schema.Struct({
1799
1800
  askedAt: Schema.String,
1800
1801
  questions: Schema.Array(Schema.Struct({
1801
1802
  question: Schema.String,
1803
+ context: Schema.optional(Schema.String),
1802
1804
  header: Schema.optional(Schema.String),
1803
1805
  multiSelect: Schema.optional(Schema.Boolean),
1804
1806
  options: Schema.Array(Schema.Struct({
@@ -2806,6 +2808,14 @@ const ConversationPullRequestsChangedEvent = Schema.Struct({
2806
2808
  effective: Schema.NullOr(PullRequestLink)
2807
2809
  })
2808
2810
  });
2811
+ /** Emitted (in-memory only) when a conversation's schedules change (PAN-4657), so the
2812
+ * list and the schedule dialog refresh the next-run badge. */
2813
+ const ConversationSchedulesChangedEvent = Schema.Struct({
2814
+ type: Schema.Literal("conversation.schedules_changed"),
2815
+ sequence: SequenceNumber,
2816
+ timestamp: Schema.String,
2817
+ payload: Schema.Struct({ conversationName: Schema.String })
2818
+ });
2809
2819
  /** Emitted (in-memory only) when a PermissionRequest hook fires or resolves for a conversation. */
2810
2820
  const ConversationPermissionChangedEvent = Schema.Struct({
2811
2821
  type: Schema.Literal("conversation.permission_changed"),
@@ -3033,6 +3043,7 @@ const DomainEvent = Schema.Union([
3033
3043
  ConversationMovedEvent,
3034
3044
  ConversationTitleChangedEvent,
3035
3045
  ConversationPullRequestsChangedEvent,
3046
+ ConversationSchedulesChangedEvent,
3036
3047
  ConversationPermissionChangedEvent,
3037
3048
  ScanStartedEvent,
3038
3049
  ScanProgressEvent,
@@ -3209,6 +3220,63 @@ const OpenInEditorInput = Schema.Struct({
3209
3220
  editor: EditorIdSchema,
3210
3221
  reveal: Schema.optional(Schema.Boolean)
3211
3222
  });
3223
+ const BROWSERS = [
3224
+ {
3225
+ id: "default-browser",
3226
+ label: "browser",
3227
+ linuxCommands: [],
3228
+ macApp: null
3229
+ },
3230
+ {
3231
+ id: "chrome",
3232
+ label: "Google Chrome",
3233
+ linuxCommands: ["google-chrome"],
3234
+ macApp: "Google Chrome"
3235
+ },
3236
+ {
3237
+ id: "chromium",
3238
+ label: "Chromium",
3239
+ linuxCommands: ["chromium", "chromium-browser"],
3240
+ macApp: "Chromium"
3241
+ },
3242
+ {
3243
+ id: "firefox",
3244
+ label: "Firefox",
3245
+ linuxCommands: ["firefox"],
3246
+ macApp: "Firefox"
3247
+ },
3248
+ {
3249
+ id: "brave",
3250
+ label: "Brave",
3251
+ linuxCommands: ["brave-browser"],
3252
+ macApp: "Brave Browser"
3253
+ },
3254
+ {
3255
+ id: "edge",
3256
+ label: "Microsoft Edge",
3257
+ linuxCommands: ["microsoft-edge"],
3258
+ macApp: "Microsoft Edge"
3259
+ },
3260
+ {
3261
+ id: "vivaldi",
3262
+ label: "Vivaldi",
3263
+ linuxCommands: ["vivaldi"],
3264
+ macApp: "Vivaldi"
3265
+ }
3266
+ ];
3267
+ const BrowserIdSchema = Schema.Literals([
3268
+ "default-browser",
3269
+ "chrome",
3270
+ "chromium",
3271
+ "firefox",
3272
+ "brave",
3273
+ "edge",
3274
+ "vivaldi"
3275
+ ]);
3276
+ const OpenInBrowserInput = Schema.Struct({
3277
+ path: Schema.String,
3278
+ browser: BrowserIdSchema
3279
+ });
3212
3280
  //#endregion
3213
3281
  //#region src/effort.ts
3214
3282
  /**
@@ -3269,7 +3337,9 @@ const WS_METHODS = {
3269
3337
  sendTerminalInput: "pan.sendTerminalInput",
3270
3338
  resizeTerminal: "pan.resizeTerminal",
3271
3339
  shellOpenInEditor: "pan.shellOpenInEditor",
3272
- getAvailableEditors: "pan.getAvailableEditors"
3340
+ getAvailableEditors: "pan.getAvailableEditors",
3341
+ shellOpenInBrowser: "pan.shellOpenInBrowser",
3342
+ getAvailableBrowsers: "pan.getAvailableBrowsers"
3273
3343
  };
3274
3344
  var PanRpcError = class extends Schema.TaggedErrorClass()("PanRpcError", {
3275
3345
  message: Schema.String,
@@ -3715,6 +3785,16 @@ const GetAvailableEditorsRpc = Rpc.make(WS_METHODS.getAvailableEditors, {
3715
3785
  }),
3716
3786
  error: PanRpcError
3717
3787
  });
3788
+ /** Open a local file in a browser (PAN-4762) */
3789
+ const ShellOpenInBrowserRpc = Rpc.make(WS_METHODS.shellOpenInBrowser, {
3790
+ payload: OpenInBrowserInput,
3791
+ error: PanRpcError
3792
+ });
3793
+ /** Get available (installed) browsers (PAN-4762) */
3794
+ const GetAvailableBrowsersRpc = Rpc.make(WS_METHODS.getAvailableBrowsers, {
3795
+ success: Schema.Struct({ browsers: Schema.Array(BrowserIdSchema) }),
3796
+ error: PanRpcError
3797
+ });
3718
3798
  const DiscoveredSessionListResult = Schema.Struct({
3719
3799
  sessions: Schema.Array(DiscoveredSessionSnapshot),
3720
3800
  count: Schema.Number,
@@ -3875,7 +3955,7 @@ const GetConversationStatsRpc = Rpc.make(WS_METHODS.getConversationStats, {
3875
3955
  error: PanRpcError
3876
3956
  });
3877
3957
  /** All Overdeck WebSocket RPC methods */
3878
- const PanRpcGroup = RpcGroup.make(SubscribeDomainEventsRpc, SubscribeIssueEventsRpc, SubscribeTerminalRpc, SubscribeAgentOutputRpc, GetSnapshotRpc, ReplayEventsRpc, ReadWorkspaceFileRpc, ReadFileAtPathRpc, WriteFileAtPathRpc, ResolveFilePathExistsRpc, TerminalOpenRpc, TerminalWriteRpc, TerminalResizeRpc, TerminalCloseRpc, StartPlanningRpc, StartAgentRpc, DeepWipeRpc, SendTerminalInputRpc, ResizeTerminalRpc, SubscribeConversationMessagesRpc, SubscribeProjectSessionTreeRpc, ShellOpenInEditorRpc, GetAvailableEditorsRpc, ScanConversationsRpc, SearchConversationsRpc, ListDiscoveredSessionsRpc, ListSessionsFeedRpc, GetSessionsFeedFacetsRpc, GetDiscoveredSessionRpc, EnrichSessionsRpc, EmbedSessionsRpc, GetConversationCostRpc, GetConversationCostByWorkspaceRpc, GetConversationStatsRpc);
3958
+ const PanRpcGroup = RpcGroup.make(SubscribeDomainEventsRpc, SubscribeIssueEventsRpc, SubscribeTerminalRpc, SubscribeAgentOutputRpc, GetSnapshotRpc, ReplayEventsRpc, ReadWorkspaceFileRpc, ReadFileAtPathRpc, WriteFileAtPathRpc, ResolveFilePathExistsRpc, TerminalOpenRpc, TerminalWriteRpc, TerminalResizeRpc, TerminalCloseRpc, StartPlanningRpc, StartAgentRpc, DeepWipeRpc, SendTerminalInputRpc, ResizeTerminalRpc, SubscribeConversationMessagesRpc, SubscribeProjectSessionTreeRpc, ShellOpenInEditorRpc, GetAvailableEditorsRpc, ShellOpenInBrowserRpc, GetAvailableBrowsersRpc, ScanConversationsRpc, SearchConversationsRpc, ListDiscoveredSessionsRpc, ListSessionsFeedRpc, GetSessionsFeedFacetsRpc, GetDiscoveredSessionRpc, EnrichSessionsRpc, EmbedSessionsRpc, GetConversationCostRpc, GetConversationCostByWorkspaceRpc, GetConversationStatsRpc);
3879
3959
  //#endregion
3880
3960
  //#region src/agent-runtime-merge.ts
3881
3961
  function defaultRuntimeSnapshot(agentId, timestamp, sequence) {
@@ -5206,6 +5286,10 @@ function applyEvent(state, event) {
5206
5286
  ...state,
5207
5287
  conversationsListRevision: state.conversationsListRevision + 1
5208
5288
  };
5289
+ case "conversation.schedules_changed": return {
5290
+ ...state,
5291
+ conversationsListRevision: state.conversationsListRevision + 1
5292
+ };
5209
5293
  case "conversation.permission_changed": {
5210
5294
  const { conversationName, waiting } = event.payload;
5211
5295
  if (!waiting) {
@@ -5656,7 +5740,9 @@ const FlywheelLastTick = Schema.Struct({
5656
5740
  inFlight: Schema.Array(Schema.String),
5657
5741
  needsYou: Schema.NullOr(Schema.String),
5658
5742
  /** The assistant message's `createdAt`. */
5659
- at: Schema.String
5743
+ at: Schema.String,
5744
+ /** The assistant message's id, when the harness records one. */
5745
+ messageId: Schema.optional(Schema.String)
5660
5746
  });
5661
5747
  const FlywheelPolicies = Schema.Struct({
5662
5748
  auto_pickup_backlog: Schema.Boolean,
@@ -5686,6 +5772,8 @@ const FlywheelInFlightRow = Schema.Struct({
5686
5772
  pr: Schema.optional(DerivedPrState),
5687
5773
  /** Set when no configured tracker answered: the state is a guess, not a fact. */
5688
5774
  trackerUnknown: Schema.optional(Schema.Literal(true)),
5775
+ /** The row folds a feature-<id>-strike workspace onto its base issue (PAN-4752). */
5776
+ strike: Schema.optional(Schema.Literal(true)),
5689
5777
  /** Live agent panes on this issue. `working` with 0 means nobody is driving it. */
5690
5778
  liveAgents: Schema.Number,
5691
5779
  /** The loop named this id in its newest tick marker's in-flight list. */
@@ -6086,10 +6174,15 @@ const HARNESS_CAPABILITY_KEYS = [
6086
6174
  "hostEffortFlag",
6087
6175
  "binaryLabel",
6088
6176
  "installHint",
6177
+ "updateArgs",
6178
+ "npmPackage",
6089
6179
  "binaryConfigKey",
6090
6180
  "launchPreflight",
6091
6181
  "workspaceResolution",
6092
- "correlatesBySessionId"
6182
+ "correlatesBySessionId",
6183
+ "answersQuestionByMessage",
6184
+ "askAnswerDelivery",
6185
+ "runsOnFlyMachine"
6093
6186
  ];
6094
6187
  const CLAUDE_CODE_CAPABILITIES = {
6095
6188
  contextChannel: "append-system-prompt-file",
@@ -6104,10 +6197,15 @@ const CLAUDE_CODE_CAPABILITIES = {
6104
6197
  hostEffortFlag: false,
6105
6198
  binaryLabel: "Claude Code",
6106
6199
  installHint: "curl -fsSL https://claude.ai/install.sh | bash",
6200
+ updateArgs: ["update"],
6201
+ npmPackage: "@anthropic-ai/claude-code",
6107
6202
  binaryConfigKey: null,
6108
6203
  launchPreflight: "claude-code-model-minimum",
6109
6204
  workspaceResolution: "claude-project-hash",
6110
- correlatesBySessionId: false
6205
+ correlatesBySessionId: false,
6206
+ answersQuestionByMessage: true,
6207
+ askAnswerDelivery: "message",
6208
+ runsOnFlyMachine: true
6111
6209
  };
6112
6210
  const OHMYPI_CAPABILITIES = {
6113
6211
  contextChannel: "append-system-prompt",
@@ -6122,10 +6220,15 @@ const OHMYPI_CAPABILITIES = {
6122
6220
  hostEffortFlag: false,
6123
6221
  binaryLabel: "OhMyPi",
6124
6222
  installHint: null,
6223
+ updateArgs: null,
6224
+ npmPackage: null,
6125
6225
  binaryConfigKey: null,
6126
6226
  launchPreflight: null,
6127
6227
  workspaceResolution: "first-message-only",
6128
- correlatesBySessionId: true
6228
+ correlatesBySessionId: true,
6229
+ answersQuestionByMessage: false,
6230
+ askAnswerDelivery: "pi-ask-modal",
6231
+ runsOnFlyMachine: false
6129
6232
  };
6130
6233
  const CODEX_CAPABILITIES = {
6131
6234
  contextChannel: "developer_instructions",
@@ -6140,10 +6243,15 @@ const CODEX_CAPABILITIES = {
6140
6243
  hostEffortFlag: false,
6141
6244
  binaryLabel: "Codex CLI",
6142
6245
  installHint: null,
6246
+ updateArgs: ["update"],
6247
+ npmPackage: "@openai/codex",
6143
6248
  binaryConfigKey: null,
6144
6249
  launchPreflight: null,
6145
6250
  workspaceResolution: "agent-dir",
6146
- correlatesBySessionId: true
6251
+ correlatesBySessionId: true,
6252
+ answersQuestionByMessage: false,
6253
+ askAnswerDelivery: "message",
6254
+ runsOnFlyMachine: true
6147
6255
  };
6148
6256
  const ACP_CAPABILITIES = {
6149
6257
  contextChannel: "acp-initial-context",
@@ -6158,10 +6266,15 @@ const ACP_CAPABILITIES = {
6158
6266
  hostEffortFlag: false,
6159
6267
  binaryLabel: "Kimi Code CLI",
6160
6268
  installHint: null,
6269
+ updateArgs: ["upgrade", "--yes"],
6270
+ npmPackage: null,
6161
6271
  binaryConfigKey: "acp.kimi.binaryPath",
6162
6272
  launchPreflight: null,
6163
6273
  workspaceResolution: "agent-dir",
6164
- correlatesBySessionId: true
6274
+ correlatesBySessionId: true,
6275
+ answersQuestionByMessage: false,
6276
+ askAnswerDelivery: "message",
6277
+ runsOnFlyMachine: false
6165
6278
  };
6166
6279
  const KIMI_CODE_CAPABILITIES = {
6167
6280
  contextChannel: "initial-message-envelope",
@@ -6176,10 +6289,15 @@ const KIMI_CODE_CAPABILITIES = {
6176
6289
  hostEffortFlag: false,
6177
6290
  binaryLabel: "Kimi Code CLI",
6178
6291
  installHint: null,
6292
+ updateArgs: ["upgrade", "--yes"],
6293
+ npmPackage: null,
6179
6294
  binaryConfigKey: "kimiCode.binaryPath",
6180
6295
  launchPreflight: null,
6181
6296
  workspaceResolution: "first-message-only",
6182
- correlatesBySessionId: true
6297
+ correlatesBySessionId: true,
6298
+ answersQuestionByMessage: false,
6299
+ askAnswerDelivery: "message",
6300
+ runsOnFlyMachine: false
6183
6301
  };
6184
6302
  const OPENCODE_CAPABILITIES = {
6185
6303
  contextChannel: "acp-initial-context",
@@ -6194,10 +6312,15 @@ const OPENCODE_CAPABILITIES = {
6194
6312
  hostEffortFlag: true,
6195
6313
  binaryLabel: "OpenCode",
6196
6314
  installHint: null,
6315
+ updateArgs: ["upgrade"],
6316
+ npmPackage: "opencode-ai",
6197
6317
  binaryConfigKey: null,
6198
6318
  launchPreflight: null,
6199
6319
  workspaceResolution: "agent-dir",
6200
- correlatesBySessionId: true
6320
+ correlatesBySessionId: true,
6321
+ answersQuestionByMessage: false,
6322
+ askAnswerDelivery: "message",
6323
+ runsOnFlyMachine: false
6201
6324
  };
6202
6325
  const MUSE_CAPABILITIES = {
6203
6326
  contextChannel: "append-system-prompt-file",
@@ -6212,10 +6335,15 @@ const MUSE_CAPABILITIES = {
6212
6335
  hostEffortFlag: false,
6213
6336
  binaryLabel: "Muse Code",
6214
6337
  installHint: null,
6338
+ updateArgs: null,
6339
+ npmPackage: null,
6215
6340
  binaryConfigKey: null,
6216
6341
  launchPreflight: null,
6217
6342
  workspaceResolution: "first-message-only",
6218
- correlatesBySessionId: true
6343
+ correlatesBySessionId: true,
6344
+ answersQuestionByMessage: false,
6345
+ askAnswerDelivery: "message",
6346
+ runsOnFlyMachine: false
6219
6347
  };
6220
6348
  const PRIME_AGENT_CAPABILITIES = {
6221
6349
  contextChannel: "prime-agent-append-system-prompt",
@@ -6230,10 +6358,15 @@ const PRIME_AGENT_CAPABILITIES = {
6230
6358
  hostEffortFlag: false,
6231
6359
  binaryLabel: "Prime Agent",
6232
6360
  installHint: null,
6361
+ updateArgs: null,
6362
+ npmPackage: null,
6233
6363
  binaryConfigKey: null,
6234
6364
  launchPreflight: null,
6235
6365
  workspaceResolution: "first-message-only",
6236
- correlatesBySessionId: true
6366
+ correlatesBySessionId: true,
6367
+ answersQuestionByMessage: false,
6368
+ askAnswerDelivery: "message",
6369
+ runsOnFlyMachine: false
6237
6370
  };
6238
6371
  //#endregion
6239
6372
  //#region src/harness-behavior.ts
@@ -6661,7 +6794,12 @@ const TELEMETRY_CLI_VERBS = [
6661
6794
  ];
6662
6795
  const TELEMETRY_PROPERTY_DOMAINS = {
6663
6796
  agent_spawn_mode: ["spawn-and-send", "spawn-work-and-send"],
6664
- answer_type: ["custom", "selection"],
6797
+ answer_type: [
6798
+ "custom",
6799
+ "selection",
6800
+ "note",
6801
+ "selection+note"
6802
+ ],
6665
6803
  auto_merge_variant: ["segmented", "badge"],
6666
6804
  boolean: [false, true],
6667
6805
  cli_verb: TELEMETRY_CLI_VERBS,
@@ -7194,29 +7332,35 @@ const COMPOSER_COMMAND_MANIFEST = [
7194
7332
  "add"
7195
7333
  ],
7196
7334
  "display": "/pan skills pack add",
7197
- "description": "Register a git skill pack at the commit a ref resolves to (enables nothing)",
7335
+ "description": "Register a git skill pack at the commit a ref resolves to (enables nothing); known packs default the url and ref",
7198
7336
  "args": [{
7199
7337
  "name": "id",
7200
7338
  "required": true,
7201
7339
  "variadic": false
7202
7340
  }, {
7203
7341
  "name": "url",
7204
- "required": true,
7342
+ "required": false,
7205
7343
  "variadic": false
7206
7344
  }],
7207
7345
  "options": [
7208
7346
  {
7209
7347
  "flags": "--ref <ref>",
7210
- "description": "Tag or branch to pin",
7348
+ "description": "Tag, branch or commit to pin (default: the known pack ref)",
7211
7349
  "required": true,
7212
7350
  "valueHint": "ref"
7213
7351
  },
7214
7352
  {
7215
7353
  "flags": "--adapter <adapter>",
7216
- "description": "plain, claude-plugin, or deft-readonly",
7354
+ "description": "plain, claude-plugin, deft-readonly, or gstack-runtime",
7217
7355
  "required": true,
7218
7356
  "valueHint": "adapter"
7219
7357
  },
7358
+ {
7359
+ "flags": "--browser",
7360
+ "description": "Also build the browser runtime (gstack; asks separately)",
7361
+ "required": false,
7362
+ "valueHint": null
7363
+ },
7220
7364
  {
7221
7365
  "flags": "--yes",
7222
7366
  "description": "Trust the resolved commit without asking",
@@ -7255,6 +7399,33 @@ const COMPOSER_COMMAND_MANIFEST = [
7255
7399
  "aliases": [],
7256
7400
  "category": "Core"
7257
7401
  },
7402
+ {
7403
+ "id": "pan-skills-pack-browser",
7404
+ "path": [
7405
+ "skills",
7406
+ "pack",
7407
+ "browser"
7408
+ ],
7409
+ "display": "/pan skills pack browser",
7410
+ "description": "Turn a runtime pack's browser runtime on or off (gstack)",
7411
+ "args": [{
7412
+ "name": "id",
7413
+ "required": true,
7414
+ "variadic": false
7415
+ }, {
7416
+ "name": "state",
7417
+ "required": false,
7418
+ "variadic": false
7419
+ }],
7420
+ "options": [{
7421
+ "flags": "--yes",
7422
+ "description": "Trust without asking",
7423
+ "required": false,
7424
+ "valueHint": null
7425
+ }],
7426
+ "aliases": [],
7427
+ "category": "Core"
7428
+ },
7258
7429
  {
7259
7430
  "id": "pan-skills-pack-list",
7260
7431
  "path": [
@@ -7323,7 +7494,7 @@ const COMPOSER_COMMAND_MANIFEST = [
7323
7494
  "gc"
7324
7495
  ],
7325
7496
  "display": "/pan skills pack gc",
7326
- "description": "Remove unused skill pack mounts and dangling launch links",
7497
+ "description": "Remove unused skill pack mounts, dangling launch links, stale renders and orphaned pack state",
7327
7498
  "args": [],
7328
7499
  "options": [{
7329
7500
  "flags": "--max-age-days <n>",
@@ -7401,7 +7572,7 @@ const COMPOSER_COMMAND_MANIFEST = [
7401
7572
  "id": "pan-skills-deft",
7402
7573
  "path": ["skills", "deft"],
7403
7574
  "display": "/pan skills deft",
7404
- "description": "Deft Directive detection, ownership report, and managed mode",
7575
+ "description": "Deft Directive detection, managed mode, and running an issue on Deft",
7405
7576
  "args": [],
7406
7577
  "options": [],
7407
7578
  "aliases": [],
@@ -7474,6 +7645,98 @@ const COMPOSER_COMMAND_MANIFEST = [
7474
7645
  "aliases": [],
7475
7646
  "category": "Core"
7476
7647
  },
7648
+ {
7649
+ "id": "pan-skills-deft-use",
7650
+ "path": [
7651
+ "skills",
7652
+ "deft",
7653
+ "use"
7654
+ ],
7655
+ "display": "/pan skills deft use",
7656
+ "description": "Run an issue on Deft Directive's pipeline: install Directive into its workspace, hidden from git",
7657
+ "args": [{
7658
+ "name": "issue",
7659
+ "required": true,
7660
+ "variadic": false
7661
+ }],
7662
+ "options": [{
7663
+ "flags": "--start",
7664
+ "description": "Start the work agent afterwards (pan start)",
7665
+ "required": false,
7666
+ "valueHint": null
7667
+ }, {
7668
+ "flags": "--json",
7669
+ "description": "Output as JSON",
7670
+ "required": false,
7671
+ "valueHint": null
7672
+ }],
7673
+ "aliases": [],
7674
+ "category": "Core"
7675
+ },
7676
+ {
7677
+ "id": "pan-skills-deft-back",
7678
+ "path": [
7679
+ "skills",
7680
+ "deft",
7681
+ "back"
7682
+ ],
7683
+ "display": "/pan skills deft back",
7684
+ "description": "Switch an issue back to Overdeck's pipeline: save the Deft state, then remove the install",
7685
+ "args": [{
7686
+ "name": "issue",
7687
+ "required": true,
7688
+ "variadic": false
7689
+ }],
7690
+ "options": [{
7691
+ "flags": "--json",
7692
+ "description": "Output as JSON",
7693
+ "required": false,
7694
+ "valueHint": null
7695
+ }],
7696
+ "aliases": [],
7697
+ "category": "Core"
7698
+ },
7699
+ {
7700
+ "id": "pan-skills-deft-save",
7701
+ "path": [
7702
+ "skills",
7703
+ "deft",
7704
+ "save"
7705
+ ],
7706
+ "display": "/pan skills deft save",
7707
+ "description": "Commit the issue's Deft state archive under .pan/deft/<ISSUE>/",
7708
+ "args": [{
7709
+ "name": "issue",
7710
+ "required": true,
7711
+ "variadic": false
7712
+ }],
7713
+ "options": [],
7714
+ "aliases": [],
7715
+ "category": "Core"
7716
+ },
7717
+ {
7718
+ "id": "pan-skills-deft-show",
7719
+ "path": [
7720
+ "skills",
7721
+ "deft",
7722
+ "show"
7723
+ ],
7724
+ "display": "/pan skills deft show",
7725
+ "description": "Show an issue's pipeline, Deft install, drift, and merge-guard verdict",
7726
+ "args": [{
7727
+ "name": "issue",
7728
+ "required": true,
7729
+ "variadic": false
7730
+ }],
7731
+ "options": [{
7732
+ "flags": "--json",
7733
+ "description": "Output as JSON",
7734
+ "required": false,
7735
+ "valueHint": null
7736
+ }],
7737
+ "aliases": [],
7738
+ "category": "Core"
7739
+ },
7477
7740
  {
7478
7741
  "id": "pan-pair",
7479
7742
  "path": ["pair"],
@@ -7543,48 +7806,63 @@ const COMPOSER_COMMAND_MANIFEST = [
7543
7806
  "category": "CLI"
7544
7807
  },
7545
7808
  {
7546
- "id": "pan-token",
7547
- "path": ["token"],
7548
- "display": "/pan token",
7549
- "description": "Create, list or revoke scoped access tokens (see configuration/remote-access.mdx)",
7809
+ "id": "pan-machines",
7810
+ "path": ["machines"],
7811
+ "display": "/pan machines",
7812
+ "description": "Link this dashboard to other machines and manage the links (see configuration/linked-machines.mdx)",
7550
7813
  "args": [],
7551
7814
  "options": [],
7552
7815
  "aliases": [],
7553
7816
  "category": "CLI"
7554
7817
  },
7555
7818
  {
7556
- "id": "pan-token-create",
7557
- "path": ["token", "create"],
7558
- "display": "/pan token create",
7559
- "description": "Create a scoped access token and print it once",
7819
+ "id": "pan-machines-link",
7820
+ "path": ["machines", "link"],
7821
+ "display": "/pan machines link",
7822
+ "description": "Link to the machine whose `pan pair` link this is (links both ways unless --one-way)",
7560
7823
  "args": [{
7561
- "name": "name",
7824
+ "name": "pairing-url",
7562
7825
  "required": true,
7563
7826
  "variadic": false
7564
7827
  }],
7565
- "options": [{
7566
- "flags": "--scopes <list>",
7567
- "description": "Comma-separated scopes: read:events, read:state, read:conversations, tell, operate, admin",
7568
- "required": true,
7569
- "valueHint": "list"
7570
- }, {
7571
- "flags": "--json",
7572
- "description": "Print { id, name, scopes, token } as JSON",
7573
- "required": false,
7574
- "valueHint": null
7575
- }],
7828
+ "options": [
7829
+ {
7830
+ "flags": "--one-way",
7831
+ "description": "Only this machine reaches the other; do not give it a link back",
7832
+ "required": false,
7833
+ "valueHint": null
7834
+ },
7835
+ {
7836
+ "flags": "--agent-fenced",
7837
+ "description": "Agent-fenced access: forwarded requests are never operator-level",
7838
+ "required": false,
7839
+ "valueHint": null
7840
+ },
7841
+ {
7842
+ "flags": "--allow-loopback",
7843
+ "description": "Accept a localhost pairing link (both servers on this host)",
7844
+ "required": false,
7845
+ "valueHint": null
7846
+ },
7847
+ {
7848
+ "flags": "--json",
7849
+ "description": "Print the new link as JSON",
7850
+ "required": false,
7851
+ "valueHint": null
7852
+ }
7853
+ ],
7576
7854
  "aliases": [],
7577
7855
  "category": "CLI"
7578
7856
  },
7579
7857
  {
7580
- "id": "pan-token-list",
7581
- "path": ["token", "list"],
7582
- "display": "/pan token list",
7583
- "description": "List access tokens with scopes and created, last-used and revoked times",
7858
+ "id": "pan-machines-list",
7859
+ "path": ["machines", "list"],
7860
+ "display": "/pan machines list",
7861
+ "description": "List linked machines with state and route, then the machines that link here",
7584
7862
  "args": [],
7585
7863
  "options": [{
7586
7864
  "flags": "--json",
7587
- "description": "Print the tokens as JSON",
7865
+ "description": "Print { self, links, inbound } as JSON",
7588
7866
  "required": false,
7589
7867
  "valueHint": null
7590
7868
  }],
@@ -7592,84 +7870,758 @@ const COMPOSER_COMMAND_MANIFEST = [
7592
7870
  "category": "CLI"
7593
7871
  },
7594
7872
  {
7595
- "id": "pan-token-revoke",
7596
- "path": ["token", "revoke"],
7597
- "display": "/pan token revoke",
7598
- "description": "Revoke an access token and close its live connections",
7873
+ "id": "pan-machines-unlink",
7874
+ "path": ["machines", "unlink"],
7875
+ "display": "/pan machines unlink",
7876
+ "description": "Remove a link by label, environment id or link id, revoking the token the other machine holds",
7599
7877
  "args": [{
7600
- "name": "id",
7878
+ "name": "target",
7601
7879
  "required": true,
7602
7880
  "variadic": false
7603
7881
  }],
7604
- "options": [],
7882
+ "options": [{
7883
+ "flags": "--keep-server",
7884
+ "description": "For an SSH machine this dashboard started: leave its Overdeck server running; for a Fly machine: do not destroy it",
7885
+ "required": false,
7886
+ "valueHint": null
7887
+ }, {
7888
+ "flags": "--json",
7889
+ "description": "Print { ok, peerNotified, ssh, fly } as JSON",
7890
+ "required": false,
7891
+ "valueHint": null
7892
+ }],
7605
7893
  "aliases": [],
7606
7894
  "category": "CLI"
7607
7895
  },
7608
7896
  {
7609
- "id": "pan-issues",
7610
- "path": ["issues"],
7611
- "display": "/pan issues",
7612
- "description": "List and triage work across configured trackers",
7613
- "args": [],
7897
+ "id": "pan-machines-forward",
7898
+ "path": ["machines", "forward"],
7899
+ "display": "/pan machines forward",
7900
+ "description": "Forward a TCP port of a linked machine to 127.0.0.1 here and print the URL (for a dev-server preview)",
7901
+ "args": [{
7902
+ "name": "machine",
7903
+ "required": false,
7904
+ "variadic": false
7905
+ }, {
7906
+ "name": "port",
7907
+ "required": false,
7908
+ "variadic": false
7909
+ }],
7614
7910
  "options": [
7615
7911
  {
7616
- "flags": "--all",
7617
- "description": "Include closed issues",
7618
- "required": false,
7619
- "valueHint": null
7620
- },
7621
- {
7622
- "flags": "--mine",
7623
- "description": "Show only my assigned issues",
7624
- "required": false,
7625
- "valueHint": null
7626
- },
7627
- {
7628
- "flags": "--json",
7629
- "description": "Output as JSON",
7912
+ "flags": "--list",
7913
+ "description": "List the open forwards",
7630
7914
  "required": false,
7631
7915
  "valueHint": null
7632
7916
  },
7633
7917
  {
7634
- "flags": "--tracker <type>",
7635
- "description": "Query specific tracker (linear/github/gitlab)",
7918
+ "flags": "--stop <id>",
7919
+ "description": "Close a forward",
7636
7920
  "required": true,
7637
- "valueHint": "type"
7638
- },
7639
- {
7640
- "flags": "--all-trackers",
7641
- "description": "Query all configured trackers",
7642
- "required": false,
7643
- "valueHint": null
7921
+ "valueHint": "id"
7644
7922
  },
7645
7923
  {
7646
- "flags": "--triage",
7647
- "description": "Show triage queue",
7924
+ "flags": "--json",
7925
+ "description": "Print JSON",
7648
7926
  "required": false,
7649
7927
  "valueHint": null
7650
7928
  }
7651
7929
  ],
7652
7930
  "aliases": [],
7653
- "category": "Lifecycle"
7931
+ "category": "CLI"
7654
7932
  },
7655
7933
  {
7656
- "id": "pan-show",
7657
- "path": ["show"],
7658
- "display": "/pan show",
7659
- "description": "Unified lens: derived issue state, CV, context, health for one issue",
7660
- "args": [{
7661
- "name": "id",
7662
- "required": true,
7663
- "variadic": false
7934
+ "id": "pan-machines-directory",
7935
+ "path": ["machines", "directory"],
7936
+ "display": "/pan machines directory",
7937
+ "description": "List this account's machines in the overdeck.ai directory, with pending approvals and joins",
7938
+ "args": [],
7939
+ "options": [{
7940
+ "flags": "--json",
7941
+ "description": "Print the GET /api/directory response as JSON",
7942
+ "required": false,
7943
+ "valueHint": null
7664
7944
  }],
7665
- "options": [
7666
- {
7667
- "flags": "--cv",
7668
- "description": "Agent work history only",
7669
- "required": false,
7670
- "valueHint": null
7671
- },
7672
- {
7945
+ "aliases": [],
7946
+ "category": "CLI"
7947
+ },
7948
+ {
7949
+ "id": "pan-machines-join",
7950
+ "path": ["machines", "join"],
7951
+ "display": "/pan machines join",
7952
+ "description": "Ask your other machines (or one) to link with this one; confirm the code on both screens",
7953
+ "args": [],
7954
+ "options": [{
7955
+ "flags": "--to <machine>",
7956
+ "description": "Ask only this machine (label or environment id)",
7957
+ "required": true,
7958
+ "valueHint": "machine"
7959
+ }, {
7960
+ "flags": "--json",
7961
+ "description": "Print { requestId, sas, fingerprint, approver } as JSON once a machine opens the request",
7962
+ "required": false,
7963
+ "valueHint": null
7964
+ }],
7965
+ "aliases": [],
7966
+ "category": "CLI"
7967
+ },
7968
+ {
7969
+ "id": "pan-machines-accept",
7970
+ "path": ["machines", "accept"],
7971
+ "display": "/pan machines accept",
7972
+ "description": "Accept a join request after checking that both screens show the same code",
7973
+ "args": [{
7974
+ "name": "request-id",
7975
+ "required": true,
7976
+ "variadic": false
7977
+ }],
7978
+ "options": [],
7979
+ "aliases": [],
7980
+ "category": "CLI"
7981
+ },
7982
+ {
7983
+ "id": "pan-machines-reject",
7984
+ "path": ["machines", "reject"],
7985
+ "display": "/pan machines reject",
7986
+ "description": "Reject an approval or join request",
7987
+ "args": [{
7988
+ "name": "request-id",
7989
+ "required": true,
7990
+ "variadic": false
7991
+ }],
7992
+ "options": [],
7993
+ "aliases": [],
7994
+ "category": "CLI"
7995
+ },
7996
+ {
7997
+ "id": "pan-machines-approve",
7998
+ "path": ["machines", "approve"],
7999
+ "display": "/pan machines approve",
8000
+ "description": "Open an approval request, show its code and approve it",
8001
+ "args": [{
8002
+ "name": "request-id",
8003
+ "required": true,
8004
+ "variadic": false
8005
+ }],
8006
+ "options": [{
8007
+ "flags": "--yes",
8008
+ "description": "Approve without asking",
8009
+ "required": false,
8010
+ "valueHint": null
8011
+ }],
8012
+ "aliases": [],
8013
+ "category": "CLI"
8014
+ },
8015
+ {
8016
+ "id": "pan-machines-forget",
8017
+ "path": ["machines", "forget"],
8018
+ "display": "/pan machines forget",
8019
+ "description": "Remove a machine from the overdeck.ai directory (label or environment id)",
8020
+ "args": [{
8021
+ "name": "machine",
8022
+ "required": true,
8023
+ "variadic": false
8024
+ }],
8025
+ "options": [],
8026
+ "aliases": [],
8027
+ "category": "CLI"
8028
+ },
8029
+ {
8030
+ "id": "pan-machines-versions",
8031
+ "path": ["machines", "versions"],
8032
+ "display": "/pan machines versions",
8033
+ "description": "Show Overdeck and harness CLI versions on every machine",
8034
+ "args": [],
8035
+ "options": [{
8036
+ "flags": "--json",
8037
+ "description": "Print { rows } as JSON",
8038
+ "required": false,
8039
+ "valueHint": null
8040
+ }],
8041
+ "aliases": [],
8042
+ "category": "CLI"
8043
+ },
8044
+ {
8045
+ "id": "pan-machines-update",
8046
+ "path": ["machines", "update"],
8047
+ "display": "/pan machines update",
8048
+ "description": "Update Overdeck and the harness CLIs on every online machine, after running turns end",
8049
+ "args": [],
8050
+ "options": [
8051
+ {
8052
+ "flags": "--now",
8053
+ "description": "Do not wait for running turns to end",
8054
+ "required": false,
8055
+ "valueHint": null
8056
+ },
8057
+ {
8058
+ "flags": "--machine <label>",
8059
+ "description": "Only this machine; repeat for more",
8060
+ "required": true,
8061
+ "valueHint": "label"
8062
+ },
8063
+ {
8064
+ "flags": "--cancel",
8065
+ "description": "Cancel waiting updates",
8066
+ "required": false,
8067
+ "valueHint": null
8068
+ },
8069
+ {
8070
+ "flags": "--json",
8071
+ "description": "Print { started, skipped } as JSON",
8072
+ "required": false,
8073
+ "valueHint": null
8074
+ }
8075
+ ],
8076
+ "aliases": [],
8077
+ "category": "CLI"
8078
+ },
8079
+ {
8080
+ "id": "pan-machines-add-ssh",
8081
+ "path": ["machines", "add-ssh"],
8082
+ "display": "/pan machines add-ssh",
8083
+ "description": "Link a machine reached over SSH: this dashboard starts or adopts Overdeck there and forwards a port to it",
8084
+ "args": [{
8085
+ "name": "host",
8086
+ "required": true,
8087
+ "variadic": false
8088
+ }],
8089
+ "options": [
8090
+ {
8091
+ "flags": "--pan-path <path>",
8092
+ "description": "Absolute path to pan on the host (default: pan from its login PATH)",
8093
+ "required": true,
8094
+ "valueHint": "path"
8095
+ },
8096
+ {
8097
+ "flags": "--one-way",
8098
+ "description": "Only this machine reaches the other; do not give it a link back",
8099
+ "required": false,
8100
+ "valueHint": null
8101
+ },
8102
+ {
8103
+ "flags": "--agent-fenced",
8104
+ "description": "Agent-fenced access: forwarded requests are never operator-level",
8105
+ "required": false,
8106
+ "valueHint": null
8107
+ },
8108
+ {
8109
+ "flags": "--json",
8110
+ "description": "Print the new link as JSON",
8111
+ "required": false,
8112
+ "valueHint": null
8113
+ }
8114
+ ],
8115
+ "aliases": [],
8116
+ "category": "CLI"
8117
+ },
8118
+ {
8119
+ "id": "pan-machines-test-ssh",
8120
+ "path": ["machines", "test-ssh"],
8121
+ "display": "/pan machines test-ssh",
8122
+ "description": "Check that this dashboard reaches <host> over SSH and that it has the same pan version",
8123
+ "args": [{
8124
+ "name": "host",
8125
+ "required": true,
8126
+ "variadic": false
8127
+ }],
8128
+ "options": [{
8129
+ "flags": "--pan-path <path>",
8130
+ "description": "Absolute path to pan on the host (default: pan from its login PATH)",
8131
+ "required": true,
8132
+ "valueHint": "path"
8133
+ }, {
8134
+ "flags": "--json",
8135
+ "description": "Print { reachable, panVersion, localVersion, versionMatches, error, message } as JSON",
8136
+ "required": false,
8137
+ "valueHint": null
8138
+ }],
8139
+ "aliases": [],
8140
+ "category": "CLI"
8141
+ },
8142
+ {
8143
+ "id": "pan-machines-add-project",
8144
+ "path": ["machines", "add-project"],
8145
+ "display": "/pan machines add-project",
8146
+ "description": "Clone a linked machine's project here (or, with --to, this machine's project there) and copy its .env-style files (0600, never overwriting)",
8147
+ "args": [{
8148
+ "name": "machine",
8149
+ "required": true,
8150
+ "variadic": false
8151
+ }, {
8152
+ "name": "project-key",
8153
+ "required": true,
8154
+ "variadic": false
8155
+ }],
8156
+ "options": [
8157
+ {
8158
+ "flags": "--to <machine>",
8159
+ "description": "Add this machine's project <project-key> to <machine> instead",
8160
+ "required": true,
8161
+ "valueHint": "machine"
8162
+ },
8163
+ {
8164
+ "flags": "--file <path>",
8165
+ "description": "Also copy this git-ignored file; repeat for more",
8166
+ "required": true,
8167
+ "valueHint": "path"
8168
+ },
8169
+ {
8170
+ "flags": "--no-env",
8171
+ "description": "Do not copy .env, .envrc and .dev.vars",
8172
+ "required": false,
8173
+ "valueHint": null
8174
+ },
8175
+ {
8176
+ "flags": "--parent-dir <dir>",
8177
+ "description": "Clone under this directory (default: the projects folder)",
8178
+ "required": true,
8179
+ "valueHint": "dir"
8180
+ },
8181
+ {
8182
+ "flags": "--json",
8183
+ "description": "Print the finished add job as JSON",
8184
+ "required": false,
8185
+ "valueHint": null
8186
+ }
8187
+ ],
8188
+ "aliases": [],
8189
+ "category": "CLI"
8190
+ },
8191
+ {
8192
+ "id": "pan-machines-who",
8193
+ "path": ["machines", "who"],
8194
+ "display": "/pan machines who",
8195
+ "description": "Show which machines run agents or conversations for an issue",
8196
+ "args": [{
8197
+ "name": "issue",
8198
+ "required": true,
8199
+ "variadic": false
8200
+ }],
8201
+ "options": [{
8202
+ "flags": "--json",
8203
+ "description": "Print the fleet answer as JSON",
8204
+ "required": false,
8205
+ "valueHint": null
8206
+ }],
8207
+ "aliases": [],
8208
+ "category": "CLI"
8209
+ },
8210
+ {
8211
+ "id": "pan-machines-add-fly",
8212
+ "path": ["machines", "add-fly"],
8213
+ "display": "/pan machines add-fly",
8214
+ "description": "Start a Fly.io VM that runs Overdeck, link it from here, and optionally start a Claude Code or Codex conversation on it",
8215
+ "args": [],
8216
+ "options": [
8217
+ {
8218
+ "flags": "--project <key>",
8219
+ "description": "Clone this project onto the VM (GitHub projects only)",
8220
+ "required": true,
8221
+ "valueHint": "key"
8222
+ },
8223
+ {
8224
+ "flags": "--message <text>",
8225
+ "description": "Start a conversation with this first message (needs --project)",
8226
+ "required": true,
8227
+ "valueHint": "text"
8228
+ },
8229
+ {
8230
+ "flags": "--harness <name>",
8231
+ "description": "Harness for the conversation: claude-code (default) or codex",
8232
+ "required": true,
8233
+ "valueHint": "name"
8234
+ },
8235
+ {
8236
+ "flags": "--model <id>",
8237
+ "description": "Model for the conversation (required with --harness codex)",
8238
+ "required": true,
8239
+ "valueHint": "id"
8240
+ },
8241
+ {
8242
+ "flags": "--effort <level>",
8243
+ "description": "Reasoning effort for the conversation",
8244
+ "required": true,
8245
+ "valueHint": "level"
8246
+ },
8247
+ {
8248
+ "flags": "--region <code>",
8249
+ "description": "Fly region (default: remote.fly.region, else iad)",
8250
+ "required": true,
8251
+ "valueHint": "code"
8252
+ },
8253
+ {
8254
+ "flags": "--image <ref>",
8255
+ "description": "Image (default: remote.fly.image, else registry.fly.io/<app>:latest)",
8256
+ "required": true,
8257
+ "valueHint": "ref"
8258
+ },
8259
+ {
8260
+ "flags": "--json",
8261
+ "description": "Print { link, record, conversation? } as JSON",
8262
+ "required": false,
8263
+ "valueHint": null
8264
+ }
8265
+ ],
8266
+ "aliases": [],
8267
+ "category": "CLI"
8268
+ },
8269
+ {
8270
+ "id": "pan-connect",
8271
+ "path": ["connect"],
8272
+ "display": "/pan connect",
8273
+ "description": "Install this machine's server as a lasting service and print one link that links it from another machine (see cli/machines.mdx)",
8274
+ "args": [],
8275
+ "options": [
8276
+ {
8277
+ "flags": "--url <base>",
8278
+ "description": "Address another machine reaches this one at (default: picked automatically)",
8279
+ "required": true,
8280
+ "valueHint": "base"
8281
+ },
8282
+ {
8283
+ "flags": "--label <name>",
8284
+ "description": "Name recorded for the pairing in the activity log",
8285
+ "required": true,
8286
+ "valueHint": "name"
8287
+ },
8288
+ {
8289
+ "flags": "--json",
8290
+ "description": "Print the result as JSON",
8291
+ "required": false,
8292
+ "valueHint": null
8293
+ }
8294
+ ],
8295
+ "aliases": [],
8296
+ "category": "CLI"
8297
+ },
8298
+ {
8299
+ "id": "pan-tailscale",
8300
+ "path": ["tailscale"],
8301
+ "display": "/pan tailscale",
8302
+ "description": "Reach this machine over Tailscale: state, setup and tailnet peers (see configuration/tailscale.mdx)",
8303
+ "args": [],
8304
+ "options": [],
8305
+ "aliases": [],
8306
+ "category": "CLI"
8307
+ },
8308
+ {
8309
+ "id": "pan-tailscale-status",
8310
+ "path": ["tailscale", "status"],
8311
+ "display": "/pan tailscale status",
8312
+ "description": "Show Tailscale state, the next setup step and Overdeck machines on the tailnet",
8313
+ "args": [],
8314
+ "options": [{
8315
+ "flags": "--json",
8316
+ "description": "Print { state, peers } as JSON",
8317
+ "required": false,
8318
+ "valueHint": null
8319
+ }],
8320
+ "aliases": [],
8321
+ "category": "CLI"
8322
+ },
8323
+ {
8324
+ "id": "pan-tailscale-setup",
8325
+ "path": ["tailscale", "setup"],
8326
+ "display": "/pan tailscale setup",
8327
+ "description": "Install Tailscale, sign in and turn on protected HTTPS access to this dashboard",
8328
+ "args": [],
8329
+ "options": [{
8330
+ "flags": "--userspace",
8331
+ "description": "On Linux, install for this user without an administrator password",
8332
+ "required": false,
8333
+ "valueHint": null
8334
+ }],
8335
+ "aliases": [],
8336
+ "category": "CLI"
8337
+ },
8338
+ {
8339
+ "id": "pan-token",
8340
+ "path": ["token"],
8341
+ "display": "/pan token",
8342
+ "description": "Create, list or revoke scoped access tokens (see configuration/remote-access.mdx)",
8343
+ "args": [],
8344
+ "options": [],
8345
+ "aliases": [],
8346
+ "category": "CLI"
8347
+ },
8348
+ {
8349
+ "id": "pan-token-create",
8350
+ "path": ["token", "create"],
8351
+ "display": "/pan token create",
8352
+ "description": "Create a scoped access token and print it once",
8353
+ "args": [{
8354
+ "name": "name",
8355
+ "required": true,
8356
+ "variadic": false
8357
+ }],
8358
+ "options": [{
8359
+ "flags": "--scopes <list>",
8360
+ "description": "Comma-separated scopes: read:events, read:state, read:conversations, read:costs, read:settings, tell, operate, approve, forward, admin",
8361
+ "required": true,
8362
+ "valueHint": "list"
8363
+ }, {
8364
+ "flags": "--json",
8365
+ "description": "Print { id, name, scopes, token } as JSON",
8366
+ "required": false,
8367
+ "valueHint": null
8368
+ }],
8369
+ "aliases": [],
8370
+ "category": "CLI"
8371
+ },
8372
+ {
8373
+ "id": "pan-token-list",
8374
+ "path": ["token", "list"],
8375
+ "display": "/pan token list",
8376
+ "description": "List access tokens with scopes and created, last-used and revoked times",
8377
+ "args": [],
8378
+ "options": [{
8379
+ "flags": "--json",
8380
+ "description": "Print the tokens as JSON",
8381
+ "required": false,
8382
+ "valueHint": null
8383
+ }],
8384
+ "aliases": [],
8385
+ "category": "CLI"
8386
+ },
8387
+ {
8388
+ "id": "pan-token-revoke",
8389
+ "path": ["token", "revoke"],
8390
+ "display": "/pan token revoke",
8391
+ "description": "Revoke an access token and close its live connections",
8392
+ "args": [{
8393
+ "name": "id",
8394
+ "required": true,
8395
+ "variadic": false
8396
+ }],
8397
+ "options": [],
8398
+ "aliases": [],
8399
+ "category": "CLI"
8400
+ },
8401
+ {
8402
+ "id": "pan-mcp",
8403
+ "path": ["mcp"],
8404
+ "display": "/pan mcp",
8405
+ "description": "Serve Overdeck to MCP clients (see configuration/mcp.mdx)",
8406
+ "args": [],
8407
+ "options": [],
8408
+ "aliases": [],
8409
+ "category": "CLI"
8410
+ },
8411
+ {
8412
+ "id": "pan-mcp-serve",
8413
+ "path": ["mcp", "serve"],
8414
+ "display": "/pan mcp serve",
8415
+ "description": "Serve Overdeck as an MCP server over stdio (token from OVERDECK_MCP_TOKEN; see configuration/mcp.mdx)",
8416
+ "args": [],
8417
+ "options": [],
8418
+ "aliases": [],
8419
+ "category": "CLI"
8420
+ },
8421
+ {
8422
+ "id": "pan-triggers",
8423
+ "path": ["triggers"],
8424
+ "display": "/pan triggers",
8425
+ "description": "Manage webhook triggers that message or start conversations (see configuration/triggers.mdx)",
8426
+ "args": [],
8427
+ "options": [],
8428
+ "aliases": [],
8429
+ "category": "CLI"
8430
+ },
8431
+ {
8432
+ "id": "pan-triggers-add",
8433
+ "path": ["triggers", "add"],
8434
+ "display": "/pan triggers add",
8435
+ "description": "Create a trigger and print its secret URL once",
8436
+ "args": [{
8437
+ "name": "name",
8438
+ "required": true,
8439
+ "variadic": false
8440
+ }],
8441
+ "options": [
8442
+ {
8443
+ "flags": "--conversation <name-or-id>",
8444
+ "description": "Send each event as a message to this conversation",
8445
+ "required": true,
8446
+ "valueHint": "name-or-id"
8447
+ },
8448
+ {
8449
+ "flags": "--project <key>",
8450
+ "description": "Start a new conversation in this project for each event",
8451
+ "required": true,
8452
+ "valueHint": "key"
8453
+ },
8454
+ {
8455
+ "flags": "--prompt <text>",
8456
+ "description": "Prompt template placed before the event (required for --project)",
8457
+ "required": true,
8458
+ "valueHint": "text"
8459
+ },
8460
+ {
8461
+ "flags": "--prompt-file <path>",
8462
+ "description": "Read the prompt template from a file",
8463
+ "required": true,
8464
+ "valueHint": "path"
8465
+ },
8466
+ {
8467
+ "flags": "--verify <kind>",
8468
+ "description": "Signature check: none, github or stripe",
8469
+ "required": true,
8470
+ "valueHint": "kind"
8471
+ },
8472
+ {
8473
+ "flags": "--signing-secret <value>",
8474
+ "description": "HMAC signing secret (github generates one when omitted)",
8475
+ "required": true,
8476
+ "valueHint": "value"
8477
+ },
8478
+ {
8479
+ "flags": "--model <id>",
8480
+ "description": "Model for conversations a project trigger starts",
8481
+ "required": true,
8482
+ "valueHint": "id"
8483
+ },
8484
+ {
8485
+ "flags": "--harness <name>",
8486
+ "description": "Harness for conversations a project trigger starts",
8487
+ "required": true,
8488
+ "valueHint": "name"
8489
+ },
8490
+ {
8491
+ "flags": "--effort <level>",
8492
+ "description": "Reasoning effort for conversations a project trigger starts",
8493
+ "required": true,
8494
+ "valueHint": "level"
8495
+ },
8496
+ {
8497
+ "flags": "--inbox",
8498
+ "description": "Hold events while this machine is offline in an overdeck.ai inbox (Anywhere plan; needs the dashboard)",
8499
+ "required": false,
8500
+ "valueHint": null
8501
+ },
8502
+ {
8503
+ "flags": "--json",
8504
+ "description": "Print { trigger, hookPath, url, localUrl, funnelCommand, generatedSigningSecret } as JSON",
8505
+ "required": false,
8506
+ "valueHint": null
8507
+ }
8508
+ ],
8509
+ "aliases": [],
8510
+ "category": "CLI"
8511
+ },
8512
+ {
8513
+ "id": "pan-triggers-list",
8514
+ "path": ["triggers", "list"],
8515
+ "display": "/pan triggers list",
8516
+ "description": "List triggers with their targets and verification; never prints secrets",
8517
+ "args": [],
8518
+ "options": [{
8519
+ "flags": "--json",
8520
+ "description": "Print the triggers as JSON",
8521
+ "required": false,
8522
+ "valueHint": null
8523
+ }],
8524
+ "aliases": [],
8525
+ "category": "CLI"
8526
+ },
8527
+ {
8528
+ "id": "pan-triggers-remove",
8529
+ "path": ["triggers", "remove"],
8530
+ "display": "/pan triggers remove",
8531
+ "description": "Remove a trigger; its URL answers 404 at once",
8532
+ "args": [{
8533
+ "name": "id",
8534
+ "required": true,
8535
+ "variadic": false
8536
+ }],
8537
+ "options": [],
8538
+ "aliases": [],
8539
+ "category": "CLI"
8540
+ },
8541
+ {
8542
+ "id": "pan-triggers-set-secret",
8543
+ "path": ["triggers", "set-secret"],
8544
+ "display": "/pan triggers set-secret",
8545
+ "description": "Set the signing secret of a github or stripe trigger (reads one line from stdin without --secret)",
8546
+ "args": [{
8547
+ "name": "id",
8548
+ "required": true,
8549
+ "variadic": false
8550
+ }],
8551
+ "options": [{
8552
+ "flags": "--secret <value>",
8553
+ "description": "The signing secret",
8554
+ "required": true,
8555
+ "valueHint": "value"
8556
+ }],
8557
+ "aliases": [],
8558
+ "category": "CLI"
8559
+ },
8560
+ {
8561
+ "id": "pan-issues",
8562
+ "path": ["issues"],
8563
+ "display": "/pan issues",
8564
+ "description": "List and triage work across configured trackers",
8565
+ "args": [],
8566
+ "options": [
8567
+ {
8568
+ "flags": "--all",
8569
+ "description": "Include closed issues",
8570
+ "required": false,
8571
+ "valueHint": null
8572
+ },
8573
+ {
8574
+ "flags": "--mine",
8575
+ "description": "Show only my assigned issues",
8576
+ "required": false,
8577
+ "valueHint": null
8578
+ },
8579
+ {
8580
+ "flags": "--json",
8581
+ "description": "Output as JSON",
8582
+ "required": false,
8583
+ "valueHint": null
8584
+ },
8585
+ {
8586
+ "flags": "--tracker <type>",
8587
+ "description": "Query specific tracker (linear/github/gitlab)",
8588
+ "required": true,
8589
+ "valueHint": "type"
8590
+ },
8591
+ {
8592
+ "flags": "--all-trackers",
8593
+ "description": "Query all configured trackers",
8594
+ "required": false,
8595
+ "valueHint": null
8596
+ },
8597
+ {
8598
+ "flags": "--triage",
8599
+ "description": "Show triage queue",
8600
+ "required": false,
8601
+ "valueHint": null
8602
+ }
8603
+ ],
8604
+ "aliases": [],
8605
+ "category": "Lifecycle"
8606
+ },
8607
+ {
8608
+ "id": "pan-show",
8609
+ "path": ["show"],
8610
+ "display": "/pan show",
8611
+ "description": "Unified lens: derived issue state, CV, context, health for one issue",
8612
+ "args": [{
8613
+ "name": "id",
8614
+ "required": true,
8615
+ "variadic": false
8616
+ }],
8617
+ "options": [
8618
+ {
8619
+ "flags": "--cv",
8620
+ "description": "Agent work history only",
8621
+ "required": false,
8622
+ "valueHint": null
8623
+ },
8624
+ {
7673
8625
  "flags": "--context",
7674
8626
  "description": "Context engineering state only",
7675
8627
  "required": false,
@@ -7972,7 +8924,7 @@ const COMPOSER_COMMAND_MANIFEST = [
7972
8924
  "id": "pan-tell",
7973
8925
  "path": ["tell"],
7974
8926
  "display": "/pan tell",
7975
- "description": "Send message to running agent",
8927
+ "description": "Send message to running agent, or to a linked machine's conversation as @<machine>/<conv>",
7976
8928
  "args": [{
7977
8929
  "name": "id",
7978
8930
  "required": true,
@@ -7982,17 +8934,32 @@ const COMPOSER_COMMAND_MANIFEST = [
7982
8934
  "required": true,
7983
8935
  "variadic": false
7984
8936
  }],
7985
- "options": [{
7986
- "flags": "--force",
7987
- "description": "Deliver even to a critic or verifier lane that already filed its verdict",
7988
- "required": false,
7989
- "valueHint": null
7990
- }, {
7991
- "flags": "--steer",
7992
- "description": "Interrupt the running turn and send now (Claude Code send-now; Ctrl+X Ctrl+S)",
7993
- "required": false,
7994
- "valueHint": null
7995
- }],
8937
+ "options": [
8938
+ {
8939
+ "flags": "--force",
8940
+ "description": "Deliver even to a critic or verifier lane that already filed its verdict",
8941
+ "required": false,
8942
+ "valueHint": null
8943
+ },
8944
+ {
8945
+ "flags": "--steer",
8946
+ "description": "Interrupt the running turn and send now (Claude Code send-now; Ctrl+X Ctrl+S)",
8947
+ "required": false,
8948
+ "valueHint": null
8949
+ },
8950
+ {
8951
+ "flags": "--when-limit-resets",
8952
+ "description": "Queue the message on the server; it sends when the conversation's usage limit resets (conversations only)",
8953
+ "required": false,
8954
+ "valueHint": null
8955
+ },
8956
+ {
8957
+ "flags": "--message-id <id>",
8958
+ "description": "Idempotency key: a repeat with the same id is delivered once",
8959
+ "required": true,
8960
+ "valueHint": "id"
8961
+ }
8962
+ ],
7996
8963
  "aliases": [],
7997
8964
  "category": "Lifecycle"
7998
8965
  },
@@ -8721,20 +9688,44 @@ const COMPOSER_COMMAND_MANIFEST = [
8721
9688
  "valueHint": null
8722
9689
  },
8723
9690
  {
8724
- "flags": "--host",
8725
- "description": "Bypass workspace docker stack-health gate and spawn on the host",
8726
- "required": false,
8727
- "valueHint": null
9691
+ "flags": "--host",
9692
+ "description": "Bypass workspace docker stack-health gate and spawn on the host",
9693
+ "required": false,
9694
+ "valueHint": null
9695
+ },
9696
+ {
9697
+ "flags": "--yes",
9698
+ "description": "Confirm --host in non-interactive contexts",
9699
+ "required": false,
9700
+ "valueHint": null
9701
+ },
9702
+ {
9703
+ "flags": "--skip-freshness",
9704
+ "description": "Bypass the plan-freshness preflight and spawn even if the plan names files deleted since it was written",
9705
+ "required": false,
9706
+ "valueHint": null
9707
+ },
9708
+ {
9709
+ "flags": "--machine <label|auto>",
9710
+ "description": "Start the issue agent on a linked machine (label or environment id), or auto to place it by load",
9711
+ "required": true,
9712
+ "valueHint": "label|auto"
8728
9713
  },
8729
9714
  {
8730
- "flags": "--yes",
8731
- "description": "Confirm --host in non-interactive contexts",
9715
+ "flags": "--needs <tags>",
9716
+ "description": "Comma-separated capability tags the machine must have (docker, gpu, ios-sim, …)",
9717
+ "required": true,
9718
+ "valueHint": "tags"
9719
+ },
9720
+ {
9721
+ "flags": "--push-first",
9722
+ "description": "With --machine: push unpushed workspace commits before starting on the other machine",
8732
9723
  "required": false,
8733
9724
  "valueHint": null
8734
9725
  },
8735
9726
  {
8736
- "flags": "--skip-freshness",
8737
- "description": "Bypass the plan-freshness preflight and spawn even if the plan names files deleted since it was written",
9727
+ "flags": "--ignore-unpushed",
9728
+ "description": "With --machine: start even though local workspace commits are not pushed",
8738
9729
  "required": false,
8739
9730
  "valueHint": null
8740
9731
  }
@@ -10211,6 +11202,56 @@ const COMPOSER_COMMAND_MANIFEST = [
10211
11202
  "aliases": [],
10212
11203
  "category": "CLI"
10213
11204
  },
11205
+ {
11206
+ "id": "pan-account",
11207
+ "path": ["account"],
11208
+ "display": "/pan account",
11209
+ "description": "Optional overdeck.ai sign-in for this machine (directory and hosted features)",
11210
+ "args": [],
11211
+ "options": [],
11212
+ "aliases": [],
11213
+ "category": "CLI"
11214
+ },
11215
+ {
11216
+ "id": "pan-account-login",
11217
+ "path": ["account", "login"],
11218
+ "display": "/pan account login",
11219
+ "description": "Sign in to overdeck.ai with the device flow and store this machine's device token",
11220
+ "args": [],
11221
+ "options": [{
11222
+ "flags": "--base-url <url>",
11223
+ "description": "Account service URL (default https://account.overdeck.ai, or OVERDECK_ACCOUNT_URL)",
11224
+ "required": true,
11225
+ "valueHint": "url"
11226
+ }],
11227
+ "aliases": [],
11228
+ "category": "CLI"
11229
+ },
11230
+ {
11231
+ "id": "pan-account-status",
11232
+ "path": ["account", "status"],
11233
+ "display": "/pan account status",
11234
+ "description": "Show the signed-in GitHub account and this device",
11235
+ "args": [],
11236
+ "options": [{
11237
+ "flags": "--json",
11238
+ "description": "Output in JSON format",
11239
+ "required": false,
11240
+ "valueHint": null
11241
+ }],
11242
+ "aliases": [],
11243
+ "category": "CLI"
11244
+ },
11245
+ {
11246
+ "id": "pan-account-logout",
11247
+ "path": ["account", "logout"],
11248
+ "display": "/pan account logout",
11249
+ "description": "Revoke this machine's device token and delete it locally",
11250
+ "args": [],
11251
+ "options": [],
11252
+ "aliases": [],
11253
+ "category": "CLI"
11254
+ },
10214
11255
  {
10215
11256
  "id": "pan-test",
10216
11257
  "path": ["test"],
@@ -12752,6 +13793,28 @@ const COMPOSER_COMMAND_MANIFEST = [
12752
13793
  "aliases": [],
12753
13794
  "category": "Admin"
12754
13795
  },
13796
+ {
13797
+ "id": "pan-admin-config-set",
13798
+ "path": [
13799
+ "admin",
13800
+ "config",
13801
+ "set"
13802
+ ],
13803
+ "display": "/pan admin config set",
13804
+ "description": "Set one config.yaml value (dotted snake_case key; the value is parsed as YAML), keeping comments",
13805
+ "args": [{
13806
+ "name": "key",
13807
+ "required": true,
13808
+ "variadic": false
13809
+ }, {
13810
+ "name": "value",
13811
+ "required": true,
13812
+ "variadic": false
13813
+ }],
13814
+ "options": [],
13815
+ "aliases": [],
13816
+ "category": "Admin"
13817
+ },
12755
13818
  {
12756
13819
  "id": "pan-admin-hooks",
12757
13820
  "path": ["admin", "hooks"],
@@ -13236,6 +14299,68 @@ const COMPOSER_COMMAND_MANIFEST = [
13236
14299
  "aliases": ["transcript"],
13237
14300
  "category": "Conversation"
13238
14301
  },
14302
+ {
14303
+ "id": "pan-conversations-pending",
14304
+ "path": ["conversations", "pending"],
14305
+ "display": "/pan conversations pending",
14306
+ "description": "List messages queued to send when the conversation's usage limit resets",
14307
+ "args": [{
14308
+ "name": "conv",
14309
+ "required": true,
14310
+ "variadic": false
14311
+ }],
14312
+ "options": [{
14313
+ "flags": "--json",
14314
+ "description": "Print JSON",
14315
+ "required": false,
14316
+ "valueHint": null
14317
+ }],
14318
+ "aliases": [],
14319
+ "category": "Conversation"
14320
+ },
14321
+ {
14322
+ "id": "pan-conversations-pull",
14323
+ "path": ["conversations", "pull"],
14324
+ "display": "/pan conversations pull",
14325
+ "description": "Make this machine own a conversation that runs on a linked machine (@<machine>/<conv>)",
14326
+ "args": [{
14327
+ "name": "conv",
14328
+ "required": true,
14329
+ "variadic": false
14330
+ }],
14331
+ "options": [{
14332
+ "flags": "--stop-turn",
14333
+ "description": "Stop a running turn instead of waiting for it",
14334
+ "required": false,
14335
+ "valueHint": null
14336
+ }, {
14337
+ "flags": "--json",
14338
+ "description": "Print the final job state as JSON",
14339
+ "required": false,
14340
+ "valueHint": null
14341
+ }],
14342
+ "aliases": [],
14343
+ "category": "Conversation"
14344
+ },
14345
+ {
14346
+ "id": "pan-conversations-reclaim",
14347
+ "path": ["conversations", "reclaim"],
14348
+ "display": "/pan conversations reclaim",
14349
+ "description": "Take back a conversation this machine released when the other machine does not run it",
14350
+ "args": [{
14351
+ "name": "conv",
14352
+ "required": true,
14353
+ "variadic": false
14354
+ }],
14355
+ "options": [{
14356
+ "flags": "--force",
14357
+ "description": "Reclaim even when the other machine cannot be asked",
14358
+ "required": false,
14359
+ "valueHint": null
14360
+ }],
14361
+ "aliases": [],
14362
+ "category": "Conversation"
14363
+ },
13239
14364
  {
13240
14365
  "id": "pan-conversations-move",
13241
14366
  "path": ["conversations", "move"],
@@ -13283,11 +14408,206 @@ const COMPOSER_COMMAND_MANIFEST = [
13283
14408
  "display": "/pan conversations unlink-pr",
13284
14409
  "description": "Unlink a pull request from a conversation (the sweep will not re-add it)",
13285
14410
  "args": [{
13286
- "name": "query",
13287
- "required": true,
13288
- "variadic": false
13289
- }, {
13290
- "name": "ref",
14411
+ "name": "query",
14412
+ "required": true,
14413
+ "variadic": false
14414
+ }, {
14415
+ "name": "ref",
14416
+ "required": true,
14417
+ "variadic": false
14418
+ }],
14419
+ "options": [],
14420
+ "aliases": [],
14421
+ "category": "Conversation"
14422
+ },
14423
+ {
14424
+ "id": "pan-conversations-prs",
14425
+ "path": ["conversations", "prs"],
14426
+ "display": "/pan conversations prs",
14427
+ "description": "List the pull requests linked to a conversation (* = the one shown)",
14428
+ "args": [{
14429
+ "name": "query",
14430
+ "required": true,
14431
+ "variadic": false
14432
+ }],
14433
+ "options": [{
14434
+ "flags": "--json",
14435
+ "description": "Output { links, effective } as JSON",
14436
+ "required": false,
14437
+ "valueHint": null
14438
+ }],
14439
+ "aliases": [],
14440
+ "category": "Conversation"
14441
+ },
14442
+ {
14443
+ "id": "pan-conversations-auto-settle-on-merge",
14444
+ "path": ["conversations", "auto-settle-on-merge"],
14445
+ "display": "/pan conversations auto-settle-on-merge",
14446
+ "description": "Show or set (on|off) settling conversations once all their linked PRs are merged or closed (default on)",
14447
+ "args": [{
14448
+ "name": "value",
14449
+ "required": false,
14450
+ "variadic": false
14451
+ }],
14452
+ "options": [],
14453
+ "aliases": [],
14454
+ "category": "Conversation"
14455
+ },
14456
+ {
14457
+ "id": "pan-conversations-auto-settle",
14458
+ "path": ["conversations", "auto-settle"],
14459
+ "display": "/pan conversations auto-settle",
14460
+ "description": "Show or set (on|off|inherit) one conversation's auto-settle-on-merge override",
14461
+ "args": [{
14462
+ "name": "query",
14463
+ "required": true,
14464
+ "variadic": false
14465
+ }, {
14466
+ "name": "value",
14467
+ "required": false,
14468
+ "variadic": false
14469
+ }],
14470
+ "options": [],
14471
+ "aliases": [],
14472
+ "category": "Conversation"
14473
+ },
14474
+ {
14475
+ "id": "pan-conversations-auto-settle-idle-days",
14476
+ "path": ["conversations", "auto-settle-idle-days"],
14477
+ "display": "/pan conversations auto-settle-idle-days",
14478
+ "description": "Show or set how many days without activity before an operator conversation is settled (0 = off, default 3)",
14479
+ "args": [{
14480
+ "name": "days",
14481
+ "required": false,
14482
+ "variadic": false
14483
+ }],
14484
+ "options": [],
14485
+ "aliases": [],
14486
+ "category": "Conversation"
14487
+ },
14488
+ {
14489
+ "id": "pan-conversations-schedule",
14490
+ "path": ["conversations", "schedule"],
14491
+ "display": "/pan conversations schedule",
14492
+ "description": "Run a prompt in a conversation on a recurring schedule (Overdeck fires it, even after restarts)",
14493
+ "args": [],
14494
+ "options": [],
14495
+ "aliases": [],
14496
+ "category": "Conversation"
14497
+ },
14498
+ {
14499
+ "id": "pan-conversations-schedule-add",
14500
+ "path": [
14501
+ "conversations",
14502
+ "schedule",
14503
+ "add"
14504
+ ],
14505
+ "display": "/pan conversations schedule add",
14506
+ "description": "Add a schedule; <conv> is self, a conversation number, a name, or a title match",
14507
+ "args": [{
14508
+ "name": "conv",
14509
+ "required": true,
14510
+ "variadic": false
14511
+ }],
14512
+ "options": [
14513
+ {
14514
+ "flags": "--cron <expr>",
14515
+ "description": "5-field cron expression, evaluated in --tz",
14516
+ "required": true,
14517
+ "valueHint": "expr"
14518
+ },
14519
+ {
14520
+ "flags": "--hourly",
14521
+ "description": "Every hour on the hour",
14522
+ "required": false,
14523
+ "valueHint": null
14524
+ },
14525
+ {
14526
+ "flags": "--daily <HH:MM>",
14527
+ "description": "Every day at HH:MM",
14528
+ "required": true,
14529
+ "valueHint": "HH:MM"
14530
+ },
14531
+ {
14532
+ "flags": "--weekdays <HH:MM>",
14533
+ "description": "Monday to Friday at HH:MM",
14534
+ "required": true,
14535
+ "valueHint": "HH:MM"
14536
+ },
14537
+ {
14538
+ "flags": "--weekly <spec>",
14539
+ "description": "Once a week: \"<day> HH:MM\", e.g. \"mon 09:00\"",
14540
+ "required": true,
14541
+ "valueHint": "spec"
14542
+ },
14543
+ {
14544
+ "flags": "--prompt <text>",
14545
+ "description": "The prompt to send",
14546
+ "required": true,
14547
+ "valueHint": "text"
14548
+ },
14549
+ {
14550
+ "flags": "--prompt-file <path>",
14551
+ "description": "Read the prompt from a file",
14552
+ "required": true,
14553
+ "valueHint": "path"
14554
+ },
14555
+ {
14556
+ "flags": "--tz <zone>",
14557
+ "description": "IANA time zone (default: this machine's zone)",
14558
+ "required": true,
14559
+ "valueHint": "zone"
14560
+ },
14561
+ {
14562
+ "flags": "--paused",
14563
+ "description": "Create the schedule paused",
14564
+ "required": false,
14565
+ "valueHint": null
14566
+ },
14567
+ {
14568
+ "flags": "--json",
14569
+ "description": "Output the created schedule as JSON",
14570
+ "required": false,
14571
+ "valueHint": null
14572
+ }
14573
+ ],
14574
+ "aliases": [],
14575
+ "category": "Conversation"
14576
+ },
14577
+ {
14578
+ "id": "pan-conversations-schedule-list",
14579
+ "path": [
14580
+ "conversations",
14581
+ "schedule",
14582
+ "list"
14583
+ ],
14584
+ "display": "/pan conversations schedule list",
14585
+ "description": "List schedules (all, or one conversation's)",
14586
+ "args": [{
14587
+ "name": "conv",
14588
+ "required": false,
14589
+ "variadic": false
14590
+ }],
14591
+ "options": [{
14592
+ "flags": "--json",
14593
+ "description": "Output as JSON",
14594
+ "required": false,
14595
+ "valueHint": null
14596
+ }],
14597
+ "aliases": [],
14598
+ "category": "Conversation"
14599
+ },
14600
+ {
14601
+ "id": "pan-conversations-schedule-pause",
14602
+ "path": [
14603
+ "conversations",
14604
+ "schedule",
14605
+ "pause"
14606
+ ],
14607
+ "display": "/pan conversations schedule pause",
14608
+ "description": "Pause a schedule",
14609
+ "args": [{
14610
+ "name": "id",
13291
14611
  "required": true,
13292
14612
  "variadic": false
13293
14613
  }],
@@ -13296,32 +14616,35 @@ const COMPOSER_COMMAND_MANIFEST = [
13296
14616
  "category": "Conversation"
13297
14617
  },
13298
14618
  {
13299
- "id": "pan-conversations-prs",
13300
- "path": ["conversations", "prs"],
13301
- "display": "/pan conversations prs",
13302
- "description": "List the pull requests linked to a conversation (* = the one shown)",
14619
+ "id": "pan-conversations-schedule-resume",
14620
+ "path": [
14621
+ "conversations",
14622
+ "schedule",
14623
+ "resume"
14624
+ ],
14625
+ "display": "/pan conversations schedule resume",
14626
+ "description": "Resume a paused schedule; the next run is computed from now",
13303
14627
  "args": [{
13304
- "name": "query",
14628
+ "name": "id",
13305
14629
  "required": true,
13306
14630
  "variadic": false
13307
14631
  }],
13308
- "options": [{
13309
- "flags": "--json",
13310
- "description": "Output { links, effective } as JSON",
13311
- "required": false,
13312
- "valueHint": null
13313
- }],
14632
+ "options": [],
13314
14633
  "aliases": [],
13315
14634
  "category": "Conversation"
13316
14635
  },
13317
14636
  {
13318
- "id": "pan-conversations-auto-archive-on-merge",
13319
- "path": ["conversations", "auto-archive-on-merge"],
13320
- "display": "/pan conversations auto-archive-on-merge",
13321
- "description": "Show or set (on|off) archiving operator conversations once all their linked PRs are merged or closed (default off)",
14637
+ "id": "pan-conversations-schedule-rm",
14638
+ "path": [
14639
+ "conversations",
14640
+ "schedule",
14641
+ "rm"
14642
+ ],
14643
+ "display": "/pan conversations schedule rm",
14644
+ "description": "Delete a schedule",
13322
14645
  "args": [{
13323
- "name": "value",
13324
- "required": false,
14646
+ "name": "id",
14647
+ "required": true,
13325
14648
  "variadic": false
13326
14649
  }],
13327
14650
  "options": [],
@@ -13907,6 +15230,30 @@ const COMPOSER_COMMAND_MANIFEST = [
13907
15230
  "description": "Stop the worker after its first report",
13908
15231
  "required": false,
13909
15232
  "valueHint": null
15233
+ },
15234
+ {
15235
+ "flags": "--machine <label|auto>",
15236
+ "description": "Run on a linked machine (label or environment id), or auto to place it by load",
15237
+ "required": true,
15238
+ "valueHint": "label|auto"
15239
+ },
15240
+ {
15241
+ "flags": "--needs <tags>",
15242
+ "description": "Comma-separated capability tags the machine must have (docker, gpu, ios-sim, …)",
15243
+ "required": true,
15244
+ "valueHint": "tags"
15245
+ },
15246
+ {
15247
+ "flags": "--push-first",
15248
+ "description": "With --machine: push unpushed commits before starting on the other machine",
15249
+ "required": false,
15250
+ "valueHint": null
15251
+ },
15252
+ {
15253
+ "flags": "--ignore-unpushed",
15254
+ "description": "With --machine: start even though local commits are not pushed",
15255
+ "required": false,
15256
+ "valueHint": null
13910
15257
  }
13911
15258
  ],
13912
15259
  "aliases": [],
@@ -14206,6 +15553,18 @@ const COMPOSER_COMMAND_MANIFEST = [
14206
15553
  "required": false,
14207
15554
  "valueHint": null
14208
15555
  },
15556
+ {
15557
+ "flags": "--machine <label|auto>",
15558
+ "description": "Where to run: a linked machine's label or environment id, or auto",
15559
+ "required": true,
15560
+ "valueHint": "label|auto"
15561
+ },
15562
+ {
15563
+ "flags": "--needs <tags>",
15564
+ "description": "With --machine auto: comma-separated capability tags the machine must have",
15565
+ "required": true,
15566
+ "valueHint": "tags"
15567
+ },
14209
15568
  {
14210
15569
  "flags": "--no-wait",
14211
15570
  "description": "Return without waiting for the lane to start",
@@ -14380,7 +15739,7 @@ const COMPOSER_COMMAND_MANIFEST = [
14380
15739
  "id": "pan-lane-stop",
14381
15740
  "path": ["lane", "stop"],
14382
15741
  "display": "/pan lane stop",
14383
- "description": "Stop a lane through the conversation stop door",
15742
+ "description": "Stop a lane through the conversation stop door (on its own machine for a remote lane)",
14384
15743
  "args": [{
14385
15744
  "name": "lane",
14386
15745
  "required": true,
@@ -15537,6 +16896,11 @@ const COMPOSER_COMMAND_MANIFEST = [
15537
16896
  "description": "Exit non-zero if any optional dependency is missing (e.g. Pi binary)",
15538
16897
  "required": false,
15539
16898
  "valueHint": null
16899
+ }, {
16900
+ "flags": "--json",
16901
+ "description": "Print every check as JSON (name, status, message, fix); same exit code as text mode",
16902
+ "required": false,
16903
+ "valueHint": null
15540
16904
  }],
15541
16905
  "aliases": [],
15542
16906
  "category": "Core"
@@ -15556,6 +16920,47 @@ const COMPOSER_COMMAND_MANIFEST = [
15556
16920
  "aliases": [],
15557
16921
  "category": "Core"
15558
16922
  },
16923
+ {
16924
+ "id": "pan-diagnose",
16925
+ "path": ["diagnose"],
16926
+ "display": "/pan diagnose",
16927
+ "description": "Collect a redacted diagnostic bundle and start Claude Code or Codex to fix the problem",
16928
+ "args": [],
16929
+ "options": [
16930
+ {
16931
+ "flags": "--harness <harness>",
16932
+ "description": "Harness to start",
16933
+ "required": true,
16934
+ "valueHint": "harness"
16935
+ },
16936
+ {
16937
+ "flags": "--describe <text>",
16938
+ "description": "What went wrong, in your words (saved in the bundle)",
16939
+ "required": true,
16940
+ "valueHint": "text"
16941
+ },
16942
+ {
16943
+ "flags": "--bundle-only",
16944
+ "description": "Write the bundle and print its path; do not start a harness",
16945
+ "required": false,
16946
+ "valueHint": null
16947
+ },
16948
+ {
16949
+ "flags": "--no-issue",
16950
+ "description": "Do not let the session draft or create an upstream issue",
16951
+ "required": false,
16952
+ "valueHint": null
16953
+ },
16954
+ {
16955
+ "flags": "--yes",
16956
+ "description": "Start the harness without asking to confirm the bundle",
16957
+ "required": false,
16958
+ "valueHint": null
16959
+ }
16960
+ ],
16961
+ "aliases": [],
16962
+ "category": "CLI"
16963
+ },
15559
16964
  {
15560
16965
  "id": "pan-resources",
15561
16966
  "path": ["resources"],
@@ -15875,6 +17280,11 @@ const COMPOSER_COMMAND_MANIFEST = [
15875
17280
  "description": "Port to listen on",
15876
17281
  "required": true,
15877
17282
  "valueHint": "port"
17283
+ }, {
17284
+ "flags": "--no-open",
17285
+ "description": "Do not open a browser",
17286
+ "required": false,
17287
+ "valueHint": null
15878
17288
  }],
15879
17289
  "aliases": [],
15880
17290
  "category": "CLI"
@@ -16277,6 +17687,39 @@ function isConfiguredPullRequestRepo(ref, repos) {
16277
17687
  return repos.some((repo) => repo.host === ref.host && repo.repository === ref.repository);
16278
17688
  }
16279
17689
  //#endregion
17690
+ //#region src/tracker-issue-ref.ts
17691
+ const GITHUB_ISSUE = /^(?:https?:\/\/)?github\.com\/([\w.-]+\/[\w.-]+)\/issues\/(\d+)\/?(?:[?#].*)?$/i;
17692
+ const LINEAR_ISSUE = /^(?:https?:\/\/)?linear\.app\/[\w.-]+\/issue\/([A-Za-z]+-\d+)(?:\/[^?#]*)?(?:[?#].*)?$/i;
17693
+ function parseTrackerIssueUrl(input) {
17694
+ const text = input.trim();
17695
+ const github = GITHUB_ISSUE.exec(text);
17696
+ if (github) {
17697
+ const number = Number(github[2]);
17698
+ if (!Number.isSafeInteger(number) || number <= 0) return null;
17699
+ return {
17700
+ tracker: "github",
17701
+ repository: github[1].toLowerCase().replace(/\.git$/, ""),
17702
+ number
17703
+ };
17704
+ }
17705
+ const linear = LINEAR_ISSUE.exec(text);
17706
+ if (linear) return {
17707
+ tracker: "linear",
17708
+ identifier: linear[1].toUpperCase()
17709
+ };
17710
+ return null;
17711
+ }
17712
+ function resolveTrackerIssueId(ref, projects) {
17713
+ for (const project of projects) {
17714
+ const prefix = typeof project?.linearTeam === "string" ? project.linearTeam.trim().toUpperCase() : "";
17715
+ if (!prefix || project.tracker !== ref.tracker) continue;
17716
+ if (ref.tracker === "github") {
17717
+ if (project.githubRepo?.toLowerCase() === ref.repository) return `${prefix}-${ref.number}`;
17718
+ } else if (ref.identifier.slice(0, ref.identifier.lastIndexOf("-")) === prefix) return ref.identifier;
17719
+ }
17720
+ return null;
17721
+ }
17722
+ //#endregion
16280
17723
  //#region src/conversation-rows.ts
16281
17724
  /**
16282
17725
  * Conversation-row classifiers shared by the dashboard server (`src/lib`) and
@@ -16380,6 +17823,241 @@ function hasToolResult(e) {
16380
17823
  return !!e.result || (e.resultBytes ?? 0) > 0;
16381
17824
  }
16382
17825
  //#endregion
17826
+ //#region src/machines.ts
17827
+ /**
17828
+ * Secure-channel link protocol version (D-4645-11). Independent of
17829
+ * `ENVIRONMENT_PROTOCOL_VERSION`: a peer whose descriptor reports another value,
17830
+ * or no `capabilities.machineLinks`, is `unsupported`.
17831
+ */
17832
+ const LINK_PROTOCOL_VERSION = 1;
17833
+ /** The exact command that installs one Overdeck version (PAN-4654 FR-1, D-2). */
17834
+ function overdeckInstallCommand(version) {
17835
+ return `npm install -g @overdeck/core@${version}`;
17836
+ }
17837
+ /** Route kinds, ranked best to worst (D-10 of the Anywhere PRD). */
17838
+ const ROUTE_KINDS = [
17839
+ "lan",
17840
+ "tailnet",
17841
+ "ssh",
17842
+ "public",
17843
+ "direct",
17844
+ "relay"
17845
+ ];
17846
+ const RouteKind = Schema.Literals(ROUTE_KINDS);
17847
+ /**
17848
+ * Where a route on a link came from. `directory` routes (PAN-2356) are dynamic: offered while the
17849
+ * overdeck.ai directory lists the peer, never stored in machine-links.json.
17850
+ */
17851
+ const RouteSource = Schema.Literals([
17852
+ "pairing",
17853
+ "manual",
17854
+ "advertised",
17855
+ "directory"
17856
+ ]);
17857
+ /** An endpoint a machine advertises in its descriptor (`lan` and `tailnet` only in this issue). */
17858
+ const AdvertisedEndpoint = Schema.Struct({
17859
+ kind: Schema.Literals(["lan", "tailnet"]),
17860
+ /** `tcp://host:port` or `wss://host[:port]/ws/link`. */
17861
+ url: Schema.String
17862
+ });
17863
+ /** Link supervisor state (FR-3). */
17864
+ const LinkState = Schema.Literals([
17865
+ "online",
17866
+ "connecting",
17867
+ "offline",
17868
+ "unsupported",
17869
+ "revoked"
17870
+ ]);
17871
+ /** Access level of a link (FR-4). */
17872
+ const LinkAccess = Schema.Literals(["operator", "agent-fenced"]);
17873
+ /** Last known result of probing one route. */
17874
+ const LinkRouteStatus = Schema.Literals([
17875
+ "untried",
17876
+ "current",
17877
+ "reachable",
17878
+ "unreachable"
17879
+ ]);
17880
+ const LinkRouteView = Schema.Struct({
17881
+ url: Schema.String,
17882
+ kind: RouteKind,
17883
+ source: RouteSource,
17884
+ status: LinkRouteStatus
17885
+ });
17886
+ /** A heartbeat gap, diagnosed as a peer freeze or a network failure (FR-9). */
17887
+ const LinkIncident = Schema.Struct({
17888
+ kind: Schema.Literals(["froze", "network"]),
17889
+ durationMs: Schema.Number,
17890
+ /** ISO-8601 UTC time the gap ended, in the linking machine's clock. */
17891
+ at: Schema.String
17892
+ });
17893
+ /** Whether the linking server started the SSH host's Overdeck or adopted one already running (PAN-4404). */
17894
+ const SshLaunch = Schema.Literals(["managed", "external"]);
17895
+ /** State of the local SSH port forward that carries an SSH machine's link (PAN-4404 D-4404-10). */
17896
+ const SshForwardState = Schema.Literals([
17897
+ "starting",
17898
+ "up",
17899
+ "down",
17900
+ "attention"
17901
+ ]);
17902
+ /** The SSH side of a link that this server set up over SSH. */
17903
+ const SshLinkInfo = Schema.Struct({
17904
+ destination: Schema.String,
17905
+ launch: SshLaunch,
17906
+ forward: SshForwardState,
17907
+ forwardDetail: Schema.NullOr(Schema.String),
17908
+ localPort: Schema.Number,
17909
+ remotePort: Schema.Number
17910
+ });
17911
+ /** PAN-4651 D-4651-8: a machine's load, sampled every 15 s and carried in the link heartbeat. */
17912
+ const LoadSample = Schema.Struct({
17913
+ /** CPU PSI `some avg10` (percent); null off Linux. */
17914
+ cpuPsiSomeAvg10: Schema.NullOr(Schema.Number),
17915
+ cpuSaturated: Schema.Boolean,
17916
+ memAvailableBytes: Schema.NullOr(Schema.Number),
17917
+ workingAgents: Schema.Number,
17918
+ sampledAt: Schema.String
17919
+ });
17920
+ /** PAN-4651 FR-7: `on-request` reserves a machine — Auto skips it unless only it has a needed tag. */
17921
+ const MachinePlacementMode = Schema.Literals(["auto", "on-request"]);
17922
+ /** PAN-4651 FR-6: `CPU 3% · 41 GB · 2 agents` (unknown parts `n/a`); null without a sample. */
17923
+ function formatMachineLoad(load) {
17924
+ if (!load) return null;
17925
+ return `CPU ${load.cpuPsiSomeAvg10 === null ? "n/a" : `${Math.round(load.cpuPsiSomeAvg10)}%`} · ${load.memAvailableBytes === null ? "n/a" : `${Math.floor(load.memAvailableBytes / 2 ** 30)}`} GB · ${load.workingAgents} agents`;
17926
+ }
17927
+ /** PAN-4651 FR-7: `tags: docker, linux · reserved`; null when there is neither. */
17928
+ function formatMachineProfile(tags, placement) {
17929
+ const parts = [...tags && tags.length > 0 ? [`tags: ${tags.join(", ")}`] : [], ...placement === "on-request" ? ["reserved"] : []];
17930
+ return parts.length > 0 ? parts.join(" · ") : null;
17931
+ }
17932
+ /** PAN-4651 D-4651-9: why Auto placement skipped one machine. */
17933
+ const PlacementRejection = Schema.Struct({
17934
+ environmentId: Schema.String,
17935
+ label: Schema.String,
17936
+ /** `offline`, `unsupported`, `no project`, `no <tag>`, `CPU saturated` or `reserved`. */
17937
+ reason: Schema.String
17938
+ });
17939
+ /** PAN-4651 D-4651-9: the machine Auto chose (with the one-line reason), or why none fits. */
17940
+ const PlacementAnswer = Schema.Union([Schema.Struct({
17941
+ ok: Schema.Literal(true),
17942
+ environmentId: Schema.String,
17943
+ label: Schema.String,
17944
+ self: Schema.Boolean,
17945
+ reason: Schema.String,
17946
+ rejections: Schema.Array(PlacementRejection)
17947
+ }), Schema.Struct({
17948
+ ok: Schema.Literal(false),
17949
+ rejections: Schema.Array(PlacementRejection)
17950
+ })]);
17951
+ /** PAN-4651 D-4651-11: one project a machine has registered, as linked machines see it (never a path). */
17952
+ const MachineProject = Schema.Struct({
17953
+ key: Schema.String,
17954
+ name: Schema.String,
17955
+ /** `github.com/<owner>/<repo>` or `gitlab.com/<path>`; null when the project has no remote repo. */
17956
+ gitOrigin: Schema.NullOr(Schema.String)
17957
+ });
17958
+ /** PAN-4651 D-4651-13: one repository across machines, as `GET /api/fleet/projects` lists it. */
17959
+ const FleetProjectRow = Schema.Struct({
17960
+ /** The git origin slug; null for a local project without one (its own row). */
17961
+ gitOrigin: Schema.NullOr(Schema.String),
17962
+ name: Schema.String,
17963
+ /** This machine's project for the slug, or null when only other machines have it. */
17964
+ local: Schema.NullOr(Schema.Struct({ key: Schema.String })),
17965
+ machines: Schema.Array(Schema.Struct({
17966
+ environmentId: Schema.String,
17967
+ label: Schema.String,
17968
+ key: Schema.String,
17969
+ state: LinkState
17970
+ }))
17971
+ });
17972
+ const FleetProjectsResponse = Schema.Struct({
17973
+ combine: Schema.Boolean,
17974
+ projects: Schema.Array(FleetProjectRow)
17975
+ });
17976
+ /** One outbound link as shown by `GET /api/machines` and `pan machines list`. */
17977
+ const MachineLinkView = Schema.Struct({
17978
+ id: Schema.String,
17979
+ environmentId: Schema.String,
17980
+ label: Schema.String,
17981
+ /** Fingerprint of the pinned machine key: five dash-separated groups of four hex. */
17982
+ fingerprint: Schema.String,
17983
+ access: LinkAccess,
17984
+ state: LinkState,
17985
+ stateDetail: Schema.NullOr(Schema.String),
17986
+ currentRoute: Schema.NullOr(Schema.String),
17987
+ routes: Schema.Array(LinkRouteView),
17988
+ lastHeartbeatAt: Schema.NullOr(Schema.String),
17989
+ incident: Schema.NullOr(LinkIncident),
17990
+ peerVersion: Schema.NullOr(Schema.String),
17991
+ createdAt: Schema.String,
17992
+ /** PAN-4650: Hide this machine — its conversations are left out of the conversation list. */
17993
+ hidden: Schema.optional(Schema.Boolean),
17994
+ /** Present only on links this server set up over SSH. */
17995
+ ssh: Schema.optional(SshLinkInfo),
17996
+ /** PAN-4651: the peer's last heartbeat load sample; null before one arrives or from a peer that predates it. */
17997
+ load: Schema.optional(Schema.NullOr(LoadSample)),
17998
+ /** PAN-4651: the peer's capability tags (detected plus `anywhere.machine.tags`). */
17999
+ tags: Schema.optional(Schema.Array(Schema.String)),
18000
+ placement: Schema.optional(MachinePlacementMode)
18001
+ });
18002
+ /** One `machine` token this machine issued to another machine (inbound access). */
18003
+ const InboundMachineView = Schema.Struct({
18004
+ tokenId: Schema.String,
18005
+ environmentId: Schema.String,
18006
+ label: Schema.String,
18007
+ fingerprint: Schema.String,
18008
+ access: LinkAccess,
18009
+ createdAt: Schema.String,
18010
+ lastUsedAt: Schema.NullOr(Schema.String)
18011
+ });
18012
+ const MachinesResponse = Schema.Struct({
18013
+ self: Schema.Struct({
18014
+ environmentId: Schema.String,
18015
+ label: Schema.String,
18016
+ fingerprint: Schema.String,
18017
+ /** PAN-4650 D-4: linked machines list this machine's conversations (anywhere.json, default on). */
18018
+ shareConversations: Schema.Boolean,
18019
+ /** PAN-4651 D-4651-13: one project per git origin across machines (anywhere.json, default on). */
18020
+ combineRepositories: Schema.optional(Schema.Boolean),
18021
+ /** PAN-4651: this machine's own load sample, tags and placement mode. */
18022
+ load: Schema.optional(Schema.NullOr(LoadSample)),
18023
+ tags: Schema.optional(Schema.Array(Schema.String)),
18024
+ placement: Schema.optional(MachinePlacementMode)
18025
+ }),
18026
+ links: Schema.Array(MachineLinkView),
18027
+ inbound: Schema.Array(InboundMachineView)
18028
+ });
18029
+ /**
18030
+ * Version of the `OVERDECK_SSH_HELPER` result line that `pan machines ssh-helper`
18031
+ * prints on the SSH host (PAN-4404).
18032
+ */
18033
+ const SSH_HELPER_PROTOCOL = 1;
18034
+ /** Error codes of the SSH machine flow (PAN-4404 D-4404-9). */
18035
+ const SSH_MACHINE_ERROR_CODES = [
18036
+ "bad-destination",
18037
+ "busy",
18038
+ "unresolvable",
18039
+ "unreachable",
18040
+ "host-key",
18041
+ "auth-failed",
18042
+ "pan-missing",
18043
+ "version-mismatch",
18044
+ "helper-failed",
18045
+ "start-failed",
18046
+ "forward-failed",
18047
+ "self-link",
18048
+ "not-found"
18049
+ ];
18050
+ const SshMachineErrorCode = Schema.Literals(SSH_MACHINE_ERROR_CODES);
18051
+ /** Answer of `POST /api/machines/ssh/test` and `pan machines test-ssh`. */
18052
+ const SshTestResult = Schema.Struct({
18053
+ reachable: Schema.Boolean,
18054
+ panVersion: Schema.NullOr(Schema.String),
18055
+ localVersion: Schema.String,
18056
+ versionMatches: Schema.Boolean,
18057
+ error: Schema.NullOr(SshMachineErrorCode),
18058
+ message: Schema.NullOr(Schema.String)
18059
+ });
18060
+ //#endregion
16383
18061
  //#region src/environment.ts
16384
18062
  /** Wire protocol version a client and server must agree on. */
16385
18063
  const ENVIRONMENT_PROTOCOL_VERSION = 1;
@@ -16390,7 +18068,9 @@ const EnvironmentCapabilities = Schema.Struct({
16390
18068
  /** `GET/DELETE /api/devices` is available. */
16391
18069
  deviceSessions: Schema.Boolean,
16392
18070
  /** `/ws/*` upgrades require a credential (PAN-1166). */
16393
- terminalAuth: Schema.Boolean
18071
+ terminalAuth: Schema.Boolean,
18072
+ /** Secure machine links are accepted (PAN-4645). Absent on older servers ⇒ `unsupported`. */
18073
+ machineLinks: Schema.optional(Schema.Boolean)
16394
18074
  });
16395
18075
  const EnvironmentDescriptor = Schema.Struct({
16396
18076
  descriptorVersion: Schema.Literal(1),
@@ -16404,7 +18084,13 @@ const EnvironmentDescriptor = Schema.Struct({
16404
18084
  serverVersion: Schema.String,
16405
18085
  /** The server's `ENVIRONMENT_PROTOCOL_VERSION`. */
16406
18086
  protocolVersion: Schema.Number,
16407
- capabilities: EnvironmentCapabilities
18087
+ capabilities: EnvironmentCapabilities,
18088
+ /** Long-term X25519 machine public key, 64 lowercase hex (PAN-4645). */
18089
+ machineKey: Schema.optional(Schema.String),
18090
+ /** The server's `LINK_PROTOCOL_VERSION`; optional so older descriptors still decode (D-4645-11). */
18091
+ linkProtocol: Schema.optional(Schema.Number),
18092
+ /** Endpoints this machine advertises for secure channels. */
18093
+ endpoints: Schema.optional(Schema.Array(AdvertisedEndpoint))
16408
18094
  });
16409
18095
  /** A server-local id qualified by the environment that owns it. */
16410
18096
  const ScopedRef = (localId) => Schema.Struct({
@@ -16421,6 +18107,537 @@ function isProtocolCompatible(descriptor, clientProtocolVersion) {
16421
18107
  return descriptor.protocolVersion === clientProtocolVersion;
16422
18108
  }
16423
18109
  //#endregion
16424
- export { ACP_BEHAVIOR, ACP_CAPABILITIES, AGENT_ROLES, Activity, ActivityDetailedEvent, ActivityEntryEvent, ActivityTtsEvent, ActivityUpdatedEvent, AdmissionState, AgentActivityChangedEvent, AgentChannelReply, AgentChannelReplyEvent, AgentCompletedEvent, AgentContextSaturationChangedEvent, AgentCreatedEvent, AgentCurrentIssueSetEvent, AgentDirectoryResponse, AgentEnrichmentChangedEvent, AgentHealthKind, AgentHealthSnapshot, AgentHealthStatus, AgentHeartbeatDeadEvent, AgentHookFiredEvent, AgentId, AgentMessageReceivedEvent, AgentModelSetEvent, AgentOutput, AgentOutputReceivedEvent, AgentPermissionRequestedEvent, AgentPermissionResolvedEvent, AgentResolution, AgentResolutionChangedEvent, AgentRuntimeSnapshot, AgentSnapshot, AgentStartedEvent, AgentStateRestoredEvent, AgentStatus, AgentStatusChangedEvent, AgentStoppedEvent, AgentThinkingStartedEvent, AgentThinkingStoppedEvent, AgentTurnDiffCompletedEvent, AgentWaitingClearedEvent, AgentWaitingStartedEvent, ArtifactAgentHarness, ArtifactAgentRole, ArtifactCreateResponse, ArtifactDetailResponse, ArtifactHash, ArtifactId, ArtifactLifecycleState, ArtifactListEntry, ArtifactListResponse, ArtifactMetadata, ArtifactPublishResponse, ArtifactSlug, ArtifactStatusResponse, ArtifactUnshareResponse, ArtifactUrls, ArtifactValidationCode, ArtifactValidationFinding, ArtifactValidationResult, BackendPane, BackendPaneChangedEvent, BackendPaneRemovedEvent, BeadsFreshnessChangedEvent, CHANNEL_REPLY_KIND_VALUES, CLAUDE_CODE_BEHAVIOR, CLAUDE_CODE_CAPABILITIES, CODEX_BEHAVIOR, CODEX_CAPABILITIES, COMPANION_TERMINAL_CLOSE_BODY_KEYS, COMPANION_TERMINAL_OPEN_BODY_KEYS, COMPOSER_COMMAND_INSERT_OVERRIDES, COMPOSER_COMMAND_MANIFEST, COMPOSER_COMMAND_VARIANTS, CONTEXT_LAYER_KINDS, CONTEXT_PREVIEW_HARNESSES, CONVERSATION_PAGE_DEFAULT_LIMIT, CONVERSATION_PAGE_MAX_LIMIT, CONVERSATION_PAYLOAD_BUDGET_BYTES, CONVERSATION_WINDOW_MAX_BYTES, CONVERSATION_WINDOW_MAX_ROWS, ChannelPermissionRequestSnapshot, ChannelReplyArtifactRef, ChannelReplyKind, ChatMessage, ClaudeChannelPermissionBehavior, CompactBoundary, ContextEditableLayerRecord, ContextHarnessPreviews, ContextLayerDraft, ContextLayerKind, ContextLayerSaveRequest, ContextLayerSaveResponse, ContextLayerTarget, ContextLayersResponse, ContextPreviewDiagnostic, ContextPreviewHarness, ContextPreviewRequest, ContextPreviewResponse, ContextProjectSummary, ContextSyncRequest, ContextSyncResponse, ContextSyncTarget, ContextUsage, ContextWorkspaceSummary, ConversationCompactingChangedEvent, ConversationCostSummary, ConversationCreatedEvent, ConversationEvent, ConversationFilter, ConversationMovedEvent, ConversationPermissionChangedEvent, ConversationPullRequests, ConversationPullRequestsChangedEvent, ConversationResponse, ConversationResume, ConversationTitleChangedEvent, ConversationWindow, CostEventRecordedEvent, DEFAULT_EFFORT, DEFAULT_MAX_MEMORY_OBSERVATIONS_PER_ISSUE, DEFAULT_MAX_TURN_DIFF_SUMMARIES_PER_AGENT, DashboardLifecycleCompletedEvent, DashboardLifecycleFailedEvent, DashboardLifecycleStartedEvent, DashboardSnapshot, DeepWipeRpc, DeployStalenessSnapshot, DerivedBranchState, DerivedIssueState, DerivedPrOutsidePipeline, DerivedPrState, DerivedWorkStart, DirectoryEntry, DirectoryEntryKind, DirectoryEntryLocation, DirectoryEntrySource, DirectoryEntryState, DirectoryPause, DirectoryPauseBy, DirectoryProviderError, DirectoryScope, DirectoryTranscriptRef, DiscoveredSessionSnapshot, DomainEvent, EDITORS, EFFORT_LEVELS, ENVIRONMENT_PROTOCOL_VERSION, EditorIdSchema, EffortLevelSchema, EmbedProgressEvent, EmbedProgressSnapshot, EmbedSessionsRpc, EnrichCompleteEvent, EnrichProgressEvent, EnrichProgressSnapshot, EnrichSessionsRpc, EnrichStatsSnapshot, EnvironmentCapabilities, EnvironmentDescriptor, EnvironmentId, ExtractionProviderConfig, ExtractionProviderTarget, FeatureNode, FeatureRegistryEntry, FeatureRegistryStatus, FlywheelAgent, FlywheelAgentStatus, FlywheelAgentSummary, FlywheelBugRateCriterion, FlywheelConversationSummary, FlywheelDerivedStatus, FlywheelEffort, FlywheelFreshness, FlywheelHarness, FlywheelHeadline, FlywheelHttpUrl, FlywheelInFlightRow, FlywheelJournalSummary, FlywheelLastTick, FlywheelOrchestrator, FlywheelOrderBookSummary, FlywheelOrders, FlywheelP0Criterion, FlywheelParkedItem, FlywheelPipelineItem, FlywheelPipelineStatus, FlywheelPipelineVerb, FlywheelPolicies, FlywheelRunId, FlywheelRunState, FlywheelScope, FlywheelStats, FlywheelStatsCriterionStatus, FlywheelStatsTrend, FlywheelStatsWindow, FlywheelStatus, FlywheelSubstrateBug, FlywheelSubstrateBugRow, FlywheelSubstrateBugStatus, FlywheelSubstrateSeverity, FlywheelSuggestion, FlywheelSuggestionAction, FlywheelSuggestionPriority, FlywheelSystemStatus, GITHUB_QUOTA_BUCKETS, GITHUB_QUOTA_CALLERS, GITHUB_QUOTA_POOLS, GetAvailableEditorsRpc, GetConversationCostByWorkspaceRpc, GetConversationCostRpc, GetConversationStatsRpc, GetDiscoveredSessionRpc, GetSessionsFeedFacetsRpc, GetSnapshotRpc, GitHubQuotaBucket, GitHubQuotaCaller, GitHubQuotaCallerUsage, GitHubQuotaChangedEvent, GitHubQuotaPause, GitHubQuotaPool, GitHubQuotaSample, GitHubQuotaSnapshot, GitHubQuotaUsage, GitHubRateLimitKind, GlobalContextLayerRecord, GlobalContextLayerTarget, HARNESS_CAPABILITY_KEYS, HOOK_INVENTORY, HealthReason, HealthState, HostHealthMetrics, HostPlatform, HygieneFinding, HygienePullRequest, HygieneReport, INITIAL_READ_MODEL_STATE, ISSUE_ATTENTIONS, ISSUE_STATES, ISSUE_STATE_PRECEDENCE, IssueAttention, IssueId, IssueState, IssueStateChangedEvent, IssueStatusChangedEvent, IssueTransitionedEvent, IssuesDeltaEvent, IssuesSnapshotEvent, IssuesUpdatedEvent, KIMI_CODE_BEHAVIOR, KIMI_CODE_CAPABILITIES, KNOWN_HARNESSES, LANE_STARTING_GRACE_MS, LegacySystemHealthSummary, LegacyWebhookRelaySummary, LinearMcpAuthCallbackRelayedEvent, LinearMcpAuthHealthyEvent, LinearMcpAuthNotifiedEvent, LinearMcpAuthRequiredEvent, ListDiscoveredSessionsRpc, ListSessionsFeedRpc, MAX_CHANNEL_REPLY_ARTIFACT_LABEL_LENGTH, MAX_CHANNEL_REPLY_ARTIFACT_REFS, MAX_CHANNEL_REPLY_ARTIFACT_URI_LENGTH, MAX_CHANNEL_REPLY_SUMMARY_LENGTH, MEMBERSHIP_UNAVAILABLE_REASONS, MUSE_BEHAVIOR, MUSE_CAPABILITIES, MemoryAgentRole, MemoryHealthChangedEvent, MemoryIdentity, MemoryObservation, MemoryObservationCreatedEvent, MemoryResetMarkerCreatedEvent, MemoryRollupTriggeredEvent, MemoryStatus, MemoryStatusPhase, MemoryStatusUpdatedEvent, MemoryTokenUsage, MergeReadyEvent, ModelOrigin, ModelOriginEntry, NON_ESSENTIAL_GITHUB_CALLERS, OHMYPI_BEHAVIOR, OHMYPI_CAPABILITIES, OPENCODE_BEHAVIOR, OPENCODE_CAPABILITIES, OVERDECK_AGENT_PROTOCOL_VERSION, OVERDECK_DASHBOARD_PROTOCOL_VERSION, OpenInEditorInput, OperatorInterventionEvent, OrderBook, OrderBookIndexEntry, OrderBookItem, OrderBookLane, OrderBookPosture, OrderBookSettings, OrderBookStatus, PIPELINE_MEMBERSHIP_LOADING_CODE, PRIME_AGENT_BEHAVIOR, PRIME_AGENT_CAPABILITIES, PanRpcError, PanRpcGroup, PendingTurn, PipelineReviewCompletedEvent, PipelineReviewStartedEvent, PipelineTestCompletedEvent, PipelineTestStartedEvent, PipelineVerificationFailedEvent, PipelineVerificationStartedEvent, PlanItemStatusChangedEvent, PlanItemsUnblockedEvent, PlanSubitemStatusChangedEvent, PlanningFailedEvent, PlanningStartedEvent, PlanningSyncEvent, PrChecksState, PrReviewState, ProjectCiHeadObservedEvent, ProjectCiSnapshot, ProjectCiSuite, ProjectCiSuiteObservedEvent, ProjectContextLayerRecord, ProjectContextLayerTarget, ProjectDeployChangedEvent, ProjectDeployPhase, ProjectDeploySnapshot, ProjectSessionTree, ProposedPlan, PullRequestKey, PullRequestLink, PullRequestLinkListing, PullRequestLinkSource, PullRequestLinkedConversation, PullRequestSnapshot, PullRequestState, RESUME_OPEN_IDS_MAX, RagDecision, RagDecisionSource, ReadFileAtPathInput, ReadFileAtPathResult, ReadFileAtPathRpc, ReadWorkspaceFileInput, ReadWorkspaceFileResult, ReadWorkspaceFileRpc, ReplayEventsResult, ReplayEventsRpc, ReplayTooFarBehind, ResetMarker, ResetMarkerScope, ResizeTerminalRpc, ResolveFilePathExistsInput, ResolveFilePathExistsResult, ResolveFilePathExistsRpc, ResourceStats, ResourcesUpdatedEvent, RestartGateChangedEvent, RestartGateKind, RestartGateOutcome, RestartGateRequest, RestartGateSnapshot, ReviewApprovedEvent, ReviewCoordinatorDiedEvent, ReviewCoordinatorStartedEvent, ReviewReviewerCompletedEvent, ReviewReviewerStartedEvent, ReviewSpecialistTimedOutEvent, ReviewVerdictDispatchedEvent, ReviewVerdictRejectedEvent, ReviewVerdictRestoreBlockedEvent, ReviewerRoundMetadata, ReviewerRoundSummary, Role, SINGLETON_AGENT_IDS, ScanCompleteEvent, ScanConversationsRpc, ScanProgressEvent, ScanProgressSnapshot, ScanResult, ScanStartedEvent, ScopedAgentRef, ScopedConversationRef, ScopedIssueRef, ScopedProjectRef, ScopedRef, ScopedTerminalRef, SearchConversationsRpc, SendTerminalInputRpc, SequenceNumber, ServiceHealthSnapshot, ServiceHealthStatus, SessionNode, SessionNodePresence, SessionNodeType, SessionTreeDelta, SessionsFeedFacetsSnapshot, SessionsFeedRowSnapshot, SessionsFeedSource, ShadowInferenceUpdateEvent, ShellOpenInEditorRpc, SpecialistCompletedEvent, SpecialistFailedEvent, SpecialistLifecycle, SpecialistStartedEvent, StartAgentRpc, StartPlanningRpc, SubagentHumanInput, SubagentSummary, SubscribeAgentOutputRpc, SubscribeConversationMessagesRpc, SubscribeDomainEventsRpc, SubscribeIssueEventsRpc, SubscribeProjectSessionTreeRpc, SubscribeTerminalRpc, SubstrateBugFiledEvent, SweepEscalatedEvent, SweepRecommendationEvent, SweepScanEvent, SystemHealthConsumer, SystemHealthSeverityChangedEvent, SystemHealthSnapshot, SystemHeartbeatEvent, TELEMETRY_CLI_VERBS, TELEMETRY_EVENT_CATALOG, TELEMETRY_EVENT_NAMES, TELEMETRY_PROPERTY_DOMAINS, TERMINAL_BACKEND_NAMES, TOOL_BODY_INLINE_MAX_BYTES, TOOL_BODY_PREVIEW_CHARS, TerminalCloseRpc, TerminalOpenRpc, TerminalOutput, TerminalResizeRpc, TerminalWriteRpc, TestPassedEvent, ThinkingState, TickMarker, TickMarkerPhase, TurnDiffFileChange, TurnDiffSummary, TurnEndAssessment, WINDOW_PINNED_OPEN_TOOLS_MAX, WIRED_HOOK_INVENTORY, WIRED_HOOK_NAMES, WS_METHODS, WaitingReason, WaitingState, WorkCompletedEvent, WorkLogEntry, WorkspaceAbortedEvent, WorkspaceArtifactsResponse, WorkspaceContextLayerRecord, WorkspaceContextLayerTarget, WorkspaceCreatedEvent, WorkspaceDeletedEvent, WorkspaceDestroyedEvent, WorkspaceWipeStartedEvent, WriteFileAtPathInput, WriteFileAtPathResult, WriteFileAtPathRpc, applyEvent, applyEvents, applyIssueDelta, bucketQuotaPoints, bucketQuotaRemaining, canonicalPullRequestUrl, companionTerminalKindFor, compareEffort, compareIssueIds, compareTimelineKeys, createIssueDelta, decodeFlywheelDerivedStatus, decodeFlywheelStats, decodeTimelineCursor, deriveProjectCi, encodeFlywheelStats, encodeTimelineCursor, getHarness, getHarnessBehavior, getMaxMemoryObservationsPerIssue, getMaxTurnDiffSummariesPerAgent, getRuntimeBehavior, hasToolResult, indexPanesByAgentKey, isAgentRole, isAgentSessionName, isChannelReplyKind, isConfiguredPullRequestRepo, isEffortLevel, isIssueAttention, isIssueState, isLegacyPiHarnessName, isProtocolCompatible, isSingletonConversation, isTerminalBackendName, isTerminalTurnDiffSummaryStatus, laneActivityOf, normalizeChannelReplyPayload, normalizeHarnessName, omitTurnDiffSummariesForAgent, paneAgentKey, parsePullRequestRef, projectLegacySystemHealthSummary, repoFromRemoteUrl, resolveEffectivePullRequest, syncSnapshot, timelineKeyOfMessage, timelineKeyOfWork, trimMemoryObservations, trimTurnDiffSummaries, withPaneLivenessAlias };
18110
+ //#region src/linked-conversations.ts
18111
+ /** The viewing machine's name for a linked conversation: `@<environmentId>/<name>`. */
18112
+ function linkedConversationName(environmentId, name) {
18113
+ return `@${environmentId}/${name}`;
18114
+ }
18115
+ const LINKED_NAME = /^@([^/]+)\/([^/]+)$/;
18116
+ /**
18117
+ * Parse `@<target>/<name>`, where target is an environment id or a machine
18118
+ * label. Returns null for a local name or a malformed value.
18119
+ */
18120
+ function parseLinkedConversationName(value) {
18121
+ const match = LINKED_NAME.exec(value);
18122
+ if (!match) return null;
18123
+ return {
18124
+ target: match[1],
18125
+ name: match[2]
18126
+ };
18127
+ }
18128
+ //#endregion
18129
+ //#region src/connect.ts
18130
+ const CONNECT_PROTOCOL_VERSION = 1;
18131
+ /** Relay allowance per account per UTC calendar month (OD-3): 50 GB. */
18132
+ const RELAY_MONTHLY_CAP_BYTES = 5e10;
18133
+ /** Largest webhook body the directory inbox accepts (D-2356-14). */
18134
+ const INBOX_BODY_MAX_BYTES = 262144;
18135
+ /** How long the inbox holds a sealed event before it expires (D-2356-18). */
18136
+ const INBOX_HOLD_MS = 864e5;
18137
+ /** How long an approval request stays live (D-2356-9). */
18138
+ const APPROVAL_TTL_MS = 6e5;
18139
+ const FREE_MACHINE_LIMIT_MESSAGE = "The free account includes 3 machines";
18140
+ const NO_DIRECT_PATH_MESSAGE = "No direct path; install Tailscale or use the relay plan";
18141
+ const RELAY_CAP_MESSAGE = "Relay allowance used; install Tailscale or add 50 GB";
18142
+ /** WebSocket close codes the directory uses. */
18143
+ const CONNECT_CLOSE_CODES = {
18144
+ unauthorized: 4001,
18145
+ grantExpired: 4003,
18146
+ machineLimit: 4009,
18147
+ unsupportedProtocol: 4010,
18148
+ /** Replaced by a newer socket for the same machine. */
18149
+ replaced: 4011,
18150
+ forgotten: 4012
18151
+ };
18152
+ //#endregion
18153
+ //#region src/connect-view.ts
18154
+ const DirectoryClientState = Schema.Literals([
18155
+ "off",
18156
+ "connecting",
18157
+ "online",
18158
+ "refused"
18159
+ ]);
18160
+ const DirectoryPlan = Schema.Literals(["free", "tester"]);
18161
+ /** One machine of the account, as the directory lists it. */
18162
+ const DirectoryMachineView = Schema.Struct({
18163
+ environmentId: Schema.String,
18164
+ label: Schema.String,
18165
+ publicKeyHex: Schema.String,
18166
+ fingerprint: Schema.String,
18167
+ online: Schema.Boolean,
18168
+ /** ISO-8601 UTC. */
18169
+ lastSeenAt: Schema.String,
18170
+ serverVersion: Schema.String,
18171
+ endpoints: Schema.Array(AdvertisedEndpoint),
18172
+ /** This machine holds a link to it. */
18173
+ linked: Schema.Boolean
18174
+ });
18175
+ /**
18176
+ * Approver side: `pending` (request arrived), `open` (approval channel open, SAS known),
18177
+ * `approving` (this operator approved; waiting for the other machine to accept), `failed`.
18178
+ */
18179
+ const DirectoryApprovalState = Schema.Literals([
18180
+ "pending",
18181
+ "open",
18182
+ "approving",
18183
+ "failed"
18184
+ ]);
18185
+ /** Requester side: `waiting` (no approver yet), `open` (SAS known), `accepted`, `rejected`. */
18186
+ const DirectoryJoinState = Schema.Literals([
18187
+ "waiting",
18188
+ "open",
18189
+ "accepted",
18190
+ "rejected"
18191
+ ]);
18192
+ /** An incoming approval request: another machine asks to link with this one. */
18193
+ const DirectoryApprovalView = Schema.Struct({
18194
+ requestId: Schema.String,
18195
+ /** Environment id of the requesting machine. */
18196
+ from: Schema.String,
18197
+ label: Schema.String,
18198
+ fingerprint: Schema.String,
18199
+ /** Unix milliseconds. */
18200
+ expiresAt: Schema.Number,
18201
+ /** Six-digit code, set once the approval channel is open. */
18202
+ sas: Schema.NullOr(Schema.String),
18203
+ state: DirectoryApprovalState,
18204
+ /** Why the approval failed, when `state` is `failed`. */
18205
+ error: Schema.NullOr(Schema.String)
18206
+ });
18207
+ /** An outgoing join request this machine made. */
18208
+ const DirectoryJoinView = Schema.Struct({
18209
+ requestId: Schema.String,
18210
+ /** Target environment id, or null for every machine of the account. */
18211
+ to: Schema.NullOr(Schema.String),
18212
+ /** Unix milliseconds. */
18213
+ expiresAt: Schema.Number,
18214
+ /** Six-digit code, set once an approver opened the approval channel. */
18215
+ sas: Schema.NullOr(Schema.String),
18216
+ /** The approver's fingerprint, from the handshake key (never from the directory). */
18217
+ fingerprint: Schema.NullOr(Schema.String),
18218
+ state: DirectoryJoinState
18219
+ });
18220
+ const RelayStatusView = Schema.Struct({
18221
+ /** UTC calendar month, `YYYY-MM`. */
18222
+ month: Schema.String,
18223
+ bytesUsed: Schema.Number,
18224
+ capBytes: Schema.Number,
18225
+ stopped: Schema.Boolean
18226
+ });
18227
+ const DirectoryResponse = Schema.Struct({
18228
+ signedIn: Schema.Boolean,
18229
+ state: DirectoryClientState,
18230
+ /** The configured directory URL, or null when it is invalid. */
18231
+ url: Schema.NullOr(Schema.String),
18232
+ plan: Schema.NullOr(DirectoryPlan),
18233
+ refusal: Schema.NullOr(Schema.String),
18234
+ machines: Schema.Array(DirectoryMachineView),
18235
+ approvals: Schema.Array(DirectoryApprovalView),
18236
+ joins: Schema.Array(DirectoryJoinView),
18237
+ relay: Schema.NullOr(RelayStatusView)
18238
+ });
18239
+ //#endregion
18240
+ //#region src/fleet-versions.ts
18241
+ const FleetInstallMode = Schema.Literals([
18242
+ "npm-global",
18243
+ "development",
18244
+ "desktop"
18245
+ ]);
18246
+ const FleetComponentStatus = Schema.Literals([
18247
+ "pending",
18248
+ "running",
18249
+ "updated",
18250
+ "current",
18251
+ "skipped",
18252
+ "failed"
18253
+ ]);
18254
+ const FleetJobPhase = Schema.Literals([
18255
+ "waiting",
18256
+ "updating",
18257
+ "restarting",
18258
+ "done",
18259
+ "failed",
18260
+ "cancelled"
18261
+ ]);
18262
+ const FleetUpdateMode = Schema.Literals(["when-idle", "now"]);
18263
+ /** Fleet-table column order (D-16): these binaries first, then any other binary alphabetically. */
18264
+ const FLEET_BINARY_ORDER = [
18265
+ "claude",
18266
+ "codex",
18267
+ "kimi",
18268
+ "opencode",
18269
+ "muse",
18270
+ "prime-agent",
18271
+ "omp"
18272
+ ];
18273
+ /** Sort comparator for harness binary names in D-16 order. */
18274
+ function compareFleetBinaries(a, b) {
18275
+ const rank = (binary) => {
18276
+ const index = FLEET_BINARY_ORDER.indexOf(binary);
18277
+ return index === -1 ? FLEET_BINARY_ORDER.length : index;
18278
+ };
18279
+ return rank(a) - rank(b) || a.localeCompare(b);
18280
+ }
18281
+ /** After this long waiting for turns, the row says it is still waiting and points at Update now (FR-8). */
18282
+ const FLEET_UPDATE_STILL_WAITING_MS = 30 * 6e4;
18283
+ const FleetComponentSchema = Schema.Struct({
18284
+ name: Schema.String,
18285
+ label: Schema.String,
18286
+ before: Schema.NullOr(Schema.String),
18287
+ after: Schema.NullOr(Schema.String),
18288
+ status: FleetComponentStatus,
18289
+ detail: Schema.NullOr(Schema.String)
18290
+ });
18291
+ /** Decodes a persisted job file. */
18292
+ const FleetUpdateJobSchema = Schema.Struct({
18293
+ id: Schema.String,
18294
+ mode: FleetUpdateMode,
18295
+ phase: FleetJobPhase,
18296
+ requestedBy: Schema.String,
18297
+ startedAt: Schema.String,
18298
+ waitingTurns: Schema.Number,
18299
+ waitingSince: Schema.NullOr(Schema.String),
18300
+ finishedAt: Schema.NullOr(Schema.String),
18301
+ components: Schema.Array(FleetComponentSchema)
18302
+ });
18303
+ /** Decodes a peer's `GET /api/versions/self` body. */
18304
+ const MachineVersionsReportSchema = Schema.Struct({
18305
+ environmentId: Schema.String,
18306
+ label: Schema.String,
18307
+ overdeck: Schema.Struct({
18308
+ version: Schema.String,
18309
+ installMode: FleetInstallMode,
18310
+ linkProtocol: Schema.Number
18311
+ }),
18312
+ harnesses: Schema.Array(Schema.Struct({
18313
+ binary: Schema.String,
18314
+ label: Schema.String,
18315
+ harnesses: Schema.Array(Schema.String),
18316
+ version: Schema.NullOr(Schema.String),
18317
+ updatable: Schema.Boolean,
18318
+ command: Schema.String,
18319
+ reason: Schema.NullOr(Schema.String)
18320
+ })),
18321
+ job: Schema.NullOr(FleetUpdateJobSchema)
18322
+ });
18323
+ //#endregion
18324
+ //#region src/color-theme.ts
18325
+ const TERMINAL_PALETTE_KEYS = [
18326
+ "background",
18327
+ "foreground",
18328
+ "cursor",
18329
+ "cursorAccent",
18330
+ "selectionBackground",
18331
+ "black",
18332
+ "red",
18333
+ "green",
18334
+ "yellow",
18335
+ "blue",
18336
+ "magenta",
18337
+ "cyan",
18338
+ "white",
18339
+ "brightBlack",
18340
+ "brightRed",
18341
+ "brightGreen",
18342
+ "brightYellow",
18343
+ "brightBlue",
18344
+ "brightMagenta",
18345
+ "brightCyan",
18346
+ "brightWhite"
18347
+ ];
18348
+ const UI_KEYS = [
18349
+ "background",
18350
+ "surface",
18351
+ "overlay",
18352
+ "border",
18353
+ "foreground",
18354
+ "muted",
18355
+ "accent"
18356
+ ];
18357
+ const COLOR_THEME_ID_RE = /^[a-z0-9][a-z0-9-]{0,63}$/;
18358
+ const RESERVED_COLOR_THEME_IDS = ["overdeck-dark", "overdeck-light"];
18359
+ const HEX_COLOR_RE = /^#(?:[0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;
18360
+ const FONT_STYLE_RE = /^[a-z ]*$/i;
18361
+ const BUILTIN_COLOR_THEMES = {
18362
+ "overdeck-dark": {
18363
+ id: "overdeck-dark",
18364
+ name: "Overdeck Dark",
18365
+ type: "dark",
18366
+ builtin: true,
18367
+ terminal: {
18368
+ background: "#1a1a2e",
18369
+ foreground: "#eaeaea",
18370
+ cursor: "#eaeaea",
18371
+ cursorAccent: "#1a1a2e",
18372
+ selectionBackground: "#3a3a5e",
18373
+ black: "#1a1a2e",
18374
+ red: "#ff5555",
18375
+ green: "#50fa7b",
18376
+ yellow: "#f1fa8c",
18377
+ blue: "#6272a4",
18378
+ magenta: "#ff79c6",
18379
+ cyan: "#8be9fd",
18380
+ white: "#f8f8f2",
18381
+ brightBlack: "#6272a4",
18382
+ brightRed: "#ff6e6e",
18383
+ brightGreen: "#69ff94",
18384
+ brightYellow: "#ffffa5",
18385
+ brightBlue: "#d6acff",
18386
+ brightMagenta: "#ff92df",
18387
+ brightCyan: "#a4ffff",
18388
+ brightWhite: "#ffffff"
18389
+ }
18390
+ },
18391
+ "overdeck-light": {
18392
+ id: "overdeck-light",
18393
+ name: "Overdeck Light",
18394
+ type: "light",
18395
+ builtin: true,
18396
+ terminal: {
18397
+ background: "#ffffff",
18398
+ foreground: "#24292e",
18399
+ cursor: "#24292e",
18400
+ cursorAccent: "#ffffff",
18401
+ selectionBackground: "#bcd3f5",
18402
+ black: "#24292e",
18403
+ red: "#d73a49",
18404
+ green: "#22863a",
18405
+ yellow: "#b08800",
18406
+ blue: "#0366d6",
18407
+ magenta: "#6f42c1",
18408
+ cyan: "#1b7c83",
18409
+ white: "#6a737d",
18410
+ brightBlack: "#959da5",
18411
+ brightRed: "#cb2431",
18412
+ brightGreen: "#28a745",
18413
+ brightYellow: "#dbab09",
18414
+ brightBlue: "#2188ff",
18415
+ brightMagenta: "#8a63d2",
18416
+ brightCyan: "#3192aa",
18417
+ brightWhite: "#24292e"
18418
+ }
18419
+ }
18420
+ };
18421
+ function builtinFor(type) {
18422
+ return type === "dark" ? BUILTIN_COLOR_THEMES["overdeck-dark"] : BUILTIN_COLOR_THEMES["overdeck-light"];
18423
+ }
18424
+ /** Expands "#rgb" to "#rrggbb" and drops an alpha channel, lowercased, so xterm and tmux render the same opaque color. */
18425
+ function toOpaqueHex(hex) {
18426
+ const lower = hex.toLowerCase();
18427
+ const digits = lower.slice(1);
18428
+ if (digits.length === 3) return `#${digits[0]}${digits[0]}${digits[1]}${digits[1]}${digits[2]}${digits[2]}`;
18429
+ if (digits.length === 4) return `#${digits[0]}${digits[0]}${digits[1]}${digits[1]}${digits[2]}${digits[2]}`;
18430
+ if (digits.length === 8) return `#${digits.slice(0, 6)}`;
18431
+ return lower;
18432
+ }
18433
+ /** WCAG-contrast-based readable text color for a background hex: whichever of black/white has the higher contrast ratio. */
18434
+ function readableForeground(hex) {
18435
+ const opaque = toOpaqueHex(hex);
18436
+ const r = parseInt(opaque.slice(1, 3), 16) / 255;
18437
+ const g = parseInt(opaque.slice(3, 5), 16) / 255;
18438
+ const b = parseInt(opaque.slice(5, 7), 16) / 255;
18439
+ const channel = (c) => c <= .03928 ? c / 12.92 : Math.pow((c + .055) / 1.055, 2.4);
18440
+ const luminance = .2126 * channel(r) + .7152 * channel(g) + .0722 * channel(b);
18441
+ const contrastWithWhite = 1.05 / (luminance + .05);
18442
+ return (luminance + .05) / .05 >= contrastWithWhite ? "#000000" : "#ffffff";
18443
+ }
18444
+ /** Lowercase slug: runs of non-[a-z0-9] become "-", trimmed, capped at 64 chars, "theme" if empty. */
18445
+ function slugifyThemeId(name) {
18446
+ const slug = name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 64);
18447
+ return slug.length > 0 ? slug : "theme";
18448
+ }
18449
+ /** The built-in palette for the theme's type, overlaid with the theme's own terminal colors. */
18450
+ function effectiveTerminalPalette(theme) {
18451
+ const palette = {
18452
+ ...builtinFor(theme.type).terminal,
18453
+ ...theme.terminal
18454
+ };
18455
+ return {
18456
+ ...palette,
18457
+ background: toOpaqueHex(palette.background)
18458
+ };
18459
+ }
18460
+ function isPlainObject(value) {
18461
+ return typeof value === "object" && value !== null && !Array.isArray(value);
18462
+ }
18463
+ function normalizeSource(raw) {
18464
+ if (!isPlainObject(raw)) return void 0;
18465
+ if (raw.kind !== "vscode-import") return void 0;
18466
+ if (typeof raw.fileName !== "string" || typeof raw.importedAt !== "string") return void 0;
18467
+ return {
18468
+ kind: "vscode-import",
18469
+ fileName: raw.fileName,
18470
+ importedAt: raw.importedAt
18471
+ };
18472
+ }
18473
+ function normalizeTerminal(raw, warnings) {
18474
+ if (raw === void 0) return void 0;
18475
+ if (!isPlainObject(raw)) {
18476
+ warnings.push("terminal must be an object; ignoring");
18477
+ return;
18478
+ }
18479
+ const result = {};
18480
+ for (const [key, value] of Object.entries(raw)) {
18481
+ if (!TERMINAL_PALETTE_KEYS.includes(key)) {
18482
+ warnings.push(`unknown terminal key terminal.${key}; dropping`);
18483
+ continue;
18484
+ }
18485
+ if (typeof value !== "string" || !HEX_COLOR_RE.test(value)) {
18486
+ warnings.push(`invalid color for terminal.${key}; dropping`);
18487
+ continue;
18488
+ }
18489
+ result[key] = value;
18490
+ }
18491
+ return Object.keys(result).length > 0 ? result : void 0;
18492
+ }
18493
+ function normalizeUi(raw, warnings) {
18494
+ if (raw === void 0) return void 0;
18495
+ if (!isPlainObject(raw)) {
18496
+ warnings.push("ui must be an object; ignoring");
18497
+ return;
18498
+ }
18499
+ const result = {};
18500
+ for (const [key, value] of Object.entries(raw)) {
18501
+ if (!UI_KEYS.includes(key)) {
18502
+ warnings.push(`unknown ui key ui.${key}; dropping`);
18503
+ continue;
18504
+ }
18505
+ if (typeof value !== "string" || !HEX_COLOR_RE.test(value)) {
18506
+ warnings.push(`invalid color for ui.${key}; dropping`);
18507
+ continue;
18508
+ }
18509
+ result[key] = value;
18510
+ }
18511
+ return Object.keys(result).length > 0 ? result : void 0;
18512
+ }
18513
+ function normalizeTokenColors(raw, warnings) {
18514
+ if (raw === void 0) return [];
18515
+ if (!Array.isArray(raw)) {
18516
+ warnings.push("syntax.tokenColors must be an array; ignoring");
18517
+ return [];
18518
+ }
18519
+ const entries = [];
18520
+ for (const entry of raw.slice(0, 2e3)) {
18521
+ if (!isPlainObject(entry) || !isPlainObject(entry.settings)) continue;
18522
+ const settings = {};
18523
+ const rawSettings = entry.settings;
18524
+ if (typeof rawSettings.foreground === "string" && HEX_COLOR_RE.test(rawSettings.foreground)) settings.foreground = rawSettings.foreground;
18525
+ if (typeof rawSettings.background === "string" && HEX_COLOR_RE.test(rawSettings.background)) settings.background = rawSettings.background;
18526
+ if (typeof rawSettings.fontStyle === "string" && FONT_STYLE_RE.test(rawSettings.fontStyle)) settings.fontStyle = rawSettings.fontStyle;
18527
+ const result = { settings };
18528
+ if (typeof entry.scope === "string") result.scope = entry.scope;
18529
+ else if (Array.isArray(entry.scope) && entry.scope.every((s) => typeof s === "string")) result.scope = entry.scope;
18530
+ entries.push(result);
18531
+ }
18532
+ return entries;
18533
+ }
18534
+ function normalizeSyntax(raw, warnings) {
18535
+ if (raw === void 0) return void 0;
18536
+ if (!isPlainObject(raw)) {
18537
+ warnings.push("syntax must be an object; ignoring");
18538
+ return;
18539
+ }
18540
+ const tokenColors = normalizeTokenColors(raw.tokenColors, warnings);
18541
+ let colors;
18542
+ if (isPlainObject(raw.colors)) {
18543
+ const filtered = {};
18544
+ const background = raw.colors["editor.background"];
18545
+ const foreground = raw.colors["editor.foreground"];
18546
+ if (typeof background === "string" && HEX_COLOR_RE.test(background)) filtered["editor.background"] = background;
18547
+ if (typeof foreground === "string" && HEX_COLOR_RE.test(foreground)) filtered["editor.foreground"] = foreground;
18548
+ if (Object.keys(filtered).length > 0) colors = filtered;
18549
+ }
18550
+ if (tokenColors.length === 0 && colors === void 0) return void 0;
18551
+ return {
18552
+ tokenColors,
18553
+ ...colors !== void 0 ? { colors } : {}
18554
+ };
18555
+ }
18556
+ /**
18557
+ * Validates and sanitizes a raw theme. An invalid color or unknown key is
18558
+ * dropped with a warning naming it — never an error. A missing/invalid
18559
+ * `name` or `type` is an error: there is no sensible default for either.
18560
+ */
18561
+ function normalizeColorTheme(raw, id) {
18562
+ const errors = [];
18563
+ if (!isPlainObject(raw)) return { errors: ["theme must be an object"] };
18564
+ const rawName = raw.name;
18565
+ let name;
18566
+ if (typeof rawName === "string" && rawName.trim().length > 0) name = rawName.trim().slice(0, 80);
18567
+ else errors.push("name is required");
18568
+ const rawType = raw.type;
18569
+ let type;
18570
+ if (rawType === "light" || rawType === "dark") type = rawType;
18571
+ else errors.push("type must be \"light\" or \"dark\"");
18572
+ if (errors.length > 0 || name === void 0 || type === void 0) return { errors };
18573
+ const warnings = [];
18574
+ const terminal = normalizeTerminal(raw.terminal, warnings);
18575
+ const ui = normalizeUi(raw.ui, warnings);
18576
+ const syntax = normalizeSyntax(raw.syntax, warnings);
18577
+ const source = normalizeSource(raw.source);
18578
+ return {
18579
+ theme: {
18580
+ id,
18581
+ builtin: false,
18582
+ name,
18583
+ type,
18584
+ ...terminal !== void 0 ? { terminal } : {},
18585
+ ...syntax !== void 0 ? { syntax } : {},
18586
+ ...ui !== void 0 ? { ui } : {},
18587
+ ...source !== void 0 ? { source } : {}
18588
+ },
18589
+ warnings
18590
+ };
18591
+ }
18592
+ //#endregion
18593
+ //#region src/conversation-schedule-presets.ts
18594
+ const SCHEDULE_PRESET_DAYS = [
18595
+ "mon",
18596
+ "tue",
18597
+ "wed",
18598
+ "thu",
18599
+ "fri",
18600
+ "sat",
18601
+ "sun"
18602
+ ];
18603
+ const TIME_PATTERN = /^([01]\d|2[0-3]):([0-5]\d)$/;
18604
+ const DAY_NUMBERS = {
18605
+ sun: 0,
18606
+ mon: 1,
18607
+ tue: 2,
18608
+ wed: 3,
18609
+ thu: 4,
18610
+ fri: 5,
18611
+ sat: 6
18612
+ };
18613
+ function parseTime(time) {
18614
+ const match = TIME_PATTERN.exec(time);
18615
+ if (!match) throw new Error(`Invalid time "${time}": expected HH:MM (24-hour)`);
18616
+ return {
18617
+ hour: Number(match[1]),
18618
+ minute: Number(match[2])
18619
+ };
18620
+ }
18621
+ function presetToCron(preset) {
18622
+ switch (preset.kind) {
18623
+ case "hourly": return "0 * * * *";
18624
+ case "daily": {
18625
+ const { hour, minute } = parseTime(preset.time);
18626
+ return `${minute} ${hour} * * *`;
18627
+ }
18628
+ case "weekdays": {
18629
+ const { hour, minute } = parseTime(preset.time);
18630
+ return `${minute} ${hour} * * 1-5`;
18631
+ }
18632
+ case "weekly": {
18633
+ const day = DAY_NUMBERS[preset.day.toLowerCase()];
18634
+ if (day === void 0) throw new Error(`Invalid day "${preset.day}": expected sun, mon, tue, wed, thu, fri or sat`);
18635
+ const { hour, minute } = parseTime(preset.time);
18636
+ return `${minute} ${hour} * * ${day}`;
18637
+ }
18638
+ }
18639
+ }
18640
+ //#endregion
18641
+ export { ACP_BEHAVIOR, ACP_CAPABILITIES, AGENT_ROLES, APPROVAL_TTL_MS, Activity, ActivityDetailedEvent, ActivityEntryEvent, ActivityTtsEvent, ActivityUpdatedEvent, AdmissionState, AdvertisedEndpoint, AgentActivityChangedEvent, AgentChannelReply, AgentChannelReplyEvent, AgentCompletedEvent, AgentContextSaturationChangedEvent, AgentCreatedEvent, AgentCurrentIssueSetEvent, AgentDirectoryResponse, AgentEnrichmentChangedEvent, AgentHealthKind, AgentHealthSnapshot, AgentHealthStatus, AgentHeartbeatDeadEvent, AgentHookFiredEvent, AgentId, AgentMessageReceivedEvent, AgentModelSetEvent, AgentOutput, AgentOutputReceivedEvent, AgentPermissionRequestedEvent, AgentPermissionResolvedEvent, AgentResolution, AgentResolutionChangedEvent, AgentRuntimeSnapshot, AgentSnapshot, AgentStartedEvent, AgentStateRestoredEvent, AgentStatus, AgentStatusChangedEvent, AgentStoppedEvent, AgentThinkingStartedEvent, AgentThinkingStoppedEvent, AgentTurnDiffCompletedEvent, AgentWaitingClearedEvent, AgentWaitingStartedEvent, ArtifactAgentHarness, ArtifactAgentRole, ArtifactCreateResponse, ArtifactDetailResponse, ArtifactHash, ArtifactId, ArtifactLifecycleState, ArtifactListEntry, ArtifactListResponse, ArtifactMetadata, ArtifactPublishResponse, ArtifactSlug, ArtifactStatusResponse, ArtifactUnshareResponse, ArtifactUrls, ArtifactValidationCode, ArtifactValidationFinding, ArtifactValidationResult, BROWSERS, BUILTIN_COLOR_THEMES, BackendPane, BackendPaneChangedEvent, BackendPaneRemovedEvent, BeadsFreshnessChangedEvent, BrowserIdSchema, CHANNEL_REPLY_KIND_VALUES, CLAUDE_CODE_BEHAVIOR, CLAUDE_CODE_CAPABILITIES, CODEX_BEHAVIOR, CODEX_CAPABILITIES, COLOR_THEME_ID_RE, COMPANION_TERMINAL_CLOSE_BODY_KEYS, COMPANION_TERMINAL_OPEN_BODY_KEYS, COMPOSER_COMMAND_INSERT_OVERRIDES, COMPOSER_COMMAND_MANIFEST, COMPOSER_COMMAND_VARIANTS, CONNECT_CLOSE_CODES, CONNECT_PROTOCOL_VERSION, CONTEXT_LAYER_KINDS, CONTEXT_PREVIEW_HARNESSES, CONVERSATION_PAGE_DEFAULT_LIMIT, CONVERSATION_PAGE_MAX_LIMIT, CONVERSATION_PAYLOAD_BUDGET_BYTES, CONVERSATION_WINDOW_MAX_BYTES, CONVERSATION_WINDOW_MAX_ROWS, ChannelPermissionRequestSnapshot, ChannelReplyArtifactRef, ChannelReplyKind, ChatMessage, ClaudeChannelPermissionBehavior, CompactBoundary, ContextEditableLayerRecord, ContextHarnessPreviews, ContextLayerDraft, ContextLayerKind, ContextLayerSaveRequest, ContextLayerSaveResponse, ContextLayerTarget, ContextLayersResponse, ContextPreviewDiagnostic, ContextPreviewHarness, ContextPreviewRequest, ContextPreviewResponse, ContextProjectSummary, ContextSyncRequest, ContextSyncResponse, ContextSyncTarget, ContextUsage, ContextWorkspaceSummary, ConversationCompactingChangedEvent, ConversationCostSummary, ConversationCreatedEvent, ConversationEvent, ConversationFilter, ConversationMovedEvent, ConversationPermissionChangedEvent, ConversationPullRequests, ConversationPullRequestsChangedEvent, ConversationResponse, ConversationResume, ConversationSchedulesChangedEvent, ConversationTitleChangedEvent, ConversationWindow, CostEventRecordedEvent, DEFAULT_EFFORT, DEFAULT_MAX_MEMORY_OBSERVATIONS_PER_ISSUE, DEFAULT_MAX_TURN_DIFF_SUMMARIES_PER_AGENT, DashboardLifecycleCompletedEvent, DashboardLifecycleFailedEvent, DashboardLifecycleStartedEvent, DashboardSnapshot, DeepWipeRpc, DeployStalenessSnapshot, DerivedBranchState, DerivedIssueState, DerivedPrOutsidePipeline, DerivedPrState, DerivedWorkStart, DirectoryApprovalState, DirectoryApprovalView, DirectoryClientState, DirectoryEntry, DirectoryEntryKind, DirectoryEntryLocation, DirectoryEntrySource, DirectoryEntryState, DirectoryJoinState, DirectoryJoinView, DirectoryMachineView, DirectoryPause, DirectoryPauseBy, DirectoryPlan, DirectoryProviderError, DirectoryResponse, DirectoryScope, DirectoryTranscriptRef, DiscoveredSessionSnapshot, DomainEvent, EDITORS, EFFORT_LEVELS, ENVIRONMENT_PROTOCOL_VERSION, EditorIdSchema, EffortLevelSchema, EmbedProgressEvent, EmbedProgressSnapshot, EmbedSessionsRpc, EnrichCompleteEvent, EnrichProgressEvent, EnrichProgressSnapshot, EnrichSessionsRpc, EnrichStatsSnapshot, EnvironmentCapabilities, EnvironmentDescriptor, EnvironmentId, ExtractionProviderConfig, ExtractionProviderTarget, FLEET_BINARY_ORDER, FLEET_UPDATE_STILL_WAITING_MS, FREE_MACHINE_LIMIT_MESSAGE, FeatureNode, FeatureRegistryEntry, FeatureRegistryStatus, FleetComponentStatus, FleetInstallMode, FleetJobPhase, FleetProjectRow, FleetProjectsResponse, FleetUpdateJobSchema, FleetUpdateMode, FlywheelAgent, FlywheelAgentStatus, FlywheelAgentSummary, FlywheelBugRateCriterion, FlywheelConversationSummary, FlywheelDerivedStatus, FlywheelEffort, FlywheelFreshness, FlywheelHarness, FlywheelHeadline, FlywheelHttpUrl, FlywheelInFlightRow, FlywheelJournalSummary, FlywheelLastTick, FlywheelOrchestrator, FlywheelOrderBookSummary, FlywheelOrders, FlywheelP0Criterion, FlywheelParkedItem, FlywheelPipelineItem, FlywheelPipelineStatus, FlywheelPipelineVerb, FlywheelPolicies, FlywheelRunId, FlywheelRunState, FlywheelScope, FlywheelStats, FlywheelStatsCriterionStatus, FlywheelStatsTrend, FlywheelStatsWindow, FlywheelStatus, FlywheelSubstrateBug, FlywheelSubstrateBugRow, FlywheelSubstrateBugStatus, FlywheelSubstrateSeverity, FlywheelSuggestion, FlywheelSuggestionAction, FlywheelSuggestionPriority, FlywheelSystemStatus, GITHUB_QUOTA_BUCKETS, GITHUB_QUOTA_CALLERS, GITHUB_QUOTA_POOLS, GetAvailableBrowsersRpc, GetAvailableEditorsRpc, GetConversationCostByWorkspaceRpc, GetConversationCostRpc, GetConversationStatsRpc, GetDiscoveredSessionRpc, GetSessionsFeedFacetsRpc, GetSnapshotRpc, GitHubQuotaBucket, GitHubQuotaCaller, GitHubQuotaCallerUsage, GitHubQuotaChangedEvent, GitHubQuotaPause, GitHubQuotaPool, GitHubQuotaSample, GitHubQuotaSnapshot, GitHubQuotaUsage, GitHubRateLimitKind, GlobalContextLayerRecord, GlobalContextLayerTarget, HARNESS_CAPABILITY_KEYS, HOOK_INVENTORY, HealthReason, HealthState, HostHealthMetrics, HostPlatform, HygieneFinding, HygienePullRequest, HygieneReport, INBOX_BODY_MAX_BYTES, INBOX_HOLD_MS, INITIAL_READ_MODEL_STATE, ISSUE_ATTENTIONS, ISSUE_STATES, ISSUE_STATE_PRECEDENCE, InboundMachineView, IssueAttention, IssueId, IssueState, IssueStateChangedEvent, IssueStatusChangedEvent, IssueTransitionedEvent, IssuesDeltaEvent, IssuesSnapshotEvent, IssuesUpdatedEvent, KIMI_CODE_BEHAVIOR, KIMI_CODE_CAPABILITIES, KNOWN_HARNESSES, LANE_STARTING_GRACE_MS, LINK_PROTOCOL_VERSION, LegacySystemHealthSummary, LegacyWebhookRelaySummary, LinearMcpAuthCallbackRelayedEvent, LinearMcpAuthHealthyEvent, LinearMcpAuthNotifiedEvent, LinearMcpAuthRequiredEvent, LinkAccess, LinkIncident, LinkRouteStatus, LinkRouteView, LinkState, ListDiscoveredSessionsRpc, ListSessionsFeedRpc, LoadSample, MAX_CHANNEL_REPLY_ARTIFACT_LABEL_LENGTH, MAX_CHANNEL_REPLY_ARTIFACT_REFS, MAX_CHANNEL_REPLY_ARTIFACT_URI_LENGTH, MAX_CHANNEL_REPLY_SUMMARY_LENGTH, MEMBERSHIP_UNAVAILABLE_REASONS, MUSE_BEHAVIOR, MUSE_CAPABILITIES, MachineLinkView, MachinePlacementMode, MachineProject, MachineVersionsReportSchema, MachinesResponse, MemoryAgentRole, MemoryHealthChangedEvent, MemoryIdentity, MemoryObservation, MemoryObservationCreatedEvent, MemoryResetMarkerCreatedEvent, MemoryRollupTriggeredEvent, MemoryStatus, MemoryStatusPhase, MemoryStatusUpdatedEvent, MemoryTokenUsage, MergeReadyEvent, ModelOrigin, ModelOriginEntry, NON_ESSENTIAL_GITHUB_CALLERS, NO_DIRECT_PATH_MESSAGE, OHMYPI_BEHAVIOR, OHMYPI_CAPABILITIES, OPENCODE_BEHAVIOR, OPENCODE_CAPABILITIES, OVERDECK_AGENT_PROTOCOL_VERSION, OVERDECK_DASHBOARD_PROTOCOL_VERSION, OpenInBrowserInput, OpenInEditorInput, OperatorInterventionEvent, OrderBook, OrderBookIndexEntry, OrderBookItem, OrderBookLane, OrderBookPosture, OrderBookSettings, OrderBookStatus, PIPELINE_MEMBERSHIP_LOADING_CODE, PRIME_AGENT_BEHAVIOR, PRIME_AGENT_CAPABILITIES, PanRpcError, PanRpcGroup, PendingTurn, PipelineReviewCompletedEvent, PipelineReviewStartedEvent, PipelineTestCompletedEvent, PipelineTestStartedEvent, PipelineVerificationFailedEvent, PipelineVerificationStartedEvent, PlacementAnswer, PlacementRejection, PlanItemStatusChangedEvent, PlanItemsUnblockedEvent, PlanSubitemStatusChangedEvent, PlanningFailedEvent, PlanningStartedEvent, PlanningSyncEvent, PrChecksState, PrReviewState, ProjectCiHeadObservedEvent, ProjectCiSnapshot, ProjectCiSuite, ProjectCiSuiteObservedEvent, ProjectContextLayerRecord, ProjectContextLayerTarget, ProjectDeployChangedEvent, ProjectDeployPhase, ProjectDeploySnapshot, ProjectSessionTree, ProposedPlan, PullRequestKey, PullRequestLink, PullRequestLinkListing, PullRequestLinkSource, PullRequestLinkedConversation, PullRequestSnapshot, PullRequestState, RELAY_CAP_MESSAGE, RELAY_MONTHLY_CAP_BYTES, RESERVED_COLOR_THEME_IDS, RESUME_OPEN_IDS_MAX, ROUTE_KINDS, RagDecision, RagDecisionSource, ReadFileAtPathInput, ReadFileAtPathResult, ReadFileAtPathRpc, ReadWorkspaceFileInput, ReadWorkspaceFileResult, ReadWorkspaceFileRpc, RelayStatusView, ReplayEventsResult, ReplayEventsRpc, ReplayTooFarBehind, ResetMarker, ResetMarkerScope, ResizeTerminalRpc, ResolveFilePathExistsInput, ResolveFilePathExistsResult, ResolveFilePathExistsRpc, ResourceStats, ResourcesUpdatedEvent, RestartGateChangedEvent, RestartGateKind, RestartGateOutcome, RestartGateRequest, RestartGateSnapshot, ReviewApprovedEvent, ReviewCoordinatorDiedEvent, ReviewCoordinatorStartedEvent, ReviewReviewerCompletedEvent, ReviewReviewerStartedEvent, ReviewSpecialistTimedOutEvent, ReviewVerdictDispatchedEvent, ReviewVerdictRejectedEvent, ReviewVerdictRestoreBlockedEvent, ReviewerRoundMetadata, ReviewerRoundSummary, Role, RouteKind, RouteSource, SCHEDULE_PRESET_DAYS, SINGLETON_AGENT_IDS, SSH_HELPER_PROTOCOL, SSH_MACHINE_ERROR_CODES, ScanCompleteEvent, ScanConversationsRpc, ScanProgressEvent, ScanProgressSnapshot, ScanResult, ScanStartedEvent, ScopedAgentRef, ScopedConversationRef, ScopedIssueRef, ScopedProjectRef, ScopedRef, ScopedTerminalRef, SearchConversationsRpc, SendTerminalInputRpc, SequenceNumber, ServiceHealthSnapshot, ServiceHealthStatus, SessionNode, SessionNodePresence, SessionNodeType, SessionTreeDelta, SessionsFeedFacetsSnapshot, SessionsFeedRowSnapshot, SessionsFeedSource, ShadowInferenceUpdateEvent, ShellOpenInBrowserRpc, ShellOpenInEditorRpc, SpecialistCompletedEvent, SpecialistFailedEvent, SpecialistLifecycle, SpecialistStartedEvent, SshForwardState, SshLaunch, SshLinkInfo, SshMachineErrorCode, SshTestResult, StartAgentRpc, StartPlanningRpc, SubagentHumanInput, SubagentSummary, SubscribeAgentOutputRpc, SubscribeConversationMessagesRpc, SubscribeDomainEventsRpc, SubscribeIssueEventsRpc, SubscribeProjectSessionTreeRpc, SubscribeTerminalRpc, SubstrateBugFiledEvent, SweepEscalatedEvent, SweepRecommendationEvent, SweepScanEvent, SystemHealthConsumer, SystemHealthSeverityChangedEvent, SystemHealthSnapshot, SystemHeartbeatEvent, TELEMETRY_CLI_VERBS, TELEMETRY_EVENT_CATALOG, TELEMETRY_EVENT_NAMES, TELEMETRY_PROPERTY_DOMAINS, TERMINAL_BACKEND_NAMES, TOOL_BODY_INLINE_MAX_BYTES, TOOL_BODY_PREVIEW_CHARS, TerminalCloseRpc, TerminalOpenRpc, TerminalOutput, TerminalResizeRpc, TerminalWriteRpc, TestPassedEvent, ThinkingState, TickMarker, TickMarkerPhase, TurnDiffFileChange, TurnDiffSummary, TurnEndAssessment, WINDOW_PINNED_OPEN_TOOLS_MAX, WIRED_HOOK_INVENTORY, WIRED_HOOK_NAMES, WS_METHODS, WaitingReason, WaitingState, WorkCompletedEvent, WorkLogEntry, WorkspaceAbortedEvent, WorkspaceArtifactsResponse, WorkspaceContextLayerRecord, WorkspaceContextLayerTarget, WorkspaceCreatedEvent, WorkspaceDeletedEvent, WorkspaceDestroyedEvent, WorkspaceWipeStartedEvent, WriteFileAtPathInput, WriteFileAtPathResult, WriteFileAtPathRpc, applyEvent, applyEvents, applyIssueDelta, bucketQuotaPoints, bucketQuotaRemaining, builtinFor, canonicalPullRequestUrl, companionTerminalKindFor, compareEffort, compareFleetBinaries, compareIssueIds, compareTimelineKeys, createIssueDelta, decodeFlywheelDerivedStatus, decodeFlywheelStats, decodeTimelineCursor, deriveProjectCi, effectiveTerminalPalette, encodeFlywheelStats, encodeTimelineCursor, formatMachineLoad, formatMachineProfile, getHarness, getHarnessBehavior, getMaxMemoryObservationsPerIssue, getMaxTurnDiffSummariesPerAgent, getRuntimeBehavior, hasToolResult, indexPanesByAgentKey, isAgentRole, isAgentSessionName, isChannelReplyKind, isConfiguredPullRequestRepo, isEffortLevel, isIssueAttention, isIssueState, isLegacyPiHarnessName, isProtocolCompatible, isSingletonConversation, isTerminalBackendName, isTerminalTurnDiffSummaryStatus, laneActivityOf, linkedConversationName, normalizeChannelReplyPayload, normalizeColorTheme, normalizeHarnessName, omitTurnDiffSummariesForAgent, overdeckInstallCommand, paneAgentKey, parseLinkedConversationName, parsePullRequestRef, parseTrackerIssueUrl, presetToCron, projectLegacySystemHealthSummary, readableForeground, repoFromRemoteUrl, resolveEffectivePullRequest, resolveTrackerIssueId, slugifyThemeId, syncSnapshot, timelineKeyOfMessage, timelineKeyOfWork, toOpaqueHex, trimMemoryObservations, trimTurnDiffSummaries, withPaneLivenessAlias };
16425
18642
 
16426
18643
  //# sourceMappingURL=index.mjs.map