deepline 0.3.99 → 0.3.101

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.
@@ -1091,7 +1091,10 @@ export type MonitorBatchExistingSubmitOptions = {
1091
1091
  kind: 'audit' | 'deactivate' | 'reactivate' | 'repair';
1092
1092
  scope: MonitorBatchScope;
1093
1093
  dryRun?: boolean;
1094
- /** Required for deactivate; it is the declared reason shown by health/UI. */
1094
+ /**
1095
+ * A declared policy reason for target deactivation. Omit it for an explicit
1096
+ * customer-owned key teardown; absent is the durable customer intent.
1097
+ */
1095
1098
  deactivationReason?: string;
1096
1099
  /** Stable retry key. Reusing it joins the original durable operation. */
1097
1100
  idempotencyKey: string;
@@ -5,6 +5,7 @@ import { existsSync } from 'node:fs';
5
5
  import { realpath } from 'node:fs/promises';
6
6
  import {
7
7
  bundlePlayFile as bundlePlayFileCore,
8
+ PLAY_BUNDLE_CACHE_NAMESPACE,
8
9
  type BundlePlayFileOptions,
9
10
  type BundledPlayFileSuccess,
10
11
  type BundledPlayFileResult,
@@ -40,7 +41,6 @@ export type {
40
41
 
41
42
  export { extractDefinedPlayName } from '../../../shared_libs/plays/bundling/index.js';
42
43
 
43
- const PLAY_BUNDLE_CACHE_VERSION = 37;
44
44
  const MODULE_DIR = dirname(fileURLToPath(import.meta.url));
45
45
  const SDK_PACKAGE_ROOT = resolve(MODULE_DIR, '..', '..');
46
46
  const SOURCE_REPO_ROOT = resolve(SDK_PACKAGE_ROOT, '..', '..');
@@ -126,10 +126,7 @@ export function createSdkPlayBundlingAdapter(): PlayBundlingAdapter {
126
126
  nodeModulesDir: HAS_PACKAGED_BUNDLING_SOURCES
127
127
  ? resolve(SDK_PACKAGE_ROOT, 'node_modules')
128
128
  : resolve(PROJECT_ROOT, 'node_modules'),
129
- cacheDir: join(
130
- tmpdir(),
131
- `deepline-play-artifacts-v${PLAY_BUNDLE_CACHE_VERSION}`,
132
- ),
129
+ cacheDir: join(tmpdir(), PLAY_BUNDLE_CACHE_NAMESPACE),
133
130
  sdkSourceRoot: SDK_SOURCE_ROOT,
134
131
  sdkPackageJson: SDK_PACKAGE_JSON,
135
132
  sdkEntryFile: SDK_ENTRY_FILE,
@@ -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.99',
203
+ version: '0.3.101',
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: {
@@ -78,7 +78,11 @@ export type ProviderMonitorBatchOperationRequest = {
78
78
  * this origin instead of recomputing it from a later deployment.
79
79
  */
80
80
  callbackBaseUrl?: string;
81
- /** Required for direct/target deactivation; Fleet teardown may be customer-owned. */
81
+ /**
82
+ * A closed, platform-owned reason for a policy teardown. Omit it for a
83
+ * customer-owned exact-key or Fleet teardown: absence is the durable
84
+ * representation of the customer's own inactive intent.
85
+ */
82
86
  deactivationReason?: string;
83
87
  };
84
88
 
@@ -204,13 +208,11 @@ export function validateProviderMonitorBatchOperationRequest(
204
208
  if (request.kind === 'converge') {
205
209
  throw new Error('Batch converge requires exactly one Fleet scope.');
206
210
  }
207
- if (request.kind === 'deactivate' && !request.deactivationReason) {
208
- throw new Error(
209
- 'Batch deactivate requires a declared deactivation reason.',
210
- );
211
- }
212
- if (request.kind === 'deactivate') {
213
- requireMonitorDeactivationReason(request.deactivationReason!);
211
+ if (
212
+ request.kind === 'deactivate' &&
213
+ request.deactivationReason !== undefined
214
+ ) {
215
+ requireMonitorDeactivationReason(request.deactivationReason);
214
216
  }
215
217
  return {
216
218
  ...request,
@@ -59,15 +59,11 @@ import { validatePlaySourceFilesHaveNoInlineSecrets } from '../secret-guardrails
59
59
  import { MAX_PLAY_BUNDLE_BYTES } from './limits';
60
60
  import { PLAY_AUTHORING_CONTRACT_EDITION } from '../authoring-contract';
61
61
 
62
- // The authored tool-error schema and the authored docflow block are both part
63
- // of the artifact bytes. Do not reuse a local bundle cached before either
64
- // compatibility selection or docflow instrumentation entered graph analysis.
65
- // Keep this aligned with the app and SDK adapters' cache namespace.
66
- const PLAY_BUNDLE_CACHE_VERSION = 37;
67
- const PLAY_ARTIFACT_CACHE_DIR = join(
68
- tmpdir(),
69
- `deepline-play-artifacts-v${PLAY_BUNDLE_CACHE_VERSION}`,
70
- );
62
+ // Local bundle caches may be discarded when compiler-only analysis changes;
63
+ // this descriptive namespace is not a runtime wire or schema version.
64
+ export const PLAY_BUNDLE_CACHE_NAMESPACE =
65
+ 'deepline-play-artifacts-docflow-jsdoc';
66
+ const PLAY_ARTIFACT_CACHE_DIR = join(tmpdir(), PLAY_BUNDLE_CACHE_NAMESPACE);
71
67
  const PLAY_PROXY_NAMESPACE = 'deepline-play-runtime-ref';
72
68
  const SOURCE_EXTENSIONS = [
73
69
  '.ts',
@@ -1,6 +1,6 @@
1
1
  import { tmpdir } from 'node:os';
2
2
  import { join, resolve } from 'node:path';
3
- import type { PlayBundlingAdapter } from './index';
3
+ import { PLAY_BUNDLE_CACHE_NAMESPACE, type PlayBundlingAdapter } from './index';
4
4
  import { discoverPackagedLocalFiles } from '../local-file-discovery';
5
5
 
6
6
  /** Repository source bundling shared by the API and the deploy worker.
@@ -15,7 +15,7 @@ export function createRepositoryPlayBundlingAdapter(options: {
15
15
  projectRoot: options.projectRoot,
16
16
  sourceIdentityRoot: options.sourceIdentityRoot,
17
17
  nodeModulesDir: resolve(options.projectRoot, 'node_modules'),
18
- cacheDir: join(tmpdir(), 'deepline-play-artifacts-v37'),
18
+ cacheDir: join(tmpdir(), PLAY_BUNDLE_CACHE_NAMESPACE),
19
19
  sdkSourceRoot,
20
20
  sdkPackageJson: resolve(sdkSourceRoot, '..', 'package.json'),
21
21
  sdkEntryFile: resolve(sdkSourceRoot, 'index.ts'),
@@ -44,6 +44,7 @@ export type PlayProjectDoc = {
44
44
  productionBranch: string;
45
45
  checkOnPullRequest: boolean;
46
46
  disabledAt?: number;
47
+ unlinkedAt?: number;
47
48
  createdByUserId: string;
48
49
  createdAt: number;
49
50
  updatedAt: number;
@@ -617,7 +617,7 @@ function levenshtein(left: string, right: string): number {
617
617
  return row[right.length]!;
618
618
  }
619
619
 
620
- const MERMAID_BLOCK = /\/\*\*\s*@mermaid(?:\s|\r?\n)([\s\S]*?)\*\//g;
620
+ const JSDOC_BLOCK = /\/\*\*([\s\S]*?)\*\//g;
621
621
  /**
622
622
  * What a block header may name: an export name, or the play's own kebab-case
623
623
  * name. Hyphens are in the set for the second — `@mermaid name-to-linkedin-url-
@@ -935,9 +935,12 @@ export function parsePlayDocflowFile(
935
935
  syntax: NonNullable<PlayDocflow['syntax']>;
936
936
  body: string;
937
937
  }> = [];
938
- MERMAID_BLOCK.lastIndex = 0;
939
- for (const match of sourceCode.matchAll(MERMAID_BLOCK)) {
940
- rawBlocks.push({ syntax: 'mermaid', body: cleanBlockBody(match[1]!) });
938
+ JSDOC_BLOCK.lastIndex = 0;
939
+ for (const match of sourceCode.matchAll(JSDOC_BLOCK)) {
940
+ const cleanedBody = cleanBlockBody(match[1]!);
941
+ const mermaid = /^@mermaid(?:[ \t]+|\r?\n|$)([\s\S]*)$/.exec(cleanedBody);
942
+ if (!mermaid) continue;
943
+ rawBlocks.push({ syntax: 'mermaid', body: mermaid[1]!.trim() });
941
944
  }
942
945
  if (rawBlocks.length === 0) return { blocks: [], bindings: [], errors };
943
946
 
@@ -2,6 +2,10 @@ const REDACTED_VALUE = '[REDACTED]';
2
2
 
3
3
  type SecretRedactionOptions = {
4
4
  redactHighEntropy?: boolean;
5
+ /** Preserve only known pagination cursor fields in authenticated result data. */
6
+ keyPolicy?: 'strict' | 'public-result';
7
+ /** Replace sample cursor values with a non-capability-bearing placeholder. */
8
+ placeholderContinuationValues?: boolean;
5
9
  };
6
10
 
7
11
  const SENSITIVE_KEY_PATTERNS = [
@@ -16,6 +20,55 @@ const SENSITIVE_KEY_PATTERNS = [
16
20
  /private/i,
17
21
  ];
18
22
 
23
+ const PUBLIC_RESULT_CURSOR_KEYS = new Set([
24
+ 'cursor',
25
+ 'encoded_cursor',
26
+ 'encodedCursor',
27
+ 'next_cursor',
28
+ 'nextCursor',
29
+ 'scroll_token',
30
+ 'scrollToken',
31
+ 'pagination_token',
32
+ 'paginationToken',
33
+ 'continuation_token',
34
+ 'continuationToken',
35
+ 'page_token',
36
+ 'pageToken',
37
+ 'next_page_token',
38
+ 'nextPageToken',
39
+ 'previous_page_token',
40
+ 'previousPageToken',
41
+ 'prev_page_token',
42
+ 'prevPageToken',
43
+ 'next_token',
44
+ 'nextToken',
45
+ 'offset_token',
46
+ 'offsetToken',
47
+ ]);
48
+
49
+ const PUBLIC_RESULT_TOKEN_EXPIRY_KEYS = new Set([
50
+ 'page_token_expiry',
51
+ 'pageTokenExpiry',
52
+ ]);
53
+
54
+ const PUBLIC_RESULT_TOKEN_COUNT_KEYS = new Set([
55
+ 'input_tokens',
56
+ 'inputTokens',
57
+ 'output_tokens',
58
+ 'outputTokens',
59
+ 'total_tokens',
60
+ 'totalTokens',
61
+ 'tokens_used',
62
+ 'tokensUsed',
63
+ ]);
64
+
65
+ const PAGINATION_CONTAINER_KEYS = new Set([
66
+ 'pagination',
67
+ 'paging',
68
+ 'page_info',
69
+ 'pageInfo',
70
+ ]);
71
+
19
72
  const SAFE_IDENTIFIER_KEYS = new Set([
20
73
  'artifactHash',
21
74
  'artifactHashes',
@@ -135,6 +188,39 @@ function shouldRedactKey(key: string) {
135
188
  return SENSITIVE_KEY_PATTERNS.some((pattern) => pattern.test(key));
136
189
  }
137
190
 
191
+ function isPublicResultCursorKey(
192
+ key: string,
193
+ path: readonly string[],
194
+ ): boolean {
195
+ return (
196
+ PUBLIC_RESULT_CURSOR_KEYS.has(key) ||
197
+ (key === 'token' && PAGINATION_CONTAINER_KEYS.has(path.at(-1) ?? ''))
198
+ );
199
+ }
200
+
201
+ function isPublicResultSafeTokenKey(
202
+ key: string,
203
+ path: readonly string[],
204
+ value: unknown,
205
+ ): boolean {
206
+ if (isPublicResultCursorKey(key, path)) return true;
207
+ if (value === null) {
208
+ return (
209
+ PUBLIC_RESULT_TOKEN_EXPIRY_KEYS.has(key) ||
210
+ PUBLIC_RESULT_TOKEN_COUNT_KEYS.has(key)
211
+ );
212
+ }
213
+ if (PUBLIC_RESULT_TOKEN_COUNT_KEYS.has(key)) {
214
+ return typeof value === 'number' && Number.isFinite(value) && value >= 0;
215
+ }
216
+ return (
217
+ PUBLIC_RESULT_TOKEN_EXPIRY_KEYS.has(key) &&
218
+ typeof value === 'string' &&
219
+ /^\d{4}-\d{2}-\d{2}T/.test(value) &&
220
+ Number.isFinite(Date.parse(value))
221
+ );
222
+ }
223
+
138
224
  function maybeRedactString(value: string, options: SecretRedactionOptions) {
139
225
  if (EXPLICIT_SECRET_VALUE_PATTERNS.some((pattern) => pattern.test(value))) {
140
226
  return REDACTED_VALUE;
@@ -171,6 +257,21 @@ export function redactSecretsInValue<T>(
171
257
  if (parentKey && SAFE_IDENTIFIER_KEYS.has(parentKey)) {
172
258
  return value as T;
173
259
  }
260
+ if (
261
+ parentKey &&
262
+ options.keyPolicy === 'public-result' &&
263
+ isPublicResultSafeTokenKey(parentKey, [], value)
264
+ ) {
265
+ const redacted = maybeRedactString(value, options);
266
+ return (
267
+ options.placeholderContinuationValues &&
268
+ isPublicResultCursorKey(parentKey, []) &&
269
+ redacted !== REDACTED_VALUE &&
270
+ redacted.length > 0
271
+ ? '[PAGINATION_CURSOR]'
272
+ : redacted
273
+ ) as T;
274
+ }
174
275
  if (parentKey && shouldRedactKey(parentKey)) {
175
276
  return REDACTED_VALUE as T;
176
277
  }
@@ -185,7 +286,8 @@ export function redactSecretsInValue<T>(
185
286
  source: Container;
186
287
  target: Container;
187
288
  parentKey?: string;
188
- }> = [{ source: value as Container, target: root, parentKey }];
289
+ path: string[];
290
+ }> = [{ source: value as Container, target: root, parentKey, path: [] }];
189
291
 
190
292
  const redactNestedValue = (
191
293
  item: unknown,
@@ -196,7 +298,9 @@ export function redactSecretsInValue<T>(
196
298
  return REDACTED_VALUE;
197
299
  }
198
300
  if (itemParentKey && SAFE_IDENTIFIER_KEYS.has(itemParentKey)) return item;
199
- if (itemParentKey && shouldRedactKey(itemParentKey)) return REDACTED_VALUE;
301
+ if (itemParentKey && shouldRedactKey(itemParentKey)) {
302
+ return REDACTED_VALUE;
303
+ }
200
304
  return maybeRedactString(item, options);
201
305
  };
202
306
 
@@ -206,6 +310,24 @@ export function redactSecretsInValue<T>(
206
310
  const sourceIsArray = Array.isArray(current.source);
207
311
  for (const [key, item] of Object.entries(current.source)) {
208
312
  const itemParentKey = sourceIsArray ? current.parentKey : key;
313
+ if (
314
+ !sourceIsArray &&
315
+ options.keyPolicy === 'public-result' &&
316
+ isPublicResultSafeTokenKey(key, current.path, item) &&
317
+ (!item || typeof item !== 'object')
318
+ ) {
319
+ const redacted =
320
+ typeof item === 'string' ? maybeRedactString(item, options) : item;
321
+ (current.target as Record<string, unknown>)[key] =
322
+ options.placeholderContinuationValues &&
323
+ isPublicResultCursorKey(key, current.path) &&
324
+ typeof redacted === 'string' &&
325
+ redacted !== REDACTED_VALUE &&
326
+ redacted.length > 0
327
+ ? '[PAGINATION_CURSOR]'
328
+ : redacted;
329
+ continue;
330
+ }
209
331
  if (!sourceIsArray && shouldRedactKey(key)) {
210
332
  (current.target as Record<string, unknown>)[key] = REDACTED_VALUE;
211
333
  continue;
@@ -217,6 +339,7 @@ export function redactSecretsInValue<T>(
217
339
  source: item as Container,
218
340
  target: nestedTarget,
219
341
  parentKey: itemParentKey,
342
+ path: sourceIsArray ? current.path : [...current.path, key],
220
343
  });
221
344
  continue;
222
345
  }
@@ -242,6 +365,18 @@ export function redactSecretsInCustomerValue<T>(
242
365
  return redactSecretsInValue(value, parentKey, { redactHighEntropy: false });
243
366
  }
244
367
 
368
+ /** Redaction for authenticated successful provider or Play result data. */
369
+ export function redactSecretsInPublicResultValue<T>(
370
+ value: T,
371
+ options: { placeholderContinuationValues?: boolean } = {},
372
+ ): T {
373
+ return redactSecretsInValue(value, undefined, {
374
+ redactHighEntropy: false,
375
+ keyPolicy: 'public-result',
376
+ placeholderContinuationValues: options.placeholderContinuationValues,
377
+ });
378
+ }
379
+
245
380
  export function redactSecretsInJsonText(
246
381
  text: string,
247
382
  options: SecretRedactionOptions = {},
@@ -265,3 +400,11 @@ export function redactSecretsInJsonText(
265
400
  export function redactSecretsInCustomerJsonText(text: string) {
266
401
  return redactSecretsInJsonText(text, { redactHighEntropy: false });
267
402
  }
403
+
404
+ /** Redaction for serialized authenticated provider or Play result data. */
405
+ export function redactSecretsInPublicResultJsonText(text: string) {
406
+ return redactSecretsInJsonText(text, {
407
+ redactHighEntropy: false,
408
+ keyPolicy: 'public-result',
409
+ });
410
+ }
package/dist/cli/index.js CHANGED
@@ -1298,7 +1298,7 @@ var SDK_RELEASE = {
1298
1298
  // getters keep their established compatibility behavior.
1299
1299
  // 0.3.1 deprecated the legacy `deepline enrich` command in favor of Plays.
1300
1300
  // 0.3.90 is the first deliberately versioned SDK release for API v3.
1301
- version: "0.3.99",
1301
+ version: "0.3.101",
1302
1302
  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.",
1303
1303
  packageCapabilities: {
1304
1304
  updatePreferences: 1
@@ -9780,7 +9780,10 @@ Examples:
9780
9780
  deepline auth register --wait no
9781
9781
  deepline auth register --auth-scope folder --wait no
9782
9782
  `
9783
- ).option("--org-name <name>", "Workspace name to prefill").option(
9783
+ ).option(
9784
+ "--org-name <name>",
9785
+ "Use this workspace, or create a separate one with this name"
9786
+ ).option(
9784
9787
  "--org-id <id>",
9785
9788
  "Bind to this workspace directly, skipping the browser picker"
9786
9789
  ).option("--agent-name <name>", "Agent name to register").option("--wait <mode>", "Wait mode: auto, yes, or no", "auto").option("--no-wait", "Alias for --wait no").option(
@@ -10180,7 +10183,7 @@ async function handleUsage(options) {
10180
10183
  `Balance: ${payload.balance ?? "(unknown)"}`,
10181
10184
  `Last 30 days usage: ${last30Usage ?? "(unknown)"}`,
10182
10185
  ...Number.isFinite(temporaryHolds) && temporaryHolds > 0 ? [`Temporary holds: ${temporaryHolds}`] : [],
10183
- `Monthly spend guidance: ${quota.enabled ? quota.monthly_credits_limit ?? "(unknown)" : "off"}`,
10186
+ `Monthly usage cap: ${quota.enabled ? quota.monthly_credits_limit ?? "(unknown)" : "off"}`,
10184
10187
  ...options.runId && recent.run_id ? [
10185
10188
  `Run spend: ${(payload.run ?? {}).spent_credits ?? "(unknown)"} Deepline Credits`
10186
10189
  ] : [],
@@ -10212,9 +10215,9 @@ async function handleLimit(options) {
10212
10215
  "/api/v2/billing/limit"
10213
10216
  );
10214
10217
  const lines = payload.enabled ? [
10215
- `Monthly spend guidance: ${payload.monthly_credits_limit ?? "(unknown)"}`,
10216
- "Enforcement: advisory; available balance remains the exact admission control."
10217
- ] : ["Monthly spend guidance: off"];
10218
+ `Monthly usage cap: ${payload.monthly_credits_limit ?? "(unknown)"}`,
10219
+ "Enforcement: checked before new calls; in-flight work can exceed the cap."
10220
+ ] : ["Monthly usage cap: off"];
10218
10221
  printCommandEnvelope(
10219
10222
  {
10220
10223
  ...payload,
@@ -10236,7 +10239,7 @@ async function handleSetLimit(credits, options) {
10236
10239
  sections: [
10237
10240
  {
10238
10241
  title: "billing limit",
10239
- lines: [`Monthly spend guidance set to ${credits} credits.`]
10242
+ lines: [`Monthly usage cap set to ${credits} credits.`]
10240
10243
  }
10241
10244
  ]
10242
10245
  }
@@ -10256,7 +10259,7 @@ async function handleLimitOff(options) {
10256
10259
  sections: [
10257
10260
  {
10258
10261
  title: "billing limit",
10259
- lines: ["Monthly spend guidance is now off."]
10262
+ lines: ["Monthly usage cap is now off."]
10260
10263
  }
10261
10264
  ]
10262
10265
  }
@@ -11097,36 +11100,36 @@ Examples:
11097
11100
  "--cursor <cursor>",
11098
11101
  "Recent-call cursor from the previous response"
11099
11102
  ).option("--run-id <run_id>", "Show recent usage for one play run").option("--json", "Emit JSON output. Also automatic when stdout is piped").action(handleUsage);
11100
- billing.command("limit").description("Show configured monthly spend guidance.").addHelpText(
11103
+ billing.command("limit").description("Show configured monthly usage cap.").addHelpText(
11101
11104
  "after",
11102
11105
  `
11103
11106
  Notes:
11104
- Read-only. Shows whether monthly workspace spend guidance is enabled.
11105
- Guidance does not reject funded work; available balance remains exact.
11107
+ Read-only. Shows whether monthly workspace usage cap is enabled.
11108
+ New calls are checked against this usage cap, separately from wallet funding.
11106
11109
 
11107
11110
  Examples:
11108
11111
  deepline billing limit
11109
11112
  deepline billing limit --json
11110
11113
  `
11111
11114
  ).option("--json", "Emit JSON output. Also automatic when stdout is piped").action(handleLimit);
11112
- billing.command("set-limit").description("Set monthly spend guidance.").addHelpText(
11115
+ billing.command("set-limit").description("Set monthly usage cap.").addHelpText(
11113
11116
  "after",
11114
11117
  `
11115
11118
  Notes:
11116
11119
  Mutates workspace billing settings. The argument is a Deepline credit amount,
11117
- not dollars and not provider credits. Guidance is advisory; it does not
11118
- replace the exact available-balance admission check.
11120
+ not dollars and not provider credits. New calls are checked against the cap;
11121
+ in-flight work can still finish and exceed it. Buying credits does not reset it.
11119
11122
 
11120
11123
  Examples:
11121
11124
  deepline billing set-limit 500
11122
11125
  deepline billing set-limit 500 --json
11123
11126
  `
11124
11127
  ).argument("<credits>", "Monthly credits limit").option("--json", "Emit JSON output. Also automatic when stdout is piped").action(handleSetLimit);
11125
- billing.command("off").description("Disable monthly spend guidance.").addHelpText(
11128
+ billing.command("off").description("Disable monthly usage cap.").addHelpText(
11126
11129
  "after",
11127
11130
  `
11128
11131
  Notes:
11129
- Mutates workspace billing settings by removing monthly Deepline spend guidance.
11132
+ Mutates workspace billing settings by removing monthly Deepline usage cap.
11130
11133
 
11131
11134
  Examples:
11132
11135
  deepline billing off
@@ -16555,11 +16558,8 @@ function collectInlineSecretFindings(sourceCode) {
16555
16558
  var MAX_PLAY_BUNDLE_BYTES = 30 * 1024 * 1024;
16556
16559
 
16557
16560
  // ../plays/bundling/index.ts
16558
- var PLAY_BUNDLE_CACHE_VERSION = 37;
16559
- var PLAY_ARTIFACT_CACHE_DIR = (0, import_node_path11.join)(
16560
- (0, import_node_os7.tmpdir)(),
16561
- `deepline-play-artifacts-v${PLAY_BUNDLE_CACHE_VERSION}`
16562
- );
16561
+ var PLAY_BUNDLE_CACHE_NAMESPACE = "deepline-play-artifacts-docflow-jsdoc";
16562
+ var PLAY_ARTIFACT_CACHE_DIR = (0, import_node_path11.join)((0, import_node_os7.tmpdir)(), PLAY_BUNDLE_CACHE_NAMESPACE);
16563
16563
  var NODE_BUILTIN_SET = new Set(
16564
16564
  import_node_module.builtinModules.flatMap(
16565
16565
  (name) => name.startsWith("node:") ? [name, name.slice(5)] : [name, `node:${name}`]
@@ -35399,6 +35399,28 @@ function monitorBatchScope(options, kind) {
35399
35399
  function monitorBatchIdempotencyKey(kind, value) {
35400
35400
  return value?.trim() || `monitor-batch-${kind}-${(0, import_node_crypto8.randomUUID)()}`;
35401
35401
  }
35402
+ function legacyDryRunManifest(raw) {
35403
+ let parsed;
35404
+ try {
35405
+ parsed = JSON.parse(raw);
35406
+ } catch {
35407
+ return raw;
35408
+ }
35409
+ const object = asRecord2(parsed);
35410
+ if (object && asString(object.key) && asString(object.tool)) {
35411
+ return raw;
35412
+ }
35413
+ const isBatchDocument = Array.isArray(parsed) || object !== null && (Object.prototype.hasOwnProperty.call(object, "monitors") || object.kind === "batch");
35414
+ if (!isBatchDocument) return raw;
35415
+ const lint = lintMonitorBatchInput(parsed);
35416
+ if (!lint.normalized) {
35417
+ throw new MonitorsUsageError(
35418
+ lint.issues.filter((issue) => issue.severity === "error").map((issue) => `${issue.path || "batch"}: ${issue.message}`).join("; ")
35419
+ );
35420
+ }
35421
+ return `${lint.normalized.monitors.map((monitor) => JSON.stringify(monitor)).join("\n")}
35422
+ `;
35423
+ }
35402
35424
  async function handleMonitorBatchDeploy(options) {
35403
35425
  if (!options.file?.trim()) {
35404
35426
  throw new MonitorsUsageError(
@@ -35421,6 +35443,9 @@ async function handleMonitorBatchDeploy(options) {
35421
35443
  if (!manifestNdjson.trim()) {
35422
35444
  throw new MonitorsUsageError("Monitor batch manifest is empty.");
35423
35445
  }
35446
+ if (options.dryRun === true) {
35447
+ manifestNdjson = legacyDryRunManifest(manifestNdjson);
35448
+ }
35424
35449
  const idempotencyKey = monitorBatchIdempotencyKey(
35425
35450
  "deploy",
35426
35451
  options.idempotencyKey
@@ -35450,9 +35475,10 @@ async function handleMonitorBatch(kind, options) {
35450
35475
  `monitors batch ${kind} changes provider monitors asynchronously. Preview with --dry-run, then confirm with --yes.`
35451
35476
  );
35452
35477
  }
35453
- if (kind === "deactivate" && !options.reason?.trim()) {
35478
+ const scope = monitorBatchScope(options, kind);
35479
+ if (kind === "deactivate" && scope.kind === "target" && !options.reason?.trim()) {
35454
35480
  throw new MonitorsUsageError(
35455
- "monitors batch deactivate requires --reason (for example insufficient_balance or billing_failure)."
35481
+ "monitors batch deactivate --target requires --reason (for example insufficient_balance or billing_failure). Omit --reason with --keys for a customer-requested teardown."
35456
35482
  );
35457
35483
  }
35458
35484
  const idempotencyKey = monitorBatchIdempotencyKey(
@@ -35461,7 +35487,7 @@ async function handleMonitorBatch(kind, options) {
35461
35487
  );
35462
35488
  const result = await new DeeplineClient().monitors.batch.submit({
35463
35489
  kind,
35464
- scope: monitorBatchScope(options, kind),
35490
+ scope,
35465
35491
  dryRun: options.dryRun === true,
35466
35492
  ...options.reason?.trim() ? { deactivationReason: options.reason.trim() } : {},
35467
35493
  idempotencyKey
@@ -35666,7 +35692,10 @@ Examples:
35666
35692
  batch.command("deactivate").description(
35667
35693
  "Durably deactivate a selection through provider batch deletes."
35668
35694
  )
35669
- ).requiredOption("--reason <reason>", "Declared deactivation reason").option("--yes", "Confirm the asynchronous provider deactivation")
35695
+ ).option(
35696
+ "--reason <reason>",
35697
+ "Declared policy reason; required with --target and omitted for a customer-requested --keys teardown"
35698
+ ).option("--yes", "Confirm the asynchronous provider deactivation")
35670
35699
  ).action(
35671
35700
  monitorsAction(
35672
35701
  (options) => handleMonitorBatch("deactivate", options)
@@ -1271,7 +1271,7 @@ var SDK_RELEASE = {
1271
1271
  // getters keep their established compatibility behavior.
1272
1272
  // 0.3.1 deprecated the legacy `deepline enrich` command in favor of Plays.
1273
1273
  // 0.3.90 is the first deliberately versioned SDK release for API v3.
1274
- version: "0.3.99",
1274
+ version: "0.3.101",
1275
1275
  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.",
1276
1276
  packageCapabilities: {
1277
1277
  updatePreferences: 1
@@ -9765,7 +9765,10 @@ Examples:
9765
9765
  deepline auth register --wait no
9766
9766
  deepline auth register --auth-scope folder --wait no
9767
9767
  `
9768
- ).option("--org-name <name>", "Workspace name to prefill").option(
9768
+ ).option(
9769
+ "--org-name <name>",
9770
+ "Use this workspace, or create a separate one with this name"
9771
+ ).option(
9769
9772
  "--org-id <id>",
9770
9773
  "Bind to this workspace directly, skipping the browser picker"
9771
9774
  ).option("--agent-name <name>", "Agent name to register").option("--wait <mode>", "Wait mode: auto, yes, or no", "auto").option("--no-wait", "Alias for --wait no").option(
@@ -10165,7 +10168,7 @@ async function handleUsage(options) {
10165
10168
  `Balance: ${payload.balance ?? "(unknown)"}`,
10166
10169
  `Last 30 days usage: ${last30Usage ?? "(unknown)"}`,
10167
10170
  ...Number.isFinite(temporaryHolds) && temporaryHolds > 0 ? [`Temporary holds: ${temporaryHolds}`] : [],
10168
- `Monthly spend guidance: ${quota.enabled ? quota.monthly_credits_limit ?? "(unknown)" : "off"}`,
10171
+ `Monthly usage cap: ${quota.enabled ? quota.monthly_credits_limit ?? "(unknown)" : "off"}`,
10169
10172
  ...options.runId && recent.run_id ? [
10170
10173
  `Run spend: ${(payload.run ?? {}).spent_credits ?? "(unknown)"} Deepline Credits`
10171
10174
  ] : [],
@@ -10197,9 +10200,9 @@ async function handleLimit(options) {
10197
10200
  "/api/v2/billing/limit"
10198
10201
  );
10199
10202
  const lines = payload.enabled ? [
10200
- `Monthly spend guidance: ${payload.monthly_credits_limit ?? "(unknown)"}`,
10201
- "Enforcement: advisory; available balance remains the exact admission control."
10202
- ] : ["Monthly spend guidance: off"];
10203
+ `Monthly usage cap: ${payload.monthly_credits_limit ?? "(unknown)"}`,
10204
+ "Enforcement: checked before new calls; in-flight work can exceed the cap."
10205
+ ] : ["Monthly usage cap: off"];
10203
10206
  printCommandEnvelope(
10204
10207
  {
10205
10208
  ...payload,
@@ -10221,7 +10224,7 @@ async function handleSetLimit(credits, options) {
10221
10224
  sections: [
10222
10225
  {
10223
10226
  title: "billing limit",
10224
- lines: [`Monthly spend guidance set to ${credits} credits.`]
10227
+ lines: [`Monthly usage cap set to ${credits} credits.`]
10225
10228
  }
10226
10229
  ]
10227
10230
  }
@@ -10241,7 +10244,7 @@ async function handleLimitOff(options) {
10241
10244
  sections: [
10242
10245
  {
10243
10246
  title: "billing limit",
10244
- lines: ["Monthly spend guidance is now off."]
10247
+ lines: ["Monthly usage cap is now off."]
10245
10248
  }
10246
10249
  ]
10247
10250
  }
@@ -11082,36 +11085,36 @@ Examples:
11082
11085
  "--cursor <cursor>",
11083
11086
  "Recent-call cursor from the previous response"
11084
11087
  ).option("--run-id <run_id>", "Show recent usage for one play run").option("--json", "Emit JSON output. Also automatic when stdout is piped").action(handleUsage);
11085
- billing.command("limit").description("Show configured monthly spend guidance.").addHelpText(
11088
+ billing.command("limit").description("Show configured monthly usage cap.").addHelpText(
11086
11089
  "after",
11087
11090
  `
11088
11091
  Notes:
11089
- Read-only. Shows whether monthly workspace spend guidance is enabled.
11090
- Guidance does not reject funded work; available balance remains exact.
11092
+ Read-only. Shows whether monthly workspace usage cap is enabled.
11093
+ New calls are checked against this usage cap, separately from wallet funding.
11091
11094
 
11092
11095
  Examples:
11093
11096
  deepline billing limit
11094
11097
  deepline billing limit --json
11095
11098
  `
11096
11099
  ).option("--json", "Emit JSON output. Also automatic when stdout is piped").action(handleLimit);
11097
- billing.command("set-limit").description("Set monthly spend guidance.").addHelpText(
11100
+ billing.command("set-limit").description("Set monthly usage cap.").addHelpText(
11098
11101
  "after",
11099
11102
  `
11100
11103
  Notes:
11101
11104
  Mutates workspace billing settings. The argument is a Deepline credit amount,
11102
- not dollars and not provider credits. Guidance is advisory; it does not
11103
- replace the exact available-balance admission check.
11105
+ not dollars and not provider credits. New calls are checked against the cap;
11106
+ in-flight work can still finish and exceed it. Buying credits does not reset it.
11104
11107
 
11105
11108
  Examples:
11106
11109
  deepline billing set-limit 500
11107
11110
  deepline billing set-limit 500 --json
11108
11111
  `
11109
11112
  ).argument("<credits>", "Monthly credits limit").option("--json", "Emit JSON output. Also automatic when stdout is piped").action(handleSetLimit);
11110
- billing.command("off").description("Disable monthly spend guidance.").addHelpText(
11113
+ billing.command("off").description("Disable monthly usage cap.").addHelpText(
11111
11114
  "after",
11112
11115
  `
11113
11116
  Notes:
11114
- Mutates workspace billing settings by removing monthly Deepline spend guidance.
11117
+ Mutates workspace billing settings by removing monthly Deepline usage cap.
11115
11118
 
11116
11119
  Examples:
11117
11120
  deepline billing off
@@ -16598,11 +16601,8 @@ function collectInlineSecretFindings(sourceCode) {
16598
16601
  var MAX_PLAY_BUNDLE_BYTES = 30 * 1024 * 1024;
16599
16602
 
16600
16603
  // ../plays/bundling/index.ts
16601
- var PLAY_BUNDLE_CACHE_VERSION = 37;
16602
- var PLAY_ARTIFACT_CACHE_DIR = join7(
16603
- tmpdir2(),
16604
- `deepline-play-artifacts-v${PLAY_BUNDLE_CACHE_VERSION}`
16605
- );
16604
+ var PLAY_BUNDLE_CACHE_NAMESPACE = "deepline-play-artifacts-docflow-jsdoc";
16605
+ var PLAY_ARTIFACT_CACHE_DIR = join7(tmpdir2(), PLAY_BUNDLE_CACHE_NAMESPACE);
16606
16606
  var NODE_BUILTIN_SET = new Set(
16607
16607
  builtinModules.flatMap(
16608
16608
  (name) => name.startsWith("node:") ? [name, name.slice(5)] : [name, `node:${name}`]
@@ -35456,6 +35456,28 @@ function monitorBatchScope(options, kind) {
35456
35456
  function monitorBatchIdempotencyKey(kind, value) {
35457
35457
  return value?.trim() || `monitor-batch-${kind}-${randomUUID5()}`;
35458
35458
  }
35459
+ function legacyDryRunManifest(raw) {
35460
+ let parsed;
35461
+ try {
35462
+ parsed = JSON.parse(raw);
35463
+ } catch {
35464
+ return raw;
35465
+ }
35466
+ const object = asRecord2(parsed);
35467
+ if (object && asString(object.key) && asString(object.tool)) {
35468
+ return raw;
35469
+ }
35470
+ const isBatchDocument = Array.isArray(parsed) || object !== null && (Object.prototype.hasOwnProperty.call(object, "monitors") || object.kind === "batch");
35471
+ if (!isBatchDocument) return raw;
35472
+ const lint = lintMonitorBatchInput(parsed);
35473
+ if (!lint.normalized) {
35474
+ throw new MonitorsUsageError(
35475
+ lint.issues.filter((issue) => issue.severity === "error").map((issue) => `${issue.path || "batch"}: ${issue.message}`).join("; ")
35476
+ );
35477
+ }
35478
+ return `${lint.normalized.monitors.map((monitor) => JSON.stringify(monitor)).join("\n")}
35479
+ `;
35480
+ }
35459
35481
  async function handleMonitorBatchDeploy(options) {
35460
35482
  if (!options.file?.trim()) {
35461
35483
  throw new MonitorsUsageError(
@@ -35478,6 +35500,9 @@ async function handleMonitorBatchDeploy(options) {
35478
35500
  if (!manifestNdjson.trim()) {
35479
35501
  throw new MonitorsUsageError("Monitor batch manifest is empty.");
35480
35502
  }
35503
+ if (options.dryRun === true) {
35504
+ manifestNdjson = legacyDryRunManifest(manifestNdjson);
35505
+ }
35481
35506
  const idempotencyKey = monitorBatchIdempotencyKey(
35482
35507
  "deploy",
35483
35508
  options.idempotencyKey
@@ -35507,9 +35532,10 @@ async function handleMonitorBatch(kind, options) {
35507
35532
  `monitors batch ${kind} changes provider monitors asynchronously. Preview with --dry-run, then confirm with --yes.`
35508
35533
  );
35509
35534
  }
35510
- if (kind === "deactivate" && !options.reason?.trim()) {
35535
+ const scope = monitorBatchScope(options, kind);
35536
+ if (kind === "deactivate" && scope.kind === "target" && !options.reason?.trim()) {
35511
35537
  throw new MonitorsUsageError(
35512
- "monitors batch deactivate requires --reason (for example insufficient_balance or billing_failure)."
35538
+ "monitors batch deactivate --target requires --reason (for example insufficient_balance or billing_failure). Omit --reason with --keys for a customer-requested teardown."
35513
35539
  );
35514
35540
  }
35515
35541
  const idempotencyKey = monitorBatchIdempotencyKey(
@@ -35518,7 +35544,7 @@ async function handleMonitorBatch(kind, options) {
35518
35544
  );
35519
35545
  const result = await new DeeplineClient().monitors.batch.submit({
35520
35546
  kind,
35521
- scope: monitorBatchScope(options, kind),
35547
+ scope,
35522
35548
  dryRun: options.dryRun === true,
35523
35549
  ...options.reason?.trim() ? { deactivationReason: options.reason.trim() } : {},
35524
35550
  idempotencyKey
@@ -35723,7 +35749,10 @@ Examples:
35723
35749
  batch.command("deactivate").description(
35724
35750
  "Durably deactivate a selection through provider batch deletes."
35725
35751
  )
35726
- ).requiredOption("--reason <reason>", "Declared deactivation reason").option("--yes", "Confirm the asynchronous provider deactivation")
35752
+ ).option(
35753
+ "--reason <reason>",
35754
+ "Declared policy reason; required with --target and omitted for a customer-requested --keys teardown"
35755
+ ).option("--yes", "Confirm the asynchronous provider deactivation")
35727
35756
  ).action(
35728
35757
  monitorsAction(
35729
35758
  (options) => handleMonitorBatch("deactivate", options)
package/dist/index.d.mts CHANGED
@@ -3260,7 +3260,10 @@ type MonitorBatchExistingSubmitOptions = {
3260
3260
  kind: 'audit' | 'deactivate' | 'reactivate' | 'repair';
3261
3261
  scope: MonitorBatchScope;
3262
3262
  dryRun?: boolean;
3263
- /** Required for deactivate; it is the declared reason shown by health/UI. */
3263
+ /**
3264
+ * A declared policy reason for target deactivation. Omit it for an explicit
3265
+ * customer-owned key teardown; absent is the durable customer intent.
3266
+ */
3264
3267
  deactivationReason?: string;
3265
3268
  /** Stable retry key. Reusing it joins the original durable operation. */
3266
3269
  idempotencyKey: string;
package/dist/index.d.ts CHANGED
@@ -3260,7 +3260,10 @@ type MonitorBatchExistingSubmitOptions = {
3260
3260
  kind: 'audit' | 'deactivate' | 'reactivate' | 'repair';
3261
3261
  scope: MonitorBatchScope;
3262
3262
  dryRun?: boolean;
3263
- /** Required for deactivate; it is the declared reason shown by health/UI. */
3263
+ /**
3264
+ * A declared policy reason for target deactivation. Omit it for an explicit
3265
+ * customer-owned key teardown; absent is the durable customer intent.
3266
+ */
3264
3267
  deactivationReason?: string;
3265
3268
  /** Stable retry key. Reusing it joins the original durable operation. */
3266
3269
  idempotencyKey: string;
package/dist/index.js CHANGED
@@ -860,7 +860,7 @@ var SDK_RELEASE = {
860
860
  // getters keep their established compatibility behavior.
861
861
  // 0.3.1 deprecated the legacy `deepline enrich` command in favor of Plays.
862
862
  // 0.3.90 is the first deliberately versioned SDK release for API v3.
863
- version: "0.3.99",
863
+ version: "0.3.101",
864
864
  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.",
865
865
  packageCapabilities: {
866
866
  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.99",
771
+ version: "0.3.101",
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
@@ -1964,7 +1964,7 @@ function inferBindingIo(statement) {
1964
1964
  ioConfidence: "inferred"
1965
1965
  };
1966
1966
  }
1967
- var MERMAID_BLOCK = /\/\*\*\s*@mermaid(?:\s|\r?\n)([\s\S]*?)\*\//g;
1967
+ var JSDOC_BLOCK = /\/\*\*([\s\S]*?)\*\//g;
1968
1968
  var BLOCK_EXPORT_HEADER = /^[A-Za-z_$][\w$-]*$/;
1969
1969
  function cleanBlockBody(raw) {
1970
1970
  return raw.split(/\r?\n/).map((line) => /^\s*\*/.test(line) ? line.replace(/^\s*\* ?/, "") : line).join("\n").trim();
@@ -2151,9 +2151,12 @@ function materializeDocflow(block) {
2151
2151
  function parsePlayDocflowFile(sourceCode) {
2152
2152
  const errors = [];
2153
2153
  const rawBlocks = [];
2154
- MERMAID_BLOCK.lastIndex = 0;
2155
- for (const match of sourceCode.matchAll(MERMAID_BLOCK)) {
2156
- rawBlocks.push({ syntax: "mermaid", body: cleanBlockBody(match[1]) });
2154
+ JSDOC_BLOCK.lastIndex = 0;
2155
+ for (const match of sourceCode.matchAll(JSDOC_BLOCK)) {
2156
+ const cleanedBody = cleanBlockBody(match[1]);
2157
+ const mermaid = /^@mermaid(?:[ \t]+|\r?\n|$)([\s\S]*)$/.exec(cleanedBody);
2158
+ if (!mermaid) continue;
2159
+ rawBlocks.push({ syntax: "mermaid", body: mermaid[1].trim() });
2157
2160
  }
2158
2161
  if (rawBlocks.length === 0) return { blocks: [], bindings: [], errors };
2159
2162
  const rejectedNodeIds = /* @__PURE__ */ new Set();
@@ -2878,11 +2881,8 @@ function validatePlaySourceFilesHaveNoInlineSecrets(sourceFiles) {
2878
2881
  var MAX_PLAY_BUNDLE_BYTES = 30 * 1024 * 1024;
2879
2882
 
2880
2883
  // ../plays/bundling/index.ts
2881
- var PLAY_BUNDLE_CACHE_VERSION = 37;
2882
- var PLAY_ARTIFACT_CACHE_DIR = join(
2883
- tmpdir(),
2884
- `deepline-play-artifacts-v${PLAY_BUNDLE_CACHE_VERSION}`
2885
- );
2884
+ var PLAY_BUNDLE_CACHE_NAMESPACE = "deepline-play-artifacts-docflow-jsdoc";
2885
+ var PLAY_ARTIFACT_CACHE_DIR = join(tmpdir(), PLAY_BUNDLE_CACHE_NAMESPACE);
2886
2886
  var PLAY_PROXY_NAMESPACE = "deepline-play-runtime-ref";
2887
2887
  var SOURCE_EXTENSIONS = [
2888
2888
  ".ts",
@@ -4867,7 +4867,6 @@ async function discoverPackagedLocalFiles(entryFile) {
4867
4867
  }
4868
4868
 
4869
4869
  // src/plays/bundle-play-file.ts
4870
- var PLAY_BUNDLE_CACHE_VERSION2 = 37;
4871
4870
  var MODULE_DIR = dirname3(fileURLToPath(import.meta.url));
4872
4871
  var SDK_PACKAGE_ROOT = resolve3(MODULE_DIR, "..", "..");
4873
4872
  var SOURCE_REPO_ROOT = resolve3(SDK_PACKAGE_ROOT, "..", "..");
@@ -4917,10 +4916,7 @@ function createSdkPlayBundlingAdapter() {
4917
4916
  return {
4918
4917
  projectRoot: PROJECT_ROOT,
4919
4918
  nodeModulesDir: HAS_PACKAGED_BUNDLING_SOURCES ? resolve3(SDK_PACKAGE_ROOT, "node_modules") : resolve3(PROJECT_ROOT, "node_modules"),
4920
- cacheDir: join3(
4921
- tmpdir2(),
4922
- `deepline-play-artifacts-v${PLAY_BUNDLE_CACHE_VERSION2}`
4923
- ),
4919
+ cacheDir: join3(tmpdir2(), PLAY_BUNDLE_CACHE_NAMESPACE),
4924
4920
  sdkSourceRoot: SDK_SOURCE_ROOT,
4925
4921
  sdkPackageJson: SDK_PACKAGE_JSON,
4926
4922
  sdkEntryFile: SDK_ENTRY_FILE,
@@ -149,7 +149,7 @@ type SdkRelease = {
149
149
  supportPolicy: SdkSupportPolicy;
150
150
  };
151
151
  declare const SDK_RELEASE: {
152
- readonly version: "0.3.99";
152
+ readonly version: "0.3.101";
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.99";
152
+ readonly version: "0.3.101";
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.99",
77
+ version: "0.3.101",
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.99",
51
+ version: "0.3.101",
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.99",
3
+ "version": "0.3.101",
4
4
  "description": "GTM data CLI and TypeScript SDK for coding agents",
5
5
  "license": "MIT",
6
6
  "homepage": "https://code.deepline.com",