@rosthq/cli 0.7.79 → 0.7.81

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"command-manifest.d.ts","sourceRoot":"","sources":["../../src/generated/command-manifest.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,eAAO,MAAM,gBAAgB,EAAE,SAAS,oBAAoB,EAkQ3D,CAAC"}
1
+ {"version":3,"file":"command-manifest.d.ts","sourceRoot":"","sources":["../../src/generated/command-manifest.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,eAAO,MAAM,gBAAgB,EAAE,SAAS,oBAAoB,EAmQ3D,CAAC"}
package/dist/index.js CHANGED
@@ -39451,6 +39451,113 @@ var agentCreateFromTemplateOutputSchema = agentSetupStateSchema.extend({
39451
39451
  occupancy_created: external_exports.boolean()
39452
39452
  }).strict();
39453
39453
 
39454
+ // ../../packages/protocol/src/agent-definition-import.ts
39455
+ var boundedTextSchema = external_exports.string().trim().min(1).max(2e3);
39456
+ var shortTextSchema = external_exports.string().trim().min(1).max(240);
39457
+ var forbiddenImportKeys = /* @__PURE__ */ new Set([
39458
+ "credential",
39459
+ "credentials",
39460
+ "secret",
39461
+ "secrets",
39462
+ "api_key",
39463
+ "apiKey",
39464
+ "token",
39465
+ "vault_ref",
39466
+ "vaultRef",
39467
+ "tenant_id",
39468
+ "tenantId",
39469
+ "seat_id",
39470
+ "seatId",
39471
+ "parent_seat_id",
39472
+ "parentSeatId",
39473
+ "steward_seat_id",
39474
+ "stewardSeatId",
39475
+ "integration_id",
39476
+ "integrationId"
39477
+ ]);
39478
+ function rejectForbiddenImportShape(value, ctx, path8 = []) {
39479
+ if (value === null || value === void 0) {
39480
+ return;
39481
+ }
39482
+ if (typeof value === "string") {
39483
+ if (hasSecretShapedValue(value)) {
39484
+ ctx.addIssue({
39485
+ code: external_exports.ZodIssueCode.custom,
39486
+ path: path8,
39487
+ message: "Definition imports cannot contain secret-shaped values. Provide credentials later through vault-backed connection flows."
39488
+ });
39489
+ }
39490
+ return;
39491
+ }
39492
+ if (Array.isArray(value)) {
39493
+ value.forEach((item, index) => rejectForbiddenImportShape(item, ctx, [...path8, index]));
39494
+ return;
39495
+ }
39496
+ if (typeof value !== "object") {
39497
+ return;
39498
+ }
39499
+ for (const [key, nested] of Object.entries(value)) {
39500
+ const nestedPath = [...path8, key];
39501
+ if (forbiddenImportKeys.has(key)) {
39502
+ ctx.addIssue({
39503
+ code: external_exports.ZodIssueCode.custom,
39504
+ path: nestedPath,
39505
+ message: "Definition imports cannot carry credentials or tenant-local placement identifiers."
39506
+ });
39507
+ }
39508
+ rejectForbiddenImportShape(nested, ctx, nestedPath);
39509
+ }
39510
+ }
39511
+ var agentDefinitionImportToolSchema = external_exports.object({
39512
+ capability_id: external_exports.string().trim().min(1).max(160),
39513
+ access: external_exports.enum(["read", "draft", "write_with_approval"]).default("read"),
39514
+ rationale: external_exports.string().trim().max(360).optional()
39515
+ }).strict();
39516
+ var agentDefinitionImportFileSchema = external_exports.object({
39517
+ format: external_exports.literal("rost.agent_definition"),
39518
+ version: external_exports.literal(1),
39519
+ agent: external_exports.object({
39520
+ name: shortTextSchema,
39521
+ purpose: boundedTextSchema,
39522
+ responsibilities: external_exports.array(shortTextSchema).min(1).max(12),
39523
+ success_criteria: external_exports.array(shortTextSchema).min(1).max(12),
39524
+ never_do_alone: external_exports.array(shortTextSchema).min(1).max(12),
39525
+ lane: external_exports.enum(["cloud", "runner", "mcp_session"]).default("cloud"),
39526
+ model_tier: external_exports.enum(AGENT_MODEL_TIERS).optional(),
39527
+ requested_tools: external_exports.array(agentDefinitionImportToolSchema).max(50).default([])
39528
+ }).strict()
39529
+ }).strict().superRefine((value, ctx) => rejectForbiddenImportShape(value, ctx));
39530
+ var definitionJsonSchema = external_exports.string().trim().min(1).max(65536).transform((value, ctx) => {
39531
+ try {
39532
+ return JSON.parse(value);
39533
+ } catch {
39534
+ ctx.addIssue({ code: external_exports.ZodIssueCode.custom, message: "Definition import must be valid JSON." });
39535
+ return external_exports.NEVER;
39536
+ }
39537
+ }).pipe(agentDefinitionImportFileSchema);
39538
+ var agentDefinitionImportInputSchema = external_exports.object({
39539
+ definition_json: definitionJsonSchema,
39540
+ idempotency_key: external_exports.string().trim().min(1).max(120).optional()
39541
+ }).strict();
39542
+ var agentDefinitionImportMappingSchema = external_exports.object({
39543
+ method: external_exports.literal("import"),
39544
+ source_hash: external_exports.string().length(64),
39545
+ seat_name: external_exports.string(),
39546
+ lane: external_exports.enum(["cloud", "runner", "mcp_session"]),
39547
+ model_tier: external_exports.enum(AGENT_MODEL_TIERS).nullable(),
39548
+ requested_tools: external_exports.array(agentDefinitionImportToolSchema),
39549
+ unsupported: external_exports.array(external_exports.object({
39550
+ field: external_exports.string(),
39551
+ reason: external_exports.string()
39552
+ }).strict()).default([])
39553
+ }).strict();
39554
+ var agentDefinitionImportOutputSchema = external_exports.object({
39555
+ setup: agentSetupStateSchema,
39556
+ mapping: agentDefinitionImportMappingSchema,
39557
+ created: external_exports.boolean(),
39558
+ idempotency_key: external_exports.string().nullable()
39559
+ }).strict();
39560
+
39454
39561
  // ../../packages/protocol/src/provider-costs.ts
39455
39562
  var providerCostKinds = ["managed_llm", "exa", "browser", "sandbox"];
39456
39563
  var providerCostKindSchema = external_exports.enum(providerCostKinds);
@@ -42396,10 +42503,12 @@ var charterDraftInputSchema = external_exports.object({
42396
42503
  var charterDraftOutputSchema = external_exports.object({
42397
42504
  charter_version_id: uuidSchema11,
42398
42505
  seat_id: uuidSchema11,
42506
+ edit_revision: external_exports.number().int().min(1).optional(),
42399
42507
  doc: external_exports.unknown()
42400
42508
  }).strict();
42401
42509
  var charterUpdateDraftInputSchema = external_exports.object({
42402
42510
  charter_version_id: uuidSchema11,
42511
+ expected_edit_revision: external_exports.number().int().min(1).optional(),
42403
42512
  // DER-785 (Part G): the full Charter document contract (was `z.unknown()`).
42404
42513
  // The DB layer already validated this with `charterSchema.parse`; advertising
42405
42514
  // it here gives `command.describe`/`rost command schema` a real shape and a
@@ -42413,7 +42522,8 @@ var charterSetInputSchema = external_exports.object({
42413
42522
  }).strict();
42414
42523
  var charterMutationOutputSchema = external_exports.object({
42415
42524
  charter_version_id: uuidSchema11,
42416
- seat_id: uuidSchema11
42525
+ seat_id: uuidSchema11,
42526
+ edit_revision: external_exports.number().int().min(1).optional()
42417
42527
  }).strict();
42418
42528
  var charterApproveInputSchema = external_exports.object({
42419
42529
  seat_id: uuidSchema11.optional(),
@@ -42422,6 +42532,7 @@ var charterApproveInputSchema = external_exports.object({
42422
42532
  // These fields are shallow-merged onto the existing draft, then the merged doc
42423
42533
  // is re-validated against the full schema at persist time.
42424
42534
  edits: charterDocEditsSchema.optional(),
42535
+ expected_edit_revision: external_exports.number().int().min(1).optional(),
42425
42536
  apply_seat_type: external_exports.boolean().default(false)
42426
42537
  }).strict().refine((input) => Boolean(input.seat_id) || Boolean(input.charter_version_id), {
42427
42538
  message: "Provide seat_id or charter_version_id.",
@@ -44234,6 +44345,11 @@ var READ_SAFE_METHODS = /* @__PURE__ */ new Set(["GET", "HEAD", "OPTIONS"]);
44234
44345
  var brokerScopeTierSchema = external_exports.enum(["read", "write"]);
44235
44346
  var brokerInjectionModeSchema = external_exports.enum(["header_bearer", "header", "query"]);
44236
44347
  var brokerInjectionNameSchema = external_exports.string().min(1).max(100).regex(/^[A-Za-z0-9._-]+$/, "injection_name may contain only letters, digits, . _ -");
44348
+ var brokerInjectionPrefixSchema = external_exports.string().min(1).max(32).refine((value) => ![...value].some((ch) => ch.charCodeAt(0) < 32 || ch.charCodeAt(0) === 127), {
44349
+ message: "injection_prefix must not contain control characters"
44350
+ }).refine((value) => !hasSecretShapedValue(value), {
44351
+ message: 'injection_prefix must be config (e.g. "Token "), never raw secret material'
44352
+ });
44237
44353
  var brokerAllowedMethodsSchema = external_exports.array(brokerHttpMethodSchema).min(1, "at least one allowed method is required").max(7).refine((methods) => new Set(methods).size === methods.length, { message: "allowed_methods must not contain duplicates" });
44238
44354
  var brokerGrantStatusSchema = external_exports.enum(["active", "revoked"]);
44239
44355
  function refineGrantShape(value, ctx) {
@@ -44279,6 +44395,9 @@ var secretGrantGrantInputSchema = external_exports.object({
44279
44395
  scope_tier: brokerScopeTierSchema,
44280
44396
  injection_mode: brokerInjectionModeSchema.default("header_bearer"),
44281
44397
  injection_name: brokerInjectionNameSchema.optional(),
44398
+ // DER-1785: prepended to the secret for header/query grants; invalid for
44399
+ // header_bearer (whose `Bearer ` prefix is implicit — see the refine below).
44400
+ injection_prefix: brokerInjectionPrefixSchema.optional(),
44282
44401
  // ISO-8601; absent = no expiry.
44283
44402
  expires_at: external_exports.string().datetime({ offset: true }).optional()
44284
44403
  }).strict().superRefine((value, ctx) => {
@@ -44291,6 +44410,13 @@ var secretGrantGrantInputSchema = external_exports.object({
44291
44410
  message: "provide exactly one of vault_ref or credential_id"
44292
44411
  });
44293
44412
  }
44413
+ if (value.injection_mode === "header_bearer" && value.injection_prefix !== void 0) {
44414
+ ctx.addIssue({
44415
+ code: "custom",
44416
+ path: ["injection_prefix"],
44417
+ message: "injection_prefix is not valid for header_bearer mode (its Bearer prefix is implicit)"
44418
+ });
44419
+ }
44294
44420
  });
44295
44421
  var secretGrantGrantOutputSchema = external_exports.object({
44296
44422
  grant_id: uuid10,
@@ -44317,6 +44443,7 @@ var secretGrantSummarySchema = external_exports.object({
44317
44443
  scope_tier: brokerScopeTierSchema,
44318
44444
  injection_mode: brokerInjectionModeSchema,
44319
44445
  injection_name: external_exports.string().nullable(),
44446
+ injection_prefix: external_exports.string().nullable(),
44320
44447
  status: brokerGrantStatusSchema,
44321
44448
  granted_by_user_id: uuid10,
44322
44449
  granted_at: external_exports.string(),
@@ -46609,7 +46736,7 @@ The Compass is drafted, then activated by a human through supersession.
46609
46736
  order: 15,
46610
46737
  title: "AICOS chat guide",
46611
46738
  summary: "How the AI Chief of Staff chat works in the authenticated app shell and what it can safely do today.",
46612
- version: "2026-07-13.1",
46739
+ version: "2026-07-15.1",
46613
46740
  public: true,
46614
46741
  audiences: ["human", "in_app_agent"],
46615
46742
  stages: ["company_setup", "operating_rhythm"],
@@ -46684,6 +46811,8 @@ AICOS also has an explicit brain selection. Cloud can use the included managed a
46684
46811
 
46685
46812
  Runner mode uses the same AICOS sessions and transcript. Interactive chat turns are tracked separately from scheduled work orders: each user message has one user-owned turn execution with a short deadline, so two users' chat messages cannot collapse into the same scheduled-work slot. Scheduled and Forge runner work still use work orders. Runner claim packets carry ids and execution metadata, not the user's free-text request. After claim, the local runner calls the governed AICOS context-load tool, which re-checks seat scope and returns the bounded transcript, session summary, route context, tenant clock, grounding text, and source counts authorized for that turn. For execute-ready runners, the claim also carries a server-built Seat work contract that names the governed runtime profile, the AICOS context-loader tool, and the Seat's permission manifest; action attempts still route through command guards, tool-call audit, and pending confirmations. The runner treats loaded tenant clock, context, and contract as authoritative instead of substituting its own runtime clock, local files, or self-invented authority. A runner must be paired, execute-ready, and backed by the live AICOS agent before it can be selected.
46686
46813
 
46814
+ Agent seat pages can also expose a direct persistent chat with that seat's active agent. This is different from Seat-scoped AICOS: the target is the agent occupying the seat, the transcript is keyed by tenant, user, purpose, and target agent, and the same user can keep separate active threads for different agents. Owners and admins can read direct-agent transcripts for the tenant, and a human occupying the agent seat's Steward seat can read the transcript; unrelated members cannot. New prompts for a target agent enter an agent-scoped queue with a short turn deadline. A second prompt in the same thread coalesces into the pending turn until that turn is claimed, while prompts for another user or another agent keep their own queue position. Direct agent chat never dispatches through \`work_orders\`; scheduled and Forge runner work still use \`work_orders\`.
46815
+
46687
46816
  Cloud and runner submissions carry a stable request ID. Distinct requests that compete while a turn is active receive HTTP \`409\` with code \`AICOS_TURN_CONFLICT\`; the losing request writes no partial user message and consumes none of its attachments. Runner acquisition commits its user message, execution, attachment links, queued transcript projection, and session snapshot together, so a failed projection leaves none of them half-written. Retrying the same request ID returns the original turn and does not rerun the model, builder, onboarding, or runner-queue side effects, even if the currently selected lane or runner readiness changed after the original submission.
46688
46817
 
46689
46818
  When a runner claims an interactive AICOS turn, the runner reports start and final result back to {{brand}}. The turn row records claim/start/finish timing, terminal reason, model label, and token counts when the runner or cloud path provides them. The server appends exactly one assistant transcript message for the result, links that message to run evidence, and treats duplicate or late result reports as idempotent. If the runner answer includes a validated in-app link, the web panel can surface the same consent-required navigation suggestion once polling sees that the pending turn is terminal. If a queued, claimed, or running interactive turn passes its short deadline before a runner writes back, the turn is marked offline and the transcript receives a terminal assistant message instead of leaving a permanent "queued" placeholder.
@@ -47441,7 +47570,7 @@ Use the lower-level commands after health names a finding: \`agent.get_run\` for
47441
47570
  order: 46,
47442
47571
  title: "Tool access and vault",
47443
47572
  summary: "How to give agents access to tools without exposing raw credentials or expanding authority by accident.",
47444
- version: "2026-07-13.1",
47573
+ version: "2026-07-14.1",
47445
47574
  public: true,
47446
47575
  audiences: ["human", "cli", "mcp", "in_app_agent"],
47447
47576
  stages: ["staffing"],
@@ -47497,6 +47626,8 @@ The native Gmail handlers run inside the same broker boundary as the REST and Sl
47497
47626
 
47498
47627
  Google can be connected from Settings once the workspace OAuth app is configured. The connection flow requests offline access for Gmail read/compose/send and Sheets, stores the returned credential in the vault, and records only account, scope, and capability-availability metadata in the integration row. Partial grants are accepted when at least one connector capability is usable; missing or revoked scopes reduce the affected capability instead of granting more authority. The test action refreshes the vaulted credential and performs a minimal Gmail profile read. Gmail read/draft/send, bounded Sheets read, and approval-held Sheets write handlers run through the guarded broker when Google is connected; connecting Google still does not bypass the signed Charter manifest, tenant policy ceiling, credential vault, or tool-call audit. Sheet grants should use exact signed argument bindings for approved spreadsheet ids and ranges.
47499
47628
 
47629
+ A connected Baserow REST integration (\`integration.connect_rest\`) derives a \`baserow.read\` tenant capability ceiling the same way: a live connection surfaces read, and a disconnected/revoked one collapses to off. The derivation is read-only by design \u2014 \`baserow.write\` is never inferred from the connection and is granted only through an explicit per-seat brokered secret grant, matching the conservative-by-default rule for every connection-backed ceiling.
47630
+
47500
47631
  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.
47501
47632
 
47502
47633
  \`integration.connect_rest\` creates or rotates the supported Baserow REST integration through the credential flow. It stores the token in the vault, persists only endpoint/account metadata plus a tenant-scoped integration row, marks the adapter as \`rest\`, and returns no vault ref or secret. Because the input includes a raw secret, generated CLI argv refuses the command and it is deliberately not exposed as an agent-callable MCP tool; run it from Settings or the command API credential flow instead of shell arguments.
@@ -47587,7 +47718,7 @@ External connectors are being rolled out provider by provider, conservatively (r
47587
47718
  order: 48,
47588
47719
  title: "CLI and MCP installation guide",
47589
47720
  summary: "Install the public CLI, register remote token-backed MCP clients, and find the full command and tool catalog.",
47590
- version: "2026-07-13.8",
47721
+ version: "2026-07-15.1",
47591
47722
  public: true,
47592
47723
  audiences: ["human", "cli", "mcp", "in_app_agent"],
47593
47724
  stages: ["company_setup", "staffing"],
@@ -48175,6 +48306,7 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
48175
48306
  | \`rost_assign_user_to_seat\` | \`staffing.assign_user\` | Assign a human user occupancy to a seat. | Seat or tenant-admin | Call with \`seat_id\` and \`user_id\`. |
48176
48307
  | \`rost_assign_dry_run_agent_to_seat\` | \`staffing.assign_agent_dry_run\` | Assign an agent occupancy in dry-run mode. | Seat or tenant-admin | Call only after Steward chain is clear. |
48177
48308
  | \`rost_staff_seat\` | \`staffing.assign\` | Compatibility helper for human, agent, or hybrid staffing. | Seat or tenant-admin | Call with \`seat_id\` and \`occupant\`. |
48309
+ | \`rost_import_agent_definition\` | \`agent.import_definition\` | Import a strict, versioned agent definition into a canonical draft Seat/setup without credentials, placement ids, or go-live side effects. | Tenant | Human-gated; call with \`definition_json\` and optional \`idempotency_key\`. Review the resulting draft setup before tools, dry run, or go-live. |
48178
48310
  | \`rost_go_live\` | \`agent.go_live\` | Promote a dry-run agent seat to live. | Seat or tenant-admin | Call after human approval. |
48179
48311
  | \`rost_create_mcp_token\` | \`mcp_token.create\` | Mint a tenant-admin or seat-scoped MCP token. | Tenant | Prefer \`{{cli}} mcp install\` for users. |
48180
48312
  | \`rost_revoke_mcp_token\` | \`mcp_token.revoke\` | Revoke an MCP token immediately. | Tenant | Call with \`token_id\`. |
@@ -48380,11 +48512,11 @@ Preview deployment creation is a governed command. \`software_factory.vercel.dep
48380
48512
 
48381
48513
  #### Secret broker grants (tenant-level)
48382
48514
 
48383
- Generalized brokered-secret egress beyond Forge (DER-1738). A human grants an agent seat a scoped secret the \`secret.broker\` egress tool and the \`baserow.read\`/\`baserow.write\` tools (DER-1739) resolve server-side; Postgres stores only a vault-ref pointer, never secret material. A seat agent asks for and lists its own grants through the seat-scoped \`secret_grant.request\` / \`secret_grant.list\` tools (in Seat-scoped operating tools below); a human grants and revokes here. To grant, pass \`credential_id\` (from \`credential.list\`, DER-1777) instead of a raw \`vault_ref\` \u2014 the command resolves the ref server-side so no product flow ever exposes it. Baserow authenticates with an \`Authorization: Token <key>\` header, so a Baserow grant uses \`injection_mode: "header"\`, \`injection_name: "Authorization"\`, and stores the full \`Token <key>\` string as its vault secret.
48515
+ Generalized brokered-secret egress beyond Forge (DER-1738). A human grants an agent seat a scoped secret the \`secret.broker\` egress tool and the \`baserow.read\`/\`baserow.write\` tools (DER-1739) resolve server-side; Postgres stores only a vault-ref pointer, never secret material. A seat agent asks for and lists its own grants through the seat-scoped \`secret_grant.request\` / \`secret_grant.list\` tools (in Seat-scoped operating tools below); a human grants and revokes here. To grant, pass \`credential_id\` (from \`credential.list\`, DER-1777) instead of a raw \`vault_ref\` \u2014 the command resolves the ref server-side so no product flow ever exposes it. Baserow authenticates with an \`Authorization: Token <key>\` header, so a Baserow grant uses \`injection_mode: "header"\`, \`injection_name: "Authorization"\`, and \`injection_prefix: "Token "\` (DER-1785) \u2014 the broker prepends the prefix to the raw key at render time, so the credential's vault secret stays the RAW key and granting it by \`credential_id\` renders \`Authorization: Token <key>\` correctly. (\`injection_prefix\` is non-secret config, capped at 32 chars, rejects control characters, and is invalid for \`injection_mode: "header_bearer"\`, whose \`Bearer \` prefix is implicit.) Older grants that instead stored the full \`Token <key>\` string as the vault secret with no prefix still work \u2014 the broker injects that verbatim.
48384
48516
 
48385
48517
  | Tool | Command | What it does | Scope | Notes |
48386
48518
  |---|---|---|---|---|
48387
- | \`rost_grant_a_brokered_secret\` | \`secret_grant.grant\` | A human grants a seat scoped brokered-secret access. Supply exactly one of credential_id (from credential.list / credential.ingress \u2014 resolved to its vault ref server-side, so a human never handles a ref) or vault_ref directly. Postgres stores only the pointer, never secret material. Owner-only and human-gated; the secret.broker and baserow.* tools resolve it server-side and the secret never enters agent context. | Tenant-admin | Call with {"seat_id":"<seat-id>","grant_key":"baserow","provider":"baserow","allowed_host":"baserow.example.com","allowed_path_prefix":"/api/database/rows/","allowed_methods":["GET","POST","PATCH"],"scope_tier":"write","injection_mode":"header","injection_name":"Authorization","credential_id":"<credential-id>"} (or "vault_ref":"infisical://prod/baserow-token" instead of credential_id). |
48519
+ | \`rost_grant_a_brokered_secret\` | \`secret_grant.grant\` | A human grants a seat scoped brokered-secret access. Supply exactly one of credential_id (from credential.list / credential.ingress \u2014 resolved to its vault ref server-side, so a human never handles a ref) or vault_ref directly. Postgres stores only the pointer, never secret material. Owner-only and human-gated; the secret.broker and baserow.* tools resolve it server-side and the secret never enters agent context. | Tenant-admin | Call with {"seat_id":"<seat-id>","grant_key":"baserow","provider":"baserow","allowed_host":"baserow.example.com","allowed_path_prefix":"/api/database/rows/","allowed_methods":["GET","POST","PATCH"],"scope_tier":"write","injection_mode":"header","injection_name":"Authorization","injection_prefix":"Token ","credential_id":"<credential-id>"} (or "vault_ref":"infisical://prod/baserow-token" instead of credential_id). injection_prefix is optional; use it (DER-1785) when the credential stores a RAW key so the broker renders "Token <key>". |
48388
48520
  | \`rost_revoke_a_brokered_secret_grant\` | \`secret_grant.revoke\` | Revoke a brokered secret grant (teardown \u2014 cut a compromised or over-scoped seat egress immediately; the next broker call fails closed). Owner-only and human-gated. | Tenant-admin | Call with {"grant_id":"<grant-id>"}; non-interactive callers receive a confirmation handoff. |
48389
48521
  | \`rost_list_stored_credentials\` | \`credential.list\` | List the tenant's stored credentials as metadata only \u2014 credential id, provider, label, seat, status, and created/rotated/revoked dates. NEVER returns the vault ref or any secret. Use the returned credential_id with secret_grant.grant. | Tenant-admin | Call with {}. |
48390
48522
 
@@ -48733,7 +48865,7 @@ Set \`ROST_SKILL_INSTALL_ROOT\` only for a sandbox or CI override. Local copies
48733
48865
  order: 55,
48734
48866
  title: "Agent reference map",
48735
48867
  summary: "Where CLI sessions, MCP clients, and in-app agents should retrieve {{brand}} guidance before recommending setup changes.",
48736
- version: "2026-06-27.2",
48868
+ version: "2026-07-15.1",
48737
48869
  public: true,
48738
48870
  audiences: ["cli", "mcp", "in_app_agent"],
48739
48871
  stages: ["company_setup", "graph_design", "charter_design", "staffing", "operating_rhythm"],
@@ -48805,21 +48937,22 @@ Agents that run on {{brand}}-managed inference draw against a tenant inference b
48805
48937
  8. add-agents-guide
48806
48938
  9. custom-agents-guide
48807
48939
  10. agent-builder-guide
48808
- 11. how-agents-work
48809
- 12. tool-access-and-vault
48810
- 13. available-tools-guide
48811
- 14. mcp-and-cli-guide
48812
- 15. skill-builder-guide
48813
- 16. agent-skill-authoring-guide
48814
- 17. agent-skill-setup-guide
48815
- 18. ai-model-data-handling-guide
48816
- 19. cascade-guide
48817
- 20. signal-guide
48818
- 21. friction-guide
48819
- 22. confirmations-guide
48820
- 23. steward-queue-guide
48821
- 24. sync-rhythm-playbook
48822
- 25. billing-and-pricing-guide
48940
+ 11. agent-definition-import-guide
48941
+ 12. how-agents-work
48942
+ 13. tool-access-and-vault
48943
+ 14. available-tools-guide
48944
+ 15. mcp-and-cli-guide
48945
+ 16. skill-builder-guide
48946
+ 17. agent-skill-authoring-guide
48947
+ 18. agent-skill-setup-guide
48948
+ 19. ai-model-data-handling-guide
48949
+ 20. cascade-guide
48950
+ 21. signal-guide
48951
+ 22. friction-guide
48952
+ 23. confirmations-guide
48953
+ 24. steward-queue-guide
48954
+ 25. sync-rhythm-playbook
48955
+ 26. billing-and-pricing-guide
48823
48956
 
48824
48957
  ## Workflow to guide map
48825
48958
 
@@ -48834,6 +48967,7 @@ Read the listed guide before recommending or running each workflow. Every workfl
48834
48967
  - Add an agent through the app (graph or sidebar, visual journey): add-agents-guide.
48835
48968
  - Create an agent from a template: stock-agents-guide, then how-agents-work.
48836
48969
  - Create a custom agent (operational answers, Charter Builder, configure tools, dry run, go live): custom-agents-guide, then agent-staffing-playbook and tool-access-and-vault.
48970
+ - Import a versioned agent definition file: agent-definition-import-guide, then agent-staffing-playbook and tool-access-and-vault.
48837
48971
  - Create, import, review, or publish a reusable Skill: skill-builder-guide for human workflow, then agent-skill-authoring-guide for CLI/MCP authoring rules.
48838
48972
  - Assign, dependency-check, enable a catalog Skill, import a GitHub Skill, or sync local Skill files: agent-skill-setup-guide, then mcp-and-cli-guide.
48839
48973
  - Explain AI model data handling, BYOK, local agent provider settings, or what data may enter prompts/tool calls: ai-model-data-handling-guide, then security-model-guide.
@@ -48854,7 +48988,7 @@ Read the listed guide before recommending or running each workflow. Every workfl
48854
48988
  - Company setup: rost-implementation-method, compass-authoring-guide, aicos-chat-guide, settings-guide, settings-members-and-invites-guide
48855
48989
  - Graph design: responsibility-graph-playbook
48856
48990
  - Charter design: charter-design-playbook, charter-authoring-deep-dive
48857
- - Staffing: agent-staffing-playbook, add-agents-guide, custom-agents-guide, agent-builder-guide, how-agents-work, tool-access-and-vault, available-tools-guide, skill-builder-guide, agent-skill-authoring-guide, agent-skill-setup-guide, mcp-and-cli-guide, stock-agents-guide
48991
+ - Staffing: agent-staffing-playbook, add-agents-guide, custom-agents-guide, agent-builder-guide, agent-definition-import-guide, how-agents-work, tool-access-and-vault, available-tools-guide, skill-builder-guide, agent-skill-authoring-guide, agent-skill-setup-guide, mcp-and-cli-guide, stock-agents-guide
48858
48992
  - Operating rhythm: aicos-chat-guide, cascade-guide, signal-guide, friction-guide, confirmations-guide, steward-queue-guide, sync-rhythm-playbook, notifications-guide
48859
48993
  - Local agents and runners: mcp-and-cli-guide, runner-guide, agent-reference-map
48860
48994
  - Security and troubleshooting: ai-model-data-handling-guide, security-model-guide, troubleshooting-guide
@@ -49240,7 +49374,7 @@ Keep agent scope tight at first. Approve more autonomy only after evidence. Use
49240
49374
  order: 71,
49241
49375
  title: "Confirmations and human gates guide",
49242
49376
  summary: "How {{brand}} routes authority-changing work through human confirmation, and why agents never approve their own requests.",
49243
- version: "2026-07-13.1",
49377
+ version: "2026-07-14.2",
49244
49378
  public: true,
49245
49379
  audiences: ["human", "cli", "mcp", "in_app_agent"],
49246
49380
  stages: ["graph_design", "charter_design", "staffing", "operating_rhythm"],
@@ -49279,6 +49413,8 @@ When an **agent** triggers a gate, {{brand}} also notifies the seat's steward (S
49279
49413
 
49280
49414
  Approval replays are validated again before execution. If the stored confirmation input no longer matches the original command schema, the approval fails without consuming the pending confirmation or running the durable command; reject it and re-issue the gated action from the current product surface.
49281
49415
 
49416
+ A held tool call actuates the same way regardless of which command backs it \u2014 a connector write (like \`gmail.send\`) and a durable command (like \`task.create\`) both replay through the same governed command executor on approval: re-checked against the live permission manifest, reserved so a second approval or replay can never double-actuate, and audited with a fresh \`tool_calls\` row. Resolving the escalation that raised the hold \u2014 over the CLI, MCP, or \`/approvals\` \u2014 actuates identically; none of those paths silently drops the held action once a human approves it.
49417
+
49282
49418
  \`\`\`bash
49283
49419
  # Human approves a pending confirmation
49284
49420
  {{cli}} command confirmation.approve --json '{"confirmation_id":"<confirmation-id>"}'
@@ -49288,7 +49424,7 @@ Approval replays are validated again before execution. If the stored confirmatio
49288
49424
 
49289
49425
  ## The approvals queue
49290
49426
 
49291
- The \`/approvals\` page is one place a human clears every pending decision across the company. It unions still-pending confirmations with open steward escalations into a single queue, each item shown with its risk, the source seat, and redacted arguments \u2014 secret material is never displayed. You see only items for seats you have authority over: an owner sees all of them; a member sees confirmations for the seats they occupy and escalations routed to their steward chain, and nothing else. Approve and reject route through the same \`confirmation.approve\` / \`confirmation.reject\` and escalation decision commands the CLI and per-seat surfaces use, so the audit trail and the agents-recommend-humans-decide rule are identical wherever you act.
49427
+ The \`/approvals\` page is one place a human clears every pending decision across the company. It unions still-pending confirmations with open steward escalations into a single queue, each item shown with its risk, the source seat, and redacted arguments \u2014 secret material is never displayed. You see only items for seats you have authority over: an owner sees all of them; a member sees confirmations for the seats they occupy and escalations routed to their steward chain, and nothing else. Approve and reject route through the same \`confirmation.approve\` / \`confirmation.reject\` and escalation decision commands the CLI and per-seat surfaces use, so the audit trail and the agents-recommend-humans-decide rule are identical wherever you act. The queue also unions pending Forge software-credential requests (owner-scoped, read-only, deep-linking to \`/forge\`) \u2014 it surfaces the ask and links to the vault-backed fulfillment flow, never collecting the secret itself. A confirmation that fails on approval shows the actual execution error inline as a \`failed\` card instead of a dead generic banner, and its Retry re-runs \`confirmation.approve\` against current state; re-minting the same request supersedes the older card instead of leaving a duplicate behind.
49292
49428
 
49293
49429
  ## The rule for agents
49294
49430
 
@@ -49412,7 +49548,7 @@ Do not claim that a live charge happened unless Stripe test/live evidence proves
49412
49548
  order: 72,
49413
49549
  title: "Settings guide",
49414
49550
  summary: "How to use Settings as the control plane for company access, channels, providers, tokens, and operating defaults.",
49415
- version: "2026-07-11.1",
49551
+ version: "2026-07-14.1",
49416
49552
  public: true,
49417
49553
  audiences: ["human", "cli", "mcp", "in_app_agent"],
49418
49554
  stages: ["company_setup", "staffing"],
@@ -49435,7 +49571,7 @@ Start with members and invites, then provider and channel connections, then MCP
49435
49571
 
49436
49572
  ## Navigating Settings
49437
49573
 
49438
- Settings is reached from the footer gear in the left sidebar (the nav collapse moved it out of the primary item list). It is a left-rail master\u2013detail layout: a grouped rail (General, Team & Access, Billing, AI & Agents, Connections, Advanced) selects one section at a time, shown in the detail pane. The active section is a URL search param, so \`/settings?section=<id>\` is linkable and survives a refresh. The Connections section is the workspace-level provider surface: Google, Slack, QuickBooks, local runners, seat-scoped agent tokens, and stored secrets appear as provider cards with status, used-for chips, actions, and the shared Access language (**Off / Read / Draft / Act with approval**). Detailed management forms for tokens, channels, runners, provider links, and stored vault entries remain reachable from those cards.
49574
+ Settings is reached from the footer gear in the left sidebar (the nav collapse moved it out of the primary item list). It is a left-rail master\u2013detail layout: a grouped rail (General, Team & Access, Billing, AI & Agents, Connections, Advanced) selects one section at a time, shown in the detail pane. The active section is a URL search param, so \`/settings?section=<id>\` is linkable and survives a refresh. The Connections section is the workspace-level provider surface: Google, Slack, QuickBooks, local runners, seat-scoped agent tokens, and stored secrets appear as provider cards with status, used-for chips, actions, and the shared Access language (**Off / Read / Draft / Act with approval**). Any other \`integrations\` row \u2014 e.g. a Baserow REST/custom connection created through \`integration.connect_rest\` \u2014 renders as a generic connection card alongside the stock providers, so a non-stock connector is never invisible on this page. Detailed management forms for tokens, channels, runners, provider links, and stored vault entries remain reachable from those cards.
49439
49575
 
49440
49576
  Section state is fully server-side: every in-app link, redirect, and save uses \`?section=<id>\`, never a \`#anchor\` \u2014 there is no client-side hash shim to desync from. Documented shortcut pages redirect straight to the right section instead of a dead end: \`/settings/integrations\` and \`/readiness\` redirect to \`?section=connections\` (connector readiness lives inside the Connections overview, not on a standalone page), \`/settings/members\` redirects to \`?section=members\`, \`/settings/policy\` redirects to \`?section=guardrails\`, and MCP/CLI access tokens live in the Agent access tokens section (not a separate \`/mcp\` page \u2014 \`/mcp\` is the MCP protocol endpoint itself, not a browsable settings screen). The Advanced group links out to \`/migration/ninety\`, the one settings-adjacent page with no home in the grouped rail. Every settings form carries the section it lives in, so saving a change redirects back to that same section with no flash, instead of returning to the top.
49441
49577
 
@@ -49574,7 +49710,7 @@ When a user asks to add a person, clarify whether they mean app access, seat occ
49574
49710
  order: 74,
49575
49711
  title: "Notifications guide",
49576
49712
  summary: "How {{brand}} should notify humans about decisions, escalations, stale work, and agent boundaries.",
49577
- version: "2026-07-09.1",
49713
+ version: "2026-07-14.1",
49578
49714
  public: true,
49579
49715
  audiences: ["human", "cli", "mcp", "in_app_agent"],
49580
49716
  stages: ["operating_rhythm"],
@@ -49605,6 +49741,10 @@ Notifications should move decisions to the right human without turning {{brand}}
49605
49741
 
49606
49742
  \`{{cli}} notification errors --limit 10\` / \`notification.list_errors\` / \`rost_list_notification_errors\` returns recent failed deliveries. When a failed notification links to a product error, it includes \`error_log_id\`, \`source\`, and any linked \`seat_id\` / \`run_id\`; \`source=run\` means the notification is tied to an agent run and can be followed with \`agent.get_run\` for the transcript reference and run errors.
49607
49743
 
49744
+ ## Telegram channel
49745
+
49746
+ Telegram is an opt-in delivery channel that sits alongside email. A workspace admin connects a Telegram bot once (create it with @BotFather, paste the token in Settings \u2192 Notifications; the token is stored in the vault as a credential reference, never in env or logs). Each person then opts in from the same page: {{brand}} shows a one-time deep link, you start the bot, and {{brand}} verifies your chat. Once verified, held approvals, escalations, briefs, and the daily digest are delivered to Telegram, with email as the fallback. Messages are bounded and secret-free and link back to the relevant {{brand}} item. Opt out any time from Settings \u2192 Notifications.
49747
+
49608
49748
  ## Keep notifications useful
49609
49749
 
49610
49750
  Every notification should include the seat, cause, evidence, and requested decision. Avoid status-only messages when no action is needed.`
@@ -50699,6 +50839,72 @@ The Charter you submit for an agent seat is the full Charter document (see the c
50699
50839
  ## Show your human a review
50700
50840
 
50701
50841
  When you have built the setup, render a clean markdown card for your human before go-live: \`{{cli}} agent show --seat-id <id> --markdown\` (or \`{{cli}} charter show --seat-id <id> --markdown\` / \`{{cli}} compass show --markdown\`). The card composes the setup, model, steward, tools, and Charter into one skimmable readout. Then surface the go-live for a human to approve \u2014 go-live is human-gated and a seat token never goes live on its own setup.`
50842
+ },
50843
+ {
50844
+ slug: "agent-definition-import-guide",
50845
+ order: 44,
50846
+ title: "Agent definition import guide",
50847
+ summary: "The strict versioned JSON format for importing an agent as a draft Seat/setup without credentials, placement ids, or go-live side effects.",
50848
+ version: "2026-07-15.1",
50849
+ public: true,
50850
+ audiences: ["human", "cli", "mcp", "in_app_agent"],
50851
+ stages: ["staffing", "charter_design"],
50852
+ relatedCommandIds: ["agent.import_definition", "agent.create_custom", "agent_setup.get", "agent.configure_tools"],
50853
+ legal: {
50854
+ publicRisk: "low",
50855
+ notes: [
50856
+ "Documents a ROST-native import contract only.",
50857
+ "Explicitly excludes credentials and tenant-local identifiers from the import file."
50858
+ ]
50859
+ },
50860
+ sources: [
50861
+ {
50862
+ label: "Agent definition import spec",
50863
+ internalPath: "docs/specs/agent-definition-import.md",
50864
+ note: "Internal source for the versioned import JSON example and safety rules."
50865
+ }
50866
+ ],
50867
+ body: `# Agent definition import guide
50868
+
50869
+ Use \`agent.import_definition\` when you already have a bounded agent description and want to turn it into a draft {{brand}} agent setup. Import is a starting point, not go-live.
50870
+
50871
+ The command creates a draft agent Seat, starts the canonical setup flow, maps the definition into operational answers, and returns \`agent_setup.get\` state. It does not sign the Charter, grant tools, store credentials, run a dry run, or approve go-live.
50872
+
50873
+ ## Safety rules
50874
+
50875
+ - The file must use \`"format": "rost.agent_definition"\` and \`"version": 1\`.
50876
+ - Unknown fields are rejected.
50877
+ - Credentials, vault refs, API keys, tokens, tenant ids, Seat ids, parent ids, steward ids, and integration ids are rejected.
50878
+ - Secret-shaped string values are rejected even when they appear in otherwise allowed fields.
50879
+ - Requested tools are review context only. Grants and credential ingress still happen through setup.
50880
+ - Placement is server-side. The import file cannot choose a parent Seat or Steward.
50881
+
50882
+ ## Example
50883
+
50884
+ \`\`\`json
50885
+ {
50886
+ "format": "rost.agent_definition",
50887
+ "version": 1,
50888
+ "agent": {
50889
+ "name": "Customer Follow-up Agent",
50890
+ "purpose": "Prepare account follow-ups for steward review.",
50891
+ "responsibilities": ["Summarize recent customer signals", "Draft follow-up tasks"],
50892
+ "success_criteria": ["Stewards receive concise weekly follow-up drafts"],
50893
+ "never_do_alone": ["Send external customer messages", "Change billing or credentials"],
50894
+ "lane": "cloud",
50895
+ "model_tier": "balanced",
50896
+ "requested_tools": [
50897
+ {
50898
+ "capability_id": "google.gmail.read",
50899
+ "access": "read",
50900
+ "rationale": "Read recent customer context"
50901
+ }
50902
+ ]
50903
+ }
50904
+ }
50905
+ \`\`\`
50906
+
50907
+ After import, continue from the draft Seat page. Review the Charter, choose a Steward, configure tools and connections, sign the manifest, run a dry run, and approve go-live only when the human review is complete.`
50702
50908
  }
50703
50909
  ];
50704
50910
 
@@ -51547,6 +51753,7 @@ var COMMAND_MANIFEST = [
51547
51753
  { "id": "agent.fleet_digest", "namespace": "agent", "action": "fleet_digest", "title": "Get dogfood fleet health digest", "description": "Return a daily tenant fleet health digest with live/idle state, run counts, spend, failed runs, unresolved product errors, notification errors, and next actions.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "window_hours", "flag": "window-hours", "type": "integer", "required": false }, { "name": "error_limit", "flag": "error-limit", "type": "integer", "required": false }], "hasComplexInput": false, "help": "Capture a daily dogfood fleet health digest with fleet state, run counts, spend, failed runs, unresolved errors, failed notifications, and next actions." },
51548
51754
  { "id": "agent.get_run", "namespace": "agent", "action": "get_run", "title": "Get agent run diagnostics", "description": "Return one seat run's diagnostic record: run status, transcript reference, token/cost usage, outcome, and linked product-visible run errors.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "run_id", "flag": "run-id", "type": "string", "required": true }, { "name": "transcript", "flag": "transcript", "type": "boolean", "required": false }], "hasComplexInput": false, "help": "Read one run's diagnostic record, transcript reference, token/cost usage, outcome, and linked product-visible errors." },
51549
51755
  { "id": "agent.go_live", "namespace": "agent", "action": "go_live", "title": "Go live", "description": "Promote a dry-run agent seat to live after the human approval gate.", "requiredScope": "seat", "confirmation": "human_required", "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": "Move an agent live only after dry-run evidence, signed permissions, and a human Steward chain are clear.", "example": { "seat_id": "0190aaaa-aaaa-7aaa-8aaa-aaaaaaaaaaaa", "charter_version_id": "0190cccc-cccc-7ccc-8ccc-cccccccccccc" } },
51756
+ { "id": "agent.import_definition", "namespace": "agent", "action": "import_definition", "title": "Import agent definition", "description": "Import a versioned ROST agent definition into a canonical draft Seat and setup state without credentials, placement identifiers, or go-live side effects.", "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "definition_json", "flag": "definition-json", "type": "string", "required": true }, { "name": "idempotency_key", "flag": "idempotency-key", "type": "string", "required": false }], "hasComplexInput": false, "help": "Import a strict, versioned ROST agent definition into a canonical draft Seat/setup. The file cannot carry credentials or tenant-local placement ids; tools remain proposal-only until reviewed through setup." },
51550
51757
  { "id": "agent.list_fleet", "namespace": "agent", "action": "list_fleet", "title": "List agent fleet", "description": "Return every agent-occupied seat with lane, live state, last real turn, recent turn counts, top measurable status, open escalations, and 7-day real-run spend.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [], "hasComplexInput": false, "help": "Read every agent-occupied seat at once: lane, live state, last real turn, 24h/7d turns, measurable status, escalations, and spend." },
51551
51758
  { "id": "agent.list_runs", "namespace": "agent", "action": "list_runs", "title": "List agent runs", "description": "Return a seat's agent run history (status, lane, model, cost, per-run tool-call and guard-denial counts) plus the seat's run/tool-call rollup with held-action count.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "limit", "flag": "limit", "type": "integer", "required": false }], "hasComplexInput": false, "help": "Audit a seat's agent run history with per-run tool-call and guard-held counts (the Trust Card)." },
51552
51759
  { "id": "agent.list_tool_calls", "namespace": "agent", "action": "list_tool_calls", "title": "List agent tool calls", "description": "Return a seat's tool-call ledger (tool name, guard result, manifest clause, outcome) with the held-action count as the hero metric. Pass held_only to return only guard-held calls. Never returns argument summaries or secret material.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "limit", "flag": "limit", "type": "integer", "required": false }, { "name": "held_only", "flag": "held-only", "type": "boolean", "required": false }], "hasComplexInput": false, "help": "Audit a seat's tool-call ledger with each call's guard result; held actions are the hero metric." },
@@ -51566,7 +51773,7 @@ var COMMAND_MANIFEST = [
51566
51773
  { "id": "aicos.brain_settings.update", "namespace": "aicos", "action": "brain_settings.update", "title": "Update AICOS brain settings", "description": "Update the AICOS lane and cloud/runner brain preferences. Owner-only and audited.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "lane", "flag": "lane", "type": "enum", "required": false, "enumValues": ["cloud", "runner", "mcp"] }, { "name": "cloud_brain", "flag": "cloud-brain", "type": "enum", "required": false, "enumValues": ["managed", "byok"] }, { "name": "runner_brain", "flag": "runner-brain", "type": "enum", "required": false, "enumValues": ["claude-cli", "codex-cli"] }, { "name": "cloud_model_slug", "flag": "cloud-model-slug", "type": "string", "required": false }], "hasComplexInput": false, "help": "Owner-only update for AICOS cloud managed/BYOK and runner Claude/Codex preferences; BYOK requires an active tenant Anthropic key." },
51567
51774
  { "id": "cascade.import", "namespace": "cascade", "action": "import", "title": "Import Rocks from a ninety Rocks export", "description": "Bulk-import a ninety Rocks export into the Cascade as cycle goals under a company objective in the active cycle. Owners are seat names resolved to seats. Requires an active cycle and a target company objective (auto-selected when exactly one exists, else pass parent_objective_id). Idempotent \u2014 re-importing the same export is a no-op, and an existing cycle goal with the same objective + seat + title is skipped.", "requiredScope": "tenant_admin", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "dry_run", "flag": "dry-run", "type": "boolean", "required": false }, { "name": "parent_objective_id", "flag": "parent-objective-id", "type": "string", "required": false }], "hasComplexInput": true, "help": "Import a ninety Rocks export into the Cascade as cycle goals under a company objective in the active cycle; owners resolve to seats." },
51568
51775
  { "id": "charter.apply_seat_type_recommendation", "namespace": "charter", "action": "apply_seat_type_recommendation", "title": "Apply Charter seat-type recommendation", "description": "Apply the seat-type recommendation from a draft Charter.", "requiredScope": "seat", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "charter_version_id", "flag": "charter-version-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Apply seat-type recommendations only after the Charter clarifies work shape, risk, and Steward accountability." },
51569
- { "id": "charter.approve", "namespace": "charter", "action": "approve", "title": "Approve charter", "description": "Approve a draft Charter as a human owner.", "requiredScope": "seat", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": false }, { "name": "charter_version_id", "flag": "charter-version-id", "type": "string", "required": false }, { "name": "apply_seat_type", "flag": "apply-seat-type", "type": "boolean", "required": false }], "hasComplexInput": true, "help": "Charter approval is a human decision that activates the seat's operating contract." },
51776
+ { "id": "charter.approve", "namespace": "charter", "action": "approve", "title": "Approve charter", "description": "Approve a draft Charter as a human owner.", "requiredScope": "seat", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": false }, { "name": "charter_version_id", "flag": "charter-version-id", "type": "string", "required": false }, { "name": "expected_edit_revision", "flag": "expected-edit-revision", "type": "integer", "required": false }, { "name": "apply_seat_type", "flag": "apply-seat-type", "type": "boolean", "required": false }], "hasComplexInput": true, "help": "Charter approval is a human decision that activates the seat's operating contract." },
51570
51777
  { "id": "charter.draft", "namespace": "charter", "action": "draft", "title": "Draft charter", "description": "Create or fetch a draft Charter for a seat.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Draft Charters that define purpose, responsibilities, decision authority, measurables, tools, budget, and escalation; the charter authoring deep-dive shows what good looks like per field." },
51571
51778
  { "id": "charter.draft_all", "namespace": "charter", "action": "draft_all", "title": "Draft all charters", "description": "Draft Charters for every eligible seat in a tenant.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [], "hasComplexInput": false, "help": "Draft Charters in onboarding order after the Responsibility Graph has enough seat clarity.", "example": {} },
51572
51779
  { "id": "charter.get", "namespace": "charter", "action": "get", "title": "Get Charter", "description": "Return a Charter version with its supersession history and latest dry-run status.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "charter_version_id", "flag": "charter-version-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Read a Charter with its supersession history and dry-run status before approving or signing a manifest." },
@@ -51575,7 +51782,7 @@ var COMMAND_MANIFEST = [
51575
51782
  { "id": "charter.show_markdown", "namespace": "charter", "action": "show_markdown", "title": "Show Charter as markdown", "description": "Compose a seat's active or latest 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 active or latest Charter as a clean markdown card to show your human a quick review." },
51576
51783
  { "id": "charter.sign_manifest", "namespace": "charter", "action": "sign_manifest", "title": "Sign charter manifest", "description": "Request human confirmation for a Charter permission manifest.", "requiredScope": "seat", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "charter_version_id", "flag": "charter-version-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Sign tool manifests only when the Charter explains why the tool is needed and how it is bounded." },
51577
51784
  { "id": "charter.skip", "namespace": "charter", "action": "skip", "title": "Skip charter draft", "description": "Mark a draft Charter as skipped.", "requiredScope": "seat", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "charter_version_id", "flag": "charter-version-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Skip a Charter only when the seat is intentionally out of scope for the current onboarding pass." },
51578
- { "id": "charter.update_draft", "namespace": "charter", "action": "update_draft", "title": "Update charter draft", "description": "Update a draft Charter document.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "charter_version_id", "flag": "charter-version-id", "type": "string", "required": true }], "hasComplexInput": true, "help": "Submit the full Charter document directly (purpose, decision_authority, escalation_rules, measurables, budget, permission_manifest); read the charter authoring deep-dive for what good looks like per field. Durable authority changes still need human approval.", "example": { "charter_version_id": "0190cccc-cccc-7ccc-8ccc-cccccccccccc", "doc": { "payload_version": 1, "purpose": "AP intake clerk: draft accounts-payable invoice entries from inbound vendor emails for human review.", "accountabilities": [{ "title": "Draft every inbound invoice", "description": "Convert each inbound vendor invoice into a draft AP entry with the correct vendor, amount, and GL coding within one business day." }, { "title": "Flag discrepancies", "description": "Surface duplicate, mismatched, or out-of-policy invoices as Friction issues instead of drafting them silently." }], "decision_authority": { "autonomous": [{ "action": "Draft AP entries and propose GL coding from inbound invoices", "condition": "Allowed when the vendor is known and the amount is within the standard purchase range.", "rationale": "Drafting is reversible and reviewed by a human before posting.", "unanswered_boundary": false }], "approval": [{ "action": "Post an invoice or send any vendor-facing message", "condition": "Require explicit human approval before posting or sending.", "rationale": "Posting and sending are durable, money-moving actions.", "unanswered_boundary": false }], "escalate": [{ "action": "Unknown vendor, payment over the approval threshold, or a suspected duplicate", "condition": "Always escalate to the Steward before acting.", "rationale": "Conservative default for ambiguous, irreversible, or financial exposure.", "unanswered_boundary": true }] }, "escalation_rules": ["Escalate any invoice over $5,000 or from a vendor not already in the ledger.", "Escalate when an invoice appears to duplicate one already drafted or posted."], "measurables": [{ "name": "Invoices drafted within one business day", "target": "100%", "cadence": "weekly", "source": "agent" }, { "name": "Discrepancies caught before posting", "target": "\u2265 95%", "cadence": "monthly", "source": "human" }], "permission_manifest": [{ "tool": "ap.invoices.read", "scope": "Read inbound invoices and the vendor ledger.", "granted": true, "rationale": "Needed to draft entries from source invoices." }, { "tool": "email.draft", "scope": "Draft vendor replies for human review; never send.", "granted": true, "rationale": "Lets the seat prepare clarifications without taking a send action." }], "budget": { "monthly_usd": null, "approval_required_over_usd": 0, "notes": "No autonomous spend; any spend requires Steward approval until a budget is set." }, "unanswered_boundaries": ["Approval threshold for auto-posting", "Vendor onboarding authority"], "seat_type_recommendation": { "recommendation": "agent", "rationale": "The work is high-volume, rule-bound, and fully reviewable, which suits a draft-and-confirm agent under a human Steward.", "confidence": 0.8 } } } },
51785
+ { "id": "charter.update_draft", "namespace": "charter", "action": "update_draft", "title": "Update charter draft", "description": "Update a draft Charter document.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "charter_version_id", "flag": "charter-version-id", "type": "string", "required": true }, { "name": "expected_edit_revision", "flag": "expected-edit-revision", "type": "integer", "required": false }], "hasComplexInput": true, "help": "Submit the full Charter document directly (purpose, decision_authority, escalation_rules, measurables, budget, permission_manifest); read the charter authoring deep-dive for what good looks like per field. Durable authority changes still need human approval.", "example": { "charter_version_id": "0190cccc-cccc-7ccc-8ccc-cccccccccccc", "doc": { "payload_version": 1, "purpose": "AP intake clerk: draft accounts-payable invoice entries from inbound vendor emails for human review.", "accountabilities": [{ "title": "Draft every inbound invoice", "description": "Convert each inbound vendor invoice into a draft AP entry with the correct vendor, amount, and GL coding within one business day." }, { "title": "Flag discrepancies", "description": "Surface duplicate, mismatched, or out-of-policy invoices as Friction issues instead of drafting them silently." }], "decision_authority": { "autonomous": [{ "action": "Draft AP entries and propose GL coding from inbound invoices", "condition": "Allowed when the vendor is known and the amount is within the standard purchase range.", "rationale": "Drafting is reversible and reviewed by a human before posting.", "unanswered_boundary": false }], "approval": [{ "action": "Post an invoice or send any vendor-facing message", "condition": "Require explicit human approval before posting or sending.", "rationale": "Posting and sending are durable, money-moving actions.", "unanswered_boundary": false }], "escalate": [{ "action": "Unknown vendor, payment over the approval threshold, or a suspected duplicate", "condition": "Always escalate to the Steward before acting.", "rationale": "Conservative default for ambiguous, irreversible, or financial exposure.", "unanswered_boundary": true }] }, "escalation_rules": ["Escalate any invoice over $5,000 or from a vendor not already in the ledger.", "Escalate when an invoice appears to duplicate one already drafted or posted."], "measurables": [{ "name": "Invoices drafted within one business day", "target": "100%", "cadence": "weekly", "source": "agent" }, { "name": "Discrepancies caught before posting", "target": "\u2265 95%", "cadence": "monthly", "source": "human" }], "permission_manifest": [{ "tool": "ap.invoices.read", "scope": "Read inbound invoices and the vendor ledger.", "granted": true, "rationale": "Needed to draft entries from source invoices." }, { "tool": "email.draft", "scope": "Draft vendor replies for human review; never send.", "granted": true, "rationale": "Lets the seat prepare clarifications without taking a send action." }], "budget": { "monthly_usd": null, "approval_required_over_usd": 0, "notes": "No autonomous spend; any spend requires Steward approval until a budget is set." }, "unanswered_boundaries": ["Approval threshold for auto-posting", "Vendor onboarding authority"], "seat_type_recommendation": { "recommendation": "agent", "rationale": "The work is high-volume, rule-bound, and fully reviewable, which suits a draft-and-confirm agent under a human Steward.", "confidence": 0.8 } } } },
51579
51786
  { "id": "coach.draft_guide", "namespace": "coach", "action": "draft_guide", "title": "Draft accountability discussion guide", "description": "Draft a private discussion guide for the accountable human about a seat's commitment pattern. Read-only and human-only \u2014 it is never delivered, sent, or written to the coached person's record.", "requiredScope": "tenant_admin", "confirmation": "none", "exposeOverMcp": false, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Draft a private accountability discussion guide for the accountable human from a seat's commitment pattern. Never delivered or written to the coached person's record." },
51580
51787
  { "id": "command.describe", "namespace": "command", "action": "describe", "title": "Describe command", "description": "Return a command's exact input/output JSON Schema, scope, confirmation gate, help pointer, guides, a validated example, and related commands. Run this before calling a mutating command.", "requiredScope": "user", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "id", "flag": "id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Run command.describe before calling a mutating command to read its exact input/output schema and a worked example; on a failure, read the error's help field and run the command it names." },
51581
51788
  { "id": "command.list", "namespace": "command", "action": "list", "title": "List commands", "description": "List every callable command id with its title, required scope, confirmation gate, and onboarding stages. Use 'command.describe' for a single command's full contract.", "requiredScope": "user", "confirmation": "none", "exposeOverMcp": true, "fields": [], "hasComplexInput": false, "help": "List the callable command surface, then use command.describe for the exact contract of the one you need." },
@@ -51671,7 +51878,7 @@ var COMMAND_MANIFEST = [
51671
51878
  { "id": "seat.rename", "namespace": "seat", "action": "rename", "title": "Rename seat", "description": "Rename a Responsibility Graph seat.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "name", "flag": "name", "type": "string", "required": true }], "hasComplexInput": false, "help": "Seat names should describe the function and accountability clearly." },
51672
51879
  { "id": "seat.reparent", "namespace": "seat", "action": "reparent", "title": "Reparent seat", "description": "Move a Responsibility Graph seat under a new parent.", "requiredScope": "seat", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "new_parent_seat_id", "flag": "new-parent-seat-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Reparent seats only when it clarifies accountable structure and preserves a clean graph." },
51673
51880
  { "id": "seat.set_type", "namespace": "seat", "action": "set_type", "title": "Set seat type", "description": "Set a Responsibility Graph seat type.", "requiredScope": "seat", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "seat_type", "flag": "seat-type", "type": "enum", "required": true, "enumValues": ["human", "agent", "hybrid"] }], "hasComplexInput": false, "help": "Seat type should follow the work, risk, measurable, and stewardship model." },
51674
- { "id": "secret_grant.grant", "namespace": "secret_grant", "action": "grant", "title": "Grant a brokered secret", "description": "A human grants a seat scoped access to a brokered secret by CREDENTIAL ID (from credential.list / credential.ingress \u2014 resolved to its vault ref server-side) or by VAULT REF directly (exactly one). Postgres stores only the pointer \u2014 never secret material (invariant #5). Owner-only, human-gated. The secret.broker/baserow.* tools resolve this grant server-side; the secret never enters agent context.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "grant_key", "flag": "grant-key", "type": "string", "required": true }, { "name": "vault_ref", "flag": "vault-ref", "type": "string", "required": false }, { "name": "credential_id", "flag": "credential-id", "type": "string", "required": false }, { "name": "provider", "flag": "provider", "type": "string", "required": true }, { "name": "allowed_host", "flag": "allowed-host", "type": "string", "required": true }, { "name": "allowed_path_prefix", "flag": "allowed-path-prefix", "type": "string", "required": false }, { "name": "allowed_methods", "flag": "allowed-methods", "type": "array", "required": true, "itemType": "string" }, { "name": "scope_tier", "flag": "scope-tier", "type": "enum", "required": true, "enumValues": ["read", "write"] }, { "name": "injection_mode", "flag": "injection-mode", "type": "enum", "required": false, "enumValues": ["header_bearer", "header", "query"] }, { "name": "injection_name", "flag": "injection-name", "type": "string", "required": false }, { "name": "expires_at", "flag": "expires-at", "type": "string", "required": false }], "hasComplexInput": false, "help": "A human grants a seat a scoped brokered secret by vault ref (host + path prefix + methods + injection). Postgres stores only the pointer, never secret material. Owner-only and human-gated; the secret.broker/baserow.* tools resolve it server-side." },
51881
+ { "id": "secret_grant.grant", "namespace": "secret_grant", "action": "grant", "title": "Grant a brokered secret", "description": "A human grants a seat scoped access to a brokered secret by CREDENTIAL ID (from credential.list / credential.ingress \u2014 resolved to its vault ref server-side) or by VAULT REF directly (exactly one). Postgres stores only the pointer \u2014 never secret material (invariant #5). Owner-only, human-gated. The secret.broker/baserow.* tools resolve this grant server-side; the secret never enters agent context.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "grant_key", "flag": "grant-key", "type": "string", "required": true }, { "name": "vault_ref", "flag": "vault-ref", "type": "string", "required": false }, { "name": "credential_id", "flag": "credential-id", "type": "string", "required": false }, { "name": "provider", "flag": "provider", "type": "string", "required": true }, { "name": "allowed_host", "flag": "allowed-host", "type": "string", "required": true }, { "name": "allowed_path_prefix", "flag": "allowed-path-prefix", "type": "string", "required": false }, { "name": "allowed_methods", "flag": "allowed-methods", "type": "array", "required": true, "itemType": "string" }, { "name": "scope_tier", "flag": "scope-tier", "type": "enum", "required": true, "enumValues": ["read", "write"] }, { "name": "injection_mode", "flag": "injection-mode", "type": "enum", "required": false, "enumValues": ["header_bearer", "header", "query"] }, { "name": "injection_name", "flag": "injection-name", "type": "string", "required": false }, { "name": "injection_prefix", "flag": "injection-prefix", "type": "string", "required": false }, { "name": "expires_at", "flag": "expires-at", "type": "string", "required": false }], "hasComplexInput": false, "help": "A human grants a seat a scoped brokered secret by vault ref (host + path prefix + methods + injection). Postgres stores only the pointer, never secret material. Owner-only and human-gated; the secret.broker/baserow.* tools resolve it server-side." },
51675
51882
  { "id": "secret_grant.list", "namespace": "secret_grant", "action": "list", "title": "List brokered secret grants", "description": "List brokered secret grants for the tenant (or one seat). Returns the egress allowlist metadata only (host, path prefix, methods, scope, status) \u2014 never the vault ref or any secret. An agent sees only its own seat's grants.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": false }, { "name": "include_revoked", "flag": "include-revoked", "type": "boolean", "required": false }], "hasComplexInput": false, "help": "List brokered secret grants for the tenant (or one seat). Returns the egress allowlist metadata only \u2014 host, path prefix, methods, scope, status \u2014 never the vault ref or any secret." },
51676
51883
  { "id": "secret_grant.request", "namespace": "secret_grant", "action": "request", "title": "Request a brokered secret grant", "description": "An agent or user REQUESTS a scoped brokered-secret grant by naming the egress it needs (grant key, host, path prefix, methods, scope). No secret and no vault ref are ever accepted (invariant #5) \u2014 this only records a durable ask for a human to grant.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "grant_key", "flag": "grant-key", "type": "string", "required": true }, { "name": "provider", "flag": "provider", "type": "string", "required": true }, { "name": "allowed_host", "flag": "allowed-host", "type": "string", "required": true }, { "name": "allowed_path_prefix", "flag": "allowed-path-prefix", "type": "string", "required": false }, { "name": "allowed_methods", "flag": "allowed-methods", "type": "array", "required": true, "itemType": "string" }, { "name": "scope_tier", "flag": "scope-tier", "type": "enum", "required": true, "enumValues": ["read", "write"] }, { "name": "reason", "flag": "reason", "type": "string", "required": false }], "hasComplexInput": false, "help": "An agent or user requests a brokered-secret egress grant by naming the host, path prefix, methods, and scope it needs. Draft-and-confirm: no secret or vault ref is accepted; a human grants it." },
51677
51884
  { "id": "secret_grant.revoke", "namespace": "secret_grant", "action": "revoke", "title": "Revoke a brokered secret grant", "description": "Revoke a brokered secret grant \u2014 a compromised or over-scoped seat's egress access can be cut immediately; the next broker call resolves no grant and fails closed. Owner-only, human-gated.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "grant_id", "flag": "grant-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Revoke a brokered secret grant (teardown \u2014 cut a compromised or over-scoped seat's egress immediately; the next broker call fails closed). Owner-only and human-gated." },