@fabiofiorita/porcelain 0.78.0 → 0.80.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 (59) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/server/src/bootstrap/watch-host.mjs +115 -0
  4. package/server/src/cli/main.mjs +8100 -6816
  5. package/web/dist/assets/_-BshWuX2r.js +1 -0
  6. package/web/dist/assets/_layerId-B2Mhwdgd.js +1 -0
  7. package/web/dist/assets/_paired-BsiX749W.js +1 -0
  8. package/web/dist/assets/{_paired-BQ0y29Xb.js → _paired-ByXCZfON.js} +1 -1
  9. package/web/dist/assets/_paired-Qv7e73Az.js +1 -0
  10. package/web/dist/assets/_paired-RaEpohFx.js +1 -0
  11. package/web/dist/assets/_projectId-K3HYfGmC.js +1 -0
  12. package/web/dist/assets/_reviewId-BgaLSHh-.js +1 -0
  13. package/web/dist/assets/{_revision-BMXAJq_Z.js → _revision-CEkztxVf.js} +1 -1
  14. package/web/dist/assets/_section-eV0dGQ8T.js +1 -0
  15. package/web/dist/assets/_worktreeId-BsiX749W.js +1 -0
  16. package/web/dist/assets/_worktreeId-C634iX0I.js +1 -0
  17. package/web/dist/assets/_worktreeId-Dp2IijNU.js +1 -0
  18. package/web/dist/assets/_worktreeId-RaEpohFx.js +1 -0
  19. package/web/dist/assets/access-CgdAbsDB.js +19 -0
  20. package/web/dist/assets/connected-workspace-73Vq_-Pm.js +1 -0
  21. package/web/dist/assets/desktop-actions-DbUXvsow.js +1 -0
  22. package/web/dist/assets/{edit-file-Bcu9LCmp.js → edit-file-NoqbTKtz.js} +20 -20
  23. package/web/dist/assets/{file-editor-B_jE48tv.js → file-editor-BcKWP6Pq.js} +2 -2
  24. package/web/dist/assets/index-CEW83Kj-.css +2 -0
  25. package/web/dist/assets/index-iGH92IrA.js +10 -0
  26. package/web/dist/assets/{lazyRouteComponent-C0NLdQ95.js → lazyRouteComponent-DGmhBXYn.js} +1 -1
  27. package/web/dist/assets/pair-Cs-YnRFF.js +1 -0
  28. package/web/dist/assets/pair-RaEpohFx.js +1 -0
  29. package/web/dist/assets/review-route-C2awZrL6.js +1 -0
  30. package/web/dist/assets/reviews-BkUaPv4P.js +1413 -0
  31. package/web/dist/assets/reviews-DLioOiRN.css +1 -0
  32. package/web/dist/assets/useMatch-DNkNC5QD.js +1 -0
  33. package/web/dist/assets/useRouterState-7m7hAzAG.js +1 -0
  34. package/web/dist/assets/workspace-error-DZyPmDw9.js +1 -0
  35. package/web/dist/assets/{workspace-pending-DgQgV-cu.js → workspace-pending-D8mUCjic.js} +1 -1
  36. package/web/dist/index.html +9 -8
  37. package/web/dist/assets/_-CSJHpFdT.js +0 -1
  38. package/web/dist/assets/_layerId-DODyO-4v.js +0 -1
  39. package/web/dist/assets/_paired-Bse7nsmg.js +0 -1
  40. package/web/dist/assets/_paired-CmZDjtRz.js +0 -1
  41. package/web/dist/assets/_paired-CrNFab02.js +0 -1
  42. package/web/dist/assets/_reviewId-CBVBAvNp.js +0 -1
  43. package/web/dist/assets/_section-DdvA8EEA.js +0 -1
  44. package/web/dist/assets/_worktreeId-B27bXYEK.js +0 -1
  45. package/web/dist/assets/_worktreeId-Bse7nsmg.js +0 -1
  46. package/web/dist/assets/_worktreeId-C8Q6GcvL.js +0 -1
  47. package/web/dist/assets/_worktreeId-CmZDjtRz.js +0 -1
  48. package/web/dist/assets/access-E2mYEqnl.js +0 -19
  49. package/web/dist/assets/connected-workspace-8ch85vkt.js +0 -1
  50. package/web/dist/assets/desktop-actions-BPv0J8RL.js +0 -1
  51. package/web/dist/assets/index-BHlOFndd.js +0 -10
  52. package/web/dist/assets/index-Bg-CecA5.css +0 -2
  53. package/web/dist/assets/pair-Bse7nsmg.js +0 -1
  54. package/web/dist/assets/pair-CbpILDh2.js +0 -1
  55. package/web/dist/assets/review-route-CZyVDwAY.js +0 -1
  56. package/web/dist/assets/reviews-DCiXZMLG.js +0 -1404
  57. package/web/dist/assets/useMatch-CPSFM0JI.js +0 -1
  58. package/web/dist/assets/useRouterState-DtsAJKLm.js +0 -1
  59. package/web/dist/assets/workspace-error-DIuDMViV.js +0 -1
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # @fabiofiorita/porcelain (0.78.0)
1
+ # @fabiofiorita/porcelain (0.80.0)
2
2
 
