@rosthq/cli 0.7.89 → 0.7.91

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,EA6Q3D,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,EAgR3D,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;AAwsCF,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;AAitCF,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAmPjD,CAAC"}
package/dist/index.js CHANGED
@@ -46341,11 +46341,16 @@ var statusEventPayloadSchema = external_exports.object({
46341
46341
  note: external_exports.string().min(1).optional()
46342
46342
  }).strict()).optional()
46343
46343
  }).strict();
46344
+ var escalationCategorySchema = external_exports.enum(["safety_refusal"]);
46344
46345
  var escalationEventPayloadSchema = external_exports.object({
46345
46346
  reason: external_exports.string().min(1),
46346
46347
  charter_clause: external_exports.string().min(1),
46347
46348
  evidence: evidenceSchema,
46348
- recommended_action: external_exports.string().min(1).optional()
46349
+ recommended_action: external_exports.string().min(1).optional(),
46350
+ // DER-1848: reason-adjacent category. Optional so every existing escalation event
46351
+ // (and every ordinary held call) validates unchanged; present only when the agent
46352
+ // explicitly escalated with a category (today: a safety refusal).
46353
+ category: escalationCategorySchema.optional()
46349
46354
  }).strict();
46350
46355
  var issueEventPayloadSchema = external_exports.object({
46351
46356
  summary: external_exports.string().min(1),
@@ -46504,6 +46509,10 @@ var stewardReplayActionSummarySchema = external_exports.object({
46504
46509
  tool_name: external_exports.string(),
46505
46510
  run_id: uuidSchema20
46506
46511
  }).strict();
46512
+ var stewardProposedToolCallSchema = external_exports.object({
46513
+ tool_name: external_exports.string(),
46514
+ args_summary: external_exports.unknown()
46515
+ }).strict();
46507
46516
  var stewardEscalationSchema = external_exports.object({
46508
46517
  id: uuidSchema20,
46509
46518
  seat_id: uuidSchema20,
@@ -46513,11 +46522,19 @@ var stewardEscalationSchema = external_exports.object({
46513
46522
  steward_seat_name: external_exports.string(),
46514
46523
  reason: external_exports.string(),
46515
46524
  charter_clause: external_exports.string(),
46525
+ // DER-1848: the first-class escalation category, or null for an ordinary held call.
46526
+ // `safety_refusal` = the agent explicitly declined the task on safety grounds, so
46527
+ // every read surface (command/MCP/web) can render "refused (safety)" distinctly from
46528
+ // a routine held tool call. Sourced from the escalation event payload (no DB column).
46529
+ category: escalationCategorySchema.nullable(),
46516
46530
  // DER-1634: secret-scrubbed evidence the agent attached when it escalated (the DB
46517
46531
  // scrubs it at write time; read projections re-scrub defensively — invariant #5).
46518
46532
  evidence: external_exports.unknown(),
46519
46533
  // DER-1634: scrubbed summary of the durable replay action, or null when there is none.
46520
46534
  replay_action_summary: stewardReplayActionSummarySchema.nullable(),
46535
+ // DER-1818: the held tool call the steward is approving (present-only convention —
46536
+ // omitted entirely when the escalation has no durable replay action).
46537
+ proposed_tool_call: stewardProposedToolCallSchema.optional(),
46521
46538
  recommended_action: external_exports.string().nullable(),
46522
46539
  status: escalationStatusSchema,
46523
46540
  decided_by: uuidSchema20.nullable(),
@@ -46735,6 +46752,108 @@ var workDetailsSchemas = {
46735
46752
  }).strict()
46736
46753
  };
46737
46754
 
46755
+ // ../../packages/protocol/src/agent-grant-intervention.ts
46756
+ var uuidSchema21 = external_exports.string().uuid();
46757
+ var agentGrantBlockerKindSchema = external_exports.enum([
46758
+ "rost_capability",
46759
+ "os_permission",
46760
+ "provider_connection",
46761
+ "vault_credential",
46762
+ "explicit_charter_escalation"
46763
+ ]);
46764
+ var agentGrantInterventionStatusSchema = external_exports.enum([
46765
+ "blocked",
46766
+ "granted",
46767
+ "resumed",
46768
+ "declined",
46769
+ "expired"
46770
+ ]);
46771
+ var agentGrantKindSchema = external_exports.enum(["allow_once", "permanent"]);
46772
+ var agentGrantInterventionSchema = external_exports.object({
46773
+ id: uuidSchema21,
46774
+ seat_id: uuidSchema21,
46775
+ seat_name: external_exports.string().nullable(),
46776
+ agent_id: uuidSchema21.nullable(),
46777
+ // The source blocked attempt (audit link); null once the run is retention-purged.
46778
+ run_id: uuidSchema21.nullable(),
46779
+ // The runner the blocker lives on, for os_permission repairs ("Open on Runner").
46780
+ runner_id: uuidSchema21.nullable(),
46781
+ // The linked continuation attempt, populated when a continuation is enqueued.
46782
+ continuation_run_id: uuidSchema21.nullable(),
46783
+ blocker_kind: agentGrantBlockerKindSchema,
46784
+ status: agentGrantInterventionStatusSchema,
46785
+ // The specific capability/scope requested (e.g. "gmail.send"), when applicable.
46786
+ missing_capability: external_exports.string().nullable(),
46787
+ // The specific, factually-stated ask shown to the human (no secrets, no raw UUIDs).
46788
+ missing_grant_summary: external_exports.string(),
46789
+ // Digest of the exact action the one-time grant is bound to. A stale/changed
46790
+ // digest at decide time expires the grant rather than replaying a widened one.
46791
+ action_digest: external_exports.string().nullable(),
46792
+ // Bounded-checkpoint reference (the attempt's saved position/evidence, scrubbed).
46793
+ checkpoint_ref: external_exports.string().nullable(),
46794
+ // True once the blocked attempt released its lease/compute (AC #2 clean termination).
46795
+ compute_released: external_exports.boolean(),
46796
+ grant_kind: agentGrantKindSchema.nullable(),
46797
+ decided_by: uuidSchema21.nullable(),
46798
+ decided_by_name: external_exports.string().nullable(),
46799
+ decided_at: external_exports.string().nullable(),
46800
+ expires_at: external_exports.string().nullable(),
46801
+ created_at: external_exports.string(),
46802
+ updated_at: external_exports.string()
46803
+ }).strict();
46804
+ var agentGrantInterventionListInputSchema = external_exports.object({
46805
+ // Optional seat filter (a seat-scoped caller is additionally clamped to its own seat).
46806
+ seat_id: uuidSchema21.optional(),
46807
+ // When true, include decided/terminal records (declined/resumed/expired) too;
46808
+ // by default only the actionable open blocked/granted records are returned.
46809
+ include_decided: external_exports.boolean().optional()
46810
+ }).strict();
46811
+ var agentGrantInterventionListOutputSchema = external_exports.object({
46812
+ interventions: external_exports.array(agentGrantInterventionSchema)
46813
+ }).strict();
46814
+ var agentGrantInterventionGetInputSchema = external_exports.object({
46815
+ id: uuidSchema21
46816
+ }).strict();
46817
+ var agentGrantInterventionGetOutputSchema = external_exports.object({
46818
+ intervention: agentGrantInterventionSchema
46819
+ }).strict();
46820
+ var agentGrantInterventionDecideActionSchema = external_exports.enum(["grant", "decline"]);
46821
+ var agentGrantInterventionDecideInputSchema = external_exports.object({
46822
+ intervention_id: uuidSchema21,
46823
+ action: agentGrantInterventionDecideActionSchema,
46824
+ // Defaults to allow_once. `permanent` never auto-widens — it returns
46825
+ // requires_charter_resign so the surface routes the human to a Charter re-sign.
46826
+ grant_kind: agentGrantKindSchema.optional(),
46827
+ // When provided on a grant, must byte-match the record's action_digest (proves
46828
+ // the human is authorizing the SAME exact action the agent blocked on); a
46829
+ // mismatch expires the grant instead of replaying a stale/widened action.
46830
+ action_digest: external_exports.string().optional(),
46831
+ rationale: external_exports.string().trim().min(1).max(2e3).optional()
46832
+ }).strict();
46833
+ var agentGrantInterventionDecideOutputSchema = external_exports.object({
46834
+ intervention_id: uuidSchema21,
46835
+ status: agentGrantInterventionStatusSchema,
46836
+ continuation_run_id: uuidSchema21.nullable(),
46837
+ // The human decision row written for a grant/decline (invariant #7). Null only
46838
+ // when a permanent grant deferred to a Charter re-sign (no one-time decision made).
46839
+ decision_id: uuidSchema21.nullable(),
46840
+ // True when the human chose the permanent option — the surface must route to a
46841
+ // Charter re-sign; no authority was widened by this call (invariant #10).
46842
+ requires_charter_resign: external_exports.boolean(),
46843
+ // True when authority committed but the continuation enqueue did not complete —
46844
+ // the human can retry ONLY the enqueue via `resume` (never re-grant).
46845
+ enqueue_failed: external_exports.boolean()
46846
+ }).strict();
46847
+ var agentGrantInterventionResumeInputSchema = external_exports.object({
46848
+ intervention_id: uuidSchema21
46849
+ }).strict();
46850
+ var agentGrantInterventionResumeOutputSchema = external_exports.object({
46851
+ intervention_id: uuidSchema21,
46852
+ status: agentGrantInterventionStatusSchema,
46853
+ continuation_run_id: uuidSchema21.nullable(),
46854
+ enqueue_failed: external_exports.boolean()
46855
+ }).strict();
46856
+
46738
46857
  // ../../packages/protocol/src/index.ts
46739
46858
  var eventTypes = [
46740
46859
  "status",
@@ -46749,7 +46868,7 @@ var eventTypes = [
46749
46868
  "task"
46750
46869
  ];
46751
46870
  var publicMessageTypes = ["status", "handoff", "escalation", "issue"];
46752
- var uuidSchema21 = external_exports.string().uuid();
46871
+ var uuidSchema22 = external_exports.string().uuid();
46753
46872
  var evidenceSchema2 = external_exports.array(external_exports.unknown());
46754
46873
  var internalEventPayloadSchema = external_exports.record(external_exports.string(), external_exports.unknown()).refine((payload) => !Array.isArray(payload), "Internal event payload must be an object");
46755
46874
  var handoffEventPayloadSchema = external_exports.object({
@@ -46759,24 +46878,24 @@ var handoffEventPayloadSchema = external_exports.object({
46759
46878
  acceptance_criteria: external_exports.array(external_exports.string().min(1)),
46760
46879
  due: external_exports.string().datetime({ offset: true })
46761
46880
  }).strict(),
46762
- to_seat_id: uuidSchema21
46881
+ to_seat_id: uuidSchema22
46763
46882
  }).strict();
46764
46883
  var intakeEventPayloadSchema = external_exports.discriminatedUnion("action", [
46765
46884
  external_exports.object({
46766
46885
  action: external_exports.literal("uploaded"),
46767
- document_id: uuidSchema21,
46886
+ document_id: uuidSchema22,
46768
46887
  storage_ref: external_exports.string().min(1)
46769
46888
  }).strict(),
46770
46889
  external_exports.object({
46771
46890
  action: external_exports.literal("parsed"),
46772
- document_id: uuidSchema21,
46891
+ document_id: uuidSchema22,
46773
46892
  mode: external_exports.enum(["source_tree", "function_first"]),
46774
46893
  seat_count: external_exports.number().int().nonnegative(),
46775
46894
  edge_count: external_exports.number().int().nonnegative()
46776
46895
  }).strict(),
46777
46896
  external_exports.object({
46778
46897
  action: external_exports.literal("failed"),
46779
- document_id: uuidSchema21,
46898
+ document_id: uuidSchema22,
46780
46899
  reason: external_exports.string().min(1)
46781
46900
  }).strict(),
46782
46901
  external_exports.object({
@@ -46882,9 +47001,9 @@ var publicMessageTypeSchema = external_exports.enum(publicMessageTypes);
46882
47001
  var eventEnvelopeBaseSchema = external_exports.object({
46883
47002
  protocol: external_exports.literal(EVENT_PROTOCOL),
46884
47003
  type: eventTypeSchema,
46885
- seat_id: uuidSchema21.nullable(),
47004
+ seat_id: uuidSchema22.nullable(),
46886
47005
  occurred_at: external_exports.string().datetime({ offset: true }),
46887
- goal_ancestry: external_exports.array(uuidSchema21)
47006
+ goal_ancestry: external_exports.array(uuidSchema22)
46888
47007
  }).strict();
46889
47008
  var statusEventEnvelopeSchema = eventEnvelopeBaseSchema.extend({
46890
47009
  type: external_exports.literal("status"),
@@ -48140,7 +48259,7 @@ External connectors are being rolled out provider by provider, conservatively (r
48140
48259
  order: 48,
48141
48260
  title: "CLI and MCP installation guide",
48142
48261
  summary: "Install the public CLI, register remote token-backed MCP clients, and find the full command and tool catalog.",
48143
- version: "2026-07-16.3",
48262
+ version: "2026-07-16.5",
48144
48263
  public: true,
48145
48264
  audiences: ["human", "cli", "mcp", "in_app_agent"],
48146
48265
  stages: ["company_setup", "staffing"],
@@ -48855,8 +48974,8 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
48855
48974
  | \`rost_start_sync_run\` | \`sync.run.start\` | Ensure a Sync Brief exists so the meeting can begin. | Tenant | Call with \`{}\`. |
48856
48975
  | \`rost_complete_sync_run\` | \`sync.run.complete\` | Record that the Sync meeting completed (idempotent). | Tenant | Call with \`{"sync_brief_id":"<id>"}\`. |
48857
48976
  | \`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. |
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}\`. |
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. |
48977
+ | \`rost_list_escalations\` | \`escalation.list\` | List Steward queue escalations (own steward chain for humans, own seat for agents). Each escalation that holds a replayable tool call also carries \`proposed_tool_call\` (\`{ tool_name, args_summary }\`, secret-scrubbed \u2014 never raw args). | Seat or tenant-admin | Call with \`{}\` or \`{"include_decided":true}\`. |
48978
+ | \`rost_get_escalation\` | \`escalation.get\` | Read one escalation's secret-scrubbed evidence, recommendation, decision state, \`replay_action_summary\` (the held tool + originating run a steward approval would replay \u2014 never the raw args), and \`proposed_tool_call\` (the same held call's \`{ tool_name, args_summary }\` payload, secret-scrubbed, present only when there is one). | Seat or tenant-admin | Call with \`{"id":"<escalation-id>"}\`. Resolve/reject are human-only and not exposed over MCP. |
48860
48979
  | \`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. |
48861
48980
  | \`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 \`{}\`. |
48862
48981
  | \`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 \`{}\`. |
@@ -48875,6 +48994,9 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
48875
48994
  | \`rost_revoke_agent_trusted_grant\` | \`agent.trust.revoke\` | Revoke an active Trusted grant while preserving history. | Tenant | Human steward/admin only; call with \`{"grant_id":"<grant-id>","reason":"..."}\`; non-interactive callers receive a confirmation handoff. |
48876
48995
  | \`rost_expire_agent_trusted_grants\` | \`agent.trust.expire\` | Mark overdue active Trusted grants expired and append audit events. | Tenant | Human steward/admin only; call with \`{"agent_id":"<agent-id>"}\`. |
48877
48996
  | \`rost_supersede_agent_trusted_grant\` | \`agent.trust.supersede\` | Replace the active Trusted grant with a fresh digest and budget. | Tenant | Human steward/admin only; call with \`{"agent_id":"<agent-id>","expected_scope_digest":"sha256:...","budget_cents":2500}\`. |
48997
+ | \`rost_list_blocked_awaiting_grant_interventions\` | \`agent_grant_intervention.list\` | List durable blocked-awaiting-grant agent interventions with their missing grant, blocker kind, checkpoint, and decision state. Returns secret-scrubbed metadata only; a seat-scoped caller is clamped to its own seat. Pass \`include_decided\` to also return terminal (declined/resumed/expired) records. | Seat or tenant-admin | Call with \`{}\` (or \`{"seat_id":"<seat-id>","include_decided":true}\`). |
48998
+ | \`rost_decide_a_blocked_agent_grant\` | \`agent_grant_intervention.decide\` | Grant (one-time, exact-action) or decline a blocked agent intervention. A grant writes a human decision and enqueues the linked continuation; the \`permanent\` grant kind never auto-widens \u2014 it returns \`requires_charter_resign\` so the surface routes the human to a Charter re-sign. A supplied \`action_digest\` must byte-match the record's or the grant expires instead of replaying a stale action. Human steward/admin only and human-gated. | Tenant | Call with \`{"intervention_id":"<intervention-id>","action":"grant","grant_kind":"allow_once","action_digest":"sha256:..."}\`; non-interactive callers receive a confirmation handoff. |
48999
+ | \`rost_resume_a_granted_agent_intervention\` | \`agent_grant_intervention.resume\` | Retry ONLY the continuation enqueue for an already-granted blocked intervention whose enqueue did not complete. Never re-grants authority (the one-time grant is already committed). Human steward/admin only. | Tenant | Call with \`{"intervention_id":"<intervention-id>"}\`. |
48878
49000
  | \`rost_suggest_setup_capability_grants\` | \`agent_setup.capability_suggestions\` | Suggest deterministic minimum capability grants from the current setup/template and tenant grant availability. | Tenant | Call with \`{"seat_id":"<seat-id>"}\` or \`{"setup_id":"<agent-id>"}\`; no model call and no mutation. |
48879
49001
  | \`rost_list_skills\` | \`skill.list\` | List tenant Skills with application descriptors, dependency metadata, source status, latest version, and assigned Seat count. Seat-scoped reads are available through \`rost://skills\`. | Tenant-admin | Call with \`{}\` or \`{"query":"invoice"}\`. |
48880
49002
  | \`rost_list_rost_skill_catalog\` | \`skill.catalog\` | List entitled {{brand}} catalog Skills. Private catalog source URLs and credentials stay server-side. | Tenant-admin | Call with \`{}\`; use \`{"include_unentitled":true}\` only to inspect tier availability. |
@@ -49738,11 +49860,11 @@ Resolving Friction should produce one of four outcomes: a decision, a task, a Ch
49738
49860
  order: 70,
49739
49861
  title: "Steward queue guide",
49740
49862
  summary: "How Stewards review escalations, approve agent boundaries, and keep agents accountable.",
49741
- version: "2026-07-04.1",
49863
+ version: "2026-07-16.2",
49742
49864
  public: true,
49743
49865
  audiences: ["human", "cli", "mcp", "in_app_agent"],
49744
49866
  stages: ["staffing", "operating_rhythm"],
49745
- relatedCommandIds: ["charter.approve", "agent.go_live", "confirmation.approve", "confirmation.reject", "escalation.raise", "escalation.list", "escalation.get", "escalation.resolve", "escalation.reject"],
49867
+ relatedCommandIds: ["charter.approve", "agent.go_live", "confirmation.approve", "confirmation.reject", "escalation.raise", "escalation.list", "escalation.get", "escalation.resolve", "escalation.reject", "agent_grant_intervention.list", "agent_grant_intervention.decide", "agent_grant_intervention.resume"],
49746
49868
  legal: {
49747
49869
  publicRisk: "low",
49748
49870
  notes: [
@@ -49783,6 +49905,10 @@ The Steward page itself only lists charter-clause escalations (Queue, Escalation
49783
49905
 
49784
49906
  An escalation reaches you the same way no matter how the agent raised it \u2014 in a chat or CLI session, or on its own scheduled cloud run. When the agent stops at a boundary it opens the queue item and sends a notification to the accountable human along the steward chain, preferring a connected Slack channel and falling back to email. If no human occupies the agent's seat, the chain walks up to the next Steward. Delivery is idempotent: a retried run never notifies you twice for the same escalation, and the notification carries only summarized, redacted evidence \u2014 never secret material.
49785
49907
 
49908
+ ## Safety refusals read distinctly
49909
+
49910
+ When an agent declines a task on safety grounds it raises a first-class **safety refusal**, not a silent stall. The escalation carries a \`category\` of \`safety_refusal\` that every read surface (the queue reads, the CLI/MCP \`escalation.list\`/\`escalation.get\` output, and the steward notification) shows differently from an ordinary held tool call \u2014 the notification reads "refused (safety)" and names that the agent declined and is waiting on you. A cloud run that ends because the agent refused is labeled "declined (safety)" in its run summary rather than reported as a plain success, so a refusal is always visible as a refusal.
49911
+
49786
49912
  ## Where notifications land
49787
49913
 
49788
49914
  Every notification sent to you \u2014 escalations, approval requests, sync briefs, and your daily digest \u2014 also appears in your in-app Inbox, with unread state you can clear. A Slack or email delivery that fails is retried automatically on a bounded schedule; once it can no longer be delivered it stays visible in the Inbox rather than being lost. A once-a-day digest rolls up the day's deliverables, open approvals, and exceptions into a single message, so a quiet day stays quiet and a busy one is summarized in one place.
@@ -49795,6 +49921,16 @@ The Steward reads the queue from any surface but decides as a human.
49795
49921
  - Decide: \`{{cli}} escalation resolve\` / \`escalation.resolve\` and \`{{cli}} escalation reject\` / \`escalation.reject\`. \`escalation.resolve\` and \`escalation.reject\` are \`none\` at the confirmation layer, but they are deliberately NOT exposed over MCP \u2014 \`decisions.decided_by\` must be a human, so there is no \`rost_resolve_escalation\` tool. They are kept human-only by that MCP exclusion plus the human-only \`decided_by\`, not by a confirmation gate. The CLI runs them as the authenticated human; an agent session must hand the decision to a person.
49796
49922
  - Approve gated requests: when an escalation or Charter change produces a pending confirmation, the human approves with \`confirmation.approve\` (or rejects with \`confirmation.reject\`). Go-live runs through \`agent.go_live\`.
49797
49923
 
49924
+ ## Blocked \u2014 awaiting grant
49925
+
49926
+ Sometimes an agent cannot proceed because a specific grant is missing \u2014 a tool capability its Charter does not cover, an OS permission on its Runner, a provider connection that needs reconnecting, or a vaulted credential. When that happens the attempt does not sit paused holding compute: it terminates cleanly, releases its lease, and records a durable "blocked \u2014 awaiting grant" item with the exact missing grant and a bounded checkpoint. The item surfaces on the agent's seat and in Home's "Needs you" band with the specific ask and a one-click grant.
49927
+
49928
+ Granting is a human decision. A one-time grant authorizes the exact action the agent blocked on and nothing more \u2014 it revalidates your current authority and never widens the Charter; if the action changed since it blocked, the stale grant is refused rather than replayed. Choosing to always allow that capability is a separate Charter re-sign, not a one-click action. Declining keeps the checkpoint for audit and creates no continuation. When you grant, a new linked continuation attempt is created from the checkpoint \u2014 the agent resumes from where it stopped, not from the start.
49929
+
49930
+ - Read: \`{{cli}} command run agent_grant_intervention.list --json\` / \`agent_grant_intervention.list\` \u2014 the open blocked items with their blocker kind, missing grant, and checkpoint (secret-scrubbed metadata only).
49931
+ - Grant or decline: \`agent_grant_intervention.decide\` (\`action: grant\` or \`decline\`). A grant writes your decision (\`decisions.decided_by\` is you) and enqueues the continuation; a permanent grant returns \`requires_charter_resign\` so you review and re-sign the Charter instead of widening authority in place.
49932
+ - Resume: \`agent_grant_intervention.resume\` retries only the continuation enqueue for an already-granted item whose enqueue did not complete \u2014 it never re-grants authority.
49933
+
49798
49934
  ## When to stop for confirmation
49799
49935
 
49800
49936
  Every steward decision is the human gate itself. An agent never calls resolve, reject, approve, or go-live on a human's behalf. It prepares evidence and a recommended action and stops. See the confirmations guide.
@@ -52155,6 +52291,9 @@ function parseSemver(value) {
52155
52291
 
52156
52292
  // src/generated/command-manifest.ts
52157
52293
  var COMMAND_MANIFEST = [
52294
+ { "id": "agent_grant_intervention.decide", "namespace": "agent_grant_intervention", "action": "decide", "title": "Decide a blocked agent grant", "description": "Grant (one-time, exact-action) or decline a blocked agent intervention. A grant writes a human decision and enqueues the linked continuation; a permanent grant returns requires_charter_resign rather than widening authority. Human steward/admin only.", "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "intervention_id", "flag": "intervention-id", "type": "string", "required": true }, { "name": "action", "flag": "action", "type": "enum", "required": true, "enumValues": ["grant", "decline"] }, { "name": "grant_kind", "flag": "grant-kind", "type": "enum", "required": false, "enumValues": ["allow_once", "permanent"] }, { "name": "action_digest", "flag": "action-digest", "type": "string", "required": false }, { "name": "rationale", "flag": "rationale", "type": "string", "required": false }], "hasComplexInput": false, "help": "Grant (one-time, exact-action) or decline a blocked agent intervention; a grant writes the human decision and enqueues the linked continuation, a permanent grant returns requires_charter_resign instead of widening authority. Human steward/admin only." },
52295
+ { "id": "agent_grant_intervention.list", "namespace": "agent_grant_intervention", "action": "list", "title": "List blocked-awaiting-grant interventions", "description": "List durable blocked-awaiting-grant agent interventions with their missing grant, blocker kind, checkpoint, and decision state. Returns secret-scrubbed metadata only. A seat-scoped caller is clamped to its own seat.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": false }, { "name": "include_decided", "flag": "include-decided", "type": "boolean", "required": false }], "hasComplexInput": false, "help": "List durable blocked-awaiting-grant agent interventions with the exact missing grant, blocker kind, checkpoint, and decision state. Secret-scrubbed metadata only; a seat-scoped caller is clamped to its own seat." },
52296
+ { "id": "agent_grant_intervention.resume", "namespace": "agent_grant_intervention", "action": "resume", "title": "Resume a granted agent intervention", "description": "Retry ONLY the continuation enqueue for an already-granted blocked intervention whose enqueue did not complete. Never re-grants authority (the one-time grant is already committed). Human steward/admin only.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "intervention_id", "flag": "intervention-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Retry only the continuation enqueue for an already-granted intervention whose enqueue did not complete; never re-grants authority. Human steward/admin only." },
52158
52297
  { "id": "agent_setup.capability_suggestions", "namespace": "agent_setup", "action": "capability_suggestions", "title": "Suggest setup capability grants", "description": "Return deterministic minimum capability suggestions from a stock template and current tenant grant availability. No model call and no authority mutation.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": false }, { "name": "setup_id", "flag": "setup-id", "type": "string", "required": false }], "hasComplexInput": false, "help": "Suggest deterministic minimum capability grants from the setup/template and current tenant grant availability. No model call and no mutation." },
52159
52298
  { "id": "agent_setup.get", "namespace": "agent_setup", "action": "get", "title": "Get agent setup", "description": "Read the resumable agent-setup state: mode, parent, steward, template, lane, schedule, tool decisions, dry run, and next action.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": false }, { "name": "setup_id", "flag": "setup-id", "type": "string", "required": false }], "hasComplexInput": false, "help": "Read the resumable setup state: mode, parent, steward, lane, schedule, tool decisions, dry-run blockers, and the next action." },
52160
52299
  { "id": "agent_setup.relane", "namespace": "agent_setup", "action": "relane", "title": "Re-lane a live agent", "description": "Governed re-lane of a live agent: pause, move to the new lane, force a fresh dry-run rehearsal on that lane, then go live. Owner-only and human-gated; records a rationale.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "lane", "flag": "lane", "type": "enum", "required": true, "enumValues": ["cloud", "mcp_session", "runner"] }, { "name": "reason", "flag": "reason", "type": "string", "required": true }], "hasComplexInput": false, "help": "Re-lane a live agent (cloud / runner / mcp_session): it pauses, moves to the new lane, forces a fresh dry-run rehearsal on that lane, then goes live \u2014 owner-only, human-gated, with a required rationale. A runner target needs a paired runner; a failed rehearsal leaves the agent paused on the new lane." },
@@ -52233,7 +52372,7 @@ var COMMAND_MANIFEST = [
52233
52372
  { "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." },
52234
52373
  { "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." },
52235
52374
  { "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." },
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." },
52375
+ { "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 }, { "name": "category", "flag": "category", "type": "enum", "required": false, "enumValues": ["safety_refusal"] }], "hasComplexInput": true, "help": "Raise an escalation to the seat's Steward when a decision exceeds the seat's authority; humans decide." },
52237
52376
  { "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." },
52238
52377
  { "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
52378
  { "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." },
@@ -53139,6 +53278,9 @@ function renderConfirmationList(output) {
53139
53278
  return `${field(record2, "id")} ${field(record2, "risk_level")} ${field(record2, "command_id")} ${field(record2, "summary")}`;
53140
53279
  }).join("\n");
53141
53280
  }
53281
+ function safetyRefusalTag(record2) {
53282
+ return record2.category === "safety_refusal" ? "[safety refusal] " : "";
53283
+ }
53142
53284
  function renderEscalationList(output) {
53143
53285
  const escalations = asArray(asRecord(output).escalations);
53144
53286
  if (escalations.length === 0) {
@@ -53146,12 +53288,12 @@ function renderEscalationList(output) {
53146
53288
  }
53147
53289
  return escalations.map((escalation) => {
53148
53290
  const record2 = asRecord(escalation);
53149
- return `${field(record2, "id")} ${field(record2, "status")} ${field(record2, "seat_name")}: ${field(record2, "reason")}`;
53291
+ return `${field(record2, "id")} ${field(record2, "status")} ${safetyRefusalTag(record2)}${field(record2, "seat_name")}: ${field(record2, "reason")}`;
53150
53292
  }).join("\n");
53151
53293
  }
53152
53294
  function renderEscalationGet(output) {
53153
53295
  const record2 = asRecord(asRecord(output).escalation);
53154
- return `${field(record2, "id")} ${field(record2, "status")} ${field(record2, "seat_name")}
53296
+ return `${field(record2, "id")} ${field(record2, "status")} ${safetyRefusalTag(record2)}${field(record2, "seat_name")}
53155
53297
  reason: ${field(record2, "reason")}
53156
53298
  recommended: ${field(record2, "recommended_action")}`;
53157
53299
  }