denpex-mcp 0.2.5 → 0.2.6

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 +34 -2
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -697,6 +697,7 @@ function viewFromCloud(payload, note) {
697
697
  steps: asArray(fix.steps),
698
698
  evidence: asArray(fix.evidence),
699
699
  clarifying: asArray(fix.clarifyingQuestions),
700
+ clarifyingChoices: objArray(fix.clarifyingChoices),
700
701
  advisories: [
701
702
  ...advisory.map((a) => `${(a.summary ?? "Advisory").trim()}${a.action ? ` \u2014 ${a.action}` : ""}`),
702
703
  ...advisoriesFromAdvanced(payload.advanced)
@@ -740,6 +741,7 @@ function viewFromLocal(r, note) {
740
741
  steps: r.steps ?? [],
741
742
  evidence: r.evidence ?? [],
742
743
  clarifying: [],
744
+ clarifyingChoices: [],
743
745
  advisories: (r.detectors ?? []).map((d) => `${d.severity.toUpperCase()} \u2014 ${d.summary}`),
744
746
  // The offline engine has no advisory array, no falsification contracts, no
745
747
  // community/research grounding and no ranked-hypotheses ledger. Emit the fields as
@@ -844,7 +846,24 @@ function renderDiagnosis(v) {
844
846
  }
845
847
  if (v.priorIncident) lines.push("", `**You hit this before:** ${v.priorIncident}`);
846
848
  if (v.costHeadline) lines.push("", `**Cost:** ${v.costHeadline}`);
847
- if (v.clarifying.length) {
849
+ if (v.clarifyingChoices.length) {
850
+ lines.push("", "**To narrow it down, answer any of these:**");
851
+ for (const q of v.clarifyingChoices) {
852
+ if (!q?.question) continue;
853
+ lines.push("", `_${q.question}_`);
854
+ for (const o of q.options ?? []) {
855
+ if (!o?.label) continue;
856
+ const rec = o.recommended && q.kind === "action" ? " **(Recommended)**" : "";
857
+ const detail = o.detail ? ` \u2014 ${o.detail}` : "";
858
+ lines.push(`- \`${o.id ?? o.label}\` ${o.label}${rec}${detail}`);
859
+ }
860
+ if (q.kind === "fact") {
861
+ lines.push(` _Answer only from what was actually observed. If it is not known, say so rather than guessing \u2014 a wrong answer here sends the diagnosis the wrong way._`);
862
+ }
863
+ if (q.command) lines.push(` _Recommended check:_ \`${q.command}\``);
864
+ }
865
+ lines.push("", "_Reply with `ask_followup`, quoting the option id or your own answer._");
866
+ } else if (v.clarifying.length) {
848
867
  lines.push("", "**To narrow it down, tell me:**");
849
868
  v.clarifying.forEach((q) => lines.push(`- ${q}`));
850
869
  lines.push("", "_Use `ask_followup` to continue this conversation._");
@@ -903,6 +922,19 @@ var diagnosisOutputShape = {
903
922
  steps: z.array(z.string()).describe("The full prescriptive fix ladder, in order."),
904
923
  evidence: z.array(z.string()).describe("Literal lines quoted from the submitted log that support this verdict. An EMPTY array on a high-confidence verdict means the engine could not quote its own log \u2014 weigh it accordingly."),
905
924
  clarifying: z.array(z.string()).describe("Discriminating questions. Answer them with `ask_followup` to narrow the verdict."),
925
+ clarifyingChoices: z.array(z.object({
926
+ id: z.string().optional(),
927
+ kind: z.enum(["fact", "action"]).optional().describe("`fact` = what was observed; `action` = what you could run. Only `action` questions carry a recommended option \u2014 a recommendation on a question of fact would bias the evidence the next verdict is built on."),
928
+ question: z.string().optional(),
929
+ options: z.array(z.object({
930
+ id: z.string().optional(),
931
+ label: z.string().optional(),
932
+ detail: z.string().optional(),
933
+ recommended: z.boolean().optional()
934
+ })).optional(),
935
+ allowOther: z.boolean().optional(),
936
+ command: z.string().optional().describe("The exact command behind the recommended option.")
937
+ })).optional().describe("Structured form of `clarifying`: pick an option id and send it to `ask_followup`. Answer FACT questions only from what was actually observed \u2014 say you do not know rather than guessing."),
906
938
  advisories: z.array(z.string()).describe("Human-readable one-liners, severity-sorted."),
907
939
  advisory: z.array(advisorySchema).describe("Structured cross-cutting advisories, severity-sorted (critical first)."),
908
940
  contradictions: z.array(z.string()).describe("What the engine ruled OUT and why \u2014 the falsification trail."),
@@ -1726,7 +1758,7 @@ function registerPrompts(server) {
1726
1758
 
1727
1759
  // src/version.ts
1728
1760
  var SERVER_NAME = "denpex";
1729
- var SERVER_VERSION = "0.2.5";
1761
+ var SERVER_VERSION = "0.2.6";
1730
1762
 
1731
1763
  // src/server.ts
1732
1764
  function createServer() {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "denpex-mcp",
3
- "version": "0.2.5",
4
- "description": "Denpex MCP server — diagnose GPU/ML training failures (CUDA OOM, NCCL timeouts, Xid faults, NaN loss) from Claude Desktop, Cursor, or Claude Code, with optional explicit zero-egress mode.",
3
+ "version": "0.2.6",
4
+ "description": "Denpex MCP server \u00e2\u20ac\u201d diagnose GPU/ML training failures (CUDA OOM, NCCL timeouts, Xid faults, NaN loss) from Claude Desktop, Cursor, or Claude Code, with optional explicit zero-egress mode.",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "author": "Denpex",