@code-yeongyu/senpi 2026.7.30 → 2026.7.31
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/CHANGELOG.md +98 -0
- package/README.md +3 -0
- package/dist/core/agent-session.d.ts +7 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +31 -3
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +1 -0
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +1 -0
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/idle.d.ts +16 -0
- package/dist/core/extensions/builtin/compaction/idle.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/idle.js +21 -0
- package/dist/core/extensions/builtin/compaction/idle.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.js +18 -1
- package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/log.d.ts +1 -1
- package/dist/core/extensions/builtin/compaction/log.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/log.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/openai-remote.d.ts +3 -0
- package/dist/core/extensions/builtin/compaction/openai-remote.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/openai-remote.js +15 -4
- package/dist/core/extensions/builtin/compaction/openai-remote.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.js +18 -4
- package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
- package/dist/core/extensions/builtin/goal/continuation.d.ts +2 -0
- package/dist/core/extensions/builtin/goal/continuation.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/continuation.js +12 -0
- package/dist/core/extensions/builtin/goal/continuation.js.map +1 -1
- package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/index.js +4 -1
- package/dist/core/extensions/builtin/goal/index.js.map +1 -1
- package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/monitor-continuation.js +22 -18
- package/dist/core/extensions/builtin/goal/monitor-continuation.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/apply.d.ts +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/apply.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/apply.js +67 -66
- package/dist/core/extensions/builtin/gpt-apply-patch/apply.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/recovery.d.ts +4 -0
- package/dist/core/extensions/builtin/gpt-apply-patch/recovery.d.ts.map +1 -0
- package/dist/core/extensions/builtin/gpt-apply-patch/recovery.js +35 -0
- package/dist/core/extensions/builtin/gpt-apply-patch/recovery.js.map +1 -0
- package/dist/core/extensions/builtin/gpt-apply-patch/tool.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/tool.js +0 -5
- package/dist/core/extensions/builtin/gpt-apply-patch/tool.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/types.d.ts +2 -0
- package/dist/core/extensions/builtin/gpt-apply-patch/types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/types.js.map +1 -1
- package/dist/core/high-reasoning-warning.d.ts +10 -0
- package/dist/core/high-reasoning-warning.d.ts.map +1 -0
- package/dist/core/high-reasoning-warning.js +28 -0
- package/dist/core/high-reasoning-warning.js.map +1 -0
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +3 -11
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/settings-manager.d.ts +2 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +1 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +8 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +59 -13
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/risky-main-model-warning.d.ts +5 -0
- package/dist/modes/interactive/risky-main-model-warning.d.ts.map +1 -0
- package/dist/modes/interactive/risky-main-model-warning.js +8 -0
- package/dist/modes/interactive/risky-main-model-warning.js.map +1 -0
- package/dist/modes/interactive/tips/catalog/subagent-tips.d.ts.map +1 -1
- package/dist/modes/interactive/tips/catalog/subagent-tips.js +30 -0
- package/dist/modes/interactive/tips/catalog/subagent-tips.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +6 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +22 -2
- package/dist/utils/version-check.js.map +1 -1
- package/docs/docs.json +4 -0
- package/docs/quickstart.md +3 -0
- package/docs/release-guide.md +636 -0
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +24 -0
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +2 -2
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.d.ts +4 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.js +106 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.js.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/stream-fn.d.ts +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/stream-fn.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/stream-fn.js +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/stream-fn.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.js +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/huggingface.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.d.ts +2 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js +13 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/kimi-xtml/recovery-stream.js +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/kimi-xtml/recovery-stream.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/kimi-xtml/thinking-recovery-stream.d.ts +3 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/kimi-xtml/thinking-recovery-stream.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/kimi-xtml/thinking-recovery-stream.js +29 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/kimi-xtml/thinking-recovery-stream.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/kimi-xtml/thinking-recovery.d.ts +3 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/kimi-xtml/thinking-recovery.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/kimi-xtml/thinking-recovery.js +82 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/kimi-xtml/thinking-recovery.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/package.json +1 -1
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/client/index.d.ts.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/client/index.js +1 -12
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/client/index.js.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/client/stdio.d.ts +7 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/client/stdio.d.ts.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/client/stdio.js +9 -3
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/client/stdio.js.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/client/streamableHttp.d.ts.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/client/streamableHttp.js +5 -3
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/client/streamableHttp.js.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/index.d.ts.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/index.js +1 -12
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/index.js.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/sseKeepAlive.d.ts +5 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/sseKeepAlive.d.ts.map +1 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/sseKeepAlive.js +17 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/sseKeepAlive.js.map +1 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/stdio.d.ts +9 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/stdio.d.ts.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/stdio.js +10 -4
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/stdio.js.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/webStandardStreamableHttp.d.ts +21 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/webStandardStreamableHttp.d.ts.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/webStandardStreamableHttp.js +239 -41
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/webStandardStreamableHttp.js.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/zod-compat.d.ts.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/zod-compat.js +25 -6
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/zod-compat.js.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/shared/mediaType.d.ts +32 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/shared/mediaType.d.ts.map +1 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/shared/mediaType.js +64 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/shared/mediaType.js.map +1 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/shared/stdio.d.ts +5 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/shared/stdio.d.ts.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/shared/stdio.js +10 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/shared/stdio.js.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/client/index.d.ts.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/client/index.js +2 -13
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/client/index.js.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/client/stdio.d.ts +7 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/client/stdio.d.ts.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/client/stdio.js +9 -3
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/client/stdio.js.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/client/streamableHttp.d.ts.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/client/streamableHttp.js +5 -3
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/client/streamableHttp.js.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/index.d.ts.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/index.js +2 -13
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/index.js.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/sseKeepAlive.d.ts +5 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/sseKeepAlive.d.ts.map +1 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/sseKeepAlive.js +13 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/sseKeepAlive.js.map +1 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.d.ts +9 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.d.ts.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js +10 -4
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/webStandardStreamableHttp.d.ts +21 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/webStandardStreamableHttp.d.ts.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/webStandardStreamableHttp.js +239 -41
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/webStandardStreamableHttp.js.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-compat.d.ts.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-compat.js +25 -6
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-compat.js.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/mediaType.d.ts +32 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/mediaType.d.ts.map +1 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/mediaType.js +57 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/mediaType.js.map +1 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/stdio.d.ts +5 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/stdio.d.ts.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/stdio.js +9 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/stdio.js.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/package.json +4 -3
- package/node_modules/brace-expansion/README.md +12 -0
- package/node_modules/brace-expansion/dist/commonjs/index.d.ts +2 -0
- package/node_modules/brace-expansion/dist/commonjs/index.d.ts.map +1 -1
- package/node_modules/brace-expansion/dist/commonjs/index.js +138 -86
- package/node_modules/brace-expansion/dist/commonjs/index.js.map +1 -1
- package/node_modules/brace-expansion/dist/esm/index.d.ts +2 -0
- package/node_modules/brace-expansion/dist/esm/index.d.ts.map +1 -1
- package/node_modules/brace-expansion/dist/esm/index.js +137 -85
- package/node_modules/brace-expansion/dist/esm/index.js.map +1 -1
- package/node_modules/brace-expansion/package.json +2 -2
- package/package.json +7 -7
|
@@ -119,6 +119,20 @@ export function normalizeObjectSchema(schema) {
|
|
|
119
119
|
}
|
|
120
120
|
return undefined;
|
|
121
121
|
}
|
|
122
|
+
function getDotPath(path) {
|
|
123
|
+
if (path.length === 0) {
|
|
124
|
+
return 'object root';
|
|
125
|
+
}
|
|
126
|
+
return path.reduce((acc, seg, index) => {
|
|
127
|
+
if (index === 0) {
|
|
128
|
+
return String(seg);
|
|
129
|
+
}
|
|
130
|
+
if (typeof seg === 'number') {
|
|
131
|
+
return `${acc}[${seg}]`;
|
|
132
|
+
}
|
|
133
|
+
return `${acc}.${seg}`;
|
|
134
|
+
}, '');
|
|
135
|
+
}
|
|
122
136
|
// --- Error message extraction ---
|
|
123
137
|
/**
|
|
124
138
|
* Safely extracts an error message from a parse result error.
|
|
@@ -126,16 +140,21 @@ export function normalizeObjectSchema(schema) {
|
|
|
126
140
|
*/
|
|
127
141
|
export function getParseErrorMessage(error) {
|
|
128
142
|
if (error && typeof error === 'object') {
|
|
143
|
+
// When present, prioritize zod issues and format as a message and path
|
|
144
|
+
if ('issues' in error && Array.isArray(error.issues) && error.issues.length > 0) {
|
|
145
|
+
return error.issues
|
|
146
|
+
.map((i) => {
|
|
147
|
+
if (!i.path?.length) {
|
|
148
|
+
return i.message;
|
|
149
|
+
}
|
|
150
|
+
return `${i.message} at ${getDotPath(i.path)}`;
|
|
151
|
+
})
|
|
152
|
+
.join('\n');
|
|
153
|
+
}
|
|
129
154
|
// Try common error structures
|
|
130
155
|
if ('message' in error && typeof error.message === 'string') {
|
|
131
156
|
return error.message;
|
|
132
157
|
}
|
|
133
|
-
if ('issues' in error && Array.isArray(error.issues) && error.issues.length > 0) {
|
|
134
|
-
const firstIssue = error.issues[0];
|
|
135
|
-
if (firstIssue && typeof firstIssue === 'object' && 'message' in firstIssue) {
|
|
136
|
-
return String(firstIssue.message);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
158
|
// Fallback: try to stringify the error
|
|
140
159
|
try {
|
|
141
160
|
return JSON.stringify(error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zod-compat.js","sourceRoot":"","sources":["../../../src/server/zod-compat.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"zod-compat.js","sourceRoot":"","sources":["../../../src/server/zod-compat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extracts the media type (the lowercased `type/subtype` pair, without
|
|
3
|
+
* parameters) from a raw `Content-Type` header value, or `undefined` when the
|
|
4
|
+
* header is missing or empty.
|
|
5
|
+
*
|
|
6
|
+
* Content-Type comparisons must use the parsed media type, never a substring
|
|
7
|
+
* search of the raw header: a value like `text/plain; a=application/json`
|
|
8
|
+
* contains the substring `application/json` but its media type is
|
|
9
|
+
* `text/plain`, and case variants or parameters make naive string comparison
|
|
10
|
+
* wrong in both directions.
|
|
11
|
+
*
|
|
12
|
+
* "Essence" is the WHATWG MIME Sniffing standard's term for the bare
|
|
13
|
+
* `type/subtype` pair (https://mimesniff.spec.whatwg.org/#mime-type-essence);
|
|
14
|
+
* the Fetch standard's request classification is defined against it
|
|
15
|
+
* (https://fetch.spec.whatwg.org/#cors-safelisted-request-header).
|
|
16
|
+
*
|
|
17
|
+
* Parsing is RFC 9110 (`content-type` package) first. When the parameter
|
|
18
|
+
* section is malformed (`application/json;`, `application/json; charset=`),
|
|
19
|
+
* browsers and most HTTP stacks still derive the media type from the segment
|
|
20
|
+
* before the first `;` — the fallback matches that widely-implemented
|
|
21
|
+
* behavior, so a header whose media type is unambiguous is not rejected for
|
|
22
|
+
* a sloppy parameter section.
|
|
23
|
+
*/
|
|
24
|
+
export declare function mediaTypeEssence(header: string | null | undefined): string | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Whether a raw `Content-Type` header value denotes `application/json`.
|
|
27
|
+
* Parameters (for example `charset=utf-8`) are allowed and ignored; malformed
|
|
28
|
+
* parameter sections do not reject a header whose media type is unambiguously
|
|
29
|
+
* `application/json` (see `mediaTypeEssence` for the exact grammar).
|
|
30
|
+
*/
|
|
31
|
+
export declare function isJsonContentType(header: string | null | undefined): boolean;
|
|
32
|
+
//# sourceMappingURL=mediaType.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mediaType.d.ts","sourceRoot":"","sources":["../../../src/shared/mediaType.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAiBtF;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAM5E"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import contentType from 'content-type';
|
|
2
|
+
/**
|
|
3
|
+
* Extracts the media type (the lowercased `type/subtype` pair, without
|
|
4
|
+
* parameters) from a raw `Content-Type` header value, or `undefined` when the
|
|
5
|
+
* header is missing or empty.
|
|
6
|
+
*
|
|
7
|
+
* Content-Type comparisons must use the parsed media type, never a substring
|
|
8
|
+
* search of the raw header: a value like `text/plain; a=application/json`
|
|
9
|
+
* contains the substring `application/json` but its media type is
|
|
10
|
+
* `text/plain`, and case variants or parameters make naive string comparison
|
|
11
|
+
* wrong in both directions.
|
|
12
|
+
*
|
|
13
|
+
* "Essence" is the WHATWG MIME Sniffing standard's term for the bare
|
|
14
|
+
* `type/subtype` pair (https://mimesniff.spec.whatwg.org/#mime-type-essence);
|
|
15
|
+
* the Fetch standard's request classification is defined against it
|
|
16
|
+
* (https://fetch.spec.whatwg.org/#cors-safelisted-request-header).
|
|
17
|
+
*
|
|
18
|
+
* Parsing is RFC 9110 (`content-type` package) first. When the parameter
|
|
19
|
+
* section is malformed (`application/json;`, `application/json; charset=`),
|
|
20
|
+
* browsers and most HTTP stacks still derive the media type from the segment
|
|
21
|
+
* before the first `;` — the fallback matches that widely-implemented
|
|
22
|
+
* behavior, so a header whose media type is unambiguous is not rejected for
|
|
23
|
+
* a sloppy parameter section.
|
|
24
|
+
*/
|
|
25
|
+
export function mediaTypeEssence(header) {
|
|
26
|
+
if (!header) {
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
return contentType.parse(header).type;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
const essence = (header.split(';', 1)[0] ?? '').trim().toLowerCase();
|
|
34
|
+
// A comma in the parameter tail of an unparseable value indicates
|
|
35
|
+
// joined duplicate headers — ambiguous, so no essence at all (keeps
|
|
36
|
+
// duplicate-header handling uniform whether or not the first copy
|
|
37
|
+
// carries parameters).
|
|
38
|
+
if (essence === '' || header.slice(essence.length).includes(',')) {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
return essence;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Whether a raw `Content-Type` header value denotes `application/json`.
|
|
46
|
+
* Parameters (for example `charset=utf-8`) are allowed and ignored; malformed
|
|
47
|
+
* parameter sections do not reject a header whose media type is unambiguously
|
|
48
|
+
* `application/json` (see `mediaTypeEssence` for the exact grammar).
|
|
49
|
+
*/
|
|
50
|
+
export function isJsonContentType(header) {
|
|
51
|
+
// Fast path: the exact literal is what SDK clients send on every POST.
|
|
52
|
+
if (header === 'application/json') {
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
return mediaTypeEssence(header) === 'application/json';
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=mediaType.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mediaType.js","sourceRoot":"","sources":["../../../src/shared/mediaType.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,cAAc,CAAC;AAEvC;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAiC;IAC9D,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,IAAI,CAAC;QACD,OAAO,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACL,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrE,kEAAkE;QAClE,oEAAoE;QACpE,kEAAkE;QAClE,uBAAuB;QACvB,IAAI,OAAO,KAAK,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/D,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAiC;IAC/D,uEAAuE;IACvE,IAAI,MAAM,KAAK,kBAAkB,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,gBAAgB,CAAC,MAAM,CAAC,KAAK,kBAAkB,CAAC;AAC3D,CAAC"}
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import { JSONRPCMessage } from '../types.js';
|
|
2
|
+
export declare const STDIO_DEFAULT_MAX_BUFFER_SIZE: number;
|
|
2
3
|
/**
|
|
3
4
|
* Buffers a continuous stdio stream into discrete JSON-RPC messages.
|
|
4
5
|
*/
|
|
5
6
|
export declare class ReadBuffer {
|
|
6
7
|
private _buffer?;
|
|
8
|
+
private _maxBufferSize;
|
|
9
|
+
constructor(options?: {
|
|
10
|
+
maxBufferSize?: number;
|
|
11
|
+
});
|
|
7
12
|
append(chunk: Buffer): void;
|
|
8
13
|
readMessage(): JSONRPCMessage | null;
|
|
9
14
|
clear(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../../src/shared/stdio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAwB,MAAM,aAAa,CAAC;AAEnE;;GAEG;AACH,qBAAa,UAAU;IACnB,OAAO,CAAC,OAAO,CAAC,CAAS;
|
|
1
|
+
{"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../../src/shared/stdio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAwB,MAAM,aAAa,CAAC;AAEnE,eAAO,MAAM,6BAA6B,QAAmB,CAAC;AAE9D;;GAEG;AACH,qBAAa,UAAU;IACnB,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,cAAc,CAAS;gBAEnB,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE;IAIhD,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAS3B,WAAW,IAAI,cAAc,GAAG,IAAI;IAepC,KAAK,IAAI,IAAI;CAGhB;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAE/D;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAEhE"}
|
|
@@ -1,9 +1,18 @@
|
|
|
1
1
|
import { JSONRPCMessageSchema } from '../types.js';
|
|
2
|
+
export const STDIO_DEFAULT_MAX_BUFFER_SIZE = 10 * 1024 * 1024;
|
|
2
3
|
/**
|
|
3
4
|
* Buffers a continuous stdio stream into discrete JSON-RPC messages.
|
|
4
5
|
*/
|
|
5
6
|
export class ReadBuffer {
|
|
7
|
+
constructor(options) {
|
|
8
|
+
this._maxBufferSize = options?.maxBufferSize ?? STDIO_DEFAULT_MAX_BUFFER_SIZE;
|
|
9
|
+
}
|
|
6
10
|
append(chunk) {
|
|
11
|
+
const newSize = (this._buffer?.length ?? 0) + chunk.length;
|
|
12
|
+
if (newSize > this._maxBufferSize) {
|
|
13
|
+
this.clear();
|
|
14
|
+
throw new Error(`ReadBuffer exceeded maximum size of ${this._maxBufferSize} bytes`);
|
|
15
|
+
}
|
|
7
16
|
this._buffer = this._buffer ? Buffer.concat([this._buffer, chunk]) : chunk;
|
|
8
17
|
}
|
|
9
18
|
readMessage() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../../src/shared/stdio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnE;;GAEG;AACH,MAAM,OAAO,UAAU;
|
|
1
|
+
{"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../../src/shared/stdio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnE,MAAM,CAAC,MAAM,6BAA6B,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAE9D;;GAEG;AACH,MAAM,OAAO,UAAU;IAInB,YAAY,OAAoC;QAC5C,IAAI,CAAC,cAAc,GAAG,OAAO,EAAE,aAAa,IAAI,6BAA6B,CAAC;IAClF,CAAC;IAED,MAAM,CAAC,KAAa;QAChB,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;QAC3D,IAAI,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YAChC,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,uCAAuC,IAAI,CAAC,cAAc,QAAQ,CAAC,CAAC;QACxF,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/E,CAAC;IAED,WAAW;QACP,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAChD,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,KAAK;QACD,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;IAC7B,CAAC;CACJ;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC3C,OAAO,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAuB;IACpD,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;AAC1C,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@modelcontextprotocol/sdk",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.30.0",
|
|
4
4
|
"description": "Model Context Protocol implementation for TypeScript",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Anthropic, PBC (https://anthropic.com)",
|
|
@@ -88,7 +88,8 @@
|
|
|
88
88
|
"lint": "eslint src/ && prettier --check .",
|
|
89
89
|
"lint:fix": "eslint src/ --fix && prettier --write .",
|
|
90
90
|
"check": "npm run typecheck && npm run lint",
|
|
91
|
-
"test": "vitest run",
|
|
91
|
+
"test": "vitest run --exclude \"test/e2e/**\"",
|
|
92
|
+
"test:e2e": "vitest run test/e2e",
|
|
92
93
|
"test:watch": "vitest",
|
|
93
94
|
"start": "npm run server",
|
|
94
95
|
"server": "tsx watch --clear-screen=false scripts/cli.ts server",
|
|
@@ -100,7 +101,7 @@
|
|
|
100
101
|
"test:conformance:client:all": "npx @modelcontextprotocol/conformance client --command 'npx tsx test/conformance/src/everythingClient.ts' --suite all --expected-failures test/conformance/conformance-baseline.yml"
|
|
101
102
|
},
|
|
102
103
|
"dependencies": {
|
|
103
|
-
"@hono/node-server": "^1.19.9",
|
|
104
|
+
"@hono/node-server": "^1.19.9 || ^2.0.5",
|
|
104
105
|
"ajv": "^8.17.1",
|
|
105
106
|
"ajv-formats": "^3.0.1",
|
|
106
107
|
"content-type": "^1.0.5",
|
|
@@ -64,6 +64,18 @@ const expansions = expand('{1..100}'.repeat(5), {
|
|
|
64
64
|
// expansions.length will be 100, not 100^5
|
|
65
65
|
```
|
|
66
66
|
|
|
67
|
+
The `options` object can also provide a `maxLength` value to cap the
|
|
68
|
+
total number of characters across all expansions. This is limited to
|
|
69
|
+
`4_000_000` by default, to prevent memory exhaustion from inputs whose
|
|
70
|
+
result count stays under `max` while each result grows very long.
|
|
71
|
+
|
|
72
|
+
```js
|
|
73
|
+
const expansions = expand('{a,b}'.repeat(1500), {
|
|
74
|
+
maxLength: 100,
|
|
75
|
+
})
|
|
76
|
+
// the combined length of expansions will not exceed 100 characters
|
|
77
|
+
```
|
|
78
|
+
|
|
67
79
|
Valid expansions are:
|
|
68
80
|
|
|
69
81
|
```js
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export declare const EXPANSION_MAX = 100000;
|
|
2
|
+
export declare const EXPANSION_MAX_LENGTH = 4000000;
|
|
2
3
|
export type BraceExpansionOptions = {
|
|
3
4
|
max?: number;
|
|
5
|
+
maxLength?: number;
|
|
4
6
|
};
|
|
5
7
|
export declare function expand(str: string, options?: BraceExpansionOptions): string[];
|
|
6
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,aAAa,SAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,aAAa,SAAU,CAAA;AAYpC,eAAO,MAAM,oBAAoB,UAAY,CAAA;AAwD7C,MAAM,MAAM,qBAAqB,GAAG;IAClC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,YAkBtE"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.EXPANSION_MAX = void 0;
|
|
3
|
+
exports.EXPANSION_MAX_LENGTH = exports.EXPANSION_MAX = void 0;
|
|
4
4
|
exports.expand = expand;
|
|
5
5
|
const balanced_match_1 = require("balanced-match");
|
|
6
6
|
const escSlash = '\0SLASH' + Math.random() + '\0';
|
|
@@ -19,6 +19,17 @@ const closePattern = /\\}/g;
|
|
|
19
19
|
const commaPattern = /\\,/g;
|
|
20
20
|
const periodPattern = /\\\./g;
|
|
21
21
|
exports.EXPANSION_MAX = 100_000;
|
|
22
|
+
// `EXPANSION_MAX` caps the *number* of expansions, but not their length. An
|
|
23
|
+
// input like `'{a,b}'.repeat(1500)` stays under that count - its output is
|
|
24
|
+
// truncated to 100k results - while making every result ~1500 characters
|
|
25
|
+
// long. The result set, and the intermediate arrays built while combining
|
|
26
|
+
// brace sets, then grow large enough to exhaust memory and crash the process
|
|
27
|
+
// (CVE-2026-14257). `EXPANSION_MAX_LENGTH` bounds the total number of
|
|
28
|
+
// characters the accumulator may hold at any point, so memory stays flat no
|
|
29
|
+
// matter how many brace groups are chained. The limit sits well above any
|
|
30
|
+
// realistic expansion (100k results hitting `EXPANSION_MAX` measure ~1M
|
|
31
|
+
// characters) so legitimate input is unaffected.
|
|
32
|
+
exports.EXPANSION_MAX_LENGTH = 4_000_000;
|
|
22
33
|
function numeric(str) {
|
|
23
34
|
return !isNaN(str) ? parseInt(str, 10) : str.charCodeAt(0);
|
|
24
35
|
}
|
|
@@ -68,7 +79,7 @@ function expand(str, options = {}) {
|
|
|
68
79
|
if (!str) {
|
|
69
80
|
return [];
|
|
70
81
|
}
|
|
71
|
-
const { max = exports.EXPANSION_MAX } = options;
|
|
82
|
+
const { max = exports.EXPANSION_MAX, maxLength = exports.EXPANSION_MAX_LENGTH } = options;
|
|
72
83
|
// I don't know why Bash 4.3 does this, but it does.
|
|
73
84
|
// Anything starting with {} will have the first two bytes preserved
|
|
74
85
|
// but *only* at the top level, so {},a}b will not expand to anything,
|
|
@@ -78,7 +89,7 @@ function expand(str, options = {}) {
|
|
|
78
89
|
if (str.slice(0, 2) === '{}') {
|
|
79
90
|
str = '\\{\\}' + str.slice(2);
|
|
80
91
|
}
|
|
81
|
-
return expand_(escapeBraces(str), max, true).map(unescapeBraces);
|
|
92
|
+
return expand_(escapeBraces(str), max, maxLength, true).map(unescapeBraces);
|
|
82
93
|
}
|
|
83
94
|
function embrace(str) {
|
|
84
95
|
return '{' + str + '}';
|
|
@@ -92,25 +103,112 @@ function lte(i, y) {
|
|
|
92
103
|
function gte(i, y) {
|
|
93
104
|
return i >= y;
|
|
94
105
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
106
|
+
// Build `{ acc[a] + pre + values[v] }` for every combination, capping the
|
|
107
|
+
// number of results at `max` and the total number of characters at `maxLength`.
|
|
108
|
+
// This is the one place output grows, so bounding it here keeps the single
|
|
109
|
+
// accumulator - and therefore memory - flat regardless of how many brace groups
|
|
110
|
+
// are combined (CVE-2026-14257).
|
|
111
|
+
function combine(acc, pre, values, max, maxLength, dropEmpties) {
|
|
112
|
+
const out = [];
|
|
113
|
+
let length = 0;
|
|
114
|
+
for (let a = 0; a < acc.length; a++) {
|
|
115
|
+
for (let v = 0; v < values.length; v++) {
|
|
116
|
+
if (out.length >= max)
|
|
117
|
+
return out;
|
|
118
|
+
const expansion = acc[a] + pre + values[v];
|
|
119
|
+
// Bash drops empty results at the top level. Skip them before they count
|
|
120
|
+
// against `max`, so `max` bounds the number of *kept* results.
|
|
121
|
+
if (dropEmpties && !expansion)
|
|
122
|
+
continue;
|
|
123
|
+
if (length + expansion.length > maxLength)
|
|
124
|
+
return out;
|
|
125
|
+
out.push(expansion);
|
|
126
|
+
length += expansion.length;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return out;
|
|
130
|
+
}
|
|
131
|
+
// The expansion values of a single numeric (`1..5`) or alphabetic (`a..e..2`)
|
|
132
|
+
// sequence body.
|
|
133
|
+
function expandSequence(body, isAlphaSequence, max) {
|
|
134
|
+
const n = body.split(/\.\./);
|
|
135
|
+
const N = [];
|
|
136
|
+
// A sequence body always splits into two or three parts, but the compiler
|
|
137
|
+
// can't know that.
|
|
138
|
+
/* c8 ignore start */
|
|
139
|
+
if (n[0] === undefined || n[1] === undefined) {
|
|
140
|
+
return N;
|
|
141
|
+
}
|
|
142
|
+
/* c8 ignore stop */
|
|
143
|
+
const x = numeric(n[0]);
|
|
144
|
+
const y = numeric(n[1]);
|
|
145
|
+
const width = Math.max(n[0].length, n[1].length);
|
|
146
|
+
let incr = n.length === 3 && n[2] !== undefined ?
|
|
147
|
+
Math.max(Math.abs(numeric(n[2])), 1)
|
|
148
|
+
: 1;
|
|
149
|
+
let test = lte;
|
|
150
|
+
const reverse = y < x;
|
|
151
|
+
if (reverse) {
|
|
152
|
+
incr *= -1;
|
|
153
|
+
test = gte;
|
|
154
|
+
}
|
|
155
|
+
const pad = n.some(isPadded);
|
|
156
|
+
for (let i = x; test(i, y) && N.length < max; i += incr) {
|
|
157
|
+
let c;
|
|
158
|
+
if (isAlphaSequence) {
|
|
159
|
+
c = String.fromCharCode(i);
|
|
160
|
+
if (c === '\\') {
|
|
161
|
+
c = '';
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
c = String(i);
|
|
166
|
+
if (pad) {
|
|
167
|
+
const need = width - c.length;
|
|
168
|
+
if (need > 0) {
|
|
169
|
+
const z = new Array(need + 1).join('0');
|
|
170
|
+
if (i < 0) {
|
|
171
|
+
c = '-' + z + c.slice(1);
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
c = z + c;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
N.push(c);
|
|
180
|
+
}
|
|
181
|
+
return N;
|
|
182
|
+
}
|
|
183
|
+
function expand_(str, max, maxLength, isTop) {
|
|
184
|
+
// Consume the string's top-level brace groups left to right, threading a
|
|
185
|
+
// running set of combined prefixes (`acc`). Expanding the tail iteratively -
|
|
186
|
+
// rather than recursing on `m.post` once per group - keeps the native stack
|
|
187
|
+
// depth constant, so deeply chained input (`'{a,b}'.repeat(3000)`) can no
|
|
188
|
+
// longer overflow the stack, and leaves a single accumulator whose size
|
|
189
|
+
// `maxLength` bounds directly (CVE-2026-14257).
|
|
190
|
+
let acc = [''];
|
|
191
|
+
// Bash drops empty results, but only when the *first* top-level group is a
|
|
192
|
+
// comma set - a sequence like `{a..\}` may legitimately yield ''. The drop
|
|
193
|
+
// is on the final strings, so it is applied to whichever `combine` produces
|
|
194
|
+
// them (the one with no brace set left in the tail).
|
|
195
|
+
let dropEmpties = false;
|
|
196
|
+
let firstGroup = true;
|
|
101
197
|
for (;;) {
|
|
102
198
|
const m = (0, balanced_match_1.balanced)('{', '}', str);
|
|
103
|
-
|
|
104
|
-
|
|
199
|
+
// No brace set left: the rest of the string is literal.
|
|
200
|
+
if (!m) {
|
|
201
|
+
return combine(acc, str, [''], max, maxLength, dropEmpties);
|
|
202
|
+
}
|
|
105
203
|
// no need to expand pre, since it is guaranteed to be free of brace-sets
|
|
106
204
|
const pre = m.pre;
|
|
107
|
-
if (/\$$/.test(
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
205
|
+
if (/\$$/.test(pre)) {
|
|
206
|
+
acc = combine(acc, pre + '{' + m.body + '}', [''], max, maxLength, dropEmpties && !m.post.length);
|
|
207
|
+
firstGroup = false;
|
|
208
|
+
if (!m.post.length)
|
|
209
|
+
break;
|
|
210
|
+
str = m.post;
|
|
211
|
+
continue;
|
|
114
212
|
}
|
|
115
213
|
const isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
|
|
116
214
|
const isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
|
|
@@ -123,89 +221,43 @@ function expand_(str, max, isTop) {
|
|
|
123
221
|
isTop = true;
|
|
124
222
|
continue;
|
|
125
223
|
}
|
|
126
|
-
|
|
224
|
+
// Nothing here expands, so the whole remaining string is literal.
|
|
225
|
+
return combine(acc, pre + '{' + m.body + '}' + m.post, [''], max, maxLength, dropEmpties);
|
|
127
226
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
let n;
|
|
227
|
+
if (firstGroup) {
|
|
228
|
+
dropEmpties = isTop && !isSequence;
|
|
229
|
+
firstGroup = false;
|
|
230
|
+
}
|
|
231
|
+
let values;
|
|
134
232
|
if (isSequence) {
|
|
135
|
-
|
|
233
|
+
values = expandSequence(m.body, isAlphaSequence, max);
|
|
136
234
|
}
|
|
137
235
|
else {
|
|
138
|
-
n = parseCommaParts(m.body);
|
|
236
|
+
let n = parseCommaParts(m.body);
|
|
139
237
|
if (n.length === 1 && n[0] !== undefined) {
|
|
140
238
|
// x{{a,b}}y ==> x{a}y x{b}y
|
|
141
|
-
n = expand_(n[0], max, false).map(embrace);
|
|
239
|
+
n = expand_(n[0], max, maxLength, false).map(embrace);
|
|
142
240
|
//XXX is this necessary? Can't seem to hit it in tests.
|
|
143
241
|
/* c8 ignore start */
|
|
144
242
|
if (n.length === 1) {
|
|
145
|
-
|
|
243
|
+
acc = combine(acc, pre + n[0], [''], max, maxLength, dropEmpties && !m.post.length);
|
|
244
|
+
if (!m.post.length)
|
|
245
|
+
break;
|
|
246
|
+
str = m.post;
|
|
247
|
+
continue;
|
|
146
248
|
}
|
|
147
249
|
/* c8 ignore stop */
|
|
148
250
|
}
|
|
149
|
-
|
|
150
|
-
// at this point, n is the parts, and we know it's not a comma set
|
|
151
|
-
// with a single entry.
|
|
152
|
-
let N;
|
|
153
|
-
if (isSequence && n[0] !== undefined && n[1] !== undefined) {
|
|
154
|
-
const x = numeric(n[0]);
|
|
155
|
-
const y = numeric(n[1]);
|
|
156
|
-
const width = Math.max(n[0].length, n[1].length);
|
|
157
|
-
let incr = n.length === 3 && n[2] !== undefined ?
|
|
158
|
-
Math.max(Math.abs(numeric(n[2])), 1)
|
|
159
|
-
: 1;
|
|
160
|
-
let test = lte;
|
|
161
|
-
const reverse = y < x;
|
|
162
|
-
if (reverse) {
|
|
163
|
-
incr *= -1;
|
|
164
|
-
test = gte;
|
|
165
|
-
}
|
|
166
|
-
const pad = n.some(isPadded);
|
|
167
|
-
N = [];
|
|
168
|
-
for (let i = x; test(i, y) && N.length < max; i += incr) {
|
|
169
|
-
let c;
|
|
170
|
-
if (isAlphaSequence) {
|
|
171
|
-
c = String.fromCharCode(i);
|
|
172
|
-
if (c === '\\') {
|
|
173
|
-
c = '';
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
else {
|
|
177
|
-
c = String(i);
|
|
178
|
-
if (pad) {
|
|
179
|
-
const need = width - c.length;
|
|
180
|
-
if (need > 0) {
|
|
181
|
-
const z = new Array(need + 1).join('0');
|
|
182
|
-
if (i < 0) {
|
|
183
|
-
c = '-' + z + c.slice(1);
|
|
184
|
-
}
|
|
185
|
-
else {
|
|
186
|
-
c = z + c;
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
N.push(c);
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
else {
|
|
195
|
-
N = [];
|
|
251
|
+
values = [];
|
|
196
252
|
for (let j = 0; j < n.length; j++) {
|
|
197
|
-
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
for (let j = 0; j < N.length; j++) {
|
|
201
|
-
for (let k = 0; k < post.length && expansions.length < max; k++) {
|
|
202
|
-
const expansion = pre + N[j] + post[k];
|
|
203
|
-
if (!isTop || isSequence || expansion) {
|
|
204
|
-
expansions.push(expansion);
|
|
205
|
-
}
|
|
253
|
+
values.push.apply(values, expand_(n[j], max, maxLength, false));
|
|
206
254
|
}
|
|
207
255
|
}
|
|
208
|
-
|
|
256
|
+
acc = combine(acc, pre, values, max, maxLength, dropEmpties && !m.post.length);
|
|
257
|
+
if (!m.post.length)
|
|
258
|
+
break;
|
|
259
|
+
str = m.post;
|
|
209
260
|
}
|
|
261
|
+
return acc;
|
|
210
262
|
}
|
|
211
263
|
//# sourceMappingURL=index.js.map
|