@rosthq/cli 0.7.104 → 0.7.106

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -44185,10 +44185,15 @@ var workOrderListOutputSchema = external_exports.object({
44185
44185
  var workOrderEnqueueInputSchema = external_exports.object({
44186
44186
  agent_id: uuid8,
44187
44187
  scheduled_for: isoDateTime6.optional(),
44188
+ // DER-1973: cloud-lane only. A runner-lane agent rejects a task_id at enqueue —
44189
+ // a task-linked runner order is structurally unclaimable (the runner-claim SQL
44190
+ // requires task_id is null). Run task-linked runner work as an interactive agent turn.
44188
44191
  task_id: uuid8.optional()
44189
44192
  }).strict();
44190
44193
  var agentRunNowInputSchema = external_exports.object({
44191
44194
  seat_id: uuid8,
44195
+ // DER-1973: cloud-lane only. A runner-lane agent rejects a task_id at enqueue
44196
+ // (structurally unclaimable). Run task-linked runner work as an interactive agent turn.
44192
44197
  task_id: uuid8.optional()
44193
44198
  }).strict();
44194
44199
  var agentRunNowOutputSchema = external_exports.object({
@@ -46733,22 +46738,32 @@ var provisioningEventPayloadSchema = authoritativePrefixUnion(
46733
46738
  // permissive branches unchanged, preserving parse-compat with stored rows.
46734
46739
  [{ prefix: "invite.", strict: inviteLifecycleEventPayloadSchema }]
46735
46740
  );
46741
+ function rejectNonProvisioningInviteAction(payload, ctx) {
46742
+ const action = payload.action;
46743
+ if (typeof action === "string" && action.startsWith("invite.")) {
46744
+ ctx.addIssue({
46745
+ code: external_exports.ZodIssueCode.custom,
46746
+ path: ["action"],
46747
+ message: `invite.* event payloads are only valid under a "provisioning" envelope, not this internal event type (DER-2049).`
46748
+ });
46749
+ }
46750
+ }
46736
46751
  var decisionEventPayloadSchema = external_exports.union([
46737
46752
  actionEventPayloadSchema,
46738
46753
  internalEventObjectSchema
46739
- ]);
46754
+ ]).superRefine(rejectNonProvisioningInviteAction);
46740
46755
  var systemEventPayloadSchema = external_exports.union([
46741
46756
  actionEventPayloadSchema,
46742
46757
  internalEventObjectSchema
46743
- ]);
46758
+ ]).superRefine(rejectNonProvisioningInviteAction);
46744
46759
  var charterEventPayloadSchema = external_exports.union([
46745
46760
  actionEventPayloadSchema,
46746
46761
  internalEventObjectSchema
46747
- ]);
46762
+ ]).superRefine(rejectNonProvisioningInviteAction);
46748
46763
  var taskEventPayloadSchema = external_exports.union([
46749
46764
  actionEventPayloadSchema,
46750
46765
  internalEventObjectSchema
46751
- ]);
46766
+ ]).superRefine(rejectNonProvisioningInviteAction);
46752
46767
 
46753
46768
  // ../../packages/protocol/src/held-tool-action.ts
