wherdr 1.3.3 → 2.0.0

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 (252) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/BDNMzG2s.js +1 -0
  3. package/.output/public/_nuxt/BETID3_E.js +1 -0
  4. package/.output/public/_nuxt/BHenDMeH.js +1 -0
  5. package/.output/public/_nuxt/BYZVrreW.js +1 -0
  6. package/.output/public/_nuxt/BhgehRdJ.js +1 -0
  7. package/.output/public/_nuxt/{yzABg5xl.js → Bpoxvzh6.js} +1 -1
  8. package/.output/public/_nuxt/BtH82ZuZ.js +9 -0
  9. package/.output/public/_nuxt/C25ROUa9.js +3 -0
  10. package/.output/public/_nuxt/C3Bkn4ac.js +62 -0
  11. package/.output/public/_nuxt/CDWjMk9C.js +2 -0
  12. package/.output/public/_nuxt/{Ci8N4mWR.js → CXJnLmWv.js} +1 -1
  13. package/.output/public/_nuxt/CuUQ4mEf.js +1 -0
  14. package/.output/public/_nuxt/DFGEl0v2.js +23 -0
  15. package/.output/public/_nuxt/{CKhgznq4.js → DFmgQVme.js} +42 -39
  16. package/.output/public/_nuxt/DZGKxROq.js +6 -0
  17. package/.output/public/_nuxt/DmkWvmnE.js +2 -0
  18. package/.output/public/_nuxt/DrKKeFFE.js +31 -0
  19. package/.output/public/_nuxt/DyfFwwGq.js +1 -0
  20. package/.output/public/_nuxt/FaNto0ga.js +105 -0
  21. package/.output/public/_nuxt/NIF0VwHk.js +25 -0
  22. package/.output/public/_nuxt/R0Y4VoeX.js +1 -0
  23. package/.output/public/_nuxt/board.CEEcFc6M.css +1 -0
  24. package/.output/public/_nuxt/builds/latest.json +1 -1
  25. package/.output/public/_nuxt/builds/meta/0b28b3e9-664e-4347-a35b-afb0a711d5c5.json +1 -0
  26. package/.output/public/_nuxt/entry.CKoXcwRa.css +2 -0
  27. package/.output/public/_nuxt/pdf.min.t82Z80JU.mjs +28 -0
  28. package/.output/public/_nuxt/pdf.worker.min.wgc6bjNh.mjs +28 -0
  29. package/.output/public/_nuxt/settings.Cdb21nNw.css +1 -0
  30. package/.output/public/sw.js +1 -1
  31. package/.output/server/chunks/_/branding.mjs +1 -1
  32. package/.output/server/chunks/_/changes.mjs +4 -4
  33. package/.output/server/chunks/_/fileDownload.mjs +278 -0
  34. package/.output/server/chunks/_/files.mjs +60 -20
  35. package/.output/server/chunks/_/machineOrder.mjs +1 -1
  36. package/.output/server/chunks/_/onboarding.mjs +1 -1
  37. package/.output/server/chunks/_/package.mjs +11 -3
  38. package/.output/server/chunks/_/plugins.mjs +92 -122
  39. package/.output/server/chunks/_/restart.mjs +1 -1
  40. package/.output/server/chunks/_/selfupdate.mjs +1 -1
  41. package/.output/server/chunks/_/settingstabs.mjs +36 -0
  42. package/.output/server/chunks/_/updates.mjs +1 -1
  43. package/.output/server/chunks/_/worktrees.mjs +1 -1
  44. package/.output/server/chunks/_/ws.mjs +43 -6
  45. package/.output/server/chunks/nitro/nitro.mjs +14126 -10238
  46. package/.output/server/chunks/raw/check-doc-links.mjs +5 -0
  47. package/.output/server/chunks/raw/check-leaks.mjs +1 -1
  48. package/.output/server/chunks/raw/check-release-notes.mjs +5 -0
  49. package/.output/server/chunks/raw/herdr-plugin.mjs +1 -1
  50. package/.output/server/chunks/raw/install-claude-statusline.mjs +1 -1
  51. package/.output/server/chunks/raw/prerelease-summary.mjs +5 -0
  52. package/.output/server/chunks/raw/prerelease.mjs +7 -0
  53. package/.output/server/chunks/raw/reveal.mjs +1 -1
  54. package/.output/server/chunks/raw/test-affected.mjs +5 -0
  55. package/.output/server/chunks/routes/api/_..._.mjs +6 -5
  56. package/.output/server/chunks/routes/api/agents.post.mjs +6 -5
  57. package/.output/server/chunks/routes/api/ask-tab.post.mjs +6 -5
  58. package/.output/server/chunks/routes/api/attach.post.mjs +6 -5
  59. package/.output/server/chunks/routes/api/auth/disable.post.mjs +6 -5
  60. package/.output/server/chunks/routes/api/auth/lock-all.post.mjs +6 -5
  61. package/.output/server/chunks/routes/api/auth/lock.post.mjs +6 -5
  62. package/.output/server/chunks/routes/api/auth/login/options.post.mjs +6 -5
  63. package/.output/server/chunks/routes/api/auth/login/verify.post.mjs +6 -5
  64. package/.output/server/chunks/routes/api/auth/max-session.post.mjs +6 -5
  65. package/.output/server/chunks/routes/api/auth/register/options.post.mjs +6 -5
  66. package/.output/server/chunks/routes/api/auth/register/verify.post.mjs +6 -5
  67. package/.output/server/chunks/routes/api/auth/status.get.mjs +6 -5
  68. package/.output/server/chunks/routes/api/changes.get.mjs +7 -6
  69. package/.output/server/chunks/routes/api/chat/image.get.mjs +7 -6
  70. package/.output/server/chunks/routes/api/chat.get.mjs +44 -11
  71. package/.output/server/chunks/routes/api/choose.post.mjs +44 -30
  72. package/.output/server/chunks/routes/api/claude-setup.post.mjs +42 -0
  73. package/.output/server/chunks/routes/api/claude-statusline.post.mjs +7 -6
  74. package/.output/server/chunks/routes/api/clear-queued-input.post.mjs +42 -0
  75. package/.output/server/chunks/routes/api/close/status.get.mjs +7 -6
  76. package/.output/server/chunks/routes/api/close.post.mjs +6 -5
  77. package/.output/server/chunks/routes/api/codex-update.post.mjs +7 -6
  78. package/.output/server/chunks/routes/api/commands.get.mjs +9 -7
  79. package/.output/server/chunks/routes/api/config.get.mjs +10 -13
  80. package/.output/server/chunks/routes/api/dirs.get.mjs +7 -6
  81. package/.output/server/chunks/routes/api/dismiss-stopped.post.mjs +7 -6
  82. package/.output/server/chunks/routes/api/dismiss.post.mjs +7 -6
  83. package/.output/server/chunks/routes/api/effort.post.mjs +7 -6
  84. package/.output/server/chunks/routes/api/efforts.get.mjs +7 -6
  85. package/.output/server/chunks/routes/api/file.post.mjs +7 -6
  86. package/.output/server/chunks/routes/api/files/download.get.mjs +12 -24
  87. package/.output/server/chunks/routes/api/files/download.head.mjs +41 -0
  88. package/.output/server/chunks/routes/api/files/read.get.mjs +8 -7
  89. package/.output/server/chunks/routes/api/files.get.mjs +7 -6
  90. package/.output/server/chunks/routes/api/health.get.mjs +6 -5
  91. package/.output/server/chunks/routes/api/input.post.mjs +33 -15
  92. package/.output/server/chunks/routes/api/interrupt.post.mjs +24 -21
  93. package/.output/server/chunks/routes/api/isgit.get.mjs +8 -8
  94. package/.output/server/chunks/routes/api/machine/awake.get.mjs +7 -6
  95. package/.output/server/chunks/routes/api/machine/awake.post.mjs +7 -6
  96. package/.output/server/chunks/routes/api/machine/order.get.mjs +6 -5
  97. package/.output/server/chunks/routes/api/machine/order.post.mjs +6 -5
  98. package/.output/server/chunks/routes/api/machine/reconnect.post.mjs +40 -0
  99. package/.output/server/chunks/routes/api/machine/rename.post.mjs +7 -6
  100. package/.output/server/chunks/routes/api/machine/status.post.mjs +39 -0
  101. package/.output/server/chunks/routes/api/menu-left.post.mjs +40 -0
  102. package/.output/server/chunks/routes/api/menu.post.mjs +10 -6
  103. package/.output/server/chunks/routes/api/model.post.mjs +7 -6
  104. package/.output/server/chunks/routes/api/models.get.mjs +7 -6
  105. package/.output/server/chunks/routes/api/nav.post.mjs +40 -26
  106. package/.output/server/chunks/routes/api/onboarding.get.mjs +6 -5
  107. package/.output/server/chunks/routes/api/onboarding.post.mjs +6 -5
  108. package/.output/server/chunks/routes/api/phone.get.mjs +8 -10
  109. package/.output/server/chunks/routes/api/phone.post.mjs +8 -10
  110. package/.output/server/chunks/routes/api/plugins/actions.get.mjs +6 -8
  111. package/.output/server/chunks/routes/api/plugins/invoke.post.mjs +6 -8
  112. package/.output/server/chunks/routes/api/plugins/projects.get.mjs +10 -8
  113. package/.output/server/chunks/routes/api/plugins/projects.post.mjs +11 -7
  114. package/.output/server/chunks/routes/api/prompt.post.mjs +22 -13
  115. package/.output/server/chunks/routes/api/push/quiet.post.mjs +7 -6
  116. package/.output/server/chunks/routes/api/push/subscribe.post.mjs +7 -7
  117. package/.output/server/chunks/routes/api/push/test.post.mjs +7 -6
  118. package/.output/server/chunks/routes/api/push/unsubscribe.post.mjs +7 -6
  119. package/.output/server/chunks/routes/api/quotas.get.mjs +7 -6
  120. package/.output/server/chunks/routes/api/rename.post.mjs +6 -5
  121. package/.output/server/chunks/routes/api/requeue.post.mjs +7 -6
  122. package/.output/server/chunks/routes/api/restart.get.mjs +6 -5
  123. package/.output/server/chunks/routes/api/restart.post.mjs +6 -5
  124. package/.output/server/chunks/routes/api/reveal.post.mjs +91 -8
  125. package/.output/server/chunks/routes/api/screen-key.post.mjs +19 -15
  126. package/.output/server/chunks/routes/api/screen.get.mjs +8 -40
  127. package/.output/server/chunks/routes/api/search.get.mjs +7 -6
  128. package/.output/server/chunks/routes/api/seen.post.mjs +7 -6
  129. package/.output/server/chunks/routes/api/sessions.get.mjs +7 -6
  130. package/.output/server/chunks/routes/api/sessions.post.mjs +7 -6
  131. package/.output/server/chunks/routes/api/settings-tab.post.mjs +90 -0
  132. package/.output/server/chunks/routes/api/{plugins/thread-limits.get.mjs → settings.get.mjs} +10 -9
  133. package/.output/server/chunks/routes/api/settings.post.mjs +40 -0
  134. package/.output/server/chunks/routes/api/space.post.mjs +34 -18
  135. package/.output/server/chunks/routes/api/state.get.mjs +7 -6
  136. package/.output/server/chunks/routes/api/tasks/action.post.mjs +39 -0
  137. package/.output/server/chunks/routes/api/{plugins/profiles.get.mjs → tasks/add.post.mjs} +12 -14
  138. package/.output/server/chunks/routes/api/tasks/after.post.mjs +39 -0
  139. package/.output/server/chunks/routes/api/tasks/approve.post.mjs +39 -0
  140. package/.output/server/chunks/routes/api/{project/report.get.mjs → tasks/archived.get.mjs} +12 -13
  141. package/.output/server/chunks/routes/api/{gitroot.get.mjs → tasks/autopilot.get.mjs} +13 -14
  142. package/.output/server/chunks/routes/api/tasks/autopilot.post.mjs +39 -0
  143. package/.output/server/chunks/routes/api/{index.get.mjs → tasks/board-settings.get.mjs} +12 -13
  144. package/.output/server/chunks/routes/api/tasks/board-settings.post.mjs +39 -0
  145. package/.output/server/chunks/routes/api/tasks/coordinator.get.mjs +40 -0
  146. package/.output/server/chunks/routes/api/tasks/coordinator.post.mjs +39 -0
  147. package/.output/server/chunks/routes/api/tasks/details.get.mjs +40 -0
  148. package/.output/server/chunks/routes/api/tasks/limit.post.mjs +39 -0
  149. package/.output/server/chunks/routes/api/tasks/links.get.mjs +39 -0
  150. package/.output/server/chunks/routes/api/tasks/models.get.mjs +40 -0
  151. package/.output/server/chunks/routes/api/tasks/pick.post.mjs +39 -0
  152. package/.output/server/chunks/routes/api/tasks/question.post.mjs +39 -0
  153. package/.output/server/chunks/routes/api/tasks/scheduled.get.mjs +40 -0
  154. package/.output/server/chunks/routes/api/{project → tasks}/settings.get.mjs +10 -11
  155. package/.output/server/chunks/routes/api/tasks/start.get.mjs +40 -0
  156. package/.output/server/chunks/routes/api/tasks/tell.post.mjs +39 -0
  157. package/.output/server/chunks/routes/api/tasks.get.mjs +39 -0
  158. package/.output/server/chunks/routes/api/unqueue.post.mjs +7 -6
  159. package/.output/server/chunks/routes/api/update/status.get.mjs +6 -5
  160. package/.output/server/chunks/routes/api/update.get.mjs +8 -10
  161. package/.output/server/chunks/routes/api/update.post.mjs +8 -10
  162. package/.output/server/chunks/routes/api/upload.post.mjs +7 -6
  163. package/.output/server/chunks/routes/api/worktrees/remove.post.mjs +6 -5
  164. package/.output/server/chunks/routes/api/worktrees.get.mjs +6 -5
  165. package/.output/server/chunks/routes/favicon.ico.get.mjs +6 -5
  166. package/.output/server/chunks/routes/icons/_name_.get.mjs +7 -6
  167. package/.output/server/chunks/routes/renderer.mjs +8 -7
  168. package/.output/server/chunks/routes/uploads/_...name_.get.mjs +7 -6
  169. package/.output/server/chunks/routes/ws/_..._.mjs +7 -6
  170. package/.output/server/chunks/routes/ws/events.mjs +9 -7
  171. package/.output/server/chunks/routes/ws/term.mjs +7 -6
  172. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  173. package/.output/server/index.mjs +7 -6
  174. package/.output/server/package.json +1 -1
  175. package/README.md +44 -1424
  176. package/bin/lib/commands.mjs +44 -9
  177. package/bin/lib/panel.mjs +3 -11
  178. package/bin/lib/service.mjs +41 -2
  179. package/bin/lib/skill.mjs +1 -1
  180. package/bin/lib/tailnet.d.mts +6 -3
  181. package/bin/lib/tailnet.mjs +70 -32
  182. package/bin/lib/userpath.d.mts +14 -0
  183. package/bin/lib/userpath.mjs +142 -0
  184. package/docs/README.md +58 -0
  185. package/docs/RELEASING.md +174 -0
  186. package/docs/board.md +164 -0
  187. package/docs/command.md +58 -0
  188. package/docs/configuration.md +39 -0
  189. package/docs/conversation.md +132 -0
  190. package/docs/development.md +38 -0
  191. package/docs/devices.md +58 -0
  192. package/docs/files.md +29 -0
  193. package/docs/herdr-projects-1x.md +278 -0
  194. package/docs/home.md +52 -0
  195. package/docs/installation.md +174 -0
  196. package/docs/machines.md +69 -0
  197. package/docs/migrate-from-1.x-docker.md +160 -0
  198. package/docs/networks.md +154 -0
  199. package/docs/notifications.md +83 -0
  200. package/docs/overview.md +71 -0
  201. package/docs/phone.md +26 -0
  202. package/docs/plugins.md +109 -0
  203. package/docs/quick-start.md +89 -0
  204. package/docs/quotas.md +65 -0
  205. package/docs/release-notes-2.0.0.md +84 -0
  206. package/docs/security.md +117 -0
  207. package/docs/terminal.md +15 -0
  208. package/docs/troubleshooting.md +45 -0
  209. package/package.json +11 -3
  210. package/skills/wherdr/SKILL.md +24 -167
  211. package/.output/public/_nuxt/B4Yk2tB1.js +0 -23
  212. package/.output/public/_nuxt/BBw_0a4M.js +0 -6
  213. package/.output/public/_nuxt/BSy6OCIY.js +0 -1
  214. package/.output/public/_nuxt/BX5PM2JQ.js +0 -1
  215. package/.output/public/_nuxt/BgPDnf2S.js +0 -1
  216. package/.output/public/_nuxt/BkOxQzbS.js +0 -2
  217. package/.output/public/_nuxt/CP8o925U.js +0 -1
  218. package/.output/public/_nuxt/CWwyK2XK.js +0 -2
  219. package/.output/public/_nuxt/CkbmecwS.js +0 -1
  220. package/.output/public/_nuxt/Cr3SrGky.js +0 -1
  221. package/.output/public/_nuxt/DAg9fiVh.js +0 -89
  222. package/.output/public/_nuxt/DT8qZ0Wv.js +0 -1
  223. package/.output/public/_nuxt/DaaJIRB3.js +0 -1
  224. package/.output/public/_nuxt/DcJi16XA.js +0 -1
  225. package/.output/public/_nuxt/SiL1FJ5s.js +0 -3
  226. package/.output/public/_nuxt/VpjCgSXu.js +0 -36
  227. package/.output/public/_nuxt/builds/meta/c735b6c0-1bd0-47d7-a208-d310f0a06287.json +0 -1
  228. package/.output/public/_nuxt/dPxB2L94.js +0 -89
  229. package/.output/public/_nuxt/entry.CGWKmYU3.css +0 -2
  230. package/.output/public/_nuxt/xYX85SPI.js +0 -1
  231. package/.output/server/chunks/_/pluginPolicy.mjs +0 -93
  232. package/.output/server/chunks/_/projectBoard.mjs +0 -366
  233. package/.output/server/chunks/_/projectDocs.mjs +0 -106
  234. package/.output/server/chunks/_/projectInbox.mjs +0 -135
  235. package/.output/server/chunks/_/projectThreads.mjs +0 -46
  236. package/.output/server/chunks/_/projectThreads2.mjs +0 -61
  237. package/.output/server/chunks/_/projectsActions.mjs +0 -143
  238. package/.output/server/chunks/_/projectsPlugin.mjs +0 -56
  239. package/.output/server/chunks/_/reveal.mjs +0 -115
  240. package/.output/server/chunks/raw/dev.wherdr.open.mjs +0 -7
  241. package/.output/server/chunks/raw/docker-entrypoint.mjs +0 -7
  242. package/.output/server/chunks/raw/install-host-open.mjs +0 -7
  243. package/.output/server/chunks/raw/wherdr-open.mjs +0 -7
  244. package/.output/server/chunks/routes/api/board.get.mjs +0 -147
  245. package/.output/server/chunks/routes/api/plugins/thread-limits.post.mjs +0 -45
  246. package/.output/server/chunks/routes/api/project/inbox.get.mjs +0 -43
  247. package/.output/server/chunks/routes/api/project/inbox.post.mjs +0 -43
  248. package/.output/server/chunks/routes/api/project/memory.get.mjs +0 -42
  249. package/.output/server/chunks/routes/api/project/routines.get.mjs +0 -43
  250. package/.output/server/chunks/routes/api/project/thread.get.mjs +0 -44
  251. package/.output/server/chunks/routes/api/project/thread.post.mjs +0 -45
  252. package/bin/install-docker-skill.sh +0 -20
