@rosthq/cli 0.5.13 → 0.5.15

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
@@ -41752,7 +41752,7 @@ When operating through CLI or MCP, create fewer seats first and ask for confirma
41752
41752
  order: 30,
41753
41753
  title: "Charter design playbook",
41754
41754
  summary: "How to draft strong Charters that work for human, agent, and hybrid seats.",
41755
- version: "2026-06-13.1",
41755
+ version: "2026-06-20.1",
41756
41756
  public: true,
41757
41757
  audiences: ["human", "cli", "mcp", "in_app_agent"],
41758
41758
  stages: ["charter_design", "staffing"],
@@ -41809,6 +41809,8 @@ List and read first, then draft, then leave activation to a human.
41809
41809
  - Draft one: \`{{cli}} command charter.draft --json '{"seat_id":"<seat-id>"}'\` (scope: seat or tenant-admin); draft every eligible seat with \`charter.draft_all\` / \`rost_draft_all_charters\`. Draft commands are not gated \u2014 they produce a draft \`charter_version_id\`. \`charter.draft_all\` only drafts **active** seats and returns the real result: \`{ drafted, skipped, draft_ids, skipped_seats: [{ seat_id, reason }] }\` where \`reason\` is \`seat_not_active\` (the seat is still draft/vacant \u2014 confirm it first) or \`charter_exists\` (it already has a draft/active Charter). Read \`skipped_seats\` to see why a freshly-built graph drafted fewer Charters than it has seats.
41810
41810
  - Edit a draft: \`charter.update_draft\` / \`rost_update_charter_draft\` with the \`charter_version_id\` and the new \`doc\`.
41811
41811
 
41812
+ In the app, \`/charters\` is both a drafting queue and a governance library. It shows active Charters, draft amendments, seats missing Charters, unsigned manifests, and steward-review gaps. Opening a live Charter is a review mode: read the active version, inspect its governance state, and open an amendment draft when the job needs to change. Active Charter content is never silently edited in place.
41813
+
41812
41814
  ## When to stop for confirmation
41813
41815
 
41814
41816
  \`charter.approve\`, \`charter.skip\`, \`charter.apply_seat_type_recommendation\`, and \`charter.sign_manifest\` are \`human_required\`. Over MCP \`rost_approve_charter\` returns a pending confirmation, not an activation. Approving a Charter, signing a permission manifest, or expanding authority is a human act recorded against \`decided_by\`. An agent prepares the draft and surfaces the approve link; it does not approve. See the confirmations guide.
@@ -41896,7 +41898,7 @@ No orphan agents. No raw secrets in prompts, logs, or tool arguments. No durable
41896
41898
  order: 41,
41897
41899
  title: "Add agents to your Responsibility Graph",
41898
41900
  summary: "The visual journey for adding an agent seat: where to start, choosing a mode, placing the seat, naming a Steward, setup, the safety gates, and go-live.",
41899
- version: "2026-06-18.1",
41901
+ version: "2026-06-20.1",
41900
41902
  public: true,
41901
41903
  audiences: ["human", "in_app_agent"],
41902
41904
  stages: ["staffing"],
@@ -42051,7 +42053,7 @@ The dry run is a real sandbox rehearsal, not a stamp. It executes a mock-provide
42051
42053
  order: 80,
42052
42054
  title: "Sync rhythm playbook",
42053
42055
  summary: "How Signal, Friction, Cascade, and Sync Briefs turn weekly meetings into decision time.",
42054
- version: "2026-06-18.1",
42056
+ version: "2026-06-20.1",
42055
42057
  public: true,
42056
42058
  audiences: ["human", "cli", "mcp", "in_app_agent"],
42057
42059
  stages: ["operating_rhythm"],
@@ -42121,7 +42123,7 @@ Decisions should be recorded as human decisions. Handoffs should attach to seats
42121
42123
  order: 45,
42122
42124
  title: "How agents work",
42123
42125
  summary: "How {{brand}} agents operate inside seats, use Charters, report work, and escalate beyond authority.",
42124
- version: "2026-06-20.1",
42126
+ version: "2026-06-20.3",
42125
42127
  public: true,
42126
42128
  audiences: ["human", "cli", "mcp", "in_app_agent"],
42127
42129
  stages: ["staffing", "operating_rhythm"],
@@ -42130,6 +42132,7 @@ Decisions should be recorded as human decisions. Handoffs should attach to seats
42130
42132
  "agent.go_live",
42131
42133
  "agent.status",
42132
42134
  "agent.list_fleet",
42135
+ "agent.fleet_digest",
42133
42136
  "agent_setup.get",
42134
42137
  "agent_setup.update",
42135
42138
  "agent.decommission",
@@ -42204,24 +42207,28 @@ The model is only ever offered the tools the seat's manifest grants \u2014 a den
42204
42207
  3. The action runs bound to the seat's vaulted credential. The secret stays inside the call and never reaches the result, the audit row, the logs, or the model.
42205
42208
  4. Every call \u2014 allowed, denied, escalated, or invalid \u2014 writes a tool-call audit row you can review.
42206
42209
 
42210
+ When operational evidence appears in the app, it is formatted for review instead of shown as primary raw JSON. Tool arguments, escalation evidence, status evidence, Sync inputs, and task context are summarized as labeled fields; secret-looking values stay redacted. Raw identifiers remain available only as supporting detail when they help an operator trace the record.
42211
+
42207
42212
  Provider requests carry only the model payload the runtime needs; run attribution, tenant attribution, usage, and cost are recorded in {{brand}} audit tables after the call, not sent as custom provider metadata.
42208
42213
 
42209
42214
  Before an agent goes live, the sandbox dry run rehearses this against fake data and returns a per-tool preview: for each tool the agent would touch, whether it would run it, would be blocked, or would escalate \u2014 no external side effect. Review that preview before you approve go-live.
42210
42215
 
42211
42216
  ## What humans should review
42212
42217
 
42213
- Review the first dry runs, fleet overview, tool-call audit rows, escalations, and Signal impact. The fleet view at \`/agents\` shows every staffed agent seat at a glance; the agent-native equivalent is \`{{cli}} command agent.list_fleet --json '{}'\` / \`rost_list_agent_fleet\`, which returns lane, live state, last real turn, 24h/7d real turns, top measurable status, open escalations, and 7-day spend. Fleet real-turn counts use the same seat-run association as \`agent.list_runs\`, filtered to real runs. Scheduled agents are checked in rounded five-minute buckets, so a minute-level cron inside the bucket queues one work order for that bucket rather than one order per minute. Sandbox dry runs do not count as real turns. If the agent is repeatedly blocked, revise the Charter or split the seat. If the agent is taking too much judgment, narrow its autonomous scope.`
42218
+ The Agents page shows fleet health first: live state, recent runs, failed runs, open held actions, last activity, cost, and the next operator action. A seat's Trust Card drills into the same facts: run history, one-run detail, tool-call outcomes, product-visible errors, transcript references, and held confirmations or escalations. Open confirmations stay visible until they are decided or expire, even when they are older than the default activity window. Approving or rejecting a held confirmation from the seat page is scoped to that seat; rejection can include a short reason.
42219
+
42220
+ Review the first dry runs, fleet overview, tool-call audit rows, escalations, and Signal impact. The fleet view at \`/agents\` shows every staffed agent seat at a glance; the agent-native equivalents are \`{{cli}} command agent.list_fleet --json '{}'\` / \`rost_list_agent_fleet\` for the compact overview, and \`{{cli}} agent fleet-digest --json\` / \`agent.fleet_digest\` / \`rost_get_dogfood_fleet_health_digest\` for the daily dogfood evidence bundle. The digest returns live/idle state, 24h/7d turns, 7d/30d spend, recent failed runs, unresolved product errors, failed notifications, and a next action per seat. Fleet real-turn counts use the same seat-run association as \`agent.list_runs\`, filtered to real runs. Scheduled agents are checked in rounded five-minute buckets, so a minute-level cron inside the bucket queues one work order for that bucket rather than one order per minute. Sandbox dry runs do not count as real turns. If the agent is repeatedly blocked, revise the Charter or split the seat. If the agent is taking too much judgment, narrow its autonomous scope.`
42214
42221
  },
