@rosthq/cli 0.7.72 → 0.7.74

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.");
@@ -39864,6 +39895,83 @@ var toolPolicyGetOutputSchema = external_exports.object({
39864
39895
  tool_policy: storedTenantToolPolicySchema
39865
39896
  }).strict();
39866
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
+
39867
39975
  // ../../packages/protocol/src/agent-policy.ts
39868
39976
  var AUTONOMOUS_RISK_LEVELS = ["low", "medium", "high", "critical"];
39869
39977
  var autonomousRiskLevelSchema = external_exports.enum(AUTONOMOUS_RISK_LEVELS);
@@ -40587,6 +40695,54 @@ var charterSchema = charterPersistedObjectSchema.superRefine(refineAutonomousBou
40587
40695
  var charterDocSchema = charterDocObjectSchema.superRefine(refineAutonomousBoundaries);
40588
40696
  var charterDocEditsSchema = charterDocObjectSchema.omit({ payload_version: true }).partial().strict();
40589
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
+
40590
40746
  // ../../packages/protocol/src/eos-intelligence.ts
40591
40747
  var uuid3 = external_exports.string().uuid();
40592
40748
  var frictionSeveritySchema = external_exports.enum(["low", "med", "high", "critical"]);
@@ -42293,6 +42449,15 @@ var confirmationRejectOutputSchema = external_exports.object({
42293
42449
  command_id: external_exports.string().min(1),
42294
42450
  rejected: external_exports.literal(true)
42295
42451
  }).strict();
42452
+ var confirmationRemintInputSchema = external_exports.object({
42453
+ confirmation_id: external_exports.string().min(1)
42454
+ }).strict();
42455
+ var confirmationRemintOutputSchema = external_exports.object({
42456
+ confirmation_id: external_exports.string().min(1),
42457
+ command_id: external_exports.string().min(1),
42458
+ reminted: external_exports.literal(true),
42459
+ new_confirmation: pendingConfirmationSchema
42460
+ }).strict();
42296
42461
  var confirmationListInputSchema = external_exports.object({
42297
42462
  limit: external_exports.number().int().min(1).max(200).optional()
42298
42463
  }).strict();
@@ -43075,6 +43240,101 @@ var errorLogSupersedeOutputSchema = external_exports.object({
43075
43240
  resolved_at: isoDateTime3
43076
43241
  }).strict();
43077
43242
 
43243
+ // ../../packages/protocol/src/working-files.ts
43244
+ var WORKING_FILE_MAX_PATH_CHARS = 512;
43245
+ var WORKING_FILE_MAX_CONTENT_CHARS = 16384;
43246
+ var isoDateTime4 = external_exports.string().datetime({ offset: true });
43247
+ var workingFileContentTypeSchema = external_exports.enum([
43248
+ "text/plain",
43249
+ "text/markdown",
43250
+ "application/json",
43251
+ "text/csv",
43252
+ "text/yaml",
43253
+ "application/yaml",
43254
+ "text/x-typescript",
43255
+ "text/typescript",
43256
+ "text/javascript",
43257
+ "application/javascript"
43258
+ ]);
43259
+ var workingFileStateSchema = external_exports.enum(["ephemeral", "published"]);
43260
+ var workingFileRetentionClassSchema = external_exports.enum(["ephemeral_7d", "published_90d"]);
43261
+ function normalizeWorkingFilePath(value) {
43262
+ return value.trim().replace(/\\/g, "/");
43263
+ }
43264
+ function isSafeWorkingFilePath(value) {
43265
+ if (value.includes("\\")) {
43266
+ return false;
43267
+ }
43268
+ const normalized = normalizeWorkingFilePath(value);
43269
+ if (normalized.length === 0 || normalized.length > WORKING_FILE_MAX_PATH_CHARS) {
43270
+ return false;
43271
+ }
43272
+ if (normalized.startsWith("/") || normalized.startsWith("./") || normalized.startsWith("../")) {
43273
+ return false;
43274
+ }
43275
+ if (normalized.includes("\0") || normalized.includes("//")) {
43276
+ return false;
43277
+ }
43278
+ const segments = normalized.split("/");
43279
+ return segments.every((segment) => segment.length > 0 && segment !== "." && segment !== "..");
43280
+ }
43281
+ 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");
43282
+ var workingFileCreateInputSchema = external_exports.object({
43283
+ path: workingFilePathSchema,
43284
+ content_type: workingFileContentTypeSchema,
43285
+ content: external_exports.string().min(1).max(WORKING_FILE_MAX_CONTENT_CHARS)
43286
+ }).strict();
43287
+ var workingFileReadInputSchema = external_exports.object({
43288
+ path: workingFilePathSchema
43289
+ }).strict();
43290
+ var workingFileListInputSchema = external_exports.object({
43291
+ state: workingFileStateSchema.optional()
43292
+ }).strict();
43293
+ var workingFilePublishInputSchema = external_exports.object({
43294
+ path: workingFilePathSchema
43295
+ }).strict();
43296
+ var workingFilesReadToolInputSchema = external_exports.discriminatedUnion("operation", [
43297
+ external_exports.object({
43298
+ operation: external_exports.literal("read"),
43299
+ path: workingFilePathSchema
43300
+ }).strict(),
43301
+ external_exports.object({
43302
+ operation: external_exports.literal("list"),
43303
+ state: workingFileStateSchema.optional()
43304
+ }).strict()
43305
+ ]);
43306
+ var workingFilesWriteToolInputSchema = external_exports.discriminatedUnion("operation", [
43307
+ external_exports.object({
43308
+ operation: external_exports.literal("create"),
43309
+ path: workingFilePathSchema,
43310
+ content_type: workingFileContentTypeSchema,
43311
+ content: external_exports.string().min(1).max(WORKING_FILE_MAX_CONTENT_CHARS)
43312
+ }).strict(),
43313
+ external_exports.object({
43314
+ operation: external_exports.literal("publish"),
43315
+ path: workingFilePathSchema
43316
+ }).strict()
43317
+ ]);
43318
+ var workingFileSummarySchema = external_exports.object({
43319
+ file_ref: external_exports.string().min(1),
43320
+ path: workingFilePathSchema,
43321
+ state: workingFileStateSchema,
43322
+ content_type: workingFileContentTypeSchema,
43323
+ content_chars: external_exports.number().int().nonnegative(),
43324
+ published_ref: external_exports.string().min(1).nullable(),
43325
+ published_at: isoDateTime4.nullable(),
43326
+ expires_at: isoDateTime4,
43327
+ created_at: isoDateTime4,
43328
+ updated_at: isoDateTime4
43329
+ }).strict();
43330
+ var workingFileReadResultSchema = workingFileSummarySchema.extend({
43331
+ content: external_exports.string(),
43332
+ content_truncated: external_exports.boolean()
43333
+ }).strict();
43334
+ var workingFilesListOutputSchema = external_exports.object({
43335
+ files: external_exports.array(workingFileSummarySchema)
43336
+ }).strict();
43337
+
43078
43338
  // ../../packages/protocol/src/run-summary.ts
43079
43339
  var runSummaryOutputSchema = external_exports.object({
43080
43340
  summary: external_exports.string().min(1).max(140)
@@ -43082,7 +43342,7 @@ var runSummaryOutputSchema = external_exports.object({
43082
43342
 
43083
43343
  // ../../packages/protocol/src/runner-settings.ts
43084
43344
  var uuid8 = external_exports.string().uuid();
43085
- var isoDateTime4 = external_exports.string().datetime({ offset: true });
43345
+ var isoDateTime5 = external_exports.string().datetime({ offset: true });
43086
43346
  var runnerHealthSchema = external_exports.enum(["online", "stale", "offline", "revoked", "unpaired"]);
43087
43347
  var runnerExecutionStateSchema = external_exports.enum([
43088
43348
  "ready",
@@ -43102,8 +43362,8 @@ var runnerExecutionReadinessSchema = external_exports.object({
43102
43362
  due_queued_work_orders: external_exports.number().int().nonnegative(),
43103
43363
  claimed_work_orders: external_exports.number().int().nonnegative(),
43104
43364
  running_work_orders: external_exports.number().int().nonnegative(),
43105
- recent_completed_at: isoDateTime4.nullable(),
43106
- recent_failed_at: isoDateTime4.nullable()
43365
+ recent_completed_at: isoDateTime5.nullable(),
43366
+ recent_failed_at: isoDateTime5.nullable()
43107
43367
  }).strict();
43108
43368
  var runnerSandboxPostureSchema = external_exports.enum(["guard", "strict", "off", "none", "unknown"]);
43109
43369
  var runnerPostureSchema = external_exports.object({
@@ -43120,10 +43380,10 @@ var runnerSummarySchema = external_exports.object({
43120
43380
  cli_version: external_exports.string().nullable(),
43121
43381
  posture: runnerPostureSchema,
43122
43382
  execution: runnerExecutionReadinessSchema,
43123
- paired_at: isoDateTime4.nullable(),
43124
- last_heartbeat_at: isoDateTime4.nullable(),
43125
- revoked_at: isoDateTime4.nullable(),
43126
- created_at: isoDateTime4
43383
+ paired_at: isoDateTime5.nullable(),
43384
+ last_heartbeat_at: isoDateTime5.nullable(),
43385
+ revoked_at: isoDateTime5.nullable(),
43386
+ created_at: isoDateTime5
43127
43387
  }).strict();
43128
43388
  var runnerListInputSchema = external_exports.object({
43129
43389
  include_revoked: external_exports.boolean().optional()
@@ -43142,7 +43402,7 @@ var runnerPairingStartOutputSchema = external_exports.object({
43142
43402
  pairing_session_id: uuid8,
43143
43403
  user_code: external_exports.string(),
43144
43404
  verification_uri: external_exports.string(),
43145
- expires_at: isoDateTime4,
43405
+ expires_at: isoDateTime5,
43146
43406
  expires_in: external_exports.number().int().nonnegative()
43147
43407
  }).strict();
43148
43408
  var runnerRevokeInputSchema = external_exports.object({
@@ -43160,9 +43420,9 @@ var workOrderSummarySchema = external_exports.object({
43160
43420
  lane: external_exports.enum(["cloud", "runner"]),
43161
43421
  status: workOrderStatusSchema,
43162
43422
  claimed_by_runner_id: uuid8.nullable(),
43163
- scheduled_for: isoDateTime4,
43164
- grace_deadline: isoDateTime4,
43165
- created_at: isoDateTime4
43423
+ scheduled_for: isoDateTime5,
43424
+ grace_deadline: isoDateTime5,
43425
+ created_at: isoDateTime5
43166
43426
  }).strict();
43167
43427
  var workOrderListInputSchema = external_exports.object({
43168
43428
  status: workOrderStatusSchema.optional(),
@@ -43175,7 +43435,7 @@ var workOrderListOutputSchema = external_exports.object({
43175
43435
  }).strict();
43176
43436
  var workOrderEnqueueInputSchema = external_exports.object({
43177
43437
  agent_id: uuid8,
43178
- scheduled_for: isoDateTime4.optional(),
43438
+ scheduled_for: isoDateTime5.optional(),
43179
43439
  task_id: uuid8.optional()
43180
43440
  }).strict();
43181
43441
  var agentRunNowInputSchema = external_exports.object({
@@ -43202,8 +43462,8 @@ var runnerDiagnoseOutputSchema = external_exports.object({
43202
43462
  platform: external_exports.string(),
43203
43463
  health: runnerHealthSchema,
43204
43464
  capabilities: runnerCapabilityDetailSchema,
43205
- last_heartbeat_at: isoDateTime4.nullable(),
43206
- paired_at: isoDateTime4.nullable(),
43465
+ last_heartbeat_at: isoDateTime5.nullable(),
43466
+ paired_at: isoDateTime5.nullable(),
43207
43467
  revocation_state: external_exports.enum(["active", "revoked", "unpaired"]),
43208
43468
  repair_guidance: external_exports.array(external_exports.object({
43209
43469
  action: external_exports.string(),
@@ -43264,7 +43524,7 @@ var notificationErrorSummarySchema = external_exports.object({
43264
43524
  source: external_exports.enum(["run", "llm", "tool", "mcp", "runner", "integration", "job", "web"]).nullable(),
43265
43525
  seat_id: uuid8.nullable(),
43266
43526
  run_id: uuid8.nullable(),
43267
- created_at: isoDateTime4
43527
+ created_at: isoDateTime5
43268
43528
  }).strict();
43269
43529
  var notificationListErrorsOutputSchema = external_exports.object({
43270
43530
  errors: external_exports.array(notificationErrorSummarySchema)
@@ -43381,7 +43641,7 @@ var integrationSummarySchema = external_exports.object({
43381
43641
  id: uuid8,
43382
43642
  provider: external_exports.string(),
43383
43643
  status: external_exports.enum(["connected", "error", "disconnected"]),
43384
- last_synced_at: isoDateTime4.nullable()
43644
+ last_synced_at: isoDateTime5.nullable()
43385
43645
  }).strict();
43386
43646
  var settingsGetInputSchema = external_exports.object({}).strict();
43387
43647
  var settingsGetOutputSchema = external_exports.object({
@@ -43417,7 +43677,7 @@ var tenantRenameOutputSchema = external_exports.object({
43417
43677
 
43418
43678
  // ../../packages/protocol/src/system-health.ts
43419
43679
  var uuidSchema14 = external_exports.string().uuid();
43420
- var isoDateTime5 = external_exports.string().datetime({ offset: true });
43680
+ var isoDateTime6 = external_exports.string().datetime({ offset: true });
43421
43681
  var systemHealthCallerKindSchema = external_exports.enum(["tenant_admin", "member", "seat_token"]);
43422
43682
  var systemHealthCallerSchema = external_exports.object({
43423
43683
  kind: systemHealthCallerKindSchema,
@@ -43507,7 +43767,7 @@ var systemHealthConnectivitySectionSchema = external_exports.object({
43507
43767
  failed_notification_count: external_exports.number().int().nonnegative()
43508
43768
  }).strict();
43509
43769
  var systemHealthSyncSectionSchema = external_exports.object({
43510
- latest_brief_at: isoDateTime5.nullable(),
43770
+ latest_brief_at: isoDateTime6.nullable(),
43511
43771
  missing_latest_brief: external_exports.boolean(),
43512
43772
  flagged_gap_count: external_exports.number().int().nonnegative()
43513
43773
  }).strict();
@@ -43527,7 +43787,7 @@ var systemHealthCheckInputSchema = systemHealthInputSchema.extend({
43527
43787
  caller: systemHealthCallerSchema
43528
43788
  }).strict();
43529
43789
  var systemHealthOutputSchema = external_exports.object({
43530
- generated_at: isoDateTime5,
43790
+ generated_at: isoDateTime6,
43531
43791
  scope: systemHealthScopeSchema,
43532
43792
  verdict: systemHealthVerdictSchema,
43533
43793
  top_actions: external_exports.array(systemHealthActionSchema),
@@ -45130,16 +45390,16 @@ var syncBriefSchema = external_exports.object({
45130
45390
  }).strict();
45131
45391
 
45132
45392
  // ../../packages/protocol/src/usage.ts
45133
- var isoDateTime6 = external_exports.string().datetime({ offset: true });
45393
+ var isoDateTime7 = external_exports.string().datetime({ offset: true });
45134
45394
  var periodKeySchema = external_exports.string().regex(/^\d{4}-\d{2}-\d{2}$/);
45135
45395
  var countSchema = external_exports.number().int().nonnegative();
45136
45396
  var usdSchema = external_exports.string();
45137
45397
  var bigCountSchema = external_exports.string();
45138
45398
  var usagePeriodSchema = external_exports.object({
45139
45399
  period: periodKeySchema,
45140
- period_start: isoDateTime6,
45141
- period_end: isoDateTime6,
45142
- captured_at: isoDateTime6,
45400
+ period_start: isoDateTime7,
45401
+ period_end: isoDateTime7,
45402
+ captured_at: isoDateTime7,
45143
45403
  run_count: countSchema,
45144
45404
  agent_count: countSchema,
45145
45405
  succeeded_run_count: countSchema,
@@ -45191,7 +45451,7 @@ var usageSnapshotInputSchema = external_exports.object({
45191
45451
  // current month. Normalized to the first of that month server-side.
45192
45452
  period: external_exports.union([
45193
45453
  external_exports.string().regex(/^\d{4}-\d{2}-\d{2}$/),
45194
- isoDateTime6
45454
+ isoDateTime7
45195
45455
  ]).optional()
45196
45456
  }).strict();
45197
45457
  var usageSnapshotOutputSchema = external_exports.object({
@@ -46787,7 +47047,7 @@ There is exactly one way to give a connected tool its credential, and it is the
46787
47047
  order: 47,
46788
47048
  title: "Available tools guide",
46789
47049
  summary: "How to think about tool categories available to seats and what each category should be used for.",
46790
- version: "2026-07-13.1",
47050
+ version: "2026-07-13.3",
46791
47051
  public: true,
46792
47052
  audiences: ["human", "cli", "mcp", "in_app_agent"],
46793
47053
  stages: ["staffing"],
@@ -46825,7 +47085,7 @@ Start from the seat's responsibility, not the tool list. If a tool does not dire
46825
47085
 
46826
47086
  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.
46827
47087
 
46828
- 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.
47088
+ 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.
46829
47089
 
46830
47090
  ## How agents should request tools
46831
47091
 
@@ -46835,14 +47095,14 @@ Agents should explain the job, the required tool category, the minimum permissio
46835
47095
 
46836
47096
  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.
46837
47097
 
46838
- 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.`
47098
+ 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.`
46839
47099
  },
46840
47100
  {
46841
47101
  slug: "mcp-and-cli-guide",
46842
47102
  order: 48,
46843
47103
  title: "CLI and MCP installation guide",
46844
47104
  summary: "Install the public CLI, register remote token-backed MCP clients, and find the full command and tool catalog.",
46845
- version: "2026-07-13.3",
47105
+ version: "2026-07-13.4",
46846
47106
  public: true,
46847
47107
  audiences: ["human", "cli", "mcp", "in_app_agent"],
46848
47108
  stages: ["company_setup", "staffing"],
@@ -46943,6 +47203,10 @@ The MCP server is remote and token-backed. There is no local MCP daemon to insta
46943
47203
 
46944
47204
  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.
46945
47205
 
47206
+ 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.
47207
+
47208
+ 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.
47209
+
46946
47210
  ## Prerequisite: a human approver in a browser
46947
47211
 
46948
47212
  A headless agent cannot complete setup unattended. Two things always require a human, so plan to announce the handoff rather than stall silently:
@@ -48477,11 +48741,11 @@ Keep agent scope tight at first. Approve more autonomy only after evidence. Use
48477
48741
  order: 71,
48478
48742
  title: "Confirmations and human gates guide",
48479
48743
  summary: "How {{brand}} routes authority-changing work through human confirmation, and why agents never approve their own requests.",
48480
- version: "2026-07-11.1",
48744
+ version: "2026-07-13.1",
48481
48745
  public: true,
48482
48746
  audiences: ["human", "cli", "mcp", "in_app_agent"],
48483
48747
  stages: ["graph_design", "charter_design", "staffing", "operating_rhythm"],
48484
- relatedCommandIds: ["confirmation.approve", "confirmation.list", "confirmation.reject", "charter.approve", "agent.go_live", "credential.ingress", "mcp_token.create", "staffing.assign_user", "goal.reparent", "friction.resolve"],
48748
+ relatedCommandIds: ["confirmation.approve", "confirmation.list", "confirmation.reject", "confirmation.remint", "charter.approve", "agent.go_live", "credential.ingress", "mcp_token.create", "staffing.assign_user", "goal.reparent", "friction.resolve"],
48485
48749
  legal: { publicRisk: "low", notes: ["{{brand}}-native human-gate guidance."] },
48486
48750
  sources: [
48487
48751
  {
@@ -48540,7 +48804,7 @@ Stop before: approving a Charter, signing a manifest, connecting a tool or crede
48540
48804
  order: 71,
48541
48805
  title: "Billing and pricing guide",
48542
48806
  summary: "How {{brand}} packages company-wide access, Stripe billing, and governed-agent usage without per-human-seat pricing.",
48543
- version: "2026-07-02.5",
48807
+ version: "2026-07-13.1",
48544
48808
  public: true,
48545
48809
  audiences: ["human", "cli", "mcp", "in_app_agent"],
48546
48810
  stages: ["company_setup", "staffing", "operating_rhythm"],
@@ -48596,6 +48860,14 @@ The first meter is billable-successful-agent-run based because the current platf
48596
48860
 
48597
48861
  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.
48598
48862
 
48863
+ ## Launch credits and recovery access
48864
+
48865
+ 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.
48866
+
48867
+ 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.
48868
+
48869
+ 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.
48870
+
48599
48871
  ## Stripe boundary
48600
48872
 
48601
48873
  Stripe owns payment collection, payment methods, invoices, and hosted customer self-service.
@@ -49781,7 +50053,7 @@ This worked document **omits** \`unanswered_boundaries\` and \`seat_type_recomme
49781
50053
  order: 43,
49782
50054
  title: "Agent builder guide",
49783
50055
  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.",
49784
- version: "2026-07-10.1",
50056
+ version: "2026-07-13.1",
49785
50057
  public: true,
49786
50058
  audiences: ["cli", "mcp", "in_app_agent"],
49787
50059
  stages: ["staffing"],
@@ -49870,7 +50142,7 @@ Conservative by default: anything beyond read/draft defaults to \`always_ask\`.
49870
50142
 
49871
50143
  - **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.
49872
50144
  - **Inbox / scheduling assistant.** \`gmail.read\` + draft + \`calendar.propose_hold\`; sends and confirmed meetings are approval-gated; sensitive messages escalate. Triage or balanced model.
49873
- - **Research / SDR.** \`web.research\` + \`crm.contacts.draft_update\` (draft only); outreach and paid data escalate. Balanced model.
50145
+ - **Research / SDR.** \`web.search\` + \`crm.contacts.draft_update\` (draft only); outreach and paid data escalate. Balanced model.
49874
50146
  - **Reviewer / QA.** Read release artifacts + draft issues; release approval and production changes escalate. Complex model for judgment.
49875
50147
 
49876
50148
  ## The full JSON shape
@@ -50813,6 +51085,7 @@ var COMMAND_MANIFEST = [
50813
51085
  { "id": "confirmation.approve", "namespace": "confirmation", "action": "approve", "title": "Approve pending confirmation", "description": "Approve an in-flight confirmation and execute the original command as the approving human.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "confirmation_id", "flag": "confirmation-id", "type": "string", "required": true }, { "name": "reviewed", "flag": "reviewed", "type": "boolean", "required": false }], "hasComplexInput": false, "help": "Approve pending confirmations only when the requested durable change is clear to the human owner." },
50814
51086
  { "id": "confirmation.list", "namespace": "confirmation", "action": "list", "title": "List pending confirmations", "description": "List in-flight confirmations awaiting a human decision, scoped to the caller's authority (owner sees all; a member sees seats they occupy; an agent sees its own seat).", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "limit", "flag": "limit", "type": "integer", "required": false }], "hasComplexInput": false, "help": "List pending confirmations awaiting a human decision before approving or rejecting them." },
50815
51087
  { "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." },
51088
+ { "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." },
50816
51089
  { "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." },
50817
51090
  { "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." },
50818
51091
  { "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." },
@@ -55483,6 +55756,20 @@ var RUNNER_AICOS_TURN_TOOLS = [
55483
55756
  "mcp__rost__rost_aicos_turn_load_context",
55484
55757
  "mcp__rost__rost_get_tasks"
55485
55758
  ];
55759
+ var CODEX_NATIVE_TOOL_ISOLATION_CONFIG_ARGS = [
55760
+ "--config",
55761
+ 'web_search="disabled"',
55762
+ "--config",
55763
+ "features.browser_use=false",
55764
+ "--config",
55765
+ "features.in_app_browser=false",
55766
+ "--config",
55767
+ "features.browser_use_external=false",
55768
+ "--config",
55769
+ "features.browser_use_full_cdp_access=false",
55770
+ "--config",
55771
+ "features.computer_use=false"
55772
+ ];
55486
55773
  var CLAUDE_WORKSPACE_WRITE_LOCAL_TOOLS = ["Read", "Write", "Edit", "Glob", "Grep", "Bash"];
55487
55774
  var CLAUDE_READ_LOCAL_TOOLS = ["Read", "Glob", "Grep"];
55488
55775
  var READ_STUB_TIMEOUT_MS = 18e4;
@@ -56249,7 +56536,8 @@ function resolveTurnPlan(input) {
56249
56536
  codexSandbox: "read-only",
56250
56537
  outputFormat: input.kind === "turn_execution" ? "json" : "text",
56251
56538
  repoDir: null,
56252
- timeoutMs: READ_STUB_TIMEOUT_MS
56539
+ timeoutMs: READ_STUB_TIMEOUT_MS,
56540
+ isolateCodexNativeTools: input.kind === "work_order"
56253
56541
  };
56254
56542
  }
56255
56543
  const execution = input.execution;
@@ -56267,7 +56555,8 @@ function resolveTurnPlan(input) {
56267
56555
  // Only a Forge workspace grants a repo cwd; a needs_repo contract with no prepared
56268
56556
  // workspace (broker/clone failed upstream) falls back to tmpdir rather than a bad cwd.
56269
56557
  repoDir: execution.needs_repo ? input.repoDir : null,
56270
- timeoutMs: resolveExecutionTimeoutMs(execution)
56558
+ timeoutMs: resolveExecutionTimeoutMs(execution),
56559
+ isolateCodexNativeTools: execution.profile === "seat_work"
56271
56560
  };
56272
56561
  }
56273
56562
  function buildTurnCommand(input) {
@@ -56284,7 +56573,13 @@ function buildTurnCommand(input) {
56284
56573
  plan.codexSandbox,
56285
56574
  // Skip the git-repo check only when the cwd is NOT a checkout (read stub in
56286
56575
  // tmpdir); a prepared Forge workspace IS a repo, so drop the flag there.
56287
- ...plan.repoDir === null ? ["--skip-git-repo-check"] : []
56576
+ ...plan.repoDir === null ? ["--skip-git-repo-check"] : [],
56577
+ ...plan.isolateCodexNativeTools ? [
56578
+ "--ignore-user-config",
56579
+ "--ignore-rules",
56580
+ "--ephemeral",
56581
+ ...CODEX_NATIVE_TOOL_ISOLATION_CONFIG_ARGS
56582
+ ] : []
56288
56583
  ]
56289
56584
  };
56290
56585
  }