@everywheredev/cli 0.0.5 → 0.0.7

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 (307) hide show
  1. package/README.md +1 -1
  2. package/dist/index.js +274 -59
  3. package/package.json +3 -2
  4. package/scripts/build.mjs +68 -0
  5. package/dist/agent/agent-loop.d.ts +0 -40
  6. package/dist/agent/agent-loop.d.ts.map +0 -1
  7. package/dist/agent/agent-loop.js +0 -162
  8. package/dist/agent/agent-loop.js.map +0 -1
  9. package/dist/agent/approval.d.ts +0 -38
  10. package/dist/agent/approval.d.ts.map +0 -1
  11. package/dist/agent/approval.js +0 -55
  12. package/dist/agent/approval.js.map +0 -1
  13. package/dist/agent/run-tracker.d.ts +0 -26
  14. package/dist/agent/run-tracker.d.ts.map +0 -1
  15. package/dist/agent/run-tracker.js +0 -43
  16. package/dist/agent/run-tracker.js.map +0 -1
  17. package/dist/auth/device-flow.d.ts +0 -61
  18. package/dist/auth/device-flow.d.ts.map +0 -1
  19. package/dist/auth/device-flow.js +0 -141
  20. package/dist/auth/device-flow.js.map +0 -1
  21. package/dist/auth/hydra-oauth-auth-provider.d.ts +0 -35
  22. package/dist/auth/hydra-oauth-auth-provider.d.ts.map +0 -1
  23. package/dist/auth/hydra-oauth-auth-provider.js +0 -153
  24. package/dist/auth/hydra-oauth-auth-provider.js.map +0 -1
  25. package/dist/auth/keychain.d.ts +0 -42
  26. package/dist/auth/keychain.d.ts.map +0 -1
  27. package/dist/auth/keychain.js +0 -138
  28. package/dist/auth/keychain.js.map +0 -1
  29. package/dist/auth/pkce.d.ts +0 -20
  30. package/dist/auth/pkce.d.ts.map +0 -1
  31. package/dist/auth/pkce.js +0 -44
  32. package/dist/auth/pkce.js.map +0 -1
  33. package/dist/auth/ports.d.ts +0 -25
  34. package/dist/auth/ports.d.ts.map +0 -1
  35. package/dist/auth/ports.js +0 -8
  36. package/dist/auth/ports.js.map +0 -1
  37. package/dist/commands/activity.d.ts +0 -17
  38. package/dist/commands/activity.d.ts.map +0 -1
  39. package/dist/commands/activity.js +0 -54
  40. package/dist/commands/activity.js.map +0 -1
  41. package/dist/commands/agent.d.ts +0 -25
  42. package/dist/commands/agent.d.ts.map +0 -1
  43. package/dist/commands/agent.js +0 -80
  44. package/dist/commands/agent.js.map +0 -1
  45. package/dist/commands/agents.d.ts +0 -9
  46. package/dist/commands/agents.d.ts.map +0 -1
  47. package/dist/commands/agents.js +0 -28
  48. package/dist/commands/agents.js.map +0 -1
  49. package/dist/commands/commits.d.ts +0 -16
  50. package/dist/commands/commits.d.ts.map +0 -1
  51. package/dist/commands/commits.js +0 -39
  52. package/dist/commands/commits.js.map +0 -1
  53. package/dist/commands/diff.d.ts +0 -15
  54. package/dist/commands/diff.d.ts.map +0 -1
  55. package/dist/commands/diff.js +0 -27
  56. package/dist/commands/diff.js.map +0 -1
  57. package/dist/commands/expose.d.ts +0 -15
  58. package/dist/commands/expose.d.ts.map +0 -1
  59. package/dist/commands/expose.js +0 -39
  60. package/dist/commands/expose.js.map +0 -1
  61. package/dist/commands/index.d.ts +0 -7
  62. package/dist/commands/index.d.ts.map +0 -1
  63. package/dist/commands/index.js +0 -12
  64. package/dist/commands/index.js.map +0 -1
  65. package/dist/commands/login.d.ts +0 -9
  66. package/dist/commands/login.d.ts.map +0 -1
  67. package/dist/commands/login.js +0 -27
  68. package/dist/commands/login.js.map +0 -1
  69. package/dist/commands/logout.d.ts +0 -9
  70. package/dist/commands/logout.d.ts.map +0 -1
  71. package/dist/commands/logout.js +0 -24
  72. package/dist/commands/logout.js.map +0 -1
  73. package/dist/commands/me.d.ts +0 -10
  74. package/dist/commands/me.d.ts.map +0 -1
  75. package/dist/commands/me.js +0 -25
  76. package/dist/commands/me.js.map +0 -1
  77. package/dist/commands/open.d.ts +0 -16
  78. package/dist/commands/open.d.ts.map +0 -1
  79. package/dist/commands/open.js +0 -34
  80. package/dist/commands/open.js.map +0 -1
  81. package/dist/commands/ports.d.ts +0 -75
  82. package/dist/commands/ports.d.ts.map +0 -1
  83. package/dist/commands/ports.js +0 -78
  84. package/dist/commands/ports.js.map +0 -1
  85. package/dist/commands/profile.d.ts +0 -21
  86. package/dist/commands/profile.d.ts.map +0 -1
  87. package/dist/commands/profile.js +0 -93
  88. package/dist/commands/profile.js.map +0 -1
  89. package/dist/commands/push.d.ts +0 -18
  90. package/dist/commands/push.d.ts.map +0 -1
  91. package/dist/commands/push.js +0 -116
  92. package/dist/commands/push.js.map +0 -1
  93. package/dist/commands/registry.d.ts +0 -15
  94. package/dist/commands/registry.d.ts.map +0 -1
  95. package/dist/commands/registry.js +0 -45
  96. package/dist/commands/registry.js.map +0 -1
  97. package/dist/commands/request.d.ts +0 -25
  98. package/dist/commands/request.d.ts.map +0 -1
  99. package/dist/commands/request.js +0 -58
  100. package/dist/commands/request.js.map +0 -1
  101. package/dist/commands/resume.d.ts +0 -22
  102. package/dist/commands/resume.d.ts.map +0 -1
  103. package/dist/commands/resume.js +0 -69
  104. package/dist/commands/resume.js.map +0 -1
  105. package/dist/commands/save.d.ts +0 -34
  106. package/dist/commands/save.d.ts.map +0 -1
  107. package/dist/commands/save.js +0 -141
  108. package/dist/commands/save.js.map +0 -1
  109. package/dist/commands/session.d.ts +0 -9
  110. package/dist/commands/session.d.ts.map +0 -1
  111. package/dist/commands/session.js +0 -282
  112. package/dist/commands/session.js.map +0 -1
  113. package/dist/commands/skills/markdown-loader.d.ts +0 -19
  114. package/dist/commands/skills/markdown-loader.d.ts.map +0 -1
  115. package/dist/commands/skills/markdown-loader.js +0 -108
  116. package/dist/commands/skills/markdown-loader.js.map +0 -1
  117. package/dist/commands/skills/registry.d.ts +0 -23
  118. package/dist/commands/skills/registry.d.ts.map +0 -1
  119. package/dist/commands/skills/registry.js +0 -45
  120. package/dist/commands/skills/registry.js.map +0 -1
  121. package/dist/commands/terminal.d.ts +0 -19
  122. package/dist/commands/terminal.d.ts.map +0 -1
  123. package/dist/commands/terminal.js +0 -39
  124. package/dist/commands/terminal.js.map +0 -1
  125. package/dist/commands/tree.d.ts +0 -16
  126. package/dist/commands/tree.d.ts.map +0 -1
  127. package/dist/commands/tree.js +0 -44
  128. package/dist/commands/tree.js.map +0 -1
  129. package/dist/commands/undo.d.ts +0 -18
  130. package/dist/commands/undo.d.ts.map +0 -1
  131. package/dist/commands/undo.js +0 -46
  132. package/dist/commands/undo.js.map +0 -1
  133. package/dist/config/config-store.d.ts +0 -19
  134. package/dist/config/config-store.d.ts.map +0 -1
  135. package/dist/config/config-store.js +0 -199
  136. package/dist/config/config-store.js.map +0 -1
  137. package/dist/config/defaults.d.ts +0 -22
  138. package/dist/config/defaults.d.ts.map +0 -1
  139. package/dist/config/defaults.js +0 -38
  140. package/dist/config/defaults.js.map +0 -1
  141. package/dist/config/ports.d.ts +0 -60
  142. package/dist/config/ports.d.ts.map +0 -1
  143. package/dist/config/ports.js +0 -8
  144. package/dist/config/ports.js.map +0 -1
  145. package/dist/config/profile-constants.d.ts +0 -4
  146. package/dist/config/profile-constants.d.ts.map +0 -1
  147. package/dist/config/profile-constants.js +0 -10
  148. package/dist/config/profile-constants.js.map +0 -1
  149. package/dist/config/profile.d.ts +0 -84
  150. package/dist/config/profile.d.ts.map +0 -1
  151. package/dist/config/profile.js +0 -66
  152. package/dist/config/profile.js.map +0 -1
  153. package/dist/contract/index.d.ts +0 -193
  154. package/dist/contract/index.d.ts.map +0 -1
  155. package/dist/contract/index.js +0 -14
  156. package/dist/contract/index.js.map +0 -1
  157. package/dist/core/app.d.ts +0 -35
  158. package/dist/core/app.d.ts.map +0 -1
  159. package/dist/core/app.js +0 -86
  160. package/dist/core/app.js.map +0 -1
  161. package/dist/core/command-router.d.ts +0 -29
  162. package/dist/core/command-router.d.ts.map +0 -1
  163. package/dist/core/command-router.js +0 -61
  164. package/dist/core/command-router.js.map +0 -1
  165. package/dist/core/errors.d.ts +0 -39
  166. package/dist/core/errors.d.ts.map +0 -1
  167. package/dist/core/errors.js +0 -106
  168. package/dist/core/errors.js.map +0 -1
  169. package/dist/core/preflight.d.ts +0 -16
  170. package/dist/core/preflight.d.ts.map +0 -1
  171. package/dist/core/preflight.js +0 -38
  172. package/dist/core/preflight.js.map +0 -1
  173. package/dist/core/repl.d.ts +0 -18
  174. package/dist/core/repl.d.ts.map +0 -1
  175. package/dist/core/repl.js +0 -128
  176. package/dist/core/repl.js.map +0 -1
  177. package/dist/di/container.d.ts +0 -13
  178. package/dist/di/container.d.ts.map +0 -1
  179. package/dist/di/container.js +0 -160
  180. package/dist/di/container.js.map +0 -1
  181. package/dist/di/tokens.d.ts +0 -20
  182. package/dist/di/tokens.d.ts.map +0 -1
  183. package/dist/di/tokens.js +0 -22
  184. package/dist/di/tokens.js.map +0 -1
  185. package/dist/index.d.ts +0 -9
  186. package/dist/index.d.ts.map +0 -1
  187. package/dist/index.js.map +0 -1
  188. package/dist/render/ink-renderer.d.ts +0 -28
  189. package/dist/render/ink-renderer.d.ts.map +0 -1
  190. package/dist/render/ink-renderer.js +0 -174
  191. package/dist/render/ink-renderer.js.map +0 -1
  192. package/dist/render/plain-renderer.d.ts +0 -16
  193. package/dist/render/plain-renderer.d.ts.map +0 -1
  194. package/dist/render/plain-renderer.js +0 -38
  195. package/dist/render/plain-renderer.js.map +0 -1
  196. package/dist/render/ports.d.ts +0 -12
  197. package/dist/render/ports.d.ts.map +0 -1
  198. package/dist/render/ports.js +0 -10
  199. package/dist/render/ports.js.map +0 -1
  200. package/dist/render/raw-renderer.d.ts +0 -11
  201. package/dist/render/raw-renderer.d.ts.map +0 -1
  202. package/dist/render/raw-renderer.js +0 -68
  203. package/dist/render/raw-renderer.js.map +0 -1
  204. package/dist/render/repl-input.d.ts +0 -15
  205. package/dist/render/repl-input.d.ts.map +0 -1
  206. package/dist/render/repl-input.js +0 -102
  207. package/dist/render/repl-input.js.map +0 -1
  208. package/dist/session/file-session-store.d.ts +0 -26
  209. package/dist/session/file-session-store.d.ts.map +0 -1
  210. package/dist/session/file-session-store.js +0 -174
  211. package/dist/session/file-session-store.js.map +0 -1
  212. package/dist/session/ports.d.ts +0 -50
  213. package/dist/session/ports.d.ts.map +0 -1
  214. package/dist/session/ports.js +0 -6
  215. package/dist/session/ports.js.map +0 -1
  216. package/dist/sync/git-sync.d.ts +0 -16
  217. package/dist/sync/git-sync.d.ts.map +0 -1
  218. package/dist/sync/git-sync.js +0 -28
  219. package/dist/sync/git-sync.js.map +0 -1
  220. package/dist/sync/git.d.ts +0 -12
  221. package/dist/sync/git.d.ts.map +0 -1
  222. package/dist/sync/git.js +0 -100
  223. package/dist/sync/git.js.map +0 -1
  224. package/dist/sync/reconciler.d.ts +0 -36
  225. package/dist/sync/reconciler.d.ts.map +0 -1
  226. package/dist/sync/reconciler.js +0 -143
  227. package/dist/sync/reconciler.js.map +0 -1
  228. package/dist/sync/walk.d.ts +0 -23
  229. package/dist/sync/walk.d.ts.map +0 -1
  230. package/dist/sync/walk.js +0 -81
  231. package/dist/sync/walk.js.map +0 -1
  232. package/dist/sync/watch.d.ts +0 -13
  233. package/dist/sync/watch.d.ts.map +0 -1
  234. package/dist/sync/watch.js +0 -75
  235. package/dist/sync/watch.js.map +0 -1
  236. package/dist/tools/git-diff.d.ts +0 -16
  237. package/dist/tools/git-diff.d.ts.map +0 -1
  238. package/dist/tools/git-diff.js +0 -25
  239. package/dist/tools/git-diff.js.map +0 -1
  240. package/dist/tools/http-request.d.ts +0 -25
  241. package/dist/tools/http-request.d.ts.map +0 -1
  242. package/dist/tools/http-request.js +0 -41
  243. package/dist/tools/http-request.js.map +0 -1
  244. package/dist/tools/index.d.ts +0 -7
  245. package/dist/tools/index.d.ts.map +0 -1
  246. package/dist/tools/index.js +0 -22
  247. package/dist/tools/index.js.map +0 -1
  248. package/dist/tools/ports.d.ts +0 -58
  249. package/dist/tools/ports.d.ts.map +0 -1
  250. package/dist/tools/ports.js +0 -17
  251. package/dist/tools/ports.js.map +0 -1
  252. package/dist/tools/read-file.d.ts +0 -16
  253. package/dist/tools/read-file.d.ts.map +0 -1
  254. package/dist/tools/read-file.js +0 -24
  255. package/dist/tools/read-file.js.map +0 -1
  256. package/dist/tools/registry.d.ts +0 -10
  257. package/dist/tools/registry.d.ts.map +0 -1
  258. package/dist/tools/registry.js +0 -28
  259. package/dist/tools/registry.js.map +0 -1
  260. package/dist/tools/run-command.d.ts +0 -20
  261. package/dist/tools/run-command.d.ts.map +0 -1
  262. package/dist/tools/run-command.js +0 -65
  263. package/dist/tools/run-command.js.map +0 -1
  264. package/dist/tools/write-file.d.ts +0 -24
  265. package/dist/tools/write-file.d.ts.map +0 -1
  266. package/dist/tools/write-file.js +0 -60
  267. package/dist/tools/write-file.js.map +0 -1
  268. package/dist/transport/composite-transport.d.ts +0 -30
  269. package/dist/transport/composite-transport.d.ts.map +0 -1
  270. package/dist/transport/composite-transport.js +0 -71
  271. package/dist/transport/composite-transport.js.map +0 -1
  272. package/dist/transport/device-browser.d.ts +0 -19
  273. package/dist/transport/device-browser.d.ts.map +0 -1
  274. package/dist/transport/device-browser.js +0 -243
  275. package/dist/transport/device-browser.js.map +0 -1
  276. package/dist/transport/device-git.d.ts +0 -14
  277. package/dist/transport/device-git.d.ts.map +0 -1
  278. package/dist/transport/device-git.js +0 -107
  279. package/dist/transport/device-git.js.map +0 -1
  280. package/dist/transport/device-http.d.ts +0 -10
  281. package/dist/transport/device-http.d.ts.map +0 -1
  282. package/dist/transport/device-http.js +0 -96
  283. package/dist/transport/device-http.js.map +0 -1
  284. package/dist/transport/device-terminal.d.ts +0 -44
  285. package/dist/transport/device-terminal.d.ts.map +0 -1
  286. package/dist/transport/device-terminal.js +0 -140
  287. package/dist/transport/device-terminal.js.map +0 -1
  288. package/dist/transport/http-transport.d.ts +0 -26
  289. package/dist/transport/http-transport.d.ts.map +0 -1
  290. package/dist/transport/http-transport.js +0 -125
  291. package/dist/transport/http-transport.js.map +0 -1
  292. package/dist/transport/ports.d.ts +0 -67
  293. package/dist/transport/ports.d.ts.map +0 -1
  294. package/dist/transport/ports.js +0 -11
  295. package/dist/transport/ports.js.map +0 -1
  296. package/dist/transport/reconnect.d.ts +0 -44
  297. package/dist/transport/reconnect.d.ts.map +0 -1
  298. package/dist/transport/reconnect.js +0 -69
  299. package/dist/transport/reconnect.js.map +0 -1
  300. package/dist/transport/terminal-transport.d.ts +0 -28
  301. package/dist/transport/terminal-transport.d.ts.map +0 -1
  302. package/dist/transport/terminal-transport.js +0 -63
  303. package/dist/transport/terminal-transport.js.map +0 -1
  304. package/dist/transport/ws-stream-transport.d.ts +0 -66
  305. package/dist/transport/ws-stream-transport.d.ts.map +0 -1
  306. package/dist/transport/ws-stream-transport.js +0 -246
  307. package/dist/transport/ws-stream-transport.js.map +0 -1
