@multiplayer-app/agent 0.1.20 → 0.1.21

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 (290) hide show
  1. package/README.md +14 -7
  2. package/dist/agent/definition.test.js +8 -3
  3. package/dist/agent/definition.test.js.map +1 -1
  4. package/dist/agent/profiles/coding.d.ts +1 -1
  5. package/dist/agent/profiles/coding.d.ts.map +1 -1
  6. package/dist/agent/profiles/coding.js +21 -4
  7. package/dist/agent/profiles/coding.js.map +1 -1
  8. package/dist/agent/profiles/index.js +1 -1
  9. package/dist/agent/profiles/index.js.map +1 -1
  10. package/dist/agent/profiles/research.d.ts.map +1 -1
  11. package/dist/agent/profiles/research.js +2 -2
  12. package/dist/agent/profiles/research.js.map +1 -1
  13. package/dist/agent/turn-history.d.ts.map +1 -1
  14. package/dist/agent/turn-history.js +7 -1
  15. package/dist/agent/turn-history.js.map +1 -1
  16. package/dist/agent/turn-runner.d.ts +8 -0
  17. package/dist/agent/turn-runner.d.ts.map +1 -1
  18. package/dist/agent/turn-runner.js +35 -10
  19. package/dist/agent/turn-runner.js.map +1 -1
  20. package/dist/app/app-host.d.ts +57 -0
  21. package/dist/app/app-host.d.ts.map +1 -0
  22. package/dist/app/app-host.js +252 -0
  23. package/dist/app/app-host.js.map +1 -0
  24. package/dist/app/app-host.test.d.ts +2 -0
  25. package/dist/app/app-host.test.d.ts.map +1 -0
  26. package/dist/app/app-host.test.js +639 -0
  27. package/dist/app/app-host.test.js.map +1 -0
  28. package/dist/app/config.d.ts +196 -0
  29. package/dist/app/config.d.ts.map +1 -0
  30. package/dist/app/config.js +362 -0
  31. package/dist/app/config.js.map +1 -0
  32. package/dist/app/config.test.d.ts +2 -0
  33. package/dist/app/config.test.d.ts.map +1 -0
  34. package/dist/app/config.test.js +224 -0
  35. package/dist/app/config.test.js.map +1 -0
  36. package/dist/app/detect.d.ts +68 -0
  37. package/dist/app/detect.d.ts.map +1 -0
  38. package/dist/app/detect.js +449 -0
  39. package/dist/app/detect.js.map +1 -0
  40. package/dist/app/detect.test.d.ts +2 -0
  41. package/dist/app/detect.test.d.ts.map +1 -0
  42. package/dist/app/detect.test.js +267 -0
  43. package/dist/app/detect.test.js.map +1 -0
  44. package/dist/app/env.d.ts +5 -0
  45. package/dist/app/env.d.ts.map +1 -0
  46. package/dist/app/env.js +22 -0
  47. package/dist/app/env.js.map +1 -0
  48. package/dist/app/functions-cli.d.ts +3 -0
  49. package/dist/app/functions-cli.d.ts.map +1 -0
  50. package/dist/app/functions-cli.js +27 -0
  51. package/dist/app/functions-cli.js.map +1 -0
  52. package/dist/app/functions-host.d.ts +15 -0
  53. package/dist/app/functions-host.d.ts.map +1 -0
  54. package/dist/app/functions-host.js +276 -0
  55. package/dist/app/functions-host.js.map +1 -0
  56. package/dist/app/functions-host.test.d.ts +2 -0
  57. package/dist/app/functions-host.test.d.ts.map +1 -0
  58. package/dist/app/functions-host.test.js +117 -0
  59. package/dist/app/functions-host.test.js.map +1 -0
  60. package/dist/app/functions-routes.d.ts +23 -0
  61. package/dist/app/functions-routes.d.ts.map +1 -0
  62. package/dist/app/functions-routes.js +85 -0
  63. package/dist/app/functions-routes.js.map +1 -0
  64. package/dist/app/functions-routes.test.d.ts +2 -0
  65. package/dist/app/functions-routes.test.d.ts.map +1 -0
  66. package/dist/app/functions-routes.test.js +40 -0
  67. package/dist/app/functions-routes.test.js.map +1 -0
  68. package/dist/app/manifest.d.ts +17 -0
  69. package/dist/app/manifest.d.ts.map +1 -0
  70. package/dist/app/manifest.js +64 -0
  71. package/dist/app/manifest.js.map +1 -0
  72. package/dist/app/manifest.test.d.ts +2 -0
  73. package/dist/app/manifest.test.d.ts.map +1 -0
  74. package/dist/app/manifest.test.js +173 -0
  75. package/dist/app/manifest.test.js.map +1 -0
  76. package/dist/app/release-artifacts.d.ts +39 -0
  77. package/dist/app/release-artifacts.d.ts.map +1 -0
  78. package/dist/app/release-artifacts.js +229 -0
  79. package/dist/app/release-artifacts.js.map +1 -0
  80. package/dist/app/release-artifacts.test.d.ts +2 -0
  81. package/dist/app/release-artifacts.test.d.ts.map +1 -0
  82. package/dist/app/release-artifacts.test.js +295 -0
  83. package/dist/app/release-artifacts.test.js.map +1 -0
  84. package/dist/app/route-pattern.d.ts +23 -0
  85. package/dist/app/route-pattern.d.ts.map +1 -0
  86. package/dist/app/route-pattern.js +339 -0
  87. package/dist/app/route-pattern.js.map +1 -0
  88. package/dist/app/route-pattern.test.d.ts +2 -0
  89. package/dist/app/route-pattern.test.d.ts.map +1 -0
  90. package/dist/app/route-pattern.test.js +187 -0
  91. package/dist/app/route-pattern.test.js.map +1 -0
  92. package/dist/app/rules.d.ts +61 -0
  93. package/dist/app/rules.d.ts.map +1 -0
  94. package/dist/app/rules.js +90 -0
  95. package/dist/app/rules.js.map +1 -0
  96. package/dist/app/rules.test.d.ts +2 -0
  97. package/dist/app/rules.test.d.ts.map +1 -0
  98. package/dist/app/rules.test.js +69 -0
  99. package/dist/app/rules.test.js.map +1 -0
  100. package/dist/app/runner.d.ts +109 -0
  101. package/dist/app/runner.d.ts.map +1 -0
  102. package/dist/app/runner.js +429 -0
  103. package/dist/app/runner.js.map +1 -0
  104. package/dist/app/site.d.ts +73 -0
  105. package/dist/app/site.d.ts.map +1 -0
  106. package/dist/app/site.js +161 -0
  107. package/dist/app/site.js.map +1 -0
  108. package/dist/app/site.test.d.ts +2 -0
  109. package/dist/app/site.test.d.ts.map +1 -0
  110. package/dist/app/site.test.js +291 -0
  111. package/dist/app/site.test.js.map +1 -0
  112. package/dist/app/static-server.d.ts +20 -0
  113. package/dist/app/static-server.d.ts.map +1 -0
  114. package/dist/app/static-server.js +145 -0
  115. package/dist/app/static-server.js.map +1 -0
  116. package/dist/persistence/conversation-store.d.ts +21 -0
  117. package/dist/persistence/conversation-store.d.ts.map +1 -0
  118. package/dist/persistence/conversation-store.js +59 -0
  119. package/dist/persistence/conversation-store.js.map +1 -0
  120. package/dist/persistence/conversation-store.test.d.ts +2 -0
  121. package/dist/persistence/conversation-store.test.d.ts.map +1 -0
  122. package/dist/persistence/conversation-store.test.js +98 -0
  123. package/dist/persistence/conversation-store.test.js.map +1 -0
  124. package/dist/persistence/git-sync.d.ts +14 -1
  125. package/dist/persistence/git-sync.d.ts.map +1 -1
  126. package/dist/persistence/git-sync.js +73 -17
  127. package/dist/persistence/git-sync.js.map +1 -1
  128. package/dist/persistence/git-sync.test.js +155 -6
  129. package/dist/persistence/git-sync.test.js.map +1 -1
  130. package/dist/persistence/snapshot-sync.d.ts +19 -2
  131. package/dist/persistence/snapshot-sync.d.ts.map +1 -1
  132. package/dist/persistence/snapshot-sync.js +194 -83
  133. package/dist/persistence/snapshot-sync.js.map +1 -1
  134. package/dist/persistence/snapshot-sync.test.js +145 -27
  135. package/dist/persistence/snapshot-sync.test.js.map +1 -1
  136. package/dist/persistence/workspace.d.ts +3 -0
  137. package/dist/persistence/workspace.d.ts.map +1 -1
  138. package/dist/persistence/workspace.js +1 -0
  139. package/dist/persistence/workspace.js.map +1 -1
  140. package/dist/research/extract-texts.d.ts.map +1 -1
  141. package/dist/research/extract-texts.js +6 -13
  142. package/dist/research/extract-texts.js.map +1 -1
  143. package/dist/research/filingramp/attachment-tools.d.ts.map +1 -1
  144. package/dist/research/filingramp/attachment-tools.js +7 -4
  145. package/dist/research/filingramp/attachment-tools.js.map +1 -1
  146. package/dist/research/filingramp/shared.d.ts.map +1 -1
  147. package/dist/research/filingramp/shared.js +5 -5
  148. package/dist/research/filingramp/shared.js.map +1 -1
  149. package/dist/runtime/app-mode.d.ts +10 -0
  150. package/dist/runtime/app-mode.d.ts.map +1 -0
  151. package/dist/runtime/app-mode.js +172 -0
  152. package/dist/runtime/app-mode.js.map +1 -0
  153. package/dist/runtime/app-mode.test.d.ts +2 -0
  154. package/dist/runtime/app-mode.test.d.ts.map +1 -0
  155. package/dist/runtime/app-mode.test.js +130 -0
  156. package/dist/runtime/app-mode.test.js.map +1 -0
  157. package/dist/runtime/app-rehearsal.d.ts +2 -0
  158. package/dist/runtime/app-rehearsal.d.ts.map +1 -0
  159. package/dist/runtime/app-rehearsal.js +56 -0
  160. package/dist/runtime/app-rehearsal.js.map +1 -0
  161. package/dist/runtime/build-mode.d.ts +12 -0
  162. package/dist/runtime/build-mode.d.ts.map +1 -0
  163. package/dist/runtime/build-mode.js +116 -0
  164. package/dist/runtime/build-mode.js.map +1 -0
  165. package/dist/runtime/build-mode.test.d.ts +2 -0
  166. package/dist/runtime/build-mode.test.d.ts.map +1 -0
  167. package/dist/runtime/build-mode.test.js +121 -0
  168. package/dist/runtime/build-mode.test.js.map +1 -0
  169. package/dist/runtime/cli.js +7 -2
  170. package/dist/runtime/cli.js.map +1 -1
  171. package/dist/runtime/config.d.ts +4 -0
  172. package/dist/runtime/config.d.ts.map +1 -1
  173. package/dist/runtime/config.js +13 -2
  174. package/dist/runtime/config.js.map +1 -1
  175. package/dist/runtime/guest-server.d.ts +3 -0
  176. package/dist/runtime/guest-server.d.ts.map +1 -0
  177. package/dist/runtime/{lambda-microvm.js → guest-server.js} +49 -18
  178. package/dist/runtime/guest-server.js.map +1 -0
  179. package/dist/runtime/image-hooks.d.ts +5 -0
  180. package/dist/runtime/image-hooks.d.ts.map +1 -0
  181. package/dist/runtime/image-hooks.js +68 -0
  182. package/dist/runtime/image-hooks.js.map +1 -0
  183. package/dist/runtime/image-hooks.test.d.ts +2 -0
  184. package/dist/runtime/image-hooks.test.d.ts.map +1 -0
  185. package/dist/runtime/image-hooks.test.js +74 -0
  186. package/dist/runtime/image-hooks.test.js.map +1 -0
  187. package/dist/runtime/index.d.ts +8 -3
  188. package/dist/runtime/index.d.ts.map +1 -1
  189. package/dist/runtime/index.js +53 -35
  190. package/dist/runtime/index.js.map +1 -1
  191. package/dist/runtime/listening-ports.d.ts +13 -0
  192. package/dist/runtime/listening-ports.d.ts.map +1 -0
  193. package/dist/runtime/listening-ports.js +78 -0
  194. package/dist/runtime/listening-ports.js.map +1 -0
  195. package/dist/runtime/listening-ports.test.d.ts +2 -0
  196. package/dist/runtime/listening-ports.test.d.ts.map +1 -0
  197. package/dist/runtime/listening-ports.test.js +39 -0
  198. package/dist/runtime/listening-ports.test.js.map +1 -0
  199. package/dist/runtime/preview-proxy.d.ts +56 -0
  200. package/dist/runtime/preview-proxy.d.ts.map +1 -0
  201. package/dist/runtime/preview-proxy.js +302 -0
  202. package/dist/runtime/preview-proxy.js.map +1 -0
  203. package/dist/runtime/preview-proxy.test.d.ts +2 -0
  204. package/dist/runtime/preview-proxy.test.d.ts.map +1 -0
  205. package/dist/runtime/preview-proxy.test.js +122 -0
  206. package/dist/runtime/preview-proxy.test.js.map +1 -0
  207. package/dist/runtime/session-mode.d.ts +3 -0
  208. package/dist/runtime/session-mode.d.ts.map +1 -0
  209. package/dist/runtime/session-mode.js +60 -0
  210. package/dist/runtime/session-mode.js.map +1 -0
  211. package/dist/runtime/workload.d.ts +44 -0
  212. package/dist/runtime/workload.d.ts.map +1 -0
  213. package/dist/runtime/workload.js +222 -0
  214. package/dist/runtime/workload.js.map +1 -0
  215. package/dist/runtime/workload.test.d.ts +2 -0
  216. package/dist/runtime/workload.test.d.ts.map +1 -0
  217. package/dist/runtime/workload.test.js +235 -0
  218. package/dist/runtime/workload.test.js.map +1 -0
  219. package/dist/session/conversation.d.ts +3 -2
  220. package/dist/session/conversation.d.ts.map +1 -1
  221. package/dist/session/conversation.js +11 -7
  222. package/dist/session/conversation.js.map +1 -1
  223. package/dist/session/conversation.test.js +2 -3
  224. package/dist/session/conversation.test.js.map +1 -1
  225. package/dist/session/runtime.d.ts +16 -3
  226. package/dist/session/runtime.d.ts.map +1 -1
  227. package/dist/session/runtime.js +80 -13
  228. package/dist/session/runtime.js.map +1 -1
  229. package/dist/session/runtime.test.js +18 -7
  230. package/dist/session/runtime.test.js.map +1 -1
  231. package/dist/session/tools.d.ts.map +1 -1
  232. package/dist/session/tools.js +3 -3
  233. package/dist/session/tools.js.map +1 -1
  234. package/dist/task/loop.d.ts.map +1 -1
  235. package/dist/task/loop.js +6 -4
  236. package/dist/task/loop.js.map +1 -1
  237. package/dist/tools/exec-tools.d.ts +12 -0
  238. package/dist/tools/exec-tools.d.ts.map +1 -1
  239. package/dist/tools/exec-tools.js +46 -3
  240. package/dist/tools/exec-tools.js.map +1 -1
  241. package/dist/tools/exec-tools.test.d.ts +2 -0
  242. package/dist/tools/exec-tools.test.d.ts.map +1 -0
  243. package/dist/tools/exec-tools.test.js +48 -0
  244. package/dist/tools/exec-tools.test.js.map +1 -0
  245. package/dist/tools/fs-tools.d.ts.map +1 -1
  246. package/dist/tools/fs-tools.js +5 -5
  247. package/dist/tools/fs-tools.js.map +1 -1
  248. package/dist/transport/link.d.ts.map +1 -1
  249. package/dist/transport/link.js +16 -5
  250. package/dist/transport/link.js.map +1 -1
  251. package/dist/transport/link.test.js +24 -0
  252. package/dist/transport/link.test.js.map +1 -1
  253. package/dist/transport/protocol.d.ts +190 -3
  254. package/dist/transport/protocol.d.ts.map +1 -1
  255. package/dist/transport/protocol.js +147 -7
  256. package/dist/transport/protocol.js.map +1 -1
  257. package/dist/transport/protocol.test.js +41 -0
  258. package/dist/transport/protocol.test.js.map +1 -1
  259. package/dist/workspace-sync/eligibility.d.ts +14 -0
  260. package/dist/workspace-sync/eligibility.d.ts.map +1 -0
  261. package/dist/workspace-sync/eligibility.js +53 -0
  262. package/dist/workspace-sync/eligibility.js.map +1 -0
  263. package/dist/workspace-sync/merge.d.ts +15 -0
  264. package/dist/workspace-sync/merge.d.ts.map +1 -0
  265. package/dist/workspace-sync/merge.js +66 -0
  266. package/dist/workspace-sync/merge.js.map +1 -0
  267. package/dist/workspace-sync/merge.test.d.ts +2 -0
  268. package/dist/workspace-sync/merge.test.d.ts.map +1 -0
  269. package/dist/workspace-sync/merge.test.js +28 -0
  270. package/dist/workspace-sync/merge.test.js.map +1 -0
  271. package/dist/workspace-sync/workspace-sync.d.ts +48 -0
  272. package/dist/workspace-sync/workspace-sync.d.ts.map +1 -0
  273. package/dist/workspace-sync/workspace-sync.js +308 -0
  274. package/dist/workspace-sync/workspace-sync.js.map +1 -0
  275. package/dist/workspace-sync/workspace-sync.test.d.ts +2 -0
  276. package/dist/workspace-sync/workspace-sync.test.d.ts.map +1 -0
  277. package/dist/workspace-sync/workspace-sync.test.js +111 -0
  278. package/dist/workspace-sync/workspace-sync.test.js.map +1 -0
  279. package/dist/workspace-sync/write-drafts.d.ts +24 -0
  280. package/dist/workspace-sync/write-drafts.d.ts.map +1 -0
  281. package/dist/workspace-sync/write-drafts.js +87 -0
  282. package/dist/workspace-sync/write-drafts.js.map +1 -0
  283. package/dist/workspace-sync/write-drafts.test.d.ts +2 -0
  284. package/dist/workspace-sync/write-drafts.test.d.ts.map +1 -0
  285. package/dist/workspace-sync/write-drafts.test.js +36 -0
  286. package/dist/workspace-sync/write-drafts.test.js.map +1 -0
  287. package/package.json +12 -2
  288. package/dist/runtime/lambda-microvm.d.ts +0 -3
  289. package/dist/runtime/lambda-microvm.d.ts.map +0 -1
  290. package/dist/runtime/lambda-microvm.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/transport/protocol.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/transport/protocol.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,15 @@
