@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,107 +0,0 @@
1
- // DeviceGitResponder — makes the CLI execute git WRITE ops for the dashboard's Source Control panel.
2
- //
3
- // The host has no real `.git` for remote projects, so checkout / stage / unstage / commit run HERE (the
4
- // user's machine, where the real repo lives) and the fresh GitMeta is shipped back. It's a request/
5
- // response over device:git:* (deliberately OUTSIDE the frozen contract, like device:terminal:*), with a
6
- // `reqId` the host uses to correlate its pending HTTP call.
7
- import { git, readLocalGit } from "../sync/git.js";
8
- export class DeviceGitResponder {
9
- stream;
10
- cwd;
11
- onAfterCheckout;
12
- unsubs = [];
13
- constructor(stream, cwd = process.cwd(),
14
- // Fired after a successful `checkout` so the device can reconcile the bulk working-tree change
15
- // back to the host (the live watcher misses bulk git ops). Fire-and-forget, post-response.
16
- onAfterCheckout) {
17
- this.stream = stream;
18
- this.cwd = cwd;
19
- this.onAfterCheckout = onAfterCheckout;
20
- }
21
- start() {
22
- this.unsubs.push(this.stream.onRaw("device:git:request", (p) => void this.onRequest(p).catch(() => { })));
23
- }
24
- stop() {
25
- for (const u of this.unsubs)
26
- u();
27
- this.unsubs.length = 0;
28
- }
29
- async onRequest(payload) {
30
- const req = (payload ?? {});
31
- const { reqId, op } = req;
32
- if (!reqId || !op)
33
- return;
34
- try {
35
- let branches;
36
- let checkedOut = false;
37
- switch (op) {
38
- case "branches":
39
- branches = await this.listBranches();
40
- break;
41
- case "checkout":
42
- if (!req.branch)
43
- throw new Error("branch required");
44
- await git(this.cwd, ["checkout", req.branch]);
45
- checkedOut = true;
46
- break;
47
- case "add":
48
- if (!req.paths?.length)
49
- throw new Error("paths required");
50
- await git(this.cwd, ["add", "--", ...req.paths]);
51
- break;
52
- case "unstage":
53
- if (!req.paths?.length)
54
- throw new Error("paths required");
55
- await this.unstage(req.paths);
56
- break;
57
- case "commit":
58
- if (!req.message?.trim())
59
- throw new Error("commit message required");
60
- await git(this.cwd, ["commit", "-m", req.message]);
61
- break;
62
- default:
63
- throw new Error(`unknown op: ${String(op)}`);
64
- }
65
- // Re-read the local state so the dashboard updates immediately from the response.
66
- const local = await readLocalGit(this.cwd);
67
- this.stream.sendRaw("device:git:response", { reqId, ok: true, meta: local?.meta, branches });
68
- // A checkout is a bulk working-tree change the live watcher can miss — reconcile the full tree
69
- // to the host AFTER replying (so the branch label updates instantly and we don't hold up the
70
- // relay). The dashboard's SSE/poll refresh then reflects each PUT/DELETE as it lands.
71
- if (checkedOut)
72
- void this.onAfterCheckout?.();
73
- }
74
- catch (err) {
75
- this.stream.sendRaw("device:git:response", { reqId, ok: false, error: cleanGitError(err) });
76
- }
77
- }
78
- async listBranches() {
79
- const out = await git(this.cwd, ["branch", "--format=%(refname:short)"]);
80
- return out
81
- .split("\n")
82
- .map((l) => l.trim())
83
- .filter(Boolean);
84
- }
85
- async unstage(paths) {
86
- try {
87
- await git(this.cwd, ["restore", "--staged", "--", ...paths]);
88
- }
89
- catch {
90
- // Older git without `restore` — fall back to the classic unstage.
91
- await git(this.cwd, ["reset", "-q", "HEAD", "--", ...paths]);
92
- }
93
- }
94
- }
95
- /** Prefer git's own output (the human-readable reason) over the raw ExecFileException message. git writes
96
- * most errors to stderr, but some (e.g. "nothing to commit") to stdout — check both. */
97
- function cleanGitError(err) {
98
- if (err && typeof err === "object") {
99
- for (const key of ["stderr", "stdout"]) {
100
- const s = String(err[key] ?? "").trim();
101
- if (s)
102
- return s.split("\n").slice(0, 3).join("\n");
103
- }
104
- }
105
- return err instanceof Error ? err.message : String(err);
106
- }
107
- //# sourceMappingURL=device-git.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"device-git.js","sourceRoot":"","sources":["../../src/transport/device-git.ts"],"names":[],"mappings":"AAAA,qGAAqG;AACrG,EAAE;AACF,wGAAwG;AACxG,oGAAoG;AACpG,wGAAwG;AACxG,4DAA4D;AAE5D,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAWnD,MAAM,OAAO,kBAAkB;IAIV;IACA;IAGA;IAPF,MAAM,GAAsB,EAAE,CAAC;IAEhD,YACmB,MAAyB,EACzB,MAAc,OAAO,CAAC,GAAG,EAAE;IAC5C,+FAA+F;IAC/F,2FAA2F;IAC1E,eAA4C;QAJ5C,WAAM,GAAN,MAAM,CAAmB;QACzB,QAAG,GAAH,GAAG,CAAwB;QAG3B,oBAAe,GAAf,eAAe,CAA6B;IAC5D,CAAC;IAEJ,KAAK;QACH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3G,CAAC;IAED,IAAI;QACF,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM;YAAE,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACzB,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,OAAgB;QACtC,MAAM,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAe,CAAC;QAC1C,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC;QAC1B,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE;YAAE,OAAO;QAC1B,IAAI,CAAC;YACH,IAAI,QAA8B,CAAC;YACnC,IAAI,UAAU,GAAG,KAAK,CAAC;YACvB,QAAQ,EAAE,EAAE,CAAC;gBACX,KAAK,UAAU;oBACb,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;oBACrC,MAAM;gBACR,KAAK,UAAU;oBACb,IAAI,CAAC,GAAG,CAAC,MAAM;wBAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;oBACpD,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;oBAC9C,UAAU,GAAG,IAAI,CAAC;oBAClB,MAAM;gBACR,KAAK,KAAK;oBACR,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM;wBAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;oBAC1D,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;oBACjD,MAAM;gBACR,KAAK,SAAS;oBACZ,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM;wBAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;oBAC1D,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBAC9B,MAAM;gBACR,KAAK,QAAQ;oBACX,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE;wBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;oBACrE,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;oBACnD,MAAM;gBACR;oBACE,MAAM,IAAI,KAAK,CAAC,eAAe,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACjD,CAAC;YACD,kFAAkF;YAClF,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC3C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC7F,+FAA+F;YAC/F,6FAA6F;YAC7F,sFAAsF;YACtF,IAAI,UAAU;gBAAE,KAAK,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QAChD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,2BAA2B,CAAC,CAAC,CAAC;QACzE,OAAO,GAAG;aACP,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,OAAO,CAAC,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,KAAe;QACnC,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,kEAAkE;YAClE,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;CACF;AAED;yFACyF;AACzF,SAAS,aAAa,CAAC,GAAY;IACjC,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACnC,KAAK,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAU,EAAE,CAAC;YAChD,MAAM,CAAC,GAAG,MAAM,CAAE,GAA+B,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACrE,IAAI,CAAC;gBAAE,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IACD,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC1D,CAAC"}
@@ -1,10 +0,0 @@
1
- import type { WsStreamTransport } from "./ws-stream-transport.js";
2
- export declare class DeviceHttpResponder {
3
- private readonly stream;
4
- private readonly unsubs;
5
- constructor(stream: WsStreamTransport);
6
- start(): void;
7
- stop(): void;
8
- private onRequest;
9
- }
10
- //# sourceMappingURL=device-http.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"device-http.d.ts","sourceRoot":"","sources":["../../src/transport/device-http.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAgBlE,qBAAa,mBAAmB;IAGlB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;gBAEnB,MAAM,EAAE,iBAAiB;IAEtD,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI;YAKE,SAAS;CA6BxB"}
@@ -1,96 +0,0 @@
1
- // DeviceHttpResponder — serves the dashboard's WEBSITE PREVIEW by fetching the user's own localhost.
2
- //
3
- // A dev server (next dev, vite, …) runs on http://127.0.0.1:<port> on THIS machine. The dashboard is a
4
- // browser elsewhere, so it can't reach that localhost directly. The host relays each request here (the
5
- // device), we fetch it locally, and ship the response back — request/response over device:http:* (outside
6
- // the frozen contract, like device:git:* / device:terminal:*), correlated by `reqId`.
7
- //
8
- // Bodies are base64 on the wire so binary assets (images, fonts, wasm) survive the JSON relay intact.
9
- //
10
- // Redirects are NOT followed here — we return the real 3xx status + Location so the proxy can rewrite it
11
- // and the iframe NAVIGATES (browser-like), which is what makes cross-port redirects work. (We use node:http
12
- // rather than fetch: fetch's redirect:"manual" yields an opaque status-0 response with no Location, and
13
- // "follow" hides the hop on the device — both break the navigate-like-a-browser behavior.)
14
- import * as http from "node:http";
15
- // Hop-by-hop / length headers we must not forward verbatim. We strip accept-encoding so the dev server
16
- // returns UNcompressed bytes (node:http does not auto-decompress); host/connection/content-length are set
17
- // per-request from the actual target + body.
18
- const STRIP_REQ_HEADERS = new Set(["host", "connection", "content-length", "accept-encoding"]);
19
- export class DeviceHttpResponder {
20
- stream;
21
- unsubs = [];
22
- constructor(stream) {
23
- this.stream = stream;
24
- }
25
- start() {
26
- this.unsubs.push(this.stream.onRaw("device:http:request", (p) => void this.onRequest(p).catch(() => { })));
27
- }
28
- stop() {
29
- for (const u of this.unsubs)
30
- u();
31
- this.unsubs.length = 0;
32
- }
33
- async onRequest(payload) {
34
- const req = (payload ?? {});
35
- const { reqId, port } = req;
36
- const method = req.method || "GET";
37
- const path = req.path || "/";
38
- if (!reqId || !port)
39
- return;
40
- try {
41
- const headers = {};
42
- for (const [k, v] of Object.entries(req.headers ?? {})) {
43
- if (!STRIP_REQ_HEADERS.has(k.toLowerCase()))
44
- headers[k] = v;
45
- }
46
- const hasBody = method !== "GET" && method !== "HEAD" && typeof req.body === "string";
47
- const bodyBuf = hasBody ? Buffer.from(req.body, "base64") : undefined;
48
- if (bodyBuf)
49
- headers["content-length"] = String(bodyBuf.length);
50
- const res = await fetchLocal(port, method, path, headers, bodyBuf);
51
- this.stream.sendRaw("device:http:response", {
52
- reqId,
53
- ok: true,
54
- status: res.status,
55
- headers: res.headers,
56
- body: res.body.toString("base64"),
57
- });
58
- }
59
- catch (err) {
60
- this.stream.sendRaw("device:http:response", { reqId, ok: false, error: cleanFetchError(err, port) });
61
- }
62
- }
63
- }
64
- // Raw localhost request that does NOT follow redirects — so a 3xx (e.g. a cross-port redirect) is returned
65
- // verbatim with its Location header for the proxy to rewrite + the iframe to navigate, like a browser.
66
- function fetchLocal(port, method, path, headers, body) {
67
- return new Promise((resolve, reject) => {
68
- const r = http.request({ host: "127.0.0.1", port, method, path, headers }, (res) => {
69
- const chunks = [];
70
- res.on("data", (c) => chunks.push(c));
71
- res.on("end", () => {
72
- const h = {};
73
- for (const [k, v] of Object.entries(res.headers)) {
74
- if (v === undefined)
75
- continue;
76
- h[k] = Array.isArray(v) ? v.join(", ") : v;
77
- }
78
- resolve({ status: res.statusCode ?? 502, headers: h, body: Buffer.concat(chunks) });
79
- });
80
- res.on("error", reject);
81
- });
82
- r.on("error", reject);
83
- if (body)
84
- r.write(body);
85
- r.end();
86
- });
87
- }
88
- /** A failed local request usually means no dev server is listening on that port — make that legible. */
89
- function cleanFetchError(err, port) {
90
- const e = err;
91
- if (e?.code === "ECONNREFUSED" || e?.cause?.code === "ECONNREFUSED") {
92
- return `Nothing is listening on localhost:${port} — start your dev server there.`;
93
- }
94
- return err instanceof Error ? err.message : String(err);
95
- }
96
- //# sourceMappingURL=device-http.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"device-http.js","sourceRoot":"","sources":["../../src/transport/device-http.ts"],"names":[],"mappings":"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"}
@@ -1,44 +0,0 @@
1
- import type { WsStreamTransport } from "./ws-stream-transport.js";
2
- /** The slice of node-pty we use (typed locally so the build doesn't require the native module present). */
3
- interface IPty {
4
- onData(cb: (data: string) => void): void;
5
- onExit(cb: (e: {
6
- exitCode: number;
7
- }) => void): void;
8
- write(data: string): void;
9
- resize(cols: number, rows: number): void;
10
- kill(): void;
11
- }
12
- export interface PtyModule {
13
- spawn(file: string, args: string[] | string, opts: {
14
- name?: string;
15
- cols?: number;
16
- rows?: number;
17
- cwd?: string;
18
- env?: NodeJS.ProcessEnv;
19
- }): IPty;
20
- }
21
- /** Load node-pty at runtime. Returns the module, or the error explaining why terminal sharing is off
22
- * (most often a native-module ABI mismatch when `pocketdev` runs under a different Node than it built
23
- * against). The error is surfaced to the user so the failure isn't silent. */
24
- export declare function loadPtyModule(): {
25
- module?: PtyModule;
26
- error?: string;
27
- };
28
- export declare class DeviceTerminalResponder {
29
- private readonly stream;
30
- private readonly pty;
31
- private readonly cwd;
32
- private readonly ptys;
33
- private readonly unsubs;
34
- constructor(stream: WsStreamTransport, pty: PtyModule, cwd?: string);
35
- start(): void;
36
- stop(): void;
37
- private shell;
38
- private onCreate;
39
- private onInput;
40
- private onResize;
41
- private onKill;
42
- }
43
- export {};
44
- //# sourceMappingURL=device-terminal.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"device-terminal.d.ts","sourceRoot":"","sources":["../../src/transport/device-terminal.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AA4BlE,2GAA2G;AAC3G,UAAU,IAAI;IACZ,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IACzC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IACpD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,IAAI,IAAI,IAAI,CAAC;CACd;AACD,MAAM,WAAW,SAAS;IACxB,KAAK,CACH,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,EACvB,IAAI,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;KAAE,GAC3F,IAAI,CAAC;CACT;AAED;;+EAE+E;AAC/E,wBAAgB,aAAa,IAAI;IAAE,MAAM,CAAC,EAAE,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAQtE;AAED,qBAAa,uBAAuB;IAKhC,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,GAAG;IANtB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA2B;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;gBAG7B,MAAM,EAAE,iBAAiB,EACzB,GAAG,EAAE,SAAS,EACd,GAAG,GAAE,MAAsB;IAG9C,KAAK,IAAI,IAAI;IAOb,IAAI,IAAI,IAAI;IAaZ,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,QAAQ;IAyBhB,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,MAAM;CAaf"}
@@ -1,140 +0,0 @@
1
- // DeviceTerminalResponder — makes the CLI the project's PTY PROVIDER.
2
- //
3
- // This is the inverse of terminal-transport.ts (which CONSUMES a host PTY). When the host forwards a
4
- // `device:terminal:create` (because the dashboard opened a terminal for this project), we spawn a REAL
5
- // local shell with node-pty in the user's project folder — so locally-installed tools like `claude`
6
- // work — and stream its output back over the WS. One shell per relay `term` id; the host multiplexes.
7
- //
8
- // The device:terminal:* events are deliberately OUTSIDE the frozen contract, so we ride the transport's
9
- // onRaw/sendRaw escape hatches rather than the typed on/send.
10
- import { chmodSync, existsSync } from "node:fs";
11
- import { createRequire } from "node:module";
12
- import * as os from "node:os";
13
- import { dirname, join } from "node:path";
14
- // node-pty execs a bundled `spawn-helper` binary to allocate the PTY (macOS/Linux). npm frequently drops
15
- // its executable bit when extracting the prebuild, which makes every spawn fail with "posix_spawnp
16
- // failed" → the device shell exits 1 instantly. Restore +x defensively before we use node-pty.
17
- function ensureSpawnHelperExecutable(require) {
18
- try {
19
- const root = dirname(require.resolve("node-pty/package.json"));
20
- const candidates = [
21
- join(root, "build", "Release", "spawn-helper"),
22
- ...["darwin-arm64", "darwin-x64", "linux-x64", "linux-arm64"].map((a) => join(root, "prebuilds", a, "spawn-helper")),
23
- ];
24
- for (const f of candidates) {
25
- if (existsSync(f)) {
26
- try {
27
- chmodSync(f, 0o755);
28
- }
29
- catch {
30
- /* not our file / read-only fs — best effort */
31
- }
32
- }
33
- }
34
- }
35
- catch {
36
- /* node-pty layout differs — ignore */
37
- }
38
- }
39
- /** Load node-pty at runtime. Returns the module, or the error explaining why terminal sharing is off
40
- * (most often a native-module ABI mismatch when `pocketdev` runs under a different Node than it built
41
- * against). The error is surfaced to the user so the failure isn't silent. */
42
- export function loadPtyModule() {
43
- try {
44
- const require = createRequire(import.meta.url);
45
- ensureSpawnHelperExecutable(require); // fix the common npm-drops-+x prebuild issue before first spawn
46
- return { module: require("node-pty") };
47
- }
48
- catch (err) {
49
- return { error: err instanceof Error ? err.message : String(err) };
50
- }
51
- }
52
- export class DeviceTerminalResponder {
53
- stream;
54
- pty;
55
- cwd;
56
- ptys = new Map();
57
- unsubs = [];
58
- constructor(stream, pty, cwd = process.cwd()) {
59
- this.stream = stream;
60
- this.pty = pty;
61
- this.cwd = cwd;
62
- }
63
- start() {
64
- this.unsubs.push(this.stream.onRaw("device:terminal:create", (p) => this.onCreate(p)));
65
- this.unsubs.push(this.stream.onRaw("device:terminal:input", (p) => this.onInput(p)));
66
- this.unsubs.push(this.stream.onRaw("device:terminal:resize", (p) => this.onResize(p)));
67
- this.unsubs.push(this.stream.onRaw("device:terminal:kill", (p) => this.onKill(p)));
68
- }
69
- stop() {
70
- for (const u of this.unsubs)
71
- u();
72
- this.unsubs.length = 0;
73
- for (const p of this.ptys.values()) {
74
- try {
75
- p.kill();
76
- }
77
- catch {
78
- /* already gone */
79
- }
80
- }
81
- this.ptys.clear();
82
- }
83
- shell() {
84
- return process.env.SHELL ?? (os.platform() === "win32" ? "powershell.exe" : "bash");
85
- }
86
- onCreate(payload) {
87
- const { term, cols, rows } = (payload ?? {});
88
- if (!term)
89
- return;
90
- let p;
91
- try {
92
- p = this.pty.spawn(this.shell(), [], {
93
- name: "xterm-256color",
94
- cols: cols && cols > 0 ? cols : 80,
95
- rows: rows && rows > 0 ? rows : 24,
96
- cwd: this.cwd,
97
- env: process.env,
98
- });
99
- }
100
- catch {
101
- this.stream.sendRaw("device:terminal:exit", { term, code: 1 });
102
- return;
103
- }
104
- this.ptys.set(term, p);
105
- p.onData((data) => this.stream.sendRaw("device:terminal:data", { term, data }));
106
- p.onExit((e) => {
107
- this.ptys.delete(term);
108
- this.stream.sendRaw("device:terminal:exit", { term, code: e.exitCode ?? 0 });
109
- });
110
- this.stream.sendRaw("device:terminal:ready", { term });
111
- }
112
- onInput(payload) {
113
- const { term, data } = (payload ?? {});
114
- const p = term ? this.ptys.get(term) : undefined;
115
- if (p && typeof data === "string")
116
- p.write(data);
117
- }
118
- onResize(payload) {
119
- const { term, cols, rows } = (payload ?? {});
120
- const p = term ? this.ptys.get(term) : undefined;
121
- if (p && cols && rows)
122
- p.resize(cols, rows);
123
- }
124
- onKill(payload) {
125
- const { term } = (payload ?? {});
126
- if (!term)
127
- return;
128
- const p = this.ptys.get(term);
129
- if (p) {
130
- try {
131
- p.kill();
132
- }
133
- catch {
134
- /* already gone */
135
- }
136
- this.ptys.delete(term);
137
- }
138
- }
139
- }
140
- //# sourceMappingURL=device-terminal.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"device-terminal.js","sourceRoot":"","sources":["../../src/transport/device-terminal.ts"],"names":[],"mappings":"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"}
@@ -1,26 +0,0 @@
1
- import type { AuthProvider } from "../auth/ports.js";
2
- import type { HttpPort } from "./ports.js";
3
- type Fetch = typeof fetch;
4
- export declare class HttpTransport implements HttpPort {
5
- private readonly baseUrl;
6
- private readonly auth;
7
- /** Active cloud project id; sent as `X-Pocketdev-Project` so file ops scope to the project. */
8
- private readonly projectId?;
9
- private readonly fetchImpl;
10
- constructor(baseUrl: string, auth: AuthProvider,
11
- /** Active cloud project id; sent as `X-Pocketdev-Project` so file ops scope to the project. */
12
- projectId?: string | undefined, fetchImpl?: Fetch);
13
- get<T>(path: string, query?: Record<string, string | number | undefined>, headers?: Record<string, string>): Promise<T>;
14
- put<T>(path: string, body: unknown, headers?: Record<string, string>): Promise<T>;
15
- post<T>(path: string, body: unknown, headers?: Record<string, string>): Promise<T>;
16
- del<T>(path: string, headers?: Record<string, string>): Promise<T>;
17
- postRaw<T>(path: string, body: Uint8Array, headers?: Record<string, string>): Promise<T>;
18
- private request;
19
- private headers;
20
- private parse;
21
- private toError;
22
- private absolute;
23
- private withQuery;
24
- }
25
- export {};
26
- //# sourceMappingURL=http-transport.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"http-transport.d.ts","sourceRoot":"","sources":["../../src/transport/http-transport.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,KAAK,KAAK,GAAG,OAAO,KAAK,CAAC;AAE1B,qBAAa,aAAc,YAAW,QAAQ;IAE1C,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,+FAA+F;IAC/F,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAJT,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,YAAY;IACnC,+FAA+F;IAC9E,SAAS,CAAC,EAAE,MAAM,YAAA,EAClB,SAAS,GAAE,KAAa;IAG3C,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIvH,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIjF,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIlF,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIlE,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;YAI1E,OAAO;YAqCP,OAAO;YAaP,KAAK;YAeL,OAAO;IAWrB,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,SAAS;CAYlB"}
@@ -1,125 +0,0 @@
1
- // HttpTransport — the REST HttpPort over the platform `fetch` (Node 20+ undici).
2
- //
3
- // SRP: does REST and only REST. It joins the base URL with /api/* paths, attaches the Bearer header
4
- // from the injected AuthProvider, parses JSON, and maps non-2xx to CliError via the central
5
- // `fromStatus` mapper. It performs exactly one transparent retry on 401 (after AuthProvider.refresh)
6
- // — the single retry policy lives here so commands never re-implement it.
7
- //
8
- // DIP: depends on `AuthProvider` (header source) only; it is auth-agnostic — identical for a LOCAL
9
- // loopback PAT and a REMOTE Hydra JWT. LSP: pointed at http://127.0.0.1:4317 or https://app… it
10
- // satisfies HttpPort identically.
11
- import { CliError } from "../core/errors.js";
12
- export class HttpTransport {
13
- baseUrl;
14
- auth;
15
- projectId;
16
- fetchImpl;
17
- constructor(baseUrl, auth,
18
- /** Active cloud project id; sent as `X-Pocketdev-Project` so file ops scope to the project. */
19
- projectId, fetchImpl = fetch) {
20
- this.baseUrl = baseUrl;
21
- this.auth = auth;
22
- this.projectId = projectId;
23
- this.fetchImpl = fetchImpl;
24
- }
25
- get(path, query, headers) {
26
- return this.request("GET", this.withQuery(path, query), undefined, headers);
27
- }
28
- put(path, body, headers) {
29
- return this.request("PUT", path, body, headers);
30
- }
31
- post(path, body, headers) {
32
- return this.request("POST", path, body, headers);
33
- }
34
- del(path, headers) {
35
- return this.request("DELETE", path, undefined, headers);
36
- }
37
- postRaw(path, body, headers) {
38
- return this.request("POST", path, body, headers, false, true);
39
- }
40
- async request(method, path, body, extraHeaders, isRetry = false, raw = false) {
41
- const url = this.absolute(path);
42
- // Build headers (incl. the auth header) OUTSIDE the network try/catch: a "Not signed in" /
43
- // refresh failure must surface as the auth error it is, not be masked as "Could not reach".
44
- const headers = await this.headers(body !== undefined && !raw, extraHeaders);
45
- if (raw)
46
- headers["content-type"] = "application/octet-stream";
47
- const reqBody = body === undefined ? undefined : raw ? body : JSON.stringify(body);
48
- let res;
49
- try {
50
- res = await this.fetchImpl(url, { method, headers, body: reqBody });
51
- }
52
- catch (cause) {
53
- throw CliError.network(`Could not reach ${url}.`, cause);
54
- }
55
- if (res.ok) {
56
- return this.parse(res);
57
- }
58
- // One transparent refresh-and-retry on 401 (docs §14): try AuthProvider.refresh() once.
59
- if (res.status === 401 && !isRetry) {
60
- const refreshed = await this.auth.refresh().catch(() => false);
61
- if (refreshed) {
62
- return this.request(method, path, body, extraHeaders, true, raw);
63
- }
64
- }
65
- throw await this.toError(res);
66
- }
67
- async headers(hasBody, extra) {
68
- const h = {
69
- accept: "application/json",
70
- authorization: await this.auth.getAuthHeader(),
71
- };
72
- if (this.projectId)
73
- h["x-pocketdev-project"] = this.projectId;
74
- if (hasBody)
75
- h["content-type"] = "application/json";
76
- if (extra) {
77
- for (const [k, v] of Object.entries(extra))
78
- h[k.toLowerCase()] = v;
79
- }
80
- return h;
81
- }
82
- async parse(res) {
83
- // 204 / empty bodies → resolve to undefined-as-T (e.g. PUT /api/sessions returns {ok:true} but
84
- // some endpoints are bodiless). Guard against JSON.parse on empty text.
85
- const text = await res.text();
86
- if (!text)
87
- return undefined;
88
- try {
89
- return JSON.parse(text);
90
- }
91
- catch (cause) {
92
- throw new CliError("internal", "Host returned a non-JSON response.", {
93
- status: res.status,
94
- cause,
95
- });
96
- }
97
- }
98
- async toError(res) {
99
- let body;
100
- try {
101
- const text = await res.text();
102
- body = text ? JSON.parse(text) : undefined;
103
- }
104
- catch {
105
- body = undefined;
106
- }
107
- return CliError.fromStatus(res.status, body);
108
- }
109
- absolute(path) {
110
- const base = this.baseUrl.endsWith("/") ? this.baseUrl.slice(0, -1) : this.baseUrl;
111
- return path.startsWith("/") ? `${base}${path}` : `${base}/${path}`;
112
- }
113
- withQuery(path, query) {
114
- if (!query)
115
- return path;
116
- const params = new URLSearchParams();
117
- for (const [k, v] of Object.entries(query)) {
118
- if (v !== undefined)
119
- params.set(k, String(v));
120
- }
121
- const qs = params.toString();
122
- return qs ? `${path}?${qs}` : path;
123
- }
124
- }
125
- //# sourceMappingURL=http-transport.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"http-transport.js","sourceRoot":"","sources":["../../src/transport/http-transport.ts"],"names":[],"mappings":"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"}