deepline 0.1.214 → 0.1.215

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 (31) hide show
  1. package/dist/bundling-sources/apps/play-runner-workers/src/child-manifest-resolver.ts +107 -0
  2. package/dist/bundling-sources/apps/play-runner-workers/src/coordinator-entry.ts +85 -10
  3. package/dist/bundling-sources/apps/play-runner-workers/src/coordinator-runtime-proxy.ts +34 -0
  4. package/dist/bundling-sources/apps/play-runner-workers/src/entry.ts +50 -36
  5. package/dist/bundling-sources/apps/play-runner-workers/src/runtime/harness-receipt-store.ts +12 -0
  6. package/dist/bundling-sources/apps/play-runner-workers/src/workflow-retry.ts +4 -0
  7. package/dist/bundling-sources/sdk/src/client.ts +1 -2
  8. package/dist/bundling-sources/sdk/src/release.ts +2 -2
  9. package/dist/bundling-sources/sdk/src/types.ts +2 -3
  10. package/dist/bundling-sources/shared_libs/play-runtime/app-runtime-api.ts +21 -3
  11. package/dist/bundling-sources/shared_libs/play-runtime/context.ts +6 -6
  12. package/dist/bundling-sources/shared_libs/play-runtime/durable-receipt-execution.ts +14 -3
  13. package/dist/bundling-sources/shared_libs/play-runtime/governor/governor.ts +19 -0
  14. package/dist/bundling-sources/shared_libs/play-runtime/profiles.ts +22 -0
  15. package/dist/bundling-sources/shared_libs/play-runtime/providers.ts +32 -0
  16. package/dist/bundling-sources/shared_libs/play-runtime/run-failure.ts +13 -0
  17. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-payload-transport.ts +5 -2
  18. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-session-execution.ts +66 -0
  19. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona.ts +18 -55
  20. package/dist/bundling-sources/shared_libs/play-runtime/runtime-api.ts +57 -25
  21. package/dist/bundling-sources/shared_libs/play-runtime/runtime-contract.ts +17 -1
  22. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backend.ts +3 -2
  23. package/dist/bundling-sources/shared_libs/play-runtime/secret-redaction.ts +11 -1
  24. package/dist/bundling-sources/shared_libs/play-runtime/transient-service-error.ts +10 -0
  25. package/dist/cli/index.js +35 -12
  26. package/dist/cli/index.mjs +35 -12
  27. package/dist/index.d.mts +2 -3
  28. package/dist/index.d.ts +2 -3
  29. package/dist/index.js +7 -6
  30. package/dist/index.mjs +7 -6
  31. package/package.json +1 -1
@@ -95,7 +95,7 @@ import {
95
95
  PLAY_RUNTIME_CONTRACT,
96
96
  PLAY_RUNTIME_CONTRACT_HEADER,
97
97
  } from './runtime-contract';