1
1
  "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AGENT_SECRET_ENV_KEYS = exports.RELEASE_DELIVERY_ENV = exports.AGENT_ENV = exports.RELEASE_ARCHIVE_FILE = exports.SITE_ENCODINGS = exports.RELEASE_MANIFEST_FILE = exports.APP_STATUS_PATH = exports.WORKSPACE_GENERATED_DIRECTORIES = exports.WORKSPACE_EXECUTABLES_FILE = exports.SESSION_CONVERSATION_FILE = exports.APP_CONFIG_FILE = exports.APP_PREVIEW_TARGET = exports.DEFAULT_APP_PORT = exports.GUEST_RESERVED_PORTS = exports.SESSION_SITE_HEADER = exports.PREVIEW_PORT_HEADER = exports.AGENT_SESSION_EVENT_TYPES = exports.AGENT_SESSION_COMMAND = exports.AGENT_SESSION_EVENT = void 0;
4
+ exports.agentSessionRoom = agentSessionRoom;
5
+ exports.agentSessionEventKey = agentSessionEventKey;
6
+ exports.requestUrl = requestUrl;
7
+ exports.isHiddenSitePath = isHiddenSitePath;
8
+ exports.parsePreviewPort = parsePreviewPort;
9
+ exports.parsePreviewTarget = parsePreviewTarget;
10
+ exports.defaultAppPort = defaultAppPort;
11
+ exports.workspaceFileHash = workspaceFileHash;
12
+ exports.isAgentSessionEvent = isAgentSessionEvent;
2
13
  // Wire contract between the in-VM agent and the platform. The guest is the owner of this
