@rosthq/cli 0.7.71 → 0.7.73

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -38281,10 +38281,10 @@ var CATALOG_ENTRIES = [
38281
38281
  title: "Run a script (sandbox)",
38282
38282
  provider: "rost",
38283
38283
  description: "Call this to run a short program (shell/node/python) in an isolated, network-disabled microVM for pure computation \u2014 parsing, transforming, calculating, or validating data the agent already holds. The sandbox has NO credentials and NO network access; it cannot read files, call APIs, or reach the internet. Use it for compute, never to fetch or send data. Every run is metered and audited; availability is a per-account entitlement and each call is confirmed by default (arbitrary code execution).",
38284
- // Compute-only: the microVM produces a structured, size-capped result and has
38285
- // no durable or external effect, so the narrowest useful tier is `read`.
38286
- default_scope_tier: "read",
38287
- scope_tiers: ["read"],
38284
+ // Compute-only, but still arbitrary code execution. In the capability UI this
38285
+ // belongs to the action-capable "Read & act" posture, never read-only.
38286
+ default_scope_tier: "draft",
38287
+ scope_tiers: ["draft"],
38288
38288
  // v1 injects ZERO credentials (secret grants are DER-1585) — never a vault ref.
38289
38289
  credential_required: false,
38290
38290
  // Conservative by default (invariant #10): arbitrary code execution routes to the
@@ -38410,10 +38410,20 @@ var CATALOG_ENTRIES = [
38410
38410
  default_access_policy: "always_ask"
38411
38411
  },
38412
38412
  {
38413
- id: "web.research",
38413
+ id: "web.search",
38414
38414
  title: "Web research",
38415
38415
  provider: "web",
38416
- description: "Call this to research public company and role information from the open web. Read-only; escalate paid data sources or sensitive personal data.",
38416
+ description: "Call this to search public web sources with citations. Read-only; it uses the server-side Exa provider, never exposes provider keys, and escalates paid data sources or sensitive personal data.",
38417
+ default_scope_tier: "read",
38418
+ scope_tiers: ["read"],
38419
+ credential_required: false,
38420
+ default_access_policy: "always_allow"
38421
+ },
38422
+ {
38423
+ id: "web.fetch",
38424
+ title: "Read public web page",
38425
+ provider: "web",
38426
+ description: "Call this to fetch and extract text from one public HTTPS page. It validates DNS, redirects, content type, size, and private-network boundaries before reading.",
38417
38427
  default_scope_tier: "read",
38418
38428
  scope_tiers: ["read"],
38419
38429
  credential_required: false,
@@ -38655,7 +38665,7 @@ function accessLevelForScope(scopeTier) {
38655
38665
  }
38656
38666
  function providerRequirementFor(entry) {
38657
38667
  if (!entry.credential_required) {
38658
- return entry.provider === "rost" ? "platform_managed" : "none";
38668
+ return entry.provider === "rost" || entry.provider === "web" ? "platform_managed" : "none";
38659
38669
  }
38660
38670
  return entry.id === "secret.broker" ? "vault_ref" : "connection";
38661
38671
  }
@@ -38682,7 +38692,7 @@ function enrichCatalogEntry(entry) {
38682
38692
  access_levels: accessLevels,
38683
38693
  default_access_level: accessLevelForScope(entry.default_scope_tier),
38684
38694
  provider_requirement: providerRequirementFor(entry),
38685
- cost_class: entry.id === "script.run" || entry.id === "secret.broker" ? "metered_standard" : "included",
38695
+ cost_class: entry.id === "script.run" || entry.id === "secret.broker" ? "metered_standard" : entry.id === "web.search" || entry.id === "web.fetch" || entry.id === "browser.read" ? "metered_low" : "included",
38686
38696
  lane_support: ["cloud", "runner", "mcp"],
38687
38697
  trusted_required_metadata: trustedRequiredMetadataFor(entry)
38688
38698
  };
@@ -39405,6 +39415,27 @@ var agentCreateFromTemplateOutputSchema = agentSetupStateSchema.extend({
39405
39415
  occupancy_created: external_exports.boolean()
39406
39416
  }).strict();
39407
39417
 
39418
+ // ../../packages/protocol/src/provider-costs.ts
39419
+ var providerCostKinds = ["managed_llm", "exa", "browser", "sandbox"];
39420
+ var providerCostKindSchema = external_exports.enum(providerCostKinds);
39421
+ var keySourceSchema = external_exports.enum(["rost_managed", "tenant_byok"]);
39422
+ var atSchema = external_exports.union([external_exports.date(), external_exports.string().datetime()]).optional();
39423
+ var providerCostEntrySchema = external_exports.object({
39424
+ kind: providerCostKindSchema,
39425
+ effectiveFrom: external_exports.string().datetime(),
39426
+ estimatedCents: external_exports.number().int().nonnegative(),
39427
+ provider: external_exports.string().min(1)
39428
+ }).strict();
39429
+ var PROVIDER_COST_REGISTRY = Object.freeze([
39430
+ { kind: "exa", provider: "exa", effectiveFrom: "2026-07-11T00:00:00.000Z", estimatedCents: 30 },
39431
+ { kind: "exa", provider: "exa", effectiveFrom: "2026-07-15T00:00:00.000Z", estimatedCents: 35 },
39432
+ { kind: "browser", provider: "browser", effectiveFrom: "2026-07-11T00:00:00.000Z", estimatedCents: 60 },
39433
+ { kind: "sandbox", provider: "sandbox", effectiveFrom: "2026-07-11T00:00:00.000Z", estimatedCents: 120 }
39434
+ ]);
39435
+ for (const entry of PROVIDER_COST_REGISTRY) {
39436
+ providerCostEntrySchema.parse(entry);
39437
+ }
39438
+
39408
39439
  // ../../packages/protocol/src/agent-builder.ts
39409
39440
  var uuidSchema4 = external_exports.string().uuid();
39410
39441
  var singleLineSchema = external_exports.string().trim().min(1).max(500).regex(/^[^\n\r]+$/, "Value must be a single line.");
@@ -39715,6 +39746,116 @@ var toolGrantsAgentUpdateOutputSchema = external_exports.object({
39715
39746
  permission_manifest: external_exports.array(compiledCapabilityManifestEntrySchema)
39716
39747
  }).strict().nullable()
39717
39748
  }).strict();
