@thehammer/danx-dashboard-mcp 0.1.110 → 0.1.114

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.
package/dist/index.js CHANGED
@@ -846,7 +846,7 @@ strictTool("plan_create", "Create a new, empty plan via POST /api/plans (DX-2531
846
846
  }, async (args) => jsonResult(await planCreate(client, args)));
847
847
  strictTool("plan_connect",
848
848
  // DX-2735: trimmed with the problem tools to stay inside the work-profile budget.
849
- "Connect THIS session to a plan via POST /api/plan-sessions/me/plan — the same binding the operator's Connect action writes. ONE CALL IS ENOUGH TO START (DX-2859): the reply carries `{session, movedFrom, briefing, listenerHealth}` — `briefing` is every goal/rule/caveat (ref+body), every architecture section (id+title), the plan's own ref/name/status, a first page of open cards (id/type/status/title/openProblemCount/assignedAgent) with a `morePagesHint` when more exist, and the closed-card count — usually replacing the `plan_get({fields:[...]})` + card batch-read a fresh session used to need. A session is on AT MOST ONE plan: connecting elsewhere MOVES it, and `movedFrom: {id, name} | null` says which plan it left (null = no plan, or already this one). It binds only your OWN session, resolved from the session id this server forwards. Afterwards every plan WRITE tool acts on this plan and takes no plan id. `listenerHealth` reports the event bridge's state — `null` (no session), or `{attached, state: \"unattached\"|\"credential_mismatch\"|\"board_scope_narrowed\"|\"healthy\", nextStep}` naming a concrete fix for every unhealthy state (the SAME shape `plan_list`/`plan_get` report). Once healthy, every comment, answer, problem added and block/unblock on this plan's cards reaches the session on its own, relayed by the danxbot plugin's plan event bridge as a line like `[DX-8 \"Title\" repo:board] newms87 answered \"<problem statement>\": chose \"Pause E2E\"`. Nothing to arm; never poll for these. DX-2816: pass `title` (call `get_session({session_id:\"self\"})` first and forward its `title` verbatim) so the dashboard shows the same name Claude does — this server has no way to read it itself.", {
849
+ "Connect THIS session to a plan via POST /api/plan-sessions/me/plan — the same binding the operator's Connect action writes. ONE CALL IS ENOUGH TO START (DX-2859): the reply carries `{session, movedFrom, browserInstruction, briefing, listenerHealth}` — `browserInstruction` (DX-3276) is a server-built action to take NOW, not just informational text: it names the plan's URL and tells you to open it (your in-app browser if you have one, else your default browser), keep that tab open for the whole session, never navigate it away, and use a different tab for your own browsing — it is the operator's tab for following and talking to you through the plan. Returned on EVERY connect, including a re-connect, so it doubles as the reminder after a context loss — act on it again each time. `briefing` is every goal/rule/caveat (ref+body), every architecture section (id+title), the plan's own ref/name/status, a first page of open cards (id/type/status/title/openProblemCount/assignedAgent) with a `morePagesHint` when more exist, and the closed-card count — usually replacing the `plan_get({fields:[...]})` + card batch-read a fresh session used to need. A session is on AT MOST ONE plan: connecting elsewhere MOVES it, and `movedFrom: {id, name} | null` says which plan it left (null = no plan, or already this one). It binds only your OWN session, resolved from the session id this server forwards. Afterwards every plan WRITE tool acts on this plan and takes no plan id. `listenerHealth` reports the event bridge's state — `null` (no session), or `{attached, state: \"unattached\"|\"credential_mismatch\"|\"board_scope_narrowed\"|\"healthy\", nextStep}` naming a concrete fix for every unhealthy state (the SAME shape `plan_list`/`plan_get` report). Once healthy, every comment, answer, problem added and block/unblock on this plan's cards reaches the session on its own, relayed by the danxbot plugin's plan event bridge as a line like `[DX-8 \"Title\" repo:board] newms87 answered \"<problem statement>\": chose \"Pause E2E\"`. Nothing to arm; never poll for these. DX-2816: pass `title` (call `get_session({session_id:\"self\"})` first and forward its `title` verbatim) so the dashboard shows the same name Claude does — this server has no way to read it itself.", {
850
850
  plan_id: z.number().int().positive().describe("The plan id, from `plan_list`."),
851
851
  title: z
852
852
  .string()
package/dist/listen.js CHANGED
@@ -276,6 +276,20 @@ function cardList(cards) {
276
276
  * point of the feature: a session that only sees "you're idle" learns
277
277
  * nothing a bare timer couldn't have told it. Always a single line; throws,
278
278
  * naming the fault, on a malformed nudge.
279
+ *
280
+ * DX-3274 — the line asserts only what `evaluateIdleNudge` actually measured
281
+ * (no real MCP call from THIS session in `idleMinutes`), never "work is
282
+ * waiting" or "work has stalled". `last_agent_call_at` cannot see a
283
+ * sub-agent/dispatch working the same card from underneath an orchestrating
284
+ * session — an orchestrator that delegates and then correctly waits without
285
+ * polling (the project's own mandated style, `base:monitor-polling`) looks
286
+ * identical, on this signal, to one that actually stalled. The card names
287
+ * are still worth reporting (a real signal: these are the cards this session
288
+ * itself has not touched), but the claim about THEM stops at "not checked
289
+ * in" — never a claim about whether the work itself is progressing, which
290
+ * this signal cannot support. See `evaluateIdleNudge`'s own doc comment
291
+ * (`src/issues/db/session-idle-nudge.ts`) for why a sub-agent-awareness
292
+ * special case was rejected instead of this wording fix.
279
293
  */
280
294
  export function formatNudgeLine(event) {
281
295
  const invalid = invalidNudgeReason(event);
@@ -286,7 +300,7 @@ export function formatNudgeLine(event) {
286
300
  parts.push(`startable: ${cardList(event.startable)}`);
287
301
  if (event.held.length > 0)
288
302
  parts.push(`held: ${cardList(event.held)}`);
289
- return oneLine(`${LINE_PREFIX} this session has been idle ${event.idleMinutes}m with work waiting — ${parts.join("; ")}`);
303
+ return oneLine(`${LINE_PREFIX} this session has not made an MCP call in ${event.idleMinutes}m — ${parts.join("; ")}`);
290
304
  }
291
305
  /**
292
306
  * Incremental SSE parser. Comment lines (keep-alives, the connect marker) and
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thehammer/danx-dashboard-mcp",
3
- "version": "0.1.110",
3
+ "version": "0.1.114",
4
4
  "description": "Stdio MCP server wrapping danxbot's dashboard /api/issues/* normalized DB-backed HTTP routes for dispatched agents (DX-704 Phase 2).",
5
5
  "license": "MIT",
6
6
  "type": "module",