3
14
  // format: the gateway (services/gateway/src/services/sessions/agent-socket-server.ts) forwards it and
4
15
  // the API (services/api/src/services/sessions/agent-session-relay.service.ts) turns it into chat
@@ -8,11 +19,7 @@
8
19
  // Two directions on one Socket.IO connection:
9
20
  // guest -> platform AGENT_SESSION_EVENT (fire-and-forget, ordered by `seq`)
10
21
  // platform -> guest AGENT_SESSION_COMMAND (acknowledged)
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.AGENT_SECRET_ENV_KEYS = exports.AGENT_ENV = exports.AGENT_SESSION_EVENT_TYPES = exports.AGENT_SESSION_COMMAND = exports.AGENT_SESSION_EVENT = void 0;
13
- exports.agentSessionRoom = agentSessionRoom;
14
- exports.agentSessionEventKey = agentSessionEventKey;
15
- exports.isAgentSessionEvent = isAgentSessionEvent;
22
+ const crypto_1 = require("crypto");
16
23
  exports.AGENT_SESSION_EVENT = 'agent-session:event';
17
24
  exports.AGENT_SESSION_COMMAND = 'agent-session:command';
18
25
  /** Socket.IO room the gateway joins every guest socket to, so the API can address one session. */
@@ -35,12 +42,107 @@ exports.AGENT_SESSION_EVENT_TYPES = [
35
42
  'question',
36
43
  'usage',
37
44
  'files',
45
+ 'file_changed',
46
+ 'file_deleted',
47
+ 'file_draft',
48
+ 'file_synced',
49
+ 'ports',
50
+ 'app',
38
51
  'checkpointed',
39
52
  'done',
40
53
  'error',
41
54
  'tool_call',
42
55
  'message',
43
56
  ];
57
+ // ── Live preview (gateway → guest :8080 → guest app port) ────────────────────────────────────
58
+ // Every engine reaches only the guest's port 8080, where the agent serves its lifecycle hooks and
59
+ // the preview proxy (runtime/preview-proxy.ts). The gateway sets this header on traffic for
60
+ // <vmId>-<port>.apps.<domain>; the proxy forwards such a request to localhost:<port> instead.
61
+ exports.PREVIEW_PORT_HEADER = 'x-builder-preview-port';
62
+ /**
63
+ * On what the gateway asks the api about a session's URL. A browser can't set it on a navigation, so
64
+ * a link to the api's route for that never runs a session's page on the api's own origin.
65
+ */
66
+ exports.SESSION_SITE_HEADER = 'x-builder-session-site';
67
+ /**
68
+ * Whether a URL path holds a dotfile or dot-folder at any depth (.env, .git, the platform's own
69
+ * .builder), or a `.`/`..` segment. An app's URL never serves one from its files; .well-known is
70
+ * the exception.
71
+ */
72
+ /**
73
+ * A request's target as a URL, to read its path and query. Anyone can send any target, and
74
+ * `new URL(target, base)` throws on `//` and reads `//host/path` as a host: this does neither,
75
+ * so leading slashes collapse as most servers treat them.
76
+ */
77
+ function requestUrl(target) {
78
+ return new URL(`http://request.invalid/${(target !== null && target !== void 0 ? target : '').replace(/^[/\\]+/, '')}`);
79
+ }
80
+ function isHiddenSitePath(pathname) {
81
+ return pathname.split('/').some((part) => part.startsWith('.') && part !== '.well-known');
82
+ }
83
+ /** The guest's own listeners: the hook/preview server, dropbear, and Lambda's shell agent. */
84
+ exports.GUEST_RESERVED_PORTS = [8080, 2222, 8022];
85
+ /**
86
+ * The port apps are told to listen on ($PORT for the agent's commands). A session's own URL
87
+ * (<sessionId>.apps.<domain>) opens this one when it listens, else the lowest port that does.
88
+ */
89
+ exports.DEFAULT_APP_PORT = 3000;
90
+ /**
91
+ * PREVIEW_PORT_HEADER's value for a session's own URL (no port in it): the guest picks the target
92
+ * itself, by the app's rewrites when the workspace holds one, else DEFAULT_APP_PORT or the
93
+ * lowest listening port. Never parsed from a hostname.
94
+ */
95
+ exports.APP_PREVIEW_TARGET = 'app';
96
+ /** A header value as a previewable port, or undefined. */
97
+ function parsePreviewPort(value) {
98
+ if (typeof value !== 'string' || !/^\d{1,5}$/.test(value))
99
+ return undefined;
100
+ const port = Number(value);
101
+ return port >= 1 && port <= 65535 && !exports.GUEST_RESERVED_PORTS.includes(port) ? port : undefined;
102
+ }
103
+ /** A PREVIEW_PORT_HEADER value: a previewable port, APP_PREVIEW_TARGET, or undefined. */
104
+ function parsePreviewTarget(value) {
105
+ return value === exports.APP_PREVIEW_TARGET ? exports.APP_PREVIEW_TARGET : parsePreviewPort(value);
106
+ }
107
+ /** The port a session's own URL opens without an app: DEFAULT_APP_PORT when it listens, else the lowest. */
108
+ function defaultAppPort(ports) {
109
+ if (ports.includes(exports.DEFAULT_APP_PORT))
110
+ return exports.DEFAULT_APP_PORT;
111
+ return ports.length ? Math.min(...ports) : undefined;
112
+ }
113
+ // ── App (builder.json) ─────────────────────────────────────────────────────────────────────
114
+ // The app a workspace holds — detected as Vercel does, with builder.json's overrides — is run by
115
+ // the guest (src/app): in a session VM with its dev commands, in a deployment (AGENT_MODE=app)
116
+ // built and started.
117
+ /**
118
+ * The app manifest, in the workspace's .builder folder; a session VM
119
+ * writes it. The one file of .builder that people see and edit as a session file.
120
+ */
121
+ exports.APP_CONFIG_FILE = '.builder/builder.json';
122
+ /** Which of a session's stored files are executable: object storage keeps no mode. */
123
+ /**
124
+ * Where a session's conversation used to be saved, in its workspace and so in its branch. It's kept
125
+ * in the runtime's state directory now (persistence/conversation-store.ts), but repos still hold old
126
+ * copies: they stay off main when a session merges, and out of what a new session starts from.
127
+ */
128
+ exports.SESSION_CONVERSATION_FILE = '.builder/conversation.json';
129
+ exports.WORKSPACE_EXECUTABLES_FILE = '.builder/executables.json';
130
+ /** Dependencies and build output: saved with a workspace, but not files people open. */
131
+ exports.WORKSPACE_GENERATED_DIRECTORIES = [
132
+ 'node_modules', '.venv', '__pycache__', '.next', '.nuxt', '.cache', '.turbo', 'dist', 'build', 'coverage',
133
+ ];
134
+ /** Guest-only: a deployment's app status as JSON. `/internal/*` is never routed publicly. */
135
+ exports.APP_STATUS_PATH = '/internal/app/status';
136
+ /** A built release's record of what it holds; written last, so a release that has one is complete. */
137
+ exports.RELEASE_MANIFEST_FILE = 'manifest.json';
138
+ /** The compressed copies of a built release's static files, best first. */
139
+ exports.SITE_ENCODINGS = ['br', 'gzip'];
140
+ /** What a built release's VM runs: its folders as they were built, dependencies and all. */
141
+ exports.RELEASE_ARCHIVE_FILE = 'run.tar.zst';
142
+ /** How both sides of workspace live sync name a version of a file. */
143
+ function workspaceFileHash(content) {
144
+ return (0, crypto_1.createHash)('sha256').update(content, 'utf8').digest('hex');
145
+ }
44
146
  function isAgentSessionEvent(value) {
45
147
  if (!value || typeof value !== 'object')
46
148
  return false;
@@ -50,13 +152,31 @@ function isAgentSessionEvent(value) {
50
152
  exports.AGENT_SESSION_EVENT_TYPES.includes(event.type));
51
153
  }
