@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 +1 -1
- package/dist/listen.js +15 -1
- package/package.json +1 -1
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
|
|
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.
|
|
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",
|