@rosthq/cli 0.7.72 → 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.");
@@ -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"]);
@@ -43075,6 +43231,101 @@ var errorLogSupersedeOutputSchema = external_exports.object({
43075
43231
  resolved_at: isoDateTime3
43076
43232
  }).strict();
43077
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
+
43078
43329
  // ../../packages/protocol/src/run-summary.ts
43079
43330
  var runSummaryOutputSchema = external_exports.object({
43080
43331
  summary: external_exports.string().min(1).max(140)
@@ -43082,7 +43333,7 @@ var runSummaryOutputSchema = external_exports.object({
43082
43333
 
43083
43334
  // ../../packages/protocol/src/runner-settings.ts
43084
43335
  var uuid8 = external_exports.string().uuid();
43085
- var isoDateTime4 = external_exports.string().datetime({ offset: true });
43336
+ var isoDateTime5 = external_exports.string().datetime({ offset: true });
43086
43337
  var runnerHealthSchema = external_exports.enum(["online", "stale", "offline", "revoked", "unpaired"]);
43087
43338
  var runnerExecutionStateSchema = external_exports.enum([
43088
43339
  "ready",
@@ -43102,8 +43353,8 @@ var runnerExecutionReadinessSchema = external_exports.object({
43102
43353
  due_queued_work_orders: external_exports.number().int().nonnegative(),
43103
43354
  claimed_work_orders: external_exports.number().int().nonnegative(),
43104
43355
  running_work_orders: external_exports.number().int().nonnegative(),
43105
- recent_completed_at: isoDateTime4.nullable(),
43106
- recent_failed_at: isoDateTime4.nullable()
43356
+ recent_completed_at: isoDateTime5.nullable(),
43357
+ recent_failed_at: isoDateTime5.nullable()
43107
43358
  }).strict();
43108
43359
  var runnerSandboxPostureSchema = external_exports.enum(["guard", "strict", "off", "none", "unknown"]);
43109
43360
  var runnerPostureSchema = external_exports.object({
@@ -43120,10 +43371,10 @@ var runnerSummarySchema = external_exports.object({
43120
43371
  cli_version: external_exports.string().nullable(),
43121
43372
  posture: runnerPostureSchema,
43122
43373
  execution: runnerExecutionReadinessSchema,
43123
- paired_at: isoDateTime4.nullable(),
43124
- last_heartbeat_at: isoDateTime4.nullable(),
43125
- revoked_at: isoDateTime4.nullable(),
43126
- created_at: isoDateTime4
43374
+ paired_at: isoDateTime5.nullable(),
43375
+ last_heartbeat_at: isoDateTime5.nullable(),
43376
+ revoked_at: isoDateTime5.nullable(),
43377
+ created_at: isoDateTime5
43127
43378
  }).strict();
43128
43379
  var runnerListInputSchema = external_exports.object({
43129
43380
  include_revoked: external_exports.boolean().optional()
@@ -43142,7 +43393,7 @@ var runnerPairingStartOutputSchema = external_exports.object({
43142
43393
  pairing_session_id: uuid8,
43143
43394
  user_code: external_exports.string(),
43144
43395
  verification_uri: external_exports.string(),
43145
- expires_at: isoDateTime4,
43396
+ expires_at: isoDateTime5,
43146
43397
  expires_in: external_exports.number().int().nonnegative()
43147
43398
  }).strict();
43148
43399
  var runnerRevokeInputSchema = external_exports.object({
@@ -43160,9 +43411,9 @@ var workOrderSummarySchema = external_exports.object({
43160
43411
  lane: external_exports.enum(["cloud", "runner"]),
43161
43412
  status: workOrderStatusSchema,
43162
43413
  claimed_by_runner_id: uuid8.nullable(),
43163
- scheduled_for: isoDateTime4,
43164
- grace_deadline: isoDateTime4,
43165
- created_at: isoDateTime4
43414
+ scheduled_for: isoDateTime5,
43415
+ grace_deadline: isoDateTime5,
43416
+ created_at: isoDateTime5
43166
43417
  }).strict();
43167
43418
  var workOrderListInputSchema = external_exports.object({
43168
43419
  status: workOrderStatusSchema.optional(),
@@ -43175,7 +43426,7 @@ var workOrderListOutputSchema = external_exports.object({
43175
43426
  }).strict();
43176
43427
  var workOrderEnqueueInputSchema = external_exports.object({
43177
43428
  agent_id: uuid8,
43178
- scheduled_for: isoDateTime4.optional(),
43429
+ scheduled_for: isoDateTime5.optional(),
43179
43430
  task_id: uuid8.optional()
43180
43431
  }).strict();
43181
43432
  var agentRunNowInputSchema = external_exports.object({
@@ -43202,8 +43453,8 @@ var runnerDiagnoseOutputSchema = external_exports.object({
43202
43453
  platform: external_exports.string(),
43203
43454
  health: runnerHealthSchema,
43204
43455
  capabilities: runnerCapabilityDetailSchema,
43205
- last_heartbeat_at: isoDateTime4.nullable(),
43206
- paired_at: isoDateTime4.nullable(),
43456
+ last_heartbeat_at: isoDateTime5.nullable(),
43457
+ paired_at: isoDateTime5.nullable(),
43207
43458
  revocation_state: external_exports.enum(["active", "revoked", "unpaired"]),
43208
43459
  repair_guidance: external_exports.array(external_exports.object({
43209
43460
  action: external_exports.string(),
@@ -43264,7 +43515,7 @@ var notificationErrorSummarySchema = external_exports.object({
43264
43515
  source: external_exports.enum(["run", "llm", "tool", "mcp", "runner", "integration", "job", "web"]).nullable(),
43265
43516
  seat_id: uuid8.nullable(),
43266
43517
  run_id: uuid8.nullable(),
43267
- created_at: isoDateTime4
43518
+ created_at: isoDateTime5
43268
43519
  }).strict();
43269
43520
  var notificationListErrorsOutputSchema = external_exports.object({
43270
43521
  errors: external_exports.array(notificationErrorSummarySchema)
@@ -43381,7 +43632,7 @@ var integrationSummarySchema = external_exports.object({
43381
43632
  id: uuid8,
43382
43633
  provider: external_exports.string(),
43383
43634
  status: external_exports.enum(["connected", "error", "disconnected"]),
43384
- last_synced_at: isoDateTime4.nullable()
43635
+ last_synced_at: isoDateTime5.nullable()
43385
43636
  }).strict();
43386
43637
  var settingsGetInputSchema = external_exports.object({}).strict();
43387
43638
  var settingsGetOutputSchema = external_exports.object({
@@ -43417,7 +43668,7 @@ var tenantRenameOutputSchema = external_exports.object({
43417
43668
 
43418
43669
  // ../../packages/protocol/src/system-health.ts
43419
43670
  var uuidSchema14 = external_exports.string().uuid();
43420
- var isoDateTime5 = external_exports.string().datetime({ offset: true });
43671
+ var isoDateTime6 = external_exports.string().datetime({ offset: true });
43421
43672
  var systemHealthCallerKindSchema = external_exports.enum(["tenant_admin", "member", "seat_token"]);
43422
43673
  var systemHealthCallerSchema = external_exports.object({
43423
43674
  kind: systemHealthCallerKindSchema,
@@ -43507,7 +43758,7 @@ var systemHealthConnectivitySectionSchema = external_exports.object({
43507
43758
  failed_notification_count: external_exports.number().int().nonnegative()
43508
43759
  }).strict();
43509
43760
  var systemHealthSyncSectionSchema = external_exports.object({
43510
- latest_brief_at: isoDateTime5.nullable(),
43761
+ latest_brief_at: isoDateTime6.nullable(),
43511
43762
  missing_latest_brief: external_exports.boolean(),
43512
43763
  flagged_gap_count: external_exports.number().int().nonnegative()
43513
43764
  }).strict();
@@ -43527,7 +43778,7 @@ var systemHealthCheckInputSchema = systemHealthInputSchema.extend({
43527
43778
  caller: systemHealthCallerSchema
43528
43779
  }).strict();
43529
43780
  var systemHealthOutputSchema = external_exports.object({
43530
- generated_at: isoDateTime5,
43781
+ generated_at: isoDateTime6,
43531
43782
  scope: systemHealthScopeSchema,
43532
43783
  verdict: systemHealthVerdictSchema,
43533
43784
  top_actions: external_exports.array(systemHealthActionSchema),
@@ -45130,16 +45381,16 @@ var syncBriefSchema = external_exports.object({
45130
45381
  }).strict();
45131
45382
 
45132
45383
  // ../../packages/protocol/src/usage.ts
45133
- var isoDateTime6 = external_exports.string().datetime({ offset: true });
45384
+ var isoDateTime7 = external_exports.string().datetime({ offset: true });
45134
45385
  var periodKeySchema = external_exports.string().regex(/^\d{4}-\d{2}-\d{2}$/);
45135
45386
  var countSchema = external_exports.number().int().nonnegative();
45136
45387
  var usdSchema = external_exports.string();
45137
45388
  var bigCountSchema = external_exports.string();
45138
45389
  var usagePeriodSchema = external_exports.object({
45139
45390
  period: periodKeySchema,
45140
- period_start: isoDateTime6,
45141
- period_end: isoDateTime6,
45142
- captured_at: isoDateTime6,
45391
+ period_start: isoDateTime7,
45392
+ period_end: isoDateTime7,
45393
+ captured_at: isoDateTime7,
45143
45394
  run_count: countSchema,
45144
45395
  agent_count: countSchema,
45145
45396
  succeeded_run_count: countSchema,
@@ -45191,7 +45442,7 @@ var usageSnapshotInputSchema = external_exports.object({
45191
45442
  // current month. Normalized to the first of that month server-side.
45192
45443
  period: external_exports.union([
45193
45444
  external_exports.string().regex(/^\d{4}-\d{2}-\d{2}$/),
45194
- isoDateTime6
45445
+ isoDateTime7
45195
45446
  ]).optional()
45196
45447
  }).strict();
45197
45448
  var usageSnapshotOutputSchema = external_exports.object({
@@ -46787,7 +47038,7 @@ There is exactly one way to give a connected tool its credential, and it is the
46787
47038
  order: 47,
46788
47039
  title: "Available tools guide",
46789
47040
  summary: "How to think about tool categories available to seats and what each category should be used for.",
46790
- version: "2026-07-13.1",
47041
+ version: "2026-07-13.3",
46791
47042
  public: true,
46792
47043
  audiences: ["human", "cli", "mcp", "in_app_agent"],
46793
47044
  stages: ["staffing"],
@@ -46825,7 +47076,7 @@ Start from the seat's responsibility, not the tool list. If a tool does not dire
46825
47076
 
46826
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.
46827
47078
 
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.
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.
46829
47080
 
46830
47081
  ## How agents should request tools
46831
47082
 
@@ -46835,14 +47086,14 @@ Agents should explain the job, the required tool category, the minimum permissio
46835
47086
 
46836
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.
46837
47088
 
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.`
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.`
46839
47090
  },
46840
47091
  {
46841
47092
  slug: "mcp-and-cli-guide",
46842
47093
  order: 48,
46843
47094
  title: "CLI and MCP installation guide",
46844
47095
  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",
47096
+ version: "2026-07-13.4",
46846
47097
  public: true,
46847
47098
  audiences: ["human", "cli", "mcp", "in_app_agent"],
46848
47099
  stages: ["company_setup", "staffing"],
@@ -46943,6 +47194,10 @@ The MCP server is remote and token-backed. There is no local MCP daemon to insta
46943
47194
 
46944
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.
46945
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
+
46946
47201
  ## Prerequisite: a human approver in a browser
46947
47202
 
46948
47203
  A headless agent cannot complete setup unattended. Two things always require a human, so plan to announce the handoff rather than stall silently:
@@ -48540,7 +48795,7 @@ Stop before: approving a Charter, signing a manifest, connecting a tool or crede
48540
48795
  order: 71,
48541
48796
  title: "Billing and pricing guide",
48542
48797
  summary: "How {{brand}} packages company-wide access, Stripe billing, and governed-agent usage without per-human-seat pricing.",
48543
- version: "2026-07-02.5",
48798
+ version: "2026-07-13.1",
48544
48799
  public: true,
48545
48800
  audiences: ["human", "cli", "mcp", "in_app_agent"],
48546
48801
  stages: ["company_setup", "staffing", "operating_rhythm"],
@@ -48596,6 +48851,14 @@ The first meter is billable-successful-agent-run based because the current platf
48596
48851
 
48597
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.
48598
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
+
48599
48862
  ## Stripe boundary
48600
48863
 
48601
48864
  Stripe owns payment collection, payment methods, invoices, and hosted customer self-service.
@@ -49781,7 +50044,7 @@ This worked document **omits** \`unanswered_boundaries\` and \`seat_type_recomme
49781
50044
  order: 43,
49782
50045
  title: "Agent builder guide",
49783
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.",
49784
- version: "2026-07-10.1",
50047
+ version: "2026-07-13.1",
49785
50048
  public: true,
49786
50049
  audiences: ["cli", "mcp", "in_app_agent"],
49787
50050
  stages: ["staffing"],
@@ -49870,7 +50133,7 @@ Conservative by default: anything beyond read/draft defaults to \`always_ask\`.
49870
50133
 
49871
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.
49872
50135
  - **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.
50136
+ - **Research / SDR.** \`web.search\` + \`crm.contacts.draft_update\` (draft only); outreach and paid data escalate. Balanced model.
49874
50137
  - **Reviewer / QA.** Read release artifacts + draft issues; release approval and production changes escalate. Complex model for judgment.
49875
50138
 
49876
50139
  ## The full JSON shape
@@ -55483,6 +55746,20 @@ var RUNNER_AICOS_TURN_TOOLS = [
55483
55746
  "mcp__rost__rost_aicos_turn_load_context",
55484
55747
  "mcp__rost__rost_get_tasks"
55485
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
+ ];
55486
55763
  var CLAUDE_WORKSPACE_WRITE_LOCAL_TOOLS = ["Read", "Write", "Edit", "Glob", "Grep", "Bash"];
55487
55764
  var CLAUDE_READ_LOCAL_TOOLS = ["Read", "Glob", "Grep"];
55488
55765
  var READ_STUB_TIMEOUT_MS = 18e4;
@@ -56249,7 +56526,8 @@ function resolveTurnPlan(input) {
56249
56526
  codexSandbox: "read-only",
56250
56527
  outputFormat: input.kind === "turn_execution" ? "json" : "text",
56251
56528
  repoDir: null,
56252
- timeoutMs: READ_STUB_TIMEOUT_MS
56529
+ timeoutMs: READ_STUB_TIMEOUT_MS,
56530
+ isolateCodexNativeTools: input.kind === "work_order"
56253
56531
  };
56254
56532
  }
56255
56533
  const execution = input.execution;
@@ -56267,7 +56545,8 @@ function resolveTurnPlan(input) {
56267
56545
  // Only a Forge workspace grants a repo cwd; a needs_repo contract with no prepared
56268
56546
  // workspace (broker/clone failed upstream) falls back to tmpdir rather than a bad cwd.
56269
56547
  repoDir: execution.needs_repo ? input.repoDir : null,
56270
- timeoutMs: resolveExecutionTimeoutMs(execution)
56548
+ timeoutMs: resolveExecutionTimeoutMs(execution),
56549
+ isolateCodexNativeTools: execution.profile === "seat_work"
56271
56550
  };
56272
56551
  }
56273
56552
  function buildTurnCommand(input) {
@@ -56284,7 +56563,13 @@ function buildTurnCommand(input) {
56284
56563
  plan.codexSandbox,
56285
56564
  // Skip the git-repo check only when the cwd is NOT a checkout (read stub in
56286
56565
  // tmpdir); a prepared Forge workspace IS a repo, so drop the flag there.
56287
- ...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
+ ] : []
56288
56573
  ]
56289
56574
  };
56290
56575
  }