52
154
  // ── Environment contract (VM env → guest) ──────────────────────────────────────────────────
53
- // Documented here so the API's env builder (services/api/src/services/sessions/research-vm-env.ts) and
155
+ // Documented here so the API's env builder (services/api/src/services/sessions/session-vm-env.ts) and
54
156
  // the guest's config.ts agree on names. Values marked secret must never be persisted on the VM
55
157
  // record; the API sends them to the worker only.
56
158
  exports.AGENT_ENV = {
57
159
  SESSION_ID: 'SESSION_ID',
58
- /** 'task' (one AGENT_TASK run, then exit) or 'session' (stay up, serve chat turns). */
160
+ /**
161
+ * 'task' (one AGENT_TASK run, then exit), 'session' (stay up, serve chat turns), 'app' (a
162
+ * deployment: run the release's app on GUEST_HTTP_PORT, no agent) or 'build' (build a release
163
+ * and upload its output, no agent).
164
+ */
59
165
  AGENT_MODE: 'AGENT_MODE',
166
+ /** 'build' mode: where the release's output goes (the git service's route for that release). */
167
+ RELEASE_UPLOAD_URL: 'RELEASE_UPLOAD_URL',
168
+ /** secret, 'build' mode: may write only that release's output. */
169
+ RELEASE_UPLOAD_TOKEN: 'RELEASE_UPLOAD_TOKEN',
170
+ /** 'app' mode: a release built ahead of time: where the files its VM runs are, read with ACCESS_TOKEN. */
171
+ RELEASE_ARTIFACTS_URL: 'RELEASE_ARTIFACTS_URL',
172
+ /** 'app' mode: the release being run, so a VM restarted on its own disk skips install and build. */
173
+ APP_RELEASE_ID: 'APP_RELEASE_ID',
174
+ /** 'app' and build modes: the app's directory in the release's repository. */
175
+ APP_ROOT_DIR: 'APP_ROOT_DIR',
176
+ /** 'app' and build modes: the commit to check out. */
177
+ GIT_COMMIT: 'GIT_COMMIT',
178
+ /** The JSON schema the builder.json a session VM writes names as its `$schema`; written down, never fetched. */
179
+ APP_SCHEMA_URL: 'APP_SCHEMA_URL',
60
180
  /** 'coding' (default) or 'research'. */
61
181
  AGENT_PROFILE: 'AGENT_PROFILE',
62
182
  AGENT_TASK: 'AGENT_TASK',
@@ -66,6 +186,8 @@ exports.AGENT_ENV = {
66
186
  /** Total tokens the session may spend before it pauses and asks whether to continue. */
67
187
  AGENT_TOKEN_BUDGET: 'AGENT_TOKEN_BUDGET',
68
188
  AGENT_WORKSPACE_DIR: 'AGENT_WORKSPACE_DIR',
189
+ /** The runtime's own files (its conversation, its git data), which nothing it runs can read. */
190
+ AGENT_STATE_DIR: 'AGENT_STATE_DIR',
69
191
  /** The gateway's agent socket; the guest authenticates to it with ACCESS_TOKEN (session-scoped). */
70
192
  AGENT_SOCKET_URL: 'AGENT_SOCKET_URL',
71
193
  /** secret: model provider keys (one of them) */
@@ -96,6 +218,24 @@ exports.AGENT_ENV = {
96
218
  */
97
219
  ACCESS_TOKEN: 'ACCESS_TOKEN',
98
220
  };
221
+ /** The settings that deliver a release to its VM; the rest of a deployed VM's env is the app's own. */
222
+ exports.RELEASE_DELIVERY_ENV = [
223
+ exports.AGENT_ENV.ACCESS_TOKEN,
224
+ exports.AGENT_ENV.AGENT_MODE,
225
+ exports.AGENT_ENV.AGENT_WORKSPACE_DIR,
226
+ exports.AGENT_ENV.SESSION_STORAGE_URL,
227
+ exports.AGENT_ENV.GIT_SERVER_URL,
228
+ exports.AGENT_ENV.GIT_REPOSITORY,
229
+ exports.AGENT_ENV.GIT_REPOSITORY_DIR,
230
+ exports.AGENT_ENV.GIT_BRANCH,
231
+ exports.AGENT_ENV.GIT_COMMIT,
232
+ exports.AGENT_ENV.APP_ROOT_DIR,
233
+ exports.AGENT_ENV.APP_RELEASE_ID,
234
+ exports.AGENT_ENV.RELEASE_UPLOAD_URL,
235
+ exports.AGENT_ENV.RELEASE_UPLOAD_TOKEN,
236
+ exports.AGENT_ENV.RELEASE_ARTIFACTS_URL,
237
+ 'APP_WORK_DIR',
238
+ ];
99
239
  exports.AGENT_SECRET_ENV_KEYS = [
100
240
  exports.AGENT_ENV.OPENROUTER_API_KEY,
101
241
  exports.AGENT_ENV.ANTHROPIC_API_KEY,
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/transport/protocol.ts"],"names":[],"mappings":";AAAA,yFAAyF;AACzF,sGAAsG;AACtG,iGAAiG;AACjG,8FAA8F;AAC9F,wEAAwE;AACxE,EAAE;AACF,8CAA8C;AAC9C,kFAAkF;AAClF,6DAA6D;;;AAM7D,4CAEC;AAyFD,oDAGC;AAoBD,kDAQC;AA9HY,QAAA,mBAAmB,GAAG,qBAA8B,CAAA;AACpD,QAAA,qBAAqB,GAAG,uBAAgC,CAAA;AAErE,kGAAkG;AAClG,SAAgB,gBAAgB,CAAC,SAAiB;IAChD,OAAO,iBAAiB,SAAS,EAAE,CAAA;AACrC,CAAC;AAyFD,SAAgB,oBAAoB,CAAC,KAAwB;;IAC3D,mFAAmF;IACnF,OAAO,qBAAqB,KAAK,CAAC,SAAS,IAAI,MAAA,KAAK,CAAC,UAAU,mCAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,GAAG,EAAE,CAAA;AACnG,CAAC;AAEY,QAAA,yBAAyB,GAAqC;IACzE,OAAO;IACP,YAAY;IACZ,YAAY;IACZ,iBAAiB;IACjB,iBAAiB;IACjB,kBAAkB;IAClB,UAAU;IACV,UAAU;IACV,OAAO;IACP,OAAO;IACP,cAAc;IACd,MAAM;IACN,OAAO;IACP,WAAW;IACX,SAAS;CACV,CAAA;AAED,SAAgB,mBAAmB,CAAC,KAAc;IAChD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IACrD,MAAM,KAAK,GAAG,KAAmC,CAAA;IACjD,OAAO,CACL,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QACnC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC7B,iCAA+C,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CACtE,CAAA;AACH,CAAC;AAED,8FAA8F;AAC9F,uGAAuG;AACvG,+FAA+F;AAC/F,iDAAiD;AAEpC,QAAA,SAAS,GAAG;IACvB,UAAU,EAAE,YAAY;IACxB,uFAAuF;IACvF,UAAU,EAAE,YAAY;IACxB,wCAAwC;IACxC,aAAa,EAAE,eAAe;IAC9B,UAAU,EAAE,YAAY;IACxB,WAAW,EAAE,aAAa;IAC1B,6DAA6D;IAC7D,sBAAsB,EAAE,wBAAwB;IAChD,wFAAwF;IACxF,kBAAkB,EAAE,oBAAoB;IACxC,mBAAmB,EAAE,qBAAqB;IAC1C,oGAAoG;IACpG,gBAAgB,EAAE,kBAAkB;IACpC,gDAAgD;IAChD,kBAAkB,EAAE,oBAAoB;IACxC,iBAAiB,EAAE,mBAAmB;IACtC,2CAA2C;IAC3C,gBAAgB,EAAE,kBAAkB;IACpC,uBAAuB,EAAE,yBAAyB;IAClD,wFAAwF;IACxF,qBAAqB,EAAE,uBAAuB;IAC9C,qFAAqF;IACrF,oBAAoB,EAAE,sBAAsB;IAC5C,aAAa;IACb,wBAAwB,EAAE,0BAA0B;IACpD,mEAAmE;IACnE,wBAAwB,EAAE,0BAA0B;IACpD,uDAAuD;IACvD,8BAA8B,EAAE,gCAAgC;IAChE,cAAc,EAAE,gBAAgB;IAChC,cAAc,EAAE,gBAAgB;IAChC,kBAAkB,EAAE,oBAAoB;IACxC,oFAAoF;IACpF,UAAU,EAAE,YAAY;IACxB,mBAAmB,EAAE,qBAAqB;IAC1C;;;OAGG;IACH,YAAY,EAAE,cAAc;CACpB,CAAA;AAEG,QAAA,qBAAqB,GAAsB;IACtD,iBAAS,CAAC,kBAAkB;IAC5B,iBAAS,CAAC,iBAAiB;IAC3B,iBAAS,CAAC,qBAAqB;IAC/B,iBAAS,CAAC,wBAAwB;IAClC,iBAAS,CAAC,YAAY;IACtB,iBAAS,CAAC,gBAAgB;CAC3B,CAAA"}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/transport/protocol.ts"],"names":[],"mappings":";;;AAeA,4CAEC;AA6HD,oDAGC;AA+CD,gCAEC;AAED,4CAEC;AAiBD,4CAIC;AAGD,gDAEC;AAGD,wCAGC;AA4ED,8CAEC;AAED,kDAQC;AA9TD,yFAAyF;AACzF,sGAAsG;AACtG,iGAAiG;AACjG,8FAA8F;AAC9F,wEAAwE;AACxE,EAAE;AACF,8CAA8C;AAC9C,kFAAkF;AAClF,6DAA6D;AAC7D,mCAAmC;AAEtB,QAAA,mBAAmB,GAAG,qBAA8B,CAAA;AACpD,QAAA,qBAAqB,GAAG,uBAAgC,CAAA;AAErE,kGAAkG;AAClG,SAAgB,gBAAgB,CAAC,SAAiB;IAChD,OAAO,iBAAiB,SAAS,EAAE,CAAA;AACrC,CAAC;AA6HD,SAAgB,oBAAoB,CAAC,KAAwB;;IAC3D,mFAAmF;IACnF,OAAO,qBAAqB,KAAK,CAAC,SAAS,IAAI,MAAA,KAAK,CAAC,UAAU,mCAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,GAAG,EAAE,CAAA;AACnG,CAAC;AAEY,QAAA,yBAAyB,GAAqC;IACzE,OAAO;IACP,YAAY;IACZ,YAAY;IACZ,iBAAiB;IACjB,iBAAiB;IACjB,kBAAkB;IAClB,UAAU;IACV,UAAU;IACV,OAAO;IACP,OAAO;IACP,cAAc;IACd,cAAc;IACd,YAAY;IACZ,aAAa;IACb,OAAO;IACP,KAAK;IACL,cAAc;IACd,MAAM;IACN,OAAO;IACP,WAAW;IACX,SAAS;CACV,CAAA;AAED,gGAAgG;AAChG,kGAAkG;AAClG,4FAA4F;AAC5F,8FAA8F;AAEjF,QAAA,mBAAmB,GAAG,wBAAiC,CAAA;AACpE;;;GAGG;AACU,QAAA,mBAAmB,GAAG,wBAAiC,CAAA;AACpE;;;;GAIG;AACH;;;;GAIG;AACH,SAAgB,UAAU,CAAC,MAA0B;IACnD,OAAO,IAAI,GAAG,CAAC,0BAA0B,CAAC,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,CAAA;AACnF,CAAC;AAED,SAAgB,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,aAAa,CAAC,CAAA;AAC3F,CAAC;AACD,8FAA8F;AACjF,QAAA,oBAAoB,GAAsB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AACzE;;;GAGG;AACU,QAAA,gBAAgB,GAAG,IAAI,CAAA;AAEpC;;;;GAIG;AACU,QAAA,kBAAkB,GAAG,KAAc,CAAA;AAEhD,0DAA0D;AAC1D,SAAgB,gBAAgB,CAAC,KAAc;IAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IAC3E,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAC1B,OAAO,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,4BAAoB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;AAC9F,CAAC;AAED,yFAAyF;AACzF,SAAgB,kBAAkB,CAAC,KAAc;IAC/C,OAAO,KAAK,KAAK,0BAAkB,CAAC,CAAC,CAAC,0BAAkB,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAA;AACpF,CAAC;AAED,4GAA4G;AAC5G,SAAgB,cAAc,CAAC,KAAwB;IACrD,IAAI,KAAK,CAAC,QAAQ,CAAC,wBAAgB,CAAC;QAAE,OAAO,wBAAgB,CAAA;IAC7D,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AACtD,CAAC;AAED,8FAA8F;AAC9F,iGAAiG;AACjG,+FAA+F;AAC/F,qBAAqB;AAErB;;;GAGG;AACU,QAAA,eAAe,GAAG,uBAAgC,CAAA;AAC/D,sFAAsF;AACtF;;;;GAIG;AACU,QAAA,yBAAyB,GAAG,4BAA4B,CAAA;AACxD,QAAA,0BAA0B,GAAG,2BAAoC,CAAA;AAC9E,wFAAwF;AAC3E,QAAA,+BAA+B,GAAsB;IAChE,cAAc,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU;CAC1G,CAAA;AACD,6FAA6F;AAChF,QAAA,eAAe,GAAG,sBAA+B,CAAA;AAE9D,sGAAsG;AACzF,QAAA,qBAAqB,GAAG,eAAwB,CAAA;AAC7D,2EAA2E;AAC9D,QAAA,cAAc,GAAG,CAAC,IAAI,EAAE,MAAM,CAAU,CAAA;AAErD,4FAA4F;AAC/E,QAAA,oBAAoB,GAAG,aAAsB,CAAA;AA0C1D,sEAAsE;AACtE,SAAgB,iBAAiB,CAAC,OAAe;IAC/C,OAAO,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AACnE,CAAC;AAED,SAAgB,mBAAmB,CAAC,KAAc;IAChD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IACrD,MAAM,KAAK,GAAG,KAAmC,CAAA;IACjD,OAAO,CACL,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QACnC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC7B,iCAA+C,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CACtE,CAAA;AACH,CAAC;AAED,8FAA8F;AAC9F,sGAAsG;AACtG,+FAA+F;AAC/F,iDAAiD;AAEpC,QAAA,SAAS,GAAG;IACvB,UAAU,EAAE,YAAY;IACxB;;;;OAIG;IACH,UAAU,EAAE,YAAY;IACxB,gGAAgG;IAChG,kBAAkB,EAAE,oBAAoB;IACxC,kEAAkE;IAClE,oBAAoB,EAAE,sBAAsB;IAC5C,0GAA0G;IAC1G,qBAAqB,EAAE,uBAAuB;IAC9C,oGAAoG;IACpG,cAAc,EAAE,gBAAgB;IAChC,8EAA8E;IAC9E,YAAY,EAAE,cAAc;IAC5B,sDAAsD;IACtD,UAAU,EAAE,YAAY;IACxB,gHAAgH;IAChH,cAAc,EAAE,gBAAgB;IAChC,wCAAwC;IACxC,aAAa,EAAE,eAAe;IAC9B,UAAU,EAAE,YAAY;IACxB,WAAW,EAAE,aAAa;IAC1B,6DAA6D;IAC7D,sBAAsB,EAAE,wBAAwB;IAChD,wFAAwF;IACxF,kBAAkB,EAAE,oBAAoB;IACxC,mBAAmB,EAAE,qBAAqB;IAC1C,gGAAgG;IAChG,eAAe,EAAE,iBAAiB;IAClC,oGAAoG;IACpG,gBAAgB,EAAE,kBAAkB;IACpC,gDAAgD;IAChD,kBAAkB,EAAE,oBAAoB;IACxC,iBAAiB,EAAE,mBAAmB;IACtC,2CAA2C;IAC3C,gBAAgB,EAAE,kBAAkB;IACpC,uBAAuB,EAAE,yBAAyB;IAClD,wFAAwF;IACxF,qBAAqB,EAAE,uBAAuB;IAC9C,qFAAqF;IACrF,oBAAoB,EAAE,sBAAsB;IAC5C,aAAa;IACb,wBAAwB,EAAE,0BAA0B;IACpD,mEAAmE;IACnE,wBAAwB,EAAE,0BAA0B;IACpD,uDAAuD;IACvD,8BAA8B,EAAE,gCAAgC;IAChE,cAAc,EAAE,gBAAgB;IAChC,cAAc,EAAE,gBAAgB;IAChC,kBAAkB,EAAE,oBAAoB;IACxC,oFAAoF;IACpF,UAAU,EAAE,YAAY;IACxB,mBAAmB,EAAE,qBAAqB;IAC1C;;;OAGG;IACH,YAAY,EAAE,cAAc;CACpB,CAAA;AAEV,uGAAuG;AAC1F,QAAA,oBAAoB,GAAsB;IACrD,iBAAS,CAAC,YAAY;IACtB,iBAAS,CAAC,UAAU;IACpB,iBAAS,CAAC,mBAAmB;IAC7B,iBAAS,CAAC,mBAAmB;IAC7B,iBAAS,CAAC,cAAc;IACxB,iBAAS,CAAC,cAAc;IACxB,iBAAS,CAAC,kBAAkB;IAC5B,iBAAS,CAAC,UAAU;IACpB,iBAAS,CAAC,UAAU;IACpB,iBAAS,CAAC,YAAY;IACtB,iBAAS,CAAC,cAAc;IACxB,iBAAS,CAAC,kBAAkB;IAC5B,iBAAS,CAAC,oBAAoB;IAC9B,iBAAS,CAAC,qBAAqB;IAC/B,cAAc;CACf,CAAA;AAEY,QAAA,qBAAqB,GAAsB;IACtD,iBAAS,CAAC,kBAAkB;IAC5B,iBAAS,CAAC,iBAAiB;IAC3B,iBAAS,CAAC,qBAAqB;IAC/B,iBAAS,CAAC,wBAAwB;IAClC,iBAAS,CAAC,YAAY;IACtB,iBAAS,CAAC,gBAAgB;CAC3B,CAAA"}
@@ -19,6 +19,18 @@ const protocol_1 = require("./protocol");
19
19
  strict_1.default.equal((0, protocol_1.isAgentSessionEvent)({ type: 'done' }), false);
20
20
  strict_1.default.equal((0, protocol_1.isAgentSessionEvent)(null), false);
21
21
  });
