@pablopunk/webr 0.3.22 → 0.3.24

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 (37) hide show
  1. package/README.md +2 -2
  2. package/bin/webr.mjs +0 -0
  3. package/dist/client/_astro/{App.Dn52Mq-G.css → App.D4QoJ_Pi.css} +1 -1
  4. package/dist/client/_astro/{App.lKW8lWGt.js → App.jwPvhUSw.js} +1 -1
  5. package/dist/client/harness-icons/agy.png +0 -0
  6. package/dist/client/harness-icons/amp.png +0 -0
  7. package/dist/client/harness-icons/claude.png +0 -0
  8. package/dist/client/harness-icons/cline.png +0 -0
  9. package/dist/client/harness-icons/codex.png +0 -0
  10. package/dist/client/harness-icons/copilot.png +0 -0
  11. package/dist/client/harness-icons/cursor.png +0 -0
  12. package/dist/client/harness-icons/devin.png +0 -0
  13. package/dist/client/harness-icons/droid.png +0 -0
  14. package/dist/client/harness-icons/gemini.png +0 -0
  15. package/dist/client/harness-icons/grok.png +0 -0
  16. package/dist/client/harness-icons/hermes.png +0 -0
  17. package/dist/client/harness-icons/kilo.png +0 -0
  18. package/dist/client/harness-icons/kimi.png +0 -0
  19. package/dist/client/harness-icons/kiro.png +0 -0
  20. package/dist/client/harness-icons/letta.png +0 -0
  21. package/dist/client/harness-icons/maki.png +0 -0
  22. package/dist/client/harness-icons/mastracode.png +0 -0
  23. package/dist/client/harness-icons/muse.png +0 -0
  24. package/dist/client/harness-icons/omp.png +0 -0
  25. package/dist/client/harness-icons/opencode.png +0 -0
  26. package/dist/client/harness-icons/pi.png +0 -0
  27. package/dist/client/harness-icons/qodercli.png +0 -0
  28. package/dist/client/harness-icons/qwen.png +0 -0
  29. package/dist/server/chunks/{App_B0fQPNEJ.mjs → App_Cx7v64RJ.mjs} +86 -31
  30. package/dist/server/chunks/{_id__CccLGRJH.mjs → _id__CRYTpUr8.mjs} +1 -1
  31. package/dist/server/chunks/{_tab__kNMNbgal.mjs → _tab__DTsEN4XD.mjs} +1 -1
  32. package/dist/server/chunks/{new_eGf9XMkI.mjs → new_DJF3GyZq.mjs} +1 -1
  33. package/dist/server/chunks/{settings_DrOhdnUA.mjs → settings_Cp-cBKpd.mjs} +1 -1
  34. package/dist/server/entry.mjs +5 -5
  35. package/package.json +2 -1
  36. package/src/server/host.ts +4 -0
  37. package/src/server/uploads.ts +2 -1
Binary file
@@ -1082,38 +1082,37 @@ function ComposerCombobox({ label, value, options, onChange, icon, allowCustom =
1082
1082
  });
1083
1083
  }
1084
1084
  //#endregion
1085
+ //#region src/shared/agent-kinds.ts
1086
+ var herdrAgentKinds = [
1087
+ "pi",
1088
+ "claude",
1089
+ "codex",
1090
+ "gemini",
1091
+ "cursor",
1092
+ "devin",
1093
+ "agy",
1094
+ "cline",
1095
+ "omp",
1096
+ "mastracode",
1097
+ "opencode",
1098
+ "copilot",
1099
+ "kimi",
1100
+ "kiro",
1101
+ "droid",
1102
+ "amp",
1103
+ "grok",
1104
+ "hermes",
1105
+ "kilo",
1106
+ "qodercli",
1107
+ "qwen",
1108
+ "letta",
1109
+ "maki",
1110
+ "muse"
1111
+ ];
1112
+ //#endregion
1085
1113
  //#region src/components/HarnessIcon.tsx
