deepline 0.1.252 → 0.1.254

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 (25) hide show
  1. package/dist/bundling-sources/sdk/src/release.ts +8 -7
  2. package/dist/bundling-sources/sdk/src/types.ts +2 -0
  3. package/dist/bundling-sources/shared_libs/play-runtime/context.ts +261 -162
  4. package/dist/bundling-sources/shared_libs/play-runtime/governor/governor.ts +37 -35
  5. package/dist/bundling-sources/shared_libs/play-runtime/ledger-safe-payload.ts +20 -5
  6. package/dist/bundling-sources/shared_libs/play-runtime/output-size-limits.ts +462 -29
  7. package/dist/bundling-sources/shared_libs/play-runtime/protocol.ts +16 -0
  8. package/dist/bundling-sources/shared_libs/play-runtime/resource-governor.ts +11 -0
  9. package/dist/bundling-sources/shared_libs/play-runtime/run-failure.ts +44 -1
  10. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-lifecycle.ts +7 -4
  11. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-payload-transport.ts +98 -13
  12. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-runtime-watchdog.ts +117 -0
  13. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona.ts +19 -3
  14. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/types.ts +1 -0
  15. package/dist/bundling-sources/shared_libs/play-runtime/runtime-api-paths.ts +4 -0
  16. package/dist/bundling-sources/shared_libs/play-runtime/runtime-constants.ts +13 -0
  17. package/dist/bundling-sources/shared_libs/play-runtime/runtime-contract.ts +22 -0
  18. package/dist/bundling-sources/shared_libs/play-runtime/secret-resolution-retry-policy.ts +80 -0
  19. package/dist/cli/index.js +80 -51
  20. package/dist/cli/index.mjs +80 -51
  21. package/dist/index.d.mts +2 -0
  22. package/dist/index.d.ts +2 -0
  23. package/dist/index.js +13 -10
  24. package/dist/index.mjs +13 -10
  25. package/package.json +1 -1
@@ -0,0 +1,80 @@
1
+ export const SECRET_RESOLUTION_MAX_ATTEMPTS = 3;
2
+ export const SECRET_RESOLUTION_MAX_RETRY_AFTER_MS = 2_000;
3
+
4
+ const SECRET_RESOLUTION_RETRY_JITTER_CAPS_MS = [100, 250] as const;
5
+
6
+ export type SecretResolutionRetryDecision = {
7
+ retry: boolean;
8
+ retryDelayMs: number;
9
+ retryAfterMs: number | null;
10
+ retryAfterExceedsCap: boolean;
11
+ };
12
+
13
+ export function isRetryableSecretResolutionStatus(status: number): boolean {
14
+ return status === 429 || (status >= 500 && status <= 599);
15
+ }
16
+
17
+ function parsedRetryAfterMs(
18
+ value: string | null,
19
+ nowMs: number,
20
+ ): number | null {
21
+ const normalized = value?.trim();
22
+ if (!normalized) return null;
23
+ if (/^\d+$/.test(normalized)) {
24
+ const seconds = Number(normalized);
25
+ const milliseconds = seconds * 1_000;
26
+ return Number.isSafeInteger(milliseconds) ? milliseconds : null;
27
+ }
28
+ const deadlineMs = Date.parse(normalized);
29
+ if (!Number.isFinite(deadlineMs) || deadlineMs <= nowMs) return null;
30
+ return deadlineMs - nowMs;
31
+ }
32
+
33
+ function boundedRandom(value: number): number {
34
+ if (!Number.isFinite(value)) return 0;
35
+ return Math.min(Math.max(value, 0), 1);
36
+ }
37
+
38
+ export function secretResolutionRetryDecision(input: {
39
+ attempt: number;
40
+ retryAfter: string | null;
41
+ nowMs?: number;
42
+ random?: () => number;
43
+ }): SecretResolutionRetryDecision {
44
+ if (input.attempt >= SECRET_RESOLUTION_MAX_ATTEMPTS) {
45
+ return {
46
+ retry: false,
47
+ retryDelayMs: 0,
48
+ retryAfterMs: null,
49
+ retryAfterExceedsCap: false,
50
+ };
51
+ }
52
+
53
+ const retryAfterMs = parsedRetryAfterMs(
54
+ input.retryAfter,
55
+ input.nowMs ?? Date.now(),
56
+ );
57
+ if (retryAfterMs !== null) {
58
+ const retryAfterExceedsCap =
59
+ retryAfterMs > SECRET_RESOLUTION_MAX_RETRY_AFTER_MS;
60
+ return {
61
+ retry: !retryAfterExceedsCap,
62
+ retryDelayMs: retryAfterExceedsCap ? 0 : retryAfterMs,
63
+ retryAfterMs,
64
+ retryAfterExceedsCap,
65
+ };
66
+ }
67
+
68
+ const jitterCapMs =
69
+ SECRET_RESOLUTION_RETRY_JITTER_CAPS_MS[input.attempt - 1] ??
70
+ SECRET_RESOLUTION_RETRY_JITTER_CAPS_MS[1];
71
+ const retryDelayMs = Math.floor(
72
+ boundedRandom((input.random ?? Math.random)()) * (jitterCapMs + 1),
73
+ );
74
+ return {
75
+ retry: true,
76
+ retryDelayMs: Math.min(retryDelayMs, jitterCapMs),
77
+ retryAfterMs: null,
78
+ retryAfterExceedsCap: false,
79
+ };
80
+ }
package/dist/cli/index.js CHANGED
@@ -184,7 +184,7 @@ configureProxyFromEnv();
184
184
  var import_promises6 = require("fs/promises");