3
3
  The Porcelain review server and bundled web app for a plain Node installation.
4
4
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fabiofiorita/porcelain",
3
- "version": "0.78.0",
3
+ "version": "0.80.0",
4
4
  "description": "Review coding agents’ changes from a browser, Mac or phone",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -0,0 +1,115 @@
1
+ // apps/server/src/bootstrap/watch-host.ts
2
+ import { createInterface } from "node:readline";
3
+
4
+ // apps/server/src/adapters/events/watch-host-protocol.ts
5
+ import { Schema } from "effect";
6
+ var watchHostRequest = Schema.Union([
7
+ Schema.Struct({
8
+ kind: Schema.Literal("subscribe"),
9
+ request: Schema.Int,
10
+ subscription: Schema.Int,
11
+ directory: Schema.String,
12
+ ignore: Schema.Array(Schema.String)
13
+ }),
14
+ Schema.Struct({
15
+ kind: Schema.Literal("unsubscribe"),
16
+ request: Schema.Int,
17
+ subscription: Schema.Int
18
+ }),
19
+ Schema.Struct({
20
+ kind: Schema.Literal("ping"),
21
+ request: Schema.Int
22
+ })
23
+ ]);
24
+ var watchHostEvent = Schema.Struct({
25
+ path: Schema.String,
26
+ type: Schema.Literals(["create", "update", "delete"])
27
+ });
28
+ var watchHostMessage = Schema.Union([
29
+ Schema.Struct({
30
+ kind: Schema.Literal("answer"),
31
+ request: Schema.Int,
32
+ failure: Schema.optional(Schema.String)
33
+ }),
34
+ Schema.Struct({
35
+ kind: Schema.Literal("events"),
36
+ subscription: Schema.Int,
37
+ failure: Schema.optional(Schema.String),
38
+ events: Schema.Array(watchHostEvent)
39
+ })
40
+ ]);
41
+ var decodeWatchHostRequest = Schema.decodeUnknownOption(
42
+ Schema.fromJsonString(watchHostRequest)
43
+ );
44
+ var decodeWatchHostMessage = Schema.decodeUnknownOption(
45
+ Schema.fromJsonString(watchHostMessage)
46
+ );
47
+
48
+ // apps/server/src/bootstrap/watch-host.ts
49
+ var parcelWatcher = await import("@parcel/watcher");
50
+ var subscriptions = /* @__PURE__ */ new Map();
51
+ var turns = /* @__PURE__ */ new Map();
52
+ function send(message) {
53
+ process.stdout.write(`${JSON.stringify(message)}
54
+ `);
55
+ }
56
+ function reason(error) {
57
+ return error instanceof Error ? error.message : String(error);
58
+ }
59
+ function options(ignore) {
60
+ return process.platform === "linux" ? { backend: "inotify", ignore: [...ignore] } : { ignore: [...ignore] };
61
+ }
62
+ async function release(subscription) {
63
+ const current = subscriptions.get(subscription);
64
+ subscriptions.delete(subscription);
65
+ await current?.unsubscribe();
66
+ }
67
+ async function watch(request) {
68
+ await release(request.subscription);
69
+ subscriptions.set(
70
+ request.subscription,
71
+ await parcelWatcher.subscribe(
72
+ request.directory,
73
+ (error, events) => send({
74
+ kind: "events",
75
+ subscription: request.subscription,
76
+ ...error ? { failure: reason(error) } : {},
77
+ events: events.map((event) => ({
78
+ path: event.path,
79
+ type: event.type
80
+ }))
81
+ }),
82
+ options(request.ignore)
83
+ )
84
+ );
85
+ }
86
+ function inTurn(subscription, work) {
87
+ const done = (turns.get(subscription) ?? Promise.resolve()).then(work, work);
88
+ const settled = done.then(
89
+ () => void 0,
90
+ () => void 0
91
+ );
92
+ turns.set(subscription, settled);
93
+ void settled.then(() => {
94
+ if (turns.get(subscription) === settled) turns.delete(subscription);
95
+ });
96
+ return done;
97
+ }
98
+ function handle(request) {
99
+ if (request.kind === "ping") return Promise.resolve();
100
+ if (request.kind === "subscribe")
101
+ return inTurn(request.subscription, () => watch(request));
102
+ return inTurn(request.subscription, () => release(request.subscription));
103
+ }
104
+ createInterface({ input: process.stdin, crlfDelay: Number.POSITIVE_INFINITY }).on("line", (line) => {
105
+ const request = decodeWatchHostRequest(line);
106
+ if (request._tag === "None") return;
107
+ handle(request.value).then(
108
+ () => send({ kind: "answer", request: request.value.request }),
109
+ (error) => send({
110
+ kind: "answer",
111
+ request: request.value.request,
112
+ failure: reason(error)
113
+ })
114
+ );
115
+ }).on("close", () => process.exit(0));