22
+ (0, node_test_1.it)('accepts the app as a preview target only by name, never from a hostname port', () => {
23
+ strict_1.default.equal((0, protocol_1.parsePreviewTarget)('app'), 'app');
24
+ strict_1.default.equal((0, protocol_1.parsePreviewTarget)('5173'), 5173);
25
+ strict_1.default.equal((0, protocol_1.parsePreviewTarget)('8080'), undefined);
26
+ strict_1.default.equal((0, protocol_1.parsePreviewTarget)('apps'), undefined);
27
+ strict_1.default.equal((0, protocol_1.parsePreviewPort)('app'), undefined);
28
+ });
29
+ (0, node_test_1.it)("opens a session URL on the default app port when it listens, else the lowest", () => {
30
+ strict_1.default.equal((0, protocol_1.defaultAppPort)([5173, 3000]), 3000);
31
+ strict_1.default.equal((0, protocol_1.defaultAppPort)([5173, 4000]), 4000);
32
+ strict_1.default.equal((0, protocol_1.defaultAppPort)([]), undefined);
33
+ });
22
34
  (0, node_test_1.it)('names the per-session room the gateway joins guests to', () => {
23
35
  strict_1.default.equal((0, protocol_1.agentSessionRoom)('abc'), 'agent-session:abc');
24
36
  });
