@sechroom/cli 2026.6.236-rc.dd8d67e0 → 2026.6.238-rc.10da7380

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.
Files changed (2) hide show
  1. package/dist/index.js +99 -0
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -5218,6 +5218,104 @@ Examples:
5218
5218
  });
5219
5219
  }
5220
5220
 
5221
+ // src/commands/telemetry.ts
5222
+ function registerTelemetry(program2) {
5223
+ const telemetry = program2.command("telemetry").description(
5224
+ "Emit WLP run telemetry (an executor leg's progress events) into a decomposition run"
5225
+ );
5226
+ telemetry.command("emit").description(
5227
+ "POST one progress event to /decompositions/{id}/run/telemetry (the 5a ingest)"
5228
+ ).requiredOption(
5229
+ "--decomposition <id>",
5230
+ "Decomposition id whose run this event belongs to"
5231
+ ).requiredOption("--task <id>", "Task id this event belongs to").requiredOption(
5232
+ "--kind <kind>",
5233
+ "Event kind: raw | parsed | approval | terminal"
5234
+ ).option(
5235
+ "--tokens-in <n>",
5236
+ "Cumulative input tokens (spend meter)",
5237
+ parseIntOpt
5238
+ ).option(
5239
+ "--tokens-out <n>",
5240
+ "Cumulative output tokens (spend meter)",
5241
+ parseIntOpt
5242
+ ).option(
5243
+ "--context-used <n>",
5244
+ "Context tokens currently used (occupancy meter)",
5245
+ parseIntOpt
5246
+ ).option(
5247
+ "--context-window <n>",
5248
+ "Context window size (occupancy meter)",
5249
+ parseIntOpt
5250
+ ).option("--text <s>", "Raw/parsed payload text").option("--approval <state>", "Approval gate state (approval events)").option(
5251
+ "--verdict <v>",
5252
+ "Typed verdict (terminal events): pass | soft-fail | plan-invalid | blocked"
5253
+ ).action(async (opts, cmd) => {
5254
+ const json = Boolean(cmd.optsWithGlobals().json);
5255
+ const cfg = resolveConfig(cmd.optsWithGlobals());
5256
+ const kind = normalizeKind(opts.kind);
5257
+ const event = {
5258
+ taskId: opts.task,
5259
+ kind,
5260
+ tokensIn: opts.tokensIn ?? null,
5261
+ tokensOut: opts.tokensOut ?? null,
5262
+ contextUsed: opts.contextUsed ?? null,
5263
+ contextWindow: opts.contextWindow ?? null,
5264
+ text: opts.text ?? null,
5265
+ approvalState: opts.approval ?? null,
5266
+ verdict: opts.verdict ?? null
5267
+ };
5268
+ const token = await requireToken(cfg);
5269
+ const resp = await fetch(
5270
+ `${cfg.baseUrl}/decompositions/${encodeURIComponent(opts.decomposition)}/run/telemetry`,
5271
+ {
5272
+ method: "POST",
5273
+ headers: {
5274
+ authorization: `Bearer ${token}`,
5275
+ tenant: cfg.tenant,
5276
+ "content-type": "application/json",
5277
+ "x-sechroom-surface": "cli"
5278
+ },
5279
+ body: JSON.stringify({ events: [event] })
5280
+ }
5281
+ );
5282
+ if (!resp.ok)
5283
+ fail(
5284
+ `Telemetry emit failed (HTTP ${resp.status}): ${await resp.text()}`
5285
+ );
5286
+ const body = await resp.json();
5287
+ if (json) {
5288
+ emit(body, true);
5289
+ } else {
5290
+ process.stderr.write(
5291
+ style.green("telemetry emitted") + style.dim(
5292
+ ` \u2014 ${kind} for task ${opts.task}; run now carries ${body.eventCount} event${body.eventCount === 1 ? "" : "s"}
5293
+ `
5294
+ )
5295
+ );
5296
+ }
5297
+ });
5298
+ }
5299
+ var KINDS = {
5300
+ raw: "Raw",
5301
+ parsed: "Parsed",
5302
+ approval: "Approval",
5303
+ terminal: "Terminal"
5304
+ };
5305
+ function normalizeKind(k) {
5306
+ const v = KINDS[k.toLowerCase()];
5307
+ if (!v)
5308
+ fail(
5309
+ `Unknown --kind '${k}'. Expected one of: raw, parsed, approval, terminal.`
5310
+ );
5311
+ return v;
5312
+ }
5313
+ function parseIntOpt(v) {
5314
+ const n = Number.parseInt(v, 10);
5315
+ if (Number.isNaN(n)) fail(`Expected an integer, got '${v}'.`);
5316
+ return n;
5317
+ }
5318
+
5221
5319
  // src/commands/worklog.ts
5222
5320
  function registerWorklog(program2) {
5223
5321
  const worklog = program2.command("worklog").description("Append to the daily work log");
@@ -5592,6 +5690,7 @@ registerSkills(program);
5592
5690
  registerAgents(program);
5593
5691
  registerLane(program);
5594
5692
  registerChannel(program);
5693
+ registerTelemetry(program);
5595
5694
  registerReset(program);
5596
5695
  program.parseAsync().catch((err2) => {
5597
5696
  process.stderr.write(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sechroom/cli",
3
- "version": "2026.6.236-rc.dd8d67e0",
3
+ "version": "2026.6.238-rc.10da7380",
4
4
  "description": "Sechroom CLI — a thin, generated client over the Sechroom HTTP API. An agent/human surface alongside MCP.",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",
@@ -24,7 +24,7 @@
24
24
  "registry": "https://registry.npmjs.org/"
25
25
  },
26
26
  "dependencies": {
27
- "@microsoft/signalr": "^8.0.7",
27
+ "@microsoft/signalr": "^10.0.0",
28
28
  "commander": "^12.1.0",
29
29
  "open": "^10.1.0",
30
30
  "openapi-fetch": "^0.13.0",