deepline 0.2.67 → 0.2.69

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.
@@ -1135,19 +1135,44 @@ type PlaySqlQuery = {
1135
1135
  readonly values: readonly unknown[];
1136
1136
  };
1137
1137
  declare const PLAY_SECRET_HANDLE_BRAND: unique symbol;
1138
+ /**
1139
+ * An opaque reference to a workspace secret, returned by `ctx.secrets.get`. The handle never carries the value into play code: it stringifies to `[secret:NAME]` and throws on `JSON.stringify`, so a secret cannot reach a play variable, a log line, a dataset cell, or a replay artifact even by accident. Only the runtime resolves it, at the moment it attaches the request header.
1140
+ *
1141
+ * @sdkReference runtime 176 SecretHandle
1142
+ */
1138
1143
  type PlaySecretHandle = {
1139
1144
  readonly [PLAY_SECRET_HANDLE_BRAND]: never;
1145
+ /** Name of the workspace secret, uppercased. Never its value. */
1140
1146
  readonly name: string;
1147
+ /** Renders `[secret:NAME]`, so an interpolated handle leaks nothing. */
1141
1148
  toString(): string;
1149
+ /** Always throws. A secret handle is deliberately not serializable. */
1142
1150
  toJSON(): never;
1143
1151
  };
1152
+ /**
1153
+ * One resolved authentication scheme, built by `ctx.secrets.bearer` or `ctx.secrets.header` and attached to a request through `init.auth`.
1154
+ *
1155
+ * @sdkReference runtime 177 SecretAuth
1156
+ */
1144
1157
  type PlaySecretAuth = {
1158
+ /** `bearer` sends `Authorization: Bearer <value>`; `header` sends a named header. */
1145
1159
  readonly kind: 'bearer' | 'header';
1160
+ /** The handle whose value the runtime attaches. */
1146
1161
  readonly secret: PlaySecretHandle;
1162
+ /** Header name, set only when `kind` is `header`. */
1147
1163
  readonly header?: string;
1148
1164
  };
1165
+ /**
1166
+ * The `init` accepted by `ctx.fetch`. Same shape as `RequestInit` plus `auth`.
1167
+ *
1168
+ * @sdkReference runtime 174 SecretAwareRequestInit
1169
+ */
1149
1170
  type PlaySecretAwareRequestInit = Omit<RequestInit, 'headers'> & {
1171
+ /** Ordinary request headers, recorded in the durable receipt. Never interpolate a secret value here — use `auth`. */
1150
1172
  headers?: HeadersInit;
1173
+ /**
1174
+ * The single authenticated header for this request. One value, not a list: exactly one `ctx.secrets` auth attaches per `ctx.fetch`. An API wanting two credentialed headers at once — Supabase with both `apikey` and `Authorization` — cannot express both. Put the must-stay-secret credential in `auth`; pass a genuinely non-secret second value in `headers`. If both are secret, the request needs a server-side proxy holding one of them.
1175
+ */
1151
1176
  auth?: PlaySecretAuth;
1152
1177
  };
