@rosthq/cli 0.5.12 → 0.5.14

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":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAMA,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AACxE,OAAO,EAAoB,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAYrE,KAAK,KAAK,GAAG;IACX,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAK1C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,EAAE,CAAC,EAAE,KAAK,CAAC;IACX,KAAK,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAChC,WAAW,CAAC,EAAE,OAAO,mBAAmB,CAAC;IACzC,cAAc,CAAC,EAAE,OAAO,yBAAyB,CAAC;CACnD,CAAC;AAEF,wBAAsB,IAAI,CAAC,IAAI,WAAwB,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CA+LnG;AAwXD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAUxF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAMA,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AACxE,OAAO,EAAoB,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAYrE,KAAK,KAAK,GAAG;IACX,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAK1C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,EAAE,CAAC,EAAE,KAAK,CAAC;IACX,KAAK,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAChC,WAAW,CAAC,EAAE,OAAO,mBAAmB,CAAC;IACzC,cAAc,CAAC,EAAE,OAAO,yBAAyB,CAAC;CACnD,CAAC;AAEF,wBAAsB,IAAI,CAAC,IAAI,WAAwB,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CA+LnG;AAoZD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAUxF"}
package/dist/index.js CHANGED
@@ -41896,7 +41896,7 @@ No orphan agents. No raw secrets in prompts, logs, or tool arguments. No durable
41896
41896
  order: 41,
41897
41897
  title: "Add agents to your Responsibility Graph",
41898
41898
  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",
41899
+ version: "2026-06-20.1",
41900
41900
  public: true,
41901
41901
  audiences: ["human", "in_app_agent"],
41902
41902
  stages: ["staffing"],
@@ -42051,7 +42051,7 @@ The dry run is a real sandbox rehearsal, not a stamp. It executes a mock-provide
42051
42051
  order: 80,
42052
42052
  title: "Sync rhythm playbook",
42053
42053
  summary: "How Signal, Friction, Cascade, and Sync Briefs turn weekly meetings into decision time.",
42054
- version: "2026-06-18.1",
42054
+ version: "2026-06-20.1",
42055
42055
  public: true,
42056
42056
  audiences: ["human", "cli", "mcp", "in_app_agent"],
42057
42057
  stages: ["operating_rhythm"],
@@ -42217,11 +42217,11 @@ Review the first dry runs, fleet overview, tool-call audit rows, escalations, an
42217
42217
  order: 46,
42218
42218
  title: "Tool access and vault",
42219
42219
  summary: "How to give agents access to tools without exposing raw credentials or expanding authority by accident.",
42220
- version: "2026-06-20.2",
42220
+ version: "2026-06-20.4",
42221
42221
  public: true,
42222
42222
  audiences: ["human", "cli", "mcp", "in_app_agent"],
42223
42223
  stages: ["staffing"],
