@runtypelabs/cli 2.21.2 → 2.21.3

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.
Files changed (2) hide show
  1. package/dist/index.js +166 -14
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -15904,6 +15904,9 @@ var flowCompleteEventSchema = external_exports.object({
15904
15904
  // emitter/runtime send success+duration; api raw-writes send the step counts instead.
15905
15905
  success: external_exports.boolean().optional(),
15906
15906
  duration: external_exports.number().optional(),
15907
+ // The claude-managed ephemeral-create dispatch surfaces the minted (and
15908
+ // reusable) Anthropic agent id here so a later run can `connect` to it.
15909
+ claudeManagedAgentId: external_exports.string().optional(),
15907
15910
  executionTime: external_exports.number().optional(),
15908
15911
  completedAt: external_exports.string().optional(),
15909
15912
  totalSteps: external_exports.number().optional(),
@@ -16407,7 +16410,20 @@ var approvalConfigSchema = external_exports.object({
16407
16410
  * tools by injecting a reserved optional `_approvalReason` string into the
16408
16411
  * model-visible parameters schema. The value is stripped before the tool
16409
16412
  * executes and surfaced to the approver. Default: true (opt out with false). */
16410
- requestReason: external_exports.boolean().optional()
16413
+ requestReason: external_exports.boolean().optional(),
16414
+ /** Persistent "always" choices offered at the human approval prompt — the
16415
+ * user-facing options the owner offers, NOT auto-behavior. When a choice is
16416
+ * enabled the approval UI renders its button; the end-user's per-approval pick
16417
+ * (Persona's wire `remember`) is what writes a durable cross-session grant.
16418
+ * Keys mirror the grant `decision` enum (`alwaysAllow` → 'allow',
16419
+ * `alwaysDeny` → 'deny'). v1 honors `alwaysAllow`; `alwaysDeny` is the
16420
+ * symmetric mirror landed later with no migration. Default: both off — this is
16421
+ * the sole control for persisted approval grants (no Flagship flag). See
16422
+ * docs/features/planning/2026-06-13-cross-session-always-allow-approval-grants.md */
16423
+ choices: external_exports.object({
16424
+ alwaysAllow: external_exports.boolean().optional(),
16425
+ alwaysDeny: external_exports.boolean().optional()
16426
+ }).optional()
16411
16427
  });
16412
16428
  var toolSearchConfigSchema = external_exports.object({
16413
16429
  /** Explicit opt-in/out. When omitted, auto-activates if tool count >= threshold. */
@@ -16565,13 +16581,10 @@ var contextFallbackSchema = external_exports.union([
16565
16581
  delay: external_exports.number().optional()
16566
16582
  })
16567
16583
  ]);
16568
- var contextErrorHandlingConfigSchema = external_exports.union([
16569
- external_exports.enum(["fail", "continue", "default"]),
16570
- external_exports.object({
16571
- onError: external_exports.enum(["fail", "continue", "fallback", "default"]),
16572
- fallbacks: external_exports.array(contextFallbackSchema).optional()
16573
- })
16574
- ]);
16584
+ var contextErrorHandlingConfigSchema = external_exports.object({
16585
+ onError: external_exports.enum(["fail", "continue", "fallback"]),
16586
+ fallbacks: external_exports.array(contextFallbackSchema).optional()
16587
+ });
16575
16588
  var httpConfigSchema = external_exports.object({
16576
16589
  url: external_exports.string().min(1, "URL is required"),
16577
16590
  method: external_exports.enum(["GET", "POST", "PUT", "DELETE", "PATCH"]).optional(),
@@ -36687,6 +36700,67 @@ var INTEGRATIONS_REGISTRY = [
36687
36700
  function getAllIntegrations() {
36688
36701
  return INTEGRATIONS_REGISTRY;
36689
36702
  }
36703
+ var BUILT_IN_GRADER_IDS = [
36704
+ "answersQuestion",
36705
+ "matchesExpected",
36706
+ "followsInstructions",
36707
+ "grounded",
36708
+ "rightTone",
36709
+ "safeToSend"
36710
+ ];
36711
+ var checkGraderSchema = external_exports.discriminatedUnion("kind", [
36712
+ external_exports.object({
36713
+ kind: external_exports.literal("contains"),
36714
+ value: external_exports.string(),
36715
+ caseSensitive: external_exports.boolean().optional()
36716
+ }),
36717
+ external_exports.object({
36718
+ kind: external_exports.literal("not_contains"),
36719
+ value: external_exports.string(),
36720
+ caseSensitive: external_exports.boolean().optional()
36721
+ }),
36722
+ // Exact/normalized match against `case.expected.text`.
36723
+ external_exports.object({ kind: external_exports.literal("matches_expected") }),
36724
+ external_exports.object({
36725
+ kind: external_exports.literal("regex"),
36726
+ pattern: external_exports.string(),
36727
+ flags: external_exports.string().optional()
36728
+ }),
36729
+ external_exports.object({ kind: external_exports.literal("valid_json") }),
36730
+ external_exports.object({
36731
+ kind: external_exports.literal("json_field"),
36732
+ path: external_exports.string(),
36733
+ equals: external_exports.unknown().optional(),
36734
+ exists: external_exports.boolean().optional()
36735
+ }),
36736
+ external_exports.object({
36737
+ kind: external_exports.literal("length"),
36738
+ minChars: external_exports.number().int().nonnegative().optional(),
36739
+ maxChars: external_exports.number().int().nonnegative().optional()
36740
+ }),
36741
+ external_exports.object({ kind: external_exports.literal("latency"), maxMs: external_exports.number().int().positive() }),
36742
+ // Today's implicit "success" made explicit: the case produced output without erroring.
36743
+ external_exports.object({ kind: external_exports.literal("no_error") })
36744
+ ]);
36745
+ var aiGraderSchema = external_exports.object({
36746
+ kind: external_exports.literal("ai"),
36747
+ preset: external_exports.enum(BUILT_IN_GRADER_IDS).optional(),
36748
+ /** Plain language: "what does a good answer look like?" */
36749
+ criteria: external_exports.string().min(1),
36750
+ /** Reference-guided when the case has `expected`. */
36751
+ useExpected: external_exports.boolean().default(false),
36752
+ /** Defaults to a cheap routed model (e.g. claude-haiku-4-5) at execution time. */
36753
+ model: external_exports.string().optional(),
36754
+ /** Pass cutoff for the 1-5 scale. */
36755
+ threshold: external_exports.number().min(1).max(5).optional()
36756
+ });
36757
+ var graderConfigSchema = external_exports.union([checkGraderSchema, aiGraderSchema]);
36758
+ var gradersSchema = external_exports.array(graderConfigSchema);
36759
+ var caseExpectedSchema = external_exports.object({
36760
+ text: external_exports.string().optional(),
36761
+ json: external_exports.unknown().optional(),
36762
+ facts: external_exports.array(external_exports.string()).optional()
36763
+ });
36690
36764
  var DEFAULT_MODELS_FOR_NEW_ACCOUNTS = [
36691
36765
  // Mixlayer models
36692
36766
  { provider: "runtype", modelId: "qwen/qwen3.5-9b", isDefault: true },
@@ -36737,7 +36811,12 @@ var userProfileFeaturesSchema = external_exports.object({
36737
36811
  // Gates the Runtype Apps nav entry + routes in the dashboard. Driven by the
36738
36812
  // `enable-runtype-apps` boolean flag (fail-closed in production until the
36739
36813
  // prod ops set lands). The whole /v1/apps surface 404s when this is off.
36740
- enableRuntypeApps: external_exports.boolean()
36814
+ enableRuntypeApps: external_exports.boolean(),
36815
+ // Gates the dashboard skill "Security scan" affordance (the
36816
+ // `POST /v1/skills/scan` verdict UI). Driven by the `enable-skill-scanner`
36817
+ // boolean flag (fail-closed until a rule enables it). The scan ROUTE stays
36818
+ // reachable; this only hides the UI while the scanner rollout completes.
36819
+ enableSkillScanner: external_exports.boolean()
36741
36820
  });
36742
36821
  var MODEL_FAMILY_PROVIDER_IDS = {
36743
36822
  "claude-fable-5": {
@@ -39321,7 +39400,13 @@ var agentRuntimeConfigSchema = external_exports.object({
39321
39400
  /** Opt out of agent-supplied approval reasons (`_approvalReason`
39322
39401
  * schema injection). Default: true. Mirrors approvalConfigSchema
39323
39402
  * in tool-types.ts. */
39324
- requestReason: external_exports.boolean().optional()
39403
+ requestReason: external_exports.boolean().optional(),
39404
+ /** Persistent "always" choices offered at the approval prompt.
39405
+ * Mirrors approvalConfigSchema.choices in tool-types.ts. */
39406
+ choices: external_exports.object({
39407
+ alwaysAllow: external_exports.boolean().optional(),
39408
+ alwaysDeny: external_exports.boolean().optional()
39409
+ }).optional()
39325
39410
  }).optional(),
39326
39411
  perToolLimits: external_exports.record(
39327
39412
  external_exports.string(),
@@ -39536,7 +39621,13 @@ var agentToolsConfigSchema2 = external_exports.object({
39536
39621
  timeout: external_exports.number().positive().optional(),
39537
39622
  /** Opt out of agent-supplied approval reasons (`_approvalReason` schema
39538
39623
  * injection). Default: true. Mirrors approvalConfigSchema in tool-types.ts. */
39539
- requestReason: external_exports.boolean().optional()
39624
+ requestReason: external_exports.boolean().optional(),
39625
+ /** Persistent "always" choices offered at the approval prompt.
39626
+ * Mirrors approvalConfigSchema.choices in tool-types.ts. */
39627
+ choices: external_exports.object({
39628
+ alwaysAllow: external_exports.boolean().optional(),
39629
+ alwaysDeny: external_exports.boolean().optional()
39630
+ }).optional()
39540
39631
  }).optional(),
39541
39632
  perToolLimits: external_exports.record(
39542
39633
  external_exports.string(),
@@ -42509,10 +42600,32 @@ var VirtualAgentSubagentConfigSchema = external_exports.object({
42509
42600
  allowNesting: external_exports.boolean().optional(),
42510
42601
  defaultTimeoutMs: external_exports.number().int().min(1e3).max(6e5).optional()
42511
42602
  });
42603
+ var DispatchClaudeManagedConfigSchema = external_exports.object({
42604
+ setupMode: external_exports.enum(["create", "connect"]).optional(),
42605
+ anthropicAgentId: external_exports.string().optional(),
42606
+ anthropicAgentVersion: external_exports.number().int().optional(),
42607
+ anthropicEnvironmentId: external_exports.string().optional(),
42608
+ model: external_exports.string().optional(),
42609
+ systemPrompt: external_exports.string().optional(),
42610
+ /**
42611
+ * `create` mode only: archive the minted Anthropic agent after the run.
42612
+ * Defaults to `true` (ephemeral). Set `false` to retain it for reuse — the
42613
+ * returned `claudeManagedAgentId` can then be used in a later `connect` run.
42614
+ */
42615
+ autoDelete: external_exports.boolean().optional()
42616
+ });
42512
42617
  var AgentInputSchema = external_exports.object({
42513
42618
  agentId: external_exports.string().optional(),
42514
- name: external_exports.string().min(1),
42515
- model: external_exports.string().min(1),
42619
+ /**
42620
+ * Agent execution kind. Omit (or `runtype`) for the default virtual-agent
42621
+ * loop. `claude_managed` routes the dispatch to the Anthropic-hosted Claude
42622
+ * Managed runner — supply a saved `agentId` (its saved config wins) or, for an
42623
+ * inline run, a connect-mode `claudeManagedConfig`.
42624
+ */
42625
+ agentType: external_exports.enum(["runtype", "claude_managed"]).optional(),
42626
+ claudeManagedConfig: DispatchClaudeManagedConfigSchema.optional(),
42627
+ name: external_exports.string().min(1).optional(),
42628
+ model: external_exports.string().min(1).optional(),
42516
42629
  systemPrompt: external_exports.string().optional(),
42517
42630
  temperature: external_exports.number().min(0).max(2).optional(),
42518
42631
  topP: external_exports.number().min(0).max(1).optional(),
@@ -42540,7 +42653,13 @@ var AgentInputSchema = external_exports.object({
42540
42653
  /** Opt out of agent-supplied approval reasons (`_approvalReason`
42541
42654
  * schema injection). Default: true. Mirrors approvalConfigSchema
42542
42655
  * in tool-types.ts. */
42543
- requestReason: external_exports.boolean().optional()
42656
+ requestReason: external_exports.boolean().optional(),
42657
+ /** Persistent "always" choices offered at the approval prompt.
42658
+ * Mirrors approvalConfigSchema.choices in tool-types.ts. */
42659
+ choices: external_exports.object({
42660
+ alwaysAllow: external_exports.boolean().optional(),
42661
+ alwaysDeny: external_exports.boolean().optional()
42662
+ }).optional()
42544
42663
  }).optional(),
42545
42664
  subagentConfig: VirtualAgentSubagentConfigSchema.optional(),
42546
42665
  codeModeConfig: external_exports.object({
@@ -42556,6 +42675,28 @@ var AgentInputSchema = external_exports.object({
42556
42675
  systemPrompt: external_exports.string().optional()
42557
42676
  }).optional().nullable(),
42558
42677
  memory: memoryConfigSchema.optional()
42678
+ }).superRefine((val, ctx) => {
42679
+ if (val.agentType !== "claude_managed") {
42680
+ if (!val.name) {
42681
+ ctx.addIssue({ code: "custom", path: ["name"], message: "name is required" });
42682
+ }
42683
+ if (!val.model) {
42684
+ ctx.addIssue({ code: "custom", path: ["model"], message: "model is required" });
42685
+ }
42686
+ return;
42687
+ }
42688
+ if (!val.agentId) {
42689
+ const cm = val.claudeManagedConfig;
42690
+ const validConnect = cm?.setupMode === "connect" && !!cm.anthropicAgentId;
42691
+ const validCreate = cm?.setupMode === "create" && !!cm.model;
42692
+ if (!validConnect && !validCreate) {
42693
+ ctx.addIssue({
42694
+ code: "custom",
42695
+ path: ["claudeManagedConfig"],
42696
+ message: 'Inline Claude Managed dispatch requires claudeManagedConfig: "connect" with anthropicAgentId, or "create" with a model. Or reference a saved agent via agentId.'
42697
+ });
42698
+ }
42699
+ }
42559
42700
  });
42560
42701
  var TextContentPartSchema = external_exports.object({
42561
42702
  type: external_exports.literal("text"),
@@ -42809,6 +42950,17 @@ var appRoutingDocSchema = external_exports.object({
42809
42950
  }),
42810
42951
  updatedAt: external_exports.string()
42811
42952
  });
42953
+ var SKILL_SCAN_HARD_BLOCK_CATEGORIES = [
42954
+ "credential_exfiltration",
42955
+ "prompt_injection",
42956
+ "mcp_tool_poisoning",
42957
+ "data_exfiltration",
42958
+ "privilege_escalation"
42959
+ ];
42960
+ function normalizeCategoryToken(value) {
42961
+ return value.toLowerCase().replace(/[^a-z0-9]/g, "");
42962
+ }
42963
+ var HARD_BLOCK_NEEDLES = SKILL_SCAN_HARD_BLOCK_CATEGORIES.map(normalizeCategoryToken);
42812
42964
 
42813
42965
  // src/config/env.ts
42814
42966
  function getApiUrl() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@runtypelabs/cli",
3
- "version": "2.21.2",
3
+ "version": "2.21.3",
4
4
  "description": "Command-line interface for Runtype AI platform",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -24,7 +24,7 @@
24
24
  "rosie-skills": "0.8.1",
25
25
  "yaml": "^2.9.0",
26
26
  "@runtypelabs/ink-components": "0.3.2",
27
- "@runtypelabs/sdk": "4.15.0",
27
+ "@runtypelabs/sdk": "4.16.0",
28
28
  "@runtypelabs/terminal-animations": "0.2.1"
29
29
  },
30
30
  "devDependencies": {
@@ -39,7 +39,7 @@
39
39
  "tsx": "^4.7.1",
40
40
  "typescript": "^5.3.3",
41
41
  "vitest": "^4.1.0",
42
- "@runtypelabs/shared": "1.31.0"
42
+ "@runtypelabs/shared": "1.32.0"
43
43
  },
44
44
  "engines": {
45
45
  "node": ">=22.0.0"