1153
1178
  type PlayLooseObject = {
@@ -1324,13 +1349,27 @@ type PlayAuthoringRuntimeStepOptions = {
1324
1349
  type PlayAuthoringFetchOptions = {
1325
1350
  staleAfterSeconds?: DurableCallStaleAfterSeconds;
1326
1351
  };
1352
+ /**
1353
+ * The value `ctx.fetch(...)` resolves to: a plain durable record, not a WHATWG `Response`. The body is read once at request time so the call can be checkpointed and replayed, so `bodyText` and `json` are already-materialized properties. There is no `.json()`, `.text()`, or `.body` to await — `await res.json()` is a type error, not a typing problem.
1354
+ *
1355
+ * @sdkReference runtime 175 PlayFetchResponse
1356
+ */
1327
1357
  type PlayAuthoringFetchResponse = {
1358
+ /** True when the response status is in the 2xx range. */
1328
1359
  ok: boolean;
1360
+ /** HTTP status code as returned by the upstream server. */
1329
1361
  status: number;
1362
+ /** HTTP status text as returned by the upstream server. */
1330
1363
  statusText: string;
1364
+ /** Final response URL after any redirects. */
1331
1365
  url: string;
1366
+ /** Response headers, lowercased, with any known secret values redacted. */
1332
1367
  headers: Record<string, string>;
1368
+ /** Full response body as text, with any known secret values redacted. */
1333
1369
  bodyText: string;
1370
+ /**
1371
+ * The parsed body, eagerly decoded at request time. Read it as a property — `const body = res.json`, never `await res.json()`. Null when the body is empty AND when it is not valid JSON: a malformed payload is reported as null rather than thrown, so check `res.ok` and fall back to `res.bodyText` before treating null as an empty result.
1372
+ */
1334
1373
  json: unknown | null;
1335
1374
  };
1336
1375
  type PlayAuthoringCustomerDbQueryOptions = {
@@ -1400,8 +1439,23 @@ interface PlayAuthoringRuntimeContext {
1400
1439
  */
1401
1440
  fetch(key: string, url: string | URL, init?: PlaySecretAwareRequestInit, options?: PlayAuthoringFetchOptions): Promise<PlayAuthoringFetchResponse>;
1402
1441
  secrets: {
1442
+ /**
1443
+ * Reference a workspace secret by name without reading its value. This is the only supported way to authenticate an outbound request from a Play: `process.env.X` is rejected at check time because an env read puts the raw value in a play variable, where it can reach a log line or a replay artifact. A handle cannot — pass it to `bearer` or `header` and the runtime resolves it only while attaching the header. Names are uppercased; manage stored values with `deepline secrets set` / `deepline secrets list`.
1444
+ *
1445
+ * @sdkReference runtime 171 ctx.secrets.get(name)
1446
+ */
1403
1447
  get(name: string): PlaySecretHandle;
1448
+ /**
1449
+ * Send the secret as `Authorization: Bearer <value>`.
1450
+ *
1451
+ * @sdkReference runtime 172 ctx.secrets.bearer(secret)
1452
+ */
1404
1453
  bearer(secret: PlaySecretHandle): PlaySecretAuth;
1454
+ /**
1455
+ * Send the secret as a named header, for APIs that do not use bearer tokens — `x-api-key`, `apikey`, `private-token`, and similar.
1456
+ *
1457
+ * @sdkReference runtime 173 ctx.secrets.header(header, secret)
1458
+ */
1405
1459
  header(header: string, secret: PlaySecretHandle): PlaySecretAuth;
1406
1460
  };
1407
1461
  /**
@@ -2344,6 +2398,7 @@ declare const PLAY_AUTHORING_FIELD_REGISTRY: {
2344
2398
  readonly issueCode: "play_authoring_durable_policy_invalid";
2345
2399
  readonly description: "Stable durable identity for one external HTTP request.";
2346
2400
  readonly errorMessage: "ctx.fetch key must be a non-empty static string.";
2401
+ readonly unresolvedHint: "Push the aggregation server-side and call it once: a SQL function, a view, or a provider endpoint that returns the whole result. Keep unrolled literal keys only for a handful of genuinely distinct calls. To fan out over rows, use ctx.dataset with a static key — the per-row receipt identity comes from the row, not from the key. Do not compute the key.";
2347
2402
  };
2348
2403
  readonly 'ctx.fetch.staleAfterSeconds': {
2349
2404
  readonly schema: _sinclair_typebox.TUnion<[_sinclair_typebox.TNull, _sinclair_typebox.TInteger]>;
@@ -1135,19 +1135,44 @@ type PlaySqlQuery = {
1135
1135
  readonly values: readonly unknown[];
1136
1136
  };
1137
1137
  declare const PLAY_SECRET_HANDLE_BRAND: unique symbol;
1138
+ /**
1139
+ * An opaque reference to a workspace secret, returned by `ctx.secrets.get`. The handle never carries the value into play code: it stringifies to `[secret:NAME]` and throws on `JSON.stringify`, so a secret cannot reach a play variable, a log line, a dataset cell, or a replay artifact even by accident. Only the runtime resolves it, at the moment it attaches the request header.
1140
+ *
1141
+ * @sdkReference runtime 176 SecretHandle
1142
+ */
1138
1143
  type PlaySecretHandle = {
1139
1144
  readonly [PLAY_SECRET_HANDLE_BRAND]: never;
1145
+ /** Name of the workspace secret, uppercased. Never its value. */
1140
1146
  readonly name: string;
1147
+ /** Renders `[secret:NAME]`, so an interpolated handle leaks nothing. */
1141
1148
  toString(): string;
1149
+ /** Always throws. A secret handle is deliberately not serializable. */
1142
1150
  toJSON(): never;
1143
1151
  };
1152
+ /**
1153
+ * One resolved authentication scheme, built by `ctx.secrets.bearer` or `ctx.secrets.header` and attached to a request through `init.auth`.
1154
+ *
1155
+ * @sdkReference runtime 177 SecretAuth
1156
+ */
1144
1157
  type PlaySecretAuth = {
1158
+ /** `bearer` sends `Authorization: Bearer <value>`; `header` sends a named header. */
1145
1159
  readonly kind: 'bearer' | 'header';
1160
+ /** The handle whose value the runtime attaches. */
1146
1161
  readonly secret: PlaySecretHandle;
1162
+ /** Header name, set only when `kind` is `header`. */
1147
1163
  readonly header?: string;
1148
1164
  };
1165
+ /**
1166
+ * The `init` accepted by `ctx.fetch`. Same shape as `RequestInit` plus `auth`.
1167
+ *
1168
+ * @sdkReference runtime 174 SecretAwareRequestInit
1169
+ */
1149
1170
  type PlaySecretAwareRequestInit = Omit<RequestInit, 'headers'> & {
1171
+ /** Ordinary request headers, recorded in the durable receipt. Never interpolate a secret value here — use `auth`. */
1150
1172
  headers?: HeadersInit;
1173
+ /**
1174
+ * The single authenticated header for this request. One value, not a list: exactly one `ctx.secrets` auth attaches per `ctx.fetch`. An API wanting two credentialed headers at once — Supabase with both `apikey` and `Authorization` — cannot express both. Put the must-stay-secret credential in `auth`; pass a genuinely non-secret second value in `headers`. If both are secret, the request needs a server-side proxy holding one of them.
1175
+ */
1151
1176
  auth?: PlaySecretAuth;
1152
1177
  };
1153
1178
  type PlayLooseObject = {
@@ -1324,13 +1349,27 @@ type PlayAuthoringRuntimeStepOptions = {
1324
1349
  type PlayAuthoringFetchOptions = {
1325
1350
  staleAfterSeconds?: DurableCallStaleAfterSeconds;
1326
1351
  };
1352
+ /**
1353
+ * The value `ctx.fetch(...)` resolves to: a plain durable record, not a WHATWG `Response`. The body is read once at request time so the call can be checkpointed and replayed, so `bodyText` and `json` are already-materialized properties. There is no `.json()`, `.text()`, or `.body` to await — `await res.json()` is a type error, not a typing problem.
1354
+ *
1355
+ * @sdkReference runtime 175 PlayFetchResponse
1356
+ */
1327
1357
  type PlayAuthoringFetchResponse = {
1358
+ /** True when the response status is in the 2xx range. */
1328
1359
  ok: boolean;
1360
+ /** HTTP status code as returned by the upstream server. */
1329
1361
  status: number;
1362
+ /** HTTP status text as returned by the upstream server. */
1330
1363
  statusText: string;
1364
+ /** Final response URL after any redirects. */
1331
1365
  url: string;
1366
+ /** Response headers, lowercased, with any known secret values redacted. */
1332
1367
  headers: Record<string, string>;
1368
+ /** Full response body as text, with any known secret values redacted. */
1333
1369
  bodyText: string;
1370
+ /**
1371
+ * The parsed body, eagerly decoded at request time. Read it as a property — `const body = res.json`, never `await res.json()`. Null when the body is empty AND when it is not valid JSON: a malformed payload is reported as null rather than thrown, so check `res.ok` and fall back to `res.bodyText` before treating null as an empty result.
1372
+ */
1334
1373
  json: unknown | null;
1335
1374
  };
1336
1375
  type PlayAuthoringCustomerDbQueryOptions = {
@@ -1400,8 +1439,23 @@ interface PlayAuthoringRuntimeContext {
1400
1439
  */
1401
1440
  fetch(key: string, url: string | URL, init?: PlaySecretAwareRequestInit, options?: PlayAuthoringFetchOptions): Promise<PlayAuthoringFetchResponse>;
1402
1441
  secrets: {
1442
+ /**
1443
+ * Reference a workspace secret by name without reading its value. This is the only supported way to authenticate an outbound request from a Play: `process.env.X` is rejected at check time because an env read puts the raw value in a play variable, where it can reach a log line or a replay artifact. A handle cannot — pass it to `bearer` or `header` and the runtime resolves it only while attaching the header. Names are uppercased; manage stored values with `deepline secrets set` / `deepline secrets list`.
1444
+ *
1445
+ * @sdkReference runtime 171 ctx.secrets.get(name)
1446
+ */
1403
1447
  get(name: string): PlaySecretHandle;
1448
+ /**
1449
+ * Send the secret as `Authorization: Bearer <value>`.
1450
+ *
1451
+ * @sdkReference runtime 172 ctx.secrets.bearer(secret)
1452
+ */
1404
1453
  bearer(secret: PlaySecretHandle): PlaySecretAuth;
1454
+ /**
1455
+ * Send the secret as a named header, for APIs that do not use bearer tokens — `x-api-key`, `apikey`, `private-token`, and similar.
1456
+ *
1457
+ * @sdkReference runtime 173 ctx.secrets.header(header, secret)
1458
+ */
1405
1459
  header(header: string, secret: PlaySecretHandle): PlaySecretAuth;
1406
1460
  };
1407
1461
  /**
@@ -2344,6 +2398,7 @@ declare const PLAY_AUTHORING_FIELD_REGISTRY: {
2344
2398
  readonly issueCode: "play_authoring_durable_policy_invalid";
2345
2399
  readonly description: "Stable durable identity for one external HTTP request.";
2346
2400
  readonly errorMessage: "ctx.fetch key must be a non-empty static string.";
2401
+ readonly unresolvedHint: "Push the aggregation server-side and call it once: a SQL function, a view, or a provider endpoint that returns the whole result. Keep unrolled literal keys only for a handful of genuinely distinct calls. To fan out over rows, use ctx.dataset with a static key — the per-row receipt identity comes from the row, not from the key. Do not compute the key.";
2347
2402
  };
2348
2403
  readonly 'ctx.fetch.staleAfterSeconds': {
2349
2404
  readonly schema: _sinclair_typebox.TUnion<[_sinclair_typebox.TNull, _sinclair_typebox.TInteger]>;
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { e as PlayRuntimeBackendId, c as PlayCompilerManifest, D as DeeplineError, f as ToolExecutionError, g as ToolExecutionErrorOptions, h as PlayAuthoringColumnMap, i as PlayAuthoringColumnResolver, j as PlayAuthoringRuntimeContext, k as PlayAuthoringConditionalStepResolver, l as PlayAuthoringCsvInput, m as PlayAuthoringCsvOptions, n as PlayAuthoringDatasetBuilder, o as PlayAuthoringDatasetColumnDefinition, p as PlayAuthoringDatasetColumnRunInput, q as ToolExecuteResult, r as PlayAuthoringReferenceLike, s as PlayReturnObject$1, t as PlayAuthoringDefineConfig, u as PlayAuthoringDefinedPlay, v as PlayAuthoringFetchOptions, w as PlayAuthoringFileInput, x as PlayAuthoringBindings, y as PlayAuthoringCallExecution, z as PlayAuthoringCallOptions, A as PlayAuthoringFetchResponse, B as PlayAuthoringInputContract, C as PlayAuthoringStepProgramStep, E as PlayAuthoringRuntimeStepOptions, F as PlaySqlListenerDeclaration, G as PlaySqlListenerEvent, H as PlaySqlListenerOperation, I as PlaySqlQuery, J as PlayAuthoringStepOptions, K as PlayAuthoringStepProgram, L as PlayAuthoringStepProgramResolver, M as PlayAuthoringStepResolver, N as PlayToolExecutionRequest, O as PlayAuthoringStepProgramOptions } from './compiler-manifest-CrAB1ffd.mjs';
2
- export { Q as DEEPLINE_EXTRACTOR_TARGETS, R as DEEPLINE_EXTRACTOR_TARGET_DEFINITIONS, S as DeeplineEmailStatusGetterValue, U as DeeplineExtractorTarget, V as DeeplineGetterValue, W as DeeplineGetterValueMap, X as JOB_CHANGE_STATUS_VALUES, Y as JobChangeStatus, Z as PHONE_STATUS_VALUES, _ as PhoneStatus, $ as PlayDataset, a0 as PlayDatasetInput, a1 as PreviousCell, a2 as ProviderTransientError, a3 as ProviderTransientErrorCategory, a4 as ProviderUnavailableError, a5 as ProviderUnavailableReason, a6 as ToolExecutionErrorCategory, a7 as ToolExecutionErrorOrigin, a8 as ToolExecutionFailureV1, a9 as ToolExecutionNetworkKind, aa as ToolExecutionNetworkScope, ab as getProviderUnavailableReason, ac as isDeeplineExtractorTarget, ad as isProviderUnavailable, ae as isProviderWaterfallUnavailableError } from './compiler-manifest-CrAB1ffd.mjs';
1
+ import { e as PlayRuntimeBackendId, c as PlayCompilerManifest, D as DeeplineError, f as ToolExecutionError, g as ToolExecutionErrorOptions, h as PlayAuthoringColumnMap, i as PlayAuthoringColumnResolver, j as PlayAuthoringRuntimeContext, k as PlayAuthoringConditionalStepResolver, l as PlayAuthoringCsvInput, m as PlayAuthoringCsvOptions, n as PlayAuthoringDatasetBuilder, o as PlayAuthoringDatasetColumnDefinition, p as PlayAuthoringDatasetColumnRunInput, q as ToolExecuteResult, r as PlayAuthoringReferenceLike, s as PlayReturnObject$1, t as PlayAuthoringDefineConfig, u as PlayAuthoringDefinedPlay, v as PlayAuthoringFetchOptions, w as PlayAuthoringFileInput, x as PlayAuthoringBindings, y as PlayAuthoringCallExecution, z as PlayAuthoringCallOptions, A as PlayAuthoringFetchResponse, B as PlayAuthoringInputContract, C as PlayAuthoringStepProgramStep, E as PlayAuthoringRuntimeStepOptions, F as PlaySqlListenerDeclaration, G as PlaySqlListenerEvent, H as PlaySqlListenerOperation, I as PlaySqlQuery, J as PlayAuthoringStepOptions, K as PlayAuthoringStepProgram, L as PlayAuthoringStepProgramResolver, M as PlayAuthoringStepResolver, N as PlayToolExecutionRequest, O as PlayAuthoringStepProgramOptions } from './compiler-manifest-DFBtSjB2.mjs';
2
+ export { Q as DEEPLINE_EXTRACTOR_TARGETS, R as DEEPLINE_EXTRACTOR_TARGET_DEFINITIONS, S as DeeplineEmailStatusGetterValue, U as DeeplineExtractorTarget, V as DeeplineGetterValue, W as DeeplineGetterValueMap, X as JOB_CHANGE_STATUS_VALUES, Y as JobChangeStatus, Z as PHONE_STATUS_VALUES, _ as PhoneStatus, $ as PlayDataset, a0 as PlayDatasetInput, a1 as PreviousCell, a2 as ProviderTransientError, a3 as ProviderTransientErrorCategory, a4 as ProviderUnavailableError, a5 as ProviderUnavailableReason, a6 as ToolExecutionErrorCategory, a7 as ToolExecutionErrorOrigin, a8 as ToolExecutionFailureV1, a9 as ToolExecutionNetworkKind, aa as ToolExecutionNetworkScope, ab as getProviderUnavailableReason, ac as isDeeplineExtractorTarget, ad as isProviderUnavailable, ae as isProviderWaterfallUnavailableError } from './compiler-manifest-DFBtSjB2.mjs';
3
3
  import '@sinclair/typebox';
4
4
 
5
5
  declare const FIXTURE_BEHAVIOR_VERSION: 1;
@@ -1235,6 +1235,8 @@ interface ProductNotification {
1235
1235
  }
1236
1236
  interface PlayDescription {
1237
1237
  name: string;
1238
+ /** Stable registry key. Same value `plays list` reports for this play. */
1239
+ playKey?: string;
1238
1240
  reference?: string;
1239
1241
  displayName?: string;
1240
1242
  description?: string | null;
@@ -1256,6 +1258,17 @@ interface PlayDescription {
1256
1258
  checkCommand: string;
1257
1259
  };
1258
1260
  currentPublishedVersion?: number | null;
1261
+ /**
1262
+ * Version currently serving runs by name, from the live revision. Null when
1263
+ * the play has never been published.
1264
+ */
1265
+ liveVersion?: number | null;
1266
+ /** Whether this play's cron and webhook triggers are armed. */
1267
+ triggerStatus?: {
1268
+ cron: string | null;
1269
+ webhook: string | null;
1270
+ blockedReason: string | null;
1271
+ };
1259
1272
  isDraftDirty?: boolean;
1260
1273
  latestRunId?: string | null;
1261
1274
  }
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { e as PlayRuntimeBackendId, c as PlayCompilerManifest, D as DeeplineError, f as ToolExecutionError, g as ToolExecutionErrorOptions, h as PlayAuthoringColumnMap, i as PlayAuthoringColumnResolver, j as PlayAuthoringRuntimeContext, k as PlayAuthoringConditionalStepResolver, l as PlayAuthoringCsvInput, m as PlayAuthoringCsvOptions, n as PlayAuthoringDatasetBuilder, o as PlayAuthoringDatasetColumnDefinition, p as PlayAuthoringDatasetColumnRunInput, q as ToolExecuteResult, r as PlayAuthoringReferenceLike, s as PlayReturnObject$1, t as PlayAuthoringDefineConfig, u as PlayAuthoringDefinedPlay, v as PlayAuthoringFetchOptions, w as PlayAuthoringFileInput, x as PlayAuthoringBindings, y as PlayAuthoringCallExecution, z as PlayAuthoringCallOptions, A as PlayAuthoringFetchResponse, B as PlayAuthoringInputContract, C as PlayAuthoringStepProgramStep, E as PlayAuthoringRuntimeStepOptions, F as PlaySqlListenerDeclaration, G as PlaySqlListenerEvent, H as PlaySqlListenerOperation, I as PlaySqlQuery, J as PlayAuthoringStepOptions, K as PlayAuthoringStepProgram, L as PlayAuthoringStepProgramResolver, M as PlayAuthoringStepResolver, N as PlayToolExecutionRequest, O as PlayAuthoringStepProgramOptions } from './compiler-manifest-CrAB1ffd.js';
2
- export { Q as DEEPLINE_EXTRACTOR_TARGETS, R as DEEPLINE_EXTRACTOR_TARGET_DEFINITIONS, S as DeeplineEmailStatusGetterValue, U as DeeplineExtractorTarget, V as DeeplineGetterValue, W as DeeplineGetterValueMap, X as JOB_CHANGE_STATUS_VALUES, Y as JobChangeStatus, Z as PHONE_STATUS_VALUES, _ as PhoneStatus, $ as PlayDataset, a0 as PlayDatasetInput, a1 as PreviousCell, a2 as ProviderTransientError, a3 as ProviderTransientErrorCategory, a4 as ProviderUnavailableError, a5 as ProviderUnavailableReason, a6 as ToolExecutionErrorCategory, a7 as ToolExecutionErrorOrigin, a8 as ToolExecutionFailureV1, a9 as ToolExecutionNetworkKind, aa as ToolExecutionNetworkScope, ab as getProviderUnavailableReason, ac as isDeeplineExtractorTarget, ad as isProviderUnavailable, ae as isProviderWaterfallUnavailableError } from './compiler-manifest-CrAB1ffd.js';
1
+ import { e as PlayRuntimeBackendId, c as PlayCompilerManifest, D as DeeplineError, f as ToolExecutionError, g as ToolExecutionErrorOptions, h as PlayAuthoringColumnMap, i as PlayAuthoringColumnResolver, j as PlayAuthoringRuntimeContext, k as PlayAuthoringConditionalStepResolver, l as PlayAuthoringCsvInput, m as PlayAuthoringCsvOptions, n as PlayAuthoringDatasetBuilder, o as PlayAuthoringDatasetColumnDefinition, p as PlayAuthoringDatasetColumnRunInput, q as ToolExecuteResult, r as PlayAuthoringReferenceLike, s as PlayReturnObject$1, t as PlayAuthoringDefineConfig, u as PlayAuthoringDefinedPlay, v as PlayAuthoringFetchOptions, w as PlayAuthoringFileInput, x as PlayAuthoringBindings, y as PlayAuthoringCallExecution, z as PlayAuthoringCallOptions, A as PlayAuthoringFetchResponse, B as PlayAuthoringInputContract, C as PlayAuthoringStepProgramStep, E as PlayAuthoringRuntimeStepOptions, F as PlaySqlListenerDeclaration, G as PlaySqlListenerEvent, H as PlaySqlListenerOperation, I as PlaySqlQuery, J as PlayAuthoringStepOptions, K as PlayAuthoringStepProgram, L as PlayAuthoringStepProgramResolver, M as PlayAuthoringStepResolver, N as PlayToolExecutionRequest, O as PlayAuthoringStepProgramOptions } from './compiler-manifest-DFBtSjB2.js';
2
+ export { Q as DEEPLINE_EXTRACTOR_TARGETS, R as DEEPLINE_EXTRACTOR_TARGET_DEFINITIONS, S as DeeplineEmailStatusGetterValue, U as DeeplineExtractorTarget, V as DeeplineGetterValue, W as DeeplineGetterValueMap, X as JOB_CHANGE_STATUS_VALUES, Y as JobChangeStatus, Z as PHONE_STATUS_VALUES, _ as PhoneStatus, $ as PlayDataset, a0 as PlayDatasetInput, a1 as PreviousCell, a2 as ProviderTransientError, a3 as ProviderTransientErrorCategory, a4 as ProviderUnavailableError, a5 as ProviderUnavailableReason, a6 as ToolExecutionErrorCategory, a7 as ToolExecutionErrorOrigin, a8 as ToolExecutionFailureV1, a9 as ToolExecutionNetworkKind, aa as ToolExecutionNetworkScope, ab as getProviderUnavailableReason, ac as isDeeplineExtractorTarget, ad as isProviderUnavailable, ae as isProviderWaterfallUnavailableError } from './compiler-manifest-DFBtSjB2.js';
3
3
  import '@sinclair/typebox';
4
4
 
5
5
  declare const FIXTURE_BEHAVIOR_VERSION: 1;
@@ -1235,6 +1235,8 @@ interface ProductNotification {
1235
1235
  }
1236
1236
  interface PlayDescription {
1237
1237
  name: string;
1238
+ /** Stable registry key. Same value `plays list` reports for this play. */
1239
+ playKey?: string;
1238
1240
  reference?: string;
1239
1241
  displayName?: string;
1240
1242
  description?: string | null;
@@ -1256,6 +1258,17 @@ interface PlayDescription {
1256
1258
  checkCommand: string;
1257
1259
  };
1258
1260
  currentPublishedVersion?: number | null;
1261
+ /**
1262
+ * Version currently serving runs by name, from the live revision. Null when
1263
+ * the play has never been published.
1264
+ */
1265
+ liveVersion?: number | null;
1266
+ /** Whether this play's cron and webhook triggers are armed. */
1267
+ triggerStatus?: {
1268
+ cron: string | null;
1269
+ webhook: string | null;
1270
+ blockedReason: string | null;
1271
+ };
1259
1272
  isDraftDirty?: boolean;
1260
1273
  latestRunId?: string | null;
1261
1274
  }
package/dist/index.js CHANGED
@@ -780,7 +780,7 @@ var SDK_RELEASE = {
780
780
  // 0.2.0 makes Dataset Handles uniformly async-only after 0.1.320 briefly
781
781
  // exposed storage-dependent synchronous access. This deliberate minor
782
782
  // release keeps lazy paging semantics independent of row residency.
783
- version: "0.2.67",
783
+ version: "0.2.69",
784
784
  contracts: {
785
785
  api: {
786
786
  name: "sdk-http-api",
@@ -808,6 +808,13 @@ var SDK_RELEASE = {
808
808
  supportPolicy: {
809
809
  minimumSupported: "0.1.53",
810
810
  deprecatedBelow: "0.1.219",
811
+ commandIntroducedIn: [
812
+ {
813
+ command: "notifications",
814
+ introducedIn: "0.2.40",
815
+ reason: "deepline notifications was added in SDK CLI 0.2.40. Older versions have no way to configure a Play failure alert, so a cron Play that dies reports to nobody."
816
+ }
817
+ ],
811
818
  commandMinimumSupported: [
812
819
  {
813
820
  command: "enrich",
@@ -4061,6 +4068,10 @@ var DeeplineClient = class {
4061
4068
  const cloneEditStarter = this.playCloneEditStarter(play);
4062
4069
  return {
4063
4070
  name: play.name,
4071
+ // playKey and triggerStatus were projected away here, so `plays describe`
4072
+ // was strictly less informative than `plays list` for the same play — no
4073
+ // stable key, and no way to see that a cron was armed.
4074
+ ...play.playKey ? { playKey: play.playKey } : {},
4064
4075
  ...play.reference ? { reference: play.reference } : {},
4065
4076
  ...play.displayName ? { displayName: play.displayName } : {},
4066
4077
  ...description ? { description } : {},
@@ -4078,6 +4089,11 @@ var DeeplineClient = class {
4078
4089
  examples: [runCommand],
4079
4090
  ...cloneEditStarter ? { cloneEditStarter } : {},
4080
4091
  currentPublishedVersion: play.currentPublishedVersion ?? null,
4092
+ // Read the live version off the live revision. It was previously only
4093
+ // ever written by the publish/live routes, so every list and describe
4094
+ // payload reported liveVersion: null even for an actively serving play.
4095
+ liveVersion: play.liveRevision?.version ?? null,
4096
+ ...play.triggerStatus ? { triggerStatus: play.triggerStatus } : {},
4081
4097
  isDraftDirty: play.isDraftDirty
4082
4098
  };
4083
4099
  }
package/dist/index.mjs CHANGED
@@ -703,7 +703,7 @@ var SDK_RELEASE = {
703
703
  // 0.2.0 makes Dataset Handles uniformly async-only after 0.1.320 briefly
704
704
  // exposed storage-dependent synchronous access. This deliberate minor
705
705
  // release keeps lazy paging semantics independent of row residency.
706
- version: "0.2.67",
706
+ version: "0.2.69",
707
707
  contracts: {
708
708
  api: {
709
709
  name: "sdk-http-api",
@@ -731,6 +731,13 @@ var SDK_RELEASE = {
731
731
  supportPolicy: {
732
732
  minimumSupported: "0.1.53",
733
733
  deprecatedBelow: "0.1.219",
734
+ commandIntroducedIn: [
735
+ {
736
+ command: "notifications",
737
+ introducedIn: "0.2.40",
738
+ reason: "deepline notifications was added in SDK CLI 0.2.40. Older versions have no way to configure a Play failure alert, so a cron Play that dies reports to nobody."
739
+ }
740
+ ],
734
741
  commandMinimumSupported: [
735
742
  {
736
743
  command: "enrich",
@@ -3984,6 +3991,10 @@ var DeeplineClient = class {
3984
3991
  const cloneEditStarter = this.playCloneEditStarter(play);
3985
3992
  return {
3986
3993
  name: play.name,
3994
+ // playKey and triggerStatus were projected away here, so `plays describe`
3995
+ // was strictly less informative than `plays list` for the same play — no
3996
+ // stable key, and no way to see that a cron was armed.
3997
+ ...play.playKey ? { playKey: play.playKey } : {},
3987
3998
  ...play.reference ? { reference: play.reference } : {},
3988
3999
  ...play.displayName ? { displayName: play.displayName } : {},
3989
4000
  ...description ? { description } : {},
@@ -4001,6 +4012,11 @@ var DeeplineClient = class {
4001
4012
  examples: [runCommand],
4002
4013
  ...cloneEditStarter ? { cloneEditStarter } : {},
4003
4014
  currentPublishedVersion: play.currentPublishedVersion ?? null,
4015
+ // Read the live version off the live revision. It was previously only
4016
+ // ever written by the publish/live routes, so every list and describe
4017
+ // payload reported liveVersion: null even for an actively serving play.
4018
+ liveVersion: play.liveRevision?.version ?? null,
4019
+ ...play.triggerStatus ? { triggerStatus: play.triggerStatus } : {},
4004
4020
  isDraftDirty: play.isDraftDirty
4005
4021
  };
4006
4022
  }
@@ -225,8 +225,8 @@
225
225
  "dist/cli/index.d.ts",
226
226
  "dist/cli/index.js",
227
227
  "dist/cli/index.mjs",
228
- "dist/compiler-manifest-CrAB1ffd.d.mts",
229
- "dist/compiler-manifest-CrAB1ffd.d.ts",
228
+ "dist/compiler-manifest-DFBtSjB2.d.mts",
229
+ "dist/compiler-manifest-DFBtSjB2.d.ts",
230
230
  "dist/helpers.d.mts",
231
231
  "dist/helpers.d.ts",
232
232
  "dist/helpers.js",
@@ -1,5 +1,5 @@
1
- import { T as ToolExecutionErrorSchemaVersion, P as PlayAuthoringContractEdition, a as PlayArtifactKind$1, b as PlaySandboxRuntimeDeclaration, c as PlayCompilerManifest } from '../compiler-manifest-CrAB1ffd.mjs';
2
- export { d as PLAY_ARTIFACT_KINDS } from '../compiler-manifest-CrAB1ffd.mjs';
1
+ import { T as ToolExecutionErrorSchemaVersion, P as PlayAuthoringContractEdition, a as PlayArtifactKind$1, b as PlaySandboxRuntimeDeclaration, c as PlayCompilerManifest } from '../compiler-manifest-DFBtSjB2.mjs';
2
+ export { d as PLAY_ARTIFACT_KINDS } from '../compiler-manifest-DFBtSjB2.mjs';
3
3
  import '@sinclair/typebox';
4
4
 
5
5
  type PlayPackageImport = {
@@ -1,5 +1,5 @@
1
- import { T as ToolExecutionErrorSchemaVersion, P as PlayAuthoringContractEdition, a as PlayArtifactKind$1, b as PlaySandboxRuntimeDeclaration, c as PlayCompilerManifest } from '../compiler-manifest-CrAB1ffd.js';
2
- export { d as PLAY_ARTIFACT_KINDS } from '../compiler-manifest-CrAB1ffd.js';
1
+ import { T as ToolExecutionErrorSchemaVersion, P as PlayAuthoringContractEdition, a as PlayArtifactKind$1, b as PlaySandboxRuntimeDeclaration, c as PlayCompilerManifest } from '../compiler-manifest-DFBtSjB2.js';
2
+ export { d as PLAY_ARTIFACT_KINDS } from '../compiler-manifest-DFBtSjB2.js';
3
3
  import '@sinclair/typebox';
4
4
 
5
5
  type PlayPackageImport = {
@@ -2684,6 +2684,22 @@ var PLAY_SQL_LISTENER_TOOL_PATTERN = /^[a-zA-Z][a-zA-Z0-9_-]*\.[a-zA-Z][a-zA-Z0-
2684
2684
  var PLAY_SQL_LISTENER_WHERE_OPERATOR_SET = new Set(
2685
2685
  PLAY_SQL_LISTENER_WHERE_OPERATORS
2686
2686
  );
2687
+ var PLAY_AUTHORING_DOCUMENTATION = {
2688
+ fetchBatching: {
2689
+ warning: "A static ctx.fetch key inside a loop is a warning because every iteration must still have distinct method, URL, body, or safe headers. One durable receipt must never stand in for every request.",
2690
+ guidance: "Keep the static fetch label. For a mutating batch, make the body distinct and use a replay-stable external Idempotency-Key such as `${ctx.run.id}:signals:${batchIndex}`."
2691
+ },
2692
+ runId: {
2693
+ semantics: "ctx.run.id is stable while Deepline retries or resumes one durable run. A separately submitted run receives a new id.",
2694
+ use: "Use it when deriving an external idempotency key for a sequence of batches."
2695
+ },
2696
+ staticCallKeys: {
2697
+ constraint: "Durable call keys \u2014 the ctx.fetch key, the ctx.dataset key, the ctx.step id \u2014 must be static string literals. The key names a durable receipt, so check, publish, and replay have to agree on it before the body runs. A key computed at runtime cannot be resolved at check time and is rejected.",
2698
+ consequence: "This is an architectural constraint, not a style rule. A play cannot loop over a computed key, so it cannot page a large table with a helper like page(pageNumber). Unrolling one literal key per page is not a design at any real page count.",
2699
+ workaround: "Push the aggregation server-side and call it once: a SQL function, a view, or a provider endpoint that returns the whole result. Keep unrolled literal keys only for a handful of genuinely distinct calls. To fan out over rows, use ctx.dataset with a static key \u2014 the per-row receipt identity comes from the row, not from the key."
2700
+ }
2701
+ };
2702
+ var PLAY_AUTHORING_STATIC_FETCH_KEY_HINT = `${PLAY_AUTHORING_DOCUMENTATION.staticCallKeys.workaround} Do not compute the key.`;
2687
2703
  var SecretEnvironmentNameSchema = Type.String({
2688
2704
  pattern: "^[A-Z][A-Z0-9_]{1,63}$",
2689
2705
  description: "An uppercase environment variable name beginning with a letter."
@@ -3526,7 +3542,8 @@ var PLAY_AUTHORING_FIELD_REGISTRY = {
3526
3542
  resolution: "static-required",
3527
3543
  issueCode: "play_authoring_durable_policy_invalid",
3528
3544
  description: "Stable durable identity for one external HTTP request.",
3529
- errorMessage: "ctx.fetch key must be a non-empty static string."
3545
+ errorMessage: "ctx.fetch key must be a non-empty static string.",
3546
+ unresolvedHint: PLAY_AUTHORING_STATIC_FETCH_KEY_HINT
3530
3547
  },
3531
3548
  "ctx.fetch.staleAfterSeconds": {
3532
3549
  schema: Type.Union([Type.Null(), Type.Integer({ minimum: 0 })]),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deepline",
3
- "version": "0.2.67",
3
+ "version": "0.2.69",
4
4
  "description": "GTM data CLI and TypeScript SDK for coding agents",
5
5
  "license": "MIT",
6
6
  "homepage": "https://code.deepline.com",