@@ -1,135 +0,0 @@
1
- import { p as projectSlugOk, l as lastLine } from './projectThreads.mjs';
2
- import { t as tomlStrings, a as target, p as projectsRoot, c as runProjectCommand } from './projectBoard.mjs';
3
- import { H as HerdrError } from '../nitro/nitro.mjs';
4
- import { s as stripAnsi } from './pluginPolicy.mjs';
5
-
6
- const INBOX_ID_RE = /^[A-Za-z0-9][A-Za-z0-9._-]{0,199}$/;
7
- const inboxIdOk = (id) => typeof id === "string" && INBOX_ID_RE.test(id) && !id.includes("..");
8
- const INBOX_BODY_MAX = 2e3;
9
- function parseInboxItem(fileText) {
10
- const text = String(fileText || "").replace(/\r\n?/g, "\n");
11
- if (!text.startsWith("+++\n")) return null;
12
- const rest = text.slice(4);
13
- const cut = rest.indexOf("\n+++\n");
14
- const front = cut >= 0 ? rest.slice(0, cut) : rest.endsWith("\n+++") ? rest.slice(0, -4) : null;
15
- if (front === null) return null;
16
- const f = tomlStrings(front);
17
- if (!inboxIdOk(f.id)) return null;
18
- const oneLine = (s, max) => (s || "").replace(/\s+/g, " ").trim().slice(0, max);
19
- const body = cut >= 0 ? rest.slice(cut + 5).replace(/^\n+|\n+$/g, "") : "";
20
- return {
21
- id: f.id,
22
- kind: oneLine(f.kind, 40),
23
- subject: oneLine(f.subject, 120),
24
- event: oneLine(f.event, 120),
25
- summary: oneLine(f.summary, 1e3),
26
- created: oneLine(f.created, 40),
27
- body: body.length > INBOX_BODY_MAX ? `${body.slice(0, INBOX_BODY_MAX)}\u2026` : body
28
- };
29
- }
30
- const sortInbox = (items) => [...items].sort((a, b) => a.id < b.id ? -1 : a.id > b.id ? 1 : 0);
31
- function inboxDoneArgs(root, slug, ids) {
32
- if (!root.startsWith("/")) throw new Error("invalid projects root");
33
- if (!projectSlugOk(slug)) throw new Error("invalid project");
34
- if (!ids.length || ids.length > 50 || !ids.every(inboxIdOk)) throw new Error("invalid inbox item");
35
- return ["--root", root, "inbox", "done", slug, ...ids];
36
- }
37
- function routineListArgs(root, slug) {
38
- if (!root.startsWith("/")) throw new Error("invalid projects root");
39
- if (!projectSlugOk(slug)) throw new Error("invalid project");
40
- return ["--root", root, "routine", "list", slug];
41
- }
42
- function parseRoutineList(output) {
43
- const routines = [];
44
- const broken = [];
45
- for (const line of String(output || "").replace(/\r\n?/g, "\n").split("\n")) {
46
- const cols = line.split(" ");
47
- if (cols.length === 2 && cols[1].startsWith("config-error:")) {
48
- broken.push({ file: cols[0].trim().slice(0, 120), error: cols[1].slice("config-error:".length).trim().slice(0, 300) });
49
- continue;
50
- }
51
- if (cols.length !== 5 || !cols[0].trim() || cols[2] !== "enabled" && cols[2] !== "disabled") continue;
52
- routines.push({
53
- name: cols[0].trim().slice(0, 120),
54
- schedule: cols[1].trim().slice(0, 120),
55
- enabled: cols[2] === "enabled",
56
- kind: cols[3].trim().slice(0, 160),
57
- when: cols[4].split(" \xB7 ").map((s) => s.trim().slice(0, 160)).filter(Boolean)
58
- });
59
- }
60
- return { routines, broken };
61
- }
62
-
63
- const INBOX_MAX = 100;
64
- const ITEM_BYTES = 8 * 1024;
65
- const READS_AT_ONCE = 8;
66
- const seen = /* @__PURE__ */ new Map();
67
- const SEEN_MAX = 2e3;
68
- async function inboxOn(t) {
69
- var _a;
70
- const dir = `${t.dir}/inbox`;
71
- const names = await t.m.fs.readdir(dir).catch(() => []);
72
- const ids = names.filter((n) => n.endsWith(".md")).map((n) => n.slice(0, -3)).filter(inboxIdOk).sort();
73
- const items = [];
74
- const wanted = ids.slice(0, INBOX_MAX);
75
- const stats = await t.m.fs.statMany(wanted.map((id) => `${dir}/${id}.md`));
76
- const base = `${(_a = t.m.key) != null ? _a : ""}|${dir}/`;
77
- const todo = [];
78
- const found = /* @__PURE__ */ new Map();
79
- wanted.forEach((id, i) => {
80
- const st = stats[i];
81
- if (!st || !st.isFile || st.size <= 0) return;
82
- const known = seen.get(base + id);
83
- if (known && known.size === st.size && known.mtimeMs === st.mtimeMs) {
84
- if (known.item) found.set(id, known.item);
85
- } else todo.push({ id, size: st.size, mtimeMs: st.mtimeMs });
86
- });
87
- for (let i = 0; i < todo.length; i += READS_AT_ONCE) {
88
- await Promise.all(todo.slice(i, i + READS_AT_ONCE).map(async ({ id, size, mtimeMs }) => {
89
- const text = await t.m.fs.read(`${dir}/${id}.md`, 0, Math.min(size, ITEM_BYTES)).then((b) => b.toString("utf8")).catch(() => null);
90
- if (text === null) return;
91
- const parsed = parseInboxItem(text.length >= ITEM_BYTES && !text.includes("\n+++\n") ? "" : text);
92
- const item = parsed && parsed.id === id ? parsed : null;
93
- seen.set(base + id, { size, mtimeMs, item });
94
- if (item) found.set(id, item);
95
- }));
96
- }
97
- for (const item of found.values()) items.push(item);
98
- const here = new Set(ids);
99
- for (const key of seen.keys()) if (key.startsWith(base) && !here.has(key.slice(base.length))) seen.delete(key);
100
- while (seen.size > SEEN_MAX) seen.delete(seen.keys().next().value);
101
- return { items: sortInbox(items), total: items.length + (ids.length - wanted.length) };
102
- }
103
- async function inboxDoneOn(t, id) {
104
- let args;
105
- try {
106
- args = inboxDoneArgs(projectsRoot(t), t.slug, [id]);
107
- } catch (e) {
108
- throw new HerdrError("bad_item", e.message);
109
- }
110
- const r = await runProjectCommand(t, args, 15e3);
111
- if (r.code !== 0) throw new HerdrError("inbox_failed", lastLine(stripAnsi(r.stderr || r.stdout)) || `code ${r.code}`);
112
- return { ok: true };
113
- }
114
- async function routinesOn(t) {
115
- let args;
116
- try {
117
- args = routineListArgs(projectsRoot(t), t.slug);
118
- } catch (e) {
119
- throw new HerdrError("bad_project", e.message);
120
- }
121
- const r = await runProjectCommand(t, args, 15e3);
122
- if (r.code !== 0) throw new HerdrError("routines_failed", lastLine(stripAnsi(r.stderr || r.stdout)) || `code ${r.code}`);
123
- return parseRoutineList(stripAnsi(r.stdout));
124
- }
125
- async function need(pane) {
126
- const t = await target(pane);
127
- if (!t) throw new HerdrError("no_project", "project not found");
128
- return t;
129
- }
130
- const readInbox = async (pane) => inboxOn(await need(pane));
131
- const markInboxDone = async (pane, id) => inboxDoneOn(await need(pane), id);
132
- const readRoutines = async (pane) => routinesOn(await need(pane));
133
-
134
- export { readRoutines as a, markInboxDone as m, readInbox as r };
135
- //# sourceMappingURL=projectInbox.mjs.map
@@ -1,46 +0,0 @@
1
- import { n as normalizeThreads } from './projectBoard.mjs';
2
-
3
- const THREAD_ID_RE = /^t-\d{4,}$/;
4
- const PROJECT_SLUG_RE = /^[A-Za-z0-9][A-Za-z0-9._-]{0,119}$/;
5
- const projectSlugOk = (slug) => PROJECT_SLUG_RE.test(slug) && !slug.includes("..");
6
- const THREAD_ACTIONS = ["stop", "restart", "ack", "resolve"];
7
- const isThreadAction = (v) => THREAD_ACTIONS.includes(v);
8
- const THREAD_TIMEOUT_MS = { show: 15e3, stop: 2e4, ack: 15e3, restart: 9e4, resolve: 18e4 };
9
- function threadCommandArgs(command, root, slug, id) {
10
- if (!root.startsWith("/")) throw new Error("invalid projects root");
11
- if (!projectSlugOk(slug)) throw new Error("invalid project");
12
- if (!THREAD_ID_RE.test(id)) throw new Error("invalid thread");
13
- if (command !== "show" && !isThreadAction(command)) throw new Error("invalid action");
14
- return ["--root", root, "thread", command, slug, id, ...command === "show" ? ["--json"] : []];
15
- }
16
- const str = (v) => typeof v === "string" ? v : "";
17
- const NEXT_MAX = 20;
18
- function normalizeThreadDetail(raw) {
19
- const base = normalizeThreads([raw])[0];
20
- if (!base) return null;
21
- const r = raw;
22
- const hash = str(r.report_hash);
23
- return {
24
- ...base,
25
- note: str(r.note).trim(),
26
- error: str(r.error).trim().slice(0, 600),
27
- kind: str(r.kind),
28
- agent: str(r.agent),
29
- branch: str(r.branch),
30
- base: str(r.base),
31
- prState: str(r.pr_state),
32
- prReview: str(r.pr_review),
33
- next: (Array.isArray(r.next) ? r.next : []).filter((x) => typeof x === "string" && Boolean(x.trim())).slice(0, NEXT_MAX).map((x) => x.trim().slice(0, 300)),
34
- acked: Boolean(hash) && str(r.acked_report_hash) === hash,
35
- hasPane: Boolean(str(r.pane_id)),
36
- keptWorktree: r.kept_worktree === true,
37
- resolvedReason: str(r.resolved_reason)
38
- };
39
- }
40
- function lastLine(text) {
41
- const lines = text.split("\n").map((l) => l.trim()).filter(Boolean);
42
- return (lines[lines.length - 1] || "").replace(/^error:\s*/i, "").slice(0, 400);
43
- }
44
-
45
- export { THREAD_ID_RE as T, THREAD_TIMEOUT_MS as a, isThreadAction as i, lastLine as l, normalizeThreadDetail as n, projectSlugOk as p, threadCommandArgs as t };
46
- //# sourceMappingURL=projectThreads.mjs.map
@@ -1,61 +0,0 @@
1
- import { i as isThreadAction, T as THREAD_ID_RE, l as lastLine, n as normalizeThreadDetail, a as THREAD_TIMEOUT_MS, t as threadCommandArgs } from './projectThreads.mjs';
2
- import { H as HerdrError } from '../nitro/nitro.mjs';
3
- import { s as stripAnsi } from './pluginPolicy.mjs';
4
- import { a as target, c as runProjectCommand, p as projectsRoot } from './projectBoard.mjs';
5
-
6
- function argsFor(command, t, id) {
7
- try {
8
- return threadCommandArgs(command, projectsRoot(t), t.slug, id);
9
- } catch (e) {
10
- throw new HerdrError("bad_thread", e.message);
11
- }
12
- }
13
- async function threadDetailOn(t, id) {
14
- const r = await runProjectCommand(t, argsFor("show", t, id), THREAD_TIMEOUT_MS.show);
15
- if (r.code !== 0) throw new HerdrError("thread_failed", lastLine(stripAnsi(r.stderr || r.stdout)) || `code ${r.code}`);
16
- let raw;
17
- try {
18
- raw = JSON.parse(r.stdout);
19
- } catch {
20
- throw new HerdrError("thread_failed", "unreadable thread record");
21
- }
22
- const detail = normalizeThreadDetail(raw);
23
- if (!detail || detail.id !== id) throw new HerdrError("thread_failed", "unreadable thread record");
24
- return detail;
25
- }
26
- const busy = /* @__PURE__ */ new Set();
27
- async function threadActionOn(t, id, action) {
28
- var _a;
29
- const args = argsFor(action, t, id);
30
- const key = `${(_a = t.m.key) != null ? _a : ""}|${t.dir}|${id}`;
31
- if (busy.has(key)) throw new HerdrError("thread_busy", "an action is already running on this thread");
32
- busy.add(key);
33
- try {
34
- const r = await runProjectCommand(t, args, THREAD_TIMEOUT_MS[action]);
35
- const out = stripAnsi(r.stdout).trim();
36
- if (r.code !== 0) {
37
- throw new HerdrError("thread_failed", lastLine(stripAnsi(r.stderr || r.stdout)) || `code ${r.code}`);
38
- }
39
- return { output: out.slice(-2e3) };
40
- } finally {
41
- busy.delete(key);
42
- }
43
- }
44
- async function where(pane, id) {
45
- if (typeof id !== "string" || !THREAD_ID_RE.test(id)) throw new HerdrError("bad_thread", "invalid thread");
46
- const t = await target(pane);
47
- if (!t) throw new HerdrError("no_project", "project not found");
48
- return { t, id };
49
- }
50
- async function readThreadDetail(pane, rawId) {
51
- const { t, id } = await where(pane, rawId);
52
- return { thread: await threadDetailOn(t, id) };
53
- }
54
- async function runThreadAction(pane, rawId, action, guard = (_t, run) => run()) {
55
- if (!isThreadAction(action)) throw new HerdrError("bad_action", "Invalid action");
56
- const { t, id } = await where(pane, rawId);
57
- return guard(t, () => threadActionOn(t, id, action));
58
- }
59
-
60
- export { runThreadAction as a, readThreadDetail as r };
61
- //# sourceMappingURL=projectThreads2.mjs.map
@@ -1,143 +0,0 @@
1
- import { E as fmt } from '../nitro/nitro.mjs';
2
-
3
- const PROJECT_INPUTS = {
4
- new: ["name"],
5
- "adopt-workspace": ["name"],
6
- open: ["slug"],
7
- pause: ["slug"],
8
- resume: ["slug"]
9
- };
10
- const PROJECT_OPTIONAL = { new: ["goal", "repo", "machine", "coordinatorProfile", "threadProfile"], "adopt-workspace": ["goal", "task"] };
11
- const PROJECT_REQUIRED = {
12
- new: ["name"],
13
- "adopt-workspace": ["name"],
14
- open: ["slug"],
15
- pause: ["slug"],
16
- resume: ["slug"]
17
- };
18
- const INPUT_MAX = { name: 120, slug: 120, goal: 400, task: 400, repo: 1024, machine: 64, coordinatorProfile: 40, threadProfile: 40 };
19
- function cleanProjectInput(action, raw) {
20
- const fields = PROJECT_INPUTS[action];
21
- if (!fields) return null;
22
- const input = raw && typeof raw === "object" && !Array.isArray(raw) ? raw : {};
23
- const out = {};
24
- for (const key of [...fields, ...PROJECT_OPTIONAL[action] || []]) {
25
- const v = input[key];
26
- if (v === void 0 && !fields.includes(key)) continue;
27
- if (typeof v !== "string") return null;
28
- const s = v.replace(/\s+/g, " ").trim();
29
- if (s.length > (INPUT_MAX[key] || 120)) return null;
30
- if ((key === "name" || key === "slug") && s.startsWith("-")) return null;
31
- if (s) out[key] = s;
32
- }
33
- if (out.name && !projectNameOk(out.name)) return null;
34
- if (out.coordinatorProfile && !profileNameOk(out.coordinatorProfile) || out.threadProfile && !profileNameOk(out.threadProfile)) return null;
35
- return (PROJECT_REQUIRED[action] || []).every((k) => out[k]) ? out : null;
36
- }
37
- function projectNameOk(name) {
38
- const s = (name || "").trim();
39
- return Boolean(s) && !/[/\\]|\.\./.test(s) && /[a-z0-9]/i.test(s);
40
- }
41
- function profileNameOk(name) {
42
- return /^(?![-.])[A-Za-z0-9._-]{1,40}$/.test(name || "");
43
- }
44
- function parseProfileList(text) {
45
- var _a, _b, _c;
46
- const lines = text.split("\n");
47
- const head = lines.findIndex((l) => l.startsWith("Profiles ("));
48
- const defaults = ((_a = /^Defaults for new projects: (.*)$/m.exec(text)) == null ? void 0 : _a[1]) || "";
49
- const thread = (_b = /\bthread_profile = ([^\s,]+)/.exec(defaults)) == null ? void 0 : _b[1];
50
- const coordinator = (_c = /\bcoordinator_profile = ([^\s,]+)/.exec(defaults)) == null ? void 0 : _c[1];
51
- if (head < 0 || !thread || !coordinator) return null;
52
- const profiles = [];
53
- for (const line of lines.slice(head + 1)) {
54
- const m = /^ {2}(\S+) +(\S+)/.exec(line);
55
- if (!m) break;
56
- if (profileNameOk(m[1])) profiles.push({ name: m[1], agent: m[2] });
57
- }
58
- const allowed = (who) => {
59
- var _a2, _b2, _c2;
60
- const v = (_c2 = (_b2 = (_a2 = new RegExp(`^Allowed for ${who} in projects without their own list: (.*)$`, "m").exec(text)) == null ? void 0 : _a2[1]) == null ? void 0 : _b2.trim()) != null ? _c2 : "every profile";
61
- if (v === "every profile") return null;
62
- return v === "none" ? [] : v.split(",").map((s) => s.trim()).filter(Boolean);
63
- };
64
- return {
65
- profiles,
66
- defaults: { thread, coordinator },
67
- allowed: { thread: allowed("threads"), coordinator: allowed("the coordinator") }
68
- };
69
- }
70
- function repoArgument(path, repo, project) {
71
- const same = repo.local ? project.local : !project.local && repo.profileId === project.profileId;
72
- if (same) return /@[A-Za-z0-9._-]+$/.test(path) ? null : path;
73
- if (!project.local || repo.local || !repo.profileId || !/^[A-Za-z0-9._-]+$/.test(repo.profileId)) return null;
74
- return `${path}@${repo.profileId}`;
75
- }
76
- function goalWithTask(goal, task, lang = "en") {
77
- const t = (task || "").trim();
78
- if (!t) return goal;
79
- if (!goal.trim()) return t;
80
- const sep = /[.!?…]$/.test(goal) ? "" : ".";
81
- return `${goal}${sep} ${lang === "fr" ? "T\xE2che en cours" : "Current task"}: ${t}`;
82
- }
83
- function projectCommandArgs(action, input, ctx) {
84
- const session = ctx.session && ctx.session !== "default" ? ["--session", ctx.session] : [];
85
- const goalArg = (g) => g ? ["--goal", g] : [];
86
- if (action === "adopt-workspace") {
87
- if (!ctx.pane || !ctx.cwd) throw new Error("pane and folder required");
88
- return [
89
- "adopt-workspace",
90
- "--name",
91
- input.name,
92
- "--pane",
93
- ctx.pane,
94
- "--workspace-cwd",
95
- ctx.cwd,
96
- ...goalArg(goalWithTask(input.goal || "", input.task, ctx.lang)),
97
- ...session
98
- ];
99
- }
100
- if (action === "new") {
101
- return [
102
- "new",
103
- input.name,
104
- ...goalArg(input.goal || ""),
105
- ...input.repo ? ["--repo", input.repo] : [],
106
- ...input.coordinatorProfile ? ["--coordinator-profile", input.coordinatorProfile] : [],
107
- ...input.threadProfile ? ["--thread-profile", input.threadProfile] : []
108
- ];
109
- }
110
- if (action === "open") return ["open", input.slug, ...session];
111
- if (action === "doctor") return ["doctor", ...session];
112
- return [action, input.slug];
113
- }
114
- function setupHeader(o) {
115
- const home = o.home.replace(/\/+$/, "");
116
- const version = (o.version || "").replace(/^herdr-projects\s+/, "").trim();
117
- return [
118
- { key: "version", value: version || "?", warn: !version },
119
- { key: "binary", value: o.binary, warn: Boolean(home) && !o.binary.startsWith(`${home}/`) },
120
- { key: "home", value: home || "?", warn: !home },
121
- { key: "config", value: home ? `${home}/.config/herdr/config.toml` : "?" }
122
- ];
123
- }
124
- function proposedRepo(root, home) {
125
- const r = (root || "").trim().replace(/\/+$/, "");
126
- const h = home.replace(/\/+$/, "");
127
- return r.startsWith("/") && h && r.startsWith(`${h}/`) ? r : "";
128
- }
129
- function tickerRunning(status) {
130
- return /^ticker: running\b/m.test(status || "");
131
- }
132
- function readOnlyMessage(error, o) {
133
- var _a;
134
- if (!/read-only file system|os error 30\b|EROFS/i.test(error)) return null;
135
- const path = ((_a = /(\/[^:\n]*?):\s*Read-only file system/i.exec(error)) == null ? void 0 : _a[1]) || "";
136
- if (o.docker) {
137
- return path ? fmt("wherdr runs in Docker with your home folder read-only: herdr-projects cannot write to {path}. Mount its projects folder (~/.herdr-projects by default) read-write in docker-compose.yml (see README, \u201CHerdr plugins\u201D), then restart the container.", { path }) : "wherdr runs in Docker with your home folder read-only: herdr-projects cannot write. Mount its projects folder (~/.herdr-projects by default) read-write in docker-compose.yml (see README, \u201CHerdr plugins\u201D), then restart the container.";
138
- }
139
- return path ? fmt("herdr-projects cannot write to {path}: read-only file system.", { path }) : "herdr-projects cannot write: read-only file system.";
140
- }
141
-
142
- export { PROJECT_INPUTS as P, projectCommandArgs as a, parseProfileList as b, cleanProjectInput as c, readOnlyMessage as d, proposedRepo as p, repoArgument as r, setupHeader as s, tickerRunning as t };
143
- //# sourceMappingURL=projectsActions.mjs.map
@@ -1,56 +0,0 @@
1
- import { promises, constants } from 'node:fs';
2
- import path from 'node:path';
3
- import { H as HerdrError, E as fmt, x as herdrOn } from '../nitro/nitro.mjs';
4
-
5
- const PROJECTS_REPO = "eliasstravik/herdr-projects";
6
- const PROJECTS_INSTALL_ARGS = ["plugin", "install", PROJECTS_REPO, "--yes"];
7
-
8
- function projectsPluginFromList(plugins) {
9
- const plugin = plugins.find((p) => p.plugin_id === "herdr-projects");
10
- return {
11
- installed: Boolean(plugin),
12
- enabled: Boolean(plugin && plugin.enabled !== false),
13
- version: plugin && typeof plugin.version === "string" && /^\d[\w.+-]{0,39}$/.test(plugin.version) ? plugin.version : null
14
- };
15
- }
16
- async function canInstall(m) {
17
- if (!m.local) return m.status === "online";
18
- try {
19
- await promises.access(path.join(m.home, ".config/herdr"), constants.W_OK);
20
- return true;
21
- } catch {
22
- return false;
23
- }
24
- }
25
- async function projectsPluginState(m) {
26
- if (m.status !== "online") throw new HerdrError("unreachable", fmt("{machine} is unreachable", { machine: m.label }));
27
- const r = await herdrOn(m.key, "plugin.list", {}, 8e3);
28
- return { ...projectsPluginFromList(r.plugins || []), installable: await canInstall(m) };
29
- }
30
- async function installProjectsPlugin(m) {
31
- if (m.status !== "online") throw new HerdrError("unreachable", fmt("{machine} is unreachable", { machine: m.label }));
32
- if ((await projectsPluginState(m)).installed) throw new HerdrError("already_installed", "herdr-projects is already installed");
33
- if (!await canInstall(m)) throw new HerdrError("read_only", fmt("Herdr folder is read-only on {machine}", { machine: m.label }));
34
- const child = m.spawnHerdr([...PROJECTS_INSTALL_ARGS]);
35
- return await new Promise((resolve, reject) => {
36
- let output = "";
37
- const append = (b) => {
38
- output = (output + b.toString("utf8")).slice(-4e3);
39
- };
40
- child.stdout.on("data", append);
41
- child.stderr.on("data", append);
42
- const timer = setTimeout(() => child.kill("SIGKILL"), 12e4);
43
- child.on("error", (e) => {
44
- clearTimeout(timer);
45
- reject(new HerdrError("install_failed", e.message));
46
- });
47
- child.on("close", (code) => {
48
- clearTimeout(timer);
49
- if (code !== 0) reject(new HerdrError("install_failed", output.trim().slice(-300) || fmt("Install failed (code {code})", { code })));
50
- else resolve(output.trim().slice(-300));
51
- });
52
- });
53
- }
54
-
55
- export { installProjectsPlugin as i, projectsPluginState as p };
56
- //# sourceMappingURL=projectsPlugin.mjs.map
@@ -1,115 +0,0 @@
1
- import { execFile } from 'node:child_process';
2
- import { existsSync } from 'node:fs';
3
- import { ap as IN_DOCKER, aq as HOST_OPEN_TARGET, ar as HOST_OPEN_KEY, H as HerdrError, as as PANE_RE, f as findPane, a1 as getMachine, at as splitId, E as fmt, ab as log, au as HOST_OPEN_USER } from '../nitro/nitro.mjs';
4
- import { r as resolveAgentPath, a as runnablePath } from './filePaths.mjs';
5
-
6
- const REVEAL_CHECKS = `p=$2
7
- [ -e "$p" ] || exit 3
8
- if command -v realpath >/dev/null 2>&1; then
9
- r=$(realpath "$p" 2>/dev/null) || exit 3
10
- h=$(realpath "$HOME" 2>/dev/null) || exit 4
11
- elif [ -d "$p" ]; then
12
- r=$(cd -P "$p" 2>/dev/null && pwd -P) || exit 3
13
- h=$(cd -P "$HOME" 2>/dev/null && pwd -P) || exit 4
14
- else
15
- d=$(cd -P "$(dirname "$p")" 2>/dev/null && pwd -P) || exit 3
16
- r="$d/$(basename "$p")"
17
- [ -L "$r" ] && [ "$1" = open ] && exit 4
18
- h=$(cd -P "$HOME" 2>/dev/null && pwd -P) || exit 4
19
- fi
20
- case "$r/" in "$h"/*) ;; *) exit 4 ;; esac
21
- [ "$(uname -s)" = Darwin ] || exit 5
22
- if [ "$1" = open ]; then
23
- case "$r" in *.app|*.app/*|*.command|*.tool|*.terminal|*.pkg|*.mpkg|*.workflow|*.scpt|*.applescript|*.jar|*.webloc|*.inetloc|*.fileloc|*.dmg) exit 7 ;; esac
24
- if [ -f "$r" ] && [ -x "$r" ]; then exit 7; fi
25
- # A folder opens in the configured editor (WH_OPEN_EDITOR, or the first line
26
- # of ~/.local/share/wherdr/editor \u2014 an app name for open -a); plain open
27
- # would give the file manager. Files: the LaunchServices default app.
28
- ed=\${WH_OPEN_EDITOR:-}
29
- if [ -z "$ed" ] && [ -f "$HOME/.local/share/wherdr/editor" ]; then
30
- ed=$(head -n1 "$HOME/.local/share/wherdr/editor" | tr -d '[:space:]')
31
- fi
32
- if [ -d "$r" ] && [ -n "$ed" ]; then
33
- open -a "$ed" "$r" || exit 6
34
- else
35
- open "$r" || exit 6
36
- fi
37
- else
38
- open -R "$r" || exit 6
39
- fi
40
- echo "$r"`;
41
- const REVEAL_SCRIPT = REVEAL_CHECKS;
42
- const revealArgs = (mode, absPath) => [mode, absPath];
43
- const isMac = (m) => m.os === "Darwin";
44
- const hostOpenReady = () => Boolean(IN_DOCKER && HOST_OPEN_TARGET && existsSync(HOST_OPEN_KEY));
45
- function runHostOpen(mode, absPath) {
46
- const { promise, resolve } = Promise.withResolvers();
47
- const known = "/data/macos/known_hosts";
48
- const pin = existsSync(known) ? ["-o", `UserKnownHostsFile=${known}`, "-o", "StrictHostKeyChecking=yes"] : ["-o", "StrictHostKeyChecking=accept-new"];
49
- const cmd = `open ${mode} ${Buffer.from(absPath, "utf8").toString("base64")}`;
50
- execFile("ssh", [
51
- "-i",
52
- HOST_OPEN_KEY,
53
- "-o",
54
- "IdentitiesOnly=yes",
55
- "-o",
56
- "BatchMode=yes",
57
- "-o",
58
- "ConnectTimeout=5",
59
- ...pin,
60
- `${HOST_OPEN_USER || "root"}@${HOST_OPEN_TARGET}`,
61
- cmd
62
- ], { timeout: 15e3, encoding: "buffer", maxBuffer: 1024 * 1024 }, (err, stdout, stderr) => {
63
- const raw = err ? typeof err === "object" && err !== null && "code" in err ? err.code : void 0 : 0;
64
- resolve({ code: typeof raw === "number" ? raw : err ? 1 : 0, stdout, stderr: String(stderr || "") });
65
- });
66
- return promise;
67
- }
68
- function runLocal(script, args) {
69
- const { promise, resolve } = Promise.withResolvers();
70
- execFile("/bin/sh", ["-c", script, "sh", ...args], { timeout: 15e3, encoding: "buffer" }, (err, stdout, stderr) => {
71
- const raw = err ? typeof err === "object" && err !== null && "code" in err ? err.code : void 0 : 0;
72
- resolve({ code: typeof raw === "number" ? raw : err ? 1 : 0, stdout, stderr: String(stderr || "") });
73
- });
74
- return promise;
75
- }
76
- function revealError(code, p, m, stderr = "") {
77
- switch (code) {
78
- case 3:
79
- return new HerdrError("not_found", fmt("Not found on {machine}: {path}", { machine: m.label, path: p }));
80
- case 4:
81
- return new HerdrError("outside_home", "Only files in your home folder can be shown");
82
- case 5:
83
- return new HerdrError("not_mac", fmt("{machine} is not a Mac", { machine: m.label }));
84
- case 7:
85
- return new HerdrError("runnable", "Apps and scripts are not opened from wherdr: use Reveal in Finder");
86
- default:
87
- return new HerdrError("open_failed", fmt("Could not open on {machine}: {reason}", { machine: m.label, reason: stderr.trim().split("\n").pop() || `code ${code}` }));
88
- }
89
- }
90
- async function revealPath(body) {
91
- const paneId = String(body.pane_id || "");
92
- const written = String(body.path || "");
93
- const mode = body.mode === "open" ? "open" : body.mode === "reveal" ? "reveal" : null;
94
- if (!mode) throw new HerdrError("bad_mode", "Invalid action");
95
- if (!PANE_RE.test(paneId)) throw new HerdrError("bad_pane", "Invalid pane");
96
- const pane = findPane(paneId);
97
- if (!pane) throw new HerdrError("bad_pane", "Pane not found");
98
- if (!written || written.length > 1024) throw new HerdrError("bad_path", "Invalid path");
99
- const m = getMachine(splitId(paneId).machine);
100
- if (!m) throw new HerdrError("bad_machine", "unknown machine");
101
- if (!m.local && (m.status !== "online" || !m.home)) throw new HerdrError("unreachable", fmt("{machine} is unreachable", { machine: m.label }));
102
- const viaHost = Boolean(m.local && !isMac(m) && hostOpenReady());
103
- if (!isMac(m) && !viaHost) throw new HerdrError("not_mac", fmt("{machine} is not a Mac", { machine: m.label }));
104
- const abs = resolveAgentPath(written, pane.cwd, m.home);
105
- if (!abs) throw new HerdrError("outside_home", "Only files in your home folder can be shown");
106
- if (mode === "open" && runnablePath(abs)) throw revealError(7, abs, m);
107
- const args = revealArgs(mode, abs);
108
- const r = viaHost ? await runHostOpen(mode, abs) : m.local ? await runLocal(REVEAL_SCRIPT, args) : await m.exec(REVEAL_SCRIPT, args, { timeoutMs: 15e3 });
109
- log(`reveal: ${mode} on ${m.label} for ${paneId}${viaHost ? " (host open)" : ""}: ${r.code === 0 ? "ok" : `refused (code ${r.code})`}`);
110
- if (r.code !== 0) throw revealError(r.code, abs, m, r.stderr);
111
- return { ok: true, mode, path: r.stdout.toString("utf8").trim() || abs, machine: m.label };
112
- }
113
-
114
- export { hostOpenReady as h, revealPath as r };
115
- //# sourceMappingURL=reveal.mjs.map
@@ -1,7 +0,0 @@
1
- import { b as base64ToUint8Array } from '../virtual/_raw-helpers.mjs';
2
-
3
- // ROLLUP_NO_REPLACE
4
- const dev_wherdr_open = base64ToUint8Array("PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+CjxwbGlzdCB2ZXJzaW9uPSIxLjAiPjxkaWN0PgogIDxrZXk+TGFiZWw8L2tleT48c3RyaW5nPmRldi53aGVyZHIub3Blbjwvc3RyaW5nPgogIDxrZXk+UHJvZ3JhbUFyZ3VtZW50czwva2V5PjxhcnJheT4KICAgIDxzdHJpbmc+L2Jpbi9zaDwvc3RyaW5nPjxzdHJpbmc+LWM8L3N0cmluZz4KICAgIDxzdHJpbmc+Zj0iJEhPTUUvTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0L3doZXJkci1vcGVuL3Nwb29sIjsgWyAtZiAiJGYiIF0gJmFtcDsmYW1wOyB7IGM9JChjYXQgIiRmIik7IHJtIC1mICIkZiI7IHNoIC1jICIkYyI7IH0gPC9zdHJpbmc+CiAgPC9hcnJheT4KPC9kaWN0PjwvcGxpc3Q+Cg==");
5
-
6
- export { dev_wherdr_open as default };
7
- //# sourceMappingURL=dev.wherdr.open.mjs.map
@@ -1,7 +0,0 @@
1
- import { b as base64ToUint8Array } from '../virtual/_raw-helpers.mjs';
2
-
3
- // ROLLUP_NO_REPLACE
4
- const dockerEntrypoint = base64ToUint8Array("IyEvYmluL3NoCiMgR2VuZXJpYyBpbWFnZTogdGhlIGNvbnRhaW5lciB1c2VyIGlzIGNyZWF0ZWQgYXQgc3RhcnR1cCB3aXRoIHRoZSBVSUQvR0lECiMgKFBVSUQvUEdJRCkgYW5kIGhvbWUgZGlyZWN0b3J5IChIT01FKSBvZiB0aGUgaG9zdCB1c2VyLiBzc2ggcmVhZHMKIyB+Ly5zc2ggZnJvbSAvZXRjL3Bhc3N3ZCAobm90IGZyb20gJEhPTUUpLCBoZW5jZSB0aGlzIGVudHJ5IHJhdGhlciB0aGFuIGEgcGxhaW4gYHVzZXI6YC4Kc2V0IC1lCmlmIFsgIiQoaWQgLXUpIiA9IDAgXTsgdGhlbgogIFBVSUQ9JHtQVUlEOi0xMDAwfQogIFBHSUQ9JHtQR0lEOi0xMDAwfQogIEhPTUU9JHtIT01FOi0vaG9tZS93aGVyZHJ9CiAgWyAiJEhPTUUiID0gL3Jvb3QgXSAmJiBIT01FPS9ob21lL3doZXJkcgogIGRlbHVzZXIgd2hlcmRyIDI+L2Rldi9udWxsIHx8IHRydWUKICBkZWxncm91cCB3aGVyZHIgMj4vZGV2L251bGwgfHwgdHJ1ZQogIGdyb3VwPSQoZ2V0ZW50IGdyb3VwICIkUEdJRCIgfCBjdXQgLWQ6IC1mMSkKICBpZiBbIC16ICIkZ3JvdXAiIF07IHRoZW4gYWRkZ3JvdXAgLWcgIiRQR0lEIiB3aGVyZHI7IGdyb3VwPXdoZXJkcjsgZmkKICAjIEFuIGltYWdlIGFjY291bnQgdGhhdCBhbHJlYWR5IGhhcyB0aGlzIFVJRCAoZS5nLiAxMDAwKTogcmVtb3ZlZC4KICBvdGhlcj0kKGdldGVudCBwYXNzd2QgIiRQVUlEIiB8IGN1dCAtZDogLWYxKQogIFsgLW4gIiRvdGhlciIgXSAmJiBkZWx1c2VyICIkb3RoZXIiIDI+L2Rldi9udWxsIHx8IHRydWUKICAjIC1IOiB0aGUgaG9tZSBkaXJlY3RvcnkgaXMgdGhlIGhvc3QncywgbW91bnRlZCAocmVhZC1vbmx5KS4KICBhZGR1c2VyIC1EIC1IIC11ICIkUFVJRCIgLUcgIiRncm91cCIgLWggIiRIT01FIiAtcyAvYmluL3NoIHdoZXJkcgogIGV4cG9ydCBIT01FCiAgZXhlYyBzdS1leGVjIHdoZXJkciAiJEAiCmZpCiMgQWxyZWFkeSBzdGFydGVkIGFzIGFub3RoZXIgdXNlciAoYHVzZXI6YCBpbiBjb21wb3NlKTogcnVuIGFzIGlzLgpleGVjICIkQCIK");
5
-
6
- export { dockerEntrypoint as default };
7
- //# sourceMappingURL=docker-entrypoint.mjs.map
@@ -1,7 +0,0 @@
1
- import { b as base64ToUint8Array } from '../virtual/_raw-helpers.mjs';
2
-
3
- // ROLLUP_NO_REPLACE
4
- const installHostOpen = base64ToUint8Array("IyEvYmluL3NoCiMgU2V0cyB1cCAiUmV2ZWFsIGluIEZpbmRlciIgLyAiT3BlbiIgLyBNb2QrQWx0K08gZm9yIHdoZXJkciBydW5uaW5nIGluIGEgRG9ja2VyCiMgY29udGFpbmVyIG9uIHRoaXMgTWFjLiBSdW4gT04gVEhFIE1BQyAodGhlIGNvbnRhaW5lciB0YWxrcyB0byBpdCBvdmVyIFNTSCk6CiMKIyAgIHNoIHNjcmlwdHMvaW5zdGFsbC1ob3N0LW9wZW4uc2ggWy0tdXNlciA8bWFjIHVzZXI+XQojCiMgV2hhdCBpdCBkb2VzOgojICAgMS4gQ3JlYXRlcyBhIGRlZGljYXRlZCBlZDI1NTE5IGtleSBwYWlyIGluIHRoZSBjb250YWluZXIncyBkYXRhIGZvbGRlcgojICAgICAgKGRhdGEvaG9zdC1vcGVuLWtleSwgZGF0YS9ob3N0LW9wZW4ta2V5LnB1Yikg4oCUIHRoZSBwcml2YXRlIGhhbGYgc3RheXMKIyAgICAgIHdpdGggd2hlcmRyLCB3aGljaCBtb3VudHMgZGF0YS8gaW50byB0aGUgY29udGFpbmVyLgojICAgMi4gSW5zdGFsbHMgfi8ubG9jYWwvc2hhcmUvd2hlcmRyL3tyZXZlYWwuc2gsd2hlcmRyLW9wZW4uc2h9IG9uIHRoaXMgTWFjCiMgICAgICBhbmQgcGlja3MgYSBmb2xkZXIgZWRpdG9yIChzZWUgYmVsb3cpLgojICAgMy4gQWRkcyBvbmUgYXV0aG9yaXplZF9rZXlzIGxpbmUgZm9yIHRoYXQga2V5IHdpdGggYSBmb3JjZWQgY29tbWFuZCB0aGF0CiMgICAgICBvbmx5IGV2ZXIgcnVucyB0aGUgcmV2ZWFsIGNoZWNrcyBvbiB0aGUgcGF0aCB3aGVyZHIgcGFzc2VzLiBBbiBleGlzdGluZwojICAgICAgbGluZSBmb3IgdGhlIHNhbWUga2V5IGlzIHJlcGxhY2VkIGluIHBsYWNlLCBuZXZlciBkdXBsaWNhdGVkLgojIFRoZW4gc2V0IGluIGRvY2tlci1jb21wb3NlLm92ZXJyaWRlLnltbDoKIyAgIEhFUkRSX1dFQl9IT1NUX09QRU5fVEFSR0VUPTx0YXJnZXQ+ICAgKGRlZmF1bHQgaG9zdC5kb2NrZXIuaW50ZXJuYWw7CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QuZG9ja2VyLmludGVybmFsIGRvZXMgbm90IHJlc29sdmUKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gbWFjT1MgaXRzZWxmLCBvbmx5IGluIHRoZSBjb250YWluZXIpCiMgICBIRVJEUl9XRUJfSE9TVF9PUEVOX1VTRVI9PG1hYyB1c2VyPgojIGFuZCByZWJ1aWxkOiBkb2NrZXIgY29tcG9zZSAuLi4gdXAgLWQgKHNlZSBSRUFETUUsICJ3aGVyZHIgaW4gRG9ja2VyIG9uIGEgTWFjIikuCnNldCAtZXUKCmhlcmU9JChjZCAiJChkaXJuYW1lICIkMCIpIiAmJiBwd2QpCmRhdGE9IiRoZXJlLy4uL2RhdGEiCnVzZXI9JHtVU0VSOi0kKGlkIC11bil9CnRhcmdldD1ob3N0LmRvY2tlci5pbnRlcm5hbAoKd2hpbGUgWyAkIyAtZ3QgMCBdOyBkbwogIGNhc2UgIiQxIiBpbgogICAgLS11c2VyKSB1c2VyPSQyOyBzaGlmdCAyIDs7CiAgICAtLXRhcmdldCkgdGFyZ2V0PSQyOyBzaGlmdCAyIDs7CiAgICAqKSBlY2hvICJ1bmtub3duIG9wdGlvbjogJDEiID4mMjsgZXhpdCAyIDs7CiAgZXNhYwpkb25lCgpmb3IgZiBpbiByZXZlYWwuc2ggd2hlcmRyLW9wZW4uc2g7IGRvCiAgWyAtZiAiJGhlcmUvJGYiIF0gfHwgeyBlY2hvICJzY3JpcHRzLyRmIG1pc3NpbmciID4mMjsgZXhpdCAxOyB9CmRvbmUKCiMgMS4gS2V5IHBhaXIgKGNyZWF0ZWQgb25jZSwgcmV1c2VkIGFjcm9zcyByZWluc3RhbGxzKS4KaWYgWyAhIC1mICIkZGF0YS9ob3N0LW9wZW4ta2V5IiBdOyB0aGVuCiAgbWtkaXIgLXAgIiRkYXRhIgogIHNzaC1rZXlnZW4gLXEgLXQgZWQyNTUxOSAtTiAnJyAtQyB3aGVyZHItaG9zdC1vcGVuIC1mICIkZGF0YS9ob3N0LW9wZW4ta2V5IgogIGVjaG8gImNyZWF0ZWQgJGRhdGEvaG9zdC1vcGVuLWtleSgucHViKSIKZmkKCiMgMi4gcmV2ZWFsLnNoIGFuZCB0aGUgZm9yY2VkLWNvbW1hbmQgd3JhcHBlciBvbiB0aGlzIE1hYyAodGhlIGluc3RhbGxlciBydW5zCiMgICAgaGVyZSwgc28gcGxhaW4gZmlsZSBjb3BpZXM7IG5vIFNTSCBpbnZvbHZlZCBvbiB0aGlzIHNpZGUpLgpkPSIkSE9NRS8ubG9jYWwvc2hhcmUvd2hlcmRyIgpta2RpciAtcCAiJGQiICYmIGNobW9kIDcwMCAiJGQiCmNwICIkaGVyZS9yZXZlYWwuc2giICIkaGVyZS93aGVyZHItb3Blbi5zaCIgIiRkLyIKY2htb2QgK3ggIiRkL3JldmVhbC5zaCIgIiRkL3doZXJkci1vcGVuLnNoIgplY2hvICJpbnN0YWxsZWQgJGQve3JldmVhbC5zaCx3aGVyZHItb3Blbi5zaH0iCgojIFRoZSBlZGl0b3IgdGhhdCBvcGVucyBmb2xkZXJzIChNb2QrQWx0K08pOiB0aGUgZmlyc3QgaW5zdGFsbGVkIG9mIHRoZSB1c3VhbAojIHN1c3BlY3RzLiBPdmVycmlkZSBhbnl0aW1lOgojICAgcHJpbnRmICVzICJWaXN1YWwgU3R1ZGlvIENvZGUiID4gfi8ubG9jYWwvc2hhcmUvd2hlcmRyL2VkaXRvcgppZiBbICEgLWYgIiRkL2VkaXRvciIgXTsgdGhlbgogIGZvciBlIGluIFplZCBUcmFlICJWaXN1YWwgU3R1ZGlvIENvZGUiIEN1cnNvciAiU3VibGltZSBUZXh0IiBUZXh0TWF0ZTsgZG8KICAgIGlmIFsgLWQgIi9BcHBsaWNhdGlvbnMvJGUuYXBwIiBdIHx8IFsgLWQgIiRIT01FL0FwcGxpY2F0aW9ucy8kZS5hcHAiIF07IHRoZW4KICAgICAgcHJpbnRmICVzICIkZSIgPiAiJGQvZWRpdG9yIgogICAgICBlY2hvICJlZGl0b3I6ICRlIgogICAgICBicmVhawogICAgZmkKICBkb25lCiAgWyAtZiAiJGQvZWRpdG9yIiBdIHx8IGVjaG8gImVkaXRvcjogbm9uZSBmb3VuZCDigJQgc2V0IG9uZTogcHJpbnRmICVzIEFwcE5hbWUgPiAkZC9lZGl0b3IiCmZpCgojIDMuIGF1dGhvcml6ZWRfa2V5czogb25lIGxpbmUgZm9yIHRoZSBrZXksIGZvcmNlZCBjb21tYW5kLCBuZXZlciBkdXBsaWNhdGVkLgpbIC1kICIkSE9NRS8uc3NoIiBdIHx8IG1rZGlyIC1wICIkSE9NRS8uc3NoIgpbIC1mICIkSE9NRS8uc3NoL2F1dGhvcml6ZWRfa2V5cyIgXSB8fCA6ID4gIiRIT01FLy5zc2gvYXV0aG9yaXplZF9rZXlzIgpsaW5lPSJyZXN0cmljdCxjb21tYW5kPVwic2ggJGQvd2hlcmRyLW9wZW4uc2hcIiAkKGNhdCAiJGRhdGEvaG9zdC1vcGVuLWtleS5wdWIiKSIKa2V5cz0iJEhPTUUvLnNzaC9hdXRob3JpemVkX2tleXMiCmdyZXAgLXYgJ3doZXJkci1ob3N0LW9wZW4nICIka2V5cyIgPiAiJGtleXMudG1wIiB8fCA6ID4gIiRrZXlzLnRtcCIKcHJpbnRmICclc1xuJyAiJGxpbmUiID4+ICIka2V5cy50bXAiCm12ICIka2V5cy50bXAiICIka2V5cyIKZWNobyAiYXV0aG9yaXplZF9rZXlzIHVwZGF0ZWQgKGZvcmNlZCBjb21tYW5kOiByZXZlYWwgY2hlY2tzIG9ubHkpIgoKIyAyYi4gQSBwZXItdXNlciBMYXVuY2hBZ2VudCB0aGF0IGxpdmVzIGluIHRoZSBHVUkgKEFxdWEpIGxvZ2luIHNlc3Npb24uIEFwcHMgY2FuCiMgICAgIG9ubHkgYmUgTEFVTkNIRUQgZnJvbSB0aGUgR1VJIHNlc3Npb246IGBvcGVuYCBmcm9tIGFuIFNTSCBzZXNzaW9uIGRvZXMgbm90CiMgICAgIHN0YXJ0IHRoZW0uIFRoZSB3cmFwcGVyIGhhbmRzIGNvbW1hbmRzIHRvIHRoaXMgYWdlbnQgb3ZlciBhIHNwb29sIGZpbGUuCnNwb29sPSIkSE9NRS9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQvd2hlcmRyLW9wZW4iCm1rZGlyIC1wICIkc3Bvb2wiCmNwICIkaGVyZS9kZXYud2hlcmRyLm9wZW4ucGxpc3QiICIkSE9NRS9MaWJyYXJ5L0xhdW5jaEFnZW50cy9kZXYud2hlcmRyLm9wZW4ucGxpc3QiCmxhdW5jaGN0bCBib290b3V0ICJndWkvJChpZCAtdSkvZGV2LndoZXJkci5vcGVuIiAyPi9kZXYvbnVsbCB8fCB0cnVlCmxhdW5jaGN0bCBib290c3RyYXAgImd1aS8kKGlkIC11KSIgIiRIT01FL0xpYnJhcnkvTGF1bmNoQWdlbnRzL2Rldi53aGVyZHIub3Blbi5wbGlzdCIgXAogICYmIGVjaG8gImFnZW50IGRldi53aGVyZHIub3BlbiBsb2FkZWQgKEdVSSBzZXNzaW9uKSIgXAogIHx8IGVjaG8gIldBUk5JTkc6IGNvdWxkIG5vdCBsb2FkIGRldi53aGVyZHIub3BlbiBhZ2VudCDigJQgZm9sZGVyIG9wZW4gbWF5IG5vdCB3b3JrIgoKY2F0IDw8RU9GCgpOZXh0OiBpbiBkb2NrZXItY29tcG9zZS5vdmVycmlkZS55bWwgc2V0CiAgZW52aXJvbm1lbnQ6CiAgICAtIEhFUkRSX1dFQl9IT1NUX09QRU5fVEFSR0VUPSR0YXJnZXQKICAgIC0gSEVSRFJfV0VCX0hPU1RfT1BFTl9VU0VSPSR1c2VyCnRoZW4gcmVidWlsZCB0aGUgY29udGFpbmVyIChSRUFETUUsICJ3aGVyZHIgaW4gRG9ja2VyIG9uIGEgTWFjIikuCkVPRgo=");
5
-
6
- export { installHostOpen as default };
7
- //# sourceMappingURL=install-host-open.mjs.map
@@ -1,7 +0,0 @@
1
- import { b as base64ToUint8Array } from '../virtual/_raw-helpers.mjs';
2
-
3
- // ROLLUP_NO_REPLACE
4
- const wherdrOpen = base64ToUint8Array("IyEvYmluL3NoCiMgRm9yY2VkIGNvbW1hbmQgZm9yIHdoZXJkcidzICJob3N0IG9wZW4iIFNTSCBrZXkgKGF1dGhvcml6ZWRfa2V5cyBvbiB0aGlzIE1hYyk6CiMgYSB3aGVyZHIgY29udGFpbmVyIG9uIHRoaXMgbWFjaGluZSBtYXkgYXNrIHRoZSBNYWMgdG8gcmV2ZWFsIC8gb3BlbiBhIHBhdGgsCiMgbm90aGluZyBlbHNlLiBJbnN0YWxsZWQgYnkgc2NyaXB0cy9pbnN0YWxsLWhvc3Qtb3Blbi5zaDsgc2VlIFJFQURNRSwKIyAid2hlcmRyIGluIERvY2tlciBvbiBhIE1hYzogUmV2ZWFsIGluIEZpbmRlciBhbmQgT3BlbiIuCiMKIyBUaGUgY29udGFpbmVyIHNlbmRzIGV4YWN0bHkgb25lIG9mOgojICAgb3BlbiA8cmV2ZWFsfG9wZW4+IDxiYXNlNjQgcGF0aD4gICAgICDigJQgcnVuIHRoZSByZXZlYWwgY2hlY2tzIG9uIHRoZSBwYXRoCiMgICBpbnN0YWxsIDxyZXZlYWwuc2h8d2hlcmRyLW9wZW4uc2g+ICAgIOKAlCByZXBsYWNlIHRoYXQgZmlsZSAoY29udGVudCBvbiBzdGRpbikKIyBQYXJzaW5nIGlzIGJ5IHdoaXRlbGlzdCwgbmV2ZXIgZXZhbDsgdGhlIGNoZWNrcyAoZXhpc3RzLCB1bmRlciAkSE9NRSwgbmV2ZXIgYW4KIyBhcHAgb3Igc2NyaXB0KSBsaXZlIGluIHJldmVhbC5zaCwgdGhlIHNhbWUgZmlsZSB0aGUgd2hlcmRyIHNlcnZlciBydW5zIGRpcmVjdGx5CiMgb24gYSBuYXRpdmUgTWFjLgpzZXQgLXUKCkQ9IiRIT01FLy5sb2NhbC9zaGFyZS93aGVyZHIiClJFVkVBTD0iJHtXSF9PUEVOX1JFVkVBTDotJEQvcmV2ZWFsLnNofSIKCnNldCAtLSAkU1NIX09SSUdJTkFMX0NPTU1BTkQKWyAiJCMiIC1nZSAyIF0gfHwgeyBlY2hvICJ3aGVyZHItb3BlbjogdW5leHBlY3RlZCByZXF1ZXN0IiA+JjI7IGV4aXQgMTI2OyB9CmlmIFsgIiQxIiA9IG9wZW4gXTsgdGhlbgogIFsgIiQjIiAtZXEgMyBdIHx8IHsgZWNobyAid2hlcmRyLW9wZW46IHVuZXhwZWN0ZWQgcmVxdWVzdCIgPiYyOyBleGl0IDEyNjsgfQplbGlmIFsgIiQxIiA9IGluc3RhbGwgXTsgdGhlbgogIFsgIiQjIiAtZXEgMiBdIHx8IHsgZWNobyAid2hlcmRyLW9wZW46IHVuZXhwZWN0ZWQgcmVxdWVzdCIgPiYyOyBleGl0IDEyNjsgfQplbHNlCiAgZWNobyAid2hlcmRyLW9wZW46IHVuZXhwZWN0ZWQgcmVxdWVzdCIgPiYyCiAgZXhpdCAxMjYKZmkKCmI2NG9rKCkgeyBjYXNlICIkMSIgaW4gKlshQS1aYS16MC05Ky89XSp8JycpIHJldHVybiAxIDs7IGVzYWMgfQpkZWNvZGUoKSB7IHByaW50ZiAnJXMnICIkMSIgfCBiYXNlNjQgLUQgMj4vZGV2L251bGwgfHwgcHJpbnRmICclcycgIiQxIiB8IGJhc2U2NCAtZCAyPi9kZXYvbnVsbDsgfQoKaWYgWyAiJDEiID0gaW5zdGFsbCBdOyB0aGVuCiAgIyAkMiBpcyB0aGUgcGxhaW4gZmlsZSBuYW1lOyB0aGUgbmV3IGNvbnRlbnQgYXJyaXZlcyBvbiBzdGRpbi4KICBjYXNlICIkMiIgaW4KICAgIHJldmVhbC5zaHx3aGVyZHItb3Blbi5zaCkgOzsKICAgICopIGVjaG8gIndoZXJkci1vcGVuOiB1bmV4cGVjdGVkIGZpbGUiID4mMjsgZXhpdCAxMjYgOzsKICBlc2FjCiAgZD0iJEQvLmluY29taW5nLiQkIgogIGNhdCA+ICIkZCIgJiYgbXYgIiRkIiAiJEQvJDIiICYmIGNobW9kICt4ICIkRC8kMiIgfHwgeyBybSAtZiAiJGQiOyBlY2hvICJ3aGVyZHItb3BlbjogaW5zdGFsbCBmYWlsZWQiID4mMjsgZXhpdCAxOyB9CiAgZWNobyAiaW5zdGFsbGVkICRELyQyIgogIGV4aXQgMApmaQoKY2FzZSAiJDIiIGluIHJldmVhbHxvcGVuKSA7OyAqKSBlY2hvICJ3aGVyZHItb3BlbjogdW5leHBlY3RlZCBtb2RlIiA+JjI7IGV4aXQgMTI2IDs7IGVzYWMKYjY0b2sgIiQzIiB8fCB7IGVjaG8gIndoZXJkci1vcGVuOiBiYWQgcGF0aCBlbmNvZGluZyIgPiYyOyBleGl0IDEyNjsgfQpwPSQoZGVjb2RlICIkMyIpIHx8IHsgZWNobyAid2hlcmRyLW9wZW46IGJhZCBwYXRoIGVuY29kaW5nIiA+JjI7IGV4aXQgMTI2OyB9ClsgLW4gIiRwIiBdIHx8IHsgZWNobyAid2hlcmRyLW9wZW46IGVtcHR5IHBhdGgiID4mMjsgZXhpdCAxMjY7IH0KWyAtZiAiJFJFVkVBTCIgXSB8fCB7IGVjaG8gIndoZXJkci1vcGVuOiByZXZlYWwuc2ggbm90IGZvdW5kIiA+JjI7IGV4aXQgMTI2OyB9CgojIEdVSSBhcHBzIGNhbiBvbmx5IGJlIGxhdW5jaGVkIGZyb20gdGhlIEdVSSAoQXF1YSkgbG9naW4gc2Vzc2lvbjsgYG9wZW5gIGNhbGxlZAojIGZyb20gYW4gU1NIIHNlc3Npb24gc2lsZW50bHkgZmFpbHMgdG8gc3RhcnQgdGhlbS4gSGFuZCB0aGUgam9iIHRvIGEgcGVyLXVzZXIKIyBMYXVuY2hBZ2VudCAoZGV2LndoZXJkci5vcGVuLCBpbnN0YWxsZWQgYnkgc2NyaXB0cy9pbnN0YWxsLWhvc3Qtb3Blbi5zaCkgdGhhdAojIGxpdmVzIGluIHRoZSBHVUkgc2Vzc2lvbjogd3JpdGUgdGhlIGNvbW1hbmQgdG8gYSBzcG9vbCBmaWxlLCBraWNrc3RhcnQgdGhlCiMgYWdlbnQsIGFuZCB0aGUgYWdlbnQgcnVucyBpdCBhcyB0aGUgbG9nZ2VkLWluIHVzZXIuCmlmIFsgIiQyIiA9IG9wZW4gXSAmJiBbIC16ICIke1dIX09QRU5fUkVWRUFMOi19IiBdICYmIFsgLWQgIiRIT01FL0xpYnJhcnkvTGF1bmNoQWdlbnRzIiBdICYmIGxhdW5jaGN0bCBwcmludCAiZ3VpLyQoaWQgLXUpL2Rldi53aGVyZHIub3BlbiIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgc3Bvb2w9IiRIT01FL0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydC93aGVyZHItb3Blbi9zcG9vbCIKICBxPSQocHJpbnRmICclcycgIiRwIiB8IHNlZCAicy8nLydcXFxcJycvZyIpCiAgcHJpbnRmICdzaCAlcy9yZXZlYWwuc2ggb3BlbiAlcVxuJyAiJEQiICIkcSIgPiAiJHNwb29sIgogIGxhdW5jaGN0bCBraWNrc3RhcnQgLWsgImd1aS8kKGlkIC11KS9kZXYud2hlcmRyLm9wZW4iID4vZGV2L251bGwgMj4mMQogIGVjaG8gIiRwIgogIGV4aXQgMApmaQoKZXhlYyAvYmluL3NoICIkUkVWRUFMIiAiJDIiICIkcCIK");
5
-
6
- export { wherdrOpen as default };
7
- //# sourceMappingURL=wherdr-open.mjs.map