46754
46769
  var heldToolActionReplaySchema = external_exports.object({
@@ -47435,17 +47450,44 @@ var intakeEventEnvelopeSchema = eventEnvelopeBaseSchema.extend({
47435
47450
  type: external_exports.literal("intake"),
47436
47451
  payload: intakeEventPayloadSchema
47437
47452
  }).strict();
47438
- var internalEventEnvelopeSchema = eventEnvelopeBaseSchema.extend({
47439
- type: external_exports.enum(["decision", "provisioning", "system", "charter", "task"]),
47440
- payload: internalEventWriterPayloadSchema
47453
+ var decisionEventEnvelopeSchema = eventEnvelopeBaseSchema.extend({
47454
+ type: external_exports.literal("decision"),
47455
+ payload: decisionEventPayloadSchema
47456
+ }).strict();
47457
+ var provisioningEventEnvelopeSchema = eventEnvelopeBaseSchema.extend({
47458
+ type: external_exports.literal("provisioning"),
47459
+ payload: provisioningEventPayloadSchema
47460
+ }).strict();
47461
+ var systemEventEnvelopeSchema = eventEnvelopeBaseSchema.extend({
47462
+ type: external_exports.literal("system"),
47463
+ payload: systemEventPayloadSchema
47464
+ }).strict();
47465
+ var charterEventEnvelopeSchema = eventEnvelopeBaseSchema.extend({
47466
+ type: external_exports.literal("charter"),
47467
+ payload: charterEventPayloadSchema
47441
47468
  }).strict();
47469
+ var taskEventEnvelopeSchema = eventEnvelopeBaseSchema.extend({
47470
+ type: external_exports.literal("task"),
47471
+ payload: taskEventPayloadSchema
47472
+ }).strict();
47473
+ var internalEventEnvelopeSchema = external_exports.discriminatedUnion("type", [
47474
+ decisionEventEnvelopeSchema,
47475
+ provisioningEventEnvelopeSchema,
47476
+ systemEventEnvelopeSchema,
47477
+ charterEventEnvelopeSchema,
47478
+ taskEventEnvelopeSchema
47479
+ ]);
47442
47480
  var eventEnvelopeSchema = external_exports.discriminatedUnion("type", [
47443
47481
  statusEventEnvelopeSchema,
47444
47482
  handoffEventEnvelopeSchema,
47445
47483
  escalationEventEnvelopeSchema,
47446
47484
  issueEventEnvelopeSchema,
47447
47485
  intakeEventEnvelopeSchema,
47448
- internalEventEnvelopeSchema
47486
+ decisionEventEnvelopeSchema,
47487
+ provisioningEventEnvelopeSchema,
47488
+ systemEventEnvelopeSchema,
47489
+ charterEventEnvelopeSchema,
47490
+ taskEventEnvelopeSchema
47449
47491
  ]);
47450
47492
  var eventEnvelopeReaderBaseSchema = eventEnvelopeBaseSchema.passthrough();
47451
47493
  var statusEventEnvelopeReaderSchema = eventEnvelopeReaderBaseSchema.extend({
@@ -48521,11 +48563,11 @@ Use the lower-level commands after health names a finding: \`agent.get_run\` for
48521
48563
  order: 46,
48522
48564
  title: "Tool access and vault",
48523
48565
  summary: "How to give agents access to tools without exposing raw credentials or expanding authority by accident.",
48524
- version: "2026-07-14.1",
48566
+ version: "2026-07-19.1",
48525
48567
  public: true,
48526
48568
  audiences: ["human", "cli", "mcp", "in_app_agent"],
48527
48569
  stages: ["staffing"],
48528
- relatedCommandIds: ["charter.sign_manifest", "credential.ingress", "agent.configure_tools", "integration.connect_rest", "integration.list", "integration.readiness", "integration.status", "integration.test", "mcp_token.create", "mcp_token.revoke", "mcp_token.list", "confirmation.approve"],
48570
+ relatedCommandIds: ["charter.sign_manifest", "charter.set", "charter.update_draft", "credential.ingress", "agent.configure_tools", "integration.connect_rest", "integration.list", "integration.readiness", "integration.status", "integration.test", "mcp_token.create", "mcp_token.revoke", "mcp_token.list", "confirmation.approve"],
48529
48571
  legal: {
48530
48572
  publicRisk: "low",
48531
48573
  notes: [
@@ -48597,6 +48639,12 @@ There is exactly one way to give a connected tool its credential, and it is the
48597
48639
  - Must-escalate cases are stated.
48598
48640
  - The tool provider and credential name are enough for audit; secret values are not displayed.
48599
48641
 
48642
+ ## Change tool access after go-live
48643
+
48644
+ Tool access on a live seat is part of its signed Charter, so changing it is a governed amendment, not an in-place edit. You can make the change from the agent detail page without leaving it: the Tools tab's manage-tools drawer edits the permission manifest directly \u2014 grant or revoke a tool, adjust its scope tier, or add an available tool from the catalog. Your edits are staged as one confirmation that lands in Approvals with a plain summary of what changes ("grants work.record (draft) \xB7 revokes email.draft"). Approving that confirmation is the re-sign: it creates a new Charter version that supersedes the prior one, and the tool guard honors the new manifest on the next run. Nothing changes until a human approves \u2014 selecting a tool never grants access on its own.
48645
+
48646
+ The charter builder's amendment mode edits the same manifest for a draft Charter (toggle a tool's grant or scope tier), staged into the draft; the draft stays inert until the existing sign or go-live step. If a seat already has an amendment draft open, finish it in the charter editor rather than staging a separate tool change from the drawer.
48647
+
48600
48648
  ## Connect tools and credentials from CLI or MCP
48601
48649
 
48602
48650
  - Stage tools on a draft agent: \`agent.configure_tools\` / \`rost_configure_agent_tools\` \u2014 connect or decline proposed tools and stage credential-ingress requests. Pass vault references, never raw secret material.
@@ -48669,7 +48717,7 @@ External connectors are being rolled out provider by provider, conservatively (r
48669
48717
  order: 48,
48670
48718
  title: "CLI and MCP installation guide",
48671
48719
  summary: "Install the public CLI, register remote token-backed MCP clients, and find the full command and tool catalog.",
48672
- version: "2026-07-18.4",
48720
+ version: "2026-07-19.1",
48673
48721
  public: true,
48674
48722
  audiences: ["human", "cli", "mcp", "in_app_agent"],
48675
48723
  stages: ["company_setup", "staffing"],
@@ -49214,6 +49262,14 @@ These read-only tools are available to any valid MCP token (like the reference t
49214
49262
 
49215
49263
  The equivalent CLI verbs are \`{{cli}} command schema <id>\` and \`{{cli}} command list\`. The discoverable tool catalog is \`{{cli}} tools list\` (MCP \`rost_list_tool_catalog\`, tenant-scoped).
49216
49264
 
49265
+ ### Deferred tool schemas (JIT loading)
49266
+
49267
+ For tokens whose catalog of generated command tools is large, each operating command tool is still advertised in the tool listing by name with a one-line description, but its full input contract is deferred rather than sent up front \u2014 this keeps the default tool listing small for large catalogs. The description names the command's \`command_id\`. To call a deferred tool, first call \`rost_describe_command\` with that \`command_id\` to load its exact input and output contract, then call the tool with the real arguments; the tool is fully callable either way, only the delivery of that contract is deferred.
49268
+
49269
+ Deferral is threshold-gated: small catalogs keep their full per-command contracts with no change in behavior. The pinned core seat tools (\`rost_get_context\`, \`rost_escalate\`, \`rost_report_status\`, and the task tools \`rost_get_tasks\`, \`rost_accept_task\`, \`rost_decline_task\`, \`rost_complete_task\`) and the reference and discovery tools are never deferred.
49270
+
49271
+ Deferring a contract changes only what is advertised in \`tools/list\`. Authorization is unaffected: every call still passes the server-side guard against the seat's signed permission manifest and writes its audit row, exactly as described above \u2014 visibility into a tool's arguments is never a security control.
49272
+
49217
49273
  ### Public reference tools and resources
49218
49274
 
49219
49275
  | Tool or resource | Purpose | Scope | Safe example |
@@ -50197,7 +50253,7 @@ Agents may record readings when the Charter allows it. Agent-reported readings s
50197
50253
  order: 62,
50198
50254
  title: "Friction guide",
50199
50255
  summary: "How to capture issues with evidence, rank them, and resolve them without losing ownership.",
50200
- version: "2026-07-18.1",
50256
+ version: "2026-07-19.1",
50201
50257
  public: true,
50202
50258
  audiences: ["human", "cli", "mcp", "in_app_agent"],
50203
50259
  stages: ["operating_rhythm"],
@@ -50270,7 +50326,7 @@ In the app, the Tasks surface exposes the same queue operations for a seat's vis
50270
50326
 
50271
50327
  ## When to stop for confirmation
50272
50328
 
50273
- \`friction.resolve\` is \`human_required\`; resolving an issue is a human decision. \`friction.link_task\`, \`task.create\`, \`task.accept\`, \`task.decline\`, \`task.confirm_proposal\`, \`task.decline_proposal\`, and \`task.complete\` are \`none\`, so they do not mint pending confirmations. The proposal decision commands still require a human actor with target-side authority and are app/CLI-only, not MCP-exposed; they are not agent-callable approval shortcuts. \`friction.update_status\`, \`escalation.raise\`, \`friction.file_issue\`, and \`friction.list\` are also not gated. An agent files Friction, proposes the task, and escalates; a human resolves or decides the proposed commitment.
50329
+ \`friction.resolve\` is \`human_required\`; resolving an issue is a human decision. Resolve authority is role-scoped: an owner or admin may resolve any issue tenant-wide, while any other member may resolve only issues raised by a seat they occupy or a downstream seat in the Responsibility Graph (their seat subtree). \`friction.link_task\`, \`task.create\`, \`task.accept\`, \`task.decline\`, \`task.confirm_proposal\`, \`task.decline_proposal\`, and \`task.complete\` are \`none\`, so they do not mint pending confirmations. The proposal decision commands still require a human actor with target-side authority and are app/CLI-only, not MCP-exposed; they are not agent-callable approval shortcuts. \`friction.update_status\`, \`escalation.raise\`, \`friction.file_issue\`, and \`friction.list\` are also not gated. An agent files Friction, proposes the task, and escalates; a human resolves or decides the proposed commitment.
50274
50330
 
50275
50331
  ## Resolution rule
50276
50332
 
@@ -50749,7 +50805,7 @@ Every notification should include the seat, cause, evidence, and requested decis
50749
50805
  order: 75,
50750
50806
  title: "Local runner guide",
50751
50807
  summary: "How local agent sessions and runner surfaces should operate through {{brand}} without bypassing Charters or audit.",
50752
- version: "2026-07-16.1",
50808
+ version: "2026-07-18.1",
50753
50809
  public: true,
50754
50810
  audiences: ["human", "cli", "mcp", "in_app_agent"],
50755
50811
  stages: ["staffing", "operating_rhythm"],
@@ -50829,7 +50885,7 @@ A Forge turn should load its context in one order: build context first, then Ski
50829
50885
  - Inspect: \`{{cli}} runner list --json\` / \`runner.list\` / \`rost_list_runners\` shows heartbeat state plus execution readiness. A runner is execute-ready only when it has a live heartbeat, a detected local Claude or Codex runtime, and recent claim/result evidence or active queue processing. Settings and runner status/list surfaces also project the runner CLI version, sandbox posture, network posture, and reported capability set from heartbeat so operators can see whether the machine is current and still running with the expected guardrails. \`{{cli}} runner status\` / \`runner.status\` / \`rost_runner_status\` reads one runner with the same execution detail, due queue count, claimed/running counts, and recent result timestamps. Both surfaces also project a \`capacity\` view: the runner's active model-account alias, a badge state (\`available\`, \`near_cap\`, \`exhausted\`, or \`unknown\`), a rate-limited-until timestamp when the harness has classified one, and a fresh/stale refreshability flag mirroring heartbeat recency. The badge reads \`unknown\` \u2014 never a fabricated \`available\` \u2014 whenever no capacity observation has been recorded yet or the runner reported a state {{brand}} does not recognize; real 5-hour/weekly usage percentages and reset timestamps are not collected yet, so this view never claims a percentage it does not have. Settings > Connected machines and the Health dashboard's Connectivity tile (a fleet-wide near-cap/at-limit count) surface the same signal.
50830
50886
  - Diagnose (DER-949): \`{{cli}} runner diagnose --runner-id <id>\` / \`runner.diagnose\` / \`rost_diagnose_runner\` returns health, capabilities, and repair guidance without exposing secrets. Use when a runner is offline or stale to get actionable next steps.
50831
50887
  - Repair steps (DER-949): \`{{cli}} runner repair --runner-id <id> [--issue restart|re_pair|revoke_stale|missing_cli_runtime]\` / \`runner.repair\` / \`rost_repair_runner\` returns focused repair instructions. The optional \`issue\` flag narrows to a specific kind of repair (restart the app, re-pair, revoke a stale runner, or install a missing CLI runtime).
50832
- - Work orders: \`{{cli}} runner work-orders\` / \`work_order.list\` / \`rost_list_work_orders\`; queue with \`work_order.enqueue\` / \`rost_enqueue_work_order\` for a live scheduled agent, or use \`agent.run_now\` / \`rost_run_agent_now\` when an operator wants the product to queue and dispatch an immediate live run from a seat id; cancel with \`work_order.cancel\` / \`rost_cancel_work_order\`. The operator Settings page mirrors queued, claimed, running, and recent completed runner evidence so online does not imply can execute.
50888
+ - Work orders: \`{{cli}} runner work-orders\` / \`work_order.list\` / \`rost_list_work_orders\`; queue with \`work_order.enqueue\` / \`rost_enqueue_work_order\` for a live scheduled agent, or use \`agent.run_now\` / \`rost_run_agent_now\` when an operator wants the product to queue and dispatch an immediate live run from a seat id; cancel with \`work_order.cancel\` / \`rost_cancel_work_order\`. The operator Settings page mirrors queued, claimed, running, and recent completed runner evidence so online does not imply can execute. \`task_id\` on either enqueue command is cloud-lane only: a runner-lane agent rejects it, because a task-linked runner work order is structurally unclaimable \u2014 run task-linked runner work as an interactive agent turn (see Interactive AICOS runner turns above), not through the scheduled work-order lane.
50833
50889
  - Revoke: \`{{cli}} runner revoke\` / \`runner.revoke\` / \`rost_revoke_runner\` so a runner can no longer authenticate.
50834
50890
 
50835
50891
  ## Owner-initiated headless pairing
@@ -52742,7 +52798,7 @@ var COMMAND_MANIFEST = [
52742
52798
  { "id": "agent.resume", "namespace": "agent", "action": "resume", "title": "Resume agent", "description": "Resume a paused agent back to live. Blocks if the steward chain no longer resolves to a human.", "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "reason", "flag": "reason", "type": "string", "required": false }], "hasComplexInput": false, "help": "Resume a paused agent back to live; the no-orphan guard blocks a resume whose steward chain no longer resolves to a human." },
52743
52799
  { "id": "agent.run_dry_run", "namespace": "agent", "action": "run_dry_run", "title": "Run agent dry run", "description": "Run the sandbox dry run for a draft agent. Durable and idempotent per Charter version; a passed result is reused, never re-run.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "charter_version_id", "flag": "charter-version-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Run the sandbox dry run for a draft agent after the manifest is signed; the result is durable and idempotent per Charter version, and a passed run is reused.", "example": { "seat_id": "0190aaaa-aaaa-7aaa-8aaa-aaaaaaaaaaaa", "charter_version_id": "0190cccc-cccc-7ccc-8ccc-cccccccccccc" } },
52744
52800
  { "id": "agent.run_heartbeats", "namespace": "agent", "action": "run_heartbeats", "title": "Get run heartbeats", "description": "Reads the per-seat run-heartbeat roll-up (quiet-but-healthy vs stalled) for long-running agent programs.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_ids", "flag": "seat-ids", "type": "array", "required": false, "itemType": "string" }], "hasComplexInput": false, "help": "Read the per-seat run-heartbeat roll-up to tell a quiet-but-healthy long-running agent program apart from a stalled one." },
52745
- { "id": "agent.run_now", "namespace": "agent", "action": "run_now", "title": "Run agent now", "description": "Queue and dispatch an immediate work order for a live cloud or runner agent on a seat.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "task_id", "flag": "task-id", "type": "string", "required": false }], "hasComplexInput": false, "help": "Queue and dispatch an immediate live agent run without changing the agent's saved schedule." },
52801
+ { "id": "agent.run_now", "namespace": "agent", "action": "run_now", "title": "Run agent now", "description": "Queue and dispatch an immediate work order for a live cloud or runner agent on a seat. task_id is cloud-lane only; a runner-lane agent rejects it.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "task_id", "flag": "task-id", "type": "string", "required": false }], "hasComplexInput": false, "help": "Queue and dispatch an immediate live agent run without changing the agent's saved schedule. task_id is cloud-lane only; a runner-lane agent rejects it (run task-linked runner work as an interactive agent turn)." },
52746
52802
  { "id": "agent.show_markdown", "namespace": "agent", "action": "show_markdown", "title": "Show agent setup as markdown", "description": "Compose a seat's agent setup, steward, model, tools, and Charter into a clean, human-skimmable markdown card for review.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Render a seat's agent setup, model, steward, tools, and Charter as a clean markdown card to show your human a quick review." },
52747
52803
  { "id": "agent.status", "namespace": "agent", "action": "status", "title": "Get agent status", "description": "Return the agent occupancy, lane, schedule, live/offline state, steward chain, dry-run result, and Runner availability for a seat.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Check an agent's lane, live state, steward chain, dry-run result, and Runner availability before relying on it." },
52748
52804
  { "id": "agent.trust.create", "namespace": "agent", "action": "trust.create", "title": "Create agent Trusted grant", "description": "Create a bounded Trusted execution grant for a live agent after a human steward/admin signs the current activation receipt digest.", "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "agent_id", "flag": "agent-id", "type": "string", "required": true }, { "name": "expected_scope_digest", "flag": "expected-scope-digest", "type": "string", "required": true }, { "name": "budget_cents", "flag": "budget-cents", "type": "integer", "required": true }, { "name": "expires_at", "flag": "expires-at", "type": "string", "required": false }, { "name": "reason", "flag": "reason", "type": "string", "required": false }], "hasComplexInput": false, "help": "Create a bounded Trusted execution grant only after reviewing the activation receipt digest, budget, and always-human boundary. Human steward/admin only." },
@@ -52813,7 +52869,7 @@ var COMMAND_MANIFEST = [
52813
52869
  { "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." },
52814
52870
  { "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." },
52815
52871
  { "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." },
52816
- { "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." },
52872
+ { "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", "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." },
52817
52873
  { "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." },
52818
52874
  { "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." },
52819
52875
  { "id": "gate.decide", "namespace": "gate", "action": "decide", "title": "Decide a conversational gate", "description": "A human approves or rejects a conversational gate bound to an artifact digest (a prototype URL, deliverable, or artifact). The agent drafts the decision and the human confirms it; the resolver is always a human (invariant #7). On approval the artifact must be unchanged since the gate was drafted \u2014 a stale digest re-blocks. Requires confirmation.", "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "subject_kind", "flag": "subject-kind", "type": "enum", "required": true, "enumValues": ["prototype", "deliverable", "artifact"] }, { "name": "subject_id", "flag": "subject-id", "type": "string", "required": true }, { "name": "artifact_digest", "flag": "artifact-digest", "type": "string", "required": true }, { "name": "decision", "flag": "decision", "type": "enum", "required": true, "enumValues": ["approve", "reject"] }, { "name": "ask", "flag": "ask", "type": "string", "required": true }, { "name": "consequence", "flag": "consequence", "type": "string", "required": true }, { "name": "unblocked_targets", "flag": "unblocked-targets", "type": "array", "required": false, "itemType": "string" }, { "name": "rationale", "flag": "rationale", "type": "string", "required": false }], "hasComplexInput": true, "help": "A human approves or rejects a conversational gate bound to an artifact digest; the agent drafts, the human confirms (invariant #7)." },
@@ -52992,7 +53048,7 @@ var COMMAND_MANIFEST = [
52992
53048
  { "id": "user.use_tenant", "namespace": "user", "action": "use_tenant", "title": "Select tenant", "description": "Validate and return an active tenant selection for the authenticated CLI user.", "requiredScope": "user", "confirmation": "none", "exposeOverMcp": false, "fields": [{ "name": "tenant", "flag": "tenant", "type": "string", "required": true }], "hasComplexInput": false, "help": "Set the active tenant explicitly before running onboarding, graph, Charter, or staffing commands." },
52993
53049
  { "id": "user.whoami", "namespace": "user", "action": "whoami", "title": "Who am I", "description": "Return the authenticated CLI user and accessible tenant roles.", "requiredScope": "user", "confirmation": "none", "exposeOverMcp": false, "fields": [], "hasComplexInput": false, "help": "Use session identity checks before making tenant-scoped recommendations or setup changes." },
52994
53050
  { "id": "work_order.cancel", "namespace": "work_order", "action": "cancel", "title": "Cancel work order", "description": "Cancel a queued, claimed, or running work order. Already-terminal orders return a stable error.", "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "work_order_id", "flag": "work-order-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Cancel a queued, claimed, or running work order; this is a human-gated action." },
52995
- { "id": "work_order.enqueue", "namespace": "work_order", "action": "enqueue", "title": "Enqueue work order", "description": "Queue a work order for a live scheduled agent. Idempotent per (agent, scheduled time).", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "agent_id", "flag": "agent-id", "type": "string", "required": true }, { "name": "scheduled_for", "flag": "scheduled-for", "type": "string", "required": false }, { "name": "task_id", "flag": "task-id", "type": "string", "required": false }], "hasComplexInput": false, "help": "Queue a work order for a live scheduled agent; enqueue is idempotent per agent and scheduled time." },
53051
+ { "id": "work_order.enqueue", "namespace": "work_order", "action": "enqueue", "title": "Enqueue work order", "description": "Queue a work order for a live scheduled agent. Idempotent per (agent, scheduled time). task_id is cloud-lane only; a runner-lane agent rejects it.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "agent_id", "flag": "agent-id", "type": "string", "required": true }, { "name": "scheduled_for", "flag": "scheduled-for", "type": "string", "required": false }, { "name": "task_id", "flag": "task-id", "type": "string", "required": false }], "hasComplexInput": false, "help": "Queue a work order for a live scheduled agent; enqueue is idempotent per agent and scheduled time. task_id is cloud-lane only; a runner-lane agent rejects it (run task-linked runner work as an interactive agent turn)." },
52996
53052
  { "id": "work_order.list", "namespace": "work_order", "action": "list", "title": "List work orders", "description": "List runner/cloud work orders for the tenant, optionally filtered by status, agent, or runner.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "status", "flag": "status", "type": "enum", "required": false, "enumValues": ["queued", "claimed", "running", "done", "failed", "expired"] }, { "name": "agent_id", "flag": "agent-id", "type": "string", "required": false }, { "name": "runner_id", "flag": "runner-id", "type": "string", "required": false }, { "name": "limit", "flag": "limit", "type": "integer", "required": false }], "hasComplexInput": false, "help": "Inspect queued, claimed, running, and expired work orders to understand runner activity." },
52997
53053
  { "id": "work.list", "namespace": "work", "action": "list", "title": "List work records", "description": "List the acting seat's work-ledger records newest-first (keyset-paginated), filterable by verb, object kind/ref, outcome, or run. Superseded records are hidden unless include_superseded is set.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "verb", "flag": "verb", "type": "enum", "required": false, "enumValues": ["created", "updated", "removed", "sent", "received", "contacted", "replied", "offered", "accepted", "rejected", "assessed", "announced", "assigned", "invited", "flagged", "booked", "searched", "filed", "extracted", "escalated"] }, { "name": "outcome", "flag": "outcome", "type": "enum", "required": false, "enumValues": ["success", "warning", "error", "held"] }, { "name": "object_kind", "flag": "object-kind", "type": "string", "required": false }, { "name": "object_external_id", "flag": "object-external-id", "type": "string", "required": false }, { "name": "run_id", "flag": "run-id", "type": "string", "required": false }, { "name": "seat_id", "flag": "seat-id", "type": "string", "required": false }, { "name": "include_superseded", "flag": "include-superseded", "type": "boolean", "required": false }, { "name": "limit", "flag": "limit", "type": "integer", "required": false }, { "name": "cursor", "flag": "cursor", "type": "string", "required": false }], "hasComplexInput": false, "help": "List the seat's work-ledger records newest-first with keyset pagination, filterable by verb, object, outcome, or run." },
52998
53054
  { "id": "work.log", "namespace": "work", "action": "log", "title": "Log work", "description": "Write a lightweight activity breadcrumb event for the acting seat.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "note", "flag": "note", "type": "string", "required": true }], "hasComplexInput": false, "help": "Log a lightweight work breadcrumb so the seat's activity is visible without durable side effects." },