@rosthq/cli 0.7.87 → 0.7.89

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.
@@ -1 +1 @@
1
- {"version":3,"file":"command-manifest.d.ts","sourceRoot":"","sources":["../../src/generated/command-manifest.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,eAAO,MAAM,gBAAgB,EAAE,SAAS,oBAAoB,EAuQ3D,CAAC"}
1
+ {"version":3,"file":"command-manifest.d.ts","sourceRoot":"","sources":["../../src/generated/command-manifest.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,eAAO,MAAM,gBAAgB,EAAE,SAAS,oBAAoB,EA6Q3D,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"groups.d.ts","sourceRoot":"","sources":["../../src/generator/groups.ts"],"names":[],"mappings":"AAuCA,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAM1D,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAKhF,CAAC;AAosCF,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAmPjD,CAAC"}
1
+ {"version":3,"file":"groups.d.ts","sourceRoot":"","sources":["../../src/generator/groups.ts"],"names":[],"mappings":"AAuCA,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAM1D,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAKhF,CAAC;AAwsCF,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAmPjD,CAAC"}
package/dist/index.js CHANGED
@@ -40435,6 +40435,12 @@ var aicosModelSelectionSchema = external_exports.object({
40435
40435
  effort: external_exports.enum(["low", "medium", "high", "xhigh", "max"]).optional(),
40436
40436
  label: external_exports.string().min(1).optional(),
40437
40437
  routingReason: external_exports.string().min(1).optional(),
40438
+ // DER-1820: true only while the managed allowance is exhausted AND a usable tenant
40439
+ // BYOK key exists, so the executor's managed->BYOK auto-recovery (cloud-execution.ts
40440
+ // `allowManagedRecovery`) will actually run the next turn — lets the allowance banner
40441
+ // say "running on your tenant key" instead of overclaiming guided mode / a stale
40442
+ // "Add BYOK" CTA when BYOK is already covering the turn.
40443
+ byokFallbackActive: external_exports.boolean().optional(),
40438
40444
  estimatedContextTokens: external_exports.number().int().nonnegative().default(0),
40439
40445
  contextWindowTokens: external_exports.number().int().positive().optional(),
40440
40446
  options: external_exports.array(aicosModelOptionSchema).default([])
@@ -43673,6 +43679,131 @@ var errorLogSupersedeOutputSchema = external_exports.object({
43673
43679
  disposition: external_exports.literal("superseded"),
43674
43680
  resolved_at: isoDateTime4
43675
43681
  }).strict();
43682
+ var staleCandidateConfidenceSchema = external_exports.enum(["low", "medium", "high"]);
43683
+ var staleCandidateEvidenceSchema = external_exports.array(external_exports.string());
43684
+ var staleCandidatesInputSchema = external_exports.object({
43685
+ stale_after_days: external_exports.number().int().min(1).max(365).default(14),
43686
+ limit: external_exports.number().int().min(1).max(200).default(50)
43687
+ }).strict();
43688
+ var errorLogStaleCandidateSchema = external_exports.object({
43689
+ error_log_id: uuidSchema14,
43690
+ source: external_exports.enum(["run", "llm", "tool", "mcp", "runner", "integration", "job", "web"]),
43691
+ severity: external_exports.enum(["warning", "error", "critical"]),
43692
+ code: external_exports.string().nullable(),
43693
+ message: external_exports.string(),
43694
+ seat_id: uuidSchema14.nullable(),
43695
+ occurrence_count: external_exports.number().int(),
43696
+ last_seen_at: isoDateTime4,
43697
+ created_at: isoDateTime4,
43698
+ days_stale: external_exports.number().int(),
43699
+ linked_issue_id: uuidSchema14.nullable(),
43700
+ linked_issue_resolved: external_exports.boolean(),
43701
+ confidence: staleCandidateConfidenceSchema,
43702
+ evidence: staleCandidateEvidenceSchema
43703
+ }).strict();
43704
+ var errorLogStaleCandidatesOutputSchema = external_exports.object({
43705
+ candidates: external_exports.array(errorLogStaleCandidateSchema),
43706
+ total: external_exports.number().int().nonnegative()
43707
+ }).strict();
43708
+ var escalationStaleCandidateSchema = external_exports.object({
43709
+ escalation_id: uuidSchema14,
43710
+ seat_id: uuidSchema14,
43711
+ seat_name: external_exports.string(),
43712
+ reason: external_exports.string(),
43713
+ status: external_exports.literal("open"),
43714
+ created_at: isoDateTime4,
43715
+ updated_at: isoDateTime4,
43716
+ days_stale: external_exports.number().int(),
43717
+ referenced_refs: external_exports.array(external_exports.string()),
43718
+ confidence: staleCandidateConfidenceSchema,
43719
+ evidence: staleCandidateEvidenceSchema
43720
+ }).strict();
43721
+ var escalationStaleCandidatesOutputSchema = external_exports.object({
43722
+ candidates: external_exports.array(escalationStaleCandidateSchema),
43723
+ total: external_exports.number().int().nonnegative()
43724
+ }).strict();
43725
+ var frictionStaleCandidateSchema = external_exports.object({
43726
+ issue_id: uuidSchema14,
43727
+ summary: external_exports.string(),
43728
+ severity: external_exports.enum(["low", "med", "high", "critical"]),
43729
+ status: external_exports.enum(["open", "diagnosing"]),
43730
+ created_at: isoDateTime4,
43731
+ updated_at: isoDateTime4,
43732
+ days_stale: external_exports.number().int(),
43733
+ action_task_id: uuidSchema14.nullable(),
43734
+ action_task_status: external_exports.string().nullable(),
43735
+ action_task_done: external_exports.boolean(),
43736
+ confidence: staleCandidateConfidenceSchema,
43737
+ evidence: staleCandidateEvidenceSchema
43738
+ }).strict();
43739
+ var frictionStaleCandidatesOutputSchema = external_exports.object({
43740
+ candidates: external_exports.array(frictionStaleCandidateSchema),
43741
+ total: external_exports.number().int().nonnegative()
43742
+ }).strict();
43743
+ var errorLogBulkResolveInputSchema = external_exports.object({
43744
+ error_log_ids: external_exports.array(uuidSchema14).min(1).max(200),
43745
+ reason: external_exports.string().trim().min(1),
43746
+ disposition: external_exports.enum(["acknowledged", "resolved"]).default("resolved")
43747
+ }).strict();
43748
+ var errorLogBulkResolveSkippedSchema = external_exports.object({
43749
+ error_log_id: uuidSchema14,
43750
+ reason: external_exports.string()
43751
+ }).strict();
43752
+ var errorLogBulkResolveFailedSchema = external_exports.object({
43753
+ error_log_id: uuidSchema14,
43754
+ reason: external_exports.string()
43755
+ }).strict();
43756
+ var errorLogBulkResolveOutputSchema = external_exports.object({
43757
+ resolved: external_exports.array(uuidSchema14),
43758
+ skipped: external_exports.array(errorLogBulkResolveSkippedSchema),
43759
+ failed: external_exports.array(errorLogBulkResolveFailedSchema),
43760
+ resolved_count: external_exports.number().int().nonnegative(),
43761
+ skipped_count: external_exports.number().int().nonnegative(),
43762
+ failed_count: external_exports.number().int().nonnegative(),
43763
+ total: external_exports.number().int().nonnegative()
43764
+ }).strict();
43765
+ var escalationBulkResolveInputSchema = external_exports.object({
43766
+ escalation_ids: external_exports.array(uuidSchema14).min(1).max(200),
43767
+ reason: external_exports.string().trim().min(1)
43768
+ }).strict();
43769
+ var escalationBulkResolveSkippedSchema = external_exports.object({
43770
+ escalation_id: uuidSchema14,
43771
+ reason: external_exports.string()
43772
+ }).strict();
43773
+ var escalationBulkResolveFailedSchema = external_exports.object({
43774
+ escalation_id: uuidSchema14,
43775
+ reason: external_exports.string()
43776
+ }).strict();
43777
+ var escalationBulkResolveOutputSchema = external_exports.object({
43778
+ resolved: external_exports.array(uuidSchema14),
43779
+ skipped: external_exports.array(escalationBulkResolveSkippedSchema),
43780
+ failed: external_exports.array(escalationBulkResolveFailedSchema),
43781
+ resolved_count: external_exports.number().int().nonnegative(),
43782
+ skipped_count: external_exports.number().int().nonnegative(),
43783
+ failed_count: external_exports.number().int().nonnegative(),
43784
+ total: external_exports.number().int().nonnegative()
43785
+ }).strict();
43786
+ var frictionBulkResolveInputSchema = external_exports.object({
43787
+ issue_ids: external_exports.array(uuidSchema14).min(1).max(200),
43788
+ root_cause: external_exports.string().trim().min(1)
43789
+ }).strict();
43790
+ var frictionBulkResolveSkippedSchema = external_exports.object({
43791
+ issue_id: uuidSchema14,
43792
+ reason: external_exports.string()
43793
+ }).strict();
43794
+ var frictionBulkResolveFailedSchema = external_exports.object({
43795
+ issue_id: uuidSchema14,
43796
+ reason: external_exports.string()
43797
+ }).strict();
43798
+ var frictionBulkResolveOutputSchema = external_exports.object({
43799
+ resolved: external_exports.array(uuidSchema14),
43800
+ skipped: external_exports.array(frictionBulkResolveSkippedSchema),
43801
+ failed: external_exports.array(frictionBulkResolveFailedSchema),
43802
+ resolved_count: external_exports.number().int().nonnegative(),
43803
+ skipped_count: external_exports.number().int().nonnegative(),
43804
+ failed_count: external_exports.number().int().nonnegative(),
43805
+ total: external_exports.number().int().nonnegative()
43806
+ }).strict();
43676
43807
 
43677
43808
  // ../../packages/protocol/src/working-files.ts
43678
43809
  var WORKING_FILE_MAX_PATH_CHARS = 512;
@@ -43791,6 +43922,12 @@ var runnerExecutionStateSchema = external_exports.enum([
43791
43922
  ]);
43792
43923
  var runnerExecutionReadinessSchema = external_exports.object({
43793
43924
  state: runnerExecutionStateSchema,
43925
+ // DER-1655: per-runner CAPABILITY — can this runner execute a turn right now
43926
+ // (online + local runtime + not allowance-blocked). This is the presence/readiness
43927
+ // bit CLI/API callers should read; `execute_ready` is dispatch-selection ONLY, so a
43928
+ // capable idle_unproven/queued_unclaimed runner must still serialize `capable: true`
43929
+ // over the wire even while `execute_ready` is false.
43930
+ capable: external_exports.boolean(),
43794
43931
  execute_ready: external_exports.boolean(),
43795
43932
  detail: external_exports.string(),
43796
43933
  due_queued_work_orders: external_exports.number().int().nonnegative(),
@@ -44167,7 +44304,7 @@ var systemHealthFindingCodeSchema = external_exports.enum([
44167
44304
  "failed_run",
44168
44305
  "unresolved_error",
44169
44306
  "offline_runner",
44170
- "runner_not_execute_ready",
44307
+ "runner_not_capable",
44171
44308
  "pending_signal",
44172
44309
  "off_track_signal",
44173
44310
  "missing_charter",
@@ -44236,7 +44373,12 @@ var systemHealthWorkLoopSectionSchema = external_exports.object({
44236
44373
  var systemHealthConnectivitySectionSchema = external_exports.object({
44237
44374
  runner_count: external_exports.number().int().nonnegative(),
44238
44375
  offline_runner_count: external_exports.number().int().nonnegative(),
44239
- not_execute_ready_runner_count: external_exports.number().int().nonnegative(),
44376
+ // DER-1655: a presence/readiness surface alerts on per-runner CAPABILITY
44377
+ // (execution.capable), not the dispatch-only executeReady bit. Counts runners
44378
+ // that cannot execute a turn right now (offline/unpaired, or online but
44379
+ // missing a runtime / model-account-exhausted). A capable-but-not-executeReady
44380
+ // runner (online idle_unproven / queued_unclaimed) is healthy and excluded.
44381
+ not_capable_runner_count: external_exports.number().int().nonnegative(),
44240
44382
  // DER-1588: fleet-wide near-cap/at-limit warning, driven off the runner capacity badge.
44241
44383
  near_cap_or_exhausted_runner_count: external_exports.number().int().nonnegative(),
44242
44384
  integration_count: external_exports.number().int().nonnegative(),
@@ -46358,6 +46500,10 @@ var escalationStatusSchema = external_exports.enum([
46358
46500
  "overridden",
46359
46501
  "converted_to_issue"
46360
46502
  ]);
46503
+ var stewardReplayActionSummarySchema = external_exports.object({
46504
+ tool_name: external_exports.string(),
46505
+ run_id: uuidSchema20
46506
+ }).strict();
46361
46507
  var stewardEscalationSchema = external_exports.object({
46362
46508
  id: uuidSchema20,
46363
46509
  seat_id: uuidSchema20,
@@ -46367,6 +46513,11 @@ var stewardEscalationSchema = external_exports.object({
46367
46513
  steward_seat_name: external_exports.string(),
46368
46514
  reason: external_exports.string(),
46369
46515
  charter_clause: external_exports.string(),
46516
+ // DER-1634: secret-scrubbed evidence the agent attached when it escalated (the DB
46517
+ // scrubs it at write time; read projections re-scrub defensively — invariant #5).
46518
+ evidence: external_exports.unknown(),
46519
+ // DER-1634: scrubbed summary of the durable replay action, or null when there is none.
46520
+ replay_action_summary: stewardReplayActionSummarySchema.nullable(),
46370
46521
  recommended_action: external_exports.string().nullable(),
46371
46522
  status: escalationStatusSchema,
46372
46523
  decided_by: uuidSchema20.nullable(),
@@ -47989,7 +48140,7 @@ External connectors are being rolled out provider by provider, conservatively (r
47989
48140
  order: 48,
47990
48141
  title: "CLI and MCP installation guide",
47991
48142
  summary: "Install the public CLI, register remote token-backed MCP clients, and find the full command and tool catalog.",
47992
- version: "2026-07-16.1",
48143
+ version: "2026-07-16.3",
47993
48144
  public: true,
47994
48145
  audiences: ["human", "cli", "mcp", "in_app_agent"],
47995
48146
  stages: ["company_setup", "staffing"],
@@ -48634,6 +48785,8 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
48634
48785
  | \`rost_list_error_logs\` | \`error_log.list\` | List product error logs by seat, source, severity, and active/resolved state. | Tenant | Call with \`{"resolved":"active"}\` before acknowledging stale failures. |
48635
48786
  | \`rost_resolve_error_log\` | \`error_log.resolve\` | Acknowledge or resolve an error log with a required human reason and optional task, issue, or PR link. | Tenant | Call with \`error_log_id\`, \`reason\`, and \`disposition\` \`acknowledged\` or \`resolved\`. |
48636
48787
  | \`rost_supersede_error_log\` | \`error_log.supersede\` | Mark an older error log as superseded by a newer in-tenant error log. | Tenant | Call with \`error_log_id\`, \`new_error_log_id\`, and \`reason\`. |
48788
+ | \`rost_find_stale_error_logs\` | \`error_log.stale_candidates\` | List unresolved error logs that have gone flat (no new occurrences) and are candidates for bulk resolution, with a per-row confidence tier and evidence. Read-only. | Tenant | Call with optional \`stale_after_days\` and \`limit\`; feed the returned ids to \`error_log.bulk_resolve\`. |
48789
+ | \`rost_bulk_resolve_error_logs\` | \`error_log.bulk_resolve\` | Acknowledge or resolve a batch of stale error logs in one human-confirmed action with a required reason; per-item partial success, one resolution event each, already-resolved or missing ids skipped. | Tenant | Human decision; expect confirmation. Call with \`error_log_ids\`, \`reason\`, and \`disposition\`. |
48637
48790
  | \`rost_list_integrations\` | \`integration.list\` | List connected integration metadata and latest health state. | Tenant | Call with \`{}\` or \`{"provider":"google"}\`; no secrets or vault refs are returned. |
48638
48791
  | \`rost_check_integration_readiness\` | \`integration.readiness\` | Return the connector setup checklist: OAuth env/callback, tenant connection, scopes, latest test state, external verification/CASA, handler availability, and DER-coded next actions. | Tenant | Call with \`{"provider":"google"}\`; metadata only, no secrets or vault refs. |
48639
48792
  | \`rost_get_integration_status\` | \`integration.status\` | Read one integration's metadata by provider or integration id. | Tenant | Call with \`{"provider":"google"}\` or \`{"integration_id":"<id>"}\`. |
@@ -48693,6 +48846,8 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
48693
48846
  | \`rost_update_friction_issue_status\` | \`friction.update_status\` | Move a non-terminal issue between open and diagnosing. | Seat or tenant-admin | Call with \`issue_id\` and \`status\`. |
48694
48847
  | \`rost_resolve_friction_issue\` | \`friction.resolve\` | Resolve an issue with a root cause and remediation task. | Tenant | Human decision; expect confirmation. |
48695
48848
  | \`rost_link_task_to_friction_issue\` | \`friction.link_task\` | Attach an existing task as an issue's action task. | Seat or tenant-admin | Call with \`issue_id\` and \`task_id\`. |
48849
+ | \`rost_find_stale_friction\` | \`friction.stale_candidates\` | List open or diagnosing Friction issues whose linked remediation task has already shipped, making them high-confidence bulk-resolution candidates, with per-row evidence. Read-only. | Tenant | Call with optional \`stale_after_days\` and \`limit\`; feed the returned ids to \`friction.bulk_resolve\`. |
48850
+ | \`rost_bulk_resolve_friction\` | \`friction.bulk_resolve\` | Resolve a batch of stale Friction issues in one human-confirmed action with a required root cause (already-fixed mode, no follow-up task); per-item partial success, one human decision each, already-resolved or missing ids skipped. | Tenant | Human decision; expect confirmation. Call with \`issue_ids\` and \`root_cause\`. |
48696
48851
  | \`rost_create_task\` | \`task.create\` | Create a task (a commitment between seats). | Seat or tenant-admin | \`none\` \u2014 human-created tasks go live directly; ordinary agent-created tasks become draft proposals; bounded Trusted proposals become offered or, for same-Steward live agent seats, in progress. Agent/scheduled producers may pass an optional \`source_key\` so a repeat proposal is an idempotent no-op (\`already_filed:true\`, no duplicate task). |
48697
48852
  | \`rost_update_task\` | \`task.update\` | Reschedule, reassign, or edit a non-terminal task. | Owner (tenant-admin) | Pass \`task_id\` plus at least one of \`due_on\`/\`owner_seat_id\`/\`title\`/\`description\`; terminal tasks reject. |
48698
48853
  | \`rost_compile_sync_brief\` | \`sync.brief.compile\` | Compile the weekly Sync Brief (idempotent per period). | Tenant | Call with \`{}\`. |
@@ -48701,7 +48856,8 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
48701
48856
  | \`rost_complete_sync_run\` | \`sync.run.complete\` | Record that the Sync meeting completed (idempotent). | Tenant | Call with \`{"sync_brief_id":"<id>"}\`. |
48702
48857
  | \`rost_assign_sync_follow_up\` | \`sync.item.assign\` | Create a follow-up task from a Sync agenda item. | Tenant | Call with brief, owner seat, title, description. |
48703
48858
  | \`rost_list_escalations\` | \`escalation.list\` | List Steward queue escalations (own steward chain for humans, own seat for agents). | Seat or tenant-admin | Call with \`{}\` or \`{"include_decided":true}\`. |
48704
- | \`rost_get_escalation\` | \`escalation.get\` | Read one escalation's evidence, recommendation, and decision state. | Seat or tenant-admin | Call with \`{"id":"<escalation-id>"}\`. Resolve/reject are human-only and not exposed over MCP. |
48859
+ | \`rost_get_escalation\` | \`escalation.get\` | Read one escalation's secret-scrubbed evidence, recommendation, decision state, and \`replay_action_summary\` (the held tool + originating run a steward approval would replay \u2014 never the raw args). | Seat or tenant-admin | Call with \`{"id":"<escalation-id>"}\`. Resolve/reject are human-only and not exposed over MCP. |
48860
+ | \`rost_find_stale_escalations\` | \`escalation.stale_candidates\` | List aged open escalations on the caller's steward chain that still reference a concrete DER issue or PR, with a per-row confidence tier and evidence. Read-only. | Tenant | Call with optional \`stale_after_days\` and \`limit\`. The bulk override (\`escalation.bulk_resolve\`) is human-only and not exposed over MCP. |
48705
48861
  | \`rost_check_compass_alignment\` | \`compass.alignment\` | Advisory drift check: scores whether cycle goals still ladder to the active vision and flags orphan/contradictory goals. Read-only \u2014 it never edits the Compass or any goal. | Tenant | Call with \`{}\`. |
48706
48862
  | \`rost_team_health_score\` | \`team.health_score\` | Read the single rolled-up 0-100 team-health score (latest month) with its band and label. | Tenant | Call with \`{}\`. |
48707
48863
  | \`rost_show_compass_as_markdown\` | \`compass.show_markdown\` | Render the current Compass and its open gaps as a clean markdown card for review. | Tenant | Call with \`{}\`. |
@@ -52069,21 +52225,27 @@ var COMMAND_MANIFEST = [
52069
52225
  { "id": "deliverable.create", "namespace": "deliverable", "action": "create", "title": "Create agent deliverable", "description": "Create an agent deliverable for the acting seat. The deliverable is scrubbed for secrets before storage.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "kind", "flag": "kind", "type": "enum", "required": false, "enumValues": ["brief", "work_evidence", "artifact", "report", "other"] }, { "name": "title", "flag": "title", "type": "string", "required": true }, { "name": "summary", "flag": "summary", "type": "string", "required": false }, { "name": "content", "flag": "content", "type": "string", "required": false }, { "name": "delivered_at", "flag": "delivered-at", "type": "string", "required": false }], "hasComplexInput": true, "help": "Create a scrubbed durable work output for the acting seat without making a durable company decision." },
52070
52226
  { "id": "deliverable.get", "namespace": "deliverable", "action": "get", "title": "Get agent deliverable", "description": "Return one agent deliverable by id for a seat.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }], "hasComplexInput": true, "help": "Read one durable agent deliverable by id after checking seat-scoped access." },
52071
52227
  { "id": "deliverable.list", "namespace": "deliverable", "action": "list", "title": "List agent deliverables", "description": "Return agent deliverables for a seat, including derived entries from succeeded runs with outcome summaries.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "List durable agent deliverables for a seat, including explicit outputs and successful-run summaries." },
52228
+ { "id": "error_log.bulk_resolve", "namespace": "error_log", "action": "bulk_resolve", "title": "Bulk resolve error logs", "description": "Acknowledge or resolve a batch of stale error logs in one human-confirmed action, with a required reason. Each error log is resolved independently (partial success) and writes its own resolution event; already-resolved or missing ids are skipped.", "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "error_log_ids", "flag": "error-log-ids", "type": "array", "required": true, "itemType": "string" }, { "name": "reason", "flag": "reason", "type": "string", "required": true }, { "name": "disposition", "flag": "disposition", "type": "enum", "required": false, "enumValues": ["acknowledged", "resolved"] }], "hasComplexInput": false, "help": "Acknowledge or resolve a batch of stale error logs in one human-confirmed action with a required reason; each is resolved independently (partial success) and already-resolved or missing ids are skipped." },
52072
52229
  { "id": "error_log.list", "namespace": "error_log", "action": "list", "title": "List error logs", "description": "List tenant error logs with optional filtering by seat, source, severity, and resolved state.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": false }, { "name": "source", "flag": "source", "type": "enum", "required": false, "enumValues": ["run", "llm", "tool", "mcp", "runner", "integration", "job", "web"] }, { "name": "severity", "flag": "severity", "type": "enum", "required": false, "enumValues": ["warning", "error", "critical"] }, { "name": "resolved", "flag": "resolved", "type": "enum", "required": false, "enumValues": ["active", "acknowledged", "resolved", "all"] }, { "name": "limit", "flag": "limit", "type": "integer", "required": false }], "hasComplexInput": false, "help": "List product-visible error logs by source, severity, seat, and active/resolved disposition before closing stale failures." },
52073
52230
  { "id": "error_log.resolve", "namespace": "error_log", "action": "resolve", "title": "Resolve error log", "description": "Acknowledge or resolve an error log with a required reason and optional linked task, Friction issue, or PR reference.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "error_log_id", "flag": "error-log-id", "type": "string", "required": true }, { "name": "reason", "flag": "reason", "type": "string", "required": true }, { "name": "disposition", "flag": "disposition", "type": "enum", "required": false, "enumValues": ["acknowledged", "resolved"] }, { "name": "linked_task_id", "flag": "linked-task-id", "type": "string", "required": false }, { "name": "linked_issue_id", "flag": "linked-issue-id", "type": "string", "required": false }, { "name": "linked_pr_ref", "flag": "linked-pr-ref", "type": "string", "required": false }], "hasComplexInput": false, "help": "Acknowledge or resolve a stale error log with a required human reason and optional task, issue, or PR evidence." },
52231
+ { "id": "error_log.stale_candidates", "namespace": "error_log", "action": "stale_candidates", "title": "Find stale error logs", "description": "List unresolved error logs that have gone flat (no new occurrences) and are candidates for bulk resolution, with a per-row confidence tier and human-readable evidence. Read-only \u2014 it never resolves anything.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "stale_after_days", "flag": "stale-after-days", "type": "integer", "required": false }, { "name": "limit", "flag": "limit", "type": "integer", "required": false }], "hasComplexInput": false, "help": "List unresolved error logs that have gone flat, with a confidence tier and evidence, to triage a bulk close-the-loop pass. Read-only." },
52074
52232
  { "id": "error_log.supersede", "namespace": "error_log", "action": "supersede", "title": "Supersede error log", "description": "Mark an error log as superseded by a newer error log. Links the old error to the new one and records the reason.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "error_log_id", "flag": "error-log-id", "type": "string", "required": true }, { "name": "new_error_log_id", "flag": "new-error-log-id", "type": "string", "required": true }, { "name": "reason", "flag": "reason", "type": "string", "required": true }, { "name": "linked_task_id", "flag": "linked-task-id", "type": "string", "required": false }, { "name": "linked_issue_id", "flag": "linked-issue-id", "type": "string", "required": false }, { "name": "linked_pr_ref", "flag": "linked-pr-ref", "type": "string", "required": false }], "hasComplexInput": false, "help": "Mark an older error log as superseded by a newer same-tenant error log while preserving history." },
52233
+ { "id": "escalation.bulk_resolve", "namespace": "escalation", "action": "bulk_resolve", "title": "Bulk resolve escalations", "description": "Override (safely close) a batch of stale open escalations in one human-confirmed action, with a required reason. Each escalation is decided independently (partial success) and writes its own human decision; already-decided, not-routed, or missing ids are skipped. Agents cannot bulk-resolve.", "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": false, "fields": [{ "name": "escalation_ids", "flag": "escalation-ids", "type": "array", "required": true, "itemType": "string" }, { "name": "reason", "flag": "reason", "type": "string", "required": true }], "hasComplexInput": false, "help": "Override (safely close) a batch of stale open escalations in one human-confirmed action; each records its own human decision and already-decided, not-routed, or missing ids are skipped. Agents cannot bulk-resolve." },
52075
52234
  { "id": "escalation.get", "namespace": "escalation", "action": "get", "title": "Get escalation", "description": "Read a single escalation the caller is allowed to see (own steward chain for humans, own seat for agents).", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "id", "flag": "id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Read one escalation's evidence and recommendation before a human resolves or rejects it." },
52076
52235
  { "id": "escalation.list", "namespace": "escalation", "action": "list", "title": "List escalations", "description": "List Steward queue escalations routed to the caller's steward chain (human) or raised by the caller's seat (agent).", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "include_decided", "flag": "include-decided", "type": "boolean", "required": false }], "hasComplexInput": false, "help": "List Steward queue escalations (own chain for humans, own seat for agents) before resolving or routing them." },
52077
52236
  { "id": "escalation.raise", "namespace": "escalation", "action": "raise", "title": "Raise escalation", "description": "Emit an escalation event and open a Steward queue item for the acting seat.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "reason", "flag": "reason", "type": "string", "required": true }, { "name": "charter_clause", "flag": "charter-clause", "type": "string", "required": true }, { "name": "recommended_action", "flag": "recommended-action", "type": "string", "required": false }], "hasComplexInput": true, "help": "Raise an escalation to the seat's Steward when a decision exceeds the seat's authority; humans decide." },
52078
52237
  { "id": "escalation.reject", "namespace": "escalation", "action": "reject", "title": "Reject escalation", "description": "Override an open escalation so the agent must not proceed. Writes a human decision; agents cannot reject.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": false, "fields": [{ "name": "id", "flag": "id", "type": "string", "required": true }, { "name": "rationale", "flag": "rationale", "type": "string", "required": false }], "hasComplexInput": false, "help": "Reject (override) an escalation so the agent must not proceed; the decision records the human decider. Agents cannot reject." },
52079
52238
  { "id": "escalation.resolve", "namespace": "escalation", "action": "resolve", "title": "Resolve escalation", "description": "Approve an open escalation (or convert it to Friction). Writes a human decision; agents cannot resolve.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": false, "fields": [{ "name": "id", "flag": "id", "type": "string", "required": true }, { "name": "action", "flag": "action", "type": "enum", "required": false, "enumValues": ["approve", "convert_to_issue"] }, { "name": "rationale", "flag": "rationale", "type": "string", "required": false }], "hasComplexInput": false, "help": "Resolve an escalation as a human Steward; the decision records decided_by as the approving human. Agents cannot resolve." },
52239
+ { "id": "escalation.stale_candidates", "namespace": "escalation", "action": "stale_candidates", "title": "Find stale escalations", "description": "List open escalations routed to the caller's steward chain that have aged and still reference a concrete DER issue or PR, with a per-row confidence tier and evidence. Read-only \u2014 it never decides anything.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "stale_after_days", "flag": "stale-after-days", "type": "integer", "required": false }, { "name": "limit", "flag": "limit", "type": "integer", "required": false }], "hasComplexInput": false, "help": "List aged open escalations in the caller's steward chain that still reference a concrete DER issue or PR \u2014 candidates for a bulk override. Read-only." },
52080
52240
  { "id": "friction.assist", "namespace": "friction", "action": "assist", "title": "Assist Friction issue", "description": "Advisory IDS assist for an issue: the most-similar prior resolved issues with their root causes and decisions, a recurring-pattern flag, and recommended options. Read-only \u2014 it never resolves the issue.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "issue_id", "flag": "issue-id", "type": "string", "required": true }, { "name": "limit", "flag": "limit", "type": "integer", "required": false }], "hasComplexInput": false, "help": "Advisory IDS assist: the most-similar prior resolved issues with their root causes and decisions, plus a recurring-pattern flag. Read-only \u2014 it never resolves the issue." },
52241
+ { "id": "friction.bulk_resolve", "namespace": "friction", "action": "bulk_resolve", "title": "Bulk resolve friction", "description": "Resolve a batch of stale Friction issues in one human-confirmed action with a required root cause (already-fixed mode \u2014 no follow-up task). Each issue is resolved independently (partial success) and writes its own human decision; already-resolved or missing ids are skipped.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "issue_ids", "flag": "issue-ids", "type": "array", "required": true, "itemType": "string" }, { "name": "root_cause", "flag": "root-cause", "type": "string", "required": true }], "hasComplexInput": false, "help": "Resolve a batch of stale issues in one human-confirmed action with a required root cause (already-fixed mode); each records its own human decision and already-resolved or missing ids are skipped." },
52081
52242
  { "id": "friction.file_issue", "namespace": "friction", "action": "file_issue", "title": "File Friction issue", "description": "Emit an issue event and open a Friction issue raised by the acting seat.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "summary", "flag": "summary", "type": "string", "required": true }, { "name": "blocking_goal_id", "flag": "blocking-goal-id", "type": "string", "required": false }, { "name": "broken_measurable_id", "flag": "broken-measurable-id", "type": "string", "required": false }, { "name": "severity", "flag": "severity", "type": "enum", "required": true, "enumValues": ["low", "med", "high", "critical"] }, { "name": "source_key", "flag": "source-key", "type": "string", "required": false }], "hasComplexInput": true, "help": "File a Friction issue with evidence when a goal or measurable is blocked or broken." },
52082
52243
  { "id": "friction.get", "namespace": "friction", "action": "get", "title": "Get Friction issue", "description": "Get full detail for one Friction issue by id.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "issue_id", "flag": "issue-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Get full detail for one Friction issue by id, including its root cause, action task, and resolution decision when present." },
52083
52244
  { "id": "friction.import", "namespace": "friction", "action": "import", "title": "Import Friction issues from a ninety Issues List", "description": "Bulk-import a ninety Issues List export into Friction. Owners are seat names resolved to seats; each issue is raised by the resolved seat and attributed to the importing human. Idempotent \u2014 re-importing the same export is a no-op, and an existing open issue with the same seat + summary is skipped.", "requiredScope": "tenant_admin", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "dry_run", "flag": "dry-run", "type": "boolean", "required": false }], "hasComplexInput": true, "help": "Import a ninety Issues List export into Friction; owners resolve to seats, idempotent by file + seat/summary." },
52084
52245
  { "id": "friction.link_task", "namespace": "friction", "action": "link_task", "title": "Link task to Friction issue", "description": "Attach an existing tenant task as the action task for a non-terminal issue. Both ids must belong to the tenant.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "issue_id", "flag": "issue-id", "type": "string", "required": true }, { "name": "task_id", "flag": "task-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Attach an existing task as the action task for a non-terminal issue." },
52085
52246
  { "id": "friction.list", "namespace": "friction", "action": "list", "title": "List Friction issues", "description": "List Friction issues ranked by status, impact, and severity. Defaults to active (open + diagnosing).", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "status", "flag": "status", "type": "enum", "required": false, "enumValues": ["open", "diagnosing", "resolved", "dropped", "active", "all"] }], "hasComplexInput": false, "help": "List Friction issues ranked by impact and severity to find the issue id before updating or resolving it." },
52086
52247
  { "id": "friction.resolve", "namespace": "friction", "action": "resolve", "title": "Resolve Friction issue", "description": 'Resolve an issue with a root cause. In the default "ids" resolution_mode this also creates a remediation follow-up task; "already_fixed" records only the root cause (no follow-up task). Always records a human decision (decided_by) in the same transaction.', "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "issue_id", "flag": "issue-id", "type": "string", "required": true }, { "name": "resolution_mode", "flag": "resolution-mode", "type": "enum", "required": false, "enumValues": ["ids", "already_fixed"] }, { "name": "root_cause", "flag": "root-cause", "type": "string", "required": true }, { "name": "owner_seat_id", "flag": "owner-seat-id", "type": "string", "required": false }, { "name": "task_title", "flag": "task-title", "type": "string", "required": false }, { "name": "task_description", "flag": "task-description", "type": "string", "required": false }, { "name": "done_by", "flag": "done-by", "type": "string", "required": false }, { "name": "resolving_seat_id", "flag": "resolving-seat-id", "type": "string", "required": false }], "hasComplexInput": false, "help": "Resolve an issue with a root cause and remediation task; resolution is a human decision." },
52248
+ { "id": "friction.stale_candidates", "namespace": "friction", "action": "stale_candidates", "title": "Find stale friction", "description": "List open or diagnosing Friction issues whose linked remediation task has already shipped, making them high-confidence candidates for bulk resolution, with per-row evidence. Read-only \u2014 it never resolves anything.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "stale_after_days", "flag": "stale-after-days", "type": "integer", "required": false }, { "name": "limit", "flag": "limit", "type": "integer", "required": false }], "hasComplexInput": false, "help": "List open or diagnosing issues whose remediation task already shipped \u2014 high-confidence candidates for a bulk close-the-loop pass. Read-only." },
52087
52249
  { "id": "friction.update_status", "namespace": "friction", "action": "update_status", "title": "Update Friction issue status", "description": "Move a non-terminal issue between open and diagnosing. Terminal issues (resolved/dropped) cannot be reopened here.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "issue_id", "flag": "issue-id", "type": "string", "required": true }, { "name": "status", "flag": "status", "type": "enum", "required": true, "enumValues": ["open", "diagnosing"] }], "hasComplexInput": false, "help": "Move a non-terminal issue between open and diagnosing while it is being worked." },
52088
52250
  { "id": "goal.bind_measurable", "namespace": "goal", "action": "bind_measurable", "title": "Bind a Signal to a Cascade goal", "description": "Bind a measurable to a goal. Role defaults to 'informs' \u2014 a conservative informative indicator allowed at any goal level (many per goal) that never changes goal status. Role 'drives_status' makes it the goal's status driver: allowed only on a childless seat goal or milestone, at most one per goal, requires a second_anchor (a prior closed period + expected value confirming the Signal matched the books), and auto-status starts OFF until a steward opts in with goal.set_auto_status. Binding a driver over an existing informs binding of the same Signal promotes it. Binding is human-gated.", "requiredScope": "seat", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "goal_id", "flag": "goal-id", "type": "string", "required": true }, { "name": "measurable_id", "flag": "measurable-id", "type": "string", "required": true }, { "name": "role", "flag": "role", "type": "enum", "required": false, "enumValues": ["drives_status", "informs"] }], "hasComplexInput": true, "help": "Bind a Signal to a goal. Defaults to role informs (a conservative indicator at any level that never changes status); pass role drives_status with a second_anchor (a prior closed period + expected value confirming the Signal matched the books) to make it a childless leaf goal's status driver \u2014 this promotes an existing informs binding (auto-status starts OFF until a steward opts in)." },
52089
52251
  { "id": "goal.create", "namespace": "goal", "action": "create", "title": "Create Cascade goal", "description": "Create a cycle goal under an existing objective. The parent chain must terminate at a Compass objective in the same cycle (enforced server-side).", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "cycle_id", "flag": "cycle-id", "type": "string", "required": true }, { "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "parent_goal_id", "flag": "parent-goal-id", "type": "string", "required": true }, { "name": "title", "flag": "title", "type": "string", "required": true }, { "name": "definition_of_done", "flag": "definition-of-done", "type": "string", "required": true }, { "name": "status", "flag": "status", "type": "enum", "required": false, "enumValues": ["on", "off"] }], "hasComplexInput": false, "help": "Create cycle goals under an existing objective; the parent chain must terminate at a Compass objective." },
@@ -53025,18 +53187,21 @@ function renderRunnerList(output) {
53025
53187
  const record2 = asRecord(runner);
53026
53188
  const posture = asRecord(record2.posture);
53027
53189
  const capacity = asRecord(record2.capacity);
53190
+ const execution = asRecord(record2.execution);
53028
53191
  const capabilitySet = asArray(posture.capability_set).map((value) => String(value)).join(", ");
53029
- return `${field(record2, "id")} ${field(record2, "health")} ${field(record2, "name")} (${field(record2, "platform")}) cli=${field(record2, "cli_version")} sandbox=${field(posture, "sandbox")} network=${field(posture, "network")}${capabilitySet.length > 0 ? ` capabilities=${capabilitySet}` : ""} capacity=${field(capacity, "state")} account=${field(capacity, "account_alias")} freshness=${field(capacity, "freshness")}`;
53192
+ return `${field(record2, "id")} ${field(record2, "health")} ${field(record2, "name")} (${field(record2, "platform")}) cli=${field(record2, "cli_version")} sandbox=${field(posture, "sandbox")} network=${field(posture, "network")}${capabilitySet.length > 0 ? ` capabilities=${capabilitySet}` : ""} execution=${field(execution, "state")} capable=${field(execution, "capable")} capacity=${field(capacity, "state")} account=${field(capacity, "account_alias")} freshness=${field(capacity, "freshness")}`;
53030
53193
  }).join("\n");
53031
53194
  }
53032
53195
  function renderRunnerStatus(output) {
53033
53196
  const record2 = asRecord(output);
53034
53197
  const posture = asRecord(record2.posture);
53035
53198
  const capacity = asRecord(record2.capacity);
53199
+ const execution = asRecord(record2.execution);
53036
53200
  const capabilitySet = asArray(posture.capability_set).map((value) => String(value)).join(", ");
53037
53201
  const lines = [
53038
53202
  `${field(record2, "id")} ${field(record2, "health")} ${field(record2, "name")} (last heartbeat ${field(record2, "last_heartbeat_at")}).`,
53039
53203
  `cli_version: ${field(record2, "cli_version")} sandbox: ${field(posture, "sandbox")} network: ${field(posture, "network")}`,
53204
+ `execution: ${field(execution, "state")} capable: ${field(execution, "capable")} execute_ready: ${field(execution, "execute_ready")}`,
53040
53205
  `capacity: ${field(capacity, "state")} account: ${field(capacity, "account_alias")} freshness: ${field(capacity, "freshness")} rate_limited_until: ${field(capacity, "rate_limited_until")}`
53041
53206
  ];
53042
53207
  if (capabilitySet.length > 0) {
@@ -53412,7 +53577,7 @@ function formatSystemHealth(output) {
53412
53577
  `signals: off_track=${field(signals, "off_track_count")} pending=${field(signals, "pending_count")}`,
53413
53578
  `cascade: recommendations=${field(cascade, "recommendation_count")} warnings=${field(cascade, "warning_count")}`,
53414
53579
  `work_loop: open_issues=${field(workLoop, "open_issue_count")} friction_without_task=${field(workLoop, "friction_without_task_count")} open_or_stalled_tasks=${field(workLoop, "open_or_stalled_task_count")}`,
53415
- `connectivity: runners=${field(connectivity, "runner_count")} offline_runners=${field(connectivity, "offline_runner_count")} not_ready_runners=${field(connectivity, "not_execute_ready_runner_count")} integrations=${field(connectivity, "integration_count")} disconnected_integrations=${field(connectivity, "disconnected_integration_count")} failed_notifications=${field(connectivity, "failed_notification_count")}`,
53580
+ `connectivity: runners=${field(connectivity, "runner_count")} offline_runners=${field(connectivity, "offline_runner_count")} not_ready_runners=${field(connectivity, "not_capable_runner_count")} integrations=${field(connectivity, "integration_count")} disconnected_integrations=${field(connectivity, "disconnected_integration_count")} failed_notifications=${field(connectivity, "failed_notification_count")}`,
53416
53581
  `sync: latest_brief=${field(sync, "latest_brief_at")} missing_latest_brief=${field(sync, "missing_latest_brief")} flagged_gaps=${field(sync, "flagged_gap_count")}`
53417
53582
  );
53418
53583
  return lines.join("\n");