42224
- relatedCommandIds: ["charter.sign_manifest", "credential.ingress", "agent.configure_tools", "mcp_token.create", "mcp_token.revoke", "mcp_token.list", "confirmation.approve"],
42224
+ 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
42225
  legal: {
42226
42226
  publicRisk: "low",
42227
42227
  notes: [
@@ -42265,6 +42265,12 @@ For an API with no dedicated connector, the generic REST tool lets a seat call a
42265
42265
 
42266
42266
  \`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
42267
 
42268
+ ## Google connector status
42269
+
42270
+ 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.
42271
+
42272
+ 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.
42273
+
42268
42274
  ## One write-only credential flow across every surface
42269
42275
 
42270
42276
  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 +42286,7 @@ There is exactly one way to give a connected tool its credential, and it is the
42280
42286
  ## Connect tools and credentials from CLI or MCP
42281
42287
 
42282
42288
  - 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.
42289
+ - 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
42290
  - 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
42291
  - Sign the manifest: \`charter.sign_manifest\` / \`rost_sign_charter_manifest\` requests human confirmation for the seat's permission manifest.
42285
42292
  - 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\`.
@@ -42342,7 +42349,7 @@ External connectors are being rolled out provider by provider, conservatively (r
42342
42349
  order: 48,
42343
42350
  title: "CLI and MCP installation guide",
42344
42351
  summary: "Install the public CLI, register remote token-backed MCP clients, and find the full command and tool catalog.",
42345
- version: "2026-06-20.4",
42352
+ version: "2026-06-20.7",
42346
42353
  public: true,
42347
42354
  audiences: ["human", "cli", "mcp", "in_app_agent"],
42348
42355
  stages: ["company_setup", "staffing"],
@@ -42411,7 +42418,7 @@ The MCP server is remote and token-backed. There is no local MCP daemon to insta
42411
42418
  A headless agent cannot complete setup unattended. Two things always require a human, so plan to announce the handoff rather than stall silently:
42412
42419
 
42413
42420
  - **Device-code approval at first login.** \`{{cli}} login --device\` prints a code; a human must open the workspace URL in a browser, sign in with Google, match the code, and approve.
42414
- - **Durable gated commands.** Setting or approving a Charter, staffing a seat, and taking an agent live each open a confirmation that a human approves (an agent never approves its own request \u2014 see the confirmations-guide). The CLI surfaces the \`confirmation_id\` and an \`approveVia\` URL for the human. (\`{{cli}} mcp install\` is a partial exception: for an **interactive** operator it completes its own token-mint approval inline; in a **headless/agent** session it surfaces the confirmation and stops unless \`--skip-permissions\` / \`{{envPrefix}}_CLI_SKIP_PERMISSIONS=1\` is set \u2014 see Approving the token mint below.)
42421
+ - **Durable gated commands.** Setting or approving a Charter, staffing a seat, and taking an agent live each require a human approval boundary (an agent never approves its own request \u2014 see the confirmations-guide). In a **headless/agent** session, or over MCP, the command surfaces the \`confirmation_id\` and an \`approveVia\` URL for a human and stops. When a logged-in human runs \`{{cli}} command <id>\` from an **interactive TTY**, the official CLI completes that returned confirmation inline by calling \`confirmation.approve\` and printing the approved command output. (\`{{cli}} mcp install\` follows the same interactive rule for token minting, with \`--skip-permissions\` / \`{{envPrefix}}_CLI_SKIP_PERMISSIONS=1\` as an explicit headless loosening \u2014 see Approving the token mint below.)
42415
42422
 
42416
42423
  Treat these as blocking prerequisites: the agent prepares the request and waits for the human approver.
42417
42424
 
@@ -42754,6 +42761,7 @@ These ergonomic wrappers (including the \`{{cli}} agent\` group) require **{{cli
42754
42761
  | \`{{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
42762
  | \`{{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
42763
  | \`{{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\` |
42764
+ | \`{{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
42765
  | \`{{cli}} settings get|update\` | \`settings.get\`, \`settings.update\` | Read tenant settings; update budget caps. | Tenant | \`{{cli}} settings get --json\` |
42758
42766
  | \`{{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
42767
  | \`{{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\` |
@@ -42875,7 +42883,7 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
42875
42883
  | \`rost_list_mcp_tokens\` | \`mcp_token.list\` | List MCP token metadata (never token material). | Tenant | Call with \`{}\` or \`{"include_revoked":true}\`. |
42876
42884
  | \`rost_list_runners\` | \`runner.list\` | List local runners and their online/offline/revoked state. | Tenant | Call with \`{}\`. |
42877
42885
  | \`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\`. |
42886
+ | \`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
42887
  | \`rost_revoke_runner\` | \`runner.revoke\` | Revoke a runner so it can no longer authenticate. | Tenant | Call with \`runner_id\`; expect human confirmation. |
42880
42888
  | \`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
42889
  | \`rost_enqueue_work_order\` | \`work_order.enqueue\` | Queue a work order for a live scheduled agent. | Tenant | Call with \`agent_id\`. |
@@ -42884,6 +42892,9 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
42884
42892
  | \`rost_update_notification_settings\` | \`notification.settings.update\` | Update tenant notification preferences. | Tenant | Call with the fields to change. |
42885
42893
  | \`rost_send_test_notification\` | \`notification.test\` | Emit an in-app test notification to the acting human. | Tenant | Call with \`{}\`. |
42886
42894
  | \`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\`. |
42895
+ | \`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. |
42896
+ | \`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>"}\`. |
42897
+ | \`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
42898
  | \`rost_invite_member\` | \`member.invite\` | Create a pending tenant invite for a human teammate. | Tenant | Call with \`email\` and \`role\`. |
42888
42899
  | \`rost_update_member_role\` | \`member.update\` | Change a tenant member's role. | Tenant | Call with \`member_id\` and \`role\`; expect human confirmation. |
42889
42900
  | \`rost_remove_member\` | \`member.remove\` | Remove a tenant member. | Tenant | Call with \`member_id\`; blocked if it would orphan an agent steward chain. |
@@ -43360,7 +43371,7 @@ Keep agent scope tight at first. Approve more autonomy only after evidence. Use
43360
43371
  order: 71,
43361
43372
  title: "Confirmations and human gates guide",
43362
43373
  summary: "How {{brand}} routes authority-changing work through human confirmation, and why agents never approve their own requests.",
43363
- version: "2026-06-18.1",
43374
+ version: "2026-06-20.1",
43364
43375
  public: true,
43365
43376
  audiences: ["human", "cli", "mcp", "in_app_agent"],
43366
43377
  stages: ["graph_design", "charter_design", "staffing", "operating_rhythm"],
@@ -43393,7 +43404,7 @@ The \`dangerous\` confirmation **level** is rare and is not the same as the **ri
43393
43404
 
43394
43405
  ## What a gated command returns over MCP
43395
43406
 
43396
- A gated command does not mutate when an agent calls it. It returns a pending confirmation with the command id, a risk level, and an \`approveVia\` block containing a web URL and the exact \`{{cli}} command confirmation.approve --json ...\` line. The human approves through the web link or the CLI; the agent surfaces the link and stops.
43407
+ A gated command does not mutate when an agent calls it. It returns a pending confirmation with the command id, a risk level, and an \`approveVia\` block containing a web URL and the exact \`{{cli}} command confirmation.approve --json ...\` line. The human approves through the web link or the CLI; the agent surfaces the link and stops. A logged-in human at an interactive CLI can run their own gated \`{{cli}} command <id>\` without copy-pasting the approval command because the CLI completes the returned confirmation inline.
43397
43408
 
43398
43409
  \`\`\`bash
43399
43410
  # Human approves a pending confirmation
@@ -43415,11 +43426,11 @@ Stop before: approving a Charter, signing a manifest, connecting a tool or crede
43415
43426
  order: 72,
43416
43427
  title: "Settings guide",
43417
43428
  summary: "How to use Settings as the control plane for company access, channels, providers, tokens, and operating defaults.",
43418
- version: "2026-06-18.1",
43429
+ version: "2026-06-20.1",
43419
43430
  public: true,
43420
43431
  audiences: ["human", "cli", "mcp", "in_app_agent"],
43421
43432
  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"],
43433
+ 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
43434
  legal: { publicRisk: "low", notes: ["{{brand}}-native settings guidance."] },
43424
43435
  sources: [
43425
43436
  {
@@ -43447,6 +43458,10 @@ Start with members and invites, then provider and channel connections, then MCP
43447
43458
  - Stored credentials (vault references only) and tool access approvals.
43448
43459
  - Operating defaults, including Sync Brief scope.
43449
43460
 
43461
+ ## Integration health
43462
+
43463
+ \`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.
43464
+
43450
43465
  ## Sync Brief scope
43451
43466
 
43452
43467
  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 +43555,7 @@ Every notification should include the seat, cause, evidence, and requested decis
43540
43555
  order: 75,
43541
43556
  title: "Local runner guide",
43542
43557
  summary: "How local agent sessions and runner surfaces should operate through {{brand}} without bypassing Charters or audit.",
43543
- version: "2026-06-19.2",
43558
+ version: "2026-06-20.1",
43544
43559
  public: true,
43545
43560
  audiences: ["human", "cli", "mcp", "in_app_agent"],
43546
43561
  stages: ["staffing", "operating_rhythm"],
@@ -43568,7 +43583,7 @@ The local runner is for human-controlled local agent work. It should retrieve {{
43568
43583
 
43569
43584
  ## Inspect and control runners from CLI or MCP
43570
43585
 
43571
- - Pair a new runner: \`runner.pairing.start\` / \`rost_start_runner_pairing\` with \`name\` and \`platform\` returns a human pairing code.
43586
+ - 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
43587
  - 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
43588
  - 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
43589
  - Revoke: \`{{cli}} runner revoke\` / \`runner.revoke\` / \`rost_revoke_runner\` so a runner can no longer authenticate.
@@ -43577,7 +43592,7 @@ The local runner is for human-controlled local agent work. It should retrieve {{
43577
43592
 
43578
43593
  Use this flow when a headless or desktop runner cannot use the interactive web confirmation flow.
43579
43594
 
43580
- 1. The owner runs \`runner.pairing.start\` or \`rost_start_runner_pairing\` with the runner \`name\` and \`platform\`.
43595
+ 1. The owner/admin runs \`runner.pairing.start\` or \`rost_start_runner_pairing\` with the runner \`name\` and \`platform\`.
43581
43596
  2. The owner gives the returned \`user_code\` to the runner through a trusted out-of-band channel.
43582
43597
  3. The runner calls \`POST /api/runner/pairing/claim\` with \`{"user_code":"ABCD-2345"}\`.
43583
43598
  4. The response returns \`runner_id\`, \`runner_secret\`, \`name\`, and \`platform\`. Store the runner secret only on the runner machine.
@@ -43585,7 +43600,7 @@ Use this flow when a headless or desktop runner cannot use the interactive web c
43585
43600
 
43586
43601
  ## When to stop for confirmation
43587
43602
 
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.
43603
+ \`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
43604
 
43590
43605
  ## Guardrails
43591
43606
 
@@ -45697,6 +45712,57 @@ function notificationUsage(bin) {
45697
45712
  ${bin} notification test
45698
45713
  ${bin} notification errors [--limit <n>]`;
45699
45714
  }
45715
+ var integrationWrapper = (context, args) => dispatch(context, "integration", args, {
45716
+ list: (ctx, rest) => {
45717
+ const parsed = parseFlags(rest);
45718
+ const body = withOptional({}, { provider: optionalValue(parsed, "provider") });
45719
+ return execute(ctx, parsed, "integration.list", body, (output) => {
45720
+ const integrations = asArray(asRecord(output).integrations);
45721
+ if (integrations.length === 0) {
45722
+ return "No integrations are connected.";
45723
+ }
45724
+ return integrations.map((entry) => formatIntegrationLine(asRecord(entry))).join("\n");
45725
+ });
45726
+ },
45727
+ status: (ctx, rest) => {
45728
+ const parsed = parseFlags(rest);
45729
+ const body = integrationLookupBody(parsed);
45730
+ return execute(ctx, parsed, "integration.status", body, (output) => {
45731
+ const integration = asRecord(output).integration;
45732
+ if (integration === null) {
45733
+ return "Integration not found.";
45734
+ }
45735
+ return formatIntegrationLine(asRecord(integration));
45736
+ });
45737
+ },
45738
+ test: (ctx, rest) => {
45739
+ const parsed = parseFlags(rest);
45740
+ const body = integrationLookupBody(parsed);
45741
+ return execute(ctx, parsed, "integration.test", body, (output) => {
45742
+ const record2 = asRecord(output);
45743
+ return `${field(record2, "provider")} ${field(record2, "status")} (ok=${field(record2, "ok")}) ${field(record2, "message")}`;
45744
+ });
45745
+ }
45746
+ }, integrationUsage(context.binName));
45747
+ function integrationLookupBody(parsed) {
45748
+ const body = withOptional({}, {
45749
+ provider: optionalValue(parsed, "provider"),
45750
+ integration_id: optionalValue(parsed, "integration-id")
45751
+ });
45752
+ if (Object.keys(body).length === 0) {
45753
+ throw new UsageError("Provide --provider or --integration-id.");
45754
+ }
45755
+ return body;
45756
+ }
45757
+ function formatIntegrationLine(record2) {
45758
+ return `${field(record2, "provider")} status=${field(record2, "status")} account=${field(record2, "account_email")} last_test=${field(record2, "last_test_result")} id=${field(record2, "id")}`;
45759
+ }
45760
+ function integrationUsage(bin) {
45761
+ return `Usage: ${bin} integration list|status|test [--json]
45762
+ ${bin} integration list [--provider <name>]
45763
+ ${bin} integration status --provider <name>
45764
+ ${bin} integration test --provider <name>`;
45765
+ }
45700
45766
  var settingsWrapper = (context, args) => dispatch(context, "settings", args, {
45701
45767
  get: (ctx, rest) => {
45702
45768
  const parsed = parseFlags(rest);
@@ -46060,6 +46126,7 @@ var OPERATION_GROUPS = [
46060
46126
  "sync",
46061
46127
  "runner",
46062
46128
  "notification",
46129
+ "integration",
46063
46130
  "settings",
46064
46131
  "member",
46065
46132
  "agent",
@@ -46078,6 +46145,7 @@ var wrappers = {
46078
46145
  sync: syncWrapper,
46079
46146
  runner: runnerWrapper,
46080
46147
  notification: notificationWrapper,
46148
+ integration: integrationWrapper,
46081
46149
  settings: settingsWrapper,
46082
46150
  member: memberWrapper,
46083
46151
  agent: agentWrapper,
@@ -46099,6 +46167,7 @@ var groupUsageBuilders = {
46099
46167
  sync: syncUsage,
46100
46168
  runner: runnerUsage,
46101
46169
  notification: notificationUsage,
46170
+ integration: integrationUsage,
46102
46171
  settings: settingsUsage,
46103
46172
  member: memberUsage,
46104
46173
  agent: agentUsage,
@@ -46616,9 +46685,38 @@ async function printCommandOutput(io, client, commandId, body = {}, format, opti
46616
46685
  `);
46617
46686
  return 0;
46618
46687
  } catch (error51) {
46688
+ if (io.interactive === true) {
46689
+ const pending = pendingConfirmationFromError(error51);
46690
+ if (pending && pending.commandId === commandId) {
46691
+ io.stderr.write(`Approving ${pending.commandId} confirmation ${pending.confirmationId} as the interactive CLI user.
46692
+ `);
46693
+ try {
46694
+ const approved = await client.execute("confirmation.approve", { confirmation_id: pending.confirmationId });
46695
+ const approvedOutput = asRecord2(approved.output).output ?? approved.output;
46696
+ const rendered = format ? format(approvedOutput) : JSON.stringify(approvedOutput, null, 2);
46697
+ io.stdout.write(`${rendered}
46698
+ `);
46699
+ return 0;
46700
+ } catch (approvalError) {
46701
+ return printCommandError(io, approvalError);
46702
+ }
46703
+ }
46704
+ }
46619
46705
  return printCommandError(io, error51);
46620
46706
  }
46621
46707
  }
46708
+ function pendingConfirmationFromError(error51) {
46709
+ if (!(error51 instanceof CommandClientError) || !error51.response || error51.response.ok || error51.response.error.code !== "COMMAND_CONFIRMATION_REQUIRED") {
46710
+ return null;
46711
+ }
46712
+ const details = asRecord2(error51.response.error.details);
46713
+ const confirmationId = details.confirmationId;
46714
+ const commandId = details.commandId;
46715
+ if (typeof confirmationId !== "string" || confirmationId.length === 0 || typeof commandId !== "string" || commandId.length === 0) {
46716
+ return null;
46717
+ }
46718
+ return { confirmationId, commandId };
46719
+ }
46622
46720
  function printCommandError(io, error51) {
46623
46721
  if (error51 instanceof CommandClientError && error51.response && !error51.response.ok) {
46624
46722
  const help = error51.response.error.help;