@@ -28,4 +40,33 @@ const protocol_1 = require("./protocol");
28
40
  }
29
41
  });
30
42
  });
43
+ (0, node_test_1.describe)('a request target', () => {
44
+ const read = (target) => {
45
+ const { pathname, search } = (0, protocol_1.requestUrl)(target);
46
+ return `${pathname}${search}`;
47
+ };
48
+ (0, node_test_1.it)('reads as itself when it\'s an ordinary one', () => {
49
+ strict_1.default.equal(read('/'), '/');
50
+ strict_1.default.equal(read('/a/b?x=1&y=2'), '/a/b?x=1&y=2');
51
+ strict_1.default.equal(read('/a%20b'), '/a%20b');
52
+ strict_1.default.equal(read(undefined), '/');
53
+ });
54
+ (0, node_test_1.it)('never throws, whatever is sent: new URL throws on these or reads a host from them', () => {
55
+ for (const target of ['//', '///', '//[', '//foo:bar', '//:', 'http://[', '\\\\', '/%', '/%zz', '*', '', ' ', '//\u0000', '/?', '#']) {
56
+ strict_1.default.doesNotThrow(() => (0, protocol_1.requestUrl)(target), target);
57
+ }
58
+ });
59
+ (0, node_test_1.it)('never takes a host from it, so routing and what\'s hidden see the real path', () => {
60
+ strict_1.default.equal(read('//'), '/');
61
+ strict_1.default.equal(read('//foo/bar?x=1'), '/foo/bar?x=1');
62
+ strict_1.default.equal(read('///foo'), '/foo');
63
+ strict_1.default.equal(read('\\\\foo/bar'), '/foo/bar');
64
+ strict_1.default.equal(read('//.builder/builder.json'), '/.builder/builder.json');
65
+ strict_1.default.equal((0, protocol_1.requestUrl)('//evil.example/x').host, 'request.invalid');
66
+ });
67
+ (0, node_test_1.it)('still resolves dot segments, which is what path checks rely on', () => {
68
+ strict_1.default.equal(read('/a/../.builder/x'), '/.builder/x');
69
+ strict_1.default.equal(read('/a/./b'), '/a/b');
70
+ });
71
+ });
31
72
  //# sourceMappingURL=protocol.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.test.js","sourceRoot":"","sources":["../../src/transport/protocol.test.ts"],"names":[],"mappings":";;;;;AAAA,gEAAuC;AACvC,yCAAwC;AACxC,yCAAkJ;AAElJ,IAAA,oBAAQ,EAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,IAAA,cAAE,EAAC,sFAAsF,EAAE,GAAG,EAAE;QAC9F,MAAM,KAAK,GAAsB,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;QAC9K,gBAAM,CAAC,KAAK,CAAC,IAAA,+BAAoB,EAAC,KAAK,CAAC,EAAE,IAAA,+BAAoB,EAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAA;QAC7E,gBAAM,CAAC,QAAQ,CAAC,IAAA,+BAAoB,EAAC,KAAK,CAAC,EAAE,IAAA,+BAAoB,EAAC,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC,CAAC,CAAA;QAC5G,gBAAM,CAAC,QAAQ,CAAC,IAAA,+BAAoB,EAAC,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,EAAE,IAAA,+BAAoB,EAAC,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IACxJ,CAAC,CAAC,CAAA;IACF,IAAA,cAAE,EAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,gBAAM,CAAC,KAAK,CAAC,IAAA,8BAAmB,EAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;QACnI,gBAAM,CAAC,KAAK,CAAC,IAAA,8BAAmB,EAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,CAAA;QAC5E,gBAAM,CAAC,KAAK,CAAC,IAAA,8BAAmB,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,CAAA;QAC1D,gBAAM,CAAC,KAAK,CAAC,IAAA,8BAAmB,EAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAA;IAChD,CAAC,CAAC,CAAA;IAEF,IAAA,cAAE,EAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,gBAAM,CAAC,KAAK,CAAC,IAAA,2BAAgB,EAAC,KAAK,CAAC,EAAE,mBAAmB,CAAC,CAAA;IAC5D,CAAC,CAAC,CAAA;IAEF,IAAA,cAAE,EAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,KAAK,MAAM,GAAG,IAAI,CAAC,oBAAS,CAAC,wBAAwB,EAAE,oBAAS,CAAC,YAAY,EAAE,oBAAS,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC7G,gBAAM,CAAC,EAAE,CAAC,gCAAqB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,mBAAmB,CAAC,CAAA;QAC3E,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"protocol.test.js","sourceRoot":"","sources":["../../src/transport/protocol.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /** Same cap as publish_results: past it a file is no longer mirrored (its last copy stays). */