1086
- var marks = {
1087
- claude: /* @__PURE__ */ jsx("svg", {
1088
- viewBox: "0 0 256 257",
1089
- fill: "#D97757",
1090
- children: /* @__PURE__ */ jsx("path", { d: "m50.228 170.321 50.357-28.257.843-2.463-.843-1.361h-2.462l-8.426-.518-28.775-.778-24.952-1.037-24.175-1.296-6.092-1.297L0 125.796l.583-3.759 5.12-3.434 7.324.648 16.202 1.101 24.304 1.685 17.629 1.037 26.118 2.722h4.148l.583-1.685-1.426-1.037-1.101-1.037-25.147-17.045-27.22-18.017-14.258-10.37-7.713-5.25-3.888-4.925-1.685-10.758 7-7.713 9.397.649 2.398.648 9.527 7.323 20.35 15.75L94.817 91.9l3.889 3.24 1.555-1.102.195-.777-1.75-2.917-14.453-26.118-15.425-26.572-6.87-11.018-1.814-6.61c-.648-2.723-1.102-4.991-1.102-7.778l7.972-10.823L71.42 0 82.05 1.426l4.472 3.888 6.61 15.101 10.694 23.786 16.591 32.34 4.861 9.592 2.592 8.879.973 2.722h1.685v-1.556l1.36-18.211 2.528-22.36 2.463-28.776.843-8.1 4.018-9.722 7.971-5.25 6.222 2.981 5.12 7.324-.713 4.73-3.046 19.768-5.962 30.98-3.889 20.739h2.268l2.593-2.593 10.499-13.934 17.628-22.036 7.778-8.749 9.073-9.657 5.833-4.601h11.018l8.1 12.055-3.628 12.443-11.342 14.388-9.398 12.184-13.48 18.147-8.426 14.518.778 1.166 2.01-.194 30.46-6.481 16.462-2.982 19.637-3.37 8.88 4.148.971 4.213-3.5 8.62-20.998 5.184-24.628 4.926-36.682 8.685-.454.324.519.648 16.526 1.555 7.065.389h17.304l32.21 2.398 8.426 5.574 5.055 6.805-.843 5.184-12.962 6.611-17.498-4.148-40.83-9.721-14-3.5h-1.944v1.167l11.666 11.406 21.387 19.314 26.767 24.887 1.36 6.157-3.434 4.86-3.63-.518-23.526-17.693-9.073-7.972-20.545-17.304h-1.36v1.814l4.73 6.935 25.017 37.59 1.296 11.536-1.814 3.76-6.481 2.268-7.13-1.297-14.647-20.544-15.1-23.138-12.185-20.739-1.49.843-7.194 77.448-3.37 3.953-7.778 2.981-6.48-4.925-3.436-7.972 3.435-15.749 4.148-20.544 3.37-16.333 3.046-20.285 1.815-6.74-.13-.454-1.49.194-15.295 20.999-23.267 31.433-18.406 19.702-4.407 1.75-7.648-3.954.713-7.064 4.277-6.286 25.47-32.405 15.36-20.092 9.917-11.6-.065-1.686h-.583L44.07 198.125l-12.055 1.555-5.185-4.86.648-7.972 2.463-2.593 20.35-13.999-.064.065Z" })
1091
- }),
1092
- codex: /* @__PURE__ */ jsx("svg", {
1093
- viewBox: "0 0 24 24",
1094
- fill: "currentColor",
1095
- fillRule: "evenodd",
1096
- children: /* @__PURE__ */ jsx("path", { d: "M8.086.457a6.105 6.105 0 013.046-.415c1.333.153 2.521.72 3.564 1.7a.117.117 0 00.107.029c1.408-.346 2.762-.224 4.061.366l.063.03.154.076c1.357.703 2.33 1.77 2.918 3.198.278.679.418 1.388.421 2.126a5.655 5.655 0 01-.18 1.631.167.167 0 00.04.155 5.982 5.982 0 011.578 2.891c.385 1.901-.01 3.615-1.183 5.14l-.182.22a6.063 6.063 0 01-2.934 1.851.162.162 0 00-.108.102c-.255.736-.511 1.364-.987 1.992-1.199 1.582-2.962 2.462-4.948 2.451-1.583-.008-2.986-.587-4.21-1.736a.145.145 0 00-.14-.032c-.518.167-1.04.191-1.604.185a5.924 5.924 0 01-2.595-.622 6.058 6.058 0 01-2.146-1.781c-.203-.269-.404-.522-.551-.821a7.74 7.74 0 01-.495-1.283 6.11 6.11 0 01-.017-3.064.166.166 0 00.008-.074.115.115 0 00-.037-.064 5.958 5.958 0 01-1.38-2.202 5.196 5.196 0 01-.333-1.589 6.915 6.915 0 01.188-2.132c.45-1.484 1.309-2.648 2.577-3.493.282-.188.55-.334.802-.438.286-.12.573-.22.861-.304a.129.129 0 00.087-.087A6.016 6.016 0 015.635 2.31C6.315 1.464 7.132.846 8.086.457zm-.804 7.85a.848.848 0 00-1.473.842l1.694 2.965-1.688 2.848a.849.849 0 001.46.864l1.94-3.272a.849.849 0 00.007-.854l-1.94-3.393zm5.446 6.24a.849.849 0 000 1.695h4.848a.849.849 0 000-1.696h-4.848z" })
1097
- }),
1098
- opencode: /* @__PURE__ */ jsxs("svg", {
1099
- viewBox: "96 96 320 320",
1100
- fill: "currentColor",
1101
- fillRule: "evenodd",
1102
- children: [/* @__PURE__ */ jsx("path", {
1103
- d: "M320 224V352H192V224H320Z",
1104
- opacity: ".4"
1105
- }), /* @__PURE__ */ jsx("path", { d: "M384 416H128V96H384V416ZM320 160H192V352H320V160Z" })]
1106
- }),
1107
- pi: /* @__PURE__ */ jsx("svg", {
1108
- viewBox: "0 0 24 24",
1109
- fill: "none",
1110
- stroke: "currentColor",
1111
- strokeWidth: "2.4",
1112
- strokeLinecap: "round",
1113
- children: /* @__PURE__ */ jsx("path", { d: "M4 7h16M9 7v11M15 7v9.5a1.5 1.5 0 0 0 1.5 1.5H18" })
1114
- })
1115
- };
1116
1114
  function HarnessIcon({ harness, size = 14 }) {
1115
+ const [failed, setFailed] = useState(false);
1117
1116
  return /* @__PURE__ */ jsx("span", {
1118
1117
  className: "harness-icon",
1119
1118
  style: {
@@ -1121,7 +1120,13 @@ function HarnessIcon({ harness, size = 14 }) {
1121
1120
  height: size
1122
1121
  },
1123
1122
  "aria-hidden": "true",
1124
- children: marks[harness] ?? /* @__PURE__ */ jsx("span", {
1123
+ children: herdrAgentKinds.includes(harness) && !failed ? /* @__PURE__ */ jsx("img", {
1124
+ src: `/harness-icons/${harness}.png`,
1125
+ alt: "",
1126
+ width: size,
1127
+ height: size,
1128
+ onError: () => setFailed(true)
1129
+ }) : /* @__PURE__ */ jsx("span", {
1125
1130
  className: "harness-icon-letter",
1126
1131
  children: harness.charAt(0).toUpperCase()
1127
1132
  })
@@ -3990,6 +3995,48 @@ function bindTerminalGestures(host, screen, control, writable) {
3990
3995
  const button = event.button === 2 || event.buttons & 2 ? "right" : event.button === 1 || event.buttons & 4 ? "middle" : "left";
3991
3996
  control()?.mouse(event.type === "pointerdown" ? "down" : event.type === "pointerup" ? "up" : event.buttons ? "drag" : "move", button, column, row, event.ctrlKey ? 2 : 0);
3992
3997
  };
3998
+ const CLICK_MOVEMENT_LIMIT = 4;
3999
+ const cellAt = (event) => {
4000
+ const { element, cols, rows } = screen();
4001
+ const rect = element?.getBoundingClientRect();
4002
+ if (!rect?.width || !rect.height) return void 0;
4003
+ const column = Math.floor((event.clientX - rect.left) / rect.width * cols);
4004
+ const row = Math.floor((event.clientY - rect.top) / rect.height * rows);
4005
+ return column < 0 || row < 0 || column >= cols || row >= rows ? void 0 : {
4006
+ column,
4007
+ row
4008
+ };
4009
+ };
4010
+ let pendingClick;
4011
+ const clickDown = (event) => {
4012
+ pendingClick = void 0;
4013
+ if (!writable() || event.altKey || event.shiftKey || event.ctrlKey || event.metaKey || event.button > 2) return;
4014
+ const cell = cellAt(event);
4015
+ if (cell) pendingClick = {
4016
+ pointerId: event.pointerId,
4017
+ button: event.button,
4018
+ x: event.clientX,
4019
+ y: event.clientY,
4020
+ ...cell
4021
+ };
4022
+ };
4023
+ const clickMove = (event) => {
4024
+ if (!pendingClick || pendingClick.pointerId !== event.pointerId || !event.buttons) return;
4025
+ if (Math.hypot(event.clientX - pendingClick.x, event.clientY - pendingClick.y) > CLICK_MOVEMENT_LIMIT) pendingClick = void 0;
4026
+ };
4027
+ const clickUp = (event) => {
4028
+ const pending = pendingClick;
4029
+ pendingClick = void 0;
4030
+ if (!pending || pending.pointerId !== event.pointerId || !writable() || event.altKey || event.shiftKey || event.ctrlKey || event.metaKey || Math.hypot(event.clientX - pending.x, event.clientY - pending.y) > CLICK_MOVEMENT_LIMIT) return;
4031
+ const actions = control();
4032
+ if (!actions) return;
4033
+ const button = pending.button === 2 ? "right" : pending.button === 1 ? "middle" : "left";
4034
+ actions.mouse("down", button, pending.column, pending.row, 0);
4035
+ actions.mouse("up", button, pending.column, pending.row, 0);
4036
+ };
4037
+ const cancelClick = () => {
4038
+ pendingClick = void 0;
4039
+ };
3993
4040
  let pendingPixels = 0;
3994
4041
  let frame = 0;
3995
4042
  let pointerCell;
@@ -4029,6 +4076,10 @@ function bindTerminalGestures(host, screen, control, writable) {
4029
4076
  "pointerup",
4030
4077
  "pointermove"
4031
4078
  ]) host.addEventListener(type, pointer);
4079
+ host.addEventListener("pointerdown", clickDown);
4080
+ host.addEventListener("pointermove", clickMove);
4081
+ host.addEventListener("pointerup", clickUp);
4082
+ host.addEventListener("pointercancel", cancelClick);
4032
4083
  host.addEventListener("wheel", wheel, { passive: false });
4033
4084
  return () => {
4034
4085
  for (const type of [
@@ -4036,6 +4087,10 @@ function bindTerminalGestures(host, screen, control, writable) {
4036
4087
  "pointerup",
4037
4088
  "pointermove"
4038
4089
  ]) host.removeEventListener(type, pointer);
4090
+ host.removeEventListener("pointerdown", clickDown);
4091
+ host.removeEventListener("pointermove", clickMove);
4092
+ host.removeEventListener("pointerup", clickUp);
4093
+ host.removeEventListener("pointercancel", cancelClick);
4039
4094
  host.removeEventListener("wheel", wheel);
4040
4095
  cancelAnimationFrame(frame);
4041
4096
  };
@@ -1,6 +1,6 @@
1
1
  import { S as createAstro, V as __exportAll, i as renderComponent, u as renderTemplate } from "./server_dfdLOyV2.mjs";
2
2
  import { t as createComponent } from "./compiler_BnrQvXXD.mjs";
3
- import { n as $$Base, t as App } from "./App_B0fQPNEJ.mjs";
3
+ import { n as $$Base, t as App } from "./App_Cx7v64RJ.mjs";
4
4
  //#region src/pages/threads/[id].astro
5
5
  var _id__exports = /* @__PURE__ */ __exportAll({
6
6
  default: () => $$Id,
@@ -1,6 +1,6 @@
1
1
  import { S as createAstro, V as __exportAll, i as renderComponent, u as renderTemplate } from "./server_dfdLOyV2.mjs";
2
2
  import { t as createComponent } from "./compiler_BnrQvXXD.mjs";
3
- import { n as $$Base, t as App } from "./App_B0fQPNEJ.mjs";
3
+ import { n as $$Base, t as App } from "./App_Cx7v64RJ.mjs";
4
4
  //#region src/pages/sessions/[session]/tabs/[tab].astro
5
5
  var _tab__exports = /* @__PURE__ */ __exportAll({
6
6
  default: () => $$Tab,
@@ -1,6 +1,6 @@
1
1
  import { S as createAstro, V as __exportAll, i as renderComponent, u as renderTemplate } from "./server_dfdLOyV2.mjs";
2
2
  import { t as createComponent } from "./compiler_BnrQvXXD.mjs";
3
- import { n as $$Base, t as App } from "./App_B0fQPNEJ.mjs";
3
+ import { n as $$Base, t as App } from "./App_Cx7v64RJ.mjs";
4
4
  //#region src/pages/new.astro
5
5
  var new_exports = /* @__PURE__ */ __exportAll({
6
6
  default: () => $$New,
@@ -1,6 +1,6 @@
1
1
  import { S as createAstro, V as __exportAll, i as renderComponent, u as renderTemplate } from "./server_dfdLOyV2.mjs";
2
2
  import { t as createComponent } from "./compiler_BnrQvXXD.mjs";
3
- import { n as $$Base, t as App } from "./App_B0fQPNEJ.mjs";
3
+ import { n as $$Base, t as App } from "./App_Cx7v64RJ.mjs";
4
4
  //#region src/pages/settings.astro
5
5
  var settings_exports = /* @__PURE__ */ __exportAll({
6
6
  default: () => $$Settings,
@@ -2426,10 +2426,10 @@ var renderers = [Object.assign({
2426
2426
  //#endregion
2427
2427
  //#region \0virtual:astro:pages
2428
2428
  var _page0 = () => import("./chunks/node_C8FqXy_n.mjs").then((n) => n.t);
2429
- var _page1 = () => import("./chunks/new_eGf9XMkI.mjs");
2430
- var _page2 = () => import("./chunks/_tab__kNMNbgal.mjs");
2431
- var _page3 = () => import("./chunks/settings_DrOhdnUA.mjs");
2432
- var _page4 = () => import("./chunks/_id__CccLGRJH.mjs");
2429
+ var _page1 = () => import("./chunks/new_DJF3GyZq.mjs");
2430
+ var _page2 = () => import("./chunks/_tab__DTsEN4XD.mjs");
2431
+ var _page3 = () => import("./chunks/settings_Cp-cBKpd.mjs");
2432
+ var _page4 = () => import("./chunks/_id__CRYTpUr8.mjs");
2433
2433
  var _page5 = () => import("./chunks/index_Bvv1gpI0.mjs");
2434
2434
  var pageMap = /* @__PURE__ */ new Map([
2435
2435
  ["node_modules/.pnpm/astro@7.3.5_@types+node@22.20.4_tsx@4.23.15_yaml@2.9.1/node_modules/astro/dist/assets/endpoint/node.js", _page0],
@@ -2441,7 +2441,7 @@ var pageMap = /* @__PURE__ */ new Map([
2441
2441
  ]);
2442
2442
  //#endregion
2443
2443
  //#region \0virtual:astro:manifest
2444
- var _manifest = deserializeManifest({"rootDir":"file:///home/runner/work/webr/webr/","cacheDir":"file:///home/runner/work/webr/webr/node_modules/.astro/","outDir":"file:///home/runner/work/webr/webr/dist/","srcDir":"file:///home/runner/work/webr/webr/src/","publicDir":"file:///home/runner/work/webr/webr/public/","buildClientDir":"file:///home/runner/work/webr/webr/dist/client/","buildServerDir":"file:///home/runner/work/webr/webr/dist/server/","adapterName":"@astrojs/node","assetsDir":"_astro","routes":[{"file":"","links":[],"scripts":[],"styles":[],"routeData":{"type":"page","component":"_server-islands.astro","params":["name"],"segments":[[{"content":"_server-islands","dynamic":false,"spread":false}],[{"content":"name","dynamic":true,"spread":false}]],"pattern":"^\\/_server-islands\\/([^/]+?)\\/?$","prerender":false,"isIndex":false,"fallbackRoutes":[],"route":"/_server-islands/[name]","origin":"internal","distURL":[],"_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[],"styles":[],"routeData":{"route":"/_image","component":"node_modules/.pnpm/astro@7.3.5_@types+node@22.20.4_tsx@4.23.15_yaml@2.9.1/node_modules/astro/dist/assets/endpoint/node.js","params":[],"pathname":"/_image","pattern":"^\\/_image\\/?$","segments":[[{"content":"_image","dynamic":false,"spread":false}]],"type":"endpoint","prerender":false,"fallbackRoutes":[],"distURL":[],"isIndex":false,"origin":"internal","_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[],"styles":[{"type":"external","src":"_astro/App.Dn52Mq-G.css"}],"routeData":{"route":"/new","isIndex":false,"type":"page","pattern":"^\\/new\\/?$","segments":[[{"content":"new","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/new.astro","pathname":"/new","prerender":false,"fallbackRoutes":[],"distURL":[],"origin":"project","_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[],"styles":[{"type":"external","src":"_astro/App.Dn52Mq-G.css"}],"routeData":{"route":"/sessions/[session]/tabs/[tab]","isIndex":false,"type":"page","pattern":"^\\/sessions\\/([^/]+?)\\/tabs\\/([^/]+?)\\/?$","segments":[[{"content":"sessions","dynamic":false,"spread":false}],[{"content":"session","dynamic":true,"spread":false}],[{"content":"tabs","dynamic":false,"spread":false}],[{"content":"tab","dynamic":true,"spread":false}]],"params":["session","tab"],"component":"src/pages/sessions/[session]/tabs/[tab].astro","prerender":false,"fallbackRoutes":[],"distURL":[],"origin":"project","_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[],"styles":[{"type":"external","src":"_astro/App.Dn52Mq-G.css"}],"routeData":{"route":"/settings","isIndex":false,"type":"page","pattern":"^\\/settings\\/?$","segments":[[{"content":"settings","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/settings.astro","pathname":"/settings","prerender":false,"fallbackRoutes":[],"distURL":[],"origin":"project","_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[],"styles":[{"type":"external","src":"_astro/App.Dn52Mq-G.css"}],"routeData":{"route":"/threads/[id]","isIndex":false,"type":"page","pattern":"^\\/threads\\/([^/]+?)\\/?$","segments":[[{"content":"threads","dynamic":false,"spread":false}],[{"content":"id","dynamic":true,"spread":false}]],"params":["id"],"component":"src/pages/threads/[id].astro","prerender":false,"fallbackRoutes":[],"distURL":[],"origin":"project","_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[],"styles":[],"routeData":{"route":"/","isIndex":true,"type":"page","pattern":"^\\/$","segments":[],"params":[],"component":"src/pages/index.astro","pathname":"/","prerender":false,"fallbackRoutes":[],"distURL":[],"origin":"project","_meta":{"trailingSlash":"ignore"}}}],"serverLike":true,"middlewareMode":"classic","base":"/","trailingSlash":"ignore","compressHTML":"jsx","componentMetadata":[["/home/runner/work/webr/webr/src/pages/new.astro",{"propagation":"none","containsHead":true}],["/home/runner/work/webr/webr/src/pages/sessions/[session]/tabs/[tab].astro",{"propagation":"none","containsHead":true}],["/home/runner/work/webr/webr/src/pages/settings.astro",{"propagation":"none","containsHead":true}],["/home/runner/work/webr/webr/src/pages/threads/[id].astro",{"propagation":"none","containsHead":true}]],"renderers":[],"clientDirectives":[["idle","(()=>{var l=(n,t)=>{let i=async()=>{await(await n())()},e=typeof t.value==\"object\"?t.value:void 0,s={timeout:e==null?void 0:e.timeout};\"requestIdleCallback\"in window?window.requestIdleCallback(i,s):setTimeout(i,s.timeout||200)};(self.Astro||(self.Astro={})).idle=l;window.dispatchEvent(new Event(\"astro:idle\"));})();"],["load","(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).load=e;window.dispatchEvent(new Event(\"astro:load\"));})();"],["media","(()=>{var n=(a,t)=>{let i=async()=>{await(await a())()};if(t.value){let e=matchMedia(t.value);e.matches?i():e.addEventListener(\"change\",i,{once:!0})}};(self.Astro||(self.Astro={})).media=n;window.dispatchEvent(new Event(\"astro:media\"));})();"],["only","(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).only=e;window.dispatchEvent(new Event(\"astro:only\"));})();"],["visible","(()=>{var a=(s,i,o)=>{let r=async()=>{await(await s())()},t=typeof i.value==\"object\"?i.value:void 0,c={rootMargin:t==null?void 0:t.rootMargin},n=new IntersectionObserver(e=>{for(let l of e)if(l.isIntersecting){n.disconnect(),r();break}},c);for(let e of o.children)n.observe(e)};(self.Astro||(self.Astro={})).visible=a;window.dispatchEvent(new Event(\"astro:visible\"));})();"]],"entryModules":{"\u0000noop-middleware":"virtual_astro_middleware.mjs","\u0000virtual:astro:server-island-manifest":"chunks/_virtual_astro_server-island-manifest_C1Q2srgE.mjs","\u0000virtual:astro:session-driver":"chunks/_virtual_astro_session-driver_Dp7RXjOf.mjs","\u0000virtual:astro:actions/noop-entrypoint":"chunks/noop-entrypoint_Z3zFhrGC.mjs","/home/runner/work/webr/webr/node_modules/.pnpm/@astrojs+react@7.0.0_@types+node@22.20.4_@types+react-dom@19.3.0_@types+react@19.3.0__@_02aa85dceaccf3d763325676dd8540a8/node_modules/@astrojs/react/dist/vnode-children.js":"chunks/vnode-children_BSi0H4PL.mjs","@astrojs/node/server.js":"entry.mjs","\u0000virtual:astro:page:src/pages/threads/[id]@_@astro":"chunks/_id__CccLGRJH.mjs","\u0000virtual:astro:page:src/pages/sessions/[session]/tabs/[tab]@_@astro":"chunks/_tab__kNMNbgal.mjs","\u0000virtual:astro:page:src/pages/index@_@astro":"chunks/index_Bvv1gpI0.mjs","\u0000virtual:astro:page:src/pages/new@_@astro":"chunks/new_eGf9XMkI.mjs","\u0000virtual:astro:page:node_modules/.pnpm/astro@7.3.5_@types+node@22.20.4_tsx@4.23.15_yaml@2.9.1/node_modules/astro/dist/assets/endpoint/node@_@js":"chunks/node_C8FqXy_n.mjs","\u0000virtual:astro:page:src/pages/settings@_@astro":"chunks/settings_DrOhdnUA.mjs","/home/runner/work/webr/webr/node_modules/.pnpm/astro@7.3.5_@types+node@22.20.4_tsx@4.23.15_yaml@2.9.1/node_modules/astro/dist/assets/services/sharp.js":"chunks/sharp_8J8zk4Wd.mjs","/home/runner/work/webr/webr/src/components/App.tsx":"_astro/App.lKW8lWGt.js","/home/runner/work/webr/webr/node_modules/.pnpm/astro@7.3.5_@types+node@22.20.4_tsx@4.23.15_yaml@2.9.1/node_modules/astro/components/ClientRouter.astro?astro&type=script&index=0&lang.ts":"_astro/ClientRouter.astro_astro_type_script_index_0_lang.CTgtIFyY.js","@astrojs/react/client.js":"_astro/client.BDkzSRUN.js","/home/runner/work/webr/webr/node_modules/.pnpm/@xterm+addon-fit@0.10.0_@xterm+xterm@5.5.0/node_modules/@xterm/addon-fit/lib/addon-fit.js":"_astro/addon-fit.jgKqzwky.js","/home/runner/work/webr/webr/node_modules/.pnpm/@xterm+addon-web-links@0.11.0_@xterm+xterm@5.5.0/node_modules/@xterm/addon-web-links/lib/addon-web-links.js":"_astro/addon-web-links.C9lyQRxI.js","/home/runner/work/webr/webr/node_modules/.pnpm/@xterm+addon-webgl@0.18.0_@xterm+xterm@5.5.0/node_modules/@xterm/addon-webgl/lib/addon-webgl.js":"_astro/addon-webgl.Bd5ox92E.js","/home/runner/work/webr/webr/node_modules/.pnpm/@xterm+xterm@5.5.0/node_modules/@xterm/xterm/lib/xterm.js":"_astro/xterm.B-l5AIf6.js","astro:scripts/before-hydration.js":""},"inlinedScripts":[],"assets":["/apple-touch-icon.png","/brand-mark.png","/favicon-16.png","/favicon-32.png","/favicon.ico","/icon-192.png","/icon-512.png","/icon-maskable-512.png","/manifest.webmanifest","/_astro/App.lKW8lWGt.js","/_astro/ClientRouter.astro_astro_type_script_index_0_lang.CTgtIFyY.js","/_astro/addon-fit.jgKqzwky.js","/_astro/addon-web-links.C9lyQRxI.js","/_astro/addon-webgl.Bd5ox92E.js","/_astro/client.BDkzSRUN.js","/_astro/client.Bbg9OBwT.js","/_astro/client.CLSsMr2g.js","/_astro/xterm.B-l5AIf6.js","/_astro/App.Dn52Mq-G.css","/_astro/jetbrains-mono.CFJaiWaY.woff2","/_astro/symbols-nerd.CEdkKAK8.woff2"],"buildFormat":"directory","checkOrigin":true,"actionBodySizeLimit":1048576,"serverIslandBodySizeLimit":1048576,"allowedDomains":[],"key":"XOe5OvDGGAXKaYHQ9p7riDvToipII6mz/XN2UHHCrCU=","sessionConfig":{"driver":"unstorage/drivers/fs-lite","options":{"base":"/home/runner/work/webr/webr/node_modules/.astro/sessions"}},"image":{},"devToolbar":{"enabled":false,"debugInfoOutput":""},"logLevel":"info","shouldInjectCspMetaTags":false});
2444
+ var _manifest = deserializeManifest({"rootDir":"file:///home/runner/work/webr/webr/","cacheDir":"file:///home/runner/work/webr/webr/node_modules/.astro/","outDir":"file:///home/runner/work/webr/webr/dist/","srcDir":"file:///home/runner/work/webr/webr/src/","publicDir":"file:///home/runner/work/webr/webr/public/","buildClientDir":"file:///home/runner/work/webr/webr/dist/client/","buildServerDir":"file:///home/runner/work/webr/webr/dist/server/","adapterName":"@astrojs/node","assetsDir":"_astro","routes":[{"file":"","links":[],"scripts":[],"styles":[],"routeData":{"type":"page","component":"_server-islands.astro","params":["name"],"segments":[[{"content":"_server-islands","dynamic":false,"spread":false}],[{"content":"name","dynamic":true,"spread":false}]],"pattern":"^\\/_server-islands\\/([^/]+?)\\/?$","prerender":false,"isIndex":false,"fallbackRoutes":[],"route":"/_server-islands/[name]","origin":"internal","distURL":[],"_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[],"styles":[],"routeData":{"route":"/_image","component":"node_modules/.pnpm/astro@7.3.5_@types+node@22.20.4_tsx@4.23.15_yaml@2.9.1/node_modules/astro/dist/assets/endpoint/node.js","params":[],"pathname":"/_image","pattern":"^\\/_image\\/?$","segments":[[{"content":"_image","dynamic":false,"spread":false}]],"type":"endpoint","prerender":false,"fallbackRoutes":[],"distURL":[],"isIndex":false,"origin":"internal","_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[],"styles":[{"type":"external","src":"_astro/App.D4QoJ_Pi.css"}],"routeData":{"route":"/new","isIndex":false,"type":"page","pattern":"^\\/new\\/?$","segments":[[{"content":"new","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/new.astro","pathname":"/new","prerender":false,"fallbackRoutes":[],"distURL":[],"origin":"project","_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[],"styles":[{"type":"external","src":"_astro/App.D4QoJ_Pi.css"}],"routeData":{"route":"/sessions/[session]/tabs/[tab]","isIndex":false,"type":"page","pattern":"^\\/sessions\\/([^/]+?)\\/tabs\\/([^/]+?)\\/?$","segments":[[{"content":"sessions","dynamic":false,"spread":false}],[{"content":"session","dynamic":true,"spread":false}],[{"content":"tabs","dynamic":false,"spread":false}],[{"content":"tab","dynamic":true,"spread":false}]],"params":["session","tab"],"component":"src/pages/sessions/[session]/tabs/[tab].astro","prerender":false,"fallbackRoutes":[],"distURL":[],"origin":"project","_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[],"styles":[{"type":"external","src":"_astro/App.D4QoJ_Pi.css"}],"routeData":{"route":"/settings","isIndex":false,"type":"page","pattern":"^\\/settings\\/?$","segments":[[{"content":"settings","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/settings.astro","pathname":"/settings","prerender":false,"fallbackRoutes":[],"distURL":[],"origin":"project","_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[],"styles":[{"type":"external","src":"_astro/App.D4QoJ_Pi.css"}],"routeData":{"route":"/threads/[id]","isIndex":false,"type":"page","pattern":"^\\/threads\\/([^/]+?)\\/?$","segments":[[{"content":"threads","dynamic":false,"spread":false}],[{"content":"id","dynamic":true,"spread":false}]],"params":["id"],"component":"src/pages/threads/[id].astro","prerender":false,"fallbackRoutes":[],"distURL":[],"origin":"project","_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[],"styles":[],"routeData":{"route":"/","isIndex":true,"type":"page","pattern":"^\\/$","segments":[],"params":[],"component":"src/pages/index.astro","pathname":"/","prerender":false,"fallbackRoutes":[],"distURL":[],"origin":"project","_meta":{"trailingSlash":"ignore"}}}],"serverLike":true,"middlewareMode":"classic","base":"/","trailingSlash":"ignore","compressHTML":"jsx","componentMetadata":[["/home/runner/work/webr/webr/src/pages/new.astro",{"propagation":"none","containsHead":true}],["/home/runner/work/webr/webr/src/pages/sessions/[session]/tabs/[tab].astro",{"propagation":"none","containsHead":true}],["/home/runner/work/webr/webr/src/pages/settings.astro",{"propagation":"none","containsHead":true}],["/home/runner/work/webr/webr/src/pages/threads/[id].astro",{"propagation":"none","containsHead":true}]],"renderers":[],"clientDirectives":[["idle","(()=>{var l=(n,t)=>{let i=async()=>{await(await n())()},e=typeof t.value==\"object\"?t.value:void 0,s={timeout:e==null?void 0:e.timeout};\"requestIdleCallback\"in window?window.requestIdleCallback(i,s):setTimeout(i,s.timeout||200)};(self.Astro||(self.Astro={})).idle=l;window.dispatchEvent(new Event(\"astro:idle\"));})();"],["load","(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).load=e;window.dispatchEvent(new Event(\"astro:load\"));})();"],["media","(()=>{var n=(a,t)=>{let i=async()=>{await(await a())()};if(t.value){let e=matchMedia(t.value);e.matches?i():e.addEventListener(\"change\",i,{once:!0})}};(self.Astro||(self.Astro={})).media=n;window.dispatchEvent(new Event(\"astro:media\"));})();"],["only","(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).only=e;window.dispatchEvent(new Event(\"astro:only\"));})();"],["visible","(()=>{var a=(s,i,o)=>{let r=async()=>{await(await s())()},t=typeof i.value==\"object\"?i.value:void 0,c={rootMargin:t==null?void 0:t.rootMargin},n=new IntersectionObserver(e=>{for(let l of e)if(l.isIntersecting){n.disconnect(),r();break}},c);for(let e of o.children)n.observe(e)};(self.Astro||(self.Astro={})).visible=a;window.dispatchEvent(new Event(\"astro:visible\"));})();"]],"entryModules":{"\u0000noop-middleware":"virtual_astro_middleware.mjs","\u0000virtual:astro:server-island-manifest":"chunks/_virtual_astro_server-island-manifest_C1Q2srgE.mjs","\u0000virtual:astro:session-driver":"chunks/_virtual_astro_session-driver_Dp7RXjOf.mjs","\u0000virtual:astro:actions/noop-entrypoint":"chunks/noop-entrypoint_Z3zFhrGC.mjs","/home/runner/work/webr/webr/node_modules/.pnpm/@astrojs+react@7.0.0_@types+node@22.20.4_@types+react-dom@19.3.0_@types+react@19.3.0__@_02aa85dceaccf3d763325676dd8540a8/node_modules/@astrojs/react/dist/vnode-children.js":"chunks/vnode-children_BSi0H4PL.mjs","@astrojs/node/server.js":"entry.mjs","\u0000virtual:astro:page:src/pages/threads/[id]@_@astro":"chunks/_id__CRYTpUr8.mjs","\u0000virtual:astro:page:src/pages/sessions/[session]/tabs/[tab]@_@astro":"chunks/_tab__DTsEN4XD.mjs","\u0000virtual:astro:page:src/pages/index@_@astro":"chunks/index_Bvv1gpI0.mjs","\u0000virtual:astro:page:src/pages/new@_@astro":"chunks/new_DJF3GyZq.mjs","\u0000virtual:astro:page:node_modules/.pnpm/astro@7.3.5_@types+node@22.20.4_tsx@4.23.15_yaml@2.9.1/node_modules/astro/dist/assets/endpoint/node@_@js":"chunks/node_C8FqXy_n.mjs","\u0000virtual:astro:page:src/pages/settings@_@astro":"chunks/settings_Cp-cBKpd.mjs","/home/runner/work/webr/webr/node_modules/.pnpm/astro@7.3.5_@types+node@22.20.4_tsx@4.23.15_yaml@2.9.1/node_modules/astro/dist/assets/services/sharp.js":"chunks/sharp_8J8zk4Wd.mjs","/home/runner/work/webr/webr/src/components/App.tsx":"_astro/App.jwPvhUSw.js","/home/runner/work/webr/webr/node_modules/.pnpm/astro@7.3.5_@types+node@22.20.4_tsx@4.23.15_yaml@2.9.1/node_modules/astro/components/ClientRouter.astro?astro&type=script&index=0&lang.ts":"_astro/ClientRouter.astro_astro_type_script_index_0_lang.CTgtIFyY.js","@astrojs/react/client.js":"_astro/client.BDkzSRUN.js","/home/runner/work/webr/webr/node_modules/.pnpm/@xterm+addon-fit@0.10.0_@xterm+xterm@5.5.0/node_modules/@xterm/addon-fit/lib/addon-fit.js":"_astro/addon-fit.jgKqzwky.js","/home/runner/work/webr/webr/node_modules/.pnpm/@xterm+addon-web-links@0.11.0_@xterm+xterm@5.5.0/node_modules/@xterm/addon-web-links/lib/addon-web-links.js":"_astro/addon-web-links.C9lyQRxI.js","/home/runner/work/webr/webr/node_modules/.pnpm/@xterm+addon-webgl@0.18.0_@xterm+xterm@5.5.0/node_modules/@xterm/addon-webgl/lib/addon-webgl.js":"_astro/addon-webgl.Bd5ox92E.js","/home/runner/work/webr/webr/node_modules/.pnpm/@xterm+xterm@5.5.0/node_modules/@xterm/xterm/lib/xterm.js":"_astro/xterm.B-l5AIf6.js","astro:scripts/before-hydration.js":""},"inlinedScripts":[],"assets":["/apple-touch-icon.png","/brand-mark.png","/favicon-16.png","/favicon-32.png","/favicon.ico","/icon-192.png","/icon-512.png","/icon-maskable-512.png","/manifest.webmanifest","/_astro/App.jwPvhUSw.js","/_astro/ClientRouter.astro_astro_type_script_index_0_lang.CTgtIFyY.js","/_astro/addon-fit.jgKqzwky.js","/_astro/addon-web-links.C9lyQRxI.js","/_astro/addon-webgl.Bd5ox92E.js","/_astro/client.BDkzSRUN.js","/_astro/client.Bbg9OBwT.js","/_astro/client.CLSsMr2g.js","/_astro/xterm.B-l5AIf6.js","/harness-icons/agy.png","/harness-icons/amp.png","/harness-icons/claude.png","/harness-icons/cline.png","/harness-icons/codex.png","/harness-icons/copilot.png","/harness-icons/cursor.png","/harness-icons/devin.png","/harness-icons/droid.png","/harness-icons/gemini.png","/harness-icons/grok.png","/harness-icons/hermes.png","/harness-icons/kilo.png","/harness-icons/kimi.png","/harness-icons/kiro.png","/harness-icons/letta.png","/harness-icons/maki.png","/harness-icons/mastracode.png","/harness-icons/muse.png","/harness-icons/omp.png","/harness-icons/opencode.png","/harness-icons/pi.png","/harness-icons/qodercli.png","/harness-icons/qwen.png","/_astro/App.D4QoJ_Pi.css","/_astro/jetbrains-mono.CFJaiWaY.woff2","/_astro/symbols-nerd.CEdkKAK8.woff2"],"buildFormat":"directory","checkOrigin":true,"actionBodySizeLimit":1048576,"serverIslandBodySizeLimit":1048576,"allowedDomains":[],"key":"Nxsl/JxO9GHpKU6e08P+VCTe/8UwEJ/7EnItBXfi8TY=","sessionConfig":{"driver":"unstorage/drivers/fs-lite","options":{"base":"/home/runner/work/webr/webr/node_modules/.astro/sessions"}},"image":{},"devToolbar":{"enabled":false,"debugInfoOutput":""},"logLevel":"info","shouldInjectCspMetaTags":false});
2445
2445
  var manifestRoutes = _manifest.routes;
2446
2446
  var manifest = Object.assign(_manifest, {
2447
2447
  renderers,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pablopunk/webr",
3
- "version": "0.3.22",
3
+ "version": "0.3.24",
4
4
  "description": "Control your Herdr agents from anywhere.",
5
5
  "keywords": [
6
6
  "herdr",
@@ -46,6 +46,7 @@
46
46
  "check": "astro check && tsc --noEmit",
47
47
  "test": "vitest run",
48
48
  "icons": "tsx scripts/build-icons.ts",
49
+ "harness-icons": "tsx scripts/fetch-harness-icons.ts",
49
50
  "validate:offline": "tsx scripts/validate-protocol.ts",
50
51
  "prepack": "astro build",
51
52
  "smoke:install": "tsx scripts/smoke-install.ts",
@@ -201,6 +201,10 @@ export async function createHost(manager: RuntimeManager, origin: string, ssr?:
201
201
  return reply.sendFile(path, resolve(clientRoot, '_astro'));
202
202
  });
203
203
  app.get('/:file(^[a-z0-9-]+\\.(?:png|ico|webmanifest)$)', async (request, reply) => reply.sendFile((request.params as { file: string }).file, clientRoot));
204
+ app.get('/harness-icons/:file(^[a-z0-9-]+\\.png$)', async (request, reply) => {
205
+ const { file } = z.object({ file: z.string() }).parse(request.params);
206
+ return reply.sendFile(file, resolve(clientRoot, 'harness-icons'));
207
+ });
204
208
  app.get('/*', async (request, reply) => {
205
209
  reply.hijack();
206
210
  if (perfLogEnabled) reply.raw.setHeader('Document-Policy', 'js-profiling');
@@ -1,5 +1,6 @@
1
1
  import { randomUUID } from 'node:crypto';
2
2
  import { mkdir, readdir, rm, stat, writeFile } from 'node:fs/promises';
3
+ import { tmpdir } from 'node:os';
3
4
  import { join, resolve } from 'node:path';
4
5
 
5
6
  export const MAX_IMAGE_BYTES = 20 * 1024 * 1024;
@@ -32,7 +33,7 @@ export function uploadFileName(contentType: string | undefined, name: string | u
32
33
  }
33
34
 
34
35
  export class UploadStore {
35
- constructor(readonly directory = resolve(process.env.WEBR_UPLOADS ?? '.data/uploads'), private lifetimeMs = UPLOAD_LIFETIME_MS) {}
36
+ constructor(readonly directory = resolve(process.env.WEBR_UPLOADS ?? join(tmpdir(), 'webr-uploads')), private lifetimeMs = UPLOAD_LIFETIME_MS) {}
36
37
  save(contentType: string | undefined, bytes: Buffer, name?: string) { return this.saveAs(uploadFileName(contentType, name, bytes), bytes); }
37
38
  async saveAs(fileName: string, bytes: Buffer) {
38
39
  await mkdir(this.directory, { recursive: true, mode: 0o700 });