@wenathlan/extension 1.1.60 → 1.1.62

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 (48) hide show
  1. package/README.md +5 -3
  2. package/dist/confirmgates.d.ts +60 -0
  3. package/dist/confirmgates.d.ts.map +1 -0
  4. package/dist/immutablelog.d.ts +73 -0
  5. package/dist/immutablelog.d.ts.map +1 -0
  6. package/dist/inboundguard.d.ts +86 -0
  7. package/dist/inboundguard.d.ts.map +1 -0
  8. package/dist/index.d.ts +10 -1
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +1278 -1
  11. package/dist/index.js.map +4 -4
  12. package/dist/maskinputs.d.ts +52 -0
  13. package/dist/maskinputs.d.ts.map +1 -0
  14. package/dist/memory.d.ts +153 -1
  15. package/dist/memory.d.ts.map +1 -1
  16. package/dist/originpolicy.d.ts +160 -0
  17. package/dist/originpolicy.d.ts.map +1 -0
  18. package/dist/phishguard.d.ts +24 -0
  19. package/dist/phishguard.d.ts.map +1 -0
  20. package/dist/policy.d.ts +123 -1
  21. package/dist/policy.d.ts.map +1 -1
  22. package/dist/protocol.d.ts +164 -1
  23. package/dist/protocol.d.ts.map +1 -1
  24. package/dist/redactshots.d.ts +54 -0
  25. package/dist/redactshots.d.ts.map +1 -0
  26. package/dist/secretvault.d.ts +89 -0
  27. package/dist/secretvault.d.ts.map +1 -0
  28. package/dist/transparency.d.ts +46 -0
  29. package/dist/transparency.d.ts.map +1 -0
  30. package/dist/types.d.ts +316 -2
  31. package/dist/types.d.ts.map +1 -1
  32. package/dist/version.d.ts +1 -1
  33. package/extension/dist/background.js +1650 -56
  34. package/extension/dist/background.js.map +4 -4
  35. package/extension/dist/manifest.json +5 -1
  36. package/extension/dist/pagebridge.js +91 -28
  37. package/extension/dist/pagebridge.js.map +3 -3
  38. package/extension/dist/popup.html +1 -1
  39. package/extension/dist/popup.js +54 -0
  40. package/extension/dist/popup.js.map +2 -2
  41. package/extension/dist/sidepanel.html +1 -1
  42. package/extension/dist/sidepanel.js +331 -0
  43. package/extension/dist/sidepanel.js.map +4 -4
  44. package/extension/dist/transparencypage.html +24 -0
  45. package/extension/dist/transparencypage.js +156 -0
  46. package/extension/dist/transparencypage.js.map +7 -0
  47. package/extension/manifest.json +5 -1
  48. 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.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>
4
+ <body><main><header><p class="eyebrow">DEVTHINK 1.1.62</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><p id="securitystate" role="status" class="muted">Security: denydefault posture.</p><div id="workflowcontrols" class="actions"></div><div id="windowcontrols" class="actions"></div><div id="environmentcontrols" class="actions"></div><div id="securitycontrols" class="actions"></div><p id="status" role="status">Loading session state.</p></main><script type="module" src="popup.js"></script></body>
5
5
  </html>
@@ -40,6 +40,8 @@ var mcpstatenode = document.querySelector("#mcpstate");
40
40
  var modelstatenode = document.querySelector("#modelstate");
41
41
  var swarmstatenode = document.querySelector("#swarmstate");
42
42
  var environmentstatenode = document.querySelector("#environmentstate");
43
+ var securitystatenode = document.querySelector("#securitystate");
44
+ var securitycontrols = document.querySelector("#securitycontrols");
43
45
  var environmentcontrols = document.querySelector("#environmentcontrols");
44
46
  var workflowcontrols = document.querySelector("#workflowcontrols");
45
47
  var windowcontrols = document.querySelector("#windowcontrols");
@@ -305,6 +307,57 @@ function renderenvironmentstate(view) {
305
307
  }
306
308
  }
307
309
  }
310
+ function rendersecuritystate(view, activeorigin) {
311
+ if (!securitystatenode) return;
312
+ if (!view) {
313
+ securitystatenode.textContent = "Security: state unknown.";
314
+ return;
315
+ }
316
+ const origin = activeorigin ?? view.sessionorigin ?? "the active tab";
317
+ const granted = view.allowlist.some((entry) => entry.origin === origin);
318
+ const profile = view.profiles.find((candidate) => candidate.origin === origin);
319
+ const windowstate = view.windows.find((candidate) => candidate.origin === origin && candidate.state === "active");
320
+ const verified = view.chain.filter((chain) => chain.valid).length;
321
+ securitystatenode.textContent = `Security: ${origin} ${granted ? "allowlisted" : "ungranted (denydefault)"}${profile !== void 0 ? ` \xB7 profile ${profile.grants.length} granted / ${profile.denials.length} denied` : " \xB7 no origin profile"}${windowstate !== void 0 ? ` \xB7 consent window until ${new Date(windowstate.expiresat).toLocaleTimeString()}` : " \xB7 no active consent window"} \xB7 ${verified}/${view.chain.length} log chain${view.chain.length === 1 ? "" : "s"} verified.`;
322
+ if (granted) delete securitystatenode.dataset.state;
323
+ else securitystatenode.dataset.state = "error";
324
+ if (securitycontrols) {
325
+ securitycontrols.replaceChildren();
326
+ if (!granted) {
327
+ const grant = document.createElement("button");
328
+ grant.className = "secondary";
329
+ grant.textContent = `Grant ${origin} allowlist entry`;
330
+ grant.addEventListener("click", () => {
331
+ void request({ kind: "security", allowlist: { add: { origin } } }).then(() => restore()).catch((error) => status(error instanceof Error ? error.message : String(error), true));
332
+ });
333
+ securitycontrols.append(grant);
334
+ }
335
+ if (profile === void 0 && origin !== "the active tab") {
336
+ const safedefaults = document.createElement("button");
337
+ safedefaults.className = "secondary";
338
+ safedefaults.textContent = `Safedefaults on ${origin}: reads only \u2014 open the originprofile editor`;
339
+ safedefaults.addEventListener("click", () => {
340
+ try {
341
+ chrome.runtime.openOptionsPage(() => {
342
+ void chrome.runtime.lastError;
343
+ });
344
+ } catch {
345
+ status("The transparencypage did not open; open it from the extensions page.", true);
346
+ }
347
+ });
348
+ securitycontrols.append(safedefaults);
349
+ }
350
+ if (view.chain.length > 0) {
351
+ const seal = view.chain.find((chain) => chain.sealhash !== void 0);
352
+ if (seal?.sealhash !== void 0) {
353
+ const sealinfo = document.createElement("span");
354
+ sealinfo.className = "muted";
355
+ sealinfo.textContent = `Seal ${seal.sealhash.slice(0, 10)}\u2026`;
356
+ securitycontrols.append(sealinfo);
357
+ }
358
+ }
359
+ }
360
+ }
308
361
  function renderswarmstate(state) {
309
362
  if (!swarmstatenode) return;
310
363
  if (!state) {
@@ -361,6 +414,7 @@ async function restore() {
361
414
  rendermodelstate(context.llm);
362
415
  renderswarmstate(context.swarm);
363
416
  renderenvironmentstate(context.environments);
417
+ rendersecuritystate(context.security, context.session?.origin);
364
418
  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));
365
419
  const active = context.session && !context.session.stoppedat && context.session.expiresat > Date.now();
366
420
  if (pausebutton) {