deepline 0.3.68 → 0.3.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.
@@ -1199,7 +1199,7 @@ var SDK_RELEASE = {
1199
1199
  // available at toolResponse.rawV2 while toolResponse.raw and all declared
1200
1200
  // getters keep their established compatibility behavior.
1201
1201
  // 0.3.1 deprecated the legacy `deepline enrich` command in favor of Plays.
1202
- version: "0.3.68",
1202
+ version: "0.3.69",
1203
1203
  updateSummary: "Automatic CLI updates are now enabled by default. To opt out, run `deepline settings autoupdate off`; use `deepline settings autoupdate on` to re-enable updates or `deepline settings autoupdate pin <version>` to hold an exact release. This release also adds raw-v2 tool responses at toolResponse.rawV2 while preserving existing toolResponse.raw and declared getters.",
1204
1204
  packageCapabilities: {
1205
1205
  updatePreferences: 1
@@ -18216,12 +18216,20 @@ async function publishImportedPlayDependencies(client2, graph) {
18216
18216
  };
18217
18217
  await publishNode(graph.root.filePath, true);
18218
18218
  }
18219
+ function timestampDate(value) {
18220
+ if (value === null || value === void 0 || value === "") return null;
18221
+ const normalized = typeof value === "string" && /^\d+$/.test(value.trim()) ? Number(value) : value;
18222
+ const date = new Date(normalized);
18223
+ return Number.isNaN(date.getTime()) ? null : date;
18224
+ }
18219
18225
  function formatTimestamp(value) {
18220
- if (!value) return "\u2014";
18221
- const date = typeof value === "number" ? new Date(value) : new Date(value);
18222
- if (Number.isNaN(date.getTime())) return "\u2014";
18226
+ const date = timestampDate(value);
18227
+ if (!date) return "\u2014";
18223
18228
  return date.toISOString();
18224
18229
  }
18230
+ function isoTimestamp(value) {
18231
+ return timestampDate(value)?.toISOString() ?? null;
18232
+ }
18225
18233
  function formatRunLine(run) {
18226
18234
  const credits = typeof run.billingTotalCredits === "number" && Number.isFinite(run.billingTotalCredits) ? `${formatCreditAmount(run.billingTotalCredits)} credits` : "\u2014";
18227
18235
  return `${run.workflowId} ${run.status} ${formatTimestamp(run.startTime)} ${credits}`;
@@ -22647,13 +22655,22 @@ async function handleRunsList(args) {
22647
22655
  ...offset !== void 0 ? { offset } : {}
22648
22656
  })).map((run) => ({
22649
22657
  runId: run.workflowId,
22658
+ // `workflowId` is the legacy SDK name for the same public Deepline run
22659
+ // identity. Keep it during the compatibility window, but never label the
22660
+ // duplicate as a Temporal/runtime id.
22650
22661
  workflowId: run.workflowId,
22651
- temporalRunId: run.runId,
22662
+ // Retain the runtime identifier for existing JSON consumers. It is not a
22663
+ // stable Deepline run id; `runId` above is the canonical public id.
22664
+ temporalRunId: run.runId ?? null,
22652
22665
  parentRunId: run.parentRunId ?? null,
22653
22666
  rootRunId: run.rootRunId ?? null,
22654
22667
  status: String(run.status ?? "").toLowerCase(),
22668
+ createdAt: run.createdAt ?? null,
22669
+ createdAtIso: isoTimestamp(run.createdAt),
22655
22670
  startedAt: run.startTime ?? run.startedAt ?? null,
22671
+ startedAtIso: isoTimestamp(run.startTime ?? run.startedAt ?? null),
22656
22672
  finishedAt: run.closeTime ?? run.finishedAt ?? null,
22673
+ finishedAtIso: isoTimestamp(run.closeTime ?? run.finishedAt ?? null),
22657
22674
  executionTime: run.executionTime,
22658
22675
  billingTotalCredits: run.billingTotalCredits,
22659
22676
  billingMaxCreditsPerRun: run.billingMaxCreditsPerRun,
@@ -22661,9 +22678,19 @@ async function handleRunsList(args) {
22661
22678
  }));
22662
22679
  const lines = runs.length === 0 ? [
22663
22680
  playName ? `No runs found for ${playName}.` : `No runs found for status ${statusFilter}.`
22664
- ] : runs.map(
22665
- (run) => `${run.runId} ${run.status} ${formatTimestamp(run.startedAt)} ${typeof run.billingTotalCredits === "number" && Number.isFinite(run.billingTotalCredits) ? `${formatCreditAmount(run.billingTotalCredits)} credits` : "\u2014"}${run.parentRunId ? ` parent=${run.parentRunId}` : ""}`
22666
- );
22681
+ ] : runs.map((run) => {
22682
+ const lines2 = [
22683
+ `${run.runId} ${run.status}`,
22684
+ ` created: ${formatTimestamp(run.createdAt)}`,
22685
+ ` started: ${formatTimestamp(run.startedAt)}`,
22686
+ ` finished: ${formatTimestamp(run.finishedAt)}`,
22687
+ ` credits: ${typeof run.billingTotalCredits === "number" && Number.isFinite(run.billingTotalCredits) ? formatCreditAmount(run.billingTotalCredits) : "\u2014"}`,
22688
+ ` inspect: deepline runs get ${run.runId} --json`
22689
+ ];
22690
+ if (run.parentRunId) lines2.push(` parent: ${run.parentRunId}`);
22691
+ if (run.rootRunId) lines2.push(` root: ${run.rootRunId}`);
22692
+ return lines2.join("\n");
22693
+ });
22667
22694
  printCommandEnvelope(
22668
22695
  {
22669
22696
  runs,
@@ -30469,10 +30496,12 @@ function registerEnrichCommand(program) {
30469
30496
  }
30470
30497
 
30471
30498
  // src/cli/commands/feedback.ts
30499
+ import { readFileSync as readFileSync9 } from "fs";
30472
30500
  async function handleFeedback(text, options) {
30501
+ const message = resolveFeedbackText(text, options.file);
30473
30502
  const { http } = getAuthedHttpClient();
30474
30503
  const response = await http.post("/api/v2/cli/feedback", {
30475
- text,
30504
+ text: message,
30476
30505
  requested: options.requested === true,
30477
30506
  environment: collectLocalEnvInfo(),
30478
30507
  ...options.command ? { command: options.command } : {},
@@ -30490,6 +30519,35 @@ async function handleFeedback(text, options) {
30490
30519
  { json: options.json }
30491
30520
  );
30492
30521
  }
30522
+ function resolveFeedbackText(text, file, readFile6 = (path) => readFileSync9(path, "utf8")) {
30523
+ if (text !== void 0 && file !== void 0) {
30524
+ throw new Error(
30525
+ "Pass feedback text positionally or with --file, not both."
30526
+ );
30527
+ }
30528
+ let value;
30529
+ if (file !== void 0) {
30530
+ try {
30531
+ value = readFile6(file === "-" ? 0 : file);
30532
+ } catch (error) {
30533
+ throw new Error(
30534
+ `Could not read feedback ${file === "-" ? "from stdin" : `file ${file}`}: ${error instanceof Error ? error.message : String(error)}`
30535
+ );
30536
+ }
30537
+ } else if (text !== void 0) {
30538
+ value = text;
30539
+ } else if (!process.stdin.isTTY) {
30540
+ value = readFile6(0);
30541
+ } else {
30542
+ throw new Error(
30543
+ "Feedback text is required. Pass it positionally, use --file <path>, or pipe stdin."
30544
+ );
30545
+ }
30546
+ if (!value.trim()) {
30547
+ throw new Error("Feedback text must not be empty.");
30548
+ }
30549
+ return value;
30550
+ }
30493
30551
  function registerFeedbackCommands(program) {
30494
30552
  const feedback = program.command("feedback").description("Submit CLI feedback to Deepline.").addHelpText(
30495
30553
  "after",
@@ -30509,10 +30567,12 @@ Examples:
30509
30567
  `
30510
30568
  Examples:
30511
30569
  deepline feedback send "tools search returned stale results" --json
30570
+ deepline feedback send --file incident.md --requested --json
30571
+ cat incident.md | deepline feedback send --requested --json
30512
30572
  deepline feedback send "tools search returned stale results" --requested --json
30513
30573
  deepline feedback send "plays run failed after upload" --command "deepline plays run my.play.ts --watch"
30514
30574
  `
30515
- ).argument("<text>", "Feedback text").option("--command <command>", "Command that reproduced the issue").option("--payload <payload>", "JSON or plain-text payload for the repro").option(
30575
+ ).argument("[text]", "Feedback text").option("--file <path>", "Read feedback text from a file, or - for stdin").option("--command <command>", "Command that reproduced the issue").option("--payload <payload>", "JSON or plain-text payload for the repro").option(
30516
30576
  "--requested",
30517
30577
  "Mark the report as explicitly requested by the user"
30518
30578
  ).option("--json", "Emit JSON output").action(handleFeedback);
@@ -30523,7 +30583,7 @@ import {
30523
30583
  existsSync as existsSync10,
30524
30584
  mkdirSync as mkdirSync8,
30525
30585
  readdirSync as readdirSync3,
30526
- readFileSync as readFileSync9,
30586
+ readFileSync as readFileSync10,
30527
30587
  statSync as statSync4,
30528
30588
  writeFileSync as writeFileSync11
30529
30589
  } from "fs";
@@ -30661,7 +30721,7 @@ function sessionIdFromCodexFilePath(filePath) {
30661
30721
  }
30662
30722
  function readCodexSessionId(filePath) {
30663
30723
  try {
30664
- for (const line of normalizedJsonLines(readFileSync9(filePath)).slice(
30724
+ for (const line of normalizedJsonLines(readFileSync10(filePath)).slice(
30665
30725
  0,
30666
30726
  20
30667
30727
  )) {
@@ -30980,7 +31040,7 @@ async function handleSessionsSend(options) {
30980
31040
  throw new Error(`File not found: ${options.file}`);
30981
31041
  }
30982
31042
  const response2 = await uploadPayload("/api/v2/cli/send-session", {
30983
- file: readFileSync9(filePath).toString("base64"),
31043
+ file: readFileSync10(filePath).toString("base64"),
30984
31044
  filename: basename5(filePath)
30985
31045
  });
30986
31046
  printCommandEnvelope(
@@ -31010,7 +31070,7 @@ async function handleSessionsSend(options) {
31010
31070
  agent: options.agent
31011
31071
  });
31012
31072
  const built = targets.map((target) => {
31013
- const upload = buildSessionUploadContent(readFileSync9(target.filePath));
31073
+ const upload = buildSessionUploadContent(readFileSync10(target.filePath));
31014
31074
  return { ...target, ...upload };
31015
31075
  });
31016
31076
  if (built.some((session) => session.needsChunking)) {
@@ -31094,8 +31154,8 @@ function loadViewerAssets() {
31094
31154
  const jsPath = join12(root, "viewer.js");
31095
31155
  if (!existsSync10(cssPath) || !existsSync10(jsPath)) continue;
31096
31156
  return {
31097
- css: readFileSync9(cssPath, "utf8"),
31098
- js: readFileSync9(jsPath, "utf8")
31157
+ css: readFileSync10(cssPath, "utf8"),
31158
+ js: readFileSync10(jsPath, "utf8")
31099
31159
  };
31100
31160
  } catch {
31101
31161
  continue;
@@ -31133,7 +31193,7 @@ async function handleSessionsRender(options) {
31133
31193
  const sessions = targets.map((target) => ({
31134
31194
  label: target.label,
31135
31195
  events: parsePreparedEvents(
31136
- prepareSessionBuffer(readFileSync9(target.filePath))
31196
+ prepareSessionBuffer(readFileSync10(target.filePath))
31137
31197
  )
31138
31198
  }));
31139
31199
  const { css, js } = loadViewerAssets();
@@ -31367,7 +31427,7 @@ Examples:
31367
31427
 
31368
31428
  // src/cli/commands/monitors.ts
31369
31429
  import { randomUUID as randomUUID5 } from "crypto";
31370
- import { readFileSync as readFileSync10, writeFileSync as writeFileSync12 } from "fs";
31430
+ import { readFileSync as readFileSync11, writeFileSync as writeFileSync12 } from "fs";
31371
31431
  import { resolve as resolve14 } from "path";
31372
31432
  import { createInterface } from "readline/promises";
31373
31433
 
@@ -31807,8 +31867,8 @@ function parseJsonObjectArg(raw, argLabel) {
31807
31867
  return parsed;
31808
31868
  }
31809
31869
  function resolveMonitorJsonBody(input2) {
31810
- const readFile6 = input2.readFile ?? ((path) => readFileSync10(path, "utf-8"));
31811
- const readStdin = input2.readStdin ?? (() => readFileSync10(0, "utf-8"));
31870
+ const readFile6 = input2.readFile ?? ((path) => readFileSync11(path, "utf-8"));
31871
+ const readStdin = input2.readStdin ?? (() => readFileSync11(0, "utf-8"));
31812
31872
  if (input2.positional !== void 0 && input2.file !== void 0) {
31813
31873
  throw new MonitorsUsageError(
31814
31874
  `Pass exactly one source for ${input2.argLabel}: the positional JSON or --file, not both.`
@@ -32205,6 +32265,7 @@ function renderDeployedListText(payload, requestedStatus) {
32205
32265
  if (!entry || !key) continue;
32206
32266
  const status = asString(entry.status);
32207
32267
  const tool = asString(entry.tool);
32268
+ const monitorType = asString(entry.type);
32208
32269
  const name = asString(entry.name);
32209
32270
  const outputTable = asString(entry.output_table);
32210
32271
  const webhookState = asString(entry.webhook_state);
@@ -32215,10 +32276,11 @@ function renderDeployedListText(payload, requestedStatus) {
32215
32276
  lines.push(
32216
32277
  ` ${key}${status ? ` ${status}` : ""}${tool ? ` ${tool}` : ""}${name ? ` (${name})` : ""}`
32217
32278
  );
32218
- if (outputTable || webhookState || executionType || boundPlays !== void 0) {
32279
+ if (outputTable || monitorType || webhookState || executionType || boundPlays !== void 0) {
32219
32280
  lines.push(
32220
32281
  ` ${[
32221
32282
  outputTable ? `table: ${outputTable}` : null,
32283
+ monitorType ? `type: ${monitorType}` : null,
32222
32284
  webhookState ? `webhook: ${webhookState}` : null,
32223
32285
  executionType ? `execution: ${executionType}` : null,
32224
32286
  boundPlays !== void 0 ? `bound Plays: ${boundPlays}` : null
@@ -33043,6 +33105,7 @@ function renderMonitorGet(payload) {
33043
33105
  const tool = asString(payload.tool);
33044
33106
  if (!key || !tool) return void 0;
33045
33107
  const status = asString(payload.status);
33108
+ const monitorType = asString(payload.type);
33046
33109
  const hasLastReceivedEvent = "last_received_event" in payload;
33047
33110
  const lastReceivedEvent = asString(payload.last_received_event);
33048
33111
  const definition = asRecord2(payload.definition);
@@ -33060,8 +33123,9 @@ function renderMonitorGet(payload) {
33060
33123
  const lines = [
33061
33124
  `Monitor: ${key}`,
33062
33125
  `Tool: ${tool}`,
33126
+ ...monitorType ? [`Type: ${monitorType}`] : [],
33063
33127
  ...status ? [`Status: ${status}`] : [],
33064
- ...hasLastReceivedEvent ? [`Last received: ${lastReceivedEvent ?? "never"}`] : [],
33128
+ ...hasLastReceivedEvent ? [`Latest inbound event: ${lastReceivedEvent ?? "never"}`] : [],
33065
33129
  ...pricingLine ? [`Pricing: ${pricingLine}`] : [],
33066
33130
  ...nextRenewalAt ? [`Next renewal: ${nextRenewalAt}`] : []
33067
33131
  ];
@@ -33127,17 +33191,15 @@ function renderMonitorGet(payload) {
33127
33191
  const name = asString(play.name) ?? "unnamed Play";
33128
33192
  const listener = asString(play.listener_key);
33129
33193
  const health = asRecord2(play.consumer_health);
33130
- const status2 = asString(health?.last_run_status) ?? "no delivery yet";
33194
+ const runStatus = asString(health?.last_run_status);
33131
33195
  const lastDelivery = asFiniteNumber(health?.last_delivery_at);
33196
+ const runId = asString(health?.last_run_id);
33132
33197
  const error = asString(health?.last_error);
33198
+ lines.push(` ${name}${listener ? ` (listener: ${listener})` : ""}:`);
33133
33199
  lines.push(
33134
- ` ${name}${listener ? ` (listener: ${listener})` : ""}: ${status2}`
33200
+ ` Latest delivered event: ${lastDelivery !== void 0 ? new Date(lastDelivery).toISOString() : "never"}`,
33201
+ ` Latest consumer run: ${runId ?? "never"}${runStatus ? ` (${runStatus})` : ""}`
33135
33202
  );
33136
- if (lastDelivery !== void 0) {
33137
- lines.push(
33138
- ` last delivery: ${new Date(lastDelivery).toISOString()}`
33139
- );
33140
- }
33141
33203
  if (error) lines.push(` error: ${error}`);
33142
33204
  }
33143
33205
  }
@@ -34795,7 +34857,7 @@ import {
34795
34857
  existsSync as existsSync14,
34796
34858
  lstatSync as lstatSync2,
34797
34859
  mkdirSync as mkdirSync11,
34798
- readFileSync as readFileSync14,
34860
+ readFileSync as readFileSync15,
34799
34861
  realpathSync as realpathSync4,
34800
34862
  writeFileSync as writeFileSync15
34801
34863
  } from "fs";
@@ -34806,7 +34868,7 @@ import { dirname as dirname16, join as join16, resolve as resolve16 } from "path
34806
34868
  import {
34807
34869
  existsSync as existsSync11,
34808
34870
  lstatSync,
34809
- readFileSync as readFileSync11,
34871
+ readFileSync as readFileSync12,
34810
34872
  realpathSync as realpathSync3,
34811
34873
  rmSync as rmSync4
34812
34874
  } from "fs";
@@ -34822,7 +34884,7 @@ var nodeFileSystem = {
34822
34884
  },
34823
34885
  read(path) {
34824
34886
  try {
34825
- return readFileSync11(path, "utf8");
34887
+ return readFileSync12(path, "utf8");
34826
34888
  } catch {
34827
34889
  return "";
34828
34890
  }
@@ -34932,7 +34994,7 @@ function isOwnedInstallerCommandPath(input2) {
34932
34994
 
34933
34995
  // src/cli/commands/skills.ts
34934
34996
  import { spawn as spawn3 } from "child_process";
34935
- import { existsSync as existsSync13, mkdirSync as mkdirSync10, readFileSync as readFileSync13, writeFileSync as writeFileSync14 } from "fs";
34997
+ import { existsSync as existsSync13, mkdirSync as mkdirSync10, readFileSync as readFileSync14, writeFileSync as writeFileSync14 } from "fs";
34936
34998
  import { homedir as homedir8 } from "os";
34937
34999
  import { dirname as dirname15, join as join15 } from "path";
34938
35000
 
@@ -35047,7 +35109,7 @@ import { spawn as spawn2, spawnSync } from "child_process";
35047
35109
  import {
35048
35110
  existsSync as existsSync12,
35049
35111
  mkdirSync as mkdirSync9,
35050
- readFileSync as readFileSync12,
35112
+ readFileSync as readFileSync13,
35051
35113
  unlinkSync,
35052
35114
  writeFileSync as writeFileSync13
35053
35115
  } from "fs";
@@ -35411,7 +35473,7 @@ function hasMarkedSkillsSyncVersion(path, version) {
35411
35473
  }
35412
35474
  function readMarkedSkillsSyncVersion(path) {
35413
35475
  try {
35414
- return existsSync12(path) ? readFileSync12(path, "utf-8").trim() : "";
35476
+ return existsSync12(path) ? readFileSync13(path, "utf-8").trim() : "";
35415
35477
  } catch {
35416
35478
  return "";
35417
35479
  }
@@ -35899,7 +35961,7 @@ function isSkillsPlanCurrent(plan, state) {
35899
35961
  }
35900
35962
  function readSkillsInstallState(path) {
35901
35963
  try {
35902
- const parsed = JSON.parse(readFileSync13(path, "utf8"));
35964
+ const parsed = JSON.parse(readFileSync14(path, "utf8"));
35903
35965
  return parsed !== null && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : null;
35904
35966
  } catch {
35905
35967
  return null;
@@ -36191,7 +36253,7 @@ function phasesFromLegacyStatus(status) {
36191
36253
  function readSetupState(input2) {
36192
36254
  try {
36193
36255
  const parsed = JSON.parse(
36194
- readFileSync14(
36256
+ readFileSync15(
36195
36257
  setupStatePath(input2.baseUrl, input2.scope, input2.root),
36196
36258
  "utf8"
36197
36259
  )
@@ -36296,7 +36358,7 @@ function asRecord3(value) {
36296
36358
  }
36297
36359
  function safeRead(path) {
36298
36360
  try {
36299
- return readFileSync14(path, "utf8");
36361
+ return readFileSync15(path, "utf8");
36300
36362
  } catch {
36301
36363
  return "";
36302
36364
  }
@@ -37060,7 +37122,7 @@ Examples:
37060
37122
  import {
37061
37123
  existsSync as existsSync15,
37062
37124
  mkdirSync as mkdirSync12,
37063
- readFileSync as readFileSync15,
37125
+ readFileSync as readFileSync16,
37064
37126
  renameSync,
37065
37127
  rmSync as rmSync5,
37066
37128
  writeFileSync as writeFileSync16
@@ -37107,7 +37169,7 @@ function readCliUpdatePreferences(homeDir2 = homedir10()) {
37107
37169
  const path = cliUpdatePreferencesPath(homeDir2);
37108
37170
  if (!existsSync15(path)) return defaultPreferences();
37109
37171
  try {
37110
- const parsed = JSON.parse(readFileSync15(path, "utf8"));
37172
+ const parsed = JSON.parse(readFileSync16(path, "utf8"));
37111
37173
  return {
37112
37174
  schemaVersion: UPDATE_PREFERENCES_SCHEMA_VERSION,
37113
37175
  autoUpdateEnabled: typeof parsed.autoUpdateEnabled === "boolean" ? parsed.autoUpdateEnabled : true,
@@ -37186,7 +37248,7 @@ import {
37186
37248
  existsSync as existsSync17,
37187
37249
  mkdirSync as mkdirSync13,
37188
37250
  realpathSync as realpathSync5,
37189
- readFileSync as readFileSync17,
37251
+ readFileSync as readFileSync18,
37190
37252
  renameSync as renameSync2,
37191
37253
  rmSync as rmSync6,
37192
37254
  unlinkSync as unlinkSync2,
@@ -37204,7 +37266,7 @@ import {
37204
37266
 
37205
37267
  // src/cli/install-integrity.ts
37206
37268
  import { createRequire } from "module";
37207
- import { existsSync as existsSync16, readFileSync as readFileSync16, statSync as statSync5 } from "fs";
37269
+ import { existsSync as existsSync16, readFileSync as readFileSync17, statSync as statSync5 } from "fs";
37208
37270
  import { isAbsolute as isAbsolute6, join as join18, relative as relative6, resolve as resolve17 } from "path";
37209
37271
  var SDK_SIDECAR_CRITICAL_PACKAGE_FILES = [
37210
37272
  "dist/cli/index.mjs",
@@ -37238,7 +37300,7 @@ function resolveContainedPath(root, value) {
37238
37300
  return target;
37239
37301
  }
37240
37302
  function parseJson(path) {
37241
- return JSON.parse(readFileSync16(path, "utf8"));
37303
+ return JSON.parse(readFileSync17(path, "utf8"));
37242
37304
  }
37243
37305
  function isFile(path) {
37244
37306
  try {
@@ -37448,7 +37510,7 @@ function publicNpmFallbackRegistryUrl(hostUrl) {
37448
37510
  }
37449
37511
  function readOptionalText(path) {
37450
37512
  try {
37451
- return readFileSync17(path, "utf8").trim();
37513
+ return readFileSync18(path, "utf8").trim();
37452
37514
  } catch {
37453
37515
  return "";
37454
37516
  }
@@ -37651,7 +37713,7 @@ function readAutoUpdateFailure(plan) {
37651
37713
  if (!path) return null;
37652
37714
  try {
37653
37715
  const parsed = JSON.parse(
37654
- readFileSync17(path, "utf8")
37716
+ readFileSync18(path, "utf8")
37655
37717
  );
37656
37718
  if ((parsed.kind === "npm-global" || parsed.kind === "python-sidecar") && typeof parsed.packageSpec === "string" && typeof parsed.failedAt === "string" && typeof parsed.exitCode === "number" && typeof parsed.manualCommand === "string") {
37657
37719
  return parsed;
@@ -37737,7 +37799,7 @@ function installedPackageVersion(versionDir) {
37737
37799
  "package.json"
37738
37800
  );
37739
37801
  try {
37740
- const parsed = JSON.parse(readFileSync17(packageJsonPath, "utf8"));
37802
+ const parsed = JSON.parse(readFileSync18(packageJsonPath, "utf8"));
37741
37803
  return typeof parsed.version === "string" ? safeVersionSegment(parsed.version) : "";
37742
37804
  } catch {
37743
37805
  return "";
@@ -38997,7 +39059,7 @@ import {
38997
39059
  chmodSync,
38998
39060
  existsSync as existsSync18,
38999
39061
  mkdtempSync,
39000
- readFileSync as readFileSync18,
39062
+ readFileSync as readFileSync19,
39001
39063
  writeFileSync as writeFileSync19
39002
39064
  } from "fs";
39003
39065
  import { tmpdir as tmpdir5 } from "os";
@@ -41126,7 +41188,7 @@ function readJsonArgument(raw, flagName) {
41126
41188
  throw new Error(`Invalid ${flagName} value: empty @file path.`);
41127
41189
  }
41128
41190
  try {
41129
- return readFileSync18(resolveAtFilePath(filePath), "utf8").replace(
41191
+ return readFileSync19(resolveAtFilePath(filePath), "utf8").replace(
41130
41192
  /^\uFEFF/,
41131
41193
  ""
41132
41194
  );
package/dist/index.d.mts CHANGED
@@ -1026,6 +1026,8 @@ interface PlayRunListItem {
1026
1026
  startTime?: string | null;
1027
1027
  /** Unix epoch milliseconds when the run started, returned by normalized V2 run summaries. */
1028
1028
  startedAt?: number | string | null;
1029
+ /** Unix epoch milliseconds when the run was created. */
1030
+ createdAt?: number | string | null;
1029
1031
  /** ISO 8601 timestamp when the run finished. */
1030
1032
  closeTime?: string | null;
1031
1033
  /** Unix epoch milliseconds when the run finished, returned by normalized V2 run summaries. */
@@ -2437,6 +2439,8 @@ type MonitorListEntry = {
2437
2439
  monitor_key?: string;
2438
2440
  status?: string;
2439
2441
  tool?: string;
2442
+ /** Generic provider-authored event category for this deployed monitor. */
2443
+ type?: string;
2440
2444
  name?: string;
2441
2445
  configured?: boolean;
2442
2446
  active?: boolean;
package/dist/index.d.ts CHANGED
@@ -1026,6 +1026,8 @@ interface PlayRunListItem {
1026
1026
  startTime?: string | null;
1027
1027
  /** Unix epoch milliseconds when the run started, returned by normalized V2 run summaries. */
1028
1028
  startedAt?: number | string | null;
1029
+ /** Unix epoch milliseconds when the run was created. */
1030
+ createdAt?: number | string | null;
1029
1031
  /** ISO 8601 timestamp when the run finished. */
1030
1032
  closeTime?: string | null;
1031
1033
  /** Unix epoch milliseconds when the run finished, returned by normalized V2 run summaries. */
@@ -2437,6 +2439,8 @@ type MonitorListEntry = {
2437
2439
  monitor_key?: string;
2438
2440
  status?: string;
2439
2441
  tool?: string;
2442
+ /** Generic provider-authored event category for this deployed monitor. */
2443
+ type?: string;
2440
2444
  name?: string;
2441
2445
  configured?: boolean;
2442
2446
  active?: boolean;
package/dist/index.js CHANGED
@@ -832,7 +832,7 @@ var SDK_RELEASE = {
832
832
  // available at toolResponse.rawV2 while toolResponse.raw and all declared
833
833
  // getters keep their established compatibility behavior.
834
834
  // 0.3.1 deprecated the legacy `deepline enrich` command in favor of Plays.
835
- version: "0.3.68",
835
+ version: "0.3.69",
836
836
  updateSummary: "Automatic CLI updates are now enabled by default. To opt out, run `deepline settings autoupdate off`; use `deepline settings autoupdate on` to re-enable updates or `deepline settings autoupdate pin <version>` to hold an exact release. This release also adds raw-v2 tool responses at toolResponse.rawV2 while preserving existing toolResponse.raw and declared getters.",
837
837
  packageCapabilities: {
838
838
  updatePreferences: 1
package/dist/index.mjs CHANGED
@@ -744,7 +744,7 @@ var SDK_RELEASE = {
744
744
  // available at toolResponse.rawV2 while toolResponse.raw and all declared
745
745
  // getters keep their established compatibility behavior.
746
746
  // 0.3.1 deprecated the legacy `deepline enrich` command in favor of Plays.
747
- version: "0.3.68",
747
+ version: "0.3.69",
748
748
  updateSummary: "Automatic CLI updates are now enabled by default. To opt out, run `deepline settings autoupdate off`; use `deepline settings autoupdate on` to re-enable updates or `deepline settings autoupdate pin <version>` to hold an exact release. This release also adds raw-v2 tool responses at toolResponse.rawV2 while preserving existing toolResponse.raw and declared getters.",
749
749
  packageCapabilities: {
750
750
  updatePreferences: 1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deepline",
3
- "version": "0.3.68",
3
+ "version": "0.3.69",
4
4
  "description": "GTM data CLI and TypeScript SDK for coding agents",
5
5
  "license": "MIT",
6
6
  "homepage": "https://code.deepline.com",