39749
+ var scopeDigestSchema = external_exports.string().regex(/^sha256:[0-9a-f]{64}$/);
39750
+ var classifierVersionSchema = external_exports.string().regex(/^[a-z][a-z0-9_.-]{0,79}$/);
39751
+ var agentActivationReceiptInputSchema = external_exports.object({
39752
+ agent_id: uuidSchema5,
39753
+ proposed_budget_cents: external_exports.number().int().nonnegative().max(1e7).optional()
39754
+ }).strict();
39755
+ var agentActivationReceiptCapabilitySchema = external_exports.object({
39756
+ capability_id: external_exports.string().min(1),
39757
+ access_level: capabilityGrantAccessLevelSchema,
39758
+ compile_status: capabilityGrantCompileStatusSchema,
39759
+ connection: capabilityGrantConnectionSchema
39760
+ }).strict();
39761
+ var agentActivationReceiptDiffSchema = external_exports.object({
39762
+ added: external_exports.array(external_exports.string().min(1)),
39763
+ removed: external_exports.array(external_exports.string().min(1)),
39764
+ changed: external_exports.array(external_exports.object({
39765
+ capability_id: external_exports.string().min(1),
39766
+ from_access_level: capabilityGrantAccessLevelSchema.nullable(),
39767
+ to_access_level: capabilityGrantAccessLevelSchema
39768
+ }).strict())
39769
+ }).strict();
39770
+ var agentActivationReceiptOutputSchema = external_exports.object({
39771
+ agent_id: uuidSchema5,
39772
+ seat_id: uuidSchema5,
39773
+ steward_seat_id: uuidSchema5,
39774
+ steward_label: external_exports.string().min(1).max(160),
39775
+ lane: external_exports.enum(["cloud", "runner", "mcp_session"]),
39776
+ cadence: external_exports.string().min(1).max(120).nullable(),
39777
+ budget_cents: external_exports.number().int().nonnegative().max(1e7),
39778
+ currency: external_exports.literal("USD"),
39779
+ scope_digest: scopeDigestSchema,
39780
+ compiler_version: classifierVersionSchema,
39781
+ classifier_version: classifierVersionSchema,
39782
+ trusted_boundary: external_exports.object({
39783
+ eligible_command_count: external_exports.number().int().nonnegative(),
39784
+ always_human: external_exports.array(external_exports.string().min(1)).min(1)
39785
+ }).strict(),
39786
+ capabilities: external_exports.array(agentActivationReceiptCapabilitySchema),
39787
+ diff: agentActivationReceiptDiffSchema
39788
+ }).strict().superRefine((value, ctx) => {
39789
+ if (hasSecretShapedValue(value)) {
39790
+ ctx.addIssue({
39791
+ code: external_exports.ZodIssueCode.custom,
39792
+ message: "Activation receipt cannot contain secret-shaped content."
39793
+ });
39794
+ }
39795
+ });
39796
+ var agentActivationSignInputSchema = external_exports.object({
39797
+ agent_id: uuidSchema5,
39798
+ expected_scope_digest: scopeDigestSchema,
39799
+ budget_cents: external_exports.number().int().nonnegative().max(1e7),
39800
+ reason: external_exports.string().trim().min(1).max(500).optional()
39801
+ }).strict();
39802
+ var agentActivationSignOutputSchema = external_exports.object({
39803
+ agent_id: uuidSchema5,
39804
+ seat_id: uuidSchema5,
39805
+ scope_digest: scopeDigestSchema,
39806
+ decision_id: uuidSchema5,
39807
+ event_id: uuidSchema5,
39808
+ activated: external_exports.boolean()
39809
+ }).strict();
39810
+ var agentTrustGrantDtoSchema = external_exports.object({
39811
+ grant_id: uuidSchema5,
39812
+ agent_id: uuidSchema5,
39813
+ seat_id: uuidSchema5,
39814
+ granted_by_user_id: uuidSchema5,
39815
+ scope_digest: scopeDigestSchema,
39816
+ classifier_version: classifierVersionSchema,
39817
+ budget_cents: external_exports.number().int().nonnegative(),
39818
+ reserved_cents: external_exports.number().int().nonnegative(),
39819
+ spent_cents: external_exports.number().int().nonnegative(),
39820
+ currency: external_exports.literal("USD"),
39821
+ status: external_exports.enum(["active", "revoked", "superseded", "expired"]),
39822
+ effective_at: external_exports.string().datetime({ offset: true }),
39823
+ expires_at: external_exports.string().datetime({ offset: true }).nullable(),
39824
+ revoked_at: external_exports.string().datetime({ offset: true }).nullable(),
39825
+ supersedes_id: uuidSchema5.nullable()
39826
+ }).strict();
39827
+ var agentTrustGrantCreateInputSchema = external_exports.object({
39828
+ agent_id: uuidSchema5,
39829
+ expected_scope_digest: scopeDigestSchema,
39830
+ budget_cents: external_exports.number().int().nonnegative().max(1e7),
39831
+ expires_at: external_exports.string().datetime({ offset: true }).optional(),
39832
+ reason: external_exports.string().trim().min(1).max(500).optional()
39833
+ }).strict();
39834
+ var agentTrustGrantInspectInputSchema = external_exports.object({
39835
+ agent_id: uuidSchema5,
39836
+ include_inactive: external_exports.boolean().optional()
39837
+ }).strict();
39838
+ var agentTrustGrantInspectOutputSchema = external_exports.object({
39839
+ grants: external_exports.array(agentTrustGrantDtoSchema)
39840
+ }).strict();
39841
+ var agentTrustGrantMutationInputSchema = external_exports.object({
39842
+ grant_id: uuidSchema5,
39843
+ reason: external_exports.string().trim().min(1).max(500).optional()
39844
+ }).strict();
39845
+ var agentTrustGrantExpireInputSchema = external_exports.object({
39846
+ agent_id: uuidSchema5
39847
+ }).strict();
39848
+ var agentTrustGrantSupersedeInputSchema = external_exports.object({
39849
+ agent_id: uuidSchema5,
39850
+ expected_scope_digest: scopeDigestSchema,
39851
+ budget_cents: external_exports.number().int().nonnegative().max(1e7),
39852
+ expires_at: external_exports.string().datetime({ offset: true }).optional(),
39853
+ reason: external_exports.string().trim().min(1).max(500).optional()
39854
+ }).strict();
39855
+ var agentTrustGrantMutationOutputSchema = external_exports.object({
39856
+ grant: agentTrustGrantDtoSchema,
39857
+ event_id: uuidSchema5
39858
+ }).strict();
39718
39859
  var agentSetupCapabilitySuggestionsInputSchema = external_exports.object({
39719
39860
  seat_id: uuidSchema5.optional(),
39720
39861
  setup_id: uuidSchema5.optional()
@@ -39754,6 +39895,83 @@ var toolPolicyGetOutputSchema = external_exports.object({
39754
39895
  tool_policy: storedTenantToolPolicySchema
39755
39896
  }).strict();
39756
39897
 
39898
+ // ../../packages/protocol/src/web-research.ts
39899
+ var webResearchCitationSchema = external_exports.object({
39900
+ id: external_exports.string().min(1).max(80),
39901
+ url: external_exports.string().url(),
39902
+ title: external_exports.string().min(1).max(300)
39903
+ }).strict();
39904
+ var webSearchInputSchema = external_exports.object({
39905
+ query: external_exports.string().trim().min(1).max(500),
39906
+ max_results: external_exports.number().int().min(1).max(10).default(5),
39907
+ timeout_ms: external_exports.number().int().min(250).max(2e4).default(8e3)
39908
+ }).strict();
39909
+ var webSearchResultSchema = external_exports.object({
39910
+ citation_id: external_exports.string().min(1).max(80),
39911
+ title: external_exports.string().min(1).max(300),
39912
+ url: external_exports.string().url(),
39913
+ snippet: external_exports.string().min(1).max(1200),
39914
+ published_at: external_exports.string().datetime().nullable()
39915
+ }).strict();
39916
+ var webSearchOutputSchema = external_exports.object({
39917
+ ok: external_exports.literal(true),
39918
+ provider: external_exports.literal("exa"),
39919
+ query: external_exports.string().min(1).max(500),
39920
+ results: external_exports.array(webSearchResultSchema).max(10),
39921
+ citations: external_exports.array(webResearchCitationSchema).max(10),
39922
+ cost: external_exports.object({
39923
+ provider: external_exports.literal("exa"),
39924
+ cost_class: external_exports.literal("metered_low"),
39925
+ estimated_units: external_exports.number().nonnegative()
39926
+ }).strict()
39927
+ }).strict();
39928
+ var webFetchInputSchema = external_exports.object({
39929
+ url: external_exports.string().url().max(2048),
39930
+ timeout_ms: external_exports.number().int().min(250).max(2e4).default(8e3),
39931
+ max_bytes: external_exports.number().int().min(1024).max(1e6).default(25e4)
39932
+ }).strict();
39933
+ var webFetchOutputSchema = external_exports.object({
39934
+ ok: external_exports.literal(true),
39935
+ url: external_exports.string().url(),
39936
+ final_url: external_exports.string().url(),
39937
+ title: external_exports.string().max(300).nullable(),
39938
+ text: external_exports.string().max(12e4),
39939
+ content_type: external_exports.string().max(120),
39940
+ bytes: external_exports.number().int().nonnegative(),
39941
+ truncated: external_exports.boolean(),
39942
+ provenance: external_exports.object({
39943
+ fetched_at: external_exports.string().datetime(),
39944
+ redirect_count: external_exports.number().int().min(0).max(5),
39945
+ pinned_addresses: external_exports.array(external_exports.string().min(1)).min(1).max(6)
39946
+ }).strict()
39947
+ }).strict();
39948
+ var browserReadOperationSchema = external_exports.enum(["navigate", "inspect", "screenshot", "extract_text"]);
39949
+ var browserReadInputSchema = external_exports.object({
39950
+ url: external_exports.string().url().max(2048),
39951
+ operation: browserReadOperationSchema.default("inspect"),
39952
+ selector: external_exports.string().trim().min(1).max(240).optional(),
39953
+ timeout_ms: external_exports.number().int().min(250).max(2e4).default(8e3)
39954
+ }).strict();
39955
+ var browserReadOutputSchema = external_exports.object({
39956
+ ok: external_exports.literal(true),
39957
+ operation: browserReadOperationSchema,
39958
+ url: external_exports.string().url(),
39959
+ final_url: external_exports.string().url(),
39960
+ title: external_exports.string().max(300).nullable(),
39961
+ text: external_exports.string().max(6e4).optional(),
39962
+ screenshot_artifact: external_exports.object({
39963
+ artifact_id: external_exports.string().min(1).max(160),
39964
+ tenant_id: external_exports.string().min(1).max(120),
39965
+ mime_type: external_exports.literal("image/png"),
39966
+ bytes: external_exports.number().int().nonnegative()
39967
+ }).strict().optional(),
39968
+ provenance: external_exports.object({
39969
+ fetched_at: external_exports.string().datetime(),
39970
+ sandbox: external_exports.literal("ephemeral_read_only"),
39971
+ persistent_state: external_exports.literal(false)
39972
+ }).strict()
39973
+ }).strict();
39974
+
39757
39975
  // ../../packages/protocol/src/agent-policy.ts
39758
39976
  var AUTONOMOUS_RISK_LEVELS = ["low", "medium", "high", "critical"];
39759
39977
  var autonomousRiskLevelSchema = external_exports.enum(AUTONOMOUS_RISK_LEVELS);
@@ -40477,6 +40695,54 @@ var charterSchema = charterPersistedObjectSchema.superRefine(refineAutonomousBou
40477
40695
  var charterDocSchema = charterDocObjectSchema.superRefine(refineAutonomousBoundaries);
40478
40696
  var charterDocEditsSchema = charterDocObjectSchema.omit({ payload_version: true }).partial().strict();
40479
40697
 
40698
+ // ../../packages/protocol/src/trusted-budget.ts
40699
+ var TRUSTED_BUDGET_FORMULA_VERSION = "trusted-budget.v1";
40700
+ var MODEL_TOKEN_PROXY = Object.freeze({
40701
+ inputTokens: 12e3,
40702
+ outputTokens: 3e3
40703
+ });
40704
+ var LANE_MULTIPLIERS = Object.freeze({
40705
+ cloud: 1,
40706
+ runner: 1.1,
40707
+ mcp_session: 1.2
40708
+ });
40709
+ var CADENCE_MULTIPLIERS = Object.freeze({
40710
+ daily: 0.8,
40711
+ weekly: 1,
40712
+ monthly: 1.25,
40713
+ quarterly: 1.5
40714
+ });
40715
+ var CADENCE_BASE_RESERVES = Object.freeze({
40716
+ daily: 25,
40717
+ weekly: 50,
40718
+ monthly: 100,
40719
+ quarterly: 200
40720
+ });
40721
+ var TOOL_COST_HINT_CENTS = Object.freeze({
40722
+ included: 0,
40723
+ metered_low: 25,
40724
+ metered_standard: 100,
40725
+ metered_high: 250
40726
+ });
40727
+ var trustedBudgetCharterBudgetSchema = external_exports.object({
40728
+ monthly_usd: external_exports.number().nonnegative().nullable(),
40729
+ approval_required_over_usd: external_exports.number().nonnegative().nullable()
40730
+ }).strict();
40731
+ var trustedBudgetInputSchema = external_exports.object({
40732
+ lane: external_exports.enum(["cloud", "runner", "mcp_session"]),
40733
+ model: external_exports.string().trim().min(1).max(120),
40734
+ cadence: external_exports.enum(["daily", "weekly", "monthly", "quarterly"]),
40735
+ expected_turns: external_exports.number().int().positive().max(1e4),
40736
+ tool_cost_hints: external_exports.array(external_exports.string().trim().min(1).max(120)).default([]),
40737
+ charter_budget: trustedBudgetCharterBudgetSchema.optional()
40738
+ }).strict();
40739
+ var trustedBudgetSuggestionSchema = external_exports.object({
40740
+ budget_cents: external_exports.number().int().nonnegative(),
40741
+ money_authority_cents: external_exports.number().int().nonnegative(),
40742
+ assumptions: external_exports.array(external_exports.string().min(1)).min(1),
40743
+ formula_version: external_exports.literal(TRUSTED_BUDGET_FORMULA_VERSION)
40744
+ }).strict();
40745
+
40480
40746
  // ../../packages/protocol/src/eos-intelligence.ts
40481
40747
  var uuid3 = external_exports.string().uuid();
40482
40748
  var frictionSeveritySchema = external_exports.enum(["low", "med", "high", "critical"]);
@@ -42965,6 +43231,101 @@ var errorLogSupersedeOutputSchema = external_exports.object({
42965
43231
  resolved_at: isoDateTime3
42966
43232
  }).strict();
42967
43233
 
43234
+ // ../../packages/protocol/src/working-files.ts
43235
+ var WORKING_FILE_MAX_PATH_CHARS = 512;
43236
+ var WORKING_FILE_MAX_CONTENT_CHARS = 16384;
43237
+ var isoDateTime4 = external_exports.string().datetime({ offset: true });
43238
+ var workingFileContentTypeSchema = external_exports.enum([
43239
+ "text/plain",
43240
+ "text/markdown",
43241
+ "application/json",
43242
+ "text/csv",
43243
+ "text/yaml",
43244
+ "application/yaml",
43245
+ "text/x-typescript",
43246
+ "text/typescript",
43247
+ "text/javascript",
43248
+ "application/javascript"
43249
+ ]);
43250
+ var workingFileStateSchema = external_exports.enum(["ephemeral", "published"]);
43251
+ var workingFileRetentionClassSchema = external_exports.enum(["ephemeral_7d", "published_90d"]);
43252
+ function normalizeWorkingFilePath(value) {
43253
+ return value.trim().replace(/\\/g, "/");
43254
+ }
43255
+ function isSafeWorkingFilePath(value) {
43256
+ if (value.includes("\\")) {
43257
+ return false;
43258
+ }
43259
+ const normalized = normalizeWorkingFilePath(value);
43260
+ if (normalized.length === 0 || normalized.length > WORKING_FILE_MAX_PATH_CHARS) {
43261
+ return false;
43262
+ }
43263
+ if (normalized.startsWith("/") || normalized.startsWith("./") || normalized.startsWith("../")) {
43264
+ return false;
43265
+ }
43266
+ if (normalized.includes("\0") || normalized.includes("//")) {
43267
+ return false;
43268
+ }
43269
+ const segments = normalized.split("/");
43270
+ return segments.every((segment) => segment.length > 0 && segment !== "." && segment !== "..");
43271
+ }
43272
+ var workingFilePathSchema = external_exports.string().trim().min(1).max(WORKING_FILE_MAX_PATH_CHARS).refine(isSafeWorkingFilePath, "Working file paths must be tenant-local relative paths without traversal segments");
43273
+ var workingFileCreateInputSchema = external_exports.object({
43274
+ path: workingFilePathSchema,
43275
+ content_type: workingFileContentTypeSchema,
43276
+ content: external_exports.string().min(1).max(WORKING_FILE_MAX_CONTENT_CHARS)
43277
+ }).strict();
43278
+ var workingFileReadInputSchema = external_exports.object({
43279
+ path: workingFilePathSchema
43280
+ }).strict();
43281
+ var workingFileListInputSchema = external_exports.object({
43282
+ state: workingFileStateSchema.optional()
43283
+ }).strict();
43284
+ var workingFilePublishInputSchema = external_exports.object({
43285
+ path: workingFilePathSchema
43286
+ }).strict();
43287
+ var workingFilesReadToolInputSchema = external_exports.discriminatedUnion("operation", [
43288
+ external_exports.object({
43289
+ operation: external_exports.literal("read"),
43290
+ path: workingFilePathSchema
43291
+ }).strict(),
43292
+ external_exports.object({
43293
+ operation: external_exports.literal("list"),
43294
+ state: workingFileStateSchema.optional()
43295
+ }).strict()
43296
+ ]);
43297
+ var workingFilesWriteToolInputSchema = external_exports.discriminatedUnion("operation", [
43298
+ external_exports.object({
43299
+ operation: external_exports.literal("create"),
43300
+ path: workingFilePathSchema,
43301
+ content_type: workingFileContentTypeSchema,
43302
+ content: external_exports.string().min(1).max(WORKING_FILE_MAX_CONTENT_CHARS)
43303
+ }).strict(),
43304
+ external_exports.object({
43305
+ operation: external_exports.literal("publish"),
43306
+ path: workingFilePathSchema
43307
+ }).strict()
43308
+ ]);
43309
+ var workingFileSummarySchema = external_exports.object({
43310
+ file_ref: external_exports.string().min(1),
43311
+ path: workingFilePathSchema,
43312
+ state: workingFileStateSchema,
43313
+ content_type: workingFileContentTypeSchema,
43314
+ content_chars: external_exports.number().int().nonnegative(),
43315
+ published_ref: external_exports.string().min(1).nullable(),
43316
+ published_at: isoDateTime4.nullable(),
43317
+ expires_at: isoDateTime4,
43318
+ created_at: isoDateTime4,
43319
+ updated_at: isoDateTime4
43320
+ }).strict();
43321
+ var workingFileReadResultSchema = workingFileSummarySchema.extend({
43322
+ content: external_exports.string(),
43323
+ content_truncated: external_exports.boolean()
43324
+ }).strict();
43325
+ var workingFilesListOutputSchema = external_exports.object({
43326
+ files: external_exports.array(workingFileSummarySchema)
43327
+ }).strict();
43328
+
42968
43329
  // ../../packages/protocol/src/run-summary.ts
42969
43330
  var runSummaryOutputSchema = external_exports.object({
42970
43331
  summary: external_exports.string().min(1).max(140)
@@ -42972,7 +43333,7 @@ var runSummaryOutputSchema = external_exports.object({
42972
43333
 
42973
43334
  // ../../packages/protocol/src/runner-settings.ts
42974
43335
  var uuid8 = external_exports.string().uuid();
42975
- var isoDateTime4 = external_exports.string().datetime({ offset: true });
43336
+ var isoDateTime5 = external_exports.string().datetime({ offset: true });
42976
43337
  var runnerHealthSchema = external_exports.enum(["online", "stale", "offline", "revoked", "unpaired"]);
42977
43338
  var runnerExecutionStateSchema = external_exports.enum([
42978
43339
  "ready",
@@ -42992,8 +43353,8 @@ var runnerExecutionReadinessSchema = external_exports.object({
42992
43353
  due_queued_work_orders: external_exports.number().int().nonnegative(),
42993
43354
  claimed_work_orders: external_exports.number().int().nonnegative(),
42994
43355
  running_work_orders: external_exports.number().int().nonnegative(),
42995
- recent_completed_at: isoDateTime4.nullable(),
42996
- recent_failed_at: isoDateTime4.nullable()
43356
+ recent_completed_at: isoDateTime5.nullable(),
43357
+ recent_failed_at: isoDateTime5.nullable()
42997
43358
  }).strict();
42998
43359
  var runnerSandboxPostureSchema = external_exports.enum(["guard", "strict", "off", "none", "unknown"]);
42999
43360
  var runnerPostureSchema = external_exports.object({
@@ -43010,10 +43371,10 @@ var runnerSummarySchema = external_exports.object({
43010
43371
  cli_version: external_exports.string().nullable(),
43011
43372
  posture: runnerPostureSchema,
43012
43373
  execution: runnerExecutionReadinessSchema,
43013
- paired_at: isoDateTime4.nullable(),
43014
- last_heartbeat_at: isoDateTime4.nullable(),
43015
- revoked_at: isoDateTime4.nullable(),
43016
- created_at: isoDateTime4
43374
+ paired_at: isoDateTime5.nullable(),
43375
+ last_heartbeat_at: isoDateTime5.nullable(),
43376
+ revoked_at: isoDateTime5.nullable(),
43377
+ created_at: isoDateTime5
43017
43378
  }).strict();
43018
43379
  var runnerListInputSchema = external_exports.object({
43019
43380
  include_revoked: external_exports.boolean().optional()
@@ -43032,7 +43393,7 @@ var runnerPairingStartOutputSchema = external_exports.object({
43032
43393
  pairing_session_id: uuid8,
43033
43394
  user_code: external_exports.string(),
43034
43395
  verification_uri: external_exports.string(),
43035
- expires_at: isoDateTime4,
43396
+ expires_at: isoDateTime5,
43036
43397
  expires_in: external_exports.number().int().nonnegative()
43037
43398
  }).strict();
43038
43399
  var runnerRevokeInputSchema = external_exports.object({
@@ -43050,9 +43411,9 @@ var workOrderSummarySchema = external_exports.object({
43050
43411
  lane: external_exports.enum(["cloud", "runner"]),
43051
43412
  status: workOrderStatusSchema,
43052
43413
  claimed_by_runner_id: uuid8.nullable(),
43053
- scheduled_for: isoDateTime4,
43054
- grace_deadline: isoDateTime4,
43055
- created_at: isoDateTime4
43414
+ scheduled_for: isoDateTime5,
43415
+ grace_deadline: isoDateTime5,
43416
+ created_at: isoDateTime5
43056
43417
  }).strict();
43057
43418
  var workOrderListInputSchema = external_exports.object({
43058
43419
  status: workOrderStatusSchema.optional(),
@@ -43065,7 +43426,7 @@ var workOrderListOutputSchema = external_exports.object({
43065
43426
  }).strict();
43066
43427
  var workOrderEnqueueInputSchema = external_exports.object({
43067
43428
  agent_id: uuid8,
43068
- scheduled_for: isoDateTime4.optional(),
43429
+ scheduled_for: isoDateTime5.optional(),
43069
43430
  task_id: uuid8.optional()
43070
43431
  }).strict();
43071
43432
  var agentRunNowInputSchema = external_exports.object({
@@ -43092,8 +43453,8 @@ var runnerDiagnoseOutputSchema = external_exports.object({
43092
43453
  platform: external_exports.string(),
43093
43454
  health: runnerHealthSchema,
43094
43455
  capabilities: runnerCapabilityDetailSchema,
43095
- last_heartbeat_at: isoDateTime4.nullable(),
43096
- paired_at: isoDateTime4.nullable(),
43456
+ last_heartbeat_at: isoDateTime5.nullable(),
43457
+ paired_at: isoDateTime5.nullable(),
43097
43458
  revocation_state: external_exports.enum(["active", "revoked", "unpaired"]),
43098
43459
  repair_guidance: external_exports.array(external_exports.object({
43099
43460
  action: external_exports.string(),
@@ -43154,7 +43515,7 @@ var notificationErrorSummarySchema = external_exports.object({
43154
43515
  source: external_exports.enum(["run", "llm", "tool", "mcp", "runner", "integration", "job", "web"]).nullable(),
43155
43516
  seat_id: uuid8.nullable(),
43156
43517
  run_id: uuid8.nullable(),
43157
- created_at: isoDateTime4
43518
+ created_at: isoDateTime5
43158
43519
  }).strict();
43159
43520
  var notificationListErrorsOutputSchema = external_exports.object({
43160
43521
  errors: external_exports.array(notificationErrorSummarySchema)
@@ -43271,7 +43632,7 @@ var integrationSummarySchema = external_exports.object({
43271
43632
  id: uuid8,
43272
43633
  provider: external_exports.string(),
43273
43634
  status: external_exports.enum(["connected", "error", "disconnected"]),
43274
- last_synced_at: isoDateTime4.nullable()
43635
+ last_synced_at: isoDateTime5.nullable()
43275
43636
  }).strict();
43276
43637
  var settingsGetInputSchema = external_exports.object({}).strict();
43277
43638
  var settingsGetOutputSchema = external_exports.object({
@@ -43307,7 +43668,7 @@ var tenantRenameOutputSchema = external_exports.object({
43307
43668
 
43308
43669
  // ../../packages/protocol/src/system-health.ts
43309
43670
  var uuidSchema14 = external_exports.string().uuid();
43310
- var isoDateTime5 = external_exports.string().datetime({ offset: true });
43671
+ var isoDateTime6 = external_exports.string().datetime({ offset: true });
43311
43672
  var systemHealthCallerKindSchema = external_exports.enum(["tenant_admin", "member", "seat_token"]);
43312
43673
  var systemHealthCallerSchema = external_exports.object({
43313
43674
  kind: systemHealthCallerKindSchema,
@@ -43397,7 +43758,7 @@ var systemHealthConnectivitySectionSchema = external_exports.object({
43397
43758
  failed_notification_count: external_exports.number().int().nonnegative()
43398
43759
  }).strict();
43399
43760
  var systemHealthSyncSectionSchema = external_exports.object({
43400
- latest_brief_at: isoDateTime5.nullable(),
43761
+ latest_brief_at: isoDateTime6.nullable(),
43401
43762
  missing_latest_brief: external_exports.boolean(),
43402
43763
  flagged_gap_count: external_exports.number().int().nonnegative()
43403
43764
  }).strict();
@@ -43417,7 +43778,7 @@ var systemHealthCheckInputSchema = systemHealthInputSchema.extend({
43417
43778
  caller: systemHealthCallerSchema
43418
43779
  }).strict();
43419
43780
  var systemHealthOutputSchema = external_exports.object({
43420
- generated_at: isoDateTime5,
43781
+ generated_at: isoDateTime6,
43421
43782
  scope: systemHealthScopeSchema,
43422
43783
  verdict: systemHealthVerdictSchema,
43423
43784
  top_actions: external_exports.array(systemHealthActionSchema),
@@ -45020,16 +45381,16 @@ var syncBriefSchema = external_exports.object({
45020
45381
  }).strict();
45021
45382
 
45022
45383
  // ../../packages/protocol/src/usage.ts
45023
- var isoDateTime6 = external_exports.string().datetime({ offset: true });
45384
+ var isoDateTime7 = external_exports.string().datetime({ offset: true });
45024
45385
  var periodKeySchema = external_exports.string().regex(/^\d{4}-\d{2}-\d{2}$/);
45025
45386
  var countSchema = external_exports.number().int().nonnegative();
45026
45387
  var usdSchema = external_exports.string();
45027
45388
  var bigCountSchema = external_exports.string();
45028
45389
  var usagePeriodSchema = external_exports.object({
45029
45390
  period: periodKeySchema,
45030
- period_start: isoDateTime6,
45031
- period_end: isoDateTime6,
45032
- captured_at: isoDateTime6,
45391
+ period_start: isoDateTime7,
45392
+ period_end: isoDateTime7,
45393
+ captured_at: isoDateTime7,
45033
45394
  run_count: countSchema,
45034
45395
  agent_count: countSchema,
45035
45396
  succeeded_run_count: countSchema,
@@ -45081,7 +45442,7 @@ var usageSnapshotInputSchema = external_exports.object({
45081
45442
  // current month. Normalized to the first of that month server-side.
45082
45443
  period: external_exports.union([
45083
45444
  external_exports.string().regex(/^\d{4}-\d{2}-\d{2}$/),
45084
- isoDateTime6
45445
+ isoDateTime7
45085
45446
  ]).optional()
45086
45447
  }).strict();
45087
45448
  var usageSnapshotOutputSchema = external_exports.object({
@@ -46677,7 +47038,7 @@ There is exactly one way to give a connected tool its credential, and it is the
46677
47038
  order: 47,
46678
47039
  title: "Available tools guide",
46679
47040
  summary: "How to think about tool categories available to seats and what each category should be used for.",
46680
- version: "2026-07-13.1",
47041
+ version: "2026-07-13.3",
46681
47042
  public: true,
46682
47043
  audiences: ["human", "cli", "mcp", "in_app_agent"],
46683
47044
  stages: ["staffing"],
@@ -46715,7 +47076,7 @@ Start from the seat's responsibility, not the tool list. If a tool does not dire
46715
47076
 
46716
47077
  Skills are reusable procedures a seat can learn from; they are not tools and they never grant authority. A skill package may declare required or optional tool dependencies so setup can identify blockers before assignment. Those dependencies are checked against the discoverable \`tool.catalog\` ids, scope tiers, and provider-neutral access levels, then compared to the seat's Charter permission manifest. Missing required tools block approval; optional tools produce setup warnings. A published skill version is immutable, so later corrections create a new version instead of rewriting what a run may have used.
46717
47078
 
46718
- The catalog covers both the platform verbs (status, escalation, Signal readings) and the business tools the stock-agent templates grant \u2014 accounts-payable and receivable reads, AP-inbox and collections drafts, helpdesk triage, CRM reads, and content-calendar, release-artifact, and issue drafts. Each is listed with a conservative scope tier (read for the reads, draft for the drafts, where a draft never sends), a provider-neutral access level, a provider requirement, cost class, lane support, and any Trusted-mode metadata that must be present before a standing authorization can apply. Business tools are credential-gated. Because a skill's required tool id is matched against these ids, a skill that requires one of them resolves against the catalog rather than reporting an unknown tool. Catalog membership is configuration only: it still confers no authority, and a listed id runs only once a live handler exists behind the seat's signed permission manifest, the server guard, and any required credential \u2014 the manifest and guard remain the control plane. Unknown tool ids or unsupported access levels fail closed.
47079
+ The catalog covers both the platform verbs (status, escalation, Signal readings) and the business tools the stock-agent templates grant \u2014 accounts-payable and receivable reads, AP-inbox and collections drafts, helpdesk triage, CRM reads, web search, public-page fetch, browser read, working files, script execution, content-calendar, release-artifact, and issue drafts. Each is listed with a conservative scope tier (read for the reads, draft for the drafts and action-capable internal workbench tools), a provider-neutral access level, a provider requirement, cost class, lane support, and any Trusted-mode metadata that must be present before a standing authorization can apply. Business tools are credential-gated unless they are {{brand}}-managed generic workbench tools. Because a skill's required tool id is matched against these ids, a skill that requires one of them resolves against the catalog rather than reporting an unknown tool. Catalog membership is configuration only: it still confers no authority, and a listed id runs only once a live handler exists behind the seat's signed permission manifest, the server guard, and any required credential \u2014 the manifest and guard remain the control plane. Unknown tool ids or unsupported access levels fail closed.
46719
47080
 
46720
47081
  ## How agents should request tools
46721
47082
 
@@ -46725,14 +47086,14 @@ Agents should explain the job, the required tool category, the minimum permissio
46725
47086
 
46726
47087
  Every tool call passes the server-side guard first: the guard checks the call against the seat's signed permission manifest and records a tool-call audit row for **every** call \u2014 allowed, denied, or escalated. Tool selection is never authorization. An explicitly declined manifest entry is enforced as denied, even when the tool exists and the client asks for it. Only an allowed call reaches its handler. A connected credential is bound into the handler for the duration of the call only; the secret never appears in the result, the audit summary, logs, or the model's context.
46727
47088
 
46728
- External connectors are being rolled out provider by provider, conservatively (read and draft before send; write behind approval). A selected tool is only a permission until a live handler exists and the seat has the required credential or binding. Today the built-in execution path supports internal status reporting, the generic REST GET connector when a signed host/path allowlist and credential exist, \`slack.post_message\` for a bound Slack channel, and Google handlers for \`gmail.read\`, \`gmail.draft\`, \`sheets.read\`, and approval-held \`sheets.write\` when Google is connected. \`gmail.send\` remains held for approval and live external send stays gated on Google verification. Before that verification is complete, partner demos should show sandbox dry runs, setup previews, and approval-held examples rather than claim production Google readiness. Other provider entries remain configuration-only until their connector ships, so nothing runs silently.`
47089
+ External connectors are being rolled out provider by provider, conservatively (read and draft before send; write behind approval). A selected tool is only a permission until a live handler exists and the seat has the required credential or binding. Today the built-in execution path supports internal status reporting, the generic REST GET connector when a signed host/path allowlist and credential exist, \`slack.post_message\` for a bound Slack channel, Google handlers for \`gmail.read\`, \`gmail.draft\`, \`sheets.read\`, and approval-held \`sheets.write\` when Google is connected, plus the governed workbench tools \`web.search\`, \`web.fetch\`, \`browser.read\`, \`files.read\`, \`files.write\`, and \`script.run\`. \`web.search\` uses a server-side Exa provider and returns normalized cited results without exposing provider keys. \`web.fetch\` reads one public HTTPS page only after scheme, DNS/IP, redirect, content-type, size, and timeout checks pass. \`browser.read\` opens an ephemeral read-only public-network browser session for navigation, inspection, screenshot, or extraction; it does not submit forms, persist authenticated state, execute downloads, or expose cross-tenant artifacts. \`files.read\` and \`files.write\` operate on bounded tenant-scoped working files and published \`rost://working-files/<id>\` references; they reject traversal, cap text payloads, retain ephemeral files briefly, and never execute file contents. \`script.run\` is compute-only and network-denied by default, but arbitrary code execution is action-capable, so read-only posture does not grant it; it still requires the \`agent.script_run\` entitlement and returns size-capped output. \`gmail.send\` remains held for approval and live external send stays gated on Google verification. Before that verification is complete, partner demos should show sandbox dry runs, setup previews, and approval-held examples rather than claim production Google readiness. Other provider entries remain configuration-only until their connector ships, so nothing runs silently.`
46729
47090
  },
46730
47091
  {
46731
47092
  slug: "mcp-and-cli-guide",
46732
47093
  order: 48,
46733
47094
  title: "CLI and MCP installation guide",
46734
47095
  summary: "Install the public CLI, register remote token-backed MCP clients, and find the full command and tool catalog.",
46735
- version: "2026-07-13.2",
47096
+ version: "2026-07-13.4",
46736
47097
  public: true,
46737
47098
  audiences: ["human", "cli", "mcp", "in_app_agent"],
46738
47099
  stages: ["company_setup", "staffing"],
@@ -46833,6 +47194,10 @@ The MCP server is remote and token-backed. There is no local MCP daemon to insta
46833
47194
 
46834
47195
  AICOS MCP mode is deliberately seat-scoped. In Settings, the AICOS panel can create a token for the canonical AI Chief of Staff seat and then marks MCP selectable only while a non-revoked, unexpired AICOS seat token exists. Do not use a tenant-admin MCP token to staff or test AICOS; it should operate as its own governed seat, with the web panel remaining the readiness monitor and transcript surface.
46835
47196
 
47197
+ MCP clients may also expose their own native browser, search, file, or shell tools. Those native client actions are outside {{brand}} receipts, cost accounting, and audit. Treat them as ungoverned scratch work until the source is fetched or recorded through a {{brand}} MCP tool such as \`web.fetch\`, \`web.search\`, \`browser.read\`, a work-log evidence call, or another governed command. Only the {{brand}} tool call creates the permission receipt and evidence record.
47198
+
47199
+ Managed Runner turns use a generated {{brand}} MCP configuration instead of the operator's local MCP/client config. Ordinary business-agent runner turns are MCP-only, run in a read-only sandbox, and do not receive local provider keys such as Exa or browser-provider credentials. Codex runner turns ignore user config/rules, run ephemerally, and disable native search, browser, and computer-use features; Forge developer profiles keep their separate local-code workspace behavior.
47200
+
46836
47201
  ## Prerequisite: a human approver in a browser
46837
47202
 
46838
47203
  A headless agent cannot complete setup unattended. Two things always require a human, so plan to announce the handoff rather than stall silently:
@@ -47202,6 +47567,7 @@ The signed-in app exposes the same Skill command surface at **Skills**, linked f
47202
47567
  | \`{{cli}} command tenant.model_gateway_policy.update\` | \`tenant.model_gateway_policy.update\` | Unlock or relock managed models that lack a zero-retention (ZDR) tier (ADR-0019). Locked (default) restricts the AI Gateway to zero-retention-eligible managed models. Owner-only and human-gated; unlocking establishes an ADR-0018 \xA76 standing authorization and surfaces a per-model retention disclosure. | Tenant-admin | \`{{cli}} command tenant.model_gateway_policy.update --json '{"allow_non_zdr_models":true}'\` |
47203
47568
  | \`{{cli}} member invite|update|remove\` | \`member.invite\`, \`member.update\`, \`member.remove\` | Manage tenant members; execution requires an owner or admin membership. | Tenant | \`{{cli}} member invite --email ops@example.com --role member\` |
47204
47569
  | \`{{cli}} agent templates|create|setup|tools|dry-run|go-live|status|run-now|fleet-digest|get-run|show\` | \`agent_template.list\`, \`agent.create_from_template\`, \`agent.create_custom\`, \`agent_setup.get\`, \`agent_setup.update\`, \`agent.configure_tools\`, \`agent.run_dry_run\`, \`agent.go_live\`, \`agent.status\`, \`agent.run_now\`, \`agent.fleet_digest\`, \`agent.get_run\`, \`agent.show_markdown\` | Run the full agent setup and operation flow: list templates, create a draft from a template or guided custom answers (with \`--model\` and \`--effort\`), read or answer setup state, connect or decline tools, dry-run, go live, run on demand, capture the fleet-health digest, read one run's transcript/error diagnostics, and show a markdown readout. Human CLI dry-runs print the rehearsal transcript and, when present, the per-tool preview labels (\`Would run\`, \`Blocked\`, \`Escalated\`) before go-live. Create and go-live stop at human gates; the dry-run is ungated by human approval but requires a signed manifest first. | Tenant and seat | \`{{cli}} agent fleet-digest --json\` |
47570
+ | \`{{cli}} command agent.activation_receipt|agent.activation_sign|agent.trust.*\` | \`agent.activation_receipt\`, \`agent.activation_sign\`, \`agent.trust.create\`, \`agent.trust.inspect\`, \`agent.trust.revoke\`, \`agent.trust.expire\`, \`agent.trust.supersede\` | Build a secret-free activation receipt, sign the exact current digest, and create/inspect/revoke/expire/supersede bounded Trusted execution grants. Receipt and inspect are reads; sign and grant lifecycle writes are human steward/admin only and refuse stale receipt digests. | Seat read; tenant write | \`{{cli}} command agent.activation_receipt --json '{"agent_id":"<agent-id>"}'\`; \`{{cli}} command agent.trust.create --json '{"agent_id":"<agent-id>","expected_scope_digest":"sha256:...","budget_cents":2500}'\` |
47205
47571
  | \`{{cli}} tools list\` | \`tool.catalog\` | List the discoverable tool catalog the builder reads (id, scope tiers, access levels, provider requirement, cost class, lane support, credential requirement, access policy, Trusted metadata, and execution-boundary guidance). | Tenant | \`{{cli}} tools list --json\` |
47206
47572
  | \`{{cli}} skills list|get|file|assigned|check-dependencies\` | \`skill.list\`, \`skill.get\`, \`skill.file.get\`, \`skill.assigned.list\`, \`skill.check_dependencies\` | Discover reusable Skills, read descriptors and stored package files, list approved Seat assignments, and compare required/optional tool dependencies with a Seat's signed Charter manifest. Skills are instructions, not authority. | Tenant-admin; seat-scoped reads for assigned Skills | \`{{cli}} skills list --json\`; \`{{cli}} skills file --slug invoice-review --path SKILL.md\` |
47207
47573
  | \`{{cli}} skills catalog|enable|install|sync\` | \`skill.catalog\`, \`skill.enable_catalog\`, \`skill.install_local\`, \`skill.sync_local\` | Discover entitled {{brand}} catalog Skills, enable a catalog Skill into the company library with human confirmation, and install or sync approved Skill files locally from {{brand}} APIs. Private catalog source URLs and GitHub tokens never go to local agents. | Tenant-admin for catalog enablement; seat-scoped sync for assigned Skills | \`{{cli}} skills sync --seat-id <id> --client codex\`; \`{{cli}} skills install rost/ap-review --seat-id <id> --client codex\` |
@@ -47444,6 +47810,13 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
47444
47810
  | \`rost_list_tenant_capability_grants\` | \`tool_grants.tenant.list\` | List tenant capability ceilings/defaults with connection, availability, source, and compile status. | Tenant | Call with \`{}\`; no secrets or vault refs. |
47445
47811
  | \`rost_list_agent_effective_capability_grants\` | \`tool_grants.agent.effective\` | Read one agent's effective capability grants after tenant ceilings, agent selections, and compile availability are applied. | Tenant | Call with \`{"agent_id":"<agent-id>"}\`. |
47446
47812
  | \`rost_update_agent_capability_grants\` | \`tool_grants.agent.update\` | Compile a Charter supersession proposal for agent capability grant reductions or expansions. | Tenant | Human steward/admin only; call with \`{"agent_id":"<agent-id>","grants":[{"tool_grant_id":"<grant-id>","access_level":"read"}]}\`; active authority changes only after the signed Charter is superseded. |
47813
+ | \`rost_build_agent_activation_receipt\` | \`agent.activation_receipt\` | Build the current activation receipt for an agent: capabilities, connection metadata, digest, budget, and always-human boundary. | Seat or tenant-admin | Call with \`{"agent_id":"<agent-id>"}\`; rebuild after Charter, connection, lane, schedule, or grant changes. |
47814
+ | \`rost_sign_agent_activation_receipt\` | \`agent.activation_sign\` | Human steward/admin sign-off for the exact activation receipt digest. | Tenant | Human-gated; call with \`{"agent_id":"<agent-id>","expected_scope_digest":"sha256:...","budget_cents":2500}\`. |
47815
+ | \`rost_create_agent_trusted_grant\` | \`agent.trust.create\` | Create a bounded Trusted execution grant for a live agent after receipt review. | Tenant | Human steward/admin only; call with \`{"agent_id":"<agent-id>","expected_scope_digest":"sha256:...","budget_cents":2500}\`. |
47816
+ | \`rost_inspect_agent_trusted_grants\` | \`agent.trust.inspect\` | Inspect active or historical Trusted grants for one agent. | Seat or tenant-admin | Call with \`{"agent_id":"<agent-id>","include_inactive":true}\`; metadata only. |
47817
+ | \`rost_revoke_agent_trusted_grant\` | \`agent.trust.revoke\` | Revoke an active Trusted grant while preserving history. | Tenant | Human steward/admin only; call with \`{"grant_id":"<grant-id>","reason":"..."}\`; non-interactive callers receive a confirmation handoff. |
47818
+ | \`rost_expire_agent_trusted_grants\` | \`agent.trust.expire\` | Mark overdue active Trusted grants expired and append audit events. | Tenant | Human steward/admin only; call with \`{"agent_id":"<agent-id>"}\`. |
47819
+ | \`rost_supersede_agent_trusted_grant\` | \`agent.trust.supersede\` | Replace the active Trusted grant with a fresh digest and budget. | Tenant | Human steward/admin only; call with \`{"agent_id":"<agent-id>","expected_scope_digest":"sha256:...","budget_cents":2500}\`. |
47447
47820
  | \`rost_suggest_setup_capability_grants\` | \`agent_setup.capability_suggestions\` | Suggest deterministic minimum capability grants from the current setup/template and tenant grant availability. | Tenant | Call with \`{"seat_id":"<seat-id>"}\` or \`{"setup_id":"<agent-id>"}\`; no model call and no mutation. |
47448
47821
  | \`rost_list_skills\` | \`skill.list\` | List tenant Skills with application descriptors, dependency metadata, source status, latest version, and assigned Seat count. Seat-scoped reads are available through \`rost://skills\`. | Tenant-admin | Call with \`{}\` or \`{"query":"invoice"}\`. |
47449
47822
  | \`rost_list_rost_skill_catalog\` | \`skill.catalog\` | List entitled {{brand}} catalog Skills. Private catalog source URLs and credentials stay server-side. | Tenant-admin | Call with \`{}\`; use \`{"include_unentitled":true}\` only to inspect tier availability. |
@@ -48422,7 +48795,7 @@ Stop before: approving a Charter, signing a manifest, connecting a tool or crede
48422
48795
  order: 71,
48423
48796
  title: "Billing and pricing guide",
48424
48797
  summary: "How {{brand}} packages company-wide access, Stripe billing, and governed-agent usage without per-human-seat pricing.",
48425
- version: "2026-07-02.5",
48798
+ version: "2026-07-13.1",
48426
48799
  public: true,
48427
48800
  audiences: ["human", "cli", "mcp", "in_app_agent"],
48428
48801
  stages: ["company_setup", "staffing", "operating_rhythm"],
@@ -48478,6 +48851,14 @@ The first meter is billable-successful-agent-run based because the current platf
48478
48851
 
48479
48852
  Billable true-up is service-owned and runs after a period is closed. The tenant-facing \`usage.snapshot\` command is an ROI/reporting tool; an early current-period snapshot must not become, replace, or block the final billable close. The billing close records a separate \`billing_usage_true_ups\` row keyed by tenant and period with the source kind, included allowance, billable overage, status, and Stripe meter event identifier. A closed usage snapshot is preferred only when it was captured after the period ended; otherwise the service close uses a live rollup for that closed period so an early ROI snapshot cannot undercount the invoice true-up.
48480
48853
 
48854
+ ## Launch credits and recovery access
48855
+
48856
+ Eligible launch tenants can receive one configured launch credit for {{brand}}-managed variable costs. Managed LLM, Exa, browser, and sandbox costs are estimated before the provider call, reserved atomically against the active launch credit, and then settled to actual usage or released if the call does not complete. BYOK model calls do not draw down launch credit, but they still keep their ordinary audit and usage records.
48857
+
48858
+ Launch-credit notifications are informational and idempotent: owners may see threshold, exhaustion, or expiry notices with recovery actions when the remaining credit drops or the credit approaches its expiry window.
48859
+
48860
+ When an unsubscribed tenant's launch credit expires, {{brand}} enters a recovery-safe posture instead of deleting the workspace or letting agents continue spending. Billing, BYOK setup, export, cancel, and delete/recovery routes stay reachable so a human can restore or leave cleanly. Operational writes, schedules, cloud agent runs, and other cost-creating actions pause until the tenant has an active subscription or active launch credit again.
48861
+
48481
48862
  ## Stripe boundary
48482
48863
 
48483
48864
  Stripe owns payment collection, payment methods, invoices, and hosted customer self-service.
@@ -49663,7 +50044,7 @@ This worked document **omits** \`unanswered_boundaries\` and \`seat_type_recomme
49663
50044
  order: 43,
49664
50045
  title: "Agent builder guide",
49665
50046
  summary: "The full agent setup sequence on the CLI/MCP path \u2014 seat, steward, job, boundaries, tools, credentials, model, schedule, dry-run, go-live \u2014 with the structured model config and access tiers.",
49666
- version: "2026-07-10.1",
50047
+ version: "2026-07-13.1",
49667
50048
  public: true,
49668
50049
  audiences: ["cli", "mcp", "in_app_agent"],
49669
50050
  stages: ["staffing"],
@@ -49752,7 +50133,7 @@ Conservative by default: anything beyond read/draft defaults to \`always_ask\`.
49752
50133
 
49753
50134
  - **Finance clerk (AP/AR).** Tight read + draft scopes (\`ap.invoices.read\`, \`accounting.bills.draft_update\`); posting and payment escalate; measurables track drafted-on-time and discrepancies caught. Balanced model.
49754
50135
  - **Inbox / scheduling assistant.** \`gmail.read\` + draft + \`calendar.propose_hold\`; sends and confirmed meetings are approval-gated; sensitive messages escalate. Triage or balanced model.
49755
- - **Research / SDR.** \`web.research\` + \`crm.contacts.draft_update\` (draft only); outreach and paid data escalate. Balanced model.
50136
+ - **Research / SDR.** \`web.search\` + \`crm.contacts.draft_update\` (draft only); outreach and paid data escalate. Balanced model.
49756
50137
  - **Reviewer / QA.** Read release artifacts + draft issues; release approval and production changes escalate. Complex model for judgment.
49757
50138
 
49758
50139
  ## The full JSON shape
@@ -50640,6 +51021,8 @@ var COMMAND_MANIFEST = [
50640
51021
  { "id": "agent_setup.start", "namespace": "agent_setup", "action": "start", "title": "Start agent setup", "description": "Start (or resume) a draft agent setup for a seat in template, custom, or existing mode.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "mode", "flag": "mode", "type": "enum", "required": true, "enumValues": ["template", "custom", "existing"] }, { "name": "template_slug", "flag": "template-slug", "type": "string", "required": false }], "hasComplexInput": false, "help": "Start a draft agent setup from a template, custom, or existing mode; the setup resumes from the draft agent and Charter, not a fresh start." },
50641
51022
  { "id": "agent_setup.update", "namespace": "agent_setup", "action": "update", "title": "Update agent setup", "description": "Update the draft agent's parent, steward, lane, schedule, operational answers, and tool decisions.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "parent_seat_id", "flag": "parent-seat-id", "type": "string", "required": false }, { "name": "steward_seat_id", "flag": "steward-seat-id", "type": "string", "required": false }, { "name": "lane", "flag": "lane", "type": "enum", "required": false, "enumValues": ["cloud", "mcp_session", "runner"] }, { "name": "schedule_cron", "flag": "schedule-cron", "type": "string", "required": false }, { "name": "answers", "flag": "answers", "type": "array", "required": false, "itemType": "string" }, { "name": "skill_discovery_enabled", "flag": "skill-discovery-enabled", "type": "boolean", "required": false }], "hasComplexInput": true, "help": "Update parent, steward, lane, schedule, answers, or tool decisions on the draft; steward and parent changes keep the no-orphan chain explicit." },
50642
51023
  { "id": "agent_template.list", "namespace": "agent_template", "action": "list", "title": "List agent templates", "description": "List stock agent templates and their responsibilities, default tools, and dry-run rehearsal.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [], "hasComplexInput": false, "help": "List stock agent templates and their default tools and safety boundaries before starting a template setup." },
51024
+ { "id": "agent.activation_receipt", "namespace": "agent", "action": "activation_receipt", "title": "Build agent activation receipt", "description": "Read the compiled authority receipt for one agent: effective capabilities, connection metadata, stale-scope digest, budget, and always-human boundary.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "agent_id", "flag": "agent-id", "type": "string", "required": true }, { "name": "proposed_budget_cents", "flag": "proposed-budget-cents", "type": "integer", "required": false }], "hasComplexInput": false, "help": "Build the current compiled activation receipt before signing or creating a Trusted grant. Rebuild it after any Charter, capability, connection, schedule, or lane change." },
51025
+ { "id": "agent.activation_sign", "namespace": "agent", "action": "activation_sign", "title": "Sign agent activation receipt", "description": "Human steward/admin activation sign-off for the current compiled receipt digest. Refuses stale receipts and records a human decision plus append-only event.", "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "agent_id", "flag": "agent-id", "type": "string", "required": true }, { "name": "expected_scope_digest", "flag": "expected-scope-digest", "type": "string", "required": true }, { "name": "budget_cents", "flag": "budget-cents", "type": "integer", "required": true }, { "name": "reason", "flag": "reason", "type": "string", "required": false }], "hasComplexInput": false, "help": "Human steward/admin sign-off for the exact activation receipt digest. Agents can surface the pending confirmation but cannot sign their own authority." },
50643
51026
  { "id": "agent.configure_tools", "namespace": "agent", "action": "configure_tools", "title": "Configure agent tools", "description": "Save tool proposals, declines, and credential-ingress requests for a draft agent. Never stores or echoes secret material; vault refs only.", "requiredScope": "seat", "confirmation": "credential_flow", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }], "hasComplexInput": true, "help": "Connect or decline proposed tools and stage credential-ingress requests; never place raw secrets here \u2014 secrets flow through vault-backed credential.ingress as vault refs only.", "example": { "seat_id": "0190aaaa-aaaa-7aaa-8aaa-aaaaaaaaaaaa", "tool_decisions": [{ "tool": "ap.invoices.read", "decision": "connect" }, { "tool": "email.draft", "decision": "connect" }] } },
50644
51027
  { "id": "agent.create_custom", "namespace": "agent", "action": "create_custom", "title": "Create custom agent", "description": "Create a draft custom agent shell and a draft Charter seed from operational answers (what it owns, success, never-do-alone, steward).", "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "steward_seat_id", "flag": "steward-seat-id", "type": "string", "required": false }, { "name": "lane", "flag": "lane", "type": "enum", "required": false, "enumValues": ["cloud", "mcp_session", "runner"] }, { "name": "what_it_owns", "flag": "what-it-owns", "type": "string", "required": false }, { "name": "what_success_looks_like", "flag": "what-success-looks-like", "type": "string", "required": false }, { "name": "what_it_must_never_do_alone", "flag": "what-it-must-never-do-alone", "type": "string", "required": false }], "hasComplexInput": true, "help": "Create a draft custom agent from operational answers (what it owns, success, never-do-alone, steward); the Charter Builder owns the contract and go-live stays human-gated.", "example": { "seat_id": "0190aaaa-aaaa-7aaa-8aaa-aaaaaaaaaaaa", "steward_seat_id": "0190bbbb-bbbb-7bbb-8bbb-bbbbbbbbbbbb", "lane": "cloud", "what_it_owns": "Drafting AP invoice entries from inbound vendor emails for human review.", "what_success_looks_like": "Every inbound invoice is drafted within one business day with the correct GL coding.", "what_it_must_never_do_alone": "Never send payment or approve an invoice without a human sign-off." } },
50645
51028
  { "id": "agent.create_from_template", "namespace": "agent", "action": "create_from_template", "title": "Create agent from template", "description": "Create a draft stock agent and draft Charter from a stock template. Creates the agent occupancy only when a human steward chain resolves; the agent stays draft until a signed manifest, a passed dry run, and human go-live.", "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "template_slug", "flag": "template-slug", "type": "string", "required": true }, { "name": "expected_template_version", "flag": "expected-template-version", "type": "string", "required": false }], "hasComplexInput": false, "help": "Create a draft stock agent and draft Charter from a template; the agent occupancy is created only when a human steward chain resolves, and the agent stays draft until a signed manifest, a passed dry run, and human go-live." },
@@ -50656,6 +51039,11 @@ var COMMAND_MANIFEST = [
50656
51039
  { "id": "agent.run_now", "namespace": "agent", "action": "run_now", "title": "Run agent now", "description": "Queue and dispatch an immediate work order for a live cloud or runner agent on a seat.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "task_id", "flag": "task-id", "type": "string", "required": false }], "hasComplexInput": false, "help": "Queue and dispatch an immediate live agent run without changing the agent's saved schedule." },
50657
51040
  { "id": "agent.show_markdown", "namespace": "agent", "action": "show_markdown", "title": "Show agent setup as markdown", "description": "Compose a seat's agent setup, steward, model, tools, and Charter into a clean, human-skimmable markdown card for review.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Render a seat's agent setup, model, steward, tools, and Charter as a clean markdown card to show your human a quick review." },
50658
51041
  { "id": "agent.status", "namespace": "agent", "action": "status", "title": "Get agent status", "description": "Return the agent occupancy, lane, schedule, live/offline state, steward chain, dry-run result, and Runner availability for a seat.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Check an agent's lane, live state, steward chain, dry-run result, and Runner availability before relying on it." },
51042
+ { "id": "agent.trust.create", "namespace": "agent", "action": "trust.create", "title": "Create agent Trusted grant", "description": "Create a bounded Trusted execution grant for a live agent after a human steward/admin signs the current activation receipt digest.", "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "agent_id", "flag": "agent-id", "type": "string", "required": true }, { "name": "expected_scope_digest", "flag": "expected-scope-digest", "type": "string", "required": true }, { "name": "budget_cents", "flag": "budget-cents", "type": "integer", "required": true }, { "name": "expires_at", "flag": "expires-at", "type": "string", "required": false }, { "name": "reason", "flag": "reason", "type": "string", "required": false }], "hasComplexInput": false, "help": "Create a bounded Trusted execution grant only after reviewing the activation receipt digest, budget, and always-human boundary. Human steward/admin only." },
51043
+ { "id": "agent.trust.expire", "namespace": "agent", "action": "trust.expire", "title": "Expire agent Trusted grants", "description": "Human steward/admin maintenance command that marks overdue active Trusted grants expired and appends an event for each expired grant.", "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "agent_id", "flag": "agent-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Mark overdue active Trusted grants expired and append audit events. Human steward/admin only." },
51044
+ { "id": "agent.trust.inspect", "namespace": "agent", "action": "trust.inspect", "title": "Inspect agent Trusted grants", "description": "Read active or historical Trusted execution grants for one agent. Returns metadata only, never secrets.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "agent_id", "flag": "agent-id", "type": "string", "required": true }, { "name": "include_inactive", "flag": "include-inactive", "type": "boolean", "required": false }], "hasComplexInput": false, "help": "Inspect active or historical Trusted grants for one agent. Metadata only; no secrets or vault refs." },
51045
+ { "id": "agent.trust.revoke", "namespace": "agent", "action": "trust.revoke", "title": "Revoke agent Trusted grant", "description": "Human steward/admin revocation for an active Trusted execution grant. Preserves the historical grant row and appends an event.", "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "grant_id", "flag": "grant-id", "type": "string", "required": true }, { "name": "reason", "flag": "reason", "type": "string", "required": false }], "hasComplexInput": false, "help": "Revoke an active Trusted grant while preserving history. Human steward/admin only." },
51046
+ { "id": "agent.trust.supersede", "namespace": "agent", "action": "trust.supersede", "title": "Supersede agent Trusted grant", "description": "Human steward/admin replacement for an active Trusted grant. Refuses stale receipt digests and links the new grant to the superseded grant.", "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "agent_id", "flag": "agent-id", "type": "string", "required": true }, { "name": "expected_scope_digest", "flag": "expected-scope-digest", "type": "string", "required": true }, { "name": "budget_cents", "flag": "budget-cents", "type": "integer", "required": true }, { "name": "expires_at", "flag": "expires-at", "type": "string", "required": false }, { "name": "reason", "flag": "reason", "type": "string", "required": false }], "hasComplexInput": false, "help": "Replace the active Trusted grant with a fresh digest and budget. Rebuild the receipt first; stale digests are refused." },
50659
51047
  { "id": "agent.update_schedule", "namespace": "agent", "action": "update_schedule", "title": "Update agent schedule", "description": "Set or clear the scheduled execution cron for a draft or live agent on a seat.", "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "schedule_cron", "flag": "schedule-cron", "type": "string", "required": true }], "hasComplexInput": false, "help": "Set or clear an agent's scheduled execution; a live scheduled agent must keep a steward chain resolving to a human." },
50660
51048
  { "id": "aicos.brain_settings.get", "namespace": "aicos", "action": "brain_settings.get", "title": "Get AICOS brain settings", "description": "Read the AICOS run lane and brain selection. Returns labels and enum settings only; no secrets or vault refs.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [], "hasComplexInput": false, "help": "Read the AICOS lane and brain selection labels without returning provider keys, vault refs, or runner secrets." },
50661
51049
  { "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." },
@@ -55358,6 +55746,20 @@ var RUNNER_AICOS_TURN_TOOLS = [
55358
55746
  "mcp__rost__rost_aicos_turn_load_context",
55359
55747
  "mcp__rost__rost_get_tasks"
55360
55748
  ];
55749
+ var CODEX_NATIVE_TOOL_ISOLATION_CONFIG_ARGS = [
55750
+ "--config",
55751
+ 'web_search="disabled"',
55752
+ "--config",
55753
+ "features.browser_use=false",
55754
+ "--config",
55755
+ "features.in_app_browser=false",
55756
+ "--config",
55757
+ "features.browser_use_external=false",
55758
+ "--config",
55759
+ "features.browser_use_full_cdp_access=false",
55760
+ "--config",
55761
+ "features.computer_use=false"
55762
+ ];
55361
55763
  var CLAUDE_WORKSPACE_WRITE_LOCAL_TOOLS = ["Read", "Write", "Edit", "Glob", "Grep", "Bash"];
55362
55764
  var CLAUDE_READ_LOCAL_TOOLS = ["Read", "Glob", "Grep"];
55363
55765
  var READ_STUB_TIMEOUT_MS = 18e4;
@@ -56124,7 +56526,8 @@ function resolveTurnPlan(input) {
56124
56526
  codexSandbox: "read-only",
56125
56527
  outputFormat: input.kind === "turn_execution" ? "json" : "text",
56126
56528
  repoDir: null,
56127
- timeoutMs: READ_STUB_TIMEOUT_MS
56529
+ timeoutMs: READ_STUB_TIMEOUT_MS,
56530
+ isolateCodexNativeTools: input.kind === "work_order"
56128
56531
  };
56129
56532
  }
56130
56533
  const execution = input.execution;
@@ -56142,7 +56545,8 @@ function resolveTurnPlan(input) {
56142
56545
  // Only a Forge workspace grants a repo cwd; a needs_repo contract with no prepared
56143
56546
  // workspace (broker/clone failed upstream) falls back to tmpdir rather than a bad cwd.
56144
56547
  repoDir: execution.needs_repo ? input.repoDir : null,
56145
- timeoutMs: resolveExecutionTimeoutMs(execution)
56548
+ timeoutMs: resolveExecutionTimeoutMs(execution),
56549
+ isolateCodexNativeTools: execution.profile === "seat_work"
56146
56550
  };
56147
56551
  }
56148
56552
  function buildTurnCommand(input) {
@@ -56159,7 +56563,13 @@ function buildTurnCommand(input) {
56159
56563
  plan.codexSandbox,
56160
56564
  // Skip the git-repo check only when the cwd is NOT a checkout (read stub in
56161
56565
  // tmpdir); a prepared Forge workspace IS a repo, so drop the flag there.
56162
- ...plan.repoDir === null ? ["--skip-git-repo-check"] : []
56566
+ ...plan.repoDir === null ? ["--skip-git-repo-check"] : [],
56567
+ ...plan.isolateCodexNativeTools ? [
56568
+ "--ignore-user-config",
56569
+ "--ignore-rules",
56570
+ "--ephemeral",
56571
+ ...CODEX_NATIVE_TOOL_ISOLATION_CONFIG_ARGS
56572
+ ] : []
56163
56573
  ]
56164
56574
  };
56165
56575
  }