@runtypelabs/cli 2.59.10 → 2.60.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import { b as CredentialStore, t as isTTY } from "./index.js";
3
- import { p as buildDashboardUrl } from "./chunk-2KHCZ1oX.js";
3
+ import { p as buildDashboardUrl } from "./chunk-BkptXLRJ.js";
4
4
  import { i as getApiUrl, l as getRuntimeApiKey, n as ApiKeyValidationUnavailableError, r as createCliClient, s as getDashboardUrl, t as ApiKeyManager } from "./chunk-BW2fg46T.js";
5
5
  import { n as ensureAuth } from "./chunk-CJraEBVd.js";
6
6
  import { a as printJson } from "./chunk-CcFCyqbB.js";
7
- import { t as getCurrentAccountId } from "./chunk-Df2DiijP.js";
7
+ import { t as getCurrentAccountId } from "./chunk-_ILkTDew.js";
8
8
  import { Command } from "commander";
9
9
  import chalk from "chalk";
10
10
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
@@ -71,7 +71,7 @@ const initCommand = new Command("init").description("Set up Runtype CLI with gui
71
71
  console.error(message);
72
72
  process.exit(1);
73
73
  }
74
- const { InitApp } = await import("./chunk-CStXkNVU.js");
74
+ const { InitApp } = await import("./chunk-CQPiMauP.js");
75
75
  const { waitUntilExit } = render(React.createElement(InitApp, {
76
76
  apiUrl: options.apiUrl,
77
77
  onComplete: () => {}
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { P as getRuntypeHomeDir, b as CredentialStore, t as isTTY } from "./index.js";
3
3
  import { ConfirmPrompt, DataList, EntityCard, MutationResult, React, Text, mutationResultProps, render, useEffect, useMutationState, useState } from "./chunk-CoAWdSiE.js";
4
- import { b as pkceCodeVerifierSchema, d as apiKeyFileSlug, f as apiKeyFileUsageHint, m as isForbiddenRequestedPermission, n as API_KEY_REQUEST_MAX_TTL_SECONDS, r as API_KEY_REQUEST_POLL_INTERVAL_MS, t as API_KEY_FILE_FORMAT, u as apiKeyFileSchema, y as pkceCodeChallengeSchema } from "./chunk-2KHCZ1oX.js";
4
+ import { b as pkceCodeVerifierSchema, d as apiKeyFileSlug, f as apiKeyFileUsageHint, m as isForbiddenRequestedPermission, n as API_KEY_REQUEST_MAX_TTL_SECONDS, r as API_KEY_REQUEST_POLL_INTERVAL_MS, t as API_KEY_FILE_FORMAT, u as apiKeyFileSchema, y as pkceCodeChallengeSchema } from "./chunk-BkptXLRJ.js";
5
5
  import { i as getApiUrl, r as createCliClient } from "./chunk-BW2fg46T.js";
6
6
  import { n as ensureAuth } from "./chunk-CJraEBVd.js";
7
7
  import { a as printJson, i as printDetail, r as getTotalCount } from "./chunk-CcFCyqbB.js";
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { C as BuiltInToolGroup, S as BuiltInToolCategory, a as TextContentPartSchema, d as ToolAnnotationsSchema, f as modelVisibleToolName, g as extractionFieldSchema, h as stripTrailingChars, i as ReasoningContentPartSchema, m as crawlConfigSchema, n as ImageContentPartSchema, p as FILTER_OPERATORS, t as FileContentPartSchema, w as PRODUCT_SURFACE_TYPES } from "./chunk-daI6hXN9.js";
2
+ import { C as BuiltInToolGroup, S as BuiltInToolCategory, a as TextContentPartSchema, d as ToolAnnotationsSchema, f as modelVisibleToolName, g as extractionFieldSchema, h as stripTrailingChars, i as ReasoningContentPartSchema, m as crawlConfigSchema, n as ImageContentPartSchema, p as FILTER_OPERATORS, t as FileContentPartSchema, w as PRODUCT_SURFACE_TYPES } from "./chunk-D-hN0D5C.js";
3
3
  import { C as unknown, S as union, T as toJSONSchema, _ as preprocess, a as _null, b as string, c as boolean, f as literal, h as object, i as _enum, m as number, s as array, u as discriminatedUnion, v as record } from "./chunk-BOpO6xE-.js";
4
4
  import { i as number$1, r as jsonPatchSchema } from "./chunk-BJQv9Elp.js";
5
5
  import { n as MCPServerCategory } from "./chunk-BVMhjGVe.js";
@@ -2517,7 +2517,7 @@ function loadBrandConfig(env) {
2517
2517
  }
2518
2518
  loadBrandConfig();
2519
2519
  BRAND_CONFIGS[DEFAULT_BRAND_NAME];
2520
- // ../shared/dist/chunk-o0jfQu03.mjs
2520
+ // ../shared/dist/chunk-BH4LyiwO.mjs
2521
2521
  const ARCHITECTURE_PREVIEW_SURFACE_TYPES = [
2522
2522
  "chat",
2523
2523
  "api",
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { t as ModelPicker } from "./chunk-CrlqIfmb.js";
3
- import { MarathonApp } from "./chunk-BtpXwOCu.js";
3
+ import { MarathonApp } from "./chunk-CG8J23-I.js";
4
4
  import { useEffect, useRef, useState } from "react";
5
5
  import { Box, Text, useApp, useInput, useStdout } from "ink";
6
6
  import { theme } from "@runtypelabs/ink-components";
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import { p as buildDashboardUrl } from "./chunk-2KHCZ1oX.js";
3
- import { a as treeLogPathForStateFile, i as materializeAtHead, n as readSessionEventLog, r as loadTreeLog, t as getActiveDeploySandboxPreviewUrl } from "./chunk-XwPlN7Hv.js";
4
- import { t as getCurrentAccountId } from "./chunk-Df2DiijP.js";
2
+ import { p as buildDashboardUrl } from "./chunk-BkptXLRJ.js";
3
+ import { a as treeLogPathForStateFile, i as materializeAtHead, n as readSessionEventLog, r as loadTreeLog, t as getActiveDeploySandboxPreviewUrl } from "./chunk-DWj7uC90.js";
4
+ import { t as getCurrentAccountId } from "./chunk-_ILkTDew.js";
5
5
  import { t as ModelPicker } from "./chunk-CrlqIfmb.js";
6
6
  import chalk from "chalk";
7
7
  import * as fs$1 from "node:fs";
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { b as CredentialStore } from "./index.js";
3
- import { p as buildDashboardUrl, x as selectAccountId } from "./chunk-2KHCZ1oX.js";
3
+ import { p as buildDashboardUrl, x as selectAccountId } from "./chunk-BkptXLRJ.js";
4
4
  import { s as getDashboardUrl, t as ApiKeyManager } from "./chunk-BW2fg46T.js";
5
5
  import { n as browserLogin, r as orgMismatchWarning } from "./chunk-BnWhIqW1.js";
6
6
  import { n as validateQuickStartUrl, t as createQuickStartProduct } from "./chunk-i7DwkvvD.js";
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { c as TRACE_QUERY_DIMENSIONS, l as TRACE_SLICE_SPAN_KINDS } from "./chunk-2KHCZ1oX.js";
2
+ import { c as TRACE_QUERY_DIMENSIONS, l as TRACE_SLICE_SPAN_KINDS } from "./chunk-BkptXLRJ.js";
3
3
  import { r as createCliClient } from "./chunk-BW2fg46T.js";
4
4
  import { n as ensureAuth } from "./chunk-CJraEBVd.js";
5
5
  import { a as printJson } from "./chunk-CcFCyqbB.js";
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import { t as isTTY } from "./index.js";
3
3
  import { ConfirmPrompt, DataList, EntityCard, MutationResult, React, render, useEffect, useState } from "./chunk-CoAWdSiE.js";
4
- import "./chunk-daI6hXN9.js";
4
+ import "./chunk-D-hN0D5C.js";
5
5
  import { n as addExecutionInputOptions, r as resolveExecutionInput, t as runExecution } from "./chunk-DrxtMway.js";
6
6
  import { r as createCliClient } from "./chunk-BW2fg46T.js";
7
7
  import { n as ensureAuth } from "./chunk-CJraEBVd.js";
8
8
  import { a as printJson, i as printDetail, n as buildListParams, r as getTotalCount, s as printNextCursorHint } from "./chunk-CcFCyqbB.js";
9
- import { taskCommand } from "./chunk-XwPlN7Hv.js";
9
+ import { taskCommand } from "./chunk-DWj7uC90.js";
10
10
  import { t as readJsonFile } from "./chunk-DGv7X9S_.js";
11
11
  import { f as writePulledDefinition, o as agentSkillsCommand } from "./chunk-BirUxTtH.js";
12
12
  import { r as describeAgentExportFailure, t as agentReleaseSelectorParams } from "./chunk-87nRnNRG.js";
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import { t as isTTY } from "./index.js";
3
3
  import { DataList, EntityCard, MutationResult, React, render, useEffect, useState } from "./chunk-CoAWdSiE.js";
4
- import { p as buildDashboardUrl } from "./chunk-2KHCZ1oX.js";
4
+ import { p as buildDashboardUrl } from "./chunk-BkptXLRJ.js";
5
5
  import { r as createCliClient, s as getDashboardUrl } from "./chunk-BW2fg46T.js";
6
6
  import { n as ensureAuth } from "./chunk-CJraEBVd.js";
7
7
  import { a as printJson, i as printDetail, n as buildListParams, r as getTotalCount, s as printNextCursorHint } from "./chunk-CcFCyqbB.js";
8
8
  import { t as readJsonFile } from "./chunk-DGv7X9S_.js";
9
9
  import { c as buildEntityPullCommand, d as productPullFpoCommand, r as PRODUCT_ENSURE_SPEC, s as buildEntityEnsureCommand, u as productEnsureFpoCommand } from "./chunk-BirUxTtH.js";
10
- import { t as getCurrentAccountId } from "./chunk-Df2DiijP.js";
10
+ import { t as getCurrentAccountId } from "./chunk-_ILkTDew.js";
11
11
  import { n as validateQuickStartUrl, t as createQuickStartProduct } from "./chunk-i7DwkvvD.js";
12
12
  import { Command } from "commander";
13
13
  import chalk from "chalk";
@@ -7401,7 +7401,7 @@ function modelVisibleToolName(toolId) {
7401
7401
  function toolNamesCollideForAiSdk(left, right) {
7402
7402
  return sanitizeToolNameForAiSdk(left) === sanitizeToolNameForAiSdk(right);
7403
7403
  }
7404
- // ../shared/dist/chunk-BiZ25Ayv.mjs
7404
+ // ../shared/dist/chunk-DsEUZj_t.mjs
7405
7405
  /**
7406
7406
  * The reserved model-facing name of the agent state write tool
7407
7407
  * (`packages/runtime/src/engine/state-write-tool.ts`). The model is told to call
@@ -7424,44 +7424,6 @@ function isReservedRuntypeToolName(name) {
7424
7424
  function reservedToolNameMessage(subject, name) {
7425
7425
  return `${subject} "${name}" collides with the reserved tool name "${RUNTYPE_SET_STATE_TOOL_NAME}" (the agent state write tool). Tool names are lowercased and non-alphanumeric characters become "_" before the model sees them, so every spelling that normalizes to it is reserved with it. "runtype_" is a reserved tool namespace. Rename the tool.`;
7426
7426
  }
7427
- /**
7428
- * Owners whose provider-native tools force DIRECT routing: no gateway carries them,
7429
- * so a gateway executor drops them or sends an inert function tool.
7430
- */
7431
- const DIRECT_PROVIDER_TOOL_OWNERS = /* @__PURE__ */ new Set([
7432
- "anthropic",
7433
- "openai",
7434
- "xai"
7435
- ]);
7436
- /**
7437
- * Owners whose provider-native tools reach the owner intact through the Vercel AI
7438
- * Gateway as well as direct access, so routing must NOT be pinned for them.
7439
- */
7440
- const GATEWAY_CARRIED_PROVIDER_TOOL_OWNERS = /* @__PURE__ */ new Set(["google"]);
7441
- /** Every provider that owns provider-native tools, whichever lane carries them. */
7442
- const PROVIDER_TOOL_OWNERS = /* @__PURE__ */ new Set([...DIRECT_PROVIDER_TOOL_OWNERS, ...GATEWAY_CARRIED_PROVIDER_TOOL_OWNERS]);
7443
- function ownerOf(toolId) {
7444
- const entry = getBuiltInToolById(parseToolInstanceId(toolId).baseId);
7445
- if (entry?.executionHint !== "provider") return void 0;
7446
- return entry.providers?.[0];
7447
- }
7448
- /**
7449
- * The provider that must EXECUTE a catalog tool id, or undefined when the id is unknown,
7450
- * not provider-native, or owned by a provider that owns no provider-native tools.
7451
- * Strips the `#instance` suffix and the `builtin:` / `platform:` prefix and resolves aliases.
7452
- */
7453
- function resolveProviderToolOwner(toolId) {
7454
- const owner = ownerOf(toolId);
7455
- return owner && PROVIDER_TOOL_OWNERS.has(owner) ? owner : void 0;
7456
- }
7457
- /**
7458
- * The direct provider a catalog tool id must be ROUTED to, or undefined when no lane
7459
- * pinning is required — an unknown / non-native id, or an owner a gateway carries.
7460
- */
7461
- function resolveDirectProviderToolOwner(toolId) {
7462
- const owner = ownerOf(toolId);
7463
- return owner && DIRECT_PROVIDER_TOOL_OWNERS.has(owner) ? owner : void 0;
7464
- }
7465
7427
  // ../shared/dist/chunk-DaWm3aVW.mjs
7466
7428
  /** Post-normalization metadata key shape. Mirrors the api's key-length cap (64). */
7467
7429
  const RECORD_COLLECTION_FIELD_NAME_PATTERN = /^[a-z0-9_]{1,64}$/;
@@ -7616,6 +7578,45 @@ const CONTEXT_STEP_TYPES = [
7616
7578
  "extract"
7617
7579
  ];
7618
7580
  const FLOW_STEP_TYPES = ["prompt", ...CONTEXT_STEP_TYPES];
7581
+ // ../shared/dist/chunk-B5KySbj4.mjs
7582
+ /**
7583
+ * Owners whose provider-native tools force DIRECT routing: no gateway carries them,
7584
+ * so a gateway executor drops them or sends an inert function tool.
7585
+ */
7586
+ const DIRECT_PROVIDER_TOOL_OWNERS = /* @__PURE__ */ new Set([
7587
+ "anthropic",
7588
+ "openai",
7589
+ "xai"
7590
+ ]);
7591
+ /**
7592
+ * Owners whose provider-native tools reach the owner intact through the Vercel AI
7593
+ * Gateway as well as direct access, so routing must NOT be pinned for them.
7594
+ */
7595
+ const GATEWAY_CARRIED_PROVIDER_TOOL_OWNERS = /* @__PURE__ */ new Set(["google"]);
7596
+ /** Every provider that owns provider-native tools, whichever lane carries them. */
7597
+ const PROVIDER_TOOL_OWNERS = /* @__PURE__ */ new Set([...DIRECT_PROVIDER_TOOL_OWNERS, ...GATEWAY_CARRIED_PROVIDER_TOOL_OWNERS]);
7598
+ function ownerOf(toolId) {
7599
+ const entry = getBuiltInToolById(parseToolInstanceId(toolId).baseId);
7600
+ if (entry?.executionHint !== "provider") return void 0;
7601
+ return entry.providers?.[0];
7602
+ }
7603
+ /**
7604
+ * The provider that must EXECUTE a catalog tool id, or undefined when the id is unknown,
7605
+ * not provider-native, or owned by a provider that owns no provider-native tools.
7606
+ * Strips the `#instance` suffix and the `builtin:` / `platform:` prefix and resolves aliases.
7607
+ */
7608
+ function resolveProviderToolOwner(toolId) {
7609
+ const owner = ownerOf(toolId);
7610
+ return owner && PROVIDER_TOOL_OWNERS.has(owner) ? owner : void 0;
7611
+ }
7612
+ /**
7613
+ * The direct provider a catalog tool id must be ROUTED to, or undefined when no lane
7614
+ * pinning is required — an unknown / non-native id, or an owner a gateway carries.
7615
+ */
7616
+ function resolveDirectProviderToolOwner(toolId) {
7617
+ const owner = ownerOf(toolId);
7618
+ return owner && DIRECT_PROVIDER_TOOL_OWNERS.has(owner) ? owner : void 0;
7619
+ }
7619
7620
  // ../shared/dist/durable-poll-limits.mjs
7620
7621
  /**
7621
7622
  * Durable-poll budget limits shared between the api's Cloudflare Workflow poll loops and the author-time flow validator.
@@ -8027,7 +8028,7 @@ object({
8027
8028
  externalId: string().min(1).max(500).optional().describe("The conversation id in the source system. Re-creating with the same system and externalId returns the existing conversation with imported: false instead of a duplicate."),
8028
8029
  importedAt: string().datetime({ offset: true }).optional()
8029
8030
  });
8030
- // ../shared/dist/chunk-BJKUc65d.mjs
8031
+ // ../shared/dist/chunk-TpsYwqxQ.mjs
8031
8032
  /** Public schedule knobs shared by canonical, product-surface and FPO schedule writes. */
8032
8033
  const scheduleExecutionOptionsSchema = object({
8033
8034
  chunkSize: number().int().min(1).max(250).optional(),
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import { C as setMarathonTitle, F as getCliVersion, L as __require, N as getMarathonStateDir, P as getRuntypeHomeDir } from "./index.js";
3
3
  import { React, enterAltScreen, loadUi, render } from "./chunk-CoAWdSiE.js";
4
- import { _ as inferModelCreator, b as getBuiltInToolById, v as formatSystemToolId, x as isToolCompatibleWithModel, y as getAllBuiltInTools } from "./chunk-daI6hXN9.js";
5
- import { h as isNonAIProvider } from "./chunk-2KHCZ1oX.js";
4
+ import { _ as inferModelCreator, b as getBuiltInToolById, v as formatSystemToolId, x as isToolCompatibleWithModel, y as getAllBuiltInTools } from "./chunk-D-hN0D5C.js";
5
+ import { h as isNonAIProvider } from "./chunk-BkptXLRJ.js";
6
6
  import { c as getDevPlanOverride, i as getApiUrl, s as getDashboardUrl } from "./chunk-BW2fg46T.js";
7
7
  import { n as ensureAuth } from "./chunk-CJraEBVd.js";
8
8
  import { a as printJson } from "./chunk-CcFCyqbB.js";
@@ -3768,8 +3768,8 @@ async function taskAction(agent, options) {
3768
3768
  }
3769
3769
  await loadUi();
3770
3770
  const [{ MarathonApp }, { MarathonStartupShell }, { DEFAULT_MODELS: DEFAULT_STARTUP_MODELS }] = await Promise.all([
3771
- import("./chunk-BtpXwOCu.js"),
3772
- import("./chunk-BWWqiBjS.js"),
3771
+ import("./chunk-CG8J23-I.js"),
3772
+ import("./chunk-CD47z-l6.js"),
3773
3773
  import("./chunk-CrlqIfmb.js").then((n) => n.n)
3774
3774
  ]);
3775
3775
  const useStartupShell = canUseMarathonStartupShell(options);
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { _ as managedDeploymentCreateRequestSchema } from "./chunk-2KHCZ1oX.js";
2
+ import { _ as managedDeploymentCreateRequestSchema } from "./chunk-BkptXLRJ.js";
3
3
  import { r as createCliClient } from "./chunk-BW2fg46T.js";
4
4
  import { n as ensureAuth } from "./chunk-CJraEBVd.js";
5
5
  import { a as printJson } from "./chunk-CcFCyqbB.js";
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { c as mergeZodSchemaAndSemantic, l as validateFPO, o as coerceFullProductObjectForSemanticValidation, s as fullProductObjectSchema, u as validateFPOTemplate } from "./chunk-daI6hXN9.js";
2
+ import { c as mergeZodSchemaAndSemantic, l as validateFPO, o as coerceFullProductObjectForSemanticValidation, s as fullProductObjectSchema, u as validateFPOTemplate } from "./chunk-D-hN0D5C.js";
3
3
  import { a as printJson } from "./chunk-CcFCyqbB.js";
4
4
  import { Command, Option } from "commander";
5
5
  import chalk from "chalk";
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { b as CredentialStore } from "./index.js";
3
- import { x as selectAccountId } from "./chunk-2KHCZ1oX.js";
3
+ import { x as selectAccountId } from "./chunk-BkptXLRJ.js";
4
4
  import { t as ApiKeyManager } from "./chunk-BW2fg46T.js";
5
5
  // src/lib/account-context.ts
6
6
  /**
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { t as isTTY } from "./index.js";
3
3
  import { ConfirmPrompt, DataList, EntityCard, MutationResult, React, render, useEffect, useState } from "./chunk-CoAWdSiE.js";
4
- import { v as neutralizeCsvFormula } from "./chunk-2KHCZ1oX.js";
4
+ import { v as neutralizeCsvFormula } from "./chunk-BkptXLRJ.js";
5
5
  import { r as createCliClient } from "./chunk-BW2fg46T.js";
6
6
  import { n as ensureAuth } from "./chunk-CJraEBVd.js";
7
7
  import { a as printJson, r as getTotalCount, s as printNextCursorHint } from "./chunk-CcFCyqbB.js";
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { a as PRODUCT_EVENT_DEFAULT_NEXT_POLL_MS, g as isProductEventName, i as PRODUCT_EVENT_CURSOR_PATTERN, o as PRODUCT_EVENT_MAX_WAIT_MS, s as PRODUCT_EVENT_NAMES } from "./chunk-2KHCZ1oX.js";
2
+ import { a as PRODUCT_EVENT_DEFAULT_NEXT_POLL_MS, g as isProductEventName, i as PRODUCT_EVENT_CURSOR_PATTERN, o as PRODUCT_EVENT_MAX_WAIT_MS, s as PRODUCT_EVENT_NAMES } from "./chunk-BkptXLRJ.js";
3
3
  import { i as getApiUrl, r as createCliClient } from "./chunk-BW2fg46T.js";
4
4
  import { n as ensureAuth } from "./chunk-CJraEBVd.js";
5
5
  import { Command } from "commander";
@@ -54,6 +54,11 @@ const selfReportedCostSchema = object({
54
54
  "unknown"
55
55
  ])
56
56
  });
57
+ /** One action a candidate's turn left for the user to take, such as an Approve button. */
58
+ const simPendingActionSchema = object({
59
+ id: string().min(1).max(64).regex(/^[A-Za-z0-9][A-Za-z0-9_.:-]*$/),
60
+ label: string().min(1).max(120)
61
+ });
57
62
  const simTerminationSchema = _enum([
58
63
  "goal_met",
59
64
  "gave_up",
@@ -118,7 +123,11 @@ const simMessageSchema = object({
118
123
  ]),
119
124
  content: string(),
120
125
  toolCalls: array(simToolCallSchema).optional(),
121
- toolResults: array(simToolResultSchema).optional()
126
+ toolResults: array(simToolResultSchema).optional(),
127
+ /** On an assistant message: the actions a candidate's turn left for the user to take, such as an approval's buttons. */
128
+ pendingActions: array(simPendingActionSchema).max(8).optional(),
129
+ /** On a user message: the offered action the simulated user took with it. */
130
+ action: simPendingActionSchema.optional()
122
131
  });
123
132
  object({
124
133
  message: string(),
@@ -128,9 +137,11 @@ object({
128
137
  "gave_up"
129
138
  ]),
130
139
  reason: string().nullable().optional(),
131
- revealed: array(string()).optional()
140
+ revealed: array(string()).optional(),
141
+ /** The id of an action the assistant's last reply offered, taken with this message. */
142
+ action: string().nullable().optional()
132
143
  });
133
- // ../shared/dist/chunk-CNvw2TrD.mjs
144
+ // ../shared/dist/chunk-Bx51_zrp.mjs
134
145
  /** Every change kind a scrub report can name; a leaf so the data-source contracts reach it without the scrubber. */
135
146
  const METADATA_SCRUB_CHANGE_KIND_NAMES = [
136
147
  "url_redirected",
@@ -238,7 +249,7 @@ const productKindSchema = _enum([
238
249
  "external",
239
250
  "spec_only"
240
251
  ]);
241
- // ../shared/dist/chunk-LPsD799a.mjs
252
+ // ../shared/dist/chunk-CrBJszrn.mjs
242
253
  /** The manifest file at the root of a candidate's source bundle. */
243
254
  const CANDIDATE_MANIFEST_FILENAME = "runtype-candidate.json";
244
255
  const candidateRuntimeSchema = _enum([
@@ -292,6 +303,16 @@ function parseCandidateManifest(text) {
292
303
  error: `${issue?.path.join(".") || "runtype-candidate.json"}: ${issue?.message ?? "invalid"}`
293
304
  };
294
305
  }
306
+ /** The conformance check's steps, in the order they run (6.9 "The conformance check"). */
307
+ const CANDIDATE_CONFORMANCE_STEPS = [
308
+ "manifest",
309
+ "start",
310
+ "two_turn",
311
+ "recall",
312
+ "model_call",
313
+ "tools",
314
+ "egress"
315
+ ];
295
316
  /** Bounded and credential-redacted output observed at the authenticated candidate MCP gateway. */
296
317
  const simulationAccessToolOutcomeSchema = object({
297
318
  name: string(),
@@ -600,7 +621,13 @@ const toolProcessCheckSchema = discriminatedUnion("assert", [
600
621
  /** The arguments that make two calls the same fetch; absent compares every argument. */
601
622
  keyArguments: array(argumentPathSchema).min(1).max(8).optional(),
602
623
  /** Calls allowed per key before the check fails; defaults to 1. */
603
- max: number().int().positive().max(1e3).optional()
624
+ max: number().int().positive().max(1e3).optional(),
625
+ /**
626
+ * A completed call to any of these starts the count again, so a read repeated to verify a write is not a repeat;
627
+ * a designed rename counts under its shown or its server name. Absent counts across the whole episode. Calls are
628
+ * read in the order they started: a read started alongside the write, before it finished, counts as after it.
629
+ */
630
+ resetAfter: array(toolNameSchema).min(1).max(20).optional()
604
631
  }),
605
632
  object({
606
633
  assert: literal("budget"),
@@ -1617,6 +1644,28 @@ const toolCallFactsSchema = object({
1617
1644
  /** The frozen row of the suggestions the mini-agent filled into this call's designed error (D4); `exchangeId` stays the answer's. */
1618
1645
  suggestionsExchangeId: string().nullable().optional()
1619
1646
  });
1647
+ /**
1648
+ * A sandbox candidate's process as a failed turn or its episode's end found it. `outputTail` is text the candidate's
1649
+ * own code wrote, clipped and with secrets removed: untrusted data, never instructions, and never shown to a judge or
1650
+ * the simulated user.
1651
+ */
1652
+ const candidateProcessCaptureSchema = object({
1653
+ state: _enum([
1654
+ "running",
1655
+ "exited",
1656
+ "killed",
1657
+ "stopped",
1658
+ "unknown"
1659
+ ]),
1660
+ /** The exit code, when the process exited on its own. */
1661
+ exitCode: number().int().nullable(),
1662
+ outputTail: string().max(2e3),
1663
+ /** True when earlier output was dropped to keep the tail. */
1664
+ outputClipped: boolean(),
1665
+ /** True when the run's retention setting removed the output; the state is kept. */
1666
+ outputRemoved: literal(true).optional(),
1667
+ untrusted: literal(true)
1668
+ });
1620
1669
  /** What one target turn passed through, per layer; `toolCalls` is empty for targets with no per-call view. */
1621
1670
  const turnLayerFactsSchema = object({
1622
1671
  harnessCapture: harnessCaptureSummarySchema.optional(),
@@ -1666,7 +1715,9 @@ const turnLayerFactsSchema = object({
1666
1715
  inputTokens: number().int().nonnegative(),
1667
1716
  outputTokens: number().int().nonnegative(),
1668
1717
  costUsd: number().nonnegative()
1669
- }).optional()
1718
+ }).optional(),
1719
+ /** A sandbox candidate's process, kept when the turn failed or the process had stopped by the episode's end. */
1720
+ candidateProcess: candidateProcessCaptureSchema.optional()
1670
1721
  });
1671
1722
  const egressRefusalReasonSchema = _enum([
1672
1723
  "internal_range",
@@ -1712,6 +1763,16 @@ const episodeMetricsSchema = object({
1712
1763
  scoringFailed: literal(true).optional(),
1713
1764
  /** Scoring failed because no goal-judge attempt returned a valid verdict: the judge, not the episode, gave no verdict. */
1714
1765
  goalJudgeModelError: literal(true).optional(),
1766
+ /**
1767
+ * An interrupted, unscored episode's side-effect graders that wrote no score because its state could not be read.
1768
+ * `guarded` is true when one of them checks a write that must not happen. `reason` has secrets removed and is absent
1769
+ * under the `metrics` data policy.
1770
+ */
1771
+ unreadSideEffects: object({
1772
+ graderIndexes: array(number().int().nonnegative()),
1773
+ guarded: boolean(),
1774
+ reason: string().optional()
1775
+ }).optional(),
1715
1776
  turns: number().int().nonnegative(),
1716
1777
  targetCostUsd: number().nullable(),
1717
1778
  clientAgentCostUsd: number().nullable(),
@@ -1748,6 +1809,11 @@ const layerStatSchema = object({
1748
1809
  costUsd: number().nullable(),
1749
1810
  p50LatencyMs: number().nullable()
1750
1811
  });
1812
+ /** Something in the plan the caller should know before starting the run. `code` is stable; new codes may be added. */
1813
+ const runEstimateWarningSchema = object({
1814
+ code: string(),
1815
+ message: string()
1816
+ });
1751
1817
  /** The dry-run estimate (`estimateRun`); admission compares `costUsd.expected` with the cap. */
1752
1818
  const runEstimateSchema = object({
1753
1819
  episodes: number().int().nonnegative(),
@@ -1774,7 +1840,19 @@ const runEstimateSchema = object({
1774
1840
  catalogReason: _enum(["no_history", "changed"]).optional(),
1775
1841
  unpricedModels: array(string()),
1776
1842
  maxSpendUsd: number(),
1777
- overBudget: boolean()
1843
+ overBudget: boolean(),
1844
+ /** Absent when there is nothing to warn about. */
1845
+ warnings: array(runEstimateWarningSchema).optional(),
1846
+ /**
1847
+ * Per variant id: its conversations, the expected and high cost of one (means over its tasks), and the most its
1848
+ * product may spend in one conversation (its longest task at the turn limit).
1849
+ */
1850
+ byVariant: record(string(), object({
1851
+ episodes: number().int().nonnegative(),
1852
+ expectedUsd: number(),
1853
+ highUsd: number(),
1854
+ targetHighUsd: number()
1855
+ })).optional()
1778
1856
  });
1779
1857
  /** One episode an inline run has started and not finished, with the agent turns it has completed so far. */
1780
1858
  const simulationActiveEpisodeSchema = object({
@@ -1814,6 +1892,30 @@ const simulationRunSchema = object({
1814
1892
  */
1815
1893
  activeEpisodes: array(simulationActiveEpisodeSchema).optional()
1816
1894
  });
1895
+ /** A run's ended conversations, counted as they end: by ending, by why they were left out, and those not scored. */
1896
+ const simulationRunProgressSchema = object({
1897
+ /** Ended conversations by how they ended; one that ended but was not scored counts under `notScored` instead. */
1898
+ byTermination: partialRecord(simTerminationSchema, number().int().nonnegative()),
1899
+ /** Conversations that ran to their end but whose graders returned no score. */
1900
+ notScored: number().int().nonnegative(),
1901
+ /** Ended conversations left out of every pass rate, by reason. */
1902
+ byLeftOutReason: partialRecord(episodeLeftOutReasonSchema, number().int().nonnegative()),
1903
+ /** Conversations under `agent_error` that ended because the client model's provider stopped answering; left out. */
1904
+ clientModelStalls: number().int().nonnegative(),
1905
+ /** When the latest conversation ended; null until one has. */
1906
+ lastEndedAt: isoDate.nullable()
1907
+ });
1908
+ /**
1909
+ * What `repairSimulationRun` would do, from the same selection the run engine makes: grade `regrade` conversations
1910
+ * again from their stored transcripts, and play at least `replay` again, which spends credits. The engine can also play
1911
+ * a recording miss whose tool was recorded since, or a conversation it finished but never stored.
1912
+ */
1913
+ const simulationRunRepairPreviewSchema = object({
1914
+ regrade: number().int().nonnegative(),
1915
+ replay: number().int().nonnegative(),
1916
+ /** Interrupted conversations repair keeps instead of playing again, because a safety check failed or went unread. */
1917
+ keptForSafety: number().int().nonnegative().optional()
1918
+ });
1817
1919
  /** A saved episode, without its transcript. */
1818
1920
  const simulationEpisodeSchema = object({
1819
1921
  id: entityId$1,
@@ -1942,11 +2044,15 @@ const reportVariantSummarySchema = object({
1942
2044
  passed: number().int(),
1943
2045
  failed: number().int()
1944
2046
  }).optional(),
1945
- /** Absent checks over the conversations that ran; `notRun` counts the ones with an absent check that didn't run. */
2047
+ /**
2048
+ * Absent checks over the conversations that ran; `notRun` counts the ones with an absent check that didn't run, and
2049
+ * `unread` the interrupted ones that ran but whose state could not be read to check it.
2050
+ */
1946
2051
  writeGuards: object({
1947
2052
  passed: number().int(),
1948
2053
  failed: number().int(),
1949
- notRun: number().int()
2054
+ notRun: number().int(),
2055
+ unread: number().int().optional()
1950
2056
  }).optional(),
1951
2057
  /** The exists, linked and in_quarantine checks over every scored conversation, including ones that didn't run. */
1952
2058
  expectedWrites: object({
@@ -2263,6 +2369,8 @@ const investmentSectionSchema = object({
2263
2369
  recordingMissPairsDropped: number().int().positive().optional(),
2264
2370
  /** Pairs left out because either side stalled on its client model and neither missed; absent when none were. */
2265
2371
  clientModelStallPairsDropped: number().int().positive().optional(),
2372
+ /** Pairs left out because either side could not be scored, and neither missed nor stalled; absent when none were. */
2373
+ scoringFailedPairsDropped: number().int().positive().optional(),
2266
2374
  headline: _enum(["recommended", "indicative"]),
2267
2375
  reason: string().nullable(),
2268
2376
  /** Injection and write-guard checks the design's own conversations failed; absent when none. Never recommended then. */
@@ -2310,7 +2418,10 @@ const comparisonQualitySchema = object({
2310
2418
  ])),
2311
2419
  missingGradeEpisodes: number().int().nonnegative(),
2312
2420
  interruptedEpisodes: number().int().nonnegative(),
2313
- /** Unscored finished episodes other than `recording_miss`, client-model stalls and `didnt_run`, which have their own counts. */
2421
+ /**
2422
+ * Unscored finished episodes other than `recording_miss`, client-model stalls, episodes that could not be scored and
2423
+ * `didnt_run`, which have their own counts.
2424
+ */
2314
2425
  unscoredEpisodes: number().int().nonnegative(),
2315
2426
  /**
2316
2427
  * Episodes that ended `recording_miss`. Each leaves the paired comparison with its partner; past
@@ -2324,6 +2435,15 @@ const comparisonQualitySchema = object({
2324
2435
  clientModelStallEpisodes: number().int().nonnegative().optional(),
2325
2436
  /** Pairs left out because either side stalled on its client model and neither ended `recording_miss`. */
2326
2437
  clientModelStallPairsDropped: number().int().nonnegative().optional(),
2438
+ /**
2439
+ * Finished episodes that could not be scored: the graders threw or reached no verdict. Also counted in
2440
+ * `missingGradeEpisodes`. In a paired comparison each leaves with its partner and counts with recording misses and client-model
2441
+ * stalls toward `RECORDING_MISS_SHARE_CAP`; past it, or in a version with no comparison, the reason is
2442
+ * `incomplete_grading`. Absent when none.
2443
+ */
2444
+ scoringFailedEpisodes: number().int().nonnegative().optional(),
2445
+ /** Pairs left out because either side could not be scored, and neither missed a recording nor stalled. */
2446
+ scoringFailedPairsDropped: number().int().nonnegative().optional(),
2327
2447
  outcomeScope: _enum([
2328
2448
  "task_completion",
2329
2449
  "safety",
@@ -2474,6 +2594,8 @@ const simulationReportBodySchema = object({
2474
2594
  /** Pairs left out because either side stalled on its client model and neither ended `recording_miss`. */
2475
2595
  clientModelStallPairsDropped: number().int().nonnegative().optional(),
2476
2596
  scoringFailedEpisodes: number().int().optional(),
2597
+ /** Pairs left out because either side could not be scored, and neither missed a recording nor stalled. */
2598
+ scoringFailedPairsDropped: number().int().nonnegative().optional(),
2477
2599
  spendCapEpisodes: number().int().optional(),
2478
2600
  engineErrorEpisodes: number().int().optional(),
2479
2601
  didntRunEpisodes: number().int().nonnegative().optional(),
@@ -2767,6 +2889,41 @@ const simulationDesignBriefSchema = object({
2767
2889
  trend: array(designBriefTrendPointSchema)
2768
2890
  });
2769
2891
  object({ briefs: array(simulationDesignBriefSchema) });
2892
+ const candidateConformanceStepSchema = _enum(CANDIDATE_CONFORMANCE_STEPS);
2893
+ /** A step's status; `skipped` is a step that did not apply or could not be verified. */
2894
+ const CANDIDATE_CONFORMANCE_STEP_STATUSES = [
2895
+ "passed",
2896
+ "failed",
2897
+ "skipped"
2898
+ ];
2899
+ /** Where the check's tools came from: the one-tool fixture, or a variant's synthetic dataset stand-in. */
2900
+ const CANDIDATE_CONFORMANCE_TOOL_SOURCES = ["fixture", "stand_in"];
2901
+ /**
2902
+ * One step's outcome; `skipped` is a step that did not apply, such as recall for a `single_turn` candidate, or one
2903
+ * the sandbox could not verify, such as egress where no refusal record is kept.
2904
+ */
2905
+ const candidateConformanceStepResultSchema = object({
2906
+ step: candidateConformanceStepSchema,
2907
+ status: _enum(CANDIDATE_CONFORMANCE_STEP_STATUSES),
2908
+ detail: string().max(1e3).nullable()
2909
+ });
2910
+ object({
2911
+ bundleSha256: string().regex(/^[a-f0-9]{64}$/),
2912
+ passed: boolean(),
2913
+ /** The first step that failed, or null when every step passed. */
2914
+ failedStep: candidateConformanceStepSchema.nullable(),
2915
+ steps: array(candidateConformanceStepResultSchema),
2916
+ /** Hosts off the allowlist the candidate tried to reach; a non-empty list fails the check. */
2917
+ blockedHosts: array(string().max(255)).max(50),
2918
+ startMs: number().nonnegative().nullable(),
2919
+ checkedAt: string().datetime({ offset: true }),
2920
+ /** Where the tools came from; absent on results stored before it, which used the fixture. */
2921
+ toolSource: _enum(CANDIDATE_CONFORMANCE_TOOL_SOURCES).optional(),
2922
+ /** The tools the candidate's MCP URL served when it listed them; empty when it never listed. */
2923
+ toolsListed: array(string().max(255)).max(500).optional(),
2924
+ /** Each tool the candidate called, once, in the order first called. */
2925
+ toolsCalled: array(string().max(255)).max(500).optional()
2926
+ });
2770
2927
  const entityId = string().min(1).max(255);
2771
2928
  /** Every list route's page envelope: `data` plus a keyset cursor. */
2772
2929
  function simulationPageSchema(item) {
@@ -3088,15 +3245,25 @@ const simulationRunResponseSchema = object({
3088
3245
  object({
3089
3246
  /** Comma-separated server tools; the response then counts this run's live calls to each that the recorder kept. */
3090
3247
  recordedCallsFor: string().max(4096).optional() });
3091
- simulationRunResponseSchema.extend({
3092
- /** Per tool named in `recordedCallsFor`: this run's live calls the recorder kept, 0 for a tool with none. */
3093
- recordedCalls: record(string(), number().int()).optional() });
3248
+ simulationRunResponseSchema.extend({
3249
+ /** Per tool named in `recordedCallsFor`: this run's live calls the recorder kept, 0 for a tool with none. */
3250
+ recordedCalls: record(string(), number().int()).optional(),
3251
+ /** The run's ended conversations counted by how they ended, current at the time of the read; omitted when unavailable. */
3252
+ progress: simulationRunProgressSchema.optional(),
3253
+ /** Present when a conversation was not scored and a repair can reopen the run: finished, not cancelled, budget left. */
3254
+ repairPreview: simulationRunRepairPreviewSchema.optional()
3255
+ });
3094
3256
  object({ run: simulationRunSchema });
3095
3257
  simulationRunResponseSchema.extend({ repair: object({
3096
3258
  /** Episodes whose AI judge failed, graded again from their stored transcripts. */
3097
3259
  regrading: number().int(),
3098
3260
  /** Episodes the platform kept from running, and recording misses since recorded, played again under fresh ids. */
3099
- replaying: number().int()
3261
+ replaying: number().int(),
3262
+ /**
3263
+ * Episodes interrupted mid-turn that repair kept instead of playing again: a side-effect or injection check failed
3264
+ * or could not be read, and a replay would delete that record. Absent when none.
3265
+ */
3266
+ keptForSafety: number().int().optional()
3100
3267
  }) });
3101
3268
  simulationRunResponseSchema.extend({ advance: object({
3102
3269
  /** Episodes this call finished; one it parked at the time budget resumes on the next call. */
@@ -3803,6 +3970,11 @@ function printConformance(result) {
3803
3970
  const status = step.status === "passed" ? "" : ` ${step.status}`;
3804
3971
  console.log(` ${STEP_MARK[step.status]} ${step.step}${status}${detail}`);
3805
3972
  }
3973
+ if (result.toolsListed) {
3974
+ const source = result.toolSource === "stand_in" ? " (synthetic dataset stand-in)" : "";
3975
+ console.log(` ${chalk.gray(`Tools listed${source}:`)} ${result.toolsListed.join(", ") || "none"}`);
3976
+ }
3977
+ if (result.toolsCalled) console.log(` ${chalk.gray("Tools called:")} ${result.toolsCalled.join(", ") || "none"}`);
3806
3978
  if (result.blockedHosts.length > 0) console.log(chalk.red(` Blocked hosts: ${result.blockedHosts.join(", ")}`));
3807
3979
  }
3808
3980
  function printPushSummary(uploaded, change, savedArchive) {
@@ -3819,11 +3991,15 @@ function printPushSummary(uploaded, change, savedArchive) {
3819
3991
  console.log(`\n${chalk.cyan("Bundle for a sandbox_candidate target config:")}`);
3820
3992
  console.log(JSON.stringify({ bundle: uploaded.bundle }, null, 2));
3821
3993
  }
3994
+ /** Refuses option sets that cannot succeed, before anything is uploaded or created. */
3822
3995
  function validatePushOptions(options) {
3823
3996
  if (options.target !== void 0 && options.createTarget !== void 0) throw new CandidatePushError("INVALID_INPUT", "Pass either --target or --create-target, not both.");
3824
3997
  const hasTarget = options.target !== void 0 || options.createTarget !== void 0;
3825
3998
  if (options.mcpTarget !== void 0 && !hasTarget) throw new CandidatePushError("INVALID_INPUT", "--mcp-target needs --target or --create-target.");
3826
3999
  if (options.conformance && !hasTarget) throw new CandidatePushError("INVALID_INPUT", "--conformance needs --target or --create-target: the check runs against a target.");
4000
+ if (options.simulation === void 0 !== (options.variant === void 0)) throw new CandidatePushError("INVALID_INPUT", "Pass --simulation and --variant together.");
4001
+ if (options.variant !== void 0 && !options.conformance) throw new CandidatePushError("INVALID_INPUT", "--simulation and --variant need --conformance.");
4002
+ if (options.variant !== void 0 && options.target === void 0) throw new CandidatePushError("INVALID_INPUT", "--variant needs --target: the check runs against the variant's own target, which a new target cannot be.");
3827
4003
  }
3828
4004
  async function runPush(path, options) {
3829
4005
  validatePushOptions(options);
@@ -3859,7 +4035,10 @@ async function runPush(path, options) {
3859
4035
  throw describeCandidateApiError(error, "upload");
3860
4036
  });
3861
4037
  const change = await pointTargetAtBundle(client, uploaded, options);
3862
- const conformance = options.conformance && change ? await client.post(`/simulations/targets/${encodeURIComponent(change.target.id)}/conformance`, {}).catch((error) => {
4038
+ const conformance = options.conformance && change ? await client.post(`/simulations/targets/${encodeURIComponent(change.target.id)}/conformance`, options.variant !== void 0 ? {
4039
+ simulationId: options.simulation,
4040
+ variantId: options.variant
4041
+ } : {}).catch((error) => {
3863
4042
  throw describeCandidateApiError(error, "conformance");
3864
4043
  }) : void 0;
3865
4044
  const savedArchive = input.kind === "directory" && options.out ? archive : void 0;
@@ -3902,7 +4081,7 @@ function reportFailure(error, json) {
3902
4081
  }
3903
4082
  const simulationsCommand = new Command("simulations").description("Simulations: sandbox candidates, recorded tool exchanges and reports");
3904
4083
  registerToolMemoryCommands(simulationsCommand);
3905
- simulationsCommand.command("candidate").description("Sandbox candidates: an agent run as real code in a Runtype sandbox").command("push <path>").description("Upload a candidate bundle: a directory with runtype-candidate.json at its root (packed reproducibly) or a .tgz / .tar.gz").option("--target <id>", "Point this sandbox_candidate target at the new bundle, keeping its other config").option("--create-target <name>", "Create a sandbox_candidate target for the new bundle").option("--mcp-target <id>", "With --target or --create-target: the external_mcp target whose tools episodes get (config.mcpTargetId)").option("--conformance", "Run the conformance check on the target after the push").option("--out <file>", "Also save the packed archive to this file (directory input only)").option("--json", "Output as JSON").action(async (path, options) => {
4084
+ simulationsCommand.command("candidate").description("Sandbox candidates: an agent run as real code in a Runtype sandbox").command("push <path>").description("Upload a candidate bundle: a directory with runtype-candidate.json at its root (packed reproducibly) or a .tgz / .tar.gz").option("--target <id>", "Point this sandbox_candidate target at the new bundle, keeping its other config").option("--create-target <name>", "Create a sandbox_candidate target for the new bundle").option("--mcp-target <id>", "With --target or --create-target: the external_mcp target whose tools episodes get (config.mcpTargetId)").option("--conformance", "Run the conformance check on the target after the push").option("--simulation <id>", "With --conformance and --variant: the simulation the variant belongs to").option("--variant <id>", "With --conformance and --target: check against this variant's synthetic dataset tools instead of the one-tool fixture").option("--out <file>", "Also save the packed archive to this file (directory input only)").option("--json", "Output as JSON").action(async (path, options) => {
3906
4085
  let passed;
3907
4086
  try {
3908
4087
  passed = await runPush(path, options);
package/dist/index.js CHANGED
@@ -71,7 +71,7 @@ const COMMAND_REGISTRY = [
71
71
  name: "init",
72
72
  term: "init [options]",
73
73
  description: "Set up Runtype CLI with guided onboarding",
74
- load: async () => (await import("./chunk-NXI76aJP.js")).initCommand
74
+ load: async () => (await import("./chunk-B5z7FcMZ.js")).initCommand
75
75
  },
76
76
  {
77
77
  name: "login",
@@ -107,7 +107,7 @@ const COMMAND_REGISTRY = [
107
107
  name: "records",
108
108
  term: "records",
109
109
  description: "Manage records",
110
- load: async () => (await import("./chunk-D5sr2-s-.js")).recordsCommand
110
+ load: async () => (await import("./chunk-hnOvAcZx.js")).recordsCommand
111
111
  },
112
112
  {
113
113
  name: "collections",
@@ -143,7 +143,7 @@ const COMMAND_REGISTRY = [
143
143
  name: "sandbox-deployments",
144
144
  term: "sandbox-deployments",
145
145
  description: "Author managed deployments using retained runtime profiles and uploaded source IDs",
146
- load: async () => (await import("./chunk-CS4tOg29.js")).sandboxDeploymentsCommand
146
+ load: async () => (await import("./chunk-DxS1ac3j.js")).sandboxDeploymentsCommand
147
147
  },
148
148
  {
149
149
  name: "tools",
@@ -167,7 +167,7 @@ const COMMAND_REGISTRY = [
167
167
  name: "products",
168
168
  term: "products",
169
169
  description: "Manage products",
170
- load: async () => (await import("./chunk-BNt7L05l.js")).productsCommand
170
+ load: async () => (await import("./chunk-CwrDbUsn.js")).productsCommand
171
171
  },
172
172
  {
173
173
  name: "dispatch",
@@ -203,13 +203,13 @@ const COMMAND_REGISTRY = [
203
203
  name: "traces",
204
204
  term: "traces",
205
205
  description: "Mine traces: aggregate runs, read a bounded slice of one trace, compare two runs or cohorts",
206
- load: async () => (await import("./chunk-DGw-oea5.js")).tracesCommand
206
+ load: async () => (await import("./chunk-CQwXQ3jd.js")).tracesCommand
207
207
  },
208
208
  {
209
209
  name: "agents",
210
210
  term: "agents",
211
211
  description: "Manage agents",
212
- load: async () => (await import("./chunk-C8DBcoRx.js")).agentsCommand
212
+ load: async () => (await import("./chunk-CcsI1Y8O.js")).agentsCommand
213
213
  },
214
214
  {
215
215
  name: "models",
@@ -234,7 +234,7 @@ const COMMAND_REGISTRY = [
234
234
  aliases: ["keys"],
235
235
  term: "api-keys|keys",
236
236
  description: "Manage API keys",
237
- load: async () => (await import("./chunk-DkaS_DNA.js")).apiKeysCommand
237
+ load: async () => (await import("./chunk-BWN6wf35.js")).apiKeysCommand
238
238
  },
239
239
  {
240
240
  name: "client-tokens",
@@ -246,7 +246,7 @@ const COMMAND_REGISTRY = [
246
246
  name: "persona",
247
247
  term: "persona",
248
248
  description: "Set up Persona: create an agent, client token, and embed snippet",
249
- load: async () => (await import("./chunk-C3GmwZiH.js")).personaCommand
249
+ load: async () => (await import("./chunk-4Ykx-xWg.js")).personaCommand
250
250
  },
251
251
  {
252
252
  name: "analytics",
@@ -276,7 +276,7 @@ const COMMAND_REGISTRY = [
276
276
  name: "marathon",
277
277
  term: "marathon [options] <agent>",
278
278
  description: "Run a multi-session agent task (alias for agents task)",
279
- load: async () => (await import("./chunk-XwPlN7Hv.js")).createMarathonCommand()
279
+ load: async () => (await import("./chunk-DWj7uC90.js")).createMarathonCommand()
280
280
  },
281
281
  {
282
282
  name: "tail",
@@ -288,13 +288,13 @@ const COMMAND_REGISTRY = [
288
288
  name: "events",
289
289
  term: "events",
290
290
  description: "Watch product events (failed executions, approvals, eval results, ...)",
291
- load: async () => (await import("./chunk-DQabdDJ3.js")).eventsCommand
291
+ load: async () => (await import("./chunk-nTKUwz6t.js")).eventsCommand
292
292
  },
293
293
  {
294
294
  name: "validate-product",
295
295
  term: "validate-product [options] [input]",
296
296
  description: "Validate a product (FPO) or FPO template locally (no API call)",
297
- load: async () => (await import("./chunk-NaMByjdC.js")).validateProductCommand
297
+ load: async () => (await import("./chunk-FfQFwZ7q.js")).validateProductCommand
298
298
  },
299
299
  {
300
300
  name: "deploy",
@@ -358,7 +358,7 @@ const COMMAND_REGISTRY = [
358
358
  name: "simulations",
359
359
  term: "simulations",
360
360
  description: "Simulations: sandbox candidates, recorded tool exchanges and reports",
361
- load: async () => (await import("./chunk-CrhwBwqZ.js")).simulationsCommand
361
+ load: async () => (await import("./chunk-w76cMuXv.js")).simulationsCommand
362
362
  },
363
363
  {
364
364
  name: "apps",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@runtypelabs/cli",
3
- "version": "2.59.10",
3
+ "version": "2.60.0",
4
4
  "description": "Command-line interface for Runtype AI platform",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -13,7 +13,7 @@
13
13
  "@modelcontextprotocol/core": "2.3.1",
14
14
  "@napi-rs/keyring": "2.1.0",
15
15
  "@runtypelabs/ink-components": "0.3.15",
16
- "@runtypelabs/sdk": "11.24.0",
16
+ "@runtypelabs/sdk": "11.24.2",
17
17
  "@runtypelabs/terminal-animations": "0.2.4",
18
18
  "add-mcp": "2.6.0",
19
19
  "chalk": "^5.3.0",
@@ -40,7 +40,7 @@
40
40
  "@runtypelabs/mcp-cli": "0.4.1",
41
41
  "@runtypelabs/model-execution": "0.42.2",
42
42
  "@runtypelabs/persona": "4.38.1",
43
- "@runtypelabs/shared": "3.121.1",
43
+ "@runtypelabs/shared": "3.124.0",
44
44
  "@types/express": "^5.0.6",
45
45
  "@types/micromatch": "^4.0.9",
46
46
  "@types/node": "^25.3.3",