@youdie006/prodex 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +418 -0
- package/dist/banner.d.ts +5 -0
- package/dist/banner.js +47 -0
- package/dist/banner.js.map +1 -0
- package/dist/bundle.d.ts +15 -0
- package/dist/bundle.js +30 -0
- package/dist/bundle.js.map +1 -0
- package/dist/chatgpt-browser.d.ts +119 -0
- package/dist/chatgpt-browser.js +857 -0
- package/dist/chatgpt-browser.js.map +1 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.js +3502 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +58 -0
- package/dist/config.js +277 -0
- package/dist/config.js.map +1 -0
- package/dist/http-mcp.d.ts +20 -0
- package/dist/http-mcp.js +236 -0
- package/dist/http-mcp.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-tools.d.ts +395 -0
- package/dist/mcp-tools.js +167 -0
- package/dist/mcp-tools.js.map +1 -0
- package/dist/mcp.d.ts +37 -0
- package/dist/mcp.js +229 -0
- package/dist/mcp.js.map +1 -0
- package/dist/repo-write.d.ts +47 -0
- package/dist/repo-write.js +427 -0
- package/dist/repo-write.js.map +1 -0
- package/dist/repo.d.ts +27 -0
- package/dist/repo.js +386 -0
- package/dist/repo.js.map +1 -0
- package/dist/safe-file.d.ts +25 -0
- package/dist/safe-file.js +295 -0
- package/dist/safe-file.js.map +1 -0
- package/dist/schema.d.ts +402 -0
- package/dist/schema.js +109 -0
- package/dist/schema.js.map +1 -0
- package/dist/store.d.ts +157 -0
- package/dist/store.js +1402 -0
- package/dist/store.js.map +1 -0
- package/docs/claude.md +130 -0
- package/docs/clients.md +75 -0
- package/docs/http-mcp.md +223 -0
- package/package.json +67 -0
- package/scripts/release-check.mjs +436 -0
- package/scripts/release-pack.mjs +481 -0
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { constants } from "node:fs";
|
|
3
|
+
import { lstat, open, realpath, rename, rm } from "node:fs/promises";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
let testHooks = {};
|
|
6
|
+
export function setSafeFileTestHooks(hooks) {
|
|
7
|
+
testHooks = hooks;
|
|
8
|
+
}
|
|
9
|
+
export async function readVerifiedUtf8File(filePath, validate, options = {}) {
|
|
10
|
+
await validate();
|
|
11
|
+
const parentSnapshot = await captureParentSnapshot(filePath);
|
|
12
|
+
await testHooks.beforeOpen?.(filePath, "read");
|
|
13
|
+
const handle = await openStableNoFollow(filePath, constants.O_RDONLY, "read", parentSnapshot);
|
|
14
|
+
try {
|
|
15
|
+
const stat = await handle.stat();
|
|
16
|
+
if (!stat.isFile()) {
|
|
17
|
+
throw new Error("Target path is not a regular file");
|
|
18
|
+
}
|
|
19
|
+
assertNotHardLinked(filePath, stat.nlink);
|
|
20
|
+
if (options.maxBytes !== undefined && stat.size > options.maxBytes) {
|
|
21
|
+
throw new Error(`Target file is too large (${stat.size} bytes)`);
|
|
22
|
+
}
|
|
23
|
+
const content = await readHandleUtf8(handle, filePath, options.maxBytes);
|
|
24
|
+
if (options.mode !== undefined) {
|
|
25
|
+
await testHooks.beforeChmod?.(filePath, "read");
|
|
26
|
+
await handle.chmod(options.mode);
|
|
27
|
+
}
|
|
28
|
+
await validate();
|
|
29
|
+
return content;
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
await handle.close();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export async function writeVerifiedUtf8File(filePath, content, validate, options = {}) {
|
|
36
|
+
if (options.maxBytes !== undefined && Buffer.byteLength(content, "utf8") > options.maxBytes) {
|
|
37
|
+
throw new Error(`New content is too large (${Buffer.byteLength(content, "utf8")} bytes)`);
|
|
38
|
+
}
|
|
39
|
+
if (!options.exclusive) {
|
|
40
|
+
await replaceByVerifiedTempFile(filePath, content, validate, options);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
await validate();
|
|
44
|
+
const parentSnapshot = await captureParentSnapshot(filePath);
|
|
45
|
+
await testHooks.beforeOpen?.(filePath, "write");
|
|
46
|
+
const createFlag = options.create || options.exclusive ? constants.O_CREAT : 0;
|
|
47
|
+
const exclusiveFlag = options.exclusive ? constants.O_EXCL : 0;
|
|
48
|
+
const handle = await openStableNoFollow(filePath, constants.O_WRONLY | createFlag | exclusiveFlag, "write", parentSnapshot, options.mode);
|
|
49
|
+
try {
|
|
50
|
+
const stat = await handle.stat();
|
|
51
|
+
if (!stat.isFile()) {
|
|
52
|
+
throw new Error("Target path is not a regular file");
|
|
53
|
+
}
|
|
54
|
+
assertNotHardLinked(filePath, stat.nlink);
|
|
55
|
+
await testHooks.beforeWrite?.(filePath, "write");
|
|
56
|
+
await writeHandleUtf8(handle, filePath, content);
|
|
57
|
+
await testHooks.afterWrite?.(filePath, "write");
|
|
58
|
+
if (options.mode !== undefined) {
|
|
59
|
+
await testHooks.beforeChmod?.(filePath, "write");
|
|
60
|
+
await handle.chmod(options.mode);
|
|
61
|
+
}
|
|
62
|
+
await validate();
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
await handle.close();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export async function replaceVerifiedUtf8File(filePath, content, validate, verifyCurrentContent, options = {}) {
|
|
69
|
+
if (options.maxBytes !== undefined && Buffer.byteLength(content, "utf8") > options.maxBytes) {
|
|
70
|
+
throw new Error(`New content is too large (${Buffer.byteLength(content, "utf8")} bytes)`);
|
|
71
|
+
}
|
|
72
|
+
await validate();
|
|
73
|
+
const parentSnapshot = await captureParentSnapshot(filePath);
|
|
74
|
+
await testHooks.beforeOpen?.(filePath, "write");
|
|
75
|
+
const handle = await openStableNoFollow(filePath, constants.O_RDWR, "write", parentSnapshot, options.mode);
|
|
76
|
+
try {
|
|
77
|
+
const currentContent = await readHandleUtf8(handle, filePath, options.maxBytes);
|
|
78
|
+
await verifyCurrentContent(currentContent);
|
|
79
|
+
await testHooks.beforeReplace?.(filePath);
|
|
80
|
+
const latestContent = await readHandleUtf8(handle, filePath, options.maxBytes);
|
|
81
|
+
await verifyCurrentContent(latestContent);
|
|
82
|
+
await testHooks.beforeWrite?.(filePath, "write");
|
|
83
|
+
await replaceByVerifiedTempFile(filePath, content, validate, options, {
|
|
84
|
+
beforeOpenAlreadyRan: true,
|
|
85
|
+
beforeWriteAlreadyRan: true,
|
|
86
|
+
parentSnapshot,
|
|
87
|
+
skipExistingTargetCheck: true
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
await handle.close();
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async function replaceByVerifiedTempFile(filePath, content, validate, options = {}, hookState = {}) {
|
|
95
|
+
await validate();
|
|
96
|
+
if (!hookState.skipExistingTargetCheck) {
|
|
97
|
+
await assertExistingTargetNotHardLinked(filePath);
|
|
98
|
+
}
|
|
99
|
+
const parentSnapshot = hookState.parentSnapshot ?? (await captureParentSnapshot(filePath));
|
|
100
|
+
if (!hookState.beforeOpenAlreadyRan) {
|
|
101
|
+
await testHooks.beforeOpen?.(filePath, "write");
|
|
102
|
+
}
|
|
103
|
+
await assertParentSnapshotStable(parentSnapshot);
|
|
104
|
+
const tmpPath = path.join(path.dirname(filePath), `.${path.basename(filePath)}.${process.pid}.${Date.now()}.${randomUUID()}.tmp`);
|
|
105
|
+
try {
|
|
106
|
+
const tmpHandle = await openStableNoFollow(tmpPath, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL, "write", parentSnapshot, options.mode);
|
|
107
|
+
try {
|
|
108
|
+
await writeHandleUtf8(tmpHandle, tmpPath, content);
|
|
109
|
+
if (options.mode !== undefined) {
|
|
110
|
+
await testHooks.beforeChmod?.(filePath, "write");
|
|
111
|
+
await tmpHandle.chmod(options.mode);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
finally {
|
|
115
|
+
await tmpHandle.close();
|
|
116
|
+
}
|
|
117
|
+
if (!hookState.beforeWriteAlreadyRan) {
|
|
118
|
+
await testHooks.beforeWrite?.(filePath, "write");
|
|
119
|
+
}
|
|
120
|
+
await validate();
|
|
121
|
+
await assertParentSnapshotStable(parentSnapshot);
|
|
122
|
+
await testHooks.beforeRename?.(filePath, tmpPath);
|
|
123
|
+
await assertExistingTargetNotHardLinked(tmpPath);
|
|
124
|
+
await rename(tmpPath, filePath);
|
|
125
|
+
await validate();
|
|
126
|
+
await testHooks.afterWrite?.(filePath, "write");
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
await cleanupTempIfParentStable(tmpPath, parentSnapshot);
|
|
130
|
+
throw error;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
async function readHandleUtf8(handle, filePath, maxBytes) {
|
|
134
|
+
const stat = await handle.stat();
|
|
135
|
+
if (!stat.isFile()) {
|
|
136
|
+
throw new Error("Target path is not a regular file");
|
|
137
|
+
}
|
|
138
|
+
assertNotHardLinked(filePath, stat.nlink);
|
|
139
|
+
if (maxBytes !== undefined && stat.size > maxBytes) {
|
|
140
|
+
throw new Error(`Target file is too large (${stat.size} bytes)`);
|
|
141
|
+
}
|
|
142
|
+
const buffer = Buffer.alloc(maxBytes === undefined ? stat.size : maxBytes + 1);
|
|
143
|
+
let offset = 0;
|
|
144
|
+
while (offset < buffer.length) {
|
|
145
|
+
const { bytesRead } = await handle.read(buffer, offset, buffer.length - offset, offset);
|
|
146
|
+
if (bytesRead === 0)
|
|
147
|
+
break;
|
|
148
|
+
offset += bytesRead;
|
|
149
|
+
if (maxBytes !== undefined && offset > maxBytes) {
|
|
150
|
+
throw new Error(`Target file is too large (${offset} bytes)`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return buffer.subarray(0, offset).toString("utf8");
|
|
154
|
+
}
|
|
155
|
+
async function writeHandleUtf8(handle, filePath, content) {
|
|
156
|
+
const replacement = Buffer.from(content, "utf8");
|
|
157
|
+
await assertSafeOpenFile(handle, filePath);
|
|
158
|
+
await handle.truncate(0);
|
|
159
|
+
let offset = 0;
|
|
160
|
+
while (offset < replacement.length) {
|
|
161
|
+
const { bytesWritten } = await handle.write(replacement, offset, replacement.length - offset, offset);
|
|
162
|
+
if (bytesWritten === 0) {
|
|
163
|
+
throw new Error("Could not write content to target file");
|
|
164
|
+
}
|
|
165
|
+
offset += bytesWritten;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
async function assertSafeOpenFile(handle, filePath) {
|
|
169
|
+
const stat = await handle.stat();
|
|
170
|
+
if (!stat.isFile()) {
|
|
171
|
+
throw new Error("Target path is not a regular file");
|
|
172
|
+
}
|
|
173
|
+
assertNotHardLinked(filePath, stat.nlink);
|
|
174
|
+
}
|
|
175
|
+
function assertNotHardLinked(filePath, linkCount) {
|
|
176
|
+
if (linkCount > 1) {
|
|
177
|
+
throw new Error("Target path is hard linked and cannot be used through safe file operations");
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
async function assertExistingTargetNotHardLinked(filePath) {
|
|
181
|
+
try {
|
|
182
|
+
const stat = await lstat(filePath);
|
|
183
|
+
if (stat.isSymbolicLink()) {
|
|
184
|
+
throw new Error("Target path is a symlink and cannot be used through safe file operations");
|
|
185
|
+
}
|
|
186
|
+
if (!stat.isFile()) {
|
|
187
|
+
throw new Error("Target path is not a regular file");
|
|
188
|
+
}
|
|
189
|
+
assertNotHardLinked(filePath, stat.nlink);
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
if (isMissingFileError(error))
|
|
193
|
+
return;
|
|
194
|
+
throw error;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
async function assertParentSnapshotStable(parentSnapshot) {
|
|
198
|
+
if (!parentSnapshot)
|
|
199
|
+
return;
|
|
200
|
+
if ((await realpath(parentSnapshot.path)) !== parentSnapshot.realPath) {
|
|
201
|
+
throw new Error("Parent directory changed during write file operation");
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
async function cleanupTempIfParentStable(tmpPath, parentSnapshot) {
|
|
205
|
+
try {
|
|
206
|
+
await assertParentSnapshotStable(parentSnapshot);
|
|
207
|
+
await rm(tmpPath, { force: true });
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
// If the parent moved or was swapped, do not follow the unstable path for cleanup.
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
async function captureParentSnapshot(filePath) {
|
|
214
|
+
const parentPath = path.dirname(filePath);
|
|
215
|
+
if (parentPath.startsWith("/proc/self/fd/"))
|
|
216
|
+
return undefined;
|
|
217
|
+
return {
|
|
218
|
+
path: parentPath,
|
|
219
|
+
realPath: await realpath(parentPath)
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
async function openStableNoFollow(filePath, flags, operation, parentSnapshot, mode) {
|
|
223
|
+
if (!parentSnapshot)
|
|
224
|
+
return openNoFollow(filePath, flags, operation, mode);
|
|
225
|
+
if (process.platform !== "linux") {
|
|
226
|
+
const actualParentBeforeOpen = await realpath(parentSnapshot.path);
|
|
227
|
+
if (actualParentBeforeOpen !== parentSnapshot.realPath) {
|
|
228
|
+
throw new Error(`Parent directory changed before ${operation} file operation`);
|
|
229
|
+
}
|
|
230
|
+
const handle = await openNoFollow(filePath, flags, operation, mode);
|
|
231
|
+
try {
|
|
232
|
+
const actualParentAfterOpen = await realpath(parentSnapshot.path);
|
|
233
|
+
if (actualParentAfterOpen !== parentSnapshot.realPath) {
|
|
234
|
+
throw new Error(`Parent directory changed during ${operation} file operation`);
|
|
235
|
+
}
|
|
236
|
+
return handle;
|
|
237
|
+
}
|
|
238
|
+
catch (error) {
|
|
239
|
+
await handle.close().catch(() => undefined);
|
|
240
|
+
throw error;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
const parentHandle = await openNoFollowDirectory(parentSnapshot.path, operation);
|
|
244
|
+
try {
|
|
245
|
+
const parentFdPath = procFdPath(parentHandle.fd);
|
|
246
|
+
const actualParent = await realpath(parentFdPath);
|
|
247
|
+
if (actualParent !== parentSnapshot.realPath) {
|
|
248
|
+
throw new Error(`Parent directory changed during ${operation} file operation`);
|
|
249
|
+
}
|
|
250
|
+
return await openNoFollow(path.join(parentFdPath, path.basename(filePath)), flags, operation, mode);
|
|
251
|
+
}
|
|
252
|
+
finally {
|
|
253
|
+
await parentHandle.close();
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
async function openNoFollowDirectory(dirPath, operation) {
|
|
257
|
+
const noFollowFlag = typeof constants.O_NOFOLLOW === "number" ? constants.O_NOFOLLOW : 0;
|
|
258
|
+
const directoryFlag = typeof constants.O_DIRECTORY === "number" ? constants.O_DIRECTORY : 0;
|
|
259
|
+
try {
|
|
260
|
+
const handle = await open(dirPath, constants.O_RDONLY | directoryFlag | noFollowFlag);
|
|
261
|
+
const stat = await handle.stat();
|
|
262
|
+
if (!stat.isDirectory()) {
|
|
263
|
+
await handle.close().catch(() => undefined);
|
|
264
|
+
throw new Error("Target parent is not a directory");
|
|
265
|
+
}
|
|
266
|
+
return handle;
|
|
267
|
+
}
|
|
268
|
+
catch (error) {
|
|
269
|
+
const maybe = error;
|
|
270
|
+
if (maybe.code === "ELOOP") {
|
|
271
|
+
throw new Error(`Target parent is a symlink or changed during ${operation} file operation`);
|
|
272
|
+
}
|
|
273
|
+
throw error;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
async function openNoFollow(filePath, flags, operation, mode) {
|
|
277
|
+
const noFollowFlag = typeof constants.O_NOFOLLOW === "number" ? constants.O_NOFOLLOW : 0;
|
|
278
|
+
try {
|
|
279
|
+
return await open(filePath, flags | noFollowFlag, mode);
|
|
280
|
+
}
|
|
281
|
+
catch (error) {
|
|
282
|
+
const maybe = error;
|
|
283
|
+
if (maybe.code === "ELOOP") {
|
|
284
|
+
throw new Error(`Target path is a symlink or changed during ${operation} file operation`);
|
|
285
|
+
}
|
|
286
|
+
throw error;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
function procFdPath(fd) {
|
|
290
|
+
return `/proc/self/fd/${fd}`;
|
|
291
|
+
}
|
|
292
|
+
function isMissingFileError(error) {
|
|
293
|
+
return typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT";
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=safe-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-file.js","sourceRoot":"","sources":["../src/safe-file.ts"],"names":[],"mappings":"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"}
|