@rosthq/cli 0.7.77 → 0.7.79

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,EA+P3D,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,EAkQ3D,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAOA,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;AAwBrE,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;IAOtB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAClD,CAAC;AAcF,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,CAwRnG;AA0hBD,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":";AAOA,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;AAwBrE,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;IAOtB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAClD,CAAC;AAcF,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,CA0RnG;AA0hBD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAUxF"}
package/dist/index.js CHANGED
@@ -42527,6 +42527,20 @@ var credentialIngressOutputSchema = external_exports.object({
42527
42527
  provider: external_exports.string().min(1),
42528
42528
  seat_id: uuidSchema11.nullable()
42529
42529
  }).strict();
42530
+ var credentialListInputSchema = external_exports.object({}).strict();
42531
+ var credentialSummarySchema = external_exports.object({
42532
+ credential_id: uuidSchema11,
42533
+ provider: external_exports.string(),
42534
+ scope_description: external_exports.string(),
42535
+ seat_id: uuidSchema11.nullable(),
42536
+ status: external_exports.string(),
42537
+ created_at: external_exports.string(),
42538
+ rotated_at: external_exports.string(),
42539
+ revoked_at: external_exports.string().nullable()
42540
+ }).strict();
42541
+ var credentialListOutputSchema = external_exports.object({
42542
+ credentials: external_exports.array(credentialSummarySchema)
42543
+ }).strict();
42530
42544
  var agentGoLiveInputSchema = external_exports.object({
42531
42545
  seat_id: uuidSchema11,
42532
42546
  charter_version_id: uuidSchema11
@@ -44251,8 +44265,13 @@ var secretGrantRequestOutputSchema = external_exports.object({
44251
44265
  var secretGrantGrantInputSchema = external_exports.object({
44252
44266
  seat_id: uuid10,
44253
44267
  grant_key: brokerGrantKeySchema,
44254
- // POINTER only. The vault-ref refinement rejects any raw-secret value.
44255
- vault_ref: brokerVaultRefSchema,
44268
+ // Supply EXACTLY ONE of `vault_ref` or `credential_id` (DER-1777):
44269
+ // - `vault_ref`: the POINTER directly. The vault-ref refinement rejects any raw-secret value.
44270
+ // - `credential_id`: an existing tenant `credentials` row (from `credential.list` /
44271
+ // `credential.ingress` output); the command resolves its vault_ref server-side, so a human
44272
+ // never has to handle a ref. Both keep invariant #5 (Postgres stores only pointers).
44273
+ vault_ref: brokerVaultRefSchema.optional(),
44274
+ credential_id: uuid10.optional(),
44256
44275
  provider: brokerProviderSchema,
44257
44276
  allowed_host: brokerAllowedHostSchema,
44258
44277
  allowed_path_prefix: brokerAllowedPathPrefixSchema.optional(),
@@ -44262,7 +44281,17 @@ var secretGrantGrantInputSchema = external_exports.object({
44262
44281
  injection_name: brokerInjectionNameSchema.optional(),
44263
44282
  // ISO-8601; absent = no expiry.
44264
44283
  expires_at: external_exports.string().datetime({ offset: true }).optional()
44265
- }).strict().superRefine((value, ctx) => refineGrantShape(value, ctx));
44284
+ }).strict().superRefine((value, ctx) => {
44285
+ refineGrantShape(value, ctx);
44286
+ const provided = [value.vault_ref, value.credential_id].filter((v) => v !== void 0).length;
44287
+ if (provided !== 1) {
44288
+ ctx.addIssue({
44289
+ code: "custom",
44290
+ path: ["credential_id"],
44291
+ message: "provide exactly one of vault_ref or credential_id"
44292
+ });
44293
+ }
44294
+ });
44266
44295
  var secretGrantGrantOutputSchema = external_exports.object({
44267
44296
  grant_id: uuid10,
44268
44297
  seat_id: uuid10,
@@ -45993,6 +46022,170 @@ var escalationDecisionOutputSchema = external_exports.object({
45993
46022
  replay_action_pending: external_exports.boolean().optional()
45994
46023
  }).strict();
45995
46024
 
46025
+ // ../../packages/protocol/src/work-ledger.ts
46026
+ var WORK_VERBS = [
46027
+ "created",
46028
+ "updated",
46029
+ "removed",
46030
+ "sent",
46031
+ "received",
46032
+ "contacted",
46033
+ "replied",
46034
+ "offered",
46035
+ "accepted",
46036
+ "rejected",
46037
+ "assessed",
46038
+ "announced",
46039
+ "assigned",
46040
+ "invited",
46041
+ "flagged",
46042
+ "booked",
46043
+ "searched",
46044
+ "filed",
46045
+ "extracted",
46046
+ "escalated"
46047
+ ];
46048
+ var workVerbSchema = external_exports.enum(WORK_VERBS);
46049
+ var WORK_OUTCOMES = ["success", "warning", "error", "held"];
46050
+ var workOutcomeSchema = external_exports.enum(WORK_OUTCOMES);
46051
+ var objectKindSchema = external_exports.string().trim().min(1).max(128);
46052
+ var externalIdSchema = external_exports.string().trim().min(1).max(512);
46053
+ var labelSchema = external_exports.string().trim().min(1).max(200);
46054
+ var displayUrlSchema = external_exports.string().trim().max(2048).refine(
46055
+ (value) => /^https?:\/\//u.test(value) || value.startsWith("/") || value.startsWith("rost://"),
46056
+ { message: "url must be http(s), a tenant-local path, or a rost:// reference" }
46057
+ );
46058
+ var entityRefSchema = external_exports.object({
46059
+ kind: objectKindSchema,
46060
+ external_id: externalIdSchema,
46061
+ label: labelSchema.optional(),
46062
+ url: displayUrlSchema.optional()
46063
+ }).strict();
46064
+ var contextRefSchema = external_exports.object({
46065
+ kind: objectKindSchema,
46066
+ external_id: externalIdSchema,
46067
+ label: labelSchema.optional()
46068
+ }).strict();
46069
+ var workLedgerRecordSchema = external_exports.object({
46070
+ verb: workVerbSchema,
46071
+ outcome: workOutcomeSchema.default("success"),
46072
+ object: entityRefSchema,
46073
+ // Optional second slot ("…about PO-1892"); genuinely multi-target activity
46074
+ // goes in details, not a second fixed slot (Salesforce's documented wall).
46075
+ target: entityRefSchema.optional(),
46076
+ context: contextRefSchema.optional(),
46077
+ // Optional governance joins. run_id / tool_call_id are re-validated server-side
46078
+ // against the acting tenant + seat; a caller cannot forge cross-tenant links.
46079
+ run_id: external_exports.string().uuid().optional(),
46080
+ tool_call_id: external_exports.string().uuid().optional(),
46081
+ // Deliverable / document / thread link (≈ A2A Artifact).
46082
+ evidence_ref: external_exports.string().trim().min(1).max(2048).optional(),
46083
+ // Versioned prompt used for external comms (P-17; invariant #9 tie-in).
46084
+ template_ref: external_exports.string().trim().min(1).max(512).optional(),
46085
+ // Default 1; only for genuinely anonymous bulk work. Rule: if a client might
46086
+ // ask "which ones?", log per-entity.
46087
+ quantity: external_exports.number().int().min(1).max(1e6).default(1),
46088
+ summary: external_exports.string().trim().min(1).max(2e3),
46089
+ // Zod-validated against the registry entry's details schema at log time
46090
+ // (permissive JSON object when no typed schema is registered).
46091
+ details: external_exports.record(external_exports.string(), external_exports.unknown()).default({}),
46092
+ // Idempotency: verb + object_ref + external event id (Gmail message id,
46093
+ // Baserow row id). A retried turn re-logging the same key is a no-op.
46094
+ dedup_key: external_exports.string().trim().min(1).max(512).optional(),
46095
+ // Correction: this record supersedes an earlier one (same seat + tenant).
46096
+ supersedes_id: external_exports.string().uuid().optional()
46097
+ }).strict();
46098
+ var WORK_LEDGER_MAX_BATCH = 100;
46099
+ var workLedgerLogInputSchema = external_exports.object({
46100
+ records: external_exports.array(workLedgerRecordSchema).min(1).max(WORK_LEDGER_MAX_BATCH)
46101
+ }).strict();
46102
+ var workLedgerLogResultSchema = external_exports.object({
46103
+ id: external_exports.string().uuid(),
46104
+ dedup_key: external_exports.string().nullable(),
46105
+ // true when this dedup_key already existed — the insert was an idempotent no-op.
46106
+ deduplicated: external_exports.boolean()
46107
+ }).strict();
46108
+ var workLedgerLogOutputSchema = external_exports.object({
46109
+ records: external_exports.array(workLedgerLogResultSchema),
46110
+ logged_count: external_exports.number().int().min(0),
46111
+ deduplicated_count: external_exports.number().int().min(0)
46112
+ }).strict();
46113
+ var workLedgerRecordViewSchema = external_exports.object({
46114
+ id: external_exports.string().uuid(),
46115
+ seat_id: external_exports.string().uuid(),
46116
+ agent_id: external_exports.string().uuid().nullable(),
46117
+ run_id: external_exports.string().uuid().nullable(),
46118
+ tool_call_id: external_exports.string().uuid().nullable(),
46119
+ verb: workVerbSchema,
46120
+ outcome: workOutcomeSchema,
46121
+ object_kind: external_exports.string(),
46122
+ object_external_id: external_exports.string(),
46123
+ object_label: external_exports.string().nullable(),
46124
+ object_url: external_exports.string().nullable(),
46125
+ target_kind: external_exports.string().nullable(),
46126
+ target_external_id: external_exports.string().nullable(),
46127
+ target_label: external_exports.string().nullable(),
46128
+ target_url: external_exports.string().nullable(),
46129
+ context_kind: external_exports.string().nullable(),
46130
+ context_external_id: external_exports.string().nullable(),
46131
+ context_label: external_exports.string().nullable(),
46132
+ evidence_ref: external_exports.string().nullable(),
46133
+ template_ref: external_exports.string().nullable(),
46134
+ quantity: external_exports.number().int(),
46135
+ summary: external_exports.string(),
46136
+ details: external_exports.record(external_exports.string(), external_exports.unknown()),
46137
+ dedup_key: external_exports.string().nullable(),
46138
+ supersedes_id: external_exports.string().uuid().nullable(),
46139
+ created_at: external_exports.string()
46140
+ }).strict();
46141
+ var workLedgerListInputSchema = external_exports.object({
46142
+ verb: workVerbSchema.optional(),
46143
+ outcome: workOutcomeSchema.optional(),
46144
+ object_kind: objectKindSchema.optional(),
46145
+ object_external_id: externalIdSchema.optional(),
46146
+ run_id: external_exports.string().uuid().optional(),
46147
+ // Tenant-admin cross-seat view: an explicit seat filter. Seat-scoped callers
46148
+ // are always constrained to their own seat server-side regardless of this.
46149
+ seat_id: external_exports.string().uuid().optional(),
46150
+ // Include records that have been superseded by a later correction (default off
46151
+ // so the feed shows the current narrative).
46152
+ include_superseded: external_exports.boolean().default(false),
46153
+ limit: external_exports.number().int().min(1).max(100).default(50),
46154
+ // Opaque keyset cursor from a previous page's next_cursor.
46155
+ cursor: external_exports.string().min(1).max(200).optional()
46156
+ }).strict();
46157
+ var workLedgerListOutputSchema = external_exports.object({
46158
+ records: external_exports.array(workLedgerRecordViewSchema),
46159
+ next_cursor: external_exports.string().nullable()
46160
+ }).strict();
46161
+ var activityRegistryEntrySchema = external_exports.object({
46162
+ activity_kind: external_exports.string().regex(/^[a-z][a-z0-9_]{0,63}$/u, "activity_kind must be a lower_snake slug (<=64 chars)"),
46163
+ verb: workVerbSchema,
46164
+ object_kind: objectKindSchema,
46165
+ label: labelSchema,
46166
+ // Names one of workDetailsSchemas; null = permissive (details need only be a
46167
+ // JSON object). A novel kind starts null until a typed schema ships.
46168
+ details_schema_key: external_exports.string().min(1).max(128).nullable().default(null),
46169
+ // Seam for signal auto-derivation (a later PR): whether ledger counts feed a
46170
+ // Signal, and the human-facing unit ("suppliers/week").
46171
+ derives_measurable: external_exports.boolean().default(false),
46172
+ measurable_unit: external_exports.string().min(1).max(64).nullable().default(null),
46173
+ description: external_exports.string().max(2e3).nullable().default(null)
46174
+ }).strict();
46175
+ var workDetailsSchemas = {
46176
+ supplier_contacted: external_exports.object({
46177
+ channel: external_exports.enum(["email", "phone", "portal", "chat", "other"]).optional(),
46178
+ subject: external_exports.string().max(500).optional(),
46179
+ thread_ref: external_exports.string().max(512).optional()
46180
+ }).strict(),
46181
+ quote_extracted: external_exports.object({
46182
+ amount: external_exports.number().nonnegative().optional(),
46183
+ currency: external_exports.string().length(3).optional(),
46184
+ unit: external_exports.string().max(64).optional(),
46185
+ lead_time_days: external_exports.number().int().nonnegative().optional()
46186
+ }).strict()
46187
+ };
46188
+
45996
46189
  // ../../packages/protocol/src/index.ts
45997
46190
  var eventTypes = [
45998
46191
  "status",
@@ -46570,7 +46763,7 @@ Treat AICOS as a coordinator over the operating system. It can become more usefu
46570
46763
  order: 20,
46571
46764
  title: "Responsibility Graph playbook",
46572
46765
  summary: "How to build a functions-first graph with seats, owners, Stewards, vacancies, and clean authority.",
46573
- version: "2026-07-13.2",
46766
+ version: "2026-07-14.1",
46574
46767
  public: true,
46575
46768
  audiences: ["human", "cli", "mcp", "in_app_agent"],
46576
46769
  stages: ["graph_design", "staffing"],
@@ -46661,6 +46854,8 @@ Agent creation at \`/agents/new\` begins with four doors: **Describe the job** o
46661
46854
 
46662
46855
  Agent seat pages show the operator-facing output trail, not just low-level run telemetry. The completed work area combines explicit \`agent_deliverables\`, successful \`work.log\` evidence, and recent successful run summaries into one readable list. Each item shows what was delivered, when it happened, what kind of work it was, and safe evidence links labelled as internal, Linear, GitHub, or external. Secret-shaped values are redacted before display, and run or task context is shown only when it belongs to the same seat. Forge artifact batches can also carry a metadata-only integrity verdict so duplicate hashes, zero-byte files, size outliers, and manifest count mismatches are visible without exposing file contents.
46663
46856
 
46857
+ The **Activity** tab layers a curated business-activity narrative above the Trust Card's forensic execution trace: period-scoped counter tiles (today, this week, or 30 days) summarise the seat's \`work.record\` activity by kind \u2014 a "held for your approval" tile is always shown, and an operator can pick which other kinds appear via a per-seat, browser-local tile picker. Below the tiles, a run-grouped activity feed lists each \`work.list\` record \u2014 verb, object, outcome, evidence link, and time \u2014 with a drill-down for entity refs, the \`template_ref\` used for external comms when one was recorded, and the raw structured details. A sessions browser lists the seat's runs and, for the selected one, its persisted transcript (\`session_transcripts\`) and artifacts rail: binary artifacts (Supabase Storage) get a freshly minted 60-second signed download link at render time, pointer artifacts (Gmail draft, Drive doc, PR, or an internal reference) link out when an external URL is known. The task queue and Trust Card below are unchanged. All of this sits behind the same sensitive-data access gate as the Trust Card; a restricted viewer sees an explicit unavailable state, never a guessed empty feed. The \`/agents\` fleet page mirrors the same row grammar in a tenant-wide **Work** view \u2014 every seat's activity in one filterable stream, each row linking back to that seat's Activity tab with the originating session focused.
46858
+
46664
46859
  ## Read a human seat's page
46665
46860
 
46666
46861
  A human seat's page opens on one computed answer line \u2014 for example "On track \u2014 4 of 5 measurables on target \xB7 1 held draft awaiting review" \u2014 instead of a wall of always-shown sections. Below it:
@@ -46807,7 +47002,7 @@ Drafting can be assisted by agents. Activation is a human decision. When authori
46807
47002
  order: 40,
46808
47003
  title: "Agent staffing playbook",
46809
47004
  summary: "How to decide whether a seat should be human, agent, or hybrid, and how to go live safely.",
46810
- version: "2026-07-13.1",
47005
+ version: "2026-07-14.1",
46811
47006
  public: true,
46812
47007
  audiences: ["human", "cli", "mcp", "in_app_agent"],
46813
47008
  stages: ["staffing"],
@@ -46866,7 +47061,7 @@ Two creation paths, both draft-first. Read the stock-agents guide for templates
46866
47061
  - Custom: \`agent_setup.start\` / \`rost_start_agent_setup\` (returns a \`setup_id\`), iterate with \`agent_setup.get\` and \`agent_setup.update\`, then \`agent.create_custom\` / \`rost_create_custom_agent\`. Stage tools with \`agent.configure_tools\` (vault refs only) and sandbox with \`agent.run_dry_run\`.
46867
47062
  - Inspect runtime: \`agent.status\` / \`rost_get_agent_status\` with \`{"seat_id":"<seat-id>"}\` returns lane, live state, steward chain, dry-run result, and Runner availability.
46868
47063
  - Run on demand: \`{{cli}} agent run-now --seat-id <seat-id>\` / \`agent.run_now\` / \`rost_run_agent_now\` queues an immediate live run without changing the saved schedule. Cloud agents dispatch to the Inngest executor; runner agents queue work for the paired runner. The command is ungated but still requires a live staffed agent and the normal server-side tool guard.
46869
- - Audit what an agent did (Trust Card): \`{{cli}} command agent.list_runs --json '{"seat_id":"<seat-id>"}'\` / \`rost_list_agent_runs\` returns the seat's run history with per-run Skill activation counts plus tool-call and guard-held counts; \`{{cli}} agent get-run --seat-id <seat-id> --run-id <run-id>\` / \`agent.get_run\` / \`rost_get_agent_run_diagnostics\` reads one run's transcript reference, token/cost usage, outcome, product-visible run errors, and any Skill versions/files loaded for that run. Pass \`--transcript\` (\`{"transcript":true}\`) to also return the persisted, secret-scrubbed session transcript for that run when one exists \u2014 cloud-lane and runner turns persist a bounded transcript at turn end. Final run outcomes are no longer chopped to a short summary; the full report survives. Loaded Skill file hashes and sizes identify the immutable source package; the runtime may still bound or truncate prompt text before sending it to the model. \`{{cli}} command agent.list_tool_calls --json '{"seat_id":"<seat-id>"}'\` / \`rost_list_agent_tool_calls\` returns the tool-call ledger with each call's guard result. Both list commands include a \`denied_tool_call_count\` rollup \u2014 the actions held because they exceeded the charter. Pass \`{"seat_id":"<seat-id>","held_only":true}\` to \`agent.list_tool_calls\` for only the held calls. The web seat page shows the same facts as a Trust Card.
47064
+ - Audit what an agent did (Trust Card): \`{{cli}} command agent.list_runs --json '{"seat_id":"<seat-id>"}'\` / \`rost_list_agent_runs\` returns the seat's run history with per-run Skill activation counts plus tool-call and guard-held counts; \`{{cli}} agent get-run --seat-id <seat-id> --run-id <run-id>\` / \`agent.get_run\` / \`rost_get_agent_run_diagnostics\` reads one run's transcript reference, token/cost usage, outcome, product-visible run errors, and any Skill versions/files loaded for that run. Pass \`--transcript\` (\`{"transcript":true}\`) to also return the persisted, secret-scrubbed session transcript for that run when one exists \u2014 cloud-lane and runner turns persist a bounded transcript at turn end. Final run outcomes are no longer chopped to a short summary; the full report survives. Loaded Skill file hashes and sizes identify the immutable source package; the runtime may still bound or truncate prompt text before sending it to the model. \`{{cli}} command agent.list_tool_calls --json '{"seat_id":"<seat-id>"}'\` / \`rost_list_agent_tool_calls\` returns the tool-call ledger with each call's guard result. Both list commands include a \`denied_tool_call_count\` rollup \u2014 the actions held because they exceeded the charter. Pass \`{"seat_id":"<seat-id>","held_only":true}\` to \`agent.list_tool_calls\` for only the held calls. The web seat page shows the same facts as a Trust Card, and its Activity tab additionally renders the full persisted transcript and artifacts rail for a selected session inline (no \`--transcript\` flag needed there) alongside the business-activity ledger (\`work.record\`/\`work.list\`) \u2014 counter tiles and a run-grouped feed with each record's verb, object, outcome, evidence, and \`template_ref\` when one was used.
46870
47065
 
46871
47066
  ## Review readiness before go-live
46872
47067
 
@@ -47135,7 +47330,7 @@ Decisions should be recorded as human decisions. Handoffs should attach to seats
47135
47330
  order: 45,
47136
47331
  title: "How agents work",
47137
47332
  summary: "How {{brand}} agents operate inside seats, use Charters, report work, and escalate beyond authority.",
47138
- version: "2026-07-04.1",
47333
+ version: "2026-07-14.1",
47139
47334
  public: true,
47140
47335
  audiences: ["human", "cli", "mcp", "in_app_agent"],
47141
47336
  stages: ["staffing", "operating_rhythm"],
@@ -47233,7 +47428,7 @@ Beyond each seat's own manifest, the company can set one ceiling on how much an
47233
47428
 
47234
47429
  ## What humans should review
47235
47430
 
47236
- The Agents page shows fleet health first: live state, work evidence, failed runs, open held actions, cost, and the next operator action. Work evidence distinguishes fresh real runs, stale runs, no completed run yet, queued or running work orders, and recent failures. A failure link opens the failed run itself; queued or stale rows route the operator to the seat's agent operations instead of pretending there is a hidden run to inspect. The page also shows configuration completeness for each staffed agent seat: Steward chain, lane or runtime substrate, vaulted credentials, granted tools, model config, sandbox dry run, and go-live state, each with a remediation link when incomplete. A seat's Trust Card drills into the same facts: run history, one-run detail, tool-call outcomes, product-visible errors, transcript references, loaded Skill versions, and held confirmations or escalations. Open confirmations stay visible until they are decided or expire, even when they are older than the default activity window. Approving or rejecting a held confirmation from the seat page is scoped to that seat; rejection can include a short reason. For a live agent, the seat page's agent operations panel can queue one immediate governed run through the same \`agent.run_now\` command path used by CLI and MCP; it does not expand authority or change the saved schedule. Seat pages render legacy Charter manifest scope text with customer-safe labels when old setup data used internal placeholder wording.
47431
+ The Agents page shows fleet health first: live state, work evidence, failed runs, open held actions, cost, and the next operator action. Work evidence distinguishes fresh real runs, stale runs, no completed run yet, queued or running work orders, and recent failures. A failure link opens the failed run itself; queued or stale rows route the operator to the seat's agent operations instead of pretending there is a hidden run to inspect. The page also shows configuration completeness for each staffed agent seat: Steward chain, lane or runtime substrate, vaulted credentials, granted tools, model config, sandbox dry run, and go-live state, each with a remediation link when incomplete. A seat's Trust Card drills into the same facts: run history, one-run detail, tool-call outcomes, product-visible errors, transcript references, loaded Skill versions, and held confirmations or escalations. The same seat's Activity tab also shows a curated business-activity ledger (counter tiles plus a run-grouped \`work.record\` feed) and a sessions browser with the full persisted transcript and artifacts for the selected run \u2014 a layer above the Trust Card's forensic trace, not a replacement for it. The fleet page's own **Work** tab mirrors that ledger across every seat in one filterable, seat-labelled stream. Open confirmations stay visible until they are decided or expire, even when they are older than the default activity window. Approving or rejecting a held confirmation from the seat page is scoped to that seat; rejection can include a short reason. For a live agent, the seat page's agent operations panel can queue one immediate governed run through the same \`agent.run_now\` command path used by CLI and MCP; it does not expand authority or change the saved schedule. Seat pages render legacy Charter manifest scope text with customer-safe labels when old setup data used internal placeholder wording.
47237
47432
 
47238
47433
  Review the first dry runs, fleet overview, tool-call audit rows, escalations, deliverables, and Signal impact. A seat's completed-work area combines explicit deliverables, work-log evidence, and successful run summaries into one operator-facing trail with safe links labelled as internal, Linear, GitHub, or external. The fleet view at \`/agents\` shows every staffed agent seat at a glance; the agent-native equivalents are \`{{cli}} command agent.list_fleet --json '{}'\` / \`rost_list_agent_fleet\` for the compact overview, and \`{{cli}} agent fleet-digest --json\` / \`agent.fleet_digest\` / \`rost_get_dogfood_fleet_health_digest\` for the daily dogfood evidence bundle. The digest returns live/idle state, 24h/7d turns, 7d/30d spend, recent failed runs, unresolved product errors, failed notifications, and a next action per seat.
47239
47434
 
@@ -47392,7 +47587,7 @@ External connectors are being rolled out provider by provider, conservatively (r
47392
47587
  order: 48,
47393
47588
  title: "CLI and MCP installation guide",
47394
47589
  summary: "Install the public CLI, register remote token-backed MCP clients, and find the full command and tool catalog.",
47395
- version: "2026-07-13.6",
47590
+ version: "2026-07-13.8",
47396
47591
  public: true,
47397
47592
  audiences: ["human", "cli", "mcp", "in_app_agent"],
47398
47593
  stages: ["company_setup", "staffing"],
@@ -48185,12 +48380,13 @@ Preview deployment creation is a governed command. \`software_factory.vercel.dep
48185
48380
 
48186
48381
  #### Secret broker grants (tenant-level)
48187
48382
 
48188
- 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. 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.
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.
48189
48384
 
48190
48385
  | Tool | Command | What it does | Scope | Notes |
48191
48386
  |---|---|---|---|---|
48192
- | \`rost_grant_a_brokered_secret\` | \`secret_grant.grant\` | A human grants a seat scoped brokered-secret access by vault ref (host, path prefix, methods, injection). 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","vault_ref":"infisical://prod/baserow-token"}. |
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). |
48193
48388
  | \`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
+ | \`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 {}. |
48194
48390
 
48195
48391
  ### Seat-scoped operating tools
48196
48392
 
@@ -48206,10 +48402,12 @@ Seat-scoped MCP tokens expose the operating protocol below. The server still che
48206
48402
  | \`rost_complete_task\` | \`task.complete\` | Complete a task and record evidence. | Seat | Call with \`task_id\` and evidence. |
48207
48403
  | \`rost_escalate\` | \`escalation.raise\` | Escalate approval-scope or must-escalate work. | Seat | Call with severity, reason, and requested decision. |
48208
48404
  | \`rost_file_issue\` | \`friction.file_issue\` | File a Friction issue. | Seat | Call with title, severity, and impact. |
48209
- | \`rost_log_work\` | \`work.log\` | Record work performed by the seat. | Seat | Call with summary and evidence. |
48405
+ | \`rost_log_work\` | \`work.log\` | Record a lightweight free-text work breadcrumb for the seat. For structured, per-entity, queryable business activity (a client might ask "which ones?"), use \`rost_record_work\` instead. | Seat | Call with summary and evidence. |
48210
48406
  | \`rost_report_a_signal_reading\` | \`signal.report\` | Propose one draft reading for this seat's own agent-sourced measurable. The reading lands unconfirmed for human review. | Seat | Call with \`{"measurable_id":"<id>","value":42,"note":"read off the source","confidence":"high"}\`. |
48211
48407
  | \`rost_create_agent_deliverable\` | \`deliverable.create\` | Create a scrubbed durable work output for the acting seat. | Seat | Call with title, kind, summary/content, and optional safe links. |
48212
48408
  | \`rost_attach_agent_deliverable\` | \`deliverable.attach\` | Attach a scrubbed deliverable to a source run, task, or work order after server-side seat validation. | Seat | Call with title, kind, and the source ids that belong to the acting seat. |
48409
+ | \`rost_record_work\` | \`work.record\` | Append structured business-activity records to the seat's append-only work ledger, in a batch, right after each action succeeds. Prefer this over \`rost_log_work\` for durable, per-entity, queryable activity (verb + entity ref + outcome + evidence). Secret-redacted; idempotent on \`dedup_key\`; corrections are superseding records. | Seat | Call with \`{"records":[{"verb":"contacted","object":{"kind":"supplier","external_id":"sup_42","label":"Acme Foods"},"summary":"Emailed Acme for a monk fruit quote.","dedup_key":"gmail:msg-abc"}]}\`. |
48410
+ | \`rost_list_work_records\` | \`work.list\` | List the seat's work-ledger records newest-first (keyset-paginated), filterable by verb, object kind/ref, outcome, or run. | Seat | Call with \`{"verb":"contacted","object_kind":"supplier","limit":50}\`. |
48213
48411
  | \`rost_request_a_forge_secret_grant\` | \`software_factory.secret.request\` | Request access to a project secret by key. It creates a durable credential request and approval Task, never accepts a secret value, and does not grant access by itself. | Seat | Call with \`{"software_project_id":"<project-id>","environment":"preview","seat_id":"<seat-id>","action":"test.run","key_name":"OPENAI_API_KEY"}\`. |
48214
48412
  | \`rost_verify_forge_secret_broker_access\` | \`software_factory.secret.use\` | Verify broker authorization for a Forge secret without opening the vault. Missing grants create or reuse a credential request + approval Task; allowed grants return a redacted authorization summary only. Runtime vault use happens runner-side. | Seat | Call with \`{"software_project_id":"<project-id>","environment":"preview","seat_id":"<seat-id>","action":"test.run","key_name":"OPENAI_API_KEY","operation":"test_execution"}\`. |
48215
48413
  | \`rost_request_a_brokered_secret_grant\` | \`secret_grant.request\` | A seat agent requests a scoped brokered-secret grant (for secret.broker / baserow.*) by naming the host, path prefix, methods, and scope it needs. Draft-and-confirm: no secret and no vault ref; returns an event id for a human to grant via secret_grant.grant. | Seat | 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"],"scope_tier":"read"}. |
@@ -51397,6 +51595,7 @@ var COMMAND_MANIFEST = [
51397
51595
  { "id": "confirmation.reject", "namespace": "confirmation", "action": "reject", "title": "Reject pending confirmation", "description": "Reject an in-flight confirmation without executing the original command.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "confirmation_id", "flag": "confirmation-id", "type": "string", "required": true }, { "name": "reason", "flag": "reason", "type": "string", "required": false }], "hasComplexInput": false, "help": "Reject pending confirmations when authority, evidence, or human intent is unclear." },
51398
51596
  { "id": "confirmation.remint", "namespace": "confirmation", "action": "remint", "title": "Re-mint an expired confirmation", "description": "Stage a fresh confirmation for the same command as an expired one, re-running the normal minting authorization checks.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "confirmation_id", "flag": "confirmation-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Re-mint an expired confirmation into a fresh one before approving, instead of re-running the original command from scratch." },
51399
51597
  { "id": "credential.ingress", "namespace": "credential", "action": "ingress", "title": "Store credential", "description": "Store a secret through the vault and persist only the credential vault reference.", "requiredScope": "seat", "confirmation": "credential_flow", "exposeOverMcp": false, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": false }, { "name": "provider", "flag": "provider", "type": "string", "required": true }, { "name": "scope_description", "flag": "scope-description", "type": "string", "required": true }, { "name": "secret_name", "flag": "secret-name", "type": "string", "required": true }], "hasComplexInput": false, "secretBlocked": true, "help": "Ingress credentials only through vault-backed flows; never place raw secrets in prompts, logs, or docs." },
51598
+ { "id": "credential.list", "namespace": "credential", "action": "list", "title": "List stored credentials", "description": "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 to grant a seat brokered access without ever handling a raw ref.", "requiredScope": "tenant_admin", "confirmation": "none", "exposeOverMcp": true, "fields": [], "hasComplexInput": false, "help": "List stored-credential metadata (id, provider, label, status, dates) to find the credential_id for secret_grant.grant. Never returns the vault ref or any secret." },
51400
51599
  { "id": "deliverable.accept", "namespace": "deliverable", "action": "accept", "title": "Accept deliverable value", "description": "Record a human-confirmed accepted value (USD) on a deliverable. Humans decide; agents cannot self-accept. Re-accepting records a correction as a new event; prior events are never mutated.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "deliverable_id", "flag": "deliverable-id", "type": "string", "required": true }, { "name": "impact_value_usd", "flag": "impact-value-usd", "type": "number", "required": true }], "hasComplexInput": false, "help": "Record a human-confirmed accepted value (USD) on a deliverable; owner-only and human-gated. Humans decide \u2014 agents cannot self-accept. Re-accepting records a correction as a new event." },
51401
51600
  { "id": "deliverable.attach", "namespace": "deliverable", "action": "attach", "title": "Attach agent deliverable", "description": "Attach a deliverable to a source run, task, or work order for the acting seat. Source refs are validated server-side.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "run_id", "flag": "run-id", "type": "string", "required": false }, { "name": "task_id", "flag": "task-id", "type": "string", "required": false }, { "name": "work_order_id", "flag": "work-order-id", "type": "string", "required": false }, { "name": "kind", "flag": "kind", "type": "enum", "required": false, "enumValues": ["brief", "work_evidence", "artifact", "report", "other"] }, { "name": "title", "flag": "title", "type": "string", "required": true }, { "name": "summary", "flag": "summary", "type": "string", "required": false }, { "name": "content", "flag": "content", "type": "string", "required": false }], "hasComplexInput": true, "help": "Attach a scrubbed deliverable to a source run, task, or work order that belongs to the acting seat." },
51402
51601
  { "id": "deliverable.create", "namespace": "deliverable", "action": "create", "title": "Create agent deliverable", "description": "Create an agent deliverable for the acting seat. The deliverable is scrubbed for secrets before storage.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "kind", "flag": "kind", "type": "enum", "required": false, "enumValues": ["brief", "work_evidence", "artifact", "report", "other"] }, { "name": "title", "flag": "title", "type": "string", "required": true }, { "name": "summary", "flag": "summary", "type": "string", "required": false }, { "name": "content", "flag": "content", "type": "string", "required": false }, { "name": "delivered_at", "flag": "delivered-at", "type": "string", "required": false }], "hasComplexInput": true, "help": "Create a scrubbed durable work output for the acting seat without making a durable company decision." },
@@ -51472,7 +51671,7 @@ var COMMAND_MANIFEST = [
51472
51671
  { "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." },
51473
51672
  { "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." },
51474
51673
  { "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." },
51475
- { "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 VAULT REF (host + path prefix + methods + scope + injection). 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": 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": "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." },
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." },
51476
51675
  { "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." },
51477
51676
  { "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." },
51478
51677
  { "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." },
@@ -51587,7 +51786,9 @@ var COMMAND_MANIFEST = [
51587
51786
  { "id": "work_order.cancel", "namespace": "work_order", "action": "cancel", "title": "Cancel work order", "description": "Cancel a queued, claimed, or running work order. Already-terminal orders return a stable error.", "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "work_order_id", "flag": "work-order-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Cancel a queued, claimed, or running work order; this is a human-gated action." },
51588
51787
  { "id": "work_order.enqueue", "namespace": "work_order", "action": "enqueue", "title": "Enqueue work order", "description": "Queue a work order for a live scheduled agent. Idempotent per (agent, scheduled time).", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "agent_id", "flag": "agent-id", "type": "string", "required": true }, { "name": "scheduled_for", "flag": "scheduled-for", "type": "string", "required": false }, { "name": "task_id", "flag": "task-id", "type": "string", "required": false }], "hasComplexInput": false, "help": "Queue a work order for a live scheduled agent; enqueue is idempotent per agent and scheduled time." },
51589
51788
  { "id": "work_order.list", "namespace": "work_order", "action": "list", "title": "List work orders", "description": "List runner/cloud work orders for the tenant, optionally filtered by status, agent, or runner.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "status", "flag": "status", "type": "enum", "required": false, "enumValues": ["queued", "claimed", "running", "done", "failed", "expired"] }, { "name": "agent_id", "flag": "agent-id", "type": "string", "required": false }, { "name": "runner_id", "flag": "runner-id", "type": "string", "required": false }, { "name": "limit", "flag": "limit", "type": "integer", "required": false }], "hasComplexInput": false, "help": "Inspect queued, claimed, running, and expired work orders to understand runner activity." },
51590
- { "id": "work.log", "namespace": "work", "action": "log", "title": "Log work", "description": "Write a lightweight activity breadcrumb event for the acting seat.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "note", "flag": "note", "type": "string", "required": true }], "hasComplexInput": false, "help": "Log a lightweight work breadcrumb so the seat's activity is visible without durable side effects." }
51789
+ { "id": "work.list", "namespace": "work", "action": "list", "title": "List work records", "description": "List the acting seat's work-ledger records newest-first (keyset-paginated), filterable by verb, object kind/ref, outcome, or run. Superseded records are hidden unless include_superseded is set.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "verb", "flag": "verb", "type": "enum", "required": false, "enumValues": ["created", "updated", "removed", "sent", "received", "contacted", "replied", "offered", "accepted", "rejected", "assessed", "announced", "assigned", "invited", "flagged", "booked", "searched", "filed", "extracted", "escalated"] }, { "name": "outcome", "flag": "outcome", "type": "enum", "required": false, "enumValues": ["success", "warning", "error", "held"] }, { "name": "object_kind", "flag": "object-kind", "type": "string", "required": false }, { "name": "object_external_id", "flag": "object-external-id", "type": "string", "required": false }, { "name": "run_id", "flag": "run-id", "type": "string", "required": false }, { "name": "seat_id", "flag": "seat-id", "type": "string", "required": false }, { "name": "include_superseded", "flag": "include-superseded", "type": "boolean", "required": false }, { "name": "limit", "flag": "limit", "type": "integer", "required": false }, { "name": "cursor", "flag": "cursor", "type": "string", "required": false }], "hasComplexInput": false, "help": "List the seat's work-ledger records newest-first with keyset pagination, filterable by verb, object, outcome, or run." },
51790
+ { "id": "work.log", "namespace": "work", "action": "log", "title": "Log work", "description": "Write a lightweight activity breadcrumb event for the acting seat.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "note", "flag": "note", "type": "string", "required": true }], "hasComplexInput": false, "help": "Log a lightweight work breadcrumb so the seat's activity is visible without durable side effects." },
51791
+ { "id": "work.record", "namespace": "work", "action": "record", "title": "Record work", "description": "Append one or more structured business-activity records to the agent work ledger for the acting seat. Batch-accepting, append-only, secret-redacted, and idempotent on dedup_key. Corrections are superseding records.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [], "hasComplexInput": true, "help": "Append structured business-activity records (verb + entity refs + outcome + evidence) to the seat's work ledger, in a batch, right after each action succeeds." }
51591
51792
  ];
51592
51793
 
51593
51794
  // src/generator/groups.ts
@@ -57790,7 +57991,7 @@ async function main(argv = process.argv.slice(2), options = {}) {
57790
57991
  const refreshSession = options.refreshSession ?? refreshCliSessionIfNeeded;
57791
57992
  const [rawCommand, ...args] = argv;
57792
57993
  const command = rawCommand === "--help" || rawCommand === "-h" ? "help" : rawCommand;
57793
- if (isSecretBlockedNamespace(command)) {
57994
+ if (isSecretBlockedNamespace(command) || isSecretBlockedCommand(args[0] === void 0 ? void 0 : `${command}.${args[0]}`)) {
57794
57995
  io.stderr.write(`${SECRET_ARGV_GUIDANCE}
57795
57996
  `);
57796
57997
  return 1;