185
185
  var import_node_path20 = require("path");
186
186
  var import_node_os15 = require("os");
187
- var import_commander3 = require("commander");
187
+ var import_commander4 = require("commander");
188
188
 
189
189
  // src/config.ts
190
190
  var import_node_fs = require("fs");
@@ -635,7 +635,8 @@ var SDK_RELEASE = {
635
635
  // 0.1.252 hard-cuts the customer Monitor catalog to the two launched
636
636
  // Deepline-native radars. Older clients must update before discovering,
637
637
  // checking, or deploying an unlaunched monitor integration.
638
- version: "0.1.252",
638
+ // 0.1.253 makes play-page browser opening opt-in and retires --no-open.
639
+ version: "0.1.254",
639
640
  apiContract: "2026-07-native-monitor-launch-hard-cutover",
640
641
  supportPolicy: {
641
642
  minimumSupported: "0.1.53",
@@ -643,8 +644,8 @@ var SDK_RELEASE = {
643
644
  commandMinimumSupported: [
644
645
  {
645
646
  command: "enrich",
646
- minimumSupported: "0.1.238",
647
- reason: 'Older SDK CLI enrich generated stale play source; SDK CLI enrich 0.1.153 generated removed StepOptions fields in play source; SDK CLI enrich before 0.1.175 could silently succeed on the empty-waterfall bug when a requested waterfall returned no values for selected rows; SDK CLI enrich before 0.1.230 could convert extractor failures into successful unmatched results; SDK CLI enrich before 0.1.238 could drop a nested provider email match during generic pick("email") extraction and materialize it as NO_MATCH.'
647
+ minimumSupported: "0.1.253",
648
+ reason: 'Older SDK CLI enrich generated stale play source; SDK CLI enrich 0.1.153 generated removed StepOptions fields in play source; SDK CLI enrich before 0.1.175 could silently succeed on the empty-waterfall bug when a requested waterfall returned no values for selected rows; SDK CLI enrich before 0.1.230 could convert extractor failures into successful unmatched results; SDK CLI enrich before 0.1.238 could drop a nested provider email match during generic pick("email") extraction and materialize it as NO_MATCH; SDK CLI enrich before 0.1.253 opens the generated play page by default and accepts the removed --no-open flag.'
648
649
  },
649
650
  {
650
651
  command: "plays",
@@ -653,14 +654,14 @@ var SDK_RELEASE = {
653
654
  },
654
655
  {
655
656
  command: "plays run",
656
- minimumSupported: "0.1.241",
657
- reason: "Older SDK CLI versions predate dataset-native Play results and can emit the retired esm_workers artifact contract."
657
+ minimumSupported: "0.1.253",
658
+ reason: "Older SDK CLI versions predate dataset-native Play results and can emit the retired esm_workers artifact contract; versions before 0.1.253 open the play page by default and accept the removed --no-open flag."
658
659
  },
659
660
  {
660
661
  command: "run",
661
662
  displayCommand: "plays run",
662
- minimumSupported: "0.1.241",
663
- reason: "Older SDK CLI versions predate dataset-native Play results and can emit the retired esm_workers artifact contract."
663
+ minimumSupported: "0.1.253",
664
+ reason: "Older SDK CLI versions predate dataset-native Play results and can emit the retired esm_workers artifact contract; versions before 0.1.253 open the play page by default and accept the removed --no-open flag."
664
665
  },
665
666
  {
666
667
  command: "plays check",
@@ -1482,12 +1483,14 @@ function createSecretRedactionContext(initialValues = []) {
1482
1483
  }
1483
1484
 
1484
1485
  // ../shared_libs/play-runtime/output-size-limits.ts
1485
- var encoder = typeof TextEncoder === "undefined" ? null : new TextEncoder();
1486
+ var TERMINAL_RUN_RESULT_MAX_BYTES = 6 * 1024 * 1024;
1486
1487
  var LEDGER_TERMINAL_RESULT_MAX_BYTES = 256 * 1024;
1487
- var CUSTOMER_OUTPUT_VALUE_MAX_BYTES = 1 * 1024 * 1024;
1488
- var CUSTOMER_OUTPUT_TOTAL_MAX_BYTES = 2 * 1024 * 1024;
1488
+ var CUSTOMER_OUTPUT_VALUE_MAX_BYTES = 5 * 1024 * 1024;
1489
+ var CUSTOMER_OUTPUT_TOTAL_MAX_BYTES = 5 * 1024 * 1024;
1489
1490
  var RUNTIME_RECEIPT_OUTPUT_MAX_BYTES = 10 * 1024 * 1024;
1490
1491
  var RUNTIME_RECEIPT_COMPLETION_BUFFER_MAX_BYTES = 32 * 1024 * 1024;
1492
+ var RUNNER_TERMINAL_PUSH_MAX_BODY_BYTES = 16 * 1024 * 1024;
1493
+ var RUNNER_POST_TERMINAL_DIAGNOSTIC_MAX_BYTES = 64 * 1024;
1491
1494
 
1492
1495
  // ../shared_libs/play-runtime/ledger-safe-payload.ts
1493
1496
  var ledgerIngressRedactor = createSecretRedactionContext();
@@ -9015,6 +9018,7 @@ Examples:
9015
9018
  var import_promises3 = require("fs/promises");
9016
9019
  var import_node_os8 = require("os");
9017
9020
  var import_node_path12 = require("path");
9021
+ var import_commander2 = require("commander");
9018
9022
 
9019
9023
  // src/cli/commands/play.ts
9020
9024
  var import_node_crypto4 = require("crypto");
@@ -11268,7 +11272,7 @@ var PLAY_RUN_RESERVED_BOOLEAN_FLAGS = /* @__PURE__ */ new Set([
11268
11272
  "--logs",
11269
11273
  "--full",
11270
11274
  "--force",
11271
- "--no-open",
11275
+ "--open",
11272
11276
  "--debug-map-latency"
11273
11277
  ]);
11274
11278
  function traceCliSync(phase, fields, run) {
@@ -12555,11 +12559,10 @@ function buildPlayDashboardUrl(baseUrl, playName) {
12555
12559
  const encodedPlayName = encodeURIComponent(playName);
12556
12560
  return `${trimmedBase}/dashboard/plays/${encodedPlayName}`;
12557
12561
  }
12558
- function openPlayDashboard(input2) {
12559
- if (input2.noOpen || !input2.dashboardUrl) {
12560
- return;
12562
+ function openPlayDashboard(dashboardUrl, open) {
12563
+ if (open && dashboardUrl) {
12564
+ openInBrowser(dashboardUrl);
12561
12565
  }
12562
- openInBrowser(input2.dashboardUrl);
12563
12566
  }
12564
12567
  function printPlayLogLines(input2) {
12565
12568
  for (const line of input2.lines) {
@@ -12878,10 +12881,7 @@ async function startAndWaitForPlayCompletionByStreamOnce(input2) {
12878
12881
  progress: input2.progress
12879
12882
  });
12880
12883
  }
12881
- openPlayDashboard({
12882
- dashboardUrl,
12883
- noOpen: input2.noOpen
12884
- });
12884
+ openPlayDashboard(dashboardUrl, input2.open ?? false);
12885
12885
  input2.progress.phase("running");
12886
12886
  emittedDashboardUrl = true;
12887
12887
  }
@@ -13330,15 +13330,24 @@ function collectDatasetHandleLines(value, path = "result") {
13330
13330
  return lines;
13331
13331
  }
13332
13332
  function buildRunWarnings(status, rowsInfo) {
13333
+ const result = readRecord(status.result);
13334
+ const metadata = readRecord(result?._metadata);
13335
+ const outputWarnings = Array.isArray(metadata?.outputWarnings) ? metadata.outputWarnings.map((warning) => readRecord(warning)).filter((warning) => {
13336
+ if (!warning) return false;
13337
+ return !(rowsInfo && !rowsInfo.complete && warning.reason === "array_preview_limit" && warning.originalItems === rowsInfo.totalRows && warning.retainedItems === rowsInfo.rows.length);
13338
+ }).map((warning) => warning?.message).filter(
13339
+ (message) => typeof message === "string" && message.trim().length > 0
13340
+ ).slice(0, 16) : [];
13333
13341
  if (status.status === "completed" && rowsInfo?.totalRows === 0) {
13334
- return ["Run completed with 0 output rows."];
13342
+ return ["Run completed with 0 output rows.", ...outputWarnings];
13335
13343
  }
13336
13344
  if (rowsInfo && !rowsInfo.complete) {
13337
13345
  return [
13338
- `Run output is partial: showing ${rowsInfo.rows.length} preview row(s) of ${rowsInfo.totalRows}.`
13346
+ `Run output is partial: showing ${rowsInfo.rows.length} preview row(s) of ${rowsInfo.totalRows}.`,
13347
+ ...outputWarnings
13339
13348
  ];
13340
13349
  }
13341
- return [];
13350
+ return outputWarnings;
13342
13351
  }
13343
13352
  function buildRunNextCommands(status) {
13344
13353
  const runId = status.runId?.trim();
@@ -14064,6 +14073,14 @@ function buildRunPackageTextLines(packaged) {
14064
14073
  if (failedLogWarning) {
14065
14074
  lines.push(` warning: ${failedLogWarning}`);
14066
14075
  }
14076
+ const packageWarnings = Array.isArray(packaged.warnings) ? Array.from(
14077
+ new Set(
14078
+ packaged.warnings.filter(
14079
+ (warning) => typeof warning === "string" && warning.trim().length > 0
14080
+ )
14081
+ )
14082
+ ).slice(0, 16) : [];
14083
+ lines.push(...packageWarnings.map((warning) => ` warning: ${warning}`));
14067
14084
  const failedLogNext = readRecord(failedLogs?.next);
14068
14085
  if (failedLogWarning && typeof failedLogNext?.logs === "string") {
14069
14086
  lines.push(
@@ -14137,7 +14154,7 @@ function buildOrdinaryPlayRunCommand(options, resolvedRevisionId) {
14137
14154
  if (options.waitTimeoutMs !== null) {
14138
14155
  parts.push("--tail-timeout-ms", String(options.waitTimeoutMs));
14139
14156
  }
14140
- if (options.noOpen) parts.push("--no-open");
14157
+ if (options.open) parts.push("--open");
14141
14158
  if (options.fullJson) parts.push("--full");
14142
14159
  if (options.jsonOutput && options.emitLogs) parts.push("--logs");
14143
14160
  if (options.jsonOutput) parts.push("--json");
@@ -14974,7 +14991,7 @@ function writeStartedPlayRun(input2) {
14974
14991
  );
14975
14992
  }
14976
14993
  function parsePlayRunOptions(args) {
14977
- 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 use the Absurd CJS runtime.\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.";
14994
+ const usage = "Usage: deepline plays run <play-name> [--input '{...}'] [--no-wait] [--tail-timeout-ms 30000] [--force] [--open] [--full] [--<input> value]\n deepline plays run <play-file.ts> [--input '{...}'] [--no-wait] [--tail-timeout-ms 30000] [--force] [--open] [--full] [--<input> value]\n deepline plays run --file <play-file.ts> [--input '{...}'] [--profile <id>] [--no-wait] [--tail-timeout-ms 30000] [--force] [--open] [--full] [--<input> value]\n deepline plays run --name <name> [--input '{...}'] [--profile <id>] [--live|--latest|--revision-id <id>] [--no-wait] [--tail-timeout-ms 30000] [--force] [--open] [--json] [--full] [--<input> value]\n Runs use the Absurd CJS runtime.\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.";
14978
14995
  let filePath = null;
14979
14996
  let playName = null;
14980
14997
  let input2 = null;
@@ -14985,7 +15002,7 @@ function parsePlayRunOptions(args) {
14985
15002
  const fullJson = args.includes("--full");
14986
15003
  const emitLogs = !jsonOutput || args.includes("--logs");
14987
15004
  const force = args.includes("--force");
14988
- const noOpen = args.includes("--no-open");
15005
+ const open = args.includes("--open");
14989
15006
  const debugMapLatency = args.includes("--debug-map-latency");
14990
15007
  let waitTimeoutMs = null;
14991
15008
  let profile = null;
@@ -15030,6 +15047,11 @@ function parsePlayRunOptions(args) {
15030
15047
  "--out is not a plays run flag. Run the play first, then export rows with: deepline runs export <run-id> --out output.csv"
15031
15048
  );
15032
15049
  }
15050
+ if (arg === "--no-open" || arg.startsWith("--no-open=")) {
15051
+ throw new Error(
15052
+ "--no-open was removed for `plays run`. Play page URLs are printed by default; pass --open to launch a browser."
15053
+ );
15054
+ }
15033
15055
  if (arg === "--poll-interval-ms" || arg === "--interval-ms") {
15034
15056
  throw new Error(
15035
15057
  `${arg} was removed. --watch uses the canonical run stream directly.`
@@ -15104,7 +15126,7 @@ function parsePlayRunOptions(args) {
15104
15126
  fullJson,
15105
15127
  waitTimeoutMs,
15106
15128
  force,
15107
- noOpen,
15129
+ open,
15108
15130
  profile,
15109
15131
  debugMapLatency
15110
15132
  };
@@ -15686,7 +15708,7 @@ async function handleFileBackedRun(options, hooks) {
15686
15708
  jsonOutput: options.jsonOutput,
15687
15709
  emitLogs: options.emitLogs,
15688
15710
  waitTimeoutMs: options.waitTimeoutMs,
15689
- noOpen: options.noOpen,
15711
+ open: options.open,
15690
15712
  progress,
15691
15713
  onRunStarted: hooks?.onRunStarted
15692
15714
  }).catch(async (error) => {
@@ -15729,10 +15751,7 @@ async function handleFileBackedRun(options, hooks) {
15729
15751
  })
15730
15752
  );
15731
15753
  const resolvedDashboardUrl = buildPlayDashboardUrl(client2.baseUrl, playName);
15732
- openPlayDashboard({
15733
- dashboardUrl: resolvedDashboardUrl,
15734
- noOpen: options.noOpen
15735
- });
15754
+ openPlayDashboard(resolvedDashboardUrl, options.open);
15736
15755
  progress.phase("started run");
15737
15756
  progress.complete();
15738
15757
  writeStartedPlayRun({
@@ -15853,7 +15872,7 @@ async function handleNamedRun(options, hooks) {
15853
15872
  jsonOutput: options.jsonOutput,
15854
15873
  emitLogs: options.emitLogs,
15855
15874
  waitTimeoutMs: options.waitTimeoutMs,
15856
- noOpen: options.noOpen,
15875
+ open: options.open,
15857
15876
  progress,
15858
15877
  onRunStarted: hooks?.onRunStarted
15859
15878
  }).catch(async (error) => {
@@ -15901,10 +15920,7 @@ async function handleNamedRun(options, hooks) {
15901
15920
  })
15902
15921
  );
15903
15922
  const resolvedDashboardUrl = buildPlayDashboardUrl(client2.baseUrl, playName);
15904
- openPlayDashboard({
15905
- dashboardUrl: resolvedDashboardUrl,
15906
- noOpen: options.noOpen
15907
- });
15923
+ openPlayDashboard(resolvedDashboardUrl, options.open);
15908
15924
  progress.phase("started run");
15909
15925
  progress.complete();
15910
15926
  writeStartedPlayRun({
@@ -17202,8 +17218,7 @@ Notes:
17202
17218
  next commands. --watch and --wait are accepted compatibility aliases for the
17203
17219
  default behavior. Use --no-wait only when you intentionally want
17204
17220
  a fire-and-forget run id.
17205
- The play page opens in your browser as soon as the run starts; use --no-open
17206
- to only print the URL.
17221
+ The play page URL is printed when the run starts. Pass --open to open it in a browser.
17207
17222
  Concurrent runs for the same play are allowed.
17208
17223
  --force starts a fresh run graph without refreshing completed provider calls.
17209
17224
  It does not cancel active sibling runs.
@@ -17258,10 +17273,10 @@ Examples:
17258
17273
  ).option("--watch", "Compatibility alias; run waits by default").option("--wait", "Compatibility alias; run waits by default").option("--no-wait", "Start the run and return immediately").option(
17259
17274
  "--logs",
17260
17275
  "When output is non-interactive, stream play logs to stderr while waiting"
17261
- ).option("--tail-timeout-ms <ms>", "Timeout while watching the run stream").option("--force", "Start a fresh run graph").option(
17276
+ ).option("--tail-timeout-ms <ms>", "Timeout while watching the run stream").option("--force", "Start a fresh run graph").option("--open", "Open the play page in a browser after the run starts").option(
17262
17277
  "--debug-map-latency",
17263
17278
  "Internal diagnostics: emit one aggregate latency profile per dataset map"
17264
- ).option("--no-open", "Print the play page URL without opening a browser").option("--json", "Emit JSON output").option("--full", "Debug only: with --json, emit the raw status payload").addHelpText(
17279
+ ).option("--json", "Emit JSON output").option("--full", "Debug only: with --json, emit the raw status payload").addHelpText(
17265
17280
  "afterAll",
17266
17281
  `
17267
17282
  Pass-through input flags:
@@ -17297,8 +17312,8 @@ Pass-through input flags:
17297
17312
  ...options.logs ? ["--logs"] : [],
17298
17313
  ...options.tailTimeoutMs ? ["--tail-timeout-ms", options.tailTimeoutMs] : [],
17299
17314
  ...options.force ? ["--force"] : [],
17315
+ ...options.open ? ["--open"] : [],
17300
17316
  ...options.debugMapLatency ? ["--debug-map-latency"] : [],
17301
- ...options.noOpen || options.open === false ? ["--no-open"] : [],
17302
17317
  ...options.json ? ["--json"] : [],
17303
17318
  ...options.full ? ["--full"] : [],
17304
17319
  ...passthroughArgs
@@ -19884,11 +19899,11 @@ async function buildPlanArgs(args) {
19884
19899
  const localBooleanOptions = /* @__PURE__ */ new Set([
19885
19900
  "--dry-run",
19886
19901
  "--json",
19902
+ "--open",
19887
19903
  "--force",
19888
19904
  "--fail-fast",
19889
19905
  "--all",
19890
19906
  "--in-place",
19891
- "--no-open",
19892
19907
  "--debug-map-latency"
19893
19908
  ]);
19894
19909
  const planArgs = [];
@@ -22880,7 +22895,15 @@ function registerEnrichCommand(program) {
22880
22895
  ).option("--all", "Run all rows.").option(
22881
22896
  "--dry-run",
22882
22897
  "Compile and print the generated plan without starting a run."
22883
- ).option("--json", "Emit JSON.").option("--no-open", "Do not open the play page in a browser.").option("--force", "Force rerun for all enrich aliases.").option(
22898
+ ).option("--json", "Emit JSON.").option(
22899
+ "--open",
22900
+ "Open the generated play page in a browser after the run starts."
22901
+ ).addOption(
22902
+ new import_commander2.Option(
22903
+ "--no-open [legacy-value]",
22904
+ "Removed legacy option"
22905
+ ).hideHelp()
22906
+ ).option("--force", "Force rerun for all enrich aliases.").option(
22884
22907
  "--with-force <aliases>",
22885
22908
  "Force rerun for selected aliases.",
22886
22909
  (value, previous = []) => [...previous, value]
@@ -22897,6 +22920,13 @@ function registerEnrichCommand(program) {
22897
22920
  "--fail-fast",
22898
22921
  "Fail the generated play when any selected row errors, while preserving recovered runtime-sheet rows for export."
22899
22922
  ).action(async (options, _command) => {
22923
+ if (currentEnrichArgs().some(
22924
+ (arg) => arg === "--no-open" || arg.startsWith("--no-open=")
22925
+ )) {
22926
+ throw new Error(
22927
+ "--no-open was removed for `enrich`. Play page URLs are printed by default; pass --open to launch a browser."
22928
+ );
22929
+ }
22900
22930
  if (options.inPlace && options.dryRun) {
22901
22931
  throw new Error("--in-place is not supported with --dry-run.");
22902
22932
  }
@@ -23057,8 +23087,8 @@ function registerEnrichCommand(program) {
23057
23087
  if (options.debugMapLatency) {
23058
23088
  runArgs.push("--debug-map-latency");
23059
23089
  }
23060
- if (options.noOpen || input2.suppressOpen) {
23061
- runArgs.push("--no-open");
23090
+ if (options.open) {
23091
+ runArgs.push("--open");
23062
23092
  }
23063
23093
  if (input2.json) {
23064
23094
  runArgs.push("--json");
@@ -26186,7 +26216,7 @@ Examples:
26186
26216
  }
26187
26217
 
26188
26218
  // src/cli/commands/tools.ts
26189
- var import_commander2 = require("commander");
26219
+ var import_commander3 = require("commander");
26190
26220
  var import_node_fs15 = require("fs");
26191
26221
  var import_node_os12 = require("os");
26192
26222
  var import_node_path16 = require("path");
@@ -26911,12 +26941,12 @@ Examples:
26911
26941
  "--examples-only",
26912
26942
  "Only print runnable examples and sample payloads"
26913
26943
  ).option("--getters-only", "Only print extracted list/value getters").addOption(
26914
- new import_commander2.Option(
26944
+ new import_commander3.Option(
26915
26945
  "--compact",
26916
26946
  "Compatibility alias for the default compact view"
26917
26947
  ).hideHelp()
26918
26948
  ).addOption(
26919
- new import_commander2.Option(
26949
+ new import_commander3.Option(
26920
26950
  "--contract-json",
26921
26951
  "Compatibility alias for compact contract JSON"
26922
26952
  ).hideHelp()
@@ -30160,7 +30190,6 @@ async function runPlayRunnerHealthCheck() {
30160
30190
  "--input",
30161
30191
  "{}",
30162
30192
  "--watch",
30163
- "--no-open",
30164
30193
  "--json"
30165
30194
  ]);
30166
30195
  } finally {
@@ -30309,7 +30338,7 @@ async function main() {
30309
30338
  if (printStartupPhase) {
30310
30339
  progress?.phase("loading deepline cli");
30311
30340
  }
30312
- const program = new import_commander3.Command();
30341
+ const program = new import_commander4.Command();
30313
30342
  program.name("deepline").description(
30314
30343
  "Deepline CLI \u2014 GTM enrichment tools, plays, and runs from your terminal."
30315
30344
  ).version(SDK_VERSION, "-v, --version", "Show version").exitOverride().showHelpAfterError().showSuggestionAfterError(true).addHelpText(