deepline 0.2.61 → 0.2.63

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.
@@ -160,7 +160,7 @@ export const SDK_RELEASE = {
160
160
  // 0.2.0 makes Dataset Handles uniformly async-only after 0.1.320 briefly
161
161
  // exposed storage-dependent synchronous access. This deliberate minor
162
162
  // release keeps lazy paging semantics independent of row residency.
163
- version: '0.2.61',
163
+ version: '0.2.63',
164
164
  contracts: {
165
165
  api: {
166
166
  name: 'sdk-http-api',
@@ -853,7 +853,20 @@ function buildTargets(
853
853
  targetGetters?: Record<string, readonly string[]>,
854
854
  ): Record<string, ToolResultTargetMetadata> {
855
855
  const targets: Record<string, ToolResultTargetMetadata> = {};
856
+ const declaredTargetPaths = new Map<string, readonly string[]>();
857
+ const semanticStatusTargets = new Set<string>();
856
858
  for (const [target, descriptor] of Object.entries(extractors ?? {})) {
859
+ // Normal scalar getters are total: a declared but absent value reads null.
860
+ // Semantic status getters stay absent when their provider status did not
861
+ // resolve; manufacturing an "unknown" status would blur no signal with an
862
+ // observed provider verdict.
863
+ const isSemanticStatus =
864
+ descriptor.emailStatus !== undefined ||
865
+ descriptor.transforms?.some((transform) =>
866
+ /(emailStatus|phoneStatus|jobChange(?:Status)?)$/.test(transform),
867
+ ) === true;
868
+ if (isSemanticStatus) semanticStatusTargets.add(target);
869
+ else declaredTargetPaths.set(target, descriptor.paths);
857
870
  const emailStatusTarget = buildEmailStatusTarget(result, descriptor);
858
871
  if (emailStatusTarget) {
859
872
  targets[target] = emailStatusTarget;
@@ -873,7 +886,11 @@ function buildTargets(
873
886
  }
874
887
  const metadataTargets = new Set(Object.keys(targetGetters ?? {}));
875
888
  for (const target of metadataTargets) {
876
- if (targets[target]) continue;
889
+ if (targets[target] || semanticStatusTargets.has(target)) continue;
890
+ declaredTargetPaths.set(
891
+ target,
892
+ targetGetters?.[target] ?? declaredTargetPaths.get(target) ?? [],
893
+ );
877
894
  const fromMetadata = findFirstTargetByPath(result, targetGetters?.[target]);
878
895
  if (fromMetadata) {
879
896
  targets[target] = fromMetadata;
@@ -884,11 +901,20 @@ function buildTargets(
884
901
  targets[target] = fallback;
885
902
  }
886
903
  }
887
- if (metadataTargets.size > 0) return targets;
888
-
889
- for (const target of ['email', 'phone', 'linkedin', 'domain', 'status']) {
890
- const found = findFirstTargetByKey(result, target);
891
- if (found) targets[target] = found;
904
+ if (metadataTargets.size === 0) {
905
+ for (const target of ['email', 'phone', 'linkedin', 'domain', 'status']) {
906
+ const found = findFirstTargetByKey(result, target);
907
+ if (found) targets[target] = found;
908
+ }
909
+ }
910
+ for (const [target, paths] of declaredTargetPaths) {
911
+ if (targets[target]) continue;
912
+ targets[target] = {
913
+ value: null,
914
+ path:
915
+ paths.flatMap(candidateResultPaths).find(Boolean) ??
916
+ `toolResponse.raw.${target}`,
917
+ };
892
918
  }
893
919
  return targets;
894
920
  }
package/dist/cli/index.js CHANGED
@@ -1044,7 +1044,7 @@ var SDK_RELEASE = {
1044
1044
  // 0.2.0 makes Dataset Handles uniformly async-only after 0.1.320 briefly
1045
1045
  // exposed storage-dependent synchronous access. This deliberate minor
1046
1046
  // release keeps lazy paging semantics independent of row residency.
1047
- version: "0.2.61",
1047
+ version: "0.2.63",
1048
1048
  contracts: {
1049
1049
  api: {
1050
1050
  name: "sdk-http-api",
@@ -37260,25 +37260,6 @@ function detectSkillsAgents(input2) {
37260
37260
  ).map((marker) => marker.agent);
37261
37261
  return detected.length > 0 ? detected : ["*"];
37262
37262
  }
37263
- async function fetchSkillCatalog(baseUrl) {
37264
- const response = await fetch(skillsIndexUrl(baseUrl));
37265
- if (!response.ok) {
37266
- throw new Error(
37267
- `Skill catalog request failed (status ${response.status}).`
37268
- );
37269
- }
37270
- const index = await response.json();
37271
- const skillNames = (index.skills ?? []).filter((skill) => skill.install_surface === "v1").map((skill) => skill.name).filter((name) => typeof name === "string" && Boolean(name)).sort((a, b) => a.localeCompare(b));
37272
- if (skillNames.length === 0) {
37273
- throw new Error(
37274
- "The Deepline skill catalog contains no installable skills."
37275
- );
37276
- }
37277
- return {
37278
- skillNames,
37279
- version: typeof index.version === "string" && index.version.trim() ? index.version.trim() : "unversioned"
37280
- };
37281
- }
37282
37263
  function skillsStatePathForScope(baseUrl, scope, root) {
37283
37264
  return scope === "local" && root ? (0, import_node_path21.join)(root, ".deepline", "setup", "skills.json") : (0, import_node_path21.join)(sdkCliStateDirPath(baseUrl), "skills-install.json");
37284
37265
  }
@@ -37397,23 +37378,10 @@ async function runSkillsCommand(options, dependencies = {}) {
37397
37378
  return 2;
37398
37379
  }
37399
37380
  const baseUrl = autoDetectBaseUrl().replace(/\/$/, "");
37400
- let catalog;
37401
- try {
37402
- catalog = options.dryRun ? { skillNames: [...DEFAULT_SDK_SKILL_NAMES], version: "latest" } : await (dependencies.fetchCatalog ?? fetchSkillCatalog)(baseUrl);
37403
- } catch (error) {
37404
- printCommandEnvelope(
37405
- {
37406
- ok: false,
37407
- status: "failed",
37408
- code: "SKILLS_CATALOG_UNAVAILABLE",
37409
- exitCode: 5,
37410
- message: error instanceof Error ? error.message : String(error),
37411
- next: "Retry: deepline skills"
37412
- },
37413
- { json: options.json }
37414
- );
37415
- return 5;
37416
- }
37381
+ const catalog = {
37382
+ skillNames: [...DEFAULT_SDK_SKILL_NAMES],
37383
+ version: SDK_VERSION
37384
+ };
37417
37385
  const agents = options.agent ? [options.agent] : detectSkillsAgents({ scope, root });
37418
37386
  const plan = buildSkillsPlan({ baseUrl, scope, root, agents, ...catalog });
37419
37387
  if (options.dryRun) {
@@ -1030,7 +1030,7 @@ var SDK_RELEASE = {
1030
1030
  // 0.2.0 makes Dataset Handles uniformly async-only after 0.1.320 briefly
1031
1031
  // exposed storage-dependent synchronous access. This deliberate minor
1032
1032
  // release keeps lazy paging semantics independent of row residency.
1033
- version: "0.2.61",
1033
+ version: "0.2.63",
1034
1034
  contracts: {
1035
1035
  api: {
1036
1036
  name: "sdk-http-api",
@@ -37340,25 +37340,6 @@ function detectSkillsAgents(input2) {
37340
37340
  ).map((marker) => marker.agent);
37341
37341
  return detected.length > 0 ? detected : ["*"];
37342
37342
  }
37343
- async function fetchSkillCatalog(baseUrl) {
37344
- const response = await fetch(skillsIndexUrl(baseUrl));
37345
- if (!response.ok) {
37346
- throw new Error(
37347
- `Skill catalog request failed (status ${response.status}).`
37348
- );
37349
- }
37350
- const index = await response.json();
37351
- const skillNames = (index.skills ?? []).filter((skill) => skill.install_surface === "v1").map((skill) => skill.name).filter((name) => typeof name === "string" && Boolean(name)).sort((a, b) => a.localeCompare(b));
37352
- if (skillNames.length === 0) {
37353
- throw new Error(
37354
- "The Deepline skill catalog contains no installable skills."
37355
- );
37356
- }
37357
- return {
37358
- skillNames,
37359
- version: typeof index.version === "string" && index.version.trim() ? index.version.trim() : "unversioned"
37360
- };
37361
- }
37362
37343
  function skillsStatePathForScope(baseUrl, scope, root) {
37363
37344
  return scope === "local" && root ? join17(root, ".deepline", "setup", "skills.json") : join17(sdkCliStateDirPath(baseUrl), "skills-install.json");
37364
37345
  }
@@ -37477,23 +37458,10 @@ async function runSkillsCommand(options, dependencies = {}) {
37477
37458
  return 2;
37478
37459
  }
37479
37460
  const baseUrl = autoDetectBaseUrl().replace(/\/$/, "");
37480
- let catalog;
37481
- try {
37482
- catalog = options.dryRun ? { skillNames: [...DEFAULT_SDK_SKILL_NAMES], version: "latest" } : await (dependencies.fetchCatalog ?? fetchSkillCatalog)(baseUrl);
37483
- } catch (error) {
37484
- printCommandEnvelope(
37485
- {
37486
- ok: false,
37487
- status: "failed",
37488
- code: "SKILLS_CATALOG_UNAVAILABLE",
37489
- exitCode: 5,
37490
- message: error instanceof Error ? error.message : String(error),
37491
- next: "Retry: deepline skills"
37492
- },
37493
- { json: options.json }
37494
- );
37495
- return 5;
37496
- }
37461
+ const catalog = {
37462
+ skillNames: [...DEFAULT_SDK_SKILL_NAMES],
37463
+ version: SDK_VERSION
37464
+ };
37497
37465
  const agents = options.agent ? [options.agent] : detectSkillsAgents({ scope, root });
37498
37466
  const plan = buildSkillsPlan({ baseUrl, scope, root, agents, ...catalog });
37499
37467
  if (options.dryRun) {
package/dist/index.js CHANGED
@@ -777,7 +777,7 @@ var SDK_RELEASE = {
777
777
  // 0.2.0 makes Dataset Handles uniformly async-only after 0.1.320 briefly
778
778
  // exposed storage-dependent synchronous access. This deliberate minor
779
779
  // release keeps lazy paging semantics independent of row residency.
780
- version: "0.2.61",
780
+ version: "0.2.63",
781
781
  contracts: {
782
782
  api: {
783
783
  name: "sdk-http-api",
@@ -7490,7 +7490,14 @@ function deriveListKeys(input) {
7490
7490
  }
7491
7491
  function buildTargets(result, extractors, targetGetters) {
7492
7492
  const targets = {};
7493
+ const declaredTargetPaths = /* @__PURE__ */ new Map();
7494
+ const semanticStatusTargets = /* @__PURE__ */ new Set();
7493
7495
  for (const [target, descriptor] of Object.entries(extractors ?? {})) {
7496
+ const isSemanticStatus = descriptor.emailStatus !== void 0 || descriptor.transforms?.some(
7497
+ (transform) => /(emailStatus|phoneStatus|jobChange(?:Status)?)$/.test(transform)
7498
+ ) === true;
7499
+ if (isSemanticStatus) semanticStatusTargets.add(target);
7500
+ else declaredTargetPaths.set(target, descriptor.paths);
7494
7501
  const emailStatusTarget = buildEmailStatusTarget(result, descriptor);
7495
7502
  if (emailStatusTarget) {
7496
7503
  targets[target] = emailStatusTarget;
@@ -7510,7 +7517,11 @@ function buildTargets(result, extractors, targetGetters) {
7510
7517
  }
7511
7518
  const metadataTargets = new Set(Object.keys(targetGetters ?? {}));
7512
7519
  for (const target of metadataTargets) {
7513
- if (targets[target]) continue;
7520
+ if (targets[target] || semanticStatusTargets.has(target)) continue;
7521
+ declaredTargetPaths.set(
7522
+ target,
7523
+ targetGetters?.[target] ?? declaredTargetPaths.get(target) ?? []
7524
+ );
7514
7525
  const fromMetadata = findFirstTargetByPath(result, targetGetters?.[target]);
7515
7526
  if (fromMetadata) {
7516
7527
  targets[target] = fromMetadata;
@@ -7521,10 +7532,18 @@ function buildTargets(result, extractors, targetGetters) {
7521
7532
  targets[target] = fallback;
7522
7533
  }
7523
7534
  }
7524
- if (metadataTargets.size > 0) return targets;
7525
- for (const target of ["email", "phone", "linkedin", "domain", "status"]) {
7526
- const found = findFirstTargetByKey(result, target);
7527
- if (found) targets[target] = found;
7535
+ if (metadataTargets.size === 0) {
7536
+ for (const target of ["email", "phone", "linkedin", "domain", "status"]) {
7537
+ const found = findFirstTargetByKey(result, target);
7538
+ if (found) targets[target] = found;
7539
+ }
7540
+ }
7541
+ for (const [target, paths] of declaredTargetPaths) {
7542
+ if (targets[target]) continue;
7543
+ targets[target] = {
7544
+ value: null,
7545
+ path: paths.flatMap(candidateResultPaths).find(Boolean) ?? `toolResponse.raw.${target}`
7546
+ };
7528
7547
  }
7529
7548
  return targets;
7530
7549
  }
package/dist/index.mjs CHANGED
@@ -700,7 +700,7 @@ var SDK_RELEASE = {
700
700
  // 0.2.0 makes Dataset Handles uniformly async-only after 0.1.320 briefly
701
701
  // exposed storage-dependent synchronous access. This deliberate minor
702
702
  // release keeps lazy paging semantics independent of row residency.
703
- version: "0.2.61",
703
+ version: "0.2.63",
704
704
  contracts: {
705
705
  api: {
706
706
  name: "sdk-http-api",
@@ -7413,7 +7413,14 @@ function deriveListKeys(input) {
7413
7413
  }
7414
7414
  function buildTargets(result, extractors, targetGetters) {
7415
7415
  const targets = {};
7416
+ const declaredTargetPaths = /* @__PURE__ */ new Map();
7417
+ const semanticStatusTargets = /* @__PURE__ */ new Set();
7416
7418
  for (const [target, descriptor] of Object.entries(extractors ?? {})) {
7419
+ const isSemanticStatus = descriptor.emailStatus !== void 0 || descriptor.transforms?.some(
7420
+ (transform) => /(emailStatus|phoneStatus|jobChange(?:Status)?)$/.test(transform)
7421
+ ) === true;
7422
+ if (isSemanticStatus) semanticStatusTargets.add(target);
7423
+ else declaredTargetPaths.set(target, descriptor.paths);
7417
7424
  const emailStatusTarget = buildEmailStatusTarget(result, descriptor);
7418
7425
  if (emailStatusTarget) {
7419
7426
  targets[target] = emailStatusTarget;
@@ -7433,7 +7440,11 @@ function buildTargets(result, extractors, targetGetters) {
7433
7440
  }
7434
7441
  const metadataTargets = new Set(Object.keys(targetGetters ?? {}));
7435
7442
  for (const target of metadataTargets) {
7436
- if (targets[target]) continue;
7443
+ if (targets[target] || semanticStatusTargets.has(target)) continue;
7444
+ declaredTargetPaths.set(
7445
+ target,
7446
+ targetGetters?.[target] ?? declaredTargetPaths.get(target) ?? []
7447
+ );
7437
7448
  const fromMetadata = findFirstTargetByPath(result, targetGetters?.[target]);
7438
7449
  if (fromMetadata) {
7439
7450
  targets[target] = fromMetadata;
@@ -7444,10 +7455,18 @@ function buildTargets(result, extractors, targetGetters) {
7444
7455
  targets[target] = fallback;
7445
7456
  }
7446
7457
  }
7447
- if (metadataTargets.size > 0) return targets;
7448
- for (const target of ["email", "phone", "linkedin", "domain", "status"]) {
7449
- const found = findFirstTargetByKey(result, target);
7450
- if (found) targets[target] = found;
7458
+ if (metadataTargets.size === 0) {
7459
+ for (const target of ["email", "phone", "linkedin", "domain", "status"]) {
7460
+ const found = findFirstTargetByKey(result, target);
7461
+ if (found) targets[target] = found;
7462
+ }
7463
+ }
7464
+ for (const [target, paths] of declaredTargetPaths) {
7465
+ if (targets[target]) continue;
7466
+ targets[target] = {
7467
+ value: null,
7468
+ path: paths.flatMap(candidateResultPaths).find(Boolean) ?? `toolResponse.raw.${target}`
7469
+ };
7451
7470
  }
7452
7471
  return targets;
7453
7472
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deepline",
3
- "version": "0.2.61",
3
+ "version": "0.2.63",
4
4
  "description": "GTM data CLI and TypeScript SDK for coding agents",
5
5
  "license": "MIT",
6
6
  "homepage": "https://code.deepline.com",