deepline 0.3.211 → 0.3.213

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.
@@ -1026,6 +1026,21 @@ export type RunLifecycleStatus =
1026
1026
  startedAt: number | null;
1027
1027
  finishedAt: number | null;
1028
1028
  };
1029
+ /** Null for scheduler-only admission or a pre-expansion projection row. */
1030
+ source?: { ledgerNextSeq: number | null };
1031
+ /** One durable current activity, not proof that every row is blocked. */
1032
+ activity?: {
1033
+ kind: string;
1034
+ reason: string | null;
1035
+ targetKind: string | null;
1036
+ observedAt: number | null;
1037
+ nextAt: number | null;
1038
+ } | null;
1039
+ calls?: {
1040
+ logicalCalls: { value: number | null; confirmed: boolean };
1041
+ providerRequests: { value: number | null; confirmed: boolean };
1042
+ provider429s: { value: number | null; confirmed: boolean };
1043
+ };
1029
1044
  steps: {
1030
1045
  observed: number;
1031
1046
  running: number;
@@ -200,7 +200,7 @@ export const SDK_RELEASE = {
200
200
  // getters keep their established compatibility behavior.
201
201
  // 0.3.1 deprecated the legacy `deepline enrich` command in favor of Plays.
202
202
  // 0.3.90 is the first deliberately versioned SDK release for API v3.
203
- version: '0.3.211',
203
+ version: '0.3.213',
204
204
  updateSummary:
205
205
  'Play grep now returns concise results with the matched fields and terms. Automatic CLI updates are enabled by default; use `deepline settings autoupdate off` to opt out, `deepline settings autoupdate on` to re-enable updates, or `deepline settings autoupdate pin <version>` to hold an exact release.',
206
206
  packageCapabilities: {
@@ -47,6 +47,9 @@ export function classifyInboundFailure(error: unknown): InboundFailureClass {
47
47
  // redelivery as poison could dead-letter a live callback and clear the
48
48
  // owner's receipt before its lease completes.
49
49
  'provider_callback_raw_receipt_in_progress',
50
+ // The finding has already been delivered. Redelivery only records its
51
+ // activity from the terminal raw receipt; it must not become poison input.
52
+ 'provider_monitor_activity_recording_pending',
50
53
  'ECONNRESET',
51
54
  'ECONNREFUSED',
52
55
  'ETIMEDOUT',
@@ -60,9 +60,13 @@ const CONCURRENCY_OBSERVATION_DEDUP_RETENTION_MS = 24 * 60 * 60 * 1000;
60
60
  const CONCURRENCY_OBSERVER_CLEANUP_BATCH_SIZE = 128;
61
61
  const ACTIVE_LEASE_TTL_MS = 5 * 60 * 1000;
62
62
  const RATE_RESERVATION_TTL_MS = 5 * 60 * 1000;
63
- // A guessed initial rate must not prevent learning an hourly quota. This is a
64
- // numerical floor (one request/day), not a fraction of the catalog seed.
65
- const MIN_ADAPTIVE_RPS_FLOOR = 1 / 86_400;
63
+ // Known provider estimates should not strand later runs below five requests
64
+ // per minute. Explicit adaptive ceilings remain authoritative.
65
+ const MIN_ADAPTIVE_RPS_FLOOR = 5 / 60;
66
+ // Repeated 429s with no successful work back off to at most one probe/minute.
67
+ const MIN_NO_PROGRESS_PROBE_RPS = 1 / 60;
68
+ // Used only to keep wait-time division finite for persisted legacy state.
69
+ const MIN_SCHEDULE_RPS = 1 / 86_400;
66
70
  /**
67
71
  * Horizon a granted=0 caller is allowed to sleep toward a WHOLE block instead of
68
72
  * a single token. Waiting for one token means one permit per store round trip,
@@ -427,8 +431,8 @@ function normalizeRules(
427
431
  * per second; `capacity` is one window of burst. The adaptive `[min,max]` range
428
432
  * is derived value-first so the same wire shape drives both declared and
429
433
  * default-pacing buckets:
430
- * - min_rps = min(base, 1/86400)
431
- * (low-RPM rules must still be able to back down below their base)
434
+ * - min_rps = min(5/60, max)
435
+ * (a lower explicit adaptive maximum remains authoritative)
432
436
  * - max_rps = max(base, 100) (catalogued-rate recommendation)
433
437
  * - max_rps = explicit adaptiveMaxRps when supplied
434
438
  */
@@ -446,17 +450,16 @@ function seedForRule(rule: AcquirePacingRule): RateBucketSeed {
446
450
  // Preserve its fractional refill rate, with dispatch times resolved in ms.
447
451
  const capacity = Math.max(1, rule.requestsPerWindow);
448
452
  const base = (rule.requestsPerWindow / rule.windowMs) * 1000;
449
- // Undeclared providers use the shared fallback rate as their operating
450
- // floor. Explicit provider Retry-After deadlines still block dispatch; a
451
- // prior learned AIMD rate must not leave later runs paced below the fallback.
452
- const minRps =
453
- rule.ruleId === 'default:provider-scope'
454
- ? base
455
- : Math.min(base, MIN_ADAPTIVE_RPS_FLOOR);
456
453
  const maxRps =
457
454
  rule.adaptiveMaxRps != null && rule.adaptiveMaxRps > 0
458
455
  ? Math.max(rule.adaptiveMaxRps, base)
459
456
  : Math.max(base, DEFAULT_ADVISORY_PROVIDER_MAX_RPS);
457
+ // Undeclared providers keep their existing 10-RPS fallback. Other provider
458
+ // scopes use the five-RPM floor, capped by an explicit adaptive maximum.
459
+ const minRps =
460
+ rule.ruleId === 'default:provider-scope'
461
+ ? base
462
+ : Math.min(MIN_ADAPTIVE_RPS_FLOOR, maxRps);
460
463
  return {
461
464
  rule_id: rule.ruleId,
462
465
  capacity,
@@ -467,10 +470,20 @@ function seedForRule(rule: AcquirePacingRule): RateBucketSeed {
467
470
  };
468
471
  }
469
472
 
473
+ function minimumRateRpsForRules(rules: readonly AcquirePacingRule[]): number {
474
+ if (rules.some((rule) => rule.ruleId === 'default:provider-scope')) {
475
+ return DEFAULT_UNKNOWN_PROVIDER_COLD_START_RPS;
476
+ }
477
+ const explicitAdaptiveMaxima = rules.flatMap((rule) => {
478
+ if (rule.adaptiveMaxRps == null || rule.adaptiveMaxRps <= 0) return [];
479
+ const base = (rule.requestsPerWindow / rule.windowMs) * 1_000;
480
+ return [Math.max(rule.adaptiveMaxRps, base)];
481
+ });
482
+ return Math.min(MIN_ADAPTIVE_RPS_FLOOR, ...explicitAdaptiveMaxima);
483
+ }
484
+
470
485
  function minimumRateSqlForRules(rules: readonly AcquirePacingRule[]): string {
471
- return rules.some((rule) => rule.ruleId === 'default:provider-scope')
472
- ? `${DEFAULT_UNKNOWN_PROVIDER_COLD_START_RPS}::float8`
473
- : 'NULL::float8';
486
+ return `${minimumRateRpsForRules(rules)}::float8`;
474
487
  }
475
488
 
476
489
  function positiveInt(value: number, label: string): number {
@@ -1053,7 +1066,7 @@ function fairShareSql(
1053
1066
  r.refill_per_sec,
1054
1067
  GREATEST(
1055
1068
  ${ADAPTIVE_BURST_HORIZON_MS},
1056
- CEIL(r.effective_capacity / GREATEST(r.refill_per_sec, ${MIN_ADAPTIVE_RPS_FLOOR}) * 1000)
1069
+ CEIL(r.effective_capacity / GREATEST(r.refill_per_sec, ${MIN_SCHEDULE_RPS}) * 1000)
1057
1070
  )::bigint AS window_ms
1058
1071
  FROM refreshed r
1059
1072
  ORDER BY r.refill_per_sec ASC, r.effective_capacity ASC
@@ -1453,14 +1466,14 @@ async function acquirePureRate(
1453
1466
  scheduled_capacity
1454
1467
  / GREATEST(
1455
1468
  next_refill_per_sec,
1456
- ${MIN_ADAPTIVE_RPS_FLOOR}
1469
+ ${MIN_SCHEDULE_RPS}
1457
1470
  )
1458
1471
  * 1000
1459
1472
  )
1460
1473
  )::bigint
1461
1474
  )
1462
1475
  )::bigint AS first_at_ms,
1463
- CEIL(MAX(1000.0 / GREATEST(next_refill_per_sec, ${MIN_ADAPTIVE_RPS_FLOOR})))::bigint AS spacing_ms,
1476
+ CEIL(MAX(1000.0 / GREATEST(next_refill_per_sec, ${MIN_SCHEDULE_RPS})))::bigint AS spacing_ms,
1464
1477
  GREATEST(1, FLOOR(MIN(next_refill_per_sec) / 100.0))::bigint AS burst_size
1465
1478
  FROM refreshed
1466
1479
  ),
@@ -1614,7 +1627,7 @@ async function acquirePureRate(
1614
1627
  FLOOR(new_refill_per_sec * ${BLOCK_WAIT_HORIZON_MS} / 1000.0)
1615
1628
  )
1616
1629
  ) - tokens_after_refill
1617
- ) / GREATEST(new_refill_per_sec, ${MIN_ADAPTIVE_RPS_FLOOR}) * 1000
1630
+ ) / GREATEST(new_refill_per_sec, ${MIN_SCHEDULE_RPS}) * 1000
1618
1631
  )
