@michengai/dsh-skills-manager 0.1.26 → 0.1.28
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 +14 -12
- package/CHANGELOG.zh-CN.md +14 -12
- package/README.md +4 -4
- package/README.zh-CN.md +4 -4
- package/lib/client.js +5 -4
- package/lib/core.js +4 -4
- package/lib/index.js +2 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,20 @@
|
|
|
4
4
|
|
|
5
5
|
The five most recent published versions are listed below.
|
|
6
6
|
|
|
7
|
+
## 0.1.28 — 2026-08-28
|
|
8
|
+
|
|
9
|
+
- Moved the release-history entry point to the top of the README so package updates are immediately discoverable.
|
|
10
|
+
|
|
11
|
+
Published package: [`@michengai/dsh-skills-manager@0.1.28`](https://www.npmjs.com/package/@michengai/dsh-skills-manager/v/0.1.28).
|
|
12
|
+
|
|
13
|
+
## 0.1.27 — 2026-08-27
|
|
14
|
+
|
|
15
|
+
- Expanded browser upload limits to 32 MiB for ZIP archives and individual files, 64 MiB decoded total, and 1,000 entries, with a matching 88 MiB Base64 JSON request ceiling.
|
|
16
|
+
- Kept upload feedback visible inside the import dialog instead of rendering errors behind the active modal, and cleared stale selections and messages when reopening or closing it.
|
|
17
|
+
- Verified the reporter-provided cross-platform fnOS `trim-cli` Skill archive through the complete isolated import path.
|
|
18
|
+
|
|
19
|
+
Published package: [`@michengai/dsh-skills-manager@0.1.27`](https://www.npmjs.com/package/@michengai/dsh-skills-manager/v/0.1.27).
|
|
20
|
+
|
|
7
21
|
## 0.1.26 — 2026-08-27
|
|
8
22
|
|
|
9
23
|
- Fixed browser folder imports that exceeded the former 16 MiB Base64 JSON request ceiling while still fitting within the documented 25 MiB decoded-content limit.
|
|
@@ -27,15 +41,3 @@ Published package: [`@michengai/dsh-skills-manager@0.1.25`](https://www.npmjs.co
|
|
|
27
41
|
- Linked the release history from both README editions and included it in the npm package.
|
|
28
42
|
|
|
29
43
|
Published package: [`@michengai/dsh-skills-manager@0.1.24`](https://www.npmjs.com/package/@michengai/dsh-skills-manager/v/0.1.24).
|
|
30
|
-
|
|
31
|
-
## 0.1.23 — 2026-08-17
|
|
32
|
-
|
|
33
|
-
- Stopped silently dropping a chained import after a clean dry run.
|
|
34
|
-
|
|
35
|
-
Release tag: [`v0.1.23`](https://github.com/MichengAI/dsh-skills-manager/tree/v0.1.23).
|
|
36
|
-
|
|
37
|
-
## 0.1.22 — 2026-08-17
|
|
38
|
-
|
|
39
|
-
- Preserved symlink-rejection errors while collecting batch import candidates.
|
|
40
|
-
|
|
41
|
-
Release tag: [`v0.1.22`](https://github.com/MichengAI/dsh-skills-manager/tree/v0.1.22).
|
package/CHANGELOG.zh-CN.md
CHANGED
|
@@ -4,6 +4,20 @@
|
|
|
4
4
|
|
|
5
5
|
以下记录最近发布的五个版本。
|
|
6
6
|
|
|
7
|
+
## 0.1.28 — 2026-08-28
|
|
8
|
+
|
|
9
|
+
- 将 README 中的更新日志入口前移到页面顶部,打开项目即可看到发布历史。
|
|
10
|
+
|
|
11
|
+
发布包:[`@michengai/dsh-skills-manager@0.1.28`](https://www.npmjs.com/package/@michengai/dsh-skills-manager/v/0.1.28)。
|
|
12
|
+
|
|
13
|
+
## 0.1.27 — 2026-08-27
|
|
14
|
+
|
|
15
|
+
- 将浏览器上传限制提高到 ZIP 32 MiB、单文件 32 MiB、解压后总量 64 MiB 和 1000 个条目,并同步把 Base64 JSON 请求体上限提高到 88 MiB。
|
|
16
|
+
- 上传反馈改为显示在导入弹窗内部,不再被当前弹窗遮挡;重新打开或关闭弹窗时会清理过期的选择和提示。
|
|
17
|
+
- 使用反馈者提供的跨平台 fnOS `trim-cli` Skill 压缩包完成隔离环境全链路导入验证。
|
|
18
|
+
|
|
19
|
+
发布包:[`@michengai/dsh-skills-manager@0.1.27`](https://www.npmjs.com/package/@michengai/dsh-skills-manager/v/0.1.27)。
|
|
20
|
+
|
|
7
21
|
## 0.1.26 — 2026-08-27
|
|
8
22
|
|
|
9
23
|
- 修复浏览器上传文件夹时,原始内容仍在 25 MiB 总量限制内,却因 Base64 JSON 超过旧 16 MiB 请求体上限而失败的问题。
|
|
@@ -27,15 +41,3 @@
|
|
|
27
41
|
- 在中英文 README 中加入更新日志入口,并将日志纳入 npm 包。
|
|
28
42
|
|
|
29
43
|
发布包:[`@michengai/dsh-skills-manager@0.1.24`](https://www.npmjs.com/package/@michengai/dsh-skills-manager/v/0.1.24)。
|
|
30
|
-
|
|
31
|
-
## 0.1.23 — 2026-08-17
|
|
32
|
-
|
|
33
|
-
- 修复 dry-run 成功后链式导入被静默丢弃的问题。
|
|
34
|
-
|
|
35
|
-
发布标签:[`v0.1.23`](https://github.com/MichengAI/dsh-skills-manager/tree/v0.1.23)。
|
|
36
|
-
|
|
37
|
-
## 0.1.22 — 2026-08-17
|
|
38
|
-
|
|
39
|
-
- 批量收集导入候选项时不再吞掉符号链接拒绝错误。
|
|
40
|
-
|
|
41
|
-
发布标签:[`v0.1.22`](https://github.com/MichengAI/dsh-skills-manager/tree/v0.1.22)。
|
package/README.md
CHANGED
|
@@ -19,6 +19,10 @@
|
|
|
19
19
|
|
|
20
20
|
> DSH Skills Manager is a community-maintained DeepSeek Harness (DSH) plugin, not an official DeepSeek AI product.
|
|
21
21
|
|
|
22
|
+
## Changelog
|
|
23
|
+
|
|
24
|
+
See [CHANGELOG.md](CHANGELOG.md) for the five most recent releases.
|
|
25
|
+
|
|
22
26
|
## Features
|
|
23
27
|
|
|
24
28
|
- Discover and load user-level skills from `.agents`, Codex, Claude, Gemini, and OpenCode into DSH.
|
|
@@ -196,7 +200,3 @@ npm run pack:check
|
|
|
196
200
|
Project status, usage boundaries, architecture, and iteration records begin at the [documentation entry point](docs/00-交接入口/00-阅读导航.md). The detailed operational guide is `docs\02-产品与业务\01-使用说明.md`.
|
|
197
201
|
|
|
198
202
|
Licensed under [Apache License 2.0](LICENSE).
|
|
199
|
-
|
|
200
|
-
## Changelog
|
|
201
|
-
|
|
202
|
-
See [CHANGELOG.md](CHANGELOG.md) for the five most recent releases.
|
package/README.zh-CN.md
CHANGED
|
@@ -19,6 +19,10 @@
|
|
|
19
19
|
|
|
20
20
|
> DSH Skills Manager 是社区维护的 DeepSeek Harness(DSH)插件,并非 DeepSeek AI 官方产品。
|
|
21
21
|
|
|
22
|
+
## 更新日志
|
|
23
|
+
|
|
24
|
+
最近五个发布版本见 [CHANGELOG.zh-CN.md](CHANGELOG.zh-CN.md)。
|
|
25
|
+
|
|
22
26
|
## 功能概览
|
|
23
27
|
|
|
24
28
|
- 自动发现并把 `.agents`、Codex、Claude、Gemini 和 OpenCode 的用户级技能真正加载进 DSH。
|
|
@@ -196,7 +200,3 @@ npm run pack:check
|
|
|
196
200
|
项目状态、使用边界、技术架构和迭代记录从[文档交接入口](docs/00-交接入口/00-阅读导航.md)开始。详细操作说明见 `docs\02-产品与业务\01-使用说明.md`。
|
|
197
201
|
|
|
198
202
|
本项目采用 [Apache License 2.0](LICENSE)。
|
|
199
|
-
|
|
200
|
-
## 更新日志
|
|
201
|
-
|
|
202
|
-
最近五个发布版本见 [CHANGELOG.zh-CN.md](CHANGELOG.zh-CN.md)。
|
package/lib/client.js
CHANGED
|
@@ -112,7 +112,7 @@ window.__ModuleLoader__.load({
|
|
|
112
112
|
function normalizeSkillQuery(query) { return String(query == null ? "" : query).trim().toLowerCase(); }
|
|
113
113
|
function matchSkillQuery(skill, query) { var q = normalizeSkillQuery(query); if (!q) return true; return [skill.name, skill.declaredName, skill.description, skill.kind, skill.kindLabel, skill.statusLabel, skill.rootKey, skill.rootLabel].some(function (value) { return String(value == null ? "" : value).toLowerCase().includes(q); }); }
|
|
114
114
|
function filterSkills(list, options) { var rootKey = options && options.rootKey != null ? options.rootKey : ""; return list.filter(function (skill) { return (!rootKey || skill.rootKey === rootKey) && matchSkillQuery(skill, options && options.query); }); }
|
|
115
|
-
var MAX_UPLOAD_ARCHIVE_BYTES =
|
|
115
|
+
var MAX_UPLOAD_ARCHIVE_BYTES = 32 << 20, MAX_UPLOAD_ENTRY_BYTES = 32 << 20, MAX_UPLOAD_TOTAL_BYTES = 64 << 20, MAX_UPLOAD_ENTRIES = 1000;
|
|
116
116
|
function uploadFilePath(file) { return String(file && (file._dssmPath || file.webkitRelativePath || file.name) || "").replace(/\\/g, "/"); }
|
|
117
117
|
function inspectUploadSelection(files) {
|
|
118
118
|
var list = Array.prototype.slice.call(files || []); if (!list.length) return null;
|
|
@@ -188,10 +188,10 @@ window.__ModuleLoader__.load({
|
|
|
188
188
|
}
|
|
189
189
|
|
|
190
190
|
var summary = data.summary || { total: 0, loaded: 0, disabled: 0, issues: 0 };
|
|
191
|
-
var content = [h("style", { key: "css" }, CSS), h("div", { key: "head", className: "dssm-head" }, h("div", null, h("h2", { className: "dssm-title" }, t("title")), h("p", { className: "dssm-desc" }, t("desc"))), h("div", { className: "dssm-actions" }, h("button", { type: "button", className: "dssm-btn", onClick: function () { setModal("create"); } }, t("btn.create")), h("button", { type: "button", className: "dssm-btn dssm-btn-secondary", onClick: function () { setModal("import"); } }, t("btn.import")))), h("div", { key: "summary", className: "dssm-summary" }, [[summary.total, "summary.total"], [summary.loaded, "summary.loaded"], [summary.disabled, "summary.disabled"]].map(function (item) { return h("div", { key: item[1], className: "dssm-stat" }, h("strong", null, item[0]), t(item[1], { count: item[0] }).replace(String(item[0]), "")); })), h("div", { key: "filters", className: "dssm-filters" }, h("input", { className: "dssm-control dssm-search", value: query, "aria-label": t("search"), placeholder: t("search.placeholder"), onChange: function (e) { setQuery(e.target.value); } }), h("div", { className: "dssm-source-filter" }, h(SourceSelect, { value: source, options: options, onChange: setSource }))), result ? h("div", { key: "result", className: "dssm-feedback" + (result.warning ? " dssm-warning" : result.ok ? "" : " dssm-error") }, result.text) : null].concat((data.warnings || []).map(function (warning, index) { return h("div", { key: "warning-" + index, className: "dssm-feedback dssm-warning", role: "alert" }, translateError(t, warning)); }), [snapshot.error ? h("div", { key: "error", className: "dssm-feedback dssm-error" }, snapshot.error) : null, snapshot.loading && !snapshot.data ? h("div", { key: "loading", className: "dssm-empty" }, t("loading")) : h("div", { key: "sources", className: "dssm-sources" }, roots.map(renderRoot)), h("button", { key: "trash", type: "button", className: "dssm-trash-row", onClick: function () { setModal("trash"); } }, h("span", null, t("trash.title")), h("span", { className: "dssm-trash-count" }, (data.trash || []).length))]);
|
|
191
|
+
var content = [h("style", { key: "css" }, CSS), h("div", { key: "head", className: "dssm-head" }, h("div", null, h("h2", { className: "dssm-title" }, t("title")), h("p", { className: "dssm-desc" }, t("desc"))), h("div", { className: "dssm-actions" }, h("button", { type: "button", className: "dssm-btn", onClick: function () { setModal("create"); } }, t("btn.create")), h("button", { type: "button", className: "dssm-btn dssm-btn-secondary", onClick: function () { setResult(null); setUpload(null); setModal("import"); } }, t("btn.import")))), h("div", { key: "summary", className: "dssm-summary" }, [[summary.total, "summary.total"], [summary.loaded, "summary.loaded"], [summary.disabled, "summary.disabled"]].map(function (item) { return h("div", { key: item[1], className: "dssm-stat" }, h("strong", null, item[0]), t(item[1], { count: item[0] }).replace(String(item[0]), "")); })), h("div", { key: "filters", className: "dssm-filters" }, h("input", { className: "dssm-control dssm-search", value: query, "aria-label": t("search"), placeholder: t("search.placeholder"), onChange: function (e) { setQuery(e.target.value); } }), h("div", { className: "dssm-source-filter" }, h(SourceSelect, { value: source, options: options, onChange: setSource }))), result && modal !== "import" ? h("div", { key: "result", className: "dssm-feedback" + (result.warning ? " dssm-warning" : result.ok ? "" : " dssm-error") }, result.text) : null].concat((data.warnings || []).map(function (warning, index) { return h("div", { key: "warning-" + index, className: "dssm-feedback dssm-warning", role: "alert" }, translateError(t, warning)); }), [snapshot.error ? h("div", { key: "error", className: "dssm-feedback dssm-error" }, snapshot.error) : null, snapshot.loading && !snapshot.data ? h("div", { key: "loading", className: "dssm-empty" }, t("loading")) : h("div", { key: "sources", className: "dssm-sources" }, roots.map(renderRoot)), h("button", { key: "trash", type: "button", className: "dssm-trash-row", onClick: function () { setModal("trash"); } }, h("span", null, t("trash.title")), h("span", { className: "dssm-trash-count" }, (data.trash || []).length))]);
|
|
192
192
|
|
|
193
193
|
if (modal === "create") content.push(h(Modal, { key: "create", title: t("create.title"), closeLabel: t("btn.close"), onClose: function () { setModal(null); } }, h("div", { className: "dssm-form" }, [["name", "create.name", "create.name.placeholder"], ["description", "create.description", "create.description.placeholder"]].map(function (field) { return h("label", { key: field[0], className: "dssm-field" }, h("span", { className: "dssm-label" }, t(field[1])), h("input", { className: "dssm-control", value: form[field[0]], placeholder: t(field[2]), onChange: function (e) { updateForm(field[0], e.target.value); } })); }), h("label", { className: "dssm-field" }, h("span", { className: "dssm-label" }, t("create.body")), h("textarea", { className: "dssm-control", value: form.body, placeholder: t("create.body.placeholder"), onChange: function (e) { updateForm("body", e.target.value); } })), h("p", { className: "dssm-help" }, t("create.chat.note"))), h("div", { className: "dssm-modal-actions" }, h("button", { className: "dssm-btn dssm-btn-secondary", onClick: function () { setModal(null); } }, t("btn.cancel")), h("button", { className: "dssm-btn", disabled: busy || !form.name.trim() || !form.description.trim() || !form.body.trim(), onClick: submitCreate }, t("btn.create.now")))));
|
|
194
|
-
if (modal === "import") content.push(h(Modal, { key: "import", className: "dssm-modal-import", title: t("import.title"), closeLabel: t("btn.close"), onClose: function () { pickerOpenRef.current = false; setUpload(null); setModal(null); } },
|
|
194
|
+
if (modal === "import") content.push(h(Modal, { key: "import", className: "dssm-modal-import", title: t("import.title"), closeLabel: t("btn.close"), onClose: function () { pickerOpenRef.current = false; setUpload(null); setResult(null); setModal(null); } },
|
|
195
195
|
h("input", { ref: importInputRef, className: "dssm-hidden-input", type: "file", accept: ".zip,.md", onChange: function (event) { selectUploadFiles(event.target.files); event.target.value = ""; } }),
|
|
196
196
|
h("input", { ref: folderInputRef, className: "dssm-hidden-input", type: "file", multiple: true, webkitdirectory: "", directory: "", onChange: function (event) { selectUploadFiles(event.target.files); event.target.value = ""; } }),
|
|
197
197
|
h("div", { className: "dssm-dropzone", onDragOver: function (event) { event.preventDefault(); event.currentTarget.classList.add("dssm-dropzone-active"); }, onDragLeave: function (event) { event.currentTarget.classList.remove("dssm-dropzone-active"); }, onDrop: function (event) { event.preventDefault(); event.currentTarget.classList.remove("dssm-dropzone-active"); droppedFiles(event.dataTransfer).then(selectUploadFiles).catch(function (error) { setResult({ ok: false, text: translateError(t, error) }); }); } },
|
|
@@ -200,8 +200,9 @@ window.__ModuleLoader__.load({
|
|
|
200
200
|
h("div", { className: "dssm-upload-choices" }, h("button", { type: "button", className: "dssm-upload-link", disabled: busy, onClick: function (event) { event.stopPropagation(); openNativePicker(folderInputRef); } }, t("btn.folder.pick")), h("span", { className: "dssm-upload-divider" }, "/"), h("button", { type: "button", className: "dssm-upload-link", disabled: busy, onClick: function (event) { event.stopPropagation(); openNativePicker(importInputRef); } }, t("btn.file.pick")))
|
|
201
201
|
),
|
|
202
202
|
upload ? h("div", { className: "dssm-file", title: upload.name }, h("span", { className: "dssm-file-kind", "aria-hidden": "true" }, upload.kind === "zip" ? "ZIP" : upload.kind === "folder" ? "DIR" : "MD"), h("span", { className: "dssm-file-name" }, upload.name), h("span", { className: "dssm-file-meta" }, t("upload.selected", { count: upload.count, size: upload.size < 1024 ? upload.size + " B" : Math.ceil(upload.size / 1024) + " KB" })), h("button", { type: "button", className: "dssm-file-remove", "aria-label": t("upload.remove"), onClick: function () { setUpload(null); } }, "×")) : null,
|
|
203
|
+
result ? h("div", { className: "dssm-feedback" + (result.warning ? " dssm-warning" : result.ok ? "" : " dssm-error"), role: "alert" }, result.text) : null,
|
|
203
204
|
h("div", { className: "dssm-upload-requirements" }, h("div", { className: "dssm-label" }, t("upload.requirements")), h("ul", null, h("li", null, t("upload.requirement.skill")), h("li", null, t("upload.requirement.frontmatter")), h("li", null, t("upload.requirement.copy")))),
|
|
204
|
-
h("div", { className: "dssm-modal-actions" }, h("button", { type: "button", className: "dssm-btn dssm-btn-secondary", onClick: function () { pickerOpenRef.current = false; setUpload(null); setModal(null); } }, t("btn.cancel")), h("button", { type: "button", className: "dssm-btn", disabled: busy || !upload, onClick: submitImport }, busy ? t("upload.importing") : t("btn.import.now")))
|
|
205
|
+
h("div", { className: "dssm-modal-actions" }, h("button", { type: "button", className: "dssm-btn dssm-btn-secondary", onClick: function () { pickerOpenRef.current = false; setUpload(null); setResult(null); setModal(null); } }, t("btn.cancel")), h("button", { type: "button", className: "dssm-btn", disabled: busy || !upload, onClick: submitImport }, busy ? t("upload.importing") : t("btn.import.now")))
|
|
205
206
|
)); if (modal === "detail") content.push(h(Modal, { key: "detail", wide: true, title: t("detail.title"), closeLabel: t("btn.close"), onClose: function () { setModal(null); } }, detail ? h(react.Fragment, null, h("div", { className: "dssm-detail-path" }, detail.path), h("div", { className: "dssm-detail-section" }, h("div", { className: "dssm-detail-title" }, t("detail.diagnostics")), detail.diagnostics.length ? detail.diagnostics.map(function (item, index) { return h("div", { key: index, className: "dssm-diag" }, t(item.code, item.params || {})); }) : h("div", { className: "dssm-note" }, t("detail.noIssues"))), h("div", { className: "dssm-detail-section" }, h("div", { className: "dssm-detail-title" }, t("detail.body")), h("pre", { className: "dssm-code" }, detail.body || "")), h("div", { className: "dssm-detail-section" }, h("div", { className: "dssm-detail-title" }, t("detail.frontmatter")), h("pre", { className: "dssm-code" }, JSON.stringify(detail.frontmatter, null, 2)))) : h("div", { className: "dssm-empty" }, t("loading"))));
|
|
206
207
|
if (modal === "trash") content.push(h(Modal, { key: "trash-modal", title: t("trash.title"), closeLabel: t("btn.close"), onClose: function () { setModal(null); } }, h("div", { className: "dssm-count" }, t("trash.count", { count: data.trash.length })), data.trash.length ? data.trash.map(function (item) { return h("div", { key: item.id, className: "dssm-trash-item" }, h("div", { className: "dssm-trash-main" }, h("div", { className: "dssm-name" }, item.name), h("div", { className: "dssm-note" }, t("trash.deletedAt", { time: new Date(item.deletedAt).toLocaleString() }))), h("button", { className: "dssm-btn dssm-btn-quiet", disabled: busy, onClick: function () { post("/trash-restore", { id: item.id }, "result.restored", { name: item.name }); } }, t("btn.restore")), h("button", { className: "dssm-btn dssm-btn-quiet dssm-btn-danger", disabled: busy, onClick: function () { setModal({ type: "delete-confirm", id: item.id, name: item.name }); } }, t("btn.delete.forever"))); }) : h("div", { className: "dssm-empty" }, t("trash.empty"))));
|
|
207
208
|
if (modal && modal.type === "trash-confirm") content.push(h(Modal, { key: "trash-confirm", title: t("confirm.trash.title"), closeLabel: t("btn.close"), onClose: function () { setModal(null); } }, h("p", { className: "dssm-desc" }, t("confirm.trash.desc", { name: modal.name })), h("div", { className: "dssm-modal-actions" }, h("button", { className: "dssm-btn dssm-btn-secondary", onClick: function () { setModal(null); } }, t("btn.cancel")), h("button", { className: "dssm-btn", disabled: busy, onClick: function () { post("/delete", { root: modal.root, name: modal.name }, "result.trashed", { name: modal.name }).then(function () { setModal(null); }).catch(function () {}); } }, t("btn.trash")))));
|
package/lib/core.js
CHANGED
|
@@ -21,10 +21,10 @@ const WINDOWS_DEVICE_NAME_RE = /^(con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\..*)?$/i
|
|
|
21
21
|
const MAX_SOURCE_DEPTH = 64;
|
|
22
22
|
const MAX_ENTRY_NAME_LENGTH = 128;
|
|
23
23
|
const MAX_BROWSE_ENTRIES = 500;
|
|
24
|
-
const MAX_UPLOAD_ARCHIVE_BYTES =
|
|
25
|
-
const MAX_UPLOAD_ENTRY_BYTES =
|
|
26
|
-
const MAX_UPLOAD_TOTAL_BYTES =
|
|
27
|
-
const MAX_UPLOAD_ENTRIES =
|
|
24
|
+
const MAX_UPLOAD_ARCHIVE_BYTES = 32 << 20;
|
|
25
|
+
const MAX_UPLOAD_ENTRY_BYTES = 32 << 20;
|
|
26
|
+
const MAX_UPLOAD_TOTAL_BYTES = 64 << 20;
|
|
27
|
+
const MAX_UPLOAD_ENTRIES = 1000;
|
|
28
28
|
const MAX_UPLOAD_PATH_LENGTH = 512;
|
|
29
29
|
const TRANSIENT_RENAME_CODES = new Set(["EACCES", "EBUSY", "EPERM"]);
|
|
30
30
|
|
package/lib/index.js
CHANGED
|
@@ -27,8 +27,8 @@ const name = "skills-manager";
|
|
|
27
27
|
const inject = ["webServer", "skills", "tools"];
|
|
28
28
|
const CLIENT_MARKER_HEADER = "x-dsh-skills-manager";
|
|
29
29
|
const MAX_LOG_BYTES = 1 << 20;
|
|
30
|
-
// 文件夹上传允许
|
|
31
|
-
const MAX_UPLOAD_BODY_BYTES =
|
|
30
|
+
// 文件夹上传允许 64 MiB 原始内容;Base64 会膨胀约 1/3,再为最多 1000 条路径预留余量。
|
|
31
|
+
const MAX_UPLOAD_BODY_BYTES = 88 << 20;
|
|
32
32
|
|
|
33
33
|
function makeLog() {
|
|
34
34
|
const file = logPath();
|
package/package.json
CHANGED