@rosthq/cli 0.7.90 → 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":"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(),
@@ -48242,7 +48259,7 @@ External connectors are being rolled out provider by provider, conservatively (r
48242
48259
  order: 48,
48243
48260
  title: "CLI and MCP installation guide",
48244
48261
  summary: "Install the public CLI, register remote token-backed MCP clients, and find the full command and tool catalog.",
48245
- version: "2026-07-16.4",
48262
+ version: "2026-07-16.5",
48246
48263
  public: true,
48247
48264
  audiences: ["human", "cli", "mcp", "in_app_agent"],
48248
48265
  stages: ["company_setup", "staffing"],
@@ -48957,8 +48974,8 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
48957
48974
  | \`rost_start_sync_run\` | \`sync.run.start\` | Ensure a Sync Brief exists so the meeting can begin. | Tenant | Call with \`{}\`. |
48958
48975
  | \`rost_complete_sync_run\` | \`sync.run.complete\` | Record that the Sync meeting completed (idempotent). | Tenant | Call with \`{"sync_brief_id":"<id>"}\`. |
48959
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. |
48960
- | \`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}\`. |
48961
- | \`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. |
48962
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. |
48963
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 \`{}\`. |
48964
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 \`{}\`. |
@@ -49843,7 +49860,7 @@ Resolving Friction should produce one of four outcomes: a decision, a task, a Ch
49843
49860
  order: 70,
49844
49861
  title: "Steward queue guide",
49845
49862
  summary: "How Stewards review escalations, approve agent boundaries, and keep agents accountable.",
49846
- version: "2026-07-16.1",
49863
+ version: "2026-07-16.2",
49847
49864
  public: true,
49848
49865
  audiences: ["human", "cli", "mcp", "in_app_agent"],
49849
49866
  stages: ["staffing", "operating_rhythm"],
@@ -49888,6 +49905,10 @@ The Steward page itself only lists charter-clause escalations (Queue, Escalation
49888
49905
 
49889
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.
49890
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
+
49891
49912
  ## Where notifications land
49892
49913
 
49893
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.
@@ -52351,7 +52372,7 @@ var COMMAND_MANIFEST = [
52351
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." },
52352
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." },
52353
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." },
52354
- { "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." },
52355
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." },
52356
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." },
52357
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." },
@@ -53257,6 +53278,9 @@ function renderConfirmationList(output) {
53257
53278
  return `${field(record2, "id")} ${field(record2, "risk_level")} ${field(record2, "command_id")} ${field(record2, "summary")}`;
53258
53279
  }).join("\n");
53259
53280
  }
53281
+ function safetyRefusalTag(record2) {
53282
+ return record2.category === "safety_refusal" ? "[safety refusal] " : "";
53283
+ }
53260
53284
  function renderEscalationList(output) {
53261
53285
  const escalations = asArray(asRecord(output).escalations);
53262
53286
  if (escalations.length === 0) {
@@ -53264,12 +53288,12 @@ function renderEscalationList(output) {
53264
53288
  }
53265
53289
  return escalations.map((escalation) => {
53266
53290
  const record2 = asRecord(escalation);
53267
- 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")}`;
53268
53292
  }).join("\n");
53269
53293
  }
53270
53294
  function renderEscalationGet(output) {
53271
53295
  const record2 = asRecord(asRecord(output).escalation);
53272
- 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")}
53273
53297
  reason: ${field(record2, "reason")}
53274
53298
  recommended: ${field(record2, "recommended_action")}`;
53275
53299
  }