1619
1632
  )::bigint
1620
1633
  FROM updated
@@ -1973,14 +1986,14 @@ async function acquireWithConcurrency(
1973
1986
  scheduled_capacity
1974
1987
  / GREATEST(
1975
1988
  next_refill_per_sec,
1976
- ${MIN_ADAPTIVE_RPS_FLOOR}
1989
+ ${MIN_SCHEDULE_RPS}
1977
1990
  )
1978
1991
  * 1000
1979
1992
  )
1980
1993
  )::bigint
1981
1994
  )
1982
1995
  )::bigint AS first_at_ms,
1983
- CEIL(MAX(1000.0 / GREATEST(next_refill_per_sec, ${MIN_ADAPTIVE_RPS_FLOOR})))::bigint AS spacing_ms,
1996
+ CEIL(MAX(1000.0 / GREATEST(next_refill_per_sec, ${MIN_SCHEDULE_RPS})))::bigint AS spacing_ms,
1984
1997
  GREATEST(1, FLOOR(MIN(next_refill_per_sec) / 100.0))::bigint AS burst_size
1985
1998
  FROM refreshed
1986
1999
  ),
@@ -2162,7 +2175,7 @@ async function acquireWithConcurrency(
2162
2175
  WHEN (SELECT free FROM free_slots) <= 0 THEN $7::bigint
2163
2176
  ELSE (
2164
2177
  SELECT CEIL(
2165
- MAX((1.0 - tokens_after_refill) / GREATEST(new_refill_per_sec, ${MIN_ADAPTIVE_RPS_FLOOR}) * 1000)
2178
+ MAX((1.0 - tokens_after_refill) / GREATEST(new_refill_per_sec, ${MIN_SCHEDULE_RPS}) * 1000)
2166
2179
  )::bigint
2167
2180
  FROM updated
2168
2181
  )
@@ -3034,11 +3047,11 @@ async function penalizeRateStateStatements(
3034
3047
  return emptyRateStatePenaltyTelemetry();
3035
3048
  }
3036
3049
  const rules = normalizeRules((input.rules ?? []) as AcquirePacingRule[]);
3037
- const minimumRateRps = rules.some(
3038
- (rule) => rule.ruleId === 'default:provider-scope',
3039
- )
3040
- ? DEFAULT_UNKNOWN_PROVIDER_COLD_START_RPS
3041
- : MIN_ADAPTIVE_RPS_FLOOR;
3050
+ const minimumRateRps = minimumRateRpsForRules(rules);
3051
+ const noProgressProbeRateRps = Math.min(
3052
+ MIN_NO_PROGRESS_PROBE_RPS,
3053
+ minimumRateRps,
3054
+ );
3042
3055
  await applyConcurrencyObservations(
3043
3056
  client,
3044
3057
  input,
@@ -3047,8 +3060,10 @@ async function penalizeRateStateStatements(
3047
3060
  concurrencyObservationBatchFrom(input.concurrencyObservationBatch),
3048
3061
  );
3049
3062
  // Lock/update the provider-scope hold before touching rate-rule rows, matching
3050
- // acquire's lock order. The absolute deadline is idempotent across transport
3051
- // retries and gates admission independently of the capped AIMD cooldown.
3063
+ // acquire's lock order. Retry-After remains an uncapped provider deadline;
3064
+ // repeated no-success 429s also extend the separate AIMD cooldown to the
3065
+ // one-minute probe interval so the five-RPM floor cannot turn into a retry
3066
+ // loop.
3052
3067
  // - refill_per_sec: multiplicative decrease, but ONLY once per active
3053
3068
  // cooldown window (halve-once guard: skip if already cooling), floored at
3054
3069
  // min_rps.
@@ -3105,7 +3120,7 @@ async function penalizeRateStateStatements(
3105
3120
  - COALESCE(h.rate_observation_started_at_ms, nv.now_ms)
3106
3121
  END) AS cycle_ms,
3107
3122
  CASE
3108
- WHEN $5::bigint IS NOT NULL AND h.rate_successes <= 0 THEN
3123
+ WHEN h.rate_successes <= 0 AND ($5::bigint IS NOT NULL OR h.seen_backpressure) THEN
3109
3124
  CASE WHEN h.seen_backpressure THEN
3110
3125
  LEAST(60000, GREATEST(1000, h.rate_recovery_interval_ms * 2))
3111
3126
  ELSE 1000 END
@@ -3117,20 +3132,25 @@ async function penalizeRateStateStatements(
3117
3132
  SELECT e.*,
3118
3133
  GREATEST(${minimumRateRps},
3119
3134
  CASE WHEN e.seen_backpressure AND e.rate_successes = 0 THEN
3120
- CASE WHEN $5::bigint IS NOT NULL
3135
+ CASE WHEN e.no_progress_probe_interval_ms IS NOT NULL
3121
3136
  -- A fresh provider deadline is not a throughput measurement.
3122
3137
  -- Repeated probes with no successful work are evidence that
3123
- -- the scope is still unavailable, however. Space subsequent
3124
- -- probes exponentially (up to one per minute) across every
3125
- -- run sharing this provider credential.
3126
- THEN 1000.0 / e.no_progress_probe_interval_ms
3138
+ -- the scope is still unavailable, even without Retry-After.
3139
+ -- Space them exponentially (up to one per minute) across all
3140
+ -- runs sharing this provider credential.
3141
+ THEN GREATEST(${noProgressProbeRateRps},
3142
+ 1000.0 / e.no_progress_probe_interval_ms)
3127
3143
  ELSE e.refill_before END
3128
3144
  ELSE e.refill_before / 2 END
3129
3145
  ) AS next_ceiling_rps
3130
3146
  FROM evidence e
3131
3147
  ), learned AS (
3132
3148
  SELECT e.*,
3133
- CASE WHEN e.new_episode THEN GREATEST(${minimumRateRps}, LEAST(
3149
+ CASE WHEN e.new_episode THEN GREATEST(
3150
+ CASE WHEN e.seen_backpressure AND e.rate_successes = 0
3151
+ THEN ${noProgressProbeRateRps}
3152
+ ELSE ${minimumRateRps} END,
3153
+ LEAST(
3134
3154
  e.next_ceiling_rps,
3135
3155
  GREATEST(1, e.rate_successes) * 1000.0 / e.cycle_ms
3136
3156
  )) ELSE e.refill_before END AS refill_after
@@ -3140,7 +3160,17 @@ async function penalizeRateStateStatements(
3140
3160
  retry_at_ms = e.deadline,
3141
3161
  refill_per_sec = e.refill_after,
3142
3162
  seen_backpressure = e.seen_backpressure OR e.new_episode,
3143
- cool_until_ms = GREATEST(e.cool_until_ms, LEAST(e.deadline, e.now_ms + LEAST($2::bigint, $4::bigint))),
3163
+ -- A repeated no-success throttle can impose a slower local probe
3164
+ -- interval than the normal adaptive floor. Keep that pause separate
3165
+ -- from retry_at_ms, which remains the provider's absolute deadline.
3166
+ cool_until_ms = GREATEST(e.cool_until_ms, LEAST(
3167
+ e.now_ms + $4::bigint,
3168
+ GREATEST(
3169
+ e.deadline,
3170
+ e.now_ms + LEAST($2::bigint, $4::bigint),
3171
+ e.now_ms + COALESCE(e.no_progress_probe_interval_ms, 0)
3172
+ )
3173
+ )),
3144
3174
  tokens = CASE WHEN e.new_episode THEN 0 ELSE e.tokens END,
3145
3175
  rate_successes = e.rate_successes,
3146
3176
  rate_throttle_ceiling_rps = CASE WHEN e.new_episode
package/dist/cli/index.js CHANGED
@@ -3051,7 +3051,7 @@ var SDK_RELEASE = {
3051
3051
  // getters keep their established compatibility behavior.
3052
3052
  // 0.3.1 deprecated the legacy `deepline enrich` command in favor of Plays.
3053
3053
  // 0.3.90 is the first deliberately versioned SDK release for API v3.
3054
- version: "0.3.211",
3054
+ version: "0.3.213",
3055
3055
  updateSummary: "Play grep now returns concise results with the matched fields and terms. Automatic CLI updates are enabled by default; use `deepline settings autoupdate off` to opt out, `deepline settings autoupdate on` to re-enable updates, or `deepline settings autoupdate pin <version>` to hold an exact release.",
3056
3056
  packageCapabilities: {
3057
3057
  updatePreferences: 1
@@ -28877,11 +28877,23 @@ async function handleRunLifecycleStatus(args) {
28877
28877
  console.log(
28878
28878
  `Map-step work (summed, not unique rows): completed ${formatCount(status.mapStepWork.completed)} / ${formatCount(status.mapStepWork.total)}, failed ${formatCount(status.mapStepWork.failed)}`
28879
28879
  );
28880
+ if (status.activity) {
28881
+ const { activity } = status;
28882
+ const reason = activity.reason ? ` (${activity.reason})` : "";
28883
+ const nextDate = typeof activity.nextAt === "number" ? new Date(activity.nextAt) : null;
28884
+ const next = nextDate && Number.isFinite(nextDate.getTime()) ? `; next at ${nextDate.toISOString()}` : "";
28885
+ console.log(`Activity: ${activity.kind}${reason}${next}`);
28886
+ }
28880
28887
  if (status.lifecycle.status === "waiting") {
28881
28888
  console.log(
28882
28889
  status.wait.confirmed && status.wait.kind ? `Waiting: ${status.wait.kind}` : "Waiting reason: unknown"
28883
28890
  );
28884
28891
  }
28892
+ if (status.calls) {
28893
+ console.log(
28894
+ `Calls: ${formatCount(status.calls.logicalCalls)} logical, ${formatCount(status.calls.providerRequests)} provider requests, ${formatCount(status.calls.provider429s)} provider 429s`
28895
+ );
28896
+ }
28885
28897
  return 0;
28886
28898
  }
28887
28899
  async function handleRunsRerun(args) {
@@ -3046,7 +3046,7 @@ var SDK_RELEASE = {
3046
3046
  // getters keep their established compatibility behavior.
3047
3047
  // 0.3.1 deprecated the legacy `deepline enrich` command in favor of Plays.
3048
3048
  // 0.3.90 is the first deliberately versioned SDK release for API v3.
3049
- version: "0.3.211",
3049
+ version: "0.3.213",
3050
3050
  updateSummary: "Play grep now returns concise results with the matched fields and terms. Automatic CLI updates are enabled by default; use `deepline settings autoupdate off` to opt out, `deepline settings autoupdate on` to re-enable updates, or `deepline settings autoupdate pin <version>` to hold an exact release.",
3051
3051
  packageCapabilities: {
3052
3052
  updatePreferences: 1
@@ -28950,11 +28950,23 @@ async function handleRunLifecycleStatus(args) {
28950
28950
  console.log(
28951
28951
  `Map-step work (summed, not unique rows): completed ${formatCount(status.mapStepWork.completed)} / ${formatCount(status.mapStepWork.total)}, failed ${formatCount(status.mapStepWork.failed)}`
28952
28952
  );
28953
+ if (status.activity) {
28954
+ const { activity } = status;
28955
+ const reason = activity.reason ? ` (${activity.reason})` : "";
28956
+ const nextDate = typeof activity.nextAt === "number" ? new Date(activity.nextAt) : null;
28957
+ const next = nextDate && Number.isFinite(nextDate.getTime()) ? `; next at ${nextDate.toISOString()}` : "";
28958
+ console.log(`Activity: ${activity.kind}${reason}${next}`);
28959
+ }
28953
28960
  if (status.lifecycle.status === "waiting") {
28954
28961
  console.log(
28955
28962
  status.wait.confirmed && status.wait.kind ? `Waiting: ${status.wait.kind}` : "Waiting reason: unknown"
28956
28963
  );
28957
28964
  }
28965
+ if (status.calls) {
28966
+ console.log(
28967
+ `Calls: ${formatCount(status.calls.logicalCalls)} logical, ${formatCount(status.calls.providerRequests)} provider requests, ${formatCount(status.calls.provider429s)} provider 429s`
28968
+ );
28969
+ }
28958
28970
  return 0;
28959
28971
  }
28960
28972
  async function handleRunsRerun(args) {
package/dist/index.d.mts CHANGED
@@ -3478,6 +3478,32 @@ type RunLifecycleStatus = {
3478
3478
  startedAt: number | null;
3479
3479
  finishedAt: number | null;
3480
3480
  };
3481
+ /** Null for scheduler-only admission or a pre-expansion projection row. */
3482
+ source?: {
3483
+ ledgerNextSeq: number | null;
3484
+ };
3485
+ /** One durable current activity, not proof that every row is blocked. */
3486
+ activity?: {
3487
+ kind: string;
3488
+ reason: string | null;
3489
+ targetKind: string | null;
3490
+ observedAt: number | null;
3491
+ nextAt: number | null;
3492
+ } | null;
3493
+ calls?: {
3494
+ logicalCalls: {
3495
+ value: number | null;
3496
+ confirmed: boolean;
3497
+ };
3498
+ providerRequests: {
3499
+ value: number | null;
3500
+ confirmed: boolean;
3501
+ };
3502
+ provider429s: {
3503
+ value: number | null;
3504
+ confirmed: boolean;
3505
+ };
3506
+ };
3481
3507
  steps: {
3482
3508
  observed: number;
3483
3509
  running: number;
package/dist/index.d.ts CHANGED
@@ -3478,6 +3478,32 @@ type RunLifecycleStatus = {
3478
3478
  startedAt: number | null;
3479
3479
  finishedAt: number | null;
3480
3480
  };
3481
+ /** Null for scheduler-only admission or a pre-expansion projection row. */
3482
+ source?: {
3483
+ ledgerNextSeq: number | null;
3484
+ };
3485
+ /** One durable current activity, not proof that every row is blocked. */
3486
+ activity?: {
3487
+ kind: string;
3488
+ reason: string | null;
3489
+ targetKind: string | null;
3490
+ observedAt: number | null;
3491
+ nextAt: number | null;
3492
+ } | null;
3493
+ calls?: {
3494
+ logicalCalls: {
3495
+ value: number | null;
3496
+ confirmed: boolean;
3497
+ };
3498
+ providerRequests: {
3499
+ value: number | null;
3500
+ confirmed: boolean;
3501
+ };
3502
+ provider429s: {
3503
+ value: number | null;
3504
+ confirmed: boolean;
3505
+ };
3506
+ };
3481
3507
  steps: {
3482
3508
  observed: number;
3483
3509
  running: number;
package/dist/index.js CHANGED
@@ -864,7 +864,7 @@ var SDK_RELEASE = {
864
864
  // getters keep their established compatibility behavior.
865
865
  // 0.3.1 deprecated the legacy `deepline enrich` command in favor of Plays.
866
866
  // 0.3.90 is the first deliberately versioned SDK release for API v3.
867
- version: "0.3.211",
867
+ version: "0.3.213",
868
868
  updateSummary: "Play grep now returns concise results with the matched fields and terms. Automatic CLI updates are enabled by default; use `deepline settings autoupdate off` to opt out, `deepline settings autoupdate on` to re-enable updates, or `deepline settings autoupdate pin <version>` to hold an exact release.",
869
869
  packageCapabilities: {
870
870
  updatePreferences: 1
package/dist/index.mjs CHANGED
@@ -768,7 +768,7 @@ var SDK_RELEASE = {
768
768
  // getters keep their established compatibility behavior.
769
769
  // 0.3.1 deprecated the legacy `deepline enrich` command in favor of Plays.
770
770
  // 0.3.90 is the first deliberately versioned SDK release for API v3.
771
- version: "0.3.211",
771
+ version: "0.3.213",
772
772
  updateSummary: "Play grep now returns concise results with the matched fields and terms. Automatic CLI updates are enabled by default; use `deepline settings autoupdate off` to opt out, `deepline settings autoupdate on` to re-enable updates, or `deepline settings autoupdate pin <version>` to hold an exact release.",
773
773
  packageCapabilities: {
774
774
  updatePreferences: 1
@@ -149,7 +149,7 @@ type SdkRelease = {
149
149
  supportPolicy: SdkSupportPolicy;
150
150
  };
151
151
  declare const SDK_RELEASE: {
152
- readonly version: "0.3.211";
152
+ readonly version: "0.3.213";
153
153
  readonly updateSummary: "Play grep now returns concise results with the matched fields and terms. Automatic CLI updates are enabled by default; use `deepline settings autoupdate off` to opt out, `deepline settings autoupdate on` to re-enable updates, or `deepline settings autoupdate pin <version>` to hold an exact release.";
154
154
  readonly packageCapabilities: {
155
155
  readonly updatePreferences: 1;
package/dist/release.d.ts CHANGED
@@ -149,7 +149,7 @@ type SdkRelease = {
149
149
  supportPolicy: SdkSupportPolicy;
150
150
  };
151
151
  declare const SDK_RELEASE: {
152
- readonly version: "0.3.211";
152
+ readonly version: "0.3.213";
153
153
  readonly updateSummary: "Play grep now returns concise results with the matched fields and terms. Automatic CLI updates are enabled by default; use `deepline settings autoupdate off` to opt out, `deepline settings autoupdate on` to re-enable updates, or `deepline settings autoupdate pin <version>` to hold an exact release.";
154
154
  readonly packageCapabilities: {
155
155
  readonly updatePreferences: 1;
package/dist/release.js CHANGED
@@ -74,7 +74,7 @@ var SDK_RELEASE = {
74
74
  // getters keep their established compatibility behavior.
75
75
  // 0.3.1 deprecated the legacy `deepline enrich` command in favor of Plays.
76
76
  // 0.3.90 is the first deliberately versioned SDK release for API v3.
77
- version: "0.3.211",
77
+ version: "0.3.213",
78
78
  updateSummary: "Play grep now returns concise results with the matched fields and terms. Automatic CLI updates are enabled by default; use `deepline settings autoupdate off` to opt out, `deepline settings autoupdate on` to re-enable updates, or `deepline settings autoupdate pin <version>` to hold an exact release.",
79
79
  packageCapabilities: {
80
80
  updatePreferences: 1
package/dist/release.mjs CHANGED
@@ -48,7 +48,7 @@ var SDK_RELEASE = {
48
48
  // getters keep their established compatibility behavior.
49
49
  // 0.3.1 deprecated the legacy `deepline enrich` command in favor of Plays.
50
50
  // 0.3.90 is the first deliberately versioned SDK release for API v3.
51
- version: "0.3.211",
51
+ version: "0.3.213",
52
52
  updateSummary: "Play grep now returns concise results with the matched fields and terms. Automatic CLI updates are enabled by default; use `deepline settings autoupdate off` to opt out, `deepline settings autoupdate on` to re-enable updates, or `deepline settings autoupdate pin <version>` to hold an exact release.",
53
53
  packageCapabilities: {
54
54
  updatePreferences: 1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deepline",
3
- "version": "0.3.211",
3
+ "version": "0.3.213",
4
4
  "description": "GTM data CLI and TypeScript SDK for coding agents",
5
5
  "license": "MIT",
6
6
  "homepage": "https://code.deepline.com",