deepline 0.1.310 → 0.1.312

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.
@@ -157,7 +157,7 @@ export const SDK_RELEASE = {
157
157
  // 0.1.253 makes play-page browser opening opt-in and retires --no-open.
158
158
  // 0.1.254 removes the internal operations tree from the published SDK CLI.
159
159
  // Operators use the checkout-local deepline-admin binary instead.
160
- version: '0.1.310',
160
+ version: '0.1.312',
161
161
  contracts: {
162
162
  api: {
163
163
  name: 'sdk-http-api',
@@ -938,6 +938,7 @@ async function postAppRuntimeApi<TResponse>(
938
938
  baseUrl,
939
939
  token: context.vercelProtectionBypassToken,
940
940
  fetchImpl: runtimeFetch,
941
+ signal: context.signal,
941
942
  });
942
943
 
943
944
  const maxAttempts =
@@ -7671,6 +7671,7 @@ export class PlayContextImpl {
7671
7671
  )
7672
7672
  : options?.semanticKey,
7673
7673
  staleAfterSeconds: options?.staleAfterSeconds,
7674
+ force: this.#options.cachePolicy?.forceStepRefresh === true,
7674
7675
  markSkipped: (output) => {
7675
7676
  assertJsonSerializableStepOutput(normalizedKey, output);
7676
7677
  },
@@ -563,11 +563,14 @@ export interface ContextOptions {
563
563
  durableBoundaries?: boolean;
564
564
  /**
565
565
  * Run-level cache policy.
566
+ * forceStepRefresh bypasses completed ctx.step receipts while preserving
567
+ * completed provider-call receipts.
566
568
  * forceToolRefresh bypasses all ctx.tools.execute receipts.
567
569
  * forceFailedToolRefresh reclaims only failed receipts, preserving completed
568
570
  * provider-call idempotency while allowing forced repair runs to make progress.
569
571
  */
570
572
  cachePolicy?: {
573
+ forceStepRefresh?: boolean;
571
574
  forceToolRefresh?: boolean;
572
575
  forceFailedToolRefresh?: boolean;
573
576
  };
@@ -2,6 +2,32 @@ type FetchLike = typeof fetch;
2
2
 
3
3
  const vercelProtectionCookieCache = new Map<string, Promise<string | null>>();
4
4
 
5
+ async function awaitWithSignal<T>(
6
+ promise: Promise<T>,
7
+ signal: AbortSignal | undefined,
8
+ ): Promise<T> {
9
+ if (!signal) return await promise;
10
+ if (signal.aborted) throw signal.reason;
11
+ return await new Promise<T>((resolve, reject) => {
12
+ const onAbort = () => {
13
+ cleanup();
14
+ reject(signal.reason);
15
+ };
16
+ const cleanup = () => signal.removeEventListener('abort', onAbort);
17
+ signal.addEventListener('abort', onAbort, { once: true });
18
+ promise.then(
19
+ (value) => {
20
+ cleanup();
21
+ resolve(value);
22
+ },
23
+ (error) => {
24
+ cleanup();
25
+ reject(error);
26
+ },
27
+ );
28
+ });
29
+ }
30
+
5
31
  export function addVercelProtectionBypassSearchParams(
6
32
  url: URL,
7
33
  token: string | null | undefined,
@@ -41,6 +67,7 @@ export async function resolveVercelProtectionBypassCookie(input: {
41
67
  baseUrl: string | null | undefined;
42
68
  token: string | null | undefined;
43
69
  fetchImpl?: FetchLike;
70
+ signal?: AbortSignal;
44
71
  }): Promise<string | null> {
45
72
  const token = input.token?.trim();
46
73
  const baseUrl = input.baseUrl?.trim().replace(/\/$/, '');
@@ -48,7 +75,7 @@ export async function resolveVercelProtectionBypassCookie(input: {
48
75
 
49
76
  const cacheKey = `${baseUrl}\n${token}`;
50
77
  const cached = vercelProtectionCookieCache.get(cacheKey);
51
- if (cached) return await cached;
78
+ if (cached) return await awaitWithSignal(cached, input.signal);
52
79
 
53
80
  const promise = (async () => {
54
81
  const url = new URL(`${baseUrl}/api/v2/health`);
@@ -59,13 +86,19 @@ export async function resolveVercelProtectionBypassCookie(input: {
59
86
  return response ? cookieHeaderFromSetCookie(response.headers) : null;
60
87
  })();
61
88
  vercelProtectionCookieCache.set(cacheKey, promise);
62
- return await promise;
89
+ void promise.catch(() => {
90
+ if (vercelProtectionCookieCache.get(cacheKey) === promise) {
91
+ vercelProtectionCookieCache.delete(cacheKey);
92
+ }
93
+ });
94
+ return await awaitWithSignal(promise, input.signal);
63
95
  }
64
96
 
65
97
  export async function vercelProtectionBypassHeaders(input: {
66
98
  baseUrl: string | null | undefined;
67
99
  token: string | null | undefined;
68
100
  fetchImpl?: FetchLike;
101
+ signal?: AbortSignal;
69
102
  }): Promise<Record<string, string>> {
70
103
  const token = input.token?.trim();
71
104
  if (!token) return {};
@@ -73,6 +106,7 @@ export async function vercelProtectionBypassHeaders(input: {
73
106
  baseUrl: input.baseUrl,
74
107
  token,
75
108
  fetchImpl: input.fetchImpl,
109
+ signal: input.signal,
76
110
  });
77
111
  return {
78
112
  ...vercelProtectionBypassHeader(token),
package/dist/cli/index.js CHANGED
@@ -1037,7 +1037,7 @@ var SDK_RELEASE = {
1037
1037
  // 0.1.253 makes play-page browser opening opt-in and retires --no-open.
1038
1038
  // 0.1.254 removes the internal operations tree from the published SDK CLI.
1039
1039
  // Operators use the checkout-local deepline-admin binary instead.
1040
- version: "0.1.310",
1040
+ version: "0.1.312",
1041
1041
  contracts: {
1042
1042
  api: {
1043
1043
  name: "sdk-http-api",
@@ -1022,7 +1022,7 @@ var SDK_RELEASE = {
1022
1022
  // 0.1.253 makes play-page browser opening opt-in and retires --no-open.
1023
1023
  // 0.1.254 removes the internal operations tree from the published SDK CLI.
1024
1024
  // Operators use the checkout-local deepline-admin binary instead.
1025
- version: "0.1.310",
1025
+ version: "0.1.312",
1026
1026
  contracts: {
1027
1027
  api: {
1028
1028
  name: "sdk-http-api",
package/dist/index.js CHANGED
@@ -760,7 +760,7 @@ var SDK_RELEASE = {
760
760
  // 0.1.253 makes play-page browser opening opt-in and retires --no-open.
761
761
  // 0.1.254 removes the internal operations tree from the published SDK CLI.
762
762
  // Operators use the checkout-local deepline-admin binary instead.
763
- version: "0.1.310",
763
+ version: "0.1.312",
764
764
  contracts: {
765
765
  api: {
766
766
  name: "sdk-http-api",
package/dist/index.mjs CHANGED
@@ -686,7 +686,7 @@ var SDK_RELEASE = {
686
686
  // 0.1.253 makes play-page browser opening opt-in and retires --no-open.
687
687
  // 0.1.254 removes the internal operations tree from the published SDK CLI.
688
688
  // Operators use the checkout-local deepline-admin binary instead.
689
- version: "0.1.310",
689
+ version: "0.1.312",
690
690
  contracts: {
691
691
  api: {
692
692
  name: "sdk-http-api",
@@ -1,30 +1,27 @@
1
1
 
2
2
  :root {
3
- --bg: var(--background);
4
- --bg-secondary: var(--background-secondary);
5
- --bg-tertiary: var(--background-tertiary);
6
- --text: var(--foreground);
7
- --text-dim: var(--foreground-secondary);
8
- --text-dimmer: var(--foreground-muted);
9
- --green: var(--status-success-foreground);
10
- --red: var(--status-error-foreground);
11
- --yellow: var(--status-warning-foreground);
12
- --blue: var(--primary-text);
13
- --purple: var(--color-silver-400);
14
- --orange: var(--status-warning-foreground);
15
- --cyan: var(--status-info-foreground);
3
+ --bg: #0d1117;
4
+ --bg-secondary: #161b22;
5
+ --bg-tertiary: #21262d;
6
+ --border: #30363d;
7
+ --text: #e6edf3;
8
+ --text-dim: #8b949e;
9
+ --text-dimmer: #6e7681;
10
+ --green: #3fb950;
11
+ --red: #f85149;
12
+ --yellow: #d29922;
13
+ --blue: #58a6ff;
14
+ --purple: #bc8cff;
15
+ --orange: #f0883e;
16
+ --cyan: #39d2c0;
16
17
  }
17
18
  * { margin: 0; padding: 0; box-sizing: border-box; }
18
19
  body {
19
20
  background: var(--bg);
20
21
  color: var(--text);
21
- font-family: var(--font-base);
22
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif;
22
23
  font-size: 14px;
23
24
  line-height: 1.5;
24
- letter-spacing: -0.011em;
25
- -webkit-font-smoothing: antialiased;
26
- -moz-osx-font-smoothing: grayscale;
27
- text-rendering: optimizeLegibility;
28
25
  }
29
26
  .layout { display: flex; height: 100vh; }
30
27
  .sidebar {
@@ -39,7 +36,7 @@ body {
39
36
  padding: 10px 16px;
40
37
  cursor: pointer;
41
38
  border-left: 3px solid transparent;
42
- transition: background-color var(--duration-normal) var(--ease-standard);
39
+ transition: background 0.15s;
43
40
  font-size: 13px;
44
41
  }
45
42
  .sidebar-item:hover { background: var(--bg-tertiary); }
@@ -57,7 +54,7 @@ body {
57
54
  .sidebar-compare kbd {
58
55
  background: var(--bg-tertiary);
59
56
  border: 1px solid var(--border);
60
- border-radius: var(--radius-icon);
57
+ border-radius: 3px;
61
58
  padding: 0 4px;
62
59
  font-size: 10px;
63
60
  font-family: inherit;
@@ -67,7 +64,7 @@ body {
67
64
  .header {
68
65
  background: var(--bg-secondary);
69
66
  border: 1px solid var(--border);
70
- border-radius: var(--radius-lg);
67
+ border-radius: 8px;
71
68
  padding: 20px 24px;
72
69
  margin-bottom: 20px;
73
70
  }
@@ -102,7 +99,7 @@ body {
102
99
  gap: 4px;
103
100
  background: var(--bg);
104
101
  border: 1px solid var(--border);
105
- border-radius: var(--radius-sm);
102
+ border-radius: 4px;
106
103
  padding: 2px 8px;
107
104
  font-size: 12px;
108
105
  }
@@ -153,7 +150,7 @@ body {
153
150
  line-height: 1.6;
154
151
  white-space: pre-wrap;
155
152
  word-break: break-word;
156
- background: color-mix(in srgb, var(--status-success-accent) 4%, transparent);
153
+ background: rgba(63,185,80,0.04);
157
154
  }
158
155
  .user-message.collapsed { max-height: 100px; overflow: hidden; position: relative; }
159
156
  .user-message.collapsed::after {
@@ -187,7 +184,7 @@ body {
187
184
  white-space: pre-wrap;
188
185
  word-break: break-word;
189
186
  font-style: italic;
190
- background: color-mix(in srgb, var(--color-silver-400) 3%, transparent);
187
+ background: rgba(188,140,255,0.03);
191
188
  }
192
189
  .thinking.collapsed { max-height: 100px; overflow: hidden; position: relative; }
193
190
  .thinking.collapsed::after {
@@ -234,10 +231,10 @@ body {
234
231
  align-items: center;
235
232
  gap: 12px;
236
233
  padding: 6px 12px;
237
- border-radius: var(--radius-md);
234
+ border-radius: 6px;
238
235
  cursor: pointer;
239
- transition: background-color var(--duration-normal) var(--ease-standard);
240
- font-family: var(--font-mono);
236
+ transition: background 0.15s;
237
+ font-family: 'SF Mono', 'Fira Code', 'Fira Mono', Menlo, Consolas, monospace;
241
238
  font-size: 13px;
242
239
  }
243
240
  .tool-row:hover { background: var(--bg-secondary); }
@@ -247,15 +244,15 @@ body {
247
244
  .tool-status {
248
245
  display: inline-block;
249
246
  padding: 1px 8px;
250
- border-radius: var(--radius-control);
247
+ border-radius: 10px;
251
248
  font-size: 11px;
252
249
  font-weight: 600;
253
250
  min-width: 42px;
254
251
  text-align: center;
255
252
  }
256
- .tool-status.ok { background: color-mix(in srgb, var(--status-success-accent) 15%, transparent); color: var(--green); }
257
- .tool-status.fail { background: color-mix(in srgb, var(--status-error-accent) 15%, transparent); color: var(--red); }
258
- .tool-status.unknown { background: color-mix(in srgb, var(--foreground-muted) 15%, transparent); color: var(--text-dim); }
253
+ .tool-status.ok { background: rgba(63,185,80,0.15); color: var(--green); }
254
+ .tool-status.fail { background: rgba(248,81,73,0.15); color: var(--red); }
255
+ .tool-status.unknown { background: rgba(139,148,158,0.15); color: var(--text-dim); }
259
256
  .tool-name {
260
257
  font-weight: 600;
261
258
  min-width: 70px;
@@ -277,22 +274,22 @@ body {
277
274
  color: var(--text-dimmer);
278
275
  background: var(--bg-tertiary);
279
276
  border: 1px solid var(--border);
280
- border-radius: var(--radius-sm);
277
+ border-radius: 4px;
281
278
  padding: 0 5px;
282
279
  white-space: nowrap;
283
280
  }
284
281
  .loop-badge {
285
282
  color: var(--yellow);
286
- border-color: color-mix(in srgb, var(--status-warning-accent) 40%, transparent);
287
- background: color-mix(in srgb, var(--status-warning-accent) 8%, transparent);
283
+ border-color: rgba(210,153,34,0.4);
284
+ background: rgba(210,153,34,0.08);
288
285
  }
289
286
  .repeat-badge {
290
287
  margin-left: 6px;
291
288
  font-size: 10px;
292
289
  color: var(--text-dimmer);
293
- background: color-mix(in srgb, var(--color-silver-400) 8%, transparent);
294
- border: 1px solid color-mix(in srgb, var(--color-silver-400) 30%, transparent);
295
- border-radius: var(--radius-sm);
290
+ background: rgba(120,120,180,0.08);
291
+ border: 1px solid rgba(120,120,180,0.3);
292
+ border-radius: 4px;
296
293
  padding: 0 5px;
297
294
  white-space: nowrap;
298
295
  cursor: help;
@@ -322,7 +319,7 @@ body {
322
319
  margin-left: 48px;
323
320
  margin-bottom: 12px;
324
321
  border: 1px solid var(--border);
325
- border-radius: var(--radius-md);
322
+ border-radius: 6px;
326
323
  overflow: hidden;
327
324
  }
328
325
  .tool-detail.open { display: block; }
@@ -340,12 +337,12 @@ body {
340
337
  }
341
338
  .tool-detail-section pre {
342
339
  background: var(--bg);
343
- border-radius: var(--radius-sm);
340
+ border-radius: 4px;
344
341
  padding: 10px 14px;
345
342
  overflow-x: auto;
346
343
  font-size: 12px;
347
344
  line-height: 1.5;
348
- font-family: var(--font-mono);
345
+ font-family: 'SF Mono', 'Fira Code', 'Fira Mono', Menlo, Consolas, monospace;
349
346
  white-space: pre-wrap;
350
347
  word-break: break-word;
351
348
  max-height: 400px;
@@ -354,13 +351,13 @@ body {
354
351
  }
355
352
  .tool-detail-section pre.error-content {
356
353
  border: 1px solid var(--red);
357
- background: color-mix(in srgb, var(--status-error-accent) 6%, transparent);
354
+ background: rgba(248,81,73,0.06);
358
355
  }
359
356
  .tool-detail-toggle {
360
357
  margin-top: 8px;
361
358
  background: var(--bg-tertiary);
362
359
  border: 1px solid var(--border);
363
- border-radius: var(--radius-sm);
360
+ border-radius: 4px;
364
361
  color: var(--blue);
365
362
  cursor: pointer;
366
363
  font-size: 12px;
@@ -372,7 +369,7 @@ body {
372
369
  .result-card {
373
370
  background: var(--bg-secondary);
374
371
  border: 1px solid var(--border);
375
- border-radius: var(--radius-lg);
372
+ border-radius: 8px;
376
373
  padding: 20px 24px;
377
374
  margin-top: 20px;
378
375
  }
@@ -395,7 +392,7 @@ body {
395
392
  flex: 1;
396
393
  background: var(--bg-secondary);
397
394
  border: 1px solid var(--border);
398
- border-radius: var(--radius-md);
395
+ border-radius: 6px;
399
396
  padding: 8px 12px;
400
397
  color: var(--text);
401
398
  font-size: 13px;
@@ -407,7 +404,7 @@ body {
407
404
  .filter-btn {
408
405
  background: var(--bg-secondary);
409
406
  border: 1px solid var(--border);
410
- border-radius: var(--radius-md);
407
+ border-radius: 6px;
411
408
  padding: 8px 12px;
412
409
  color: var(--text-dim);
413
410
  font-size: 12px;
@@ -420,7 +417,7 @@ body {
420
417
  .prompt-card {
421
418
  background: var(--bg-secondary);
422
419
  border: 1px solid var(--border);
423
- border-radius: var(--radius-lg);
420
+ border-radius: 8px;
424
421
  padding: 16px 20px;
425
422
  margin-bottom: 16px;
426
423
  }
@@ -443,11 +440,11 @@ body {
443
440
  font-size: 11px;
444
441
  font-weight: 600;
445
442
  padding: 2px 8px;
446
- border-radius: var(--radius-control);
443
+ border-radius: 10px;
447
444
  vertical-align: middle;
448
445
  }
449
- .timing-badge.exact { background: color-mix(in srgb, var(--status-success-accent) 15%, transparent); color: var(--green); }
450
- .timing-badge.estimated { background: color-mix(in srgb, var(--status-warning-accent) 15%, transparent); color: var(--yellow); }
446
+ .timing-badge.exact { background: rgba(63,185,80,0.15); color: var(--green); }
447
+ .timing-badge.estimated { background: rgba(210,153,34,0.15); color: var(--yellow); }
451
448
 
452
449
  /* Live badge */
453
450
  .live-badge {
@@ -455,8 +452,8 @@ body {
455
452
  font-size: 11px;
456
453
  font-weight: 700;
457
454
  padding: 2px 10px;
458
- border-radius: var(--radius-control);
459
- background: color-mix(in srgb, var(--status-error-accent) 15%, transparent);
455
+ border-radius: 10px;
456
+ background: rgba(248,81,73,0.15);
460
457
  color: var(--red);
461
458
  animation: live-pulse 2s ease-in-out infinite;
462
459
  letter-spacing: 0.5px;
@@ -464,7 +461,7 @@ body {
464
461
  user-select: none;
465
462
  }
466
463
  .live-badge.paused {
467
- background: color-mix(in srgb, var(--foreground-muted) 15%, transparent);
464
+ background: rgba(139,148,158,0.15);
468
465
  color: var(--text-dim);
469
466
  animation: none;
470
467
  }
@@ -476,7 +473,7 @@ body {
476
473
  .download-btn {
477
474
  background: var(--bg-secondary);
478
475
  border: 1px solid var(--border);
479
- border-radius: var(--radius-md);
476
+ border-radius: 6px;
480
477
  padding: 4px 10px;
481
478
  color: var(--text-dim);
482
479
  font-size: 12px;
@@ -490,7 +487,7 @@ body {
490
487
  .file-map-card {
491
488
  background: var(--bg-secondary);
492
489
  border: 1px solid var(--border);
493
- border-radius: var(--radius-lg);
490
+ border-radius: 8px;
494
491
  margin-bottom: 16px;
495
492
  overflow: hidden;
496
493
  }
@@ -503,7 +500,7 @@ body {
503
500
  font-size: 13px;
504
501
  font-weight: 600;
505
502
  color: var(--text-dim);
506
- transition: background-color var(--duration-normal) var(--ease-standard);
503
+ transition: background 0.15s;
507
504
  }
508
505
  .file-map-header:hover { background: var(--bg-tertiary); }
509
506
  .file-map-toggle {
@@ -520,7 +517,7 @@ body {
520
517
  width: 100%;
521
518
  border-collapse: collapse;
522
519
  font-size: 12px;
523
- font-family: var(--font-mono);
520
+ font-family: 'SF Mono', 'Fira Code', Menlo, monospace;
524
521
  }
525
522
  .file-map-table th {
526
523
  background: var(--bg-tertiary);
@@ -539,13 +536,13 @@ body {
539
536
  color: var(--text-dim);
540
537
  }
541
538
  .file-map-table td:first-child { color: var(--text); }
542
- .file-map-table tr:hover { background: color-mix(in srgb, var(--primary) 4%, transparent); }
539
+ .file-map-table tr:hover { background: rgba(88,166,255,0.04); }
543
540
 
544
541
  /* Comparison view */
545
542
  .comparison-table-wrap {
546
543
  background: var(--bg-secondary);
547
544
  border: 1px solid var(--border);
548
- border-radius: var(--radius-lg);
545
+ border-radius: 8px;
549
546
  overflow: hidden;
550
547
  }
551
548
  .comparison-table {
@@ -574,7 +571,7 @@ body {
574
571
  font-weight: 500;
575
572
  min-width: 140px;
576
573
  }
577
- .comparison-table tr:hover { background: color-mix(in srgb, var(--primary) 4%, transparent); }
574
+ .comparison-table tr:hover { background: rgba(88,166,255,0.04); }
578
575
  .compare-dim { color: var(--text-dimmer); font-size: 11px; }
579
576
  .compare-best { color: var(--green); font-weight: 600; }
580
577
  .compare-worst { color: var(--red); }
@@ -596,8 +593,8 @@ body {
596
593
  .md-rendered p { margin-bottom: 8px; }
597
594
  .md-rendered strong { color: var(--text); font-weight: 600; }
598
595
  .md-rendered code {
599
- background: var(--bg-tertiary); border-radius: var(--radius-icon); padding: 1px 5px;
600
- font-family: var(--font-mono); font-size: 12px;
596
+ background: var(--bg-tertiary); border-radius: 3px; padding: 1px 5px;
597
+ font-family: 'SF Mono', 'Fira Code', Menlo, monospace; font-size: 12px;
601
598
  }
602
599
  .md-rendered table {
603
600
  border-collapse: collapse; margin: 8px 0; width: 100%; font-size: 12px;
@@ -609,7 +606,7 @@ body {
609
606
  background: var(--bg-tertiary); color: var(--text-dim); font-weight: 600;
610
607
  font-size: 11px; text-transform: uppercase; letter-spacing: 0.3px;
611
608
  }
612
- .md-rendered tr:hover { background: color-mix(in srgb, var(--primary) 4%, transparent); }
609
+ .md-rendered tr:hover { background: rgba(88,166,255,0.04); }
613
610
  .md-rendered a { color: var(--blue); text-decoration: none; }
614
611
  .md-rendered a:hover { text-decoration: underline; }
615
612
  .md-rendered h1, .md-rendered h2, .md-rendered h3 {
@@ -621,9 +618,9 @@ body {
621
618
  .md-rendered ul, .md-rendered ol { margin: 4px 0 8px 20px; }
622
619
  .md-rendered li { margin-bottom: 2px; }
623
620
  .md-rendered pre {
624
- background: var(--bg); border-radius: var(--radius-sm); padding: 10px 14px;
621
+ background: var(--bg); border-radius: 4px; padding: 10px 14px;
625
622
  font-size: 12px; line-height: 1.5; overflow-x: auto;
626
- font-family: var(--font-mono);
623
+ font-family: 'SF Mono', 'Fira Code', Menlo, monospace;
627
624
  margin: 8px 0;
628
625
  white-space: pre-wrap;
629
626
  word-break: break-word;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deepline",
3
- "version": "0.1.310",
3
+ "version": "0.1.312",
4
4
  "description": "Deepline SDK + CLI — B2B data enrichment powered by durable cloud execution",
5
5
  "license": "MIT",
6
6
  "repository": {