98
- import { PLAY_RUNTIME_API_COMPAT_PATH } from './runtime-api-paths';
98
+ import { PLAY_RUNTIME_API_CURRENT_PATH } from './runtime-api-paths';
99
99
  import {
100
100
  PLAY_RUNTIME_SHEET_ATTEMPT_LEASE_TTL_MS,
101
101
  PLAY_RUNTIME_WORK_RECEIPT_LEASE_TTL_MS,
@@ -298,6 +298,7 @@ const RUNTIME_WORK_RECEIPT_LEASE_COLUMNS = [
298
298
  'lease_expires_at',
299
299
  ] as const;
300
300
  const RUNTIME_WORK_RECEIPT_FAILURE_KIND_COLUMN = 'failure_kind';
301
+ const RUNTIME_WORK_RECEIPT_KEY_INDEX = 'idx_deepline_step_receipts_k_unique';
301
302
  const RUNTIME_WORK_RECEIPT_SELF_HEAL_COLUMNS = [
302
303
  ...RUNTIME_WORK_RECEIPT_LEASE_COLUMNS,
303
304
  RUNTIME_WORK_RECEIPT_FAILURE_KIND_COLUMN,
@@ -504,7 +505,7 @@ function resolveRuntimeApiUrl(context: RuntimeApiContext): string {
504
505
  if (!baseUrl) {
505
506
  throw new Error('Runner runtime API requires a baseUrl.');
506
507
  }
507
- return `${baseUrl.replace(/\/$/, '')}${PLAY_RUNTIME_API_COMPAT_PATH}`;
508
+ return `${baseUrl.replace(/\/$/, '')}${PLAY_RUNTIME_API_CURRENT_PATH}`;
508
509
  }
509
510
 
510
511
  function resolveRuntimeApiHeaders(
@@ -588,9 +589,11 @@ async function postRuntimeApi<TResponse>(
588
589
  const details =
589
590
  typeof parsed?.details === 'string'
590
591
  ? parsed.details
591
- : typeof parsed?.debug_error === 'string'
592
- ? parsed.debug_error
593
- : null;
592
+ : typeof parsed?.detail === 'string'
593
+ ? parsed.detail
594
+ : typeof parsed?.debug_error === 'string'
595
+ ? parsed.debug_error
596
+ : null;
594
597
  const shouldRetryRuntimeResponse =
595
598
  (response.status === 503 &&
596
599
  parsed?.code === 'ingestion_plane_not_ready') ||
@@ -2040,6 +2043,22 @@ function isMissingRuntimeWorkReceiptSelfHealColumnError(
2040
2043
  );
2041
2044
  }
2042
2045
 
2046
+ function isMissingRuntimeWorkReceiptKeyConstraintError(
2047
+ error: unknown,
2048
+ ): boolean {
2049
+ if (!error || typeof error !== 'object') {
2050
+ return false;
2051
+ }
2052
+ const code = 'code' in error ? String(error.code) : '';
2053
+ const message = 'message' in error ? String(error.message) : '';
2054
+ return (
2055
+ code === '42P10' ||
2056
+ /no unique or exclusion constraint matching the ON CONFLICT specification/i.test(
2057
+ message,
2058
+ )
2059
+ );
2060
+ }
2061
+
2043
2062
  function runtimeWorkReceiptEnsureCacheKey(
2044
2063
  session: RuntimePostgresSession,
2045
2064
  ): string {
@@ -2119,22 +2138,29 @@ async function ensureRuntimeWorkReceiptTable(
2119
2138
  session,
2120
2139
  client,
2121
2140
  );
2122
- if (missingColumns.length === 0) return;
2141
+ if (missingColumns.length > 0) {
2142
+ await client.query(`
2143
+ ALTER TABLE ${workReceiptTable(session)}
2144
+ ${missingColumns
2145
+ .map((column) => {
2146
+ const type =
2147
+ column === 'lease_expires_at'
2148
+ ? 'timestamptz'
2149
+ : column === 'lease_owner_attempt'
2150
+ ? 'integer'
2151
+ : column === RUNTIME_WORK_RECEIPT_FAILURE_KIND_COLUMN
2152
+ ? 'smallint NOT NULL DEFAULT 0'
2153
+ : 'text';
2154
+ return `ADD COLUMN IF NOT EXISTS ${column} ${type}`;
2155
+ })
2156
+ .join(',\n ')}
2157
+ `);
2158
+ }
2123
2159
  await client.query(`
2124
- ALTER TABLE ${workReceiptTable(session)}
2125
- ${missingColumns
2126
- .map((column) => {
2127
- const type =
2128
- column === 'lease_expires_at'
2129
- ? 'timestamptz'
2130
- : column === 'lease_owner_attempt'
2131
- ? 'integer'
2132
- : column === RUNTIME_WORK_RECEIPT_FAILURE_KIND_COLUMN
2133
- ? 'smallint NOT NULL DEFAULT 0'
2134
- : 'text';
2135
- return `ADD COLUMN IF NOT EXISTS ${column} ${type}`;
2136
- })
2137
- .join(',\n ')}
2160
+ CREATE UNIQUE INDEX IF NOT EXISTS ${quoteIdentifier(
2161
+ RUNTIME_WORK_RECEIPT_KEY_INDEX,
2162
+ )}
2163
+ ON ${workReceiptTable(session)} (k)
2138
2164
  `);
2139
2165
  })
2140
2166
  .then(() => undefined);
@@ -2238,7 +2264,8 @@ async function withRuntimeWorkReceiptClient<T>(
2238
2264
  } catch (error) {
2239
2265
  if (
2240
2266
  isMissingRelationError(error) ||
2241
- isMissingRuntimeWorkReceiptSelfHealColumnError(error)
2267
+ isMissingRuntimeWorkReceiptSelfHealColumnError(error) ||
2268
+ isMissingRuntimeWorkReceiptKeyConstraintError(error)
2242
2269
  ) {
2243
2270
  runtimeWorkReceiptEnsureCache.delete(
2244
2271
  runtimeWorkReceiptEnsureCacheKey(session),
@@ -4636,6 +4663,7 @@ export async function completeRuntimeWorkReceipt(
4636
4663
  runAttempt?: number | null;
4637
4664
  leaseId?: string | null;
4638
4665
  output: unknown;
4666
+ returnOutput?: boolean;
4639
4667
  },
4640
4668
  ): Promise<WorkReceipt | null> {
4641
4669
  if (
@@ -4741,7 +4769,7 @@ export async function completeRuntimeWorkReceipt(
4741
4769
  })}
4742
4770
  RETURNING convert_from(k, 'UTF8') AS k,
4743
4771
  status,
4744
- output,
4772
+ CASE WHEN $7::boolean THEN output ELSE NULL::jsonb END AS output,
4745
4773
  error,
4746
4774
  failure_kind,
4747
4775
  run_id,
@@ -4754,7 +4782,7 @@ export async function completeRuntimeWorkReceipt(
4754
4782
  replay AS (
4755
4783
  SELECT convert_from(k, 'UTF8') AS k,
4756
4784
  status,
4757
- output,
4785
+ CASE WHEN $7::boolean THEN output ELSE NULL::jsonb END AS output,
4758
4786
  error,
4759
4787
  failure_kind,
4760
4788
  run_id,
@@ -4783,6 +4811,7 @@ export async function completeRuntimeWorkReceipt(
4783
4811
  input.runId,
4784
4812
  leaseId,
4785
4813
  runAttempt,
4814
+ input.returnOutput !== false,
4786
4815
  ],
4787
4816
  );
4788
4817
  return rows[0] ? mapRuntimeWorkReceiptRow(rows[0]) : null;
@@ -4801,6 +4830,7 @@ export async function completeRuntimeWorkReceipts(
4801
4830
  leaseId?: string | null;
4802
4831
  runAttempt?: number | null;
4803
4832
  }>;
4833
+ returnOutput?: boolean;
4804
4834
  },
4805
4835
  ): Promise<Array<WorkReceipt | null>> {
4806
4836
  const receipts = input.receipts.filter((receipt) => receipt.key.trim());
@@ -4819,6 +4849,7 @@ export async function completeRuntimeWorkReceipts(
4819
4849
  await completeRuntimeWorkReceipts(context, {
4820
4850
  playName: input.playName,
4821
4851
  receipts: siblingReceipts,
4852
+ returnOutput: input.returnOutput,
4822
4853
  });
4823
4854
  } catch (error) {
4824
4855
  siblingError = error;
@@ -4938,7 +4969,7 @@ export async function completeRuntimeWorkReceipts(
4938
4969
  })}
4939
4970
  RETURNING target.k,
4940
4971
  target.status,
4941
- target.output,
4972
+ CASE WHEN $7::boolean THEN target.output ELSE NULL::jsonb END AS output,
4942
4973
  target.error,
4943
4974
  target.failure_kind,
4944
4975
  target.run_id,
@@ -4952,7 +4983,7 @@ export async function completeRuntimeWorkReceipts(
4952
4983
  replay AS (
4953
4984
  SELECT target.k,
4954
4985
  target.status,
4955
- target.output,
4986
+ CASE WHEN $7::boolean THEN target.output ELSE NULL::jsonb END AS output,
4956
4987
  target.error,
4957
4988
  target.failure_kind,
4958
4989
  target.run_id,
@@ -5020,6 +5051,7 @@ export async function completeRuntimeWorkReceipts(
5020
5051
  ),
5021
5052
  ),
5022
5053
  RECEIPT_STATUS_COMPLETED,
5054
+ input.returnOutput !== false,
5023
5055
  ],
5024
5056
  );
5025
5057
  return rows.map((row) =>
@@ -1,8 +1,15 @@
1
- export const PLAY_RUNTIME_CONTRACT = 2;
1
+ export const PLAY_RUNTIME_CONTRACT = 3;
2
2
  export const PLAY_RUNTIME_CONTRACT_MIN_SUPPORTED = 1;
3
3
  export const PLAY_RUNTIME_CONTRACT_HEADER = 'x-deepline-runtime-contract';
4
4
 
5
5
  export const RUNTIME_CONTRACT_CHANGELOG = [
6
+ {
7
+ contract: 3,
8
+ changed:
9
+ 'Runtime receipt completion responses are compact acknowledgements; receipt reads remain the payload replay path.',
10
+ compatOwner: 'runtime',
11
+ compatRemoval: 'contract 2 support window closure',
12
+ },
6
13
  {
7
14
  contract: 2,
8
15
  changed:
@@ -12,6 +19,15 @@ export const RUNTIME_CONTRACT_CHANGELOG = [
12
19
  },
13
20
  ] as const;
14
21
 
22
+ export function runtimeReceiptCompletionResponse<
23
+ T extends { output?: unknown },
24
+ >(runtimeContract: number | null | undefined, receipt: T | null): T | null {
25
+ if (!receipt || (runtimeContract ?? 1) < 3) return receipt;
26
+ const { output, ...ack } = receipt;
27
+ void output;
28
+ return ack as T;
29
+ }
30
+
15
31
  export type RuntimeContractResolution =
16
32
  | { ok: true; contract: number }
17
33
  | {
@@ -4,8 +4,9 @@
4
4
  * One of three pluggable axes (alongside runner-backends and dedup-backends).
5
5
  * Selected per-run via PlayExecutionProfile.
6
6
  *
7
- * Absurd is the default production scheduler through the absurd profile.
8
- * Cloudflare Workflows remains available through the workers_edge profile.
7
+ * Absurd is the enabled production scheduler. The Cloudflare Workflows
8
+ * adapter is retained for historical run interpretation while workers_edge
9
+ * launch admission is disabled.
9
10
  *
10
11
  * Customer plays are unaffected — this is purely the orchestration layer.
11
12
  */
@@ -5,10 +5,18 @@ const JWT_RE =
5
5
  /\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/g;
6
6
  const PRIVATE_KEY_RE =
7
7
  /-----BEGIN [A-Z0-9 ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z0-9 ]*PRIVATE KEY-----/g;
8
+ // Only redact self-identifying credential prefixes here. Generic words such as
9
+ // `key`, `token`, and `secret` are common in harmless play/run slugs (for
10
+ // example `absurd-key-rotation-check`) and need an assignment context before
11
+ // they are sensitive; HIGH_ENTROPY_ASSIGNMENT_RE handles that case below.
8
12
  const COMMON_SECRET_RE =
9
- /\b(?:sk|pk|rk|pat|ghp|github_pat|xox[baprs]|key|token|secret|api[_-]?key)[A-Za-z0-9_./+=:-]{12,}\b/gi;
13
+ /\b(?:sk|pk|rk|pat|ghp|github_pat|xox[baprs])[A-Za-z0-9_./+=:-]{12,}\b/gi;
14
+ const GENERIC_PREFIXED_SECRET_RE =
15
+ /\b(?:key|token|secret|api[_-]?key)_[A-Za-z0-9_./+=:-]{12,}\b/gi;
10
16
  const URL_SECRET_VALUE_RE =
11
17
  /\b(?:sk|pk|rk|pat|ghp|github_pat|xox)[A-Za-z0-9_./+=:-]{12,}\b/i;
18
+ const GENERIC_SECRET_ASSIGNMENT_RE =
19
+ /\b(?:api[_-]?key|token|secret|password)\b\s*[:=]\s*["']?[^"',\s]{12,}["']?/gi;
12
20
  const HIGH_ENTROPY_ASSIGNMENT_RE =
13
21
  /\b(?:api[_-]?key|token|secret|password|authorization|access[_-]?token|refresh[_-]?token)\b\s*[:=]\s*["']?[^"',\s]{16,}["']?/gi;
14
22
  const SENSITIVE_URL_PARAM_RE =
@@ -39,6 +47,8 @@ export function redactSecretLikeString(value: string): string {
39
47
  .replace(BEARER_TOKEN_RE, `Bearer ${SECRET_REDACTION_PLACEHOLDER}`)
40
48
  .replace(JWT_RE, SECRET_REDACTION_PLACEHOLDER)
41
49
  .replace(COMMON_SECRET_RE, SECRET_REDACTION_PLACEHOLDER)
50
+ .replace(GENERIC_PREFIXED_SECRET_RE, SECRET_REDACTION_PLACEHOLDER)
51
+ .replace(GENERIC_SECRET_ASSIGNMENT_RE, SECRET_REDACTION_PLACEHOLDER)
42
52
  .replace(HIGH_ENTROPY_ASSIGNMENT_RE, (match) => {
43
53
  const separator = match.includes('=') ? '=' : ':';
44
54
  const [key] = match.split(separator, 1);
@@ -0,0 +1,10 @@
1
+ export function transientServiceUnavailableDetail(
2
+ error: unknown,
3
+ ): string | null {
4
+ const detail = error instanceof Error ? error.message : String(error);
5
+ return /ServiceUnavailable|Service temporarily unavailable|temporarily unavailable \(Code:\s*\d+\)/i.test(
6
+ detail,
7
+ )
8
+ ? detail
9
+ : null;
10
+ }
package/dist/cli/index.js CHANGED
@@ -623,10 +623,10 @@ var SDK_RELEASE = {
623
623
  // 0.1.154 removes the short-lived generated enrich StepOptions recompute
624
624
  // fields shipped in 0.1.153.
625
625
  // 0.1.175 ships loud `deepline enrich` empty-waterfall reporting.
626
- version: "0.1.214",
626
+ version: "0.1.215",
627
627
  apiContract: "2026-06-dataset-handle-results-hard-cutover",
628
628
  supportPolicy: {
629
- latest: "0.1.214",
629
+ latest: "0.1.215",
630
630
  minimumSupported: "0.1.53",
631
631
  deprecatedBelow: "0.1.53",
632
632
  commandMinimumSupported: [
@@ -1364,8 +1364,10 @@ var SECRET_REDACTION_PLACEHOLDER = "[REDACTED_SECRET]";
1364
1364
  var BEARER_TOKEN_RE = /\bBearer\s+[A-Za-z0-9._~+/=-]{12,}\b/g;
1365
1365
  var JWT_RE = /\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/g;
1366
1366
  var PRIVATE_KEY_RE = /-----BEGIN [A-Z0-9 ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z0-9 ]*PRIVATE KEY-----/g;
1367
- var COMMON_SECRET_RE = /\b(?:sk|pk|rk|pat|ghp|github_pat|xox[baprs]|key|token|secret|api[_-]?key)[A-Za-z0-9_./+=:-]{12,}\b/gi;
1367
+ var COMMON_SECRET_RE = /\b(?:sk|pk|rk|pat|ghp|github_pat|xox[baprs])[A-Za-z0-9_./+=:-]{12,}\b/gi;
1368
+ var GENERIC_PREFIXED_SECRET_RE = /\b(?:key|token|secret|api[_-]?key)_[A-Za-z0-9_./+=:-]{12,}\b/gi;
1368
1369
  var URL_SECRET_VALUE_RE = /\b(?:sk|pk|rk|pat|ghp|github_pat|xox)[A-Za-z0-9_./+=:-]{12,}\b/i;
1370
+ var GENERIC_SECRET_ASSIGNMENT_RE = /\b(?:api[_-]?key|token|secret|password)\b\s*[:=]\s*["']?[^"',\s]{12,}["']?/gi;
1369
1371
  var HIGH_ENTROPY_ASSIGNMENT_RE = /\b(?:api[_-]?key|token|secret|password|authorization|access[_-]?token|refresh[_-]?token)\b\s*[:=]\s*["']?[^"',\s]{16,}["']?/gi;
1370
1372
  var SENSITIVE_URL_PARAM_RE = /[?#&](?:\w*(?:key|token)|secret|password|authorization|credential|signature|sig)(?:=|$)/i;
1371
1373
  function escapeRegExp(value) {
@@ -1382,7 +1384,7 @@ function redactSecretLikeString(value) {
1382
1384
  }
1383
1385
  if (!URL_SECRET_VALUE_RE.test(value)) return value;
1384
1386
  }
1385
- return value.replace(PRIVATE_KEY_RE, SECRET_REDACTION_PLACEHOLDER).replace(BEARER_TOKEN_RE, `Bearer ${SECRET_REDACTION_PLACEHOLDER}`).replace(JWT_RE, SECRET_REDACTION_PLACEHOLDER).replace(COMMON_SECRET_RE, SECRET_REDACTION_PLACEHOLDER).replace(HIGH_ENTROPY_ASSIGNMENT_RE, (match) => {
1387
+ return value.replace(PRIVATE_KEY_RE, SECRET_REDACTION_PLACEHOLDER).replace(BEARER_TOKEN_RE, `Bearer ${SECRET_REDACTION_PLACEHOLDER}`).replace(JWT_RE, SECRET_REDACTION_PLACEHOLDER).replace(COMMON_SECRET_RE, SECRET_REDACTION_PLACEHOLDER).replace(GENERIC_PREFIXED_SECRET_RE, SECRET_REDACTION_PLACEHOLDER).replace(GENERIC_SECRET_ASSIGNMENT_RE, SECRET_REDACTION_PLACEHOLDER).replace(HIGH_ENTROPY_ASSIGNMENT_RE, (match) => {
1386
1388
  const separator = match.includes("=") ? "=" : ":";
1387
1389
  const [key] = match.split(separator, 1);
1388
1390
  return `${key.trim()}${separator}${SECRET_REDACTION_PLACEHOLDER}`;
@@ -3047,8 +3049,7 @@ var DeeplineClient = class {
3047
3049
  ...forceToolRefresh ? { forceToolRefresh: true } : {},
3048
3050
  ...typeof request.waitForCompletionMs === "number" ? { waitForCompletionMs: request.waitForCompletionMs } : {},
3049
3051
  // Profile selection is the API's job, not the CLI's. The server
3050
- // defaults to absurd; callers that need workers_edge pass
3051
- // `request.profile` explicitly.
3052
+ // defaults to absurd; callers normally omit this field.
3052
3053
  ...request.profile ? { profile: request.profile } : {},
3053
3054
  ...integrationMode ? { integrationMode } : {},
3054
3055
  ...testPolicyOverrides ? { testPolicyOverrides } : {}
@@ -10763,6 +10764,18 @@ var PLAY_RUNTIME_PROVIDER_IDS = {
10763
10764
  workersEdge: "workers_edge",
10764
10765
  absurd: "absurd"
10765
10766
  };
10767
+ var PLAY_RUNTIME_PROVIDER_DISABLED_CODE = "PLAY_RUNTIME_PROVIDER_DISABLED";
10768
+ var PlayRuntimeProviderDisabledError = class extends Error {
10769
+ code = PLAY_RUNTIME_PROVIDER_DISABLED_CODE;
10770
+ profile;
10771
+ constructor(profile) {
10772
+ super(
10773
+ `Play runtime profile "${profile}" is disabled. Deepline runs now execute on the "absurd" profile.`
10774
+ );
10775
+ this.name = "PlayRuntimeProviderDisabledError";
10776
+ this.profile = profile;
10777
+ }
10778
+ };
10766
10779
  var PLAY_RUNTIME_PROVIDERS = {
10767
10780
  workers_edge: {
10768
10781
  id: PLAY_RUNTIME_PROVIDER_IDS.workersEdge,
@@ -10787,6 +10800,11 @@ var PLAY_RUNTIME_PROVIDERS = {
10787
10800
  function defaultPlayRuntimeProvider() {
10788
10801
  return PLAY_RUNTIME_PROVIDERS.absurd;
10789
10802
  }
10803
+ function assertPlayRuntimeProviderEnabled(provider) {
10804
+ if (provider.id === PLAY_RUNTIME_PROVIDER_IDS.workersEdge) {
10805
+ throw new PlayRuntimeProviderDisabledError(provider.id);
10806
+ }
10807
+ }
10790
10808
  function resolvePlayRuntimeProvider(override) {
10791
10809
  if (override?.trim()) {
10792
10810
  const id = override.trim();
@@ -10801,17 +10819,22 @@ function resolvePlayRuntimeProvider(override) {
10801
10819
  }
10802
10820
  return defaultPlayRuntimeProvider();
10803
10821
  }
10822
+ function resolveEnabledPlayRuntimeProvider(override) {
10823
+ const provider = resolvePlayRuntimeProvider(override);
10824
+ assertPlayRuntimeProviderEnabled(provider);
10825
+ return provider;
10826
+ }
10804
10827
 
10805
10828
  // ../shared_libs/play-runtime/profiles.ts
10806
10829
  var PLAY_EXECUTION_PROFILE_IDS = {
10807
10830
  ...PLAY_RUNTIME_PROVIDER_IDS
10808
10831
  };
10809
10832
  var PLAY_EXECUTION_PROFILES = PLAY_RUNTIME_PROVIDERS;
10810
- function resolveExecutionProfile(override) {
10833
+ function resolveEnabledExecutionProfile(override) {
10811
10834
  try {
10812
- return resolvePlayRuntimeProvider(override);
10835
+ return resolveEnabledPlayRuntimeProvider(override);
10813
10836
  } catch (error) {
10814
- if (override?.trim()) {
10837
+ if (override?.trim() && error instanceof Error && /Unsupported play runtime provider/.test(error.message)) {
10815
10838
  throw new Error(
10816
10839
  `Unknown execution profile "${override.trim()}". Expected one of: ${Object.keys(
10817
10840
  PLAY_EXECUTION_PROFILES
@@ -11759,7 +11782,7 @@ async function collectBundledPlayGraph(entryFile, profile = null) {
11759
11782
  const playBundler = await loadPlayBundler();
11760
11783
  const nodes = /* @__PURE__ */ new Map();
11761
11784
  const visiting = /* @__PURE__ */ new Set();
11762
- const artifactKind = resolveExecutionProfile(profile).artifactKind;
11785
+ const artifactKind = resolveEnabledExecutionProfile(profile).artifactKind;
11763
11786
  const visit = async (filePath) => {
11764
11787
  const absolutePath = normalizePlayPath(filePath);
11765
11788
  const cached = nodes.get(absolutePath);
@@ -14473,7 +14496,7 @@ function writeStartedPlayRun(input2) {
14473
14496
  );
14474
14497
  }
14475
14498
  function parsePlayRunOptions(args) {
14476
- const usage = "Usage: deepline plays run <play-name> [--input '{...}'] [--no-wait] [--tail-timeout-ms 30000] [--force] [--full] [--<input> value]\n deepline plays run <play-file.ts> [--input '{...}'] [--no-wait] [--tail-timeout-ms 30000] [--force] [--full] [--<input> value]\n deepline plays run --file <play-file.ts> [--input '{...}'] [--profile <id>] [--no-wait] [--tail-timeout-ms 30000] [--force] [--full] [--<input> value]\n deepline plays run --name <name> [--input '{...}'] [--profile <id>] [--live|--latest|--revision-id <id>] [--no-wait] [--tail-timeout-ms 30000] [--force] [--no-open] [--json] [--full] [--<input> value]\n Production defaults to absurd. Use --profile workers_edge only for an explicit Cloudflare run.\n Unknown --<input> value flags, such as --limit 5, are passed into play input.\nRun `deepline plays run --help` for idempotent call caching and ctx.dataset guidance.";
14499
+ const usage = "Usage: deepline plays run <play-name> [--input '{...}'] [--no-wait] [--tail-timeout-ms 30000] [--force] [--full] [--<input> value]\n deepline plays run <play-file.ts> [--input '{...}'] [--no-wait] [--tail-timeout-ms 30000] [--force] [--full] [--<input> value]\n deepline plays run --file <play-file.ts> [--input '{...}'] [--profile <id>] [--no-wait] [--tail-timeout-ms 30000] [--force] [--full] [--<input> value]\n deepline plays run --name <name> [--input '{...}'] [--profile <id>] [--live|--latest|--revision-id <id>] [--no-wait] [--tail-timeout-ms 30000] [--force] [--no-open] [--json] [--full] [--<input> value]\n Runs default to absurd. The workers_edge profile is disabled.\n Unknown --<input> value flags, such as --limit 5, are passed into play input.\nRun `deepline plays run --help` for idempotent call caching and ctx.dataset guidance.";
14477
14500
  let filePath = null;
14478
14501
  let playName = null;
14479
14502
  let input2 = null;
@@ -14512,7 +14535,7 @@ function parsePlayRunOptions(args) {
14512
14535
  throw new Error("--profile requires an execution profile id.");
14513
14536
  }
14514
14537
  profile = value.trim();
14515
- resolveExecutionProfile(profile);
14538
+ resolveEnabledExecutionProfile(profile);
14516
14539
  index += 1;
14517
14540
  continue;
14518
14541
  }
@@ -608,10 +608,10 @@ var SDK_RELEASE = {
608
608
  // 0.1.154 removes the short-lived generated enrich StepOptions recompute
609
609
  // fields shipped in 0.1.153.
610
610
  // 0.1.175 ships loud `deepline enrich` empty-waterfall reporting.
611
- version: "0.1.214",
611
+ version: "0.1.215",
612
612
  apiContract: "2026-06-dataset-handle-results-hard-cutover",
613
613
  supportPolicy: {
614
- latest: "0.1.214",
614
+ latest: "0.1.215",
615
615
  minimumSupported: "0.1.53",
616
616
  deprecatedBelow: "0.1.53",
617
617
  commandMinimumSupported: [
@@ -1349,8 +1349,10 @@ var SECRET_REDACTION_PLACEHOLDER = "[REDACTED_SECRET]";
1349
1349
  var BEARER_TOKEN_RE = /\bBearer\s+[A-Za-z0-9._~+/=-]{12,}\b/g;
1350
1350
  var JWT_RE = /\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/g;
1351
1351
  var PRIVATE_KEY_RE = /-----BEGIN [A-Z0-9 ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z0-9 ]*PRIVATE KEY-----/g;
1352
- var COMMON_SECRET_RE = /\b(?:sk|pk|rk|pat|ghp|github_pat|xox[baprs]|key|token|secret|api[_-]?key)[A-Za-z0-9_./+=:-]{12,}\b/gi;
1352
+ var COMMON_SECRET_RE = /\b(?:sk|pk|rk|pat|ghp|github_pat|xox[baprs])[A-Za-z0-9_./+=:-]{12,}\b/gi;
1353
+ var GENERIC_PREFIXED_SECRET_RE = /\b(?:key|token|secret|api[_-]?key)_[A-Za-z0-9_./+=:-]{12,}\b/gi;
1353
1354
  var URL_SECRET_VALUE_RE = /\b(?:sk|pk|rk|pat|ghp|github_pat|xox)[A-Za-z0-9_./+=:-]{12,}\b/i;
1355
+ var GENERIC_SECRET_ASSIGNMENT_RE = /\b(?:api[_-]?key|token|secret|password)\b\s*[:=]\s*["']?[^"',\s]{12,}["']?/gi;
1354
1356
  var HIGH_ENTROPY_ASSIGNMENT_RE = /\b(?:api[_-]?key|token|secret|password|authorization|access[_-]?token|refresh[_-]?token)\b\s*[:=]\s*["']?[^"',\s]{16,}["']?/gi;
1355
1357
  var SENSITIVE_URL_PARAM_RE = /[?#&](?:\w*(?:key|token)|secret|password|authorization|credential|signature|sig)(?:=|$)/i;
1356
1358
  function escapeRegExp(value) {
@@ -1367,7 +1369,7 @@ function redactSecretLikeString(value) {
1367
1369
  }
1368
1370
  if (!URL_SECRET_VALUE_RE.test(value)) return value;
1369
1371
  }
1370
- return value.replace(PRIVATE_KEY_RE, SECRET_REDACTION_PLACEHOLDER).replace(BEARER_TOKEN_RE, `Bearer ${SECRET_REDACTION_PLACEHOLDER}`).replace(JWT_RE, SECRET_REDACTION_PLACEHOLDER).replace(COMMON_SECRET_RE, SECRET_REDACTION_PLACEHOLDER).replace(HIGH_ENTROPY_ASSIGNMENT_RE, (match) => {
1372
+ return value.replace(PRIVATE_KEY_RE, SECRET_REDACTION_PLACEHOLDER).replace(BEARER_TOKEN_RE, `Bearer ${SECRET_REDACTION_PLACEHOLDER}`).replace(JWT_RE, SECRET_REDACTION_PLACEHOLDER).replace(COMMON_SECRET_RE, SECRET_REDACTION_PLACEHOLDER).replace(GENERIC_PREFIXED_SECRET_RE, SECRET_REDACTION_PLACEHOLDER).replace(GENERIC_SECRET_ASSIGNMENT_RE, SECRET_REDACTION_PLACEHOLDER).replace(HIGH_ENTROPY_ASSIGNMENT_RE, (match) => {
1371
1373
  const separator = match.includes("=") ? "=" : ":";
1372
1374
  const [key] = match.split(separator, 1);
1373
1375
  return `${key.trim()}${separator}${SECRET_REDACTION_PLACEHOLDER}`;
@@ -3032,8 +3034,7 @@ var DeeplineClient = class {
3032
3034
  ...forceToolRefresh ? { forceToolRefresh: true } : {},
3033
3035
  ...typeof request.waitForCompletionMs === "number" ? { waitForCompletionMs: request.waitForCompletionMs } : {},
3034
3036
  // Profile selection is the API's job, not the CLI's. The server
3035
- // defaults to absurd; callers that need workers_edge pass
3036
- // `request.profile` explicitly.
3037
+ // defaults to absurd; callers normally omit this field.
3037
3038
  ...request.profile ? { profile: request.profile } : {},
3038
3039
  ...integrationMode ? { integrationMode } : {},
3039
3040
  ...testPolicyOverrides ? { testPolicyOverrides } : {}
@@ -10792,6 +10793,18 @@ var PLAY_RUNTIME_PROVIDER_IDS = {
10792
10793
  workersEdge: "workers_edge",
10793
10794
  absurd: "absurd"
10794
10795
  };
10796
+ var PLAY_RUNTIME_PROVIDER_DISABLED_CODE = "PLAY_RUNTIME_PROVIDER_DISABLED";
10797
+ var PlayRuntimeProviderDisabledError = class extends Error {
10798
+ code = PLAY_RUNTIME_PROVIDER_DISABLED_CODE;
10799
+ profile;
10800
+ constructor(profile) {
10801
+ super(
10802
+ `Play runtime profile "${profile}" is disabled. Deepline runs now execute on the "absurd" profile.`
10803
+ );
10804
+ this.name = "PlayRuntimeProviderDisabledError";
10805
+ this.profile = profile;
10806
+ }
10807
+ };
10795
10808
  var PLAY_RUNTIME_PROVIDERS = {
10796
10809
  workers_edge: {
10797
10810
  id: PLAY_RUNTIME_PROVIDER_IDS.workersEdge,
@@ -10816,6 +10829,11 @@ var PLAY_RUNTIME_PROVIDERS = {
10816
10829
  function defaultPlayRuntimeProvider() {
10817
10830
  return PLAY_RUNTIME_PROVIDERS.absurd;
10818
10831
  }
10832
+ function assertPlayRuntimeProviderEnabled(provider) {
10833
+ if (provider.id === PLAY_RUNTIME_PROVIDER_IDS.workersEdge) {
10834
+ throw new PlayRuntimeProviderDisabledError(provider.id);
10835
+ }
10836
+ }
10819
10837
  function resolvePlayRuntimeProvider(override) {
10820
10838
  if (override?.trim()) {
10821
10839
  const id = override.trim();
@@ -10830,17 +10848,22 @@ function resolvePlayRuntimeProvider(override) {
10830
10848
  }
10831
10849
  return defaultPlayRuntimeProvider();
10832
10850
  }
10851
+ function resolveEnabledPlayRuntimeProvider(override) {
10852
+ const provider = resolvePlayRuntimeProvider(override);
10853
+ assertPlayRuntimeProviderEnabled(provider);
10854
+ return provider;
10855
+ }
10833
10856
 
10834
10857
  // ../shared_libs/play-runtime/profiles.ts
10835
10858
  var PLAY_EXECUTION_PROFILE_IDS = {
10836
10859
  ...PLAY_RUNTIME_PROVIDER_IDS
10837
10860
  };
10838
10861
  var PLAY_EXECUTION_PROFILES = PLAY_RUNTIME_PROVIDERS;
10839
- function resolveExecutionProfile(override) {
10862
+ function resolveEnabledExecutionProfile(override) {
10840
10863
  try {
10841
- return resolvePlayRuntimeProvider(override);
10864
+ return resolveEnabledPlayRuntimeProvider(override);
10842
10865
  } catch (error) {
10843
- if (override?.trim()) {
10866
+ if (override?.trim() && error instanceof Error && /Unsupported play runtime provider/.test(error.message)) {
10844
10867
  throw new Error(
10845
10868
  `Unknown execution profile "${override.trim()}". Expected one of: ${Object.keys(
10846
10869
  PLAY_EXECUTION_PROFILES
@@ -11788,7 +11811,7 @@ async function collectBundledPlayGraph(entryFile, profile = null) {
11788
11811
  const playBundler = await loadPlayBundler();
11789
11812
  const nodes = /* @__PURE__ */ new Map();
11790
11813
  const visiting = /* @__PURE__ */ new Set();
11791
- const artifactKind = resolveExecutionProfile(profile).artifactKind;
11814
+ const artifactKind = resolveEnabledExecutionProfile(profile).artifactKind;
11792
11815
  const visit = async (filePath) => {
11793
11816
  const absolutePath = normalizePlayPath(filePath);
11794
11817
  const cached = nodes.get(absolutePath);
@@ -14502,7 +14525,7 @@ function writeStartedPlayRun(input2) {
14502
14525
  );
14503
14526
  }
14504
14527
  function parsePlayRunOptions(args) {
14505
- const usage = "Usage: deepline plays run <play-name> [--input '{...}'] [--no-wait] [--tail-timeout-ms 30000] [--force] [--full] [--<input> value]\n deepline plays run <play-file.ts> [--input '{...}'] [--no-wait] [--tail-timeout-ms 30000] [--force] [--full] [--<input> value]\n deepline plays run --file <play-file.ts> [--input '{...}'] [--profile <id>] [--no-wait] [--tail-timeout-ms 30000] [--force] [--full] [--<input> value]\n deepline plays run --name <name> [--input '{...}'] [--profile <id>] [--live|--latest|--revision-id <id>] [--no-wait] [--tail-timeout-ms 30000] [--force] [--no-open] [--json] [--full] [--<input> value]\n Production defaults to absurd. Use --profile workers_edge only for an explicit Cloudflare run.\n Unknown --<input> value flags, such as --limit 5, are passed into play input.\nRun `deepline plays run --help` for idempotent call caching and ctx.dataset guidance.";
14528
+ const usage = "Usage: deepline plays run <play-name> [--input '{...}'] [--no-wait] [--tail-timeout-ms 30000] [--force] [--full] [--<input> value]\n deepline plays run <play-file.ts> [--input '{...}'] [--no-wait] [--tail-timeout-ms 30000] [--force] [--full] [--<input> value]\n deepline plays run --file <play-file.ts> [--input '{...}'] [--profile <id>] [--no-wait] [--tail-timeout-ms 30000] [--force] [--full] [--<input> value]\n deepline plays run --name <name> [--input '{...}'] [--profile <id>] [--live|--latest|--revision-id <id>] [--no-wait] [--tail-timeout-ms 30000] [--force] [--no-open] [--json] [--full] [--<input> value]\n Runs default to absurd. The workers_edge profile is disabled.\n Unknown --<input> value flags, such as --limit 5, are passed into play input.\nRun `deepline plays run --help` for idempotent call caching and ctx.dataset guidance.";
14506
14529
  let filePath = null;
14507
14530
  let playName = null;
14508
14531
  let input2 = null;
@@ -14541,7 +14564,7 @@ function parsePlayRunOptions(args) {
14541
14564
  throw new Error("--profile requires an execution profile id.");
14542
14565
  }
14543
14566
  profile = value.trim();
14544
- resolveExecutionProfile(profile);
14567
+ resolveEnabledExecutionProfile(profile);
14545
14568
  index += 1;
14546
14569
  continue;
14547
14570
  }
package/dist/index.d.mts CHANGED
@@ -1085,9 +1085,8 @@ interface StartPlayRunRequest {
1085
1085
  /** Optionally let the start request wait briefly and return a terminal result. */
1086
1086
  waitForCompletionMs?: number;
1087
1087
  /**
1088
- * Per-run execution profile override. The server defaults to absurd;
1089
- * callers that need workers_edge can pass it here. Most callers should leave
1090
- * this unset.
1088
+ * Per-run execution profile override. The server defaults to absurd. The
1089
+ * workers_edge profile is disabled; most callers should leave this unset.
1091
1090
  */
1092
1091
  profile?: string;
1093
1092
  /** Optional per-run provider execution mode for eval/smoke runs. */
package/dist/index.d.ts CHANGED
@@ -1085,9 +1085,8 @@ interface StartPlayRunRequest {
1085
1085
  /** Optionally let the start request wait briefly and return a terminal result. */
1086
1086
  waitForCompletionMs?: number;
1087
1087
  /**
1088
- * Per-run execution profile override. The server defaults to absurd;
1089
- * callers that need workers_edge can pass it here. Most callers should leave
1090
- * this unset.
1088
+ * Per-run execution profile override. The server defaults to absurd. The
1089
+ * workers_edge profile is disabled; most callers should leave this unset.
1091
1090
  */
1092
1091
  profile?: string;
1093
1092
  /** Optional per-run provider execution mode for eval/smoke runs. */
package/dist/index.js CHANGED
@@ -422,10 +422,10 @@ var SDK_RELEASE = {
422
422
  // 0.1.154 removes the short-lived generated enrich StepOptions recompute
423
423
  // fields shipped in 0.1.153.
424
424
  // 0.1.175 ships loud `deepline enrich` empty-waterfall reporting.
425
- version: "0.1.214",
425
+ version: "0.1.215",
426
426
  apiContract: "2026-06-dataset-handle-results-hard-cutover",
427
427
  supportPolicy: {
428
- latest: "0.1.214",
428
+ latest: "0.1.215",
429
429
  minimumSupported: "0.1.53",
430
430
  deprecatedBelow: "0.1.53",
431
431
  commandMinimumSupported: [
@@ -1163,8 +1163,10 @@ var SECRET_REDACTION_PLACEHOLDER = "[REDACTED_SECRET]";
1163
1163
  var BEARER_TOKEN_RE = /\bBearer\s+[A-Za-z0-9._~+/=-]{12,}\b/g;
1164
1164
  var JWT_RE = /\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/g;
1165
1165
  var PRIVATE_KEY_RE = /-----BEGIN [A-Z0-9 ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z0-9 ]*PRIVATE KEY-----/g;
1166
- var COMMON_SECRET_RE = /\b(?:sk|pk|rk|pat|ghp|github_pat|xox[baprs]|key|token|secret|api[_-]?key)[A-Za-z0-9_./+=:-]{12,}\b/gi;
1166
+ var COMMON_SECRET_RE = /\b(?:sk|pk|rk|pat|ghp|github_pat|xox[baprs])[A-Za-z0-9_./+=:-]{12,}\b/gi;
1167
+ var GENERIC_PREFIXED_SECRET_RE = /\b(?:key|token|secret|api[_-]?key)_[A-Za-z0-9_./+=:-]{12,}\b/gi;
1167
1168
  var URL_SECRET_VALUE_RE = /\b(?:sk|pk|rk|pat|ghp|github_pat|xox)[A-Za-z0-9_./+=:-]{12,}\b/i;
1169
+ var GENERIC_SECRET_ASSIGNMENT_RE = /\b(?:api[_-]?key|token|secret|password)\b\s*[:=]\s*["']?[^"',\s]{12,}["']?/gi;
1168
1170
  var HIGH_ENTROPY_ASSIGNMENT_RE = /\b(?:api[_-]?key|token|secret|password|authorization|access[_-]?token|refresh[_-]?token)\b\s*[:=]\s*["']?[^"',\s]{16,}["']?/gi;
1169
1171
  var SENSITIVE_URL_PARAM_RE = /[?#&](?:\w*(?:key|token)|secret|password|authorization|credential|signature|sig)(?:=|$)/i;
1170
1172
  function escapeRegExp(value) {
@@ -1181,7 +1183,7 @@ function redactSecretLikeString(value) {
1181
1183
  }
1182
1184
  if (!URL_SECRET_VALUE_RE.test(value)) return value;
1183
1185
  }
1184
- return value.replace(PRIVATE_KEY_RE, SECRET_REDACTION_PLACEHOLDER).replace(BEARER_TOKEN_RE, `Bearer ${SECRET_REDACTION_PLACEHOLDER}`).replace(JWT_RE, SECRET_REDACTION_PLACEHOLDER).replace(COMMON_SECRET_RE, SECRET_REDACTION_PLACEHOLDER).replace(HIGH_ENTROPY_ASSIGNMENT_RE, (match) => {
1186
+ return value.replace(PRIVATE_KEY_RE, SECRET_REDACTION_PLACEHOLDER).replace(BEARER_TOKEN_RE, `Bearer ${SECRET_REDACTION_PLACEHOLDER}`).replace(JWT_RE, SECRET_REDACTION_PLACEHOLDER).replace(COMMON_SECRET_RE, SECRET_REDACTION_PLACEHOLDER).replace(GENERIC_PREFIXED_SECRET_RE, SECRET_REDACTION_PLACEHOLDER).replace(GENERIC_SECRET_ASSIGNMENT_RE, SECRET_REDACTION_PLACEHOLDER).replace(HIGH_ENTROPY_ASSIGNMENT_RE, (match) => {
1185
1187
  const separator = match.includes("=") ? "=" : ":";
1186
1188
  const [key] = match.split(separator, 1);
1187
1189
  return `${key.trim()}${separator}${SECRET_REDACTION_PLACEHOLDER}`;
@@ -2846,8 +2848,7 @@ var DeeplineClient = class {
2846
2848
  ...forceToolRefresh ? { forceToolRefresh: true } : {},
2847
2849
  ...typeof request.waitForCompletionMs === "number" ? { waitForCompletionMs: request.waitForCompletionMs } : {},
2848
2850
  // Profile selection is the API's job, not the CLI's. The server
2849
- // defaults to absurd; callers that need workers_edge pass
2850
- // `request.profile` explicitly.
2851
+ // defaults to absurd; callers normally omit this field.
2851
2852
  ...request.profile ? { profile: request.profile } : {},
2852
2853
  ...integrationMode ? { integrationMode } : {},
2853
2854
  ...testPolicyOverrides ? { testPolicyOverrides } : {}
package/dist/index.mjs CHANGED
@@ -352,10 +352,10 @@ var SDK_RELEASE = {
352
352
  // 0.1.154 removes the short-lived generated enrich StepOptions recompute
353
353
  // fields shipped in 0.1.153.
354
354
  // 0.1.175 ships loud `deepline enrich` empty-waterfall reporting.
355
- version: "0.1.214",
355
+ version: "0.1.215",
356
356
  apiContract: "2026-06-dataset-handle-results-hard-cutover",
357
357
  supportPolicy: {
358
- latest: "0.1.214",
358
+ latest: "0.1.215",
359
359
  minimumSupported: "0.1.53",
360
360
  deprecatedBelow: "0.1.53",
361
361
  commandMinimumSupported: [
@@ -1093,8 +1093,10 @@ var SECRET_REDACTION_PLACEHOLDER = "[REDACTED_SECRET]";
1093
1093
  var BEARER_TOKEN_RE = /\bBearer\s+[A-Za-z0-9._~+/=-]{12,}\b/g;
1094
1094
  var JWT_RE = /\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/g;
1095
1095
  var PRIVATE_KEY_RE = /-----BEGIN [A-Z0-9 ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z0-9 ]*PRIVATE KEY-----/g;
1096
- var COMMON_SECRET_RE = /\b(?:sk|pk|rk|pat|ghp|github_pat|xox[baprs]|key|token|secret|api[_-]?key)[A-Za-z0-9_./+=:-]{12,}\b/gi;
1096
+ var COMMON_SECRET_RE = /\b(?:sk|pk|rk|pat|ghp|github_pat|xox[baprs])[A-Za-z0-9_./+=:-]{12,}\b/gi;
1097
+ var GENERIC_PREFIXED_SECRET_RE = /\b(?:key|token|secret|api[_-]?key)_[A-Za-z0-9_./+=:-]{12,}\b/gi;
1097
1098
  var URL_SECRET_VALUE_RE = /\b(?:sk|pk|rk|pat|ghp|github_pat|xox)[A-Za-z0-9_./+=:-]{12,}\b/i;
1099
+ var GENERIC_SECRET_ASSIGNMENT_RE = /\b(?:api[_-]?key|token|secret|password)\b\s*[:=]\s*["']?[^"',\s]{12,}["']?/gi;
1098
1100
  var HIGH_ENTROPY_ASSIGNMENT_RE = /\b(?:api[_-]?key|token|secret|password|authorization|access[_-]?token|refresh[_-]?token)\b\s*[:=]\s*["']?[^"',\s]{16,}["']?/gi;
1099
1101
  var SENSITIVE_URL_PARAM_RE = /[?#&](?:\w*(?:key|token)|secret|password|authorization|credential|signature|sig)(?:=|$)/i;
1100
1102
  function escapeRegExp(value) {
@@ -1111,7 +1113,7 @@ function redactSecretLikeString(value) {
1111
1113
  }
1112
1114
  if (!URL_SECRET_VALUE_RE.test(value)) return value;
1113
1115
  }
1114
- return value.replace(PRIVATE_KEY_RE, SECRET_REDACTION_PLACEHOLDER).replace(BEARER_TOKEN_RE, `Bearer ${SECRET_REDACTION_PLACEHOLDER}`).replace(JWT_RE, SECRET_REDACTION_PLACEHOLDER).replace(COMMON_SECRET_RE, SECRET_REDACTION_PLACEHOLDER).replace(HIGH_ENTROPY_ASSIGNMENT_RE, (match) => {
1116
+ return value.replace(PRIVATE_KEY_RE, SECRET_REDACTION_PLACEHOLDER).replace(BEARER_TOKEN_RE, `Bearer ${SECRET_REDACTION_PLACEHOLDER}`).replace(JWT_RE, SECRET_REDACTION_PLACEHOLDER).replace(COMMON_SECRET_RE, SECRET_REDACTION_PLACEHOLDER).replace(GENERIC_PREFIXED_SECRET_RE, SECRET_REDACTION_PLACEHOLDER).replace(GENERIC_SECRET_ASSIGNMENT_RE, SECRET_REDACTION_PLACEHOLDER).replace(HIGH_ENTROPY_ASSIGNMENT_RE, (match) => {
1115
1117
  const separator = match.includes("=") ? "=" : ":";
1116
1118
  const [key] = match.split(separator, 1);
1117
1119
  return `${key.trim()}${separator}${SECRET_REDACTION_PLACEHOLDER}`;
@@ -2776,8 +2778,7 @@ var DeeplineClient = class {
2776
2778
  ...forceToolRefresh ? { forceToolRefresh: true } : {},
2777
2779
  ...typeof request.waitForCompletionMs === "number" ? { waitForCompletionMs: request.waitForCompletionMs } : {},
2778
2780
  // Profile selection is the API's job, not the CLI's. The server
2779
- // defaults to absurd; callers that need workers_edge pass
2780
- // `request.profile` explicitly.
2781
+ // defaults to absurd; callers normally omit this field.
2781
2782
  ...request.profile ? { profile: request.profile } : {},
2782
2783
  ...integrationMode ? { integrationMode } : {},
2783
2784
  ...testPolicyOverrides ? { testPolicyOverrides } : {}