2
+ export declare const MAX_SYNCED_FILE_BYTES: number;
3
+ /** Files mirrored per session; later ones are left out. */
4
+ export declare const MAX_SYNCED_FILES = 2000;
5
+ /** A workspace-relative POSIX path, without a leading ./ or /. */
6
+ export declare function normalizeSyncPath(relative: string): string;
7
+ /** Whether a directory's contents can be mirrored at all (it is also never watched otherwise). */
8
+ export declare function isSyncableDirectory(relative: string): boolean;
9
+ /** Whether live sync watches a directory: one it mirrors, or one holding a mirrored state file (.builder). */
10
+ export declare function isWatchedDirectory(relative: string): boolean;
11
+ export declare function isSyncablePath(relative: string): boolean;
12
+ /** The file as text, or undefined when it is binary (has a NUL byte) or too large to mirror. */
13
+ export declare function syncableText(buffer: Buffer): string | undefined;
14
+ //# sourceMappingURL=eligibility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eligibility.d.ts","sourceRoot":"","sources":["../../src/workspace-sync/eligibility.ts"],"names":[],"mappings":"AAYA,+FAA+F;AAC/F,eAAO,MAAM,qBAAqB,QAAa,CAAA;AAC/C,2DAA2D;AAC3D,eAAO,MAAM,gBAAgB,OAAQ,CAAA;AAErC,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,kGAAkG;AAClG,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAI7D;AAED,8GAA8G;AAC9G,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAG5D;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAMxD;AAED,gGAAgG;AAChG,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG/D"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MAX_SYNCED_FILES = exports.MAX_SYNCED_FILE_BYTES = void 0;
4
+ exports.normalizeSyncPath = normalizeSyncPath;
5
+ exports.isSyncableDirectory = isSyncableDirectory;
6
+ exports.isWatchedDirectory = isWatchedDirectory;
7
+ exports.isSyncablePath = isSyncablePath;
8
+ exports.syncableText = syncableText;
9
+ // Which workspace files live sync mirrors into the session: the text people would open, not
10
+ // dependencies, build output, VCS internals, logs or the agent's own state — but for the app
11
+ // manifest in that state, which people read and may edit.
12
+ const node_path_1 = require("node:path");
13
+ const protocol_1 = require("../transport/protocol");
14
+ /** Files under an excluded directory that are mirrored all the same. */
15
+ const MIRRORED_STATE_FILES = new Set([protocol_1.APP_CONFIG_FILE]);
16
+ const EXCLUDED_DIRECTORIES = new Set(['.git', '.builder', ...protocol_1.WORKSPACE_GENERATED_DIRECTORIES]);
17
+ const EXCLUDED_FILES = /(\.sqlite(-journal)?|\.log|^nohup\.out)$/;
18
+ /** Same cap as publish_results: past it a file is no longer mirrored (its last copy stays). */
19
+ exports.MAX_SYNCED_FILE_BYTES = 512 * 1024;
20
+ /** Files mirrored per session; later ones are left out. */
21
+ exports.MAX_SYNCED_FILES = 2000;
22
+ /** A workspace-relative POSIX path, without a leading ./ or /. */
23
+ function normalizeSyncPath(relative) {
24
+ return relative.split(/[\\/]+/).filter((part) => part && part !== '.').join('/');
25
+ }
26
+ /** Whether a directory's contents can be mirrored at all (it is also never watched otherwise). */
27
+ function isSyncableDirectory(relative) {
28
+ const path = normalizeSyncPath(relative);
29
+ if (path === 'data/attachments' || path.startsWith('data/attachments/'))
30
+ return false;
31
+ return !path.split('/').some((part) => EXCLUDED_DIRECTORIES.has(part));
32
+ }
33
+ /** Whether live sync watches a directory: one it mirrors, or one holding a mirrored state file (.builder). */
34
+ function isWatchedDirectory(relative) {
35
+ const path = normalizeSyncPath(relative);
36
+ return isSyncableDirectory(path) || [...MIRRORED_STATE_FILES].some((file) => node_path_1.posix.dirname(file) === path);
37
+ }
38
+ function isSyncablePath(relative) {
39
+ const path = normalizeSyncPath(relative);
40
+ if (!path || path.split('/').includes('..'))
41
+ return false;
42
+ if (MIRRORED_STATE_FILES.has(path))
43
+ return true;
44
+ const parts = path.split('/');
45
+ return isSyncableDirectory(parts.slice(0, -1).join('/')) && !EXCLUDED_FILES.test(parts[parts.length - 1]);
46
+ }
47
+ /** The file as text, or undefined when it is binary (has a NUL byte) or too large to mirror. */
48
+ function syncableText(buffer) {
49
+ if (buffer.byteLength > exports.MAX_SYNCED_FILE_BYTES || buffer.includes(0))
50
+ return undefined;
51
+ return buffer.toString('utf8');
52
+ }
53
+ //# sourceMappingURL=eligibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eligibility.js","sourceRoot":"","sources":["../../src/workspace-sync/eligibility.ts"],"names":[],"mappings":";;;AAkBA,8CAEC;AAGD,kDAIC;AAGD,gDAGC;AAED,wCAMC;AAGD,oCAGC;AA/CD,4FAA4F;AAC5F,6FAA6F;AAC7F,0DAA0D;AAC1D,yCAAiC;AACjC,oDAAwF;AAExF,wEAAwE;AACxE,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAS,CAAC,0BAAe,CAAC,CAAC,CAAA;AAE/D,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,0CAA+B,CAAC,CAAC,CAAA;AAC9F,MAAM,cAAc,GAAG,0CAA0C,CAAA;AAEjE,+FAA+F;AAClF,QAAA,qBAAqB,GAAG,GAAG,GAAG,IAAI,CAAA;AAC/C,2DAA2D;AAC9C,QAAA,gBAAgB,GAAG,IAAK,CAAA;AAErC,kEAAkE;AAClE,SAAgB,iBAAiB,CAAC,QAAgB;IAChD,OAAO,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAClF,CAAC;AAED,kGAAkG;AAClG,SAAgB,mBAAmB,CAAC,QAAgB;IAClD,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAA;IACxC,IAAI,IAAI,KAAK,kBAAkB,IAAI,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC;QAAE,OAAO,KAAK,CAAA;IACrF,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;AACxE,CAAC;AAED,8GAA8G;AAC9G,SAAgB,kBAAkB,CAAC,QAAgB;IACjD,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAA;IACxC,OAAO,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAA;AAC5G,CAAC;AAED,SAAgB,cAAc,CAAC,QAAgB;IAC7C,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAA;IACxC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAA;IACzD,IAAI,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC7B,OAAO,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAA;AAC3G,CAAC;AAED,gGAAgG;AAChG,SAAgB,YAAY,CAAC,MAAc;IACzC,IAAI,MAAM,CAAC,UAAU,GAAG,6BAAqB,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAA;IACrF,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;AAChC,CAAC"}
@@ -0,0 +1,15 @@
1
+ /** Replace base[start, end) with text. A pure insertion has start === end. */
2
+ interface Edit {
3
+ start: number;
4
+ end: number;
5
+ text: string;
6
+ }
7
+ /** The changes from `base` to `next`, as replacements of base ranges, in order. */
8
+ export declare function editsBetween(base: string, next: string): Edit[];
9
+ /**
10
+ * `ours` and `theirs` both changed `base`: the result has both sets of changes. Where they touch
11
+ * the same text, `theirs` (the session's copy, which people see and type into) wins.
12
+ */
13
+ export declare function merge3(base: string, ours: string, theirs: string): string;
14
+ export {};
15
+ //# sourceMappingURL=merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/workspace-sync/merge.ts"],"names":[],"mappings":"AAIA,8EAA8E;AAC9E,UAAU,IAAI;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;CACb;AAED,mFAAmF;AACnF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,CAsB/D;AAOD;;;GAGG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAgBzE"}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.editsBetween = editsBetween;
7
+ exports.merge3 = merge3;
8
+ // Three-way text merge for workspace live sync: when the guest changed a file while people edited
9
+ // the session's copy of it, both changes are kept, the way two editors' changes are in a shared doc.
10
+ const fast_diff_1 = __importDefault(require("fast-diff"));
11
+ /** The changes from `base` to `next`, as replacements of base ranges, in order. */
12
+ function editsBetween(base, next) {
13
+ const edits = [];
14
+ let position = 0;
15
+ for (const [op, text] of (0, fast_diff_1.default)(base, next, undefined, true)) {
16
+ if (op === fast_diff_1.default.EQUAL) {
17
+ position += text.length;
18
+ continue;
19
+ }
20
+ // A replacement comes as a delete and an insert at the same place: one edit.
21
+ const last = edits[edits.length - 1];
22
+ const current = last && last.end === position ? last : undefined;
23
+ if (op === fast_diff_1.default.DELETE) {
24
+ if (current)
25
+ current.end += text.length;
26
+ else
27
+ edits.push({ start: position, end: position + text.length, text: '' });
28
+ position += text.length;
29
+ }
30
+ else if (current) {
31
+ current.text += text;
32
+ }
33
+ else {
34
+ edits.push({ start: position, end: position, text });
35
+ }
36
+ }
37
+ return edits;
38
+ }
39
+ /** Edits that touch the same base text. Two insertions at one point don't: both are kept. */
40
+ function overlapping(a, b) {
41
+ return a.start < b.end && b.start < a.end;
42
+ }
43
+ /**
44
+ * `ours` and `theirs` both changed `base`: the result has both sets of changes. Where they touch
45
+ * the same text, `theirs` (the session's copy, which people see and type into) wins.
46
+ */
47
+ function merge3(base, ours, theirs) {
48
+ if (ours === base || ours === theirs)
49
+ return theirs;
50
+ if (theirs === base)
51
+ return ours;
52
+ const their = editsBetween(base, theirs);
53
+ const mine = editsBetween(base, ours).filter((edit) => !their.some((other) => overlapping(edit, other)));
54
+ const edits = [
55
+ ...their.map((edit) => ({ ...edit, order: 0 })),
56
+ ...mine.map((edit) => ({ ...edit, order: 1 })),
57
+ ].sort((a, b) => a.start - b.start || a.end - b.end || a.order - b.order);
58
+ let result = '';
59
+ let position = 0;
60
+ for (const edit of edits) {
61
+ result += base.slice(position, edit.start) + edit.text;
62
+ position = edit.end;
63
+ }
64
+ return result + base.slice(position);
65
+ }
66
+ //# sourceMappingURL=merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/workspace-sync/merge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=merge.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.test.d.ts","sourceRoot":"","sources":["../../src/workspace-sync/merge.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const strict_1 = __importDefault(require("node:assert/strict"));
7
+ const node_test_1 = require("node:test");
8
+ const merge_1 = require("./merge");
9
+ const BASE = 'function greet() {\n return "hi"\n}\n\nexport default greet\n';
10
+ (0, node_test_1.it)('keeps both sides\' changes to different parts of a file', () => {
11
+ const ours = BASE.replace('"hi"', '"hello"');
12
+ const theirs = BASE.replace('export default greet', 'export { greet }');
13
+ strict_1.default.equal((0, merge_1.merge3)(BASE, ours, theirs), 'function greet() {\n return "hello"\n}\n\nexport { greet }\n');
14
+ });
15
+ (0, node_test_1.it)('lets the session\'s copy win where both changed the same text', () => {
16
+ const ours = BASE.replace('"hi"', '"hello"');
17
+ const theirs = BASE.replace('"hi"', '"hey"');
18
+ strict_1.default.equal((0, merge_1.merge3)(BASE, ours, theirs), theirs);
19
+ });
20
+ (0, node_test_1.it)('keeps two insertions at the same point, the session\'s first', () => {
21
+ strict_1.default.equal((0, merge_1.merge3)('ab', 'aXb', 'aYb'), 'aYXb');
22
+ });
23
+ (0, node_test_1.it)('takes whichever side changed when only one did', () => {
24
+ strict_1.default.equal((0, merge_1.merge3)(BASE, BASE, 'new'), 'new');
25
+ strict_1.default.equal((0, merge_1.merge3)(BASE, 'mine', BASE), 'mine');
26
+ strict_1.default.equal((0, merge_1.merge3)(BASE, 'same', 'same'), 'same');
27
+ });
28
+ //# sourceMappingURL=merge.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.test.js","sourceRoot":"","sources":["../../src/workspace-sync/merge.test.ts"],"names":[],"mappings":";;;;;AAAA,gEAAuC;AACvC,yCAA8B;AAC9B,mCAAgC;AAEhC,MAAM,IAAI,GAAG,gEAAgE,CAAA;AAE7E,IAAA,cAAE,EAAC,yDAAyD,EAAE,GAAG,EAAE;IACjE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE,kBAAkB,CAAC,CAAA;IACvE,gBAAM,CAAC,KAAK,CAAC,IAAA,cAAM,EAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,+DAA+D,CAAC,CAAA;AAC3G,CAAC,CAAC,CAAA;AAEF,IAAA,cAAE,EAAC,+DAA+D,EAAE,GAAG,EAAE;IACvE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC5C,gBAAM,CAAC,KAAK,CAAC,IAAA,cAAM,EAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAA;AAClD,CAAC,CAAC,CAAA;AAEF,IAAA,cAAE,EAAC,8DAA8D,EAAE,GAAG,EAAE;IACtE,gBAAM,CAAC,KAAK,CAAC,IAAA,cAAM,EAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,CAAA;AAClD,CAAC,CAAC,CAAA;AAEF,IAAA,cAAE,EAAC,gDAAgD,EAAE,GAAG,EAAE;IACxD,gBAAM,CAAC,KAAK,CAAC,IAAA,cAAM,EAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAA;IAC9C,gBAAM,CAAC,KAAK,CAAC,IAAA,cAAM,EAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;IAChD,gBAAM,CAAC,KAAK,CAAC,IAAA,cAAM,EAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAA;AACpD,CAAC,CAAC,CAAA"}
@@ -0,0 +1,48 @@
1
+ import type { OutboundEvent } from '../transport/link';
2
+ export declare class WorkspaceSync {
3
+ private readonly dir;
4
+ private readonly send;
5
+ private readonly files;
6
+ private readonly timers;
7
+ private readonly watchers;
8
+ private readonly queues;
9
+ private rescanTimer?;
10
+ private stopped;
11
+ constructor(dir: string, send: (event: OutboundEvent) => void);
12
+ /** Mirrors every file there is now, then follows changes until stop(). */
13
+ start(): Promise<void>;
14
+ stop(): void;
15
+ /** Whether the session has confirmed exactly this version of `file`, so storage already holds it. */
16
+ isConfirmed(file: string, content: Buffer): boolean;
17
+ /** Sends what the model has written so far of a file it is still writing (see WriteDraftTracker). */
18
+ draft(file: string, content: string): void;
19
+ /** Ends drafts: the session's copy becomes whatever is on disk now (or goes, if nothing is). */
20
+ settle(files: string[]): Promise<void>;
21
+ /** Mirrors these files now, without waiting for their watch events (publish_results). */
22
+ flush(files: string[]): Promise<void>;
23
+ /** file_state: people changed the session's copy (content), or it took the guest's version (none). */
24
+ applyState(command: {
25
+ path: string;
26
+ hash: string;
27
+ content?: string;
28
+ }): Promise<void>;
29
+ /** file_delete: someone deleted the session's copy. */
30
+ applyDelete(file: string): Promise<void>;
31
+ private rescan;
32
+ private scan;
33
+ /** One watcher per directory, not one recursive watch: excluded trees (node_modules) are never watched. */
34
+ private watchDirectory;
35
+ private unwatch;
36
+ private onWatchEvent;
37
+ private schedule;
38
+ /** One operation at a time per file, in the order they were asked for. */
39
+ private enqueue;
40
+ /** Sends the file's current state, if it is new to the session. `final` sends it regardless (ends a draft). */
41
+ private syncPath;
42
+ /** The file's text; `unchanged` when its size and modification time still match `statKey`. */
43
+ private read;
44
+ private write;
45
+ /** The absolute path of a workspace file, or undefined when it would escape the workspace. */
46
+ private resolve;
47
+ }
48
+ //# sourceMappingURL=workspace-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-sync.d.ts","sourceRoot":"","sources":["../../src/workspace-sync/workspace-sync.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAmCtD,qBAAa,aAAa;IAStB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,IAAI;IATvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+B;IACrD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;IAC3D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA+B;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;IAC1D,OAAO,CAAC,WAAW,CAAC,CAAgB;IACpC,OAAO,CAAC,OAAO,CAAQ;gBAGJ,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI;IAGvD,0EAA0E;IACpE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B,IAAI,IAAI,IAAI;IASZ,qGAAqG;IACrG,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAKnD,qGAAqG;IACrG,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAO1C,gGAAgG;IAC1F,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5C,yFAAyF;IACnF,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAO3C,sGAAsG;IACtG,UAAU,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BpF,uDAAuD;IACvD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAS1B,MAAM;YAON,IAAI;IAoBlB,2GAA2G;IAC3G,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,YAAY;IAkBpB,OAAO,CAAC,QAAQ;IAWhB,0EAA0E;IAC1E,OAAO,CAAC,OAAO;IAUf,+GAA+G;YACjG,QAAQ;IA8BtB,8FAA8F;YAChF,IAAI;YAiBJ,KAAK;IAMnB,8FAA8F;IAC9F,OAAO,CAAC,OAAO;CAKhB"}