@thehammer/danx-dashboard-mcp 0.1.327 → 0.1.329
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.
|
@@ -102,15 +102,20 @@ export async function captureWith(where, offline, drive) {
|
|
|
102
102
|
await browser.close().catch((err) => console.error(`[danx-dashboard-mcp] could not close the browser: ${oneLine(err)}`));
|
|
103
103
|
}
|
|
104
104
|
}
|
|
105
|
+
/** DX-5319: where the built html is served for the capture: a route answered by the capture itself, so the page is a real navigation and never reaches a network. */
|
|
106
|
+
const DESIGN_PAGE_URL = "https://design.invalid/";
|
|
105
107
|
/**
|
|
106
|
-
* Capture `html` as a 1280x800 viewport PNG (device scale 1, network disabled). The page is
|
|
107
|
-
*
|
|
108
|
+
* Capture `html` as a 1280x800 viewport PNG (device scale 1, network disabled). The page is served from a route and navigated to, never
|
|
109
|
+
* `setContent`-ed: an init script runs on a navigation and not on `setContent`'s `document.write`, so the ready listener and the
|
|
110
|
+
* `window.danxMiniApp` stub would not exist and every capture would wait out the whole ready timeout (DX-5319, measured: 5.2 s, the stub
|
|
111
|
+
* undefined). It then gets a short wait for the harness's ready message (the page has loaded either way).
|
|
108
112
|
*/
|
|
109
113
|
export function captureScreenshot(html, where) {
|
|
110
114
|
return captureWith(where, true, async (page) => {
|
|
111
115
|
await page.addInitScript(READY_LISTENER);
|
|
112
116
|
await page.addInitScript(MINI_APP_STUB);
|
|
113
|
-
await page.
|
|
117
|
+
await page.route(DESIGN_PAGE_URL, (route) => route.fulfill({ status: 200, contentType: "text/html; charset=utf-8", body: html }));
|
|
118
|
+
await page.goto(DESIGN_PAGE_URL, { waitUntil: "load" });
|
|
114
119
|
// The page has loaded; a design that never posts ready (it threw) is still captured as it stands.
|
|
115
120
|
await page.waitForFunction("window.__danxDesignReady === true", undefined, { timeout: READY_WAIT_MS }).catch(() => undefined);
|
|
116
121
|
});
|
package/dist/permission-watch.js
CHANGED
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
*/
|
|
18
18
|
import { SYNC_ATTEMPTS, retryBounded } from "./bounded-retry.js";
|
|
19
19
|
import { SseParser } from "./listen.js";
|
|
20
|
+
import { PLUGIN_BACKGROUND_HEADER } from "./session-options.js";
|
|
20
21
|
const STREAM_PATH = "/api/stream?topics=key:self";
|
|
21
22
|
const PERMISSIONS_CHANGED = "permissions_changed";
|
|
22
23
|
export const WATCH_INITIAL_BACKOFF_MS = 1_000;
|
|
@@ -83,7 +84,8 @@ export class PermissionWatch {
|
|
|
83
84
|
const healthy = () => opened && this.now() - openedAt >= WATCH_HEALTHY_CONNECTION_MS;
|
|
84
85
|
try {
|
|
85
86
|
const response = await this.fetchImpl(`${this.deps.dashboardUrl.replace(/\/+$/, "")}${STREAM_PATH}`, {
|
|
86
|
-
|
|
87
|
+
// DX-5354: the watch is this process's own work, never the agent acting, so neither its connect nor any reconnect extends the session's key.
|
|
88
|
+
headers: { Authorization: `Bearer ${token}`, Accept: "text/event-stream", [PLUGIN_BACKGROUND_HEADER]: "1" },
|
|
87
89
|
signal: controller.signal,
|
|
88
90
|
});
|
|
89
91
|
if (response.status >= 400 && response.status < 500 && !RETRYABLE_REFUSALS.has(response.status)) {
|
package/dist/restart-notice.js
CHANGED
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
*/
|
|
43
43
|
import { z } from "zod";
|
|
44
44
|
import { boundRequest } from "./request-bound.js";
|
|
45
|
-
import { resolveDashboardAuth, SESSION_ID_HEADER, SessionStartError } from "./session-options.js";
|
|
45
|
+
import { PLUGIN_BACKGROUND_HEADER, resolveDashboardAuth, SESSION_ID_HEADER, SessionStartError } from "./session-options.js";
|
|
46
46
|
import { findPredecessorCandidates, projectKeyOf, readSessionConnection } from "./session-connection.js";
|
|
47
47
|
import { checkedTranscriptPath } from "./session-stats.js";
|
|
48
48
|
import { readTranscriptLineage, TranscriptReadAborted, TranscriptUnreadable } from "./transcript-lineage.js";
|
|
@@ -64,6 +64,8 @@ export async function sendSessionRequest(options, path, init, deps) {
|
|
|
64
64
|
Accept: "application/json",
|
|
65
65
|
...(init.body !== undefined ? { "Content-Type": "application/json" } : {}),
|
|
66
66
|
[SESSION_ID_HEADER]: options.sessionId,
|
|
67
|
+
// DX-5354: the session-start hook's lookup is the plugin's own work, never the agent acting, so it does not extend the session's key.
|
|
68
|
+
[PLUGIN_BACKGROUND_HEADER]: "1",
|
|
67
69
|
},
|
|
68
70
|
body: init.body,
|
|
69
71
|
signal: bound.signal,
|
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.329",
|
|
4
4
|
"description": "Stdio MCP server fronting danxbot's dashboard API for agents (operator sessions and dispatched workers alike): the generic danxbot_api/danxbot_api_list/danxbot_api_spec tools reach any route the caller's credential may call, plus dedicated agent-specific tools (plan_connect, request_permission, attach_file, and danxbot_slack_reply) (DX-3465, PLN-11 R-25).",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|