deepline 0.3.15 → 0.3.17

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.
@@ -5369,6 +5369,7 @@ export class PlayContextImpl implements ScalarPlayAuthoringRuntimeContext {
5369
5369
  entries: Array<{
5370
5370
  request: ToolCallRequest;
5371
5371
  result: unknown | null;
5372
+ status?: string;
5372
5373
  metadata?: ToolResultMetadataInput | null;
5373
5374
  jobId?: string;
5374
5375
  meta?: Record<string, unknown>;
@@ -5380,7 +5381,8 @@ export class PlayContextImpl implements ScalarPlayAuthoringRuntimeContext {
5380
5381
  ...entry,
5381
5382
  wrapped: await this.wrapToolExecutionResult({
5382
5383
  toolId,
5383
- status: entry.result == null ? 'no_result' : 'completed',
5384
+ status:
5385
+ entry.status ?? (entry.result == null ? 'no_result' : 'completed'),
5384
5386
  jobId: entry.jobId,
5385
5387
  result: entry.result,
5386
5388
  metadata: entry.metadata,
@@ -11282,12 +11284,13 @@ export class PlayContextImpl implements ScalarPlayAuthoringRuntimeContext {
11282
11284
  }
11283
11285
  continue;
11284
11286
  }
11287
+ const batchExecution = entry.result;
11285
11288
  try {
11286
11289
  const splitResults =
11287
- entry.result != null
11290
+ batchExecution != null
11288
11291
  ? entry.request.splitResults(
11289
11292
  legacyResultForBatchSplitter(
11290
- entry.result.execution,
11293
+ batchExecution.execution,
11291
11294
  ),
11292
11295
  )
11293
11296
  : entry.request.memberRequests.map(() => null);
@@ -11298,11 +11301,12 @@ export class PlayContextImpl implements ScalarPlayAuthoringRuntimeContext {
11298
11301
  (request, index) => ({
11299
11302
  request,
11300
11303
  result: splitResults[index] ?? null,
11304
+ status: batchExecution?.execution.status,
11301
11305
  toolResponse:
11302
- entry.result == null
11306
+ batchExecution == null
11303
11307
  ? undefined
11304
11308
  : publicToolResponseForBatchedItem(
11305
- entry.result.execution,
11309
+ batchExecution.execution,
11306
11310
  splitResults[index] ?? null,
11307
11311
  this.currentToolResponseContract ===
11308
11312
  RAW_V2_TOOL_RESPONSE_CONTRACT,
@@ -11323,7 +11327,7 @@ export class PlayContextImpl implements ScalarPlayAuthoringRuntimeContext {
11323
11327
  resolveLiveFollowers(request, resolvedResults[index]);
11324
11328
  }
11325
11329
  } finally {
11326
- entry.result?.releaseToolSlot();
11330
+ batchExecution?.releaseToolSlot();
11327
11331
  }
11328
11332
  }
11329
11333
 
@@ -11340,6 +11344,7 @@ export class PlayContextImpl implements ScalarPlayAuthoringRuntimeContext {
11340
11344
  const completionBuffer: Array<{
11341
11345
  request: ToolCallRequest;
11342
11346
  result: unknown | null;
11347
+ status?: string;
11343
11348
  metadata?: ToolResultMetadataInput | null;
11344
11349
  jobId?: string;
11345
11350
  meta?: Record<string, unknown>;
@@ -11359,6 +11364,7 @@ export class PlayContextImpl implements ScalarPlayAuthoringRuntimeContext {
11359
11364
  entries.map((entry) => ({
11360
11365
  request: entry.request,
11361
11366
  result: entry.result,
11367
+ status: entry.status,
11362
11368
  metadata: entry.metadata,
11363
11369
  jobId: entry.jobId,
11364
11370
  meta: entry.meta,
@@ -11392,6 +11398,7 @@ export class PlayContextImpl implements ScalarPlayAuthoringRuntimeContext {
11392
11398
  completionBuffer.push({
11393
11399
  request,
11394
11400
  result: execution.result ?? null,
11401
+ status: execution.status,
11395
11402
  metadata: execution.metadata ?? null,
11396
11403
  jobId: execution.jobId,
11397
11404
  meta: execution.meta,
@@ -1,4 +1,5 @@
1
1
  import type { AnyBatchOperationStrategy } from './batching-types';
2
+ import { bettercontactBatchStrategies } from './bettercontact-batching';
2
3
  import { DEFAULT_PLAY_RUNTIME_BATCH_STRATEGIES } from './default-batch-strategies';
3
4
  import { fullenrichBatchStrategies } from './fullenrich-batching';
4
5
  import { opensosdataBatchStrategies } from './opensosdata-batching';
@@ -8,6 +9,7 @@ export const PLAY_RUNTIME_BATCH_OPERATION_REGISTRY: Record<
8
9
  AnyBatchOperationStrategy
9
10
  > = {
10
11
  ...DEFAULT_PLAY_RUNTIME_BATCH_STRATEGIES,
12
+ ...bettercontactBatchStrategies,
11
13
  ...fullenrichBatchStrategies,
12
14
  ...opensosdataBatchStrategies,
13
15
  };
@@ -75,6 +75,67 @@ export function defaultProductNotificationEventTypes(): ProductNotificationEvent
75
75
  }
76
76
 
77
77
  export const PRODUCT_NOTIFICATION_DESTINATION_KINDS = ['slack'] as const;
78
+ /**
79
+ * The legacy settings API predates named notification rules. Its shortcuts
80
+ * operate on this deterministic compatibility rule when more than one Slack
81
+ * notification exists.
82
+ */
83
+ export const LEGACY_SLACK_NOTIFICATION_NAME = 'Slack notifications';
84
+ export const PRODUCT_NOTIFICATION_LEGACY_SELECTION_ERROR_CODE =
85
+ 'PRODUCT_NOTIFICATION_LEGACY_SELECTION_AMBIGUOUS';
86
+
87
+ export type LegacySlackNotificationDestination = {
88
+ kind: string;
89
+ name: string;
90
+ archivedAt?: number;
91
+ };
92
+
93
+ export class ProductNotificationLegacySelectionError extends Error {
94
+ constructor(message: string) {
95
+ super(message);
96
+ this.name = 'ProductNotificationLegacySelectionError';
97
+ }
98
+ }
99
+
100
+ export function isProductNotificationLegacySelectionError(
101
+ error: unknown,
102
+ ): boolean {
103
+ if (!error || typeof error !== 'object' || !('data' in error)) return false;
104
+ const data = (error as { data?: unknown }).data;
105
+ return (
106
+ typeof data === 'object' &&
107
+ data !== null &&
108
+ (data as { code?: unknown }).code ===
109
+ PRODUCT_NOTIFICATION_LEGACY_SELECTION_ERROR_CODE
110
+ );
111
+ }
112
+
113
+ /**
114
+ * Resolve the singleton target for the legacy settings API without ever
115
+ * silently choosing one of several named notification rules.
116
+ */
117
+ export function resolveLegacySlackNotification<
118
+ T extends LegacySlackNotificationDestination,
119
+ >(destinations: readonly T[]): T | null {
120
+ const slackDestinations = destinations.filter(
121
+ (destination) =>
122
+ destination.kind === 'slack' && destination.archivedAt === undefined,
123
+ );
124
+ const canonical = slackDestinations.filter(
125
+ (destination) => destination.name === LEGACY_SLACK_NOTIFICATION_NAME,
126
+ );
127
+ if (canonical.length === 1) return canonical[0]!;
128
+ if (canonical.length > 1) {
129
+ throw new ProductNotificationLegacySelectionError(
130
+ `More than one \"${LEGACY_SLACK_NOTIFICATION_NAME}\" Slack notification exists. Use the named notification API to choose one.`,
131
+ );
132
+ }
133
+ if (slackDestinations.length <= 1) return slackDestinations[0] ?? null;
134
+ throw new ProductNotificationLegacySelectionError(
135
+ 'More than one Slack notification is configured. Use the named notification API to choose one.',
136
+ );
137
+ }
138
+
78
139
  export const PRODUCT_NOTIFICATION_SLACK_OAUTH_SCOPES = [
79
140
  'channels:read',
80
141
  'chat:write',
package/dist/cli/index.js CHANGED
@@ -1047,7 +1047,7 @@ var SDK_RELEASE = {
1047
1047
  // 0.3.0 introduces raw-v2: complete scrubbed provider responses are
1048
1048
  // available at toolResponse.rawV2 while toolResponse.raw and all declared
1049
1049
  // getters keep their established compatibility behavior.
1050
- version: "0.3.15",
1050
+ version: "0.3.17",
1051
1051
  updateSummary: "New raw-v2 tool responses preserve complete scrubbed provider envelopes at toolResponse.rawV2, including JSON:API included resources, links, cursors, and totals. Existing toolResponse.raw and declared getters keep working unchanged.",
1052
1052
  contracts: {
1053
1053
  api: {
@@ -1904,6 +1904,31 @@ var PRODUCT_NOTIFICATION_EVENT_CATALOG = [
1904
1904
  var PRODUCT_NOTIFICATION_EVENT_TYPE_SET = new Set(
1905
1905
  PRODUCT_NOTIFICATION_EVENT_CATALOG.map((event) => event.id)
1906
1906
  );
1907
+ var LEGACY_SLACK_NOTIFICATION_NAME = "Slack notifications";
1908
+ var ProductNotificationLegacySelectionError = class extends Error {
1909
+ constructor(message) {
1910
+ super(message);
1911
+ this.name = "ProductNotificationLegacySelectionError";
1912
+ }
1913
+ };
1914
+ function resolveLegacySlackNotification(destinations) {
1915
+ const slackDestinations = destinations.filter(
1916
+ (destination) => destination.kind === "slack" && destination.archivedAt === void 0
1917
+ );
1918
+ const canonical = slackDestinations.filter(
1919
+ (destination) => destination.name === LEGACY_SLACK_NOTIFICATION_NAME
1920
+ );
1921
+ if (canonical.length === 1) return canonical[0];
1922
+ if (canonical.length > 1) {
1923
+ throw new ProductNotificationLegacySelectionError(
1924
+ `More than one "${LEGACY_SLACK_NOTIFICATION_NAME}" Slack notification exists. Use the named notification API to choose one.`
1925
+ );
1926
+ }
1927
+ if (slackDestinations.length <= 1) return slackDestinations[0] ?? null;
1928
+ throw new ProductNotificationLegacySelectionError(
1929
+ "More than one Slack notification is configured. Use the named notification API to choose one."
1930
+ );
1931
+ }
1907
1932
  var PRODUCT_NOTIFICATION_SLACK_OAUTH_SCOPES = [
1908
1933
  "channels:read",
1909
1934
  "chat:write",
@@ -3747,6 +3772,16 @@ function resolveTheirstackClientTimeoutMs(endpointId, payload) {
3747
3772
  return usesExtendedTheirstackJobSearchBudget(endpointId, payload) ? THEIRSTACK_SLOW_JOB_SEARCH_CLIENT_TIMEOUT_MS : null;
3748
3773
  }
3749
3774
 
3775
+ // ../shared_libs/integrations/bettercontact-execution-policy.ts
3776
+ var BETTERCONTACT_LAUNCHER_CLIENT_TIMEOUT_MS = 12e4;
3777
+ var BETTERCONTACT_LAUNCHER_TOOL_IDS = /* @__PURE__ */ new Set([
3778
+ "bettercontact_enrich",
3779
+ "bettercontact_bulk_enrich"
3780
+ ]);
3781
+ function usesExtendedBetterContactLauncherBudget(toolId) {
3782
+ return BETTERCONTACT_LAUNCHER_TOOL_IDS.has(toolId.trim().toLowerCase());
3783
+ }
3784
+
3750
3785
  // ../shared_libs/play-runtime/backend.ts
3751
3786
  var PLAY_RUNTIME_BACKENDS = {
3752
3787
  localProcess: "local_process",
@@ -4027,6 +4062,9 @@ function resolveToolExecuteTimeoutMs(toolId, input2) {
4027
4062
  input2
4028
4063
  );
4029
4064
  if (theirstackTimeoutMs !== null) return theirstackTimeoutMs;
4065
+ if (usesExtendedBetterContactLauncherBudget(normalized)) {
4066
+ return BETTERCONTACT_LAUNCHER_CLIENT_TIMEOUT_MS;
4067
+ }
4030
4068
  return normalized === "deeplineagent" || normalized === "deeplineagent_deeplineagent" || normalized === "ai_inference" || normalized === "deeplineagent_ai_inference" || normalized === "aiinference" ? DEEPLINEAGENT_EXECUTE_TIMEOUT_MS : void 0;
4031
4069
  }
4032
4070
  var RUNS_FAILED_LOG_LIMIT = 20;
@@ -36093,11 +36131,23 @@ var eventHelp = PRODUCT_NOTIFICATION_EVENT_CATALOG.map(
36093
36131
  (event) => ` ${event.id.padEnd(28)} ${event.description}`
36094
36132
  ).join("\n");
36095
36133
  function slackDestination(settings) {
36096
- return settings.destinations.find((entry) => entry.kind === "slack");
36134
+ const destinations = settings.destinations.map(
36135
+ (entry) => ({
36136
+ ...entry,
36137
+ kind: typeof entry.kind === "string" ? entry.kind : "",
36138
+ name: typeof entry.name === "string" ? entry.name : "",
36139
+ archivedAt: typeof entry.archivedAt === "number" ? entry.archivedAt : void 0
36140
+ })
36141
+ );
36142
+ return resolveLegacySlackNotification(
36143
+ destinations
36144
+ );
36097
36145
  }
36098
- function eventLines(settings) {
36146
+ function eventLines(settings, destinationId) {
36099
36147
  const enabled = new Map(
36100
- settings.subscriptions.map((entry) => [entry.eventType, entry.enabled])
36148
+ settings.subscriptions.filter(
36149
+ (entry) => !destinationId || entry.destinationId === destinationId
36150
+ ).map((entry) => [entry.eventType, entry.enabled])
36101
36151
  );
36102
36152
  return settings.catalog.map(
36103
36153
  (event) => `${event.id}: ${enabled.get(event.id) === true ? "enabled" : "disabled"} \u2014 ${event.description}`
@@ -36115,6 +36165,7 @@ function requireCatalogEvent(settings, eventType) {
36115
36165
  async function printSettings(options) {
36116
36166
  const settings = await new DeeplineClient().getNotificationSettings();
36117
36167
  const slack = slackDestination(settings);
36168
+ const destinationId = typeof slack?._id === "string" ? slack._id : void 0;
36118
36169
  printCommandEnvelope(
36119
36170
  {
36120
36171
  settings,
@@ -36128,7 +36179,10 @@ async function printSettings(options) {
36128
36179
  ...slack.lastErrorMessage ? [`issue: ${String(slack.lastErrorMessage)}`] : []
36129
36180
  ] : ["Not configured."]
36130
36181
  },
36131
- { title: "subscriptions", lines: eventLines(settings) },
36182
+ {
36183
+ title: "subscriptions",
36184
+ lines: eventLines(settings, destinationId)
36185
+ },
36132
36186
  {
36133
36187
  title: "dead letter queue",
36134
36188
  lines: [
@@ -36317,12 +36371,19 @@ ${eventHelp}
36317
36371
  );
36318
36372
  subscriptions.command("list").description("List every supported event and its current state.").option("--json", "Emit JSON output").action(async (options) => {
36319
36373
  const current = await new DeeplineClient().getNotificationSettings();
36374
+ const destination = slackDestination(current);
36375
+ const destinationId = typeof destination?._id === "string" ? destination._id : void 0;
36320
36376
  printCommandEnvelope(
36321
36377
  {
36322
36378
  catalog: current.catalog,
36323
36379
  subscriptions: current.subscriptions,
36324
36380
  render: {
36325
- sections: [{ title: "subscriptions", lines: eventLines(current) }]
36381
+ sections: [
36382
+ {
36383
+ title: "subscriptions",
36384
+ lines: eventLines(current, destinationId)
36385
+ }
36386
+ ]
36326
36387
  }
36327
36388
  },
36328
36389
  { json: options.json }
@@ -36331,8 +36392,10 @@ ${eventHelp}
36331
36392
  subscriptions.command("describe").description("Describe one event from the shared product catalog.").argument("<event>", "Event ID; run subscriptions list to enumerate").option("--json", "Emit JSON output").action(async (eventType, options) => {
36332
36393
  const current = await new DeeplineClient().getNotificationSettings();
36333
36394
  const event = requireCatalogEvent(current, eventType);
36395
+ const destination = slackDestination(current);
36396
+ const destinationId = typeof destination?._id === "string" ? destination._id : void 0;
36334
36397
  const subscription = current.subscriptions.find(
36335
- (entry) => entry.eventType === event.id
36398
+ (entry) => entry.eventType === event.id && (!destinationId || entry.destinationId === destinationId)
36336
36399
  );
36337
36400
  printCommandEnvelope(
36338
36401
  {
@@ -1033,7 +1033,7 @@ var SDK_RELEASE = {
1033
1033
  // 0.3.0 introduces raw-v2: complete scrubbed provider responses are
1034
1034
  // available at toolResponse.rawV2 while toolResponse.raw and all declared
1035
1035
  // getters keep their established compatibility behavior.
1036
- version: "0.3.15",
1036
+ version: "0.3.17",
1037
1037
  updateSummary: "New raw-v2 tool responses preserve complete scrubbed provider envelopes at toolResponse.rawV2, including JSON:API included resources, links, cursors, and totals. Existing toolResponse.raw and declared getters keep working unchanged.",
1038
1038
  contracts: {
1039
1039
  api: {
@@ -1890,6 +1890,31 @@ var PRODUCT_NOTIFICATION_EVENT_CATALOG = [
1890
1890
  var PRODUCT_NOTIFICATION_EVENT_TYPE_SET = new Set(
1891
1891
  PRODUCT_NOTIFICATION_EVENT_CATALOG.map((event) => event.id)
1892
1892
  );
1893
+ var LEGACY_SLACK_NOTIFICATION_NAME = "Slack notifications";
1894
+ var ProductNotificationLegacySelectionError = class extends Error {
1895
+ constructor(message) {
1896
+ super(message);
1897
+ this.name = "ProductNotificationLegacySelectionError";
1898
+ }
1899
+ };
1900
+ function resolveLegacySlackNotification(destinations) {
1901
+ const slackDestinations = destinations.filter(
1902
+ (destination) => destination.kind === "slack" && destination.archivedAt === void 0
1903
+ );
1904
+ const canonical = slackDestinations.filter(
1905
+ (destination) => destination.name === LEGACY_SLACK_NOTIFICATION_NAME
1906
+ );
1907
+ if (canonical.length === 1) return canonical[0];
1908
+ if (canonical.length > 1) {
1909
+ throw new ProductNotificationLegacySelectionError(
1910
+ `More than one "${LEGACY_SLACK_NOTIFICATION_NAME}" Slack notification exists. Use the named notification API to choose one.`
1911
+ );
1912
+ }
1913
+ if (slackDestinations.length <= 1) return slackDestinations[0] ?? null;
1914
+ throw new ProductNotificationLegacySelectionError(
1915
+ "More than one Slack notification is configured. Use the named notification API to choose one."
1916
+ );
1917
+ }
1893
1918
  var PRODUCT_NOTIFICATION_SLACK_OAUTH_SCOPES = [
1894
1919
  "channels:read",
1895
1920
  "chat:write",
@@ -3733,6 +3758,16 @@ function resolveTheirstackClientTimeoutMs(endpointId, payload) {
3733
3758
  return usesExtendedTheirstackJobSearchBudget(endpointId, payload) ? THEIRSTACK_SLOW_JOB_SEARCH_CLIENT_TIMEOUT_MS : null;
3734
3759
  }
3735
3760
 
3761
+ // ../shared_libs/integrations/bettercontact-execution-policy.ts
3762
+ var BETTERCONTACT_LAUNCHER_CLIENT_TIMEOUT_MS = 12e4;
3763
+ var BETTERCONTACT_LAUNCHER_TOOL_IDS = /* @__PURE__ */ new Set([
3764
+ "bettercontact_enrich",
3765
+ "bettercontact_bulk_enrich"
3766
+ ]);
3767
+ function usesExtendedBetterContactLauncherBudget(toolId) {
3768
+ return BETTERCONTACT_LAUNCHER_TOOL_IDS.has(toolId.trim().toLowerCase());
3769
+ }
3770
+
3736
3771
  // ../shared_libs/play-runtime/backend.ts
3737
3772
  var PLAY_RUNTIME_BACKENDS = {
3738
3773
  localProcess: "local_process",
@@ -4013,6 +4048,9 @@ function resolveToolExecuteTimeoutMs(toolId, input2) {
4013
4048
  input2
4014
4049
  );
4015
4050
  if (theirstackTimeoutMs !== null) return theirstackTimeoutMs;
4051
+ if (usesExtendedBetterContactLauncherBudget(normalized)) {
4052
+ return BETTERCONTACT_LAUNCHER_CLIENT_TIMEOUT_MS;
4053
+ }
4016
4054
  return normalized === "deeplineagent" || normalized === "deeplineagent_deeplineagent" || normalized === "ai_inference" || normalized === "deeplineagent_ai_inference" || normalized === "aiinference" ? DEEPLINEAGENT_EXECUTE_TIMEOUT_MS : void 0;
4017
4055
  }
4018
4056
  var RUNS_FAILED_LOG_LIMIT = 20;
@@ -36171,11 +36209,23 @@ var eventHelp = PRODUCT_NOTIFICATION_EVENT_CATALOG.map(
36171
36209
  (event) => ` ${event.id.padEnd(28)} ${event.description}`
36172
36210
  ).join("\n");
36173
36211
  function slackDestination(settings) {
36174
- return settings.destinations.find((entry) => entry.kind === "slack");
36212
+ const destinations = settings.destinations.map(
36213
+ (entry) => ({
36214
+ ...entry,
36215
+ kind: typeof entry.kind === "string" ? entry.kind : "",
36216
+ name: typeof entry.name === "string" ? entry.name : "",
36217
+ archivedAt: typeof entry.archivedAt === "number" ? entry.archivedAt : void 0
36218
+ })
36219
+ );
36220
+ return resolveLegacySlackNotification(
36221
+ destinations
36222
+ );
36175
36223
  }
36176
- function eventLines(settings) {
36224
+ function eventLines(settings, destinationId) {
36177
36225
  const enabled = new Map(
36178
- settings.subscriptions.map((entry) => [entry.eventType, entry.enabled])
36226
+ settings.subscriptions.filter(
36227
+ (entry) => !destinationId || entry.destinationId === destinationId
36228
+ ).map((entry) => [entry.eventType, entry.enabled])
36179
36229
  );
36180
36230
  return settings.catalog.map(
36181
36231
  (event) => `${event.id}: ${enabled.get(event.id) === true ? "enabled" : "disabled"} \u2014 ${event.description}`
@@ -36193,6 +36243,7 @@ function requireCatalogEvent(settings, eventType) {
36193
36243
  async function printSettings(options) {
36194
36244
  const settings = await new DeeplineClient().getNotificationSettings();
36195
36245
  const slack = slackDestination(settings);
36246
+ const destinationId = typeof slack?._id === "string" ? slack._id : void 0;
36196
36247
  printCommandEnvelope(
36197
36248
  {
36198
36249
  settings,
@@ -36206,7 +36257,10 @@ async function printSettings(options) {
36206
36257
  ...slack.lastErrorMessage ? [`issue: ${String(slack.lastErrorMessage)}`] : []
36207
36258
  ] : ["Not configured."]
36208
36259
  },
36209
- { title: "subscriptions", lines: eventLines(settings) },
36260
+ {
36261
+ title: "subscriptions",
36262
+ lines: eventLines(settings, destinationId)
36263
+ },
36210
36264
  {
36211
36265
  title: "dead letter queue",
36212
36266
  lines: [
@@ -36395,12 +36449,19 @@ ${eventHelp}
36395
36449
  );
36396
36450
  subscriptions.command("list").description("List every supported event and its current state.").option("--json", "Emit JSON output").action(async (options) => {
36397
36451
  const current = await new DeeplineClient().getNotificationSettings();
36452
+ const destination = slackDestination(current);
36453
+ const destinationId = typeof destination?._id === "string" ? destination._id : void 0;
36398
36454
  printCommandEnvelope(
36399
36455
  {
36400
36456
  catalog: current.catalog,
36401
36457
  subscriptions: current.subscriptions,
36402
36458
  render: {
36403
- sections: [{ title: "subscriptions", lines: eventLines(current) }]
36459
+ sections: [
36460
+ {
36461
+ title: "subscriptions",
36462
+ lines: eventLines(current, destinationId)
36463
+ }
36464
+ ]
36404
36465
  }
36405
36466
  },
36406
36467
  { json: options.json }
@@ -36409,8 +36470,10 @@ ${eventHelp}
36409
36470
  subscriptions.command("describe").description("Describe one event from the shared product catalog.").argument("<event>", "Event ID; run subscriptions list to enumerate").option("--json", "Emit JSON output").action(async (eventType, options) => {
36410
36471
  const current = await new DeeplineClient().getNotificationSettings();
36411
36472
  const event = requireCatalogEvent(current, eventType);
36473
+ const destination = slackDestination(current);
36474
+ const destinationId = typeof destination?._id === "string" ? destination._id : void 0;
36412
36475
  const subscription = current.subscriptions.find(
36413
- (entry) => entry.eventType === event.id
36476
+ (entry) => entry.eventType === event.id && (!destinationId || entry.destinationId === destinationId)
36414
36477
  );
36415
36478
  printCommandEnvelope(
36416
36479
  {
package/dist/index.js CHANGED
@@ -783,7 +783,7 @@ var SDK_RELEASE = {
783
783
  // 0.3.0 introduces raw-v2: complete scrubbed provider responses are
784
784
  // available at toolResponse.rawV2 while toolResponse.raw and all declared
785
785
  // getters keep their established compatibility behavior.
786
- version: "0.3.15",
786
+ version: "0.3.17",
787
787
  updateSummary: "New raw-v2 tool responses preserve complete scrubbed provider envelopes at toolResponse.rawV2, including JSON:API included resources, links, cursors, and totals. Existing toolResponse.raw and declared getters keep working unchanged.",
788
788
  contracts: {
789
789
  api: {
@@ -3483,6 +3483,16 @@ function resolveTheirstackClientTimeoutMs(endpointId, payload) {
3483
3483
  return usesExtendedTheirstackJobSearchBudget(endpointId, payload) ? THEIRSTACK_SLOW_JOB_SEARCH_CLIENT_TIMEOUT_MS : null;
3484
3484
  }
3485
3485
 
3486
+ // ../shared_libs/integrations/bettercontact-execution-policy.ts
3487
+ var BETTERCONTACT_LAUNCHER_CLIENT_TIMEOUT_MS = 12e4;
3488
+ var BETTERCONTACT_LAUNCHER_TOOL_IDS = /* @__PURE__ */ new Set([
3489
+ "bettercontact_enrich",
3490
+ "bettercontact_bulk_enrich"
3491
+ ]);
3492
+ function usesExtendedBetterContactLauncherBudget(toolId) {
3493
+ return BETTERCONTACT_LAUNCHER_TOOL_IDS.has(toolId.trim().toLowerCase());
3494
+ }
3495
+
3486
3496
  // ../shared_libs/play-runtime/backend.ts
3487
3497
  var PLAY_RUNTIME_BACKENDS = {
3488
3498
  localProcess: "local_process",
@@ -3763,6 +3773,9 @@ function resolveToolExecuteTimeoutMs(toolId, input) {
3763
3773
  input
3764
3774
  );
3765
3775
  if (theirstackTimeoutMs !== null) return theirstackTimeoutMs;
3776
+ if (usesExtendedBetterContactLauncherBudget(normalized)) {
3777
+ return BETTERCONTACT_LAUNCHER_CLIENT_TIMEOUT_MS;
3778
+ }
3766
3779
  return normalized === "deeplineagent" || normalized === "deeplineagent_deeplineagent" || normalized === "ai_inference" || normalized === "deeplineagent_ai_inference" || normalized === "aiinference" ? DEEPLINEAGENT_EXECUTE_TIMEOUT_MS : void 0;
3767
3780
  }
3768
3781
  var RUNS_FAILED_LOG_LIMIT = 20;
package/dist/index.mjs CHANGED
@@ -706,7 +706,7 @@ var SDK_RELEASE = {
706
706
  // 0.3.0 introduces raw-v2: complete scrubbed provider responses are
707
707
  // available at toolResponse.rawV2 while toolResponse.raw and all declared
708
708
  // getters keep their established compatibility behavior.
709
- version: "0.3.15",
709
+ version: "0.3.17",
710
710
  updateSummary: "New raw-v2 tool responses preserve complete scrubbed provider envelopes at toolResponse.rawV2, including JSON:API included resources, links, cursors, and totals. Existing toolResponse.raw and declared getters keep working unchanged.",
711
711
  contracts: {
712
712
  api: {
@@ -3406,6 +3406,16 @@ function resolveTheirstackClientTimeoutMs(endpointId, payload) {
3406
3406
  return usesExtendedTheirstackJobSearchBudget(endpointId, payload) ? THEIRSTACK_SLOW_JOB_SEARCH_CLIENT_TIMEOUT_MS : null;
3407
3407
  }
3408
3408
 
3409
+ // ../shared_libs/integrations/bettercontact-execution-policy.ts
3410
+ var BETTERCONTACT_LAUNCHER_CLIENT_TIMEOUT_MS = 12e4;
3411
+ var BETTERCONTACT_LAUNCHER_TOOL_IDS = /* @__PURE__ */ new Set([
3412
+ "bettercontact_enrich",
3413
+ "bettercontact_bulk_enrich"
3414
+ ]);
3415
+ function usesExtendedBetterContactLauncherBudget(toolId) {
3416
+ return BETTERCONTACT_LAUNCHER_TOOL_IDS.has(toolId.trim().toLowerCase());
3417
+ }
3418
+
3409
3419
  // ../shared_libs/play-runtime/backend.ts
3410
3420
  var PLAY_RUNTIME_BACKENDS = {
3411
3421
  localProcess: "local_process",
@@ -3686,6 +3696,9 @@ function resolveToolExecuteTimeoutMs(toolId, input) {
3686
3696
  input
3687
3697
  );
3688
3698
  if (theirstackTimeoutMs !== null) return theirstackTimeoutMs;
3699
+ if (usesExtendedBetterContactLauncherBudget(normalized)) {
3700
+ return BETTERCONTACT_LAUNCHER_CLIENT_TIMEOUT_MS;
3701
+ }
3689
3702
  return normalized === "deeplineagent" || normalized === "deeplineagent_deeplineagent" || normalized === "ai_inference" || normalized === "deeplineagent_ai_inference" || normalized === "aiinference" ? DEEPLINEAGENT_EXECUTE_TIMEOUT_MS : void 0;
3690
3703
  }
3691
3704
  var RUNS_FAILED_LOG_LIMIT = 20;
@@ -20,6 +20,7 @@
20
20
  "dist/bundling-sources/sdk/src/tool-output.ts",
21
21
  "dist/bundling-sources/sdk/src/types.ts",
22
22
  "dist/bundling-sources/sdk/src/version.ts",
23
+ "dist/bundling-sources/shared_libs/integrations/bettercontact-execution-policy.ts",
23
24
  "dist/bundling-sources/shared_libs/integrations/theirstack-execution-policy.ts",
24
25
  "dist/bundling-sources/shared_libs/observability/node-tracing.ts",
25
26
  "dist/bundling-sources/shared_libs/observability/redaction.ts",
@@ -36,6 +37,7 @@
36
37
  "dist/bundling-sources/shared_libs/play-runtime/backend.ts",
37
38
  "dist/bundling-sources/shared_libs/play-runtime/batch-runtime.ts",
38
39
  "dist/bundling-sources/shared_libs/play-runtime/batching-types.ts",
40
+ "dist/bundling-sources/shared_libs/play-runtime/bettercontact-batching.ts",
39
41
  "dist/bundling-sources/shared_libs/play-runtime/bounded-dispatch.ts",
40
42
  "dist/bundling-sources/shared_libs/play-runtime/builtin-pacing.ts",
41
43
  "dist/bundling-sources/shared_libs/play-runtime/cell-provenance.ts",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deepline",
3
- "version": "0.3.15",
3
+ "version": "0.3.17",
4
4
  "description": "GTM data CLI and TypeScript SDK for coding agents",
5
5
  "license": "MIT",
6
6
  "homepage": "https://code.deepline.com",