@androidsup/dsh-plugin-updates 0.0.0-stage → 0.1.1

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.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.mjs", "../src/plugin-updates.mjs", "../src/storage.mjs", "../src/activation.mjs", "../src/version.mjs", "../src/http.mjs", "../package.json"],
4
+ "sourcesContent": ["import { join } from 'node:path';\nimport { PluginUpdates } from './plugin-updates.mjs';\nimport { updatesHandler, ENDPOINT } from './http.mjs';\nimport { version } from '../package.json';\n\nexport const name = '@androidsup/dsh-plugin-updates';\nexport const inject = ['pluginManager', 'profileContext'];\nexport async function apply(ctx) {\n const updater = new PluginUpdates({\n service: () => ctx.pluginManager, profile: () => ctx.profileContext, hmr: () => ctx.get('hmr'),\n stateFile: join(ctx.profileContext.dir, '.dsh-plugin-updates', 'state.json'),\n });\n let closed = false, timer;\n ctx.effect(() => () => {\n closed = true; clearInterval(timer); updater.abort.abort();\n return Promise.allSettled([updater.flight, updater.saveQueue]);\n });\n await updater.load();\n if (closed) return;\n ctx.inject(['webServer'], webCtx => {\n webCtx.effect(() => webCtx.webServer.register({ kind: 'exact', path: ENDPOINT, handler: updatesHandler(updater, version) }));\n });\n const tick = () => { void updater.tick().catch(() => ctx.logger.warn('plugin-updates: automatic check unavailable')); };\n tick();\n timer = setInterval(tick, 60000); timer.unref();\n}\n", "import { readFile, stat, rm } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport { createRequire } from 'node:module';\nimport { pathToFileURL } from 'node:url';\nimport { parse as parseYaml, parseDocument, isMap, isSeq, isScalar } from 'yaml';\nimport { withFileLock, writeFileAtomic } from '@deepseek-ai/dsh-atomic-write';\nimport { writePrivateJson } from './storage.mjs';\nimport { outsideActivation } from './activation.mjs';\nimport { parseVersion, compareVersions } from './version.mjs';\n\nconst packageName = /^(?:@[a-z0-9][a-z0-9._-]*\\/)?[a-z0-9][a-z0-9._-]*$/i;\nconst safeRef = /^[a-zA-Z0-9._/-]{1,200}$/;\nexport function parsePluginSource(name, spec) {\n if (!packageName.test(name) || typeof spec !== 'string' || spec.length > 600 || spec.startsWith('-') || spec.trim() !== spec || /[\\x00-\\x1f]/.test(spec)) return { kind: 'unsupported' };\n const git = /^(?:github:|git\\+https:\\/\\/github\\.com\\/|https:\\/\\/github\\.com\\/|git\\+ssh:\\/\\/git@github\\.com\\/|git@github\\.com:)?([\\w.-]+)\\/([\\w.-]+?)(?:\\.git)?(?:#(.+))?$/.exec(spec);\n if (git && !spec.startsWith('@') && !spec.startsWith('file:') && !spec.startsWith('link:')) {\n const [, owner, repo, ref] = git;\n if (owner === '.' || owner === '..' || repo === '.' || repo === '..' || (ref && (!safeRef.test(ref) || ref.includes('..')))) return { kind: 'unsupported' };\n return { kind: 'github', owner, repo, ref, source: `github:${owner}/${repo}${ref ? '#' + ref : ''}` };\n }\n if (/^(?:file:|link:|workspace:|https?:|git|\\/|\\.)/.test(spec)) return { kind: 'unsupported' };\n const alias = /^npm:((?:@[^/]+\\/)?[^@]+)(?:@(.+))?$/.exec(spec);\n const actual = alias?.[1] ?? name, range = alias?.[2] ?? spec;\n if (!packageName.test(actual) || !/^[a-zA-Z0-9.*^~<>=|+ -]{1,160}$/.test(range)) return { kind: 'unsupported' };\n // Explicit dist-tags retain their channel; exact versions and ranges update to latest.\n const channel = /^[a-zA-Z][\\w.-]*$/.test(range);\n return { kind: 'npm', package: actual, alias: !!alias, channel, tag: channel ? range : 'latest', source: spec };\n}\nexport function githubCommit(value) {\n if (typeof value !== 'string') return undefined;\n return /(?:\\/tar\\.gz\\/|\\/tarball\\/|#)([a-f0-9]{40})(?:\\b|\\()/i.exec(value)?.[1]?.toLowerCase();\n}\nasync function jsonFile(file) { try { return JSON.parse(await readFile(file, 'utf8')); } catch { return undefined; } }\nasync function locks(dir) {\n let pnpm;\n try { pnpm = parseYaml(await readFile(join(dir, 'pnpm-lock.yaml'), 'utf8'), { maxAliasCount: 20 }); } catch { /* npm profiles use package-lock instead. */ }\n const npm = await jsonFile(join(dir, 'package-lock.json'));\n const times = await Promise.all(['pnpm-lock.yaml', 'package-lock.json'].map(name => stat(join(dir, name)).then(s => s.mtimeMs).catch(() => 0)));\n return { pnpm, npm, preferNpm: times[1] > times[0] };\n}\nasync function publicJson(url, fetchImpl, signal) {\n const res = await fetchImpl(url, { signal: AbortSignal.any([signal, AbortSignal.timeout(12000)]),\n // Request only the SHA: the default JSON includes file patches and can be megabytes.\n headers: { Accept: 'application/vnd.github.sha', 'User-Agent': 'dsh-plugin-updates' }, redirect: 'error' });\n if (!res.ok) throw Error(res.status === 403 || res.status === 429 ? '\u8FDC\u7AEF\u9650\u6D41\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5' : res.status === 404 ? '\u4ED3\u5E93 / \u7248\u672C\u4E0D\u5B58\u5728\uFF0C\u6216\u9700\u8981\u79C1\u6709\u4ED3\u5E93\u6388\u6743' : `\u7F51\u7EDC\u8BF7\u6C42\u5931\u8D25\uFF08HTTP ${res.status}\uFF09`);\n let size = 0, chunks = [];\n for await (const chunk of res.body) { size += chunk.byteLength; if (size > 256 * 1024) throw Error('\u66F4\u65B0\u5143\u6570\u636E\u8FC7\u5927'); chunks.push(Buffer.from(chunk)); }\n const text = Buffer.concat(chunks).toString('utf8').trim();\n return /^[a-f0-9]{40}$/i.test(text) ? { sha: text } : JSON.parse(text);\n}\nconst short = sha => sha?.slice(0, 8);\nconst reviewedVersion = row => row.source.kind === 'npm' && parseVersion(row.latestVersion) ? `${row.source.package}@${row.latestVersion}` : undefined;\nasync function allowReviewedVersion(profile, row) {\n const file = join(profile.dir, 'pnpm-workspace.yaml'), prefix = `${row.source.package}@`;\n try {\n await withFileLock(file, async () => {\n let text;\n try { text = await readFile(file, 'utf8'); } catch (e) { if (e.code !== 'ENOENT') throw e; text = '{}\\n'; }\n const doc = parseDocument(text), entries = doc.get('minimumReleaseAgeExclude');\n if (doc.errors.length || !isMap(doc.contents) || entries !== undefined && (!isSeq(entries) || entries.anchor || entries.items.some(x => !isScalar(x) || typeof x.value !== 'string' || x.anchor))) throw Error('invalid-policy');\n const values = entries?.items.map(x => x.value) ?? [];\n // pnpm matches only one entry per package in some versions: merge the\n // explicitly named package's entries instead of appending a competing one.\n const existing = values.filter(x => x.startsWith(prefix));\n const versions = [...new Set([...existing.flatMap(x => x.slice(prefix.length).split(/\\s*\\|\\|\\s*/)), row.latestVersion])];\n const merged = prefix + versions.join(' || ');\n if (existing.length === 1 && existing[0] === merged) return;\n if (!entries) doc.set('minimumReleaseAgeExclude', [merged]);\n else {\n const first = entries.items.findIndex(x => x.value.startsWith(prefix));\n if (first < 0) entries.add(merged);\n else { entries.items[first].value = merged; for (let i = entries.items.length - 1; i > first; i--) if (entries.items[i].value.startsWith(prefix)) entries.delete(i); }\n }\n await writeFileAtomic(file, String(doc), { mode: 0o600 });\n }, { waitMs: 120000 });\n } catch { throw Error('\u65E0\u6CD5\u4FDD\u5B58\u6B64\u7248\u672C\u7684\u7B49\u5F85\u671F\u4F8B\u5916\u914D\u7F6E\uFF1B\u8BF7\u68C0\u67E5\u5F53\u524D DSH \u914D\u7F6E\u76EE\u5F55\u6743\u9650\u53CA pnpm-workspace.yaml \u683C\u5F0F\u3002\u672A\u5173\u95ED\u7B49\u5F85\u671F\u4FDD\u62A4\u3002'); }\n}\nconst installFailed = r => !!(r.error || ['failed', 'cancelled'].includes(r.application) || r.packageResult && r.packageResult.exitCode !== 0);\nfunction installFailure(result) {\n // Inspect locally; never send package-manager output, user paths or tokens to the panel.\n const text = [result.error?.diagnostic, result.packageResult?.output, result.packageResult?.kind].filter(v => typeof v === 'string').join('\\n');\n let reason = 'unknown', message = '\u5B89\u88C5\u672A\u5B8C\u6210\uFF1B\u8BF7\u5728 DSH \u539F\u751F\u63D2\u4EF6\u9875\u67E5\u770B\u5B89\u88C5\u65E5\u5FD7\uFF0C\u6216\u590D\u5236\u4E0B\u65B9\u8BCA\u65AD\u4FE1\u606F\u3002';\n if (result.application === 'cancelled') { reason = 'cancelled'; message = '\u5B89\u88C5\u5DF2\u53D6\u6D88\uFF0C\u53EF\u91CD\u65B0\u68C0\u67E5\u540E\u91CD\u8BD5\u3002'; }\n else if (/ERR_PNPM_(?:MINIMUM_RELEASE_AGE_VIOLATION|NO_MATURE_MATCHING_VERSION)|minimumReleaseAge/i.test(text)) { reason = 'release-age'; message = '\u65B0\u5305\u5C1A\u5728\u5B89\u88C5\u5668\u7B49\u5F85\u671F\u5185\u3002\u53EF\u5728\u300C\u67E5\u770B\u5E76\u66F4\u65B0\u300D\u4E2D\u52FE\u9009\u300C\u5141\u8BB8\u672C\u6B21\u6307\u5B9A\u7248\u672C\u7ACB\u5373\u5B89\u88C5\u300D\u540E\u91CD\u8BD5\uFF1B\u53EA\u653E\u884C\u786E\u8BA4\u7684\u63D2\u4EF6\u7248\u672C\uFF0C\u4F9D\u8D56\u4ECD\u9700\u6EE1\u8DB3\u7B49\u5F85\u671F\u3002\u4E5F\u53EF\u7B49\u5F85\u5230\u671F\u518D\u5B89\u88C5\u3002'; }\n else if (result.pendingBuilds?.length) { reason = 'build'; message = '\u4F9D\u8D56\u6784\u5EFA\u811A\u672C\u9700\u8981\u6388\u6743\uFF0C\u8BF7\u5230 DSH \u63D2\u4EF6\u5B89\u88C5\u9875\u5141\u8BB8\u8FD9\u4E9B\u811A\u672C\u540E\u91CD\u8BD5\u3002'; }\n else if (result.error?.code === 'incompatible-version') { reason = 'compatibility'; message = '\u63D2\u4EF6\u4E0E\u5F53\u524D DSH \u4E0D\u517C\u5BB9\uFF0C\u8BF7\u5148\u5347\u7EA7 DSH \u6216\u9009\u62E9\u517C\u5BB9\u7248\u672C\u3002'; }\n else if (/\\b(?:EPERM|EBUSY|EACCES)\\b|resource busy|file.*(?:locked|in use)/i.test(text)) { reason = 'files'; message = '\u63D2\u4EF6\u6587\u4EF6\u88AB\u5360\u7528\u6216\u76EE\u5F55\u6743\u9650\u4E0D\u8DB3\uFF0C\u5B89\u88C5\u672A\u5B8C\u6210\u3002\u8BF7\u5148\u5728 DSH \u505C\u7528\u8BE5\u63D2\u4EF6\u540E\u91CD\u8BD5\uFF0C\u5E76\u68C0\u67E5\u5B89\u88C5\u76EE\u5F55\u6743\u9650\uFF1B\u4ECD\u88AB\u5360\u7528\u65F6\u9700\u9000\u51FA\u6258\u76D8\u5E94\u7528\u3002'; }\n else if (/HMR transactions cannot be nested|activation|did not activate|entry.*activate/i.test(text)) { reason = 'activation'; message = '\u63D2\u4EF6\u52A0\u8F7D\u5931\u8D25\u3002\u8BF7\u68C0\u67E5 DSH \u63D2\u4EF6\u9875\u7684\u7EC4\u4EF6\u9519\u8BEF\uFF0C\u518D\u5173\u95ED\u5E76\u91CD\u65B0\u542F\u7528\uFF1B\u5B89\u88C5\u4E0E\u52A0\u8F7D\u662F\u4E24\u4E2A\u72EC\u7ACB\u6B65\u9AA4\u3002'; }\n else if (result.packageResult?.timedOut || /\\b(?:ETIMEDOUT|ECONNRESET|ENOTFOUND|EAI_AGAIN|ECONNREFUSED)\\b|network|fetch|download/i.test(text)) { reason = 'network'; message = '\u63D2\u4EF6\u4E0B\u8F7D\u6216\u7F51\u7EDC\u8BF7\u6C42\u5931\u8D25\uFF0C\u5B89\u88C5\u672A\u5B8C\u6210\u3002npm \u6765\u6E90\u53EF\u5207\u6362\u5230\u300Cnpm \u5B98\u65B9\u300D\u540E\u91CD\u8BD5\uFF1BGitHub \u6765\u6E90\u8BF7\u68C0\u67E5 GitHub \u7F51\u7EDC\u8FDE\u63A5\u3002'; }\n const code = /\\b(?:ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION|ERR_PNPM_NO_MATURE_MATCHING_VERSION|EPERM|EBUSY|EACCES|ETIMEDOUT|ECONNRESET|ENOTFOUND|EAI_AGAIN|ECONNREFUSED)\\b/.exec(text)?.[0]\n ?? (['operation-error', 'incompatible-version'].includes(result.error?.code) ? result.error.code : 'unknown');\n return { status: 'failed', application: result.application, message, diagnostic: {\n reason, code, platform: process.platform, stage: reason === 'activation' ? 'activation' : 'install',\n ...(Number.isInteger(result.packageResult?.exitCode) ? { exitCode: result.packageResult.exitCode } : {}),\n } };\n}\nasync function registryVersion(service, profile, spec, signal, requestedRegistry) {\n const require = createRequire(profile.installAnchor);\n const { viewProfilePackage } = await import(pathToFileURL(require.resolve('@deepseek-ai/dsh-plugin-manager/operations')).href);\n const { registryPlan } = await import(pathToFileURL(require.resolve('@deepseek-ai/dsh-plugin-manager/registry')).href);\n for (const registry of registryPlan(requestedRegistry, await service.registries())) {\n const answer = await viewProfilePackage(profile.dir, spec, { ...profile.packageManager, registry, timeoutMs: 12000, signal });\n if (signal.aborted) throw Error('\u68C0\u67E5\u5DF2\u53D6\u6D88');\n if (answer.exitCode !== 0) continue;\n const parsed = JSON.parse(answer.stdout), metadata = Array.isArray(parsed) ? parsed.at(-1) : parsed;\n if (metadata?.version) return metadata;\n }\n throw Error('npm \u67E5\u8BE2\u5931\u8D25\uFF1B\u8BF7\u68C0\u67E5 DSH \u7F51\u7EDC\u3001registry \u8BBE\u7F6E\u6216\u5305\u7684\u8BBF\u95EE\u6743\u9650');\n}\nasync function refreshProfilePlugin(service, profile, row, options, signal) {\n const require = createRequire(profile.installAnchor);\n const { runProfilePnpm } = await import(pathToFileURL(require.resolve('@deepseek-ai/dsh-plugin-manager/operations')).href);\n const { registryPlan, attributeFailure } = await import(pathToFileURL(require.resolve('@deepseek-ai/dsh-plugin-manager/registry')).href);\n const { classifyInstallFailure } = await import(pathToFileURL(require.resolve('@deepseek-ai/dsh-plugin-manager')).href);\n const plan = registryPlan(options.registry, await service.registries());\n return withFileLock(join(profile.dir, 'package.json'), async () => {\n const files = await Promise.all(['package.json', 'pnpm-lock.yaml'].map(async name => {\n const path = join(profile.dir, name);\n try { return { path, content: await readFile(path, 'utf8') }; } catch (e) { if (e.code !== 'ENOENT') throw e; return { path }; }\n }));\n const restore = () => Promise.all(files.map(f => f.content === undefined ? rm(f.path, { force: true }) : writeFileAtomic(f.path, f.content, { mode: 0o600 })));\n if (JSON.parse(files[0].content).dependencies?.[row.name] !== row.spec) throw Error('\u5B89\u88C5\u6765\u6E90\u5DF2\u6539\u53D8\uFF0C\u8BF7\u91CD\u65B0\u68C0\u67E5');\n let result;\n try {\n for (const registry of plan) {\n signal.throwIfAborted();\n // Update refreshes Git refs; newer DSH also reserves installBundle for\n // new packages, so existing npm packages use this official runner too.\n const run = await runProfilePnpm({ ...profile, profile: profile.name }, ['update', row.source.kind === 'github' ? row.name : row.target, ...(registry ? [`--registry=${registry}`] : [])], {\n execution: 'service', ...profile.packageManager, signal, outputBytes: 16384, idleTimeoutMs: 600000,\n lookupTimeoutMs: 20000, activateNewBundles: false,\n });\n if (run.exitCode === 0 && !run.timedOut && !signal.aborted) return { packageResult: run, application: 'restart-required' };\n const kind = classifyInstallFailure({ log: run.output, timedOut: run.timedOut });\n result = { packageResult: { ...run, kind }, application: signal.aborted ? 'cancelled' : 'failed',\n ...(run.incompatible?.length ? { error: { code: 'incompatible-version' } } : {}) };\n await restore();\n if (signal.aborted || attributeFailure(kind, run.output, row.source.kind === 'github' ? { kind: 'git', host: 'github.com' } : { kind: 'npm' }) !== 'registry') break;\n }\n return result;\n } catch (e) { await restore(); throw e; }\n }, { waitMs: 120000 });\n}\nexport class PluginUpdates {\n constructor({ service = () => undefined, profile = () => undefined, hmr = () => undefined, fetchImpl = (...args) => fetch(...args), lookup = registryVersion, refreshPackage = refreshProfilePlugin, onInstalled, stateFile, selfName = '@androidsup/dsh-plugin-updates', now = Date.now } = {}) {\n this.selfName = selfName; this.stateFile = stateFile; this.now = now; this.dismissed = {}; this.ignored = new Set(); this.lastAttempt = 0; this.saveQueue = Promise.resolve();\n this.service = service; this.profile = profile; this.hmr = hmr; this.fetchImpl = fetchImpl;\n this.rows = []; this.abort = new AbortController();\n this.lookup = lookup;\n this.refreshPackage = refreshPackage;\n this.onInstalled = onInstalled;\n }\n async load() {\n const saved = this.stateFile && await jsonFile(this.stateFile);\n if (saved?.version === 1) { this.lastAttempt = Number.isFinite(saved.lastAttempt) ? saved.lastAttempt : 0; this.checkedAt = saved.checkedAt; this.dismissed = saved.dismissed && typeof saved.dismissed === 'object' && !Array.isArray(saved.dismissed) ? saved.dismissed : {}; this.rows = Array.isArray(saved.rows) ? saved.rows.filter(r => ['github', 'npm'].includes(r.source?.kind)) : []; }\n if (saved?.version === 1) this.ignored = new Set(Array.isArray(saved.ignored) ? saved.ignored.filter(key => typeof key === 'string') : []);\n }\n persist() {\n if (!this.stateFile) return Promise.resolve();\n const saved = structuredClone({ version: 1, lastAttempt: this.lastAttempt, checkedAt: this.checkedAt, dismissed: this.dismissed, ignored: [...this.ignored], rows: this.rows.filter(r => ['github', 'npm'].includes(r.source.kind)) });\n this.saveQueue = this.saveQueue.catch(() => {}).then(() => writePrivateJson(this.stateFile, saved)); return this.saveQueue;\n }\n reminderKey(row) { return JSON.stringify([row.name, row.source, row.version, row.latestVersion ?? row.latestCommit]); }\n targetKey(row) {\n const source = row.source;\n return JSON.stringify(source.kind === 'npm' ? [row.name, 'npm', source.package, source.tag, row.latestVersion]\n : source.kind === 'github' ? [row.name, 'github', source.owner, source.repo, source.ref ?? 'HEAD', row.latestCommit] : [row.name, 'unsupported']);\n }\n isIgnored(row) { return this.ignored.has(this.targetKey(row)); }\n reminders() { return this.rows.filter(r => r.status === 'available' && !this.isIgnored(r) && (!Object.hasOwn(this.dismissed, r.name) || this.dismissed[r.name] !== this.reminderKey(r))).map(r => ({ key: this.reminderKey(r), targetKey: this.targetKey(r), name: r.name, version: r.version, latestVersion: r.latestVersion, latestCommit: r.latestCommit })); }\n async ignore(keys, restore = false) {\n if (this.flight) throw Error('\u5DF2\u6709\u63D2\u4EF6\u64CD\u4F5C\u6B63\u5728\u6267\u884C\uFF0C\u8BF7\u7B49\u5F85\u5B8C\u6210');\n if (!Array.isArray(keys) || !keys.length || keys.length > 200 || keys.some(k => typeof k !== 'string') || new Set(keys).size !== keys.length) throw Error('\u65E0\u6548\u7684\u7248\u672C\u5217\u8868');\n const rows = keys.map(key => this.rows.find(row => row.target && ['available', 'failed'].includes(row.status) && this.targetKey(row) === key));\n if (rows.some(row => !row)) throw Error('\u76EE\u6807\u7248\u672C\u5DF2\u6539\u53D8\uFF0C\u8BF7\u5237\u65B0\u6E05\u5355\u540E\u91CD\u8BD5');\n const previous = new Set(this.ignored), dismissed = { ...this.dismissed };\n for (const row of rows) {\n if (restore) { this.ignored.delete(this.targetKey(row)); delete this.dismissed[row.name]; }\n else this.ignored.add(this.targetKey(row));\n }\n try { await this.persist(); }\n catch (error) { this.ignored = previous; this.dismissed = dismissed; throw error; }\n }\n async dismiss(keys) {\n if (!Array.isArray(keys) || keys.length > 200 || keys.some(k => typeof k !== 'string')) throw Error('\u65E0\u6548\u7684\u63D0\u9192\u5217\u8868');\n for (const row of this.reminders()) if (keys.includes(row.key)) Object.defineProperty(this.dismissed, row.name, { value: row.key, enumerable: true, configurable: true, writable: true });\n await this.persist();\n }\n async tick() {\n if (this.flight || !this.state().available) return;\n // Revalidate cached notices against the local installed inventory, including\n // removals and updates made through DSH or another plugin manager.\n await this.list();\n if (this.abort.signal.aborted) return;\n if (this.flight || this.now() >= this.lastAttempt && this.now() - this.lastAttempt < 86400000) return;\n // Reserve before I/O: minute ticks and restarts cannot hammer failed sources.\n this.lastAttempt = this.now(); await this.persist();\n if (!this.flight && !this.abort.signal.aborted) this.check();\n }\n state() { return { available: !!this.service()?.listBundles && !!this.profile()?.dir,\n checkedAt: this.checkedAt, reminders: this.reminders(), autoCheckHours: 24, rows: this.rows.map(({ spec, ...row }) => ({ ...row, ignored: this.isIgnored(row), targetKey: this.targetKey(row), source: row.source.kind === 'unsupported' ? { kind: 'unsupported' } : row.source })), job: this.job, error: this.error }; }\n async list() {\n const service = this.service(), profile = this.profile();\n if (!service?.listBundles || !profile?.dir) { this.rows = []; return; }\n const [manifest, bundles, lock] = await Promise.all([jsonFile(join(profile.dir, 'package.json')), service.listBundles(), locks(profile.dir)]);\n if (!manifest) throw Error('\u5F53\u524D DSH \u914D\u7F6E\u7684\u63D2\u4EF6\u6E05\u5355\u65E0\u6CD5\u8BFB\u53D6');\n this.rows = bundles.filter(b => (b.installed || b.version) && manifest.dependencies?.[b.name]\n && b.removable !== false).map(b => {\n const spec = manifest.dependencies?.[b.name];\n const source = parsePluginSource(b.name, spec);\n const npm = lock.npm?.packages?.[`node_modules/${b.name}`]?.resolved;\n const pnpm = lock.pnpm?.importers?.['.']?.dependencies?.[b.name]?.version;\n const installed = lock.preferNpm ? npm ?? pnpm : pnpm ?? npm;\n const previous = this.rows.find(r => r.name === b.name && r.spec === spec && r.version === b.version && r.commit === githubCommit(installed));\n return { ...previous, name: b.name, version: b.version, enabled: b.enabled, spec, source,\n commit: githubCommit(installed), status: previous?.status ?? (source.kind === 'unsupported' ? 'unsupported' : 'unchecked'),\n ...(source.kind === 'unsupported' ? { message: '\u672C\u5730\u6587\u4EF6 / \u94FE\u63A5\u6765\u6E90\uFF0C\u8BF7\u901A\u8FC7\u539F\u5B89\u88C5\u65B9\u5F0F\u66F4\u65B0' } : {}) };\n });\n }\n async checkRow(row) {\n try {\n if (row.source.kind === 'npm') {\n const spec = `${row.source.package}@${row.source.tag}`;\n const found = await this.lookup(this.service(), this.profile(), spec, this.abort.signal);\n if (!found.version || found.problem && found.problem !== 'already-installed') throw Error(found.problem === 'not-found' ? 'npm \u4E2D\u672A\u627E\u5230\u8BE5\u5305\u6216\u9891\u9053' : 'npm \u67E5\u8BE2\u5931\u8D25\uFF1B\u8BF7\u68C0\u67E5 DSH \u7684\u7F51\u7EDC\u4E0E registry \u8BBE\u7F6E');\n if (!parseVersion(found.version) || row.version && !parseVersion(row.version)) throw Error('\u65E0\u6CD5\u6BD4\u8F83\u7248\u672C\u53F7');\n row.latestVersion = found.version;\n row.target = `${row.name}@${row.source.alias ? `npm:${row.source.package}@` : ''}${row.source.channel ? row.source.tag : found.version}`;\n row.status = !row.version || compareVersions(found.version, row.version) > 0 ? 'available' : 'current';\n row.message = !row.version ? '\u5B89\u88C5\u6587\u4EF6\u4E0D\u53EF\u8BFB\uFF0C\u53EF\u91CD\u65B0\u5B89\u88C5\u8BE5\u6765\u6E90\u4FEE\u590D' : row.status === 'current' ? '\u5F53\u524D\u7248\u672C\u5DF2\u662F\u8BE5\u9891\u9053\u6700\u65B0\uFF0C\u6216\u9AD8\u4E8E\u8BE5\u9891\u9053' : undefined;\n } else if (row.source.kind === 'github') {\n const { owner, repo, ref } = row.source;\n const url = `https://api.github.com/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/commits/${encodeURIComponent(ref ?? 'HEAD')}`;\n const found = await publicJson(url, this.fetchImpl, this.abort.signal);\n if (!/^[a-f0-9]{40}$/i.test(found.sha)) throw Error('GitHub \u8FD4\u56DE\u65E0\u6548\u63D0\u4EA4\u4FE1\u606F');\n row.latestCommit = found.sha.toLowerCase();\n row.target = `${row.name}@${row.spec}`;\n row.status = row.commit === row.latestCommit ? 'current' : 'available';\n row.message = row.commit ? (row.status === 'available' ? `\u63D0\u4EA4 ${short(row.commit)} \u2192 ${short(row.latestCommit)}` : '\u8BE5\u5206\u652F / \u6807\u7B7E\u7684\u63D0\u4EA4\u5DF2\u540C\u6B65') : '\u65E0\u6CD5\u8BFB\u53D6\u672C\u5730 Git \u63D0\u4EA4\uFF0C\u53EF\u91CD\u65B0\u5B89\u88C5\u5DF2\u68C0\u67E5\u7684\u6765\u6E90';\n if (ref && /^[a-f0-9]{7,40}$/i.test(ref)) { row.status = 'pinned'; row.message = '\u5B89\u88C5\u6765\u6E90\u56FA\u5B9A\u5728 Git \u63D0\u4EA4\uFF1B\u4FDD\u7559\u6B64\u63D0\u4EA4\uFF0C\u4E0D\u81EA\u52A8\u5207\u6362\u5206\u652F'; }\n }\n row.checkedAt = Date.now();\n row.checkedEnabled = row.enabled;\n } catch (error) { row.status = 'failed'; row.message = error.message; delete row.target; }\n }\n start(kind, task) {\n if (this.flight) throw Error('\u5DF2\u6709\u63D2\u4EF6\u64CD\u4F5C\u6B63\u5728\u6267\u884C\uFF0C\u8BF7\u7B49\u5F85\u5B8C\u6210');\n this.job = { id: randomUUID(), kind, state: 'running', startedAt: Date.now(), results: [], total: 0 };\n this.error = undefined;\n this.flight = Promise.resolve().then(() => task(this.job)).then(() => { this.job.state = this.job.cancelRequested ? 'cancelled' : 'done'; }, e => { this.job.state = this.job.cancelRequested ? 'cancelled' : 'failed'; this.job.message = e.message; })\n .finally(async () => { this.job.finishedAt = Date.now(); try { await this.persist(); } catch { this.error = '\u66F4\u65B0\u68C0\u67E5\u8BB0\u5F55\u672A\u80FD\u4FDD\u5B58\uFF0C\u8BF7\u68C0\u67E5\u672C\u5730\u76EE\u5F55\u6743\u9650'; } this.flight = undefined; });\n }\n check() {\n this.start('check', async job => {\n this.lastAttempt = this.now(); await this.persist();\n await this.list();\n const rows = this.rows.filter(r => ['npm', 'github'].includes(r.source.kind)); job.total = rows.length;\n // Small pool keeps registry requests bounded without making one failed plugin stop the list.\n let next = 0;\n await Promise.all(Array.from({ length: Math.min(3, rows.length) }, async () => {\n while (next < rows.length && !job.cancelRequested) { const row = rows[next++]; await this.checkRow(row); job.results.push({ name: row.name, status: row.status, message: row.message }); }\n }));\n this.checkedAt = Date.now();\n });\n }\n async installRow(row, registry, allowFreshVersions = []) {\n const original = await jsonFile(join(this.profile().dir, 'package.json'));\n if (original?.dependencies?.[row.name] !== row.spec) throw Error('\u5B89\u88C5\u6765\u6E90\u5DF2\u6539\u53D8\uFF0C\u8BF7\u91CD\u65B0\u68C0\u67E5');\n const current = (await this.service().listBundles()).find(b => b.name === row.name);\n if (!current || current.removable === false || current.enabled !== row.checkedEnabled || current.version !== row.version) throw Error('\u63D2\u4EF6\u7248\u672C\u6216\u542F\u7528\u72B6\u6001\u5DF2\u6539\u53D8\uFF0C\u8BF7\u91CD\u65B0\u68C0\u67E5');\n if (allowFreshVersions.includes(reviewedVersion(row))) await allowReviewedVersion(this.profile(), row);\n const options = { enabled: row.enabled, requestId: this.job.id, ...(registry ? { registry } : {}) };\n let result;\n const refresh = async () => {\n this.gitAbort = new AbortController();\n try { return await this.refreshPackage(this.service(), this.profile(), row, options, AbortSignal.any([this.abort.signal, this.gitAbort.signal])); }\n finally { this.gitAbort = undefined; }\n };\n if (row.source.kind === 'github' || row.name === this.selfName) result = await refresh();\n else {\n result = await outsideActivation(this.hmr(), () => this.service().installBundle(row.target, options));\n if (result.error?.code === 'already-installed') result = await refresh();\n }\n if (installFailed(result)) return { name: row.name, ...installFailure(result), expectedVersion: row.latestVersion };\n const installed = (await this.service().listBundles()).find(b => b.name === row.name);\n if (row.source.kind === 'npm' && installed?.version !== row.latestVersion) return { name: row.name, status: 'failed',\n message: `\u5B9E\u9645\u5B89\u88C5\u7248\u672C ${installed?.version ?? '\u672A\u77E5'} \u4E0E\u68C0\u67E5\u7248\u672C ${row.latestVersion} \u4E0D\u540C\uFF1B\u8BF7\u7A0D\u540E\u91CD\u65B0\u68C0\u67E5\uFF0C\u53EF\u80FD\u662F\u955C\u50CF\u5C1A\u672A\u540C\u6B65\u6216\u53D1\u884C\u65F6\u95F4\u9650\u5236` };\n if (row.source.kind === 'github') {\n const lock = await locks(this.profile().dir);\n const pnpm = lock.pnpm?.importers?.['.']?.dependencies?.[row.name]?.version, npm = lock.npm?.packages?.[`node_modules/${row.name}`]?.resolved;\n if (githubCommit(lock.preferNpm ? npm ?? pnpm : pnpm ?? npm) !== row.latestCommit) return { name: row.name, status: 'failed', restartRequired: true,\n message: '\u5B9E\u9645 Git \u63D0\u4EA4\u4E0E\u68C0\u67E5\u7ED3\u679C\u4E0D\u4E00\u81F4\uFF0C\u8BF7\u91CD\u65B0\u68C0\u67E5\u540E\u91CD\u8BD5\uFF1B\u4E0D\u628A\u4ECD\u505C\u7559\u5728\u65E7\u9501\u6587\u4EF6\u7684\u5B89\u88C5\u62A5\u544A\u4E3A\u6210\u529F' };\n }\n const reloadPending = result.application === 'restart-required' && this.onInstalled?.(row.name) === true;\n return { name: row.name, status: 'installed', application: reloadPending ? 'reload-pending' : result.application, message: reloadPending ? '\u5DF2\u5B89\u88C5\uFF0C\u7B49\u5F85\u5F53\u524D\u64CD\u4F5C\u7ED3\u675F\u540E\u81EA\u52A8\u52A0\u8F7D\uFF1B\u8FD0\u884C\u7248\u672C\u89C1\u9762\u677F\u9876\u90E8' : result.application === 'restart-required' ? '\u5DF2\u5B89\u88C5\uFF0C\u5B8C\u5168\u9000\u51FA\u5E76\u91CD\u65B0\u6253\u5F00 DSH \u540E\u751F\u6548' : '\u5B89\u88C5\u5B8C\u6210', restartRequired: !reloadPending && result.application === 'restart-required' };\n }\n update(names, registry, allowFreshVersions = []) {\n if (!Array.isArray(names) || !names.length || names.length > 200 || names.some(n => typeof n !== 'string') || new Set(names).size !== names.length) throw Error('\u8BF7\u9009\u62E9\u8981\u66F4\u65B0\u7684\u63D2\u4EF6');\n const selected = names.map(name => this.rows.find(r => r.name === name));\n if (selected.some(r => !r || !['available', 'failed'].includes(r.status) || !r.target || Date.now() - r.checkedAt > 600000)) throw Error('\u8BF7\u5148\u68C0\u67E5\u66F4\u65B0\uFF0C\u518D\u9009\u62E9\u53EF\u66F4\u65B0\u7684\u63D2\u4EF6\uFF08\u68C0\u67E5\u7ED3\u679C\u6709\u6548\u671F 10 \u5206\u949F\uFF09');\n const reviewed = selected.map(reviewedVersion).filter(Boolean);\n if (!Array.isArray(allowFreshVersions) || allowFreshVersions.length > selected.length || new Set(allowFreshVersions).size !== allowFreshVersions.length || allowFreshVersions.some(v => typeof v !== 'string' || !reviewed.includes(v))) throw Error('\u786E\u8BA4\u7684\u63D2\u4EF6\u7248\u672C\u5DF2\u6539\u53D8\uFF0C\u8BF7\u91CD\u65B0\u67E5\u770B\u5E76\u786E\u8BA4\u66F4\u65B0');\n // Updating this manager last avoids losing the batch if the host gains module reload support.\n selected.sort((a, b) => Number(a.name === this.selfName) - Number(b.name === this.selfName));\n this.start('update', async job => {\n job.total = selected.length;\n for (const row of selected) {\n if (job.cancelRequested) break;\n job.current = row.name;\n let result;\n try { result = await this.installRow(row, registry, allowFreshVersions); } catch (e) { result = { name: row.name, status: 'failed', message: e.message }; }\n job.results.push(result);\n row.status = result.status; row.message = result.message;\n }\n delete job.current; await this.list();\n });\n }\n async action(input) {\n if (!this.state().available) throw Error('\u5F53\u524D DSH \u672A\u63D0\u4F9B\u63D2\u4EF6\u7BA1\u7406\u63A5\u53E3\uFF0C\u8BF7\u5347\u7EA7 DSH \u540E\u91CD\u8BD5');\n if (input.registry && !['https://registry.npmjs.org/', 'https://registry.npmmirror.com/'].includes(input.registry)) throw Error('\u65E0\u6548\u7684 npm \u6765\u6E90');\n if (input.action === 'plugins.list') { if (!this.flight) await this.list(); }\n else if (input.action === 'plugins.dismiss') await this.dismiss(input.keys);\n else if (input.action === 'plugins.ignore') await this.ignore(input.keys);\n else if (input.action === 'plugins.unignore') await this.ignore(input.keys, true);\n else if (input.action === 'plugins.check') this.check();\n else if (input.action === 'plugins.update') this.update(input.names, input.registry, input.allowFreshVersions);\n else if (input.action === 'plugins.cancel') { if (this.job?.state === 'running') { this.job.cancelRequested = true; if (this.gitAbort) this.gitAbort.abort(); else if (this.job.kind !== 'check') await this.service().cancelInstall?.(this.job.id); } }\n else throw Error('\u672A\u77E5\u63D2\u4EF6\u64CD\u4F5C');\n }\n}\n", "import { mkdir } from 'node:fs/promises';\nimport { dirname } from 'node:path';\nimport { writeFileAtomic } from '@deepseek-ai/dsh-atomic-write';\n\nexport async function writePrivateJson(file, value) {\n await mkdir(dirname(file), { recursive: true, mode: 0o700 });\n await writeFileAtomic(file, `${JSON.stringify(value, null, 2)}\\n`, { mode: 0o600 });\n}\n", "// Timers inherit HMR's activation scope; leave it before entering DSH's queue.\nexport function outsideActivation(hmr, operation) {\n const scope = hmr?.executing;\n return typeof scope?.exit === 'function' ? scope.exit(operation) : operation();\n}\n", "// Adapted from dsh-workbuddy-connect (MIT), Copyright (c) 2026 Corrine Hu.\nfunction parseVersion(raw) {\n if (typeof raw !== \"string\") return void 0;\n const normalized = raw.startsWith(\"v\") ? raw.slice(1) : raw;\n const match = /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$/u.exec(normalized);\n if (match === null) return void 0;\n const rawPrerelease = match[4] === void 0 ? [] : match[4].split(\".\");\n if (rawPrerelease.some((identifier) => /^\\d+$/u.test(identifier) && !/^(0|[1-9]\\d*)$/u.test(identifier))) return void 0;\n const prerelease = rawPrerelease.map((identifier) => /^(0|[1-9]\\d*)$/u.test(identifier) ? Number(identifier) : identifier);\n if (prerelease.some((identifier) => typeof identifier === \"number\" && !Number.isSafeInteger(identifier))) return void 0;\n const parsed = {\n major: Number(match[1]),\n minor: Number(match[2]),\n patch: Number(match[3]),\n prerelease\n };\n return [parsed.major, parsed.minor, parsed.patch].every(Number.isSafeInteger) ? parsed : void 0;\n}\nfunction compareIdentifiers(left, right) {\n if (typeof left === \"number\" && typeof right === \"number\") return left < right ? -1 : left > right ? 1 : 0;\n if (typeof left === \"number\") return -1;\n if (typeof right === \"number\") return 1;\n return left < right ? -1 : left > right ? 1 : 0;\n}\nfunction compareVersions(left, right) {\n const a = parseVersion(left);\n const b = parseVersion(right);\n if (a === void 0 || b === void 0) throw new TypeError(\"invalid plugin version\");\n for (const [aPart, bPart] of [[a.major, b.major], [a.minor, b.minor], [a.patch, b.patch]]) {\n if (aPart !== bPart) return aPart < bPart ? -1 : 1;\n }\n if (a.prerelease.length === 0 && b.prerelease.length !== 0) return 1;\n if (a.prerelease.length !== 0 && b.prerelease.length === 0) return -1;\n for (let index = 0; index < Math.max(a.prerelease.length, b.prerelease.length); index += 1) {\n const aPart = a.prerelease[index];\n const bPart = b.prerelease[index];\n if (aPart === void 0) return -1;\n if (bPart === void 0) return 1;\n const comparison = compareIdentifiers(aPart, bPart);\n if (comparison !== 0) return comparison;\n }\n return 0;\n}\nexport {\n compareVersions,\n parseVersion\n};\n", "import { randomBytes, timingSafeEqual } from 'node:crypto';\n\nexport const ENDPOINT = '/.well-known/dsh-plugin-updates';\nclass HttpError extends Error {\n constructor(status, message) { super(message); this.status = status; }\n}\nconst loopback = new Set(['localhost', '127.0.0.1', '[::1]']);\nfunction localRequest(req) {\n try {\n const host = req.headers.host;\n const url = new URL(`http://${host}`);\n if (url.host !== host || !loopback.has(url.hostname)) return false;\n const remote = req.socket?.remoteAddress;\n return (!remote || ['127.0.0.1', '::1', '::ffff:127.0.0.1'].includes(remote))\n && (!req.headers.origin || [`http://${host}`, `https://${host}`].includes(req.headers.origin))\n && req.headers['sec-fetch-site'] !== 'cross-site';\n } catch { return false; }\n}\n\nexport function updatesHandler(updater, pluginVersion) {\n const key = randomBytes(32).toString('base64url');\n const state = () => ({ pluginVersion, pluginUpdates: updater.state(), key });\n return async (req, res) => {\n const json = (status, value) => {\n res.writeHead(status, { 'Content-Type': 'application/json', 'Cache-Control': 'no-store', 'X-Content-Type-Options': 'nosniff' });\n res.end(JSON.stringify(value));\n };\n try {\n if (!localRequest(req)) throw new HttpError(403, '\u4EC5\u5141\u8BB8\u672C\u673A\u540C\u6E90\u8BF7\u6C42');\n if (req.method === 'GET') { json(200, state()); return; }\n if (req.method !== 'POST') throw new HttpError(405, '\u65B9\u6CD5\u65E0\u6548');\n const actual = Buffer.from(req.headers['x-plugin-updates-key'] ?? ''), expected = Buffer.from(key);\n if (actual.length !== expected.length || !timingSafeEqual(actual, expected)) throw new HttpError(401, '\u8BF7\u5237\u65B0\u66F4\u65B0\u7BA1\u7406\u9875\u9762');\n if (!/^application\\/json(?:\\s*;|$)/i.test(req.headers['content-type'] ?? '')) throw new HttpError(415, '\u9700\u8981 JSON');\n let size = 0; const chunks = [];\n for await (const chunk of req) {\n size += chunk.length;\n if (size > 65536) throw new HttpError(413, '\u8BF7\u6C42\u8FC7\u5927');\n chunks.push(Buffer.from(chunk));\n }\n let input;\n try { input = JSON.parse(Buffer.concat(chunks).toString('utf8')); } catch { throw new HttpError(400, 'JSON \u65E0\u6548'); }\n if (!input || typeof input !== 'object' || Array.isArray(input)) throw new HttpError(400, '\u64CD\u4F5C\u65E0\u6548');\n try { await updater.action(input); } catch { throw new HttpError(400, '\u64CD\u4F5C\u672A\u6267\u884C\uFF0C\u8BF7\u5237\u65B0\u6E05\u5355\u5E76\u91CD\u65B0\u68C0\u67E5\uFF1B\u4EC5\u652F\u6301\u5DF2\u5B89\u88C5\u63D2\u4EF6\u7684\u68C0\u67E5\u3001\u66F4\u65B0\u3001\u63D0\u9192\u548C\u53D6\u6D88\u64CD\u4F5C'); }\n json(200, state());\n } catch (error) {\n json(error instanceof HttpError ? error.status : 500, { error: error instanceof HttpError ? error.message : '\u66F4\u65B0\u7BA1\u7406\u6682\u4E0D\u53EF\u7528\uFF0C\u8BF7\u68C0\u67E5 DSH \u63D2\u4EF6\u9875' });\n }\n };\n}\n", "{\n \"name\": \"@androidsup/dsh-plugin-updates\",\n \"version\": \"0.1.1\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/AndroidSix/dsh-plugin-updates.git\"\n },\n \"description\": \"DSH \u63D2\u4EF6\u66F4\u65B0\u7BA1\u7406\uFF1A\u53EA\u7BA1\u5DF2\u5B89\u88C5\u63D2\u4EF6\uFF0C\u66F4\u65B0\u5148\u786E\u8BA4\u3001\u7ED3\u679C\u53EF\u6838\u9A8C\u3001\u53EF\u5FFD\u7565\u6307\u5B9A\u7248\u672C\u63D0\u9192\uFF0C\u4E0D\u662F\u63D2\u4EF6\u5E02\u573A\u3002 User-controlled, verified updates for installed DSH plugins, with per-release notification ignores. Not a marketplace.\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"main\": \"lib/index.js\",\n \"exports\": {\n \".\": \"./lib/index.js\",\n \"./client\": \"./lib/client.js\",\n \"./package.json\": \"./package.json\",\n \"./cordis.patch.yml\": \"./cordis.patch.yml\"\n },\n \"engines\": {\n \"node\": \"^22.19.0 || >=24.0.0\"\n },\n \"files\": [\n \"lib\",\n \"cordis.patch.yml\",\n \"README.md\",\n \"README.en.md\",\n \"LICENSE\",\n \"THIRD_PARTY_NOTICES.md\",\n \"CHANGELOG.md\"\n ],\n \"dsh\": {\n \"bundle\": {\n \"patch\": \"./cordis.patch.yml\"\n },\n \"client\": {\n \"inject\": [\n \"@deepseek-ai/dsh-client-ui-renderer\"\n ],\n \"platform\": \"web\"\n }\n },\n \"scripts\": {\n \"build\": \"node scripts/build.mjs\",\n \"test\": \"node --test tests/*.test.mjs\",\n \"check\": \"npm run build && npm test\",\n \"pack:release\": \"npm run build && npm pack --ignore-scripts\",\n \"prepublishOnly\": \"npm run check\"\n },\n \"dependencies\": {\n \"yaml\": \"2.9.1\"\n },\n \"peerDependencies\": {\n \"@deepseek-ai/cordis\": \"^4.0.4\",\n \"@deepseek-ai/dsh-atomic-write\": \"^0.2.0-rc.2\",\n \"react\": \"^18.2.0\"\n },\n \"devDependencies\": {\n \"esbuild\": \"^0.25.0\",\n \"react-dom\": \"^18.2.0\"\n },\n \"keywords\": [\n \"dsh-plugin\",\n \"deepseek-harness\",\n \"plugin-updates\",\n \"update-management\"\n ],\n \"homepage\": \"https://github.com/AndroidSix/dsh-plugin-updates#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/AndroidSix/dsh-plugin-updates/issues\"\n },\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["join", "writeFileAtomic", "name", "writeFileAtomic", "require", "join"]
7
+ }
package/package.json CHANGED
@@ -1,6 +1,74 @@
1
1
  {
2
2
  "name": "@androidsup/dsh-plugin-updates",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.1",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "https://github.com/AndroidSix/dsh-plugin-updates.git"
7
+ },
8
+ "description": "DSH 插件更新管理:只管已安装插件,更新先确认、结果可核验、可忽略指定版本提醒,不是插件市场。 User-controlled, verified updates for installed DSH plugins, with per-release notification ignores. Not a marketplace.",
9
+ "type": "module",
10
+ "license": "MIT",
11
+ "main": "lib/index.js",
12
+ "exports": {
13
+ ".": "./lib/index.js",
14
+ "./client": "./lib/client.js",
15
+ "./package.json": "./package.json",
16
+ "./cordis.patch.yml": "./cordis.patch.yml"
17
+ },
18
+ "engines": {
19
+ "node": "^22.19.0 || >=24.0.0"
20
+ },
21
+ "files": [
22
+ "lib",
23
+ "cordis.patch.yml",
24
+ "README.md",
25
+ "README.en.md",
26
+ "LICENSE",
27
+ "THIRD_PARTY_NOTICES.md",
28
+ "CHANGELOG.md"
29
+ ],
30
+ "dsh": {
31
+ "bundle": {
32
+ "patch": "./cordis.patch.yml"
33
+ },
34
+ "client": {
35
+ "inject": [
36
+ "@deepseek-ai/dsh-client-ui-renderer"
37
+ ],
38
+ "platform": "web"
39
+ }
40
+ },
41
+ "scripts": {
42
+ "build": "node scripts/build.mjs",
43
+ "test": "node --test tests/*.test.mjs",
44
+ "check": "npm run build && npm test",
45
+ "pack:release": "npm run build && npm pack --ignore-scripts",
46
+ "prepublishOnly": "npm run check"
47
+ },
48
+ "dependencies": {
49
+ "yaml": "2.9.1"
50
+ },
51
+ "peerDependencies": {
52
+ "@deepseek-ai/cordis": "^4.0.4",
53
+ "@deepseek-ai/dsh-atomic-write": "^0.2.0-rc.2",
54
+ "react": "^18.2.0"
55
+ },
56
+ "devDependencies": {
57
+ "esbuild": "^0.25.0",
58
+ "react-dom": "^18.2.0"
59
+ },
60
+ "keywords": [
61
+ "dsh-plugin",
62
+ "deepseek-harness",
63
+ "plugin-updates",
64
+ "update-management"
65
+ ],
66
+ "homepage": "https://github.com/AndroidSix/dsh-plugin-updates#readme",
67
+ "bugs": {
68
+ "url": "https://github.com/AndroidSix/dsh-plugin-updates/issues"
69
+ },
70
+ "publishConfig": {
71
+ "access": "public",
72
+ "registry": "https://registry.npmjs.org/"
73
+ }
74
+ }