@w3kits-com/plugin-opendesign 0.1.11 → 0.1.12
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.
- package/dist/404/index.html +1 -1
- package/dist/404.html +1 -1
- package/dist/__next.$oc$slug.__PAGE__.txt +1 -1
- package/dist/__next.$oc$slug.txt +1 -1
- package/dist/__next._full.txt +1 -1
- package/dist/__next._head.txt +1 -1
- package/dist/__next._index.txt +1 -1
- package/dist/__next._tree.txt +1 -1
- package/dist/__w3kits/webcontainer-runtime/package.json +6 -1
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/browser-vfs/dist/index.d.ts +108 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/browser-vfs/dist/index.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/browser-vfs/dist/index.mjs +413 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/browser-vfs/package.json +12 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/analytics/artifact-id.d.ts +5 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/analytics/artifact-id.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/analytics/events.d.ts +250 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/analytics/events.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/analytics/index.d.ts +4 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/analytics/index.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/analytics/index.mjs +186 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/analytics/public-params.d.ts +26 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/analytics/public-params.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/app-config.d.ts +44 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/app-config.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/artifacts.d.ts +34 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/artifacts.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/chat.d.ts +158 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/chat.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/comments.d.ts +65 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/comments.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/connectionTest.d.ts +49 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/connectionTest.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/connectionTest.mjs +83 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/connectors.d.ts +133 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/connectors.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/files.d.ts +43 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/files.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/finalize.d.ts +50 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/finalize.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/finalize.mjs +5 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/live-artifacts.d.ts +151 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/live-artifacts.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/mcp.d.ts +117 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/mcp.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/memory.d.ts +233 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/memory.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/orbit.d.ts +22 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/orbit.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/orbit.mjs +0 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/projects.d.ts +286 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/projects.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/providerModels.d.ts +19 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/providerModels.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/providerModels.mjs +0 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/proxy.d.ts +24 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/proxy.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/registry.d.ts +156 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/registry.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/research.d.ts +35 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/research.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/research.mjs +9 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/routines.d.ts +104 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/routines.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/version.d.ts +11 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/api/version.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/common.d.ts +33 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/common.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/critique.d.ts +344 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/critique.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/critique.mjs +182 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/errors.d.ts +40 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/errors.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/examples.d.ts +20 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/examples.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/index.d.ts +31 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/index.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/index.mjs +2072 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/prompts/deck-framework.d.ts +39 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/prompts/deck-framework.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/prompts/directions.d.ts +69 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/prompts/directions.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/prompts/discovery.d.ts +2 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/prompts/discovery.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/prompts/media-contract.d.ts +2 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/prompts/media-contract.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/prompts/official-system.d.ts +12 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/prompts/official-system.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/prompts/system.d.ts +58 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/prompts/system.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/sse/chat.d.ts +96 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/sse/chat.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/sse/common.d.ts +8 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/sse/common.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/sse/proxy.d.ts +6 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/sse/proxy.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/tasks.d.ts +12 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/dist/tasks.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/contracts/package.json +40 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/platform/dist/index.d.ts +68 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/platform/dist/index.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/platform/dist/index.mjs +397 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/platform/package.json +12 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/sidecar/dist/index.d.ts +144 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/sidecar/dist/index.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/sidecar/dist/index.mjs +412 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/sidecar/package.json +12 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/sidecar-proto/dist/index.d.ts +291 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/sidecar-proto/dist/index.d.ts.map +1 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/sidecar-proto/dist/index.mjs +315 -0
- package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/sidecar-proto/package.json +12 -0
- package/dist/_not-found/__next._full.txt +1 -1
- package/dist/_not-found/__next._head.txt +1 -1
- package/dist/_not-found/__next._index.txt +1 -1
- package/dist/_not-found/__next._not-found.__PAGE__.txt +1 -1
- package/dist/_not-found/__next._not-found.txt +1 -1
- package/dist/_not-found/__next._tree.txt +1 -1
- package/dist/_not-found/index.html +1 -1
- package/dist/_not-found/index.txt +1 -1
- package/dist/index.html +1 -1
- package/dist/index.txt +1 -1
- package/package.json +1 -1
- /package/dist/_next/static/{DJnxTGY7DiPmoowmfZmqQ → 5BA5jEbmoqCfBPFzdjNtN}/_buildManifest.js +0 -0
- /package/dist/_next/static/{DJnxTGY7DiPmoowmfZmqQ → 5BA5jEbmoqCfBPFzdjNtN}/_clientMiddlewareManifest.js +0 -0
- /package/dist/_next/static/{DJnxTGY7DiPmoowmfZmqQ → 5BA5jEbmoqCfBPFzdjNtN}/_ssgManifest.js +0 -0
package/dist/__w3kits/webcontainer-runtime/workspace-packages/@open-design/sidecar/dist/index.mjs
ADDED
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
// src/index.ts
|
|
2
|
+
import { lstat, mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import { createConnection, createServer as createNetServer } from "node:net";
|
|
4
|
+
import { dirname, isAbsolute, join, resolve } from "node:path";
|
|
5
|
+
function isWindowsNamedPipePath(value) {
|
|
6
|
+
return typeof value === "string" && value.startsWith("\\\\.\\pipe\\");
|
|
7
|
+
}
|
|
8
|
+
function normalizeIpcPath(ipc) {
|
|
9
|
+
if (typeof ipc !== "string") throw new Error("sidecar ipc path must be a string");
|
|
10
|
+
if (ipc.length === 0) throw new Error("sidecar ipc path must not be empty");
|
|
11
|
+
if (ipc.trim() !== ipc) throw new Error("sidecar ipc path must not contain leading or trailing whitespace");
|
|
12
|
+
if (ipc.includes("\0")) throw new Error("sidecar ipc path must not contain null bytes");
|
|
13
|
+
if (isWindowsNamedPipePath(ipc)) return ipc;
|
|
14
|
+
if (!isAbsolute(ipc)) throw new Error(`sidecar ipc path must be absolute: ${ipc}`);
|
|
15
|
+
return ipc;
|
|
16
|
+
}
|
|
17
|
+
function resolveNamespace(options) {
|
|
18
|
+
return options.contract.normalizeNamespace(
|
|
19
|
+
options.namespace ?? options.env?.[options.contract.env.namespace] ?? options.contract.defaults.namespace
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
function resolveProjectRoot(projectRoot) {
|
|
23
|
+
if (typeof projectRoot !== "string" || projectRoot.trim().length === 0) {
|
|
24
|
+
throw new Error("projectRoot must be a non-empty string");
|
|
25
|
+
}
|
|
26
|
+
return resolve(projectRoot);
|
|
27
|
+
}
|
|
28
|
+
function resolveProjectTmpRoot({
|
|
29
|
+
contract,
|
|
30
|
+
projectRoot
|
|
31
|
+
}) {
|
|
32
|
+
return join(resolveProjectRoot(projectRoot), contract.defaults.projectTmpDirName);
|
|
33
|
+
}
|
|
34
|
+
function resolveSourceRuntimeRoot({
|
|
35
|
+
contract,
|
|
36
|
+
projectRoot,
|
|
37
|
+
source
|
|
38
|
+
}) {
|
|
39
|
+
return join(resolveProjectTmpRoot({ contract, projectRoot }), contract.normalizeSource(source));
|
|
40
|
+
}
|
|
41
|
+
function resolveSidecarBase({
|
|
42
|
+
base,
|
|
43
|
+
contract,
|
|
44
|
+
env = process.env,
|
|
45
|
+
projectRoot = process.cwd(),
|
|
46
|
+
source
|
|
47
|
+
}) {
|
|
48
|
+
return resolve(base ?? env[contract.env.base] ?? resolveSourceRuntimeRoot({ contract, projectRoot, source }));
|
|
49
|
+
}
|
|
50
|
+
function resolveNamespaceRoot({
|
|
51
|
+
base,
|
|
52
|
+
contract,
|
|
53
|
+
namespace
|
|
54
|
+
}) {
|
|
55
|
+
return join(resolve(base), contract.normalizeNamespace(namespace));
|
|
56
|
+
}
|
|
57
|
+
function resolveRuntimeRoot({
|
|
58
|
+
base,
|
|
59
|
+
contract,
|
|
60
|
+
namespace,
|
|
61
|
+
runId
|
|
62
|
+
}) {
|
|
63
|
+
return join(resolveNamespaceRoot({ base, contract, namespace }), "runs", runId);
|
|
64
|
+
}
|
|
65
|
+
function resolvePointerPath({ base, contract, namespace }) {
|
|
66
|
+
return join(resolveNamespaceRoot({ base, contract, namespace }), "current.json");
|
|
67
|
+
}
|
|
68
|
+
function resolveManifestPath({ runtimeRoot }) {
|
|
69
|
+
return join(runtimeRoot, "manifest.json");
|
|
70
|
+
}
|
|
71
|
+
function resolveLogsDir({
|
|
72
|
+
app,
|
|
73
|
+
contract,
|
|
74
|
+
runtimeRoot
|
|
75
|
+
}) {
|
|
76
|
+
return join(runtimeRoot, "logs", contract.normalizeApp(app));
|
|
77
|
+
}
|
|
78
|
+
function resolveLogFilePath({
|
|
79
|
+
app,
|
|
80
|
+
contract,
|
|
81
|
+
fileName = "latest.log",
|
|
82
|
+
runtimeRoot
|
|
83
|
+
}) {
|
|
84
|
+
return join(resolveLogsDir({ app, contract, runtimeRoot }), fileName);
|
|
85
|
+
}
|
|
86
|
+
function resolveAppRuntimeDir({
|
|
87
|
+
app,
|
|
88
|
+
contract,
|
|
89
|
+
namespaceRoot
|
|
90
|
+
}) {
|
|
91
|
+
return join(namespaceRoot, contract.normalizeApp(app));
|
|
92
|
+
}
|
|
93
|
+
function resolveAppRuntimePath({
|
|
94
|
+
app,
|
|
95
|
+
contract,
|
|
96
|
+
fileName,
|
|
97
|
+
namespaceRoot
|
|
98
|
+
}) {
|
|
99
|
+
if (fileName.length === 0 || fileName.includes("\0") || /[\\/]/.test(fileName)) {
|
|
100
|
+
throw new Error(`app runtime fileName must be a simple path segment: ${fileName}`);
|
|
101
|
+
}
|
|
102
|
+
return join(resolveAppRuntimeDir({ app, contract, namespaceRoot }), fileName);
|
|
103
|
+
}
|
|
104
|
+
function resolveAppIpcPath({
|
|
105
|
+
app,
|
|
106
|
+
contract,
|
|
107
|
+
env = process.env,
|
|
108
|
+
namespace
|
|
109
|
+
}) {
|
|
110
|
+
const normalizedApp = contract.normalizeApp(app);
|
|
111
|
+
const normalizedNamespace = contract.normalizeNamespace(namespace);
|
|
112
|
+
if (process.platform === "win32") {
|
|
113
|
+
return `\\\\.\\pipe\\${contract.defaults.windowsPipePrefix}-${normalizedNamespace}-${normalizedApp}`;
|
|
114
|
+
}
|
|
115
|
+
const ipcBase = resolve(env[contract.env.ipcBase] ?? contract.defaults.ipcBase);
|
|
116
|
+
return join(ipcBase, normalizedNamespace, `${normalizedApp}.sock`);
|
|
117
|
+
}
|
|
118
|
+
function createSidecarLaunchEnv({
|
|
119
|
+
base,
|
|
120
|
+
contract,
|
|
121
|
+
extraEnv = process.env,
|
|
122
|
+
stamp
|
|
123
|
+
}) {
|
|
124
|
+
const normalizedStamp = contract.normalizeStamp(stamp);
|
|
125
|
+
return {
|
|
126
|
+
...extraEnv,
|
|
127
|
+
[contract.env.base]: resolveSidecarBase({ base, contract, env: extraEnv, source: normalizedStamp.source }),
|
|
128
|
+
[contract.env.ipcPath]: normalizedStamp.ipc,
|
|
129
|
+
[contract.env.namespace]: normalizedStamp.namespace,
|
|
130
|
+
[contract.env.source]: normalizedStamp.source
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
function assertMatchingEnv(env, key, expected) {
|
|
134
|
+
const current = env[key];
|
|
135
|
+
if (current != null && current !== expected) {
|
|
136
|
+
throw new Error(`sidecar env mismatch for ${key}: expected ${expected}, received ${current}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
function bootstrapSidecarRuntime(stampInput, env, options) {
|
|
140
|
+
const stamp = options.contract.normalizeStamp(stampInput);
|
|
141
|
+
const expectedApp = options.contract.normalizeApp(options.app);
|
|
142
|
+
if (stamp.app !== expectedApp) {
|
|
143
|
+
throw new Error(`sidecar stamp app mismatch: expected ${expectedApp}, received ${stamp.app}`);
|
|
144
|
+
}
|
|
145
|
+
const base = resolveSidecarBase({
|
|
146
|
+
base: options.base,
|
|
147
|
+
contract: options.contract,
|
|
148
|
+
env,
|
|
149
|
+
projectRoot: options.projectRoot,
|
|
150
|
+
source: stamp.source
|
|
151
|
+
});
|
|
152
|
+
const ipc = resolveAppIpcPath({ app: stamp.app, contract: options.contract, env, namespace: stamp.namespace });
|
|
153
|
+
if (stamp.ipc !== ipc) {
|
|
154
|
+
throw new Error(`sidecar ipc path mismatch: expected ${ipc}, received ${stamp.ipc}`);
|
|
155
|
+
}
|
|
156
|
+
assertMatchingEnv(env, options.contract.env.ipcPath, stamp.ipc);
|
|
157
|
+
assertMatchingEnv(env, options.contract.env.namespace, stamp.namespace);
|
|
158
|
+
assertMatchingEnv(env, options.contract.env.source, stamp.source);
|
|
159
|
+
env[options.contract.env.ipcPath] = ipc;
|
|
160
|
+
env[options.contract.env.namespace] = stamp.namespace;
|
|
161
|
+
env[options.contract.env.source] = stamp.source;
|
|
162
|
+
return {
|
|
163
|
+
app: stamp.app,
|
|
164
|
+
base,
|
|
165
|
+
ipc,
|
|
166
|
+
mode: stamp.mode,
|
|
167
|
+
namespace: stamp.namespace,
|
|
168
|
+
source: stamp.source
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
async function closeServer(server) {
|
|
172
|
+
if (!server.listening) return;
|
|
173
|
+
await new Promise((resolveClose, rejectClose) => {
|
|
174
|
+
server.close((error) => error == null ? resolveClose() : rejectClose(error));
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
async function listenOnPort(port, host) {
|
|
178
|
+
const server = createNetServer();
|
|
179
|
+
await new Promise((resolveListen, rejectListen) => {
|
|
180
|
+
server.once("error", rejectListen);
|
|
181
|
+
server.listen({ port, host, exclusive: true }, () => {
|
|
182
|
+
server.off("error", rejectListen);
|
|
183
|
+
resolveListen();
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
return server;
|
|
187
|
+
}
|
|
188
|
+
function parsePort(value, label) {
|
|
189
|
+
if (value == null || value === "") return null;
|
|
190
|
+
const port = Number(value);
|
|
191
|
+
if (!Number.isInteger(port) || port <= 0 || port > 65535) {
|
|
192
|
+
throw new Error(`${label} port must be an integer between 1 and 65535`);
|
|
193
|
+
}
|
|
194
|
+
return port;
|
|
195
|
+
}
|
|
196
|
+
function errorCode(error) {
|
|
197
|
+
if (typeof error !== "object" || error == null || !("code" in error)) return null;
|
|
198
|
+
const code = error.code;
|
|
199
|
+
return code == null ? null : String(code);
|
|
200
|
+
}
|
|
201
|
+
function errorMessage(error) {
|
|
202
|
+
return error instanceof Error ? error.message : String(error);
|
|
203
|
+
}
|
|
204
|
+
function jsonIpcError(error) {
|
|
205
|
+
return {
|
|
206
|
+
...errorCode(error) == null ? {} : { code: errorCode(error) },
|
|
207
|
+
message: errorMessage(error)
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
async function allocateForcedPort(port, label, host, reserved) {
|
|
211
|
+
if (reserved.has(port)) {
|
|
212
|
+
throw new Error(`forced ${label} port ${port} conflicts with another managed port`);
|
|
213
|
+
}
|
|
214
|
+
let server = null;
|
|
215
|
+
try {
|
|
216
|
+
server = await listenOnPort(port, host);
|
|
217
|
+
} catch (error) {
|
|
218
|
+
throw new Error(`forced ${label} port ${port} is not available (${errorCode(error) ?? errorMessage(error)})`);
|
|
219
|
+
} finally {
|
|
220
|
+
if (server) await closeServer(server);
|
|
221
|
+
}
|
|
222
|
+
reserved.add(port);
|
|
223
|
+
return { port, source: "forced" };
|
|
224
|
+
}
|
|
225
|
+
async function allocateDynamicPort(label, host, reserved) {
|
|
226
|
+
for (let attempt = 0; attempt < 20; attempt += 1) {
|
|
227
|
+
const server = await listenOnPort(0, host);
|
|
228
|
+
const address = server.address();
|
|
229
|
+
await closeServer(server);
|
|
230
|
+
if (address == null || typeof address === "string") {
|
|
231
|
+
throw new Error(`failed to allocate dynamic ${label} port`);
|
|
232
|
+
}
|
|
233
|
+
if (!reserved.has(address.port)) {
|
|
234
|
+
reserved.add(address.port);
|
|
235
|
+
return { port: address.port, source: "dynamic" };
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
throw new Error(`failed to allocate dynamic ${label} port without conflict`);
|
|
239
|
+
}
|
|
240
|
+
async function allocatePort({
|
|
241
|
+
host = "127.0.0.1",
|
|
242
|
+
label = "runtime",
|
|
243
|
+
port,
|
|
244
|
+
reserved = /* @__PURE__ */ new Set()
|
|
245
|
+
} = {}) {
|
|
246
|
+
const forcedPort = parsePort(port, label);
|
|
247
|
+
return forcedPort == null ? await allocateDynamicPort(label, host, reserved) : await allocateForcedPort(forcedPort, label, host, reserved);
|
|
248
|
+
}
|
|
249
|
+
async function readJsonFile(filePath) {
|
|
250
|
+
try {
|
|
251
|
+
return JSON.parse(await readFile(filePath, "utf8"));
|
|
252
|
+
} catch {
|
|
253
|
+
return null;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
async function writeJsonFile(filePath, payload) {
|
|
257
|
+
await mkdir(dirname(filePath), { recursive: true });
|
|
258
|
+
const tmpPath = `${filePath}.${process.pid}.${Date.now()}.tmp`;
|
|
259
|
+
await writeFile(tmpPath, `${JSON.stringify(payload, null, 2)}
|
|
260
|
+
`, "utf8");
|
|
261
|
+
await rename(tmpPath, filePath);
|
|
262
|
+
}
|
|
263
|
+
async function removeFile(filePath) {
|
|
264
|
+
await rm(filePath, { force: true });
|
|
265
|
+
}
|
|
266
|
+
async function removePointerIfCurrent(pointerPath, runId) {
|
|
267
|
+
const pointer = await readJsonFile(pointerPath);
|
|
268
|
+
if (pointer?.runId === runId) await removeFile(pointerPath);
|
|
269
|
+
}
|
|
270
|
+
async function staleUnixSocketExists(socketPath) {
|
|
271
|
+
try {
|
|
272
|
+
const stat = await lstat(socketPath);
|
|
273
|
+
if (!stat.isSocket()) return false;
|
|
274
|
+
} catch (error) {
|
|
275
|
+
if (errorCode(error) === "ENOENT") return false;
|
|
276
|
+
throw error;
|
|
277
|
+
}
|
|
278
|
+
return await new Promise((resolveStale, rejectStale) => {
|
|
279
|
+
const socket = createConnection(socketPath);
|
|
280
|
+
let settled = false;
|
|
281
|
+
const settle = (callback) => {
|
|
282
|
+
if (settled) return;
|
|
283
|
+
settled = true;
|
|
284
|
+
socket.removeAllListeners();
|
|
285
|
+
socket.destroy();
|
|
286
|
+
callback();
|
|
287
|
+
};
|
|
288
|
+
socket.once("connect", () => settle(() => resolveStale(false)));
|
|
289
|
+
socket.once("error", (error) => {
|
|
290
|
+
const code = errorCode(error);
|
|
291
|
+
if (code === "ENOENT" || code === "ECONNREFUSED") {
|
|
292
|
+
settle(() => resolveStale(true));
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
settle(() => rejectStale(error));
|
|
296
|
+
});
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
async function prepareIpcPath(socketPath) {
|
|
300
|
+
if (isWindowsNamedPipePath(socketPath)) return;
|
|
301
|
+
await mkdir(dirname(socketPath), { recursive: true });
|
|
302
|
+
if (await staleUnixSocketExists(socketPath)) await rm(socketPath, { force: true });
|
|
303
|
+
}
|
|
304
|
+
async function createJsonIpcServer({
|
|
305
|
+
handler,
|
|
306
|
+
socketPath
|
|
307
|
+
}) {
|
|
308
|
+
await prepareIpcPath(socketPath);
|
|
309
|
+
const server = createNetServer((socket) => {
|
|
310
|
+
let buffer = "";
|
|
311
|
+
socket.on("error", () => {
|
|
312
|
+
});
|
|
313
|
+
socket.on("data", async (chunk) => {
|
|
314
|
+
buffer += chunk.toString();
|
|
315
|
+
const newlineIndex = buffer.indexOf("\n");
|
|
316
|
+
if (newlineIndex < 0) return;
|
|
317
|
+
const frame = buffer.slice(0, newlineIndex);
|
|
318
|
+
buffer = buffer.slice(newlineIndex + 1);
|
|
319
|
+
try {
|
|
320
|
+
const result = await handler(JSON.parse(frame));
|
|
321
|
+
socket.end(`${JSON.stringify({ ok: true, result })}
|
|
322
|
+
`);
|
|
323
|
+
} catch (error) {
|
|
324
|
+
socket.end(
|
|
325
|
+
`${JSON.stringify({
|
|
326
|
+
ok: false,
|
|
327
|
+
error: jsonIpcError(error)
|
|
328
|
+
})}
|
|
329
|
+
`
|
|
330
|
+
);
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
});
|
|
334
|
+
await new Promise((resolveListen, rejectListen) => {
|
|
335
|
+
server.once("error", rejectListen);
|
|
336
|
+
server.listen(socketPath, () => {
|
|
337
|
+
server.off("error", rejectListen);
|
|
338
|
+
resolveListen();
|
|
339
|
+
});
|
|
340
|
+
});
|
|
341
|
+
return {
|
|
342
|
+
async close() {
|
|
343
|
+
await closeServer(server);
|
|
344
|
+
if (!isWindowsNamedPipePath(socketPath)) await rm(socketPath, { force: true });
|
|
345
|
+
}
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
async function requestJsonIpc(socketPath, payload, { timeoutMs = 1500 } = {}) {
|
|
349
|
+
return await new Promise((resolveRequest, rejectRequest) => {
|
|
350
|
+
const socket = createConnection(socketPath);
|
|
351
|
+
let settled = false;
|
|
352
|
+
let buffer = "";
|
|
353
|
+
const settle = (callback) => {
|
|
354
|
+
if (settled) return;
|
|
355
|
+
settled = true;
|
|
356
|
+
clearTimeout(timeout);
|
|
357
|
+
callback();
|
|
358
|
+
};
|
|
359
|
+
const timeout = setTimeout(() => {
|
|
360
|
+
socket.destroy();
|
|
361
|
+
settle(() => rejectRequest(new Error(`IPC request timed out: ${socketPath}`)));
|
|
362
|
+
}, timeoutMs);
|
|
363
|
+
socket.on("connect", () => {
|
|
364
|
+
socket.write(`${JSON.stringify(payload)}
|
|
365
|
+
`);
|
|
366
|
+
});
|
|
367
|
+
socket.on("data", (chunk) => {
|
|
368
|
+
buffer += chunk.toString();
|
|
369
|
+
const newlineIndex = buffer.indexOf("\n");
|
|
370
|
+
if (newlineIndex < 0) return;
|
|
371
|
+
socket.end();
|
|
372
|
+
settle(() => {
|
|
373
|
+
const response = JSON.parse(buffer.slice(0, newlineIndex));
|
|
374
|
+
if (!response.ok) {
|
|
375
|
+
rejectRequest(new Error(response.error?.message ?? "IPC request failed"));
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
resolveRequest(response.result);
|
|
379
|
+
});
|
|
380
|
+
});
|
|
381
|
+
socket.on("error", (error) => {
|
|
382
|
+
settle(() => rejectRequest(error));
|
|
383
|
+
});
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
export {
|
|
387
|
+
allocatePort,
|
|
388
|
+
bootstrapSidecarRuntime,
|
|
389
|
+
createJsonIpcServer,
|
|
390
|
+
createSidecarLaunchEnv,
|
|
391
|
+
isWindowsNamedPipePath,
|
|
392
|
+
normalizeIpcPath,
|
|
393
|
+
readJsonFile,
|
|
394
|
+
removeFile,
|
|
395
|
+
removePointerIfCurrent,
|
|
396
|
+
requestJsonIpc,
|
|
397
|
+
resolveAppIpcPath,
|
|
398
|
+
resolveAppRuntimeDir,
|
|
399
|
+
resolveAppRuntimePath,
|
|
400
|
+
resolveLogFilePath,
|
|
401
|
+
resolveLogsDir,
|
|
402
|
+
resolveManifestPath,
|
|
403
|
+
resolveNamespace,
|
|
404
|
+
resolveNamespaceRoot,
|
|
405
|
+
resolvePointerPath,
|
|
406
|
+
resolveProjectRoot,
|
|
407
|
+
resolveProjectTmpRoot,
|
|
408
|
+
resolveRuntimeRoot,
|
|
409
|
+
resolveSidecarBase,
|
|
410
|
+
resolveSourceRuntimeRoot,
|
|
411
|
+
writeJsonFile
|
|
412
|
+
};
|