@moda-ai/cli 1.55.46 → 1.55.48

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.
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  buildDoctorReport
3
- } from "./cli-dxbd1xxs.js";
3
+ } from "./cli-629tc1d0.js";
4
4
  import"./cli-h1z9yyqk.js";
5
- import"./cli-fqc02t6h.js";
5
+ import"./cli-0zws61ba.js";
6
6
  import"./cli-mm48br00.js";
7
7
  import {
8
8
  readHarnessSyncState
@@ -26,7 +26,7 @@ import {
26
26
  hashStableJson,
27
27
  readHarnessReport,
28
28
  validateHarnessReport
29
- } from "./cli-cesds766.js";
29
+ } from "./cli-jj77e5yp.js";
30
30
  import {
31
31
  CliInputError
32
32
  } from "./cli-k4tqwah4.js";
@@ -95,7 +95,7 @@ async function buildAgentContext(context) {
95
95
  const graph = readHarnessGraphIfPresent(context.cwd);
96
96
  const reportState = readHarnessReportState(context.cwd);
97
97
  const syncState = readHarnessSyncState(context.cwd);
98
- const harness = graph ? await import("./harness-cy0gpyhj.js") : undefined;
98
+ const harness = graph ? await import("./harness-v7kgnpr6.js") : undefined;
99
99
  const topFindings = doctor.checks.filter((check) => check.status === "fail" || check.status === "warning").slice(0, 12).map(checkToFinding);
100
100
  const evidenceRefs = [
101
101
  ...doctor.checks.map(checkToEvidenceRef),
@@ -5768,7 +5768,7 @@ async function runPromptSyncExclusive(flags, profileOptions, options) {
5768
5768
  const analyzedDefinitions = new Map;
5769
5769
  if (flags["no-analyze"] !== "true") {
5770
5770
  options.onProgress?.("Analyzing prompt sources before sync.");
5771
- const { analyzeHarnessPrompts } = await import("./harness-cy0gpyhj.js");
5771
+ const { analyzeHarnessPrompts } = await import("./harness-v7kgnpr6.js");
5772
5772
  const result = await analyzeHarnessPrompts({
5773
5773
  rootDir: process.cwd(),
5774
5774
  existing: established.flatMap((prompt) => prompt.sourceDefinition ? [prompt.sourceDefinition.source] : []),
@@ -5796,7 +5796,7 @@ async function runPromptSyncExclusive(flags, profileOptions, options) {
5796
5796
  const mergedSources = mergePromptSources(manifest.sources, extraSources);
5797
5797
  const manifestUpdate = stableJson(mergedSources) === stableJson(mergePromptSources(manifest.sources, [])) ? undefined : $stringify({ version: 2, prompt_paths: manifest.promptPaths, sources: mergedSources });
5798
5798
  const prompts = await discoverPrompts(extraSources);
5799
- const { checkPromptAttribution } = await import("./prompt-attribution-g9gtv191.js");
5799
+ const { checkPromptAttribution } = await import("./prompt-attribution-d1vj2cxt.js");
5800
5800
  const attribution = checkPromptAttribution(process.cwd(), prompts.map((prompt) => prompt.key));
5801
5801
  const brokenAttribution = attribution.references.filter((reference) => reference.status === "missing");
5802
5802
  if (brokenAttribution.length) {
@@ -6102,7 +6102,7 @@ async function migratePromptManifest(options = {}) {
6102
6102
  let addedSources = [];
6103
6103
  let pendingSources = [];
6104
6104
  if (options.discover) {
6105
- const { analyzeHarnessPrompts } = await import("./harness-cy0gpyhj.js");
6105
+ const { analyzeHarnessPrompts } = await import("./harness-v7kgnpr6.js");
6106
6106
  const result = await analyzeHarnessPrompts({
6107
6107
  rootDir: root,
6108
6108
  existing: manifest.sources,
@@ -6303,7 +6303,7 @@ async function readHarnessSources(reportPath) {
6303
6303
  if (!graph) {
6304
6304
  throw new CliInputError(`${selected} is not a harness report with a graph (schema: ${schemaLabel}). Regenerate it with \`${HARNESS_REANALYZE_COMMAND}\`.`);
6305
6305
  }
6306
- const { normalizeHarnessReport } = await import("./harness-report-rd9c4e9v.js");
6306
+ const { normalizeHarnessReport } = await import("./harness-report-r0dkpafy.js");
6307
6307
  const { backfillPromptSource, resolvePromptSource } = await loadPromptSources();
6308
6308
  const report = normalizeHarnessReport(raw);
6309
6309
  const artifacts = (report.graph.artifacts ?? []).filter((artifact) => artifact.type === "prompt");
@@ -74,6 +74,7 @@ import {
74
74
  import {
75
75
  HARNESS_ANALYZE_CONCERNS,
76
76
  HARNESS_REPORT_PATH,
77
+ MAX_HARNESS_REPORT_SUMMARY_LENGTH,
77
78
  approveHarnessReport,
78
79
  artifactHasBody,
79
80
  createHarnessReport,
@@ -89,7 +90,7 @@ import {
89
90
  stampRemoteSnapshotTruncation,
90
91
  validateHarnessReport,
91
92
  writeHarnessReportArtifacts
92
- } from "./cli-cesds766.js";
93
+ } from "./cli-jj77e5yp.js";
93
94
  import {
94
95
  CliInputError,
95
96
  CliInputRequiredError
@@ -14048,7 +14049,7 @@ async function runHarnessCommand(context) {
14048
14049
  throw new CliInputError("Focused remote prompt analysis is not supported yet.", "Use local --analyst=claude|codex|cursor|local-scan, or drop --concern for a full remote report.");
14049
14050
  }
14050
14051
  if (context.flags["github-actions"] === "true") {
14051
- const { runGithubActionsAnalyze } = await import("./harness-github-actions-aac3tn96.js");
14052
+ const { runGithubActionsAnalyze } = await import("./harness-github-actions-njdxwsn5.js");
14052
14053
  const result = await runGithubActionsAnalyze(rootDir, {
14053
14054
  writeReport: (report2) => {
14054
14055
  const normalized = normalizeHarnessReport(report2);
@@ -14683,11 +14684,59 @@ function parseHarnessReportCandidate(candidate) {
14683
14684
  }
14684
14685
  return;
14685
14686
  }
14687
+ function resolveWithInferredKind(rootDir, source) {
14688
+ try {
14689
+ return resolvePromptSource(rootDir, source);
14690
+ } catch (error) {
14691
+ if (!source.kind || !(error instanceof Error) || !/declared source kind '[^']+' does not match resolved kind/.test(error.message)) {
14692
+ throw error;
14693
+ }
14694
+ const { kind: _declared, ...inferred } = source;
14695
+ return resolvePromptSource(rootDir, inferred);
14696
+ }
14697
+ }
14698
+ function applyResolvedPromptSource(artifact, source) {
14699
+ artifact.promptSource = source.sourceDefinition.source;
14700
+ artifact.body = source.content;
14701
+ artifact.sourceDefinition = source.sourceDefinition;
14702
+ artifact.sourcePath = source.sourcePath;
14703
+ artifact.contentHash = source.sourceDefinition.sourceHash;
14704
+ }
14705
+ function removeArtifacts(report, ids) {
14706
+ const graph = report.graph;
14707
+ const keep = (id) => typeof id !== "string" || !ids.has(id);
14708
+ graph.artifacts = graph.artifacts.filter((artifact) => keep(artifact.id));
14709
+ for (const agent of graph.runtimeAgents) {
14710
+ if (Array.isArray(agent.artifactIds))
14711
+ agent.artifactIds = agent.artifactIds.filter(keep);
14712
+ }
14713
+ for (const family of graph.agentFamilies) {
14714
+ if (Array.isArray(family.sharedArtifactIds))
14715
+ family.sharedArtifactIds = family.sharedArtifactIds.filter(keep);
14716
+ }
14717
+ const edgeKept = (edge) => keep(edge.from) && keep(edge.to) && keep(edge.artifactId);
14718
+ graph.relationships = graph.relationships.filter((relationship) => edgeKept(relationship));
14719
+ if (Array.isArray(report.claims)) {
14720
+ report.claims = report.claims.map((claim) => {
14721
+ const removed = claim.kind === "artifact" ? keep(claim.subjectId) ? undefined : claim.subjectId : claim.kind === "relationship" ? String(claim.subjectId ?? "").split("->").find((id) => !keep(id)) : undefined;
14722
+ if (!removed)
14723
+ return claim;
14724
+ return {
14725
+ ...claim,
14726
+ kind: "unknown",
14727
+ subjectId: `unresolved_${removed}`,
14728
+ title: `Unverified prompt source: ${claim.title}`,
14729
+ summary: `The analyst's source mapping for ${removed} did not verify against the repository, so it was left out of the harness. ${claim.summary ?? ""}`.trim().slice(0, MAX_HARNESS_REPORT_SUMMARY_LENGTH)
14730
+ };
14731
+ });
14732
+ }
14733
+ }
14686
14734
  function repairExternalAnalystReport(report, rootDir, options = {}) {
14687
14735
  const normalized = normalizeHarnessReport(report);
14688
14736
  repairCitationLines(normalized, rootDir);
14689
14737
  mergeDeterministicArtifacts(normalized.graph, rootDir, { concern: options.concern });
14690
14738
  hydratePromptAndToolBodies(normalized.graph, rootDir);
14739
+ const unverified = new Set;
14691
14740
  for (const artifact of normalized.graph.artifacts) {
14692
14741
  if (artifact.type !== "prompt")
14693
14742
  continue;
@@ -14696,17 +14745,14 @@ function repairExternalAnalystReport(report, rootDir, options = {}) {
14696
14745
  if (!backfilled)
14697
14746
  continue;
14698
14747
  artifact.promptSource = backfilled;
14699
- const source = resolvePromptSource(rootDir, artifact.promptSource);
14700
- artifact.body = source.content;
14701
- artifact.sourceDefinition = source.sourceDefinition;
14702
- artifact.sourcePath = source.sourcePath;
14703
- artifact.contentHash = source.sourceDefinition.sourceHash;
14748
+ applyResolvedPromptSource(artifact, resolveWithInferredKind(rootDir, artifact.promptSource));
14704
14749
  } catch (error) {
14705
- artifact.body = "";
14706
- delete artifact.sourceDefinition;
14750
+ unverified.add(artifact.id);
14707
14751
  normalized.graph.unknowns.push({ id: `unresolved_${artifact.id}`, question: error instanceof Error ? error.message : String(error), candidateIds: [artifact.id], evidence: artifact.evidence });
14708
14752
  }
14709
14753
  }
14754
+ if (unverified.size > 0)
14755
+ removeArtifacts(normalized, unverified);
14710
14756
  deriveRelationshipsFromGraph(normalized.graph);
14711
14757
  repairReportSummaryCounts(normalized);
14712
14758
  if (options.concern) {
@@ -4,7 +4,7 @@ import {
4
4
  } from "./cli-h1z9yyqk.js";
5
5
  import {
6
6
  inspectPromptManifest
7
- } from "./cli-fqc02t6h.js";
7
+ } from "./cli-0zws61ba.js";
8
8
  import {
9
9
  readHarnessSyncState,
10
10
  renderDoctorHuman,
@@ -395,7 +395,7 @@ async function harnessCurrentCheck(cwd, manifestPath, manifestExists, tenantId)
395
395
  };
396
396
  }
397
397
  try {
398
- const { scanHarness } = await import("./harness-cy0gpyhj.js");
398
+ const { scanHarness } = await import("./harness-v7kgnpr6.js");
399
399
  const current = scanHarness({
400
400
  rootDir: cwd,
401
401
  scannerVersion: "doctor",
@@ -1513,4 +1513,4 @@ function normalizePath(path) {
1513
1513
  return path.replace(/\\/g, "/");
1514
1514
  }
1515
1515
 
1516
- export { HARNESS_REPORT_SCHEMA_VERSION, HARNESS_REPORT_VALIDATION_SCHEMA_VERSION, HARNESS_REPORT_APPROVAL_SCHEMA_VERSION, HARNESS_REPORT_PATH, HARNESS_REPORT_MARKDOWN_PATH, HARNESS_REPORT_VALIDATION_PATH, HARNESS_REPORT_APPROVAL_PATH, HARNESS_ANALYZE_CONCERNS, createHarnessReport, validateHarnessReport, approveHarnessReport, loadHarnessReportForSync, readHarnessReport, normalizeHarnessReport, requiresArtifactBody, artifactHasBody, firstEvidencePath, stampRemoteSnapshotTruncation, resolveHarnessReportPath, writeHarnessReportArtifacts, renderHarnessReportMarkdown, hashHarnessReport, hashStableJson, graphForReport };
1516
+ export { HARNESS_REPORT_SCHEMA_VERSION, HARNESS_REPORT_VALIDATION_SCHEMA_VERSION, HARNESS_REPORT_APPROVAL_SCHEMA_VERSION, HARNESS_REPORT_PATH, HARNESS_REPORT_MARKDOWN_PATH, HARNESS_REPORT_VALIDATION_PATH, HARNESS_REPORT_APPROVAL_PATH, HARNESS_ANALYZE_CONCERNS, MAX_HARNESS_REPORT_SUMMARY_LENGTH, createHarnessReport, validateHarnessReport, approveHarnessReport, loadHarnessReportForSync, readHarnessReport, normalizeHarnessReport, requiresArtifactBody, artifactHasBody, firstEvidencePath, stampRemoteSnapshotTruncation, resolveHarnessReportPath, writeHarnessReportArtifacts, renderHarnessReportMarkdown, hashHarnessReport, hashStableJson, graphForReport };
package/dist/cli.js CHANGED
@@ -2967,25 +2967,25 @@ function leafManifestFields(leaf, commands) {
2967
2967
  import { fileURLToPath } from "url";
2968
2968
  import { realpathSync } from "fs";
2969
2969
  async function runPromptsCommand(...args) {
2970
- return (await import("./prompts-b6awryvv.js")).runPromptsCommand(...args);
2970
+ return (await import("./prompts-qh1akhfz.js")).runPromptsCommand(...args);
2971
2971
  }
2972
2972
  async function runSkillsCommand(...args) {
2973
2973
  return (await import("./skills-zfenne8w.js")).runSkillsCommand(...args);
2974
2974
  }
2975
2975
  async function runHarnessCommand(...args) {
2976
- return (await import("./harness-cy0gpyhj.js")).runHarnessCommand(...args);
2976
+ return (await import("./harness-v7kgnpr6.js")).runHarnessCommand(...args);
2977
2977
  }
2978
2978
  async function runSyncCommand(...args) {
2979
- return (await import("./sync-5vd8gwte.js")).runSyncCommand(...args);
2979
+ return (await import("./sync-ra280dhc.js")).runSyncCommand(...args);
2980
2980
  }
2981
2981
  async function runRegistryCommand(...args) {
2982
2982
  return (await import("./registry-d7xdm4dw.js")).runRegistryCommand(...args);
2983
2983
  }
2984
2984
  async function runDoctorCommand(...args) {
2985
- return (await import("./doctor-fz5kq44d.js")).runDoctorCommand(...args);
2985
+ return (await import("./doctor-dw9bqzeg.js")).runDoctorCommand(...args);
2986
2986
  }
2987
2987
  async function runStatusCommand(...args) {
2988
- return (await import("./doctor-fz5kq44d.js")).runStatusCommand(...args);
2988
+ return (await import("./doctor-dw9bqzeg.js")).runStatusCommand(...args);
2989
2989
  }
2990
2990
  async function runAuthCommand(...args) {
2991
2991
  return (await import("./profile-commands-zbyn9xg2.js")).runAuthCommand(...args);
@@ -2997,10 +2997,10 @@ async function runProfilesCommand(...args) {
2997
2997
  return (await import("./profile-commands-zbyn9xg2.js")).runProfilesCommand(...args);
2998
2998
  }
2999
2999
  async function runAgentCommand(...args) {
3000
- return (await import("./agent-aewgndk0.js")).runAgentCommand(...args);
3000
+ return (await import("./agent-de8bnj8x.js")).runAgentCommand(...args);
3001
3001
  }
3002
3002
  async function runProductionCommand(...args) {
3003
- return (await import("./production-intelligence-8j8008d2.js")).runProductionCommand(...args);
3003
+ return (await import("./production-intelligence-fe5masaa.js")).runProductionCommand(...args);
3004
3004
  }
3005
3005
  function parseArgs(argv) {
3006
3006
  const args = argv.slice(2);
@@ -6761,7 +6761,7 @@ var commandRegistry = createCommandRegistry([
6761
6761
  resetApiRequestCountBeforeRun: true,
6762
6762
  telemetry: "result-and-error",
6763
6763
  handler: async (context) => {
6764
- const { runInit } = await import("./index-5eyq3ykt.js");
6764
+ const { runInit } = await import("./index-40b5v59z.js");
6765
6765
  if (context.outputMode === "agent-stream") {
6766
6766
  context.output.writeEvent({
6767
6767
  event: "started",
@@ -3,9 +3,9 @@ import {
3
3
  promptsDiscoveredCheck,
4
4
  runDoctorCommand,
5
5
  runStatusCommand
6
- } from "./cli-dxbd1xxs.js";
6
+ } from "./cli-629tc1d0.js";
7
7
  import"./cli-h1z9yyqk.js";
8
- import"./cli-fqc02t6h.js";
8
+ import"./cli-0zws61ba.js";
9
9
  import"./cli-mm48br00.js";
10
10
  import"./cli-xq45etg1.js";
11
11
  import"./cli-m4474bnj.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  buildSourceSnapshot
3
- } from "./cli-x7rc3twr.js";
3
+ } from "./cli-10zgbewk.js";
4
4
  import"./cli-97fnztpy.js";
5
5
  import"./cli-xq45etg1.js";
6
6
  import"./cli-m4474bnj.js";
@@ -13,7 +13,7 @@ import {
13
13
  import"./cli-qpq84eee.js";
14
14
  import"./cli-9kfxkxmk.js";
15
15
  import"./cli-ns5fcnkz.js";
16
- import"./cli-cesds766.js";
16
+ import"./cli-jj77e5yp.js";
17
17
  import"./cli-k4tqwah4.js";
18
18
  import"./cli-0v6na3yp.js";
19
19
 
@@ -7,6 +7,7 @@ import {
7
7
  HARNESS_REPORT_SCHEMA_VERSION,
8
8
  HARNESS_REPORT_VALIDATION_PATH,
9
9
  HARNESS_REPORT_VALIDATION_SCHEMA_VERSION,
10
+ MAX_HARNESS_REPORT_SUMMARY_LENGTH,
10
11
  approveHarnessReport,
11
12
  artifactHasBody,
12
13
  createHarnessReport,
@@ -23,7 +24,7 @@ import {
23
24
  stampRemoteSnapshotTruncation,
24
25
  validateHarnessReport,
25
26
  writeHarnessReportArtifacts
26
- } from "./cli-cesds766.js";
27
+ } from "./cli-jj77e5yp.js";
27
28
  import"./cli-k4tqwah4.js";
28
29
  import"./cli-0v6na3yp.js";
29
30
  export {
@@ -43,6 +44,7 @@ export {
43
44
  createHarnessReport,
44
45
  artifactHasBody,
45
46
  approveHarnessReport,
47
+ MAX_HARNESS_REPORT_SUMMARY_LENGTH,
46
48
  HARNESS_REPORT_VALIDATION_SCHEMA_VERSION,
47
49
  HARNESS_REPORT_VALIDATION_PATH,
48
50
  HARNESS_REPORT_SCHEMA_VERSION,
@@ -40,7 +40,7 @@ import {
40
40
  writeHarnessAnalyzeResult,
41
41
  writeHarnessArtifacts,
42
42
  writeHumanProgress
43
- } from "./cli-x7rc3twr.js";
43
+ } from "./cli-10zgbewk.js";
44
44
  import"./cli-97fnztpy.js";
45
45
  import"./cli-xq45etg1.js";
46
46
  import"./cli-m4474bnj.js";
@@ -53,7 +53,7 @@ import"./cli-9kfxkxmk.js";
53
53
  import"./cli-ns5fcnkz.js";
54
54
  import {
55
55
  HARNESS_ANALYZE_CONCERNS
56
- } from "./cli-cesds766.js";
56
+ } from "./cli-jj77e5yp.js";
57
57
  import"./cli-k4tqwah4.js";
58
58
  import"./cli-0v6na3yp.js";
59
59
  export {
@@ -21,7 +21,7 @@ import {
21
21
  } from "./cli-hcwdz9sd.js";
22
22
  import {
23
23
  buildDoctorReport
24
- } from "./cli-dxbd1xxs.js";
24
+ } from "./cli-629tc1d0.js";
25
25
  import {
26
26
  ConnectCodeError,
27
27
  connectWithCode,
@@ -32,7 +32,7 @@ import {
32
32
  import {
33
33
  initPrompts,
34
34
  runPromptSync
35
- } from "./cli-fqc02t6h.js";
35
+ } from "./cli-0zws61ba.js";
36
36
  import"./cli-mm48br00.js";
37
37
  import {
38
38
  codingAgentDisplayName,
@@ -46,7 +46,7 @@ import {
46
46
  runCodingAgent,
47
47
  runHarnessCommand,
48
48
  startRemoteAnalyze
49
- } from "./cli-x7rc3twr.js";
49
+ } from "./cli-10zgbewk.js";
50
50
  import {
51
51
  stripAnsi
52
52
  } from "./cli-97fnztpy.js";
@@ -74,7 +74,7 @@ import {
74
74
  import"./cli-qpq84eee.js";
75
75
  import"./cli-9kfxkxmk.js";
76
76
  import"./cli-ns5fcnkz.js";
77
- import"./cli-cesds766.js";
77
+ import"./cli-jj77e5yp.js";
78
78
  import {
79
79
  CliAuthError,
80
80
  CliInputError
@@ -487,6 +487,7 @@ async function loadOverviewBriefing(options) {
487
487
  ];
488
488
  const findings = findingsFromOverview(overview, options.daysBack, hints, evidenceRefs);
489
489
  const topFinding = findings[0] ?? null;
490
+ const signalsRate = overviewSignalsRate(overview);
490
491
  const conversations = numberAt(overview, ["conversations", "total"]);
491
492
  const recent = recentActivity(overview)[0];
492
493
  const dataFlowStatus = conversations > 0 || recent ? "flowing" : "quiet";
@@ -495,7 +496,7 @@ async function loadOverviewBriefing(options) {
495
496
  schemaVersion: OVERVIEW_SCHEMA_VERSION,
496
497
  generatedAt: new Date().toISOString(),
497
498
  daysBack: options.daysBack,
498
- status: topFinding ? "attention" : dataFlowStatus === "flowing" ? "healthy" : "quiet",
499
+ status: topFinding ? "attention" : signalsRate && signalsRate.ratePct > 0 ? "unknown" : dataFlowStatus === "flowing" ? "healthy" : "quiet",
499
500
  dataFlow: {
500
501
  status: dataFlowStatus,
501
502
  conversations,
@@ -849,6 +850,17 @@ function findingsFromOverview(overview, daysBack, hints, evidenceRefs) {
849
850
  }]
850
851
  });
851
852
  }
853
+ const signalsRate = overviewSignalsRate(overview);
854
+ const signalsEvidenceId = "overview:signals_negative_emotion_rate";
855
+ if (signalsRate) {
856
+ evidenceRefs.push({
857
+ id: signalsEvidenceId,
858
+ kind: "data_api",
859
+ label: `Signals page negative emotion: ${signalsRate.ratePct}% of ${signalsRate.unit}s${signalsCoverageLabel(signalsRate)}`,
860
+ endpoint: `/overview?days_back=${daysBack}`,
861
+ value: valueAt(overview, ["signals_negative_emotion_rate"])
862
+ });
863
+ }
852
864
  const frustrationRate = numberAt(overview, ["frustrations", "rate_pct"]);
853
865
  const frustrated = numberAt(overview, ["frustrations", "frustrated"]);
854
866
  if (frustrated > 0 || frustrationRate >= 10) {
@@ -856,20 +868,20 @@ function findingsFromOverview(overview, daysBack, hints, evidenceRefs) {
856
868
  evidenceRefs.push({
857
869
  id: evidenceId,
858
870
  kind: "data_api",
859
- label: `${frustrationRate}% frustration rate`,
871
+ label: `${frustrationRate}% frustration family, analyzed conversations`,
860
872
  endpoint: `/overview?days_back=${daysBack}`,
861
873
  value: valueAt(overview, ["frustrations"])
862
874
  });
863
875
  findings.push({
864
876
  id: "finding_overview_frustration",
865
877
  kind: "frustration",
866
- title: `${frustrationRate}% user frustration rate`,
878
+ title: `${frustrationRate}% frustration family, analyzed conversations`,
867
879
  severity: frustrationRate >= 25 ? "high" : "medium",
868
880
  confidence: "medium",
869
881
  impactScore: 65 + Math.min(frustrationRate, 30),
870
882
  rankReason: "Frustration indicates users are getting stuck even when runs may not hard-fail.",
871
- summary: `Moda classified ${frustrated} frustrated trace(s) in the last ${daysBack} day(s).`,
872
- evidenceRefIds: [evidenceId],
883
+ summary: `Moda classified ${frustrated} conversation(s) with frustration-family detections in the last ${daysBack} day(s).` + (signalsRate ? ` Signals page negative emotion: ${signalsRate.ratePct}% of ${signalsRate.unit}s${signalsRate.unitSource === "fallback_unavailable" ? " (default unit; saved unit unverified)" : signalsRate.unitSource === "default" ? " (default unit)" : ""}${signalsCoverageLabel(signalsRate)}.` : ""),
884
+ evidenceRefIds: [evidenceId, ...signalsRate ? [signalsEvidenceId] : []],
873
885
  likelyLocations: defaultLikelyLocations(hints, "prompt"),
874
886
  recommendedActions: [{
875
887
  id: "action_investigate_frustration",
@@ -1583,6 +1595,8 @@ function renderOverviewBriefingHuman(briefing) {
1583
1595
  lines.push(` ${briefing.topFinding.severity.toUpperCase()} ${briefing.topFinding.title}`);
1584
1596
  lines.push(` ${briefing.topFinding.summary}`);
1585
1597
  lines.push(` Why ranked: ${briefing.topFinding.rankReason}`);
1598
+ } else if (briefing.status === "unknown") {
1599
+ lines.push(" Signals negative emotion is present; production health is unassessed for this unit.");
1586
1600
  } else {
1587
1601
  lines.push(" No urgent production issue found in the selected window.");
1588
1602
  }
@@ -1923,7 +1937,19 @@ function uniqueEvidenceRefs(refs) {
1923
1937
  }
1924
1938
  return out;
1925
1939
  }
1940
+ function signalsCoverageLabel(rate) {
1941
+ return rate.coverageSince ? ` (partial coverage since ${rate.coverageSince})` : "";
1942
+ }
1943
+ function overviewSignalsRate(data) {
1944
+ const signal = asRecord(valueAt(data, ["signals_negative_emotion_rate"]));
1945
+ const ratePct = asNumber(signal?.rate_pct);
1946
+ const unit = asString(signal?.unit);
1947
+ if (signal?.status === "unavailable" || ratePct === null || !Number.isFinite(ratePct) || !unit || !["turn", "task", "conversation"].includes(unit))
1948
+ return null;
1949
+ return { ratePct, unit, unitSource: asString(signal?.unit_source), coverageSince: asString(signal?.coverage_since) };
1950
+ }
1926
1951
  function overviewMetrics(data) {
1952
+ const signalsRate = overviewSignalsRate(data);
1927
1953
  return {
1928
1954
  conversations: valueAt(data, ["conversations", "total"]) ?? 0,
1929
1955
  conversationTrendPct: valueAt(data, ["conversations", "trend_pct"]) ?? 0,
@@ -1933,10 +1959,16 @@ function overviewMetrics(data) {
1933
1959
  frustrated: valueAt(data, ["frustrations", "frustrated"]) ?? 0,
1934
1960
  atRisk: valueAt(data, ["frustrations", "at_risk"]) ?? 0,
1935
1961
  frustrationRatePct: valueAt(data, ["frustrations", "rate_pct"]) ?? 0,
1962
+ ...signalsRate ? { signalsNegativeEmotionRatePct: signalsRate.ratePct, signalsNegativeEmotionUnit: signalsRate.unit, signalsNegativeEmotionUnitSource: signalsRate.unitSource, signalsNegativeEmotionCoverageSince: signalsRate.coverageSince } : {},
1936
1963
  recentActivity: recentActivity(data).length
1937
1964
  };
1938
1965
  }
1939
1966
  function overviewSignalPairs(metrics) {
1967
+ const signalsRate = asNumber(metrics.signalsNegativeEmotionRatePct);
1968
+ const unit = asString(metrics.signalsNegativeEmotionUnit);
1969
+ const source = metrics.signalsNegativeEmotionUnitSource;
1970
+ const coverage = asString(metrics.signalsNegativeEmotionCoverageSince);
1971
+ const unitLabel = `${unit}${source === "fallback_unavailable" ? " (default; saved unit unverified)" : source === "default" ? " (default)" : ""}${signalsCoverageLabel({ coverageSince: coverage })}`;
1940
1972
  return [
1941
1973
  ["Traces", metrics.conversations],
1942
1974
  ["Tool failures", metrics.toolFailures],
@@ -1944,7 +1976,8 @@ function overviewSignalPairs(metrics) {
1944
1976
  ["Impacted tools", metrics.impactedTools],
1945
1977
  ["Frustrated", metrics.frustrated],
1946
1978
  ["At risk", metrics.atRisk],
1947
- ["Frustration %", metrics.frustrationRatePct],
1979
+ ["Frustration family %, analyzed conversations", metrics.frustrationRatePct],
1980
+ ...signalsRate !== null && unit ? [[`Signals negative-emotion %, ${unitLabel}`, signalsRate]] : [],
1948
1981
  ["Recent events", metrics.recentActivity]
1949
1982
  ];
1950
1983
  }
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  inventoryFiles,
3
3
  safePromptEvidencePath
4
- } from "./cli-x7rc3twr.js";
4
+ } from "./cli-10zgbewk.js";
5
5
  import"./cli-97fnztpy.js";
6
6
  import"./cli-xq45etg1.js";
7
7
  import"./cli-m4474bnj.js";
@@ -14,7 +14,7 @@ import {
14
14
  } from "./cli-qpq84eee.js";
15
15
  import"./cli-9kfxkxmk.js";
16
16
  import"./cli-ns5fcnkz.js";
17
- import"./cli-cesds766.js";
17
+ import"./cli-jj77e5yp.js";
18
18
  import"./cli-k4tqwah4.js";
19
19
  import {
20
20
  __toESM
@@ -3,7 +3,7 @@ import {
3
3
  checkPromptMapping,
4
4
  discoverHarnessPromptSources,
5
5
  safePromptEvidencePath
6
- } from "./cli-x7rc3twr.js";
6
+ } from "./cli-10zgbewk.js";
7
7
  import"./cli-97fnztpy.js";
8
8
  import"./cli-xq45etg1.js";
9
9
  import"./cli-m4474bnj.js";
@@ -17,7 +17,7 @@ import {
17
17
  } from "./cli-qpq84eee.js";
18
18
  import"./cli-9kfxkxmk.js";
19
19
  import"./cli-ns5fcnkz.js";
20
- import"./cli-cesds766.js";
20
+ import"./cli-jj77e5yp.js";
21
21
  import"./cli-k4tqwah4.js";
22
22
  import {
23
23
  __commonJS,
@@ -9,7 +9,7 @@ import {
9
9
  runPromptSync,
10
10
  runPromptsCommand,
11
11
  writePromptSyncProgress
12
- } from "./cli-fqc02t6h.js";
12
+ } from "./cli-0zws61ba.js";
13
13
  import {
14
14
  promptSourceHashPayload
15
15
  } from "./cli-mm48br00.js";
@@ -6,11 +6,11 @@ import"./cli-rjav0vj1.js";
6
6
  import"./cli-hcwdz9sd.js";
7
7
  import {
8
8
  runPromptsCommand
9
- } from "./cli-fqc02t6h.js";
9
+ } from "./cli-0zws61ba.js";
10
10
  import"./cli-mm48br00.js";
11
11
  import {
12
12
  runHarnessCommand
13
- } from "./cli-x7rc3twr.js";
13
+ } from "./cli-10zgbewk.js";
14
14
  import"./cli-97fnztpy.js";
15
15
  import"./cli-xq45etg1.js";
16
16
  import"./cli-m4474bnj.js";
@@ -21,7 +21,7 @@ import"./cli-da3h2p6w.js";
21
21
  import"./cli-qpq84eee.js";
22
22
  import"./cli-9kfxkxmk.js";
23
23
  import"./cli-ns5fcnkz.js";
24
- import"./cli-cesds766.js";
24
+ import"./cli-jj77e5yp.js";
25
25
  import {
26
26
  CliInputError
27
27
  } from "./cli-k4tqwah4.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moda-ai/cli",
3
- "version": "1.55.46",
3
+ "version": "1.55.48",
4
4
  "description": "CLI for Moda: production monitoring and evals for AI agents.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schema_version": "moda.skill_index.v1",
3
- "bundled_at": "2026-10-20T02:52:17.279Z",
4
- "cli_version": "1.55.46",
3
+ "bundled_at": "2026-10-20T06:53:25.310Z",
4
+ "cli_version": "1.55.48",
5
5
  "skills": [
6
6
  {
7
7
  "id": "integration-cloudflare-think",