@@ -1,58 +0,0 @@
1
- // src/commands/request.ts — `/request <method> <url>` / `pocketdev request ...` → POST /api/request
2
- //
3
- // SRP: proxy an HTTP request through the host's API client. Depends on HttpPort + Renderer.
4
- // Headers via repeated `--header "K: V"`; body via `--data "<text>"` or stdin.
5
- import { z } from "zod";
6
- import { bindArgs, parseArgs } from "./ports.js";
7
- const schema = z.object({
8
- method: z
9
- .string()
10
- .transform((m) => m.toUpperCase())
11
- .pipe(z.enum(["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"]))
12
- .default("GET"),
13
- url: z.string().url("a valid absolute URL is required"),
14
- header: z.union([z.string(), z.array(z.string())]).optional(),
15
- data: z.string().optional(),
16
- });
17
- export class RequestCommand {
18
- name = "request";
19
- summary = "Proxy an HTTP request through the host (POST /api/request)";
20
- aliases = ["req", "http"];
21
- schema = schema;
22
- async run(ctx) {
23
- const args = parseArgs(this.schema, bindArgs(ctx.argv, ["method", "url"]));
24
- const headers = parseHeaders(args.header);
25
- const body = {
26
- method: args.method,
27
- url: args.url,
28
- ...(Object.keys(headers).length ? { headers } : {}),
29
- ...(args.data !== undefined ? { body: args.data } : {}),
30
- };
31
- const res = await ctx.http.post("/api/request", body);
32
- if (ctx.json) {
33
- ctx.renderer.stream(JSON.stringify(res) + "\n");
34
- return;
35
- }
36
- ctx.renderer.stream(`HTTP ${res.status}\n`);
37
- for (const [k, v] of Object.entries(res.headers))
38
- ctx.renderer.stream(`${k}: ${v}\n`);
39
- ctx.renderer.stream("\n");
40
- ctx.renderer.stream(res.body);
41
- if (!res.body.endsWith("\n"))
42
- ctx.renderer.stream("\n");
43
- }
44
- }
45
- function parseHeaders(raw) {
46
- if (raw === undefined)
47
- return {};
48
- const list = Array.isArray(raw) ? raw : [raw];
49
- const out = {};
50
- for (const h of list) {
51
- const idx = h.indexOf(":");
52
- if (idx < 0)
53
- throw new Error(`malformed header '${h}' (expected "Key: Value")`);
54
- out[h.slice(0, idx).trim()] = h.slice(idx + 1).trim();
55
- }
56
- return out;
57
- }
58
- //# sourceMappingURL=request.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/commands/request.ts"],"names":[],"mappings":"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"}
@@ -1,22 +0,0 @@
1
- import { z } from "zod";
2
- import type { Command, CommandContext } from "./ports.js";
3
- export declare class ResumeCommand implements Command {
4
- readonly name = "resume";
5
- readonly summary = "List or replay a prior session (local transcript + /api/sessions sync)";
6
- readonly aliases: string[];
7
- readonly schema: z.ZodObject<{
8
- id: z.ZodOptional<z.ZodString>;
9
- /** Skip the host sync (offline / fast path). */
10
- noSync: z.ZodDefault<z.ZodBoolean>;
11
- }, "strip", z.ZodTypeAny, {
12
- noSync: boolean;
13
- id?: string | undefined;
14
- }, {
15
- id?: string | undefined;
16
- noSync?: boolean | undefined;
17
- }>;
18
- run(ctx: CommandContext): Promise<void>;
19
- private listSessions;
20
- private replay;
21
- }
22
- //# sourceMappingURL=resume.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resume.d.ts","sourceRoot":"","sources":["../../src/commands/resume.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAS1D,qBAAa,aAAc,YAAW,OAAO;IAC3C,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,OAAO,4EAA4E;IAC5F,QAAQ,CAAC,OAAO,WAAgB;IAChC,QAAQ,CAAC,MAAM;;QARf,gDAAgD;;;;;;;;OAQvB;IAEnB,GAAG,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;YAgB/B,YAAY;YAkBZ,MAAM;CAmBrB"}
@@ -1,69 +0,0 @@
1
- // src/commands/resume.ts — `/resume [id]` / `pocketdev resume [id]`
2
- // local JSONL transcript + GET/PUT /api/sessions sync.
3
- //
4
- // SRP: with no id, sync with the host and list known sessions; with an id, replay that
5
- // session's transcript into the renderer so the user can continue it. The actual streaming of
6
- // a NEW prompt afterwards is handled by `/agent` against the resumed sessionId.
7
- import { z } from "zod";
8
- import { bindArgs, parseArgs } from "./ports.js";
9
- const schema = z.object({
10
- id: z.string().optional(),
11
- /** Skip the host sync (offline / fast path). */
12
- noSync: z.boolean().default(false),
13
- });
14
- export class ResumeCommand {
15
- name = "resume";
16
- summary = "List or replay a prior session (local transcript + /api/sessions sync)";
17
- aliases = ["sessions"];
18
- schema = schema;
19
- async run(ctx) {
20
- const args = parseArgs(this.schema, bindArgs(ctx.argv, ["id"]));
21
- if (!args.noSync) {
22
- // Reconcile local transcripts with the host so device changes are visible.
23
- try {
24
- await ctx.sessions.sync();
25
- }
26
- catch {
27
- ctx.renderer.error("Could not sync sessions with the host; showing local only.");
28
- }
29
- }
30
- if (!args.id)
31
- return this.listSessions(ctx);
32
- return this.replay(ctx, args.id);
33
- }
34
- async listSessions(ctx) {
35
- const metas = await ctx.sessions.list();
36
- if (ctx.json) {
37
- ctx.renderer.stream(JSON.stringify({ sessions: metas }) + "\n");
38
- return;
39
- }
40
- if (metas.length === 0) {
41
- ctx.renderer.stream("(no sessions)\n");
42
- return;
43
- }
44
- for (const m of metas) {
45
- const when = new Date(m.updatedAt).toISOString();
46
- const title = m.title ?? "(untitled)";
47
- ctx.renderer.stream(`${m.id} ${when} ${title}\n`);
48
- }
49
- ctx.renderer.stream("\nResume one with: pocketdev resume <id>\n");
50
- }
51
- async replay(ctx, id) {
52
- const transcript = await ctx.sessions.resume(id);
53
- if (ctx.json) {
54
- ctx.renderer.stream(JSON.stringify(transcript) + "\n");
55
- return;
56
- }
57
- ctx.renderer.stream(`— session ${id} (${transcript.turns.length} turns) —\n`);
58
- for (const turn of transcript.turns) {
59
- const who = turn.role === "user" ? "you" : turn.role === "agent" ? "agent" : "system";
60
- ctx.renderer.stream(`\n[${who}] ${turn.text}\n`);
61
- for (const call of turn.toolCalls ?? []) {
62
- const where = call.path ? ` ${call.path}` : "";
63
- ctx.renderer.stream(` · ${call.kind}${call.action ? `:${call.action}` : ""}${where}\n`);
64
- }
65
- }
66
- ctx.renderer.stream(`\nContinue this session: pocketdev agent "<prompt>" (it appends to ${id})\n`);
67
- }
68
- }
69
- //# sourceMappingURL=resume.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resume.js","sourceRoot":"","sources":["../../src/commands/resume.ts"],"names":[],"mappings":"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"}
@@ -1,34 +0,0 @@
1
- import { z } from "zod";
2
- import type { Command, CommandContext } from "./ports.js";
3
- export declare class SaveCommand implements Command {
4
- readonly name = "save";
5
- readonly summary = "Write a file with mtime optimistic concurrency (PUT /api/file)";
6
- readonly schema: z.ZodObject<{
7
- path: z.ZodString;
8
- content: z.ZodOptional<z.ZodString>;
9
- from: z.ZodOptional<z.ZodString>;
10
- /** Last-known mtime (ms) for optimistic concurrency; omit to create / force-read first. */
11
- mtime: z.ZodOptional<z.ZodNumber>;
12
- /** Skip the conflict prompt and overwrite regardless (CI / scripted). */
13
- force: z.ZodDefault<z.ZodBoolean>;
14
- }, "strip", z.ZodTypeAny, {
15
- path: string;
16
- force: boolean;
17
- content?: string | undefined;
18
- from?: string | undefined;
19
- mtime?: number | undefined;
20
- }, {
21
- path: string;
22
- force?: boolean | undefined;
23
- content?: string | undefined;
24
- from?: string | undefined;
25
- mtime?: number | undefined;
26
- }>;
27
- run(ctx: CommandContext): Promise<void>;
28
- private resolveContent;
29
- private tryRead;
30
- private put;
31
- private report;
32
- private handleConflict;
33
- }
34
- //# sourceMappingURL=save.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../../src/commands/save.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAmB1D,qBAAa,WAAY,YAAW,OAAO;IACzC,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,OAAO,oEAAoE;IACpF,QAAQ,CAAC,MAAM;;;;QAff,2FAA2F;;QAE3F,yEAAyE;;;;;;;;;;;;;;OAahD;IAEnB,GAAG,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;YAwB/B,cAAc;YAMd,OAAO;IASrB,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,MAAM;YAQA,cAAc;CA0C7B"}
@@ -1,141 +0,0 @@
1
- // src/commands/save.ts — `/save <path>` / `pocketdev save <path>` → PUT /api/file
2
- //
3
- // SRP: write a file to the host with mtime optimistic concurrency. On 409 (ECONFLICT) we
4
- // SURFACE the conflict and offer reload / overwrite / diff — we never silently clobber a
5
- // concurrent edit from the mobile app or an agent run (cli.md §14).
6
- //
7
- // Content source precedence: --content "<literal>" > --from <local file> > stdin.
8
- import { promises as fs } from "node:fs";
9
- import { z } from "zod";
10
- import { CliError } from "../core/errors.js";
11
- import { bindArgs, parseArgs } from "./ports.js";
12
- const schema = z.object({
13
- path: z.string().min(1, "a target path is required"),
14
- content: z.string().optional(),
15
- from: z.string().optional(),
16
- /** Last-known mtime (ms) for optimistic concurrency; omit to create / force-read first. */
17
- mtime: z.coerce.number().optional(),
18
- /** Skip the conflict prompt and overwrite regardless (CI / scripted). */
19
- force: z.boolean().default(false),
20
- });
21
- export class SaveCommand {
22
- name = "save";
23
- summary = "Write a file with mtime optimistic concurrency (PUT /api/file)";
24
- schema = schema;
25
- async run(ctx) {
26
- const args = parseArgs(this.schema, bindArgs(ctx.argv, ["path"]));
27
- const content = await this.resolveContent(args.content, args.from, ctx);
28
- // If no mtime was supplied, fetch the current one so the host can detect drift.
29
- let mtime = args.mtime;
30
- if (mtime === undefined && !args.force) {
31
- const current = await this.tryRead(ctx, args.path);
32
- mtime = current?.mtime;
33
- }
34
- try {
35
- const written = await this.put(ctx, { path: args.path, content, mtime });
36
- this.report(ctx, written);
37
- }
38
- catch (err) {
39
- if (err instanceof CliError && err.kind === "conflict") {
40
- await this.handleConflict(ctx, args.path, content);
41
- return;
42
- }
43
- throw err;
44
- }
45
- }
46
- async resolveContent(literal, from, ctx) {
47
- if (literal !== undefined)
48
- return literal;
49
- if (from !== undefined)
50
- return fs.readFile(from, "utf8");
51
- return readStdin(ctx.signal);
52
- }
53
- async tryRead(ctx, path) {
54
- try {
55
- return await ctx.http.get("/api/file", { path });
56
- }
57
- catch (err) {
58
- if (err instanceof CliError && err.kind === "not_found")
59
- return undefined; // new file
60
- throw err;
61
- }
62
- }
63
- put(ctx, body) {
64
- return ctx.http.put("/api/file", body);
65
- }
66
- report(ctx, written) {
67
- if (ctx.json) {
68
- ctx.renderer.stream(JSON.stringify({ ok: true, path: written.path, mtime: written.mtime }) + "\n");
69
- }
70
- else {
71
- ctx.renderer.stream(`Saved ${written.path} (mtime ${written.mtime}).\n`);
72
- }
73
- }
74
- async handleConflict(ctx, path, intended) {
75
- ctx.renderer.error(`Conflict: '${path}' changed on the host since you last read it.`, "A concurrent edit (mobile app or agent) is newer than your version.");
76
- if (ctx.nonInteractive) {
77
- // Non-interactive: never clobber. Exit with a conflict-coded error.
78
- throw new CliError("conflict", `Aborting save of '${path}' to avoid clobbering a newer version.`, {
79
- status: 409,
80
- hint: "Reload, diff, or rerun with --force to overwrite.",
81
- });
82
- }
83
- const choice = await ctx.renderer.prompt(`How do you want to resolve '${path}'?`, ["reload", "overwrite", "diff", "cancel"]);
84
- switch (choice) {
85
- case "reload": {
86
- const fresh = await ctx.http.get("/api/file", { path });
87
- ctx.renderer.stream(fresh.content);
88
- if (!fresh.content.endsWith("\n"))
89
- ctx.renderer.stream("\n");
90
- ctx.renderer.stream(`Reloaded host version of ${path}; your edit was NOT saved.\n`);
91
- return;
92
- }
93
- case "diff": {
94
- const fresh = await ctx.http.get("/api/file", { path });
95
- if (fresh.ranges && fresh.ranges.length)
96
- ctx.renderer.diff(fresh.ranges, path);
97
- ctx.renderer.stream(`Host version of ${path} shown above; rerun save to apply your edit.\n`);
98
- return;
99
- }
100
- case "overwrite": {
101
- // Force: write without an mtime guard, accepting that we override the host version.
102
- const written = await this.put(ctx, { path, content: intended });
103
- this.report(ctx, written);
104
- return;
105
- }
106
- case "cancel":
107
- default:
108
- ctx.renderer.stream("Cancelled; nothing written.\n");
109
- return;
110
- }
111
- }
112
- }
113
- function readStdin(signal) {
114
- return new Promise((resolve, reject) => {
115
- let buf = "";
116
- const onData = (c) => (buf += c.toString("utf8"));
117
- const onEnd = () => {
118
- cleanup();
119
- resolve(buf);
120
- };
121
- const onErr = (e) => {
122
- cleanup();
123
- reject(e);
124
- };
125
- const onAbort = () => {
126
- cleanup();
127
- reject(new Error("aborted"));
128
- };
129
- const cleanup = () => {
130
- process.stdin.off("data", onData);
131
- process.stdin.off("end", onEnd);
132
- process.stdin.off("error", onErr);
133
- signal.removeEventListener("abort", onAbort);
134
- };
135
- signal.addEventListener("abort", onAbort, { once: true });
136
- process.stdin.on("data", onData);
137
- process.stdin.on("end", onEnd);
138
- process.stdin.on("error", onErr);
139
- });
140
- }
141
- //# sourceMappingURL=save.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"save.js","sourceRoot":"","sources":["../../src/commands/save.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- import { z } from "zod";
2
- import type { Command, CommandContext } from "./ports.js";
3
- export declare class SessionCommand implements Command {
4
- readonly name = "session";
5
- readonly summary = "Start a live session for this folder; re-running reconnects to the same project";
6
- readonly schema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
7
- run(ctx: CommandContext): Promise<void>;
8
- }
9
- //# sourceMappingURL=session.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAaxB,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAO1D,qBAAa,cAAe,YAAW,OAAO;IAC5C,QAAQ,CAAC,IAAI,aAAa;IAC1B,QAAQ,CAAC,OAAO,qFAAqF;IACrG,QAAQ,CAAC,MAAM,iDAAU;IAEnB,GAAG,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAkO9C"}
@@ -1,282 +0,0 @@
1
- // src/commands/session.ts — `pocketdev session` (the default action of bare `pocketdev`).
2
- //
3
- // A RESUMABLE live session: the folder is bound to one cloud project (id persisted in
4
- // ./.pocketdev/config.json). The first run creates the project; re-running in the same folder
5
- // RECONNECTS to it instead of creating a new one. It syncs the folder, holds a WS open (which
6
- // auto-reconnects on drops), watches for live edits, and on Ctrl-C ends the session but KEEPS the
7
- // project so the next run resumes it.
8
- import { basename } from "node:path";
9
- import { z } from "zod";
10
- import { SyncReconciler } from "../sync/reconciler.js";
11
- import { uploadGit } from "../sync/git-sync.js";
12
- import { walkProject } from "../sync/walk.js";
13
- import { watchProject } from "../sync/watch.js";
14
- import { DeviceTerminalResponder, loadPtyModule } from "../transport/device-terminal.js";
15
- import { DeviceGitResponder } from "../transport/device-git.js";
16
- import { DeviceHttpResponder } from "../transport/device-http.js";
17
- import { DeviceBrowserResponder, findChrome } from "../transport/device-browser.js";
18
- import { WsStreamTransport } from "../transport/ws-stream-transport.js";
19
- import { writeProjectConfig } from "./push.js";
20
- import { bindArgs, parseArgs } from "./ports.js";
21
- const schema = z.object({});
22
- const DASHBOARD = "http://localhost:3003/projects";
23
- export class SessionCommand {
24
- name = "session";
25
- summary = "Start a live session for this folder; re-running reconnects to the same project";
26
- schema = schema;
27
- async run(ctx) {
28
- parseArgs(this.schema, bindArgs(ctx.argv, []));
29
- const resolved = ctx.config.resolve();
30
- if (resolved.profile.mode !== "remote") {
31
- ctx.renderer.error("Sessions require a FULL-REMOTE host.", "Select a remote profile (mode=remote).");
32
- return;
33
- }
34
- // Single-command UX: `pocketdev` signs you in INLINE when needed (no separate `pocketdev login`). The
35
- // device-flow prompt prints the sign-in URL + code to this terminal. A non-interactive pipe can't
36
- // prompt, so we surface the auth error there instead.
37
- try {
38
- await ctx.auth.getAuthHeader();
39
- }
40
- catch (err) {
41
- if (ctx.nonInteractive)
42
- throw err;
43
- ctx.renderer.stream("Not signed in — starting sign-in…\n");
44
- await ctx.auth.login();
45
- ctx.renderer.stream("Signed in.\n");
46
- }
47
- const cwd = process.cwd();
48
- const projectName = resolved.projectName ?? (basename(cwd) || "session");
49
- // 1. Resume the folder's bound project if it still exists; otherwise create + bind a new one.
50
- const bound = resolved.projectId
51
- ? await ctx.http
52
- .get("/api/projects")
53
- .then((list) => list.find((p) => p.id === resolved.projectId))
54
- .catch(() => undefined)
55
- : undefined;
56
- let project;
57
- let reconnected = false;
58
- if (bound) {
59
- project = { id: bound.id, name: bound.name };
60
- reconnected = true;
61
- }
62
- else {
63
- const body = { name: projectName }; // persistent (not ephemeral → resumable)
64
- const created = await ctx.http.post("/api/projects", body);
65
- project = { id: created.id, name: created.name };
66
- writeProjectConfig(cwd, project.id, project.name); // bind the folder → ./.pocketdev/config.json
67
- }
68
- let stream;
69
- let deviceResponder;
70
- let deviceGitResponder;
71
- let deviceHttpResponder;
72
- let deviceBrowserResponder;
73
- let tearing = false;
74
- const watchAbort = new AbortController();
75
- // Ctrl-C ends the session but KEEPS the project (so the next run resumes it). `silent` suppresses the
76
- // "project kept" note when the caller already explained why the session ended (e.g. project deleted).
77
- const teardown = async (opts) => {
78
- if (tearing)
79
- return;
80
- tearing = true;
81
- try {
82
- deviceResponder?.stop(); // kill any local PTYs we spawned for the dashboard
83
- deviceGitResponder?.stop();
84
- deviceHttpResponder?.stop();
85
- deviceBrowserResponder?.stop();
86
- if (stream)
87
- await stream.close();
88
- }
89
- catch {
90
- /* ignore */
91
- }
92
- if (!ctx.json && !opts?.silent)
93
- ctx.renderer.stream("\nSession ended — project kept (reconnect with `pocketdev`).\n");
94
- };
95
- const onSigint = () => {
96
- watchAbort.abort();
97
- void teardown().finally(() => process.exit(0));
98
- };
99
- process.once("SIGINT", onSigint);
100
- try {
101
- const maxBytes = resolved.maxFileBytes ?? 2_000_000;
102
- const projectHeader = { "X-Pocketdev-Project": project.id };
103
- const tty = !ctx.nonInteractive && !ctx.json;
104
- // Two-way sync arbiter: shares one content-hash map between the upward watcher and the downward
105
- // (host → local) apply, so dashboard-created/edited files land here without echo loops.
106
- const reconciler = new SyncReconciler(cwd, ctx.http, projectHeader, ctx.json ? undefined : (l) => ctx.renderer.stream(l));
107
- // 2. Sync the workspace (compact progress badge on a TTY).
108
- const { files, skippedBinary } = await walkProject(cwd, maxBytes);
109
- let done = 0;
110
- for (const f of files) {
111
- await ctx.http.put("/api/file", { path: f.relPath, content: f.content }, projectHeader);
112
- if (tty)
113
- ctx.renderer.stream(`\r⟳ syncing ${++done}/${files.length}…`);
114
- }
115
- if (tty)
116
- ctx.renderer.stream("\r\x1b[K");
117
- reconciler.seed(files); // baseline: don't re-apply what we just uploaded
118
- // 2b. Best-effort git snapshot for the dashboard.
119
- try {
120
- const g = await uploadGit(ctx.http, cwd, project.id);
121
- if (g && !ctx.json) {
122
- ctx.renderer.stream(`git: ${g.branch || "(detached)"} · ${g.commits} commits · ${g.changes} changed${g.bundle ? " · bundle" : ""}\n`);
123
- }
124
- }
125
- catch {
126
- /* git sync is best-effort */
127
- }
128
- // 3. Open the live session socket. It auto-reconnects on drops; surface that as status. NOT
129
- // ephemeral, so the host never reaps the project (it survives Ctrl-C and outages → resumable).
130
- const onStatus = (s) => {
131
- if (!ctx.json)
132
- ctx.renderer.stream(s === "reconnecting" ? "\n⚠ connection lost — reconnecting…\n" : "✓ reconnected\n");
133
- };
134
- // Terminal sharing needs node-pty. Only register as the project's PTY provider (role:"device")
135
- // when we can actually serve PTYs — otherwise the host would route the dashboard's terminal to a
136
- // device that can't answer (it would hang). Without node-pty we connect as a normal session.
137
- const pty = loadPtyModule();
138
- // role:"device" → the dashboard's terminal runs a real shell HERE (this folder, your local tools).
139
- stream = new WsStreamTransport(ctx.config.profile(), ctx.auth, undefined, {
140
- project: project.id,
141
- ...(pty.module ? { role: "device" } : {}),
142
- onStatus,
143
- });
144
- await connectWithRetry(stream, watchAbort.signal, ctx, tty);
145
- if (watchAbort.signal.aborted)
146
- return; // Ctrl-C during the connect retries
147
- if (pty.module) {
148
- deviceResponder = new DeviceTerminalResponder(stream, pty.module, cwd);
149
- deviceResponder.start();
150
- // Same device role serves the dashboard's Source Control writes (checkout/stage/commit). A
151
- // checkout switches the whole working tree; the live watcher can miss that bulk change, so we
152
- // re-walk and reconcile the full delta to the host (PUT changed/new, DELETE vanished paths) —
153
- // otherwise old-branch files linger and the file tree shows two branches mixed.
154
- deviceGitResponder = new DeviceGitResponder(stream, cwd, async () => {
155
- try {
156
- const { files } = await walkProject(cwd, maxBytes);
157
- await reconciler.resyncWorkingTree(files);
158
- await uploadGit(ctx.http, cwd, project.id, { skipBundle: true });
159
- }
160
- catch {
161
- /* best-effort; the watcher + next checkout self-heal */
162
- }
163
- });
164
- deviceGitResponder.start();
165
- // …and the dashboard's website preview (fetch this machine's localhost on its behalf).
166
- deviceHttpResponder = new DeviceHttpResponder(stream);
167
- deviceHttpResponder.start();
168
- // …and the live browser preview: run a REAL browser here, stream it to the dashboard. Needs an
169
- // installed Chrome/Edge; if none is found we skip it (the dashboard shows a clear message).
170
- const chrome = findChrome();
171
- if (chrome) {
172
- deviceBrowserResponder = new DeviceBrowserResponder(stream, chrome);
173
- deviceBrowserResponder.start();
174
- }
175
- }
176
- // The host deleted this project → end the session gracefully (don't reconnect into 403s). teardown()
177
- // sets the transport's `closing` flag synchronously, so the host's follow-up socket close is a no-op.
178
- stream.onRaw("project:deleted", () => {
179
- if (!ctx.json)
180
- ctx.renderer.stream("\nProject deleted on the host — ending session.\n");
181
- watchAbort.abort();
182
- void teardown({ silent: true }).finally(() => process.exit(0));
183
- });
184
- // Two-way sync (host → local): apply files:changed the host broadcasts (e.g. dashboard edits).
185
- stream.onRaw("files:changed", (c) => {
186
- const change = c;
187
- if (change && change.path)
188
- void reconciler.applyRemote(change);
189
- });
190
- if (ctx.json) {
191
- ctx.renderer.stream(JSON.stringify({ ok: true, projectId: project.id, name: project.name, uploaded: files.length, skippedBinary, reconnected }) + "\n");
192
- }
193
- else {
194
- const bin = skippedBinary ? ` (${skippedBinary} binar${skippedBinary === 1 ? "y" : "ies"} skipped)` : "";
195
- ctx.renderer.stream(`${reconnected ? "Reconnected to" : "Synced to"} project '${project.name}'${bin}.\n`);
196
- ctx.renderer.stream(`Live at ${DASHBOARD}/${project.id}\n`);
197
- if (deviceResponder) {
198
- ctx.renderer.stream("Terminal sharing ON — open a terminal in the dashboard to run a shell (and `claude`) here.\n");
199
- }
200
- else {
201
- ctx.renderer.stream("Terminal sharing OFF — the dashboard terminal will fall back to the host shell.\n");
202
- if (pty.error)
203
- ctx.renderer.stream(` node-pty failed to load: ${pty.error}\n`);
204
- }
205
- ctx.renderer.stream("Session active — edits sync live; reconnects automatically; Ctrl-C to end (project kept).\n");
206
- }
207
- // Debounced git-metadata refresh so the dashboard's edit highlighting tracks the working tree.
208
- let gitTimer;
209
- const refreshGit = () => {
210
- clearTimeout(gitTimer);
211
- gitTimer = setTimeout(() => {
212
- void uploadGit(ctx.http, cwd, project.id, { skipBundle: true }).catch(() => undefined);
213
- }, 1500);
214
- };
215
- // 4. Live sync: watch the folder and mirror edits (PUT) / deletes (DELETE). Holds the process
216
- // open — resolves only when Ctrl-C aborts it.
217
- await watchProject(cwd, maxBytes, {
218
- onUpsert: async (rel, content) => {
219
- if (!reconciler.upsertShouldPush(rel, content))
220
- return; // echo of a host change we just applied
221
- try {
222
- await ctx.http.put("/api/file", { path: rel, content }, projectHeader);
223
- if (!ctx.json)
224
- ctx.renderer.stream(` ↑ ${rel}\n`);
225
- }
226
- catch {
227
- /* transient (offline blip); the next save re-syncs */
228
- }
229
- refreshGit();
230
- },
231
- onDelete: async (rel) => {
232
- if (!reconciler.deleteShouldPush(rel))
233
- return; // already removed by a host-applied delete
234
- try {
235
- await ctx.http.del(`/api/file?path=${encodeURIComponent(rel)}`, projectHeader);
236
- if (!ctx.json)
237
- ctx.renderer.stream(` ✗ ${rel}\n`);
238
- }
239
- catch {
240
- /* ignore */
241
- }
242
- refreshGit();
243
- },
244
- }, watchAbort.signal);
245
- }
246
- catch (err) {
247
- process.off("SIGINT", onSigint);
248
- await teardown();
249
- throw err;
250
- }
251
- }
252
- }
253
- /** Retry the initial WS connect with capped backoff until connected or Ctrl-C (so a briefly-down host
254
- * recovers instead of erroring out). Drops AFTER the first connect are handled by the transport. */
255
- async function connectWithRetry(stream, signal, ctx, tty) {
256
- for (let attempt = 0; !signal.aborted; attempt++) {
257
- try {
258
- await stream.connect();
259
- if (tty && attempt > 0)
260
- ctx.renderer.stream("\r\x1b[K");
261
- return;
262
- }
263
- catch {
264
- const delay = Math.min(30_000, 1_000 * 2 ** Math.min(attempt, 5));
265
- if (tty)
266
- ctx.renderer.stream(`\rHost unreachable — retrying in ${Math.round(delay / 1000)}s… `);
267
- await sleep(delay, signal);
268
- }
269
- }
270
- }
271
- function sleep(ms, signal) {
272
- return new Promise((resolve) => {
273
- if (signal.aborted)
274
- return resolve();
275
- const t = setTimeout(resolve, ms);
276
- signal.addEventListener("abort", () => {
277
- clearTimeout(t);
278
- resolve();
279
- }, { once: true });
280
- });
281
- }
282
- //# sourceMappingURL=session.js.map