@overdeck/contracts 0.62.1 → 0.64.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -61,6 +61,27 @@ const BackendPane = effect.Schema.Struct({
61
61
  /** Working directory of the pane (the issue workspace path). */
62
62
  workspace: effect.Schema.optional(effect.Schema.String)
63
63
  });
64
+ /**
65
+ * The agent id a pane answers for (PAN-4320). On Herdr `id` (`w1:p1`) and
66
+ * `terminalId` (`term_…`) are backend handles, never agent ids, so the
67
+ * `agentId` token decides; tmux panes carry `agentId` = session name.
68
+ */
69
+ function paneAgentKey(pane) {
70
+ return pane.agentId ?? pane.terminalId ?? pane.id;
71
+ }
72
+ /**
73
+ * Panes by agent key. When two panes answer for one agent (a restarted Herdr
74
+ * agent beside its exited pane), a non-exited pane wins, never the reverse.
75
+ */
76
+ function indexPanesByAgentKey(panes) {
77
+ const byKey = /* @__PURE__ */ new Map();
78
+ for (const pane of panes) {
79
+ const key = paneAgentKey(pane);
80
+ const prior = byKey.get(key);
81
+ if (!prior || prior.state === "exited" && pane.state !== "exited") byKey.set(key, pane);
82
+ }
83
+ return byKey;
84
+ }
64
85
  //#endregion
65
86
  //#region src/derived-issue-state.ts
66
87
  /**
@@ -86,7 +107,8 @@ const IssueState = effect.Schema.Literals([
86
107
  const IssueAttention = effect.Schema.Literals([
87
108
  "needs-you",
88
109
  "stuck",
89
- "api-error"
110
+ "api-error",
111
+ "work-not-started"
90
112
  ]);
91
113
  /** Latest review decision on the PR, as the forge reports it. */
