deepline 0.3.125 → 0.3.127

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.125',
203
+ version: '0.3.127',
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: {
@@ -2,7 +2,7 @@ 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. */
5
+ /** Preserve pagination cursors and signed transfer URLs in authenticated results. */
6
6
  keyPolicy?: 'strict' | 'public-result';
7
7
  /** Replace sample cursor values with a non-capability-bearing placeholder. */
8
8
  placeholderContinuationValues?: boolean;
@@ -121,6 +121,59 @@ const SAFE_IDENTIFIER_KEYS = new Set([
121
121
  'snowflake_query_ids',
122
122
  ]);
123
123
 
124
+ // Transfer URLs are bearer capabilities. Only return them in authenticated
125
+ // results; keep logs, errors, and generated samples redacted.
126
+ const PUBLIC_RESULT_TRANSFER_URL_KEYS = new Set([
127
+ 'uploadUrl',
128
+ 'upload_url',
129
+ 'downloadUrl',
130
+ 'download_url',
131
+ ]);
132
+ const TRANSFER_SIGNING_PARAM =
133
+ /^(?:sig|signature|x-amz-(?:algorithm|credential|date|expires|signedheaders|signature|security-token)|x-goog-(?:algorithm|credential|date|expires|signedheaders|signature))$/i;
134
+
135
+ function isPublicResultTransferUrl(
136
+ value: string,
137
+ key: string | undefined,
138
+ options: SecretRedactionOptions,
139
+ ): boolean {
140
+ if (
141
+ !key ||
142
+ !PUBLIC_RESULT_TRANSFER_URL_KEYS.has(key) ||
143
+ options.keyPolicy !== 'public-result' ||
144
+ options.placeholderContinuationValues
145
+ )
146
+ return false;
147
+ let url: URL;
148
+ try {
149
+ url = new URL(value);
150
+ } catch {
151
+ return false;
152
+ }
153
+ if (
154
+ url.protocol !== 'https:' ||
155
+ url.username ||
156
+ url.password ||
157
+ url.hash ||
158
+ /\s/.test(value)
159
+ )
160
+ return false;
161
+ let signed = false;
162
+ for (const [name, paramValue] of url.searchParams) {
163
+ if (
164
+ SENSITIVE_URL_PARAM_KEY_PATTERN.test(name) &&
165
+ !TRANSFER_SIGNING_PARAM.test(name)
166
+ )
167
+ return false;
168
+ if (
169
+ /^(?:sig|signature|x-amz-signature|x-goog-signature)$/i.test(name) &&
170
+ paramValue
171
+ )
172
+ signed = true;
173
+ }
174
+ return signed;
175
+ }
176
+
124
177
  const EXPLICIT_SECRET_VALUE_PATTERNS = [
125
178
  /\bnapi_[a-z0-9]{20,}\b/i,
126
179
  /\bgh[opsu]_[A-Za-z0-9_]{20,}\b/,
@@ -254,6 +307,7 @@ export function redactSecretsInValue<T>(
254
307
  if (EXPLICIT_SECRET_VALUE_PATTERNS.some((pattern) => pattern.test(value))) {
255
308
  return REDACTED_VALUE as T;
256
309
  }
310
+ if (isPublicResultTransferUrl(value, parentKey, options)) return value as T;
257
311
  if (parentKey && SAFE_IDENTIFIER_KEYS.has(parentKey)) {
258
312
  return value as T;
259
313
  }
@@ -297,6 +351,7 @@ export function redactSecretsInValue<T>(
297
351
  if (EXPLICIT_SECRET_VALUE_PATTERNS.some((pattern) => pattern.test(item))) {
298
352
  return REDACTED_VALUE;
299
353
  }
354
+ if (isPublicResultTransferUrl(item, itemParentKey, options)) return item;
300
355
  if (itemParentKey && SAFE_IDENTIFIER_KEYS.has(itemParentKey)) return item;
301
356
  if (itemParentKey && shouldRedactKey(itemParentKey)) {
302
357
  return REDACTED_VALUE;
package/dist/cli/index.js CHANGED
@@ -3068,7 +3068,7 @@ var SDK_RELEASE = {
3068
3068
  // getters keep their established compatibility behavior.
3069
3069
  // 0.3.1 deprecated the legacy `deepline enrich` command in favor of Plays.
3070
3070
  // 0.3.90 is the first deliberately versioned SDK release for API v3.
3071
- version: "0.3.125",
3071
+ version: "0.3.127",
3072
3072
  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.",
3073
3073
  packageCapabilities: {
3074
3074
  updatePreferences: 1
@@ -3063,7 +3063,7 @@ var SDK_RELEASE = {
3063
3063
  // getters keep their established compatibility behavior.
3064
3064
  // 0.3.1 deprecated the legacy `deepline enrich` command in favor of Plays.
3065
3065
  // 0.3.90 is the first deliberately versioned SDK release for API v3.
3066
- version: "0.3.125",
3066
+ version: "0.3.127",
3067
3067
  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.",
3068
3068
  packageCapabilities: {
3069
3069
  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.125",
867
+ version: "0.3.127",
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.125",
771
+ version: "0.3.127",
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.125";
152
+ readonly version: "0.3.127";
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.125";
152
+ readonly version: "0.3.127";
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.125",
77
+ version: "0.3.127",
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.125",
51
+ version: "0.3.127",
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
@@ -227,7 +227,8 @@ function codexContentText(content) {
227
227
 
228
228
  // Codex injects several synthetic "user" turns before the real prompt (plugin
229
229
  // catalog, AGENTS.md, environment context). They are transport, not intent —
230
- // the Claude path skips its own equivalent ("Base directory for this skill:").
230
+ // Claude skill injections are likewise not prompts, but are retained as
231
+ // labeled skill-load entries in the timeline.
231
232
  const CODEX_SYNTHETIC_PREFIXES = [
232
233
  '<recommended_plugins>',
233
234
  '<environment_context>',
@@ -1080,29 +1081,28 @@ function buildTimeline(events, firstTs) {
1080
1081
  eventIndex++;
1081
1082
  if (d.type === 'user') {
1082
1083
  const isExternal = d.userType === 'external' || (!d.isSynthetic && !asArray((d.message || {}).content).some(b => b && typeof b === 'object' && b.type === 'tool_result'));
1083
- if (isExternal) {
1084
- const rawContent = (d.message || {}).content;
1085
- let text = '';
1086
- if (typeof rawContent === 'string') text = rawContent;
1087
- else {
1088
- const blocks = asArray(rawContent);
1089
- text = blocks.filter(b => typeof b === 'string' || (b && b.type === 'text')).map(b => typeof b === 'string' ? b : b.text).join('\n');
1090
- }
1091
- text = text.trim();
1092
- if (text && !text.startsWith('Base directory for this skill:')) {
1093
- let realElapsed = null;
1094
- if (firstTs && d.timestamp) {
1095
- const ts = parseIsoTs(d.timestamp);
1096
- if (ts) realElapsed = Math.round(((ts - firstTs) / 1000) * 10) / 10;
1097
- }
1098
- timeline.push({
1099
- kind: 'user_message',
1100
- text: text,
1101
- event_index: eventIndex,
1102
- elapsed: realElapsed,
1103
- repeat_count: d._repeat_count || null,
1104
- });
1084
+ const rawContent = (d.message || {}).content;
1085
+ let text = '';
1086
+ if (typeof rawContent === 'string') text = rawContent;
1087
+ else {
1088
+ const blocks = asArray(rawContent);
1089
+ text = blocks.filter(b => typeof b === 'string' || (b && b.type === 'text')).map(b => typeof b === 'string' ? b : b.text).join('\n');
1090
+ }
1091
+ text = text.trim();
1092
+ const isSkillLoad = text.startsWith('Base directory for this skill:');
1093
+ if (text && (isExternal || isSkillLoad)) {
1094
+ let realElapsed = null;
1095
+ if (firstTs && d.timestamp) {
1096
+ const ts = parseIsoTs(d.timestamp);
1097
+ if (ts) realElapsed = Math.round(((ts - firstTs) / 1000) * 10) / 10;
1105
1098
  }
1099
+ timeline.push({
1100
+ kind: isSkillLoad ? 'skill_load' : 'user_message',
1101
+ text: text,
1102
+ event_index: eventIndex,
1103
+ elapsed: realElapsed,
1104
+ repeat_count: d._repeat_count || null,
1105
+ });
1106
1106
  }
1107
1107
  continue;
1108
1108
  }
@@ -2183,11 +2183,14 @@ function renderTimeline(timeline, idPrefix) {
2183
2183
  const id = prefix + 'entry-' + i;
2184
2184
  const detailId = prefix + 'detail-' + i;
2185
2185
 
2186
- if (e.kind === 'user_message') {
2186
+ if (e.kind === 'user_message' || e.kind === 'skill_load') {
2187
2187
  const long = e.text.length > 300;
2188
+ const label = e.kind === 'skill_load'
2189
+ ? 'SKILL LOADED · ' + esc(e.text.split('\n')[0].trim().replace(/\/$/, '').split('/').pop())
2190
+ : 'USER';
2188
2191
  const repeatBadge = e.repeat_count ? `<span class="repeat-badge" title="This message repeated ${e.repeat_count} times and was collapsed">⟳ repeated ×${e.repeat_count}</span>` : '';
2189
2192
  html += `<div class="tl-entry tl-user" data-searchtext="${esc(e.text.toLowerCase())}">
2190
- <div class="user-label">USER${repeatBadge}</div>
2193
+ <div class="user-label">${label}${repeatBadge}</div>
2191
2194
  <div class="user-message md-rendered ${long ? 'collapsed' : ''}" id="${id}">${renderMarkdown(e.text)}</div>
2192
2195
  ${long ? `<span class="reasoning-toggle" onclick="toggleReasoning('${id}', this)">Show more</span>` : ''}
2193
2196
  </div>`;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deepline",
3
- "version": "0.3.125",
3
+ "version": "0.3.127",
4
4
  "description": "GTM data CLI and TypeScript SDK for coding agents",
5
5
  "license": "MIT",
6
6
  "homepage": "https://code.deepline.com",