@zuplo/editor 0.1.0 → 1.0.18282606817-dev

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 (163) hide show
  1. package/dist/client/favicon-local.ico +0 -0
  2. package/dist/client/geist/Geist-Black.woff2 +0 -0
  3. package/dist/client/geist/Geist-Bold.woff2 +0 -0
  4. package/dist/client/geist/Geist-Light.woff2 +0 -0
  5. package/dist/client/geist/Geist-Medium.woff2 +0 -0
  6. package/dist/client/geist/Geist-Regular.woff2 +0 -0
  7. package/dist/client/geist/Geist-SemiBold.woff2 +0 -0
  8. package/dist/client/geist/Geist-Thin.woff2 +0 -0
  9. package/dist/client/geist/Geist-UltraBlack.woff2 +2151 -0
  10. package/dist/client/geist/Geist-UltraLight.woff2 +2151 -0
  11. package/dist/client/geist/fonts.css +71 -0
  12. package/dist/client/local-editor.html +5 -6
  13. package/dist/client/static/css/main-D3M2tKfG.css +1 -0
  14. package/dist/client/static/img/hero-CA-QKTbm.svg +28 -0
  15. package/dist/client/static/js/local-worker-BVQSFGzz.js +2 -0
  16. package/dist/client/static/js/local-worker-BVQSFGzz.js.map +1 -0
  17. package/dist/client/static/js/main-CIyp_ifb.js +2074 -0
  18. package/dist/client/static/js/main-CIyp_ifb.js.map +1 -0
  19. package/dist/routes/api.d.ts +12 -0
  20. package/dist/routes/api.d.ts.map +1 -0
  21. package/dist/routes/api.js +112 -0
  22. package/dist/routes/api.js.map +1 -0
  23. package/dist/routes/editor.d.ts +7 -0
  24. package/dist/routes/editor.d.ts.map +1 -0
  25. package/dist/routes/editor.js +151 -0
  26. package/dist/routes/editor.js.map +1 -0
  27. package/dist/routes/fs.d.ts.map +1 -1
  28. package/dist/routes/fs.js +97 -4
  29. package/dist/routes/fs.js.map +1 -1
  30. package/dist/routes/test.d.ts +10 -0
  31. package/dist/routes/test.d.ts.map +1 -0
  32. package/dist/routes/test.js +68 -0
  33. package/dist/routes/test.js.map +1 -0
  34. package/dist/server.d.ts +4 -13
  35. package/dist/server.d.ts.map +1 -1
  36. package/dist/server.js +106 -90
  37. package/dist/server.js.map +1 -1
  38. package/package.json +1 -1
  39. package/dist/client/assets/local-editor-C-tz9jAp.js +0 -2048
  40. package/dist/client/assets/local-editor-DTOl6Htj.css +0 -1
  41. package/dist/client/manifest.json +0 -25
  42. package/dist/client/monaco/min/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
  43. package/dist/client/monaco/min/vs/base/common/worker/simpleWorker.nls.de.js +0 -8
  44. package/dist/client/monaco/min/vs/base/common/worker/simpleWorker.nls.es.js +0 -8
  45. package/dist/client/monaco/min/vs/base/common/worker/simpleWorker.nls.fr.js +0 -8
  46. package/dist/client/monaco/min/vs/base/common/worker/simpleWorker.nls.it.js +0 -8
  47. package/dist/client/monaco/min/vs/base/common/worker/simpleWorker.nls.ja.js +0 -8
  48. package/dist/client/monaco/min/vs/base/common/worker/simpleWorker.nls.js +0 -8
  49. package/dist/client/monaco/min/vs/base/common/worker/simpleWorker.nls.ko.js +0 -8
  50. package/dist/client/monaco/min/vs/base/common/worker/simpleWorker.nls.ru.js +0 -8
  51. package/dist/client/monaco/min/vs/base/common/worker/simpleWorker.nls.zh-cn.js +0 -8
  52. package/dist/client/monaco/min/vs/base/common/worker/simpleWorker.nls.zh-tw.js +0 -8
  53. package/dist/client/monaco/min/vs/base/worker/workerMain.js +0 -30
  54. package/dist/client/monaco/min/vs/basic-languages/abap/abap.js +0 -10
  55. package/dist/client/monaco/min/vs/basic-languages/apex/apex.js +0 -10
  56. package/dist/client/monaco/min/vs/basic-languages/azcli/azcli.js +0 -10
  57. package/dist/client/monaco/min/vs/basic-languages/bat/bat.js +0 -10
  58. package/dist/client/monaco/min/vs/basic-languages/bicep/bicep.js +0 -11
  59. package/dist/client/monaco/min/vs/basic-languages/cameligo/cameligo.js +0 -10
  60. package/dist/client/monaco/min/vs/basic-languages/clojure/clojure.js +0 -10
  61. package/dist/client/monaco/min/vs/basic-languages/coffee/coffee.js +0 -10
  62. package/dist/client/monaco/min/vs/basic-languages/cpp/cpp.js +0 -10
  63. package/dist/client/monaco/min/vs/basic-languages/csharp/csharp.js +0 -10
  64. package/dist/client/monaco/min/vs/basic-languages/csp/csp.js +0 -10
  65. package/dist/client/monaco/min/vs/basic-languages/css/css.js +0 -12
  66. package/dist/client/monaco/min/vs/basic-languages/cypher/cypher.js +0 -10
  67. package/dist/client/monaco/min/vs/basic-languages/dart/dart.js +0 -10
  68. package/dist/client/monaco/min/vs/basic-languages/dockerfile/dockerfile.js +0 -10
  69. package/dist/client/monaco/min/vs/basic-languages/ecl/ecl.js +0 -10
  70. package/dist/client/monaco/min/vs/basic-languages/elixir/elixir.js +0 -10
  71. package/dist/client/monaco/min/vs/basic-languages/flow9/flow9.js +0 -10
  72. package/dist/client/monaco/min/vs/basic-languages/freemarker2/freemarker2.js +0 -12
  73. package/dist/client/monaco/min/vs/basic-languages/fsharp/fsharp.js +0 -10
  74. package/dist/client/monaco/min/vs/basic-languages/go/go.js +0 -10
  75. package/dist/client/monaco/min/vs/basic-languages/graphql/graphql.js +0 -10
  76. package/dist/client/monaco/min/vs/basic-languages/handlebars/handlebars.js +0 -10
  77. package/dist/client/monaco/min/vs/basic-languages/hcl/hcl.js +0 -10
  78. package/dist/client/monaco/min/vs/basic-languages/html/html.js +0 -10
  79. package/dist/client/monaco/min/vs/basic-languages/ini/ini.js +0 -10
  80. package/dist/client/monaco/min/vs/basic-languages/java/java.js +0 -10
  81. package/dist/client/monaco/min/vs/basic-languages/javascript/javascript.js +0 -10
  82. package/dist/client/monaco/min/vs/basic-languages/julia/julia.js +0 -10
  83. package/dist/client/monaco/min/vs/basic-languages/kotlin/kotlin.js +0 -10
  84. package/dist/client/monaco/min/vs/basic-languages/less/less.js +0 -11
  85. package/dist/client/monaco/min/vs/basic-languages/lexon/lexon.js +0 -10
  86. package/dist/client/monaco/min/vs/basic-languages/liquid/liquid.js +0 -10
  87. package/dist/client/monaco/min/vs/basic-languages/lua/lua.js +0 -10
  88. package/dist/client/monaco/min/vs/basic-languages/m3/m3.js +0 -10
  89. package/dist/client/monaco/min/vs/basic-languages/markdown/markdown.js +0 -10
  90. package/dist/client/monaco/min/vs/basic-languages/mdx/mdx.js +0 -10
  91. package/dist/client/monaco/min/vs/basic-languages/mips/mips.js +0 -10
  92. package/dist/client/monaco/min/vs/basic-languages/msdax/msdax.js +0 -10
  93. package/dist/client/monaco/min/vs/basic-languages/mysql/mysql.js +0 -10
  94. package/dist/client/monaco/min/vs/basic-languages/objective-c/objective-c.js +0 -10
  95. package/dist/client/monaco/min/vs/basic-languages/pascal/pascal.js +0 -10
  96. package/dist/client/monaco/min/vs/basic-languages/pascaligo/pascaligo.js +0 -10
  97. package/dist/client/monaco/min/vs/basic-languages/perl/perl.js +0 -10
  98. package/dist/client/monaco/min/vs/basic-languages/pgsql/pgsql.js +0 -10
  99. package/dist/client/monaco/min/vs/basic-languages/php/php.js +0 -10
  100. package/dist/client/monaco/min/vs/basic-languages/pla/pla.js +0 -10
  101. package/dist/client/monaco/min/vs/basic-languages/postiats/postiats.js +0 -10
  102. package/dist/client/monaco/min/vs/basic-languages/powerquery/powerquery.js +0 -10
  103. package/dist/client/monaco/min/vs/basic-languages/powershell/powershell.js +0 -10
  104. package/dist/client/monaco/min/vs/basic-languages/protobuf/protobuf.js +0 -11
  105. package/dist/client/monaco/min/vs/basic-languages/pug/pug.js +0 -10
  106. package/dist/client/monaco/min/vs/basic-languages/python/python.js +0 -10
  107. package/dist/client/monaco/min/vs/basic-languages/qsharp/qsharp.js +0 -10
  108. package/dist/client/monaco/min/vs/basic-languages/r/r.js +0 -10
  109. package/dist/client/monaco/min/vs/basic-languages/razor/razor.js +0 -10
  110. package/dist/client/monaco/min/vs/basic-languages/redis/redis.js +0 -10
  111. package/dist/client/monaco/min/vs/basic-languages/redshift/redshift.js +0 -10
  112. package/dist/client/monaco/min/vs/basic-languages/restructuredtext/restructuredtext.js +0 -10
  113. package/dist/client/monaco/min/vs/basic-languages/ruby/ruby.js +0 -10
  114. package/dist/client/monaco/min/vs/basic-languages/rust/rust.js +0 -10
  115. package/dist/client/monaco/min/vs/basic-languages/sb/sb.js +0 -10
  116. package/dist/client/monaco/min/vs/basic-languages/scala/scala.js +0 -10
  117. package/dist/client/monaco/min/vs/basic-languages/scheme/scheme.js +0 -10
  118. package/dist/client/monaco/min/vs/basic-languages/scss/scss.js +0 -12
  119. package/dist/client/monaco/min/vs/basic-languages/shell/shell.js +0 -10
  120. package/dist/client/monaco/min/vs/basic-languages/solidity/solidity.js +0 -10
  121. package/dist/client/monaco/min/vs/basic-languages/sophia/sophia.js +0 -10
  122. package/dist/client/monaco/min/vs/basic-languages/sparql/sparql.js +0 -10
  123. package/dist/client/monaco/min/vs/basic-languages/sql/sql.js +0 -10
  124. package/dist/client/monaco/min/vs/basic-languages/st/st.js +0 -10
  125. package/dist/client/monaco/min/vs/basic-languages/swift/swift.js +0 -13
  126. package/dist/client/monaco/min/vs/basic-languages/systemverilog/systemverilog.js +0 -10
  127. package/dist/client/monaco/min/vs/basic-languages/tcl/tcl.js +0 -10
  128. package/dist/client/monaco/min/vs/basic-languages/twig/twig.js +0 -10
  129. package/dist/client/monaco/min/vs/basic-languages/typescript/typescript.js +0 -10
  130. package/dist/client/monaco/min/vs/basic-languages/typespec/typespec.js +0 -10
  131. package/dist/client/monaco/min/vs/basic-languages/vb/vb.js +0 -10
  132. package/dist/client/monaco/min/vs/basic-languages/wgsl/wgsl.js +0 -307
  133. package/dist/client/monaco/min/vs/basic-languages/xml/xml.js +0 -10
  134. package/dist/client/monaco/min/vs/basic-languages/yaml/yaml.js +0 -10
  135. package/dist/client/monaco/min/vs/editor/editor.main.css +0 -8
  136. package/dist/client/monaco/min/vs/editor/editor.main.js +0 -768
  137. package/dist/client/monaco/min/vs/editor/editor.main.nls.de.js +0 -17
  138. package/dist/client/monaco/min/vs/editor/editor.main.nls.es.js +0 -17
  139. package/dist/client/monaco/min/vs/editor/editor.main.nls.fr.js +0 -15
  140. package/dist/client/monaco/min/vs/editor/editor.main.nls.it.js +0 -15
  141. package/dist/client/monaco/min/vs/editor/editor.main.nls.ja.js +0 -17
  142. package/dist/client/monaco/min/vs/editor/editor.main.nls.js +0 -15
  143. package/dist/client/monaco/min/vs/editor/editor.main.nls.ko.js +0 -15
  144. package/dist/client/monaco/min/vs/editor/editor.main.nls.ru.js +0 -17
  145. package/dist/client/monaco/min/vs/editor/editor.main.nls.zh-cn.js +0 -17
  146. package/dist/client/monaco/min/vs/editor/editor.main.nls.zh-tw.js +0 -15
  147. package/dist/client/monaco/min/vs/language/css/cssMode.js +0 -13
  148. package/dist/client/monaco/min/vs/language/css/cssWorker.js +0 -77
  149. package/dist/client/monaco/min/vs/language/html/htmlMode.js +0 -13
  150. package/dist/client/monaco/min/vs/language/html/htmlWorker.js +0 -454
  151. package/dist/client/monaco/min/vs/language/json/jsonMode.js +0 -19
  152. package/dist/client/monaco/min/vs/language/json/jsonWorker.js +0 -42
  153. package/dist/client/monaco/min/vs/language/typescript/tsMode.js +0 -20
  154. package/dist/client/monaco/min/vs/language/typescript/tsWorker.js +0 -51328
  155. package/dist/client/monaco/min/vs/loader.js +0 -11
  156. package/dist/routes/files.d.ts +0 -3
  157. package/dist/routes/files.d.ts.map +0 -1
  158. package/dist/routes/files.js +0 -10
  159. package/dist/routes/files.js.map +0 -1
  160. package/dist/routes/modules.d.ts +0 -3
  161. package/dist/routes/modules.d.ts.map +0 -1
  162. package/dist/routes/modules.js +0 -47
  163. package/dist/routes/modules.js.map +0 -1