42215
42222
  {
42216
42223
  slug: "tool-access-and-vault",
42217
42224
  order: 46,
42218
42225
  title: "Tool access and vault",
42219
42226
  summary: "How to give agents access to tools without exposing raw credentials or expanding authority by accident.",
42220
- version: "2026-06-20.2",
42227
+ version: "2026-06-20.4",
42221
42228
  public: true,
42222
42229
  audiences: ["human", "cli", "mcp", "in_app_agent"],
42223
42230
  stages: ["staffing"],
42224
- relatedCommandIds: ["charter.sign_manifest", "credential.ingress", "agent.configure_tools", "mcp_token.create", "mcp_token.revoke", "mcp_token.list", "confirmation.approve"],
42231
+ relatedCommandIds: ["charter.sign_manifest", "credential.ingress", "agent.configure_tools", "integration.list", "integration.status", "integration.test", "mcp_token.create", "mcp_token.revoke", "mcp_token.list", "confirmation.approve"],
42225
42232
  legal: {
42226
42233
  publicRisk: "low",
42227
42234
  notes: [
@@ -42265,6 +42272,12 @@ For an API with no dedicated connector, the generic REST tool lets a seat call a
42265
42272
 
42266
42273
  \`slack.post_message\` reuses the connected Slack workspace credential and the seat's Slack channel binding. A live call posts only to that bound channel, through the server-side guard and vault-bound bot token. If the bound channel is marked sensitive, the handler escalates for human approval instead of posting. A sandbox dry run makes no Slack request and does not open the vault.
42267
42274
 
42275
+ ## Google connector status
42276
+
42277
+ Google can be connected from Settings once the workspace OAuth app is configured. The connection flow requests offline access for Gmail read/compose and Sheets, stores the returned credential in the vault, and records only account and scope metadata in the integration row. The test action refreshes the vaulted credential and performs a minimal Gmail profile read. Gmail and Sheets agent tools remain configuration-only until their guarded handlers ship; connecting Google does not by itself let an agent read mail or edit a sheet.
42278
+
42279
+ CLI and MCP can inspect connector readiness without seeing secrets: \`integration.list\` / \`rost_list_integrations\` lists connected providers and health metadata, \`integration.status\` / \`rost_get_integration_status\` reads one provider by id or name, and \`integration.test\` / \`rost_test_integration_connection\` runs the installed provider-specific health check. For Google, the test refreshes the vaulted OAuth credential and reads the Gmail profile, then records only account, scope, and health metadata.
42280
+
42268
42281
  ## One write-only credential flow across every surface
42269
42282
 
42270
42283
  There is exactly one way to give a connected tool its credential, and it is the same on every surface (agent setup, Charter Builder, CLI, MCP). Connecting a tool only authorizes the access \u2014 it never captures a secret. When a connected tool needs a credential, you stage a vault-backed *request* (provider, scope, and a credential name \u2014 all labels, never the secret). You then provide the actual secret separately through the vault-backed ingress flow from Settings. No {{brand}} surface ever has a field that accepts raw secret material, so a secret can never reach a prompt, log, event, or tool argument.
@@ -42280,6 +42293,7 @@ There is exactly one way to give a connected tool its credential, and it is the
42280
42293
  ## Connect tools and credentials from CLI or MCP
42281
42294
 
42282
42295
  - 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.
42296
+ - Inspect connector readiness: \`integration.list\` / \`rost_list_integrations\`, \`integration.status\` / \`rost_get_integration_status\`, and \`integration.test\` / \`rost_test_integration_connection\` return provider metadata and health only.
42283
42297
  - Store a secret: \`credential.ingress\` / \`rost_store_credential\` (scope: seat) persists only a vault reference. \`credential.ingress\` is \`credential_flow\` \u2014 it returns a pending confirmation and runs only with a real human-provided secret, captured as a vault reference. (Because it redacts that secret, the pending confirmation also shows a high-risk badge \u2014 see the confirmations guide for badge-versus-level.)
42284
42298
  - Sign the manifest: \`charter.sign_manifest\` / \`rost_sign_charter_manifest\` requests human confirmation for the seat's permission manifest.
42285
42299
  - Mint local access: prefer \`{{cli}} mcp install\` for users; \`mcp_token.create\` is \`human_required\` and returns the token once. List metadata with \`mcp_token.list\` (never token material); revoke with \`mcp_token.revoke\`.
@@ -42293,7 +42307,7 @@ There is exactly one way to give a connected tool its credential, and it is the
42293
42307
  order: 47,
42294
42308
  title: "Available tools guide",
42295
42309
  summary: "How to think about tool categories available to seats and what each category should be used for.",
42296
- version: "2026-06-20.2",
42310
+ version: "2026-06-20.3",
42297
42311
  public: true,
42298
42312
  audiences: ["human", "cli", "mcp", "in_app_agent"],
42299
42313
  stages: ["staffing"],
@@ -42342,7 +42356,7 @@ External connectors are being rolled out provider by provider, conservatively (r
42342
42356
  order: 48,
42343
42357
  title: "CLI and MCP installation guide",
42344
42358
  summary: "Install the public CLI, register remote token-backed MCP clients, and find the full command and tool catalog.",
42345
- version: "2026-06-20.5",
42359
+ version: "2026-06-20.8",
42346
42360
  public: true,
42347
42361
  audiences: ["human", "cli", "mcp", "in_app_agent"],
42348
42362
  stages: ["company_setup", "staffing"],
@@ -42378,6 +42392,7 @@ External connectors are being rolled out provider by provider, conservatively (r
42378
42392
  "agent.go_live",
42379
42393
  "agent.status",
42380
42394
  "agent.list_fleet",
42395
+ "agent.fleet_digest",
42381
42396
  "agent.get_run",
42382
42397
  "agent.list_runs",
42383
42398
  "agent.list_tool_calls"
@@ -42754,9 +42769,10 @@ These ergonomic wrappers (including the \`{{cli}} agent\` group) require **{{cli
42754
42769
  | \`{{cli}} sync brief|compile|complete\` | \`sync.brief.get\`, \`sync.brief.compile\`, \`sync.run.complete\` | Compile, read, and complete a weekly Sync. | Tenant | \`{{cli}} sync brief --json\` |
42755
42770
  | \`{{cli}} runner list|status|work-orders|revoke\` | \`runner.list\`, \`runner.status\`, \`work_order.list\`, \`runner.revoke\` | Inspect runners and work orders; revoke a runner. | Tenant | \`{{cli}} runner list --json\` |
42756
42771
  | \`{{cli}} notification settings|test|errors\` | \`notification.settings.get\`, \`notification.test\`, \`notification.list_errors\` | Read notification settings, send a test, and list failed deliveries with linked product error source, seat id, and run id when available. | Tenant | \`{{cli}} notification errors --limit 10 --json\` |
42772
+ | \`{{cli}} integration list|status|test\` | \`integration.list\`, \`integration.status\`, \`integration.test\` | List connector metadata, read one connector's health, and run the provider-specific connection test without exposing credentials. | Tenant | \`{{cli}} integration test --provider google --json\` |
42757
42773
  | \`{{cli}} settings get|update\` | \`settings.get\`, \`settings.update\` | Read tenant settings; update budget caps. | Tenant | \`{{cli}} settings get --json\` |
42758
42774
  | \`{{cli}} member invite|update|remove\` | \`member.invite\`, \`member.update\`, \`member.remove\` | Manage tenant members. | Tenant | \`{{cli}} member invite --email ops@example.com --role member\` |
42759
- | \`{{cli}} agent templates|create|setup|tools|dry-run|go-live|status|run-now|get-run|show\` | \`agent_template.list\`, \`agent.create_from_template\`, \`agent.create_custom\`, \`agent_setup.get\`, \`agent_setup.update\`, \`agent.configure_tools\`, \`agent.run_dry_run\`, \`agent.go_live\`, \`agent.status\`, \`agent.run_now\`, \`agent.get_run\`, \`agent.show_markdown\` | Run the full agent setup and operation flow: list templates, create a draft from a template or guided custom answers (with \`--model\` and \`--effort\`), read or answer setup state, connect or decline tools, dry-run, go live, run on demand, read one run's transcript/error diagnostics, and show a markdown readout. Create and go-live stop at human gates; the dry-run is ungated by human approval but requires a signed manifest first. | Tenant and seat | \`{{cli}} agent get-run --seat-id <seat-id> --run-id <run-id> --json\` |
42775
+ | \`{{cli}} agent templates|create|setup|tools|dry-run|go-live|status|run-now|fleet-digest|get-run|show\` | \`agent_template.list\`, \`agent.create_from_template\`, \`agent.create_custom\`, \`agent_setup.get\`, \`agent_setup.update\`, \`agent.configure_tools\`, \`agent.run_dry_run\`, \`agent.go_live\`, \`agent.status\`, \`agent.run_now\`, \`agent.fleet_digest\`, \`agent.get_run\`, \`agent.show_markdown\` | Run the full agent setup and operation flow: list templates, create a draft from a template or guided custom answers (with \`--model\` and \`--effort\`), read or answer setup state, connect or decline tools, dry-run, go live, run on demand, capture the fleet-health digest, read one run's transcript/error diagnostics, and show a markdown readout. Create and go-live stop at human gates; the dry-run is ungated by human approval but requires a signed manifest first. | Tenant and seat | \`{{cli}} agent fleet-digest --json\` |
42760
42776
  | \`{{cli}} tools list\` | \`tool.catalog\` | List the discoverable tool catalog the builder reads (id, scope tiers, credential requirement, access policy, and execution-boundary guidance). | Tenant | \`{{cli}} tools list --json\` |
42761
42777
  | \`{{cli}} model list\` | \`model.catalog\` | List guided model tiers with recommendations, token prices, cost bands, best-fit work, and model ids for \`--model\`. | Tenant | \`{{cli}} model list --json\` |
42762
42778
  | \`{{cli}} compass show\` | \`compass.show_markdown\` | Render the current Compass as a clean markdown card for review. | Tenant | \`{{cli}} compass show --markdown\` |
@@ -42856,6 +42872,7 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
42856
42872
  | \`rost_list_compass_gaps\` | \`compass.list_gaps\` | List unanswered and answered Compass context gaps. | Tenant | Call with \`{}\` before answering gaps. |
42857
42873
  | \`rost_get_agent_status\` | \`agent.status\` | Read agent lane, live state, steward chain, dry-run result, Runner availability. | Seat or tenant-admin | Call with \`{"seat_id":"<seat-id>"}\`. |
42858
42874
  | \`rost_list_agent_fleet\` | \`agent.list_fleet\` | Read every staffed agent seat at once: lane, live state, last real turn, 24h/7d real turns, measurable status, escalations, and 7-day spend. | Tenant | Call with \`{}\`; counts use the same seat-run association as \`agent.list_runs\`, with sandbox dry runs excluded from real turns. |
42875
+ | \`rost_get_dogfood_fleet_health_digest\` | \`agent.fleet_digest\` | Capture the daily dogfood fleet-health digest: live/idle state, 24h/7d turns, spend, recent failed runs, unresolved errors, failed notifications, and next actions. | Tenant | Call with \`{}\`; optional \`window_hours\` bounds recent failed-run evidence, while \`error_limit\` caps linked evidence per seat. |
42859
42876
  | \`rost_run_agent_now\` | \`agent.run_now\` | Queue an immediate run for a live staffed agent without changing its saved schedule; cloud lane dispatches to the executor and runner lane queues for the paired runner. | Tenant | Call with \`{"seat_id":"<seat-id>"}\`. |
42860
42877
  | \`rost_list_agent_runs\` | \`agent.list_runs\` | Read a seat's agent run history (status, lane, model, cost, per-run tool-call and guard-held counts) plus the seat's run/tool-call rollup including held-action count. | Seat or tenant-admin | Call with \`{"seat_id":"<seat-id>"}\`; pass \`limit\` for a deeper window. |
42861
42878
  | \`rost_get_agent_run_diagnostics\` | \`agent.get_run\` | Read one run's diagnostic record: transcript reference, token/cost usage, outcome, and linked product-visible run errors. | Seat or tenant-admin | Call with \`{"seat_id":"<seat-id>","run_id":"<run-id>"}\`. |
@@ -42875,7 +42892,7 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
42875
42892
  | \`rost_list_mcp_tokens\` | \`mcp_token.list\` | List MCP token metadata (never token material). | Tenant | Call with \`{}\` or \`{"include_revoked":true}\`. |
42876
42893
  | \`rost_list_runners\` | \`runner.list\` | List local runners and their online/offline/revoked state. | Tenant | Call with \`{}\`. |
42877
42894
  | \`rost_runner_status\` | \`runner.status\` | Read a single runner's capability and state. | Tenant | Call with \`runner_id\`. |
42878
- | \`rost_start_runner_pairing\` | \`runner.pairing.start\` | Open a runner pairing session and return the human pairing code. | Tenant | Call with \`name\` and \`platform\`. |
42895
+ | \`rost_start_runner_pairing\` | \`runner.pairing.start\` | Open a runner pairing session and return the human pairing code. | Tenant-admin | Call with \`name\` and \`platform\`; owner/admin only. |
42879
42896
  | \`rost_revoke_runner\` | \`runner.revoke\` | Revoke a runner so it can no longer authenticate. | Tenant | Call with \`runner_id\`; expect human confirmation. |
42880
42897
  | \`rost_list_work_orders\` | \`work_order.list\` | List runner/cloud work orders for the tenant. | Tenant | Call with optional \`status\`, \`agent_id\`, or \`runner_id\`. |
42881
42898
  | \`rost_enqueue_work_order\` | \`work_order.enqueue\` | Queue a work order for a live scheduled agent. | Tenant | Call with \`agent_id\`. |
@@ -42884,6 +42901,9 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
42884
42901
  | \`rost_update_notification_settings\` | \`notification.settings.update\` | Update tenant notification preferences. | Tenant | Call with the fields to change. |
42885
42902
  | \`rost_send_test_notification\` | \`notification.test\` | Emit an in-app test notification to the acting human. | Tenant | Call with \`{}\`. |
42886
42903
  | \`rost_list_notification_errors\` | \`notification.list_errors\` | List recent failed notification deliveries with linked \`error_log_id\`, source, seat id, and run id when available. | Tenant | Call with optional \`limit\`; \`source=run\` rows can be followed with \`agent.get_run\`. |
42904
+ | \`rost_list_integrations\` | \`integration.list\` | List connected integration metadata and latest health state. | Tenant | Call with \`{}\` or \`{"provider":"google"}\`; no secrets or vault refs are returned. |
42905
+ | \`rost_get_integration_status\` | \`integration.status\` | Read one integration's metadata by provider or integration id. | Tenant | Call with \`{"provider":"google"}\` or \`{"integration_id":"<id>"}\`. |
42906
+ | \`rost_test_integration_connection\` | \`integration.test\` | Run the provider-specific connection test and update integration health. | Tenant | Call with \`{"provider":"google"}\`; result is bounded metadata only. |
42887
42907
  | \`rost_invite_member\` | \`member.invite\` | Create a pending tenant invite for a human teammate. | Tenant | Call with \`email\` and \`role\`. |
42888
42908
  | \`rost_update_member_role\` | \`member.update\` | Change a tenant member's role. | Tenant | Call with \`member_id\` and \`role\`; expect human confirmation. |
42889
42909
  | \`rost_remove_member\` | \`member.remove\` | Remove a tenant member. | Tenant | Call with \`member_id\`; blocked if it would orphan an agent steward chain. |
@@ -43415,11 +43435,11 @@ Stop before: approving a Charter, signing a manifest, connecting a tool or crede
43415
43435
  order: 72,
43416
43436
  title: "Settings guide",
43417
43437
  summary: "How to use Settings as the control plane for company access, channels, providers, tokens, and operating defaults.",
43418
- version: "2026-06-18.1",
43438
+ version: "2026-06-20.5",
43419
43439
  public: true,
43420
43440
  audiences: ["human", "cli", "mcp", "in_app_agent"],
43421
43441
  stages: ["company_setup", "staffing"],
43422
- relatedCommandIds: ["onboarding.create_invite", "mcp_token.create", "mcp_token.revoke", "mcp_token.list", "settings.get", "settings.update", "settings.sync_brief_scope.get", "settings.sync_brief_scope.update"],
43442
+ relatedCommandIds: ["onboarding.create_invite", "mcp_token.create", "mcp_token.revoke", "mcp_token.list", "integration.list", "integration.status", "integration.test", "settings.get", "settings.update", "settings.sync_brief_scope.get", "settings.sync_brief_scope.update"],
43423
43443
  legal: { publicRisk: "low", notes: ["{{brand}}-native settings guidance."] },
43424
43444
  sources: [
43425
43445
  {
@@ -43447,6 +43467,16 @@ Start with members and invites, then provider and channel connections, then MCP
43447
43467
  - Stored credentials (vault references only) and tool access approvals.
43448
43468
  - Operating defaults, including Sync Brief scope.
43449
43469
 
43470
+ Settings lifecycle timestamps are display metadata for tokens, connected machines, integrations, and stored credentials. They may be emitted by the database as either timestamp values or strings, but Settings renders them as safe labels rather than treating timestamp formatting failures as page-level failures.
43471
+
43472
+ When a settings source is temporarily unavailable, the app keeps the route open and marks affected sections as unavailable instead of showing raw errors or stale-looking editable values. Budget and Sync Brief controls stay read-only until their server-backed data can be loaded.
43473
+
43474
+ ## Integration health
43475
+
43476
+ \`integration.list\` lists connector metadata for CLI and MCP operators, \`integration.status\` reads one provider or integration id, and \`integration.test\` runs the installed provider-specific health check. These commands return account labels, scopes, capabilities, timestamps, and health only; they never return vault references, access tokens, refresh tokens, or raw provider responses. Google's test refreshes the vaulted OAuth credential and reads the Gmail profile as the minimal live check. Settings exposes the same Google test as an owner/operator button beside Connect/Reconnect, shows the last tested time, and turns failures into reconnect-oriented remediation copy rather than raw provider errors.
43477
+
43478
+ Reconnects keep historical rows for audit, but provider status in Settings, CLI, and MCP prefers the current connected row first, then the latest error or disconnected row.
43479
+
43450
43480
  ## Sync Brief scope
43451
43481
 
43452
43482
  The weekly Sync Brief compiles either company-wide or per cluster. Company-wide is one brief covering the whole company and is the default for a new company. Per cluster compiles one brief per cluster, scoped to each cluster's seats; pick it when clusters run their own weekly sync. Per cluster falls back to a single company-wide brief when the company has no clusters, so the rhythm never produces zero briefs. The owner sets this at onboarding and can change it later in Settings.
@@ -43540,7 +43570,7 @@ Every notification should include the seat, cause, evidence, and requested decis
43540
43570
  order: 75,
43541
43571
  title: "Local runner guide",
43542
43572
  summary: "How local agent sessions and runner surfaces should operate through {{brand}} without bypassing Charters or audit.",
43543
- version: "2026-06-19.2",
43573
+ version: "2026-06-20.1",
43544
43574
  public: true,
43545
43575
  audiences: ["human", "cli", "mcp", "in_app_agent"],
43546
43576
  stages: ["staffing", "operating_rhythm"],
@@ -43568,7 +43598,7 @@ The local runner is for human-controlled local agent work. It should retrieve {{
43568
43598
 
43569
43599
  ## Inspect and control runners from CLI or MCP
43570
43600
 
43571
- - Pair a new runner: \`runner.pairing.start\` / \`rost_start_runner_pairing\` with \`name\` and \`platform\` returns a human pairing code.
43601
+ - Pair a new runner: \`runner.pairing.start\` / \`rost_start_runner_pairing\` with \`name\` and \`platform\` returns a human pairing code. This is owner/admin-only because it mints a short-lived runner pairing session that leads to machine credentials.
43572
43602
  - Inspect: \`{{cli}} runner list --json\` / \`runner.list\` / \`rost_list_runners\` shows online/offline/revoked state; \`{{cli}} runner status\` / \`runner.status\` / \`rost_runner_status\` reads one runner.
43573
43603
  - 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\`.
43574
43604
  - Revoke: \`{{cli}} runner revoke\` / \`runner.revoke\` / \`rost_revoke_runner\` so a runner can no longer authenticate.
@@ -43577,7 +43607,7 @@ The local runner is for human-controlled local agent work. It should retrieve {{
43577
43607
 
43578
43608
  Use this flow when a headless or desktop runner cannot use the interactive web confirmation flow.
43579
43609
 
43580
- 1. The owner runs \`runner.pairing.start\` or \`rost_start_runner_pairing\` with the runner \`name\` and \`platform\`.
43610
+ 1. The owner/admin runs \`runner.pairing.start\` or \`rost_start_runner_pairing\` with the runner \`name\` and \`platform\`.
43581
43611
  2. The owner gives the returned \`user_code\` to the runner through a trusted out-of-band channel.
43582
43612
  3. The runner calls \`POST /api/runner/pairing/claim\` with \`{"user_code":"ABCD-2345"}\`.
43583
43613
  4. The response returns \`runner_id\`, \`runner_secret\`, \`name\`, and \`platform\`. Store the runner secret only on the runner machine.
@@ -43585,7 +43615,7 @@ Use this flow when a headless or desktop runner cannot use the interactive web c
43585
43615
 
43586
43616
  ## When to stop for confirmation
43587
43617
 
43588
- \`runner.revoke\` and \`work_order.cancel\` are \`human_required\`; \`runner.pairing.start\`, \`work_order.enqueue\`, and \`agent.run_now\` are \`none\`, so an operator can pair a runner and queue work directly. List and status reads are not gated. Revoking a runner or cancelling work is the human-approved act. An agent inspects runner state and proposes the action.
43618
+ \`runner.pairing.start\`, \`work_order.enqueue\`, and \`agent.run_now\` are \`none\`, so they do not create a separate pending confirmation, but \`runner.pairing.start\` is still owner/admin-only at the command authorization layer. \`runner.revoke\` and \`work_order.cancel\` are \`human_required\`. List and status reads are not gated. Revoking a runner or cancelling work is the human-approved act. An agent inspects runner state and proposes the action.
43589
43619
 
43590
43620
  ## Guardrails
43591
43621
 
@@ -45697,6 +45727,57 @@ function notificationUsage(bin) {
45697
45727
  ${bin} notification test
45698
45728
  ${bin} notification errors [--limit <n>]`;
45699
45729
  }
45730
+ var integrationWrapper = (context, args) => dispatch(context, "integration", args, {
45731
+ list: (ctx, rest) => {
45732
+ const parsed = parseFlags(rest);
45733
+ const body = withOptional({}, { provider: optionalValue(parsed, "provider") });
45734
+ return execute(ctx, parsed, "integration.list", body, (output) => {
45735
+ const integrations = asArray(asRecord(output).integrations);
45736
+ if (integrations.length === 0) {
45737
+ return "No integrations are connected.";
45738
+ }
45739
+ return integrations.map((entry) => formatIntegrationLine(asRecord(entry))).join("\n");
45740
+ });
45741
+ },
45742
+ status: (ctx, rest) => {
45743
+ const parsed = parseFlags(rest);
45744
+ const body = integrationLookupBody(parsed);
45745
+ return execute(ctx, parsed, "integration.status", body, (output) => {
45746
+ const integration = asRecord(output).integration;
45747
+ if (integration === null) {
45748
+ return "Integration not found.";
45749
+ }
45750
+ return formatIntegrationLine(asRecord(integration));
45751
+ });
45752
+ },
45753
+ test: (ctx, rest) => {
45754
+ const parsed = parseFlags(rest);
45755
+ const body = integrationLookupBody(parsed);
45756
+ return execute(ctx, parsed, "integration.test", body, (output) => {
45757
+ const record2 = asRecord(output);
45758
+ return `${field(record2, "provider")} ${field(record2, "status")} (ok=${field(record2, "ok")}) ${field(record2, "message")}`;
45759
+ });
45760
+ }
45761
+ }, integrationUsage(context.binName));
45762
+ function integrationLookupBody(parsed) {
45763
+ const body = withOptional({}, {
45764
+ provider: optionalValue(parsed, "provider"),
45765
+ integration_id: optionalValue(parsed, "integration-id")
45766
+ });
45767
+ if (Object.keys(body).length === 0) {
45768
+ throw new UsageError("Provide --provider or --integration-id.");
45769
+ }
45770
+ return body;
45771
+ }
45772
+ function formatIntegrationLine(record2) {
45773
+ return `${field(record2, "provider")} status=${field(record2, "status")} account=${field(record2, "account_email")} last_test=${field(record2, "last_test_result")} id=${field(record2, "id")}`;
45774
+ }
45775
+ function integrationUsage(bin) {
45776
+ return `Usage: ${bin} integration list|status|test [--json]
45777
+ ${bin} integration list [--provider <name>]
45778
+ ${bin} integration status --provider <name>
45779
+ ${bin} integration test --provider <name>`;
45780
+ }
45700
45781
  var settingsWrapper = (context, args) => dispatch(context, "settings", args, {
45701
45782
  get: (ctx, rest) => {
45702
45783
  const parsed = parseFlags(rest);
@@ -45896,6 +45977,24 @@ ${field(record2, "summary")}`;
45896
45977
  return `queued ${field(workOrder, "lane")} work order ${field(workOrder, "id")} for agent ${field(workOrder, "agent_id")} (${field(workOrder, "status")})`;
45897
45978
  });
45898
45979
  },
45980
+ "fleet-digest": (ctx, rest) => {
45981
+ const parsed = parseFlags(rest);
45982
+ const body = withOptional({}, {
45983
+ window_hours: optionalNumber(parsed, "window-hours"),
45984
+ error_limit: optionalNumber(parsed, "error-limit")
45985
+ });
45986
+ return execute(ctx, parsed, "agent.fleet_digest", body, (output) => {
45987
+ const record2 = asRecord(output);
45988
+ const summary = asRecord(record2.summary);
45989
+ const agents = asArray(record2.agents);
45990
+ const header = `fleet ${field(summary, "fleet_count")} seats live=${field(summary, "live_count")} idle=${field(summary, "idle_count")} turns24h=${field(summary, "turns_24h")} failed24h=${field(summary, "failed_runs_24h")} spend7d=$${field(summary, "spend_7d_usd")}`;
45991
+ const lines = agents.map((agent) => {
45992
+ const r = asRecord(agent);
45993
+ return `${field(r, "seat_name")} ${field(r, "health_status")} live=${field(r, "live")} turns24h=${field(r, "turns_24h")} failed=${field(r, "failed_runs_24h")} next=${field(r, "suggested_next_action")}`;
45994
+ });
45995
+ return [header, ...lines].join("\n");
45996
+ });
45997
+ },
45899
45998
  "get-run": (ctx, rest) => {
45900
45999
  const parsed = parseFlags(rest);
45901
46000
  const body = {
@@ -45937,7 +46036,7 @@ function agentConfigureTools(ctx, rest, decision) {
45937
46036
  });
45938
46037
  }
45939
46038
  function agentUsage(bin) {
45940
- return `Usage: ${bin} agent templates|create|setup|tools|dry-run|go-live|status|run-now|get-run|show [--json]
46039
+ return `Usage: ${bin} agent templates|create|setup|tools|dry-run|go-live|status|run-now|fleet-digest|get-run|show [--json]
45941
46040
  ${bin} agent templates
45942
46041
  ${bin} agent create --seat-id <id> --template <slug> [--expected-version <v>]
45943
46042
  ${bin} agent create --seat-id <id> --custom [--steward-seat-id <id>] [--lane cloud|mcp_session|runner] [--model triage|balanced|complex|hardest|<id>] [--effort low|medium|high|xhigh|max] [--owns <text>] [--success <text>] [--never-alone <text>]
@@ -45948,6 +46047,7 @@ function agentUsage(bin) {
45948
46047
  ${bin} agent go-live --seat-id <id> --charter-version-id <id>
45949
46048
  ${bin} agent status --seat-id <id>
45950
46049
  ${bin} agent run-now --seat-id <id> [--task-id <id>]
46050
+ ${bin} agent fleet-digest [--window-hours <n>] [--error-limit <n>]
45951
46051
  ${bin} agent get-run --seat-id <id> --run-id <id>
45952
46052
  ${bin} agent show --seat-id <id> [--markdown]`;
45953
46053
  }
@@ -46060,6 +46160,7 @@ var OPERATION_GROUPS = [
46060
46160
  "sync",
46061
46161
  "runner",
46062
46162
  "notification",
46163
+ "integration",
46063
46164
  "settings",
46064
46165
  "member",
46065
46166
  "agent",
@@ -46078,6 +46179,7 @@ var wrappers = {
46078
46179
  sync: syncWrapper,
46079
46180
  runner: runnerWrapper,
46080
46181
  notification: notificationWrapper,
46182
+ integration: integrationWrapper,
46081
46183
  settings: settingsWrapper,
46082
46184
  member: memberWrapper,
46083
46185
  agent: agentWrapper,
@@ -46099,6 +46201,7 @@ var groupUsageBuilders = {
46099
46201
  sync: syncUsage,
46100
46202
  runner: runnerUsage,
46101
46203
  notification: notificationUsage,
46204
+ integration: integrationUsage,
46102
46205
  settings: settingsUsage,
46103
46206
  member: memberUsage,
46104
46207
  agent: agentUsage,
@@ -46131,7 +46234,7 @@ function operationUsageLines(bin) {
46131
46234
  `${bin} notification settings|test|errors`,
46132
46235
  `${bin} settings get|update`,
46133
46236
  `${bin} member invite|update|remove`,
46134
- `${bin} agent templates|create|setup|tools|dry-run|go-live|status|run-now|get-run|show`,
46237
+ `${bin} agent templates|create|setup|tools|dry-run|go-live|status|run-now|fleet-digest|get-run|show`,
46135
46238
  `${bin} tools list`,
46136
46239
  `${bin} model list`,
46137
46240
  `${bin} compass show`,