@bendyline/docblocks-cli 2.0.0 → 2.1.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/README.md +5 -16
- package/dist/index.d.ts +2 -2
- package/dist/index.js +7183 -18
- package/dist/index.js.map +1 -1
- package/package.json +9 -9
- package/dist/commands/build.d.ts +0 -14
- package/dist/commands/build.d.ts.map +0 -1
- package/dist/commands/build.js +0 -74
- package/dist/commands/build.js.map +0 -1
- package/dist/commands/convert.d.ts +0 -42
- package/dist/commands/convert.d.ts.map +0 -1
- package/dist/commands/convert.js +0 -339
- package/dist/commands/convert.js.map +0 -1
- package/dist/commands/init.d.ts +0 -3
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js +0 -23
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/mcp.d.ts +0 -12
- package/dist/commands/mcp.d.ts.map +0 -1
- package/dist/commands/mcp.js +0 -106
- package/dist/commands/mcp.js.map +0 -1
- package/dist/commands/parse.d.ts +0 -6
- package/dist/commands/parse.d.ts.map +0 -1
- package/dist/commands/parse.js +0 -38
- package/dist/commands/parse.js.map +0 -1
- package/dist/commands/serve.d.ts +0 -36
- package/dist/commands/serve.d.ts.map +0 -1
- package/dist/commands/serve.js +0 -347
- package/dist/commands/serve.js.map +0 -1
- package/dist/commands/themes.d.ts +0 -6
- package/dist/commands/themes.d.ts.map +0 -1
- package/dist/commands/themes.js +0 -15
- package/dist/commands/themes.js.map +0 -1
- package/dist/commands/transforms.d.ts +0 -6
- package/dist/commands/transforms.d.ts.map +0 -1
- package/dist/commands/transforms.js +0 -15
- package/dist/commands/transforms.js.map +0 -1
- package/dist/commands/video.d.ts +0 -38
- package/dist/commands/video.d.ts.map +0 -1
- package/dist/commands/video.js +0 -136
- package/dist/commands/video.js.map +0 -1
- package/dist/contained-file.d.ts +0 -8
- package/dist/contained-file.d.ts.map +0 -1
- package/dist/contained-file.js +0 -77
- package/dist/contained-file.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/mcp/agentic-tools.d.ts +0 -16
- package/dist/mcp/agentic-tools.d.ts.map +0 -1
- package/dist/mcp/agentic-tools.js +0 -967
- package/dist/mcp/agentic-tools.js.map +0 -1
- package/dist/mcp/artifact-store.d.ts +0 -98
- package/dist/mcp/artifact-store.d.ts.map +0 -1
- package/dist/mcp/artifact-store.js +0 -542
- package/dist/mcp/artifact-store.js.map +0 -1
- package/dist/mcp/authority.d.ts +0 -53
- package/dist/mcp/authority.d.ts.map +0 -1
- package/dist/mcp/authority.js +0 -433
- package/dist/mcp/authority.js.map +0 -1
- package/dist/mcp/conversion-service.d.ts +0 -111
- package/dist/mcp/conversion-service.d.ts.map +0 -1
- package/dist/mcp/conversion-service.js +0 -512
- package/dist/mcp/conversion-service.js.map +0 -1
- package/dist/mcp/discovery-tools.d.ts +0 -4
- package/dist/mcp/discovery-tools.d.ts.map +0 -1
- package/dist/mcp/discovery-tools.js +0 -114
- package/dist/mcp/discovery-tools.js.map +0 -1
- package/dist/mcp/document-service.d.ts +0 -47
- package/dist/mcp/document-service.d.ts.map +0 -1
- package/dist/mcp/document-service.js +0 -424
- package/dist/mcp/document-service.js.map +0 -1
- package/dist/mcp/error-result.d.ts +0 -17
- package/dist/mcp/error-result.d.ts.map +0 -1
- package/dist/mcp/error-result.js +0 -82
- package/dist/mcp/error-result.js.map +0 -1
- package/dist/mcp/intelligence.d.ts +0 -15
- package/dist/mcp/intelligence.d.ts.map +0 -1
- package/dist/mcp/intelligence.js +0 -855
- package/dist/mcp/intelligence.js.map +0 -1
- package/dist/mcp/output-bounds.d.ts +0 -13
- package/dist/mcp/output-bounds.d.ts.map +0 -1
- package/dist/mcp/output-bounds.js +0 -61
- package/dist/mcp/output-bounds.js.map +0 -1
- package/dist/mcp/preview-service.d.ts +0 -54
- package/dist/mcp/preview-service.d.ts.map +0 -1
- package/dist/mcp/preview-service.js +0 -454
- package/dist/mcp/preview-service.js.map +0 -1
- package/dist/mcp/progress.d.ts +0 -18
- package/dist/mcp/progress.d.ts.map +0 -1
- package/dist/mcp/progress.js +0 -28
- package/dist/mcp/progress.js.map +0 -1
- package/dist/mcp/prompts.d.ts +0 -4
- package/dist/mcp/prompts.d.ts.map +0 -1
- package/dist/mcp/prompts.js +0 -124
- package/dist/mcp/prompts.js.map +0 -1
- package/dist/mcp/rendered-conversion.d.ts +0 -34
- package/dist/mcp/rendered-conversion.d.ts.map +0 -1
- package/dist/mcp/rendered-conversion.js +0 -364
- package/dist/mcp/rendered-conversion.js.map +0 -1
- package/dist/mcp/server.d.ts +0 -69
- package/dist/mcp/server.d.ts.map +0 -1
- package/dist/mcp/server.js +0 -249
- package/dist/mcp/server.js.map +0 -1
- package/dist/preview-policy.d.ts +0 -8
- package/dist/preview-policy.d.ts.map +0 -1
- package/dist/preview-policy.js +0 -85
- package/dist/preview-policy.js.map +0 -1
- package/dist/render-html.d.ts +0 -17
- package/dist/render-html.d.ts.map +0 -1
- package/dist/render-html.js +0 -85
- package/dist/render-html.js.map +0 -1
- package/dist/version.d.ts +0 -6
- package/dist/version.d.ts.map +0 -1
- package/dist/version.js +0 -104
- package/dist/version.js.map +0 -1
package/dist/mcp/server.js
DELETED
|
@@ -1,249 +0,0 @@
|
|
|
1
|
-
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import { getPackageVersion } from '../version.js';
|
|
3
|
-
import { registerAgenticTools, MCP_CONVERSION_TARGET_FORMATS, MCP_FORMAT_CAPABILITIES, } from './agentic-tools.js';
|
|
4
|
-
import { ArtifactStore } from './artifact-store.js';
|
|
5
|
-
import { McpFileAuthority } from './authority.js';
|
|
6
|
-
import { registerDiscoveryTools } from './discovery-tools.js';
|
|
7
|
-
import { registerAuthoringPrompts } from './prompts.js';
|
|
8
|
-
const DEFAULT_MAX_CONCURRENT_OPERATIONS = 2;
|
|
9
|
-
const DEFAULT_OPERATION_TIMEOUT_MS = 2 * 60 * 1000;
|
|
10
|
-
const DEFAULT_SHUTDOWN_DRAIN_TIMEOUT_MS = 5000;
|
|
11
|
-
/** Bounds expensive work while preserving the exact caller cancellation reason. */
|
|
12
|
-
export class OperationGuard {
|
|
13
|
-
constructor(maximum, timeoutMs, shutdownDrainTimeoutMs = DEFAULT_SHUTDOWN_DRAIN_TIMEOUT_MS) {
|
|
14
|
-
this.maximum = maximum;
|
|
15
|
-
this.timeoutMs = timeoutMs;
|
|
16
|
-
this.shutdownDrainTimeoutMs = shutdownDrainTimeoutMs;
|
|
17
|
-
this.active = 0;
|
|
18
|
-
this.accepting = true;
|
|
19
|
-
this.controllers = new Set();
|
|
20
|
-
this.completions = new Set();
|
|
21
|
-
this.shutdownPromise = null;
|
|
22
|
-
if (!Number.isSafeInteger(maximum) || maximum < 1 || maximum > 32) {
|
|
23
|
-
throw new Error('Invalid MCP operation concurrency limit');
|
|
24
|
-
}
|
|
25
|
-
if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 10 || timeoutMs > 30 * 60 * 1000) {
|
|
26
|
-
throw new Error('Invalid MCP operation timeout');
|
|
27
|
-
}
|
|
28
|
-
if (!Number.isSafeInteger(shutdownDrainTimeoutMs) ||
|
|
29
|
-
shutdownDrainTimeoutMs < 10 ||
|
|
30
|
-
shutdownDrainTimeoutMs > 60000) {
|
|
31
|
-
throw new Error('Invalid MCP shutdown drain timeout');
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
async run(requestSignal, work) {
|
|
35
|
-
requestSignal.throwIfAborted();
|
|
36
|
-
if (!this.accepting)
|
|
37
|
-
throw new OperationClosingError();
|
|
38
|
-
if (this.active >= this.maximum) {
|
|
39
|
-
throw new OperationBusyError(this.active, this.maximum);
|
|
40
|
-
}
|
|
41
|
-
this.active += 1;
|
|
42
|
-
const controller = new AbortController();
|
|
43
|
-
this.controllers.add(controller);
|
|
44
|
-
const forwardCancellation = () => controller.abort(requestSignal.reason);
|
|
45
|
-
if (requestSignal.aborted)
|
|
46
|
-
forwardCancellation();
|
|
47
|
-
else
|
|
48
|
-
requestSignal.addEventListener('abort', forwardCancellation, { once: true });
|
|
49
|
-
const timer = setTimeout(() => controller.abort(new OperationTimeoutError(this.timeoutMs)), this.timeoutMs);
|
|
50
|
-
let rejectAborted = () => undefined;
|
|
51
|
-
const aborted = new Promise((_resolve, reject) => {
|
|
52
|
-
rejectAborted = () => reject(controller.signal.reason ?? new Error('MCP operation was cancelled'));
|
|
53
|
-
if (controller.signal.aborted)
|
|
54
|
-
rejectAborted();
|
|
55
|
-
else
|
|
56
|
-
controller.signal.addEventListener('abort', rejectAborted, { once: true });
|
|
57
|
-
});
|
|
58
|
-
const completion = Promise.resolve()
|
|
59
|
-
.then(() => work(controller.signal))
|
|
60
|
-
.finally(() => {
|
|
61
|
-
clearTimeout(timer);
|
|
62
|
-
requestSignal.removeEventListener('abort', forwardCancellation);
|
|
63
|
-
controller.signal.removeEventListener('abort', rejectAborted);
|
|
64
|
-
this.controllers.delete(controller);
|
|
65
|
-
this.completions.delete(completion);
|
|
66
|
-
this.active -= 1;
|
|
67
|
-
});
|
|
68
|
-
this.completions.add(completion);
|
|
69
|
-
try {
|
|
70
|
-
return await Promise.race([completion, aborted]);
|
|
71
|
-
}
|
|
72
|
-
catch (caught) {
|
|
73
|
-
if (controller.signal.aborted) {
|
|
74
|
-
// Give abort-aware work a turn to release resources. Work that ignores
|
|
75
|
-
// cancellation still occupies its slot without delaying the response.
|
|
76
|
-
await Promise.race([
|
|
77
|
-
completion.then(() => undefined, () => undefined),
|
|
78
|
-
new Promise((resolve) => setTimeout(resolve, 0)),
|
|
79
|
-
]);
|
|
80
|
-
throw controller.signal.reason ?? caught;
|
|
81
|
-
}
|
|
82
|
-
throw caught;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
/** Stop admission, abort active work, and wait for all operation cleanup before disposal. */
|
|
86
|
-
shutdown() {
|
|
87
|
-
if (this.shutdownPromise)
|
|
88
|
-
return this.shutdownPromise;
|
|
89
|
-
this.accepting = false;
|
|
90
|
-
const attempt = this.drain();
|
|
91
|
-
this.shutdownPromise = attempt.catch((caught) => {
|
|
92
|
-
this.shutdownPromise = null;
|
|
93
|
-
throw caught;
|
|
94
|
-
});
|
|
95
|
-
return this.shutdownPromise;
|
|
96
|
-
}
|
|
97
|
-
async drain() {
|
|
98
|
-
const reason = new OperationShutdownError();
|
|
99
|
-
for (const controller of this.controllers) {
|
|
100
|
-
if (!controller.signal.aborted)
|
|
101
|
-
controller.abort(reason);
|
|
102
|
-
}
|
|
103
|
-
if (this.completions.size === 0)
|
|
104
|
-
return;
|
|
105
|
-
let timer;
|
|
106
|
-
const timeout = new Promise((_resolve, reject) => {
|
|
107
|
-
timer = setTimeout(() => reject(new OperationDrainTimeoutError(this.shutdownDrainTimeoutMs)), this.shutdownDrainTimeoutMs);
|
|
108
|
-
});
|
|
109
|
-
try {
|
|
110
|
-
await Promise.race([
|
|
111
|
-
Promise.allSettled([...this.completions]).then(() => undefined),
|
|
112
|
-
timeout,
|
|
113
|
-
]);
|
|
114
|
-
}
|
|
115
|
-
finally {
|
|
116
|
-
if (timer)
|
|
117
|
-
clearTimeout(timer);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
export class OperationTimeoutError extends Error {
|
|
122
|
-
constructor(timeoutMs) {
|
|
123
|
-
super(`MCP operation exceeded its ${timeoutMs} ms runtime budget`);
|
|
124
|
-
this.code = 'timeout';
|
|
125
|
-
this.name = 'OperationTimeoutError';
|
|
126
|
-
this.hint = 'Retry with fewer targets/items or increase the server operation timeout.';
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
export class OperationBusyError extends Error {
|
|
130
|
-
constructor(active, capacity) {
|
|
131
|
-
super(`MCP server is busy; retry later (${active} of ${capacity} expensive-operation slots are active)`);
|
|
132
|
-
this.active = active;
|
|
133
|
-
this.capacity = capacity;
|
|
134
|
-
this.code = 'busy';
|
|
135
|
-
this.retryable = true;
|
|
136
|
-
this.name = 'OperationBusyError';
|
|
137
|
-
this.hint =
|
|
138
|
-
'Retry after one active operation completes; reducing target or preview count may help.';
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
export class OperationClosingError extends Error {
|
|
142
|
-
constructor() {
|
|
143
|
-
super('MCP server is closing and is not accepting new operations');
|
|
144
|
-
this.code = 'server-closing';
|
|
145
|
-
this.hint = 'Reconnect to a running DocBlocks MCP server before retrying.';
|
|
146
|
-
this.retryable = true;
|
|
147
|
-
this.name = 'OperationClosingError';
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
export class OperationShutdownError extends Error {
|
|
151
|
-
constructor() {
|
|
152
|
-
super('MCP operation was cancelled because the server is shutting down');
|
|
153
|
-
this.code = 'server-shutdown';
|
|
154
|
-
this.hint = 'Reconnect to a running DocBlocks MCP server before retrying.';
|
|
155
|
-
this.retryable = true;
|
|
156
|
-
this.name = 'OperationShutdownError';
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
export class OperationDrainTimeoutError extends Error {
|
|
160
|
-
constructor(timeoutMs) {
|
|
161
|
-
super(`MCP operations did not finish cleanup within ${timeoutMs} ms`);
|
|
162
|
-
this.code = 'shutdown-drain-timeout';
|
|
163
|
-
this.hint = 'Wait for active converter cleanup, then close the server again.';
|
|
164
|
-
this.retryable = true;
|
|
165
|
-
this.name = 'OperationDrainTimeoutError';
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
/** Retains every independent failure encountered while closing the server. */
|
|
169
|
-
export class McpServerShutdownError extends Error {
|
|
170
|
-
constructor(errors) {
|
|
171
|
-
super(`MCP server shutdown encountered ${errors.length} failures`);
|
|
172
|
-
this.name = 'McpServerShutdownError';
|
|
173
|
-
this.errors = Object.freeze([...errors]);
|
|
174
|
-
this.cause = this.errors[0];
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
export function createMcpServer(options = {}) {
|
|
178
|
-
const authority = McpFileAuthority.create(options);
|
|
179
|
-
// `createMcpServer` remains synchronous for SDK ergonomics, but root
|
|
180
|
-
// resolution is asynchronous. Attach a handler immediately so an invalid
|
|
181
|
-
// startup grant cannot become an unhandled rejection before connect(), then
|
|
182
|
-
// make transport admission wait for every startup prerequisite.
|
|
183
|
-
void authority.catch(() => undefined);
|
|
184
|
-
const operations = new OperationGuard(options.maxConcurrentOperations ?? DEFAULT_MAX_CONCURRENT_OPERATIONS, options.operationTimeoutMs ?? DEFAULT_OPERATION_TIMEOUT_MS, options.shutdownDrainTimeoutMs ?? DEFAULT_SHUTDOWN_DRAIN_TIMEOUT_MS);
|
|
185
|
-
const artifacts = new ArtifactStore(options);
|
|
186
|
-
const server = new McpServer({ name: 'docblocks', version: getPackageVersion() });
|
|
187
|
-
registerAgenticTools(server, {
|
|
188
|
-
authority,
|
|
189
|
-
artifacts,
|
|
190
|
-
runOperation: (signal, work) => operations.run(signal, work),
|
|
191
|
-
});
|
|
192
|
-
registerDiscoveryTools(server);
|
|
193
|
-
registerAuthoringPrompts(server);
|
|
194
|
-
const connectServer = server.connect.bind(server);
|
|
195
|
-
server.connect = async (transport) => {
|
|
196
|
-
await Promise.all([authority, artifacts.ready()]);
|
|
197
|
-
await connectServer(transport);
|
|
198
|
-
};
|
|
199
|
-
const closeServer = server.close.bind(server);
|
|
200
|
-
let closePromise = null;
|
|
201
|
-
const beginShutdown = (closeTransport) => {
|
|
202
|
-
if (closePromise)
|
|
203
|
-
return closePromise;
|
|
204
|
-
closePromise = (async () => {
|
|
205
|
-
const failures = [];
|
|
206
|
-
try {
|
|
207
|
-
await operations.shutdown();
|
|
208
|
-
}
|
|
209
|
-
catch (caught) {
|
|
210
|
-
failures.push(caught);
|
|
211
|
-
}
|
|
212
|
-
if (closeTransport) {
|
|
213
|
-
try {
|
|
214
|
-
await closeServer();
|
|
215
|
-
}
|
|
216
|
-
catch (caught) {
|
|
217
|
-
failures.push(caught);
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
try {
|
|
221
|
-
await artifacts.dispose();
|
|
222
|
-
}
|
|
223
|
-
catch (caught) {
|
|
224
|
-
failures.push(caught);
|
|
225
|
-
}
|
|
226
|
-
throwShutdownFailures(failures);
|
|
227
|
-
})().catch((caught) => {
|
|
228
|
-
closePromise = null;
|
|
229
|
-
throw caught;
|
|
230
|
-
});
|
|
231
|
-
return closePromise;
|
|
232
|
-
};
|
|
233
|
-
const previousOnClose = server.server.onclose;
|
|
234
|
-
server.server.onclose = () => {
|
|
235
|
-
previousOnClose?.();
|
|
236
|
-
void beginShutdown(false).catch(() => undefined);
|
|
237
|
-
};
|
|
238
|
-
server.close = () => beginShutdown(true);
|
|
239
|
-
return server;
|
|
240
|
-
}
|
|
241
|
-
function throwShutdownFailures(failures) {
|
|
242
|
-
if (failures.length === 0)
|
|
243
|
-
return;
|
|
244
|
-
if (failures.length === 1)
|
|
245
|
-
throw failures[0];
|
|
246
|
-
throw new McpServerShutdownError(failures);
|
|
247
|
-
}
|
|
248
|
-
export { MCP_CONVERSION_TARGET_FORMATS, MCP_FORMAT_CAPABILITIES };
|
|
249
|
-
//# sourceMappingURL=server.js.map
|
package/dist/mcp/server.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
package/dist/preview-policy.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export type PreviewPathPurpose = 'directory' | 'document-or-asset' | 'embedded-image';
|
|
2
|
-
/**
|
|
3
|
-
* Apply the preview policy to both the name the document requested and the
|
|
4
|
-
* physical path the filesystem resolved. Checking both closes symlink aliases
|
|
5
|
-
* such as `images -> .private` and `diagram.png -> credentials.json`.
|
|
6
|
-
*/
|
|
7
|
-
export declare function isAllowedPreviewPath(rootPath: string, requestedPath: string, physicalPath: string, purpose: PreviewPathPurpose): boolean;
|
|
8
|
-
//# sourceMappingURL=preview-policy.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"preview-policy.d.ts","sourceRoot":"","sources":["../src/preview-policy.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,mBAAmB,GAAG,gBAAgB,CAAC;AAiDtF;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAkBT"}
|
package/dist/preview-policy.js
DELETED
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
const PREVIEW_FILE_EXTENSIONS = new Set([
|
|
3
|
-
'.css',
|
|
4
|
-
'.gif',
|
|
5
|
-
'.htm',
|
|
6
|
-
'.html',
|
|
7
|
-
'.ico',
|
|
8
|
-
'.jpeg',
|
|
9
|
-
'.jpg',
|
|
10
|
-
'.js',
|
|
11
|
-
'.json',
|
|
12
|
-
'.markdown',
|
|
13
|
-
'.md',
|
|
14
|
-
'.mjs',
|
|
15
|
-
'.mp3',
|
|
16
|
-
'.mp4',
|
|
17
|
-
'.ogg',
|
|
18
|
-
'.otf',
|
|
19
|
-
'.png',
|
|
20
|
-
'.svg',
|
|
21
|
-
'.ttf',
|
|
22
|
-
'.wav',
|
|
23
|
-
'.webm',
|
|
24
|
-
'.webp',
|
|
25
|
-
'.woff',
|
|
26
|
-
'.woff2',
|
|
27
|
-
]);
|
|
28
|
-
const EMBEDDED_IMAGE_EXTENSIONS = new Set([
|
|
29
|
-
'.gif',
|
|
30
|
-
'.ico',
|
|
31
|
-
'.jpeg',
|
|
32
|
-
'.jpg',
|
|
33
|
-
'.png',
|
|
34
|
-
'.svg',
|
|
35
|
-
'.webp',
|
|
36
|
-
]);
|
|
37
|
-
const SENSITIVE_FILE_EXTENSIONS = new Set(['.cer', '.crt', '.der', '.key', '.p12', '.pem', '.pfx']);
|
|
38
|
-
const SENSITIVE_FILE_NAMES = new Set([
|
|
39
|
-
'credentials',
|
|
40
|
-
'credentials.json',
|
|
41
|
-
'id_dsa',
|
|
42
|
-
'id_ecdsa',
|
|
43
|
-
'id_ed25519',
|
|
44
|
-
'id_rsa',
|
|
45
|
-
]);
|
|
46
|
-
/**
|
|
47
|
-
* Apply the preview policy to both the name the document requested and the
|
|
48
|
-
* physical path the filesystem resolved. Checking both closes symlink aliases
|
|
49
|
-
* such as `images -> .private` and `diagram.png -> credentials.json`.
|
|
50
|
-
*/
|
|
51
|
-
export function isAllowedPreviewPath(rootPath, requestedPath, physicalPath, purpose) {
|
|
52
|
-
const root = path.resolve(rootPath);
|
|
53
|
-
const requested = path.resolve(requestedPath);
|
|
54
|
-
const physical = path.resolve(physicalPath);
|
|
55
|
-
for (const candidate of new Set([requested, physical])) {
|
|
56
|
-
const relative = path.relative(root, candidate);
|
|
57
|
-
if (!isContainedRelativePath(relative) || containsSensitiveSegment(relative))
|
|
58
|
-
return false;
|
|
59
|
-
if (purpose !== 'directory') {
|
|
60
|
-
const extension = path.extname(path.basename(candidate)).toLowerCase();
|
|
61
|
-
const allowedExtensions = purpose === 'embedded-image' ? EMBEDDED_IMAGE_EXTENSIONS : PREVIEW_FILE_EXTENSIONS;
|
|
62
|
-
if (!allowedExtensions.has(extension))
|
|
63
|
-
return false;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
return true;
|
|
67
|
-
}
|
|
68
|
-
function containsSensitiveSegment(relativePath) {
|
|
69
|
-
return relativePath
|
|
70
|
-
.split(/[\\/]+/)
|
|
71
|
-
.filter(Boolean)
|
|
72
|
-
.some((segment) => {
|
|
73
|
-
const lower = segment.toLowerCase();
|
|
74
|
-
return (lower.startsWith('.') ||
|
|
75
|
-
SENSITIVE_FILE_NAMES.has(lower) ||
|
|
76
|
-
SENSITIVE_FILE_EXTENSIONS.has(path.extname(lower)));
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
function isContainedRelativePath(relativePath) {
|
|
80
|
-
return (relativePath === '' ||
|
|
81
|
-
(!relativePath.startsWith(`..${path.sep}`) &&
|
|
82
|
-
relativePath !== '..' &&
|
|
83
|
-
!path.isAbsolute(relativePath)));
|
|
84
|
-
}
|
|
85
|
-
//# sourceMappingURL=preview-policy.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"preview-policy.js","sourceRoot":"","sources":["../src/preview-policy.ts"],"names":[],"mappings":"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"}
|
package/dist/render-html.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
export interface ReferencedAssetPath {
|
|
2
|
-
assetRoot: string;
|
|
3
|
-
requestedPath: string;
|
|
4
|
-
physicalPath: string;
|
|
5
|
-
}
|
|
6
|
-
export interface RenderMarkdownHtmlOptions {
|
|
7
|
-
title: string;
|
|
8
|
-
sourcePath?: string;
|
|
9
|
-
assetRoot?: string;
|
|
10
|
-
themeId?: string;
|
|
11
|
-
mode?: 'slideshow' | 'static';
|
|
12
|
-
maxAssetBytes?: number;
|
|
13
|
-
/** Optional surface policy applied after mandatory physical containment. */
|
|
14
|
-
allowReferencedAsset?: (asset: ReferencedAssetPath) => boolean;
|
|
15
|
-
}
|
|
16
|
-
export declare function renderMarkdownHtml(markdown: string, options: RenderMarkdownHtmlOptions): Promise<string>;
|
|
17
|
-
//# sourceMappingURL=render-html.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"render-html.d.ts","sourceRoot":"","sources":["../src/render-html.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4EAA4E;IAC5E,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,OAAO,CAAC;CAChE;AAMD,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,MAAM,CAAC,CAqBjB"}
|
package/dist/render-html.js
DELETED
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import { realpath, stat } from 'node:fs/promises';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { markdownToDoc } from '@bendyline/squisq/doc';
|
|
4
|
-
import { parseMarkdown } from '@bendyline/squisq/markdown';
|
|
5
|
-
import { collectImagePaths, docToHtml } from '@bendyline/squisq-formats/html';
|
|
6
|
-
import { PLAYER_BUNDLE } from '@bendyline/squisq-react/standalone-source';
|
|
7
|
-
import { readContainedFile } from './contained-file.js';
|
|
8
|
-
const MAX_REFERENCED_IMAGES = 100;
|
|
9
|
-
const DEFAULT_MAX_ASSET_BYTES = 50 * 1024 * 1024;
|
|
10
|
-
const MAX_SINGLE_ASSET_BYTES = 20 * 1024 * 1024;
|
|
11
|
-
export async function renderMarkdownHtml(markdown, options) {
|
|
12
|
-
const markdownDoc = parseMarkdown(markdown);
|
|
13
|
-
const doc = markdownToDoc(markdownDoc);
|
|
14
|
-
const images = options.sourcePath && options.assetRoot
|
|
15
|
-
? await readReferencedImages(doc, options.sourcePath, options.assetRoot, options.maxAssetBytes ?? DEFAULT_MAX_ASSET_BYTES, options.allowReferencedAsset)
|
|
16
|
-
: undefined;
|
|
17
|
-
return docToHtml(doc, {
|
|
18
|
-
playerScript: PLAYER_BUNDLE,
|
|
19
|
-
images,
|
|
20
|
-
title: options.title,
|
|
21
|
-
mode: options.mode ?? 'static',
|
|
22
|
-
themeId: options.themeId,
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
async function readReferencedImages(doc, sourcePath, assetRoot, maxAssetBytes, allowReferencedAsset) {
|
|
26
|
-
const images = new Map();
|
|
27
|
-
const root = await realpath(path.resolve(assetRoot)).catch(() => null);
|
|
28
|
-
const baseDir = await realpath(path.dirname(path.resolve(sourcePath))).catch(() => null);
|
|
29
|
-
if (!root || !baseDir || !isPathInside(root, baseDir))
|
|
30
|
-
return images;
|
|
31
|
-
let totalBytes = 0;
|
|
32
|
-
for (const imagePath of [...collectImagePaths(doc)].slice(0, MAX_REFERENCED_IMAGES)) {
|
|
33
|
-
if (!isLocalRelativePath(imagePath))
|
|
34
|
-
continue;
|
|
35
|
-
const normalizedPath = stripUrlSuffix(imagePath);
|
|
36
|
-
const absolutePath = path.resolve(baseDir, normalizedPath);
|
|
37
|
-
if (!isPathInside(root, absolutePath))
|
|
38
|
-
continue;
|
|
39
|
-
try {
|
|
40
|
-
const physicalPath = await realpath(absolutePath);
|
|
41
|
-
if (!isPathInside(root, physicalPath))
|
|
42
|
-
continue;
|
|
43
|
-
if (allowReferencedAsset &&
|
|
44
|
-
!allowReferencedAsset({
|
|
45
|
-
assetRoot: root,
|
|
46
|
-
requestedPath: absolutePath,
|
|
47
|
-
physicalPath,
|
|
48
|
-
})) {
|
|
49
|
-
continue;
|
|
50
|
-
}
|
|
51
|
-
const info = await stat(physicalPath);
|
|
52
|
-
if (!info.isFile() ||
|
|
53
|
-
info.size > MAX_SINGLE_ASSET_BYTES ||
|
|
54
|
-
totalBytes + info.size > maxAssetBytes) {
|
|
55
|
-
continue;
|
|
56
|
-
}
|
|
57
|
-
const data = await readContainedFile(root, physicalPath, MAX_SINGLE_ASSET_BYTES);
|
|
58
|
-
totalBytes += data.byteLength;
|
|
59
|
-
images.set(imagePath, toExactArrayBuffer(data));
|
|
60
|
-
}
|
|
61
|
-
catch {
|
|
62
|
-
// Missing assets should not prevent the document from rendering.
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
return images;
|
|
66
|
-
}
|
|
67
|
-
function isLocalRelativePath(candidate) {
|
|
68
|
-
return (!path.isAbsolute(candidate) &&
|
|
69
|
-
!candidate.startsWith('/') &&
|
|
70
|
-
!/^(?:[a-z][a-z0-9+.-]*:)?\/\//i.test(candidate) &&
|
|
71
|
-
!candidate.startsWith('data:'));
|
|
72
|
-
}
|
|
73
|
-
function stripUrlSuffix(candidate) {
|
|
74
|
-
return candidate.split(/[?#]/, 1)[0] ?? candidate;
|
|
75
|
-
}
|
|
76
|
-
function isPathInside(rootAbs, candidateAbs) {
|
|
77
|
-
const rel = path.relative(path.resolve(rootAbs), path.resolve(candidateAbs));
|
|
78
|
-
return rel === '' || (!rel.startsWith(`..${path.sep}`) && rel !== '..' && !path.isAbsolute(rel));
|
|
79
|
-
}
|
|
80
|
-
function toExactArrayBuffer(data) {
|
|
81
|
-
const copy = new Uint8Array(data.byteLength);
|
|
82
|
-
copy.set(data);
|
|
83
|
-
return copy.buffer;
|
|
84
|
-
}
|
|
85
|
-
//# sourceMappingURL=render-html.js.map
|
package/dist/render-html.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"render-html.js","sourceRoot":"","sources":["../src/render-html.ts"],"names":[],"mappings":"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"}
|
package/dist/version.d.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export declare function getPackageVersion(): string;
|
|
2
|
-
/** Version declared for a shipped runtime engine such as linked Squisq. */
|
|
3
|
-
export declare function getDependencyVersion(packageName: string): string;
|
|
4
|
-
/** Declared version plus a hash of the exact linked/installed runtime files being executed. */
|
|
5
|
-
export declare function getDependencyRuntimeVersion(packageName: string, resolutionSpecifier?: string): string;
|
|
6
|
-
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAcA,wBAAgB,iBAAiB,IAAI,MAAM,CAO1C;AAED,2EAA2E;AAC3E,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAOhE;AAED,+FAA+F;AAC/F,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,MAAM,EACnB,mBAAmB,SAAc,GAChC,MAAM,CAyBR"}
|
package/dist/version.js
DELETED
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
import { createHash } from 'node:crypto';
|
|
2
|
-
import { createRequire } from 'node:module';
|
|
3
|
-
import { readdirSync, readFileSync, statSync } from 'node:fs';
|
|
4
|
-
import path from 'node:path';
|
|
5
|
-
const require = createRequire(import.meta.url);
|
|
6
|
-
const runtimeVersionCache = new Map();
|
|
7
|
-
export function getPackageVersion() {
|
|
8
|
-
const pkg = readPackageJson();
|
|
9
|
-
if (typeof pkg?.version === 'string' && pkg.version.length > 0) {
|
|
10
|
-
return pkg.version;
|
|
11
|
-
}
|
|
12
|
-
return '0.0.0';
|
|
13
|
-
}
|
|
14
|
-
/** Version declared for a shipped runtime engine such as linked Squisq. */
|
|
15
|
-
export function getDependencyVersion(packageName) {
|
|
16
|
-
const dependencies = readPackageJson()?.dependencies;
|
|
17
|
-
if (!dependencies || typeof dependencies !== 'object' || Array.isArray(dependencies)) {
|
|
18
|
-
return 'unknown';
|
|
19
|
-
}
|
|
20
|
-
const version = dependencies[packageName];
|
|
21
|
-
return typeof version === 'string' && version.length > 0 ? version : 'unknown';
|
|
22
|
-
}
|
|
23
|
-
/** Declared version plus a hash of the exact linked/installed runtime files being executed. */
|
|
24
|
-
export function getDependencyRuntimeVersion(packageName, resolutionSpecifier = packageName) {
|
|
25
|
-
const key = `${packageName}\0${resolutionSpecifier}`;
|
|
26
|
-
const cached = runtimeVersionCache.get(key);
|
|
27
|
-
if (cached)
|
|
28
|
-
return cached;
|
|
29
|
-
const declared = getDependencyVersion(packageName);
|
|
30
|
-
try {
|
|
31
|
-
const entry = require.resolve(resolutionSpecifier);
|
|
32
|
-
const root = findPackageRoot(entry, packageName);
|
|
33
|
-
const files = collectRuntimeFiles(path.join(root, 'dist'));
|
|
34
|
-
const hash = createHash('sha256');
|
|
35
|
-
for (const file of files) {
|
|
36
|
-
const relative = path.relative(root, file).split(path.sep).join('/');
|
|
37
|
-
hash.update(relative);
|
|
38
|
-
hash.update('\0');
|
|
39
|
-
hash.update(readFileSync(file));
|
|
40
|
-
hash.update('\0');
|
|
41
|
-
}
|
|
42
|
-
const version = `${declared}+runtime.${hash.digest('hex').slice(0, 16)}`;
|
|
43
|
-
runtimeVersionCache.set(key, version);
|
|
44
|
-
return version;
|
|
45
|
-
}
|
|
46
|
-
catch {
|
|
47
|
-
const version = `${declared}+runtime.unavailable`;
|
|
48
|
-
runtimeVersionCache.set(key, version);
|
|
49
|
-
return version;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
function readPackageJson() {
|
|
53
|
-
try {
|
|
54
|
-
const raw = readFileSync(new URL('../package.json', import.meta.url), 'utf-8');
|
|
55
|
-
return JSON.parse(raw);
|
|
56
|
-
}
|
|
57
|
-
catch {
|
|
58
|
-
// Fall through to a conservative fallback for unusual bundled layouts.
|
|
59
|
-
return null;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
function findPackageRoot(entry, packageName) {
|
|
63
|
-
let directory = path.dirname(entry);
|
|
64
|
-
for (let depth = 0; depth < 12; depth += 1) {
|
|
65
|
-
try {
|
|
66
|
-
const parsed = JSON.parse(readFileSync(path.join(directory, 'package.json'), 'utf8'));
|
|
67
|
-
if (parsed.name === packageName)
|
|
68
|
-
return directory;
|
|
69
|
-
}
|
|
70
|
-
catch {
|
|
71
|
-
// Keep walking toward the package root.
|
|
72
|
-
}
|
|
73
|
-
const parent = path.dirname(directory);
|
|
74
|
-
if (parent === directory)
|
|
75
|
-
break;
|
|
76
|
-
directory = parent;
|
|
77
|
-
}
|
|
78
|
-
throw new Error(`Cannot locate runtime package root for ${packageName}`);
|
|
79
|
-
}
|
|
80
|
-
function collectRuntimeFiles(directory) {
|
|
81
|
-
const files = [];
|
|
82
|
-
const pending = [directory];
|
|
83
|
-
let totalBytes = 0;
|
|
84
|
-
while (pending.length > 0) {
|
|
85
|
-
const current = pending.pop();
|
|
86
|
-
for (const entry of readdirSync(current, { withFileTypes: true })) {
|
|
87
|
-
const candidate = path.join(current, entry.name);
|
|
88
|
-
if (entry.isDirectory()) {
|
|
89
|
-
pending.push(candidate);
|
|
90
|
-
}
|
|
91
|
-
else if (entry.isFile() && /\.(?:js|json|css|wasm)$/iu.test(entry.name)) {
|
|
92
|
-
files.push(candidate);
|
|
93
|
-
totalBytes += statSync(candidate).size;
|
|
94
|
-
if (files.length > 4096 || totalBytes > 512 * 1024 * 1024) {
|
|
95
|
-
throw new Error('Runtime fingerprint input exceeds its safety budget');
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
if (files.length === 0)
|
|
101
|
-
throw new Error('Runtime package has no fingerprintable files');
|
|
102
|
-
return files.sort((left, right) => left.localeCompare(right));
|
|
103
|
-
}
|
|
104
|
-
//# sourceMappingURL=version.js.map
|
package/dist/version.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"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"}
|