92
114
  const PrReviewState = effect.Schema.Literals([
@@ -109,7 +131,9 @@ const DerivedPrState = effect.Schema.Struct({
109
131
  reviewState: PrReviewState,
110
132
  checks: PrChecksState,
111
133
  /** Forge mergeability. `null` when the forge has not computed it yet. */
112
- mergeable: effect.Schema.NullOr(effect.Schema.Boolean)
134
+ mergeable: effect.Schema.NullOr(effect.Schema.Boolean),
135
+ /** Present only when true; survives state: closed (PAN-4290). */
136
+ merged: effect.Schema.optional(effect.Schema.Boolean)
113
137
  });
114
138
  /** The issue's feature branch as git reports it. */
115
139
  const DerivedBranchState = effect.Schema.Struct({
@@ -117,6 +141,16 @@ const DerivedBranchState = effect.Schema.Struct({
117
141
  aheadOfMain: effect.Schema.Number,
118
142
  pushed: effect.Schema.Boolean
119
143
  });
144
+ /** The workspace journal's read on a post-planning auto-start (PAN-4399). */
145
+ const DerivedWorkStart = effect.Schema.Struct({
146
+ status: effect.Schema.Literals(["retrying", "not-started"]),
147
+ /** ISO time of the journal entry the status was read from. */
148
+ at: effect.Schema.String,
149
+ error: effect.Schema.optional(effect.Schema.String),
150
+ nextRetryAt: effect.Schema.optional(effect.Schema.String),
151
+ /** The retry is journaled but not actually running because the Deacon is frozen (PAN-4210). Present only when true. */
152
+ held: effect.Schema.optional(effect.Schema.Literal(true))
153
+ });
120
154
  /** Everything the dashboard needs to render an issue's pipeline position. */
121
155
  const DerivedIssueState = effect.Schema.Struct({
122
156
  issueId: effect.Schema.String,
@@ -129,7 +163,9 @@ const DerivedIssueState = effect.Schema.Struct({
129
163
  * precedence — could not be ruled in or out. Present only in that case; an
130
164
  * unresolved tracker read is never reported as an open issue.
131
165
  */
132
- trackerUnknown: effect.Schema.optional(effect.Schema.Literal(true))
166
+ trackerUnknown: effect.Schema.optional(effect.Schema.Literal(true)),
167
+ /** A deferred or gave-up post-planning auto-start read from the workspace journal (PAN-4399). */
168
+ workStart: effect.Schema.optional(DerivedWorkStart)
133
169
  });
134
170
  const ISSUE_STATES = [
135
171
  "backlog",
@@ -157,7 +193,8 @@ const ISSUE_STATE_PRECEDENCE = [
157
193
  const ISSUE_ATTENTIONS = [
158
194
  "needs-you",
159
195
  "stuck",
160
- "api-error"
196
+ "api-error",
197
+ "work-not-started"
161
198
  ];
162
199
  function isIssueState(value) {
163
200
  return typeof value === "string" && ISSUE_STATES.includes(value);
@@ -166,6 +203,119 @@ function isIssueAttention(value) {
166
203
  return typeof value === "string" && ISSUE_ATTENTIONS.includes(value);
167
204
  }
168
205
  //#endregion
206
+ //#region src/github-quota.ts
207
+ /**
208
+ * The closed list of logical GitHub callers. A call made outside any
209
+ * `withGitHubCaller` context is recorded as `other` (or `app-rest` when it
210
+ * goes through the GitHub App REST door).
211
+ */
212
+ const GITHUB_QUOTA_CALLERS = [
213
+ "pipeline-membership",
214
+ "pr-cache",
215
+ "pr-sync",
216
+ "ci-repair",
217
+ "issue-poller",
218
+ "close-out",
219
+ "tracker-client",
220
+ "app-rest",
221
+ "quota-sampler",
222
+ "agent",
223
+ "other"
224
+ ];
225
+ const GitHubQuotaCaller = effect.Schema.Literals(GITHUB_QUOTA_CALLERS);
226
+ /**
227
+ * Read-model pollers whose data can be stale for minutes without harm. Only
228
+ * these callers are skipped while a pause is active; every other caller
229
+ * (merge, verdict recording, tracker writes, agents) is essential and never
230
+ * paused.
231
+ */
232
+ const NON_ESSENTIAL_GITHUB_CALLERS = new Set([
233
+ "pipeline-membership",
234
+ "pr-cache",
235
+ "pr-sync",
236
+ "ci-repair",
237
+ "issue-poller",
238
+ "close-out"
239
+ ]);
240
+ /**
241
+ * The GitHub identity whose limit a call spends: `user` is the `gh` CLI token,
242
+ * `pat` is the `GITHUB_TOKEN` personal access token, `app` is a GitHub App
243
+ * installation token.
244
+ */
245
+ const GITHUB_QUOTA_POOLS = [
246
+ "user",
247
+ "pat",
248
+ "app"
249
+ ];
250
+ const GitHubQuotaPool = effect.Schema.Literals(GITHUB_QUOTA_POOLS);
251
+ /** The limit counter inside a pool. `rest` is what GitHub calls `core`. */
252
+ const GITHUB_QUOTA_BUCKETS = ["graphql", "rest"];
253
+ const GitHubQuotaBucket = effect.Schema.Literals(GITHUB_QUOTA_BUCKETS);
254
+ /** Primary = the hourly budget; secondary = GitHub's burst/abuse limit. */
255
+ const GitHubRateLimitKind = effect.Schema.Literals(["primary", "secondary"]);
256
+ /** Points spent and calls made in one bucket. */
257
+ const GitHubQuotaUsage = effect.Schema.Struct({
258
+ points: effect.Schema.Number,
259
+ calls: effect.Schema.Number
260
+ });
261
+ /** One caller's metered usage over the last hour. */
262
+ const GitHubQuotaCallerUsage = effect.Schema.Struct({
263
+ caller: GitHubQuotaCaller,
264
+ graphql: GitHubQuotaUsage,
265
+ rest: GitHubQuotaUsage,
266
+ /** True when any counted call had an estimated (not GitHub-reported) cost. */
267
+ estimated: effect.Schema.Boolean
268
+ });
269
+ /** The latest `/rate_limit` (or header) reading for one pool and bucket. */
270
+ const GitHubQuotaSample = effect.Schema.Struct({
271
+ pool: GitHubQuotaPool,
272
+ bucket: GitHubQuotaBucket,
273
+ /** ISO time the sample was taken. */
274
+ ts: effect.Schema.String,
275
+ remaining: effect.Schema.Number,
276
+ limit: effect.Schema.Number,
277
+ /** ISO time the bucket's hourly window resets. */
278
+ resetAt: effect.Schema.optional(effect.Schema.String)
279
+ });
280
+ /** An active pause on one pool and bucket (`~/.overdeck/github-quota/pause.json`). */
281
+ const GitHubQuotaPause = effect.Schema.Struct({
282
+ pool: GitHubQuotaPool,
283
+ bucket: GitHubQuotaBucket,
284
+ kind: GitHubRateLimitKind,
285
+ /** The caller whose refused call started the pause. */
286
+ caller: GitHubQuotaCaller,
287
+ /** ISO time the pause started. */
288
+ since: effect.Schema.String,
289
+ /** ISO time the pause ends. */
290
+ until: effect.Schema.String
291
+ });
292
+ /**
293
+ * The operator-facing quota view — identical to the body of
294
+ * `GET /api/github-quota`, so the pill, the banner and the CLI read one shape.
295
+ * Derived runtime state: published with `emitOnly`, never persisted.
296
+ */
297
+ const GitHubQuotaSnapshot = effect.Schema.Struct({
298
+ /** ISO time the snapshot was built. */
299
+ generatedAt: effect.Schema.String,
300
+ /** The `gh` account login. Local display only; never sent to telemetry. */
301
+ login: effect.Schema.NullOr(effect.Schema.String),
302
+ /** Per-caller usage in the last hour, highest total points first. */
303
+ callers: effect.Schema.Array(GitHubQuotaCallerUsage),
304
+ /** The latest sample per pool and bucket. */
305
+ samples: effect.Schema.Array(GitHubQuotaSample),
306
+ /** Active pauses; empty when GitHub calls are not paused. */
307
+ pauses: effect.Schema.Array(GitHubQuotaPause),
308
+ /** True when this machine's own metered usage cannot explain a primary limit. */
309
+ ownUsageLow: effect.Schema.Boolean,
310
+ /** User-pool GraphQL points the latest sample shows spent but no metered caller claims. */
311
+ unattributed: effect.Schema.Number,
312
+ /** Refusals observed in the last hour. */
313
+ refusals: effect.Schema.Struct({
314
+ primary: effect.Schema.Number,
315
+ secondary: effect.Schema.Number
316
+ })
317
+ });
318
+ //#endregion
169
319
  //#region src/types.ts
170
320
  const IssueId = effect.Schema.String;
171
321
  const MEMBERSHIP_UNAVAILABLE_REASONS = [
@@ -222,7 +372,8 @@ const KNOWN_HARNESSES = new Set([
222
372
  "acp",
223
373
  "kimi-code",
224
374
  "opencode",
225
- "muse"
375
+ "muse",
376
+ "prime-agent"
226
377
  ]);
227
378
  /**
228
379
  * Normalize a snapshot's runtime field to a known Harness value.
@@ -321,6 +472,7 @@ const AgentRuntimeSnapshot = effect.Schema.Struct({
321
472
  activity: Activity,
322
473
  lastActivity: effect.Schema.String,
323
474
  currentTool: effect.Schema.optional(effect.Schema.String),
475
+ currentToolDescription: effect.Schema.optional(effect.Schema.String),
324
476
  thinking: effect.Schema.optional(ThinkingState),
325
477
  waiting: effect.Schema.optional(WaitingState),
326
478
  claudeSessionId: effect.Schema.optional(effect.Schema.String),
@@ -345,6 +497,13 @@ const ChannelPermissionRequestSnapshot = effect.Schema.Struct({
345
497
  inputPreview: effect.Schema.String,
346
498
  createdAt: effect.Schema.String
347
499
  });
500
+ /** PAN-4371 — advisory Jev reading of why an idle agent ended its turn. kind is a string (append-only store). */
501
+ const TurnEndAssessment = effect.Schema.Struct({
502
+ kind: effect.Schema.String,
503
+ confidence: effect.Schema.Number,
504
+ needsAnswer: effect.Schema.Boolean,
505
+ model: effect.Schema.String
506
+ });
348
507
  const AgentSnapshot = effect.Schema.Struct({
349
508
  id: AgentId,
350
509
  issueId: IssueId,
@@ -407,6 +566,7 @@ const AgentSnapshot = effect.Schema.Struct({
407
566
  })),
408
567
  resolution: effect.Schema.optional(AgentResolution),
409
568
  resolutionCount: effect.Schema.optional(effect.Schema.Number),
569
+ turnEndAssessment: effect.Schema.optional(TurnEndAssessment),
410
570
  runtimeSnapshotSequence: effect.Schema.optional(SequenceNumber)
411
571
  });
412
572
  /** PAN-3151: A recorded cycle in the review convergence tracking series */
@@ -584,6 +744,8 @@ const DashboardSnapshot = effect.Schema.Struct({
584
744
  embedProgressBySessionId: effect.Schema.optional(effect.Schema.Record(effect.Schema.String, EmbedProgressSnapshot)),
585
745
  ciByProjectKey: effect.Schema.optional(effect.Schema.Record(effect.Schema.String, ProjectCiSnapshot)),
586
746
  restartGate: effect.Schema.optional(RestartGateSnapshot),
747
+ /** PAN-4264 — GitHub API quota use, samples and pauses; derived, never stored. */
748
+ githubQuota: effect.Schema.optional(GitHubQuotaSnapshot),
587
749
  /** PAN-3751 — in-flight deploys keyed by project key. */
588
750
  deployByProjectKey: effect.Schema.optional(effect.Schema.Record(effect.Schema.String, ProjectDeploySnapshot)),
589
751
  timestamp: effect.Schema.String
@@ -1457,6 +1619,20 @@ const RestartGateChangedEvent = effect.Schema.Struct({
1457
1619
  payload: RestartGateSnapshot
1458
1620
  });
1459
1621
  /**
1622
+ * The GitHub API quota view changed (PAN-4264).
1623
+ *
1624
+ * The payload is the complete snapshot, so the reducer is a plain replace.
1625
+ * The server derives it from the quota ledger and pause file under
1626
+ * `~/.overdeck/github-quota/` and emits it in-memory only, like
1627
+ * `restart_gate.changed`: it is never persisted and never replayed at boot.
1628
+ */
1629
+ const GitHubQuotaChangedEvent = effect.Schema.Struct({
1630
+ type: effect.Schema.Literal("github_quota.changed"),
1631
+ sequence: SequenceNumber,
1632
+ timestamp: effect.Schema.String,
1633
+ payload: GitHubQuotaSnapshot
1634
+ });
1635
+ /**
1460
1636
  * The set of in-flight project deploys changed (PAN-3751).
1461
1637
  *
1462
1638
  * The payload is the COMPLETE projection keyed by project key, so the reducer
@@ -1648,7 +1824,8 @@ const AgentEnrichmentChangedEvent = effect.Schema.Struct({
1648
1824
  plan: effect.Schema.String
1649
1825
  })),
1650
1826
  resolution: effect.Schema.optional(AgentResolution),
1651
- resolutionCount: effect.Schema.optional(effect.Schema.Number)
1827
+ resolutionCount: effect.Schema.optional(effect.Schema.Number),
1828
+ turnEndAssessment: effect.Schema.optional(TurnEndAssessment)
1652
1829
  })
1653
1830
  });
1654
1831
  /** New — agent created in database */
@@ -1671,6 +1848,7 @@ const AgentActivityChangedEvent = effect.Schema.Struct({
1671
1848
  agentId: AgentId,
1672
1849
  activity: Activity,
1673
1850
  currentTool: effect.Schema.optional(effect.Schema.String),
1851
+ toolDescription: effect.Schema.optional(effect.Schema.String),
1674
1852
  hookName: effect.Schema.optional(effect.Schema.String)
1675
1853
  })
1676
1854
  });
@@ -2773,6 +2951,7 @@ const DomainEvent = effect.Schema.Union([
2773
2951
  ProjectCiSuiteObservedEvent,
2774
2952
  ProjectCiHeadObservedEvent,
2775
2953
  RestartGateChangedEvent,
2954
+ GitHubQuotaChangedEvent,
2776
2955
  ProjectDeployChangedEvent,
2777
2956
  AgentCreatedEvent,
2778
2957
  AgentEnrichmentChangedEvent,
@@ -3163,13 +3342,23 @@ const WorkLogEntry = effect.Schema.Struct({
3163
3342
  toolInput: effect.Schema.optional(effect.Schema.Record(effect.Schema.String, effect.Schema.Unknown)),
3164
3343
  sequence: effect.Schema.optional(effect.Schema.Number)
3165
3344
  });
3345
+ /** A human-origin message read from a subagent's own sidechain transcript (PAN-4247). */
3346
+ const SubagentHumanInput = effect.Schema.Struct({
3347
+ id: effect.Schema.String,
3348
+ text: effect.Schema.String,
3349
+ createdAt: effect.Schema.String
3350
+ });
3166
3351
  const SubagentSummary = effect.Schema.Struct({
3167
3352
  agentId: effect.Schema.String,
3168
3353
  agentType: effect.Schema.String,
3169
3354
  description: effect.Schema.String,
3170
3355
  toolUseId: effect.Schema.String,
3171
3356
  spawnDepth: effect.Schema.Number,
3172
- status: effect.Schema.Literals(["running", "done"])
3357
+ status: effect.Schema.Literals(["running", "done"]),
3358
+ /** True for a background subagent, launched with `requestShape: "background"` (PAN-4247). */
3359
+ background: effect.Schema.optional(effect.Schema.Boolean),
3360
+ /** Recent human-origin sidechain inputs, most useful when a message routed into this subagent instead of the main conversation (PAN-4247). */
3361
+ humanInputs: effect.Schema.optional(effect.Schema.Array(SubagentHumanInput))
3173
3362
  });
3174
3363
  /**
3175
3364
  * Response shape for GET /api/agents/:id/conversation.
@@ -3678,6 +3867,7 @@ const INITIAL_READ_MODEL_STATE = {
3678
3867
  embedProgressBySessionId: {},
3679
3868
  ciByProjectKey: {},
3680
3869
  restartGate: null,
3870
+ githubQuota: null,
3681
3871
  deployByProjectKey: {},
3682
3872
  agentIdBySessionId: {},
3683
3873
  dashboardLifecycle: {
@@ -3809,6 +3999,7 @@ function syncSnapshot(state, snapshot) {
3809
3999
  embedProgressBySessionId: snapshot.embedProgressBySessionId ?? {},
3810
4000
  ciByProjectKey: snapshot.ciByProjectKey ?? state.ciByProjectKey,
3811
4001
  restartGate: snapshot.restartGate ?? state.restartGate,
4002
+ githubQuota: snapshot.githubQuota ?? state.githubQuota,
3812
4003
  deployByProjectKey: snapshot.deployByProjectKey ?? state.deployByProjectKey,
3813
4004
  agentIdBySessionId
3814
4005
  };
@@ -3888,7 +4079,8 @@ function applyEvent(state, event) {
3888
4079
  pendingAskUserQuestion: event.payload.pendingAskUserQuestion,
3889
4080
  pendingProposedPlan: event.payload.pendingProposedPlan,
3890
4081
  resolution: event.payload.resolution,
3891
- resolutionCount: event.payload.resolutionCount
4082
+ resolutionCount: event.payload.resolutionCount,
4083
+ turnEndAssessment: event.payload.turnEndAssessment
3892
4084
  }
3893
4085
  }
3894
4086
  };
@@ -3913,6 +4105,7 @@ function applyEvent(state, event) {
3913
4105
  ...prevRuntime,
3914
4106
  activity: "stopped",
3915
4107
  currentTool: void 0,
4108
+ currentToolDescription: void 0,
3916
4109
  thinking: void 0,
3917
4110
  waiting: void 0,
3918
4111
  channelReply: void 0,
@@ -4025,6 +4218,7 @@ function applyEvent(state, event) {
4025
4218
  delete base["pendingInputKinds"];
4026
4219
  delete base["pendingAskUserQuestion"];
4027
4220
  delete base["pendingProposedPlan"];
4221
+ delete base["turnEndAssessment"];
4028
4222
  }
4029
4223
  return base;
4030
4224
  })();
@@ -4056,6 +4250,7 @@ function applyEvent(state, event) {
4056
4250
  ...prevRuntime,
4057
4251
  activity: "stopped",
4058
4252
  currentTool: void 0,
4253
+ currentToolDescription: void 0,
4059
4254
  thinking: void 0,
4060
4255
  waiting: void 0,
4061
4256
  channelReply: void 0,
@@ -4224,6 +4419,11 @@ function applyEvent(state, event) {
4224
4419
  ...event.payload.lastOutcome === void 0 ? {} : { lastOutcome: event.payload.lastOutcome }
4225
4420
  }
4226
4421
  };
4422
+ case "github_quota.changed": return {
4423
+ ...state,
4424
+ sequence: Math.max(state.sequence, event.sequence),
4425
+ githubQuota: event.payload
4426
+ };
4227
4427
  case "project.deploy_changed": return {
4228
4428
  ...state,
4229
4429
  sequence: Math.max(state.sequence, event.sequence),
@@ -4477,12 +4677,13 @@ function applyEvent(state, event) {
4477
4677
  sequence: Math.max(state.sequence, event.sequence)
4478
4678
  };
4479
4679
  case "agent.activity_changed": {
4480
- const { agentId, activity, currentTool } = event.payload;
4680
+ const { agentId, activity, currentTool, toolDescription } = event.payload;
4481
4681
  const prev = state.agentRuntimeById[agentId] ?? defaultRuntimeSnapshot(agentId, event.timestamp, event.sequence);
4482
4682
  const next = {
4483
4683
  ...prev,
4484
4684
  activity,
4485
4685
  currentTool: activity === "working" ? currentTool : void 0,
4686
+ currentToolDescription: activity === "working" ? toolDescription : void 0,
4486
4687
  thinking: activity === "thinking" ? prev.thinking : void 0,
4487
4688
  waiting: activity === "waiting" ? prev.waiting : void 0,
4488
4689
  channelReply: activity === "working" ? void 0 : prev.channelReply,
@@ -4505,6 +4706,7 @@ function applyEvent(state, event) {
4505
4706
  ...state.agentRuntimeById[agentId] ?? defaultRuntimeSnapshot(agentId, event.timestamp, event.sequence),
4506
4707
  activity: "thinking",
4507
4708
  currentTool: void 0,
4709
+ currentToolDescription: void 0,
4508
4710
  thinking: {
4509
4711
  since: event.timestamp,
4510
4712
  lastToolAt
@@ -4553,6 +4755,7 @@ function applyEvent(state, event) {
4553
4755
  ...state.agentRuntimeById[agentId] ?? defaultRuntimeSnapshot(agentId, event.timestamp, event.sequence),
4554
4756
  activity: "waiting",
4555
4757
  currentTool: void 0,
4758
+ currentToolDescription: void 0,
4556
4759
  thinking: void 0,
4557
4760
  waiting: {
4558
4761
  reason,
@@ -5109,6 +5312,30 @@ function deriveProjectCi(record) {
5109
5312
  };
5110
5313
  }
5111
5314
  //#endregion
5315
+ //#region src/effort.ts
5316
+ /**
5317
+ * Canonical reasoning-effort levels, end to end. `xhigh` was added in Opus 4.7
5318
+ * (between `high` and `max`); `max` predates it (Opus 4.6+/Sonnet 4.6). This is
5319
+ * the single source of truth for the enum — every other copy in the codebase
5320
+ * derives from it.
5321
+ */
5322
+ const EFFORT_LEVELS = [
5323
+ "low",
5324
+ "medium",
5325
+ "high",
5326
+ "xhigh",
5327
+ "max"
5328
+ ];
5329
+ const DEFAULT_EFFORT = "high";
5330
+ const EffortLevelSchema = effect.Schema.Literals(EFFORT_LEVELS);
5331
+ function isEffortLevel(value) {
5332
+ return typeof value === "string" && EFFORT_LEVELS.includes(value);
5333
+ }
5334
+ /** Compares two effort levels by rank; negative when `a` is lower than `b`. */
5335
+ function compareEffort(a, b) {
5336
+ return EFFORT_LEVELS.indexOf(a) - EFFORT_LEVELS.indexOf(b);
5337
+ }
5338
+ //#endregion
5112
5339
  //#region src/flywheel.ts
5113
5340
  const FlywheelRunId = effect.Schema.String.check(effect.Schema.isPattern(/^RUN-\d+$/));
5114
5341
  const FlywheelHttpUrl = effect.Schema.String.check(effect.Schema.isPattern(/^https?:\/\/\S+$/i));
@@ -5120,15 +5347,10 @@ const FlywheelHarness = effect.Schema.Literals([
5120
5347
  "acp",
5121
5348
  "kimi-code",
5122
5349
  "opencode",
5123
- "muse"
5124
- ]);
5125
- const FlywheelEffort = effect.Schema.Literals([
5126
- "low",
5127
- "medium",
5128
- "high",
5129
- "xhigh",
5130
- "max"
5350
+ "muse",
5351
+ "prime-agent"
5131
5352
  ]);
5353
+ const FlywheelEffort = EffortLevelSchema;
5132
5354
  const FlywheelOrchestrator = effect.Schema.Struct({
5133
5355
  harness: FlywheelHarness,
5134
5356
  model: effect.Schema.String,
@@ -5389,6 +5611,8 @@ const FlywheelConversationSummary = effect.Schema.Struct({
5389
5611
  model: effect.Schema.NullOr(effect.Schema.String),
5390
5612
  harness: effect.Schema.NullOr(effect.Schema.String),
5391
5613
  cwd: effect.Schema.String,
5614
+ /** When the conversation row was created — the page's elapsed run time. */
5615
+ createdAt: effect.Schema.String,
5392
5616
  sessionAlive: effect.Schema.Boolean
5393
5617
  });
5394
5618
  const FlywheelLastTick = effect.Schema.Struct({
@@ -5410,11 +5634,28 @@ const FlywheelJournalSummary = effect.Schema.Struct({
5410
5634
  type: effect.Schema.String,
5411
5635
  source: effect.Schema.optional(effect.Schema.String)
5412
5636
  });
5637
+ /** One live agent pane in the flywheel's project, as the backend inventory reports it. */
5638
+ const FlywheelAgentSummary = effect.Schema.Struct({
5639
+ issueId: effect.Schema.String,
5640
+ role: effect.Schema.String,
5641
+ harness: effect.Schema.String,
5642
+ model: effect.Schema.String,
5643
+ state: effect.Schema.String,
5644
+ agentId: effect.Schema.optional(effect.Schema.String)
5645
+ });
5413
5646
  const FlywheelInFlightRow = effect.Schema.Struct({
5414
5647
  issueId: effect.Schema.String,
5648
+ /** The tracker's title, or `null` when no tracker answered for this issue. */
5649
+ title: effect.Schema.NullOr(effect.Schema.String),
5415
5650
  state: IssueState,
5416
5651
  attention: effect.Schema.optional(IssueAttention),
5417
5652
  pr: effect.Schema.optional(DerivedPrState),
5653
+ /** Set when no configured tracker answered: the state is a guess, not a fact. */
5654
+ trackerUnknown: effect.Schema.optional(effect.Schema.Literal(true)),
5655
+ /** Live agent panes on this issue. `working` with 0 means nobody is driving it. */
5656
+ liveAgents: effect.Schema.Number,
5657
+ /** The loop named this id in its newest tick marker's in-flight list. */
5658
+ inTick: effect.Schema.Boolean,
5418
5659
  lastJournal: effect.Schema.NullOr(FlywheelJournalSummary)
5419
5660
  });
5420
5661
  const FlywheelOrderBookSummary = effect.Schema.Struct({
@@ -5431,6 +5672,13 @@ const FlywheelDerivedStatus = effect.Schema.Struct({
5431
5672
  freshness: effect.Schema.NullOr(FlywheelFreshness),
5432
5673
  policies: FlywheelPolicies,
5433
5674
  inFlight: effect.Schema.Array(FlywheelInFlightRow),
5675
+ /** Every live agent on an in-flight issue, by issue then role. */
5676
+ agents: effect.Schema.Array(FlywheelAgentSummary),
5677
+ /**
5678
+ * Which list the header counts: `tick` when a running loop named its own
5679
+ * in-flight ids, `census` when the rows are just the feature workspaces.
5680
+ */
5681
+ inFlightSource: effect.Schema.Literals(["tick", "census"]),
5434
5682
  orderBook: effect.Schema.NullOr(FlywheelOrderBookSummary),
5435
5683
  projectRoot: effect.Schema.String,
5436
5684
  generatedAt: effect.Schema.String
@@ -5496,7 +5744,8 @@ const CONTEXT_PREVIEW_HARNESSES = [
5496
5744
  "acp",
5497
5745
  "kimi-code",
5498
5746
  "opencode",
5499
- "muse"
5747
+ "muse",
5748
+ "prime-agent"
5500
5749
  ];
5501
5750
  const ContextLayerKind = effect.Schema.Literals(CONTEXT_LAYER_KINDS);
5502
5751
  const ContextPreviewHarness = effect.Schema.Literals(CONTEXT_PREVIEW_HARNESSES);
@@ -5606,6 +5855,7 @@ const ContextHarnessPreviews = effect.Schema.Struct({
5606
5855
  "kimi-code": effect.Schema.String,
5607
5856
  opencode: effect.Schema.optional(effect.Schema.String),
5608
5857
  muse: effect.Schema.String,
5858
+ "prime-agent": effect.Schema.String,
5609
5859
  fullPrompt: effect.Schema.String
5610
5860
  });
5611
5861
  const ContextPreviewDiagnostic = effect.Schema.Struct({
@@ -5664,6 +5914,7 @@ const ArtifactAgentHarness = effect.Schema.Literals([
5664
5914
  "kimi-code",
5665
5915
  "opencode",
5666
5916
  "muse",
5917
+ "prime-agent",
5667
5918
  "user"
5668
5919
  ]);
5669
5920
  const ArtifactLifecycleState = effect.Schema.Literals([
@@ -5841,7 +6092,8 @@ const CLAUDE_CODE_BEHAVIOR = {
5841
6092
  usesCodexHome: false,
5842
6093
  injectsPromptTimeMemory: false,
5843
6094
  workAgentMode: "claude-code",
5844
- readyTimeoutSeconds: 30
6095
+ readyTimeoutSeconds: 30,
6096
+ steerKind: "send-now-keys"
5845
6097
  };
5846
6098
  const OHMYPI_BEHAVIOR = {
5847
6099
  displayName: "Pi",
@@ -5863,7 +6115,14 @@ const OHMYPI_BEHAVIOR = {
5863
6115
  usesCodexHome: false,
5864
6116
  injectsPromptTimeMemory: true,
5865
6117
  workAgentMode: "ohmypi-rpc",
5866
- readyTimeoutSeconds: 120
6118
+ readyTimeoutSeconds: 120,
6119
+ steerKind: "control-channel",
6120
+ effortLevels: [
6121
+ "low",
6122
+ "medium",
6123
+ "high",
6124
+ "xhigh"
6125
+ ]
5867
6126
  };
5868
6127
  const CODEX_BEHAVIOR = {
5869
6128
  displayName: "Codex",
@@ -5885,7 +6144,8 @@ const CODEX_BEHAVIOR = {
5885
6144
  usesCodexHome: true,
5886
6145
  injectsPromptTimeMemory: false,
5887
6146
  workAgentMode: "codex-work-tui",
5888
- readyTimeoutSeconds: 30
6147
+ readyTimeoutSeconds: 30,
6148
+ steerKind: null
5889
6149
  };
5890
6150
  const ACP_BEHAVIOR = {
5891
6151
  displayName: "ACP",
@@ -5907,7 +6167,8 @@ const ACP_BEHAVIOR = {
5907
6167
  usesCodexHome: false,
5908
6168
  injectsPromptTimeMemory: false,
5909
6169
  workAgentMode: "acp-host",
5910
- readyTimeoutSeconds: 30
6170
+ readyTimeoutSeconds: 30,
6171
+ steerKind: null
5911
6172
  };
5912
6173
  const KIMI_CODE_BEHAVIOR = {
5913
6174
  displayName: "Kimi Code",
@@ -5929,7 +6190,8 @@ const KIMI_CODE_BEHAVIOR = {
5929
6190
  usesCodexHome: false,
5930
6191
  injectsPromptTimeMemory: false,
5931
6192
  workAgentMode: "kimi-code-tui",
5932
- readyTimeoutSeconds: 60
6193
+ readyTimeoutSeconds: 60,
6194
+ steerKind: null
5933
6195
  };
5934
6196
  const OPENCODE_BEHAVIOR = {
5935
6197
  ...ACP_BEHAVIOR,
@@ -5958,7 +6220,37 @@ const MUSE_BEHAVIOR = {
5958
6220
  usesCodexHome: false,
5959
6221
  injectsPromptTimeMemory: false,
5960
6222
  workAgentMode: "muse-tui",
5961
- readyTimeoutSeconds: 60
6223
+ readyTimeoutSeconds: 60,
6224
+ steerKind: null,
6225
+ effortLevels: [
6226
+ "low",
6227
+ "medium",
6228
+ "high",
6229
+ "xhigh"
6230
+ ]
6231
+ };
6232
+ const PRIME_AGENT_BEHAVIOR = {
6233
+ displayName: "Prime Agent",
6234
+ nativeCommands: [],
6235
+ executableName: "prime-agent",
6236
+ processNames: ["prime-agent"],
6237
+ launchCommandKind: "prime-agent-host",
6238
+ deliveryKind: "prime-agent-host-rpc",
6239
+ readinessKind: "prime-agent-host-ready",
6240
+ transcriptKind: "prime-agent-jsonl",
6241
+ sessionIdSource: "prime-agent-session-id",
6242
+ contextLayerKind: "prime-agent",
6243
+ feedKind: "prime_agent",
6244
+ supportsPtySupervisor: false,
6245
+ supportsChannelsBridge: false,
6246
+ supportsConversationStreaming: true,
6247
+ supportsPatchProjection: false,
6248
+ usesRpcFifo: false,
6249
+ usesCodexHome: false,
6250
+ injectsPromptTimeMemory: false,
6251
+ workAgentMode: "prime-agent-host",
6252
+ readyTimeoutSeconds: 60,
6253
+ steerKind: null
5962
6254
  };
5963
6255
  const BEHAVIORS = {
5964
6256
  "opencode": OPENCODE_BEHAVIOR,
@@ -5967,7 +6259,8 @@ const BEHAVIORS = {
5967
6259
  codex: CODEX_BEHAVIOR,
5968
6260
  acp: ACP_BEHAVIOR,
5969
6261
  "kimi-code": KIMI_CODE_BEHAVIOR,
5970
- muse: MUSE_BEHAVIOR
6262
+ muse: MUSE_BEHAVIOR,
6263
+ "prime-agent": PRIME_AGENT_BEHAVIOR
5971
6264
  };
5972
6265
  function getHarnessBehavior(harness) {
5973
6266
  if (harness === "ohmypi" || harness === "pi") return OHMYPI_BEHAVIOR;
@@ -5976,6 +6269,7 @@ function getHarnessBehavior(harness) {
5976
6269
  if (harness === "acp") return ACP_BEHAVIOR;
5977
6270
  if (harness === "kimi-code") return KIMI_CODE_BEHAVIOR;
5978
6271
  if (harness === "muse") return MUSE_BEHAVIOR;
6272
+ if (harness === "prime-agent") return PRIME_AGENT_BEHAVIOR;
5979
6273
  return CLAUDE_CODE_BEHAVIOR;
5980
6274
  }
5981
6275
  function getRuntimeBehavior(runtime) {
@@ -6090,7 +6384,10 @@ const TELEMETRY_EVENT_NAMES = [
6090
6384
  "agent_question_answered",
6091
6385
  "server_boot",
6092
6386
  "cli_command_run",
6093
- "pipeline_stage_changed"
6387
+ "pipeline_stage_changed",
6388
+ "github_quota_sample",
6389
+ "github_rate_limited",
6390
+ "instance_heartbeat"
6094
6391
  ];
6095
6392
  const TELEMETRY_CLI_VERBS = [
6096
6393
  "abort",
@@ -6207,6 +6504,19 @@ const TELEMETRY_PROPERTY_DOMAINS = {
6207
6504
  "handoff",
6208
6505
  "plain"
6209
6506
  ],
6507
+ github_caller: [
6508
+ "pipeline_membership",
6509
+ "pr_cache",
6510
+ "pr_sync",
6511
+ "ci_repair",
6512
+ "issue_poller",
6513
+ "close_out",
6514
+ "tracker_client",
6515
+ "app_rest",
6516
+ "quota_sampler",
6517
+ "agent",
6518
+ "other"
6519
+ ],
6210
6520
  harness: [
6211
6521
  "claude-code",
6212
6522
  "ohmypi",
@@ -6214,7 +6524,8 @@ const TELEMETRY_PROPERTY_DOMAINS = {
6214
6524
  "acp",
6215
6525
  "kimi-code",
6216
6526
  "opencode",
6217
- "muse"
6527
+ "muse",
6528
+ "prime-agent"
6218
6529
  ],
6219
6530
  merge_kind: ["pipeline"],
6220
6531
  model_family: [
@@ -6238,7 +6549,26 @@ const TELEMETRY_PROPERTY_DOMAINS = {
6238
6549
  "clone",
6239
6550
  "existing",
6240
6551
  "new"
6241
- ]
6552
+ ],
6553
+ quota_points_bucket: [
6554
+ "0",
6555
+ "1-49",
6556
+ "50-199",
6557
+ "200-499",
6558
+ "500-999",
6559
+ "1000-2499",
6560
+ "2500+"
6561
+ ],
6562
+ quota_remaining_bucket: [
6563
+ "0",
6564
+ "1-99",
6565
+ "100-499",
6566
+ "500-999",
6567
+ "1000-2499",
6568
+ "2500+",
6569
+ "unknown"
6570
+ ],
6571
+ rate_limit_kind: ["primary", "secondary"]
6242
6572
  };
6243
6573
  const TELEMETRY_EVENT_CATALOG = {
6244
6574
  dashboard_tab_viewed: { tab: "dashboard_tab" },
@@ -6281,8 +6611,65 @@ const TELEMETRY_EVENT_CATALOG = {
6281
6611
  stage: "pipeline_stage",
6282
6612
  harness: "harness",
6283
6613
  model: "model_family"
6614
+ },
6615
+ github_quota_sample: {
6616
+ graphql_pipeline_membership: "quota_points_bucket",
6617
+ rest_pipeline_membership: "quota_points_bucket",
6618
+ graphql_pr_cache: "quota_points_bucket",
6619
+ rest_pr_cache: "quota_points_bucket",
6620
+ graphql_pr_sync: "quota_points_bucket",
6621
+ rest_pr_sync: "quota_points_bucket",
6622
+ graphql_ci_repair: "quota_points_bucket",
6623
+ rest_ci_repair: "quota_points_bucket",
6624
+ graphql_issue_poller: "quota_points_bucket",
6625
+ rest_issue_poller: "quota_points_bucket",
6626
+ graphql_close_out: "quota_points_bucket",
6627
+ rest_close_out: "quota_points_bucket",
6628
+ graphql_tracker_client: "quota_points_bucket",
6629
+ rest_tracker_client: "quota_points_bucket",
6630
+ graphql_app_rest: "quota_points_bucket",
6631
+ rest_app_rest: "quota_points_bucket",
6632
+ graphql_agent: "quota_points_bucket",
6633
+ rest_agent: "quota_points_bucket",
6634
+ graphql_other: "quota_points_bucket",
6635
+ rest_other: "quota_points_bucket",
6636
+ graphql_unattributed: "quota_points_bucket",
6637
+ min_remaining_graphql: "quota_remaining_bucket",
6638
+ min_remaining_rest: "quota_remaining_bucket",
6639
+ primary_limit_errors: "count_bucket",
6640
+ secondary_limit_errors: "count_bucket"
6641
+ },
6642
+ github_rate_limited: {
6643
+ caller: "github_caller",
6644
+ kind: "rate_limit_kind",
6645
+ own_usage_low: "boolean"
6646
+ },
6647
+ instance_heartbeat: {
6648
+ project_count: "count_bucket",
6649
+ active_agent_count: "count_bucket",
6650
+ dashboard_running: "boolean"
6284
6651
  }
6285
6652
  };
6653
+ /** PAN-4264: GitHub quota points as a coarse bucket (raw counts are never sent). */
6654
+ function bucketQuotaPoints(points) {
6655
+ if (!(points > 0)) return "0";
6656
+ if (points < 50) return "1-49";
6657
+ if (points < 200) return "50-199";
6658
+ if (points < 500) return "200-499";
6659
+ if (points < 1e3) return "500-999";
6660
+ if (points < 2500) return "1000-2499";
6661
+ return "2500+";
6662
+ }
6663
+ /** PAN-4264: GitHub quota remaining as a coarse bucket; `unknown` without a sample. */
6664
+ function bucketQuotaRemaining(remaining) {
6665
+ if (remaining === void 0 || !Number.isFinite(remaining)) return "unknown";
6666
+ if (remaining <= 0) return "0";
6667
+ if (remaining < 100) return "1-99";
6668
+ if (remaining < 500) return "100-499";
6669
+ if (remaining < 1e3) return "500-999";
6670
+ if (remaining < 2500) return "1000-2499";
6671
+ return "2500+";
6672
+ }
6286
6673
  //#endregion
6287
6674
  //#region src/composer-commands.generated.ts
6288
6675
  const COMPOSER_COMMAND_MANIFEST = [
@@ -6510,168 +6897,451 @@ const COMPOSER_COMMAND_MANIFEST = [
6510
6897
  "id": "pan-skills",
6511
6898
  "path": ["skills"],
6512
6899
  "display": "/pan skills",
6513
- "description": "List and manage skills",
6900
+ "description": "List skills and set per-level on/off overrides",
6514
6901
  "args": [],
6515
- "options": [{
6516
- "flags": "--json",
6517
- "description": "Output as JSON",
6518
- "required": false,
6519
- "valueHint": null
6520
- }],
6902
+ "options": [],
6521
6903
  "aliases": [],
6522
6904
  "category": "Core"
6523
6905
  },
6524
6906
  {
6525
- "id": "pan-issues",
6526
- "path": ["issues"],
6527
- "display": "/pan issues",
6528
- "description": "List and triage work across configured trackers",
6907
+ "id": "pan-skills-list",
6908
+ "path": ["skills", "list"],
6909
+ "display": "/pan skills list",
6910
+ "description": "List skills with effective on/off state and its source",
6529
6911
  "args": [],
6530
6912
  "options": [
6531
6913
  {
6532
- "flags": "--all",
6533
- "description": "Include closed issues",
6534
- "required": false,
6535
- "valueHint": null
6914
+ "flags": "--project <key>",
6915
+ "description": "Resolve for a project",
6916
+ "required": true,
6917
+ "valueHint": "key"
6536
6918
  },
6537
6919
  {
6538
- "flags": "--mine",
6539
- "description": "Show only my assigned issues",
6540
- "required": false,
6541
- "valueHint": null
6920
+ "flags": "--issue <id>",
6921
+ "description": "Resolve for an issue",
6922
+ "required": true,
6923
+ "valueHint": "id"
6542
6924
  },
6543
6925
  {
6544
6926
  "flags": "--json",
6545
6927
  "description": "Output as JSON",
6546
6928
  "required": false,
6547
6929
  "valueHint": null
6548
- },
6930
+ }
6931
+ ],
6932
+ "aliases": [],
6933
+ "category": "Core"
6934
+ },
6935
+ {
6936
+ "id": "pan-skills-set",
6937
+ "path": ["skills", "set"],
6938
+ "display": "/pan skills set",
6939
+ "description": "Set a skill (<skill> <state>) or a pack (--pack <id> <state>) on, off, or inherit",
6940
+ "args": [{
6941
+ "name": "args",
6942
+ "required": true,
6943
+ "variadic": true
6944
+ }],
6945
+ "options": [
6549
6946
  {
6550
- "flags": "--tracker <type>",
6551
- "description": "Query specific tracker (linear/github/gitlab)",
6947
+ "flags": "--project <key>",
6948
+ "description": "Project override",
6552
6949
  "required": true,
6553
- "valueHint": "type"
6950
+ "valueHint": "key"
6554
6951
  },
6555
6952
  {
6556
- "flags": "--all-trackers",
6557
- "description": "Query all configured trackers",
6558
- "required": false,
6559
- "valueHint": null
6953
+ "flags": "--issue <id>",
6954
+ "description": "Issue override",
6955
+ "required": true,
6956
+ "valueHint": "id"
6560
6957
  },
6561
6958
  {
6562
- "flags": "--triage",
6563
- "description": "Show triage queue",
6564
- "required": false,
6565
- "valueHint": null
6959
+ "flags": "--pack <id>",
6960
+ "description": "Set a whole skill pack instead of one skill",
6961
+ "required": true,
6962
+ "valueHint": "id"
6566
6963
  }
6567
6964
  ],
6568
6965
  "aliases": [],
6569
- "category": "Lifecycle"
6966
+ "category": "Core"
6570
6967
  },
6571
6968
  {
6572
- "id": "pan-show",
6573
- "path": ["show"],
6574
- "display": "/pan show",
6575
- "description": "Unified lens: derived issue state, CV, context, health for one issue",
6969
+ "id": "pan-skills-pack",
6970
+ "path": ["skills", "pack"],
6971
+ "display": "/pan skills pack",
6972
+ "description": "Register, update, and cache external skill packs pinned to a commit",
6973
+ "args": [],
6974
+ "options": [],
6975
+ "aliases": [],
6976
+ "category": "Core"
6977
+ },
6978
+ {
6979
+ "id": "pan-skills-pack-add",
6980
+ "path": [
6981
+ "skills",
6982
+ "pack",
6983
+ "add"
6984
+ ],
6985
+ "display": "/pan skills pack add",
6986
+ "description": "Register a git skill pack at the commit a ref resolves to (enables nothing)",
6576
6987
  "args": [{
6577
6988
  "name": "id",
6578
6989
  "required": true,
6579
6990
  "variadic": false
6991
+ }, {
6992
+ "name": "url",
6993
+ "required": true,
6994
+ "variadic": false
6580
6995
  }],
6581
6996
  "options": [
6582
6997
  {
6583
- "flags": "--cv",
6584
- "description": "Agent work history only",
6585
- "required": false,
6586
- "valueHint": null
6587
- },
6588
- {
6589
- "flags": "--context",
6590
- "description": "Context engineering state only",
6591
- "required": false,
6592
- "valueHint": null
6998
+ "flags": "--ref <ref>",
6999
+ "description": "Tag or branch to pin",
7000
+ "required": true,
7001
+ "valueHint": "ref"
6593
7002
  },
6594
7003
  {
6595
- "flags": "--health",
6596
- "description": "Health + heartbeat only",
6597
- "required": false,
6598
- "valueHint": null
7004
+ "flags": "--adapter <adapter>",
7005
+ "description": "plain or claude-plugin",
7006
+ "required": true,
7007
+ "valueHint": "adapter"
6599
7008
  },
6600
7009
  {
6601
- "flags": "--json",
6602
- "description": "Output as JSON",
7010
+ "flags": "--yes",
7011
+ "description": "Trust the resolved commit without asking",
6603
7012
  "required": false,
6604
7013
  "valueHint": null
6605
7014
  }
6606
7015
  ],
6607
7016
  "aliases": [],
6608
- "category": "Observation"
7017
+ "category": "Core"
6609
7018
  },
6610
7019
  {
6611
- "id": "pan-open",
6612
- "path": ["open"],
6613
- "display": "/pan open",
6614
- "description": "Open an issue workspace in your preferred editor",
7020
+ "id": "pan-skills-pack-update",
7021
+ "path": [
7022
+ "skills",
7023
+ "pack",
7024
+ "update"
7025
+ ],
7026
+ "display": "/pan skills pack update",
7027
+ "description": "Move a pack to the commit its ref (or --ref) now resolves to",
6615
7028
  "args": [{
6616
7029
  "name": "id",
6617
7030
  "required": true,
6618
7031
  "variadic": false
6619
7032
  }],
6620
7033
  "options": [{
6621
- "flags": "-e, --editor <editor>",
6622
- "description": "Editor to use (cursor, windsurf, vscode, zed, etc.)",
7034
+ "flags": "--ref <ref>",
7035
+ "description": "Switch to a different tag or branch",
6623
7036
  "required": true,
6624
- "valueHint": "editor"
7037
+ "valueHint": "ref"
7038
+ }, {
7039
+ "flags": "--yes",
7040
+ "description": "Trust the new commit without asking",
7041
+ "required": false,
7042
+ "valueHint": null
6625
7043
  }],
6626
7044
  "aliases": [],
6627
- "category": "Observation"
7045
+ "category": "Core"
6628
7046
  },
6629
7047
  {
6630
- "id": "pan-review",
6631
- "path": ["review"],
6632
- "display": "/pan review",
6633
- "description": "Review-loop management: request re-review, abort reviewers, restart a round",
7048
+ "id": "pan-skills-pack-list",
7049
+ "path": [
7050
+ "skills",
7051
+ "pack",
7052
+ "list"
7053
+ ],
7054
+ "display": "/pan skills pack list",
7055
+ "description": "List registered skill packs",
6634
7056
  "args": [],
6635
- "options": [],
7057
+ "options": [{
7058
+ "flags": "--json",
7059
+ "description": "Output as JSON",
7060
+ "required": false,
7061
+ "valueHint": null
7062
+ }, {
7063
+ "flags": "--offline",
7064
+ "description": "Skip the update check (no network)",
7065
+ "required": false,
7066
+ "valueHint": null
7067
+ }],
6636
7068
  "aliases": [],
6637
- "category": "Review"
7069
+ "category": "Core"
6638
7070
  },
6639
7071
  {
6640
- "id": "pan-review-request",
6641
- "path": ["review", "request"],
6642
- "display": "/pan review request",
6643
- "description": "Request re-review after fixing feedback",
7072
+ "id": "pan-skills-pack-remove",
7073
+ "path": [
7074
+ "skills",
7075
+ "pack",
7076
+ "remove"
7077
+ ],
7078
+ "display": "/pan skills pack remove",
7079
+ "description": "Unregister a pack, clear its global toggles, and delete its cache",
6644
7080
  "args": [{
6645
7081
  "name": "id",
6646
7082
  "required": true,
6647
7083
  "variadic": false
6648
7084
  }],
6649
- "options": [{
6650
- "flags": "-m, --message <text>",
6651
- "description": "Message describing the fixes applied",
6652
- "required": true,
6653
- "valueHint": "text"
6654
- }],
7085
+ "options": [],
6655
7086
  "aliases": [],
6656
- "category": "Review"
7087
+ "category": "Core"
6657
7088
  },
6658
7089
  {
6659
- "id": "pan-review-abort",
6660
- "path": ["review", "abort"],
6661
- "display": "/pan review abort",
6662
- "description": "Kill all running reviewer sessions and leave the worker idle",
7090
+ "id": "pan-skills-pack-sync",
7091
+ "path": [
7092
+ "skills",
7093
+ "pack",
7094
+ "sync"
7095
+ ],
7096
+ "display": "/pan skills pack sync",
7097
+ "description": "Re-fetch packs and extract their trusted commits (all packs when omitted)",
6663
7098
  "args": [{
6664
7099
  "name": "id",
6665
- "required": true,
7100
+ "required": false,
6666
7101
  "variadic": false
6667
7102
  }],
6668
7103
  "options": [],
6669
7104
  "aliases": [],
6670
- "category": "Review"
7105
+ "category": "Core"
6671
7106
  },
6672
7107
  {
6673
- "id": "pan-review-restart",
6674
- "path": ["review", "restart"],
7108
+ "id": "pan-skills-pack-gc",
7109
+ "path": [
7110
+ "skills",
7111
+ "pack",
7112
+ "gc"
7113
+ ],
7114
+ "display": "/pan skills pack gc",
7115
+ "description": "Remove unused skill pack mounts and dangling launch links",
7116
+ "args": [],
7117
+ "options": [{
7118
+ "flags": "--max-age-days <n>",
7119
+ "description": "Keep unused mounts younger than this",
7120
+ "required": true,
7121
+ "valueHint": "n"
7122
+ }],
7123
+ "aliases": [],
7124
+ "category": "Core"
7125
+ },
7126
+ {
7127
+ "id": "pan-pair",
7128
+ "path": ["pair"],
7129
+ "display": "/pan pair",
7130
+ "description": "Print a one-time URL that pairs another device with this dashboard (see configuration/remote-access.mdx)",
7131
+ "args": [],
7132
+ "options": [
7133
+ {
7134
+ "flags": "--label <name>",
7135
+ "description": "Name to record for the pairing in the activity log",
7136
+ "required": true,
7137
+ "valueHint": "name"
7138
+ },
7139
+ {
7140
+ "flags": "--url <base>",
7141
+ "description": "Base URL the other device can reach (default: this dashboard's API URL)",
7142
+ "required": true,
7143
+ "valueHint": "base"
7144
+ },
7145
+ {
7146
+ "flags": "--json",
7147
+ "description": "Print { url, credential, expiresAt } as JSON",
7148
+ "required": false,
7149
+ "valueHint": null
7150
+ }
7151
+ ],
7152
+ "aliases": [],
7153
+ "category": "CLI"
7154
+ },
7155
+ {
7156
+ "id": "pan-devices",
7157
+ "path": ["devices"],
7158
+ "display": "/pan devices",
7159
+ "description": "List or revoke paired devices (see configuration/remote-access.mdx)",
7160
+ "args": [],
7161
+ "options": [],
7162
+ "aliases": [],
7163
+ "category": "CLI"
7164
+ },
7165
+ {
7166
+ "id": "pan-devices-list",
7167
+ "path": ["devices", "list"],
7168
+ "display": "/pan devices list",
7169
+ "description": "List paired devices with created, last-used and revoked times",
7170
+ "args": [],
7171
+ "options": [{
7172
+ "flags": "--json",
7173
+ "description": "Print the devices as JSON",
7174
+ "required": false,
7175
+ "valueHint": null
7176
+ }],
7177
+ "aliases": [],
7178
+ "category": "CLI"
7179
+ },
7180
+ {
7181
+ "id": "pan-devices-revoke",
7182
+ "path": ["devices", "revoke"],
7183
+ "display": "/pan devices revoke",
7184
+ "description": "Revoke a paired device and close its live connections",
7185
+ "args": [{
7186
+ "name": "id",
7187
+ "required": true,
7188
+ "variadic": false
7189
+ }],
7190
+ "options": [],
7191
+ "aliases": [],
7192
+ "category": "CLI"
7193
+ },
7194
+ {
7195
+ "id": "pan-issues",
7196
+ "path": ["issues"],
7197
+ "display": "/pan issues",
7198
+ "description": "List and triage work across configured trackers",
7199
+ "args": [],
7200
+ "options": [
7201
+ {
7202
+ "flags": "--all",
7203
+ "description": "Include closed issues",
7204
+ "required": false,
7205
+ "valueHint": null
7206
+ },
7207
+ {
7208
+ "flags": "--mine",
7209
+ "description": "Show only my assigned issues",
7210
+ "required": false,
7211
+ "valueHint": null
7212
+ },
7213
+ {
7214
+ "flags": "--json",
7215
+ "description": "Output as JSON",
7216
+ "required": false,
7217
+ "valueHint": null
7218
+ },
7219
+ {
7220
+ "flags": "--tracker <type>",
7221
+ "description": "Query specific tracker (linear/github/gitlab)",
7222
+ "required": true,
7223
+ "valueHint": "type"
7224
+ },
7225
+ {
7226
+ "flags": "--all-trackers",
7227
+ "description": "Query all configured trackers",
7228
+ "required": false,
7229
+ "valueHint": null
7230
+ },
7231
+ {
7232
+ "flags": "--triage",
7233
+ "description": "Show triage queue",
7234
+ "required": false,
7235
+ "valueHint": null
7236
+ }
7237
+ ],
7238
+ "aliases": [],
7239
+ "category": "Lifecycle"
7240
+ },
7241
+ {
7242
+ "id": "pan-show",
7243
+ "path": ["show"],
7244
+ "display": "/pan show",
7245
+ "description": "Unified lens: derived issue state, CV, context, health for one issue",
7246
+ "args": [{
7247
+ "name": "id",
7248
+ "required": true,
7249
+ "variadic": false
7250
+ }],
7251
+ "options": [
7252
+ {
7253
+ "flags": "--cv",
7254
+ "description": "Agent work history only",
7255
+ "required": false,
7256
+ "valueHint": null
7257
+ },
7258
+ {
7259
+ "flags": "--context",
7260
+ "description": "Context engineering state only",
7261
+ "required": false,
7262
+ "valueHint": null
7263
+ },
7264
+ {
7265
+ "flags": "--health",
7266
+ "description": "Health + heartbeat only",
7267
+ "required": false,
7268
+ "valueHint": null
7269
+ },
7270
+ {
7271
+ "flags": "--json",
7272
+ "description": "Output as JSON",
7273
+ "required": false,
7274
+ "valueHint": null
7275
+ }
7276
+ ],
7277
+ "aliases": [],
7278
+ "category": "Observation"
7279
+ },
7280
+ {
7281
+ "id": "pan-open",
7282
+ "path": ["open"],
7283
+ "display": "/pan open",
7284
+ "description": "Open an issue workspace in your preferred editor",
7285
+ "args": [{
7286
+ "name": "id",
7287
+ "required": true,
7288
+ "variadic": false
7289
+ }],
7290
+ "options": [{
7291
+ "flags": "-e, --editor <editor>",
7292
+ "description": "Editor to use (cursor, windsurf, vscode, zed, etc.)",
7293
+ "required": true,
7294
+ "valueHint": "editor"
7295
+ }],
7296
+ "aliases": [],
7297
+ "category": "Observation"
7298
+ },
7299
+ {
7300
+ "id": "pan-review",
7301
+ "path": ["review"],
7302
+ "display": "/pan review",
7303
+ "description": "Review-loop management: request re-review, abort reviewers, restart a round",
7304
+ "args": [],
7305
+ "options": [],
7306
+ "aliases": [],
7307
+ "category": "Review"
7308
+ },
7309
+ {
7310
+ "id": "pan-review-request",
7311
+ "path": ["review", "request"],
7312
+ "display": "/pan review request",
7313
+ "description": "Request re-review after fixing feedback",
7314
+ "args": [{
7315
+ "name": "id",
7316
+ "required": true,
7317
+ "variadic": false
7318
+ }],
7319
+ "options": [{
7320
+ "flags": "-m, --message <text>",
7321
+ "description": "Message describing the fixes applied",
7322
+ "required": true,
7323
+ "valueHint": "text"
7324
+ }],
7325
+ "aliases": [],
7326
+ "category": "Review"
7327
+ },
7328
+ {
7329
+ "id": "pan-review-abort",
7330
+ "path": ["review", "abort"],
7331
+ "display": "/pan review abort",
7332
+ "description": "Kill all running reviewer sessions and leave the worker idle",
7333
+ "args": [{
7334
+ "name": "id",
7335
+ "required": true,
7336
+ "variadic": false
7337
+ }],
7338
+ "options": [],
7339
+ "aliases": [],
7340
+ "category": "Review"
7341
+ },
7342
+ {
7343
+ "id": "pan-review-restart",
7344
+ "path": ["review", "restart"],
6675
7345
  "display": "/pan review restart",
6676
7346
  "description": "Resume review and re-dispatch reviewers missing a report",
6677
7347
  "args": [{
@@ -6773,7 +7443,7 @@ const COMPOSER_COMMAND_MANIFEST = [
6773
7443
  },
6774
7444
  {
6775
7445
  "flags": "--harness <harness>",
6776
- "description": "Coding-agent harness: claude-code | pi | codex | acp | kimi-code | opencode | muse (defaults to role/provider settings)",
7446
+ "description": "Coding-agent harness: claude-code | pi | codex | acp | kimi-code | opencode | muse | prime-agent (defaults to role/provider settings)",
6777
7447
  "required": true,
6778
7448
  "valueHint": "harness"
6779
7449
  },
@@ -6835,6 +7505,12 @@ const COMPOSER_COMMAND_MANIFEST = [
6835
7505
  "description": "Bypass the PRD-first gate for a genuinely trivial issue (loud; prefer writing the PRD)",
6836
7506
  "required": false,
6837
7507
  "valueHint": null
7508
+ },
7509
+ {
7510
+ "flags": "--critic",
7511
+ "description": "Require an independent different-family plan critique before promotion (automatic for architecture, substrate-improvement and security labels)",
7512
+ "required": false,
7513
+ "valueHint": null
6838
7514
  }
6839
7515
  ],
6840
7516
  "aliases": [],
@@ -6873,7 +7549,17 @@ const COMPOSER_COMMAND_MANIFEST = [
6873
7549
  "required": true,
6874
7550
  "variadic": false
6875
7551
  }],
6876
- "options": [],
7552
+ "options": [{
7553
+ "flags": "--force",
7554
+ "description": "Deliver even to a critic or verifier lane that already filed its verdict",
7555
+ "required": false,
7556
+ "valueHint": null
7557
+ }, {
7558
+ "flags": "--steer",
7559
+ "description": "Interrupt the running turn and send now (Claude Code send-now; Ctrl+X Ctrl+S)",
7560
+ "required": false,
7561
+ "valueHint": null
7562
+ }],
6877
7563
  "aliases": [],
6878
7564
  "category": "Lifecycle"
6879
7565
  },
@@ -7031,6 +7717,12 @@ const COMPOSER_COMMAND_MANIFEST = [
7031
7717
  "required": true,
7032
7718
  "valueHint": "path"
7033
7719
  },
7720
+ {
7721
+ "flags": "--allow-primary",
7722
+ "description": "Operator only: allow --cwd to be a project's primary checkout (refused for agent sessions)",
7723
+ "required": false,
7724
+ "valueHint": null
7725
+ },
7034
7726
  {
7035
7727
  "flags": "--project <key>",
7036
7728
  "description": "Project (yaml key or display name) for the new conversation; defaults to inheriting the source conversation's project",
@@ -7080,6 +7772,12 @@ const COMPOSER_COMMAND_MANIFEST = [
7080
7772
  "required": true,
7081
7773
  "valueHint": "path"
7082
7774
  },
7775
+ {
7776
+ "flags": "--allow-primary",
7777
+ "description": "Operator only: allow --cwd to be a project's primary checkout (refused for agent sessions)",
7778
+ "required": false,
7779
+ "valueHint": null
7780
+ },
7083
7781
  {
7084
7782
  "flags": "--project <key>",
7085
7783
  "description": "Project (yaml key or display name) for the new conversation; defaults to inheriting the source conversation's project",
@@ -7452,7 +8150,7 @@ const COMPOSER_COMMAND_MANIFEST = [
7452
8150
  },
7453
8151
  {
7454
8152
  "flags": "--harness <harness>",
7455
- "description": "Coding-agent harness: claude-code | pi | codex | acp | kimi-code | opencode | muse (defaults to role/provider settings)",
8153
+ "description": "Coding-agent harness: claude-code | pi | codex | acp | kimi-code | opencode | muse | prime-agent (defaults to role/provider settings)",
7456
8154
  "required": true,
7457
8155
  "valueHint": "harness"
7458
8156
  },
@@ -7530,7 +8228,7 @@ const COMPOSER_COMMAND_MANIFEST = [
7530
8228
  },
7531
8229
  {
7532
8230
  "flags": "--skip-freshness",
7533
- "description": "Bypass the plan-freshness preflight and spawn even if the plan names files that no longer exist",
8231
+ "description": "Bypass the plan-freshness preflight and spawn even if the plan names files deleted since it was written",
7534
8232
  "required": false,
7535
8233
  "valueHint": null
7536
8234
  }
@@ -7557,7 +8255,7 @@ const COMPOSER_COMMAND_MANIFEST = [
7557
8255
  },
7558
8256
  {
7559
8257
  "flags": "--harness <harness>",
7560
- "description": "Coding-agent harness: claude-code | pi | codex | acp | kimi-code | opencode | muse (defaults to role/provider settings)",
8258
+ "description": "Coding-agent harness: claude-code | pi | codex | acp | kimi-code | opencode | muse | prime-agent (defaults to role/provider settings)",
7561
8259
  "required": true,
7562
8260
  "valueHint": "harness"
7563
8261
  },
@@ -7910,6 +8608,11 @@ const COMPOSER_COMMAND_MANIFEST = [
7910
8608
  "description": "Print JSON",
7911
8609
  "required": false,
7912
8610
  "valueHint": null
8611
+ }, {
8612
+ "flags": "--steal",
8613
+ "description": "Claim even when a running agent holds this item or an overlapping one (foreman/operator override)",
8614
+ "required": false,
8615
+ "valueHint": null
7913
8616
  }],
7914
8617
  "aliases": [],
7915
8618
  "category": "Lifecycle"
@@ -8568,542 +9271,972 @@ const COMPOSER_COMMAND_MANIFEST = [
8568
9271
  "category": "Workspace"
8569
9272
  },
8570
9273
  {
8571
- "id": "pan-test",
8572
- "path": ["test"],
8573
- "display": "/pan test",
8574
- "description": "Test running and management",
9274
+ "id": "pan-vault",
9275
+ "path": ["vault"],
9276
+ "display": "/pan vault",
9277
+ "description": "Session Vault: encrypted off-machine storage and cross-machine resume for agent conversations",
8575
9278
  "args": [],
8576
9279
  "options": [],
8577
9280
  "aliases": [],
8578
- "category": "Core"
9281
+ "category": "CLI"
8579
9282
  },
8580
9283
  {
8581
- "id": "pan-test-run",
8582
- "path": ["test", "run"],
8583
- "display": "/pan test run",
8584
- "description": "Run tests for a project or workspace",
9284
+ "id": "pan-vault-setup",
9285
+ "path": ["vault", "setup"],
9286
+ "display": "/pan vault setup",
9287
+ "description": "Enable the vault against your own git remote and print the recovery phrase once",
8585
9288
  "args": [{
8586
- "name": "target",
8587
- "required": false,
9289
+ "name": "git-url",
9290
+ "required": true,
8588
9291
  "variadic": false
8589
9292
  }],
8590
9293
  "options": [
8591
9294
  {
8592
- "flags": "--project <name>",
8593
- "description": "Project name from registry",
8594
- "required": true,
8595
- "valueHint": "name"
9295
+ "flags": "--hooks",
9296
+ "description": "Also register the Claude Code Stop hook that saves after each turn",
9297
+ "required": false,
9298
+ "valueHint": null
8596
9299
  },
8597
9300
  {
8598
- "flags": "--tests <names>",
8599
- "description": "Comma-separated test names to run",
9301
+ "flags": "--passphrase-file <path>",
9302
+ "description": "Also enable passphrase unlock with the passphrase in this file",
8600
9303
  "required": true,
8601
- "valueHint": "names"
9304
+ "valueHint": "path"
8602
9305
  },
8603
9306
  {
8604
- "flags": "--no-notify",
8605
- "description": "Skip desktop notification",
9307
+ "flags": "--generate-passphrase",
9308
+ "description": "Also enable passphrase unlock with a generated 6-word passphrase, printed once",
8606
9309
  "required": false,
8607
9310
  "valueHint": null
8608
- }
9311
+ },
9312
+ {
9313
+ "flags": "--no-passphrase",
9314
+ "description": "Do not offer passphrase unlock",
9315
+ "required": false,
9316
+ "valueHint": null
9317
+ }
8609
9318
  ],
8610
9319
  "aliases": [],
8611
- "category": "Core"
9320
+ "category": "CLI"
8612
9321
  },
8613
9322
  {
8614
- "id": "pan-test-list",
8615
- "path": ["test", "list"],
8616
- "display": "/pan test list",
8617
- "description": "List configured tests for a project",
9323
+ "id": "pan-vault-join",
9324
+ "path": ["vault", "join"],
9325
+ "display": "/pan vault join",
9326
+ "description": "Join an existing vault from another machine with the vault passphrase or the recovery phrase",
8618
9327
  "args": [{
8619
- "name": "project",
8620
- "required": false,
9328
+ "name": "git-url",
9329
+ "required": true,
8621
9330
  "variadic": false
8622
9331
  }],
8623
- "options": [],
8624
- "aliases": [],
8625
- "category": "Core"
8626
- },
8627
- {
8628
- "id": "pan-tts",
8629
- "path": ["tts"],
8630
- "display": "/pan tts",
8631
- "description": "Local TTS daemon helpers",
8632
- "args": [],
8633
- "options": [],
9332
+ "options": [{
9333
+ "flags": "--phrase-file <path>",
9334
+ "description": "Read the 24-word recovery phrase from a file instead of prompting",
9335
+ "required": true,
9336
+ "valueHint": "path"
9337
+ }, {
9338
+ "flags": "--passphrase-file <path>",
9339
+ "description": "Read the vault passphrase from a file instead of prompting",
9340
+ "required": true,
9341
+ "valueHint": "path"
9342
+ }],
8634
9343
  "aliases": [],
8635
- "category": "Core"
9344
+ "category": "CLI"
8636
9345
  },
8637
9346
  {
8638
- "id": "pan-tts-voices",
8639
- "path": ["tts", "voices"],
8640
- "display": "/pan tts voices",
8641
- "description": "List and inspect saved TTS voices",
9347
+ "id": "pan-vault-passphrase",
9348
+ "path": ["vault", "passphrase"],
9349
+ "display": "/pan vault passphrase",
9350
+ "description": "Turn passphrase unlock for new machines on (set) or off (remove); the vault key stays the same",
8642
9351
  "args": [],
8643
9352
  "options": [],
8644
9353
  "aliases": [],
8645
- "category": "Core"
9354
+ "category": "CLI"
8646
9355
  },
8647
9356
  {
8648
- "id": "pan-tts-voices-list",
9357
+ "id": "pan-vault-passphrase-set",
8649
9358
  "path": [
8650
- "tts",
8651
- "voices",
8652
- "list"
9359
+ "vault",
9360
+ "passphrase",
9361
+ "set"
8653
9362
  ],
8654
- "display": "/pan tts voices list",
8655
- "description": "List saved TTS voices",
9363
+ "display": "/pan vault passphrase set",
9364
+ "description": "Wrap the vault key under a passphrase so a new machine can join without the recovery phrase",
8656
9365
  "args": [],
8657
- "options": [],
8658
- "aliases": [],
8659
- "category": "Core"
8660
- },
8661
- {
8662
- "id": "pan-tts-voices-show",
8663
- "path": [
8664
- "tts",
8665
- "voices",
8666
- "show"
8667
- ],
8668
- "display": "/pan tts voices show",
8669
- "description": "Show saved TTS voice details",
8670
- "args": [{
8671
- "name": "name",
9366
+ "options": [{
9367
+ "flags": "--passphrase-file <path>",
9368
+ "description": "Read the passphrase from a file instead of prompting",
8672
9369
  "required": true,
8673
- "variadic": false
9370
+ "valueHint": "path"
9371
+ }, {
9372
+ "flags": "--generate",
9373
+ "description": "Generate a 6-word passphrase and print it once",
9374
+ "required": false,
9375
+ "valueHint": null
8674
9376
  }],
8675
- "options": [],
8676
9377
  "aliases": [],
8677
- "category": "Core"
9378
+ "category": "CLI"
8678
9379
  },
8679
9380
  {
8680
- "id": "pan-tts-voices-play",
9381
+ "id": "pan-vault-passphrase-remove",
8681
9382
  "path": [
8682
- "tts",
8683
- "voices",
8684
- "play"
9383
+ "vault",
9384
+ "passphrase",
9385
+ "remove"
8685
9386
  ],
8686
- "display": "/pan tts voices play",
8687
- "description": "Speak with a saved TTS voice",
8688
- "args": [{
8689
- "name": "name",
8690
- "required": true,
8691
- "variadic": false
8692
- }, {
8693
- "name": "text",
8694
- "required": false,
8695
- "variadic": false
8696
- }],
9387
+ "display": "/pan vault passphrase remove",
9388
+ "description": "Delete the passphrase unlock object; joining then needs the recovery phrase",
9389
+ "args": [],
8697
9390
  "options": [],
8698
9391
  "aliases": [],
8699
- "category": "Core"
9392
+ "category": "CLI"
8700
9393
  },
8701
9394
  {
8702
- "id": "pan-tts-voices-delete",
8703
- "path": [
8704
- "tts",
8705
- "voices",
8706
- "delete"
9395
+ "id": "pan-vault-rotate-key",
9396
+ "path": ["vault", "rotate-key"],
9397
+ "display": "/pan vault rotate-key",
9398
+ "description": "Replace the vault key after losing a device: re-encrypt refs under a new key, keep old chunks readable, print a new recovery phrase",
9399
+ "args": [],
9400
+ "options": [
9401
+ {
9402
+ "flags": "--yes",
9403
+ "description": "Rotate without the confirmation prompt",
9404
+ "required": false,
9405
+ "valueHint": null
9406
+ },
9407
+ {
9408
+ "flags": "--passphrase-file <path>",
9409
+ "description": "Re-wrap passphrase unlock under the new key with the passphrase in this file",
9410
+ "required": true,
9411
+ "valueHint": "path"
9412
+ },
9413
+ {
9414
+ "flags": "--generate-passphrase",
9415
+ "description": "Re-wrap passphrase unlock under the new key with a generated 6-word passphrase, printed once",
9416
+ "required": false,
9417
+ "valueHint": null
9418
+ },
9419
+ {
9420
+ "flags": "--no-passphrase",
9421
+ "description": "Turn passphrase unlock off",
9422
+ "required": false,
9423
+ "valueHint": null
9424
+ }
8707
9425
  ],
8708
- "display": "/pan tts voices delete",
8709
- "description": "Delete a saved TTS voice",
8710
- "args": [{
8711
- "name": "name",
8712
- "required": true,
8713
- "variadic": false
8714
- }],
8715
- "options": [],
8716
9426
  "aliases": [],
8717
- "category": "Core"
9427
+ "category": "CLI"
8718
9428
  },
8719
9429
  {
8720
- "id": "pan-tts-voices-set-default",
8721
- "path": [
8722
- "tts",
8723
- "voices",
8724
- "set-default"
8725
- ],
8726
- "display": "/pan tts voices set-default",
8727
- "description": "Set the system TTS voice",
8728
- "args": [{
8729
- "name": "name",
8730
- "required": true,
8731
- "variadic": false
9430
+ "id": "pan-vault-status",
9431
+ "path": ["vault", "status"],
9432
+ "display": "/pan vault status",
9433
+ "description": "Show backend, this machine, owned records, last sync and the machine list",
9434
+ "args": [],
9435
+ "options": [{
9436
+ "flags": "--json",
9437
+ "description": "Output in JSON format",
9438
+ "required": false,
9439
+ "valueHint": null
8732
9440
  }],
8733
- "options": [],
8734
9441
  "aliases": [],
8735
- "category": "Core"
9442
+ "category": "CLI"
8736
9443
  },
8737
9444
  {
8738
- "id": "pan-tts-voices-map",
8739
- "path": [
8740
- "tts",
8741
- "voices",
8742
- "map"
8743
- ],
8744
- "display": "/pan tts voices map",
8745
- "description": "Map a TTS event key to a saved voice",
9445
+ "id": "pan-vault-save",
9446
+ "path": ["vault", "save"],
9447
+ "display": "/pan vault save",
9448
+ "description": "Settle one transcript (by session id or path) or many into the vault",
8746
9449
  "args": [{
8747
- "name": "event",
8748
- "required": true,
8749
- "variadic": false
8750
- }, {
8751
- "name": "name",
8752
- "required": true,
9450
+ "name": "session-id-or-path",
9451
+ "required": false,
8753
9452
  "variadic": false
8754
9453
  }],
8755
- "options": [],
8756
- "aliases": [],
8757
- "category": "Core"
8758
- },
8759
- {
8760
- "id": "pan-tts-start",
8761
- "path": ["tts", "start"],
8762
- "display": "/pan tts start",
8763
- "description": "Start the local Qwen TTS daemon",
8764
- "args": [],
8765
9454
  "options": [
8766
9455
  {
8767
- "flags": "--detach",
8768
- "description": "Run the daemon detached in the background",
9456
+ "flags": "--all",
9457
+ "description": "Settle every discovered transcript",
8769
9458
  "required": false,
8770
9459
  "valueHint": null
8771
9460
  },
8772
9461
  {
8773
- "flags": "--foreground",
8774
- "description": "Run the daemon in the foreground",
8775
- "required": false,
8776
- "valueHint": null
9462
+ "flags": "--since <date>",
9463
+ "description": "With --all: only transcripts modified on or after this date",
9464
+ "required": true,
9465
+ "valueHint": "date"
8777
9466
  },
8778
9467
  {
8779
- "flags": "--no-wait-for-health",
8780
- "description": "Return without waiting for /health",
8781
- "required": false,
8782
- "valueHint": null
9468
+ "flags": "--harness <harness>",
9469
+ "description": "With --all: only this harness (claude-code, codex, ...)",
9470
+ "required": true,
9471
+ "valueHint": "harness"
8783
9472
  },
8784
9473
  {
8785
- "flags": "--timeout-ms <ms>",
8786
- "description": "Health wait timeout in milliseconds",
8787
- "required": true,
8788
- "valueHint": "ms"
9474
+ "flags": "--hook",
9475
+ "description": "Claude Code Stop-hook mode: read {session_id, transcript_path} JSON from stdin, print nothing, exit 0",
9476
+ "required": false,
9477
+ "valueHint": null
8789
9478
  }
8790
9479
  ],
8791
9480
  "aliases": [],
8792
- "category": "Core"
8793
- },
8794
- {
8795
- "id": "pan-tts-stop",
8796
- "path": ["tts", "stop"],
8797
- "display": "/pan tts stop",
8798
- "description": "Stop the local Qwen TTS daemon",
8799
- "args": [],
8800
- "options": [],
8801
- "aliases": [],
8802
- "category": "Core"
9481
+ "category": "CLI"
8803
9482
  },
8804
9483
  {
8805
- "id": "pan-tts-status",
8806
- "path": ["tts", "status"],
8807
- "display": "/pan tts status",
8808
- "description": "Show local Qwen TTS daemon status",
9484
+ "id": "pan-vault-sync",
9485
+ "path": ["vault", "sync"],
9486
+ "display": "/pan vault sync",
9487
+ "description": "Settle owned transcripts that grew, register this machine and refresh the list",
8809
9488
  "args": [],
8810
9489
  "options": [],
8811
9490
  "aliases": [],
8812
- "category": "Core"
9491
+ "category": "CLI"
8813
9492
  },
8814
9493
  {
8815
- "id": "pan-tts-restart",
8816
- "path": ["tts", "restart"],
8817
- "display": "/pan tts restart",
8818
- "description": "Restart the local Qwen TTS daemon",
9494
+ "id": "pan-vault-list",
9495
+ "path": ["vault", "list"],
9496
+ "display": "/pan vault list",
9497
+ "description": "List saved conversations from the local cache (never contacts the backend)",
8819
9498
  "args": [],
8820
9499
  "options": [{
8821
- "flags": "--no-wait-for-health",
8822
- "description": "Return without waiting for /health",
9500
+ "flags": "--json",
9501
+ "description": "Output in JSON format",
8823
9502
  "required": false,
8824
9503
  "valueHint": null
8825
- }, {
8826
- "flags": "--timeout-ms <ms>",
8827
- "description": "Health wait timeout in milliseconds",
8828
- "required": true,
8829
- "valueHint": "ms"
8830
9504
  }],
8831
9505
  "aliases": [],
8832
- "category": "Core"
8833
- },
8834
- {
8835
- "id": "pan-tts-install-systemd",
8836
- "path": ["tts", "install-systemd"],
8837
- "display": "/pan tts install-systemd",
8838
- "description": "Install a user systemd unit for the local Qwen TTS daemon",
8839
- "args": [],
8840
- "options": [],
8841
- "aliases": [],
8842
- "category": "Core"
9506
+ "category": "CLI"
8843
9507
  },
8844
9508
  {
8845
- "id": "pan-tts-test",
8846
- "path": ["tts", "test"],
8847
- "display": "/pan tts test",
8848
- "description": "Speak a test phrase using the configured system (priority) voice",
9509
+ "id": "pan-vault-show",
9510
+ "path": ["vault", "show"],
9511
+ "display": "/pan vault show",
9512
+ "description": "Print a saved conversation read-only with its versions",
8849
9513
  "args": [{
8850
- "name": "text",
8851
- "required": false,
9514
+ "name": "id",
9515
+ "required": true,
8852
9516
  "variadic": false
8853
9517
  }],
8854
9518
  "options": [{
8855
- "flags": "--status",
8856
- "description": "Use the status voice instead of the system (priority) voice",
9519
+ "flags": "--json",
9520
+ "description": "Output in JSON format",
8857
9521
  "required": false,
8858
9522
  "valueHint": null
8859
9523
  }],
8860
9524
  "aliases": [],
8861
- "category": "Core"
8862
- },
8863
- {
8864
- "id": "pan-release",
8865
- "path": ["release"],
8866
- "display": "/pan release",
8867
- "description": "Intentional release flow for stable and canary publishes",
8868
- "args": [],
8869
- "options": [],
8870
- "aliases": [],
8871
- "category": "Flywheel"
9525
+ "category": "CLI"
8872
9526
  },
8873
9527
  {
8874
- "id": "pan-release-check",
8875
- "path": ["release", "check"],
8876
- "display": "/pan release check",
8877
- "description": "Run release preflight checks",
8878
- "args": [],
8879
- "options": [],
8880
- "aliases": [],
8881
- "category": "Flywheel"
8882
- },
8883
- {
8884
- "id": "pan-release-stable",
8885
- "path": ["release", "stable"],
8886
- "display": "/pan release stable",
8887
- "description": "Create a stable release commit and tag",
8888
- "args": [],
8889
- "options": [{
8890
- "flags": "--version <version>",
8891
- "description": "Stable semver version (x.y.z)",
9528
+ "id": "pan-vault-resume",
9529
+ "path": ["vault", "resume"],
9530
+ "display": "/pan vault resume",
9531
+ "description": "Continue a saved conversation here: <id> or <id>@<version>; adopts it and launches the harness",
9532
+ "args": [{
9533
+ "name": "id",
8892
9534
  "required": true,
8893
- "valueHint": "version"
8894
- }, {
8895
- "flags": "--skip-tests",
8896
- "description": "Skip the test suite in preflight (build + guards still run)",
8897
- "required": false,
8898
- "valueHint": null
9535
+ "variadic": false
8899
9536
  }],
9537
+ "options": [
9538
+ {
9539
+ "flags": "--cwd <dir>",
9540
+ "description": "Working directory to resume in (default: the saved cwd)",
9541
+ "required": true,
9542
+ "valueHint": "dir"
9543
+ },
9544
+ {
9545
+ "flags": "--no-launch",
9546
+ "description": "Print the launch command instead of running it",
9547
+ "required": false,
9548
+ "valueHint": null
9549
+ },
9550
+ {
9551
+ "flags": "--on-drift <choice>",
9552
+ "description": "When the cwd state differs from the saved state: continue | note | cancel",
9553
+ "required": true,
9554
+ "valueHint": "choice"
9555
+ },
9556
+ {
9557
+ "flags": "--no-code",
9558
+ "description": "Do not apply the saved code snapshot; only continue the conversation",
9559
+ "required": false,
9560
+ "valueHint": null
9561
+ },
9562
+ {
9563
+ "flags": "--worktree <dir>",
9564
+ "description": "Apply the code snapshot into a new git worktree at <dir> instead of the target checkout",
9565
+ "required": true,
9566
+ "valueHint": "dir"
9567
+ }
9568
+ ],
8900
9569
  "aliases": [],
8901
- "category": "Flywheel"
9570
+ "category": "CLI"
8902
9571
  },
8903
9572
  {
8904
- "id": "pan-release-canary",
8905
- "path": ["release", "canary"],
8906
- "display": "/pan release canary",
8907
- "description": "Create a canary release commit and tag",
8908
- "args": [],
9573
+ "id": "pan-vault-exclude",
9574
+ "path": ["vault", "exclude"],
9575
+ "display": "/pan vault exclude",
9576
+ "description": "Exclude conversations by cwd path, git origin or session id; an excluded saved record becomes a tombstone",
9577
+ "args": [{
9578
+ "name": "path",
9579
+ "required": false,
9580
+ "variadic": false
9581
+ }],
8909
9582
  "options": [{
8910
- "flags": "--version <version>",
8911
- "description": "Canary semver version (x.y.z-canary.n)",
9583
+ "flags": "--origin <url>",
9584
+ "description": "Exclude conversations whose git origin is this URL",
8912
9585
  "required": true,
8913
- "valueHint": "version"
9586
+ "valueHint": "url"
8914
9587
  }, {
8915
- "flags": "--skip-tests",
8916
- "description": "Skip the test suite in preflight (build + guards still run)",
8917
- "required": false,
8918
- "valueHint": null
9588
+ "flags": "--session <id>",
9589
+ "description": "Exclude one session by native session id or vault id",
9590
+ "required": true,
9591
+ "valueHint": "id"
8919
9592
  }],
8920
9593
  "aliases": [],
8921
- "category": "Flywheel"
9594
+ "category": "CLI"
8922
9595
  },
8923
9596
  {
8924
- "id": "pan-release-sourcemaps",
8925
- "path": ["release", "sourcemaps"],
8926
- "display": "/pan release sourcemaps",
8927
- "description": "Upload the built dashboard sourcemaps to PostHog",
8928
- "args": [],
9597
+ "id": "pan-vault-include",
9598
+ "path": ["vault", "include"],
9599
+ "display": "/pan vault include",
9600
+ "description": "Remove an exclusion added with pan vault exclude",
9601
+ "args": [{
9602
+ "name": "path",
9603
+ "required": false,
9604
+ "variadic": false
9605
+ }],
8929
9606
  "options": [{
8930
- "flags": "--version <version>",
8931
- "description": "Release version associated with the built dashboard",
9607
+ "flags": "--origin <url>",
9608
+ "description": "Include conversations whose git origin is this URL again",
8932
9609
  "required": true,
8933
- "valueHint": "version"
9610
+ "valueHint": "url"
9611
+ }, {
9612
+ "flags": "--session <id>",
9613
+ "description": "Include one session again",
9614
+ "required": true,
9615
+ "valueHint": "id"
8934
9616
  }],
8935
9617
  "aliases": [],
8936
- "category": "Flywheel"
9618
+ "category": "CLI"
8937
9619
  },
8938
9620
  {
8939
- "id": "pan-release-notes",
8940
- "path": ["release", "notes"],
8941
- "display": "/pan release notes",
8942
- "description": "Draft release notes from git history",
9621
+ "id": "pan-vault-allow-secret",
9622
+ "path": ["vault", "allow-secret"],
9623
+ "display": "/pan vault allow-secret",
9624
+ "description": "Allow one blocked transcript line, or the blocked code lines of one file, for that record only",
8943
9625
  "args": [{
8944
- "name": "from",
8945
- "required": false,
9626
+ "name": "id-or-path",
9627
+ "required": true,
8946
9628
  "variadic": false
8947
9629
  }, {
8948
- "name": "to",
9630
+ "name": "line",
8949
9631
  "required": false,
8950
9632
  "variadic": false
8951
9633
  }],
8952
9634
  "options": [{
8953
- "flags": "--write <path>",
8954
- "description": "Write the generated notes to a file",
9635
+ "flags": "--file <path>",
9636
+ "description": "Allow the blocked lines of this file in the code snapshot (path relative to the repository root)",
8955
9637
  "required": true,
8956
9638
  "valueHint": "path"
8957
9639
  }],
8958
9640
  "aliases": [],
8959
- "category": "Flywheel"
9641
+ "category": "CLI"
8960
9642
  },
8961
9643
  {
8962
- "id": "pan-rollout",
8963
- "path": ["rollout"],
8964
- "display": "/pan rollout",
8965
- "description": "Post-merge release status and retry",
9644
+ "id": "pan-vault-evict",
9645
+ "path": ["vault", "evict"],
9646
+ "display": "/pan vault evict",
9647
+ "description": "Review the pending-deletion batch (default) or act on it; nothing is deleted without --confirm",
8966
9648
  "args": [],
8967
- "options": [],
9649
+ "options": [
9650
+ {
9651
+ "flags": "--review",
9652
+ "description": "Scan and print the batch with its fingerprint (default)",
9653
+ "required": false,
9654
+ "valueHint": null
9655
+ },
9656
+ {
9657
+ "flags": "--confirm <fingerprint>",
9658
+ "description": "Delete the reviewed files if the batch still matches this fingerprint",
9659
+ "required": true,
9660
+ "valueHint": "fingerprint"
9661
+ },
9662
+ {
9663
+ "flags": "--decline <vaultId>",
9664
+ "description": "Remove an entry from the batch and do not offer it again",
9665
+ "required": true,
9666
+ "valueHint": "vaultId"
9667
+ },
9668
+ {
9669
+ "flags": "--reoffer <vaultId>",
9670
+ "description": "Allow a declined entry to be offered again",
9671
+ "required": true,
9672
+ "valueHint": "vaultId"
9673
+ },
9674
+ {
9675
+ "flags": "--clear",
9676
+ "description": "Empty the batch without deleting or declining anything",
9677
+ "required": false,
9678
+ "valueHint": null
9679
+ }
9680
+ ],
8968
9681
  "aliases": [],
8969
- "category": "Flywheel"
9682
+ "category": "CLI"
8970
9683
  },
8971
9684
  {
8972
- "id": "pan-rollout-status",
8973
- "path": ["rollout", "status"],
8974
- "display": "/pan rollout status",
8975
- "description": "Print the release set for an issue (overall + per-component status)",
9685
+ "id": "pan-vault-restore",
9686
+ "path": ["vault", "restore"],
9687
+ "display": "/pan vault restore",
9688
+ "description": "Rebuild an evicted transcript byte for byte at its original path",
8976
9689
  "args": [{
8977
- "name": "issueId",
9690
+ "name": "id",
8978
9691
  "required": true,
8979
9692
  "variadic": false
8980
9693
  }],
8981
- "options": [],
8982
- "aliases": [],
8983
- "category": "Flywheel"
8984
- },
8985
- {
8986
- "id": "pan-rollout-retry",
8987
- "path": ["rollout", "retry"],
8988
- "display": "/pan rollout retry",
8989
- "description": "Re-run the release engine for an issue and print the resulting status",
8990
- "args": [{
8991
- "name": "issueId",
9694
+ "options": [{
9695
+ "flags": "--to <path>",
9696
+ "description": "Write the rebuilt file here instead of the recorded path",
8992
9697
  "required": true,
8993
- "variadic": false
9698
+ "valueHint": "path"
8994
9699
  }],
8995
- "options": [],
8996
9700
  "aliases": [],
8997
- "category": "Flywheel"
9701
+ "category": "CLI"
8998
9702
  },
8999
9703
  {
9000
- "id": "pan-memory",
9001
- "path": ["memory"],
9002
- "display": "/pan memory",
9003
- "description": "Search and inspect Overdeck memory",
9704
+ "id": "pan-test",
9705
+ "path": ["test"],
9706
+ "display": "/pan test",
9707
+ "description": "Test running and management",
9004
9708
  "args": [],
9005
9709
  "options": [],
9006
9710
  "aliases": [],
9007
- "category": "Observation"
9711
+ "category": "Core"
9008
9712
  },
9009
9713
  {
9010
- "id": "pan-memory-search",
9011
- "path": ["memory", "search"],
9012
- "display": "/pan memory search",
9013
- "description": "Search memory observations",
9714
+ "id": "pan-test-run",
9715
+ "path": ["test", "run"],
9716
+ "display": "/pan test run",
9717
+ "description": "Run tests for a project or workspace",
9014
9718
  "args": [{
9015
- "name": "query",
9016
- "required": true,
9719
+ "name": "target",
9720
+ "required": false,
9017
9721
  "variadic": false
9018
9722
  }],
9019
9723
  "options": [
9020
9724
  {
9021
- "flags": "--project <id>",
9022
- "description": "Project ID",
9023
- "required": true,
9024
- "valueHint": "id"
9025
- },
9026
- {
9027
- "flags": "--workspace <id|name>",
9028
- "description": "Workspace id or name",
9029
- "required": true,
9030
- "valueHint": "id|name"
9031
- },
9032
- {
9033
- "flags": "--issue <id>",
9034
- "description": "Issue ID",
9035
- "required": true,
9036
- "valueHint": "id"
9037
- },
9038
- {
9039
- "flags": "--tag <tag>",
9040
- "description": "Filter by tag",
9725
+ "flags": "--project <name>",
9726
+ "description": "Project name from registry",
9041
9727
  "required": true,
9042
- "valueHint": "tag"
9043
- },
9044
- {
9045
- "flags": "--sibling",
9046
- "description": "Search same-project sibling issues instead of the selected issue",
9047
- "required": false,
9048
- "valueHint": null
9049
- },
9050
- {
9051
- "flags": "--global",
9052
- "description": "Search across all registered projects instead of just one",
9053
- "required": false,
9054
- "valueHint": null
9055
- },
9056
- {
9057
- "flags": "--target [path]",
9058
- "description": "Search all workspaces whose path targets a directory (bare flag = cwd); mutually exclusive with --workspace/--issue/--global",
9059
- "required": false,
9060
- "valueHint": "path"
9061
- },
9062
- {
9063
- "flags": "--include-archived",
9064
- "description": "Include observations hidden by reset markers",
9065
- "required": false,
9066
- "valueHint": null
9728
+ "valueHint": "name"
9067
9729
  },
9068
9730
  {
9069
- "flags": "--limit <n>",
9070
- "description": "Maximum results",
9731
+ "flags": "--tests <names>",
9732
+ "description": "Comma-separated test names to run",
9071
9733
  "required": true,
9072
- "valueHint": "n"
9734
+ "valueHint": "names"
9073
9735
  },
9074
9736
  {
9075
- "flags": "--json",
9076
- "description": "Output JSON",
9737
+ "flags": "--no-notify",
9738
+ "description": "Skip desktop notification",
9077
9739
  "required": false,
9078
9740
  "valueHint": null
9079
9741
  }
9080
9742
  ],
9081
9743
  "aliases": [],
9082
- "category": "Observation"
9744
+ "category": "Core"
9083
9745
  },
9084
9746
  {
9085
- "id": "pan-memory-status",
9086
- "path": ["memory", "status"],
9087
- "display": "/pan memory status",
9088
- "description": "Show current memory status for an issue, a workspace, or the current directory",
9747
+ "id": "pan-test-list",
9748
+ "path": ["test", "list"],
9749
+ "display": "/pan test list",
9750
+ "description": "List configured tests for a project",
9089
9751
  "args": [{
9090
- "name": "issue",
9752
+ "name": "project",
9091
9753
  "required": false,
9092
9754
  "variadic": false
9093
9755
  }],
9094
- "options": [
9095
- {
9096
- "flags": "--project <id>",
9097
- "description": "Project ID",
9098
- "required": true,
9099
- "valueHint": "id"
9100
- },
9101
- {
9102
- "flags": "--workspace <id|name>",
9103
- "description": "Workspace id or name instead of an issue positional",
9104
- "required": true,
9105
- "valueHint": "id|name"
9106
- },
9756
+ "options": [],
9757
+ "aliases": [],
9758
+ "category": "Core"
9759
+ },
9760
+ {
9761
+ "id": "pan-tts",
9762
+ "path": ["tts"],
9763
+ "display": "/pan tts",
9764
+ "description": "Local TTS daemon helpers",
9765
+ "args": [],
9766
+ "options": [],
9767
+ "aliases": [],
9768
+ "category": "Core"
9769
+ },
9770
+ {
9771
+ "id": "pan-tts-voices",
9772
+ "path": ["tts", "voices"],
9773
+ "display": "/pan tts voices",
9774
+ "description": "List and inspect saved TTS voices",
9775
+ "args": [],
9776
+ "options": [],
9777
+ "aliases": [],
9778
+ "category": "Core"
9779
+ },
9780
+ {
9781
+ "id": "pan-tts-voices-list",
9782
+ "path": [
9783
+ "tts",
9784
+ "voices",
9785
+ "list"
9786
+ ],
9787
+ "display": "/pan tts voices list",
9788
+ "description": "List saved TTS voices",
9789
+ "args": [],
9790
+ "options": [],
9791
+ "aliases": [],
9792
+ "category": "Core"
9793
+ },
9794
+ {
9795
+ "id": "pan-tts-voices-show",
9796
+ "path": [
9797
+ "tts",
9798
+ "voices",
9799
+ "show"
9800
+ ],
9801
+ "display": "/pan tts voices show",
9802
+ "description": "Show saved TTS voice details",
9803
+ "args": [{
9804
+ "name": "name",
9805
+ "required": true,
9806
+ "variadic": false
9807
+ }],
9808
+ "options": [],
9809
+ "aliases": [],
9810
+ "category": "Core"
9811
+ },
9812
+ {
9813
+ "id": "pan-tts-voices-play",
9814
+ "path": [
9815
+ "tts",
9816
+ "voices",
9817
+ "play"
9818
+ ],
9819
+ "display": "/pan tts voices play",
9820
+ "description": "Speak with a saved TTS voice",
9821
+ "args": [{
9822
+ "name": "name",
9823
+ "required": true,
9824
+ "variadic": false
9825
+ }, {
9826
+ "name": "text",
9827
+ "required": false,
9828
+ "variadic": false
9829
+ }],
9830
+ "options": [],
9831
+ "aliases": [],
9832
+ "category": "Core"
9833
+ },
9834
+ {
9835
+ "id": "pan-tts-voices-delete",
9836
+ "path": [
9837
+ "tts",
9838
+ "voices",
9839
+ "delete"
9840
+ ],
9841
+ "display": "/pan tts voices delete",
9842
+ "description": "Delete a saved TTS voice",
9843
+ "args": [{
9844
+ "name": "name",
9845
+ "required": true,
9846
+ "variadic": false
9847
+ }],
9848
+ "options": [],
9849
+ "aliases": [],
9850
+ "category": "Core"
9851
+ },
9852
+ {
9853
+ "id": "pan-tts-voices-set-default",
9854
+ "path": [
9855
+ "tts",
9856
+ "voices",
9857
+ "set-default"
9858
+ ],
9859
+ "display": "/pan tts voices set-default",
9860
+ "description": "Set the system TTS voice",
9861
+ "args": [{
9862
+ "name": "name",
9863
+ "required": true,
9864
+ "variadic": false
9865
+ }],
9866
+ "options": [],
9867
+ "aliases": [],
9868
+ "category": "Core"
9869
+ },
9870
+ {
9871
+ "id": "pan-tts-voices-map",
9872
+ "path": [
9873
+ "tts",
9874
+ "voices",
9875
+ "map"
9876
+ ],
9877
+ "display": "/pan tts voices map",
9878
+ "description": "Map a TTS event key to a saved voice",
9879
+ "args": [{
9880
+ "name": "event",
9881
+ "required": true,
9882
+ "variadic": false
9883
+ }, {
9884
+ "name": "name",
9885
+ "required": true,
9886
+ "variadic": false
9887
+ }],
9888
+ "options": [],
9889
+ "aliases": [],
9890
+ "category": "Core"
9891
+ },
9892
+ {
9893
+ "id": "pan-tts-start",
9894
+ "path": ["tts", "start"],
9895
+ "display": "/pan tts start",
9896
+ "description": "Start the local Qwen TTS daemon",
9897
+ "args": [],
9898
+ "options": [
9899
+ {
9900
+ "flags": "--detach",
9901
+ "description": "Run the daemon detached in the background",
9902
+ "required": false,
9903
+ "valueHint": null
9904
+ },
9905
+ {
9906
+ "flags": "--foreground",
9907
+ "description": "Run the daemon in the foreground",
9908
+ "required": false,
9909
+ "valueHint": null
9910
+ },
9911
+ {
9912
+ "flags": "--no-wait-for-health",
9913
+ "description": "Return without waiting for /health",
9914
+ "required": false,
9915
+ "valueHint": null
9916
+ },
9917
+ {
9918
+ "flags": "--timeout-ms <ms>",
9919
+ "description": "Health wait timeout in milliseconds",
9920
+ "required": true,
9921
+ "valueHint": "ms"
9922
+ }
9923
+ ],
9924
+ "aliases": [],
9925
+ "category": "Core"
9926
+ },
9927
+ {
9928
+ "id": "pan-tts-stop",
9929
+ "path": ["tts", "stop"],
9930
+ "display": "/pan tts stop",
9931
+ "description": "Stop the local Qwen TTS daemon",
9932
+ "args": [],
9933
+ "options": [],
9934
+ "aliases": [],
9935
+ "category": "Core"
9936
+ },
9937
+ {
9938
+ "id": "pan-tts-status",
9939
+ "path": ["tts", "status"],
9940
+ "display": "/pan tts status",
9941
+ "description": "Show local Qwen TTS daemon status",
9942
+ "args": [],
9943
+ "options": [],
9944
+ "aliases": [],
9945
+ "category": "Core"
9946
+ },
9947
+ {
9948
+ "id": "pan-tts-restart",
9949
+ "path": ["tts", "restart"],
9950
+ "display": "/pan tts restart",
9951
+ "description": "Restart the local Qwen TTS daemon",
9952
+ "args": [],
9953
+ "options": [{
9954
+ "flags": "--no-wait-for-health",
9955
+ "description": "Return without waiting for /health",
9956
+ "required": false,
9957
+ "valueHint": null
9958
+ }, {
9959
+ "flags": "--timeout-ms <ms>",
9960
+ "description": "Health wait timeout in milliseconds",
9961
+ "required": true,
9962
+ "valueHint": "ms"
9963
+ }],
9964
+ "aliases": [],
9965
+ "category": "Core"
9966
+ },
9967
+ {
9968
+ "id": "pan-tts-install-systemd",
9969
+ "path": ["tts", "install-systemd"],
9970
+ "display": "/pan tts install-systemd",
9971
+ "description": "Install a user systemd unit for the local Qwen TTS daemon",
9972
+ "args": [],
9973
+ "options": [],
9974
+ "aliases": [],
9975
+ "category": "Core"
9976
+ },
9977
+ {
9978
+ "id": "pan-tts-test",
9979
+ "path": ["tts", "test"],
9980
+ "display": "/pan tts test",
9981
+ "description": "Speak a test phrase using the configured system (priority) voice",
9982
+ "args": [{
9983
+ "name": "text",
9984
+ "required": false,
9985
+ "variadic": false
9986
+ }],
9987
+ "options": [{
9988
+ "flags": "--status",
9989
+ "description": "Use the status voice instead of the system (priority) voice",
9990
+ "required": false,
9991
+ "valueHint": null
9992
+ }],
9993
+ "aliases": [],
9994
+ "category": "Core"
9995
+ },
9996
+ {
9997
+ "id": "pan-release",
9998
+ "path": ["release"],
9999
+ "display": "/pan release",
10000
+ "description": "Intentional release flow for stable and canary publishes",
10001
+ "args": [],
10002
+ "options": [],
10003
+ "aliases": [],
10004
+ "category": "Flywheel"
10005
+ },
10006
+ {
10007
+ "id": "pan-release-check",
10008
+ "path": ["release", "check"],
10009
+ "display": "/pan release check",
10010
+ "description": "Run release preflight checks",
10011
+ "args": [],
10012
+ "options": [],
10013
+ "aliases": [],
10014
+ "category": "Flywheel"
10015
+ },
10016
+ {
10017
+ "id": "pan-release-stable",
10018
+ "path": ["release", "stable"],
10019
+ "display": "/pan release stable",
10020
+ "description": "Create a stable release commit and tag",
10021
+ "args": [],
10022
+ "options": [{
10023
+ "flags": "--version <version>",
10024
+ "description": "Stable semver version (x.y.z)",
10025
+ "required": true,
10026
+ "valueHint": "version"
10027
+ }, {
10028
+ "flags": "--skip-tests",
10029
+ "description": "Skip the test suite in preflight (build + guards still run)",
10030
+ "required": false,
10031
+ "valueHint": null
10032
+ }],
10033
+ "aliases": [],
10034
+ "category": "Flywheel"
10035
+ },
10036
+ {
10037
+ "id": "pan-release-canary",
10038
+ "path": ["release", "canary"],
10039
+ "display": "/pan release canary",
10040
+ "description": "Create a canary release commit and tag",
10041
+ "args": [],
10042
+ "options": [{
10043
+ "flags": "--version <version>",
10044
+ "description": "Canary semver version (x.y.z-canary.n)",
10045
+ "required": true,
10046
+ "valueHint": "version"
10047
+ }, {
10048
+ "flags": "--skip-tests",
10049
+ "description": "Skip the test suite in preflight (build + guards still run)",
10050
+ "required": false,
10051
+ "valueHint": null
10052
+ }],
10053
+ "aliases": [],
10054
+ "category": "Flywheel"
10055
+ },
10056
+ {
10057
+ "id": "pan-release-sourcemaps",
10058
+ "path": ["release", "sourcemaps"],
10059
+ "display": "/pan release sourcemaps",
10060
+ "description": "Upload the built dashboard sourcemaps to PostHog",
10061
+ "args": [],
10062
+ "options": [{
10063
+ "flags": "--version <version>",
10064
+ "description": "Release version associated with the built dashboard",
10065
+ "required": true,
10066
+ "valueHint": "version"
10067
+ }],
10068
+ "aliases": [],
10069
+ "category": "Flywheel"
10070
+ },
10071
+ {
10072
+ "id": "pan-release-notes",
10073
+ "path": ["release", "notes"],
10074
+ "display": "/pan release notes",
10075
+ "description": "Draft release notes from git history",
10076
+ "args": [{
10077
+ "name": "from",
10078
+ "required": false,
10079
+ "variadic": false
10080
+ }, {
10081
+ "name": "to",
10082
+ "required": false,
10083
+ "variadic": false
10084
+ }],
10085
+ "options": [{
10086
+ "flags": "--write <path>",
10087
+ "description": "Write the generated notes to a file",
10088
+ "required": true,
10089
+ "valueHint": "path"
10090
+ }],
10091
+ "aliases": [],
10092
+ "category": "Flywheel"
10093
+ },
10094
+ {
10095
+ "id": "pan-rollout",
10096
+ "path": ["rollout"],
10097
+ "display": "/pan rollout",
10098
+ "description": "Post-merge release status and retry",
10099
+ "args": [],
10100
+ "options": [],
10101
+ "aliases": [],
10102
+ "category": "Flywheel"
10103
+ },
10104
+ {
10105
+ "id": "pan-rollout-status",
10106
+ "path": ["rollout", "status"],
10107
+ "display": "/pan rollout status",
10108
+ "description": "Print the release set for an issue (overall + per-component status)",
10109
+ "args": [{
10110
+ "name": "issueId",
10111
+ "required": true,
10112
+ "variadic": false
10113
+ }],
10114
+ "options": [],
10115
+ "aliases": [],
10116
+ "category": "Flywheel"
10117
+ },
10118
+ {
10119
+ "id": "pan-rollout-retry",
10120
+ "path": ["rollout", "retry"],
10121
+ "display": "/pan rollout retry",
10122
+ "description": "Re-run the release engine for an issue and print the resulting status",
10123
+ "args": [{
10124
+ "name": "issueId",
10125
+ "required": true,
10126
+ "variadic": false
10127
+ }],
10128
+ "options": [],
10129
+ "aliases": [],
10130
+ "category": "Flywheel"
10131
+ },
10132
+ {
10133
+ "id": "pan-memory",
10134
+ "path": ["memory"],
10135
+ "display": "/pan memory",
10136
+ "description": "Search and inspect Overdeck memory",
10137
+ "args": [],
10138
+ "options": [],
10139
+ "aliases": [],
10140
+ "category": "Observation"
10141
+ },
10142
+ {
10143
+ "id": "pan-memory-search",
10144
+ "path": ["memory", "search"],
10145
+ "display": "/pan memory search",
10146
+ "description": "Search memory observations",
10147
+ "args": [{
10148
+ "name": "query",
10149
+ "required": true,
10150
+ "variadic": false
10151
+ }],
10152
+ "options": [
10153
+ {
10154
+ "flags": "--project <id>",
10155
+ "description": "Project ID",
10156
+ "required": true,
10157
+ "valueHint": "id"
10158
+ },
10159
+ {
10160
+ "flags": "--workspace <id|name>",
10161
+ "description": "Workspace id or name",
10162
+ "required": true,
10163
+ "valueHint": "id|name"
10164
+ },
10165
+ {
10166
+ "flags": "--issue <id>",
10167
+ "description": "Issue ID",
10168
+ "required": true,
10169
+ "valueHint": "id"
10170
+ },
10171
+ {
10172
+ "flags": "--tag <tag>",
10173
+ "description": "Filter by tag",
10174
+ "required": true,
10175
+ "valueHint": "tag"
10176
+ },
10177
+ {
10178
+ "flags": "--sibling",
10179
+ "description": "Search same-project sibling issues instead of the selected issue",
10180
+ "required": false,
10181
+ "valueHint": null
10182
+ },
10183
+ {
10184
+ "flags": "--global",
10185
+ "description": "Search across all registered projects instead of just one",
10186
+ "required": false,
10187
+ "valueHint": null
10188
+ },
10189
+ {
10190
+ "flags": "--target [path]",
10191
+ "description": "Search all workspaces whose path targets a directory (bare flag = cwd); mutually exclusive with --workspace/--issue/--global",
10192
+ "required": false,
10193
+ "valueHint": "path"
10194
+ },
10195
+ {
10196
+ "flags": "--include-archived",
10197
+ "description": "Include observations hidden by reset markers",
10198
+ "required": false,
10199
+ "valueHint": null
10200
+ },
10201
+ {
10202
+ "flags": "--limit <n>",
10203
+ "description": "Maximum results",
10204
+ "required": true,
10205
+ "valueHint": "n"
10206
+ },
10207
+ {
10208
+ "flags": "--json",
10209
+ "description": "Output JSON",
10210
+ "required": false,
10211
+ "valueHint": null
10212
+ }
10213
+ ],
10214
+ "aliases": [],
10215
+ "category": "Observation"
10216
+ },
10217
+ {
10218
+ "id": "pan-memory-status",
10219
+ "path": ["memory", "status"],
10220
+ "display": "/pan memory status",
10221
+ "description": "Show current memory status for an issue, a workspace, or the current directory",
10222
+ "args": [{
10223
+ "name": "issue",
10224
+ "required": false,
10225
+ "variadic": false
10226
+ }],
10227
+ "options": [
10228
+ {
10229
+ "flags": "--project <id>",
10230
+ "description": "Project ID",
10231
+ "required": true,
10232
+ "valueHint": "id"
10233
+ },
10234
+ {
10235
+ "flags": "--workspace <id|name>",
10236
+ "description": "Workspace id or name instead of an issue positional",
10237
+ "required": true,
10238
+ "valueHint": "id|name"
10239
+ },
9107
10240
  {
9108
10241
  "flags": "--history <n>",
9109
10242
  "description": "Also print up to N archived statuses, newest first (max 50)",
@@ -10654,6 +11787,20 @@ const COMPOSER_COMMAND_MANIFEST = [
10654
11787
  "aliases": [],
10655
11788
  "category": "Admin"
10656
11789
  },
11790
+ {
11791
+ "id": "pan-admin-config-tiers",
11792
+ "path": [
11793
+ "admin",
11794
+ "config",
11795
+ "tiers"
11796
+ ],
11797
+ "display": "/pan admin config tiers",
11798
+ "description": "Show the effective model per tiered_execution tier and whether it overrides roles.work",
11799
+ "args": [],
11800
+ "options": [],
11801
+ "aliases": [],
11802
+ "category": "Admin"
11803
+ },
10657
11804
  {
10658
11805
  "id": "pan-admin-hooks",
10659
11806
  "path": ["admin", "hooks"],
@@ -11527,6 +12674,12 @@ const COMPOSER_COMMAND_MANIFEST = [
11527
12674
  "description": "Skip Herdr terminal backend install/verify (tmux-only hosts)",
11528
12675
  "required": false,
11529
12676
  "valueHint": null
12677
+ },
12678
+ {
12679
+ "flags": "--skip-ollama",
12680
+ "description": "Skip Ollama local-model detection and optional gemma4:12b pull",
12681
+ "required": false,
12682
+ "valueHint": null
11530
12683
  }
11531
12684
  ],
11532
12685
  "aliases": [],
@@ -11607,141 +12760,427 @@ const COMPOSER_COMMAND_MANIFEST = [
11607
12760
  "valueHint": "path"
11608
12761
  }],
11609
12762
  "aliases": [],
11610
- "category": "Lifecycle"
12763
+ "category": "Lifecycle"
12764
+ },
12765
+ {
12766
+ "id": "pan-scope-approve",
12767
+ "path": ["scope", "approve"],
12768
+ "display": "/pan scope approve",
12769
+ "description": "Move xBRIEF to active/ and set status approved",
12770
+ "args": [{
12771
+ "name": "issueId",
12772
+ "required": true,
12773
+ "variadic": false
12774
+ }],
12775
+ "options": [{
12776
+ "flags": "--project <path>",
12777
+ "description": "Project path (defaults to resolved from issue)",
12778
+ "required": true,
12779
+ "valueHint": "path"
12780
+ }],
12781
+ "aliases": [],
12782
+ "category": "Lifecycle"
12783
+ },
12784
+ {
12785
+ "id": "pan-scope-complete",
12786
+ "path": ["scope", "complete"],
12787
+ "display": "/pan scope complete",
12788
+ "description": "Move xBRIEF to completed/",
12789
+ "args": [{
12790
+ "name": "issueId",
12791
+ "required": true,
12792
+ "variadic": false
12793
+ }],
12794
+ "options": [{
12795
+ "flags": "--project <path>",
12796
+ "description": "Project path (defaults to resolved from issue)",
12797
+ "required": true,
12798
+ "valueHint": "path"
12799
+ }],
12800
+ "aliases": [],
12801
+ "category": "Lifecycle"
12802
+ },
12803
+ {
12804
+ "id": "pan-scope-cancel",
12805
+ "path": ["scope", "cancel"],
12806
+ "display": "/pan scope cancel",
12807
+ "description": "Move xBRIEF to cancelled/",
12808
+ "args": [{
12809
+ "name": "issueId",
12810
+ "required": true,
12811
+ "variadic": false
12812
+ }],
12813
+ "options": [{
12814
+ "flags": "--project <path>",
12815
+ "description": "Project path (defaults to resolved from issue)",
12816
+ "required": true,
12817
+ "valueHint": "path"
12818
+ }],
12819
+ "aliases": [],
12820
+ "category": "Lifecycle"
12821
+ },
12822
+ {
12823
+ "id": "pan-scope-restore",
12824
+ "path": ["scope", "restore"],
12825
+ "display": "/pan scope restore",
12826
+ "description": "Restore xBRIEF from completed/ or cancelled/ to active/",
12827
+ "args": [{
12828
+ "name": "issueId",
12829
+ "required": true,
12830
+ "variadic": false
12831
+ }],
12832
+ "options": [{
12833
+ "flags": "--project <path>",
12834
+ "description": "Project path (defaults to resolved from issue)",
12835
+ "required": true,
12836
+ "valueHint": "path"
12837
+ }],
12838
+ "aliases": [],
12839
+ "category": "Lifecycle"
12840
+ },
12841
+ {
12842
+ "id": "pan-spawn",
12843
+ "path": ["spawn"],
12844
+ "display": "/pan spawn",
12845
+ "description": "Create a worker pane for one xBRIEF item in its own item worktree",
12846
+ "args": [],
12847
+ "options": [
12848
+ {
12849
+ "flags": "--issue <id>",
12850
+ "description": "Issue the worker belongs to",
12851
+ "required": true,
12852
+ "valueHint": "id"
12853
+ },
12854
+ {
12855
+ "flags": "--item <item>",
12856
+ "description": "xBRIEF item the worker takes",
12857
+ "required": true,
12858
+ "valueHint": "item"
12859
+ },
12860
+ {
12861
+ "flags": "--model <model>",
12862
+ "description": "Model the worker runs on",
12863
+ "required": true,
12864
+ "valueHint": "model"
12865
+ },
12866
+ {
12867
+ "flags": "--harness <harness>",
12868
+ "description": "Coding-agent harness (default: claude-code)",
12869
+ "required": true,
12870
+ "valueHint": "harness"
12871
+ },
12872
+ {
12873
+ "flags": "--shared",
12874
+ "description": "Run the worker in the issue workspace instead of an item worktree (foreman/operator only; serial use)",
12875
+ "required": false,
12876
+ "valueHint": null
12877
+ }
12878
+ ],
12879
+ "aliases": [],
12880
+ "category": "CLI"
12881
+ },
12882
+ {
12883
+ "id": "pan-worker",
12884
+ "path": ["worker"],
12885
+ "display": "/pan worker",
12886
+ "description": "Registered workers: spawn an issue-linked agent and get its report back; register external agents",
12887
+ "args": [],
12888
+ "options": [],
12889
+ "aliases": [],
12890
+ "category": "CLI"
12891
+ },
12892
+ {
12893
+ "id": "pan-worker-run",
12894
+ "path": ["worker", "run"],
12895
+ "display": "/pan worker run",
12896
+ "description": "Start a worker for an issue and wait for its report (exit 0 done, 4 blocked/failed, 2 no report, 3 timeout, 1 error)",
12897
+ "args": [],
12898
+ "options": [
12899
+ {
12900
+ "flags": "--issue <id>",
12901
+ "description": "Issue the worker belongs to (required)",
12902
+ "required": true,
12903
+ "valueHint": "id"
12904
+ },
12905
+ {
12906
+ "flags": "--prompt <text>",
12907
+ "description": "The brief, inline",
12908
+ "required": true,
12909
+ "valueHint": "text"
12910
+ },
12911
+ {
12912
+ "flags": "--brief <file>",
12913
+ "description": "The brief, from a file",
12914
+ "required": true,
12915
+ "valueHint": "file"
12916
+ },
12917
+ {
12918
+ "flags": "--model <model>",
12919
+ "description": "Model override (default: roles.worker.model)",
12920
+ "required": true,
12921
+ "valueHint": "model"
12922
+ },
12923
+ {
12924
+ "flags": "--harness <harness>",
12925
+ "description": "Harness override (default: routed from the model)",
12926
+ "required": true,
12927
+ "valueHint": "harness"
12928
+ },
12929
+ {
12930
+ "flags": "--read-only",
12931
+ "description": "Run in the issue workspace with git writes blocked",
12932
+ "required": false,
12933
+ "valueHint": null
12934
+ },
12935
+ {
12936
+ "flags": "--cwd <path>",
12937
+ "description": "Working directory inside the issue workspace",
12938
+ "required": true,
12939
+ "valueHint": "path"
12940
+ },
12941
+ {
12942
+ "flags": "--parent <id>",
12943
+ "description": "Spawning agent or conversation (default: $OVERDECK_AGENT_ID, then $OVERDECK_CONVERSATION)",
12944
+ "required": true,
12945
+ "valueHint": "id"
12946
+ },
12947
+ {
12948
+ "flags": "--name <label>",
12949
+ "description": "Label shown in the Agents Directory",
12950
+ "required": true,
12951
+ "valueHint": "label"
12952
+ },
12953
+ {
12954
+ "flags": "--detach",
12955
+ "description": "Print the worker id and return without waiting",
12956
+ "required": false,
12957
+ "valueHint": null
12958
+ },
12959
+ {
12960
+ "flags": "--timeout <seconds>",
12961
+ "description": "Stop waiting after this many seconds (exit 3; the worker keeps running)",
12962
+ "required": true,
12963
+ "valueHint": "seconds"
12964
+ },
12965
+ {
12966
+ "flags": "--stop-after-report",
12967
+ "description": "Stop the worker after its first report",
12968
+ "required": false,
12969
+ "valueHint": null
12970
+ }
12971
+ ],
12972
+ "aliases": [],
12973
+ "category": "CLI"
11611
12974
  },
11612
12975
  {
11613
- "id": "pan-scope-approve",
11614
- "path": ["scope", "approve"],
11615
- "display": "/pan scope approve",
11616
- "description": "Move xBRIEF to active/ and set status approved",
12976
+ "id": "pan-worker-wait",
12977
+ "path": ["worker", "wait"],
12978
+ "display": "/pan worker wait",
12979
+ "description": "Wait for a worker's report (same exit codes as run); the status line names its seq",
11617
12980
  "args": [{
11618
- "name": "issueId",
12981
+ "name": "worker-id",
11619
12982
  "required": true,
11620
12983
  "variadic": false
11621
12984
  }],
11622
12985
  "options": [{
11623
- "flags": "--project <path>",
11624
- "description": "Project path (defaults to resolved from issue)",
11625
- "required": true,
11626
- "valueHint": "path"
11627
- }],
11628
- "aliases": [],
11629
- "category": "Lifecycle"
11630
- },
11631
- {
11632
- "id": "pan-scope-complete",
11633
- "path": ["scope", "complete"],
11634
- "display": "/pan scope complete",
11635
- "description": "Move xBRIEF to completed/",
11636
- "args": [{
11637
- "name": "issueId",
12986
+ "flags": "--after <seq>",
12987
+ "description": "Return the next report after this seq (default: the newest report, whenever written)",
11638
12988
  "required": true,
11639
- "variadic": false
11640
- }],
11641
- "options": [{
11642
- "flags": "--project <path>",
11643
- "description": "Project path (defaults to resolved from issue)",
12989
+ "valueHint": "seq"
12990
+ }, {
12991
+ "flags": "--timeout <seconds>",
12992
+ "description": "Stop waiting after this many seconds (exit 3)",
11644
12993
  "required": true,
11645
- "valueHint": "path"
12994
+ "valueHint": "seconds"
11646
12995
  }],
11647
12996
  "aliases": [],
11648
- "category": "Lifecycle"
12997
+ "category": "CLI"
11649
12998
  },
11650
12999
  {
11651
- "id": "pan-scope-cancel",
11652
- "path": ["scope", "cancel"],
11653
- "display": "/pan scope cancel",
11654
- "description": "Move xBRIEF to cancelled/",
13000
+ "id": "pan-worker-report",
13001
+ "path": ["worker", "report"],
13002
+ "display": "/pan worker report",
13003
+ "description": "Record a worker's report (run by the worker itself)",
11655
13004
  "args": [{
11656
- "name": "issueId",
13005
+ "name": "worker-id",
11657
13006
  "required": true,
11658
13007
  "variadic": false
11659
13008
  }],
11660
- "options": [{
11661
- "flags": "--project <path>",
11662
- "description": "Project path (defaults to resolved from issue)",
11663
- "required": true,
11664
- "valueHint": "path"
11665
- }],
13009
+ "options": [
13010
+ {
13011
+ "flags": "--file <path>",
13012
+ "description": "Read the Markdown report from a file",
13013
+ "required": true,
13014
+ "valueHint": "path"
13015
+ },
13016
+ {
13017
+ "flags": "--stdin",
13018
+ "description": "Read the Markdown report from stdin",
13019
+ "required": false,
13020
+ "valueHint": null
13021
+ },
13022
+ {
13023
+ "flags": "--status <status>",
13024
+ "description": "done | blocked | failed (default: done)",
13025
+ "required": true,
13026
+ "valueHint": "status"
13027
+ }
13028
+ ],
11666
13029
  "aliases": [],
11667
- "category": "Lifecycle"
13030
+ "category": "CLI"
11668
13031
  },
11669
13032
  {
11670
- "id": "pan-scope-restore",
11671
- "path": ["scope", "restore"],
11672
- "display": "/pan scope restore",
11673
- "description": "Restore xBRIEF from completed/ or cancelled/ to active/",
11674
- "args": [{
11675
- "name": "issueId",
11676
- "required": true,
11677
- "variadic": false
11678
- }],
11679
- "options": [{
11680
- "flags": "--project <path>",
11681
- "description": "Project path (defaults to resolved from issue)",
11682
- "required": true,
11683
- "valueHint": "path"
11684
- }],
13033
+ "id": "pan-worker-list",
13034
+ "path": ["worker", "list"],
13035
+ "display": "/pan worker list",
13036
+ "description": "List workers with their parent, live state and newest report",
13037
+ "args": [],
13038
+ "options": [
13039
+ {
13040
+ "flags": "--issue <id>",
13041
+ "description": "Only this issue's workers",
13042
+ "required": true,
13043
+ "valueHint": "id"
13044
+ },
13045
+ {
13046
+ "flags": "--parent <id>",
13047
+ "description": "Only workers of this parent",
13048
+ "required": true,
13049
+ "valueHint": "id"
13050
+ },
13051
+ {
13052
+ "flags": "--json",
13053
+ "description": "Print JSON",
13054
+ "required": false,
13055
+ "valueHint": null
13056
+ }
13057
+ ],
11685
13058
  "aliases": [],
11686
- "category": "Lifecycle"
13059
+ "category": "CLI"
11687
13060
  },
11688
13061
  {
11689
- "id": "pan-spawn",
11690
- "path": ["spawn"],
11691
- "display": "/pan spawn",
11692
- "description": "Create a worker pane for one xBRIEF item in the issue workspace",
13062
+ "id": "pan-worker-register",
13063
+ "path": ["worker", "register"],
13064
+ "display": "/pan worker register",
13065
+ "description": "Record an agent another tool launched so the Agents Directory shows it (read-only; prints its id)",
11693
13066
  "args": [],
11694
13067
  "options": [
11695
13068
  {
11696
- "flags": "--issue <id>",
11697
- "description": "Issue the worker belongs to",
13069
+ "flags": "--source <name>",
13070
+ "description": "Who launched it ([a-z0-9-], not codex-plugin) (required)",
13071
+ "required": true,
13072
+ "valueHint": "name"
13073
+ },
13074
+ {
13075
+ "flags": "--external-id <id>",
13076
+ "description": "The launcher's id for it (required)",
11698
13077
  "required": true,
11699
13078
  "valueHint": "id"
11700
13079
  },
11701
13080
  {
11702
- "flags": "--item <item>",
11703
- "description": "xBRIEF item the worker takes",
13081
+ "flags": "--harness <harness>",
13082
+ "description": "codex, claude-code, … (required)",
11704
13083
  "required": true,
11705
- "valueHint": "item"
13084
+ "valueHint": "harness"
11706
13085
  },
11707
13086
  {
11708
13087
  "flags": "--model <model>",
11709
- "description": "Model the worker runs on",
13088
+ "description": "Model it runs",
11710
13089
  "required": true,
11711
13090
  "valueHint": "model"
11712
13091
  },
11713
13092
  {
11714
- "flags": "--harness <harness>",
11715
- "description": "Coding-agent harness (default: claude-code)",
13093
+ "flags": "--cwd <path>",
13094
+ "description": "Its working directory",
11716
13095
  "required": true,
11717
- "valueHint": "harness"
13096
+ "valueHint": "path"
13097
+ },
13098
+ {
13099
+ "flags": "--issue <id>",
13100
+ "description": "Issue it works on",
13101
+ "required": true,
13102
+ "valueHint": "id"
13103
+ },
13104
+ {
13105
+ "flags": "--parent <id>",
13106
+ "description": "Spawning agent id, conversation tmux session, or claude-session:<uuid>",
13107
+ "required": true,
13108
+ "valueHint": "id"
13109
+ },
13110
+ {
13111
+ "flags": "--label <text>",
13112
+ "description": "Label shown in the Agents Directory",
13113
+ "required": true,
13114
+ "valueHint": "text"
13115
+ },
13116
+ {
13117
+ "flags": "--pid <n>",
13118
+ "description": "Its process id (liveness is read from it)",
13119
+ "required": true,
13120
+ "valueHint": "n"
13121
+ },
13122
+ {
13123
+ "flags": "--transcript <path>",
13124
+ "description": "Its transcript file",
13125
+ "required": true,
13126
+ "valueHint": "path"
13127
+ },
13128
+ {
13129
+ "flags": "--session-id <id>",
13130
+ "description": "Its session or thread id",
13131
+ "required": true,
13132
+ "valueHint": "id"
13133
+ },
13134
+ {
13135
+ "flags": "--json",
13136
+ "description": "Print { id, created }",
13137
+ "required": false,
13138
+ "valueHint": null
11718
13139
  }
11719
13140
  ],
11720
13141
  "aliases": [],
11721
13142
  "category": "CLI"
11722
13143
  },
11723
13144
  {
11724
- "id": "pan-worker",
11725
- "path": ["worker"],
11726
- "display": "/pan worker",
11727
- "description": "Registered workers: spawn an issue-linked agent and get its report back; register external agents",
13145
+ "id": "pan-lane",
13146
+ "path": ["lane"],
13147
+ "display": "/pan lane",
13148
+ "description": "Gauntlet lanes: launch, list, show, wait on, report from, stop and reap lane conversations",
11728
13149
  "args": [],
11729
13150
  "options": [],
11730
13151
  "aliases": [],
11731
13152
  "category": "CLI"
11732
13153
  },
11733
13154
  {
11734
- "id": "pan-worker-run",
11735
- "path": ["worker", "run"],
11736
- "display": "/pan worker run",
11737
- "description": "Start a worker for an issue and wait for its report (exit 0 done, 4 blocked/failed, 2 no report, 3 timeout, 1 error)",
13155
+ "id": "pan-lane-start",
13156
+ "path": ["lane", "start"],
13157
+ "display": "/pan lane start",
13158
+ "description": "Launch a lane conversation under the calling conversation (any harness)",
11738
13159
  "args": [],
11739
13160
  "options": [
11740
13161
  {
11741
- "flags": "--issue <id>",
11742
- "description": "Issue the worker belongs to (required)",
13162
+ "flags": "--key <key>",
13163
+ "description": "Lane key inside the run (required unless --for)",
13164
+ "required": true,
13165
+ "valueHint": "key"
13166
+ },
13167
+ {
13168
+ "flags": "--for <builder-key>",
13169
+ "description": "Critic (required) or verifier: the builder lane judged; --key defaults to it",
13170
+ "required": true,
13171
+ "valueHint": "builder-key"
13172
+ },
13173
+ {
13174
+ "flags": "--role <role>",
13175
+ "description": "builder | critic | verifier | play | orchestrator (required)",
13176
+ "required": true,
13177
+ "valueHint": "role"
13178
+ },
13179
+ {
13180
+ "flags": "--brief <file>",
13181
+ "description": "The brief, from a file",
11743
13182
  "required": true,
11744
- "valueHint": "id"
13183
+ "valueHint": "file"
11745
13184
  },
11746
13185
  {
11747
13186
  "flags": "--prompt <text>",
@@ -11750,62 +13189,92 @@ const COMPOSER_COMMAND_MANIFEST = [
11750
13189
  "valueHint": "text"
11751
13190
  },
11752
13191
  {
11753
- "flags": "--brief <file>",
11754
- "description": "The brief, from a file",
13192
+ "flags": "--run <key>",
13193
+ "description": "Run key (required from a root; inherited inside an orchestrator lane)",
11755
13194
  "required": true,
11756
- "valueHint": "file"
13195
+ "valueHint": "key"
13196
+ },
13197
+ {
13198
+ "flags": "--parent <conv>",
13199
+ "description": "Launching conversation (default: $OVERDECK_CONVERSATION)",
13200
+ "required": true,
13201
+ "valueHint": "conv"
13202
+ },
13203
+ {
13204
+ "flags": "--project <key>",
13205
+ "description": "Project (default: the parent's project)",
13206
+ "required": true,
13207
+ "valueHint": "key"
11757
13208
  },
11758
13209
  {
11759
13210
  "flags": "--model <model>",
11760
- "description": "Model override (default: roles.worker.model)",
13211
+ "description": "Model (default: projects.<key>.gauntlet.roles.<role>.model)",
11761
13212
  "required": true,
11762
13213
  "valueHint": "model"
11763
13214
  },
11764
13215
  {
11765
13216
  "flags": "--harness <harness>",
11766
- "description": "Harness override (default: routed from the model)",
13217
+ "description": "Harness (default: role config, else routed from the model)",
11767
13218
  "required": true,
11768
13219
  "valueHint": "harness"
11769
13220
  },
11770
13221
  {
11771
- "flags": "--read-only",
11772
- "description": "Run in the issue workspace with git writes blocked",
11773
- "required": false,
11774
- "valueHint": null
13222
+ "flags": "--effort <effort>",
13223
+ "description": "low | medium | high",
13224
+ "required": true,
13225
+ "valueHint": "effort"
11775
13226
  },
11776
13227
  {
11777
- "flags": "--cwd <path>",
11778
- "description": "Working directory inside the issue workspace",
13228
+ "flags": "--title <title>",
13229
+ "description": "Conversation title (default: <run> <key> · <role>)",
11779
13230
  "required": true,
11780
- "valueHint": "path"
13231
+ "valueHint": "title"
11781
13232
  },
11782
13233
  {
11783
- "flags": "--parent <id>",
11784
- "description": "Spawning agent or conversation (default: $OVERDECK_AGENT_ID, then $OVERDECK_CONVERSATION)",
13234
+ "flags": "--branch <branch>",
13235
+ "description": "Builder branch (default: <run>/<key>, <run>/<key>-i<n> after)",
11785
13236
  "required": true,
11786
- "valueHint": "id"
13237
+ "valueHint": "branch"
11787
13238
  },
11788
13239
  {
11789
- "flags": "--name <label>",
11790
- "description": "Label shown in the Agents Directory",
13240
+ "flags": "--from <ref>",
13241
+ "description": "Base ref for a new builder branch",
11791
13242
  "required": true,
11792
- "valueHint": "label"
13243
+ "valueHint": "ref"
11793
13244
  },
11794
13245
  {
11795
- "flags": "--detach",
11796
- "description": "Print the worker id and return without waiting",
13246
+ "flags": "--at <ref>",
13247
+ "description": "Commit a critic or verifier judges (default with --for: the builder's newest done head)",
13248
+ "required": true,
13249
+ "valueHint": "ref"
13250
+ },
13251
+ {
13252
+ "flags": "--reuse",
13253
+ "description": "Continue in the directory of the latest earlier lane with the same run, key and role",
11797
13254
  "required": false,
11798
13255
  "valueHint": null
11799
13256
  },
11800
13257
  {
11801
- "flags": "--timeout <seconds>",
11802
- "description": "Stop waiting after this many seconds (exit 3; the worker keeps running)",
11803
- "required": true,
11804
- "valueHint": "seconds"
13258
+ "flags": "--replace",
13259
+ "description": "Stop the live lane with the same run, key and role first",
13260
+ "required": false,
13261
+ "valueHint": null
11805
13262
  },
11806
13263
  {
11807
- "flags": "--stop-after-report",
11808
- "description": "Stop the worker after its first report",
13264
+ "flags": "--force",
13265
+ "description": "Launch even while the host is CPU-saturated",
13266
+ "required": false,
13267
+ "valueHint": null
13268
+ },
13269
+ {
13270
+ "flags": "--no-wait",
13271
+ "description": "Return without waiting for the lane to start",
13272
+ "required": false,
13273
+ "valueHint": null
13274
+ },
13275
+ {
13276
+ "flags": "--json",
13277
+ "description": "Print the launch result as JSON",
11809
13278
  "required": false,
11810
13279
  "valueHint": null
11811
13280
  }
@@ -11814,84 +13283,60 @@ const COMPOSER_COMMAND_MANIFEST = [
11814
13283
  "category": "CLI"
11815
13284
  },
11816
13285
  {
11817
- "id": "pan-worker-wait",
11818
- "path": ["worker", "wait"],
11819
- "display": "/pan worker wait",
11820
- "description": "Wait for a worker's report (same exit codes as run); the status line names its seq",
11821
- "args": [{
11822
- "name": "worker-id",
11823
- "required": true,
11824
- "variadic": false
11825
- }],
11826
- "options": [{
11827
- "flags": "--after <seq>",
11828
- "description": "Return the next report after this seq (default: the newest report, whenever written)",
11829
- "required": true,
11830
- "valueHint": "seq"
11831
- }, {
11832
- "flags": "--timeout <seconds>",
11833
- "description": "Stop waiting after this many seconds (exit 3)",
11834
- "required": true,
11835
- "valueHint": "seconds"
11836
- }],
11837
- "aliases": [],
11838
- "category": "CLI"
11839
- },
11840
- {
11841
- "id": "pan-worker-report",
11842
- "path": ["worker", "report"],
11843
- "display": "/pan worker report",
11844
- "description": "Record a worker's report (run by the worker itself)",
11845
- "args": [{
11846
- "name": "worker-id",
11847
- "required": true,
11848
- "variadic": false
11849
- }],
13286
+ "id": "pan-lane-list",
13287
+ "path": ["lane", "list"],
13288
+ "display": "/pan lane list",
13289
+ "description": "List lanes with their activity, newest report, git facts and cost",
13290
+ "args": [],
11850
13291
  "options": [
11851
13292
  {
11852
- "flags": "--file <path>",
11853
- "description": "Read the Markdown report from a file",
13293
+ "flags": "--run <key>",
13294
+ "description": "Only this run's lanes",
11854
13295
  "required": true,
11855
- "valueHint": "path"
13296
+ "valueHint": "key"
11856
13297
  },
11857
13298
  {
11858
- "flags": "--stdin",
11859
- "description": "Read the Markdown report from stdin",
11860
- "required": false,
11861
- "valueHint": null
13299
+ "flags": "--parent <conv>",
13300
+ "description": "Only lanes launched by this conversation",
13301
+ "required": true,
13302
+ "valueHint": "conv"
11862
13303
  },
11863
13304
  {
11864
- "flags": "--status <status>",
11865
- "description": "done | blocked | failed (default: done)",
11866
- "required": true,
11867
- "valueHint": "status"
13305
+ "flags": "--json",
13306
+ "description": "Print JSON",
13307
+ "required": false,
13308
+ "valueHint": null
11868
13309
  }
11869
13310
  ],
11870
13311
  "aliases": [],
11871
13312
  "category": "CLI"
11872
13313
  },
11873
13314
  {
11874
- "id": "pan-worker-list",
11875
- "path": ["worker", "list"],
11876
- "display": "/pan worker list",
11877
- "description": "List workers with their parent, live state and newest report",
11878
- "args": [],
13315
+ "id": "pan-lane-show",
13316
+ "path": ["lane", "show"],
13317
+ "display": "/pan lane show",
13318
+ "description": "Print the builder → critic chain of a run and key, then one line per lane",
13319
+ "args": [{
13320
+ "name": "lane",
13321
+ "required": false,
13322
+ "variadic": false
13323
+ }],
11879
13324
  "options": [
11880
13325
  {
11881
- "flags": "--issue <id>",
11882
- "description": "Only this issue's workers",
13326
+ "flags": "--run <key>",
13327
+ "description": "Run key (with --key)",
11883
13328
  "required": true,
11884
- "valueHint": "id"
13329
+ "valueHint": "key"
11885
13330
  },
11886
13331
  {
11887
- "flags": "--parent <id>",
11888
- "description": "Only workers of this parent",
13332
+ "flags": "--key <key>",
13333
+ "description": "Lane key (with --run)",
11889
13334
  "required": true,
11890
- "valueHint": "id"
13335
+ "valueHint": "key"
11891
13336
  },
11892
13337
  {
11893
13338
  "flags": "--json",
11894
- "description": "Print JSON",
13339
+ "description": "Print { run, key, steps }",
11895
13340
  "required": false,
11896
13341
  "valueHint": null
11897
13342
  }
@@ -11900,88 +13345,135 @@ const COMPOSER_COMMAND_MANIFEST = [
11900
13345
  "category": "CLI"
11901
13346
  },
11902
13347
  {
11903
- "id": "pan-worker-register",
11904
- "path": ["worker", "register"],
11905
- "display": "/pan worker register",
11906
- "description": "Record an agent another tool launched so the Agents Directory shows it (read-only; prints its id)",
11907
- "args": [],
13348
+ "id": "pan-lane-wait",
13349
+ "path": ["lane", "wait"],
13350
+ "display": "/pan lane wait",
13351
+ "description": "Wait for a lane report (exit 0 done, 4 blocked/failed, 2 no report, 3 timeout, 1 error)",
13352
+ "args": [{
13353
+ "name": "lane",
13354
+ "required": false,
13355
+ "variadic": false
13356
+ }],
11908
13357
  "options": [
11909
13358
  {
11910
- "flags": "--source <name>",
11911
- "description": "Who launched it ([a-z0-9-], not codex-plugin) (required)",
13359
+ "flags": "--run <key>",
13360
+ "description": "Wait for the next report of any lane in this run",
11912
13361
  "required": true,
11913
- "valueHint": "name"
13362
+ "valueHint": "key"
11914
13363
  },
11915
13364
  {
11916
- "flags": "--external-id <id>",
11917
- "description": "The launcher's id for it (required)",
13365
+ "flags": "--parent <conv>",
13366
+ "description": "Wait for the next report of any lane launched by this conversation",
11918
13367
  "required": true,
11919
- "valueHint": "id"
13368
+ "valueHint": "conv"
11920
13369
  },
11921
13370
  {
11922
- "flags": "--harness <harness>",
11923
- "description": "codex, claude-code, … (required)",
13371
+ "flags": "--after <seq-or-cursor>",
13372
+ "description": "Report seq for one lane; cursor <atMs>.<name>.<seq> for a run or parent",
11924
13373
  "required": true,
11925
- "valueHint": "harness"
13374
+ "valueHint": "seq-or-cursor"
11926
13375
  },
11927
13376
  {
11928
- "flags": "--model <model>",
11929
- "description": "Model it runs",
13377
+ "flags": "--timeout <seconds>",
13378
+ "description": "Stop waiting after this many seconds (exit 3)",
11930
13379
  "required": true,
11931
- "valueHint": "model"
11932
- },
13380
+ "valueHint": "seconds"
13381
+ }
13382
+ ],
13383
+ "aliases": [],
13384
+ "category": "CLI"
13385
+ },
13386
+ {
13387
+ "id": "pan-lane-report",
13388
+ "path": ["lane", "report"],
13389
+ "display": "/pan lane report",
13390
+ "description": "Record this lane's report (run inside the lane)",
13391
+ "args": [],
13392
+ "options": [
11933
13393
  {
11934
- "flags": "--cwd <path>",
11935
- "description": "Its working directory",
13394
+ "flags": "--file <path>",
13395
+ "description": "Read the Markdown report from a file",
11936
13396
  "required": true,
11937
13397
  "valueHint": "path"
11938
13398
  },
11939
13399
  {
11940
- "flags": "--issue <id>",
11941
- "description": "Issue it works on",
11942
- "required": true,
11943
- "valueHint": "id"
13400
+ "flags": "--stdin",
13401
+ "description": "Read the Markdown report from stdin",
13402
+ "required": false,
13403
+ "valueHint": null
11944
13404
  },
11945
13405
  {
11946
- "flags": "--parent <id>",
11947
- "description": "Spawning agent id, conversation tmux session, or claude-session:<uuid>",
13406
+ "flags": "--status <status>",
13407
+ "description": "done | blocked | failed (default: done)",
11948
13408
  "required": true,
11949
- "valueHint": "id"
13409
+ "valueHint": "status"
11950
13410
  },
11951
13411
  {
11952
- "flags": "--label <text>",
11953
- "description": "Label shown in the Agents Directory",
11954
- "required": true,
11955
- "valueHint": "text"
13412
+ "flags": "--allow-unpushed",
13413
+ "description": "Let a builder report done with commits not on its upstream",
13414
+ "required": false,
13415
+ "valueHint": null
11956
13416
  },
11957
13417
  {
11958
- "flags": "--pid <n>",
11959
- "description": "Its process id (liveness is read from it)",
13418
+ "flags": "--verdict <value>",
13419
+ "description": "Critic or verifier done report: WOWED | IMPRESSED | NOT_YET | PASS | DEFECTS",
11960
13420
  "required": true,
11961
- "valueHint": "n"
13421
+ "valueHint": "value"
11962
13422
  },
11963
13423
  {
11964
- "flags": "--transcript <path>",
11965
- "description": "Its transcript file",
13424
+ "flags": "--defects <n>",
13425
+ "description": "Defect count (default: the verdict file's defects array length)",
11966
13426
  "required": true,
11967
- "valueHint": "path"
13427
+ "valueHint": "n"
11968
13428
  },
11969
13429
  {
11970
- "flags": "--session-id <id>",
11971
- "description": "Its session or thread id",
13430
+ "flags": "--verdict-file <path>",
13431
+ "description": "The verdict JSON the lane wrote",
11972
13432
  "required": true,
11973
- "valueHint": "id"
11974
- },
11975
- {
11976
- "flags": "--json",
11977
- "description": "Print { id, created }",
11978
- "required": false,
11979
- "valueHint": null
13433
+ "valueHint": "path"
11980
13434
  }
11981
13435
  ],
11982
13436
  "aliases": [],
11983
13437
  "category": "CLI"
11984
13438
  },
13439
+ {
13440
+ "id": "pan-lane-stop",
13441
+ "path": ["lane", "stop"],
13442
+ "display": "/pan lane stop",
13443
+ "description": "Stop a lane through the conversation stop door",
13444
+ "args": [{
13445
+ "name": "lane",
13446
+ "required": true,
13447
+ "variadic": false
13448
+ }],
13449
+ "options": [],
13450
+ "aliases": [],
13451
+ "category": "CLI"
13452
+ },
13453
+ {
13454
+ "id": "pan-lane-reap",
13455
+ "path": ["lane", "reap"],
13456
+ "display": "/pan lane reap",
13457
+ "description": "Remove a lane's directory and archive its conversation (never kills, never discards work)",
13458
+ "args": [{
13459
+ "name": "lane",
13460
+ "required": true,
13461
+ "variadic": false
13462
+ }],
13463
+ "options": [{
13464
+ "flags": "--park",
13465
+ "description": "Save uncommitted work to a verified patch before removing a dirty worktree",
13466
+ "required": false,
13467
+ "valueHint": null
13468
+ }, {
13469
+ "flags": "--keep",
13470
+ "description": "Keep the conversation listed instead of archiving it",
13471
+ "required": false,
13472
+ "valueHint": null
13473
+ }],
13474
+ "aliases": [],
13475
+ "category": "CLI"
13476
+ },
11985
13477
  {
11986
13478
  "id": "pan-flywheel",
11987
13479
  "path": ["flywheel"],
@@ -12188,7 +13680,7 @@ const COMPOSER_COMMAND_MANIFEST = [
12188
13680
  },
12189
13681
  {
12190
13682
  "flags": "--agent-harness <harness>",
12191
- "description": "Agent harness: claude-code, pi, ohmypi, codex, acp, kimi-code, opencode, muse, or user",
13683
+ "description": "Agent harness: claude-code, pi, ohmypi, codex, acp, kimi-code, opencode, muse, prime-agent, or user",
12192
13684
  "required": true,
12193
13685
  "valueHint": "harness"
12194
13686
  },
@@ -13118,6 +14610,21 @@ const COMPOSER_COMMAND_MANIFEST = [
13118
14610
  "aliases": [],
13119
14611
  "category": "Core"
13120
14612
  },
14613
+ {
14614
+ "id": "pan-doctor-github-quota",
14615
+ "path": ["doctor", "github-quota"],
14616
+ "display": "/pan doctor github-quota",
14617
+ "description": "Show GitHub API quota use per caller, active pauses, and skipped projects",
14618
+ "args": [],
14619
+ "options": [{
14620
+ "flags": "--json",
14621
+ "description": "Print JSON",
14622
+ "required": false,
14623
+ "valueHint": null
14624
+ }],
14625
+ "aliases": [],
14626
+ "category": "Core"
14627
+ },
13121
14628
  {
13122
14629
  "id": "pan-resources",
13123
14630
  "path": ["resources"],
@@ -13667,6 +15174,11 @@ const DirectoryPause = effect.Schema.Struct({
13667
15174
  reason: effect.Schema.NullOr(effect.Schema.String),
13668
15175
  since: effect.Schema.NullOr(effect.Schema.String)
13669
15176
  });
15177
+ /** A provider error (billing, usage limit, ...) detected at the end of a transcript (PAN-4222). */
15178
+ const DirectoryProviderError = effect.Schema.Struct({
15179
+ message: effect.Schema.String,
15180
+ at: effect.Schema.String
15181
+ });
13670
15182
  const DirectoryEntry = effect.Schema.Struct({
13671
15183
  id: effect.Schema.String,
13672
15184
  kind: DirectoryEntryKind,
@@ -13691,7 +15203,29 @@ const DirectoryEntry = effect.Schema.Struct({
13691
15203
  source: DirectoryEntrySource,
13692
15204
  transcript: effect.Schema.NullOr(DirectoryTranscriptRef),
13693
15205
  /** The pause gate from state.json, native agents only (PAN-4197). */
13694
- pause: effect.Schema.optional(DirectoryPause)
15206
+ pause: effect.Schema.optional(DirectoryPause),
15207
+ /** PAN-4223: gauntlet lane facts; conversation entries that are lanes only. */
15208
+ lane: effect.Schema.optional(effect.Schema.Struct({
15209
+ run: effect.Schema.String,
15210
+ key: effect.Schema.String,
15211
+ role: effect.Schema.String,
15212
+ iteration: effect.Schema.Number,
15213
+ reportStatus: effect.Schema.NullOr(effect.Schema.Literals([
15214
+ "done",
15215
+ "blocked",
15216
+ "failed"
15217
+ ])),
15218
+ /** Critic/verifier: its verdict (or `pending`); builder: the newest critic verdict. */
15219
+ verdict: effect.Schema.optional(effect.Schema.NullOr(effect.Schema.String)),
15220
+ /** Critic/verifier: the judged builder's legacy conversation id. */
15221
+ criticOf: effect.Schema.optional(effect.Schema.Number)
15222
+ })),
15223
+ /** PAN-4223: the predecessor's legacy conversation id; successors only (links to /conv/<id>). */
15224
+ continuesFrom: effect.Schema.optional(effect.Schema.Number),
15225
+ /** The id runtime events (agentRuntimeById) are keyed under, when it differs from `id` (PAN-4222). */
15226
+ runtimeId: effect.Schema.optional(effect.Schema.String),
15227
+ /** A provider error detected at the transcript's end, conversations only (PAN-4222). */
15228
+ providerError: effect.Schema.optional(DirectoryProviderError)
13695
15229
  });
13696
15230
  /**
13697
15231
  * `window`: live entries plus finished ones active inside `windowHours`.
@@ -13788,6 +15322,73 @@ function isConfiguredPullRequestRepo(ref, repos) {
13788
15322
  return repos.some((repo) => repo.host === ref.host && repo.repository === ref.repository);
13789
15323
  }
13790
15324
  //#endregion
15325
+ //#region src/conversation-rows.ts
15326
+ /**
15327
+ * Conversation-row classifiers shared by the dashboard server (`src/lib`) and
15328
+ * the frontend (PAN-4301). One rule per question: which rows are singleton
15329
+ * runners, and what a lane conversation is doing right now (D10).
15330
+ */
15331
+ /** Singleton runners spawn under their bare id (see src/lib/agents/identity.ts normalizeAgentId). */
15332
+ const SINGLETON_AGENT_IDS = new Set(["flywheel-orchestrator", "sequencer-runner"]);
15333
+ function isSingletonConversation(row) {
15334
+ return SINGLETON_AGENT_IDS.has(row.name.toLowerCase()) || row.issueId != null && SINGLETON_AGENT_IDS.has(row.issueId.toLowerCase());
15335
+ }
15336
+ /** D10 `starting`: not alive, not ended, created less than this long ago. */
15337
+ const LANE_STARTING_GRACE_MS = 3 * 6e4;
15338
+ /** D10, first match wins. */
15339
+ function laneActivityOf(row, now) {
15340
+ if (row.archivedAt != null) return "stopped";
15341
+ if (row.spawnError) return "failed-to-start";
15342
+ if (row.sessionAlive) {
15343
+ if ((row.pendingInputCount ?? 0) > 0) return "needs-you";
15344
+ if (row.isWorking) return "working";
15345
+ return "idle";
15346
+ }
15347
+ if (row.status === "active" && now - Date.parse(row.createdAt) < 18e4) return "starting";
15348
+ return "stopped";
15349
+ }
15350
+ //#endregion
15351
+ //#region src/environment.ts
15352
+ /** Wire protocol version a client and server must agree on. */
15353
+ const ENVIRONMENT_PROTOCOL_VERSION = 1;
15354
+ const EnvironmentId = effect.Schema.String.pipe(effect.Schema.brand("EnvironmentId"));
15355
+ const EnvironmentCapabilities = effect.Schema.Struct({
15356
+ /** `POST /api/pairing/*` is available. */
15357
+ pairing: effect.Schema.Boolean,
15358
+ /** `GET/DELETE /api/devices` is available. */
15359
+ deviceSessions: effect.Schema.Boolean,
15360
+ /** `/ws/*` upgrades require a credential (PAN-1166). */
15361
+ terminalAuth: effect.Schema.Boolean
15362
+ });
15363
+ const EnvironmentDescriptor = effect.Schema.Struct({
15364
+ descriptorVersion: effect.Schema.Literal(1),
15365
+ environmentId: EnvironmentId,
15366
+ label: effect.Schema.String,
15367
+ platform: effect.Schema.Struct({
15368
+ os: effect.Schema.String,
15369
+ arch: effect.Schema.String
15370
+ }),
15371
+ /** Exact package version of the serving Overdeck. */
15372
+ serverVersion: effect.Schema.String,
15373
+ /** The server's `ENVIRONMENT_PROTOCOL_VERSION`. */
15374
+ protocolVersion: effect.Schema.Number,
15375
+ capabilities: EnvironmentCapabilities
15376
+ });
15377
+ /** A server-local id qualified by the environment that owns it. */
15378
+ const ScopedRef = (localId) => effect.Schema.Struct({
15379
+ environmentId: EnvironmentId,
15380
+ localId
15381
+ });
15382
+ const ScopedProjectRef = ScopedRef(effect.Schema.String);
15383
+ const ScopedIssueRef = ScopedRef(effect.Schema.String);
15384
+ const ScopedAgentRef = ScopedRef(effect.Schema.String);
15385
+ const ScopedConversationRef = ScopedRef(effect.Schema.String);
15386
+ const ScopedTerminalRef = ScopedRef(effect.Schema.String);
15387
+ /** True only when the server speaks exactly the client's protocol version. */
15388
+ function isProtocolCompatible(descriptor, clientProtocolVersion) {
15389
+ return descriptor.protocolVersion === clientProtocolVersion;
15390
+ }
15391
+ //#endregion
13791
15392
  exports.ACP_BEHAVIOR = ACP_BEHAVIOR;
13792
15393
  exports.AGENT_ROLES = AGENT_ROLES;
13793
15394
  exports.Activity = Activity;
@@ -13899,6 +15500,7 @@ exports.ConversationPullRequestsChangedEvent = ConversationPullRequestsChangedEv
13899
15500
  exports.ConversationResponse = ConversationResponse;
13900
15501
  exports.ConversationTitleChangedEvent = ConversationTitleChangedEvent;
13901
15502
  exports.CostEventRecordedEvent = CostEventRecordedEvent;
15503
+ exports.DEFAULT_EFFORT = DEFAULT_EFFORT;
13902
15504
  exports.DEFAULT_MAX_MEMORY_OBSERVATIONS_PER_ISSUE = DEFAULT_MAX_MEMORY_OBSERVATIONS_PER_ISSUE;
13903
15505
  exports.DEFAULT_MAX_TURN_DIFF_SUMMARIES_PER_AGENT = DEFAULT_MAX_TURN_DIFF_SUMMARIES_PER_AGENT;
13904
15506
  exports.DashboardLifecycleCompletedEvent = DashboardLifecycleCompletedEvent;
@@ -13910,6 +15512,7 @@ exports.DeployStalenessSnapshot = DeployStalenessSnapshot;
13910
15512
  exports.DerivedBranchState = DerivedBranchState;
13911
15513
  exports.DerivedIssueState = DerivedIssueState;
13912
15514
  exports.DerivedPrState = DerivedPrState;
15515
+ exports.DerivedWorkStart = DerivedWorkStart;
13913
15516
  exports.DirectoryEntry = DirectoryEntry;
13914
15517
  exports.DirectoryEntryKind = DirectoryEntryKind;
13915
15518
  exports.DirectoryEntryLocation = DirectoryEntryLocation;
@@ -13917,12 +15520,16 @@ exports.DirectoryEntrySource = DirectoryEntrySource;
13917
15520
  exports.DirectoryEntryState = DirectoryEntryState;
13918
15521
  exports.DirectoryPause = DirectoryPause;
13919
15522
  exports.DirectoryPauseBy = DirectoryPauseBy;
15523
+ exports.DirectoryProviderError = DirectoryProviderError;
13920
15524
  exports.DirectoryScope = DirectoryScope;
13921
15525
  exports.DirectoryTranscriptRef = DirectoryTranscriptRef;
13922
15526
  exports.DiscoveredSessionSnapshot = DiscoveredSessionSnapshot;
13923
15527
  exports.DomainEvent = DomainEvent;
13924
15528
  exports.EDITORS = EDITORS;
15529
+ exports.EFFORT_LEVELS = EFFORT_LEVELS;
15530
+ exports.ENVIRONMENT_PROTOCOL_VERSION = ENVIRONMENT_PROTOCOL_VERSION;
13925
15531
  exports.EditorIdSchema = EditorIdSchema;
15532
+ exports.EffortLevelSchema = EffortLevelSchema;
13926
15533
  exports.EmbedProgressEvent = EmbedProgressEvent;
13927
15534
  exports.EmbedProgressSnapshot = EmbedProgressSnapshot;
13928
15535
  exports.EmbedSessionsRpc = EmbedSessionsRpc;
@@ -13931,6 +15538,9 @@ exports.EnrichProgressEvent = EnrichProgressEvent;
13931
15538
  exports.EnrichProgressSnapshot = EnrichProgressSnapshot;
13932
15539
  exports.EnrichSessionsRpc = EnrichSessionsRpc;
13933
15540
  exports.EnrichStatsSnapshot = EnrichStatsSnapshot;
15541
+ exports.EnvironmentCapabilities = EnvironmentCapabilities;
15542
+ exports.EnvironmentDescriptor = EnvironmentDescriptor;
15543
+ exports.EnvironmentId = EnvironmentId;
13934
15544
  exports.ExtractionProviderConfig = ExtractionProviderConfig;
13935
15545
  exports.ExtractionProviderTarget = ExtractionProviderTarget;
13936
15546
  exports.FeatureNode = FeatureNode;
@@ -13938,6 +15548,7 @@ exports.FeatureRegistryEntry = FeatureRegistryEntry;
13938
15548
  exports.FeatureRegistryStatus = FeatureRegistryStatus;
13939
15549
  exports.FlywheelAgent = FlywheelAgent;
13940
15550
  exports.FlywheelAgentStatus = FlywheelAgentStatus;
15551
+ exports.FlywheelAgentSummary = FlywheelAgentSummary;
13941
15552
  exports.FlywheelBugRateCriterion = FlywheelBugRateCriterion;
13942
15553
  exports.FlywheelConversationSummary = FlywheelConversationSummary;
13943
15554
  exports.FlywheelDerivedStatus = FlywheelDerivedStatus;
@@ -13974,6 +15585,9 @@ exports.FlywheelSuggestion = FlywheelSuggestion;
13974
15585
  exports.FlywheelSuggestionAction = FlywheelSuggestionAction;
13975
15586
  exports.FlywheelSuggestionPriority = FlywheelSuggestionPriority;
13976
15587
  exports.FlywheelSystemStatus = FlywheelSystemStatus;
15588
+ exports.GITHUB_QUOTA_BUCKETS = GITHUB_QUOTA_BUCKETS;
15589
+ exports.GITHUB_QUOTA_CALLERS = GITHUB_QUOTA_CALLERS;
15590
+ exports.GITHUB_QUOTA_POOLS = GITHUB_QUOTA_POOLS;
13977
15591
  exports.GetAvailableEditorsRpc = GetAvailableEditorsRpc;
13978
15592
  exports.GetConversationCostByWorkspaceRpc = GetConversationCostByWorkspaceRpc;
13979
15593
  exports.GetConversationCostRpc = GetConversationCostRpc;
@@ -13981,6 +15595,16 @@ exports.GetConversationStatsRpc = GetConversationStatsRpc;
13981
15595
  exports.GetDiscoveredSessionRpc = GetDiscoveredSessionRpc;
13982
15596
  exports.GetSessionsFeedFacetsRpc = GetSessionsFeedFacetsRpc;
13983
15597
  exports.GetSnapshotRpc = GetSnapshotRpc;
15598
+ exports.GitHubQuotaBucket = GitHubQuotaBucket;
15599
+ exports.GitHubQuotaCaller = GitHubQuotaCaller;
15600
+ exports.GitHubQuotaCallerUsage = GitHubQuotaCallerUsage;
15601
+ exports.GitHubQuotaChangedEvent = GitHubQuotaChangedEvent;
15602
+ exports.GitHubQuotaPause = GitHubQuotaPause;
15603
+ exports.GitHubQuotaPool = GitHubQuotaPool;
15604
+ exports.GitHubQuotaSample = GitHubQuotaSample;
15605
+ exports.GitHubQuotaSnapshot = GitHubQuotaSnapshot;
15606
+ exports.GitHubQuotaUsage = GitHubQuotaUsage;
15607
+ exports.GitHubRateLimitKind = GitHubRateLimitKind;
13984
15608
  exports.GlobalContextLayerRecord = GlobalContextLayerRecord;
13985
15609
  exports.GlobalContextLayerTarget = GlobalContextLayerTarget;
13986
15610
  exports.HOOK_INVENTORY = HOOK_INVENTORY;
@@ -14006,6 +15630,7 @@ exports.IssuesSnapshotEvent = IssuesSnapshotEvent;
14006
15630
  exports.IssuesUpdatedEvent = IssuesUpdatedEvent;
14007
15631
  exports.KIMI_CODE_BEHAVIOR = KIMI_CODE_BEHAVIOR;
14008
15632
  exports.KNOWN_HARNESSES = KNOWN_HARNESSES;
15633
+ exports.LANE_STARTING_GRACE_MS = LANE_STARTING_GRACE_MS;
14009
15634
  exports.LegacySystemHealthSummary = LegacySystemHealthSummary;
14010
15635
  exports.LegacyWebhookRelaySummary = LegacyWebhookRelaySummary;
14011
15636
  exports.LinearMcpAuthCallbackRelayedEvent = LinearMcpAuthCallbackRelayedEvent;
@@ -14034,6 +15659,7 @@ exports.MemoryTokenUsage = MemoryTokenUsage;
14034
15659
  exports.MergeReadyEvent = MergeReadyEvent;
14035
15660
  exports.ModelOrigin = ModelOrigin;
14036
15661
  exports.ModelOriginEntry = ModelOriginEntry;
15662
+ exports.NON_ESSENTIAL_GITHUB_CALLERS = NON_ESSENTIAL_GITHUB_CALLERS;
14037
15663
  exports.OHMYPI_BEHAVIOR = OHMYPI_BEHAVIOR;
14038
15664
  exports.OPENCODE_BEHAVIOR = OPENCODE_BEHAVIOR;
14039
15665
  exports.OVERDECK_AGENT_PROTOCOL_VERSION = OVERDECK_AGENT_PROTOCOL_VERSION;
@@ -14048,6 +15674,7 @@ exports.OrderBookPosture = OrderBookPosture;
14048
15674
  exports.OrderBookSettings = OrderBookSettings;
14049
15675
  exports.OrderBookStatus = OrderBookStatus;
14050
15676
  exports.PIPELINE_MEMBERSHIP_LOADING_CODE = PIPELINE_MEMBERSHIP_LOADING_CODE;
15677
+ exports.PRIME_AGENT_BEHAVIOR = PRIME_AGENT_BEHAVIOR;
14051
15678
  exports.PanRpcError = PanRpcError;
14052
15679
  exports.PanRpcGroup = PanRpcGroup;
14053
15680
  exports.PendingTurn = PendingTurn;
@@ -14117,12 +15744,19 @@ exports.ReviewVerdictRestoreBlockedEvent = ReviewVerdictRestoreBlockedEvent;
14117
15744
  exports.ReviewerRoundMetadata = ReviewerRoundMetadata;
14118
15745
  exports.ReviewerRoundSummary = ReviewerRoundSummary;
14119
15746
  exports.Role = Role;
15747
+ exports.SINGLETON_AGENT_IDS = SINGLETON_AGENT_IDS;
14120
15748
  exports.ScanCompleteEvent = ScanCompleteEvent;
14121
15749
  exports.ScanConversationsRpc = ScanConversationsRpc;
14122
15750
  exports.ScanProgressEvent = ScanProgressEvent;
14123
15751
  exports.ScanProgressSnapshot = ScanProgressSnapshot;
14124
15752
  exports.ScanResult = ScanResult;
14125
15753
  exports.ScanStartedEvent = ScanStartedEvent;
15754
+ exports.ScopedAgentRef = ScopedAgentRef;
15755
+ exports.ScopedConversationRef = ScopedConversationRef;
15756
+ exports.ScopedIssueRef = ScopedIssueRef;
15757
+ exports.ScopedProjectRef = ScopedProjectRef;
15758
+ exports.ScopedRef = ScopedRef;
15759
+ exports.ScopedTerminalRef = ScopedTerminalRef;
14126
15760
  exports.SearchConversationsRpc = SearchConversationsRpc;
14127
15761
  exports.SendTerminalInputRpc = SendTerminalInputRpc;
14128
15762
  exports.SequenceNumber = SequenceNumber;
@@ -14143,6 +15777,7 @@ exports.SpecialistLifecycle = SpecialistLifecycle;
14143
15777
  exports.SpecialistStartedEvent = SpecialistStartedEvent;
14144
15778
  exports.StartAgentRpc = StartAgentRpc;
14145
15779
  exports.StartPlanningRpc = StartPlanningRpc;
15780
+ exports.SubagentHumanInput = SubagentHumanInput;
14146
15781
  exports.SubagentSummary = SubagentSummary;
14147
15782
  exports.SubscribeAgentOutputRpc = SubscribeAgentOutputRpc;
14148
15783
  exports.SubscribeConversationMessagesRpc = SubscribeConversationMessagesRpc;
@@ -14174,6 +15809,7 @@ exports.TickMarker = TickMarker;
14174
15809
  exports.TickMarkerPhase = TickMarkerPhase;
14175
15810
  exports.TurnDiffFileChange = TurnDiffFileChange;
14176
15811
  exports.TurnDiffSummary = TurnDiffSummary;
15812
+ exports.TurnEndAssessment = TurnEndAssessment;
14177
15813
  exports.WIRED_HOOK_INVENTORY = WIRED_HOOK_INVENTORY;
14178
15814
  exports.WIRED_HOOK_NAMES = WIRED_HOOK_NAMES;
14179
15815
  exports.WS_METHODS = WS_METHODS;
@@ -14195,8 +15831,11 @@ exports.WriteFileAtPathRpc = WriteFileAtPathRpc;
14195
15831
  exports.applyEvent = applyEvent;
14196
15832
  exports.applyEvents = applyEvents;
14197
15833
  exports.applyIssueDelta = applyIssueDelta;
15834
+ exports.bucketQuotaPoints = bucketQuotaPoints;
15835
+ exports.bucketQuotaRemaining = bucketQuotaRemaining;
14198
15836
  exports.canonicalPullRequestUrl = canonicalPullRequestUrl;
14199
15837
  exports.companionTerminalKindFor = companionTerminalKindFor;
15838
+ exports.compareEffort = compareEffort;
14200
15839
  exports.compareIssueIds = compareIssueIds;
14201
15840
  exports.createIssueDelta = createIssueDelta;
14202
15841
  exports.decodeFlywheelDerivedStatus = decodeFlywheelDerivedStatus;
@@ -14208,16 +15847,22 @@ exports.getHarnessBehavior = getHarnessBehavior;
14208
15847
  exports.getMaxMemoryObservationsPerIssue = getMaxMemoryObservationsPerIssue;
14209
15848
  exports.getMaxTurnDiffSummariesPerAgent = getMaxTurnDiffSummariesPerAgent;
14210
15849
  exports.getRuntimeBehavior = getRuntimeBehavior;
15850
+ exports.indexPanesByAgentKey = indexPanesByAgentKey;
14211
15851
  exports.isAgentRole = isAgentRole;
14212
15852
  exports.isAgentSessionName = isAgentSessionName;
14213
15853
  exports.isChannelReplyKind = isChannelReplyKind;
14214
15854
  exports.isConfiguredPullRequestRepo = isConfiguredPullRequestRepo;
15855
+ exports.isEffortLevel = isEffortLevel;
14215
15856
  exports.isIssueAttention = isIssueAttention;
14216
15857
  exports.isIssueState = isIssueState;
15858
+ exports.isProtocolCompatible = isProtocolCompatible;
15859
+ exports.isSingletonConversation = isSingletonConversation;
14217
15860
  exports.isTerminalBackendName = isTerminalBackendName;
14218
15861
  exports.isTerminalTurnDiffSummaryStatus = isTerminalTurnDiffSummaryStatus;
15862
+ exports.laneActivityOf = laneActivityOf;
14219
15863
  exports.normalizeChannelReplyPayload = normalizeChannelReplyPayload;
14220
15864
  exports.omitTurnDiffSummariesForAgent = omitTurnDiffSummariesForAgent;
15865
+ exports.paneAgentKey = paneAgentKey;
14221
15866
  exports.parsePullRequestRef = parsePullRequestRef;
14222
15867
  exports.projectLegacySystemHealthSummary = projectLegacySystemHealthSummary;
14223
15868
  exports.repoFromRemoteUrl = repoFromRemoteUrl;