deepline 0.3.198 → 0.3.200

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.
@@ -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.198',
203
+ version: '0.3.200',
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: {
@@ -13735,51 +13735,70 @@ export class PlayContextImpl implements ScalarPlayAuthoringRuntimeContext {
13735
13735
  const suspendAfterTimeoutMs = timeoutPolicy
13736
13736
  ? timeoutPolicy.suspendAfterTimeoutMs
13737
13737
  : handler.suspendAfterTimeoutMs;
13738
- try {
13739
- await handler.onTimeout?.({
13740
- payload: input,
13741
- context: eventContext,
13742
- boundary: {
13743
- boundaryId: preparedBoundary.boundaryId,
13744
- eventKey: preparedBoundary.eventKey,
13745
- timeoutMs: preparedBoundary.timeoutMs,
13746
- provider: existing.provider ?? handler.provider,
13747
- toolId: existing.toolId ?? handler.toolId,
13748
- ...(existing.messageRef
13749
- ? { messageRef: existing.messageRef }
13750
- : {}),
13751
- ...(existing.requestKey
13752
- ? { requestKey: existing.requestKey }
13753
- : {}),
13754
- ...(existing.interactionId
13755
- ? { interactionId: existing.interactionId }
13738
+ let timeoutFinalizedAt = existing.timeoutFinalizedAt;
13739
+ // This is a replay acknowledgement, not exactly-once execution: a
13740
+ // crash after the provider succeeds but before this checkpoint is
13741
+ // durable can still repeat the finalizer on a later attempt.
13742
+ if (timeoutFinalizedAt === undefined && handler.onTimeout) {
13743
+ try {
13744
+ await handler.onTimeout({
13745
+ payload: input,
13746
+ context: eventContext,
13747
+ boundary: {
13748
+ boundaryId: preparedBoundary.boundaryId,
13749
+ eventKey: preparedBoundary.eventKey,
13750
+ timeoutMs: preparedBoundary.timeoutMs,
13751
+ provider: existing.provider ?? handler.provider,
13752
+ toolId: existing.toolId ?? handler.toolId,
13753
+ ...(existing.messageRef
13754
+ ? { messageRef: existing.messageRef }
13755
+ : {}),
13756
+ ...(existing.requestKey
13757
+ ? { requestKey: existing.requestKey }
13758
+ : {}),
13759
+ ...(existing.interactionId
13760
+ ? { interactionId: existing.interactionId }
13761
+ : {}),
13762
+ ...(timeoutPolicy ? { timeoutPolicy } : {}),
13763
+ },
13764
+ });
13765
+ timeoutFinalizedAt = Date.now();
13766
+ } catch (error) {
13767
+ this.recordSlackHitlTimeoutFailure(error);
13768
+ throw error;
13769
+ }
13770
+ }
13771
+ const persistTimeoutFinalization = (completedAt?: number) => {
13772
+ if (
13773
+ timeoutFinalizedAt === existing.timeoutFinalizedAt &&
13774
+ completedAt === existing.completedAt
13775
+ ) {
13776
+ return;
13777
+ }
13778
+ this.checkpoint.resolvedBoundaries = {
13779
+ ...(this.checkpoint.resolvedBoundaries ?? {}),
13780
+ [preparedBoundary.boundaryId]: {
13781
+ ...existing,
13782
+ ...(completedAt !== undefined ? { completedAt } : {}),
13783
+ ...(timeoutFinalizedAt !== undefined
13784
+ ? { timeoutFinalizedAt }
13756
13785
  : {}),
13757
- ...(timeoutPolicy ? { timeoutPolicy } : {}),
13758
13786
  },
13759
- });
13760
- } catch (error) {
13761
- this.recordSlackHitlTimeoutFailure(error);
13762
- throw error;
13763
- }
13787
+ };
13788
+ this.#options.onBatchComplete?.(this.checkpoint);
13789
+ };
13764
13790
  if (timeoutPolicy?.timeoutOutcome === 'error') {
13765
13791
  // The provider finalizer above must complete first. That ordering
13766
13792
  // makes an expired Slack card and the terminal Play state agree,
13767
13793
  // while provider finalization failures stay retryable instead.
13794
+ persistTimeoutFinalization();
13768
13795
  const error = new SlackHitlTimeoutError(timeoutPolicy.timeoutError);
13769
13796
  this.recordSlackHitlTimeoutFailure(error);
13770
13797
  throw error;
13771
13798
  }
13772
13799
  if (suspendAfterTimeoutMs !== undefined) {
13773
13800
  const finalizedAtMs = existing.completedAt ?? Date.now();
13774
- if (existing.completedAt === undefined) {
13775
- this.checkpoint.resolvedBoundaries = {
13776
- ...(this.checkpoint.resolvedBoundaries ?? {}),
13777
- [preparedBoundary.boundaryId]: {
13778
- ...existing,
13779
- completedAt: finalizedAtMs,
13780
- },
13781
- };
13782
- }
13801
+ persistTimeoutFinalization(finalizedAtMs);
13783
13802
  this.runtimeLog(
13784
13803
  `Integration event ${preparedBoundary.boundaryId}: timeout finalized externally; keeping Play parked`,
13785
13804
  );
@@ -13792,6 +13811,8 @@ export class PlayContextImpl implements ScalarPlayAuthoringRuntimeContext {
13792
13811
  postTimeoutPark: true,
13793
13812
  ...(existing.messageRef ? { messageRef: existing.messageRef } : {}),
13794
13813
  });
13814
+ } else {
13815
+ persistTimeoutFinalization();
13795
13816
  }
13796
13817
  }
13797
13818
  this.runtimeLog(
@@ -1210,6 +1210,8 @@ export interface PlayCheckpoint {
1210
1210
  timeoutPolicy?: IntegrationEventWaitBoundary['timeoutPolicy'];
1211
1211
  output?: unknown;
1212
1212
  completedAt?: number;
1213
+ /** Timestamp of the successful provider timeout finalizer, if any. */
1214
+ timeoutFinalizedAt?: number;
1213
1215
  }
1214
1216
  | {
1215
1217
  kind: 'fetch';
@@ -226,4 +226,5 @@ const fullenrichBulkSelfBatchStrategy: BatchOperationStrategy<
226
226
 
227
227
  export const fullenrichBatchStrategies = defineBatchStrategyMap({
228
228
  fullenrich_bulk_enrich: fullenrichBulkSelfBatchStrategy,
229
+ fullenrich_enrich: fullenrichBulkSelfBatchStrategy,
229
230
  });
@@ -26,7 +26,5 @@ export function getPlayRuntimeBatchStrategy(
26
26
  if (!operation) {
27
27
  return null;
28
28
  }
29
- const canonicalOperation =
30
- operation === 'fullenrich_enrich' ? 'fullenrich_bulk_enrich' : operation;
31
- return PLAY_RUNTIME_BATCH_OPERATION_REGISTRY[canonicalOperation] ?? null;
29
+ return PLAY_RUNTIME_BATCH_OPERATION_REGISTRY[operation] ?? null;
32
30
  }
@@ -70,6 +70,7 @@ import {
70
70
  type DocflowObservationRecord,
71
71
  type DocflowObservationUpsert,
72
72
  } from '../docflow-observation';
73
+ import { normalizePlayDocflowNodeIoState } from '../docflow-node-io';
73
74
  import {
74
75
  workReceiptFailureKindCodeForWrite,
75
76
  workReceiptFailureKindFromCode,
@@ -15714,7 +15715,7 @@ export async function renewPostgresRunLedgerDelivery(
15714
15715
  throw new RunLedgerProjectionLeaseLostError();
15715
15716
  }
15716
15717
 
15717
- /** Only a currently claimed outbox batch may use the projection write path. */
15718
+ /** Only the currently claimed causal prefix may use the projection write path. */
15718
15719
  export async function assertPostgresRunLedgerDelivery(
15719
15720
  client: PostgresSchedulerQueryClient,
15720
15721
  input: {
@@ -15728,64 +15729,106 @@ export async function assertPostgresRunLedgerDelivery(
15728
15729
  const result = await client.query<{
15729
15730
  delivery_key: string;
15730
15731
  event_type: string;
15731
- lease_owner: string;
15732
+ lease_owner: string | null;
15733
+ lease_live: boolean;
15734
+ due: boolean;
15735
+ blocked: boolean;
15732
15736
  }>(
15733
15737
  `
15734
- SELECT outbox.delivery_key, outbox.event_type, outbox.lease_owner
15738
+ SELECT outbox.delivery_key,
15739
+ outbox.event_type,
15740
+ outbox.lease_owner,
15741
+ outbox.lease_expires_at > now() AS lease_live,
15742
+ coalesce(outbox.next_attempt_at, outbox.created_at) <= now() AS due,
15743
+ outbox.failed_at IS NOT NULL AS blocked
15735
15744
  FROM ${tableName('outbox', options)} AS outbox
15736
15745
  JOIN ${tableName('runs', options)} AS runs ON runs.run_id = outbox.run_id
15737
15746
  WHERE outbox.run_id = $1 AND runs.org_id = $2
15738
- AND outbox.delivered_at IS NULL AND outbox.failed_at IS NULL
15739
- AND outbox.lease_owner IS NOT NULL AND outbox.lease_expires_at > now()
15740
- AND ($3::text IS NULL OR outbox.lease_owner = $3)
15741
- ORDER BY outbox.created_at, outbox.event_id
15747
+ AND outbox.delivered_at IS NULL
15748
+ ORDER BY ${runLedgerOrderSql('outbox')}
15742
15749
  `,
15743
- [input.runId, input.orgId, input.leaseOwner ?? null],
15750
+ [input.runId, input.orgId],
15744
15751
  );
15745
- const groups = new Map<string, typeof result.rows>();
15746
- for (const row of result.rows) {
15747
- const group = groups.get(row.lease_owner) ?? [];
15748
- group.push(row);
15749
- groups.set(row.lease_owner, group);
15752
+ const rows = result.rows;
15753
+ const leaseOwner = input.leaseOwner?.trim() || rows[0]?.lease_owner;
15754
+ if (!leaseOwner || rows[0]?.lease_owner !== leaseOwner) {
15755
+ throw new RunLedgerProjectionLeaseLostError();
15750
15756
  }
15751
- for (const rows of groups.values()) {
15752
- const digest = createHash('sha256')
15753
- .update(rows.map((row) => row.delivery_key).join('\n'))
15754
- .digest('hex');
15755
- const batchKey = buildRunLedgerEventsIdempotencyKey({
15756
- runId: input.runId,
15757
- deliveryDigest: digest,
15758
- });
15759
- const terminal = [...rows]
15760
- .reverse()
15761
- .find((row) =>
15762
- ['run.completed', 'run.failed', 'run.cancelled'].includes(
15763
- row.event_type,
15764
- ),
15765
- );
15766
- // The old one-row dispatcher uses run-terminal for nonterminal facts too.
15767
- const single = rows.length === 1 ? rows[0] : terminal;
15768
- const terminalKey = single
15769
- ? buildRunLedgerTerminalIdempotencyKey({
15757
+
15758
+ // A normal projector leases only the batch it is about to send. Cancellation
15759
+ // intentionally transfers the entire pending causal prefix to one stable
15760
+ // owner before synchronously draining it, while run.events are still claimed
15761
+ // one row at a time. Validate the submitted key against a *contiguous due
15762
+ // prefix*, not every row carrying that owner; otherwise a valid cancellation
15763
+ // head is rejected whenever later facts share the cancellation lease.
15764
+ const prefix: typeof rows = [];
15765
+ for (const row of rows) {
15766
+ if (
15767
+ row.lease_owner !== leaseOwner ||
15768
+ row.lease_live !== true ||
15769
+ row.due !== true ||
15770
+ row.blocked === true
15771
+ ) {
15772
+ break;
15773
+ }
15774
+ if (prefix.length > 0 && row.event_type === 'run.events') break;
15775
+ prefix.push(row);
15776
+
15777
+ const first = prefix[0]!;
15778
+ const terminal = prefix.find((candidate) =>
15779
+ ['run.completed', 'run.failed', 'run.cancelled'].includes(
15780
+ candidate.event_type,
15781
+ ),
15782
+ );
15783
+ let expectedKey: string;
15784
+ if (terminal) {
15785
+ expectedKey = buildRunLedgerTerminalIdempotencyKey({
15786
+ runId: input.runId,
15787
+ deliveryKey: terminal.delivery_key,
15788
+ });
15789
+ } else if (
15790
+ prefix.length === 1 &&
15791
+ ['run.created', 'run.started'].includes(first.event_type)
15792
+ ) {
15793
+ expectedKey = buildRunLedgerStartIdempotencyKey({
15794
+ runId: input.runId,
15795
+ deliveryKey: first.delivery_key,
15796
+ });
15797
+ } else {
15798
+ const digest = createHash('sha256')
15799
+ .update(prefix.map((candidate) => candidate.delivery_key).join('\n'))
15800
+ .digest('hex');
15801
+ expectedKey = buildRunLedgerEventsIdempotencyKey({
15802
+ runId: input.runId,
15803
+ deliveryDigest: digest,
15804
+ });
15805
+ }
15806
+ if (input.idempotencyKey === expectedKey) return;
15807
+
15808
+ // The pre-batch projector used run-terminal:<delivery-key> for a single
15809
+ // nonterminal fact. Retain that wire-compatibility key for the current
15810
+ // singleton head, but never let it authorize a later row in the prefix.
15811
+ if (
15812
+ prefix.length === 1 &&
15813
+ !['run.created', 'run.started'].includes(first.event_type) &&
15814
+ input.idempotencyKey ===
15815
+ buildRunLedgerTerminalIdempotencyKey({
15770
15816
  runId: input.runId,
15771
- deliveryKey: single.delivery_key,
15817
+ deliveryKey: first.delivery_key,
15772
15818
  })
15773
- : null;
15774
- const startKey =
15775
- rows.length === 1 &&
15776
- single &&
15777
- ['run.created', 'run.started'].includes(single.event_type)
15778
- ? buildRunLedgerStartIdempotencyKey({
15779
- runId: input.runId,
15780
- deliveryKey: single.delivery_key,
15781
- })
15782
- : null;
15783
- if (
15784
- input.idempotencyKey === batchKey ||
15785
- input.idempotencyKey === terminalKey ||
15786
- input.idempotencyKey === startKey
15787
- )
15819
+ ) {
15788
15820
  return;
15821
+ }
15822
+
15823
+ if (
15824
+ prefix.length === 1 &&
15825
+ ['run.created', 'run.started', 'run.events'].includes(first.event_type)
15826
+ ) {
15827
+ break;
15828
+ }
15829
+ if (terminal || prefix.length >= 8) {
15830
+ break;
15831
+ }
15789
15832
  }
15790
15833
  throw new RunLedgerProjectionLeaseLostError();
15791
15834
  }
@@ -16497,6 +16540,21 @@ export async function markPostgresSchedulerOutboxDelivered(
16497
16540
  return result.rows.length;
16498
16541
  }
16499
16542
 
16543
+ function normalizeOutboxIngressPreview(
16544
+ event: PlayRunLedgerIngressEvent,
16545
+ ): PlayRunLedgerIngressEvent {
16546
+ if (event.type !== 'step.progress' && event.key !== 'step.progress') {
16547
+ return event;
16548
+ }
16549
+ const progress = recordPayload(event.progress);
16550
+ if (!progress || !('nodeIo' in progress)) return event;
16551
+ const nodeIo = normalizePlayDocflowNodeIoState(progress.nodeIo);
16552
+ if (!nodeIo) return event;
16553
+ // Old outbox rows can be delivered to their launch-pinned app deployment.
16554
+ // Make their previews Convex-safe before crossing that older API boundary.
16555
+ return { ...event, progress: { ...progress, nodeIo } };
16556
+ }
16557
+
16500
16558
  export function buildRunLedgerEventsFromPostgresSchedulerOutbox(
16501
16559
  event: PostgresSchedulerOutboxEvent,
16502
16560
  ): PlayRunLedgerIngressEvent[] {
@@ -16523,7 +16581,9 @@ export function buildRunLedgerEventsFromPostgresSchedulerOutbox(
16523
16581
  }
16524
16582
  // Preserve event time, source, opaque payloads and positional log identity;
16525
16583
  // the outbox timestamp orders delivery, not the customer's execution trace.
16526
- return events as AcceptedPlayRunLedgerEvent[];
16584
+ return (events as AcceptedPlayRunLedgerEvent[]).map(
16585
+ normalizeOutboxIngressPreview,
16586
+ );
16527
16587
  }
16528
16588
  if (event.eventType === 'run.started') {
16529
16589
  return [
@@ -16546,7 +16606,7 @@ export function buildRunLedgerEventsFromPostgresSchedulerOutbox(
16546
16606
  const lines = stringArrayPayloadField(event.payload, 'terminalLogLines');
16547
16607
  const resultSummary = payloadField(event.payload, 'resultSummary');
16548
16608
  return [
16549
- ...progressEvents,
16609
+ ...progressEvents.map(normalizeOutboxIngressPreview),
16550
16610
  ...(lines.length === 0
16551
16611
  ? []
16552
16612
  : [
@@ -16584,7 +16644,7 @@ export function buildRunLedgerEventsFromPostgresSchedulerOutbox(
16584
16644
  );
16585
16645
  const resultSummary = payloadField(event.payload, 'resultSummary');
16586
16646
  return [
16587
- ...progressEvents,
16647
+ ...progressEvents.map(normalizeOutboxIngressPreview),
16588
16648
  ...(lines.length === 0
16589
16649
  ? []
16590
16650
  : [
@@ -16965,6 +17025,7 @@ export async function dispatchRunLedgerOutboxToLedgerThroughEventWithClientScope
16965
17025
  withClient,
16966
17026
  {
16967
17027
  ...input,
17028
+ waitForRunLock: true,
16968
17029
  limit:
16969
17030
  remaining === null ? batchSize : Math.min(batchSize, remaining),
16970
17031
  },
@@ -17039,7 +17100,7 @@ export async function dispatchRunLedgerOutboxToLedgerBatchOnceWithClientScope(
17039
17100
  withClient: <T>(
17040
17101
  operation: (client: PostgresSchedulerQueryClient) => Promise<T>,
17041
17102
  ) => Promise<T>,
17042
- input: RunLedgerOutboxDispatchInput,
17103
+ input: RunLedgerOutboxDispatchInput & { waitForRunLock?: boolean },
17043
17104
  options?: Pick<PostgresSchedulerOptions, 'schema'>,
17044
17105
  ): Promise<PostgresSchedulerOutboxProjectionResult> {
17045
17106
  const leaseOwner =
@@ -17052,6 +17113,26 @@ export async function dispatchRunLedgerOutboxToLedgerBatchOnceWithClientScope(
17052
17113
  await client.query('BEGIN');
17053
17114
  try {
17054
17115
  const targetRunId = input.runId?.trim() || null;
17116
+ if (input.waitForRunLock && targetRunId) {
17117
+ // A synchronous drain must not mistake a busy run for an empty
17118
+ // outbox. In particular, cancellation owns its pending prefix lease,
17119
+ // so returning early also prevents background recovery from helping.
17120
+ // Wait only for this run, under the existing cancellation SQL budget,
17121
+ // then select the prefix using a fresh READ COMMITTED snapshot. The
17122
+ // transaction still ends before HTTP; background claims keep SKIP LOCKED.
17123
+ await client.query(
17124
+ `SELECT set_config('lock_timeout', $1, true),
17125
+ set_config('statement_timeout', $2, true)`,
17126
+ [
17127
+ `${RUNTIME_SCHEDULER_CANCEL_LOCK_TIMEOUT_MS}ms`,
17128
+ `${RUNTIME_SCHEDULER_CANCEL_STATEMENT_TIMEOUT_MS}ms`,
17129
+ ],
17130
+ );
17131
+ await client.query(
17132
+ `SELECT run_id FROM ${tableName('runs', options)} WHERE run_id = $1 FOR UPDATE`,
17133
+ [targetRunId],
17134
+ );
17135
+ }
17055
17136
  // A worker fast path always names one run. Keep that lookup on the
17056
17137
  // run-scoped outbox prefix: combining it with global recovery through a
17057
17138
  // nullable predicate made PostgreSQL materialize every pending run head
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.198",
3054
+ version: "0.3.200",
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
@@ -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.198",
3049
+ version: "0.3.200",
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
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.198",
867
+ version: "0.3.200",
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.198",
771
+ version: "0.3.200",
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.198";
152
+ readonly version: "0.3.200";
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.198";
152
+ readonly version: "0.3.200";
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.198",
77
+ version: "0.3.200",
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.198",
51
+ version: "0.3.200",
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.198",
3
+ "version": "0.3.200",
4
4
  "description": "GTM data CLI and TypeScript SDK for coding agents",
5
5
  "license": "MIT",
6
6
  "homepage": "https://code.deepline.com",