@@ -0,0 +1,12 @@
1
+ import { FastifyInstance } from "fastify";
2
+ import type { Logger } from "pino";
3
+ interface ApiRoutesOptions {
4
+ workingDir: string;
5
+ portalRoot: string;
6
+ logger: Logger;
7
+ sseClients: Set<any>;
8
+ deploymentUrl: string;
9
+ }
10
+ export declare function createApiRoutes(fastify: FastifyInstance, options: ApiRoutesOptions): Promise<void>;
11
+ export {};
12
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/routes/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAQnC,UAAU,gBAAgB;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,IAAI,CAAC,CA4Hf"}
@@ -0,0 +1,112 @@
1
+ import { createEditorRoutes } from "./editor.js";
2
+ import { createFsRoutes } from "./fs.js";
3
+ import { createTestRoutes } from "./test.js";
4
+ import { createTypesRoutes } from "./types.js";
5
+ const POLICIES_FILENAME = "policies.json";
6
+ export async function createApiRoutes(fastify, options) {
7
+ const { workingDir, portalRoot, logger, sseClients, deploymentUrl } = options;
8
+ // Filesystem routes
9
+ await fastify.register(createFsRoutes, {
10
+ prefix: "/v1/deployments/local/fs",
11
+ workingDir,
12
+ });
13
+ // Types routes (for serving TypeScript definitions)
14
+ await fastify.register(createTypesRoutes, {
15
+ prefix: "/types",
16
+ portalRoot,
17
+ });
18
+ // Editor routes (for opening files in external editor)
19
+ await fastify.register(createEditorRoutes, {
20
+ prefix: "/v1/editor",
21
+ workingDir,
22
+ });
23
+ // Test routes (for proxying test requests to local Zuplo gateway)
24
+ await fastify.register(createTestRoutes, {
25
+ prefix: "/v1",
26
+ workingDir,
27
+ logger,
28
+ deploymentUrl,
29
+ });
30
+ // Server-Sent Events for file changes
31
+ fastify.get("/changes", async (request, reply) => {
32
+ // Hijack the reply to keep connection open
33
+ reply.hijack();
34
+ reply.raw.writeHead(200, {
35
+ "Content-Type": "text/event-stream",
36
+ "Cache-Control": "no-cache",
37
+ Connection: "keep-alive",
38
+ "X-Accel-Buffering": "no", // Disable nginx buffering
39
+ });
40
+ // Flush headers immediately
41
+ if (typeof reply.raw.flushHeaders === "function") {
42
+ reply.raw.flushHeaders();
43
+ }
44
+ // Send initial event
45
+ reply.raw.write(`data: ${JSON.stringify({ type: "init", filePath: POLICIES_FILENAME })}\n\n`);
46
+ sseClients.add(reply.raw);
47
+ // Send keep-alive comments every 30 seconds to prevent timeouts
48
+ const keepAliveInterval = setInterval(() => {
49
+ try {
50
+ reply.raw.write(": keep-alive\n\n");
51
+ }
52
+ catch {
53
+ clearInterval(keepAliveInterval);
54
+ }
55
+ }, 30000);
56
+ request.raw.on("close", () => {
57
+ clearInterval(keepAliveInterval);
58
+ sseClients.delete(reply.raw);
59
+ });
60
+ request.raw.on("error", (err) => {
61
+ logger.error(`SSE connection error: ${err.message}`);
62
+ clearInterval(keepAliveInterval);
63
+ sseClients.delete(reply.raw);
64
+ });
65
+ });
66
+ // Health check
67
+ fastify.get("/ping", async (_request, reply) => {
68
+ reply.status(200).send();
69
+ });
70
+ // Get deployment info (includes URL for local gateway)
71
+ fastify.get("/v1/deployments/local", async (_request, reply) => {
72
+ reply.status(200).send({
73
+ deploymentVersion: {
74
+ stages: [
75
+ {
76
+ stage: "api",
77
+ url: deploymentUrl,
78
+ },
79
+ ],
80
+ },
81
+ });
82
+ });
83
+ // Serve CDN content (schemas, etc) by proxying to the real Zuplo CDN
84
+ // The frontend is configured with CDN_URL="/api" in local mode
85
+ // So requests like /api/schemas/openapi-v3.1-zuplo.json need to be proxied
86
+ fastify.get("/schemas/*", async (request, reply) => {
87
+ // Remove /api prefix and fetch from CDN
88
+ const cdnPath = request.url.replace("/api", "");
89
+ const cdnUrl = `https://cdn.zuplo.com${cdnPath}`;
90
+ try {
91
+ const response = await fetch(cdnUrl);
92
+ if (!response.ok) {
93
+ return reply.status(response.status).send("Not found");
94
+ }
95
+ const contentType = response.headers.get("content-type");
96
+ if (contentType) {
97
+ reply.header("Content-Type", contentType);
98
+ }
99
+ const data = await response.text();
100
+ reply.send(data);
101
+ }
102
+ catch {
103
+ logger.error(`Failed to fetch from CDN: ${cdnUrl}`);
104
+ reply.status(404).send("Not found");
105
+ }
106
+ });
107
+ // Catch-all for unhandled API routes - return 404
108
+ fastify.all("/*", async (_request, reply) => {
109
+ reply.status(404).send({ error: "Not found" });
110
+ });
111
+ }
112
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/routes/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { FastifyInstance, FastifyPluginOptions } from "fastify";
2
+ interface EditorRoutesOptions extends FastifyPluginOptions {
3
+ workingDir: string;
4
+ }
5
+ export declare function createEditorRoutes(fastify: FastifyInstance, options: EditorRoutesOptions): Promise<void>;
6
+ export {};
7
+ //# sourceMappingURL=editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../src/routes/editor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAgErE,UAAU,mBAAoB,SAAQ,oBAAoB;IACxD,UAAU,EAAE,MAAM,CAAC;CACpB;AAqBD,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAkGf"}
@@ -0,0 +1,151 @@
1
+ import fs from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import path from "node:path";
4
+ // XDG config directory helpers
5
+ function getXdgConfigHome() {
6
+ return process.env.XDG_CONFIG_HOME ?? path.join(homedir(), ".config");
7
+ }
8
+ function getZuploConfigDir() {
9
+ return path.join(getXdgConfigHome(), "zuplo");
10
+ }
11
+ function getEditorConfigPath() {
12
+ return path.join(getZuploConfigDir(), "editor.json");
13
+ }
14
+ const EDITORS = {
15
+ vscode: {
16
+ name: "Visual Studio Code",
17
+ protocol: "vscode",
18
+ urlTemplate: "vscode://file{file}:{line}:{column}",
19
+ detectFiles: [".vscode/settings.json"],
20
+ },
21
+ cursor: {
22
+ name: "Cursor",
23
+ protocol: "cursor",
24
+ urlTemplate: "cursor://file{file}:{line}:{column}",
25
+ detectFiles: [".cursor"],
26
+ },
27
+ webstorm: {
28
+ name: "WebStorm",
29
+ protocol: "webstorm",
30
+ urlTemplate: "webstorm://open?file={file}&line={line}",
31
+ detectFiles: [".idea"],
32
+ },
33
+ phpstorm: {
34
+ name: "PhpStorm",
35
+ protocol: "phpstorm",
36
+ urlTemplate: "phpstorm://open?file={file}&line={line}",
37
+ detectFiles: [".idea"],
38
+ },
39
+ intellij: {
40
+ name: "IntelliJ IDEA",
41
+ protocol: "idea",
42
+ urlTemplate: "idea://open?file={file}&line={line}",
43
+ detectFiles: [".idea"],
44
+ },
45
+ sublimetext: {
46
+ name: "Sublime Text",
47
+ protocol: "subl",
48
+ urlTemplate: "subl://open?url=file://{file}&line={line}&column={column}",
49
+ },
50
+ };
51
+ async function loadEditorPreference() {
52
+ try {
53
+ const configPath = getEditorConfigPath();
54
+ const data = await fs.readFile(configPath, "utf-8");
55
+ const config = JSON.parse(data);
56
+ return config.editor ?? null;
57
+ }
58
+ catch {
59
+ return null;
60
+ }
61
+ }
62
+ async function saveEditorPreference(editor) {
63
+ const configDir = getZuploConfigDir();
64
+ await fs.mkdir(configDir, { recursive: true });
65
+ const configPath = getEditorConfigPath();
66
+ await fs.writeFile(configPath, JSON.stringify({ editor }, null, 2), "utf-8");
67
+ }
68
+ export async function createEditorRoutes(fastify, options) {
69
+ const { workingDir } = options;
70
+ // Detect editor: GET /editor/detect
71
+ fastify.get("/detect", async (_request, reply) => {
72
+ try {
73
+ // Check saved preference
74
+ const savedEditor = await loadEditorPreference();
75
+ if (savedEditor && EDITORS[savedEditor]) {
76
+ return reply.status(200).send({
77
+ editor: savedEditor,
78
+ name: EDITORS[savedEditor].name,
79
+ });
80
+ }
81
+ // No editor found
82
+ return reply.status(200).send({
83
+ editor: null,
84
+ name: null,
85
+ });
86
+ }
87
+ catch (err) {
88
+ return reply.status(500).send({
89
+ message: `Error detecting editor: ${err.message}`,
90
+ });
91
+ }
92
+ });
93
+ // Get available editors: GET /editor/list
94
+ fastify.get("/list", async (_request, reply) => {
95
+ const editors = Object.entries(EDITORS).map(([id, info]) => ({
96
+ id,
97
+ name: info.name,
98
+ }));
99
+ return reply.status(200).send({ editors });
100
+ });
101
+ // Save editor preference: POST /editor/preference
102
+ fastify.post("/preference", async (request, reply) => {
103
+ const { editor } = request.body;
104
+ if (!EDITORS[editor]) {
105
+ return reply.status(400).send({
106
+ message: `Unknown editor: ${editor}`,
107
+ });
108
+ }
109
+ try {
110
+ await saveEditorPreference(editor);
111
+ return reply.status(200).send({ success: true });
112
+ }
113
+ catch (err) {
114
+ return reply.status(500).send({
115
+ message: `Error saving preference: ${err.message}`,
116
+ });
117
+ }
118
+ });
119
+ // Get URL to open file in editor: POST /editor/open
120
+ fastify.post("/open", async (request, reply) => {
121
+ const { file, line = 1, column = 1 } = request.body;
122
+ if (!file) {
123
+ return reply.status(400).send({ message: "File path is required" });
124
+ }
125
+ try {
126
+ // Get editor preference
127
+ const savedEditor = await loadEditorPreference();
128
+ if (!savedEditor || !EDITORS[savedEditor]) {
129
+ return reply.status(400).send({
130
+ message: "No editor preference set",
131
+ });
132
+ }
133
+ const editor = EDITORS[savedEditor];
134
+ // Build file path
135
+ const relativePath = file.startsWith("/") ? file.slice(1) : file;
136
+ const fullPath = path.join(workingDir, relativePath);
137
+ // Build URL from template
138
+ const url = editor.urlTemplate
139
+ .replace("{file}", fullPath)
140
+ .replace("{line}", String(line))
141
+ .replace("{column}", String(column));
142
+ return reply.status(200).send({ url });
143
+ }
144
+ catch (err) {
145
+ return reply.status(500).send({
146
+ message: `Error building editor URL: ${err.message}`,
147
+ });
148
+ }
149
+ });
150
+ }
151
+ //# sourceMappingURL=editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.js","sourceRoot":"","sources":["../../src/routes/editor.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/routes/fs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAsBrE,UAAU,eAAgB,SAAQ,oBAAoB;IACpD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CAgQf"}
1
+ {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/routes/fs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAsBrE,UAAU,eAAgB,SAAQ,oBAAoB;IACpD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CAkXf"}
package/dist/routes/fs.js CHANGED
@@ -23,7 +23,7 @@ export async function createFsRoutes(fastify, options) {
23
23
  // Match portal's file API shape but simplified for local: /api/fs/dir
24
24
  fastify.get("/dir", async (request, reply) => {
25
25
  try {
26
- const requestPath = request.query.path || "/";
26
+ const requestPath = request.query.path ?? "/";
27
27
  const recursive = request.query.recursive === "true";
28
28
  const fileTree = [];
29
29
  // Helper function to recursively read directory
@@ -54,7 +54,7 @@ export async function createFsRoutes(fastify, options) {
54
54
  }
55
55
  catch (err) {
56
56
  // Silently skip directories that can't be read
57
- console.warn(`Warning: Could not read directory ${dirPath}: ${err.message}`);
57
+ request.log.warn(`Warning: Could not read directory ${dirPath}: ${err.message}`);
58
58
  }
59
59
  };
60
60
  if (requestPath === "/") {
@@ -109,9 +109,15 @@ export async function createFsRoutes(fastify, options) {
109
109
  return reply.status(404).send(`Cannot find file: ${filePath}`);
110
110
  }
111
111
  try {
112
+ // Get file stats for Last-Modified header
113
+ const stats = await fs.stat(fullPath);
112
114
  const content = await fs.readFile(fullPath, "utf-8");
113
- // Return raw content as text (matching portal API)
114
- reply.status(200).type("text/plain").send(content);
115
+ // Return raw content as text with Last-Modified header
116
+ reply
117
+ .status(200)
118
+ .type("text/plain")
119
+ .header("Last-Modified", stats.mtime.toUTCString())
120
+ .send(content);
115
121
  }
116
122
  catch (err) {
117
123
  reply.status(500).send(`Error reading file: ${err.message}`);
@@ -129,6 +135,29 @@ export async function createFsRoutes(fastify, options) {
129
135
  : filePath;
130
136
  const fullPath = path.join(workingDir, relativePath);
131
137
  try {
138
+ // Check if file exists and has been modified since client loaded it
139
+ // Skip conflict check if x-force-save header is present (user resolved conflict)
140
+ const forceSave = request.headers["x-force-save"];
141
+ if (!forceSave && (await fileExists(fullPath))) {
142
+ const stats = await fs.stat(fullPath);
143
+ const ifUnmodifiedSince = request.headers["if-unmodified-since"];
144
+ if (ifUnmodifiedSince) {
145
+ const clientTimestamp = new Date(ifUnmodifiedSince).getTime();
146
+ const fileTimestamp = stats.mtime.getTime();
147
+ // Allow 2 second tolerance for filesystem timestamp precision
148
+ // This prevents false positives from write operations
149
+ const TOLERANCE_MS = 2000;
150
+ // If file has been modified since client loaded it (beyond tolerance), return conflict error
151
+ if (fileTimestamp > clientTimestamp + TOLERANCE_MS) {
152
+ return reply.status(409).send({
153
+ type: "https://zup.fail/file-conflict",
154
+ title: "File has been modified",
155
+ status: 409,
156
+ detail: "The file has been modified on disk since you loaded it. Please resolve the conflict before saving.",
157
+ });
158
+ }
159
+ }
160
+ }
132
161
  // Ensure parent directory exists
133
162
  const dir = path.dirname(fullPath);
134
163
  await fs.mkdir(dir, { recursive: true });
@@ -155,6 +184,70 @@ export async function createFsRoutes(fastify, options) {
155
184
  });
156
185
  }
157
186
  });
187
+ // Write/create multiple files: POST /files (multipart)
188
+ fastify.post("/files", async (request, reply) => {
189
+ if (!request.isMultipart()) {
190
+ return reply.status(400).send({
191
+ type: "https://zup.fail/invalid-request",
192
+ title: "Request must be multipart/form-data",
193
+ status: 400,
194
+ });
195
+ }
196
+ try {
197
+ const parts = request.parts({ preservePath: true });
198
+ const conflictedFiles = [];
199
+ for await (const part of parts) {
200
+ if (part.type === "file" && part.filename) {
201
+ // Remove leading slash for path.join to work correctly
202
+ const relativePath = part.filename.startsWith("/")
203
+ ? part.filename.slice(1)
204
+ : part.filename;
205
+ const fullPath = path.join(workingDir, relativePath);
206
+ // Check for conflicts using custom header
207
+ if (await fileExists(fullPath)) {
208
+ const headerKey = `x-if-unmodified-since-${encodeURIComponent(`/${relativePath}`)}`.toLowerCase();
209
+ const ifUnmodifiedSince = request.headers[headerKey];
210
+ if (ifUnmodifiedSince) {
211
+ const stats = await fs.stat(fullPath);
212
+ const clientTimestamp = new Date(ifUnmodifiedSince).getTime();
213
+ const fileTimestamp = stats.mtime.getTime();
214
+ // Allow 2 second tolerance for filesystem timestamp precision
215
+ const TOLERANCE_MS = 2000;
216
+ if (fileTimestamp > clientTimestamp + TOLERANCE_MS) {
217
+ conflictedFiles.push(`/${relativePath}`);
218
+ continue;
219
+ }
220
+ }
221
+ }
222
+ // Ensure parent directory exists
223
+ const dir = path.dirname(fullPath);
224
+ await fs.mkdir(dir, { recursive: true });
225
+ // Write the file using the stream
226
+ const buffer = await part.toBuffer();
227
+ await fs.writeFile(fullPath, buffer);
228
+ }
229
+ }
230
+ // If any files had conflicts, return 409
231
+ if (conflictedFiles.length > 0) {
232
+ return reply.status(409).send({
233
+ type: "https://zup.fail/file-conflict",
234
+ title: "File conflicts detected",
235
+ status: 409,
236
+ detail: `The following files have been modified on disk since you loaded them: ${conflictedFiles.join(", ")}`,
237
+ conflictedFiles,
238
+ });
239
+ }
240
+ reply.status(200).send({ buildId: "local-build-" + Date.now() });
241
+ }
242
+ catch (err) {
243
+ reply.status(500).send({
244
+ type: "https://zup.fail/file-write-failed",
245
+ title: "File write failed",
246
+ status: 500,
247
+ message: err.message,
248
+ });
249
+ }
250
+ });
158
251
  // Rename a file: PATCH /api/fs/file?path=...
159
252
  fastify.patch("/file", async (request, reply) => {
160
253
  const oldPath = request.query.path;
@@ -1 +1 @@
1
- {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/routes/fs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/routes/fs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { FastifyInstance } from "fastify";
2
+ import type { Logger } from "pino";
3
+ interface TestRoutesOptions {
4
+ workingDir: string;
5
+ logger: Logger;
6
+ deploymentUrl: string;
7
+ }
8
+ export declare function createTestRoutes(fastify: FastifyInstance, options: TestRoutesOptions): Promise<void>;
9
+ export {};
10
+ //# sourceMappingURL=test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/routes/test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,UAAU,iBAAiB;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;CACvB;AAUD,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,IAAI,CAAC,CA6Ef"}
@@ -0,0 +1,68 @@
1
+ export async function createTestRoutes(fastify, options) {
2
+ const { logger } = options;
3
+ // Test endpoint that proxies requests to the local Zuplo gateway
4
+ fastify.post("/test", async (request, reply) => {
5
+ const testRequest = request.body;
6
+ const { method, path, headers = {}, body, overrideUrl } = testRequest;
7
+ // Default to localhost:9000 for local Zuplo gateway
8
+ const targetUrl = overrideUrl ?? options.deploymentUrl;
9
+ const fullUrl = `${targetUrl}${path}`;
10
+ try {
11
+ logger.info(`Proxying test request: ${method} ${fullUrl}`);
12
+ // Clean headers - remove host and other problematic headers
13
+ const cleanHeaders = {};
14
+ for (const [key, value] of Object.entries(headers)) {
15
+ const lowerKey = key.toLowerCase();
16
+ // Skip headers that shouldn't be forwarded
17
+ if (lowerKey !== "host" && lowerKey !== "connection") {
18
+ cleanHeaders[key] = value;
19
+ }
20
+ }
21
+ // Create fetch options
22
+ const fetchOptions = {
23
+ method,
24
+ headers: cleanHeaders,
25
+ };
26
+ // Add body for non-GET/HEAD requests
27
+ if (body && !["GET", "HEAD"].includes(method.toUpperCase())) {
28
+ fetchOptions.body = body;
29
+ }
30
+ // Make the request to the local gateway
31
+ const response = await fetch(fullUrl, fetchOptions);
32
+ // Capture response
33
+ const responseBody = await response.text();
34
+ const responseHeaders = {};
35
+ // Convert headers to plain object
36
+ response.headers.forEach((value, key) => {
37
+ responseHeaders[key] = value;
38
+ });
39
+ // Return test result in the format expected by the frontend
40
+ reply.status(200).send({
41
+ status: response.status,
42
+ statusText: response.statusText,
43
+ headers: responseHeaders,
44
+ body: responseBody,
45
+ });
46
+ }
47
+ catch (err) {
48
+ logger.error(`Error proxying test request: ${err.message}`);
49
+ // Return a proper problem details response
50
+ const problemDetails = {
51
+ type: "https://zuplo.com/problems/local-gateway-unavailable",
52
+ title: "Local Gateway Unavailable",
53
+ status: 503,
54
+ detail: `Could not connect to the local Zuplo gateway at ${targetUrl}. Make sure your local gateway is running.`,
55
+ instance: fullUrl,
56
+ };
57
+ reply.status(200).send({
58
+ status: 503,
59
+ statusText: "Service Unavailable",
60
+ headers: {
61
+ "content-type": "application/problem+json",
62
+ },
63
+ body: JSON.stringify(problemDetails, null, 2),
64
+ });
65
+ }
66
+ });
67
+ }
68
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/routes/test.ts"],"names":[],"mappings":"AAiBA,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAwB,EACxB,OAA0B;IAE1B,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE3B,iEAAiE;IACjE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAC7C,MAAM,WAAW,GAAG,OAAO,CAAC,IAAmB,CAAC;QAChD,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,WAAW,CAAC;QAEtE,oDAAoD;QACpD,MAAM,SAAS,GAAG,WAAW,IAAI,OAAO,CAAC,aAAa,CAAC;QACvD,MAAM,OAAO,GAAG,GAAG,SAAS,GAAG,IAAI,EAAE,CAAC;QAEtC,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,0BAA0B,MAAM,IAAI,OAAO,EAAE,CAAC,CAAC;YAE3D,4DAA4D;YAC5D,MAAM,YAAY,GAA2B,EAAE,CAAC;YAChD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnD,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;gBACnC,2CAA2C;gBAC3C,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;oBACrD,YAAY,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBAC5B,CAAC;YACH,CAAC;YAED,uBAAuB;YACvB,MAAM,YAAY,GAAgB;gBAChC,MAAM;gBACN,OAAO,EAAE,YAAY;aACtB,CAAC;YAEF,qCAAqC;YACrC,IAAI,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;gBAC5D,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC;YAC3B,CAAC;YAED,wCAAwC;YACxC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAEpD,mBAAmB;YACnB,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC3C,MAAM,eAAe,GAA2B,EAAE,CAAC;YAEnD,kCAAkC;YAClC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;gBACtC,eAAe,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YAC/B,CAAC,CAAC,CAAC;YAEH,4DAA4D;YAC5D,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,OAAO,EAAE,eAAe;gBACxB,IAAI,EAAE,YAAY;aACnB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,gCAAiC,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAEvE,2CAA2C;YAC3C,MAAM,cAAc,GAAG;gBACrB,IAAI,EAAE,sDAAsD;gBAC5D,KAAK,EAAE,2BAA2B;gBAClC,MAAM,EAAE,GAAG;gBACX,MAAM,EAAE,mDAAmD,SAAS,4CAA4C;gBAChH,QAAQ,EAAE,OAAO;aAClB,CAAC;YAEF,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACrB,MAAM,EAAE,GAAG;gBACX,UAAU,EAAE,qBAAqB;gBACjC,OAAO,EAAE;oBACP,cAAc,EAAE,0BAA0B;iBAC3C;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;aAC9C,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
package/dist/server.d.ts CHANGED
@@ -3,17 +3,8 @@ import type { Logger } from "pino";
3
3
  interface ServerOptions {
4
4
  workingDir: string;
5
5
  port: number;
6
- /**
7
- * Path to the built client assets directory.
8
- * If not provided, will use Vite dev server (development mode only).
9
- */
10
- clientPath?: string;
11
- /**
12
- * Path to vite.config.ts for development mode.
13
- * Only used when clientPath is not provided.
14
- */
15
- viteConfigPath?: string;
16
6
  logger: Logger;
7
+ deploymentUrl: string;
17
8
  }
18
9
  export declare class LocalEditorServer {
19
10
  app: FastifyInstance;
@@ -22,10 +13,10 @@ export declare class LocalEditorServer {
22
13
  private sseClients;
23
14
  private workingDir;
24
15
  private listenerPort;
25
- private clientPath?;
26
- private viteConfigPath?;
27
- private vite;
28
16
  private logger;
17
+ private vite;
18
+ private portalRoot;
19
+ private deploymentUrl;
29
20
  constructor(options: ServerOptions);
30
21
  init: () => Promise<void>;
31
22
  start: () => Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAIA,OAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAGxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAQnC,UAAU,aAAa;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,iBAAiB;IACrB,GAAG,EAAE,eAAe,CAAC;IAC5B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,IAAI,CAA4B;IACxC,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,EAAE,aAAa;IAkBlC,IAAI,QAAa,OAAO,CAAC,IAAI,CAAC,CA4I5B;IAEF,KAAK,QAAa,OAAO,CAAC,IAAI,CAAC,CAM7B;IAEF,IAAI,QAAa,OAAO,CAAC,IAAI,CAAC,CAI5B;CACH"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAMA,OAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAIxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAUnC,UAAU,aAAa;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,iBAAiB;IACrB,GAAG,EAAE,eAAe,CAAC;IAC5B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAA8B;IAC1C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,aAAa,CAAS;gBAElB,OAAO,EAAE,aAAa;IAsBlC,IAAI,QAAa,OAAO,CAAC,IAAI,CAAC,CAuJ5B;IAEF,KAAK,QAAa,OAAO,CAAC,IAAI,CAAC,CAM7B;IAEF,IAAI,QAAa,OAAO,CAAC,IAAI,CAAC,CAM5B;CACH"}