@wenathlan/extension 1.1.59 → 1.1.60
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/README.md +4 -3
- package/dist/cli.js +19 -2
- package/dist/environments.d.ts +96 -0
- package/dist/environments.d.ts.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +559 -1
- package/dist/index.js.map +4 -4
- package/dist/memory.d.ts +55 -1
- package/dist/memory.d.ts.map +1 -1
- package/dist/policy.d.ts +32 -1
- package/dist/policy.d.ts.map +1 -1
- package/dist/protocol.d.ts +46 -2
- package/dist/protocol.d.ts.map +1 -1
- package/dist/runstate.d.ts +127 -0
- package/dist/runstate.d.ts.map +1 -0
- package/dist/sandboxframe.d.ts +45 -0
- package/dist/sandboxframe.d.ts.map +1 -0
- package/dist/types.d.ts +168 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/extension/dist/background.js +919 -4
- package/extension/dist/background.js.map +4 -4
- package/extension/dist/manifest.json +16 -2
- package/extension/dist/offscreen.html +7 -0
- package/extension/dist/offscreen.js +87 -0
- package/extension/dist/offscreen.js.map +7 -0
- package/extension/dist/pagebridge.js +7 -0
- package/extension/dist/pagebridge.js.map +2 -2
- package/extension/dist/popup.html +1 -1
- package/extension/dist/popup.js +38 -0
- package/extension/dist/popup.js.map +2 -2
- package/extension/dist/sandbox.html +28 -0
- package/extension/dist/sidepanel.html +1 -1
- package/extension/dist/sidepanel.js +293 -0
- package/extension/dist/sidepanel.js.map +3 -3
- package/extension/manifest.json +16 -2
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<!doctype html>
|
|
2
2
|
<html lang="en">
|
|
3
3
|
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Devthink</title><link rel="stylesheet" href="style.css"></head>
|
|
4
|
-
<body><main><header><p class="eyebrow">DEVTHINK 1.1.
|
|
4
|
+
<body><main><header><p class="eyebrow">DEVTHINK 1.1.60</p><h1>Browser bridge</h1><p>Consent is required before page access or action.</p></header><label for="endpoint">Optional agent endpoint</label><input id="endpoint" type="url" inputmode="url" placeholder="https://agent.example/proposal" autocomplete="off"><button id="connect">Approve endpoint origin</button><div class="actions"><button id="session">Start active tab session</button><button id="pause" class="secondary">Pause session</button><button id="openpanel" class="secondary">Review plans</button><button id="stop" class="danger">Stop</button></div><p id="capabilities" role="status" class="muted">Optional capabilities: loading.</p><p id="livelogic" role="status" class="muted">Held keys: none · Open dialogs answered: none.</p><p id="navstate" role="status" class="muted">Navigation: unknown.</p><p id="windowlayout" role="status" class="muted">Window layout: unknown.</p><p id="captchastate" role="status" class="muted">Captcha handoff: none.</p><p id="datasetstate" role="status" class="muted">Datasets: none collected yet.</p><p id="downloadstate" role="status" class="muted">Downloads: none.</p><p id="clipboardstate" role="status" class="muted">Clipboard consent: none waiting.</p><p id="capturestate" role="status" class="muted">Captures: none.</p><p id="mediastate" role="status" class="muted">Media: none.</p><p id="callstate" role="status" class="muted">Outbound calls: none.</p><p id="netstate" role="status" class="muted">Observed requests: none.</p><p id="rulestate" role="status" class="muted">Traffic rules: none active.</p><p id="debugstate" role="status" class="muted">Timeline: no errors captured.</p><p id="emulationstate" role="status" class="muted">Emulation: no active layer.</p><p id="sessionstate" role="status" class="muted">Sessions: none saved yet.</p><p id="workflowstate" role="status" class="muted">Workflows: none running.</p><p id="triggerstate" role="status" class="muted">Triggers: none armed.</p><p id="mcpstate" role="status" class="muted">Mcp server: stopped.</p><p id="modelstate" role="status" class="muted">Models: none connected.</p><p id="swarmstate" role="status" class="muted">Swarm: no agents.</p><p id="environmentstate" role="status" class="muted">Environments: no run state.</p><div id="workflowcontrols" class="actions"></div><div id="windowcontrols" class="actions"></div><div id="environmentcontrols" class="actions"></div><p id="status" role="status">Loading session state.</p></main><script type="module" src="popup.js"></script></body>
|
|
5
5
|
</html>
|
package/extension/dist/popup.js
CHANGED
|
@@ -39,6 +39,8 @@ var triggerstatenode = document.querySelector("#triggerstate");
|
|
|
39
39
|
var mcpstatenode = document.querySelector("#mcpstate");
|
|
40
40
|
var modelstatenode = document.querySelector("#modelstate");
|
|
41
41
|
var swarmstatenode = document.querySelector("#swarmstate");
|
|
42
|
+
var environmentstatenode = document.querySelector("#environmentstate");
|
|
43
|
+
var environmentcontrols = document.querySelector("#environmentcontrols");
|
|
42
44
|
var workflowcontrols = document.querySelector("#workflowcontrols");
|
|
43
45
|
var windowcontrols = document.querySelector("#windowcontrols");
|
|
44
46
|
var connectbutton = document.querySelector("#connect");
|
|
@@ -268,6 +270,41 @@ function rendermodelstate(state) {
|
|
|
268
270
|
const routed = state.tasks.filter((task) => task.provider !== void 0);
|
|
269
271
|
modelstatenode.textContent = `Models: ${routed.length > 0 ? routed.slice(0, 3).map((task) => `${task.kind} ${task.model}`).join(" \xB7 ") : "no route yet"} \xB7 ${state.usage.calls} call${state.usage.calls === 1 ? "" : "s"} \xB7 ${state.usage.totaltokens} tokens.`;
|
|
270
272
|
}
|
|
273
|
+
function renderenvironmentstate(view) {
|
|
274
|
+
if (!environmentstatenode) return;
|
|
275
|
+
if (!view) {
|
|
276
|
+
environmentstatenode.textContent = "Environments: no run state.";
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
const counted = /* @__PURE__ */ new Map();
|
|
280
|
+
for (const entry of view.report.environments) counted.set(entry.environment, (counted.get(entry.environment) ?? 0) + 1);
|
|
281
|
+
const breakdown = [...counted.entries()].map(([environment, count]) => `${environment} ${count}`).join(" \xB7 ");
|
|
282
|
+
const keepalive = view.report.keepalive;
|
|
283
|
+
environmentstatenode.textContent = `Environments: ${breakdown.length > 0 ? breakdown : "no step executed"} \xB7 offscreen ${view.offscreengranted ? "granted" : "absent"} \xB7 offload ${view.parseoffload ? "on" : "off"}${view.report.workers > 0 ? ` \xB7 workers ${view.report.workers}` : ""} \xB7 keepalive ${keepalive ? `${keepalive.state === "active" && keepalive.portopen ? "\u2665" : "closed"} ${keepalive.beats} beat${keepalive.beats === 1 ? "" : "s"}` : "none"}${view.zombies.length > 0 ? ` \xB7 zombie runs ${view.zombies.join(", ")}` : ""}${view.grants !== void 0 ? ` \xB7 grants ${view.grants.length > 0 ? view.grants.join(", ") : "default"}` : ""}.`;
|
|
284
|
+
if (keepalive?.state === "active" && keepalive.portopen) environmentstatenode.dataset.state = "active";
|
|
285
|
+
else delete environmentstatenode.dataset.state;
|
|
286
|
+
if (environmentcontrols) {
|
|
287
|
+
environmentcontrols.replaceChildren();
|
|
288
|
+
if (view.zombies.length > 0) {
|
|
289
|
+
const reap = document.createElement("button");
|
|
290
|
+
reap.className = "secondary";
|
|
291
|
+
reap.textContent = "Reap zombie runs";
|
|
292
|
+
reap.addEventListener("click", () => {
|
|
293
|
+
void request({ kind: "runstate", reap: true }).then(() => restore()).catch((error) => status(error instanceof Error ? error.message : String(error), true));
|
|
294
|
+
});
|
|
295
|
+
environmentcontrols.append(reap);
|
|
296
|
+
}
|
|
297
|
+
if (!view.offscreengranted) {
|
|
298
|
+
const grant = document.createElement("button");
|
|
299
|
+
grant.className = "secondary";
|
|
300
|
+
grant.textContent = "Request offscreen grant";
|
|
301
|
+
grant.addEventListener("click", () => {
|
|
302
|
+
void request({ kind: "environments", requestcapability: true }).then(() => restore()).catch((error) => status(error instanceof Error ? error.message : String(error), true));
|
|
303
|
+
});
|
|
304
|
+
environmentcontrols.append(grant);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
271
308
|
function renderswarmstate(state) {
|
|
272
309
|
if (!swarmstatenode) return;
|
|
273
310
|
if (!state) {
|
|
@@ -323,6 +360,7 @@ async function restore() {
|
|
|
323
360
|
rendermcpstate(context.mcp);
|
|
324
361
|
rendermodelstate(context.llm);
|
|
325
362
|
renderswarmstate(context.swarm);
|
|
363
|
+
renderenvironmentstate(context.environments);
|
|
326
364
|
renderrulestate(context.activerules, (context.traffic?.blocks ?? []).filter((rule) => rule.revertedat === void 0).reduce((total, rule) => total + rule.hits, 0), (context.traffic?.mocks ?? []).filter((spec) => spec.revertedat === void 0).reduce((total, spec) => total + spec.hits, 0));
|
|
327
365
|
const active = context.session && !context.session.stoppedat && context.session.expiresat > Date.now();
|
|
328
366
|
if (pausebutton) {
|